diff --git a/.github/workflows/ResInsightWithCache.yml b/.github/workflows/ResInsightWithCache.yml index e91656e9c4..170bd91eac 100644 --- a/.github/workflows/ResInsightWithCache.yml +++ b/.github/workflows/ResInsightWithCache.yml @@ -8,7 +8,6 @@ on: # build cache is - cron: '0 1 * * * ' env: - NINJA_VERSION: 1.9.0 BUILD_TYPE: Release BUILDCACHE_VERSION: 0.24.4 BUILDCACHE_DIR: ${{ github.workspace }}/buildcache_dir @@ -73,10 +72,11 @@ jobs: python-version: '3.8' - name: Display Python version run: python -c "import sys; print(sys.version)" - - name: Download Ninja - uses: seanmiddleditch/gha-setup-ninja@master - with: - version: ${{ env.NINJA_VERSION }} + + # workaround a poor interaction between github actions/cmake/vcpkg, see https://github.com/lukka/run-vcpkg/issues/88#issuecomment-885758902 + - name: Use CMake 3.20.1 + uses: lukka/get-cmake@v3.20.1 + - name: Download buildcache id: buildcache-download shell: cmake -P {0} @@ -152,7 +152,7 @@ jobs: vcpkgArguments: '@${{ github.workspace }}/${{ matrix.config.vcpkg-response-file }}' vcpkgDirectory: '${{ github.workspace }}/ThirdParty/vcpkg' # Ensure the cache key changes any time the content of the response file changes. - appendedCacheKey: ${{ hashFiles(env.VCPKGRESPONSEFILE) }}-v01 + appendedCacheKey: ${{ hashFiles(env.VCPKGRESPONSEFILE) }}-cache-key-v2 - name: Cache dynamic version of OpenSSL (Linux) if: "contains( matrix.config.os, 'ubuntu_disabled')" diff --git a/.github/workflows/centos7.yml b/.github/workflows/centos7.yml index 838b933fee..486e7da5be 100644 --- a/.github/workflows/centos7.yml +++ b/.github/workflows/centos7.yml @@ -11,7 +11,7 @@ jobs: container: image: centos:7 steps: - - name: Intall Dependencies + - name: Install Dependencies run: | yum install -y centos-release-scl yum-config-manager --enable rhel-server-rhscl-7-rpms @@ -30,12 +30,12 @@ jobs: yum install -y mesa-libGL-devel yum install -y freeglut-devel - yum install -y devtoolset-7 + yum install -y devtoolset-10 yum install -y rh-python36 - name: Build QtCharts run: | - source /opt/rh/devtoolset-7/enable + source /opt/rh/devtoolset-10/enable git clone git://code.qt.io/qt/qtcharts.git cd qtcharts/ git checkout v5.9.7 @@ -55,7 +55,7 @@ jobs: echo "::set-output name=PYTHON_EXECUTABLE::$(python -c 'import sys; import pathlib; print (pathlib.PurePath(sys.executable).as_posix())')" - name: Build ResInsight run: | - source /opt/rh/devtoolset-7/enable + source /opt/rh/devtoolset-10/enable source /opt/rh/rh-python36/enable cmake3 --version diff --git a/.github/workflows/cmake-format.yml b/.github/workflows/cmake-format.yml index 0607179e22..9b137d1700 100644 --- a/.github/workflows/cmake-format.yml +++ b/.github/workflows/cmake-format.yml @@ -6,7 +6,7 @@ jobs: cmake-format-job: runs-on: ubuntu-latest steps: - - name: Install cmakelang for cmake-format + - name: Install cmakelang for cmake-format run: | python3 -m pip install --user cmakelang - uses: actions/checkout@v2 @@ -16,6 +16,7 @@ jobs: cd ApplicationLibCode find -name CMake*.txt | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i + find -name CMake*.cmake | xargs ~/.local/bin/cmake-format -c ${{ github.workspace }}/cmake/cmake-format.py -i cd .. cd ApplicationExeCode diff --git a/.gitignore b/.gitignore index a87617cf1d..145c979693 100644 --- a/.gitignore +++ b/.gitignore @@ -64,6 +64,7 @@ out build CMakeSettings.json enc_temp_folder +CMakePresets.json #Visual Studio Code files .vscode @@ -78,3 +79,5 @@ enc_temp_folder #Python *.pyc + +*.ESMRY diff --git a/.gitmodules b/.gitmodules index 1a8b40944e..d9608ea36e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "ThirdParty/vcpkg"] path = ThirdParty/vcpkg url = https://github.com/CeetronSolutions/vcpkg +[submodule "ThirdParty/fast_float"] + path = ThirdParty/fast_float + url = https://github.com/fastfloat/fast_float diff --git a/ApplicationExeCode/CMakeLists.txt b/ApplicationExeCode/CMakeLists.txt index 213b1f613f..97864137b5 100644 --- a/ApplicationExeCode/CMakeLists.txt +++ b/ApplicationExeCode/CMakeLists.txt @@ -14,7 +14,8 @@ endif() if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wno-deprecated-declarations") + "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wno-deprecated-declarations" + ) endif() # Open GL @@ -23,7 +24,8 @@ find_package(OpenGL) find_package( Qt5 COMPONENTS Core - QUIET) + QUIET +) if(Qt5Core_FOUND) find_package( @@ -38,7 +40,8 @@ if(Qt5Core_FOUND) Concurrent PrintSupport Svg - OPTIONAL_COMPONENTS Charts) + OPTIONAL_COMPONENTS Charts + ) set(QT_LIBRARIES Qt5::Core Qt5::Gui @@ -49,7 +52,8 @@ if(Qt5Core_FOUND) Qt5::Xml Qt5::Concurrent Qt5::PrintSupport - Qt5::Svg) + Qt5::Svg + ) if(Qt5Charts_FOUND) list(APPEND QT_LIBRARIES Qt5::Charts) endif(Qt5Charts_FOUND) @@ -70,12 +74,15 @@ set(CODE_SOURCE_FILES RiaMain.cpp) if(RESINSIGHT_ENABLE_GRPC) list(APPEND CODE_HEAD_FILES RiaGrpcConsoleApplication.h - RiaGrpcGuiApplication.h) + RiaGrpcGuiApplication.h + ) list(APPEND CODE_SOURCE_FILES RiaGrpcConsoleApplication.cpp - RiaGrpcGuiApplication.cpp) + RiaGrpcGuiApplication.cpp + ) list(APPEND QT_MOC_HEADERS RiaGrpcConsoleApplication.h - RiaGrpcGuiApplication.h) + RiaGrpcGuiApplication.h + ) # Find Protobuf installation Looks for protobuf-config.cmake file installed by # Protobuf's cmake installation. @@ -88,12 +95,14 @@ if(RESINSIGHT_ENABLE_GRPC) find_package(gRPC CONFIG REQUIRED) set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf) set(_GRPC_GRPCPP_UNSECURE gRPC::grpc++_unsecure gRPC::grpc_unsecure - gRPC::gpr) + gRPC::gpr + ) set(GRPC_LINK_LIBRARIES ${_GRPC_GRPCPP_UNSECURE} ${_PROTOBUF_LIBPROTOBUF}) else() set(RESINSIGHT_GRPC_INSTALL_PREFIX "" - CACHE PATH "gRPC : Install prefix for gRPC") + CACHE PATH "gRPC : Install prefix for gRPC" + ) set(ENV{PKG_CONFIG_PATH} "${RESINSIGHT_GRPC_INSTALL_PREFIX}/lib/pkgconfig") find_package(PkgConfig REQUIRED) pkg_check_modules( @@ -104,7 +113,8 @@ if(RESINSIGHT_ENABLE_GRPC) grpc_unsecure gpr protobuf - libcares) + libcares + ) endif() endif() @@ -156,7 +166,8 @@ set(EXE_FILES ${HEADER_FILES} ${REFERENCED_CMAKE_FILES} .clang-format - .clang-tidy) + .clang-tidy +) add_executable(ResInsight ${EXE_FILES}) @@ -165,7 +176,8 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") ResInsight PROPERTIES COMPILE_FLAGS - "-Wall -Wno-unused-parameter -Wno-reorder -Wno-parentheses -Wno-switch") + "-Wall -Wno-unused-parameter -Wno-reorder -Wno-parentheses -Wno-switch" + ) # Treat warnings as errors if asked to do so if(RESINSIGHT_TREAT_WARNINGS_AS_ERRORS) set_target_properties( @@ -212,8 +224,9 @@ if(MSVC) endif() message(STATUS "BUILD_FLAGS_FOR_MSVC ${BUILD_FLAGS_FOR_MSVC}") - set_target_properties(ResInsight PROPERTIES COMPILE_FLAGS - ${BUILD_FLAGS_FOR_MSVC}) + set_target_properties( + ResInsight PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS_FOR_MSVC} + ) endif() @@ -227,22 +240,27 @@ if(APPLE) COMMAND sips -s format icns ${CMAKE_CURRENT_SOURCE_DIR}/Resources/AppLogo48x48.png --out ${CMAKE_CURRENT_BINARY_DIR}/Resources/ResInsight.icns - COMMENT Converting application icon) + COMMENT Converting application icon + ) add_custom_target( ResInsight-icns - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Resources/ResInsight.icns) + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/Resources/ResInsight.icns + ) add_dependencies(ResInsight ResInsight-icns) set_target_properties( ResInsight PROPERTIES MACOSX_BUNDLE_ICON_FILE - ${CMAKE_CURRENT_BINARY_DIR}/Resources/ResInsight.icns) + ${CMAKE_CURRENT_BINARY_DIR}/Resources/ResInsight.icns + ) endif() if(RESINSIGHT_ENABLE_GRPC) list(APPEND THIRD_PARTY_LIBRARIES ${GRPC_LINK_LIBRARIES}) if(MSVC) - set_target_properties(ResInsight PROPERTIES LINK_FLAGS_RELWITHDEBINFO - "/NODEFAULTLIB:MSVCRTD.lib") + set_target_properties( + ResInsight PROPERTIES LINK_FLAGS_RELWITHDEBINFO + "/NODEFAULTLIB:MSVCRTD.lib" + ) endif() endif() @@ -264,7 +282,8 @@ set(LINK_LIBRARIES ${APP_FWK_LIBRARIES} ${VIZ_FWK_LIBRARIES} ApplicationLibCode - Commands) + Commands +) if(RESINSIGHT_ENABLE_GRPC) list(APPEND LINK_LIBRARIES GrpcInterface) @@ -291,12 +310,14 @@ set(UNITY_EXCLUDE_FILES qrc_cafCommandFeatures.cpp # Exclude files including opm-common ProjectDataModel/RimVfpTableExtractor.cpp - ProjectDataModel/RimVfpPlot.cpp) + ProjectDataModel/RimVfpPlot.cpp +) if(RESINSIGHT_ENABLE_UNITY_BUILD) foreach(fileToExclude ${UNITY_EXCLUDE_FILES}) - set_source_files_properties(${fileToExclude} - PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) + set_source_files_properties( + ${fileToExclude} PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE + ) endforeach(fileToExclude) endif() @@ -330,7 +351,8 @@ if(MSVC) set(HDF5_DLL_NAMES hdf5 hdf5_cpp szip zlib) foreach(HDF5_DLL_NAME ${HDF5_DLL_NAMES}) list(APPEND RI_DLL_FILENAMES - ${RESINSIGHT_HDF5_DIR}/bin/${HDF5_DLL_NAME}.dll) + ${RESINSIGHT_HDF5_DIR}/bin/${HDF5_DLL_NAME}.dll + ) endforeach(HDF5_DLL_NAME) endif() @@ -342,7 +364,8 @@ foreach(FILE_TO_COPY ${RI_DLL_FILENAMES}) TARGET ResInsight POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${FILE_TO_COPY} - $) + $ + ) endforeach() # Generate Python code in a target that is part of ALL_BUILD and depends on @@ -355,9 +378,11 @@ if(RESINSIGHT_ENABLE_GRPC) OUTPUT ${GENERATED_CLASSES_FILE} COMMAND ResInsight ARGS --console --generate ${GENERATED_CLASSES_FILE} DEPENDS ResInsight - COMMENT "Generating ${GENERATED_CLASSES_FILE}") - add_custom_target(RipsGeneratedPythonClasses ALL - SOURCES ${GENERATED_CLASSES_FILE}) + COMMENT "Generating ${GENERATED_CLASSES_FILE}" + ) + add_custom_target( + RipsGeneratedPythonClasses ALL SOURCES ${GENERATED_CLASSES_FILE} + ) source_group("Source Files" ${GENERATED_CLASSES_FILE}) add_dependencies(RipsGeneratedPythonClasses ResInsight) @@ -369,7 +394,8 @@ if(RESINSIGHT_ENABLE_GRPC) COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/GrpcInterface/Python" - $/Python) + $/Python + ) endif(RESINSIGHT_ENABLE_GRPC) @@ -389,19 +415,22 @@ if(RESINSIGHT_PRIVATE_INSTALL) # different installoptions that does things this way, and really do copy # them when doing PRIVATE_INSTALL set(RESINSIGHT_INSTALL_RPATH ${RESINSIGHT_INSTALL_RPATH} - ${RESINSIGHT_ODB_API_DIR}/lib) + ${RESINSIGHT_ODB_API_DIR}/lib + ) endif() if(EXISTS ${RESINSIGHT_ERT_EXTERNAL_LIB_ROOT}) # append the external ERT lib root set(RESINSIGHT_INSTALL_RPATH ${RESINSIGHT_INSTALL_RPATH} - ${RESINSIGHT_ERT_EXTERNAL_LIB_ROOT}) + ${RESINSIGHT_ERT_EXTERNAL_LIB_ROOT} + ) endif() # message("RESINSIGHT_INSTALL_RPATH : " "${RESINSIGHT_INSTALL_RPATH}") - set_target_properties(ResInsight PROPERTIES INSTALL_RPATH - "${RESINSIGHT_INSTALL_RPATH}") + set_target_properties( + ResInsight PROPERTIES INSTALL_RPATH "${RESINSIGHT_INSTALL_RPATH}" + ) # bundle Qt5 libraries option(RESINSIGHT_QT5_BUNDLE_LIBRARIES "Bundle Qt5 libraries" OFF) @@ -413,7 +442,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) get_property( _filepath TARGET "Qt5::Core" - PROPERTY LOCATION_RELEASE) + PROPERTY LOCATION_RELEASE + ) get_filename_component(_dir ${_filepath} PATH) foreach(qtlib ${QT_LIBRARIES}) @@ -436,7 +466,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) install( FILES ${FILE_AND_SYMLINKS} DESTINATION ${RESINSIGHT_INSTALL_FOLDER} - OPTIONAL) + OPTIONAL + ) endforeach() set(QT_PLUGIN_PATH "$ENV{QT_PLUGIN_PATH}") @@ -447,21 +478,26 @@ if(RESINSIGHT_PRIVATE_INSTALL) # include platform files install(FILES ${QT_PLUGIN_PATH}/platforms/libqxcb.so - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/platforms/) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/platforms/ + ) install(FILES ${QT_PLUGIN_PATH}/imageformats/libqsvg.so - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/imageformats/) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/imageformats/ + ) install(FILES ${QT_PLUGIN_PATH}/iconengines/libqsvgicon.so - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/iconengines/) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/iconengines/ + ) # Required by xcb module used to create OpenGL widgets install( FILES ${QT_PLUGIN_PATH}/xcbglintegrations/libqxcb-egl-integration.so DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/plugins/xcbglintegrations/ - OPTIONAL) + OPTIONAL + ) install( FILES ${QT_PLUGIN_PATH}/xcbglintegrations/libqxcb-glx-integration.so DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/plugins/xcbglintegrations/ - OPTIONAL) + OPTIONAL + ) endif(RESINSIGHT_QT5_BUNDLE_LIBRARIES) @@ -477,14 +513,16 @@ if(RESINSIGHT_PRIVATE_INSTALL) if(WIN32 AND TARGET Qt5::qmake - AND NOT TARGET Qt5::windeployqt) + AND NOT TARGET Qt5::windeployqt + ) get_target_property(_qt5_qmake_location Qt5::qmake IMPORTED_LOCATION) execute_process( COMMAND "${_qt5_qmake_location}" -query QT_INSTALL_PREFIX RESULT_VARIABLE return_code OUTPUT_VARIABLE qt5_install_prefix - OUTPUT_STRIP_TRAILING_WHITESPACE) + OUTPUT_STRIP_TRAILING_WHITESPACE + ) set(imported_location "${qt5_install_prefix}/bin/windeployqt.exe") @@ -494,8 +532,9 @@ if(RESINSIGHT_PRIVATE_INSTALL) if(EXISTS ${imported_location}) add_executable(Qt5::windeployqt IMPORTED) - set_target_properties(Qt5::windeployqt PROPERTIES IMPORTED_LOCATION - ${imported_location}) + set_target_properties( + Qt5::windeployqt PROPERTIES IMPORTED_LOCATION ${imported_location} + ) endif() endif() @@ -514,7 +553,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) Qt5::windeployqt --no-compiler-runtime --no-system-d3d-compiler --no-quick-import --no-translations --verbose 0 --dir "${CMAKE_CURRENT_BINARY_DIR}/windeployqt" - "$/$") + "$/$" + ) # Qt DLLs message(STATUS "Creating post build step for copying Qt DLLs") @@ -527,11 +567,13 @@ if(RESINSIGHT_PRIVATE_INSTALL) COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_CURRENT_BINARY_DIR}/windeployqt/" - $) + $ + ) # copy deployment directory during installation install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/windeployqt/" - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() # install GRPC-related DLLs and generated_classes.py @@ -541,12 +583,14 @@ if(RESINSIGHT_PRIVATE_INSTALL) set(GRPC_DLL_NAMES ${PROTOBUF_DLL} cares ${ZLIB_DLL} abseil_dll) foreach(dllname ${GRPC_DLL_NAMES}) install(FILES $/${dllname}.dll - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endforeach(dllname ${GRPC_DLL_NAMES}) install( FILES ${CMAKE_SOURCE_DIR}/GrpcInterface/Python/rips/generated/generated_classes.py - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/Python/rips/generated) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/Python/rips/generated + ) endif() # Boost @@ -555,7 +599,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) get_property( _filepath TARGET "Boost::filesystem" - PROPERTY LOCATION_RELEASE) + PROPERTY LOCATION_RELEASE + ) message("_filepath: ${_filepath}") # The location of Boost is based on the file structure as installed by vcpkg @@ -571,14 +616,16 @@ if(RESINSIGHT_PRIVATE_INSTALL) install( FILES ${RI_BOOST_DLLS} DESTINATION ${RESINSIGHT_INSTALL_FOLDER} - CONFIGURATIONS Debug Release RelWithDebInfo) + CONFIGURATIONS Debug Release RelWithDebInfo + ) # CRT set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP ON) set(CMAKE_INSTALL_OPENMP_LIBRARIES ON) include(InstallRequiredSystemLibraries) install(PROGRAMS ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() @@ -597,7 +644,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) GROUP_READ GROUP_EXECUTE WORLD_READ - WORLD_EXECUTE) + WORLD_EXECUTE + ) endif() else(RESINSIGHT_PRIVATE_INSTALL) @@ -609,13 +657,17 @@ else(RESINSIGHT_PRIVATE_INSTALL) install( FILES ${CMAKE_CURRENT_SOURCE_DIR}/Resources/AppLogo48x48.png DESTINATION share/icons/hicolor/48x48/apps - RENAME ResInsight.png) + RENAME ResInsight.png + ) # desktop environment icon; remember to call `update-desktop-database` in # package post-install scripts - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/resinsight.desktop.in - ${CMAKE_CURRENT_BINARY_DIR}/resinsight.desktop @ONLY) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/resinsight.desktop.in + ${CMAKE_CURRENT_BINARY_DIR}/resinsight.desktop @ONLY + ) install(FILES ${CMAKE_CURRENT_BINARY_DIR}/resinsight.desktop - DESTINATION share/applications) + DESTINATION share/applications + ) endif(RESINSIGHT_PRIVATE_INSTALL) # OpenSSL @@ -633,25 +685,32 @@ if(RESINSIGHT_BUNDLE_OPENSSL) message("OpenSSL binary dir: ${OPENSSL_BIN_DIR}") install(FILES ${OPENSSL_BIN_DIR}/libcrypto-1_1-x64.dll - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) install(FILES ${OPENSSL_BIN_DIR}/libssl-1_1-x64.dll - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif(OPENSSL_FOUND) elseif(${CMAKE_SYSTEM_NAME} MATCHES "Linux") # Assumes that OpenSSL is installed by ./vcpkg install # --overlay-triplets=custom-triplets --triplet x64-linux-dynamic openssl set(OPENSSL_BIN_DIR - ${CMAKE_SOURCE_DIR}/ThirdParty/vcpkg/installed/x64-linux-dynamic/lib) + ${CMAKE_SOURCE_DIR}/ThirdParty/vcpkg/installed/x64-linux-dynamic/lib + ) message("OpenSSL binary dir: ${OPENSSL_BIN_DIR}") install(FILES ${OPENSSL_BIN_DIR}/libcrypto.so - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) install(FILES ${OPENSSL_BIN_DIR}/libcrypto.so.1.1 - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) install(FILES ${OPENSSL_BIN_DIR}/libssl.so - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) install(FILES ${OPENSSL_BIN_DIR}/libssl.so.1.1 - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() endif(RESINSIGHT_BUNDLE_OPENSSL) @@ -687,7 +746,8 @@ endif() if(NOT ${OCTAVE_VERSION_STRING} EQUAL "") set(RESINSIGHT_PACKAGE_NAME - "${RESINSIGHT_PACKAGE_NAME}_oct-${OCTAVE_VERSION_STRING}") + "${RESINSIGHT_PACKAGE_NAME}_oct-${OCTAVE_VERSION_STRING}" + ) endif() if(RESINSIGHT_BUNDLE_OPENSSL AND OPENSSL_FOUND) @@ -697,7 +757,8 @@ endif() # Append el5 when compiled on RHEL5 and el6 if compiled on RHEL6 if(NOT "${RESINSIGHT_RHEL_SYSTEM_NAME}" STREQUAL "") set(RESINSIGHT_PACKAGE_NAME - "${RESINSIGHT_PACKAGE_NAME}_${RESINSIGHT_RHEL_SYSTEM_NAME}") + "${RESINSIGHT_PACKAGE_NAME}_${RESINSIGHT_RHEL_SYSTEM_NAME}" + ) else() set(RESINSIGHT_PACKAGE_NAME "${RESINSIGHT_PACKAGE_NAME}_${CPACK_SYSTEM_NAME}") endif() diff --git a/ApplicationExeCode/Resources/ResInsight.qrc b/ApplicationExeCode/Resources/ResInsight.qrc index 90ca2b8c23..73ec220987 100644 --- a/ApplicationExeCode/Resources/ResInsight.qrc +++ b/ApplicationExeCode/Resources/ResInsight.qrc @@ -239,6 +239,7 @@ redo.png ComboBoxDown.svg ComboBoxUp.svg + WellIntAnalysis.png fs_CellFace.glsl diff --git a/ApplicationExeCode/Resources/WellIntAnalysis.png b/ApplicationExeCode/Resources/WellIntAnalysis.png new file mode 100644 index 0000000000..e14905a8e0 Binary files /dev/null and b/ApplicationExeCode/Resources/WellIntAnalysis.png differ diff --git a/ApplicationExeCode/RiaMain.cpp b/ApplicationExeCode/RiaMain.cpp index eb34dbea1b..2a05d22679 100644 --- a/ApplicationExeCode/RiaMain.cpp +++ b/ApplicationExeCode/RiaMain.cpp @@ -38,7 +38,7 @@ RiaApplication* createApplication( int& argc, char* argv[] ) { for ( int i = 1; i < argc; ++i ) { - if ( !qstrcmp( argv[i], "--console" ) || !qstrcmp( argv[i], "--unittest" ) ) + if ( !qstrcmp( argv[i], "--console" ) || !qstrcmp( argv[i], "--unittest" ) || !qstrcmp( argv[i], "--version" ) ) { #ifdef ENABLE_GRPC return new RiaGrpcConsoleApplication( argc, argv ); diff --git a/ApplicationLibCode/.clang-tidy b/ApplicationLibCode/.clang-tidy index 62eec8a1dd..6274e8b500 100644 --- a/ApplicationLibCode/.clang-tidy +++ b/ApplicationLibCode/.clang-tidy @@ -1,5 +1,5 @@ --- -Checks: '-*,modernize-use-override,modernize-use-nullptr,modernize-deprecated-headers' +Checks: '-*,modernize-use-override,modernize-use-nullptr,modernize-deprecated-headers,bugprone-bool-pointer-implicit-conversion,bugprone-parent-virtual-call,bugprone-redundant-branch-condition,bugprone-suspicious-semicolon,bugprone-suspicious-string-compare' WarningsAsErrors: '' HeaderFilterRegex: 'ApplicationLibCode/*.*$' FormatStyle: 'file' diff --git a/ApplicationLibCode/Adm/LicenseInformation.txt b/ApplicationLibCode/Adm/LicenseInformation.txt index 1d7d691529..be1f4bf478 100644 --- a/ApplicationLibCode/Adm/LicenseInformation.txt +++ b/ApplicationLibCode/Adm/LicenseInformation.txt @@ -486,3 +486,57 @@ CRAVA is a software package for seismic inversion and conditioning of Modifications and other icons are Copyright (C) Equinor ASA + +=============================================================================== + Notice for the mio library +=============================================================================== + +Copyright 2017 https://github.com/mandreyel + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +=============================================================================== + Notice for the fast_float library +=============================================================================== + +https://github.com/fastfloat/fast_float + +Permission is hereby granted, free of charge, to any +person obtaining a copy of this software and associated +documentation files (the "Software"), to deal in the +Software without restriction, including without +limitation the rights to use, copy, modify, merge, +publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software +is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice +shall be included in all copies or substantial portions +of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED +TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT +SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR +IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-fieldKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-fieldKeywords.txt new file mode 100644 index 0000000000..1285634d62 --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-fieldKeywords.txt @@ -0,0 +1,4114 @@ +// ResInsight version string : 2021.06.0 +// Report generated : man. jun 14 11:41:04 2021 +// +// + +AnalysisPlot - class RimAnalysisPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeSteps + ReferenceCase + IsUsingAutoName + PlotDescription + BarOrientation + MajorGroupType + MediumGroupType + MinorGroupType + ValueSortOperation + groupForColors + UseTopBarsFilter + MaxBarCount + UseBarText + UseCaseInBarText + UseEnsembleInBarText + UseSummaryItemInBarText + UseTimeStepInBarText + UseQuantityInBarText + BarTextFontSize + ValueAxisProperties + PlotDataFilterCollection + +AnalysisPlotCollection - class RimAnalysisPlotCollection + AnalysisPlots + +AnalysisPlotDataEntry - class RimAnalysisPlotDataEntry + SummaryCase + Ensemble + SummaryAddress + IsEnsembleCurve + +Annotations - class RimAnnotationInViewCollection + IsActive + TextAnnotations + AnnotationPlaneDepth + SnapAnnotations + TextAnnotationsInView + ReachCircleAnnotationsInView + UserDefinedPolylinesAnnotationsInView + PolylinesFromFileAnnotationsInView + AnnotationFontSize + +AsciiDataCurve - class RimAsciiDataCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + PlotAxis + TimeSteps + Values + Title + +CalcScript - class RimCalcScript + AbsolutePath + +CalculatedSummaryCase - class RimCalculatedSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + +CellEdgeResultSlot - class RimCellEdgeColors + EnableCellEdgeColors + propertyType + CellEdgeVariable + UseXVariable + UseYVariable + UseZVariable + LegendDefinition + SingleVarEdgeResult + +CellPropertyFilter - class RimEclipsePropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + CategorySelection + +CellPropertyFilters - class RimEclipsePropertyFilterCollection + Active + PropertyFilters + +CellRangeFilter - class RimCellRangeFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + StartIndexI + CellCountI + StartIndexJ + CellCountJ + StartIndexK + CellCountK + +CellRangeFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +ChangeDataSourceFeatureUi - class RimWellLogCurveCommonDataSource + CurveCase + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveTimeStep + WBSSmoothing + WBSSmoothingThreshold + +CmdFieldChangeExecData - class caf::CmdFieldChangeExecData + PathToField + +ColorLegend - class RimColorLegend + ColorLegendName + ColorLegendItems + +ColorLegendCollection - class RimColorLegendCollection + CustomColorLegends + +ColorLegendItem - class RimColorLegendItem + Color + CategoryValue + CategoryName + +CompletionTemplateCollection - class RimCompletionTemplateCollection + FractureTemplates + StimPlanModelTemplates + ValveTemplates + FractureGroupStatisticsCollection + +CorrelationMatrixPlot - class RimCorrelationMatrixPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationSorting + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + LegendConfig + SelectedParameters + +CorrelationPlot - class RimCorrelationPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + SelectedParameters + +CorrelationPlotCollection - class RimCorrelationPlotCollection + CorrelationPlots + CorrelationReports + +CorrelationReportPlot - class RimCorrelationReportPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotWindowTitle + MatrixPlot + CorrelationPlot + CrossPlot + SubTitleFontSize + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + +CrossSection - class RimExtrudedCurveIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + Type + Direction + WellPath + SimulationWell + Points + AzimuthAngle + DipAngle + CustomExtrusionPoints + TwoAzimuthPoints + Branch + ExtentLength + lengthUp + lengthDown + +CrossSectionCollection - class RimIntersectionCollection + CrossSections + IntersectionBoxes + Active + +DataContainerFloat - class RimcDataContainerDouble + values + +DataContainerString - class RimcDataContainerString + values + +DataContainerTime - class RimcDataContainerTime + values + +DepthTrackPlot - class RimDepthTrackPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + +DoubleParameter - class RimDoubleParameter + Name + Label + Description + Advanced + Valid + Value + +Eclipse2dViewCollection - class RimEclipseContourMapViewCollection + EclipseViews + +EclipseCase - class RimEclipseResultCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + UnitSystem + FlowDiagSolutions + SourSimFileName + +EclipseGeometrySelectionItem - class RimEclipseGeometrySelectionItem + EclipseCase + GridIndex + CellIndex + LocalIntersectionPoint + +ElasticProperties - class RimElasticProperties + FilePath + ShowScaledProperties + PropertyScalingCollection + +ElasticPropertyScaling - class RimElasticPropertyScaling + Name + IsChecked + Formation + Facies + Property + Scale + +ElasticPropertyScalingCollection - class RimElasticPropertyScalingCollection + ElasticPropertyScalings + +EnsembleFractureStatistics - class RimEnsembleFractureStatistics + Name + FilePaths + MeshAlignmentType + MeshType + NumberOfSamplesX + NumberOfSamplesY + AdaptiveMeanType + AdaptiveNumLayersType + AdaptiveNumLayers + SelectedStatisticsType + ComputeStatistics + +EnsembleFractureStatisticsPlot - class RimEnsembleFractureStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + EnsembleFractureStatistics + Property + +EnsembleFractureStatisticsPlotCollection - class RimEnsembleFractureStatisticsPlotCollection + EnsembleFractureStatisticsPlots + +FaciesInitialPressureConfig - class RimFaciesInitialPressureConfig + IsChecked + FaciesName + FaciesValue + Fraction + +FaciesProperties - class RimFaciesProperties + FilePath + FaciesDefinition + ColorLegend + +Fault - class RimFaultInView + FaultName + ShowFault + Color + +Faults - class RimFaultInViewCollection + Active + ShowFaultFaces + ShowOppositeFaultFaces + ShowFaultsOutsideFilters + FaultFaceCulling + ShowFaultLabel + FaultLabelColor + ShowNNCs + HideNncsWhenNoResultIsAvailable + Faults + EnableFaultRA + FaultRASettings + +FileSummaryCase - class RimFileSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + IncludeRestartFiles + +FishbonesCollection - class RimFishbonesCollection + Name + IsChecked + FishbonesSubs + StartMD + MainBoreDiameter + MainBoreSkinFactor + +FishbonesMultipleSubs - class RimFishbones + Active + Name + Color + LateralCountPerSub + LateralLength + LateralExitAngle + LateralBuildAngle + LateralTubingDiameter + LateralOpenHoleRoghnessFactor + LateralTubingRoghnessFactor + LateralInstallSuccessFraction + IcdCount + IcdOrificeDiameter + IcdFlowCoefficient + SubsLocationMode + RangeStart + RangeEnd + RangeSubSpacing + RangeSubCount + LocationOfSubs + ValveLocations + SubsOrientationMode + InstallationRotationAngles + FixedInstallationRotationAngle + PipeProperties + +FishbonesPipeProperties - class RimFishbonesPipeProperties + LateralHoleDiameter + SkinFactor + +FlowCharacteristicsPlot - class RimFlowCharacteristicsPlot + WindowController + ShowWindow + WindowGeometry + FlowCase + FlowDiagSolution + TimeSelectionType + SelectedTimeSteps + SelectedTimeStepsUi + CellPVThreshold + ShowLegend + CellFilter + CellFilterView + TracerFilter + SelectedTracerNames + MinCommunication + MaxTof + +FlowDiagSolution - class RimFlowDiagSolution + UserDescription + +FlowPlotCollection - class RimFlowPlotCollection + FlowCharacteristicsPlot + DefaultWellAllocationPlot + WellDistributionPlotCollection + StoredWellAllocationPlots + StoredFlowCharacteristicsPlots + +FormationNames - class RimFormationNames + FormationNamesFileName + +FormationNamesCollectionObject - class RimFormationNamesCollection + FormationNamesList + +FractureContainment - class RimFractureContainment + IsUsingFractureContainment + TopKLayer + BaseKLayer + TruncateAtFaults + FaultThrowValue + +FractureDefinitionCollection - class RimFractureTemplateCollection + DefaultUnitForTemplates + FractureDefinitions + NextValidFractureTemplateId + +FractureGroupStatisticsCollection - class RimEnsembleFractureStatisticsCollection + FractureGroupStatistics + +GeoMech2dViewCollection - class RimGeoMechContourMapViewCollection + GeoMechViews + +GeoMechGeometrySelectionItem - class RimGeoMechGeometrySelectionItem + GeoMechCase + m_gridIndex + m_cellIndex + m_elementFace + m_hasIntersectionTriangle + m_intersectionTriangle_0 + m_intersectionTriangle_1 + m_intersectionTriangle_2 + m_localIntersectionPoint + +GeoMechPropertyFilter - class RimGeoMechPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + +GeoMechPropertyFilters - class RimGeoMechPropertyFilterCollection + Active + PropertyFilters + +GeoMechResultDefinition - class RimGeoMechResultDefinition + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + +GeoMechResultSlot - class RimGeoMechCellColors + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + LegendDefinition + +GeoMechView - class RimGeoMechView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + AnimationMode + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + +GridCaseSurface - class RimGridCaseSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SourceCase + SliceIndex + +GridCollection - class RimGridCollection + IsActive + MainGrid + PersistentLgrs + +GridCrossPlotCurve - class RimGridCrossPlotCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + +GridCrossPlotCurveSet - class RimGridCrossPlotDataSet + Name + IsChecked + Case + TimeStep + VisibleCellView + Grouping + XAxisProperty + YAxisProperty + GroupingProperty + NameConfig + CrossPlotCurves + UseCustomColor + CustomColor + PlotCellFilterCollection + +GridInfo - class RimGridInfo + IsActive + GridName + GridIndex + +GridInfoCollection - class RimGridInfoCollection + IsActive + GridInfos + +GridStatisticsPlot - class RimGridStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + Case + TimeStep + VisibleCellView + Property + +GridStatisticsPlotCollection - class RimGridStatisticsPlotCollection + GridStatisticsPlots + +GridSummaryCase - class RimGridSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + Associated3DCase + CachedCasename + Associated3DCaseGridFileName + IncludeRestartFiles + +GridTimeHistoryCurve - class RimGridTimeHistoryCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + GeometrySelectionText + EclipseResultDefinition + GeoMechResultDefinition + GeometrySelectionItem + PlotAxis + +IntegerParameter - class RimIntegerParameter + Name + Label + Description + Advanced + Valid + Value + +Intersection2dView - class Rim2dIntersectionView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + AnimationMode + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + Intersection + ShowDefiningPoints + ShowAxisLines + +Intersection2dViewCollection - class Rim2dIntersectionViewCollection + IntersectionViews + +IntersectionBox - class RimBoxIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + singlePlaneState + MinXCoord + MaxXCoord + MinYCoord + MaxYCoord + MinDepth + MaxDepth + xySliderStepSize + DepthSliderStepSize + +IntersectionResultDefinition - class RimIntersectionResultDefinition + IsActive + Case + TimeStep + IntersectionResultDefinitionDescription + EclipseResultDef + GeoMechResultDef + LegendConfig + TernaryLegendConfig + +Legend - class RimRegularLegendConfig + ShowLegend + NumberOfLevels + Precision + TickNumberFormat + ColorRangeMode + ColorLegend + MappingMode + RangeType + UserDefinedMax + UserDefinedMin + CategoryColorMode + ResultVariableUsage + ResetDefaultValues + +MainPlotCollection - class RimMainPlotCollection + Show + WellLogPlotCollection + RftPlotCollection + PltPlotCollection + SummaryPlotCollection + AnalysisPlotCollection + CorrelationPlotCollection + SummaryCrossPlotCollection + FlowPlotCollection + Rim3dCrossPlotCollection + RimSaturationPressurePlotCollection + RimMultiPlotCollection + StimPlanModelPlotCollection + VfpPlotCollection + GridStatisticsPlotCollection + EnsembleFractureStatisticsPlotCollection + +MdiWindowController - class RimMdiWindowController + MainWindowID + xPos + yPos + Width + Height + IsMaximized + +MockModelSettings - class RimMockModelSettings + CellCountX + CellCountY + CellCountZ + TotalCellCount + ResultCount + TimeStepCount + +ModeledWellPath - class RimModeledWellPath + Name + (A)WellPathName + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellPathGeometryDef + +MultiPlot - class RimMultiPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + ShowTitleInPlot + PlotDescription + Plots + NumberOfColumns + RowsPerPage + ShowPlotTitles + MajorTickmarkCount + SubTitleFontSize + PagePreviewMode + +MultiSnapshotDefinition - class RimAdvancedSnapshotExportDefinition + IsActive + View + EclipseResultType + SelectedEclipseResults + TimeStepStart + TimeStepEnd + SnapShotDirection + RangeFilterStart + RangeFilterEnd + AdditionalCases + +NonNetLayers - class RimNonNetLayers + IsChecked + Cutoff + Facies + FaciesDefinition + +ObservedDataCollection - class RimObservedDataCollection + ObservedDataArray + ObservedFmuRftDataArray + +ObservedFmuRftData - class RimObservedFmuRftData + Name + Directory + +ParameterGroup - class RimParameterGroup + Parameters + Name + Expanded + +ParameterResultCrossPlot - class RimParameterResultCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + EnsembleParameter + +PdmDocument - class caf::PdmDocument + DocumentFileName + +PdmObjectCollection - class caf::PdmObjectCollection + PdmObjects + +PdmObjectGroup - class caf::PdmObjectGroup + +Perforation - class RimPerforationInterval + Name + IsChecked + StartMeasuredDepth + EndMeasuredDepth + Diameter + SkinFactor + StartOfHistory + UseCustomStartDate + StartDate + UseCustomEndDate + EndDate + Valves + +PerforationCollection - class RimPerforationCollection + Name + IsChecked + Perforations + NonDarcyParameters + +PlotDataFilterCollection - class RimPlotDataFilterCollection + IsActive + PlotDataFiltersField + +PlotDataFilterItem - class RimPlotDataFilterItem + IsActive + FilterTarget + FilterAddressField + QuantityText + FilterOperation + MinTopN + Max + Min + EnsembleParameterValueCategories + ConsideredTimestepsType + ExplicitlySelectedTimeSteps + +PlotTemplateCollection - class RimPlotTemplateFolderItem + FolderName + FileNames + SubFolders + +PlotTemplateFileItem - class RimPlotTemplateFileItem + AbsolutePath + +PolyLineFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolygonFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolylineTarget - class RimPolylineTarget + IsEnabled + TargetPointXyd + +PolylinesFromFileAnnotation - class RimPolylinesFromFileAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + PolyLineFilePath + PolyLineDescription + +PressureTable - class RimPressureTable + Items + PressureDate + +PressureTableItem - class RimPressureTableItem + Depth + InitialPressure + Pressure + +PropertyFilter - class RimPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + +ResInsightAnalysisModels - class RimEclipseCaseCollection + Reservoirs + CaseGroups + +ResInsightGeoMechCase - class RimGeoMechCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + GeoMechViews + CaseCohesion + FrctionAngleDeg + ElementPropertyFileNames + BiotCoefficientType + BiotFixedCoefficient + BiotResultAddress + InitialPermeabilityType + InitialPermeabilityFixed + InitialPermeabilityAddress + PermeabilityExponent + WaterDensityShearSlipIndicator + ContourMaps + MudWeightWindowParameters + +ResInsightGeoMechModels - class RimGeoMechModels + Cases + +ResInsightOilField - class RimOilField + AnalysisModels + GeoMechModels + WellPathCollection + CompletionTemplateCollection + SummaryCaseCollection + FormationNamesCollection + ObservedDataCollection + AnnotationCollection + FractureDefinitionCollection + SurfaceCollection + +ResInsightProject - class RimProject + DocumentFileName + ProjectFileVersionString + ReferencedExternalFiles + OilFields + ColorLegendCollection + WellPathImport + MainPlotCollection + LinkedViews + CalculationCollection + CommandObjects + MultiSnapshotDefinitions + TreeViewState + TreeViewCurrentModelIndexPath + PlotWindowTreeViewState + PlotWindowTreeViewCurrentModelIndexPath + show3DWindow + showPlotWindow + tiled3DWindow + tiledPlotWindow + DialogData + Reservoirs + CaseGroups + +ResampleData - class RimcSummaryResampleData + TimeSteps + Values + +ReservoirCellResultStorage - class RimReservoirCellResultsStorage + ResultCacheFileName + ResultCacheEntries + +ReservoirView - class RimEclipseView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + AnimationMode + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + +ResultDefinition - class RimEclipseResultDefinition + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + +ResultSlot - class RimEclipseCellColors + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + LegendDefinition + ResultVarLegendDefinitionList + TernaryLegendDefinition + LegendDefinitionPtrField + +ResultStorageEntryInfo - class RimReservoirCellResultsStorageEntryInfo + ResultType + ResultName + TimeSteps + DaysSinceSimulationStart + FilePositionDataStart + +RftAddress - class RimDataSourceForRftPlt + SourceType + EclipseCase + WellLogFile + Ensemble + ObservedFmuRftData + +RiaMemoryCleanup - class RiaMemoryCleanup + DataCase + ResultsToDelete + +RiaPreferences - class RiaPreferences + navigationPolicy + enableGrpcServer + defaultGrpcPort + scriptDirectory + scriptEditorExecutable + octaveExecutable + octaveShowHeaderInfoWhenExecutingScripts + pythonExecutable + pythonDebugInfo + ssihubAddress + defaultMeshModeType + defaultGridLineColors + defaultFaultGridLineColors + defaultWellLableColor + defaultViewerBackgroundColor + defaultScaleFactorZ + defaultSceneFontSizePt + defaultAnnotationFontSizePt + defaultWellLabelFontSizePt + defaultPlotFontSizePt + showLasCurveWithoutTvdWarning + useShaders + showHud + appendClassNameToUiText + appendFieldKeywordToToolTipText + showViewIdInTree + showTestToolbar + includeFractureDebugInfoFile + showLegendBackground + enableFaultsByDefault + showInfoBox + showGridBox + lastUsedProjectFileName + autocomputeDepth + loadAndShowSoil + holoLensExportFolder + holoLensDisableCertificateVerification + csvTextExportFieldSeparator + showProjectChangedDialog + readerSettings + dateFormat + timeFormat + showProgressBar + useUndoRedo + plotTemplateFolders + SearchPlotTemplateFoldersRecursively + defaultPlotTemplate + pageSize + pageOrientation + pageLeftMargin + pageTopMargin + pageRightMargin + pageBottomMargin + openExportedPdfInViewer + gtestFilter + SurfaceImportResamplingDistance + MultiLateralWellPattern + guiTheme + summaryPreferences + geoMechPreferences + +RiaPreferencesGeoMech - class RiaPreferencesGeoMech + geomechFRAPreprocCommand + geomechFRAPostprocCommand + geomechFRAMacrisCommand + geomechFRADefaultXML + geomechFRADefaultAdvXML + keepTemporaryFile + +RiaPreferencesSummary - class RiaPreferencesSummary + summaryRestartFilesShowImportDialog + summaryImportMode + gridImportMode + summaryEnsembleImportMode + defaultSummaryHistoryCurveStyle + defaultSummaryCurvesTextFilter + createOptimizedSummaryDataFile + useOptimizedSummaryDataFile + createH5SummaryDataFile + checkH5FileTimeStamp + createH5SummaryFileThreadCount + summaryReaderType + showSummaryTimeAsLongString + useMultipleThreadsWhenLoadingSummaryCases + +RiaRegressionTest - class RiaRegressionTest + workingFolder + folderContainingDiffTool + folderContainingGitTool + regressionTestFolder + showInteractiveDiffImages + useOpenMPForGeometryCreation + openReportInBrowser + testFilter + appendTestsAfterTestFilter + invalidateExternalFilePaths + +RicCaseAndFileExportSettingsUi - class RicCaseAndFileExportSettingsUi + Folder + CaseToApply + +RicCellRangeUi - class RicCellRangeUi + Case + GridIndex + StartIndexI + StartIndexJ + StartIndexK + CellCountI + CellCountJ + CellCountK + +RicDeleteItemExecData - class RicDeleteItemExecData + PathToField + Description + indexToObject + deletedObjectAsXml + +RicExportCarfinUi - class RicExportCarfinUi + CellRange + ExportFileName + CaseToApply + CellCountI + CellCountJ + CellCountK + MaxWellCount + +RicExportCompletionDataSettingsUi - class RicExportCompletionDataSettingsUi + Folder + CaseToApply + FileSplit + compdatExport + TimeStepIndex + IncludeMSW + UseLateralNTG + IncludePerforations + IncludeFishbones + IncludeFractures + TransScalingType + TransScalingTimeStep + TransScalingWBHPSource + TransScalingWBHP + ExcludeMainBoreForFishbones + ReportCompletionTypesSeparately + ExportDataSourceAsComment + ExportWelspec + CompletionWelspecAfterMainBore + UseCustomFileName + CustomFileName + +RicExportContourMapToTextUi - class RicExportContourMapToTextUi + ExportFileName + ExportLocalCoordinates + UndefinedValueLabel + ExcludeUndefinedValues + +RicExportEclipseInputGridUi - class RicExportEclipseSectorModelUi + ExportGrid + ExportGridFilename + ExportInLocalCoords + InvisibleCellActnum + GridBoxSelection + MinI + MinJ + MinK + MaxI + MaxJ + MaxK + ExportFaults + ExportFaultsFilename + RefinementCountI + RefinementCountJ + RefinementCountK + ExportParams + ExportParamsFilename + ExportMainKeywords + +RicExportLgrUi - class RicExportLgrUi + ExportFolder + CaseToApply + TimeStepIndex + IncludePerforations + IncludeFractures + IncludeFishbones + CellCountI + CellCountJ + CellCountK + SplitType + +RicExportToLasFileObj - class RicExportToLasFileObj + tvdrkbOffset + +RicExportToLasFileResampleUi - class RicExportToLasFileResampleUi + ExportFolder + FilePrefix + CapitalizeFileName + CurveUnitConversion + ActivateResample + ResampleInterval + ExportTvdrkb + tvdrkbOffsets + +RicExportWellPathsUi - class RicExportWellPathsUi + ExportFolder + MdStepSize + +RicHoloLensCreateSessionUi - class RicHoloLensCreateSessionUi + SessionName + SessionPinCode + ServerSettings + +RicHoloLensExportToFolderUi - class RicHoloLensExportToFolderUi + ViewForExport + ExportFolder + +RicHoloLensServerSettings - class RicHoloLensServerSettings + ServerAddress + +RicLinkVisibleViewsFeatureUi - class RicLinkVisibleViewsFeatureUi + MasterView + +RicPasteAsciiDataToSummaryPlotFeatureUi - class RicPasteAsciiDataToSummaryPlotFeatureUi + PlotTitle + CurvePrefix + DecimalSeparator + DateFormat + TimeFormat + UseCustomDateFormat + CustomDateTimeFormat + LineStyle + Symbol + SymbolSkipDinstance + CellSeparator + TimeColumnName + PreviewText + +RicSaturationPressureUi - class RicSaturationPressureUi + CaseToApply + TimeStep + +RicSaveEclipseInputVisibleCellsUi - class RicSaveEclipseInputVisibleCellsUi + ExportFilename + ExportKeyword + VisibleActiveCellsValue + HiddenActiveCellsValue + InactiveCellsValue + +RicSelectPlotTemplateUi - class RicSelectPlotTemplateUi + SelectedPlotTemplates + +RicSelectSummaryPlotUI - class RicSelectSummaryPlotUI + SelectedSummaryPlot + CreateNewPlot + NewViewName + +RicSelectViewUI - class RicSelectViewUI + MasterView + CreateNewView + NewViewName + +RicSummaryAddressSelection - class RiuSummaryVectorSelectionUi + SummaryCases + CurrentSummaryCategory + SelectedSummaryCategories + FieldVectors + Aquifers + AquiferVectors + NetworkVectors + MiscVectors + Regions + RegionsVectors + Region2RegionRegions + Region2RegionVectors + WellGroupWellGroupNames + WellGroupVectors + WellWellName + WellVectors + WellCompletionWellName + WellCompletionIjk + WellCompletionVectors + WellCompletionLgrLgrName + WellCompletionLgrWellName + WellCompletionLgrIjk + WellCompletionLgrVectors + WellLgrLgrName + WellLgrWellName + WellLgrVectors + WellSegmentWellName + WellSegmentNumber + WellSegmentVectors + BlockIjk + BlockVectors + BlockLgrLgrName + BlockLgrIjk + BlockLgrVectors + CalculatedVectors + ImportedVectors + +RicSummaryCurveCalculator - class RicSummaryCurveCalculatorUi + CurrentCalculation + NewCalculation + DeleteCalculation + +RicSummaryCurveCreator - class RicSummaryPlotEditorUi + TargetPlot + UseAutoAppearanceAssignment + AppearanceApplyButton + CaseAppearanceType + VariableAppearanceType + WellAppearanceType + GroupAppearanceType + RegionAppearanceType + UseAutoPlotTitle + ApplySelection + Close + OK + SummaryCurveNameConfig + +RicWellPathsUnitSystemSettingsUi - class RicWellPathsUnitSystemSettingsUi + UnitSystem + +RifReaderSettings - class RifReaderSettings + importFaults + importSimulationNNCs + includeInactiveCellsInFaultGeometry + importAdvancedMswData + useResultIndexFile + skipWellData + includeFileAbsolutePathPrefix + +Rim3dWellLogCurveCollection - class Rim3dWellLogCurveCollection + Show3dWellLogCurves + PlaneWidthScaling + Show3dWellLogGrid + Show3dWellLogBackground + ArrayOf3dWellLogCurves + +Rim3dWellLogExtractionCurve - class Rim3dWellLogExtractionCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveCase + CurveTimeStep + CurveEclipseResult + CurveGeomechResult + NameConfig + +Rim3dWellLogFileCurve - class Rim3dWellLogFileCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveWellLogChannel + WellLogFile + NameConfig + +Rim3dWellLogRftCurve - class Rim3dWellLogRftCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + eclipseResultCase + timeStep + wellLogChannelName + NameConfig + +RimAnnotationCollection - class RimAnnotationCollection + IsActive + TextAnnotations + ReachCircleAnnotations + UserDefinedPolylineAnnotations + PolylineFromFileAnnotations + +RimAnnotationCollectionBase - class RimAnnotationCollectionBase + IsActive + TextAnnotations + +RimAnnotationGroupCollection - class RimAnnotationGroupCollection + IsActive + Annotations + +RimAnnotationLineAppearance - class RimAnnotationLineAppearance + LineFieldsHidden + Color + Thickness + +RimAnnotationTextAppearance - class RimAnnotationTextAppearance + FontSize + FontColor + BackgroundColor + AnchorLineColor + +RimBinaryExportSettings - class RimBinaryExportSettings + Filename + EclipseKeyword + UndefinedValue + +RimCaseCollection - class RimCaseCollection + Reservoirs + +RimCellFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +RimCommandExecuteScript - class RimCommandExecuteScript + Name + ScriptText + IsEnabled + +RimCommandIssueFieldChanged - class RimCommandIssueFieldChanged + CommandName + ObjectName + FieldName + FieldValueToApply + +RimCommandObject - class RimCommandObject + +RimContourMapView - class RimEclipseContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + AnimationMode + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimCsvUserData - class RimCsvUserData + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + ParseOptions + +RimCustomObjectiveFunction - class RimCustomObjectiveFunction + FunctionTitle + CustomFunctionTitle + Weights + ObjectiveFunctions + +RimCustomObjectiveFunctionCollection - class RimCustomObjectiveFunctionCollection + ObjectiveFunctions + +RimCustomObjectiveFunctionWeight - class RimCustomObjectiveFunctionWeight + WeightTitle + ObjectiveSummaryAddress + WeightValue + ObjectiveFunction + +RimDerivedEnsembleCase - class RimDerivedSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + SummaryCase1 + Operator + SummaryCase2 + UseFixedTimeStep + FixedTimeStepIndex + InUse + +RimDerivedEnsembleCaseCollection - class RimDerivedEnsembleCaseCollection + SummaryCases + SummaryCollectionName + NameCount + IsEnsemble + Id + (A)EnsembleId + Ensemble1 + Ensemble2 + Operator + CaseCount + MatchOnParameters + UseFixedTimeStep + FixedTimeStepIndex + +RimDialogData - class RimDialogData + ExportCarfin + ExportCompletionData + MultipleFractionsData + HoloLenseExportToFolderData + ExportwellPathsData + ExportLgr + ExportSectorModel + MockModelSettings + +RimEclipseContourMapProjection - class RimEclipseContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + WeightByParameter + WeightingResult + +RimElementVectorResult - class RimElementVectorResult + LegendDefinition + ShowOil + ShowGas + ShowWater + ShowResult + VectorView + VectorSurfaceCrossingLocation + ShowVectorI + ShowVectorJ + ShowVectorK + ShowNncData + Threshold + VectorColor + UniformVectorColor + SizeScale + +RimEllipseFractureTemplate - class RimEllipseFractureTemplate + Id + UserDescription + UnitSystem + Orientation + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + HalfLength + Height + Width + Permeability + +RimEnsembleCurveFilter - class RimEnsembleCurveFilter + FilterTitle + Active + FilterMode + EnsembleParameter + ObjectiveSummaryAddress + ObjectiveFunction + CustomObjectiveFunction + MinValue + MaxValue + Categories + +RimEnsembleCurveFilterCollection - class RimEnsembleCurveFilterCollection + Active + CurveFilters + NewEnsembleFilter + +RimEnsembleCurveSet - class RimEnsembleCurveSet + EnsembleCurveSet + IsActive + SummaryGroup + SummaryAddress + Resampling + ColorMode + Color + EnsembleParameter + ObjectiveSummaryAddress + CustomObjectiveFunction + ShowObjectiveFunctionFormula + MinDateRange + MinTimeStep + MaxDateRange + MaxTimeStep + TimeStepFilter + TimeSteps + PlotAxis + LegendConfig + CurveFilters + CustomObjectiveFunctions + ObjectiveFunction + Statistics + UserDefinedName + AutoName + SummaryAddressNameTools + VarListFilter + +RimEnsembleCurveSetCollection - class RimEnsembleCurveSetCollection + EnsembleCurveSets + IsActive + +RimEnsembleStatistics - class RimEnsembleStatistics + Active + HideEnsembleCurves + BasedOnFilteredCases + ShowP10Curve + ShowP50Curve + ShowP90Curve + ShowMeanCurve + ShowCurveLabels + IncludeIncompleteCurves + Color + +RimEquilibriumAxisAnnotation - class RimEquilibriumAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + AnnotationType + Associated3DCase + m_equilNum + +RimExportInputSettings - class RimExportInputSettings + Filename + Keyword + +RimFaultRAPreprocSettings - class RimFaultRAPreprocSettings + StartTimeStepEclipse + EndTimeStepEclipse + StartTimeStepGeoMech + EndTimeStepGeoMech + EclipseCase + GeomechCase + BaseDir + CleanBaseDir + SmoothEclipseData + ElasticTableFilename + +RimFaultRASettings - class RimFaultRASettings + EclipseCase + GeomechCase + EclipseFRACase + BaseDir + ElasticTableFilename + StartTimeStepEclipse + EndTimeStepEclipse + StartTimeStepGeoMech + EndTimeStepGeoMech + BasicParameters + AdvancedParameters + BasicParametersRI + AdvancedParametersRI + +RimFaultResultSlot - class RimEclipseFaultColors + ShowCustomFaultResult + CustomResultSlot + +RimFractureExportSettings - class RimFractureExportSettings + Filename + CaseToApply + +RimGeoMechContourMapProjection - class RimGeoMechContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + LimitToPorRegion + VerticalLimit + PaddingAroundPorRegion + +RimGeoMechContourMapView - class RimGeoMechContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + AnimationMode + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimGridCrossPlot - class RimGridCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimGridCrossPlotCollection - class RimGridCrossPlotCollection + GridCrossPlots + +RimGridCrossPlotCurveSetNameConfig - class RimGridCrossPlotDataSetNameConfig + CustomCurveName + AddCaseName + AddAxisVariables + AddTimeStep + AddGrouping + +RimGridCrossPlotNameConfig - class RimGridCrossPlotNameConfig + CustomCurveName + AddDataSetNames + +RimIdenticalGridCaseGroup - class RimIdenticalGridCaseGroup + UserDescription + GroupId + StatisticsCaseCollection + CaseCollection + +RimInputProperty - class RimEclipseInputProperty + ResultName + EclipseKeyword + FileName + +RimInputPropertyCollection - class RimEclipseInputPropertyCollection + InputProperties + +RimInputReservoir - class RimEclipseInputCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + AdditionalFileNamesProxy + +RimIntersectionResultsDefinitionCollection - class RimIntersectionResultsDefinitionCollection + isActive + IntersectionResultDefinitions + +RimMeasurement - class RimMeasurement + +RimMswCompletionParameters - class RimMswCompletionParameters + RefMDType + RefMD + CustomValuesForLateral + LinerDiameter + RoughnessFactor + PressureDrop + LengthAndDepth + EnforceMaxSegmentLength + MaxSegmentLength + +RimMudWeightWindowParameters - class RimMudWeightWindowParameters + WellDeviationSourceType + WellDeviationFixed + WellDeviationAddress + WellAzimuthSourceType + WellAzimuthFixed + WellAzimuthAddress + UCSSourceType + UCSFixed + UCSAddress + PoissonsRatioSourceType + PoissonsRatioFixed + PoissonsRatioAddress + K0_FGSourceType + K0_FGFixed + K0_FGAddress + obg0SourceType + obg0Fixed + obg0Address + AirGap + SHMultiplier + UpperLimitType + LowerLimitType + FractureGradientCalculationType + PorePressureNonReservoirSource + UserPPNonReservoir + PPNonReservoirAddress + ReferenceLayer + +RimMultiPlotCollection - class RimMultiPlotCollection + MultiPlots + +RimMultipleValveLocations - class RimMultipleValveLocations + LocationMode + RangeStart + RangeEnd + ValveSpacing + RangeValveCount + LocationOfValves + +RimNonDarcyPerforationParameters - class RimNonDarcyPerforationParameters + NonDarcyFlowType + UserDefinedDFactor + GridPermeabilityScalingFactor + WellRadius + RelativeGasDensity + GasViscosity + InertialCoefficientBeta0 + PermeabilityScalingFactor + PorosityScalingFactor + +RimObjectiveFunction - class RimObjectiveFunction + FunctionType + NormalizeByNumberOfObservations + NormalizeByNumberOfVectors + ErrorEstimatePercentage + UseSquaredError + +RimObservedEclipseUserData - class RimObservedEclipseUserData + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +RimOilFieldEntry - class RimOilFieldEntry + OilFieldName + EdmId + Selected + wellsFilePath + Wells + +RimOilRegionEntry - class RimOilRegionEntry + OilRegionEntry + Fields + Selected + +RimPlotAxisAnnotation - class RimPlotAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + +RimPlotCellFilterCollection - class RimPlotCellFilterCollection + Name + IsChecked + FilterMode + CellFilters + +RimPlotCellPropertyFilter - class RimPlotCellPropertyFilter + Name + IsChecked + FilterMode + ResultDefinition + LowerBound + UpperBound + +RimPolylineAppearance - class RimPolylineAppearance + LineFieldsHidden + Color + Thickness + SphereFieldsHidden + SphereColor + SphereRadiusFactor + +RimPolylinesAnnotationInView - class RimPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimPolylinesFromFileAnnotationInView - class RimPolylinesFromFileAnnotationInView + IsActive + SourceAnnotation + +RimProcess - class RimProcess + Command + Description + ID + +RimReachCircleAnnotation - class RimReachCircleAnnotation + IsActive + CenterPointXyd + Radius + Name + Appearance + +RimReachCircleAnnotationInView - class RimReachCircleAnnotationInView + IsActive + SourceAnnotation + +RimSaturationPressurePlot - class RimSaturationPressurePlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimSaturationPressurePlotCollection - class RimSaturationPressurePlotCollection + SaturationPressurePlots + +RimStatisticalCalculation - class RimEclipseStatisticsCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + ResultType + PorosityModel + DynamicPropertiesToCalculate + StaticPropertiesToCalculate + GeneratedPropertiesToCalculate + InputPropertiesToCalculate + FractureDynamicPropertiesToCalculate + FractureStaticPropertiesToCalculate + FractureGeneratedPropertiesToCalculate + FractureInputPropertiesToCalculate + CalculatePercentiles + PercentileCalculationType + LowPercentile + MidPercentile + HighPercentile + WellDataSourceCase + UseZeroAsInactiveCellValue + +RimStatisticalCollection - class RimEclipseStatisticsCaseCollection + Reservoirs + +RimStimPlanColors - class RimStimPlanColors + IsChecked + ResultName + DefaultColor + LegendConfigurations + ShowStimPlanMesh + StimPlanCellVizMode + +RimStimPlanFractureTemplate - class RimStimPlanFractureTemplate + Id + UserDescription + UnitSystem + Orientation + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + ShowStimPlanMesh + +RimStimPlanLegendConfig - class RimStimPlanLegendConfig + Name + Legend + +RimSummaryCalculation - class RimSummaryCalculation + Description + Expression + Unit + Variables + CalculatedValues + TimeSteps + Id + +RimSummaryCalculationCollection - class RimSummaryCalculationCollection + Calculations + +RimSummaryCalculationVariable - class RimSummaryCalculationVariable + VariableName + SummaryCase + SummaryAddress + +RimSummaryCurveCollection - class RimSummaryCurveCollection + CollectionCurves + IsActive + +RimSummaryCurveCollectionModifier - class RimSummaryPlotSourceStepping + CurveCase + IncludeEnsembleCasesForCaseStepping + WellName + GroupName + Region + Quantities + CellBlock + Segment + Completion + Aquifer + Ensemble + Placeholder + +RimTensorResults - class RimTensorResults + LegendDefinition + ResultVariable + ShowTensors + Principal1 + Principal2 + Principal3 + Threshold + VectorColor + ScaleMethod + SizeScale + RangeType + +RimTernaryLegendConfig - class RimTernaryLegendConfig + ShowTernaryLegend + Precision + RangeType + ternaryRangeSummary + UserDefinedMaxSoil + UserDefinedMinSoil + UserDefinedMaxSgas + UserDefinedMinSgas + UserDefinedMaxSwat + UserDefinedMinSwat + +RimTextAnnotation - class RimTextAnnotation + AnchorPointXyd + LabelPointXyd + Text + IsActive + TextAppearance + +RimTextAnnotationInView - class RimTextAnnotationInView + IsActive + SourceAnnotation + +RimTimeAxisAnnotation - class RimTimeAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + +RimTimeStepFilter - class RimTimeStepFilter + FilterType + FirstTimeStep + LastTimeStep + Interval + DateFormat + TimeStepIndicesToImport + +RimUserDefinedPolylinesAnnotationInView - class RimUserDefinedPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimVfpPlotCollection - class RimVfpPlotCollection + VfpPlots + +RimViewLinkerCollection - class RimViewLinkerCollection + Active + ViewLinkers + +RimViewNameConfig - class RimViewNameConfig + CustomCurveName + AddCaseName + AddAggregationType + AddProperty + AddSampleSpacing + +RimVirtualPerforationResults - class RimVirtualPerforationResults + ShowConnectionFactors + ShowClosedConnections + GeometryScaleFactor + LegendDefinition + +RimWellLogExtractionCurve - class RimWellLogExtractionCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + +RimWellLogExtractionCurveNameConfig - class RimWellLogExtractionCurveNameConfig + CustomCurveName + AddCaseName + AddProperty + AddWellName + AddTimeStep + AddDate + +RimWellLogFileCurveNameConfig - class RimWellLogFileCurveNameConfig + CustomCurveName + +RimWellLogPlotNameConfig - class RimWellLogPlotNameConfig + CustomCurveName + AddCaseName + AddWellName + AddTimeStep + AddAirGap + AddWaterDepth + +RimWellLogRftCurveNameConfig - class RimWellLogRftCurveNameConfig + CustomCurveName + +RimWellLogWbsCurve - class RimWellLogWbsCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + SmoothCurve + SmoothingThreshold + +RimWellPathEntry - class RimWellPathEntry + Name + Selected + WellPathType + surveyType + requestUrl + wellPathFilePath + +RimWellPathImport - class RimWellPathImport + WellTypeSurvey + WellTypePlans + UtmMode + UtmNorth + UtmSouth + UtmEast + UtmWest + Regions + +RimWellPathTieIn - class RimWellPathTieIn + ParentWellPath + ChildWellPath + TieInMeasuredDepth + AddValveAtConnection + Valve + +RiuCreateMultipleFractionsUi - class RiuCreateMultipleFractionsUi + SourceCase + MinDistanceFromWellTd + MaxFracturesPerWell + Options + FractureCreationSummary + +RiuMultipleFractionsOptions - class RicCreateMultipleFracturesOptionItemUi + TopKLayer + BaseKLayer + Template + MinSpacing + +ScriptLocation - class RimScriptCollection + ScriptDirectory + CalcScripts + SubDirectories + SearchSubFolders + +SimWellFracture - class RimSimWellFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + Branch + +SimWellFractureCollection - class RimSimWellFractureCollection + Fractures + +StimPlanModel - class RimStimPlanModel + Name + IsChecked + StimPlanModelTemplate + EditModelTemplate + EclipseCase + TimeStep + InitialPressureEclipseCase + StaticEclipseCase + MeasuredDepth + ExtractionDepthTop + ExtractionDepthBottom + ExtractionType + AnchorPosition + ThicknessDirection + ThicknessDirectionWellPath + BoundingBoxHorizontal + BoundingBoxVertical + UseDetailedFluidLoss + RelativePermeabilityFactor + PoroElasticConstant + ThermalExpansionCoefficient + PerforationLength + FractureOrientation + AzimuthAngle + FormationDip + AutoComputeBarrier + Barrier + DistanceToBarrier + BarrierDip + WellPenetrationLayer + ShowOnlyBarrierFault + ShowAllFaults + BarrierFaultName + BarrierAnnotation + BarrierTextAnnotation + +StimPlanModelCollection - class RimStimPlanModelCollection + Name + IsChecked + StimPlanModels + +StimPlanModelCurve - class RimStimPlanModelCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + StimPlanModel + CurveProperty + +StimPlanModelPlot - class RimStimPlanModelPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + StimPlanModel + EditModel + EclipseCase + TimeStep + +StimPlanModelPlotCollection - class RimStimPlanModelPlotCollection + StimPlanModelPlots + +StimPlanModelTemplate - class RimStimPlanModelTemplate + Name + Id + DynamicEclipseCase + TimeStep + InitialPressureEclipseCase + UseForInitialPressure + UseForPressure + EditPressureTable + StaticEclipseCase + DefaultPorosity + DefaultPermeability + VerticalStress + VerticalStressGradient + StressDepth + ReferenceTemperature + ReferenceTemperatureGradient + ReferenceTemperatureDepth + OverburdenHeight + OverburdenFormation + OverburdenFacies + OverburdenPorosity + OverburdenPermeability + OverburdenFluidDensity + UnderburdenHeight + UnderburdenFormation + UnderburdenFacies + UnderburdenPorosity + UnderburdenPermeability + UnderburdenFluidDensity + FaciesInitialPressureConfigs + PressureTable + ElasticProperties + FaciesProperties + NonNetLayers + +StimPlanModelTemplateCollection - class RimStimPlanModelTemplateCollection + StimPlanModelTemplates + NextValidId + +StreamlineInViewCollection - class RimStreamlineInViewCollection + LegendDefinition + Name + FlowThreshold + LengthThreshold + Resolution + MaxDays + UseProducers + UseInjectors + Phase + isActive + VisualizationMode + ColorMode + AnimationSpeed + AnimationIndex + ScaleFactor + TracerLength + +StringParameter - class RimStringParameter + Name + Label + Description + Advanced + Valid + Value + +SummaryAddress - class RimSummaryAddress + SummaryVarType + SummaryQuantityName + SummaryRegion + SummaryRegion2 + SummaryWellGroup + SummaryWell + SummaryWellSegment + SummaryLgr + SummaryCellI + SummaryCellJ + SummaryCellK + SummaryAquifer + IsErrorResult + CalculationId + +SummaryCaseCollection - class RimSummaryCaseMainCollection + SummaryCases + SummaryCaseCollections + +SummaryCaseSubCollection - class RimSummaryCaseCollection + SummaryCases + SummaryCollectionName + NameCount + IsEnsemble + Id + (A)EnsembleId + +SummaryCrossPlot - class RimSummaryCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + SummaryPlotFilterTextCurveSetEditor + +SummaryCrossPlotCollection - class RimSummaryCrossPlotCollection + SummaryCrossPlots + +SummaryCurve - class RimSummaryCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + SummaryCase + SummaryAddress + Resampling + SummaryCaseX + SummaryAddressX + IsEnsembleCurve + PlotAxis + SummaryCurveNameConfig + isTopZWithinCategory + VarListFilter + VarListFilterX + +SummaryCurveAutoName - class RimSummaryCurveAutoName + VectorName + Unit + RegionNumber + WellGroupName + WellName + WellSegmentNumber + LgrName + Completion + Aquifer + CaseName + +SummaryCurveFilter - class RimSummaryCurveFilter_OBSOLETE + VarListFilter + FilteredCurves + AutoApplyFilterChanges + IsActive + UseAutoAppearanceAssignment + CaseAppearanceType + VariableAppearanceType + WellAppearanceType + GroupAppearanceType + RegionAppearanceType + PlotAxis + ShowLegend + SummaryCurveNameConfig + +SummaryFilterSettings - class RimSummaryFilter_OBSOLETE + SummaryFilterType + SummaryCompleteVarStringFilter + SummaryVarQuantityFilter + SummaryRegionNumberFilter + SummaryRegionNumber2Filter + SummaryWellGroupNameFilter + SummaryWellNameFilter + SummaryWellSegmentNumberFilter + SummaryLgrNameFilter + SummaryCellIJKFilter + +SummaryObservedDataFile - class RimSummaryObservedDataFile + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +SummaryPageDownloadEntity - class SummaryPageDownloadEntity + Name + RequestUrl + ResponseFilename + +SummaryPlot - class RimSummaryPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + SummaryPlotFilterTextCurveSetEditor + +SummaryPlotCollection - class RimSummaryPlotCollection + SummaryPlots + +SummaryPlotFilterTextCurveSetEditor - class RimSummaryPlotFilterTextCurveSetEditor + CurveFilterText + SummaryCases + +SummaryTimeAxisProperties - class RimSummaryTimeAxisProperties + Active + ShowTitle + Title + AutoZoom + TimeMode + TimeUnit + VisibleDateRangeMax + VisibleDateRangeMin + VisibleTimeRangeMax + VisibleTimeRangeMin + VisibleTimeModeRangeMax + VisibleTimeModeRangeMin + TitlePosition + FontSize + ValuesFontSize + AutoDate + DateComponents + TimeComponents + DateFormat + TimeFormat + MajorTickmarkCount + Annotations + +SummaryYAxisProperties - class RimPlotAxisProperties + Active + Name + AutoTitle + DisplayLongName + DisplayShortName + DisplayUnitText + CustomTitle + VisibleRangeMax + VisibleRangeMin + NumberFormat + Decimals + ScaleFactor + AutoZoom + LogarithmicScale + AxisInverted + TitlePosition + TitleDeltaFontSize + ValueDeltaFontSize + Annotations + +Surface - class RimFileSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SurfaceFilePath + +SurfaceCollection - class RimSurfaceCollection + SurfaceUserDecription + SubCollections + SurfacesField + +SurfaceInView - class RimSurfaceInView + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + Name + SurfaceRef + ResultDefinition + +SurfaceInViewCollection - class RimSurfaceInViewCollection + Name + IsChecked + SurfacesInViewFieldCollections + SurfacesInViewField + SurfaceCollectionRef + +SurfaceResultDefinition - class RimSurfaceResultDefinition + Name + IsChecked + PropertyName + LegendConfig + SurfaceInView + +TofAccumulatedPhaseFractionsPlot - class RimTofAccumulatedPhaseFractionsPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + MaxTof + +TotalWellAllocationPlot - class RimTotalWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + +UserDefinedFilter - class RimUserDefinedFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + IndividualCellIndices + +UserDefinedPolylinesAnnotation - class RimUserDefinedPolylinesAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + Name + Targets + +ValveTemplate - class RimValveTemplate + Name + UnitSystem + CompletionType + UserLabel + OrificeDiameter + FlowCoefficient + AICDParameters + +ValveTemplateCollection - class RimValveTemplateCollection + ValveDefinitions + ValveUnits + +VfpPlot - class RimVfpPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + PlotTitle + FilePath + TableType + TableNumber + ReferenceDepth + FlowingPhase + FlowingWaterFraction + FlowingGasFraction + InterpolatedVariable + PrimaryVariable + FamilyVariable + LiquidFlowRateIdx + THPIdx + ArtificialLiftQuantityIdx + WaterCutIdx + GasLiquidRatioIdx + +View3dOverlayInfoConfig - class Rim3dOverlayInfoConfig + Active + ShowAnimProgress + ShowInfoText + ShowResultInfo + ShowHistogram + ShowVolumeWeightedMean + ShowVersionInfo + StatisticsTimeRange + StatisticsCellRange + +ViewController - class RimViewController + Active + Name + ManagedView + SyncCamera + ShowCursor + SyncTimeStep + SyncCellResult + SyncLegendDefinitions + SyncRangeFilters + SyncPropertyFilters + +ViewLinker - class RimViewLinker + Name + MainView + ManagedViews + +WbsParameters - class RimWbsParameters + PorePressureReservoirSource + PorePressureNonReservoirSource + UserPPNonReservoir + PoissionRatioSource + UcsSource + OBG0Source + DFSource + K0SHSource + FGShaleSource + K0FGSource + WaterDensitySource + UserPoissonRatio + UserUcs + UserDF + UserK0FG + UserK0SH + FGMultiplier + WaterDensity + GeoMechCase + WellPath + TimeStep + +Well - class RimSimWellInView + Name + (A)WellName + ShowWell + ShowWellLabel + ShowWellHead + ShowWellPipe + ShowWellSpheres + ShowWellDisks + WellHeadScaleFactor + WellPipeRadiusScale + WellPipeColor + WellDiskColor + ShowWellCells + ShowWellCellFence + FractureCollection + +WellAllocationPlot - class RimWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + BranchDetection + CurveCase + PlotTimeStep + WellName + FlowDiagSolution + FlowType + GroupSmallContributions + SmallContributionsThreshold + AccumulatedWellFlowPlot + TotalWellFlowPlot + WellAllocLegend + TofAccumulatedPhaseFractionsPlot + +WellAllocationPlotLegend - class RimWellAllocationPlotLegend + ShowPlotLegend + +WellBoreStabilityPlot - class RimWellBoreStabilityPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + WbsParameters + +WellDistributionPlot - class RimWellDistributionPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + Case + TimeStepIndex + WellName + Phase + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + +WellDistributionPlotCollection - class RimWellDistributionPlotCollection + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + Case + TimeStepIndex + WellName + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + Plots + ShowOil + ShowGas + ShowWater + PlotDescription + +WellFlowRateCurve - class RimWellFlowRateCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + +WellLogFile - class RimWellLogFile + WellName + Date + FileName + Name + WellLogFileChannels + WellFlowCondition + +WellLogFileChannel - class RimWellLogFileChannel + Name + +WellLogFileCurve - class RimWellLogFileCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + CurveWellPath + CurveWellLogChannel + WellLogFile + +WellLogPlot - class RimWellLogPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + +WellLogPlotCollection - class RimWellLogPlotCollection + WellLogPlots + +WellLogPlotTrack - class RimWellLogTrack + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + TrackDescription + Curves + VisibleXRangeMin + VisibleXRangeMax + AutoScaleX + LogarithmicScaleX + ShowXGridLines + ExplicitTickIntervals + MajorTickIntervals + MinorTickIntervals + AxisFontSize + AnnotationType + RegionDisplay + ColorShadingLegend + ColorShadingTransparency + ShowFormationLabels + FormationSource + FormationTrajectoryType + FormationWellPath + FormationWellPathForSourceWellPath + FormationSimulationWellName + FormationBranchIndex + FormationBranchDetection + FormationCase + FormationLevel + ShowFormationFluids + ShowWellPathAttributes + WellPathAttributesInLegend + ShowWellPathCompletions + WellPathCompletionsInLegend + ShowWellPathAttrBothSides + ShowWellPathAttrLabels + AttributesWellPathSource + AttributesCollection + OverburdenHeight + UnderburdenHeight + ResultDefinition + +WellLogRftCurve - class RimWellLogRftCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + CurveEclipseResultCase + CurveSummaryCase + CurveEnsemble + ObservedFmuRftData + TimeStep + WellName + BranchIndex + BranchDetection + WellLogChannelName + +WellMeasurement - class RimWellMeasurement + WellName + Depth + Date + Value + Kind + Quality + Remark + FilePath + +WellMeasurementCurve - class RimWellMeasurementCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + ShowLegend + SymbolLabel + SymbolSize + ShowErrorBars + SymbolLabelPosition + StackCurve + StackPhaseColors + CurveWellPath + CurveMeasurementKind + +WellMeasurementFilePath - class RimWellMeasurementFilePath + UserDecription + FilePath + +WellMeasurementInView - class RimWellMeasurementInView + Name + IsChecked + MeasurementKind + LegendDefinition + WellsSerialized + AvailableWellsSerialized + LowerBound + UpperBound + QualityFilter + RadiusScaleFactor + +WellMeasurements - class RimWellMeasurementCollection + Measurements + ImportedFiles + +WellMeasurementsInView - class RimWellMeasurementInViewCollection + Name + IsChecked + MeasurementKinds + +WellPath - class RimFileWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellPathFilepath + WellPathFilePathInCache + WellPathNumberInFile + UseAutoGeneratedPointAtSeaLevel + +WellPathAicdParameters - class RimWellPathAicdParameters + DeviceOpen + StrengthAICD + DensityCalibrationFluid + ViscosityCalibrationFluid + VolumeFlowRateExponent + ViscosityFunctionExponent + CriticalWaterLiquidFractionEmul + ViscosityTransitionRegionEmul + MaxRatioOfEmulsionVisc + MaxFlowRate + ExponentOilDensity + ExponentWaterDensity + ExponentGasDensity + ExponentOilViscosity + ExponentWaterViscosity + ExponentGasViscosity + +WellPathAttribute - class RimWellPathAttribute + CompletionType + DepthStart + DepthEnd + DiameterInInches + +WellPathAttributes - class RimWellPathAttributeCollection + Name + IsChecked + Attributes + +WellPathBase - class RimWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + +WellPathCompletionSettings - class RimWellPathCompletionSettings + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + MswParameters + +WellPathCompletions - class RimWellPathCompletions + Perforations + Fishbones + Fractures + StimPlanModels + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + +WellPathFracture - class RimWellPathFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + +WellPathFractureCollection - class RimWellPathFractureCollection + Name + IsChecked + Fractures + +WellPathGeometry - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + UseAutoGeneratedTargetAtSeaLevel + AutoGeneratedTarget + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGeometryDef - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + UseAutoGeneratedTargetAtSeaLevel + AutoGeneratedTarget + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGroup - class RimWellPathGroup + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + ChildWellPaths + GroupName + AddValveAtConnection + Valve + +WellPathTarget - class RimWellPathTarget + IsEnabled + IsLocked + TargetPoint + Dogleg1 + Dogleg2 + TargetType + Azimuth + Inclination + ParentWellPath + +WellPathValve - class RimWellPathValve + Name + IsChecked + ValveTemplate + StartMeasuredDepth + ValveLocations + EditTemplate + CreateTemplate + +WellPaths - class RimWellPathCollection + Active + ShowWellPathLabel + WellPathLabelColor + GlobalWellPathVisibility + WellPathRadiusScale + WellPathClip + WellPathClipZDistance + WellPaths + WellMeasurements + +WellPltPlot - class RimWellPltPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + WellLog + WellName + Sources + TimeSteps + UseStandardConditionCurves + UseReservoirConditionCurves + Phases + +WellPltPlotCollection - class RimPltPlotCollection + PltPlots + +WellRftEnsembleCurveSet - class RimWellRftEnsembleCurveSet + Ensemble + ColorMode + EnsembleParameter + LegendConfig + +WellRftPlot - class RimWellRftPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + Tracks + ShowStatisticsCurves + ShowEnsembleCurves + ShowErrorObserved + WellLog + WellName + BranchIndex + BranchDetection + EnsembleCurveSets + +WellRftPlotCollection - class RimRftPlotCollection + RftPlots + +Wells - class RimSimWellInViewCollection + Active + ShowWellsIntersectingVisibleCells + WellHeadScale + WellPipeRadiusScale + CellCenterSphereScale + WellLabelColor + ShowConnectionStatusColors + WellColorForApply + WellPipeColors + WellPipeVertexCount + WellPipeCoordType + DefaultWellFenceDirection + WellCellTransparency + IsAutoDetectingBranches + WellHeadPosition + Wells + WellDiskSummaryCase + WellDiskQuantity + WellDiskPropertyType + WellDiskPropertyConfigType + WellDiskShowQuantityLabels + WellDiskShowLabelsBackground + WellDiskScaleFactor + WellDiskColor + ShowWellCommunicationLines + +cafNamedTreeNode - class cafNamedTreeNode + ChildNodes + Name + IsChecked + +cafObjectReferenceTreeNode - class cafObjectReferenceTreeNode + ChildNodes + ReferencedObject + +cafTreeNode - class cafTreeNode + ChildNodes + +cloneView - class RicfCloneView + viewId + +closeProject - class RicfCloseProject + +computeCaseGroupStatistics - class RicfComputeCaseGroupStatistics + caseGroupId + caseIds + +createGridCaseGroup - class RicfCreateGridCaseGroup + casePaths + +createGridCaseGroupResult - class RicfCreateGridCaseGroupResult + groupId + groupName + +createLgrForCompletions - class RicfCreateLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +createMultiPlot - class RicNewMultiPlotFeature + plots + +createMultipleFractures - class RicfCreateMultipleFractures + caseId + wellPathNames + minDistFromWellTd + maxFracturesPerWell + templateId + topLayer + baseLayer + spacing + action + +createSaturationPressurePlots - class RicfCreateSaturationPressurePlots + caseIds + +createStatisticsCase - class RicfCreateStatisticsCase + caseGroupId + +createStatisticsCaseResult - class RicfCreateStatisticsCaseResult + caseId + +createView - class RicfCreateView + caseId + +createViewResult - class RicfCreateViewResult + viewId + +createWbsPlotResult - class RicfCreateWbsPlotResult + viewId + +createWellBoreStabilityPlot - class RicfCreateWellBoreStabilityPlotFeature + caseId + wellPath + timeStep + wbsParameters + +exportContourMapToText - class RicExportContourMapToTextFeature + exportFileName + exportLocalCoordinates + undefinedValueLabel + excludeUndefinedValues + viewId + +exportFlowCharacteristics - class RicfExportFlowCharacteristics + caseId + timeSteps + injectors + producers + fileName + minimumCommunication + aquiferCellThreshold + +exportLgrForCompletions - class RicfExportLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +exportMsw - class RicfExportMsw + caseId + wellPath + includePerforations + includeFishbones + includeFractures + fileSplit + +exportMultiCaseSnapshots - class RicfExportMultiCaseSnapshots + gridListFile + +exportProperty - class RicfExportProperty + caseId + timeStep + property + eclipseKeyword + undefinedValue + exportFile + +exportPropertyInViews - class RicfExportPropertyInViews + caseId + viewIds + viewNames + undefinedValue + +exportSimWellFractureCompletions - class RicfExportSimWellFractureCompletions + caseId + viewId + viewName + timeStep + simulationWellNames + fileSplit + compdatExport + +exportSnapshots - class RicfExportSnapshots + type + prefix + caseId + viewId + exportFolder + plotOutputFormat + +exportVisibleCells - class RicfExportVisibleCells + caseId + viewId + viewName + exportKeyword + visibleActiveCellsValue + hiddenActiveCellsValue + inactiveCellsValue + +exportWellLogPlotData - class RicfExportWellLogPlotData + exportFormat + viewId + exportFolder + filePrefix + exportTvdRkb + capitalizeFileNames + resampleInterval + convertCurveUnits + +exportWellLogPlotDataResult - class RicfExportWellLogPlotDataResult + exportedFiles + +exportWellPathCompletions - class RicfExportWellPathCompletions + caseId + timeStep + wellPathNames + fileSplit + compdatExport + combinationMode + includeMsw + useNtgHorizontally + includePerforations + includeFishbones + includeFractures + excludeMainBoreForFishbones + performTransScaling + transScalingTimeStep + transScalingWBHPFromSummary + transScalingWBHP + exportComments + exportWelspec + customFileName + +exportWellPaths - class RicfExportWellPaths + wellPathNames + mdStepSize + +importFormationNames - class RicfImportFormationNames + formationFiles + applyToCaseId + +importWellLogFiles - class RicfImportWellLogFiles + wellLogFolder + wellLogFiles + +importWellLogFilesResult - class RicfImportWellLogFilesResult + wellPathNames + +importWellPaths - class RicImportWellPaths + wellPathFolder + wellPathFiles + importGrouped + +importWellPathsResult - class RicImportWellPathsResult + wellPathNames + +loadCase - class RicfLoadCase + path + +loadCaseResult - class RicfLoadCaseResult + id + +openProject - class RicfOpenProject + path + +replaceCase - class RicfSingleCaseReplace + caseId + newGridFile + +replaceMultipleCases - class RicfMultiCaseReplace + +replaceSourceCases - class RicfReplaceSourceCases + caseGroupId + gridListFile + +runOctaveScript - class RicfRunOctaveScript + path + caseIds + +saveProject - class RicSaveProjectFeature + filePath + +saveProjectAs - class RicSaveProjectAsFeature + filePath + +scaleFractureTemplate - class RicfScaleFractureTemplate + id + halfLength + height + dFactor + conductivity + width + +setExportFolder - class RicfSetExportFolder + type + path + createFolder + +setFractureContainment - class RicfSetFractureContainment + id + topLayer + baseLayer + +setMainWindowSize - class RicfSetMainWindowSize + height + width + +setPlotWindowSize - class RicfSetPlotWindowSize + height + width + +setStartDir - class RicfSetStartDir + path + +setTimeStep - class RicfSetTimeStep + caseId + viewId + timeStep + +stackCurves - class RicStackSelectedCurvesFeature + curves + +unstackCurves - class RicUnstackSelectedCurvesFeature + curves + diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-objectKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-objectKeywords.txt new file mode 100644 index 0000000000..d938f3c83c --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2021.06/ri-objectKeywords.txt @@ -0,0 +1,393 @@ +// ResInsight version string : 2021.06.0 +// Report generated : man. jun 14 11:41:04 2021 +// +// + +AnalysisPlot +AnalysisPlotCollection +AnalysisPlotDataEntry +Annotations +AsciiDataCurve +CalcScript +CalculatedSummaryCase +CellEdgeResultSlot +CellPropertyFilter +CellPropertyFilters +CellRangeFilter +CellRangeFilterCollection +ChangeDataSourceFeatureUi +CmdFieldChangeExecData +ColorLegend +ColorLegendCollection +ColorLegendItem +CompletionTemplateCollection +CorrelationMatrixPlot +CorrelationPlot +CorrelationPlotCollection +CorrelationReportPlot +CrossSection +CrossSectionCollection +DataContainerFloat +DataContainerString +DataContainerTime +DepthTrackPlot +DoubleParameter +Eclipse2dViewCollection +EclipseCase +EclipseGeometrySelectionItem +ElasticProperties +ElasticPropertyScaling +ElasticPropertyScalingCollection +EnsembleFractureStatistics +EnsembleFractureStatisticsPlot +EnsembleFractureStatisticsPlotCollection +FaciesInitialPressureConfig +FaciesProperties +Fault +Faults +FileSummaryCase +FishbonesCollection +FishbonesMultipleSubs +FishbonesPipeProperties +FlowCharacteristicsPlot +FlowDiagSolution +FlowPlotCollection +FormationNames +FormationNamesCollectionObject +FractureContainment +FractureDefinitionCollection +FractureGroupStatisticsCollection +GeoMech2dViewCollection +GeoMechGeometrySelectionItem +GeoMechPropertyFilter +GeoMechPropertyFilters +GeoMechResultDefinition +GeoMechResultSlot +GeoMechView +GridCaseSurface +GridCollection +GridCrossPlotCurve +GridCrossPlotCurveSet +GridInfo +GridInfoCollection +GridStatisticsPlot +GridStatisticsPlotCollection +GridSummaryCase +GridTimeHistoryCurve +IntegerParameter +Intersection2dView +Intersection2dViewCollection +IntersectionBox +IntersectionResultDefinition +Legend +MainPlotCollection +MdiWindowController +MockModelSettings +ModeledWellPath +MultiPlot +MultiSnapshotDefinition +NonNetLayers +ObservedDataCollection +ObservedFmuRftData +ParameterGroup +ParameterResultCrossPlot +PdmDocument +PdmObjectCollection +PdmObjectGroup +Perforation +PerforationCollection +PlotDataFilterCollection +PlotDataFilterItem +PlotTemplateCollection +PlotTemplateFileItem +PolyLineFilter +PolygonFilter +PolylineTarget +PolylinesFromFileAnnotation +PressureTable +PressureTableItem +PropertyFilter +ResInsightAnalysisModels +ResInsightGeoMechCase +ResInsightGeoMechModels +ResInsightOilField +ResInsightProject +ResampleData +ReservoirCellResultStorage +ReservoirView +ResultDefinition +ResultSlot +ResultStorageEntryInfo +RftAddress +RiaMemoryCleanup +RiaPreferences +RiaPreferencesGeoMech +RiaPreferencesSummary +RiaRegressionTest +RicCaseAndFileExportSettingsUi +RicCellRangeUi +RicDeleteItemExecData +RicExportCarfinUi +RicExportCompletionDataSettingsUi +RicExportContourMapToTextUi +RicExportEclipseInputGridUi +RicExportLgrUi +RicExportToLasFileObj +RicExportToLasFileResampleUi +RicExportWellPathsUi +RicHoloLensCreateSessionUi +RicHoloLensExportToFolderUi +RicHoloLensServerSettings +RicLinkVisibleViewsFeatureUi +RicPasteAsciiDataToSummaryPlotFeatureUi +RicSaturationPressureUi +RicSaveEclipseInputVisibleCellsUi +RicSelectPlotTemplateUi +RicSelectSummaryPlotUI +RicSelectViewUI +RicSummaryAddressSelection +RicSummaryCurveCalculator +RicSummaryCurveCreator +RicWellPathsUnitSystemSettingsUi +RifReaderSettings +Rim3dWellLogCurveCollection +Rim3dWellLogExtractionCurve +Rim3dWellLogFileCurve +Rim3dWellLogRftCurve +RimAnnotationCollection +RimAnnotationCollectionBase +RimAnnotationGroupCollection +RimAnnotationLineAppearance +RimAnnotationTextAppearance +RimBinaryExportSettings +RimCaseCollection +RimCellFilterCollection +RimCommandExecuteScript +RimCommandIssueFieldChanged +RimCommandObject +RimContourMapView +RimCsvUserData +RimCustomObjectiveFunction +RimCustomObjectiveFunctionCollection +RimCustomObjectiveFunctionWeight +RimDerivedEnsembleCase +RimDerivedEnsembleCaseCollection +RimDialogData +RimEclipseContourMapProjection +RimElementVectorResult +RimEllipseFractureTemplate +RimEnsembleCurveFilter +RimEnsembleCurveFilterCollection +RimEnsembleCurveSet +RimEnsembleCurveSetCollection +RimEnsembleStatistics +RimEquilibriumAxisAnnotation +RimExportInputSettings +RimFaultRAPreprocSettings +RimFaultRASettings +RimFaultResultSlot +RimFractureExportSettings +RimGeoMechContourMapProjection +RimGeoMechContourMapView +RimGridCrossPlot +RimGridCrossPlotCollection +RimGridCrossPlotCurveSetNameConfig +RimGridCrossPlotNameConfig +RimIdenticalGridCaseGroup +RimInputProperty +RimInputPropertyCollection +RimInputReservoir +RimIntersectionResultsDefinitionCollection +RimMeasurement +RimMswCompletionParameters +RimMudWeightWindowParameters +RimMultiPlotCollection +RimMultipleValveLocations +RimNonDarcyPerforationParameters +RimObjectiveFunction +RimObservedEclipseUserData +RimOilFieldEntry +RimOilRegionEntry +RimPlotAxisAnnotation +RimPlotCellFilterCollection +RimPlotCellPropertyFilter +RimPolylineAppearance +RimPolylinesAnnotationInView +RimPolylinesFromFileAnnotationInView +RimProcess +RimReachCircleAnnotation +RimReachCircleAnnotationInView +RimSaturationPressurePlot +RimSaturationPressurePlotCollection +RimStatisticalCalculation +RimStatisticalCollection +RimStimPlanColors +RimStimPlanFractureTemplate +RimStimPlanLegendConfig +RimSummaryCalculation +RimSummaryCalculationCollection +RimSummaryCalculationVariable +RimSummaryCurveCollection +RimSummaryCurveCollectionModifier +RimTensorResults +RimTernaryLegendConfig +RimTextAnnotation +RimTextAnnotationInView +RimTimeAxisAnnotation +RimTimeStepFilter +RimUserDefinedPolylinesAnnotationInView +RimVfpPlotCollection +RimViewLinkerCollection +RimViewNameConfig +RimVirtualPerforationResults +RimWellLogExtractionCurve +RimWellLogExtractionCurveNameConfig +RimWellLogFileCurveNameConfig +RimWellLogPlotNameConfig +RimWellLogRftCurveNameConfig +RimWellLogWbsCurve +RimWellPathEntry +RimWellPathImport +RimWellPathTieIn +RiuCreateMultipleFractionsUi +RiuMultipleFractionsOptions +ScriptLocation +SimWellFracture +SimWellFractureCollection +StimPlanModel +StimPlanModelCollection +StimPlanModelCurve +StimPlanModelPlot +StimPlanModelPlotCollection +StimPlanModelTemplate +StimPlanModelTemplateCollection +StreamlineInViewCollection +StringParameter +SummaryAddress +SummaryCaseCollection +SummaryCaseSubCollection +SummaryCrossPlot +SummaryCrossPlotCollection +SummaryCurve +SummaryCurveAutoName +SummaryCurveFilter +SummaryFilterSettings +SummaryObservedDataFile +SummaryPageDownloadEntity +SummaryPlot +SummaryPlotCollection +SummaryPlotFilterTextCurveSetEditor +SummaryTimeAxisProperties +SummaryYAxisProperties +Surface +SurfaceCollection +SurfaceInView +SurfaceInViewCollection +SurfaceResultDefinition +TofAccumulatedPhaseFractionsPlot +TotalWellAllocationPlot +UserDefinedFilter +UserDefinedPolylinesAnnotation +ValveTemplate +ValveTemplateCollection +VfpPlot +View3dOverlayInfoConfig +ViewController +ViewLinker +WbsParameters +Well +WellAllocationPlot +WellAllocationPlotLegend +WellBoreStabilityPlot +WellDistributionPlot +WellDistributionPlotCollection +WellFlowRateCurve +WellLogFile +WellLogFileChannel +WellLogFileCurve +WellLogPlot +WellLogPlotCollection +WellLogPlotTrack +WellLogRftCurve +WellMeasurement +WellMeasurementCurve +WellMeasurementFilePath +WellMeasurementInView +WellMeasurements +WellMeasurementsInView +WellPath +WellPathAicdParameters +WellPathAttribute +WellPathAttributes +WellPathBase +WellPathCompletionSettings +WellPathCompletions +WellPathFracture +WellPathFractureCollection +WellPathGeometry +WellPathGeometryDef +WellPathGroup +WellPathTarget +WellPathValve +WellPaths +WellPltPlot +WellPltPlotCollection +WellRftEnsembleCurveSet +WellRftPlot +WellRftPlotCollection +Wells +cafNamedTreeNode +cafObjectReferenceTreeNode +cafTreeNode +cloneView +closeProject +computeCaseGroupStatistics +createGridCaseGroup +createGridCaseGroupResult +createLgrForCompletions +createMultiPlot +createMultipleFractures +createSaturationPressurePlots +createStatisticsCase +createStatisticsCaseResult +createView +createViewResult +createWbsPlotResult +createWellBoreStabilityPlot +exportContourMapToText +exportFlowCharacteristics +exportLgrForCompletions +exportMsw +exportMultiCaseSnapshots +exportProperty +exportPropertyInViews +exportSimWellFractureCompletions +exportSnapshots +exportVisibleCells +exportWellLogPlotData +exportWellLogPlotDataResult +exportWellPathCompletions +exportWellPaths +importFormationNames +importWellLogFiles +importWellLogFilesResult +importWellPaths +importWellPathsResult +loadCase +loadCaseResult +openProject +replaceCase +replaceMultipleCases +replaceSourceCases +runOctaveScript +saveProject +saveProjectAs +scaleFractureTemplate +setExportFolder +setFractureContainment +setMainWindowSize +setPlotWindowSize +setStartDir +setTimeStep +stackCurves +unstackCurves diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-fieldKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-fieldKeywords.txt new file mode 100644 index 0000000000..61d4126609 --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-fieldKeywords.txt @@ -0,0 +1,4432 @@ +// ResInsight version string : 2021.10.0-RC_01 +// Report generated : Mon Nov 1 15:35:12 2021 +// +// + +AnalysisPlot - class RimAnalysisPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeSteps + ReferenceCase + IsUsingAutoName + PlotDescription + BarOrientation + MajorGroupType + MediumGroupType + MinorGroupType + ValueSortOperation + groupForColors + UseTopBarsFilter + MaxBarCount + UseBarText + UseCaseInBarText + UseEnsembleInBarText + UseSummaryItemInBarText + UseTimeStepInBarText + UseQuantityInBarText + BarTextFontSize + ValueAxisProperties + PlotDataFilterCollection + +AnalysisPlotCollection - class RimAnalysisPlotCollection + AnalysisPlots + +AnalysisPlotDataEntry - class RimAnalysisPlotDataEntry + SummaryCase + Ensemble + SummaryAddress + IsEnsembleCurve + +Annotations - class RimAnnotationInViewCollection + IsActive + TextAnnotations + AnnotationPlaneDepth + SnapAnnotations + TextAnnotationsInView + ReachCircleAnnotationsInView + UserDefinedPolylinesAnnotationsInView + PolylinesFromFileAnnotationsInView + AnnotationFontSize + +AsciiDataCurve - class RimAsciiDataCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + PlotAxis + TimeSteps + Values + Title + +CalcScript - class RimCalcScript + AbsolutePath + +CalculatedSummaryCase - class RimCalculatedSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + +CellEdgeResultSlot - class RimCellEdgeColors + EnableCellEdgeColors + propertyType + CellEdgeVariable + UseXVariable + UseYVariable + UseZVariable + LegendDefinition + SingleVarEdgeResult + +CellFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +CellPropertyFilter - class RimEclipsePropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + CategorySelection + +CellPropertyFilters - class RimEclipsePropertyFilterCollection + Active + PropertyFilters + +CellRangeFilter - class RimCellRangeFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + StartIndexI + CellCountI + StartIndexJ + CellCountJ + StartIndexK + CellCountK + +CellRangeFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +ChangeDataSourceFeatureUi - class RimWellLogCurveCommonDataSource + CurveCase + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveTimeStep + WBSSmoothing + WBSSmoothingThreshold + +CmdFieldChangeExecData - class caf::CmdFieldChangeExecData + PathToField + +ColorLegend - class RimColorLegend + ColorLegendName + ColorLegendItems + +ColorLegendCollection - class RimColorLegendCollection + CustomColorLegends + +ColorLegendItem - class RimColorLegendItem + Color + CategoryValue + CategoryName + +CompletionTemplateCollection - class RimCompletionTemplateCollection + FractureTemplates + StimPlanModelTemplates + ValveTemplates + FractureGroupStatisticsCollection + +CorrelationMatrixPlot - class RimCorrelationMatrixPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationSorting + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + LegendConfig + SelectedParameters + +CorrelationPlot - class RimCorrelationPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + CorrelationAbsValues + CorrelationAbsSorting + ExcludeParamsWithoutVariation + ShowOnlyTopNCorrelations + TopNFilterCount + SelectedParameters + +CorrelationPlotCollection - class RimCorrelationPlotCollection + CorrelationPlots + CorrelationReports + +CorrelationReportPlot - class RimCorrelationReportPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotWindowTitle + MatrixPlot + CorrelationPlot + CrossPlot + SubTitleFontSize + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + +CrossSection - class RimExtrudedCurveIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + Type + Direction + WellPath + SimulationWell + Points + PointsUi + AzimuthAngle + DipAngle + CustomExtrusionPoints + TwoAzimuthPoints + Branch + ExtentLength + lengthUp + lengthDown + SurfaceIntersections + +CrossSectionCollection - class RimIntersectionCollection + CrossSections + IntersectionBoxes + Active + +DataContainerFloat - class RimcDataContainerDouble + values + +DataContainerString - class RimcDataContainerString + values + +DataContainerTime - class RimcDataContainerTime + values + +DepthTrackPlot - class RimDepthTrackPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + +DoubleParameter - class RimDoubleParameter + Name + Label + Description + Advanced + Valid + Value + +Eclipse2dViewCollection - class RimEclipseContourMapViewCollection + EclipseViews + +EclipseCase - class RimEclipseResultCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + UnitSystem + FlowDiagSolutions + SourSimFileName + +EclipseGeometrySelectionItem - class RimEclipseGeometrySelectionItem + EclipseCase + GridIndex + CellIndex + LocalIntersectionPoint + +ElasticProperties - class RimElasticProperties + FilePath + ShowScaledProperties + PropertyScalingCollection + +ElasticPropertyScaling - class RimElasticPropertyScaling + Name + IsChecked + Formation + Facies + Property + Scale + +ElasticPropertyScalingCollection - class RimElasticPropertyScalingCollection + ElasticPropertyScalings + +EnsembleFractureStatistics - class RimEnsembleFractureStatistics + Name + FilePaths + ExcludeZeroWidthFractures + MeshAlignmentType + MeshType + NumberOfSamplesX + NumberOfSamplesY + AdaptiveMeanType + AdaptiveNumLayersType + AdaptiveNumLayers + SelectedStatisticsType + ComputeStatistics + +EnsembleFractureStatisticsPlot - class RimEnsembleFractureStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + GraphType + EnsembleFractureStatistics + Property + +EnsembleFractureStatisticsPlotCollection - class RimEnsembleFractureStatisticsPlotCollection + EnsembleFractureStatisticsPlots + +EnsembleStatisticsSurface - class RimEnsembleStatisticsSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + StatisticsType + +EnsembleSurface - class RimEnsembleSurface + SurfaceUserDecription + SubCollections + SurfacesField + FilterEnsembleCurveSet + +EnsembleWellLogStatisticsCurve - class RimEnsembleWellLogStatisticsCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + EnsembleWellLogCurveSet + StatisticsType + +EnsembleWellLogs - class RimEnsembleWellLogs + Name + WellLogFiles + +EnsembleWellLogsCollection - class RimEnsembleWellLogsCollection + EnsembleWellLogsCollection + +FaciesInitialPressureConfig - class RimFaciesInitialPressureConfig + IsChecked + FaciesName + FaciesValue + Fraction + +FaciesProperties - class RimFaciesProperties + FilePath + FaciesDefinition + ColorLegend + +Fault - class RimFaultInView + FaultName + ShowFault + Color + +Faults - class RimFaultInViewCollection + Active + ShowFaultFaces + ShowOppositeFaultFaces + ShowFaultsOutsideFilters + FaultFaceCulling + ShowFaultLabel + FaultLabelColor + ShowNNCs + HideNncsWhenNoResultIsAvailable + Faults + EnableFaultRA + FaultRASettings + +FileSummaryCase - class RimFileSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + IncludeRestartFiles + +FileSurface - class RimFileSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SurfaceFilePath + +FishbonesCollection - class RimFishbonesCollection + Name + IsChecked + FishbonesSubs + StartMD + MainBoreDiameter + MainBoreSkinFactor + +FishbonesMultipleSubs - class RimFishbones + Active + Name + Color + LateralCountPerSub + LateralLength + LateralExitAngle + LateralBuildAngle + LateralTubingDiameter + LateralOpenHoleRoghnessFactor + LateralTubingRoghnessFactor + LateralInstallSuccessFraction + IcdCount + IcdOrificeDiameter + IcdFlowCoefficient + SubsLocationMode + RangeStart + RangeEnd + RangeSubSpacing + RangeSubCount + LocationOfSubs + ValveLocations + SubsOrientationMode + InstallationRotationAngles + FixedInstallationRotationAngle + PipeProperties + +FishbonesPipeProperties - class RimFishbonesPipeProperties + LateralHoleDiameter + SkinFactor + +FlowCharacteristicsPlot - class RimFlowCharacteristicsPlot + WindowController + ShowWindow + WindowGeometry + FlowCase + FlowDiagSolution + TimeSelectionType + SelectedTimeSteps + SelectedTimeStepsUi + CellPVThreshold + ShowLegend + CellFilter + CellFilterView + TracerFilter + SelectedTracerNames + MinCommunication + MaxTof + +FlowDiagSolution - class RimFlowDiagSolution + UserDescription + +FlowPlotCollection - class RimFlowPlotCollection + FlowCharacteristicsPlot + DefaultWellAllocationPlot + WellDistributionPlotCollection + StoredWellAllocationPlots + StoredFlowCharacteristicsPlots + +FormationNames - class RimFormationNames + FormationNamesFileName + +FormationNamesCollectionObject - class RimFormationNamesCollection + FormationNamesList + +FractureContainment - class RimFractureContainment + IsUsingFractureContainment + TopKLayer + BaseKLayer + TruncateAtFaults + FaultThrowValue + +FractureDefinitionCollection - class RimFractureTemplateCollection + DefaultUnitForTemplates + FractureDefinitions + NextValidFractureTemplateId + +FractureGroupStatisticsCollection - class RimEnsembleFractureStatisticsCollection + FractureGroupStatistics + +FractureTemplateCollection - class RimFractureTemplateCollection + DefaultUnitForTemplates + FractureDefinitions + NextValidFractureTemplateId + +GeoMech2dViewCollection - class RimGeoMechContourMapViewCollection + GeoMechViews + +GeoMechGeometrySelectionItem - class RimGeoMechGeometrySelectionItem + GeoMechCase + m_gridIndex + m_cellIndex + m_elementFace + m_hasIntersectionTriangle + m_intersectionTriangle_0 + m_intersectionTriangle_1 + m_intersectionTriangle_2 + m_localIntersectionPoint + +GeoMechPart - class RimGeoMechPart + Name + IsChecked + PartId + +GeoMechPartCollection - class RimGeoMechPartCollection + Parts + +GeoMechPropertyFilter - class RimGeoMechPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + ResultDefinition + LowerBound + UpperBound + +GeoMechPropertyFilters - class RimGeoMechPropertyFilterCollection + Active + PropertyFilters + +GeoMechResultDefinition - class RimGeoMechResultDefinition + IsChecked + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + +GeoMechResultSlot - class RimGeoMechCellColors + IsChecked + ResultPositionType + ResultFieldName + ResultComponentName + TimeLapseBaseTimeStep + ReferenceTimeStep + CompactionRefLayer + NormalizeByHSP + NormalizationAirGap + LegendDefinition + +GeoMechView - class RimGeoMechView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + Parts + ShowDisplacement + DisplacementScaling + +GridCaseSurface - class RimGridCaseSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SourceCase + SliceIndex + Watertight + +GridCollection - class RimGridCollection + IsActive + MainGrid + PersistentLgrs + +GridCrossPlotCurve - class RimGridCrossPlotCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + +GridCrossPlotCurveSet - class RimGridCrossPlotDataSet + Name + IsChecked + Case + TimeStep + VisibleCellView + Grouping + XAxisProperty + YAxisProperty + GroupingProperty + NameConfig + CrossPlotCurves + UseCustomColor + CustomColor + PlotCellFilterCollection + +GridInfo - class RimGridInfo + IsActive + GridName + GridIndex + +GridInfoCollection - class RimGridInfoCollection + IsActive + GridInfos + +GridStatisticsPlot - class RimGridStatisticsPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + NumHistogramBins + HistogramBarColor + HistogramGapWidth + HistogramFrequencyType + Precision + TickNumberFormat + GraphType + Case + TimeStep + VisibleCellView + Property + +GridStatisticsPlotCollection - class RimGridStatisticsPlotCollection + GridStatisticsPlots + +GridSummaryCase - class RimGridSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + Associated3DCase + CachedCasename + Associated3DCaseGridFileName + IncludeRestartFiles + +GridTimeHistoryCurve - class RimGridTimeHistoryCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + GeometrySelectionText + EclipseResultDefinition + GeoMechResultDefinition + GeometrySelectionItem + PlotAxis + +IntegerParameter - class RimIntegerParameter + Name + Label + Description + Advanced + Valid + Value + +Intersection2dView - class Rim2dIntersectionView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + Intersection + ShowDefiningPoints + ShowAxisLines + +Intersection2dViewCollection - class Rim2dIntersectionViewCollection + IntersectionViews + +IntersectionBox - class RimBoxIntersection + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + UserDescription + singlePlaneState + MinXCoord + MaxXCoord + MinYCoord + MaxYCoord + MinDepth + MaxDepth + xySliderStepSize + DepthSliderStepSize + +IntersectionResultDefinition - class RimIntersectionResultDefinition + IsActive + Case + TimeStep + IntersectionResultDefinitionDescription + EclipseResultDef + GeoMechResultDef + LegendConfig + TernaryLegendConfig + +Legend - class RimRegularLegendConfig + ShowLegend + NumberOfLevels + Precision + TickNumberFormat + ColorRangeMode + ColorLegend + MappingMode + RangeType + UserDefinedMax + UserDefinedMin + CategoryColorMode + ResultVariableUsage + ResetDefaultValues + +ListParameter - class RimListParameter + Name + Label + Description + Advanced + Valid + Value + +MainPlotCollection - class RimMainPlotCollection + Show + WellLogPlotCollection + RftPlotCollection + PltPlotCollection + SummaryPlotCollection + AnalysisPlotCollection + CorrelationPlotCollection + SummaryCrossPlotCollection + FlowPlotCollection + Rim3dCrossPlotCollection + RimSaturationPressurePlotCollection + RimMultiPlotCollection + StimPlanModelPlotCollection + VfpPlotCollection + GridStatisticsPlotCollection + EnsembleFractureStatisticsPlotCollection + +MdiWindowController - class RimMdiWindowController + MainWindowID + xPos + yPos + Width + Height + IsMaximized + +MockModelSettings - class RimMockModelSettings + CellCountX + CellCountY + CellCountZ + TotalCellCount + ResultCount + TimeStepCount + +ModeledWellPath - class RimModeledWellPath + Name + (A)WellPathName + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + WellPathGeometryDef + +MultiPlot - class RimMultiPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + ShowTitleInPlot + PlotDescription + Plots + NumberOfColumns + RowsPerPage + ShowPlotTitles + MajorTickmarkCount + SubTitleFontSize + PagePreviewMode + +MultiSnapshotDefinition - class RimAdvancedSnapshotExportDefinition + IsActive + View + EclipseResultType + SelectedEclipseResults + TimeStepStart + TimeStepEnd + SnapShotDirection + RangeFilterStart + RangeFilterEnd + AdditionalCases + +NonNetLayers - class RimNonNetLayers + IsChecked + Cutoff + Facies + FaciesDefinition + +ObservedDataCollection - class RimObservedDataCollection + ObservedDataArray + ObservedFmuRftDataArray + +ObservedFmuRftData - class RimObservedFmuRftData + Name + Directory + +ParameterGroup - class RimParameterGroup + Parameters + Name + Label + Comment + Expanded + +ParameterResultCrossPlot - class RimParameterResultCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + AnalysisPlotData + TimeStepFilter + TimeStep + AutoTitle + PlotTitle + LabelFontSize + AxisTitleFontSize + AxisValueFontSize + UseCaseFilter + CurveSetForFiltering + EditCaseFilter + EnsembleParameter + +PdmDocument - class caf::PdmDocument + DocumentFileName + +PdmObjectCollection - class caf::PdmObjectCollection + PdmObjects + +PdmObjectGroup - class caf::PdmObjectGroup + +Perforation - class RimPerforationInterval + Name + IsChecked + StartMeasuredDepth + EndMeasuredDepth + Diameter + SkinFactor + StartOfHistory + UseCustomStartDate + StartDate + UseCustomEndDate + EndDate + Valves + +PerforationCollection - class RimPerforationCollection + Name + IsChecked + Perforations + NonDarcyParameters + +PlotDataFilterCollection - class RimPlotDataFilterCollection + IsActive + PlotDataFiltersField + +PlotDataFilterItem - class RimPlotDataFilterItem + IsActive + FilterTarget + FilterAddressField + QuantityText + FilterOperation + MinTopN + Max + Min + EnsembleParameterValueCategories + ConsideredTimestepsType + ExplicitlySelectedTimeSteps + +PlotTemplateCollection - class RimPlotTemplateFolderItem + FolderName + FileNames + SubFolders + +PlotTemplateFileItem - class RimPlotTemplateFileItem + AbsolutePath + +PolyLineFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolygonFilter - class RimPolygonFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + PolygonFilterType + PolyIncludeType + Targets + Case + ShowLines + ShowSpheres + LineThickness + SphereRadiusFactor + LineColor + SphereColor + EnableFiltering + EnableKFilter + KRangeFilter + PolygonPlaneDepth + LockPolygon + +PolylineTarget - class RimPolylineTarget + IsEnabled + TargetPointXyd + +PolylinesFromFileAnnotation - class RimPolylinesFromFileAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + PolyLineFilePath + PolyLineDescription + +PressureTable - class RimPressureTable + Items + PressureDate + +PressureTableItem - class RimPressureTableItem + Depth + InitialPressure + Pressure + +PropertyFilter - class RimPropertyFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + SelectedValues + +ResInsightAnalysisModels - class RimEclipseCaseCollection + Reservoirs + CaseGroups + +ResInsightGeoMechCase - class RimGeoMechCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + GeoMechViews + CaseCohesion + FrctionAngleDeg + ElementPropertyFileNames + BiotCoefficientType + BiotFixedCoefficient + BiotResultAddress + InitialPermeabilityType + InitialPermeabilityFixed + InitialPermeabilityAddress + PermeabilityExponent + WaterDensityShearSlipIndicator + ContourMaps + MudWeightWindowParameters + +ResInsightGeoMechModels - class RimGeoMechModels + Cases + +ResInsightOilField - class RimOilField + AnalysisModels + GeoMechModels + WellPathCollection + CompletionTemplateCollection + SummaryCaseCollection + FormationNamesCollection + ObservedDataCollection + AnnotationCollection + EnsembleWellLogsCollection + FractureDefinitionCollection + SurfaceCollection + +ResInsightProject - class RimProject + DocumentFileName + ProjectFileVersionString + ReferencedExternalFiles + OilFields + ColorLegendCollection + WellPathImport + MainPlotCollection + LinkedViews + CalculationCollection + CommandObjects + MultiSnapshotDefinitions + TreeViewState + TreeViewCurrentModelIndexPath + PlotWindowTreeViewState + PlotWindowTreeViewCurrentModelIndexPath + show3DWindow + showPlotWindow + tiled3DWindow + tiledPlotWindow + DialogData + Reservoirs + CaseGroups + +ResampleData - class RimcSummaryResampleData + TimeSteps + Values + +ReservoirCellResultStorage - class RimReservoirCellResultsStorage + ResultCacheFileName + ResultCacheEntries + +ReservoirView - class RimEclipseView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + +ResultDefinition - class RimEclipseResultDefinition + IsChecked + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + +ResultSlot - class RimEclipseCellColors + IsChecked + ResultType + PorosityModelType + ResultVariable + FlowDiagSolution + TimeLapseBaseTimeStep + DifferenceCase + DivideByCellFaceArea + SelectedInjectorTracers + SelectedProducerTracers + SelectedSouringTracers + FlowTracerSelectionMode + PhaseSelection + ShowOnlyVisibleCategoriesInLegend + MSyncSelectedInjProd + MSyncSelectedProdInj + LegendDefinition + ResultVarLegendDefinitionList + TernaryLegendDefinition + LegendDefinitionPtrField + +ResultStorageEntryInfo - class RimReservoirCellResultsStorageEntryInfo + ResultType + ResultName + TimeSteps + DaysSinceSimulationStart + FilePositionDataStart + +RftAddress - class RimDataSourceForRftPlt + SourceType + EclipseCase + WellLogFile + Ensemble + ObservedFmuRftData + +RiaMemoryCleanup - class RiaMemoryCleanup + DataCase + ResultsToDelete + +RiaPreferences - class RiaPreferences + navigationPolicy + enableGrpcServer + defaultGrpcPort + scriptDirectory + scriptEditorExecutable + octaveExecutable + octaveShowHeaderInfoWhenExecutingScripts + pythonExecutable + pythonDebugInfo + ssihubAddress + defaultMeshModeType + defaultGridLineColors + defaultFaultGridLineColors + defaultWellLableColor + defaultViewerBackgroundColor + defaultScaleFactorZ + defaultSceneFontSizePt + defaultAnnotationFontSizePt + defaultWellLabelFontSizePt + defaultPlotFontSizePt + showLegendBackground + enableFaultsByDefault + showInfoBox + showGridBox + lastUsedProjectFileName + autocomputeDepth + loadAndShowSoil + holoLensDisableCertificateVerification + csvTextExportFieldSeparator + readerSettings + dateFormat + timeFormat + useUndoRedo + plotTemplateFolders + SearchPlotTemplateFoldersRecursively + defaultPlotTemplate + pageSize + pageOrientation + pageLeftMargin + pageTopMargin + pageRightMargin + pageBottomMargin + openExportedPdfInViewer + SurfaceImportResamplingDistance + MultiLateralWellPattern + guiTheme + summaryPreferences + geoMechPreferences + systemPreferences + +RiaPreferencesGeoMech - class RiaPreferencesGeoMech + geomechFRAPreprocCommand + geomechFRAPostprocCommand + geomechFRAMacrisCommand + geomechFRADefaultXML + geomechFRADefaultAdvXML + geomechWIADefaultXML + geomechWIACommand + keepTemporaryFile + +RiaPreferencesSummary - class RiaPreferencesSummary + summaryRestartFilesShowImportDialog + summaryImportMode + gridImportMode + summaryEnsembleImportMode + defaultSummaryHistoryCurveStyle + defaultSummaryCurvesTextFilter + createEnhancedSummaryDataFile + useEnhancedSummaryDataFile + createH5SummaryDataFile + checkH5FileTimeStamp + createH5SummaryFileThreadCount + summaryReaderType + showSummaryTimeAsLongString + useMultipleThreadsWhenLoadingSummaryCases + +RiaPreferencesSystem - class RiaPreferencesSystem + useShaders + showHud + appendClassNameToUiText + appendFieldKeywordToToolTipText + showViewIdInTree + showTestToolbar + includeFractureDebugInfoFile + holoLensExportFolder + showProjectChangedDialog + showProgressBar + gtestFilter + eclipseReaderMode + +RiaRegressionTest - class RiaRegressionTest + workingFolder + folderContainingDiffTool + folderContainingGitTool + regressionTestFolder + showInteractiveDiffImages + useOpenMPForGeometryCreation + openReportInBrowser + testFilter + appendTestsAfterTestFilter + invalidateExternalFilePaths + +RicCaseAndFileExportSettingsUi - class RicCaseAndFileExportSettingsUi + Folder + CaseToApply + +RicCellRangeUi - class RicCellRangeUi + Case + GridIndex + StartIndexI + StartIndexJ + StartIndexK + CellCountI + CellCountJ + CellCountK + +RicCreateEnsembleSurfaceUi - class RicCreateEnsembleSurfaceUi + Layers + AutoCreateEnsembleSurfaces + MinLayer + MaxLayer + +RicCreateEnsembleWellLogUi - class RicCreateEnsembleWellLogUi + AutoCreateEnsembleWellLogs + TimeStep + WellPathSource + WellPath + WellFilePath + SelectedProperties + +RicCreateMultipleWellPathLateralsUi - class RicCreateMultipleWellPathLateralsUi + SourceLaterals + TopLevelWellPath + Locations + +RicDeleteItemExecData - class RicDeleteItemExecData + PathToField + Description + indexToObject + deletedObjectAsXml + +RicExportCarfinUi - class RicExportCarfinUi + CellRange + ExportFileName + CaseToApply + CellCountI + CellCountJ + CellCountK + MaxWellCount + +RicExportCompletionDataSettingsUi - class RicExportCompletionDataSettingsUi + Folder + CaseToApply + FileSplit + compdatExport + TimeStepIndex + IncludeMSW + UseLateralNTG + IncludePerforations + IncludeFishbones + IncludeFractures + TransScalingType + TransScalingTimeStep + TransScalingWBHPSource + TransScalingWBHP + ExcludeMainBoreForFishbones + ReportCompletionTypesSeparately + ExportDataSourceAsComment + ExportWelspec + CompletionWelspecAfterMainBore + UseCustomFileName + CustomFileName + +RicExportContourMapToTextUi - class RicExportContourMapToTextUi + ExportFileName + ExportLocalCoordinates + UndefinedValueLabel + ExcludeUndefinedValues + +RicExportEclipseInputGridUi - class RicExportEclipseSectorModelUi + ExportGrid + ExportGridFilename + ExportInLocalCoords + InvisibleCellActnum + GridBoxSelection + MinI + MinJ + MinK + MaxI + MaxJ + MaxK + ExportFaults + ExportFaultsFilename + RefinementCountI + RefinementCountJ + RefinementCountK + ExportParams + ExportParamsFilename + ExportMainKeywords + +RicExportLgrUi - class RicExportLgrUi + ExportFolder + CaseToApply + TimeStepIndex + IncludePerforations + IncludeFractures + IncludeFishbones + CellCountI + CellCountJ + CellCountK + SplitType + +RicExportToLasFileObj - class RicExportToLasFileObj + tvdrkbOffset + +RicExportToLasFileResampleUi - class RicExportToLasFileResampleUi + ExportFolder + FilePrefix + CapitalizeFileName + CurveUnitConversion + ActivateResample + ResampleInterval + ExportTvdrkb + tvdrkbOffsets + +RicExportWellPathsUi - class RicExportWellPathsUi + ExportFolder + MdStepSize + +RicHoloLensCreateSessionUi - class RicHoloLensCreateSessionUi + SessionName + SessionPinCode + ServerSettings + +RicHoloLensExportToFolderUi - class RicHoloLensExportToFolderUi + ViewForExport + ExportFolder + +RicHoloLensServerSettings - class RicHoloLensServerSettings + ServerAddress + +RicLinkVisibleViewsFeatureUi - class RicLinkVisibleViewsFeatureUi + MasterView + +RicPasteAsciiDataToSummaryPlotFeatureUi - class RicPasteAsciiDataToSummaryPlotFeatureUi + PlotTitle + CurvePrefix + DecimalSeparator + DateFormat + TimeFormat + UseCustomDateFormat + CustomDateTimeFormat + LineStyle + Symbol + SymbolSkipDinstance + CellSeparator + TimeColumnName + PreviewText + +RicSaturationPressureUi - class RicSaturationPressureUi + CaseToApply + TimeStep + +RicSaveEclipseInputVisibleCellsUi - class RicSaveEclipseInputVisibleCellsUi + ExportFilename + ExportKeyword + VisibleActiveCellsValue + HiddenActiveCellsValue + InactiveCellsValue + +RicSelectPlotTemplateUi - class RicSelectPlotTemplateUi + SelectedPlotTemplates + +RicSelectSummaryPlotUI - class RicSelectSummaryPlotUI + SelectedSummaryPlot + CreateNewPlot + NewViewName + +RicSelectViewUI - class RicSelectViewUI + MasterView + CreateNewView + NewViewName + +RicSummaryAddressSelection - class RiuSummaryVectorSelectionUi + SummaryCases + CurrentSummaryCategory + SelectedSummaryCategories + FieldVectors + Aquifers + AquiferVectors + NetworkVectors + MiscVectors + Regions + RegionsVectors + Region2RegionRegions + Region2RegionVectors + WellGroupWellGroupNames + WellGroupVectors + WellWellName + WellVectors + WellCompletionWellName + WellCompletionIjk + WellCompletionVectors + WellCompletionLgrLgrName + WellCompletionLgrWellName + WellCompletionLgrIjk + WellCompletionLgrVectors + WellLgrLgrName + WellLgrWellName + WellLgrVectors + WellSegmentWellName + WellSegmentNumber + WellSegmentVectors + BlockIjk + BlockVectors + BlockLgrLgrName + BlockLgrIjk + BlockLgrVectors + CalculatedVectors + ImportedVectors + +RicSummaryCurveCalculator - class RicSummaryCurveCalculatorUi + CurrentCalculation + NewCalculation + DeleteCalculation + +RicSummaryCurveCreator - class RicSummaryPlotEditorUi + TargetPlot + UseAutoAppearanceAssignment + AppearanceApplyButton + CaseAppearanceType + VariableAppearanceType + WellAppearanceType + GroupAppearanceType + RegionAppearanceType + UseAutoPlotTitle + ApplySelection + Close + OK + SummaryCurveNameConfig + +RicWellPathsUnitSystemSettingsUi - class RicWellPathsUnitSystemSettingsUi + UnitSystem + +RifReaderSettings - class RifReaderSettings + importFaults + importSimulationNNCs + includeInactiveCellsInFaultGeometry + importAdvancedMswData + useResultIndexFile + skipWellData + includeFileAbsolutePathPrefix + importSummaryData + +Rim3dWellLogCurveCollection - class Rim3dWellLogCurveCollection + Show3dWellLogCurves + PlaneWidthScaling + Show3dWellLogGrid + Show3dWellLogBackground + ArrayOf3dWellLogCurves + +Rim3dWellLogExtractionCurve - class Rim3dWellLogExtractionCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveCase + CurveTimeStep + CurveEclipseResult + CurveGeomechResult + NameConfig + +Rim3dWellLogFileCurve - class Rim3dWellLogFileCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + CurveWellLogChannel + WellLogFile + NameConfig + +Rim3dWellLogRftCurve - class Rim3dWellLogRftCurve + Show3dWellLogCurve + MinCurveValue + MaxCurveValue + DrawPlane + CurveColor + eclipseResultCase + timeStep + wellLogChannelName + NameConfig + +RimAnnotationCollection - class RimAnnotationCollection + IsActive + TextAnnotations + ReachCircleAnnotations + UserDefinedPolylineAnnotations + PolylineFromFileAnnotations + +RimAnnotationCollectionBase - class RimAnnotationCollectionBase + IsActive + TextAnnotations + +RimAnnotationGroupCollection - class RimAnnotationGroupCollection + IsActive + Annotations + +RimAnnotationLineAppearance - class RimAnnotationLineAppearance + LineFieldsHidden + Color + Thickness + +RimAnnotationTextAppearance - class RimAnnotationTextAppearance + FontSize + FontColor + BackgroundColor + AnchorLineColor + +RimBinaryExportSettings - class RimBinaryExportSettings + Filename + EclipseKeyword + UndefinedValue + +RimCaseCollection - class RimCaseCollection + Reservoirs + +RimCellFilterCollection - class RimCellFilterCollection + Active + CellFilters + RangeFilters + +RimCommandExecuteScript - class RimCommandExecuteScript + Name + ScriptText + IsEnabled + +RimCommandIssueFieldChanged - class RimCommandIssueFieldChanged + CommandName + ObjectName + FieldName + FieldValueToApply + +RimCommandObject - class RimCommandObject + +RimCommandRouter - class RimCommandRouter + +RimContourMapView - class RimEclipseContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + GridCellEdgeResult + ElementVectorResult + FaultResultSettings + StimPlanColors + VirtualPerforationResult + WellCollection + FaultCollection + AnnotationCollection + StreamlineCollection + PropertyFilters + ShowInactiveCells + ShowInvalidCells + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimCsvUserData - class RimCsvUserData + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + ParseOptions + +RimCustomObjectiveFunction - class RimCustomObjectiveFunction + FunctionTitle + CustomFunctionTitle + Weights + ObjectiveFunctions + +RimCustomObjectiveFunctionCollection - class RimCustomObjectiveFunctionCollection + ObjectiveFunctions + +RimCustomObjectiveFunctionWeight - class RimCustomObjectiveFunctionWeight + WeightTitle + ObjectiveSummaryAddress + WeightValue + ObjectiveFunction + +RimDerivedEnsembleCase - class RimDerivedSummaryCase + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + SummaryCase1 + Operator + SummaryCase2 + UseFixedTimeStep + FixedTimeStepIndex + InUse + +RimDerivedEnsembleCaseCollection - class RimDerivedEnsembleCaseCollection + SummaryCases + SummaryCollectionName + NameCount + IsEnsemble + Id + (A)EnsembleId + Ensemble1 + Ensemble2 + Operator + CaseCount + MatchOnParameters + UseFixedTimeStep + FixedTimeStepIndex + +RimDialogData - class RimDialogData + ExportCarfin + ExportCompletionData + MultipleFractionsData + HoloLenseExportToFolderData + ExportwellPathsData + ExportLgr + ExportSectorModel + MockModelSettings + CreateEnsembleSurfaceUi + CreateEnsembleWellLogUi + +RimEclipseContourMapProjection - class RimEclipseContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + WeightByParameter + WeightingResult + +RimElementVectorResult - class RimElementVectorResult + LegendDefinition + ShowOil + ShowGas + ShowWater + ShowResult + VectorView + VectorSurfaceCrossingLocation + ShowVectorI + ShowVectorJ + ShowVectorK + ShowNncData + Threshold + VectorColor + UniformVectorColor + SizeScale + +RimEllipseFractureTemplate - class RimEllipseFractureTemplate + Id + UserDescription + UnitSystem + Orientation + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + HalfLength + Height + Width + Permeability + +RimEnsembleCurveFilter - class RimEnsembleCurveFilter + FilterTitle + Active + FilterMode + EnsembleParameter + ObjectiveSummaryAddress + ObjectiveFunction + CustomObjectiveFunction + MinValue + MaxValue + Categories + +RimEnsembleCurveFilterCollection - class RimEnsembleCurveFilterCollection + Active + CurveFilters + NewEnsembleFilter + +RimEnsembleCurveSet - class RimEnsembleCurveSet + EnsembleCurveSet + IsActive + SummaryGroup + SummaryAddress + Resampling + ColorMode + Color + EnsembleParameter + ObjectiveSummaryAddress + CustomObjectiveFunction + ShowObjectiveFunctionFormula + MinDateRange + MinTimeStep + MaxDateRange + MaxTimeStep + TimeStepFilter + TimeSteps + PlotAxis + LegendConfig + CurveFilters + CustomObjectiveFunctions + ObjectiveFunction + Statistics + UserDefinedName + AutoName + SummaryAddressNameTools + VarListFilter + +RimEnsembleCurveSetCollection - class RimEnsembleCurveSetCollection + EnsembleCurveSets + IsActive + +RimEnsembleStatistics - class RimEnsembleStatistics + Active + HideEnsembleCurves + BasedOnFilteredCases + ShowP10Curve + ShowP50Curve + ShowP90Curve + ShowMeanCurve + ShowCurveLabels + IncludeIncompleteCurves + Color + +RimEnsembleWellLogCurveSet - class RimEnsembleWellLogCurveSet + EnsembleCurveSet + IsActive + EnsembleWellLogs + WellLogChannelName + FilterEnsembleCurveSet + DepthEqualization + ColorMode + Color + Statistics + UserDefinedName + AutoName + PlotCurveAppearance + +RimEquilibriumAxisAnnotation - class RimEquilibriumAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + AnnotationType + Associated3DCase + m_equilNum + +RimExportInputSettings - class RimExportInputSettings + Filename + Keyword + +RimFaultRAPreprocSettings - class RimFaultRAPreprocSettings + StartTimeStepEclipse + EndTimeStepEclipse + StartTimeStepGeoMech + EndTimeStepGeoMech + EclipseCase + GeomechCase + BaseDir + CleanBaseDir + SmoothEclipseData + ElasticTableFilename + +RimFaultRASettings - class RimFaultRASettings + EclipseCase + GeomechCase + EclipseFRACase + BaseDir + ElasticTableFilename + StartTimeStepEclipse + EndTimeStepEclipse + StartTimeStepGeoMech + EndTimeStepGeoMech + BasicParameters + AdvancedParameters + BasicParametersRI + AdvancedParametersRI + +RimFaultResultSlot - class RimEclipseFaultColors + ShowCustomFaultResult + CustomResultSlot + +RimFractureExportSettings - class RimFractureExportSettings + Filename + CaseToApply + +RimGeoMechContourMapProjection - class RimGeoMechContourMapProjection + Name + IsChecked + SampleSpacing + ResultAggregation + ContourLines + ContourLabels + SmoothContourLines + LimitToPorRegion + VerticalLimit + PaddingAroundPorRegion + +RimGeoMechContourMapView - class RimGeoMechContourMapView + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + NameConfig + CameraPosition + CameraPointOfInterest + PerspectiveProjection + GridZScale + BackgroundColor + (A)ViewBackgroundColor + MaximumFrameRate + CurrentTimeStep + MeshMode + SurfaceMode + ShowGridBox + DisableLighting + ShowZScale + ComparisonView + FontSize + CrossSections + IntersectionResultDefColl + ReservoirSurfaceResultDefColl + GridCollection + OverlayInfoConfig + WellMeasurements + SurfaceInViewCollection + RangeFilters + GridCellResult + TensorResults + PropertyFilters + Parts + ShowDisplacement + DisplacementScaling + ContourMapProjection + ShowAxisLines + ShowScaleLegend + +RimGridCrossPlot - class RimGridCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimGridCrossPlotCollection - class RimGridCrossPlotCollection + GridCrossPlots + +RimGridCrossPlotCurveSetNameConfig - class RimGridCrossPlotDataSetNameConfig + CustomCurveName + AddCaseName + AddAxisVariables + AddTimeStep + AddGrouping + +RimGridCrossPlotNameConfig - class RimGridCrossPlotNameConfig + CustomCurveName + AddDataSetNames + +RimIdenticalGridCaseGroup - class RimIdenticalGridCaseGroup + UserDescription + GroupId + StatisticsCaseCollection + CaseCollection + +RimInputProperty - class RimEclipseInputProperty + ResultName + EclipseKeyword + FileName + +RimInputPropertyCollection - class RimEclipseInputPropertyCollection + InputProperties + +RimInputReservoir - class RimEclipseInputCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + AdditionalFileNamesProxy + +RimIntersectionResultsDefinitionCollection - class RimIntersectionResultsDefinitionCollection + isActive + IntersectionResultDefinitions + +RimMeasurement - class RimMeasurement + +RimMswCompletionParameters - class RimMswCompletionParameters + RefMDType + RefMD + CustomValuesForLateral + LinerDiameter + RoughnessFactor + PressureDrop + LengthAndDepth + EnforceMaxSegmentLength + MaxSegmentLength + +RimMudWeightWindowParameters - class RimMudWeightWindowParameters + WellDeviationSourceType + WellDeviationFixed + WellDeviationAddress + WellAzimuthSourceType + WellAzimuthFixed + WellAzimuthAddress + UCSSourceType + UCSFixed + UCSAddress + PoissonsRatioSourceType + PoissonsRatioFixed + PoissonsRatioAddress + K0_FGSourceType + K0_FGFixed + K0_FGAddress + obg0SourceType + obg0Fixed + obg0Address + AirGap + SHMultiplier + UpperLimitType + LowerLimitType + FractureGradientCalculationType + PorePressureNonReservoirSource + UserPPNonReservoir + PPNonReservoirAddress + ReferenceLayer + +RimMultiPlotCollection - class RimMultiPlotCollection + MultiPlots + +RimMultipleLocations - class RimMultipleLocations + LocationMode + RangeStart + RangeEnd + Spacing + RangeValveCount + Locations + +RimMultipleValveLocations - class RimMultipleValveLocations + LocationMode + RangeStart + RangeEnd + ValveSpacing + RangeValveCount + LocationOfValves + +RimNonDarcyPerforationParameters - class RimNonDarcyPerforationParameters + NonDarcyFlowType + UserDefinedDFactor + GridPermeabilityScalingFactor + WellRadius + RelativeGasDensity + GasViscosity + InertialCoefficientBeta0 + PermeabilityScalingFactor + PorosityScalingFactor + +RimObjectiveFunction - class RimObjectiveFunction + FunctionType + NormalizeByNumberOfObservations + NormalizeByNumberOfVectors + ErrorEstimatePercentage + UseSquaredError + +RimObservedEclipseUserData - class RimObservedEclipseUserData + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +RimOilFieldEntry - class RimOilFieldEntry + OilFieldName + EdmId + Selected + wellsFilePath + Wells + +RimOilRegionEntry - class RimOilRegionEntry + OilRegionEntry + Fields + Selected + +RimPlotAxisAnnotation - class RimPlotAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + +RimPlotCellFilterCollection - class RimPlotCellFilterCollection + Name + IsChecked + FilterMode + CellFilters + +RimPlotCellPropertyFilter - class RimPlotCellPropertyFilter + Name + IsChecked + FilterMode + ResultDefinition + LowerBound + UpperBound + +RimPolylineAppearance - class RimPolylineAppearance + LineFieldsHidden + Color + Thickness + SphereFieldsHidden + SphereColor + SphereRadiusFactor + +RimPolylinesAnnotationInView - class RimPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimPolylinesFromFileAnnotationInView - class RimPolylinesFromFileAnnotationInView + IsActive + SourceAnnotation + +RimProcess - class RimProcess + Command + Description + ID + +RimReachCircleAnnotation - class RimReachCircleAnnotation + IsActive + CenterPointXyd + Radius + Name + Appearance + +RimReachCircleAnnotationInView - class RimReachCircleAnnotationInView + IsActive + SourceAnnotation + +RimSaturationPressurePlot - class RimSaturationPressurePlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + ShowInfoBox + NameConfig + xAxisProperties + yAxisProperties + CrossPlotCurve + +RimSaturationPressurePlotCollection - class RimSaturationPressurePlotCollection + SaturationPressurePlots + +RimStatisticalCalculation - class RimEclipseStatisticsCase + Name + (A)CaseUserDescription + NameSetting + Id + (A)CaseId + FilePath + (A)CaseFileName + (A)GridFileName + DefaultFormationNames + TimeStepFilter + IntersectionViewCollection + ReservoirViews + MatrixModelResults + FractureModelResults + FlipXAxis + FlipYAxis + ContourMaps + InputPropertyCollection + ResultType + PorosityModel + DynamicPropertiesToCalculate + StaticPropertiesToCalculate + GeneratedPropertiesToCalculate + InputPropertiesToCalculate + FractureDynamicPropertiesToCalculate + FractureStaticPropertiesToCalculate + FractureGeneratedPropertiesToCalculate + FractureInputPropertiesToCalculate + CalculatePercentiles + PercentileCalculationType + LowPercentile + MidPercentile + HighPercentile + WellDataSourceCase + UseZeroAsInactiveCellValue + +RimStatisticalCollection - class RimEclipseStatisticsCaseCollection + Reservoirs + +RimStimPlanColors - class RimStimPlanColors + IsChecked + ResultName + DefaultColor + LegendConfigurations + ShowStimPlanMesh + StimPlanCellVizMode + +RimStimPlanFractureTemplate - class RimStimPlanFractureTemplate + Id + UserDescription + UnitSystem + Orientation + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + ShowStimPlanMesh + +RimStimPlanLegendConfig - class RimStimPlanLegendConfig + Name + Legend + +RimSummaryCalculation - class RimSummaryCalculation + Description + Expression + Unit + Variables + CalculatedValues + TimeSteps + Id + +RimSummaryCalculationCollection - class RimSummaryCalculationCollection + Calculations + +RimSummaryCalculationVariable - class RimSummaryCalculationVariable + VariableName + SummaryCase + SummaryAddress + +RimSummaryCurveCollection - class RimSummaryCurveCollection + CollectionCurves + IsActive + +RimSummaryCurveCollectionModifier - class RimSummaryPlotSourceStepping + CurveCase + IncludeEnsembleCasesForCaseStepping + WellName + GroupName + Region + Quantities + CellBlock + Segment + Completion + Aquifer + Ensemble + Placeholder + +RimSurfaceIntersectionBand - class RimSurfaceIntersectionBand + IsChecked + LineAppearance + BandColor + BandOpacity + BandPolygonOffsetUnit + Surfaces + NameProxy + +RimSurfaceIntersectionCollection - class RimSurfaceIntersectionCollection + IsChecked + IntersectionBands + IntersectionCurves + +RimSurfaceIntersectionCurve - class RimSurfaceIntersectionCurve + IsChecked + LineAppearance + Surface1 + NameProxy + +RimTensorResults - class RimTensorResults + LegendDefinition + ResultVariable + ShowTensors + Principal1 + Principal2 + Principal3 + Threshold + VectorColor + ScaleMethod + SizeScale + RangeType + +RimTernaryLegendConfig - class RimTernaryLegendConfig + ShowTernaryLegend + Precision + RangeType + ternaryRangeSummary + UserDefinedMaxSoil + UserDefinedMinSoil + UserDefinedMaxSgas + UserDefinedMinSgas + UserDefinedMaxSwat + UserDefinedMinSwat + +RimTextAnnotation - class RimTextAnnotation + AnchorPointXyd + LabelPointXyd + Text + IsActive + TextAppearance + +RimTextAnnotationInView - class RimTextAnnotationInView + IsActive + SourceAnnotation + +RimTimeAxisAnnotation - class RimTimeAxisAnnotation + Active + Name + Value + RangeStart + RangeEnd + +RimTimeStepFilter - class RimTimeStepFilter + FilterType + FirstTimeStep + LastTimeStep + Interval + DateFormat + TimeStepIndicesToImport + +RimUserDefinedPolylinesAnnotationInView - class RimUserDefinedPolylinesAnnotationInView + IsActive + SourceAnnotation + +RimVfpPlotCollection - class RimVfpPlotCollection + VfpPlots + +RimViewLinkerCollection - class RimViewLinkerCollection + Active + ViewLinkers + +RimViewNameConfig - class RimViewNameConfig + CustomCurveName + AddCaseName + AddAggregationType + AddProperty + AddSampleSpacing + +RimVirtualPerforationResults - class RimVirtualPerforationResults + ShowConnectionFactors + ShowClosedConnections + GeometryScaleFactor + LegendDefinition + +RimWellIASettings - class RimWellIASettings + Name + IsChecked + GeomechCase + BaseDir + StartMeasuredDepth + EndMeasuredDepth + BufferXY + BufferZ + ModelingParameters + TimeStepParameters + showBox + startDate + boxValid + +RimWellIASettingsCollection - class RimWellIASettingsCollection + WellIASettings + +RimWellLogExtractionCurve - class RimWellLogExtractionCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + +RimWellLogExtractionCurveNameConfig - class RimWellLogExtractionCurveNameConfig + CustomCurveName + AddCaseName + AddProperty + AddWellName + AddTimeStep + AddDate + +RimWellLogFileCurveNameConfig - class RimWellLogFileCurveNameConfig + CustomCurveName + +RimWellLogPlotNameConfig - class RimWellLogPlotNameConfig + CustomCurveName + AddCaseName + AddWellName + AddTimeStep + AddAirGap + AddWaterDepth + +RimWellLogRftCurveNameConfig - class RimWellLogRftCurveNameConfig + CustomCurveName + +RimWellLogWbsCurve - class RimWellLogWbsCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + SmoothCurve + SmoothingThreshold + +RimWellPathEntry - class RimWellPathEntry + Name + Selected + WellPathType + surveyType + requestUrl + wellPathFilePath + +RimWellPathImport - class RimWellPathImport + WellTypeSurvey + WellTypePlans + UtmMode + UtmNorth + UtmSouth + UtmEast + UtmWest + Regions + +RimWellPathTieIn - class RimWellPathTieIn + ParentWellPath + ChildWellPath + TieInMeasuredDepth + AddValveAtConnection + Valve + +RiuCreateMultipleFractionsUi - class RiuCreateMultipleFractionsUi + SourceCase + MinDistanceFromWellTd + MaxFracturesPerWell + Options + FractureCreationSummary + +RiuMultipleFractionsOptions - class RicCreateMultipleFracturesOptionItemUi + TopKLayer + BaseKLayer + Template + MinSpacing + +ScriptLocation - class RimScriptCollection + ScriptDirectory + CalcScripts + SubDirectories + SearchSubFolders + +SimWellFracture - class RimSimWellFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + Branch + +SimWellFractureCollection - class RimSimWellFractureCollection + Fractures + +StimPlanFractureTemplate - class RimStimPlanFractureTemplate + Id + UserDescription + UnitSystem + Orientation + AzimuthAngle + SkinFactor + PerforationLength + PerforationEfficiency + WellDiameter + ConductivityType + WellPathDepthAtFracture + FractureContainmentField + NonDarcyFlowType + UserDefinedDFactor + FractureWidthType + FractureWidth + BetaFactorType + InertialCoefficient + PermeabilityType + RelativePermeability + EffectivePermeability + RelativeGasDensity + GasViscosity + HeightScaleFactor + WidthScaleFactor + DFactorScaleFactor + ConductivityFactor + StimPlanFileName + UserDefinedWellPathDepthAtFracture + BorderPolygonResultName + ActiveTimeStepIndex + ConductivityResultName + ShowStimPlanMesh + +StimPlanModel - class RimStimPlanModel + Name + IsChecked + StimPlanModelTemplate + EditModelTemplate + EclipseCase + TimeStep + InitialPressureEclipseCase + StaticEclipseCase + MeasuredDepth + ExtractionOffsetTop + ExtractionOffsetBottom + ExtractionDepthTop + ExtractionDepthBottom + ExtractionType + ThicknessDirectionWellPath + BoundingBoxHorizontal + BoundingBoxVertical + UseDetailedFluidLoss + RelativePermeabilityFactor + PoroElasticConstant + ThermalExpansionCoefficient + PerforationLength + FractureOrientation + AzimuthAngle + FormationDip + AutoComputeBarrier + Barrier + DistanceToBarrier + BarrierDip + WellPenetrationLayer + ShowOnlyBarrierFault + ShowAllFaults + BarrierFaultName + BarrierTextAnnotation + PerforationInterval + +StimPlanModelCollection - class RimStimPlanModelCollection + Name + IsChecked + StimPlanModels + +StimPlanModelCurve - class RimStimPlanModelCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + StimPlanModel + CurveProperty + +StimPlanModelPlot - class RimStimPlanModelPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + StimPlanModel + EditModel + EclipseCase + TimeStep + +StimPlanModelPlotCollection - class RimStimPlanModelPlotCollection + StimPlanModelPlots + +StimPlanModelTemplate - class RimStimPlanModelTemplate + Name + Id + DynamicEclipseCase + TimeStep + InitialPressureEclipseCase + UseForInitialPressure + UseForPressure + EditPressureTable + StaticEclipseCase + UseEqlNumForPressureInterpolation + DefaultPorosity + DefaultPermeability + VerticalStress + VerticalStressGradient + StressDepth + ReferenceTemperature + ReferenceTemperatureGradient + ReferenceTemperatureDepth + OverburdenHeight + OverburdenFormation + OverburdenFacies + OverburdenPorosity + OverburdenPermeability + OverburdenFluidDensity + UnderburdenHeight + UnderburdenFormation + UnderburdenFacies + UnderburdenPorosity + UnderburdenPermeability + UnderburdenFluidDensity + FaciesInitialPressureConfigs + PressureTable + ElasticProperties + FaciesProperties + NonNetLayers + +StimPlanModelTemplateCollection - class RimStimPlanModelTemplateCollection + StimPlanModelTemplates + NextValidId + +StreamlineInViewCollection - class RimStreamlineInViewCollection + LegendDefinition + Name + FlowThreshold + LengthThreshold + Resolution + MaxDays + UseProducers + UseInjectors + Phase + isActive + VisualizationMode + ColorMode + AnimationSpeed + AnimationIndex + ScaleFactor + TracerLength + +StringParameter - class RimStringParameter + Name + Label + Description + Advanced + Valid + Value + +SummaryAddress - class RimSummaryAddress + SummaryVarType + SummaryQuantityName + SummaryRegion + SummaryRegion2 + SummaryWellGroup + SummaryWell + SummaryWellSegment + SummaryLgr + SummaryCellI + SummaryCellJ + SummaryCellK + SummaryAquifer + IsErrorResult + CalculationId + +SummaryCaseCollection - class RimSummaryCaseMainCollection + SummaryCases + SummaryCaseCollections + +SummaryCaseSubCollection - class RimSummaryCaseCollection + SummaryCases + SummaryCollectionName + NameCount + IsEnsemble + Id + (A)EnsembleId + +SummaryCrossPlot - class RimSummaryCrossPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + SummaryPlotFilterTextCurveSetEditor + +SummaryCrossPlotCollection - class RimSummaryCrossPlotCollection + SummaryCrossPlots + +SummaryCurve - class RimSummaryCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + SummaryCase + SummaryAddress + Resampling + SummaryCaseX + SummaryAddressX + IsEnsembleCurve + PlotAxis + SummaryCurveNameConfig + isTopZWithinCategory + VarListFilter + VarListFilterX + +SummaryCurveAutoName - class RimSummaryCurveAutoName + VectorName + Unit + RegionNumber + WellGroupName + WellName + WellSegmentNumber + LgrName + Completion + Aquifer + CaseName + +SummaryCurveFilter - class RimSummaryCurveFilter_OBSOLETE + VarListFilter + FilteredCurves + AutoApplyFilterChanges + IsActive + UseAutoAppearanceAssignment + CaseAppearanceType + VariableAppearanceType + WellAppearanceType + GroupAppearanceType + RegionAppearanceType + PlotAxis + ShowLegend + SummaryCurveNameConfig + +SummaryFilterSettings - class RimSummaryFilter_OBSOLETE + SummaryFilterType + SummaryCompleteVarStringFilter + SummaryVarQuantityFilter + SummaryRegionNumberFilter + SummaryRegionNumber2Filter + SummaryWellGroupNameFilter + SummaryWellNameFilter + SummaryWellSegmentNumberFilter + SummaryLgrNameFilter + SummaryCellIJKFilter + +SummaryObservedDataFile - class RimSummaryObservedDataFile + ShortName + NameSetting + AutoShortyName + SummaryHeaderFilename + Id + (A)CaseId + UseCustomIdentifier + SummaryType + IdentifierName + +SummaryPageDownloadEntity - class SummaryPageDownloadEntity + Name + RequestUrl + ResponseFilename + +SummaryPlot - class RimSummaryPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + IsUsingAutoName + PlotDescription + normalizeCurveYValues + SummaryCurveCollection + EnsembleCurveSetCollection + GridTimeHistoryCurves + AsciiDataCurves + LeftYAxisProperties + RightYAxisProperties + BottomAxisProperties + TimeAxisProperties + SummaryPlotFilterTextCurveSetEditor + +SummaryPlotCollection - class RimSummaryPlotCollection + SummaryPlots + +SummaryPlotFilterTextCurveSetEditor - class RimSummaryPlotFilterTextCurveSetEditor + CurveFilterText + SummaryCases + +SummaryTimeAxisProperties - class RimSummaryTimeAxisProperties + Active + ShowTitle + Title + AutoZoom + TimeMode + TimeUnit + VisibleDateRangeMax + VisibleDateRangeMin + VisibleTimeRangeMax + VisibleTimeRangeMin + VisibleTimeModeRangeMax + VisibleTimeModeRangeMin + TitlePosition + FontSize + ValuesFontSize + AutoDate + DateComponents + TimeComponents + DateFormat + TimeFormat + MajorTickmarkCount + Annotations + +SummaryYAxisProperties - class RimPlotAxisProperties + Active + Name + AutoTitle + DisplayLongName + DisplayShortName + DisplayUnitText + CustomTitle + VisibleRangeMax + VisibleRangeMin + NumberFormat + Decimals + ScaleFactor + AutoZoom + LogarithmicScale + AxisInverted + TitlePosition + TitleDeltaFontSize + ValueDeltaFontSize + Annotations + +Surface - class RimFileSurface + SurfaceUserDecription + SurfaceColor + DepthOffset + SurfaceFilePath + +SurfaceCollection - class RimSurfaceCollection + SurfaceUserDecription + SubCollections + SurfacesField + +SurfaceInView - class RimSurfaceInView + Active + ShowInactiveCells + UseSeparateIntersectionDataSource + SeparateIntersectionDataSource + Name + SurfaceRef + ResultDefinition + +SurfaceInViewCollection - class RimSurfaceInViewCollection + Name + IsChecked + SurfacesInViewFieldCollections + SurfacesInViewField + SurfaceCollectionRef + +SurfaceResultDefinition - class RimSurfaceResultDefinition + Name + IsChecked + PropertyName + LegendConfig + SurfaceInView + +TC2 - class TC2 + ta + da + ia + ba + +TestCommand1 - class TestCommand1 + TextArgument + DoubleArgument + IntArgument + BoolArgument + +TofAccumulatedPhaseFractionsPlot - class RimTofAccumulatedPhaseFractionsPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + MaxTof + +TotalWellAllocationPlot - class RimTotalWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + +UserDefinedFilter - class RimUserDefinedFilter + UserDescription + Active + FilterType + GridIndex + PropagateToSubGrids + IndividualCellIndices + +UserDefinedPolylinesAnnotation - class RimUserDefinedPolylinesAnnotation + IsActive + ClosePolyline + ShowLines + ShowSpheres + Appearance + Name + Targets + +ValveTemplate - class RimValveTemplate + Name + UnitSystem + CompletionType + UserLabel + OrificeDiameter + FlowCoefficient + AICDParameters + +ValveTemplateCollection - class RimValveTemplateCollection + ValveDefinitions + ValveUnits + +VfpPlot - class RimVfpPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + PlotTitle + FilePath + TableType + TableNumber + ReferenceDepth + FlowingPhase + FlowingWaterFraction + FlowingGasFraction + InterpolatedVariable + PrimaryVariable + FamilyVariable + LiquidFlowRateIdx + THPIdx + ArtificialLiftQuantityIdx + WaterCutIdx + GasLiquidRatioIdx + +View3dOverlayInfoConfig - class Rim3dOverlayInfoConfig + Active + ShowAnimProgress + ShowInfoText + ShowResultInfo + ShowHistogram + ShowVolumeWeightedMean + ShowVersionInfo + StatisticsTimeRange + StatisticsCellRange + +ViewController - class RimViewController + Active + Name + ManagedView + SyncCamera + ShowCursor + SyncTimeStep + SyncCellResult + SyncLegendDefinitions + SyncRangeFilters + SyncPropertyFilters + +ViewLinker - class RimViewLinker + Name + MainView + ManagedViews + +WbsParameters - class RimWbsParameters + PorePressureReservoirSource + PorePressureNonReservoirSource + UserPPNonReservoir + PoissionRatioSource + UcsSource + OBG0Source + DFSource + K0SHSource + FGShaleSource + K0FGSource + WaterDensitySource + UserPoissonRatio + UserUcs + UserDF + UserK0FG + UserK0SH + FGMultiplier + WaterDensity + GeoMechCase + WellPath + TimeStep + +Well - class RimSimWellInView + Name + (A)WellName + ShowWell + ShowWellLabel + ShowWellHead + ShowWellPipe + ShowWellSpheres + ShowWellDisks + WellHeadScaleFactor + WellPipeRadiusScale + WellPipeColor + WellDiskColor + ShowWellCells + ShowWellCellFence + FractureCollection + +WellAllocationPlot - class RimWellAllocationPlot + WindowController + ShowWindow + WindowGeometry + PlotDescription + ShowPlotTitle + BranchDetection + CurveCase + PlotTimeStep + WellName + FlowDiagSolution + FlowType + GroupSmallContributions + SmallContributionsThreshold + AccumulatedWellFlowPlot + TotalWellFlowPlot + WellAllocLegend + TofAccumulatedPhaseFractionsPlot + +WellAllocationPlotLegend - class RimWellAllocationPlotLegend + ShowPlotLegend + +WellBoreStabilityPlot - class RimWellBoreStabilityPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + WbsParameters + +WellDistributionPlot - class RimWellDistributionPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + Case + TimeStepIndex + WellName + Phase + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + +WellDistributionPlotCollection - class RimWellDistributionPlotCollection + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + Case + TimeStepIndex + WellName + GroupSmallContributions + SmallContributionsRelativeThreshold + MaximumTOF + Plots + ShowOil + ShowGas + ShowWater + PlotDescription + +WellFlowRateCurve - class RimWellFlowRateCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + +WellLogExtractionCurve - class RimWellLogExtractionCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + TrajectoryType + CurveWellPath + SimulationWellName + BranchDetection + Branch + CurveCase + CurveEclipseResult + CurveGeomechResult + CurveTimeStep + AddCaseNameToCurveName + AddPropertyToCurveName + AddWellNameToCurveName + AddTimestepToCurveName + AddDateToCurveName + +WellLogFile - class RimWellLogFile + WellName + Date + FileName + Name + WellLogFileChannels + WellFlowCondition + +WellLogFileChannel - class RimWellLogFileChannel + Name + +WellLogFileCurve - class RimWellLogFileCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + CurveWellPath + CurveWellLogChannel + WellLogFile + +WellLogPlot - class RimWellLogPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + +WellLogPlotCollection - class RimWellLogPlotCollection + WellLogPlots + +WellLogPlotTrack - class RimWellLogTrack + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + RowSpan + ColSpan + TrackDescription + Curves + VisibleXRangeMin + VisibleXRangeMax + AutoScaleX + LogarithmicScaleX + ShowXGridLines + ExplicitTickIntervals + MinAndMaxTicksOnly + MajorTickIntervals + MinorTickIntervals + AxisFontSize + AnnotationType + RegionDisplay + ColorShadingLegend + ColorShadingTransparency + ShowFormationLabels + RegionLabelFontSize + FormationSource + FormationTrajectoryType + FormationWellPath + FormationWellPathForSourceWellPath + FormationSimulationWellName + FormationBranchIndex + FormationBranchDetection + FormationCase + FormationLevel + ShowFormationFluids + ShowWellPathAttributes + WellPathAttributesInLegend + ShowWellPathCompletions + WellPathCompletionsInLegend + ShowWellPathAttrBothSides + ShowWellPathAttrLabels + AttributesWellPathSource + AttributesCollection + OverburdenHeight + UnderburdenHeight + ResultDefinition + EnsembleWellLogCurveSet + +WellLogRftCurve - class RimWellLogRftCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + CurveEclipseResultCase + CurveSummaryCase + CurveEnsemble + ObservedFmuRftData + TimeStep + WellName + BranchIndex + BranchDetection + WellLogChannelName + +WellMeasurement - class RimWellMeasurement + WellName + Depth + Date + Value + Kind + Quality + Remark + FilePath + +WellMeasurementCurve - class RimWellMeasurementCurve + Show + CurveName + CurveDescription + LegendDescription + AutoName + ShowLegend + ShowErrorBars + Color + FillColor + Thickness + CurveInterpolation + LineStyle + FillStyle + PointSymbol + SymbolEdgeColor + SymbolSkipPxDist + SymbolLabel + SymbolSize + SymbolLabelPosition + PlotCurveAppearance + StackCurve + StackPhaseColors + CurveWellPath + CurveMeasurementKind + +WellMeasurementFilePath - class RimWellMeasurementFilePath + UserDecription + FilePath + +WellMeasurementInView - class RimWellMeasurementInView + Name + IsChecked + MeasurementKind + LegendDefinition + WellsSerialized + AvailableWellsSerialized + LowerBound + UpperBound + QualityFilter + RadiusScaleFactor + +WellMeasurements - class RimWellMeasurementCollection + Measurements + ImportedFiles + +WellMeasurementsInView - class RimWellMeasurementInViewCollection + Name + IsChecked + MeasurementKinds + +WellPath - class RimFileWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + WellPathFilepath + WellPathFilePathInCache + WellPathNumberInFile + UseAutoGeneratedPointAtSeaLevel + +WellPathAicdParameters - class RimWellPathAicdParameters + DeviceOpen + StrengthAICD + DensityCalibrationFluid + ViscosityCalibrationFluid + VolumeFlowRateExponent + ViscosityFunctionExponent + CriticalWaterLiquidFractionEmul + ViscosityTransitionRegionEmul + MaxRatioOfEmulsionVisc + MaxFlowRate + ExponentOilDensity + ExponentWaterDensity + ExponentGasDensity + ExponentOilViscosity + ExponentWaterViscosity + ExponentGasViscosity + +WellPathAttribute - class RimWellPathAttribute + CompletionType + DepthStart + DepthEnd + DiameterInInches + +WellPathAttributes - class RimWellPathAttributeCollection + Name + IsChecked + Attributes + +WellPathBase - class RimWellPath + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + +WellPathCompletionSettings - class RimWellPathCompletionSettings + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + MswParameters + +WellPathCompletions - class RimWellPathCompletions + Perforations + Fishbones + Fractures + StimPlanModels + WellNameForExport + WellGroupNameForExport + ReferenceDepthForExport + WellTypeForExport + DrainageRadiusForPI + GasInflowEq + AutoWellShutIn + AllowWellCrossFlow + WellBoreFluidPVTTable + HydrostaticDensity + FluidInPlaceRegion + +WellPathFracture - class RimWellPathFracture + Name + IsChecked + FractureDef + EditTemplate + CreateEllipseTemplate + CreateStimPlanTemplate + AutoUpdateWellPathDepthAtFractureFromTemplate + WellPathDepthAtFracture + Azimuth + PerforationLength + PerforationEfficiency + WellDiameter + Dip + Tilt + FractureUnit + TimeIndexToPlot + MeasuredDepth + +WellPathFractureCollection - class RimWellPathFractureCollection + Name + IsChecked + Fractures + +WellPathGeometry - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + ShowAbsolutePosForWellTargets + UseTopLevelWellReferencePoint + UseAutoGeneratedTargetAtSeaLevel + LinkReferencePointUpdates + AutoGeneratedTarget + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGeometryDef - class RimWellPathGeometryDef + ReferencePosUtmXyd + AirGap + MdAtFirstTarget + WellPathTargets + ShowAbsolutePosForWellTargets + UseTopLevelWellReferencePoint + UseAutoGeneratedTargetAtSeaLevel + LinkReferencePointUpdates + AutoGeneratedTarget + AttachedToParentWell + FixedWellPathPoints + FixedMeasuredDepths + ShowSpheres + SphereColor + SphereRadiusFactor + +WellPathGroup - class RimWellPathGroup + AirGap + DatumElevation + UnitSystem + SimWellName + SimBranchIndex + ShowWellPathLabel + ShowWellPath + WellPathRadiusScale + WellPathColor + Completions + CompletionSettings + WellLogFiles + CollectionOf3dWellLogCurves + WellPathFormationKeyInFile + WellPathFormationFilePath + WellPathAttributes + WellPathTieIn + WellIASettings + ChildWellPaths + GroupName + AddValveAtConnection + Valve + +WellPathTarget - class RimWellPathTarget + IsEnabled + IsLocked + TargetPoint + TargetPointForDisplay + TargetMeasuredDepth + Dogleg1 + Dogleg2 + TargetType + Azimuth + Inclination + +WellPathValve - class RimWellPathValve + Name + IsChecked + ValveTemplate + StartMeasuredDepth + ValveLocations + EditTemplate + CreateTemplate + +WellPaths - class RimWellPathCollection + Active + ShowWellPathLabel + WellPathLabelColor + GlobalWellPathVisibility + WellPathRadiusScale + WellPathClip + WellPathClipZDistance + WellPaths + WellMeasurements + +WellPltPlot - class RimWellPltPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + WellLog + WellName + Sources + TimeSteps + UseStandardConditionCurves + UseReservoirConditionCurves + Phases + +WellPltPlotCollection - class RimPltPlotCollection + PltPlots + +WellRftEnsembleCurveSet - class RimWellRftEnsembleCurveSet + Ensemble + ColorMode + EnsembleParameter + LegendConfig + +WellRftPlot - class RimWellRftPlot + WindowController + ShowWindow + WindowGeometry + Id + (A)ViewId + ShowPlotTitle + ShowTrackLegends + TrackLegendsHorizontal + TitleFontSize + LegendDeltaFontSize + PlotDescription + DepthType + DepthUnit + MinimumDepth + MaximumDepth + ShowDepthGridLines + AutoScaleDepthEnabled + SubTitleFontSize + AxisTitleFontSize + AxisValueFontSize + NameConfig + FilterEnsembleCurveSet + DepthEqualization + Tracks + ShowStatisticsCurves + ShowEnsembleCurves + ShowErrorObserved + WellLog + WellName + BranchIndex + BranchDetection + EnsembleCurveSets + +WellRftPlotCollection - class RimRftPlotCollection + RftPlots + +Wells - class RimSimWellInViewCollection + Active + ShowWellsIntersectingVisibleCells + WellHeadScale + WellPipeRadiusScale + CellCenterSphereScale + WellLabelColor + ShowConnectionStatusColors + WellColorForApply + WellPipeColors + WellPipeVertexCount + WellPipeCoordType + DefaultWellFenceDirection + WellCellTransparency + IsAutoDetectingBranches + WellHeadPosition + Wells + WellDiskSummaryCase + WellDiskQuantity + WellDiskPropertyType + WellDiskPropertyConfigType + WellDiskShowQuantityLabels + WellDiskShowLabelsBackground + WellDiskScaleFactor + WellDiskColor + ShowWellCommunicationLines + +cafNamedTreeNode - class cafNamedTreeNode + ChildNodes + Name + IsChecked + +cafObjectReferenceTreeNode - class cafObjectReferenceTreeNode + ChildNodes + ReferencedObject + +cafTreeNode - class cafTreeNode + ChildNodes + +cloneView - class RicfCloneView + viewId + +closeProject - class RicfCloseProject + +computeCaseGroupStatistics - class RicfComputeCaseGroupStatistics + caseGroupId + caseIds + +createGridCaseGroup - class RicfCreateGridCaseGroup + casePaths + +createGridCaseGroupResult - class RicfCreateGridCaseGroupResult + groupId + groupName + +createLgrForCompletions - class RicfCreateLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +createMultiPlot - class RicNewMultiPlotFeature + plots + +createMultipleFractures - class RicfCreateMultipleFractures + caseId + wellPathNames + minDistFromWellTd + maxFracturesPerWell + templateId + topLayer + baseLayer + spacing + action + +createSaturationPressurePlots - class RicfCreateSaturationPressurePlots + caseIds + +createStatisticsCase - class RicfCreateStatisticsCase + caseGroupId + +createStatisticsCaseResult - class RicfCreateStatisticsCaseResult + caseId + +createView - class RicfCreateView + caseId + +createViewResult - class RicfCreateViewResult + viewId + +createWbsPlotResult - class RicfCreateWbsPlotResult + viewId + +createWellBoreStabilityPlot - class RicfCreateWellBoreStabilityPlotFeature + caseId + wellPath + timeStep + wbsParameters + +exportContourMapToText - class RicExportContourMapToTextFeature + exportFileName + exportLocalCoordinates + undefinedValueLabel + excludeUndefinedValues + viewId + +exportFlowCharacteristics - class RicfExportFlowCharacteristics + caseId + timeSteps + injectors + producers + fileName + minimumCommunication + aquiferCellThreshold + +exportLgrForCompletions - class RicfExportLgrForCompletions + caseId + timeStep + wellPathNames + refinementI + refinementJ + refinementK + splitType + +exportMsw - class RicfExportMsw + caseId + wellPath + includePerforations + includeFishbones + includeFractures + fileSplit + +exportMultiCaseSnapshots - class RicfExportMultiCaseSnapshots + gridListFile + +exportProperty - class RicfExportProperty + caseId + timeStep + property + eclipseKeyword + undefinedValue + exportFile + +exportPropertyInViews - class RicfExportPropertyInViews + caseId + viewIds + viewNames + undefinedValue + +exportSimWellFractureCompletions - class RicfExportSimWellFractureCompletions + caseId + viewId + viewName + timeStep + simulationWellNames + fileSplit + compdatExport + +exportSnapshots - class RicfExportSnapshots + type + prefix + caseId + viewId + exportFolder + plotOutputFormat + +exportVisibleCells - class RicfExportVisibleCells + caseId + viewId + viewName + exportKeyword + visibleActiveCellsValue + hiddenActiveCellsValue + inactiveCellsValue + +exportWellLogPlotData - class RicfExportWellLogPlotData + exportFormat + viewId + exportFolder + filePrefix + exportTvdRkb + capitalizeFileNames + resampleInterval + convertCurveUnits + +exportWellLogPlotDataResult - class RicfExportWellLogPlotDataResult + exportedFiles + +exportWellPathCompletions - class RicfExportWellPathCompletions + caseId + timeStep + wellPathNames + fileSplit + compdatExport + combinationMode + includeMsw + useNtgHorizontally + includePerforations + includeFishbones + includeFractures + excludeMainBoreForFishbones + performTransScaling + transScalingTimeStep + transScalingWBHPFromSummary + transScalingWBHP + exportComments + exportWelspec + customFileName + +exportWellPaths - class RicfExportWellPaths + wellPathNames + mdStepSize + +importFormationNames - class RicfImportFormationNames + formationFiles + applyToCaseId + +importWellLogFiles - class RicfImportWellLogFiles + wellLogFolder + wellLogFiles + +importWellLogFilesResult - class RicfImportWellLogFilesResult + wellPathNames + +importWellPaths - class RicImportWellPaths + wellPathFolder + wellPathFiles + importGrouped + +importWellPathsResult - class RicImportWellPathsResult + wellPathNames + +loadCase - class RicfLoadCase + path + gridOnly + +loadCaseResult - class RicfLoadCaseResult + id + +openProject - class RicfOpenProject + path + +replaceCase - class RicfSingleCaseReplace + caseId + newGridFile + +replaceMultipleCases - class RicfMultiCaseReplace + +replaceSourceCases - class RicfReplaceSourceCases + caseGroupId + gridListFile + +runOctaveScript - class RicfRunOctaveScript + path + caseIds + +saveProject - class RicSaveProjectFeature + filePath + +saveProjectAs - class RicSaveProjectAsFeature + filePath + +scaleFractureTemplate - class RicfScaleFractureTemplate + id + halfLength + height + dFactor + conductivity + width + +setExportFolder - class RicfSetExportFolder + type + path + createFolder + +setFractureContainment - class RicfSetFractureContainment + id + topLayer + baseLayer + +setMainWindowSize - class RicfSetMainWindowSize + height + width + +setPlotWindowSize - class RicfSetPlotWindowSize + height + width + +setStartDir - class RicfSetStartDir + path + +setTimeStep - class RicfSetTimeStep + caseId + viewId + timeStep + +stackCurves - class RicStackSelectedCurvesFeature + curves + +unstackCurves - class RicUnstackSelectedCurvesFeature + curves + diff --git a/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-objectKeywords.txt b/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-objectKeywords.txt new file mode 100644 index 0000000000..4604a15646 --- /dev/null +++ b/ApplicationLibCode/Adm/projectfilekeywords/2021.10/ri-objectKeywords.txt @@ -0,0 +1,420 @@ +// ResInsight version string : 2021.10.0-RC_01 +// Report generated : Mon Nov 1 15:35:12 2021 +// +// + +AnalysisPlot +AnalysisPlotCollection +AnalysisPlotDataEntry +Annotations +AsciiDataCurve +CalcScript +CalculatedSummaryCase +CellEdgeResultSlot +CellFilterCollection +CellPropertyFilter +CellPropertyFilters +CellRangeFilter +CellRangeFilterCollection +ChangeDataSourceFeatureUi +CmdFieldChangeExecData +ColorLegend +ColorLegendCollection +ColorLegendItem +CompletionTemplateCollection +CorrelationMatrixPlot +CorrelationPlot +CorrelationPlotCollection +CorrelationReportPlot +CrossSection +CrossSectionCollection +DataContainerFloat +DataContainerString +DataContainerTime +DepthTrackPlot +DoubleParameter +Eclipse2dViewCollection +EclipseCase +EclipseGeometrySelectionItem +ElasticProperties +ElasticPropertyScaling +ElasticPropertyScalingCollection +EnsembleFractureStatistics +EnsembleFractureStatisticsPlot +EnsembleFractureStatisticsPlotCollection +EnsembleStatisticsSurface +EnsembleSurface +EnsembleWellLogStatisticsCurve +EnsembleWellLogs +EnsembleWellLogsCollection +FaciesInitialPressureConfig +FaciesProperties +Fault +Faults +FileSummaryCase +FileSurface +FishbonesCollection +FishbonesMultipleSubs +FishbonesPipeProperties +FlowCharacteristicsPlot +FlowDiagSolution +FlowPlotCollection +FormationNames +FormationNamesCollectionObject +FractureContainment +FractureDefinitionCollection +FractureGroupStatisticsCollection +FractureTemplateCollection +GeoMech2dViewCollection +GeoMechGeometrySelectionItem +GeoMechPart +GeoMechPartCollection +GeoMechPropertyFilter +GeoMechPropertyFilters +GeoMechResultDefinition +GeoMechResultSlot +GeoMechView +GridCaseSurface +GridCollection +GridCrossPlotCurve +GridCrossPlotCurveSet +GridInfo +GridInfoCollection +GridStatisticsPlot +GridStatisticsPlotCollection +GridSummaryCase +GridTimeHistoryCurve +IntegerParameter +Intersection2dView +Intersection2dViewCollection +IntersectionBox +IntersectionResultDefinition +Legend +ListParameter +MainPlotCollection +MdiWindowController +MockModelSettings +ModeledWellPath +MultiPlot +MultiSnapshotDefinition +NonNetLayers +ObservedDataCollection +ObservedFmuRftData +ParameterGroup +ParameterResultCrossPlot +PdmDocument +PdmObjectCollection +PdmObjectGroup +Perforation +PerforationCollection +PlotDataFilterCollection +PlotDataFilterItem +PlotTemplateCollection +PlotTemplateFileItem +PolyLineFilter +PolygonFilter +PolylineTarget +PolylinesFromFileAnnotation +PressureTable +PressureTableItem +PropertyFilter +ResInsightAnalysisModels +ResInsightGeoMechCase +ResInsightGeoMechModels +ResInsightOilField +ResInsightProject +ResampleData +ReservoirCellResultStorage +ReservoirView +ResultDefinition +ResultSlot +ResultStorageEntryInfo +RftAddress +RiaMemoryCleanup +RiaPreferences +RiaPreferencesGeoMech +RiaPreferencesSummary +RiaPreferencesSystem +RiaRegressionTest +RicCaseAndFileExportSettingsUi +RicCellRangeUi +RicCreateEnsembleSurfaceUi +RicCreateEnsembleWellLogUi +RicCreateMultipleWellPathLateralsUi +RicDeleteItemExecData +RicExportCarfinUi +RicExportCompletionDataSettingsUi +RicExportContourMapToTextUi +RicExportEclipseInputGridUi +RicExportLgrUi +RicExportToLasFileObj +RicExportToLasFileResampleUi +RicExportWellPathsUi +RicHoloLensCreateSessionUi +RicHoloLensExportToFolderUi +RicHoloLensServerSettings +RicLinkVisibleViewsFeatureUi +RicPasteAsciiDataToSummaryPlotFeatureUi +RicSaturationPressureUi +RicSaveEclipseInputVisibleCellsUi +RicSelectPlotTemplateUi +RicSelectSummaryPlotUI +RicSelectViewUI +RicSummaryAddressSelection +RicSummaryCurveCalculator +RicSummaryCurveCreator +RicWellPathsUnitSystemSettingsUi +RifReaderSettings +Rim3dWellLogCurveCollection +Rim3dWellLogExtractionCurve +Rim3dWellLogFileCurve +Rim3dWellLogRftCurve +RimAnnotationCollection +RimAnnotationCollectionBase +RimAnnotationGroupCollection +RimAnnotationLineAppearance +RimAnnotationTextAppearance +RimBinaryExportSettings +RimCaseCollection +RimCellFilterCollection +RimCommandExecuteScript +RimCommandIssueFieldChanged +RimCommandObject +RimCommandRouter +RimContourMapView +RimCsvUserData +RimCustomObjectiveFunction +RimCustomObjectiveFunctionCollection +RimCustomObjectiveFunctionWeight +RimDerivedEnsembleCase +RimDerivedEnsembleCaseCollection +RimDialogData +RimEclipseContourMapProjection +RimElementVectorResult +RimEllipseFractureTemplate +RimEnsembleCurveFilter +RimEnsembleCurveFilterCollection +RimEnsembleCurveSet +RimEnsembleCurveSetCollection +RimEnsembleStatistics +RimEnsembleWellLogCurveSet +RimEquilibriumAxisAnnotation +RimExportInputSettings +RimFaultRAPreprocSettings +RimFaultRASettings +RimFaultResultSlot +RimFractureExportSettings +RimGeoMechContourMapProjection +RimGeoMechContourMapView +RimGridCrossPlot +RimGridCrossPlotCollection +RimGridCrossPlotCurveSetNameConfig +RimGridCrossPlotNameConfig +RimIdenticalGridCaseGroup +RimInputProperty +RimInputPropertyCollection +RimInputReservoir +RimIntersectionResultsDefinitionCollection +RimMeasurement +RimMswCompletionParameters +RimMudWeightWindowParameters +RimMultiPlotCollection +RimMultipleLocations +RimMultipleValveLocations +RimNonDarcyPerforationParameters +RimObjectiveFunction +RimObservedEclipseUserData +RimOilFieldEntry +RimOilRegionEntry +RimPlotAxisAnnotation +RimPlotCellFilterCollection +RimPlotCellPropertyFilter +RimPolylineAppearance +RimPolylinesAnnotationInView +RimPolylinesFromFileAnnotationInView +RimProcess +RimReachCircleAnnotation +RimReachCircleAnnotationInView +RimSaturationPressurePlot +RimSaturationPressurePlotCollection +RimStatisticalCalculation +RimStatisticalCollection +RimStimPlanColors +RimStimPlanFractureTemplate +RimStimPlanLegendConfig +RimSummaryCalculation +RimSummaryCalculationCollection +RimSummaryCalculationVariable +RimSummaryCurveCollection +RimSummaryCurveCollectionModifier +RimSurfaceIntersectionBand +RimSurfaceIntersectionCollection +RimSurfaceIntersectionCurve +RimTensorResults +RimTernaryLegendConfig +RimTextAnnotation +RimTextAnnotationInView +RimTimeAxisAnnotation +RimTimeStepFilter +RimUserDefinedPolylinesAnnotationInView +RimVfpPlotCollection +RimViewLinkerCollection +RimViewNameConfig +RimVirtualPerforationResults +RimWellIASettings +RimWellIASettingsCollection +RimWellLogExtractionCurve +RimWellLogExtractionCurveNameConfig +RimWellLogFileCurveNameConfig +RimWellLogPlotNameConfig +RimWellLogRftCurveNameConfig +RimWellLogWbsCurve +RimWellPathEntry +RimWellPathImport +RimWellPathTieIn +RiuCreateMultipleFractionsUi +RiuMultipleFractionsOptions +ScriptLocation +SimWellFracture +SimWellFractureCollection +StimPlanFractureTemplate +StimPlanModel +StimPlanModelCollection +StimPlanModelCurve +StimPlanModelPlot +StimPlanModelPlotCollection +StimPlanModelTemplate +StimPlanModelTemplateCollection +StreamlineInViewCollection +StringParameter +SummaryAddress +SummaryCaseCollection +SummaryCaseSubCollection +SummaryCrossPlot +SummaryCrossPlotCollection +SummaryCurve +SummaryCurveAutoName +SummaryCurveFilter +SummaryFilterSettings +SummaryObservedDataFile +SummaryPageDownloadEntity +SummaryPlot +SummaryPlotCollection +SummaryPlotFilterTextCurveSetEditor +SummaryTimeAxisProperties +SummaryYAxisProperties +Surface +SurfaceCollection +SurfaceInView +SurfaceInViewCollection +SurfaceResultDefinition +TC2 +TestCommand1 +TofAccumulatedPhaseFractionsPlot +TotalWellAllocationPlot +UserDefinedFilter +UserDefinedPolylinesAnnotation +ValveTemplate +ValveTemplateCollection +VfpPlot +View3dOverlayInfoConfig +ViewController +ViewLinker +WbsParameters +Well +WellAllocationPlot +WellAllocationPlotLegend +WellBoreStabilityPlot +WellDistributionPlot +WellDistributionPlotCollection +WellFlowRateCurve +WellLogExtractionCurve +WellLogFile +WellLogFileChannel +WellLogFileCurve +WellLogPlot +WellLogPlotCollection +WellLogPlotTrack +WellLogRftCurve +WellMeasurement +WellMeasurementCurve +WellMeasurementFilePath +WellMeasurementInView +WellMeasurements +WellMeasurementsInView +WellPath +WellPathAicdParameters +WellPathAttribute +WellPathAttributes +WellPathBase +WellPathCompletionSettings +WellPathCompletions +WellPathFracture +WellPathFractureCollection +WellPathGeometry +WellPathGeometryDef +WellPathGroup +WellPathTarget +WellPathValve +WellPaths +WellPltPlot +WellPltPlotCollection +WellRftEnsembleCurveSet +WellRftPlot +WellRftPlotCollection +Wells +cafNamedTreeNode +cafObjectReferenceTreeNode +cafTreeNode +cloneView +closeProject +computeCaseGroupStatistics +createGridCaseGroup +createGridCaseGroupResult +createLgrForCompletions +createMultiPlot +createMultipleFractures +createSaturationPressurePlots +createStatisticsCase +createStatisticsCaseResult +createView +createViewResult +createWbsPlotResult +createWellBoreStabilityPlot +exportContourMapToText +exportFlowCharacteristics +exportLgrForCompletions +exportMsw +exportMultiCaseSnapshots +exportProperty +exportPropertyInViews +exportSimWellFractureCompletions +exportSnapshots +exportVisibleCells +exportWellLogPlotData +exportWellLogPlotDataResult +exportWellPathCompletions +exportWellPaths +importFormationNames +importWellLogFiles +importWellLogFilesResult +importWellPaths +importWellPathsResult +loadCase +loadCaseResult +openProject +replaceCase +replaceMultipleCases +replaceSourceCases +runOctaveScript +saveProject +saveProjectAs +scaleFractureTemplate +setExportFolder +setFractureContainment +setMainWindowSize +setPlotWindowSize +setStartDir +setTimeStep +stackCurves +unstackCurves diff --git a/ApplicationLibCode/Application/CMakeLists_files.cmake b/ApplicationLibCode/Application/CMakeLists_files.cmake index c578402d06..57990caa03 100644 --- a/ApplicationLibCode/Application/CMakeLists_files.cmake +++ b/ApplicationLibCode/Application/CMakeLists_files.cmake @@ -1,74 +1,73 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RiaApplication.h -${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h -${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h -${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h -${CMAKE_CURRENT_LIST_DIR}/RiaDefines.h -${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.h -${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.h -${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSummary.h -${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesGeoMech.h -${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.h -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h -${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.h -${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.h -${CMAKE_CURRENT_LIST_DIR}/RiaFontCache.h -${CMAKE_CURRENT_LIST_DIR}/RiaEclipseFileNameTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaFeatureCommandContext.h -${CMAKE_CURRENT_LIST_DIR}/RiaStringListSerializer.h -${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.h -${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.h -${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.h -${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaApplication.h + ${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h + ${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSummary.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesGeoMech.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSystem.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.h + ${CMAKE_CURRENT_LIST_DIR}/RiaFontCache.h + ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseFileNameTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaFeatureCommandContext.h + ${CMAKE_CURRENT_LIST_DIR}/RiaStringListSerializer.h + ${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.h + ${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RiaApplication.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSummary.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesGeoMech.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFontCache.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaEclipseFileNameTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFeatureCommandContext.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStringListSerializer.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaApplication.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFractureDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferences.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSummary.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesGeoMech.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPreferencesSystem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPorosityModel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveSetDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaRftPltCurveDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaMemoryCleanup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFontCache.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseFileNameTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFeatureCommandContext.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStringListSerializer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaNncDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStimPlanModelDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaResultNames.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaNumberFormat.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -set (QT_MOC_HEADERS -${QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h -${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h -${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h -${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h -${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.h +set(QT_MOC_HEADERS + ${QT_MOC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/RiaConsoleApplication.h + ${CMAKE_CURRENT_LIST_DIR}/RiaGuiApplication.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCompletionTypeCalculationScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaViewRedrawScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaPlotWindowRedrawScheduler.h ) - -source_group( "Application" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "Application" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Application/RiaApplication.cpp b/ApplicationLibCode/Application/RiaApplication.cpp index 53619538b0..4063921982 100644 --- a/ApplicationLibCode/Application/RiaApplication.cpp +++ b/ApplicationLibCode/Application/RiaApplication.cpp @@ -25,6 +25,7 @@ #include "RiaImportEclipseCaseTools.h" #include "RiaLogging.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaProjectModifier.h" #include "RiaSocketServer.h" #include "RiaTextStringTools.h" @@ -37,6 +38,7 @@ #include "RicfCommandFileExecutor.h" #include "RicfCommandObject.h" +#include "CommandRouter/RimCommandRouter.h" #include "Rim2dIntersectionViewCollection.h" #include "RimAnnotationCollection.h" #include "RimAnnotationInViewCollection.h" @@ -46,6 +48,7 @@ #include "RimCompletionTemplateCollection.h" #include "RimEclipseCaseCollection.h" #include "RimEclipseView.h" +#include "RimEnsembleWellLogsCollection.h" #include "RimFormationNamesCollection.h" #include "RimFractureTemplateCollection.h" #include "RimGeoMechCase.h" @@ -148,6 +151,8 @@ RiaApplication::RiaApplication() #endif setLastUsedDialogDirectory( "MULTICASEIMPORT", "/" ); + + m_commandRouter = std::make_unique(); } //-------------------------------------------------------------------------------------------------- @@ -229,7 +234,9 @@ void RiaApplication::createMockModelCustomized() //-------------------------------------------------------------------------------------------------- void RiaApplication::createInputMockModel() { - RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( QStringList( RiaDefines::mockModelBasicInputCase() ) ); + bool createView = true; + RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( QStringList( RiaDefines::mockModelBasicInputCase() ), + createView ); } //-------------------------------------------------------------------------------------------------- @@ -300,6 +307,14 @@ RimProject* RiaApplication::project() return m_project.get(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCommandRouter* RiaApplication::commandRouter() +{ + return m_commandRouter.get(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -324,7 +339,10 @@ bool RiaApplication::openFile( const QString& fileName ) } else if ( int( fileType ) & int( RiaDefines::ImportFileType::ANY_ECLIPSE_FILE ) ) { - loadingSucceded = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{ fileName }, true ); + bool createView = true; + bool createPlot = true; + loadingSucceded = + RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{ fileName }, createPlot, createView ); lastUsedDialogTag = RiaDefines::defaultDirectoryLabel( fileType ); } @@ -499,6 +517,7 @@ bool RiaApplication::loadProject( const QString& projectFileName, } oilField->wellPathCollection->loadDataAndUpdate(); + oilField->ensembleWellLogsCollection->loadDataAndUpdate(); } { @@ -652,6 +671,12 @@ bool RiaApplication::loadProject( const QString& projectFileName, } oilField->annotationCollection()->loadDataAndUpdate(); + + for ( auto well : oilField->wellPathCollection()->allWellPaths() ) + { + for ( auto stimPlan : well->stimPlanModelCollection()->allStimPlanModels() ) + stimPlan->resetAnchorPositionAndThicknessDirection(); + } } // Some procedures in onProjectOpened() may rely on the display model having been created @@ -867,6 +892,7 @@ bool RiaApplication::openOdbCaseFromFile( const QString& fileName, bool applyTim m_project->updateConnectedEditors(); Riu3DMainWindowTools::setExpanded( riv ); + Riu3DMainWindowTools::selectAsCurrentItem( riv ); return true; } @@ -1188,7 +1214,7 @@ void RiaApplication::applyPreferences() this->project()->updateConnectedEditors(); } - caf::ProgressInfoStatic::setEnabled( m_preferences->showProgressBar() ); + caf::ProgressInfoStatic::setEnabled( RiaPreferencesSystem::current()->showProgressBar() ); m_preferences->writePreferencesToApplicationStore(); } @@ -1335,7 +1361,7 @@ int RiaApplication::launchUnitTests() // // Use the gtest filter to execute a subset of tests - QString filterText = RiaPreferences::current()->gtestFilter(); + QString filterText = RiaPreferencesSystem::current()->gtestFilter(); if ( !filterText.isEmpty() ) { ::testing::GTEST_FLAG( filter ) = filterText.toStdString(); diff --git a/ApplicationLibCode/Application/RiaApplication.h b/ApplicationLibCode/Application/RiaApplication.h index b3d3313224..e26112b88d 100644 --- a/ApplicationLibCode/Application/RiaApplication.h +++ b/ApplicationLibCode/Application/RiaApplication.h @@ -52,6 +52,7 @@ class RiaSocketServer; class RigEclipseCaseData; class RimCommandObject; +class RimCommandRouter; class RimEclipseCase; class RimEclipseView; class RimWellPath; @@ -115,7 +116,8 @@ class RiaApplication RimGridView* activeMainOrComparisonGridView(); int currentScriptCaseId() const; - RimProject* project(); + RimProject* project(); + RimCommandRouter* commandRouter(); void createMockModel(); void createResultsMockModel(); @@ -234,6 +236,8 @@ class RiaApplication caf::PdmPointer m_activeReservoirView; std::unique_ptr m_project; + std::unique_ptr m_commandRouter; + QPointer m_socketServer; std::unique_ptr m_workerProcess; diff --git a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp index 1cc4c0b9ed..3730f07273 100644 --- a/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp +++ b/ApplicationLibCode/Application/RiaCompletionTypeCalculationScheduler.cpp @@ -114,12 +114,6 @@ void RiaCompletionTypeCalculationScheduler::slotRecalculateCompletionType() Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); - QModelIndex mi; - if ( RiuMainWindow::instance() ) - { - mi = RiuMainWindow::instance()->projectTreeView()->treeView()->currentIndex(); - } - for ( RimEclipseCase* eclipseCase : uniqueCases ) { if ( eclipseCase ) @@ -148,11 +142,6 @@ void RiaCompletionTypeCalculationScheduler::slotRecalculateCompletionType() RiuMainWindow::instance()->setActiveViewer( activeView->viewer()->layoutWidget() ); } } - - if ( mi.isValid() && RiuMainWindow::instance() ) - { - RiuMainWindow::instance()->projectTreeView()->treeView()->setCurrentIndex( mi ); - } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaConsoleApplication.cpp b/ApplicationLibCode/Application/RiaConsoleApplication.cpp index 56758e0ff7..4f4fe89698 100644 --- a/ApplicationLibCode/Application/RiaConsoleApplication.cpp +++ b/ApplicationLibCode/Application/RiaConsoleApplication.cpp @@ -22,6 +22,7 @@ #include "RiaPreferences.h" #include "RiaProjectModifier.h" #include "RiaSocketServer.h" +#include "RiaVersionInfo.h" #include "RicImportGeneralDataFeature.h" @@ -127,6 +128,15 @@ RiaApplication::ApplicationStatus RiaConsoleApplication::handleArguments( gsl::n return RiaApplication::ApplicationStatus::EXIT_COMPLETED; } + if ( progOpt->option( "version" ) ) + { + QString text = QString( STRPRODUCTVER ) + "\n"; + + this->showFormattedTextInMessageBoxOrConsole( text ); + + return RiaApplication::ApplicationStatus::EXIT_COMPLETED; + } + // Code generation // ----------------- if ( cvf::Option o = progOpt->option( "generate" ) ) @@ -275,7 +285,9 @@ RiaApplication::ApplicationStatus RiaConsoleApplication::handleArguments( gsl::n QStringList fileNames = RicImportGeneralDataFeature::fileNamesFromCaseNames( cvfqt::Utils::toQStringList( o.values() ) ); - RicImportGeneralDataFeature::openEclipseFilesFromFileNames( fileNames, true ); + bool createView = true; + bool createPlot = true; + RicImportGeneralDataFeature::openEclipseFilesFromFileNames( fileNames, createPlot, createView ); } if ( cvf::Option o = progOpt->option( "commandFile" ) ) diff --git a/ApplicationLibCode/Application/RiaGuiApplication.cpp b/ApplicationLibCode/Application/RiaGuiApplication.cpp index 2df91a9845..2667055716 100644 --- a/ApplicationLibCode/Application/RiaGuiApplication.cpp +++ b/ApplicationLibCode/Application/RiaGuiApplication.cpp @@ -28,6 +28,7 @@ #include "RiaLogging.h" #include "RiaPlotWindowRedrawScheduler.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaProjectModifier.h" #include "RiaRegressionTestRunner.h" #include "RiaSocketServer.h" @@ -239,7 +240,8 @@ QString RiaGuiApplication::promptForProjectSaveAsFileName() const //-------------------------------------------------------------------------------------------------- bool RiaGuiApplication::askUserToSaveModifiedProject() { - if ( m_preferences->showProjectChangedDialog() && caf::PdmUiModelChangeDetector::instance()->isModelChanged() ) + if ( RiaPreferencesSystem::current()->showProjectChangedDialog() && + caf::PdmUiModelChangeDetector::instance()->isModelChanged() ) { QMessageBox msgBox; msgBox.setIcon( QMessageBox::Question ); @@ -377,7 +379,7 @@ RimViewWindow* RiaGuiApplication::activePlotWindow() const //-------------------------------------------------------------------------------------------------- bool RiaGuiApplication::useShaders() const { - if ( !m_preferences->useShaders() ) return false; + if ( !RiaPreferencesSystem::current()->useShaders() ) return false; bool isShadersSupported = true; if ( platformName() != "offscreen" ) // Avoid opengl access if we are in qt offscreen mode @@ -674,8 +676,11 @@ RiaApplication::ApplicationStatus RiaGuiApplication::handleArguments( gsl::not_n QStringList fileNames = RicImportGeneralDataFeature::fileNamesFromCaseNames( cvfqt::Utils::toQStringList( o.values() ) ); + bool createView = true; + bool createPlot = true; + RicImportGeneralDataFeature::OpenCaseResults results = - RicImportGeneralDataFeature::openEclipseFilesFromFileNames( fileNames, true ); + RicImportGeneralDataFeature::openEclipseFilesFromFileNames( fileNames, createPlot, createView ); if ( results && !results.eclipseSummaryFiles.empty() ) { getOrCreateAndShowMainPlotWindow(); @@ -1350,7 +1355,7 @@ void RiaGuiApplication::applyGuiPreferences( const RiaPreferences* if ( m_activeReservoirView && m_activeReservoirView->viewer() ) { m_activeReservoirView->viewer()->updateNavigationPolicy(); - m_activeReservoirView->viewer()->enablePerfInfoHud( m_preferences->show3dInformation() ); + m_activeReservoirView->viewer()->enablePerfInfoHud( RiaPreferencesSystem::current()->show3dInformation() ); } if ( useShaders() ) @@ -1364,10 +1369,11 @@ void RiaGuiApplication::applyGuiPreferences( const RiaPreferences* if ( m_mainWindow && m_mainWindow->projectTreeView() ) { - m_mainWindow->projectTreeView()->enableAppendOfClassNameToUiItemText( m_preferences->appendClassNameToUiText() ); + m_mainWindow->projectTreeView()->enableAppendOfClassNameToUiItemText( + RiaPreferencesSystem::current()->appendClassNameToUiText() ); if ( mainPlotWindow() ) mainPlotWindow()->projectTreeView()->enableAppendOfClassNameToUiItemText( - m_preferences->appendClassNameToUiText() ); + RiaPreferencesSystem::current()->appendClassNameToUiText() ); } for ( auto fontObject : defaultFontObjects ) @@ -1533,7 +1539,7 @@ void RiaGuiApplication::applyGuiPreferences( const RiaPreferences* uiItem->updateConnectedEditors(); } } - caf::PdmUiItem::enableExtraDebugText( m_preferences->appendFieldKeywordToToolTipText() ); + caf::PdmUiItem::enableExtraDebugText( RiaPreferencesSystem::current()->appendFieldKeywordToToolTipText() ); if ( oldPreferences ) { diff --git a/ApplicationLibCode/Application/RiaMemoryCleanup.cpp b/ApplicationLibCode/Application/RiaMemoryCleanup.cpp index 1401d48966..ae2b4f0af2 100644 --- a/ApplicationLibCode/Application/RiaMemoryCleanup.cpp +++ b/ApplicationLibCode/Application/RiaMemoryCleanup.cpp @@ -149,18 +149,23 @@ std::vector RiaMemoryCleanup::selectedEclipseResults() std::set RiaMemoryCleanup::findGeoMechCaseResultsInUse() const { std::set resultsInUse; - RimGeoMechCase* geoMechCase = dynamic_cast( m_case() ); + + auto geoMechCase = dynamic_cast( m_case() ); if ( geoMechCase ) { std::vector geoMechResults; geoMechCase->descendantsIncludingThisOfType( geoMechResults ); for ( RimFemResultObserver* resultDef : geoMechResults ) { - caf::PdmField* field = dynamic_cast*>( resultDef->objectToggleField() ); - if ( !field || ( *field )() ) + auto pdmObj = dynamic_cast( resultDef ); + if ( pdmObj ) { - std::vector required = resultDef->observedResults(); - resultsInUse.insert( required.begin(), required.end() ); + auto field = dynamic_cast*>( pdmObj->objectToggleField() ); + if ( !field || ( *field )() ) + { + std::vector required = resultDef->observedResults(); + resultsInUse.insert( required.begin(), required.end() ); + } } } } diff --git a/ApplicationLibCode/Application/RiaPreferences.cpp b/ApplicationLibCode/Application/RiaPreferences.cpp index b0beb154f6..080a441376 100644 --- a/ApplicationLibCode/Application/RiaPreferences.cpp +++ b/ApplicationLibCode/Application/RiaPreferences.cpp @@ -25,6 +25,7 @@ #include "RiaColorTables.h" #include "RiaPreferencesGeoMech.h" #include "RiaPreferencesSummary.h" +#include "RiaPreferencesSystem.h" #include "RiaValidRegExpValidator.h" #include "RifReaderSettings.h" @@ -173,46 +174,6 @@ RiaPreferences::RiaPreferences() CAF_PDM_InitFieldNoDefault( &defaultWellLabelFontSize, "defaultWellLabelFontSizePt", "Well Label Font Size", "", "", "" ); CAF_PDM_InitFieldNoDefault( &defaultPlotFontSize, "defaultPlotFontSizePt", "Plot Font Size", "", "", "" ); - CAF_PDM_InitField( &showLasCurveWithoutTvdWarning, - "showLasCurveWithoutTvdWarning", - true, - "Show LAS Curve Without TVD Warning", - "", - "", - "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &showLasCurveWithoutTvdWarning ); - - CAF_PDM_InitField( &m_useShaders, "useShaders", true, "Use Shaders", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_useShaders ); - CAF_PDM_InitField( &m_showHud, "showHud", false, "Show 3D Information", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showHud ); - CAF_PDM_InitField( &m_appendClassNameToUiText, "appendClassNameToUiText", false, "Show Class Names", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_appendClassNameToUiText ); - - CAF_PDM_InitField( &m_appendFieldKeywordToToolTipText, - "appendFieldKeywordToToolTipText", - false, - "Show Field Keyword in ToolTip", - "", - "", - "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_appendFieldKeywordToToolTipText ); - - CAF_PDM_InitField( &m_showViewIdInProjectTree, "showViewIdInTree", false, "Show View Id in Project Tree", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showViewIdInProjectTree ); - - CAF_PDM_InitField( &m_showTestToolbar, "showTestToolbar", false, "Enable Test Toolbar", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showTestToolbar ); - - CAF_PDM_InitField( &m_includeFractureDebugInfoFile, - "includeFractureDebugInfoFile", - false, - "Include Fracture Debug Info for Completion Export", - "", - "", - "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_includeFractureDebugInfoFile ); - CAF_PDM_InitField( &m_showLegendBackground, "showLegendBackground", true, "Show Box around Legends", "", "", "" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showLegendBackground ); @@ -240,10 +201,6 @@ RiaPreferences::RiaPreferences() CAF_PDM_InitField( &loadAndShowSoil, "loadAndShowSoil", true, "Load and Show SOIL", "", "", "" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &loadAndShowSoil ); - CAF_PDM_InitFieldNoDefault( &m_holoLensExportFolder, "holoLensExportFolder", "HoloLens Export Folder", "", "", "" ); - m_holoLensExportFolder.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); - m_holoLensExportFolder.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &holoLensDisableCertificateVerification, "holoLensDisableCertificateVerification", false, @@ -261,15 +218,6 @@ RiaPreferences::RiaPreferences() "", "" ); - CAF_PDM_InitField( &m_showProjectChangedDialog, - "showProjectChangedDialog", - true, - "Show 'Project has changed' dialog", - "", - "", - "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showProjectChangedDialog ); - CAF_PDM_InitFieldNoDefault( &m_readerSettings, "readerSettings", "Reader Settings", "", "", "" ); m_readerSettings = new RifReaderSettings; CAF_PDM_InitFieldNoDefault( &m_dateFormat, "dateFormat", "Date Format", "", "", "" ); @@ -280,9 +228,6 @@ RiaPreferences::RiaPreferences() m_timeFormat.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); m_timeFormat = RiaQDateTimeTools::supportedTimeFormats().front(); - CAF_PDM_InitField( &m_showProgressBar, "showProgressBar", true, "Show Progress Bar", "", "", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showProgressBar ); - CAF_PDM_InitField( &m_useUndoRedo, "useUndoRedo", true, "Enable Undo/Redo for Property Editor changes", "", "", "" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_useUndoRedo ); @@ -309,8 +254,6 @@ RiaPreferences::RiaPreferences() CAF_PDM_InitField( &m_openExportedPdfInViewer, "openExportedPdfInViewer", false, "Open Exported PDF in Viewer", "", "", "" ); caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_openExportedPdfInViewer ); - CAF_PDM_InitField( &m_gtestFilter, "gtestFilter", QString(), "Unit Test Filter (gtest)", "", "", "" ); - CAF_PDM_InitField( &m_surfaceImportResamplingDistance, "SurfaceImportResamplingDistance", 100.0, @@ -336,6 +279,9 @@ RiaPreferences::RiaPreferences() CAF_PDM_InitFieldNoDefault( &m_geoMechPreferences, "geoMechPreferences", "geoMechPreferences", "", "", "" ); m_geoMechPreferences = new RiaPreferencesGeoMech; + + CAF_PDM_InitFieldNoDefault( &m_systemPreferences, "systemPreferences", "systemPreferences", "", "", "" ); + m_systemPreferences = new RiaPreferencesSystem; } //-------------------------------------------------------------------------------------------------- @@ -375,14 +321,6 @@ void RiaPreferences::defineEditorAttribute( const caf::PdmFieldHandle* field, } } - if ( field == &m_holoLensExportFolder ) - { - caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); - if ( myAttr ) - { - myAttr->m_selectDirectory = true; - } - } if ( field == &defaultSceneFontSize || field == &defaultWellLabelFontSize || field == &defaultAnnotationFontSize || field == &defaultPlotFontSize ) { @@ -435,7 +373,6 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& caf::PdmUiGroup* otherGroup = uiOrdering.addNewGroup( "Other" ); otherGroup->add( &ssihubAddress ); - otherGroup->add( &showLasCurveWithoutTvdWarning ); otherGroup->add( &holoLensDisableCertificateVerification ); otherGroup->add( &m_useUndoRedo ); } @@ -522,25 +459,7 @@ void RiaPreferences::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& } else if ( RiaApplication::enableDevelopmentFeatures() && uiConfigName == RiaPreferences::tabNameSystem() ) { - { - caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Project Tree" ); - group->add( &m_appendClassNameToUiText ); - group->add( &m_appendFieldKeywordToToolTipText ); - group->add( &m_showViewIdInProjectTree ); - } - - { - caf::PdmUiGroup* group = uiOrdering.addNewGroup( "3D View" ); - group->add( &m_useShaders ); - group->add( &m_showHud ); - } - - uiOrdering.add( &m_gtestFilter ); - uiOrdering.add( &m_showProgressBar ); - uiOrdering.add( &m_showProjectChangedDialog ); - uiOrdering.add( &m_showTestToolbar ); - uiOrdering.add( &m_includeFractureDebugInfoFile ); - uiOrdering.add( &m_holoLensExportFolder ); + m_systemPreferences()->uiOrdering( uiConfigName, uiOrdering ); } uiOrdering.skipRemainingFields( true ); @@ -733,96 +652,6 @@ const RifReaderSettings* RiaPreferences::readerSettings() const return m_readerSettings; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::appendClassNameToUiText() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_appendClassNameToUiText(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::appendFieldKeywordToToolTipText() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_appendFieldKeywordToToolTipText(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::showViewIdInProjectTree() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_showViewIdInProjectTree(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::showTestToolbar() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_showTestToolbar(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::includeFractureDebugInfoFile() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_includeFractureDebugInfoFile(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::showProjectChangedDialog() const -{ - if ( !RiaApplication::enableDevelopmentFeatures() ) - { - return true; - } - - return m_showProjectChangedDialog(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferences::holoLensExportFolder() const -{ - return m_holoLensExportFolder(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::useShaders() const -{ - if ( !RiaApplication::enableDevelopmentFeatures() ) - { - return true; - } - - return m_useShaders(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::show3dInformation() const -{ - return RiaApplication::enableDevelopmentFeatures() && m_showHud(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaPreferences::gtestFilter() const -{ - return m_gtestFilter(); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -916,14 +745,6 @@ void RiaPreferences::setDefaultPlotTemplatePath( const QString& templatePath ) m_defaultPlotTemplate = templatePath; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RiaPreferences::showProgressBar() const -{ - return m_showProgressBar; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1076,6 +897,14 @@ RiaPreferencesSummary* RiaPreferences::summaryPreferences() const return m_summaryPreferences(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaPreferencesSystem* RiaPreferences::systemPreferences() const +{ + return m_systemPreferences(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaPreferences.h b/ApplicationLibCode/Application/RiaPreferences.h index 8cc108106d..eff3d69aac 100644 --- a/ApplicationLibCode/Application/RiaPreferences.h +++ b/ApplicationLibCode/Application/RiaPreferences.h @@ -42,6 +42,7 @@ class RifReaderSettings; class RiaPreferencesSummary; class RiaPreferencesGeoMech; +class RiaPreferencesSystem; //-------------------------------------------------------------------------------------------------- /// @@ -70,18 +71,7 @@ class RiaPreferences : public caf::PdmObject const RifReaderSettings* readerSettings() const; - // Debug settings - bool appendClassNameToUiText() const; - bool appendFieldKeywordToToolTipText() const; - bool showViewIdInProjectTree() const; - bool showTestToolbar() const; - bool includeFractureDebugInfoFile() const; - bool showProjectChangedDialog() const; - QString holoLensExportFolder() const; - bool useShaders() const; - bool show3dInformation() const; - QString gtestFilter() const; - bool useUndoRedo() const; + bool useUndoRedo() const; const QString& dateFormat() const; const QString& timeFormat() const; @@ -93,7 +83,6 @@ class RiaPreferences : public caf::PdmObject void appendPlotTemplateFolders( const QString& folder ); QString defaultPlotTemplateAbsolutePath() const; void setDefaultPlotTemplatePath( const QString& templatePath ); - bool showProgressBar() const; bool openExportedPdfInViewer() const; RiaDefines::ThemeEnum guiTheme() const; @@ -123,6 +112,7 @@ class RiaPreferences : public caf::PdmObject RiaPreferencesGeoMech* geoMechPreferences() const; RiaPreferencesSummary* summaryPreferences() const; + RiaPreferencesSystem* systemPreferences() const; public: caf::PdmField enableGrpcServer; @@ -139,7 +129,6 @@ class RiaPreferences : public caf::PdmObject caf::PdmField defaultFaultGridLineColors; caf::PdmField defaultViewerBackgroundColor; caf::PdmField defaultWellLabelColor; - caf::PdmField showLasCurveWithoutTvdWarning; caf::PdmField defaultSceneFontSize; caf::PdmField defaultWellLabelFontSize; @@ -180,23 +169,10 @@ class RiaPreferences : public caf::PdmObject private: caf::PdmChildField m_readerSettings; - caf::PdmField m_appendClassNameToUiText; - caf::PdmField m_appendFieldKeywordToToolTipText; - caf::PdmField m_showViewIdInProjectTree; - caf::PdmField m_useShaders; - caf::PdmField m_showHud; - - caf::PdmField m_showProjectChangedDialog; - - caf::PdmField m_showTestToolbar; - caf::PdmField m_includeFractureDebugInfoFile; - caf::PdmField m_holoLensExportFolder; caf::PdmField m_dateFormat; caf::PdmField m_timeFormat; - caf::PdmField m_showProgressBar; - caf::PdmField m_gtestFilter; - caf::PdmField m_useUndoRedo; + caf::PdmField m_useUndoRedo; caf::PdmField> m_guiTheme; @@ -228,6 +204,9 @@ class RiaPreferences : public caf::PdmObject // Summary data caf::PdmChildField m_summaryPreferences; + // System settings + caf::PdmChildField m_systemPreferences; + // 3d view caf::PdmField> m_defaultMeshModeType; caf::PdmField> m_navigationPolicy; diff --git a/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp b/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp index e4e1ec2833..cb356bc591 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesGeoMech.cpp @@ -64,6 +64,14 @@ RiaPreferencesGeoMech::RiaPreferencesGeoMech() m_geomechFRADefaultAdvXML.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); m_geomechFRADefaultAdvXML.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + CAF_PDM_InitFieldNoDefault( &m_geomechWIADefaultXML, "geomechWIADefaultXML", "Default Parameter XML File", "", "", "" ); + m_geomechWIADefaultXML.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + m_geomechWIADefaultXML.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + + CAF_PDM_InitFieldNoDefault( &m_geomechWIACommand, "geomechWIACommand", "Command to run", "", "", "" ); + m_geomechWIACommand.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + m_geomechWIACommand.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + CAF_PDM_InitField( &m_keepTemporaryFiles, "keepTemporaryFile", false, @@ -88,18 +96,22 @@ RiaPreferencesGeoMech* RiaPreferencesGeoMech::current() void RiaPreferencesGeoMech::appendItems( caf::PdmUiOrdering& uiOrdering ) const { caf::PdmUiGroup* faultRAGroup = uiOrdering.addNewGroup( "Fault Reactivation Assessment" ); - caf::PdmUiGroup* cmdGroup = faultRAGroup->addNewGroup( "Commands (without parameters)" ); + caf::PdmUiGroup* cmdFRAGroup = faultRAGroup->addNewGroup( "Commands (without parameters)" ); - cmdGroup->add( &m_geomechFRAPreprocCommand ); - cmdGroup->add( &m_geomechFRAPostprocCommand ); - cmdGroup->add( &m_geomechFRAMacrisCommand ); + cmdFRAGroup->add( &m_geomechFRAPreprocCommand ); + cmdFRAGroup->add( &m_geomechFRAPostprocCommand ); + cmdFRAGroup->add( &m_geomechFRAMacrisCommand ); - caf::PdmUiGroup* paramGroup = faultRAGroup->addNewGroup( "Parameters" ); - paramGroup->add( &m_geomechFRADefaultBasicXML ); - paramGroup->add( &m_geomechFRADefaultAdvXML ); + caf::PdmUiGroup* paramFRAGroup = faultRAGroup->addNewGroup( "Parameters" ); + paramFRAGroup->add( &m_geomechFRADefaultBasicXML ); + paramFRAGroup->add( &m_geomechFRADefaultAdvXML ); - caf::PdmUiGroup* settingsGroup = faultRAGroup->addNewGroup( "Settings" ); - settingsGroup->add( &m_keepTemporaryFiles ); + caf::PdmUiGroup* wellIAGroup = uiOrdering.addNewGroup( "Well Integrity Analysis" ); + wellIAGroup->add( &m_geomechWIACommand ); + wellIAGroup->add( &m_geomechWIADefaultXML ); + + caf::PdmUiGroup* commonGroup = uiOrdering.addNewGroup( "Common Settings" ); + commonGroup->add( &m_keepTemporaryFiles ); } //-------------------------------------------------------------------------------------------------- @@ -149,6 +161,22 @@ QString RiaPreferencesGeoMech::geomechFRADefaultAdvXML() const return m_geomechFRADefaultAdvXML; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferencesGeoMech::geomechWIACommand() const +{ + return m_geomechWIACommand; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferencesGeoMech::geomechWIADefaultXML() const +{ + return m_geomechWIADefaultXML; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -169,12 +197,31 @@ bool RiaPreferencesGeoMech::validateFRASettings() const files << geomechFRADefaultBasicXML(); files << geomechFRADefaultAdvXML(); + return filesExists( files ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesGeoMech::validateWIASettings() const +{ + QStringList files; + files << geomechWIACommand(); + files << geomechWIADefaultXML(); + + return filesExists( files ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesGeoMech::filesExists( QStringList& files ) const +{ for ( int i = 0; i < files.size(); i++ ) { if ( files[i].isEmpty() ) return false; QFile file( files[i] ); if ( !file.exists() ) return false; } - return true; } diff --git a/ApplicationLibCode/Application/RiaPreferencesGeoMech.h b/ApplicationLibCode/Application/RiaPreferencesGeoMech.h index 6f304b7e77..267fb77068 100644 --- a/ApplicationLibCode/Application/RiaPreferencesGeoMech.h +++ b/ApplicationLibCode/Application/RiaPreferencesGeoMech.h @@ -35,7 +35,9 @@ class RiaPreferencesGeoMech : public caf::PdmObject static RiaPreferencesGeoMech* current(); void appendItems( caf::PdmUiOrdering& uiOrdering ) const; + bool validateFRASettings() const; + bool validateWIASettings() const; // geomech settings QString geomechFRAPreprocCommand() const; @@ -43,16 +45,26 @@ class RiaPreferencesGeoMech : public caf::PdmObject QString geomechFRAMacrisCommand() const; QString geomechFRADefaultBasicXML() const; QString geomechFRADefaultAdvXML() const; - bool keepTemporaryFiles() const; + + QString geomechWIADefaultXML() const; + QString geomechWIACommand() const; + + bool keepTemporaryFiles() const; protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; private: + bool filesExists( QStringList& filelist ) const; + caf::PdmField m_geomechFRAPreprocCommand; caf::PdmField m_geomechFRAPostprocCommand; caf::PdmField m_geomechFRAMacrisCommand; caf::PdmField m_geomechFRADefaultBasicXML; caf::PdmField m_geomechFRADefaultAdvXML; - caf::PdmField m_keepTemporaryFiles; + + caf::PdmField m_geomechWIADefaultXML; + caf::PdmField m_geomechWIACommand; + + caf::PdmField m_keepTemporaryFiles; }; diff --git a/ApplicationLibCode/Application/RiaPreferencesSummary.cpp b/ApplicationLibCode/Application/RiaPreferencesSummary.cpp index 76dcae78ea..c57f0b1029 100644 --- a/ApplicationLibCode/Application/RiaPreferencesSummary.cpp +++ b/ApplicationLibCode/Application/RiaPreferencesSummary.cpp @@ -52,8 +52,8 @@ void RiaPreferencesSummary::SummaryReaderModeType::setUp() { addItem( RiaPreferencesSummary::SummaryReaderMode::LIBECL, "LIBECL", "UNSMRY (libecl)" ); addItem( RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON, "HDF5_OPM_COMMON", "h5 (HDF5)" ); - addItem( RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON, "OPM_COMMON", "LODSMRY (opm-common)" ); - setDefault( RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON ); + addItem( RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON, "OPM_COMMON", "ESMRY (opm-common)" ); + setDefault( RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON ); } } // namespace caf @@ -110,23 +110,23 @@ RiaPreferencesSummary::RiaPreferencesSummary() "Semicolon separated list of filters used to create curves in new summary plots", "" ); - CAF_PDM_InitField( &m_createOptimizedSummaryDataFile, - "createOptimizedSummaryDataFile", - false, - "Create LODSMRY Summary Files", + CAF_PDM_InitField( &m_createEnhancedSummaryDataFile, + "createEnhancedSummaryDataFile", + true, + "Create ESMRY Summary Files", "", - "If not present, create summary file with extension '*.LODSMRY'", + "If not present, create summary file with extension '*.ESMRY'", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_createOptimizedSummaryDataFile ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_createEnhancedSummaryDataFile ); - CAF_PDM_InitField( &m_useOptimizedSummaryDataFile, - "useOptimizedSummaryDataFile", + CAF_PDM_InitField( &m_useEnhancedSummaryDataFile, + "useEnhancedSummaryDataFile", true, - "Use LODSMRY Summary Files", + "Use ESMRY Files", "", - "If present, import summary files with extension '*.LODSMRY'", + "If present, import summary files with extension '*.ESMRY'", "" ); - caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_useOptimizedSummaryDataFile ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_useEnhancedSummaryDataFile ); CAF_PDM_InitField( &m_createH5SummaryDataFile, "createH5SummaryDataFile", @@ -194,17 +194,17 @@ RiaPreferencesSummary::SummaryReaderMode RiaPreferencesSummary::summaryDataReade //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaPreferencesSummary::useOptimizedSummaryDataFiles() const +bool RiaPreferencesSummary::useEnhancedSummaryDataFiles() const { - return m_useOptimizedSummaryDataFile(); + return m_useEnhancedSummaryDataFile(); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaPreferencesSummary::createOptimizedSummaryDataFiles() const +bool RiaPreferencesSummary::createEnhancedSummaryDataFiles() const { - return m_createOptimizedSummaryDataFile(); + return m_createEnhancedSummaryDataFile(); } //-------------------------------------------------------------------------------------------------- @@ -341,8 +341,8 @@ void RiaPreferencesSummary::defineUiOrdering( QString uiConfigName, caf::PdmUiOr if ( m_summaryReader == SummaryReaderMode::OPM_COMMON ) { - uiOrdering.add( &m_useOptimizedSummaryDataFile ); - uiOrdering.add( &m_createOptimizedSummaryDataFile ); + uiOrdering.add( &m_useEnhancedSummaryDataFile ); + uiOrdering.add( &m_createEnhancedSummaryDataFile ); } else if ( m_summaryReader == SummaryReaderMode::HDF5_OPM_COMMON ) { diff --git a/ApplicationLibCode/Application/RiaPreferencesSummary.h b/ApplicationLibCode/Application/RiaPreferencesSummary.h index df5cdbf373..1cf0a82cd9 100644 --- a/ApplicationLibCode/Application/RiaPreferencesSummary.h +++ b/ApplicationLibCode/Application/RiaPreferencesSummary.h @@ -60,8 +60,8 @@ class RiaPreferencesSummary : public caf::PdmObject static RiaPreferencesSummary* current(); SummaryReaderMode summaryDataReader() const; - bool useOptimizedSummaryDataFiles() const; - bool createOptimizedSummaryDataFiles() const; + bool useEnhancedSummaryDataFiles() const; + bool createEnhancedSummaryDataFiles() const; bool createH5SummaryDataFiles() const; bool checkH5SummaryDataTimeStamp() const; @@ -98,8 +98,8 @@ class RiaPreferencesSummary : public caf::PdmObject caf::PdmField m_showSummaryTimeAsLongString; caf::PdmField m_useMultipleThreadsWhenLoadingSummaryCases; - caf::PdmField m_createOptimizedSummaryDataFile; - caf::PdmField m_useOptimizedSummaryDataFile; + caf::PdmField m_createEnhancedSummaryDataFile; + caf::PdmField m_useEnhancedSummaryDataFile; caf::PdmField m_createH5SummaryDataFile; caf::PdmField m_checkH5FileTimeStamp; diff --git a/ApplicationLibCode/Application/RiaPreferencesSystem.cpp b/ApplicationLibCode/Application/RiaPreferencesSystem.cpp new file mode 100644 index 0000000000..33d2e09749 --- /dev/null +++ b/ApplicationLibCode/Application/RiaPreferencesSystem.cpp @@ -0,0 +1,274 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaApplication.h" + +#include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" + +#include "cafPdmUiCheckBoxEditor.h" +#include "cafPdmUiFilePathEditor.h" + +namespace caf +{ +template <> +void RiaPreferencesSystem::EclipseTextFileReaderModeType::setUp() +{ + addItem( RiaPreferencesSystem::EclipseTextFileReaderMode::MEMORY_MAPPED_FILE, + "MEMORY_MAPPED_FILE", + "Memory Mapped File Import" ); + addItem( RiaPreferencesSystem::EclipseTextFileReaderMode::FILE, "FILE", "Default File Import" ); + + setDefault( RiaPreferencesSystem::EclipseTextFileReaderMode::FILE ); +} + +} // namespace caf + +CAF_PDM_SOURCE_INIT( RiaPreferencesSystem, "RiaPreferencesSystem" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaPreferencesSystem::RiaPreferencesSystem() +{ + CAF_PDM_InitField( &m_useShaders, "useShaders", true, "Use Shaders", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_useShaders ); + CAF_PDM_InitField( &m_showHud, "showHud", false, "Show 3D Information", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showHud ); + CAF_PDM_InitField( &m_appendClassNameToUiText, "appendClassNameToUiText", false, "Show Class Names", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_appendClassNameToUiText ); + + CAF_PDM_InitField( &m_appendFieldKeywordToToolTipText, + "appendFieldKeywordToToolTipText", + false, + "Show Field Keyword in ToolTip", + "", + "", + "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_appendFieldKeywordToToolTipText ); + + CAF_PDM_InitField( &m_showViewIdInProjectTree, "showViewIdInTree", false, "Show View Id in Project Tree", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showViewIdInProjectTree ); + + CAF_PDM_InitField( &m_showTestToolbar, "showTestToolbar", false, "Enable Test Toolbar", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showTestToolbar ); + + CAF_PDM_InitField( &m_includeFractureDebugInfoFile, + "includeFractureDebugInfoFile", + false, + "Include Fracture Debug Info for Completion Export", + "", + "", + "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_includeFractureDebugInfoFile ); + + CAF_PDM_InitFieldNoDefault( &m_holoLensExportFolder, "holoLensExportFolder", "HoloLens Export Folder", "", "", "" ); + m_holoLensExportFolder.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); + m_holoLensExportFolder.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_showProjectChangedDialog, + "showProjectChangedDialog", + true, + "Show 'Project has changed' dialog", + "", + "", + "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showProjectChangedDialog ); + + CAF_PDM_InitField( &m_showProgressBar, "showProgressBar", true, "Show Progress Bar", "", "", "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_showProgressBar ); + + CAF_PDM_InitField( &m_gtestFilter, "gtestFilter", QString(), "Unit Test Filter (gtest)", "", "", "" ); + + CAF_PDM_InitField( &m_eclipseReaderMode, + "eclipseReaderMode", + EclipseTextFileReaderModeType( RiaPreferencesSystem::EclipseTextFileReaderMode::FILE ), + "Eclipse Text File Import mode (GRDECL)", + "", + "", + "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaPreferencesSystem* RiaPreferencesSystem::current() +{ + return RiaApplication::instance()->preferences()->systemPreferences(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::appendClassNameToUiText() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_appendClassNameToUiText(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::appendFieldKeywordToToolTipText() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_appendFieldKeywordToToolTipText(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::showViewIdInProjectTree() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_showViewIdInProjectTree(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::showTestToolbar() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_showTestToolbar(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::includeFractureDebugInfoFile() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_includeFractureDebugInfoFile(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::showProjectChangedDialog() const +{ + if ( !RiaApplication::enableDevelopmentFeatures() ) + { + return true; + } + + return m_showProjectChangedDialog(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferencesSystem::holoLensExportFolder() const +{ + return m_holoLensExportFolder(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::useShaders() const +{ + if ( !RiaApplication::enableDevelopmentFeatures() ) + { + return true; + } + + return m_useShaders(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::show3dInformation() const +{ + return RiaApplication::enableDevelopmentFeatures() && m_showHud(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaPreferencesSystem::gtestFilter() const +{ + return m_gtestFilter(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaPreferencesSystem::showProgressBar() const +{ + return m_showProgressBar(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaPreferencesSystem::EclipseTextFileReaderMode RiaPreferencesSystem::eclipseTextFileReaderMode() const +{ + return m_eclipseReaderMode(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaPreferencesSystem::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + { + caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Project Tree" ); + group->add( &m_appendClassNameToUiText ); + group->add( &m_appendFieldKeywordToToolTipText ); + group->add( &m_showViewIdInProjectTree ); + } + + { + caf::PdmUiGroup* group = uiOrdering.addNewGroup( "3D View" ); + group->add( &m_useShaders ); + group->add( &m_showHud ); + } + + uiOrdering.add( &m_gtestFilter ); + uiOrdering.add( &m_showProjectChangedDialog ); + uiOrdering.add( &m_showTestToolbar ); + uiOrdering.add( &m_includeFractureDebugInfoFile ); + uiOrdering.add( &m_holoLensExportFolder ); + uiOrdering.add( &m_showProgressBar ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RiaPreferencesSystem::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + *useOptionsOnly = true; + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaPreferencesSystem::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_holoLensExportFolder ) + { + caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_selectDirectory = true; + } + } +} diff --git a/ApplicationLibCode/Application/RiaPreferencesSystem.h b/ApplicationLibCode/Application/RiaPreferencesSystem.h new file mode 100644 index 0000000000..9e1e421cf6 --- /dev/null +++ b/ApplicationLibCode/Application/RiaPreferencesSystem.h @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafAppEnum.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +class RiaPreferencesSystem : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + enum class EclipseTextFileReaderMode + { + MEMORY_MAPPED_FILE, + FILE, + }; + using EclipseTextFileReaderModeType = caf::AppEnum; + +public: + RiaPreferencesSystem(); + + static RiaPreferencesSystem* current(); + + bool appendClassNameToUiText() const; + bool appendFieldKeywordToToolTipText() const; + bool showViewIdInProjectTree() const; + bool showTestToolbar() const; + bool includeFractureDebugInfoFile() const; + bool showProjectChangedDialog() const; + QString holoLensExportFolder() const; + bool useShaders() const; + bool show3dInformation() const; + QString gtestFilter() const; + bool showProgressBar() const; + + EclipseTextFileReaderMode eclipseTextFileReaderMode() const; + +protected: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + +private: + caf::PdmField m_appendClassNameToUiText; + caf::PdmField m_appendFieldKeywordToToolTipText; + caf::PdmField m_showViewIdInProjectTree; + caf::PdmField m_useShaders; + caf::PdmField m_showHud; + + caf::PdmField m_showProjectChangedDialog; + + caf::PdmField m_showTestToolbar; + caf::PdmField m_includeFractureDebugInfoFile; + caf::PdmField m_holoLensExportFolder; + + caf::PdmField m_showProgressBar; + caf::PdmField m_gtestFilter; + + caf::PdmField m_eclipseReaderMode; +}; diff --git a/ApplicationLibCode/Application/RiaResultNames.cpp b/ApplicationLibCode/Application/RiaResultNames.cpp index 6b7b85c4aa..0d44f2c3ed 100644 --- a/ApplicationLibCode/Application/RiaResultNames.cpp +++ b/ApplicationLibCode/Application/RiaResultNames.cpp @@ -71,6 +71,19 @@ bool RiaResultNames::isPerCellFaceResult( const QString& resultName ) return false; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaResultNames::isLogarithmicResult( const QString& resultName ) +{ + QStringList subStringsToMatch{ "TRAN", "MULT", "PERM" }; + + for ( const auto& s : subStringsToMatch ) + if ( resultName.contains( s, Qt::CaseInsensitive ) ) return true; + + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -313,6 +326,30 @@ QString RiaResultNames::formationAllanResultName() return "Formation Allan"; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaResultNames::indexIResultName() +{ + return "INDEX_I"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaResultNames::indexJResultName() +{ + return "INDEX_J"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaResultNames::indexKResultName() +{ + return "INDEX_K"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/RiaResultNames.h b/ApplicationLibCode/Application/RiaResultNames.h index 485f538c4f..f0b32033df 100644 --- a/ApplicationLibCode/Application/RiaResultNames.h +++ b/ApplicationLibCode/Application/RiaResultNames.h @@ -27,6 +27,7 @@ namespace RiaResultNames { bool isPerCellFaceResult( const QString& resultName ); +bool isLogarithmicResult( const QString& resultName ); QString undefinedResultName(); QString undefinedGridFaultName(); @@ -64,6 +65,10 @@ QString faultReactAssessmentPrefix(); QString completionTypeResultName(); +QString indexIResultName(); +QString indexJResultName(); +QString indexKResultName(); + // Well path derived results QString wbsAzimuthResult(); QString wbsInclinationResult(); diff --git a/ApplicationLibCode/Application/RiaStimPlanModelDefines.cpp b/ApplicationLibCode/Application/RiaStimPlanModelDefines.cpp index 2f1d6d7882..10090bd9db 100644 --- a/ApplicationLibCode/Application/RiaStimPlanModelDefines.cpp +++ b/ApplicationLibCode/Application/RiaStimPlanModelDefines.cpp @@ -57,6 +57,7 @@ void AppEnum::setUp() addItem( RiaDefines::CurveProperty::POROSITY_UNSCALED, "POROSITY_UNSCALED", "Porosity (Unscaled)" ); addItem( RiaDefines::CurveProperty::EQLNUM, "EQLNUM", "Equilibration Number" ); addItem( RiaDefines::CurveProperty::PRESSURE_GRADIENT, "PRESSURE_GRADIENT", "Pressure Gradient" ); + addItem( RiaDefines::CurveProperty::FORMATIONS, "FORMATIONS", "Formations" ); setDefault( RiaDefines::CurveProperty::UNDEFINED ); } @@ -71,7 +72,7 @@ double defaultPorosity() double defaultPermeability() { - return 1.0e-5; + return 1.0e-4; } double zeroReplacementForLogarithmicPlot() diff --git a/ApplicationLibCode/Application/RiaStimPlanModelDefines.h b/ApplicationLibCode/Application/RiaStimPlanModelDefines.h index 833ff779c9..58e03c985c 100644 --- a/ApplicationLibCode/Application/RiaStimPlanModelDefines.h +++ b/ApplicationLibCode/Application/RiaStimPlanModelDefines.h @@ -52,6 +52,7 @@ enum class CurveProperty POROSITY_UNSCALED, EQLNUM, PRESSURE_GRADIENT, + FORMATIONS }; double defaultPorosity(); diff --git a/ApplicationLibCode/Application/RiaSummaryCurveDefinition.cpp b/ApplicationLibCode/Application/RiaSummaryCurveDefinition.cpp index c95062c8ad..4dc0d45ecf 100644 --- a/ApplicationLibCode/Application/RiaSummaryCurveDefinition.cpp +++ b/ApplicationLibCode/Application/RiaSummaryCurveDefinition.cpp @@ -37,7 +37,7 @@ RiaSummaryCurveDefinition::RiaSummaryCurveDefinition() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiaSummaryCurveDefinition::RiaSummaryCurveDefinition( gsl::not_null summaryCase, +RiaSummaryCurveDefinition::RiaSummaryCurveDefinition( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& summaryAddress, bool isEnsembleCurve ) : m_summaryCase( summaryCase ) @@ -55,8 +55,8 @@ RiaSummaryCurveDefinition::RiaSummaryCurveDefinition( gsl::not_null ensemble, - const RifEclipseSummaryAddress& summaryAddress ) +RiaSummaryCurveDefinition::RiaSummaryCurveDefinition( RimSummaryCaseCollection* ensemble, + const RifEclipseSummaryAddress& summaryAddress ) : m_summaryCase( nullptr ) , m_summaryAddress( summaryAddress ) , m_ensemble( ensemble ) diff --git a/ApplicationLibCode/Application/RiaSummaryCurveDefinition.h b/ApplicationLibCode/Application/RiaSummaryCurveDefinition.h index 7e7e081022..9aeb40a761 100644 --- a/ApplicationLibCode/Application/RiaSummaryCurveDefinition.h +++ b/ApplicationLibCode/Application/RiaSummaryCurveDefinition.h @@ -37,11 +37,10 @@ class RiaSummaryCurveDefinition { public: RiaSummaryCurveDefinition(); - explicit RiaSummaryCurveDefinition( gsl::not_null summaryCase, + explicit RiaSummaryCurveDefinition( RimSummaryCase* summaryCase, const RifEclipseSummaryAddress& summaryAddress, bool isEnsembleCurve ); - explicit RiaSummaryCurveDefinition( gsl::not_null ensemble, - const RifEclipseSummaryAddress& summaryAddress ); + explicit RiaSummaryCurveDefinition( RimSummaryCaseCollection* ensemble, const RifEclipseSummaryAddress& summaryAddress ); RimSummaryCase* summaryCase() const; const RifEclipseSummaryAddress& summaryAddress() const; diff --git a/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake b/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake index 3da3bd9b09..ea3b07a223 100644 --- a/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake +++ b/ApplicationLibCode/Application/Tools/CMakeLists_files.cmake @@ -1,106 +1,106 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RiaArgumentParser.h -${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser.h -${CMAKE_CURRENT_LIST_DIR}/RiaColorTables.h -${CMAKE_CURRENT_LIST_DIR}/RiaColorTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaImageCompareReporter.h -${CMAKE_CURRENT_LIST_DIR}/RiaImageFileCompare.h -${CMAKE_CURRENT_LIST_DIR}/RiaImageTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaLogging.h -${CMAKE_CURRENT_LIST_DIR}/RiaProjectModifier.h -${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTest.h -${CMAKE_CURRENT_LIST_DIR}/RiaImportEclipseCaseTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaQDateTimeTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaWellNameComparer.h -${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer.h -${CMAKE_CURRENT_LIST_DIR}/RiaSimWellBranchTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaStringEncodingTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.h -${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.h -${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.h -${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.inl -${CMAKE_CURRENT_LIST_DIR}/RiaCurveDataTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveResampler.h -${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaOffshoreSphericalCoords.h -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMeanCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaMedianCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMeanCalculator.inl -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaOptionItemFactory.h -${CMAKE_CURRENT_LIST_DIR}/RiaGitDiff.h -${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaFieldHandleTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaBoundingBoxTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaWellLogUnitTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaWellLogUnitTools.inl -${CMAKE_CURRENT_LIST_DIR}/RiaTimeTTools.h -${CMAKE_CURRENT_LIST_DIR}/RiaValidRegExpValidator.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaArgumentParser.h + ${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser.h + ${CMAKE_CURRENT_LIST_DIR}/RiaColorTables.h + ${CMAKE_CURRENT_LIST_DIR}/RiaColorTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaImageCompareReporter.h + ${CMAKE_CURRENT_LIST_DIR}/RiaImageFileCompare.h + ${CMAKE_CURRENT_LIST_DIR}/RiaImageTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaLogging.h + ${CMAKE_CURRENT_LIST_DIR}/RiaProjectModifier.h + ${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTest.h + ${CMAKE_CURRENT_LIST_DIR}/RiaImportEclipseCaseTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaQDateTimeTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWellNameComparer.h + ${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSimWellBranchTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaStringEncodingTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.h + ${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.h + ${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.inl + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveDataTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWellLogCurveMerger.h + ${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveResampler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaOffshoreSphericalCoords.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMeanCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaMedianCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMeanCalculator.inl + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaOptionItemFactory.h + ${CMAKE_CURRENT_LIST_DIR}/RiaGitDiff.h + ${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaFieldHandleTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaBoundingBoxTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWellLogUnitTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWellLogUnitTools.inl + ${CMAKE_CURRENT_LIST_DIR}/RiaTimeTTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaValidRegExpValidator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaVec3Tools.h + ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleNameTools.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RiaArgumentParser.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaColorTables.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaColorTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaImageCompareReporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaImageFileCompare.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaImageTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaLogging.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaProjectModifier.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTest.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaImportEclipseCaseTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaQDateTimeTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWellNameComparer.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSimWellBranchTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStringEncodingTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCurveDataTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveResampler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaOptionItemFactory.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaGitDiff.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFieldHandleTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaBoundingBoxTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTimeTTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaValidRegExpValidator.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaArgumentParser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaColorTables.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaColorTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaImageCompareReporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaImageFileCompare.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaImageTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaLogging.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaProjectModifier.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTest.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaImportEclipseCaseTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaQDateTimeTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWellNameComparer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSimWellBranchTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStringEncodingTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTextStringTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaRegressionTestRunner.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaExtractionTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveMerger.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCurveDataTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWellLogCurveMerger.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveResampler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaOptionItemFactory.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaGitDiff.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFieldHandleTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaBoundingBoxTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTimeTTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaValidRegExpValidator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaEnsembleNameTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaVec3Tools.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +set(QT_MOC_HEADERS ${QT_MOC_HEADERS}) -set (QT_MOC_HEADERS -${QT_MOC_HEADERS} +source_group( + "Application\\Tools" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - - -source_group( "Application\\Tools" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/Application/Tools/RiaArgumentParser.cpp b/ApplicationLibCode/Application/Tools/RiaArgumentParser.cpp index 09d4453330..868fb49870 100644 --- a/ApplicationLibCode/Application/Tools/RiaArgumentParser.cpp +++ b/ApplicationLibCode/Application/Tools/RiaArgumentParser.cpp @@ -142,6 +142,7 @@ bool RiaArgumentParser::parseArguments( cvf::ProgramOptions* progOpt ) #endif progOpt->registerOption( "generate", "[]", "Generate code or documentation", cvf::ProgramOptions::SINGLE_VALUE ); progOpt->registerOption( "ignoreArgs", "", "System command. Ignore all arguments. Mostly for testing purposes" ); + progOpt->registerOption( "version", "", "Display the application version string" ); progOpt->setOptionPrefix( cvf::ProgramOptions::DOUBLE_DASH ); diff --git a/ApplicationLibCode/Application/Tools/RiaColorTables.cpp b/ApplicationLibCode/Application/Tools/RiaColorTables.cpp index 28b6b8c640..4522989faa 100644 --- a/ApplicationLibCode/Application/Tools/RiaColorTables.cpp +++ b/ApplicationLibCode/Application/Tools/RiaColorTables.cpp @@ -557,6 +557,22 @@ RiaColorTables::WellPathComponentColors RiaColorTables::wellPathComponentColors( { RiaDefines::WellPathComponentType::UNDEFINED_COMPONENT, cvf::Color3::MAGENTA } }; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const caf::ColorTable& RiaColorTables::structuralUncertaintyColors() +{ + static std::vector colors{ + cvf::Color3ub( 255, 183, 198 ), // Large band + cvf::Color3ub( 255, 113, 142 ), // Narrow band + cvf::Color3ub( 255, 18, 67 ), // Mean curve + }; + + static caf::ColorTable colorTable = caf::ColorTable( colors ); + + return colorTable; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaColorTables.h b/ApplicationLibCode/Application/Tools/RiaColorTables.h index 422edf9e3a..aa2db4a804 100644 --- a/ApplicationLibCode/Application/Tools/RiaColorTables.h +++ b/ApplicationLibCode/Application/Tools/RiaColorTables.h @@ -67,6 +67,9 @@ class RiaColorTables static WellPathComponentColors wellPathComponentColors(); + // Colors used in WebViz + static const caf::ColorTable& structuralUncertaintyColors(); + // Default 3d View colors static cvf::Color3f defaultGridLineColor(); static cvf::Color3f defaultFaultLineColor(); diff --git a/ApplicationLibCode/Application/Tools/RiaCurveMerger.h b/ApplicationLibCode/Application/Tools/RiaCurveMerger.h index 506777822c..d001b4e104 100644 --- a/ApplicationLibCode/Application/Tools/RiaCurveMerger.h +++ b/ApplicationLibCode/Application/Tools/RiaCurveMerger.h @@ -57,6 +57,9 @@ class RiaCurveMerger // See ExpressionParserImpl::assignVector() std::vector& interpolatedYValuesForAllXValues( size_t curveIdx ); + static void removeValuesForPartialCurves( std::set& unionOfXValues, + const std::vector>& originalXBounds ); + public: // Helper methods, available as public to be able to access from unit tests diff --git a/ApplicationLibCode/Application/Tools/RiaCurveMerger.inl b/ApplicationLibCode/Application/Tools/RiaCurveMerger.inl index 3ed1dabfb4..ed44d5f032 100644 --- a/ApplicationLibCode/Application/Tools/RiaCurveMerger.inl +++ b/ApplicationLibCode/Application/Tools/RiaCurveMerger.inl @@ -194,31 +194,38 @@ void RiaCurveMerger::computeUnionOfXValues( bool includeValuesForPar originalXBounds.push_back( std::make_pair( *( minmax_it.first ), *( minmax_it.second ) ) ); } - if ( !includeValuesForPartialCurves ) + if ( !includeValuesForPartialCurves ) removeValuesForPartialCurves( unionOfXValues, originalXBounds ); + + m_allXValues = std::vector( unionOfXValues.begin(), unionOfXValues.end() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +template +void RiaCurveMerger::removeValuesForPartialCurves( std::set& unionOfXValues, + const std::vector>& originalXBounds ) +{ + for ( auto it = unionOfXValues.begin(); it != unionOfXValues.end(); ) { - for ( auto it = unionOfXValues.begin(); it != unionOfXValues.end(); ) + bool outsideBounds = false; + for ( const auto& curveXBounds : originalXBounds ) { - bool outsideBounds = false; - for ( const auto& curveXBounds : originalXBounds ) + if ( *it < curveXBounds.first || *it > curveXBounds.second ) { - if ( *it < curveXBounds.first || *it > curveXBounds.second ) - { - outsideBounds = true; - break; - } - } - if ( outsideBounds ) - { - it = unionOfXValues.erase( it ); - } - else - { - ++it; + outsideBounds = true; + break; } } + if ( outsideBounds ) + { + it = unionOfXValues.erase( it ); + } + else + { + ++it; + } } - - m_allXValues = std::vector( unionOfXValues.begin(), unionOfXValues.end() ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp new file mode 100644 index 0000000000..3a484c80d3 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.cpp @@ -0,0 +1,287 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaEnsembleNameTools.h" + +#include "RiaFilePathTools.h" +#include "RiaTextStringTools.h" + +#include "RimCaseDisplayNameTools.h" + +#include "cafAppEnum.h" + +#include +#include + +template <> +void caf::AppEnum::setUp() +{ + addItem( RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE, "FMU_FOLDER_MODE", "Sub Folder" ); + addItem( RiaEnsembleNameTools::EnsembleGroupingMode::EVEREST_FOLDER_STRUCTURE, "EVEREST_FOLDER_MODE", "Main Folder" ); + addItem( RiaEnsembleNameTools::EnsembleGroupingMode::NONE, "None", "None" ); + setDefault( RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaEnsembleNameTools::findSuitableEnsembleName( const QStringList& fileNames, EnsembleGroupingMode folderLevel ) +{ + if ( folderLevel == EnsembleGroupingMode::EVEREST_FOLDER_STRUCTURE ) + { + QString commonRoot = RiaTextStringTools::commonRoot( fileNames ); + commonRoot = commonRoot.left( commonRoot.lastIndexOf( '/' ) ); + QStringList rootComponents = RiaFilePathTools::splitPathIntoComponents( commonRoot ); + + if ( !rootComponents.empty() ) + { + return rootComponents.back(); + } + } + + std::vector componentsForAllFilePaths; + + for ( const auto& filePath : fileNames ) + { + QStringList components = RiaFilePathTools::splitPathIntoComponents( filePath ); + componentsForAllFilePaths.push_back( components ); + } + + QStringList iterations = findUniqueEnsembleNames( fileNames, componentsForAllFilePaths, folderLevel ); + if ( iterations.size() == 1u ) + { + return iterations.front(); + } + + if ( !iterations.empty() ) + { + return QString( "Multiple iterations: %1" ).arg( iterations.join( ", " ) ); + } + + QString root = RiaFilePathTools::commonRootOfFileNames( fileNames ); + + QRegularExpression trimRe( "[^a-zA-Z0-9]+$" ); + QString trimmedRoot = root.replace( trimRe, "" ); + if ( trimmedRoot.length() >= 4 ) + { + return trimmedRoot; + } + + return "Ensemble"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiaEnsembleNameTools::groupFilesByEnsemble( const QStringList& fileNames, + EnsembleGroupingMode groupingMode ) +{ + std::vector componentsForAllFilePaths; + + for ( const auto& filePath : fileNames ) + { + QStringList components = RiaFilePathTools::splitPathIntoComponents( filePath ); + componentsForAllFilePaths.push_back( components ); + } + + QStringList iterations = findUniqueEnsembleNames( fileNames, componentsForAllFilePaths, groupingMode ); + if ( iterations.size() <= 1 ) + { + // All the files are in the same ensemble + return { fileNames }; + } + + std::vector groupedByIteration; + for ( const auto& iteration : iterations ) + { + QStringList fileNamesFromIteration; + + for ( int i = 0; i < fileNames.size(); i++ ) + { + auto components = componentsForAllFilePaths[i]; + bool foundMatch = false; + for ( const auto& component : components ) + { + if ( component == iteration ) foundMatch = true; + } + + if ( foundMatch ) + { + fileNamesFromIteration << fileNames[i]; + } + } + groupedByIteration.push_back( fileNamesFromIteration ); + } + + return groupedByIteration; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RiaEnsembleNameTools::findUniqueEnsembleNames( const QStringList& fileNames, + const std::vector& fileNameComponents, + EnsembleGroupingMode groupingMode ) +{ + QStringList iterations; + if ( groupingMode == EnsembleGroupingMode::EVEREST_FOLDER_STRUCTURE ) + { + QString commonRoot = RiaTextStringTools::commonRoot( fileNames ); + QStringList rootComponents = RiaFilePathTools::splitPathIntoComponents( commonRoot ); + auto commonComponentCount = rootComponents.size(); + + // Example: + // /myPath/batch_01/realization-1/.... + // /myPath/batch_01/realization-2/.... + // /myPath/batch_01/realization-N/.... + // /myPath/batch_02/realization-1/.... + // /myPath/batch_02/realization-2/.... + // /myPath/batch_02/realization-N/.... + + // commonRoot will return /myPath/batch_ + // ensembleNameSet will contain [batch_01, batch_02] + + std::set ensembleNameSet; + for ( const auto& componentsForFile : fileNameComponents ) + { + if ( commonComponentCount - 1 < componentsForFile.size() ) + { + ensembleNameSet.insert( componentsForFile[commonComponentCount - 1] ); + } + } + + for ( const auto& ensembleName : ensembleNameSet ) + { + iterations.push_back( ensembleName ); + } + } + else if ( groupingMode == EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ) + { + // Find list of all folders inside a folder matching realization-* + QRegularExpression realizationRe( "realization\\-\\d+" ); + + for ( const auto& fileComponents : fileNameComponents ) + { + QString lastComponent = ""; + for ( auto it = fileComponents.rbegin(); it != fileComponents.rend(); ++it ) + { + if ( realizationRe.match( *it ).hasMatch() ) + { + iterations.push_back( lastComponent ); + } + lastComponent = *it; + } + } + } + + iterations.removeDuplicates(); + return iterations; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaEnsembleNameTools::findCommonBaseName( const QStringList& fileNames ) +{ + QStringList baseNames; + for ( const auto& f : fileNames ) + { + QFileInfo fi( f ); + baseNames.push_back( fi.baseName() ); + } + + if ( baseNames.isEmpty() ) return "Empty"; + + auto firstName = baseNames.front(); + for ( int i = 0; i < firstName.size(); i++ ) + { + auto candidate = firstName.left( firstName.size() - i ); + bool identicalNames = true; + + for ( const auto& baseName : baseNames ) + { + auto str = baseName.left( firstName.size() - i ); + if ( candidate != str ) identicalNames = false; + } + + if ( identicalNames ) + { + return candidate; + } + } + + return "Mixed Items"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaEnsembleNameTools::uniqueShortName( const QString& sourceFileName, + const QStringList& allFileNames, + const QString& ensembleCaseName ) +{ + std::map keyFileComponentsForAllFiles = + RiaFilePathTools::keyPathComponentsForEachFilePath( allFileNames ); + + return uniqueShortNameFromComponents( sourceFileName, keyFileComponentsForAllFiles, ensembleCaseName ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RiaEnsembleNameTools::uniqueShortNameFromComponents( const QString& sourceFileName, + const std::map& keyFileComponentsForAllFiles, + const QString& ensembleCaseName ) +{ + QRegularExpression trimRe( "^[^a-zA-Z0-9]+" ); + + auto modifyableMap( keyFileComponentsForAllFiles ); + QStringList keyFileComponents = modifyableMap[sourceFileName]; + if ( keyFileComponents.empty() ) return "Unnamed"; + + if ( !ensembleCaseName.isEmpty() ) + { + for ( auto& component : keyFileComponents ) + { + component = component.replace( ensembleCaseName, "" ); + component = component.replace( trimRe, "" ); + } + } + + QStringList shortNameComponents; + QRegularExpression numberRe( "[0-9]+" ); + for ( auto keyComponent : keyFileComponents ) + { + QStringList subComponents; + QString numberGroup = numberRe.match( keyComponent ).captured(); + if ( !numberGroup.isEmpty() ) + { + keyComponent = keyComponent.replace( numberGroup, "" ); + QString stem = keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH ); + if ( !stem.isEmpty() ) subComponents.push_back( stem ); + subComponents.push_back( numberGroup ); + } + else + { + subComponents.push_back( keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH ) ); + } + + shortNameComponents.push_back( subComponents.join( "-" ) ); + } + return shortNameComponents.join( "," ); +} diff --git a/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h new file mode 100644 index 0000000000..ddf7290f79 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaEnsembleNameTools.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include + +//================================================================================================== +// +//================================================================================================== +class RiaEnsembleNameTools +{ +public: + enum class EnsembleGroupingMode + { + FMU_FOLDER_STRUCTURE, + EVEREST_FOLDER_STRUCTURE, + NONE + }; + +public: + static QString findSuitableEnsembleName( const QStringList& fileNames, EnsembleGroupingMode groupingMode ); + static QString findCommonBaseName( const QStringList& fileNames ); + + static QString uniqueShortName( const QString& sourceFileName, + const QStringList& allFileNames, + const QString& ensembleCaseName = QString() ); + + static QString uniqueShortNameFromComponents( const QString& sourceFileName, + const std::map& keyFileComponentsForAllFiles, + const QString& ensembleCaseName ); + + static std::vector groupFilesByEnsemble( const QStringList& fileNames, EnsembleGroupingMode groupingMode ); + +private: + static QStringList findUniqueEnsembleNames( const QStringList& fileNames, + const std::vector& fileNameComponents, + EnsembleGroupingMode groupingMode ); +}; diff --git a/ApplicationLibCode/Application/Tools/RiaFieldHandleTools.cpp b/ApplicationLibCode/Application/Tools/RiaFieldHandleTools.cpp index f49e61e234..55517ec38e 100644 --- a/ApplicationLibCode/Application/Tools/RiaFieldHandleTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaFieldHandleTools.cpp @@ -19,6 +19,8 @@ #include "RiaFieldHandleTools.h" +#include "cafPdmChildArrayField.h" +#include "cafPdmChildField.h" #include "cafPdmFieldHandle.h" #include "cafPdmUiFieldHandle.h" #include "cafPdmXmlFieldHandle.h" @@ -34,7 +36,11 @@ void RiaFieldhandleTools::disableWriteAndSetFieldHidden( caf::PdmFieldHandle* fi if ( fieldHandle->uiCapability() ) { - fieldHandle->uiCapability()->setUiHidden( true ); + if ( dynamic_cast( fieldHandle ) || + dynamic_cast( fieldHandle ) ) + fieldHandle->uiCapability()->setUiTreeHidden( true ); + else + fieldHandle->uiCapability()->setUiHidden( true ); } if ( fieldHandle->xmlCapability() ) diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp index 48bbf3432c..22b8dd29dd 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.cpp @@ -29,6 +29,7 @@ #include "RiaLogging.h" #include "RifEclipseSummaryTools.h" +#include "RifReaderSettings.h" #include "RifSummaryCaseRestartSelector.h" #include "RigGridManager.h" @@ -69,16 +70,18 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fileNames, - FileCaseIdMap* openedFilesOut, - bool noDialog ) +bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fileNames, + bool createView, + FileCaseIdMap* openedFilesOut, + bool noDialog, + std::shared_ptr readerSettings ) { RiaApplication* app = RiaApplication::instance(); RimProject* project = app->project(); // Get list of files to import RifSummaryCaseRestartSelector selector; - if ( noDialog ) selector.showDialog( false ); + if ( noDialog || !RiaGuiApplication::isRunning() ) selector.showDialog( false ); selector.determineFilesToImportFromGridFiles( fileNames ); std::vector summaryFileInfos = selector.summaryFileInfos(); @@ -87,7 +90,7 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fil // Import eclipse case files for ( const QString& gridCaseFile : selector.gridCaseFiles() ) { - int caseId = RiaImportEclipseCaseTools::openEclipseCaseFromFile( gridCaseFile ); + int caseId = RiaImportEclipseCaseTools::openEclipseCaseFromFile( gridCaseFile, createView, readerSettings ); if ( caseId >= 0 ) { openedFiles.insert( std::make_pair( gridCaseFile, caseId ) ); @@ -103,7 +106,8 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fil } // Import summary cases - if ( !summaryFileInfos.empty() ) + bool importSummaryCases = readerSettings && readerSettings->importSummaryData; + if ( importSummaryCases && !summaryFileInfos.empty() ) { RimSummaryCaseMainCollection* sumCaseColl = project->activeOilField() ? project->activeOilField()->summaryCaseMainCollection() : nullptr; @@ -120,8 +124,8 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fil { RimSummaryCase* existingSummaryCase = sumCaseColl->findSummaryCaseFromFileName( newSumCase->summaryHeaderFilename() ); - RimGridSummaryCase* existingGridSummaryCase = dynamic_cast( existingSummaryCase ); - RimFileSummaryCase* existingFileSummaryCase = dynamic_cast( existingSummaryCase ); + auto* existingGridSummaryCase = dynamic_cast( existingSummaryCase ); + auto* existingFileSummaryCase = dynamic_cast( existingSummaryCase ); if ( existingGridSummaryCase ) { delete newSumCase; // No need to add anything new. Already have one. @@ -223,11 +227,17 @@ bool RiaImportEclipseCaseTools::openEclipseCasesFromFile( const QStringList& fil //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RiaImportEclipseCaseTools::openEclipseCaseFromFile( const QString& fileName ) +int RiaImportEclipseCaseTools::openEclipseCaseFromFile( const QString& fileName, + bool createView, + std::shared_ptr readerSettings ) { if ( !caf::Utils::fileExists( fileName ) ) return -1; - return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( fileName, false ); + bool showTimeStepFilter = false; + return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( fileName, + showTimeStepFilter, + createView, + readerSettings ); } //-------------------------------------------------------------------------------------------------- @@ -237,16 +247,20 @@ bool RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilter( const QString { if ( !caf::Utils::fileExists( fileName ) ) return false; - return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( fileName, true ) >= 0; + bool showTimeStepFilter = true; + bool createView = true; + return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( fileName, + showTimeStepFilter, + createView, + nullptr ) >= 0; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringList& fileNames, - QString* fileContainingGrid /*=nullptr*/ ) +int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringList& fileNames, bool createDefaultView ) { - RimEclipseInputCase* rimInputReservoir = new RimEclipseInputCase(); + auto* rimInputReservoir = new RimEclipseInputCase(); RiaApplication* app = RiaApplication::instance(); RimProject* project = app->project(); @@ -266,24 +280,26 @@ int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringL analysisModels->cases.push_back( rimInputReservoir ); - RimEclipseView* riv = rimInputReservoir->createAndAddReservoirView(); + RimEclipseView* eclipseView = nullptr; + if ( createDefaultView ) + { + eclipseView = rimInputReservoir->createAndAddReservoirView(); - riv->cellResult()->setResultType( RiaDefines::ResultCatType::INPUT_PROPERTY ); + eclipseView->cellResult()->setResultType( RiaDefines::ResultCatType::INPUT_PROPERTY ); - riv->loadDataAndUpdate(); + eclipseView->loadDataAndUpdate(); - if ( !riv->cellResult()->hasResult() ) - { - riv->cellResult()->setResultVariable( RiaResultNames::undefinedResultName() ); + if ( !eclipseView->cellResult()->hasResult() ) + { + eclipseView->cellResult()->setResultVariable( RiaResultNames::undefinedResultName() ); + } } analysisModels->updateConnectedEditors(); - Riu3DMainWindowTools::selectAsCurrentItem( riv->cellResult() ); - - if ( fileContainingGrid ) + if ( eclipseView ) { - *fileContainingGrid = rimInputReservoir->gridFileName(); + Riu3DMainWindowTools::selectAsCurrentItem( eclipseView->cellResult() ); } return rimInputReservoir->caseId(); @@ -294,19 +310,25 @@ int RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( const QStringL //-------------------------------------------------------------------------------------------------- bool RiaImportEclipseCaseTools::openMockModel( const QString& name ) { - return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( name, false ); + bool showTimeStepFilter = false; + bool createView = true; + return RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( name, showTimeStepFilter, createView, nullptr ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QString& fileName, bool showTimeStepFilter ) +int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QString& fileName, + bool showTimeStepFilter, + bool createView, + std::shared_ptr readerSettings ) { QFileInfo gridFileName( fileName ); QString caseName = gridFileName.completeBaseName(); - RimEclipseResultCase* rimResultReservoir = new RimEclipseResultCase(); + auto* rimResultReservoir = new RimEclipseResultCase(); rimResultReservoir->setCaseInfo( caseName, fileName ); + rimResultReservoir->setReaderSettings( readerSettings ); RiaApplication* app = RiaApplication::instance(); RimProject* project = app->project(); @@ -335,21 +357,33 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr return -1; } - RimEclipseView* riv = rimResultReservoir->createAndAddReservoirView(); + if ( createView ) + { + RimEclipseView* riv = rimResultReservoir->createAndAddReservoirView(); - riv->loadDataAndUpdate(); + riv->loadDataAndUpdate(); - if ( !riv->cellResult()->hasResult() ) - { - riv->cellResult()->setResultVariable( RiaResultNames::undefinedResultName() ); - } + if ( !riv->cellResult()->hasResult() ) + { + riv->cellResult()->setResultVariable( RiaResultNames::undefinedResultName() ); + } - analysisModels->updateConnectedEditors(); + analysisModels->updateConnectedEditors(); - if ( RiaGuiApplication::isRunning() ) + if ( RiaGuiApplication::isRunning() ) + { + RiuMainWindow::instance()->selectAsCurrentItem( riv->cellResult() ); + } + } + else { - RiuMainWindow::instance()->selectAsCurrentItem( riv->cellResult() ); + // Make sure the placeholder result entries are created, as this functionality is triggered when creating a + // view. See RimEclipseView::onLoadDataAndUpdate() and the call to openReserviorCase() + rimResultReservoir->openReserviorCase(); + + analysisModels->updateConnectedEditors(); } + return rimResultReservoir->caseId(); } @@ -359,7 +393,7 @@ int RiaImportEclipseCaseTools::openEclipseCaseShowTimeStepFilterImpl( const QStr bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fileNames, RimIdenticalGridCaseGroup** resultingCaseGroup /*=nullptr*/ ) { - if ( fileNames.size() == 0 ) return true; + if ( fileNames.empty() ) return true; // First file is read completely including grid. // The main grid from the first case is reused directly in for the other cases. @@ -377,7 +411,7 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fil QString caseName = gridFileName.completeBaseName(); - RimEclipseResultCase* rimResultReservoir = new RimEclipseResultCase(); + auto* rimResultReservoir = new RimEclipseResultCase(); rimResultReservoir->setCaseInfo( caseName, firstFileName ); if ( !rimResultReservoir->openEclipseGridFile() ) { @@ -405,7 +439,7 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fil QString caseName = gridFileName.completeBaseName(); - RimEclipseResultCase* rimResultReservoir = new RimEclipseResultCase(); + auto* rimResultReservoir = new RimEclipseResultCase(); rimResultReservoir->setCaseInfo( caseName, caseFileName ); std::vector> caseGridDimensions; @@ -448,7 +482,7 @@ bool RiaImportEclipseCaseTools::addEclipseCases( const QStringList& fil project->activeOilField()->analysisModels()->updateConnectedEditors(); - if ( RiaGuiApplication::isRunning() && gridCaseGroup && gridCaseGroup->statisticsCaseCollection()->reservoirs.size() > 0 ) + if ( RiaGuiApplication::isRunning() && gridCaseGroup && !gridCaseGroup->statisticsCaseCollection()->reservoirs.empty() ) { RiuMainWindow::instance()->selectAsCurrentItem( gridCaseGroup->statisticsCaseCollection()->reservoirs[0] ); } diff --git a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h index 5c809df264..ecc7c78cff 100644 --- a/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h +++ b/ApplicationLibCode/Application/Tools/RiaImportEclipseCaseTools.h @@ -19,11 +19,13 @@ #pragma once #include +#include class QString; class QStringList; class RimIdenticalGridCaseGroup; +class RifReaderSettings; //================================================================================================== /// @@ -33,18 +35,26 @@ class RiaImportEclipseCaseTools public: typedef std::map FileCaseIdMap; - static bool openEclipseCasesFromFile( const QStringList& fileNames, - FileCaseIdMap* openedFilesOut = nullptr, - bool noDialog = false ); + static bool openEclipseCasesFromFile( const QStringList& fileNames, + bool createView, + FileCaseIdMap* openedFilesOut, + bool noDialog, + std::shared_ptr readerSettings = nullptr ); + static bool openEclipseCaseShowTimeStepFilter( const QString& fileName ); - static int openEclipseInputCaseFromFileNames( const QStringList& fileNames, QString* fileContainingGrid = nullptr ); + static int openEclipseInputCaseFromFileNames( const QStringList& fileNames, bool createDefaultView ); static bool openMockModel( const QString& name ); static bool addEclipseCases( const QStringList& fileNames, RimIdenticalGridCaseGroup** resultingCaseGroup = nullptr ); - static int openEclipseCaseFromFile( const QString& fileName ); + static int openEclipseCaseFromFile( const QString& fileName, + bool createView, + std::shared_ptr readerSettings = nullptr ); private: - static int openEclipseCaseShowTimeStepFilterImpl( const QString& fileName, bool showTimeStepFilter ); + static int openEclipseCaseShowTimeStepFilterImpl( const QString& fileName, + bool showTimeStepFilter, + bool createView, + std::shared_ptr readerSettings ); }; diff --git a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp index e8b487aa6d..ae38193454 100644 --- a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp +++ b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.cpp @@ -20,6 +20,9 @@ #include "Rim3dView.h" #include "RimCase.h" +#include "RimEnsembleCurveSet.h" +#include "RimMainPlotCollection.h" +#include "RimProject.h" //-------------------------------------------------------------------------------------------------- /// @@ -35,3 +38,19 @@ void RiaOptionItemFactory::appendOptionItemFromViewNameAndCaseName( Rim3dView* optionItems->push_back( caf::PdmOptionItemInfo( displayName, view, false, iconProvider ) ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaOptionItemFactory::appendOptionItemsForEnsembleCurveSets( QList* options ) +{ + options->push_back( caf::PdmOptionItemInfo( "None", nullptr ) ); + + RimMainPlotCollection* mainPlotColl = RimProject::current()->mainPlotCollection(); + std::vector ensembleCurveSets; + mainPlotColl->descendantsOfType( ensembleCurveSets ); + for ( auto ensembleCurveSet : ensembleCurveSets ) + { + options->push_back( caf::PdmOptionItemInfo( ensembleCurveSet->name(), ensembleCurveSet ) ); + } +} diff --git a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.h b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.h index 6a8c146ca6..f8246803d2 100644 --- a/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.h +++ b/ApplicationLibCode/Application/Tools/RiaOptionItemFactory.h @@ -28,4 +28,5 @@ class RiaOptionItemFactory { public: static void appendOptionItemFromViewNameAndCaseName( Rim3dView* view, QList* optionItems ); + static void appendOptionItemsForEnsembleCurveSets( QList* options ); }; diff --git a/ApplicationLibCode/Application/Tools/RiaStatisticsTools.cpp b/ApplicationLibCode/Application/Tools/RiaStatisticsTools.cpp index 09e568ce92..5605065f65 100644 --- a/ApplicationLibCode/Application/Tools/RiaStatisticsTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaStatisticsTools.cpp @@ -20,39 +20,8 @@ #include "RiaStatisticsTools.h" -#include "RifEclipseSummaryAddress.h" #include "RigStatisticsMath.h" -#include "cafAssert.h" - -#include - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const QString RiaStatisticsTools::replacePercentileByPValueText( const QString& percentile ) -{ - QString result = percentile; - - if ( result == ENSEMBLE_STAT_P10_QUANTITY_NAME ) - { - result = ENSEMBLE_STAT_P90_QUANTITY_NAME; - } - else if ( result == ENSEMBLE_STAT_P90_QUANTITY_NAME ) - { - result = ENSEMBLE_STAT_P10_QUANTITY_NAME; - } - else if ( percentile.contains( QString( "%1:" ).arg( ENSEMBLE_STAT_P10_QUANTITY_NAME ) ) ) - { - result.replace( ENSEMBLE_STAT_P10_QUANTITY_NAME, ENSEMBLE_STAT_P90_QUANTITY_NAME ); - } - else if ( percentile.contains( QString( "%1:" ).arg( ENSEMBLE_STAT_P90_QUANTITY_NAME ) ) ) - { - result.replace( ENSEMBLE_STAT_P90_QUANTITY_NAME, ENSEMBLE_STAT_P10_QUANTITY_NAME ); - } - return result; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaStatisticsTools.h b/ApplicationLibCode/Application/Tools/RiaStatisticsTools.h index 58b3315e65..94ab689e04 100644 --- a/ApplicationLibCode/Application/Tools/RiaStatisticsTools.h +++ b/ApplicationLibCode/Application/Tools/RiaStatisticsTools.h @@ -24,8 +24,6 @@ #include #include -class QString; - //================================================================================================== // // @@ -34,8 +32,6 @@ class QString; class RiaStatisticsTools { public: - static const QString replacePercentileByPValueText( const QString& percentile ); - template static bool isInvalidNumber( NumberType value ) { diff --git a/ApplicationLibCode/Application/Tools/RiaStdStringTools.cpp b/ApplicationLibCode/Application/Tools/RiaStdStringTools.cpp index fad914534a..3a51395503 100644 --- a/ApplicationLibCode/Application/Tools/RiaStdStringTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaStdStringTools.cpp @@ -18,6 +18,11 @@ #include "RiaStdStringTools.h" +#include "fast_float/include/fast_float/fast_float.h" + +#include +#include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -105,6 +110,37 @@ bool RiaStdStringTools::startsWithAlphabetic( const std::string& s ) return isalpha( s[0] ) != 0; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaStdStringTools::toDouble( const std::string_view& s, double& value ) +{ + auto resultObject = fast_float::from_chars( s.data(), s.data() + s.size(), value ); + + return ( resultObject.ec == std::errc() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RiaStdStringTools::toInt( const std::string_view& s, int& value ) +{ + auto resultObject = std::from_chars( s.data(), s.data() + s.size(), value ); + + return ( resultObject.ec == std::errc() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string RiaStdStringTools::toUpper( const std::string& s ) +{ + auto strCopy( s ); + std::transform( strCopy.begin(), strCopy.end(), strCopy.begin(), []( unsigned char c ) { return std::toupper( c ); } ); + + return strCopy; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -120,15 +156,25 @@ bool RiaStdStringTools::endsWith( const std::string& mainStr, const std::string& //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RiaStdStringTools::splitStringBySpace( const std::string& s ) +std::vector RiaStdStringTools::splitString( const std::string& s, char delimiter ) { std::vector words; - splitByDelimiter( s, words ); + splitByDelimiter( s, words, delimiter ); return words; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string RiaStdStringTools::joinStrings( const std::vector& s, char delimiter ) +{ + std::string delimiterString( 1, delimiter ); + + return join( s.begin(), s.end(), delimiterString ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaStdStringTools.h b/ApplicationLibCode/Application/Tools/RiaStdStringTools.h index 56d8e1afa0..9023a01857 100644 --- a/ApplicationLibCode/Application/Tools/RiaStdStringTools.h +++ b/ApplicationLibCode/Application/Tools/RiaStdStringTools.h @@ -20,7 +20,7 @@ #include #include -#include +#include #include #include @@ -39,9 +39,16 @@ class RiaStdStringTools static bool containsAlphabetic( const std::string& s ); static bool startsWithAlphabetic( const std::string& s ); + // Conversion using fastest known approach + static bool toDouble( const std::string_view& s, double& value ); + static bool toInt( const std::string_view& s, int& value ); + + static std::string toUpper( const std::string& s ); + static bool endsWith( const std::string& mainStr, const std::string& toMatch ); - static std::vector splitStringBySpace( const std::string& s ); + static std::vector splitString( const std::string& s, char delimiter ); + static std::string joinStrings( const std::vector& s, char delimiter ); static int computeEditDistance( const std::string& x, const std::string& y ); @@ -57,13 +64,22 @@ class RiaStdStringTools template void RiaStdStringTools::splitByDelimiter( const std::string& str, Container& cont, char delimiter ) { - std::stringstream ss( str ); - std::string token; - while ( std::getline( ss, token, delimiter ) ) + size_t start; + size_t end = 0; + + while ( ( start = str.find_first_not_of( delimiter, end ) ) != std::string::npos ) { - if ( token.find_first_not_of( delimiter ) != std::string::npos ) - { - cont.push_back( token ); - } + end = str.find( delimiter, start ); + cont.push_back( str.substr( start, end - start ) ); } } + +template +std::string join( InputIt begin, InputIt end, const std::string& separator = ", " ) +{ + auto compose_key = [&separator]( std::string& key, const std::string& key_part ) -> std::string { + return key.empty() ? key_part : key + separator + key_part; + }; + + return std::accumulate( begin, end, std::string(), compose_key ); +} diff --git a/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp b/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp index 236e1bb0f9..f5a6c83acb 100644 --- a/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp +++ b/ApplicationLibCode/Application/Tools/RiaSummaryTools.cpp @@ -215,59 +215,6 @@ void RiaSummaryTools::getSummaryCasesAndAddressesForCalculation( int } } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RiaSummaryTools::findSuitableEnsembleName( const QStringList& summaryCaseFileNames ) -{ - std::vector componentsForAllFilePaths; - - for ( auto filePath : summaryCaseFileNames ) - { - QStringList components = RiaFilePathTools::splitPathIntoComponents( filePath ); - componentsForAllFilePaths.push_back( components ); - } - - // Find list of all folders inside a folder matching realization-* - QRegularExpression realizationRe( "realization\\-\\d+" ); - - QStringList iterations; - for ( const auto& fileComponents : componentsForAllFilePaths ) - { - QString lastComponent = ""; - for ( auto it = fileComponents.rbegin(); it != fileComponents.rend(); ++it ) - { - if ( realizationRe.match( *it ).hasMatch() ) - { - iterations.push_back( lastComponent ); - } - lastComponent = *it; - } - } - - iterations.removeDuplicates(); - - if ( iterations.size() == 1u ) - { - return iterations.front(); - } - else if ( !iterations.empty() ) - { - return QString( "Multiple iterations: %1" ).arg( iterations.join( ", " ) ); - } - - QString root = RiaFilePathTools::commonRootOfFileNames( summaryCaseFileNames ); - - QRegularExpression trimRe( "[^a-zA-Z0-9]+$" ); - QString trimmedRoot = root.replace( trimRe, "" ); - if ( trimmedRoot.length() >= 4 ) - { - return trimmedRoot; - } - - return "Ensemble"; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Application/Tools/RiaSummaryTools.h b/ApplicationLibCode/Application/Tools/RiaSummaryTools.h index 19e9f3f65f..91072498b7 100644 --- a/ApplicationLibCode/Application/Tools/RiaSummaryTools.h +++ b/ApplicationLibCode/Application/Tools/RiaSummaryTools.h @@ -64,8 +64,6 @@ class RiaSummaryTools std::vector& cases, std::vector& addresses ); - static QString findSuitableEnsembleName( const QStringList& summaryCaseFileNames ); - static std::pair, std::vector> resampledValuesForPeriod( const RifEclipseSummaryAddress& address, const std::vector& timeSteps, diff --git a/ApplicationLibCode/Application/Tools/RiaVec3Tools.cpp b/ApplicationLibCode/Application/Tools/RiaVec3Tools.cpp new file mode 100644 index 0000000000..f652d72da1 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaVec3Tools.cpp @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaVec3Tools.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RiaVec3Tools::invertZSign( const cvf::Vec3d& source ) +{ + return { source.x(), source.y(), -source.z() }; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiaVec3Tools::invertZSign( const std::vector& source ) +{ + std::vector points; + + points.reserve( source.size() ); + for ( const auto& p : source ) + { + points.emplace_back( invertZSign( p ) ); + } + + return points; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3f RiaVec3Tools::invertZSign( const cvf::Vec3f& source ) +{ + return { source.x(), source.y(), -source.z() }; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RiaVec3Tools::invertZSign( const std::vector& source ) +{ + std::vector points; + + points.reserve( source.size() ); + for ( const auto& p : source ) + { + points.emplace_back( invertZSign( p ) ); + } + + return points; +} diff --git a/ApplicationLibCode/Application/Tools/RiaVec3Tools.h b/ApplicationLibCode/Application/Tools/RiaVec3Tools.h new file mode 100644 index 0000000000..a525fc6b08 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaVec3Tools.h @@ -0,0 +1,36 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfVector3.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RiaVec3Tools +{ +public: + static cvf::Vec3d invertZSign( const cvf::Vec3d& source ); + static std::vector invertZSign( const std::vector& source ); + + static cvf::Vec3f invertZSign( const cvf::Vec3f& source ); + static std::vector invertZSign( const std::vector& source ); +}; diff --git a/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.cpp b/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.cpp new file mode 100644 index 0000000000..dd435c50c0 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.cpp @@ -0,0 +1,195 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RiaWellLogCurveMerger.h" + +#include "RiaCurveMerger.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaWellLogCurveMerger::RiaWellLogCurveMerger() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaWellLogCurveMerger::addCurveData( const std::vector& xValues, const std::vector& yValues ) +{ + CVF_ASSERT( xValues.size() == yValues.size() ); + + if ( !xValues.empty() ) + { + m_originalValues.push_back( std::make_pair( xValues, yValues ) ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RiaWellLogCurveMerger::curveCount() const +{ + return m_lookupValuesForAllCurves.size(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaCurveDataTools::CurveIntervals RiaWellLogCurveMerger::validIntervalsForAllXValues() const +{ + return m_validIntervalsForAllXValues; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RiaWellLogCurveMerger::allXValues() const +{ + return m_allXValues; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RiaWellLogCurveMerger::lookupYValuesForAllXValues( size_t curveIdx ) const +{ + CVF_ASSERT( curveIdx < m_lookupValuesForAllCurves.size() ); + + return m_lookupValuesForAllCurves[curveIdx]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RiaWellLogCurveMerger::computeLookupValues( bool includeValuesFromPartialCurves ) +{ + m_validIntervalsForAllXValues.clear(); + m_allXValues.clear(); + m_lookupValuesForAllCurves.clear(); + + computeUnionOfXValues( includeValuesFromPartialCurves ); + + const size_t curveCount = m_originalValues.size(); + if ( curveCount == 0 ) + { + return; + } + + const size_t dataValueCount = m_allXValues.size(); + if ( dataValueCount == 0 ) + { + return; + } + + m_lookupValuesForAllCurves.resize( curveCount ); + + std::vector accumulatedValidValues( dataValueCount, 1.0 ); + + for ( size_t curveIdx = 0; curveIdx < curveCount; curveIdx++ ) + { + std::vector& curveValues = m_lookupValuesForAllCurves[curveIdx]; + curveValues.resize( dataValueCount ); + + for ( size_t valueIndex = 0; valueIndex < dataValueCount; valueIndex++ ) + { + double interpolValue = lookupYValue( m_allXValues[valueIndex], + m_originalValues[curveIdx].first, + m_originalValues[curveIdx].second ); + if ( !RiaCurveDataTools::isValidValue( interpolValue, false ) ) + { + accumulatedValidValues[valueIndex] = HUGE_VAL; + } + + curveValues[valueIndex] = interpolValue; + } + } + + m_validIntervalsForAllXValues = RiaCurveDataTools::calculateIntervalsOfValidValues( accumulatedValidValues, false ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- + +void RiaWellLogCurveMerger::computeUnionOfXValues( bool includeValuesForPartialCurves ) +{ + m_allXValues.clear(); + + std::set> unionOfXValues; + + std::vector> originalXBounds; + for ( const auto& curveData : m_originalValues ) + { + if ( curveData.first.empty() ) continue; + + // Well log data has top and bottom depth for each zone + // Find the mid point in the zone to + const std::vector& xValues = curveData.first; + for ( size_t i = 0; i < xValues.size(); i += 2 ) + { + if ( i + 1 < xValues.size() ) + { + double top = xValues.at( i ); + double bottom = xValues.at( i + 1 ); + double mid = ( top + bottom ) / 2.0; + unionOfXValues.insert( mid ); + } + } + auto minmax_it = std::minmax_element( curveData.first.begin(), curveData.first.end() ); + originalXBounds.push_back( std::make_pair( *( minmax_it.first ), *( minmax_it.second ) ) ); + } + + if ( !includeValuesForPartialCurves ) + RiaCurveMerger::removeValuesForPartialCurves( unionOfXValues, originalXBounds ); + + m_allXValues = std::vector( unionOfXValues.begin(), unionOfXValues.end() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RiaWellLogCurveMerger::lookupYValue( const double& interpolationXValue, + const std::vector& xValues, + const std::vector& yValues ) +{ + if ( yValues.size() != xValues.size() ) return HUGE_VAL; + + const bool removeInterpolatedValues = false; + + if ( interpolationXValue < xValues[0] ) return HUGE_VAL; + + for ( size_t firstI = 0; firstI < xValues.size(); firstI++ ) + { + if ( xValues.at( firstI ) >= interpolationXValue ) + { + double firstValue = yValues.at( firstI ); + if ( !RiaCurveDataTools::isValidValue( firstValue, removeInterpolatedValues ) ) + { + return HUGE_VAL; + } + + return firstValue; + } + } + + return HUGE_VAL; +} diff --git a/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.h b/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.h new file mode 100644 index 0000000000..29c5548025 --- /dev/null +++ b/ApplicationLibCode/Application/Tools/RiaWellLogCurveMerger.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaCurveDataTools.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RiaWellLogCurveMerger +{ +public: + RiaWellLogCurveMerger(); + + void addCurveData( const std::vector& xValues, const std::vector& yValues ); + size_t curveCount() const; + + void computeLookupValues( bool includeValuesFromPartialCurves = true ); + + RiaCurveDataTools::CurveIntervals validIntervalsForAllXValues() const; + const std::vector& allXValues() const; + const std::vector& lookupYValuesForAllXValues( size_t curveIdx ) const; + +private: + void computeUnionOfXValues( bool includeValuesFromPartialCurves ); + + static double lookupYValue( const double& xValue, + const std::vector& curveXValues, + const std::vector& curveYValues ); + + std::vector, std::vector>> m_originalValues; + + RiaCurveDataTools::CurveIntervals m_validIntervalsForAllXValues; + + std::vector m_allXValues; + std::vector> m_lookupValuesForAllCurves; +}; diff --git a/ApplicationLibCode/Application/Tools/WellPathTools/CMakeLists_files.cmake b/ApplicationLibCode/Application/Tools/WellPathTools/CMakeLists_files.cmake index 0153169841..7e20e2818b 100644 --- a/ApplicationLibCode/Application/Tools/WellPathTools/CMakeLists_files.cmake +++ b/ApplicationLibCode/Application/Tools/WellPathTools/CMakeLists_files.cmake @@ -1,34 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES - -${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler.h -${CMAKE_CURRENT_LIST_DIR}/RiaWellPlanCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaSCurveCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RiaLineArcWellPathCalculator.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler.h + ${CMAKE_CURRENT_LIST_DIR}/RiaWellPlanCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaSCurveCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RiaLineArcWellPathCalculator.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWellPlanCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSCurveCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaLineArcWellPathCalculator.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWellPlanCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSCurveCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaArcCurveCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaJCurveCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaLineArcWellPathCalculator.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) - -set (QT_MOC_HEADERS -${QT_MOC_HEADERS} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) +set(QT_MOC_HEADERS ${QT_MOC_HEADERS}) -source_group( "Application\\Tools\\WellPathTools" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "Application\\Tools\\WellPathTools" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/CMakeLists.txt b/ApplicationLibCode/CMakeLists.txt index 61668112a2..564ddf3e3b 100644 --- a/ApplicationLibCode/CMakeLists.txt +++ b/ApplicationLibCode/CMakeLists.txt @@ -14,19 +14,22 @@ endif() if(CMAKE_COMPILER_IS_GNUCXX) set(CMAKE_CXX_FLAGS - "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wno-deprecated-declarations") + "${CMAKE_CXX_FLAGS} -Wno-deprecated -Wno-deprecated-declarations" + ) endif() # Open GL find_package(OpenGL) option(RESINSIGHT_TREAT_WARNINGS_AS_ERRORS - "Treat warnings as errors (stops build)" OFF) + "Treat warnings as errors (stops build)" OFF +) find_package( Qt5 COMPONENTS Core - QUIET) + QUIET +) if(Qt5Core_FOUND) find_package( @@ -41,7 +44,8 @@ if(Qt5Core_FOUND) Concurrent PrintSupport Svg - OPTIONAL_COMPONENTS Charts) + OPTIONAL_COMPONENTS Charts + ) set(QT_LIBRARIES Qt5::Core Qt5::Gui @@ -52,7 +56,8 @@ if(Qt5Core_FOUND) Qt5::Xml Qt5::Concurrent Qt5::PrintSupport - Qt5::Svg) + Qt5::Svg + ) if(Qt5Charts_FOUND) list(APPEND QT_LIBRARIES Qt5::Charts) endif(Qt5Charts_FOUND) @@ -60,11 +65,15 @@ endif(Qt5Core_FOUND) # NB: The generated file is written to Cmake binary folder to avoid source tree # pollution This folder is added to include_directories -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Adm/RiaVersionInfo.h.cmake - ${CMAKE_BINARY_DIR}/Generated/RiaVersionInfo.h) - -configure_file(${CMAKE_CURRENT_LIST_DIR}/RiuThemesDirectory.h.cmake - ${CMAKE_BINARY_DIR}/Generated/RiuThemesDirectory.h) +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/Adm/RiaVersionInfo.h.cmake + ${CMAKE_BINARY_DIR}/Generated/RiaVersionInfo.h +) + +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/RiuThemesDirectory.h.cmake + ${CMAKE_BINARY_DIR}/Generated/RiuThemesDirectory.h +) if(MSVC) # Avoid Qt warnings about macro redefinitions for math constants add_definitions(-D_USE_MATH_DEFINES) @@ -106,9 +115,13 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/StimPlanModel ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/Summary ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/Surfaces + ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/Intersections ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/Streamlines ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/CellFilters ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/ProcessControl + ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/WellLog + ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/WellMeasurement + ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModel/WellPath ${CMAKE_CURRENT_SOURCE_DIR}/ProjectDataModelCommands ${CMAKE_CURRENT_SOURCE_DIR}/ResultStatisticsCache ${CMAKE_CURRENT_SOURCE_DIR}/ReservoirDataModel @@ -117,7 +130,8 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/GeoMech/GeoMechDataModel ${CMAKE_CURRENT_SOURCE_DIR}/GeoMech/GeoMechVisualization ${CMAKE_BINARY_DIR}/Generated - ${CMAKE_CURRENT_BINARY_DIR}) + ${CMAKE_CURRENT_BINARY_DIR} +) # ############################################################################## # Eigen @@ -144,7 +158,8 @@ set(SOCKET_INTERFACE_FILES SocketInterface/RiaPropertyDataCommands.cpp SocketInterface/RiaWellDataCommands.cpp SocketInterface/RiaSocketTools.cpp - SocketInterface/RiaSocketDataTransfer.cpp) + SocketInterface/RiaSocketDataTransfer.cpp +) list(APPEND CPP_SOURCES ${SOCKET_INTERFACE_FILES} ${UNIT_TEST_FILES}) @@ -175,9 +190,14 @@ list( ProjectDataModel/StimPlanModel/CMakeLists_files.cmake ProjectDataModel/Streamlines/CMakeLists_files.cmake ProjectDataModel/Surfaces/CMakeLists_files.cmake + ProjectDataModel/Intersections/CMakeLists_files.cmake ProjectDataModel/CellFilters/CMakeLists_files.cmake ProjectDataModel/ProcessControl/CMakeLists_files.cmake + ProjectDataModel/WellLog/CMakeLists_files.cmake + ProjectDataModel/WellMeasurement/CMakeLists_files.cmake + ProjectDataModel/WellPath/CMakeLists_files.cmake ProjectDataModelCommands/CMakeLists_files.cmake + ProjectDataModelCommands/CommandRouter/CMakeLists_files.cmake GeoMech/GeoMechVisualization/CMakeLists_files.cmake ModelVisualization/CMakeLists_files.cmake ModelVisualization/GridBox/CMakeLists_files.cmake @@ -188,10 +208,12 @@ list( UserInterface/CMakeLists_files.cmake UserInterface/AnalysisPlots/CMakeLists_files.cmake CommandFileInterface/CMakeLists_files.cmake - CommandFileInterface/Core/CMakeLists_files.cmake) + CommandFileInterface/Core/CMakeLists_files.cmake +) option(RESINSIGHT_INCLUDE_APPLICATION_UNIT_TESTS - "Include ApplicationCode Unit Tests" OFF) + "Include ApplicationCode Unit Tests" OFF +) mark_as_advanced(FORCE RESINSIGHT_INCLUDE_APPLICATION_UNIT_TESTS) if(RESINSIGHT_INCLUDE_APPLICATION_UNIT_TESTS) add_definitions(-DUSE_UNIT_TESTS) @@ -199,7 +221,8 @@ if(RESINSIGHT_INCLUDE_APPLICATION_UNIT_TESTS) list(APPEND REFERENCED_CMAKE_FILES UnitTests/CMakeLists_files.cmake) list(APPEND CPP_SOURCES - ${ResInsight_SOURCE_DIR}/ThirdParty/gtest/gtest-all.cc) + ${ResInsight_SOURCE_DIR}/ThirdParty/gtest/gtest-all.cc + ) endif() @@ -246,7 +269,8 @@ if(RESINSIGHT_FOUND_HDF5) FileInterface/RifHdf5Exporter.h FileInterface/RifHdf5Exporter.cpp FileInterface/RifHdf5SummaryExporter.h - FileInterface/RifHdf5SummaryExporter.cpp) + FileInterface/RifHdf5SummaryExporter.cpp + ) list(APPEND CPP_SOURCES ${HDF5_FILES}) @@ -273,7 +297,9 @@ endif() set(QT_MOC_HEADERS ${QT_MOC_HEADERS} ProjectDataModel/RimMimeData.h - ProjectDataModel/RimBoxIntersection.h SocketInterface/RiaSocketServer.h) + ProjectDataModel/Intersections/RimBoxIntersection.h + SocketInterface/RiaSocketServer.h +) qt5_wrap_cpp(MOC_SOURCE_FILES ${QT_MOC_HEADERS}) qt5_wrap_ui(FORM_FILES_CPP ${QT_UI_FILES}) @@ -296,7 +322,8 @@ list( ../ResInsightVersion.cmake .clang-format .clang-tidy - Adm/RiaVersionInfo.h.cmake) + Adm/RiaVersionInfo.h.cmake +) add_library(${PROJECT_NAME} OBJECT ${ALL_SOURCE_FILES}) @@ -308,7 +335,8 @@ if(RESINSIGHT_ENABLE_PRECOMPILED_HEADERS) set_source_files_properties( ${ResInsight_SOURCE_DIR}/ThirdParty/gtest/gtest-all.cc - PROPERTIES SKIP_PRECOMPILE_HEADERS ON) + PROPERTIES SKIP_PRECOMPILE_HEADERS ON + ) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") @@ -316,7 +344,8 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "-Wall -Wno-unused-parameter -Wno-reorder -Wno-parentheses -Wno-switch") + "-Wall -Wno-unused-parameter -Wno-reorder -Wno-parentheses -Wno-switch" + ) # Treat warnings as errors if asked to do so if(RESINSIGHT_TREAT_WARNINGS_AS_ERRORS) set_target_properties( @@ -363,8 +392,9 @@ if(MSVC) endif() message(STATUS "BUILD_FLAGS_FOR_MSVC ${BUILD_FLAGS_FOR_MSVC}") - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - ${BUILD_FLAGS_FOR_MSVC}) + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS_FOR_MSVC} + ) endif() @@ -380,7 +410,8 @@ set(LINK_LIBRARIES ${OPM_LIBRARIES} ${APP_FWK_LIBRARIES} ${VIZ_FWK_LIBRARIES} - ${RI_LIBRARIES}) + ${RI_LIBRARIES} +) # According to ivarun this is needed on OpenSuse, and Fedora. See: # https://github.com/OPM/ResInsight/pull/7 @@ -388,13 +419,15 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") list(APPEND EXTERNAL_LINK_LIBRARIES rt) endif() -target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARIES} - ${EXTERNAL_LINK_LIBRARIES}) +target_link_libraries( + ${PROJECT_NAME} ${LINK_LIBRARIES} ${EXTERNAL_LINK_LIBRARIES} +) target_include_directories( ${PROJECT_NAME} PRIVATE ${CMAKE_BINARY_DIR}/Generated - PUBLIC ${CMAKE_SOURCE_DIR}/ApplicationLibCode/Application + PUBLIC ${CMAKE_SOURCE_DIR}/ApplicationLibCode + ${CMAKE_SOURCE_DIR}/ApplicationLibCode/Application ${CMAKE_SOURCE_DIR}/ApplicationLibCode/Application/Tools ${CMAKE_SOURCE_DIR}/ApplicationLibCode/CommandFileInterface ${CMAKE_SOURCE_DIR}/ApplicationLibCode/CommandFileInterface/Core @@ -403,9 +436,11 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/ApplicationLibCode/ModelVisualization ${CMAKE_SOURCE_DIR}/ApplicationLibCode/ProjectDataModel ${CMAKE_SOURCE_DIR}/ApplicationLibCode/ProjectDataModel/Flow + ${CMAKE_SOURCE_DIR}/ApplicationLibCode/ProjectDataModel/Intersections ${CMAKE_SOURCE_DIR}/ApplicationLibCode/ReservoirDataModel ${CMAKE_SOURCE_DIR}/ApplicationLibCode/SocketInterface - ${CMAKE_SOURCE_DIR}/ApplicationLibCode/UserInterface) + ${CMAKE_SOURCE_DIR}/ApplicationLibCode/UserInterface +) # ############################################################################## # Unity builds @@ -420,11 +455,13 @@ set(UNITY_EXCLUDE_FILES qrc_cafCommandFeatures.cpp # Exclude files including opm-common ProjectDataModel/RimVfpTableExtractor.cpp - ProjectDataModel/RimVfpPlot.cpp) + ProjectDataModel/RimVfpPlot.cpp +) if(RESINSIGHT_ENABLE_UNITY_BUILD) foreach(fileToExclude ${UNITY_EXCLUDE_FILES}) - set_source_files_properties(${fileToExclude} - PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE) + set_source_files_properties( + ${fileToExclude} PROPERTIES SKIP_UNITY_BUILD_INCLUSION TRUE + ) endforeach(fileToExclude) endif() diff --git a/ApplicationLibCode/CommandFileInterface/CMakeLists_files.cmake b/ApplicationLibCode/CommandFileInterface/CMakeLists_files.cmake index 7056c2e57f..58f7e0900b 100644 --- a/ApplicationLibCode/CommandFileInterface/CMakeLists_files.cmake +++ b/ApplicationLibCode/CommandFileInterface/CMakeLists_files.cmake @@ -1,92 +1,91 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicfCloseProject.h -${CMAKE_CURRENT_LIST_DIR}/RicfCommandFileExecutor.h -${CMAKE_CURRENT_LIST_DIR}/RicfComputeCaseGroupStatistics.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportMsw.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportMultiCaseSnapshots.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportProperty.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportSimWellFractureCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportSnapshots.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPathCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RicfLoadCase.h -${CMAKE_CURRENT_LIST_DIR}/RicfOpenProject.h -${CMAKE_CURRENT_LIST_DIR}/RicfReplaceCase.h -${CMAKE_CURRENT_LIST_DIR}/RicfReplaceSourceCases.h -${CMAKE_CURRENT_LIST_DIR}/RicfRunOctaveScript.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetExportFolder.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetMainWindowSize.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetPlotWindowSize.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetStartDir.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetTimeStep.h -${CMAKE_CURRENT_LIST_DIR}/RicfScaleFractureTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RicfSetFractureContainment.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateMultipleFractures.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPaths.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportVisibleCells.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.h -${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.h -${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.h -${CMAKE_CURRENT_LIST_DIR}/RicfNewWellBoreStabilityPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.h -${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.h -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicfCloseProject.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCommandFileExecutor.h + ${CMAKE_CURRENT_LIST_DIR}/RicfComputeCaseGroupStatistics.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportMsw.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportMultiCaseSnapshots.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportProperty.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportSimWellFractureCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportSnapshots.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPathCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RicfLoadCase.h + ${CMAKE_CURRENT_LIST_DIR}/RicfOpenProject.h + ${CMAKE_CURRENT_LIST_DIR}/RicfReplaceCase.h + ${CMAKE_CURRENT_LIST_DIR}/RicfReplaceSourceCases.h + ${CMAKE_CURRENT_LIST_DIR}/RicfRunOctaveScript.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetExportFolder.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetMainWindowSize.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetPlotWindowSize.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetStartDir.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetTimeStep.h + ${CMAKE_CURRENT_LIST_DIR}/RicfScaleFractureTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RicfSetFractureContainment.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateMultipleFractures.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPaths.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportVisibleCells.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.h + ${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.h + ${CMAKE_CURRENT_LIST_DIR}/RicfNewWellBoreStabilityPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.h + ${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.h + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicfCloseProject.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCommandFileExecutor.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfComputeCaseGroupStatistics.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportMsw.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportMultiCaseSnapshots.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportProperty.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportSimWellFractureCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportSnapshots.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPathCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfLoadCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfOpenProject.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfReplaceCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfReplaceSourceCases.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfRunOctaveScript.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetExportFolder.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetMainWindowSize.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetPlotWindowSize.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetStartDir.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetTimeStep.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfScaleFractureTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfSetFractureContainment.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateMultipleFractures.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPaths.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportVisibleCells.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfCreateWellBoreStabilityPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.cpp -${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicfCloseProject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCommandFileExecutor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfComputeCaseGroupStatistics.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportMsw.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportMultiCaseSnapshots.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportProperty.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportSimWellFractureCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportSnapshots.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPathCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfLoadCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfOpenProject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfReplaceCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfReplaceSourceCases.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfRunOctaveScript.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetExportFolder.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetMainWindowSize.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetPlotWindowSize.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetStartDir.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetTimeStep.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfScaleFractureTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfSetFractureContainment.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateMultipleFractures.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellPaths.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportVisibleCells.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportPropertyInViews.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportLgrForCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateLgrForCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfApplicationTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateSaturationPressurePlots.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportFlowCharacteristics.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateGridCaseGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateStatisticsCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCloneView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfCreateWellBoreStabilityPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfImportWellLogFiles.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfImportFormationNames.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicfExportWellLogPlotData.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFileInterface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFileInterface" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/CommandFileInterface/Core/CMakeLists_files.cmake b/ApplicationLibCode/CommandFileInterface/Core/CMakeLists_files.cmake index 89b16d4d82..d541606e5f 100644 --- a/ApplicationLibCode/CommandFileInterface/Core/CMakeLists_files.cmake +++ b/ApplicationLibCode/CommandFileInterface/Core/CMakeLists_files.cmake @@ -1,20 +1,18 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicfCommandObject.h -${CMAKE_CURRENT_LIST_DIR}/RifcCommandFileReader.h +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RicfCommandObject.h + ${CMAKE_CURRENT_LIST_DIR}/RifcCommandFileReader.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicfCommandObject.cpp -${CMAKE_CURRENT_LIST_DIR}/RifcCommandFileReader.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicfCommandObject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifcCommandFileReader.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFileInterface\\Core" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFileInterface\\Core" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/CommandFileInterface/RicfCreateView.cpp b/ApplicationLibCode/CommandFileInterface/RicfCreateView.cpp index cb5825c415..af3e6f1796 100644 --- a/ApplicationLibCode/CommandFileInterface/RicfCreateView.cpp +++ b/ApplicationLibCode/CommandFileInterface/RicfCreateView.cpp @@ -56,16 +56,16 @@ caf::PdmScriptResponse RicfCreateView::execute() if ( eclipseCase ) { RimEclipseView* view = eclipseCase->createAndAddReservoirView(); - viewId = view->id(); view->loadDataAndUpdate(); + viewId = view->id(); eclipseCase->updateConnectedEditors(); Riu3DMainWindowTools::setExpanded( view ); } else if ( geoMechCase ) { RimGeoMechView* view = geoMechCase->createAndAddReservoirView(); - viewId = view->id(); view->loadDataAndUpdate(); + viewId = view->id(); geoMechCase->updateConnectedEditors(); Riu3DMainWindowTools::setExpanded( view ); } diff --git a/ApplicationLibCode/CommandFileInterface/RicfLoadCase.cpp b/ApplicationLibCode/CommandFileInterface/RicfLoadCase.cpp index 764039e1cc..6657a13dd2 100644 --- a/ApplicationLibCode/CommandFileInterface/RicfLoadCase.cpp +++ b/ApplicationLibCode/CommandFileInterface/RicfLoadCase.cpp @@ -20,9 +20,10 @@ #include "RicfLoadCase.h" #include "RiaApplication.h" -#include "RiaImportEclipseCaseTools.h" #include "RiaLogging.h" +#include "RicImportGeneralDataFeature.h" +#include "RifReaderSettings.h" #include "cafPdmFieldScriptingCapability.h" #include @@ -48,6 +49,7 @@ CAF_PDM_SOURCE_INIT( RicfLoadCase, "loadCase" ); RicfLoadCase::RicfLoadCase() { CAF_PDM_InitScriptableField( &m_path, "path", QString(), "Path to Case File", "", "", "" ); + CAF_PDM_InitScriptableField( &m_gridOnly, "gridOnly", false, "Load Grid Data Only", "", "", "" ); } //-------------------------------------------------------------------------------------------------- @@ -63,16 +65,24 @@ caf::PdmScriptResponse RicfLoadCase::execute() absolutePath = startDir.absoluteFilePath( m_path ); } - RiaImportEclipseCaseTools::FileCaseIdMap fileCaseIdMap; - bool ok = RiaImportEclipseCaseTools::openEclipseCasesFromFile( QStringList( { absolutePath } ), &fileCaseIdMap, true ); - if ( !ok ) + std::shared_ptr readerSettings; + if ( m_gridOnly ) readerSettings = RifReaderSettings::createGridOnlyReaderSettings(); + + bool createPlot = false; + bool createView = false; + auto fileOpenMetaData = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList{ absolutePath }, + createPlot, + createView, + readerSettings ); + + if ( fileOpenMetaData.createdCaseIds.empty() ) { QString error = QString( "loadCase: Unable to load case from %1" ).arg( absolutePath ); RiaLogging::error( error ); return caf::PdmScriptResponse( caf::PdmScriptResponse::COMMAND_ERROR, error ); } - CAF_ASSERT( fileCaseIdMap.size() == 1u ); + caf::PdmScriptResponse response; - response.setResult( new RicfLoadCaseResult( fileCaseIdMap.begin()->second ) ); + response.setResult( new RicfLoadCaseResult( fileOpenMetaData.createdCaseIds.front() ) ); return response; } diff --git a/ApplicationLibCode/CommandFileInterface/RicfLoadCase.h b/ApplicationLibCode/CommandFileInterface/RicfLoadCase.h index 25ba7a9eb2..6c14dabb71 100644 --- a/ApplicationLibCode/CommandFileInterface/RicfLoadCase.h +++ b/ApplicationLibCode/CommandFileInterface/RicfLoadCase.h @@ -50,4 +50,5 @@ class RicfLoadCase : public RicfCommandObject private: caf::PdmField m_path; + caf::PdmField m_gridOnly; }; diff --git a/ApplicationLibCode/Commands/AnalysisPlotCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/AnalysisPlotCommands/CMakeLists_files.cmake index 63187ab401..963c58b3ee 100644 --- a/ApplicationLibCode/Commands/AnalysisPlotCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/AnalysisPlotCommands/CMakeLists_files.cmake @@ -1,20 +1,19 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewAnalysisPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPlotDataFilterFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewAnalysisPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPlotDataFilterFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewAnalysisPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPlotDataFilterFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewAnalysisPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPlotDataFilterFeature.cpp ) -list(APPEND COMMAND_COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\AnalysisPlotCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\AnalysisPlotCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/AnnotationCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/AnnotationCommands/CMakeLists_files.cmake index b41f769daa..eee729026e 100644 --- a/ApplicationLibCode/Commands/AnnotationCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/AnnotationCommands/CMakeLists_files.cmake @@ -1,34 +1,32 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationIn3dViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateReachCircleAnnotationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateUserDefinedPolylinesAnnotationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationIn3dViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateReachCircleAnnotationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateUserDefinedPolylinesAnnotationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationIn3dViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateReachCircleAnnotationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateUserDefinedPolylinesAnnotationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportPolylinesAnnotationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTextAnnotationIn3dViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateReachCircleAnnotationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateUserDefinedPolylinesAnnotationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -set (COMMAND_QT_MOC_HEADERS -${COMMAND_QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h +set(COMMAND_QT_MOC_HEADERS + ${COMMAND_QT_MOC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h ) - -source_group( "CommandFeature\\AnnotationCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\AnnotationCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/ApplicationCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/ApplicationCommands/CMakeLists_files.cmake index 9773c8b899..9242df0179 100644 --- a/ApplicationLibCode/Commands/ApplicationCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/ApplicationCommands/CMakeLists_files.cmake @@ -1,61 +1,57 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicLaunchUnitTestsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowPlotWindowFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowMainWindowFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicTileWindowsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicOpenProjectFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicOpenLastUsedFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectAsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExitApplicationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCloseProjectFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHelpFeatures.h -${CMAKE_CURRENT_LIST_DIR}/RicEditPreferencesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowPlotDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicLaunchRegressionTestsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicRunCommandFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowMemoryCleanupDialogFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigEclipseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigGeoMechFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportObjectAndFieldKeywordsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectNoGlobalPathsFeature.h -) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicLaunchUnitTestsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowPlotWindowFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowMainWindowFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicTileWindowsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicOpenProjectFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicOpenLastUsedFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectAsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExitApplicationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCloseProjectFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHelpFeatures.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEditPreferencesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowPlotDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicLaunchRegressionTestsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRunCommandFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowMemoryCleanupDialogFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigEclipseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigGeoMechFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportObjectAndFieldKeywordsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectNoGlobalPathsFeature.cpp +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicLaunchUnitTestsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowPlotWindowFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowMainWindowFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicTileWindowsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicOpenProjectFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicOpenLastUsedFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectAsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExitApplicationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseProjectFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHelpFeatures.h + ${CMAKE_CURRENT_LIST_DIR}/RicEditPreferencesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowPlotDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicLaunchRegressionTestsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunCommandFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowMemoryCleanupDialogFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigEclipseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigGeoMechFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportObjectAndFieldKeywordsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectNoGlobalPathsFeature.h ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicLaunchUnitTestsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowPlotWindowFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowMainWindowFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicTileWindowsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicOpenProjectFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicOpenLastUsedFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectAsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExitApplicationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseProjectFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHelpFeatures.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEditPreferencesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowPlotDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicLaunchRegressionTestsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunCommandFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowMemoryCleanupDialogFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigEclipseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDefaultDockConfigGeoMechFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportObjectAndFieldKeywordsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveProjectNoGlobalPathsFeature.cpp ) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -set (COMMAND_QT_MOC_HEADERS -${COMMAND_QT_MOC_HEADERS} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) +set(COMMAND_QT_MOC_HEADERS ${COMMAND_QT_MOC_HEADERS}) -source_group( "CommandFeature\\Application" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Application" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/CMakeLists.txt b/ApplicationLibCode/Commands/CMakeLists.txt index f0ba15fd9d..104491fae3 100644 --- a/ApplicationLibCode/Commands/CMakeLists.txt +++ b/ApplicationLibCode/Commands/CMakeLists.txt @@ -40,7 +40,8 @@ set(COMMAND_REFERENCED_CMAKE_FILES WellLogCommands/CMakeLists_files.cmake WellPathCommands/CMakeLists_files.cmake PlotTemplateCommands/CMakeLists_files.cmake - FractureCommands/CMakeLists_files.cmake) + FractureCommands/CMakeLists_files.cmake +) # Include source file lists from *.cmake files foreach(referencedfile ${COMMAND_REFERENCED_CMAKE_FILES}) @@ -55,13 +56,15 @@ qt5_wrap_cpp(COMMAND_MOC_SOURCE_FILES ${COMMAND_QT_MOC_HEADERS}) add_library( ${PROJECT_NAME} OBJECT ${COMMAND_CODE_SOURCE_FILES} ${COMMAND_CODE_HEADER_FILES} - ${COMMAND_MOC_SOURCE_FILES}) + ${COMMAND_MOC_SOURCE_FILES} +) target_include_directories( ${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/ThirdParty ${CMAKE_SOURCE_DIR}/ThirdParty/custom-opm-common/generated-opm-common - ${CMAKE_SOURCE_DIR}/ThirdParty/custom-opm-common/opm-common) + ${CMAKE_SOURCE_DIR}/ThirdParty/custom-opm-common/opm-common +) if(MSVC) # The following warnings are supposed to be used in ResInsight, but @@ -88,8 +91,9 @@ if(MSVC) set(BUILD_FLAGS_FOR_MSVC "${BUILD_FLAGS_FOR_MSVC} /wd4505") endif() - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - ${BUILD_FLAGS_FOR_MSVC}) + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS ${BUILD_FLAGS_FOR_MSVC} + ) endif() @@ -105,7 +109,8 @@ set(LINK_LIBRARIES nightcharts qwt ${QT_LIBRARIES} - Eigen3::Eigen) + Eigen3::Eigen +) target_link_libraries(${PROJECT_NAME} PRIVATE ${LINK_LIBRARIES}) diff --git a/ApplicationLibCode/Commands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CMakeLists_files.cmake index 0a5e33508d..a5a02c5e38 100644 --- a/ApplicationLibCode/Commands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CMakeLists_files.cmake @@ -1,194 +1,196 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicWellLogTools.h -${CMAKE_CURRENT_LIST_DIR}/RicCloseCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseInCollectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCloseObservedDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryCaseCollectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewContourMapViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportFaciesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportFormationNamesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadFormationNamesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadWellPathFormationNamesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionBoxFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportElementPropertyFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSelectColorResult.h - -${CMAKE_CURRENT_LIST_DIR}/RicTogglePerspectiveViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCasesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataInMenuFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataInMenuFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportGeneralDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportFeatureImpl.h - -${CMAKE_CURRENT_LIST_DIR}/RicSelectOrCreateViewFeatureImpl.h - -${CMAKE_CURRENT_LIST_DIR}/RicPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/Ric3dViewPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicContourMapPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicVec3dPickEventHandler.h - -# General delete of any object in a child array field -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExec.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExecData.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubItemsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSummaryCaseCollectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellMeasurementFilePathFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadWellMeasurementsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellMeasurementImportTools.h -${CMAKE_CURRENT_LIST_DIR}/RicImportElasticPropertiesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicElasticPropertiesImportTools.h -${CMAKE_CURRENT_LIST_DIR}/RicFaciesPropertiesImportTools.h - -${CMAKE_CURRENT_LIST_DIR}/RicCloseSourSimDataFeature.h - -${CMAKE_CURRENT_LIST_DIR}/RicReloadCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReplaceCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReplaceSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicFlyToObjectFeature.h - -${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h - -${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryGroupFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicConvertGroupToEnsembleFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateTemporaryLgrFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteTemporaryLgrsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextUi.h -${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportStimPlanModelToFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicStackSelectedCurvesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicUnstackSelectedCurvesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicThemeColorEditorFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewVfpPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionWeightFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPressureTableItemFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeletePressureTableItemFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCurveFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseInCollectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseObservedDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryCaseCollectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewContourMapViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportFaciesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportFormationNamesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadFormationNamesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadWellPathFormationNamesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionBoxFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportElementPropertyFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSelectColorResult.h + ${CMAKE_CURRENT_LIST_DIR}/RicTogglePerspectiveViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCasesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataInMenuFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataInMenuFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeneralDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicSelectOrCreateViewFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/Ric3dViewPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicContourMapPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicVec3dPickEventHandler.h + # General delete of any object in a child array field + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExecData.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubItemsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSummaryCaseCollectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellMeasurementFilePathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadWellMeasurementsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellMeasurementImportTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportElasticPropertiesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicElasticPropertiesImportTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicFaciesPropertiesImportTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSourSimDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReplaceCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReplaceSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicFlyToObjectFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryGroupFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleSurfaceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicConvertGroupToEnsembleFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleWellLogsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTemporaryLgrFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteTemporaryLgrsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportStimPlanModelToFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicStackSelectedCurvesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicUnstackSelectedCurvesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicThemeColorEditorFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewVfpPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionWeightFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPressureTableItemFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeletePressureTableItemFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleSurfaceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleSurfaceUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleWellLogFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleWellLogUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSurfaceIntersectionBandFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSurfaceIntersectionCurveFeature.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicWellLogTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCloseCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseInCollectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCloseObservedDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryCaseCollectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewContourMapViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportFaciesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportFormationNamesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadFormationNamesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadWellPathFormationNamesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionBoxFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportElementPropertyFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSelectColorResult.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicTogglePerspectiveViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCasesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataInMenuFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataInMenuFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportGeneralDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportFeatureImpl.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicSelectOrCreateViewFeatureImpl.cpp - -${CMAKE_CURRENT_LIST_DIR}/Ric3dViewPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicContourMapPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicVec3dPickEventHandler.cpp - -# General delete of any object in a child array field -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExecData.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubItemsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSummaryCaseCollectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellMeasurementFilePathFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadWellMeasurementsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellMeasurementImportTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportElasticPropertiesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicElasticPropertiesImportTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicFaciesPropertiesImportTools.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicCloseSourSimDataFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicReloadCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReplaceCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReplaceSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicFlyToObjectFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryGroupFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicConvertGroupToEnsembleFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateTemporaryLgrFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteTemporaryLgrsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportStimPlanModelToFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicStackSelectedCurvesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicUnstackSelectedCurvesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicThemeColorEditorFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewVfpPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionWeightFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPressureTableItemFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeletePressureTableItemFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCurveFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSummaryCaseInCollectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseObservedDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSummaryCaseCollectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewContourMapViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportFaciesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportFormationNamesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadFormationNamesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadWellPathFormationNamesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHideIntersectionBoxFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportElementPropertyFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSelectColorResult.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicTogglePerspectiveViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryCasesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedDataInMenuFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportObservedFmuDataInMenuFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeneralDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSelectOrCreateViewFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/Ric3dViewPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicContourMapPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicVec3dPickEventHandler.cpp + # General delete of any object in a child array field + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemExecData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteItemFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubItemsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSummaryCaseCollectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellMeasurementFilePathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadWellMeasurementsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellMeasurementImportTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportElasticPropertiesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicElasticPropertiesImportTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicFaciesPropertiesImportTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCloseSourSimDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReplaceCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReplaceSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicFlyToObjectFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowGridStatisticsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportSummaryGroupFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleSurfaceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicConvertGroupToEnsembleFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleWellLogsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateTemporaryLgrFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteTemporaryLgrsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportContourMapToTextUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewMultiPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportStimPlanModelToFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicStackSelectedCurvesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicUnstackSelectedCurvesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicThemeColorEditorFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewVfpPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewCustomObjectiveFunctionWeightFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPressureTableItemFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeletePressureTableItemFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportGridModelFromSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleSurfaceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleSurfaceUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleWellLogFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleWellLogUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSurfaceIntersectionBandFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSurfaceIntersectionCurveFeature.cpp ) if(Qt5Charts_FOUND) - list(APPEND SOURCE_GROUP_HEADER_FILES - ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFractureStatisticsPlotFeature.h - ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.h) - list(APPEND SOURCE_GROUP_SOURCE_FILES - ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFractureStatisticsPlotFeature.cpp - ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.cpp) + list( + APPEND SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFractureStatisticsPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.h + ) + list( + APPEND SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCreateEnsembleFractureStatisticsPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridStatisticsPlotFeature.cpp + ) endif() +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +list( + APPEND + COMMAND_QT_MOC_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.h ) -list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RicGridStatisticsDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicRecursiveFileSearchDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCaseRestartDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicResampleDialog.h +source_group( + "CommandFeature" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "CommandFeature" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/Commands/CellFilterCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CellFilterCommands/CMakeLists_files.cmake index 554962f314..812877b9aa 100644 --- a/ApplicationLibCode/Commands/CellFilterCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CellFilterCommands/CMakeLists_files.cmake @@ -1,35 +1,33 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilterFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewUserDefinedFilterFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewCellRangeFilterFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceIFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceJFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceKFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSlice3dviewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilter3dviewFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewUserDefinedFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewCellRangeFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceIFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceJFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceKFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSlice3dviewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilter3dviewFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilterFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewUserDefinedFilterFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewCellRangeFilterFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceIFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceJFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceKFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSlice3dviewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilter3dviewFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewUserDefinedFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewCellRangeFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceIFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceJFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSliceKFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRangeFilterSlice3dviewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolygonFilter3dviewFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) - -source_group( "CommandFeature\\CellFilterCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\CellFilterCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/ColorLegendCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/ColorLegendCommands/CMakeLists_files.cmake index 52591faa88..5945101d7b 100644 --- a/ApplicationLibCode/Commands/ColorLegendCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/ColorLegendCommands/CMakeLists_files.cmake @@ -1,25 +1,23 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportColorCategoriesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCopyStandardLegendFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendItemFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportColorCategoriesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCopyStandardLegendFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendItemFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportColorCategoriesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCopyStandardLegendFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendItemFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportColorCategoriesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCopyStandardLegendFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicInsertColorLegendItemFeature.cpp ) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +source_group( + "CommandFeature\\ColorLegend" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "CommandFeature\\ColorLegend" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/Commands/CompletionCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CompletionCommands/CMakeLists_files.cmake index e1fdfbe6ff..e950793c68 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CompletionCommands/CMakeLists_files.cmake @@ -1,43 +1,41 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicEditPerforationCollectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportFishbonesLateralsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsAtMeasuredDepthFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalAtMeasuredDepthFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewValveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewValveTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewValveAtMeasuredDepthFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteValveTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathImportPerforationIntervalsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFractureStatisticsFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicEditPerforationCollectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportFishbonesLateralsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsAtMeasuredDepthFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalAtMeasuredDepthFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveAtMeasuredDepthFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteValveTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathImportPerforationIntervalsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFractureStatisticsFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicEditPerforationCollectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportFishbonesLateralsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewValveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewValveTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewValveAtMeasuredDepthFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteValveTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathImportPerforationIntervalsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFractureStatisticsFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicEditPerforationCollectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportFishbonesLateralsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewFishbonesSubsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewValveAtMeasuredDepthFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteValveTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathImportPerforationIntervalsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEnsembleFractureStatisticsFeature.cpp ) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +source_group( + "CommandFeature\\Completion" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "CommandFeature\\Completion" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.cpp index 64428dbbbc..4604d60237 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.cpp @@ -18,6 +18,7 @@ #include "RicImportEnsembleFractureStatisticsFeature.h" +#include "RiaEnsembleNameTools.h" #include "RiaGuiApplication.h" #include "RicRecursiveFileSearchDialog.h" @@ -28,6 +29,8 @@ #include "RimOilField.h" #include "RimProject.h" +#include "cafProgressInfo.h" + #include #include @@ -52,9 +55,37 @@ bool RicImportEnsembleFractureStatisticsFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicImportEnsembleFractureStatisticsFeature::onActionTriggered( bool isChecked ) { - RiaGuiApplication* app = RiaGuiApplication::instance(); - QString pathCacheName = "INPUT_FILES"; - QStringList fileNames = runRecursiveFileSearchDialog( "Import StimPlan Fractures", pathCacheName ); + RiaGuiApplication* app = RiaGuiApplication::instance(); + QString pathCacheName = "INPUT_FILES"; + auto [fileNames, groupByEnsemble] = runRecursiveFileSearchDialog( "Import StimPlan Fractures", pathCacheName ); + + if ( groupByEnsemble == RiaEnsembleNameTools::EnsembleGroupingMode::NONE ) + { + importSingleEnsembleFractureStatistics( fileNames ); + } + else + { + std::vector groupedByEnsemble = + RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, groupByEnsemble ); + for ( const QStringList& groupedFileNames : groupedByEnsemble ) + { + importSingleEnsembleFractureStatistics( groupedFileNames ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleFractureStatisticsFeature::importSingleEnsembleFractureStatistics( const QStringList& fileNames ) +{ + auto fractureGroupStatistics = new RimEnsembleFractureStatistics; + QString ensembleNameSuggestion = + RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ); + fractureGroupStatistics->setName( ensembleNameSuggestion ); + + caf::ProgressInfo progInfo( fileNames.size() + 1, "Creating Ensemble Fracture Statistics" ); RimProject* project = RimProject::current(); CVF_ASSERT( project ); @@ -69,14 +100,17 @@ void RicImportEnsembleFractureStatisticsFeature::onActionTriggered( bool isCheck completionTemplateCollection->fractureGroupStatisticsCollection(); if ( !fractureGroupStatisticsCollection ) return; - auto fractureGroupStatistics = new RimEnsembleFractureStatistics; - fractureGroupStatistics->setName( "Ensemble Fracture Statistics" ); - for ( auto f : fileNames ) { + auto task = progInfo.task( "Loading files", 1 ); fractureGroupStatistics->addFilePath( f ); } + { + auto task = progInfo.task( "Generating statistics", 1 ); + fractureGroupStatistics->loadAndUpdateData(); + } + fractureGroupStatisticsCollection->addFractureGroupStatistics( fractureGroupStatistics ); fractureGroupStatisticsCollection->updateConnectedEditors(); @@ -93,8 +127,9 @@ void RicImportEnsembleFractureStatisticsFeature::setupActionLook( QAction* actio //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QStringList RicImportEnsembleFractureStatisticsFeature::runRecursiveFileSearchDialog( const QString& dialogTitle, - const QString& pathCacheName ) +std::pair + RicImportEnsembleFractureStatisticsFeature::runRecursiveFileSearchDialog( const QString& dialogTitle, + const QString& pathCacheName ) { RiaApplication* app = RiaApplication::instance(); QString defaultDir = app->lastUsedDialogDirectory( pathCacheName ); @@ -111,10 +146,10 @@ QStringList RicImportEnsembleFractureStatisticsFeature::runRecursiveFileSearchDi m_pathFilter = result.pathFilter; m_fileNameFilter = result.fileNameFilter; - if ( !result.ok ) return QStringList(); + if ( !result.ok ) return std::make_pair( QStringList(), RiaEnsembleNameTools::EnsembleGroupingMode::NONE ); // Remember the path to next time app->setLastUsedDialogDirectory( pathCacheName, QFileInfo( result.rootDir ).absoluteFilePath() ); - return result.files; + return std::make_pair( result.files, result.groupingMode ); } diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.h b/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.h index ffc3a56ff8..4b6cb2f154 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.h +++ b/ApplicationLibCode/Commands/CompletionCommands/RicImportEnsembleFractureStatisticsFeature.h @@ -20,6 +20,8 @@ #include "cafCmdFeature.h" +#include "RiaEnsembleNameTools.h" + #include //================================================================================================== @@ -32,9 +34,12 @@ class RicImportEnsembleFractureStatisticsFeature : public caf::CmdFeature public: RicImportEnsembleFractureStatisticsFeature() {} - static QStringList runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); + static std::pair + runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); protected: + static void importSingleEnsembleFractureStatistics( const QStringList& fileNames ); + // Overrides bool isCommandEnabled() override; void onActionTriggered( bool isChecked ) override; diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp index 9c10f5ccea..8da6856259 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.cpp @@ -40,7 +40,7 @@ CAF_CMD_SOURCE_INIT( RicNewFishbonesSubsAtMeasuredDepthFeature, "RicNewFishbones //-------------------------------------------------------------------------------------------------- void RicNewFishbonesSubsAtMeasuredDepthFeature::onActionTriggered( bool isChecked ) { - RiuWellPathSelectionItem* wellPathSelItem = wellPathSelectionItem(); + RiuWellPathSelectionItem* wellPathSelItem = RiuWellPathSelectionItem::wellPathSelectionItem(); CVF_ASSERT( wellPathSelItem ); RimWellPath* wellPath = wellPathSelItem->m_wellpath; @@ -63,19 +63,6 @@ void RicNewFishbonesSubsAtMeasuredDepthFeature::onActionTriggered( bool isChecke proj->reloadCompletionTypeResultsInAllViews(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuWellPathSelectionItem* RicNewFishbonesSubsAtMeasuredDepthFeature::wellPathSelectionItem() -{ - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); - - return wellPathItem; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -90,7 +77,7 @@ void RicNewFishbonesSubsAtMeasuredDepthFeature::setupActionLook( QAction* action //-------------------------------------------------------------------------------------------------- bool RicNewFishbonesSubsAtMeasuredDepthFeature::isCommandEnabled() { - if ( wellPathSelectionItem() ) + if ( RiuWellPathSelectionItem::wellPathSelectionItem() ) { return true; } diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.h b/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.h index 848ea0acb0..9d550c5ef2 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.h +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewFishbonesSubsAtMeasuredDepthFeature.h @@ -20,8 +20,6 @@ #include "cafCmdFeature.h" -class RiuWellPathSelectionItem; - //================================================================================================== /// //================================================================================================== @@ -33,7 +31,4 @@ class RicNewFishbonesSubsAtMeasuredDepthFeature : public caf::CmdFeature void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; bool isCommandEnabled() override; - -private: - static RiuWellPathSelectionItem* wellPathSelectionItem(); }; diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp index 309bd0e83d..7aab47c225 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.cpp @@ -41,7 +41,7 @@ CAF_CMD_SOURCE_INIT( RicNewPerforationIntervalAtMeasuredDepthFeature, "RicNewPer //-------------------------------------------------------------------------------------------------- void RicNewPerforationIntervalAtMeasuredDepthFeature::onActionTriggered( bool isChecked ) { - RiuWellPathSelectionItem* wellPathSelItem = wellPathSelectionItem(); + RiuWellPathSelectionItem* wellPathSelItem = RiuWellPathSelectionItem::wellPathSelectionItem(); CVF_ASSERT( wellPathSelItem ); RimWellPath* wellPath = wellPathSelItem->m_wellpath; @@ -64,19 +64,6 @@ void RicNewPerforationIntervalAtMeasuredDepthFeature::onActionTriggered( bool is Riu3DMainWindowTools::selectAsCurrentItem( perforationInterval ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuWellPathSelectionItem* RicNewPerforationIntervalAtMeasuredDepthFeature::wellPathSelectionItem() -{ - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); - - return wellPathItem; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -91,7 +78,7 @@ void RicNewPerforationIntervalAtMeasuredDepthFeature::setupActionLook( QAction* //-------------------------------------------------------------------------------------------------- bool RicNewPerforationIntervalAtMeasuredDepthFeature::isCommandEnabled() { - if ( wellPathSelectionItem() ) + if ( RiuWellPathSelectionItem::wellPathSelectionItem() ) { return true; } diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.h b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.h index a208aa7e5f..e70afc4370 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.h +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewPerforationIntervalAtMeasuredDepthFeature.h @@ -33,7 +33,4 @@ class RicNewPerforationIntervalAtMeasuredDepthFeature : public caf::CmdFeature void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; bool isCommandEnabled() override; - -private: - static RiuWellPathSelectionItem* wellPathSelectionItem(); }; diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp index 904105e80d..6cffa55adf 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.cpp @@ -23,6 +23,8 @@ #include "RiaGuiApplication.h" #include "RiaLogging.h" +#include "RiaStimPlanModelDefines.h" +#include "RimPlotCurveAppearance.h" #include "WellLogCommands/RicNewWellLogPlotFeatureImpl.h" #include "RigWellPath.h" @@ -76,13 +78,16 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createPlot( RimStimPlanMod plot->setStimPlanModel( stimPlanModel ); { - auto task = progInfo.task( "Creating formation track", 2 ); - createFormationTrack( plot, stimPlanModel, eclipseCase ); + auto task = progInfo.task( "Creating formation track", 2 ); + RimEclipseCase* formationEclipseCase = + stimPlanModel->eclipseCaseForType( RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ); + createFormationTrack( plot, stimPlanModel, formationEclipseCase ); } { - auto task = progInfo.task( "Creating facies track", 2 ); - createFaciesTrack( plot, stimPlanModel, eclipseCase ); + auto task = progInfo.task( "Creating facies track", 2 ); + RimEclipseCase* faciesEclipseCase = stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::FACIES ); + createFaciesTrack( plot, stimPlanModel, faciesEclipseCase ); } { @@ -93,12 +98,12 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createPlot( RimStimPlanMod { auto task = progInfo.task( "Creating parameters track", 15 ); - std::map> plots; - plots["Porosity"] = { RiaDefines::CurveProperty::POROSITY, RiaDefines::CurveProperty::POROSITY_UNSCALED }; - plots["Pressure"] = { RiaDefines::CurveProperty::INITIAL_PRESSURE, RiaDefines::CurveProperty::PRESSURE }; - plots["Permeability"] = { RiaDefines::CurveProperty::PERMEABILITY_X, RiaDefines::CurveProperty::PERMEABILITY_Z }; - plots["Net-To-Gross"] = { RiaDefines::CurveProperty::NET_TO_GROSS }; - plots["EQLNUM"] = { RiaDefines::CurveProperty::EQLNUM }; + std::vector>> plots = + { { "Porosity", { RiaDefines::CurveProperty::POROSITY, RiaDefines::CurveProperty::POROSITY_UNSCALED } }, + { "Permeability", { RiaDefines::CurveProperty::PERMEABILITY_X, RiaDefines::CurveProperty::PERMEABILITY_Z } }, + { "Pressure", { RiaDefines::CurveProperty::INITIAL_PRESSURE, RiaDefines::CurveProperty::PRESSURE } }, + { "Net-To-Gross", { RiaDefines::CurveProperty::NET_TO_GROSS } }, + { "EQLNUM", { RiaDefines::CurveProperty::EQLNUM } } }; std::set logarithmicPlots; logarithmicPlots.insert( "Permeability" ); @@ -165,7 +170,7 @@ RimStimPlanModelPlot* RicNewStimPlanModelPlotFeature::createPlot( RimStimPlanMod plot->nameConfig()->setAutoNameTags( false, false, false, false, false ); plot->setPlotTitleVisible( true ); plot->setLegendsVisible( true ); - plot->setLegendsHorizontal( true ); + plot->setLegendsHorizontal( false ); plot->setDepthType( RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH ); plot->setAutoScaleDepthEnabled( true ); } @@ -219,6 +224,10 @@ void RicNewStimPlanModelPlotFeature::createFormationTrack( RimStimPlanModelPlot* formationTrack->setFormationWellPath( stimPlanModel->thicknessDirectionWellPath() ); formationTrack->setFormationCase( eclipseCase ); formationTrack->setAnnotationType( RiuPlotAnnotationTool::RegionAnnotationType::FORMATION_ANNOTATIONS ); + formationTrack->setXAxisGridVisibility( RimWellLogPlot::AxisGridVisibility::AXIS_GRID_NONE ); + formationTrack->setShowWellPathAttributes( true ); + formationTrack->setShowBothSidesOfWell( false ); + formationTrack->setWellPathAttributesSource( stimPlanModel->thicknessDirectionWellPath() ); formationTrack->setVisibleXRange( 0.0, 0.0 ); formationTrack->setOverburdenHeight( stimPlanModel->overburdenHeight() ); formationTrack->setUnderburdenHeight( stimPlanModel->underburdenHeight() ); @@ -247,9 +256,10 @@ void RicNewStimPlanModelPlotFeature::createFaciesTrack( RimStimPlanModelPlot* pl faciesTrack->setFormationCase( eclipseCase ); faciesTrack->setAnnotationType( RiuPlotAnnotationTool::RegionAnnotationType::RESULT_PROPERTY_ANNOTATIONS ); faciesTrack->setRegionPropertyResultType( faciesDefinition->resultType(), faciesDefinition->resultVariable() ); + faciesTrack->setAnnotationDisplay( RiuPlotAnnotationTool::COLOR_SHADING ); faciesTrack->setOverburdenHeight( stimPlanModel->overburdenHeight() ); faciesTrack->setUnderburdenHeight( stimPlanModel->underburdenHeight() ); - faciesTrack->setLegendsVisible( true ); + faciesTrack->setLegendsVisible( false ); faciesTrack->setPlotTitleVisible( true ); RimColorLegend* faciesColors = faciesProperties->colorLegend(); @@ -257,6 +267,9 @@ void RicNewStimPlanModelPlotFeature::createFaciesTrack( RimStimPlanModelPlot* pl faciesTrack->setVisibleXRange( 0.0, 0.0 ); faciesTrack->setColSpan( RimPlot::ONE ); + faciesTrack->setAutoScaleXEnabled( false ); + faciesTrack->setVisibleXRange( 0.0, 0.0 ); + faciesTrack->setXAxisGridVisibility( RimWellLogPlot::AxisGridVisibility::AXIS_GRID_NONE ); caf::ColorTable colors = RiaColorTables::wellLogPlotPaletteColors(); @@ -266,12 +279,11 @@ void RicNewStimPlanModelPlotFeature::createFaciesTrack( RimStimPlanModelPlot* pl curve->setEclipseResultCategory( faciesDefinition->resultType() ); curve->setEclipseResultVariable( faciesDefinition->resultVariable() ); curve->setColor( colors.cycledColor3f( 0 ) ); - curve->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); + curve->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); curve->setLineThickness( 2 ); curve->setAutoNameComponents( false, true, false, false, false ); faciesTrack->addCurve( curve ); - faciesTrack->setAutoScaleXEnabled( true ); curve->loadDataAndUpdate( true ); curve->updateConnectedEditors(); @@ -346,15 +358,15 @@ void RicNewStimPlanModelPlotFeature::createParametersTrack( RimStimPlanModelPlot const std::vector& propertyTypes, bool isPlotLogarithmic ) { + CAF_ASSERT( !propertyTypes.empty() ); + RimWellLogTrack* plotTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false, trackTitle, plot ); plotTrack->setFormationCase( eclipseCase ); plotTrack->setFormationWellPath( stimPlanModel->thicknessDirectionWellPath() ); - plotTrack->setColSpan( RimPlot::TWO ); + plotTrack->setColSpan( defaultColSpan( propertyTypes[0] ) ); plotTrack->setLegendsVisible( true ); plotTrack->setPlotTitleVisible( true ); - plotTrack->setShowWindow( shouldShowByDefault( propertyTypes ) ); - - caf::ColorTable colors = RiaColorTables::wellLogPlotPaletteColors(); + plotTrack->setShowWindow( shouldShowByDefault( propertyTypes, stimPlanModel->useDetailedFluidLoss() ) ); int colorIndex = 0; for ( const RiaDefines::CurveProperty& propertyType : propertyTypes ) @@ -370,8 +382,16 @@ void RicNewStimPlanModelPlotFeature::createParametersTrack( RimStimPlanModelPlot curve->setStimPlanModel( stimPlanModel ); curve->setEclipseResultVariable( resultVariable ); curve->setEclipseResultCategory( resultCategoryType ); - curve->setColor( colors.cycledColor3f( colorIndex ) ); - curve->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); + curve->setColor( defaultColor( propertyType, colorIndex ) ); + + RimPlotCurveAppearance::FillStyle fillStyle = defaultFillStyle( propertyType ); + if ( fillStyle != Qt::NoBrush ) + { + curve->setFillStyle( fillStyle ); + curve->setFillColor( defaultFillColor( propertyType ) ); + } + + curve->setLineStyle( defaultLineStyle( propertyType ) ); curve->setLineThickness( 2 ); if ( propertyType == RiaDefines::CurveProperty::STRESS_GRADIENT ) @@ -402,6 +422,8 @@ void RicNewStimPlanModelPlotFeature::createParametersTrack( RimStimPlanModelPlot plotTrack->setShowRegionLabels( true ); plotTrack->setLogarithmicScale( isPlotLogarithmic ); plotTrack->setAutoScaleXEnabled( true ); + plotTrack->setMinAndMaxTicksOnly( useMinMaxTicksOnly( propertyTypes[0] ) ); + plotTrack->updateConnectedEditors(); plot->updateConnectedEditors(); @@ -468,11 +490,16 @@ RimStimPlanModelPlotCollection* RicNewStimPlanModelPlotFeature::stimPlanModelPlo //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicNewStimPlanModelPlotFeature::shouldShowByDefault( const std::vector& propertyTypes ) +bool RicNewStimPlanModelPlotFeature::shouldShowByDefault( const std::vector& propertyTypes, + bool useDetailedFluidLoss ) { std::vector defaultPropertyTypes = { + RiaDefines::CurveProperty::FACIES, + RiaDefines::CurveProperty::POROSITY, RiaDefines::CurveProperty::INITIAL_PRESSURE, RiaDefines::CurveProperty::PRESSURE, + RiaDefines::CurveProperty::PERMEABILITY_X, + RiaDefines::CurveProperty::PERMEABILITY_Z, RiaDefines::CurveProperty::STRESS, RiaDefines::CurveProperty::INITIAL_STRESS, RiaDefines::CurveProperty::STRESS_GRADIENT, @@ -480,9 +507,15 @@ bool RicNewStimPlanModelPlotFeature::shouldShowByDefault( const std::vector colorMap; + + colorMap[RiaDefines::CurveProperty::LAYERS] = cvf::Color3f( 0.000f, 0.000f, 1.000f ); + colorMap[RiaDefines::CurveProperty::POROSITY] = cvf::Color3f( 0.804f, 0.522f, 0.247f ); + colorMap[RiaDefines::CurveProperty::POROSITY_UNSCALED] = cvf::Color3f::BLACK; + colorMap[RiaDefines::CurveProperty::PERMEABILITY_X] = cvf::Color3f( 0.745f, 0.000f, 0.000f ); + colorMap[RiaDefines::CurveProperty::PERMEABILITY_Z] = cvf::Color3f::RED; + colorMap[RiaDefines::CurveProperty::INITIAL_PRESSURE] = cvf::Color3f::BLACK; + colorMap[RiaDefines::CurveProperty::PRESSURE] = cvf::Color3f( 0.000f, 0.333f, 1.000f ); + colorMap[RiaDefines::CurveProperty::INITIAL_STRESS] = cvf::Color3f::BLACK; + colorMap[RiaDefines::CurveProperty::STRESS] = cvf::Color3f( 0.541f, 0.169f, 0.886f ); + colorMap[RiaDefines::CurveProperty::STRESS_GRADIENT] = cvf::Color3f( 0.522f, 0.522f, 0.784f ); + colorMap[RiaDefines::CurveProperty::YOUNGS_MODULUS] = cvf::Color3f( 0.565f, 0.565f, 0.424f ); + colorMap[RiaDefines::CurveProperty::POISSONS_RATIO] = cvf::Color3f( 0.804f, 0.522f, 0.247f ); + colorMap[RiaDefines::CurveProperty::BIOT_COEFFICIENT] = cvf::Color3f( 0.000f, 0.506f, 0.761f ); + colorMap[RiaDefines::CurveProperty::K0] = cvf::Color3f( 0.294f, 0.765f, 0.529f ); + colorMap[RiaDefines::CurveProperty::K_IC] = cvf::Color3f( 0.576f, 0.576f, 0.000f ); + colorMap[RiaDefines::CurveProperty::PROPPANT_EMBEDMENT] = cvf::Color3f( 0.667f, 0.333f, 0.498f ); + + if ( colorMap.count( property ) > 0 ) return colorMap[property]; + + caf::ColorTable colors = RiaColorTables::wellLogPlotPaletteColors(); + return colors.cycledColor3f( colorIndex ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RicNewStimPlanModelPlotFeature::defaultFillColor( RiaDefines::CurveProperty property ) +{ + std::map colorMap; + + colorMap[RiaDefines::CurveProperty::POROSITY] = cvf::Color3f( 0.988f, 0.635f, 0.302f ); + colorMap[RiaDefines::CurveProperty::PERMEABILITY_X] = cvf::Color3f( 1.000f, 0.486f, 0.486f ); + colorMap[RiaDefines::CurveProperty::PERMEABILITY_Z] = cvf::Color3f( 1.000f, 0.486f, 0.486f ); + colorMap[RiaDefines::CurveProperty::STRESS_GRADIENT] = cvf::Color3f( 0.667f, 0.667f, 1.000f ); + colorMap[RiaDefines::CurveProperty::YOUNGS_MODULUS] = cvf::Color3f( 0.667f, 0.667f, 0.498f ); + colorMap[RiaDefines::CurveProperty::POISSONS_RATIO] = cvf::Color3f( 1.000f, 0.667f, 0.498f ); + colorMap[RiaDefines::CurveProperty::BIOT_COEFFICIENT] = cvf::Color3f( 0.647f, 0.847f, 1.000f ); + colorMap[RiaDefines::CurveProperty::K0] = cvf::Color3f( 0.482f, 0.765f, 0.573f ); + colorMap[RiaDefines::CurveProperty::K_IC] = cvf::Color3f( 0.839f, 0.729f, 0.941f ); + colorMap[RiaDefines::CurveProperty::PROPPANT_EMBEDMENT] = cvf::Color3f( 0.882f, 0.439f, 0.663f ); + + if ( colorMap.count( property ) > 0 ) return colorMap[property]; + + return cvf::Color3f::LIGHT_GRAY; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlotCurveAppearance::FillStyle RicNewStimPlanModelPlotFeature::defaultFillStyle( RiaDefines::CurveProperty property ) +{ + std::set solids = { + RiaDefines::CurveProperty::POROSITY, + RiaDefines::CurveProperty::PERMEABILITY_X, + RiaDefines::CurveProperty::PERMEABILITY_Z, + RiaDefines::CurveProperty::STRESS_GRADIENT, + RiaDefines::CurveProperty::YOUNGS_MODULUS, + RiaDefines::CurveProperty::POISSONS_RATIO, + RiaDefines::CurveProperty::BIOT_COEFFICIENT, + RiaDefines::CurveProperty::K0, + RiaDefines::CurveProperty::K_IC, + RiaDefines::CurveProperty::PROPPANT_EMBEDMENT, + }; + + if ( solids.count( property ) > 0 ) return RimPlotCurveAppearance::FillStyle( Qt::SolidPattern ); + + return RimPlotCurveAppearance::FillStyle( Qt::NoBrush ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuQwtPlotCurveDefines::LineStyleEnum RicNewStimPlanModelPlotFeature::defaultLineStyle( RiaDefines::CurveProperty property ) +{ + std::set dashedProperties = { RiaDefines::CurveProperty::INITIAL_STRESS, + RiaDefines::CurveProperty::INITIAL_PRESSURE }; + + if ( dashedProperties.count( property ) > 0 ) return RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_DASH; + + return RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlot::RowOrColSpan RicNewStimPlanModelPlotFeature::defaultColSpan( RiaDefines::CurveProperty property ) +{ + std::set wideProperties = { RiaDefines::CurveProperty::STRESS, + RiaDefines::CurveProperty::INITIAL_STRESS, + RiaDefines::CurveProperty::PRESSURE, + RiaDefines::CurveProperty::INITIAL_PRESSURE }; + + if ( wideProperties.count( property ) > 0 ) return RimPlot::TWO; + + return RimPlot::ONE; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicNewStimPlanModelPlotFeature::useMinMaxTicksOnly( RiaDefines::CurveProperty property ) +{ + std::set useMajorAndMinorTickmarks = { RiaDefines::CurveProperty::STRESS, + RiaDefines::CurveProperty::INITIAL_STRESS, + RiaDefines::CurveProperty::PRESSURE, + RiaDefines::CurveProperty::INITIAL_PRESSURE }; + + if ( useMajorAndMinorTickmarks.count( property ) ) return false; + + return true; +} diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.h b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.h index 874f59b9e1..7ce5e66152 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.h +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewStimPlanModelPlotFeature.h @@ -22,6 +22,10 @@ #include "RiaDefines.h" #include "RiaStimPlanModelDefines.h" +#include "RimPlot.h" +#include "RimPlotCurveAppearance.h" + +#include "cvfColor3.h" class RimEclipseCase; class RimStimPlanModelPlot; @@ -60,9 +64,17 @@ class RicNewStimPlanModelPlotFeature : public caf::CmdFeature const std::vector& propertyTypes, bool isPlotLogarithmic = false ); - static bool shouldShowByDefault( const std::vector& propertyTypes ); + static bool shouldShowByDefault( const std::vector& propertyTypes, + bool useDetailedFluidLoss ); static RimStimPlanModelPlot* createStimPlanModelPlot( bool showAfterCreation, const QString& plotDescription ); static RimStimPlanModelPlotCollection* stimPlanModelPlotCollection(); + + static cvf::Color3f defaultColor( RiaDefines::CurveProperty property, int colorIndex ); + static cvf::Color3f defaultFillColor( RiaDefines::CurveProperty property ); + static RimPlotCurveAppearance::FillStyle defaultFillStyle( RiaDefines::CurveProperty property ); + static RiuQwtPlotCurveDefines::LineStyleEnum defaultLineStyle( RiaDefines::CurveProperty property ); + static RimPlot::RowOrColSpan defaultColSpan( RiaDefines::CurveProperty property ); + static bool useMinMaxTicksOnly( RiaDefines::CurveProperty property ); }; diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.cpp b/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.cpp index 47cc1162a3..37bde7663b 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.cpp +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.cpp @@ -41,7 +41,7 @@ CAF_CMD_SOURCE_INIT( RicNewValveAtMeasuredDepthFeature, "RicNewValveAtMeasuredDe //-------------------------------------------------------------------------------------------------- void RicNewValveAtMeasuredDepthFeature::onActionTriggered( bool isChecked ) { - RiuWellPathSelectionItem* wellPathSelItem = wellPathSelectionItem(); + RiuWellPathSelectionItem* wellPathSelItem = RiuWellPathSelectionItem::wellPathSelectionItem(); CVF_ASSERT( wellPathSelItem ); RimWellPath* wellPath = wellPathSelItem->m_wellpath; @@ -91,23 +91,11 @@ void RicNewValveAtMeasuredDepthFeature::setupActionLook( QAction* actionToSetup //-------------------------------------------------------------------------------------------------- bool RicNewValveAtMeasuredDepthFeature::isCommandEnabled() { - if ( wellPathSelectionItem() && dynamic_cast( wellPathSelectionItem()->m_wellPathComponent ) ) + auto wellPathSelectionItem = RiuWellPathSelectionItem::wellPathSelectionItem(); + if ( wellPathSelectionItem && dynamic_cast( wellPathSelectionItem->m_wellPathComponent ) ) { return true; } return false; } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RiuWellPathSelectionItem* RicNewValveAtMeasuredDepthFeature::wellPathSelectionItem() -{ - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); - - return wellPathItem; -} diff --git a/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.h b/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.h index 8552baf9d7..ea65cfcc95 100644 --- a/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.h +++ b/ApplicationLibCode/Commands/CompletionCommands/RicNewValveAtMeasuredDepthFeature.h @@ -20,8 +20,6 @@ #include "cafCmdFeature.h" -class RiuWellPathSelectionItem; - //================================================================================================== /// //================================================================================================== @@ -33,7 +31,4 @@ class RicNewValveAtMeasuredDepthFeature : public caf::CmdFeature void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; bool isCommandEnabled() override; - -private: - static RiuWellPathSelectionItem* wellPathSelectionItem(); }; diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CompletionExportCommands/CMakeLists_files.cmake index 0ca9d8905a..5118c85375 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CompletionExportCommands/CMakeLists_files.cmake @@ -1,61 +1,59 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionDataSettingsUi.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportMswCompletionsImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionsFileTools.h -${CMAKE_CURRENT_LIST_DIR}/RicFishbonesTransmissibilityCalculationFeatureImp.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsWellSegmentsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCaseAndFileExportSettingsUi.h -${CMAKE_CURRENT_LIST_DIR}/RicExportFractureCompletionsImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleWellPathsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleSimWellsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicMswBranch.h -${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.h -${CMAKE_CURRENT_LIST_DIR}/RicMswItem.h -${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.h -${CMAKE_CURRENT_LIST_DIR}/RicMswSegmentCellIntersection.h -${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicMswTableFormatterTools.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionDataSettingsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportMswCompletionsImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionsFileTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicFishbonesTransmissibilityCalculationFeatureImp.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsWellSegmentsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCaseAndFileExportSettingsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportFractureCompletionsImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleWellPathsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleSimWellsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswBranch.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswItem.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswSegmentCellIntersection.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicMswTableFormatterTools.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionDataSettingsUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportMswCompletionsImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionsFileTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicFishbonesTransmissibilityCalculationFeatureImp.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsWellSegmentsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCaseAndFileExportSettingsUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportFractureCompletionsImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleWellPathsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleSimWellsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswBranch.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswSegmentCellIntersection.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMswTableFormatterTools.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionDataSettingsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionDataFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportMswCompletionsImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathExportCompletionsFileTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicFishbonesTransmissibilityCalculationFeatureImp.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsWellSegmentsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCaseAndFileExportSettingsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportFractureCompletionsImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleWellPathsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForVisibleSimWellsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswBranch.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswExportInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswSegment.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswSegmentCellIntersection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswValveAccumulators.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureTextReportFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFractureReportItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCompletionsForTemporaryLgrsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMswTableFormatterTools.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\CompletionExport" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\CompletionExport" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.cpp index 1d91c9ae4d..eccd4abd41 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.cpp @@ -278,6 +278,14 @@ std::unique_ptr RicMswSegment::removeCompletion( RicMswComplet return removedCompletion; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicMswSegment::deleteAllCompletions() +{ + m_completions.clear(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.h b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.h index 3d5897fc4f..68800b6d39 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.h +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswSegment.h @@ -76,6 +76,7 @@ class RicMswSegment : public RicMswItem void addCompletion( std::unique_ptr completion ); std::unique_ptr removeCompletion( RicMswCompletion* completion ); + void deleteAllCompletions(); void addIntersection( std::shared_ptr intersection ); diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswTableFormatterTools.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswTableFormatterTools.cpp index c0456b1c81..3632ad7c80 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicMswTableFormatterTools.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicMswTableFormatterTools.cpp @@ -550,36 +550,29 @@ void RicMswTableFormatterTools::generateWsegvalvTableRecursively( gsl::not_null< { if ( RigCompletionData::isWsegValveTypes( completion->completionType() ) ) { - auto wsegValve = static_cast( completion ); - if ( !wsegValve->segments().empty() ) + // Related function RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs + + auto wsegValve = static_cast( completion ); + int segmentNumber = -1; + for ( auto seg : wsegValve->segments() ) { - CVF_ASSERT( wsegValve->segments().size() == 1u ); + if ( seg->segmentNumber() > -1 ) segmentNumber = seg->segmentNumber(); + if ( seg->intersections().empty() ) continue; - auto firstSubSegment = wsegValve->segments().front(); + size_t cellIndex = seg->intersections().front()->globalCellIndex(); - // TODO: The following line was blocking export of valves for fishbones - // Unclear why this line was included. Remove when MSW export has ben verified correctly - // if ( !firstSubSegment->intersections().empty() ) + QString comment; + if ( wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD || + wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICV ) { - QString comment; - if ( wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD || - wsegValve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICV ) - { - comment = wsegValve->label(); - } - - size_t cellIndex = std::numeric_limits::max(); - if ( !firstSubSegment->intersections().empty() ) - { - cellIndex = firstSubSegment->intersections().front()->globalCellIndex(); - } - - wsegvalveData[cellIndex].push_back( WsegvalveData( wellNameForExport, - comment, - firstSubSegment->segmentNumber(), - wsegValve->flowCoefficient(), - wsegValve->area() ) ); + comment = wsegValve->label(); } + + wsegvalveData[cellIndex].push_back( WsegvalveData( wellNameForExport, + comment, + segmentNumber, + wsegValve->flowCoefficient(), + wsegValve->area() ) ); } } } @@ -739,22 +732,19 @@ void RicMswTableFormatterTools::generateWsegAicdTableRecursively( RicMswExportIn auto aicd = static_cast( completion ); if ( aicd->isValid() ) { - if ( !aicd->segments().empty() ) + int segmentNumber = -1; + for ( auto seg : aicd->segments() ) { - CVF_ASSERT( aicd->segments().size() == 1u ); - auto firstSegment = aicd->segments().front(); + if ( seg->segmentNumber() > -1 ) segmentNumber = seg->segmentNumber(); + if ( seg->intersections().empty() ) continue; - size_t cellIndex = std::numeric_limits::max(); - if ( !firstSegment->intersections().empty() ) - { - cellIndex = firstSegment->intersections().front()->globalCellIndex(); - } + size_t cellIndex = seg->intersections().front()->globalCellIndex(); auto wellName = exportInfo.mainBoreBranch()->wellPath()->completionSettings()->wellNameForExport(); auto comment = aicd->label(); aicdValveData[cellIndex].push_back( AicdWsegvalveData( wellName, comment, - firstSegment->segmentNumber(), + segmentNumber, aicd->flowScalingFactor(), aicd->isOpen(), aicd->values() ) ); @@ -879,17 +869,41 @@ void RicMswTableFormatterTools::writeValveWelsegsSegment( const RicMswSegment* auto segments = valve->segments(); - auto subSegment = segments.front(); - subSegment->setSegmentNumber( *segmentNumber ); + double startMD = 0.0; + double endMD = 0.0; + + if ( valve->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD || + valve->completionType() == RigCompletionData::CompletionType::PERFORATION_AICD ) + { + CVF_ASSERT( segments.size() > 1 ); + + // The 0.1 valve segment is the first, the perforated segment is the second + auto subSegment = segments[0]; + subSegment->setSegmentNumber( *segmentNumber ); + + double midPointMD = subSegment->outputMD(); + startMD = midPointMD; + endMD = startMD + 0.1; - double startMD = subSegment->startMD(); - double endMD = subSegment->endMD(); + double midPointTVD = tvdFromMeasuredDepth( valve->wellPath(), midPointMD ); - double midPointMD = 0.5 * ( startMD + endMD ); - double midPointTVD = tvdFromMeasuredDepth( valve->wellPath(), midPointMD ); + subSegment->setOutputMD( midPointMD ); + subSegment->setOutputTVD( midPointTVD ); + } + else + { + auto subSegment = segments.front(); + subSegment->setSegmentNumber( *segmentNumber ); - subSegment->setOutputMD( midPointMD ); - subSegment->setOutputTVD( midPointTVD ); + startMD = subSegment->startMD(); + endMD = subSegment->endMD(); + + double midPointMD = 0.5 * ( startMD + endMD ); + double midPointTVD = tvdFromMeasuredDepth( valve->wellPath(), midPointMD ); + + subSegment->setOutputMD( midPointMD ); + subSegment->setOutputTVD( midPointTVD ); + } std::vector> splitSegments = createSubSegmentMDPairs( startMD, endMD, maxSegmentLength ); diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp index 19f75e6e0d..672c4bbfe1 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionDataFeatureImpl.cpp @@ -22,7 +22,7 @@ #include "RiaFilePathTools.h" #include "RiaFractureDefines.h" #include "RiaLogging.h" -#include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaWeightedMeanCalculator.h" #include "ExportCommands/RicExportLgrFeature.h" @@ -94,6 +94,7 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions( const std::v return; } + if ( exportSettings.customFileName().isEmpty() ) { QDir folder( exportSettings.folder ); if ( !folder.exists() ) @@ -112,7 +113,7 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions( const std::v std::unique_ptr fractureTransmissibilityExportInformationStream = nullptr; QFile fractureTransmissibilityExportInformationFile; - RiaPreferences* prefs = RiaPreferences::current(); + RiaPreferencesSystem* prefs = RiaPreferencesSystem::current(); if ( prefs->includeFractureDebugInfoFile() ) { QDir outputDir = QDir( exportSettings.folder ); @@ -267,11 +268,22 @@ void RicWellPathExportCompletionDataFeatureImpl::exportCompletions( const std::v if ( exportSettings.fileSplit == RicExportCompletionDataSettingsUi::ExportSplit::UNIFIED_FILE ) { - QString fileName = exportSettings.customFileName(); - if ( fileName.isEmpty() ) fileName = QString( "UnifiedCompletions_%1" ).arg( eclipseCaseName ); + QString fileName; + QString folderName; + if ( exportSettings.customFileName().isEmpty() ) + { + fileName = QString( "UnifiedCompletions_%1" ).arg( eclipseCaseName ); + folderName = exportSettings.folder; + } + else + { + fileName = exportSettings.customFileName(); + QFileInfo fi( fileName ); + folderName = fi.absolutePath(); + } sortAndExportCompletionsToFile( exportSettings.caseToApply, - exportSettings.folder, + folderName, fileName, completions, fractureDataReportItems, @@ -883,7 +895,10 @@ void RicWellPathExportCompletionDataFeatureImpl::sortAndExportCompletionsToFile( { QFileInfo fi( fileName ); std::shared_ptr exportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( folderName, fi.baseName(), fi.suffix() ); + RicWellPathExportCompletionsFileTools::openFileForExport( folderName, + fi.baseName(), + fi.suffix(), + exportDataSourceAsComment ); std::map> completionsForGrid; completionsForGrid.insert( std::pair>( "", completionsForMainGrid ) ); @@ -908,7 +923,10 @@ void RicWellPathExportCompletionDataFeatureImpl::sortAndExportCompletionsToFile( QString lgrFileName = fi.baseName() + "_LGR"; std::shared_ptr exportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( folderName, lgrFileName, fi.suffix() ); + RicWellPathExportCompletionsFileTools::openFileForExport( folderName, + lgrFileName, + fi.suffix(), + exportDataSourceAsComment ); exportWellPathFractureReport( eclipseCase, exportFile, wellPathFractureReportItems ); if ( exportWelspec ) diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.cpp index 49319c9843..d50bbdef3f 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.cpp @@ -20,6 +20,8 @@ #include "RiaFilePathTools.h" #include "RiaLogging.h" +#include "RiaPreferences.h" +#include "RiaRegressionTestRunner.h" #include "RimProject.h" #include "RimWellPath.h" @@ -27,7 +29,9 @@ #include "cafUtils.h" +#include #include +#include //-------------------------------------------------------------------------------------------------- /// @@ -40,18 +44,9 @@ RicWellPathExportCompletionsFileTools::OpenFileException::OpenFileException( con //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::shared_ptr RicWellPathExportCompletionsFileTools::openFileForExport( const QString& fullFileName ) -{ - std::pair folderAndFileName = RiaFilePathTools::toFolderAndFileName( fullFileName ); - return openFileForExport( folderAndFileName.first, folderAndFileName.second ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -std::shared_ptr RicWellPathExportCompletionsFileTools::openFileForExport( const QString& folderName, - const QString& fileName, - const QString& suffix ) +std::shared_ptr RicWellPathExportCompletionsFileTools::openFile( const QString& folderName, + const QString& fileName, + const QString& suffix ) { QString validFileName = caf::Utils::makeValidFileBasename( fileName ); @@ -81,25 +76,73 @@ std::shared_ptr RicWellPathExportCompletionsFileTools::openFileForExport( return exportFile; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RimWellPath* RicWellPathExportCompletionsFileTools::findWellPathFromExportName( const QString& wellNameForExport ) +{ + auto allWellPaths = RimProject::current()->allWellPaths(); + + for ( const auto wellPath : allWellPaths ) + { + if ( wellPath->completionSettings()->wellNameForExport() == wellNameForExport ) return wellPath; + } + return nullptr; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::shared_ptr RicWellPathExportCompletionsFileTools::openFileForExport( const QString& folderName, - const QString& fileName ) + const QString& fileName, + const QString& suffix, + bool writeInfoHeader ) { - return openFileForExport( folderName, fileName, "" ); + auto file = openFile( folderName, fileName, suffix ); + + // Do not write header when running regression tests to make sure the text content is stable + if ( file && writeInfoHeader && !RiaRegressionTestRunner::instance()->isRunningRegressionTests() ) + { + QString header = createProjectFileHeader(); + if ( !header.isEmpty() ) + { + QTextStream stream( file.get() ); + + stream << header; + } + } + + return file; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RimWellPath* RicWellPathExportCompletionsFileTools::findWellPathFromExportName( const QString& wellNameForExport ) +QString RicWellPathExportCompletionsFileTools::createProjectFileHeader() { - auto allWellPaths = RimProject::current()->allWellPaths(); + QString txt = QString( "-- Exported from ResInsight " ); - for ( const auto wellPath : allWellPaths ) + auto dateTimeFormatString = RiaPreferences::current()->dateTimeFormat(); + if ( !dateTimeFormatString.isEmpty() ) { - if ( wellPath->completionSettings()->wellNameForExport() == wellNameForExport ) return wellPath; + auto currentDateTime = QDateTime::currentDateTime(); + auto dateStampString = currentDateTime.toString( dateTimeFormatString ); + txt += dateStampString; } - return nullptr; + + txt += "\n"; + + auto proj = RimProject::current(); + if ( proj && !proj->fileName().isEmpty() ) + { + QString fileName = proj->fileName(); + if ( !fileName.isEmpty() ) + { + txt += "-- " + fileName + "\n"; + } + + txt += "\n"; + } + + return txt; } diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.h b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.h index 8bac2ccfee..7ba0bc023a 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.h +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportCompletionsFileTools.h @@ -35,9 +35,13 @@ class RicWellPathExportCompletionsFileTools QString message; }; - static std::shared_ptr openFileForExport( const QString& folderName, const QString& fileName ); + static const RimWellPath* findWellPathFromExportName( const QString& wellNameForExport ); + static std::shared_ptr - openFileForExport( const QString& folderName, const QString& fileName, const QString& suffix ); - static std::shared_ptr openFileForExport( const QString& fullFileName ); - static const RimWellPath* findWellPathFromExportName( const QString& wellNameForExport ); + openFileForExport( const QString& folderName, const QString& fileName, const QString& suffix, bool writeInfoHeader ); + +private: + static std::shared_ptr openFile( const QString& folderName, const QString& fileName, const QString& suffix ); + + static QString createProjectFileHeader(); }; diff --git a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp index fba6ed89a6..ce8e00a655 100644 --- a/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp +++ b/ApplicationLibCode/Commands/CompletionExportCommands/RicWellPathExportMswCompletionsImpl.cpp @@ -71,28 +71,49 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForAllCompletions( if ( exportSettings.fileSplit() == RicExportCompletionDataSettingsUi::ExportSplit::UNIFIED_FILE ) { { - QString fileName; + QString fileName; + QString folderName; + QFileInfo fi( exportSettings.customFileName() ); if ( !exportSettings.customFileName().isEmpty() ) - fileName = fi.baseName() + "_MSW"; + { + fileName = fi.baseName() + "_MSW"; + folderName = fi.absolutePath(); + } else + { fileName = QString( "UnifiedCompletions_MSW_%1" ).arg( exportSettings.caseToApply->caseUserDescription() ); + folderName = exportSettings.folder; + } unifiedExportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName, fi.suffix() ); + RicWellPathExportCompletionsFileTools::openFileForExport( folderName, + fileName, + fi.suffix(), + exportSettings.exportDataSourceAsComment() ); } { QString lgrFileName; + QString folderName; QFileInfo fi( exportSettings.customFileName() ); if ( !exportSettings.customFileName().isEmpty() ) + { lgrFileName = fi.baseName() + "_LGR_MSW"; + folderName = fi.absolutePath(); + } else + { lgrFileName = QString( "UnifiedCompletions_LGR_MSW_%1" ).arg( exportSettings.caseToApply->caseUserDescription() ); + folderName = exportSettings.folder; + } unifiedLgrExportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, lgrFileName, fi.suffix() ); + RicWellPathExportCompletionsFileTools::openFileForExport( folderName, + lgrFileName, + fi.suffix(), + exportSettings.exportDataSourceAsComment() ); } } @@ -121,9 +142,15 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForAllCompletions( QString wellFileName = QString( "%1_UnifiedCompletions_MSW_%2" ) .arg( wellPath->name(), exportSettings.caseToApply->caseUserDescription() ); unifiedWellPathFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, wellFileName ); + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + wellFileName, + "", + exportSettings.exportDataSourceAsComment() ); unifiedLgrWellPathFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, wellFileName + "_LGR" ); + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + wellFileName + "_LGR", + "", + exportSettings.exportDataSourceAsComment() ); } { @@ -156,9 +183,16 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForAllCompletions( QString fileName = QString( "%1_%2MSW_%3" ) .arg( wellPath->name(), perforationText, exportSettings.caseToApply->caseUserDescription() ); - exportFile = RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName ); + exportFile = + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName, + "", + exportSettings.exportDataSourceAsComment() ); lgrExportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName + "_LGR" ); + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName + "_LGR", + "", + exportSettings.exportDataSourceAsComment() ); } exportWellSegmentsForPerforations( exportSettings.caseToApply, exportFile, @@ -188,9 +222,16 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForAllCompletions( { QString fileName = QString( "%1_Fracture_MSW_%2" ).arg( wellPath->name(), exportSettings.caseToApply->caseUserDescription() ); - exportFile = RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName ); + exportFile = + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName, + "", + exportSettings.exportDataSourceAsComment() ); lgrExportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName + "_LGR" ); + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName + "_LGR", + "", + exportSettings.exportDataSourceAsComment() ); } exportWellSegmentsForFractures( exportSettings.caseToApply, exportFile, @@ -219,9 +260,16 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForAllCompletions( { QString fileName = QString( "%1_Fishbones_MSW_%2" ).arg( wellPath->name(), exportSettings.caseToApply->caseUserDescription() ); - exportFile = RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName ); + exportFile = + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName, + "", + exportSettings.exportDataSourceAsComment() ); lgrExportFile = - RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, fileName + "_LGR" ); + RicWellPathExportCompletionsFileTools::openFileForExport( exportSettings.folder, + fileName + "_LGR", + "", + exportSettings.exportDataSourceAsComment() ); } exportWellSegmentsForFishbones( exportSettings.caseToApply, exportFile, @@ -276,6 +324,7 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForPerforations( Rim { QTextStream stream( exportFile.get() ); RifTextDataTableFormatter formatter( stream ); + formatter.setOptionalComment( exportDataSourceAsComment ); RicMswTableFormatterTools::generateWelsegsTable( formatter, exportInfo, @@ -291,6 +340,7 @@ void RicWellPathExportMswCompletionsImpl::exportWellSegmentsForPerforations( Rim { QTextStream stream( lgrExportFile.get() ); RifTextDataTableFormatter formatter( stream ); + formatter.setOptionalComment( exportDataSourceAsComment ); RicMswTableFormatterTools::generateWelsegsTable( formatter, exportInfo, @@ -1574,13 +1624,13 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs( g std::vector perforations; for ( auto completion : segment->completions() ) { - if ( RigCompletionData::isPerforationValve( completion->completionType() ) ) + if ( completion->completionType() == RigCompletionData::CompletionType::PERFORATION_ICD || + completion->completionType() == RigCompletionData::CompletionType::PERFORATION_AICD ) { superValve = completion; } - else + else if ( completion->completionType() == RigCompletionData::CompletionType::PERFORATION ) { - CVF_ASSERT( completion->completionType() == RigCompletionData::CompletionType::PERFORATION ); perforations.push_back( completion ); } } @@ -1588,20 +1638,52 @@ void RicWellPathExportMswCompletionsImpl::moveIntersectionsToSuperICDsOrAICDs( g if ( superValve == nullptr ) continue; CVF_ASSERT( superValve->segments().size() == 1u ); + // Remove and take over ownership of the superValve completion auto completionPtr = segment->removeCompletion( superValve ); for ( auto perforation : perforations ) { for ( auto subSegment : perforation->segments() ) { + // The valve completions on the main branch will be deleted. Create a segment with startMD and + // endMD representing the perforation along main well path to be connected to the valve. When COMPSEGS + // data is exported, the startMD and endMD of the segment is used to define the Start Length and End + // Length of the COMPSEGS keyword + // + // Example output + // + // COMPSEGS + // --Name + // Well - 1 / + // --I J K Branch no Start Length End Length + // 17 17 9 2 3030.71791 3034.01331 / + // 17 18 9 3 3034.01331 3125.47617 / + + auto valveInflowSegment = + std::make_unique( QString( "%1 real valve segment " ).arg( branch->label() ), + subSegment->startMD(), + subSegment->endMD(), + subSegment->startTVD(), + subSegment->endTVD() ); + for ( auto intersectionPtr : subSegment->intersections() ) { - completionPtr->segments()[0]->addIntersection( intersectionPtr ); + valveInflowSegment->addIntersection( intersectionPtr ); + } + + { + double midpoint = ( segment->startMD() + segment->endMD() ) * 0.5; + + // Set the output MD to the midpoint of the segment, this info is used when exporting WELSEGS in + // RicMswTableFormatterTools::writeValveWelsegsSegment + completionPtr->segments()[0]->setOutputMD( midpoint ); } + completionPtr->addSegment( std::move( valveInflowSegment ) ); } } + // Remove all completions and re-add the super valve - segment->completions().clear(); + segment->deleteAllCompletions(); segment->addCompletion( std::move( completionPtr ) ); } } diff --git a/ApplicationLibCode/Commands/CorrelationPlotCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CorrelationPlotCommands/CMakeLists_files.cmake index b84ad775c0..fd833d71a8 100644 --- a/ApplicationLibCode/Commands/CorrelationPlotCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CorrelationPlotCommands/CMakeLists_files.cmake @@ -1,24 +1,23 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationReportPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationMatrixPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewParameterResultCrossPlotFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationReportPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationMatrixPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewParameterResultCrossPlotFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationMatrixPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewParameterResultCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationReportPlotFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationMatrixPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewParameterResultCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewCorrelationReportPlotFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\CorrelationPlotCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\CorrelationPlotCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/CrossSectionCommands/CMakeLists_files.cmake index 58e57e7d67..d1a18ed21d 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/CrossSectionCommands/CMakeLists_files.cmake @@ -1,30 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAppendSeparateIntersectionResultFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewAzimuthDipIntersectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCopyIntersectionsToAllViewsInCaseFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAppendSeparateIntersectionResultFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewAzimuthDipIntersectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCopyIntersectionsToAllViewsInCaseFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAppendSeparateIntersectionResultFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewAzimuthDipIntersectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCopyIntersectionsToAllViewsInCaseFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAppendSeparateIntersectionResultFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewAzimuthDipIntersectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCopyIntersectionsToAllViewsInCaseFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\CrossSection" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\CrossSection" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/RicAppendSeparateIntersectionResultFeature.cpp b/ApplicationLibCode/Commands/CrossSectionCommands/RicAppendSeparateIntersectionResultFeature.cpp index 95bd84f54d..d21b6c5b10 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/RicAppendSeparateIntersectionResultFeature.cpp +++ b/ApplicationLibCode/Commands/CrossSectionCommands/RicAppendSeparateIntersectionResultFeature.cpp @@ -64,8 +64,8 @@ void RicAppendSeparateIntersectionResultFeature::onActionTriggered( bool isCheck //-------------------------------------------------------------------------------------------------- void RicAppendSeparateIntersectionResultFeature::setupActionLook( QAction* actionToSetup ) { - // actionToSetup->setIcon( QIcon( ":/CrossSection16x16.png" ) ); - actionToSetup->setText( "New Separate Intersection Result" ); + actionToSetup->setText( "New Result Definition" ); + actionToSetup->setIcon( QIcon( ":/CellResult.png" ) ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewAzimuthDipIntersectionFeature.cpp b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewAzimuthDipIntersectionFeature.cpp index f783eee274..1dc5a1987f 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewAzimuthDipIntersectionFeature.cpp +++ b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewAzimuthDipIntersectionFeature.cpp @@ -110,8 +110,7 @@ void RicNewAzimuthDipIntersectionFeatureCmd::redo() RimExtrudedCurveIntersection* intersection = new RimExtrudedCurveIntersection(); intersection->setName( "Azimuth and Dip" ); - intersection->type = RimExtrudedCurveIntersection::CS_AZIMUTHLINE; - intersection->inputTwoAzimuthPointsFromViewerEnabled = true; + intersection->configureForAzimuthLine(); RimCase* rimCase; m_intersectionCollection->firstAncestorOrThisOfTypeAsserted( rimCase ); diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewPolylineIntersectionFeature.cpp b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewPolylineIntersectionFeature.cpp index 2b0b22880a..c8e79ea4ab 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewPolylineIntersectionFeature.cpp +++ b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewPolylineIntersectionFeature.cpp @@ -109,8 +109,7 @@ void RicNewPolylineIntersectionFeatureCmd::redo() RimExtrudedCurveIntersection* intersection = new RimExtrudedCurveIntersection(); intersection->setName( "Polyline" ); - intersection->type = RimExtrudedCurveIntersection::CS_POLYLINE; - intersection->inputPolyLineFromViewerEnabled = true; + intersection->configureForPolyLine(); m_intersectionCollection->appendIntersectionAndUpdate( intersection, false ); diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewSimWellIntersectionFeature.cpp b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewSimWellIntersectionFeature.cpp index 1e70331e72..9a54a35d3e 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewSimWellIntersectionFeature.cpp +++ b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewSimWellIntersectionFeature.cpp @@ -105,8 +105,7 @@ void RicNewSimWellIntersectionCmd::redo() RimExtrudedCurveIntersection* intersection = new RimExtrudedCurveIntersection(); intersection->setName( m_simWell->name ); - intersection->type = RimExtrudedCurveIntersection::CS_SIMULATION_WELL; - intersection->simulationWell = m_simWell; + intersection->configureForSimulationWell( m_simWell ); m_intersectionCollection->appendIntersectionAndUpdate( intersection, false ); } diff --git a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewWellPathIntersectionFeature.cpp b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewWellPathIntersectionFeature.cpp index 9384b371d2..8ae8343c94 100644 --- a/ApplicationLibCode/Commands/CrossSectionCommands/RicNewWellPathIntersectionFeature.cpp +++ b/ApplicationLibCode/Commands/CrossSectionCommands/RicNewWellPathIntersectionFeature.cpp @@ -114,8 +114,7 @@ void RicNewWellPathIntersectionFeatureCmd::redo() RimExtrudedCurveIntersection* intersection = new RimExtrudedCurveIntersection(); intersection->setName( m_wellPath->name() ); - intersection->type = RimExtrudedCurveIntersection::CS_WELL_PATH; - intersection->wellPath = m_wellPath; + intersection->configureForWellPath( m_wellPath ); m_intersectionCollection->appendIntersectionAndUpdate( intersection, false ); } diff --git a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake index 24644f0566..f9428cf735 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/EclipseCommands/CMakeLists_files.cmake @@ -1,52 +1,51 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddEclipseInputPropertyFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicComputeStatisticsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseGroupFromFilesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupExec.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertExec.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewExec.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCasesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportInputEclipseCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewStatisticsCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicApplyPropertyFilterAsCellResultFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddEclipseInputPropertyFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicComputeStatisticsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseGroupFromFilesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCasesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportInputEclipseCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewStatisticsCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicApplyPropertyFilterAsCellResultFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddEclipseInputPropertyFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicComputeStatisticsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseGroupFromFilesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCasesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportInputEclipseCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewStatisticsCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicApplyPropertyFilterAsCellResultFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddEclipseInputPropertyFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicComputeStatisticsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCaseGroupFromFilesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCaseNewGroupFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterInsertFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCasesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportInputEclipseCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewStatisticsCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicApplyPropertyFilterAsCellResultFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportEclipseCaseTimeStepFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipsePropertyFilterNewInViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseHideFaultFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\Eclipse" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Eclipse" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/EclipseCommands/EclipseWell/CMakeLists_files.cmake b/ApplicationLibCode/Commands/EclipseCommands/EclipseWell/CMakeLists_files.cmake index f644800fb9..4c50fc6d14 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/EclipseWell/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/EclipseCommands/EclipseWell/CMakeLists_files.cmake @@ -1,21 +1,19 @@ - - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellShowFeatures.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellShowFeatures.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellShowFeatures.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseWellShowFeatures.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\Eclipse\\Well" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Eclipse\\Well" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp index 9f95b5124c..4e3414d5f7 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCaseFeature.cpp @@ -59,7 +59,15 @@ void RicImportEclipseCaseFeature::onActionTriggered( bool isChecked ) defaultDir = QFileInfo( fileNames.last() ).absolutePath(); app->setLastUsedDialogDirectory( "BINARY_GRID", defaultDir ); - openEclipseCaseFromFileNames( fileNames ); + bool createDefaultView = true; + std::vector caseIds; + std::shared_ptr readerSettings; + openEclipseCaseFromFileNames( fileNames, createDefaultView, caseIds, readerSettings ); + + for ( const auto& f : fileNames ) + { + RiaApplication::instance()->addToRecentFiles( f ); + } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCasesFeature.cpp b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCasesFeature.cpp index e02b2f4570..293d002b84 100644 --- a/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCasesFeature.cpp +++ b/ApplicationLibCode/Commands/EclipseCommands/RicImportEclipseCasesFeature.cpp @@ -70,8 +70,10 @@ void RicImportEclipseCasesFeature::onActionTriggered( bool isChecked ) // Remember the path to next time app->setLastUsedDialogDirectory( "BINARY_GRID", QFileInfo( result.rootDir ).absoluteFilePath() ); + bool createView = false; + bool noDialog = false; RiaImportEclipseCaseTools::FileCaseIdMap newCaseFiles; - RiaImportEclipseCaseTools::openEclipseCasesFromFile( result.files, &newCaseFiles ); + RiaImportEclipseCaseTools::openEclipseCasesFromFile( result.files, createView, &newCaseFiles, noDialog ); for ( const auto& newCaseFileAndId : newCaseFiles ) { diff --git a/ApplicationLibCode/Commands/ExportCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/ExportCommands/CMakeLists_files.cmake index 68519661f5..3c925601c8 100644 --- a/ApplicationLibCode/Commands/ExportCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/ExportCommands/CMakeLists_files.cmake @@ -1,68 +1,68 @@ -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCellRangeUi.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCarfin.h -${CMAKE_CURRENT_LIST_DIR}/RicExportCarfinUi.h -${CMAKE_CURRENT_LIST_DIR}/RicExportFaultsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAdvancedSnapshotExportFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileResampleUi.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputPropertyFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsUi.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyExec.h -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelUi.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllPlotsToFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllViewsToFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotFilenameGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToClipboardFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToPdfFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportSelectedWellPathsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportVisibleWellPathsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportWellPathsUi.h -${CMAKE_CURRENT_LIST_DIR}/RicExportLgrFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportLgrUi.h -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCellResultToFileImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicLgrSplitType.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCellRangeUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCarfin.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportCarfinUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportFaultsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAdvancedSnapshotExportFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileResampleUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputPropertyFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllPlotsToFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllViewsToFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotFilenameGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToClipboardFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToPdfFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportSelectedWellPathsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportVisibleWellPathsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportWellPathsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportLgrFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportLgrUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCellResultToFileImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicLgrSplitType.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCellRangeUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCarfin.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportCarfinUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportFaultsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAdvancedSnapshotExportFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileResampleUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputPropertyFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllPlotsToFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllViewsToFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotFilenameGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToClipboardFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToPdfFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportSelectedWellPathsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportVisibleWellPathsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportWellPathsUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportLgrFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportLgrUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEclipseCellResultToFileImpl.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCellRangeUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCarfin.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportCarfinUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportFaultsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAdvancedSnapshotExportFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportToLasFileResampleUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputPropertyFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseInputVisibleCellsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportEclipseSectorModelUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaveEclipseResultAsInputPropertyFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllPlotsToFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotAllViewsToFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotFilenameGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToClipboardFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSnapshotViewToPdfFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportSelectedWellPathsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportVisibleWellPathsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportWellPathsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportLgrFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportLgrUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEclipseCellResultToFileImpl.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\Export" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Export" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp index 087c71fde2..96ad9179e3 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.cpp @@ -165,7 +165,7 @@ void RicExportEclipseSectorModelUi::setCaseData( RigEclipseCaseData* caseData /* if ( selectedKeywords.v().empty() ) { - for ( QString keyword : mainKeywords() ) + for ( const QString& keyword : mainKeywords() ) { if ( caseData && caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) @@ -178,7 +178,7 @@ void RicExportEclipseSectorModelUi::setCaseData( RigEclipseCaseData* caseData /* else { std::vector validSelectedKeywords; - for ( QString keyword : selectedKeywords() ) + for ( const QString& keyword : selectedKeywords() ) { if ( caseData && caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) @@ -239,19 +239,20 @@ void RicExportEclipseSectorModelUi::defineEditorAttribute( const caf::PdmFieldHa const RigMainGrid* mainGrid = m_caseData->mainGrid(); cvf::Vec3i gridDimensions( int( mainGrid->cellCountI() ), int( mainGrid->cellCountJ() ), int( mainGrid->cellCountK() ) ); - caf::PdmUiLineEditorAttribute* lineEditorAttr = dynamic_cast( attribute ); + auto* lineEditorAttr = dynamic_cast( attribute ); if ( field == &exportParametersFilename || field == &exportGridFilename || field == &exportFaultsFilename ) { - caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { - myAttr->m_selectSaveFileName = true; + myAttr->m_selectSaveFileName = true; + myAttr->m_fileSelectionFilter = "GRDECL files (*.grdecl *.GRDECL);;All files (*.*)"; } } else if ( field == &selectedKeywords ) { - caf::PdmUiListEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { myAttr->m_heightHint = 280; @@ -261,7 +262,7 @@ void RicExportEclipseSectorModelUi::defineEditorAttribute( const caf::PdmFieldHa { if ( lineEditorAttr ) { - QIntValidator* validator = new QIntValidator( 1, 10, nullptr ); + auto* validator = new QIntValidator( 1, 10, nullptr ); lineEditorAttr->validator = validator; } } @@ -447,7 +448,7 @@ QList resultData ); std::set mainKeywords = this->mainKeywords(); - for ( caf::PdmOptionItemInfo option : allOptions ) + for ( const caf::PdmOptionItemInfo& option : allOptions ) { if ( mainKeywords.count( option.optionUiText() ) ) { @@ -458,7 +459,7 @@ QList } } } - for ( caf::PdmOptionItemInfo option : allOptions ) + for ( const caf::PdmOptionItemInfo& option : allOptions ) { if ( !mainKeywords.count( option.optionUiText() ) && option.optionUiText() != "None" ) { @@ -609,7 +610,7 @@ void RicExportEclipseSectorModelUi::removeInvalidKeywords() RigCaseCellResultsData* resultData = m_caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); std::vector validKeywords; - for ( QString keyword : selectedKeywords() ) + for ( const QString& keyword : selectedKeywords() ) { if ( resultData->hasResultEntry( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, keyword ) ) ) { diff --git a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h index f5b47c7d70..49c077fea8 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h +++ b/ApplicationLibCode/Commands/ExportCommands/RicExportEclipseSectorModelUi.h @@ -47,7 +47,7 @@ class RicExportEclipseSectorModelUi : public caf::PdmObject EXPORT_TO_SINGLE_SEPARATE_FILE, EXPORT_TO_SEPARATE_FILE_PER_RESULT }; - typedef caf::AppEnum ResultExportOptionsEnum; + using ResultExportOptionsEnum = caf::AppEnum; enum GridBoxSelection { @@ -56,7 +56,7 @@ class RicExportEclipseSectorModelUi : public caf::PdmObject FULL_GRID_BOX, MANUAL_SELECTION }; - typedef caf::AppEnum GridBoxSelectionEnum; + using GridBoxSelectionEnum = caf::AppEnum; public: RicExportEclipseSectorModelUi(); diff --git a/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseInputVisibleCellsUi.cpp b/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseInputVisibleCellsUi.cpp index 4583a07a3a..ece728d1d8 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseInputVisibleCellsUi.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseInputVisibleCellsUi.cpp @@ -73,12 +73,11 @@ void RicSaveEclipseInputVisibleCellsUi::defineEditorAttribute( const caf::PdmFie { if ( field == &exportFilename ) { - caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { - myAttr->m_selectSaveFileName = true; - // Set GRDECL file filter as default - myAttr->m_fileSelectionFilter = "GRDECL files (*.grdecl);;All files (*.*)"; + myAttr->m_selectSaveFileName = true; + myAttr->m_fileSelectionFilter = "GRDECL files (*.grdecl *.GRDECL);;All files (*.*)"; } } } diff --git a/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseResultAsInputPropertyExec.cpp b/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseResultAsInputPropertyExec.cpp index 0e442cf9eb..7f5682a749 100644 --- a/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseResultAsInputPropertyExec.cpp +++ b/ApplicationLibCode/Commands/ExportCommands/RicSaveEclipseResultAsInputPropertyExec.cpp @@ -84,7 +84,8 @@ void RicSaveEclipseResultAsInputPropertyExec::redo() } QString outputFileName = projectFolder + "/" + - caf::Utils::makeValidFileBasename( m_cellColors->resultVariableUiShortName() ); + caf::Utils::makeValidFileBasename( m_cellColors->resultVariableUiShortName() ) + + ".GRDECL"; exportSettings.fileName = outputFileName; } diff --git a/ApplicationLibCode/Commands/FlowCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/FlowCommands/CMakeLists_files.cmake index 89f050c8da..6e352f3780 100644 --- a/ApplicationLibCode/Commands/FlowCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/FlowCommands/CMakeLists_files.cmake @@ -1,38 +1,37 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddStoredFlowCharacteristicsPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowWellAllocationPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowFlowCharacteristicsPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAddStoredWellAllocationPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFromPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicPlotProductionRateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSelectViewUI.h -${CMAKE_CURRENT_LIST_DIR}/RicShowTotalAllocationDataFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowCumulativePhasePlotFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddStoredFlowCharacteristicsPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowWellAllocationPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowFlowCharacteristicsPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAddStoredWellAllocationPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFromPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicPlotProductionRateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSelectViewUI.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowTotalAllocationDataFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowCumulativePhasePlotFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddStoredFlowCharacteristicsPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowWellAllocationPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowFlowCharacteristicsPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAddStoredWellAllocationPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFromPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPlotProductionRateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSelectViewUI.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowTotalAllocationDataFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowCumulativePhasePlotFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddStoredFlowCharacteristicsPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowWellAllocationPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowFlowCharacteristicsPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAddStoredWellAllocationPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFromPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowContributingWellsFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPlotProductionRateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSelectViewUI.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowTotalAllocationDataFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowCumulativePhasePlotFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\FlowDiagnostics" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\FlowDiagnostics" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/FractureCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/FractureCommands/CMakeLists_files.cmake index 31b150c205..02cd25ab68 100644 --- a/ApplicationLibCode/Commands/FractureCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/FractureCommands/CMakeLists_files.cmake @@ -1,64 +1,61 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicPasteEllipseFractureFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteStimPlanFractureFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToFieldFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToMetricFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateDuplicateTemplateInOtherUnitSystemFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicFractureNameGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RicNewEllipseFractureTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureAtPosFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanFractureTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureAtPosFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathStimPlanModelAtPosFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewElasticPropertyScalingFeature.h - -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesOptionItemUi.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesUi.h -${CMAKE_CURRENT_LIST_DIR}/RicNewOptionItemFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteOptionItemFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEllipseFractureFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteStimPlanFractureFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToFieldFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToMetricFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateDuplicateTemplateInOtherUnitSystemFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicFractureNameGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewEllipseFractureTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureAtPosFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanFractureTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureAtPosFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathStimPlanModelAtPosFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewElasticPropertyScalingFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesOptionItemUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewOptionItemFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteOptionItemFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicPasteEllipseFractureFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteStimPlanFractureFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToFieldFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToMetricFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateDuplicateTemplateInOtherUnitSystemFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicFractureNameGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewEllipseFractureTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureAtPosFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanFractureTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureAtPosFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathStimPlanModelAtPosFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewElasticPropertyScalingFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesOptionItemUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewOptionItemFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteOptionItemFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEllipseFractureFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteStimPlanFractureFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToFieldFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicConvertAllFractureTemplatesToMetricFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateDuplicateTemplateInOtherUnitSystemFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicFractureNameGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewEllipseFractureTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureAtPosFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSimWellFractureFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanFractureTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureAtPosFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathFractureFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathStimPlanModelAtPosFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewStimPlanModelTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewElasticPropertyScalingFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesOptionItemUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewOptionItemFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteOptionItemFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleFracturesFeature.h ) -source_group( "CommandFeature\\Fracture" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Fracture" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewElasticPropertyScalingFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicNewElasticPropertyScalingFeature.cpp index 980cf1bab5..86f7dbdfa3 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewElasticPropertyScalingFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewElasticPropertyScalingFeature.cpp @@ -45,8 +45,10 @@ void RicNewElasticPropertyScalingFeature::onActionTriggered( bool isChecked ) if ( !scalingColl ) return; RimElasticPropertyScaling* elasticPropertyScaling = new RimElasticPropertyScaling; + elasticPropertyScaling->ensureDefaultFormationAndFacies(); scalingColl->addElasticPropertyScaling( elasticPropertyScaling ); + scalingColl->updateConnectedEditors(); Riu3DMainWindowTools::selectAsCurrentItem( elasticPropertyScaling ); } diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureAtPosFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureAtPosFeature.cpp index 5363d12ef7..82ef26e64a 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureAtPosFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureAtPosFeature.cpp @@ -33,10 +33,7 @@ CAF_CMD_SOURCE_INIT( RicNewWellPathFractureAtPosFeature, "RicNewWellPathFracture //-------------------------------------------------------------------------------------------------- void RicNewWellPathFractureAtPosFeature::onActionTriggered( bool isChecked ) { - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); + RiuWellPathSelectionItem* wellPathItem = RiuWellPathSelectionItem::wellPathSelectionItem(); if ( !wellPathItem ) return; RimWellPath* wellPath = wellPathItem->m_wellpath; diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.cpp index ac51333d63..a5f84ffe5b 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.cpp @@ -52,9 +52,9 @@ CAF_CMD_SOURCE_INIT( RicNewWellPathFractureFeature, "RicNewWellPathFractureFeatu //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicNewWellPathFractureFeature::addFracture( gsl::not_null wellPath, double measuredDepth ) +RimWellPathFracture* RicNewWellPathFractureFeature::addFracture( gsl::not_null wellPath, double measuredDepth ) { - if ( !RicWellPathsUnitSystemSettingsImpl::ensureHasUnitSystem( wellPath ) ) return; + if ( !RicWellPathsUnitSystemSettingsImpl::ensureHasUnitSystem( wellPath ) ) return nullptr; RimWellPathFractureCollection* fractureCollection = wellPath->fractureCollection(); CVF_ASSERT( fractureCollection ); @@ -68,23 +68,23 @@ void RicNewWellPathFractureFeature::addFracture( gsl::not_null wel } } + auto wellPathGeometry = wellPath->wellPathGeometry(); + CVF_ASSERT( wellPathGeometry ); + if ( !wellPathGeometry ) return nullptr; + + RimOilField* oilfield = nullptr; + fractureCollection->firstAncestorOrThisOfType( oilfield ); + if ( !oilfield ) return nullptr; + RimWellPathFracture* fracture = new RimWellPathFracture(); fractureCollection->addFracture( fracture ); fracture->setMeasuredDepth( measuredDepth ); fracture->setFractureUnit( wellPath->unitSystem() ); - auto wellPathGeometry = wellPath->wellPathGeometry(); - CVF_ASSERT( wellPathGeometry ); - if ( !wellPathGeometry ) return; - cvf::Vec3d positionAtWellpath = wellPathGeometry->interpolatedPointAlongWellPath( measuredDepth ); fracture->setAnchorPosition( positionAtWellpath ); - RimOilField* oilfield = nullptr; - fractureCollection->firstAncestorOrThisOfType( oilfield ); - if ( !oilfield ) return; - fracture->setName( RicFractureNameGenerator::nameForNewFracture() ); auto unitSet = wellPath->unitSystem(); @@ -105,6 +105,7 @@ void RicNewWellPathFractureFeature::addFracture( gsl::not_null wel } Riu3DMainWindowTools::selectAsCurrentItem( fracture ); + return fracture; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.h b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.h index bdbcdf080b..4b1bb21744 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.h +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathFractureFeature.h @@ -25,6 +25,7 @@ class RimWellPathFractureCollection; class RimWellPath; +class RimWellPathFracture; //================================================================================================== /// @@ -34,7 +35,7 @@ class RicNewWellPathFractureFeature : public caf::CmdFeature CAF_CMD_HEADER_INIT; public: - static void addFracture( gsl::not_null wellPath, double measuredDepth ); + static RimWellPathFracture* addFracture( gsl::not_null wellPath, double measuredDepth ); protected: void onActionTriggered( bool isChecked ) override; diff --git a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathStimPlanModelAtPosFeature.cpp b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathStimPlanModelAtPosFeature.cpp index d4ba94e411..ca6c545fb9 100644 --- a/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathStimPlanModelAtPosFeature.cpp +++ b/ApplicationLibCode/Commands/FractureCommands/RicNewWellPathStimPlanModelAtPosFeature.cpp @@ -38,10 +38,7 @@ CAF_CMD_SOURCE_INIT( RicNewWellPathStimPlanModelAtPosFeature, "RicNewWellPathSti //-------------------------------------------------------------------------------------------------- void RicNewWellPathStimPlanModelAtPosFeature::onActionTriggered( bool isChecked ) { - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); + RiuWellPathSelectionItem* wellPathItem = RiuWellPathSelectionItem::wellPathSelectionItem(); if ( !wellPathItem ) return; RimWellPath* wellPath = wellPathItem->m_wellpath; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake index aa6fb5f2c6..52f4842590 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/GeoMechCommands/CMakeLists_files.cmake @@ -1,52 +1,52 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechCopyCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertExec.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewInViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.h - -${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.h - -${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechCopyCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewInViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessment3dFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessment3dFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellIntegrityAnalysisFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRunWellIntegrityAnalysisFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechCopyCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertExec.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewInViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechCopyCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterInsertExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewInViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicGeoMechPropertyFilterNewExec.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportGeoMechCaseTimeStepFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewFaultReactAssessmentFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessmentFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunAdvFaultReactAssessment3dFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessmentFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunBasicFaultReactAssessment3dFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunFaultReactAssessmentFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellIntegrityAnalysisFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRunWellIntegrityAnalysisFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) - -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -#set (COMMAND_QT_MOC_HEADERS -#${COMMAND_QT_MOC_HEADERS} -#${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h -#) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) +# set (COMMAND_QT_MOC_HEADERS ${COMMAND_QT_MOC_HEADERS} +# ${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h ) -source_group( "CommandFeature\\GeoMechCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\GeoMechCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp index 52a6eb4fad..6242c13b4e 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicNewFaultReactAssessmentFeature.cpp @@ -70,7 +70,8 @@ void RicNewFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) { QMessageBox::critical( nullptr, "Fault Reactivation Assessment", - "Please go to ResInsight preferences and set/check the GeoMechanical settings!" ); + "Fault Reactivation Assessment has not been properly set up.\nPlease go to ResInsight " + "preferences and set/check the GeoMechanical settings." ); return; } @@ -102,7 +103,8 @@ void RicNewFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) gridList << frapSettings.outputEclipseFilename(); // load the new grid - int caseId = RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( gridList ); + bool createView = true; + int caseId = RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( gridList, createView ); if ( caseId < 0 ) { QMessageBox::critical( nullptr, "Fault Reactivation Assessment", "Unable to load generated Eclipse grid." ); diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp new file mode 100644 index 0000000000..851b1c3825 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.cpp @@ -0,0 +1,110 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicNewWellIntegrityAnalysisFeature.h" + +#include "RiaApplication.h" +#include "RiaPreferencesGeoMech.h" + +#include "RimGeoMechView.h" +#include "RimProject.h" +#include "RimWellIASettings.h" +#include "RimWellIASettingsCollection.h" +#include "RimWellPath.h" + +#include "Riu3DMainWindowTools.h" +#include "Riu3dSelectionManager.h" +#include "RiuFileDialogTools.h" + +#include +#include + +CAF_CMD_SOURCE_INIT( RicNewWellIntegrityAnalysisFeature, "RicNewWellIntegrityAnalysisFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewWellIntegrityAnalysisFeature::onActionTriggered( bool isChecked ) +{ + RiuWellPathSelectionItem* wellPathItem = RiuWellPathSelectionItem::wellPathSelectionItem(); + if ( !wellPathItem ) return; + + RimWellPath* wellPath = wellPathItem->m_wellpath; + if ( !wellPath ) return; + + RimWellIASettingsCollection* coll = wellPath->wellIASettingsCollection(); + if ( !coll ) return; + + RimGeoMechView* view = dynamic_cast( RiaApplication::instance()->activeGridView() ); + RimGeoMechCase* theCase = nullptr; + if ( view ) + { + theCase = view->geoMechCase(); + } + + if ( !RiaPreferencesGeoMech::current()->validateWIASettings() ) + { + QMessageBox::critical( nullptr, + "Well Integrity Analysis", + "Well Integrity Analysis has not been properly set up.\nPlease go to ResInsight " + "preferences and set / check the GeoMechanical settings." ); + + return; + } + + // get base directory for our work, should be a new, empty folder somewhere + QString defaultDir = + RiaApplication::instance()->lastUsedDialogDirectoryWithFallbackToProjectFolder( "WELL_INTEGRITY_ANALYSIS" ); + QString baseDir = RiuFileDialogTools::getExistingDirectory( nullptr, tr( "Select Working Directory" ), defaultDir ); + if ( baseDir.isNull() || baseDir.isEmpty() ) return; + RiaApplication::instance()->setLastUsedDialogDirectory( "WELL_INTEGRITY_ANALYSIS", baseDir ); + + QString errMsg; + + RimWellIASettings* newWIA = + coll->startWellIntegrationAnalysis( baseDir, wellPath, wellPathItem->m_measuredDepth, theCase, errMsg ); + + if ( newWIA ) + { + wellPath->updateConnectedEditors(); + Riu3DMainWindowTools::selectAsCurrentItem( newWIA ); + newWIA->updateVisualization(); + } + else + { + QMessageBox::critical( nullptr, "Well Integrity Analysis", errMsg ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewWellIntegrityAnalysisFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/WellIntAnalysis.png" ) ); + actionToSetup->setText( "New Well Integration Analysis at this Depth" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicNewWellIntegrityAnalysisFeature::isCommandEnabled() +{ + RimGeoMechView* view = dynamic_cast( RiaApplication::instance()->activeGridView() ); + return ( view != nullptr ); +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.h new file mode 100644 index 0000000000..60cbfa9523 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicNewWellIntegrityAnalysisFeature.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RicNewWellIntegrityAnalysisFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandEnabled() override; +}; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp new file mode 100644 index 0000000000..57746c8893 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.cpp @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicRunAdvFaultReactAssessment3dFeature.h" + +#include + +CAF_CMD_SOURCE_INIT( RicRunAdvFaultReactAssessment3dFeature, "RicRunAdvFaultReactAssessment3dFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunAdvFaultReactAssessment3dFeature::onActionTriggered( bool isChecked ) +{ + QVariant userData = this->userData(); + if ( userData.isNull() || userData.type() != QVariant::String ) return; + + QString faultName = userData.toString(); + + int faultID = faultIDFromName( faultName ); + if ( faultID >= 0 ) runAdvancedProcessing( faultID ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunAdvFaultReactAssessment3dFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); + actionToSetup->setText( "Run Advanced Processing" ); +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h new file mode 100644 index 0000000000..0004124fbd --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessment3dFeature.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RicRunBasicFaultReactAssessment3dFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicRunAdvFaultReactAssessment3dFeature : public RicRunBasicFaultReactAssessment3dFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp index c47e669cd6..444edf9da1 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunAdvFaultReactAssessmentFeature.cpp @@ -18,38 +18,10 @@ #include "RicRunAdvFaultReactAssessmentFeature.h" -#include "RiaApplication.h" -#include "RiaEclipseFileNameTools.h" -#include "RiaImportEclipseCaseTools.h" -#include "RiaPreferencesGeoMech.h" -#include "RiaResultNames.h" - -#include "RifFaultRAJsonWriter.h" -#include "RifFaultRAXmlWriter.h" - -#include "RimEclipseInputCase.h" -#include "RimEclipseResultCase.h" -#include "RimEclipseView.h" -#include "RimFaultInView.h" #include "RimFaultInViewCollection.h" -#include "RimFaultRAPreprocSettings.h" #include "RimFaultRASettings.h" -#include "RimGeoMechCase.h" -#include "RimProcess.h" -#include "RimProject.h" - -#include "Riu3DMainWindowTools.h" -#include "RiuFileDialogTools.h" - -#include "cafPdmUiPropertyViewDialog.h" -#include "cafProgressInfo.h" -#include "cafSelectionManagerTools.h" -#include "cafUtils.h" #include -#include -#include -#include CAF_CMD_SOURCE_INIT( RicRunAdvFaultReactAssessmentFeature, "RicRunAdvFaultReactAssessmentFeature" ); @@ -62,7 +34,7 @@ bool RicRunAdvFaultReactAssessmentFeature::isCommandEnabled() if ( faultColl ) { - return ( faultColl->faultRAEnabled() && faultColl->faultRASettings()->geomechCase() != nullptr ); + return faultColl->faultRAAdvancedEnabled(); } return false; @@ -73,72 +45,7 @@ bool RicRunAdvFaultReactAssessmentFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicRunAdvFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) { - RimFaultInViewCollection* coll = faultCollection(); - if ( coll == nullptr ) return; - - RimFaultRASettings* fraSettings = coll->faultRASettings(); - if ( fraSettings == nullptr ) return; - - int faultID = selectedFaultID(); - caf::ProgressInfo runProgress( 3, "Running Advanced Fault RA processing, please wait..." ); - - runProgress.setProgressDescription( "Macris calibrate command." ); - QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); - - RifFaultRAXmlWriter xmlwriter( fraSettings ); - QString outErrorText; - if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write parameter file! " + outErrorText ); - return; - } - - QString paramfilename2 = fraSettings->advancedParameterXMLFilename( faultID ); - if ( !xmlwriter.writeCalibrateFile( paramfilename2, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write calibrate parameter file! " + outErrorText ); - return; - } - - addParameterFileForCleanUp( paramfilename ); - addParameterFileForCleanUp( paramfilename2 ); - - // run the java macris program in calibrate mode - QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); - QStringList parameters = fraSettings->advancedMacrisParameters( faultID ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Advanced Fault Reactivation Assessment Processing", - "Failed to run Macris calibrate command. Check log window for additional information." ); - cleanUpParameterFiles(); - return; - } - - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Generating surface results." ); - - if ( runPostProcessing( faultID, fraSettings ) ) - { - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Importing surface results." ); - - // reload output surfaces - reloadSurfaces( fraSettings ); - } - - // delete parameter files - cleanUpParameterFiles(); + runAdvancedProcessing( selectedFaultID() ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp new file mode 100644 index 0000000000..a7e5dd3afd --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.cpp @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicRunBasicFaultReactAssessment3dFeature.h" + +#include "RimEclipseView.h" +#include "RimFaultInViewCollection.h" +#include "RimFaultRASettings.h" +#include "RimGridView.h" + +#include "RiaApplication.h" + +#include +#include + +CAF_CMD_SOURCE_INIT( RicRunBasicFaultReactAssessment3dFeature, "RicRunBasicFaultReactAssessment3dFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicRunBasicFaultReactAssessment3dFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunBasicFaultReactAssessment3dFeature::onActionTriggered( bool isChecked ) +{ + QVariant userData = this->userData(); + if ( userData.isNull() || userData.type() != QVariant::String ) return; + + QString faultName = userData.toString(); + + int faultID = faultIDFromName( faultName ); + if ( faultID >= 0 ) runBasicProcessing( faultID ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunBasicFaultReactAssessment3dFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/fault_react_24x24.png" ) ); + actionToSetup->setText( "Run Basic Processing" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimFaultInViewCollection* RicRunBasicFaultReactAssessment3dFeature::faultCollection() +{ + RimGridView* viewOrComparisonView = RiaApplication::instance()->activeMainOrComparisonGridView(); + RimEclipseView* theView = dynamic_cast( viewOrComparisonView ); + + CAF_ASSERT( theView ); + + return theView->faultCollection(); +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h new file mode 100644 index 0000000000..3fe062ec99 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessment3dFeature.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RicRunFaultReactAssessmentFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicRunBasicFaultReactAssessment3dFeature : public RicRunFaultReactAssessmentFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + RimFaultInViewCollection* faultCollection() override; + + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp index 771db74ed2..5fe424f637 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunBasicFaultReactAssessmentFeature.cpp @@ -18,38 +18,10 @@ #include "RicRunBasicFaultReactAssessmentFeature.h" -#include "RiaApplication.h" -#include "RiaEclipseFileNameTools.h" -#include "RiaImportEclipseCaseTools.h" -#include "RiaPreferencesGeoMech.h" -#include "RiaResultNames.h" - -#include "RifFaultRAJsonWriter.h" -#include "RifFaultRAXmlWriter.h" - -#include "RimEclipseInputCase.h" -#include "RimEclipseResultCase.h" -#include "RimEclipseView.h" -#include "RimFaultInView.h" #include "RimFaultInViewCollection.h" -#include "RimFaultRAPreprocSettings.h" #include "RimFaultRASettings.h" -#include "RimGeoMechCase.h" -#include "RimProcess.h" -#include "RimProject.h" - -#include "Riu3DMainWindowTools.h" -#include "RiuFileDialogTools.h" - -#include "cafPdmUiPropertyViewDialog.h" -#include "cafProgressInfo.h" -#include "cafSelectionManagerTools.h" -#include "cafUtils.h" #include -#include -#include -#include CAF_CMD_SOURCE_INIT( RicRunBasicFaultReactAssessmentFeature, "RicRunBasicFaultReactAssessmentFeature" ); @@ -72,64 +44,7 @@ bool RicRunBasicFaultReactAssessmentFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicRunBasicFaultReactAssessmentFeature::onActionTriggered( bool isChecked ) { - RimFaultInViewCollection* coll = faultCollection(); - if ( coll == nullptr ) return; - - RimFaultRASettings* fraSettings = coll->faultRASettings(); - if ( fraSettings == nullptr ) return; - - int faultID = selectedFaultID(); - caf::ProgressInfo runProgress( 3, "Running Basic Fault RA processing, please wait..." ); - - { - runProgress.setProgressDescription( "Macris calculate command." ); - QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); - - RifFaultRAXmlWriter xmlwriter( fraSettings ); - QString outErrorText; - if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) - { - QMessageBox::warning( nullptr, - "Fault Reactivation Assessment Processing", - "Unable to write parameter file! " + outErrorText ); - return; - } - - addParameterFileForCleanUp( paramfilename ); - - // run the java macris program in calculate mode - QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); - QStringList parameters = fraSettings->basicMacrisParameters( faultID ); - - RimProcess process; - process.setCommand( command ); - process.setParameters( parameters ); - if ( !process.execute() ) - { - QMessageBox::critical( nullptr, - "Basic Fault Reactivation Assessment Processing", - "Failed to run Macris calculate command. Check log window for additional " - "information." ); - cleanUpParameterFiles(); - return; - } - - runProgress.incrementProgress(); - } - - runProgress.setProgressDescription( "Generating surface results." ); - - if ( runPostProcessing( faultID, fraSettings ) ) - { - runProgress.incrementProgress(); - - runProgress.setProgressDescription( "Importing surface results." ); - - // reload output surfaces - reloadSurfaces( fraSettings ); - } - // delete parameter files - cleanUpParameterFiles(); + runBasicProcessing( selectedFaultID() ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp index 6ea7061899..916e1c7a51 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.cpp @@ -25,6 +25,7 @@ #include "RiaResultNames.h" #include "RifFaultRAJsonWriter.h" +#include "RifFaultRAXmlWriter.h" #include "RimEclipseInputCase.h" #include "RimEclipseResultCase.h" @@ -83,6 +84,27 @@ RimFaultInViewCollection* RicRunFaultReactAssessmentFeature::faultCollection() return faultColl; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RicRunFaultReactAssessmentFeature::faultIDFromName( QString faultName ) const +{ + int retval = -1; + + QString lookFor = RiaResultNames::faultReactAssessmentPrefix(); + QString name = faultName; + if ( !name.startsWith( lookFor ) ) return retval; + + name = name.mid( lookFor.length() ); + if ( name.size() == 0 ) return retval; + + bool bOK; + retval = name.toInt( &bOK ); + if ( !bOK ) retval = -1; + + return retval; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -92,16 +114,7 @@ int RicRunFaultReactAssessmentFeature::selectedFaultID() RimFaultInView* selObj = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); if ( selObj ) { - QString lookFor = RiaResultNames::faultReactAssessmentPrefix(); - QString name = selObj->name(); - if ( !name.startsWith( lookFor ) ) return retval; - - name = name.mid( lookFor.length() ); - if ( name.size() == 0 ) return retval; - - bool bOK; - retval = name.toInt( &bOK ); - if ( !bOK ) retval = -1; + return faultIDFromName( selObj->name() ); } return retval; @@ -162,12 +175,20 @@ void RicRunFaultReactAssessmentFeature::cleanUpParameterFiles() { for ( auto& filename : m_parameterFilesToCleanUp ) { - if ( QFile::exists( filename ) ) QFile::remove( filename ); + removeFile( filename ); } } m_parameterFilesToCleanUp.clear(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunFaultReactAssessmentFeature::removeFile( QString filename ) +{ + if ( QFile::exists( filename ) ) QFile::remove( filename ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -226,3 +247,145 @@ void RicRunFaultReactAssessmentFeature::reloadSurfaces( RimFaultRASettings* sett // import the new surfaces surfColl->importSurfacesFromFiles( newFiles, showLegendInView ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunFaultReactAssessmentFeature::runBasicProcessing( int faultID ) +{ + RimFaultInViewCollection* coll = faultCollection(); + if ( coll == nullptr ) return; + + RimFaultRASettings* fraSettings = coll->faultRASettings(); + if ( fraSettings == nullptr ) return; + + caf::ProgressInfo runProgress( 3, "Running Basic Fault RA processing, please wait..." ); + + { + runProgress.setProgressDescription( "Macris calculate command." ); + QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); + + RifFaultRAXmlWriter xmlwriter( fraSettings ); + QString outErrorText; + if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) + { + QMessageBox::warning( nullptr, + "Fault Reactivation Assessment Processing", + "Unable to write parameter file! " + outErrorText ); + return; + } + + addParameterFileForCleanUp( paramfilename ); + + // remove any existing database file + removeFile( fraSettings->basicMacrisDatabase() ); + + // run the java macris program in calculate mode + QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); + QStringList parameters = fraSettings->basicMacrisParameters( faultID ); + + RimProcess process; + process.setCommand( command ); + process.setParameters( parameters ); + if ( !process.execute() ) + { + QMessageBox::critical( nullptr, + "Basic Fault Reactivation Assessment Processing", + "Failed to run Macris calculate command. Check log window for additional " + "information." ); + cleanUpParameterFiles(); + return; + } + + runProgress.incrementProgress(); + } + + runProgress.setProgressDescription( "Generating surface results." ); + + if ( runPostProcessing( faultID, fraSettings ) ) + { + runProgress.incrementProgress(); + + runProgress.setProgressDescription( "Importing surface results." ); + + // reload output surfaces + reloadSurfaces( fraSettings ); + } + // delete parameter files + cleanUpParameterFiles(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunFaultReactAssessmentFeature::runAdvancedProcessing( int faultID ) +{ + RimFaultInViewCollection* coll = faultCollection(); + if ( coll == nullptr ) return; + + RimFaultRASettings* fraSettings = coll->faultRASettings(); + if ( fraSettings == nullptr ) return; + + caf::ProgressInfo runProgress( 3, "Running Advanced Fault RA processing, please wait..." ); + + runProgress.setProgressDescription( "Macris calibrate command." ); + QString paramfilename = fraSettings->basicParameterXMLFilename( faultID ); + + RifFaultRAXmlWriter xmlwriter( fraSettings ); + QString outErrorText; + if ( !xmlwriter.writeCalculateFile( paramfilename, faultID, outErrorText ) ) + { + QMessageBox::warning( nullptr, + "Fault Reactivation Assessment Processing", + "Unable to write parameter file! " + outErrorText ); + return; + } + + QString paramfilename2 = fraSettings->advancedParameterXMLFilename( faultID ); + if ( !xmlwriter.writeCalibrateFile( paramfilename2, faultID, outErrorText ) ) + { + QMessageBox::warning( nullptr, + "Fault Reactivation Assessment Processing", + "Unable to write calibrate parameter file! " + outErrorText ); + return; + } + + addParameterFileForCleanUp( paramfilename ); + addParameterFileForCleanUp( paramfilename2 ); + + // remove any existing database file + removeFile( fraSettings->advancedMacrisDatabase() ); + + // run the java macris program in calibrate mode + QString command = RiaPreferencesGeoMech::current()->geomechFRAMacrisCommand(); + QStringList parameters = fraSettings->advancedMacrisParameters( faultID ); + + RimProcess process; + process.setCommand( command ); + process.setParameters( parameters ); + if ( !process.execute() ) + { + QMessageBox::critical( nullptr, + "Advanced Fault Reactivation Assessment Processing", + "Failed to run Macris calibrate command. Check log window for additional information." ); + cleanUpParameterFiles(); + return; + } + + runProgress.incrementProgress(); + + runProgress.setProgressDescription( "Generating surface results." ); + + if ( runPostProcessing( faultID, fraSettings ) ) + { + runProgress.incrementProgress(); + + runProgress.setProgressDescription( "Importing surface results." ); + + // reload output surfaces + reloadSurfaces( fraSettings ); + } + + // delete parameter files + cleanUpParameterFiles(); +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h index bfa3567477..808928323c 100644 --- a/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunFaultReactAssessmentFeature.h @@ -34,8 +34,10 @@ class RicRunFaultReactAssessmentFeature : public caf::CmdFeature protected: RicRunFaultReactAssessmentFeature(); - RimFaultInViewCollection* faultCollection(); - int selectedFaultID(); + virtual RimFaultInViewCollection* faultCollection(); + + int selectedFaultID(); + int faultIDFromName( QString faultname ) const; RimSurfaceCollection* surfaceCollection(); @@ -45,6 +47,11 @@ class RicRunFaultReactAssessmentFeature : public caf::CmdFeature void addParameterFileForCleanUp( QString filename ); void cleanUpParameterFiles(); + void removeFile( QString filename ); + + void runBasicProcessing( int faultID ); + void runAdvancedProcessing( int faultID ); + private: std::list m_parameterFilesToCleanUp; }; diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp new file mode 100644 index 0000000000..d0a3c06936 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.cpp @@ -0,0 +1,136 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicRunWellIntegrityAnalysisFeature.h" + +#include "RiaApplication.h" +#include "RiaPreferencesGeoMech.h" + +#include "RifWellIAFileWriter.h" + +#include "RimGeoMechView.h" +#include "RimProcess.h" +#include "RimProject.h" +#include "RimWellIASettings.h" +#include "RimWellIASettingsCollection.h" +#include "RimWellPath.h" + +#include "Riu3DMainWindowTools.h" +#include "Riu3dSelectionManager.h" +#include "RiuFileDialogTools.h" + +#include "cafProgressInfo.h" +#include "cafSelectionManagerTools.h" + +#include +#include + +CAF_CMD_SOURCE_INIT( RicRunWellIntegrityAnalysisFeature, "RicRunWellIntegrityAnalysisFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunWellIntegrityAnalysisFeature::onActionTriggered( bool isChecked ) +{ + RimWellIASettings* modelSettings = + dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + + if ( modelSettings == nullptr ) return; + + const QString wiaTitle( "Well Integrity Analysis" ); + + QString outErrorText; + + caf::ProgressInfo runProgress( 3, wiaTitle + " running , please wait..." ); + + runProgress.setProgressDescription( "Writing input files." ); + + if ( !modelSettings->extractModelData() ) + { + QMessageBox::critical( nullptr, + wiaTitle, + "Unable to get necessary data from the defined model box. Is the model box center " + "outside the reservoir?" ); + return; + } + + if ( !RifWellIAFileWriter::writeToJsonFile( *modelSettings, outErrorText ) ) + { + QMessageBox::critical( nullptr, wiaTitle, outErrorText ); + return; + } + + if ( !RifWellIAFileWriter::writeToCSVFile( *modelSettings, outErrorText ) ) + { + QMessageBox::critical( nullptr, wiaTitle, outErrorText ); + return; + } + + runProgress.incrementProgress(); + runProgress.setProgressDescription( "Running Abaqus modeling." ); + + QString command = RiaPreferencesGeoMech::current()->geomechWIACommand(); + QStringList parameters = modelSettings->commandParameters(); + + RimProcess process; + process.setCommand( command ); + process.setParameters( parameters ); + + if ( !process.execute() ) + { + QMessageBox::critical( nullptr, wiaTitle, "Failed to run modeling. Check log window for additional information." ); + return; + } + + runProgress.incrementProgress(); + runProgress.setProgressDescription( "Loading modeling results." ); + + RiaApplication* app = RiaApplication::instance(); + if ( !app->openOdbCaseFromFile( modelSettings->outputHeatOdbFilename() ) ) + { + QMessageBox::critical( nullptr, + wiaTitle, + "Failed to load modeling results from file \"" + modelSettings->outputHeatOdbFilename() + + "\". Check log window for additional information." ); + } + + if ( !app->openOdbCaseFromFile( modelSettings->outputOdbFilename() ) ) + { + QMessageBox::critical( nullptr, + wiaTitle, + "Failed to load modeling results from file \"" + modelSettings->outputOdbFilename() + + "\". Check log window for additional information." ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRunWellIntegrityAnalysisFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/WellIntAnalysis.png" ) ); + actionToSetup->setText( "Run..." ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicRunWellIntegrityAnalysisFeature::isCommandEnabled() +{ + return true; +} diff --git a/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.h b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.h new file mode 100644 index 0000000000..576b2aee46 --- /dev/null +++ b/ApplicationLibCode/Commands/GeoMechCommands/RicRunWellIntegrityAnalysisFeature.h @@ -0,0 +1,36 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RicRunWellIntegrityAnalysisFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandEnabled() override; +}; diff --git a/ApplicationLibCode/Commands/GridCrossPlotCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/GridCrossPlotCommands/CMakeLists_files.cmake index 528eca2504..b5cd988aef 100644 --- a/ApplicationLibCode/Commands/GridCrossPlotCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/GridCrossPlotCommands/CMakeLists_files.cmake @@ -1,28 +1,27 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotDataSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSwapGridCrossPlotDataSetAxesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteGridCrossPlotDataSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateSaturationPressurePlotsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSaturationPressureUi.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotDataSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSwapGridCrossPlotDataSetAxesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteGridCrossPlotDataSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSaturationPressurePlotsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSaturationPressureUi.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotDataSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSwapGridCrossPlotDataSetAxesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteGridCrossPlotDataSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateSaturationPressurePlotsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSaturationPressureUi.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateGridCrossPlotDataSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSwapGridCrossPlotDataSetAxesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteGridCrossPlotDataSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateSaturationPressurePlotsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSaturationPressureUi.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\GridCrossPlot" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\GridCrossPlot" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/HoloLensCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/HoloLensCommands/CMakeLists_files.cmake index 3c8c1d3336..ae9633376e 100644 --- a/ApplicationLibCode/Commands/HoloLensCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/HoloLensCommands/CMakeLists_files.cmake @@ -1,68 +1,61 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderUi.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToSharingServerFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensTerminateSessionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensServerSettings.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionUi.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSession.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionObserver.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionManager.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateDummyFileBackedSessionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensAutoExportToSharingServerFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.h - -${CMAKE_CURRENT_LIST_DIR}/VdeArrayDataPacket.h -${CMAKE_CURRENT_LIST_DIR}/VdeCachingHashedIdFactory.h -${CMAKE_CURRENT_LIST_DIR}/VdeExportPart.h -${CMAKE_CURRENT_LIST_DIR}/VdeFileExporter.h -${CMAKE_CURRENT_LIST_DIR}/VdePacketDirectory.h -${CMAKE_CURRENT_LIST_DIR}/VdeVizDataExtractor.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToSharingServerFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensTerminateSessionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensServerSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSession.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionObserver.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionManager.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateDummyFileBackedSessionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensAutoExportToSharingServerFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.h + ${CMAKE_CURRENT_LIST_DIR}/VdeArrayDataPacket.h + ${CMAKE_CURRENT_LIST_DIR}/VdeCachingHashedIdFactory.h + ${CMAKE_CURRENT_LIST_DIR}/VdeExportPart.h + ${CMAKE_CURRENT_LIST_DIR}/VdeFileExporter.h + ${CMAKE_CURRENT_LIST_DIR}/VdePacketDirectory.h + ${CMAKE_CURRENT_LIST_DIR}/VdeVizDataExtractor.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToSharingServerFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensTerminateSessionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensServerSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSession.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateDummyFileBackedSessionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensAutoExportToSharingServerFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.cpp - -${CMAKE_CURRENT_LIST_DIR}/VdeArrayDataPacket.cpp -${CMAKE_CURRENT_LIST_DIR}/VdeCachingHashedIdFactory.cpp -${CMAKE_CURRENT_LIST_DIR}/VdeExportPart.cpp -${CMAKE_CURRENT_LIST_DIR}/VdeFileExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/VdePacketDirectory.cpp -${CMAKE_CURRENT_LIST_DIR}/VdeVizDataExtractor.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToFolderUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensExportToSharingServerFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensTerminateSessionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensServerSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateSessionUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSession.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensSessionManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensCreateDummyFileBackedSessionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensAutoExportToSharingServerFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdeArrayDataPacket.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdeCachingHashedIdFactory.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdeExportPart.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdeFileExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdePacketDirectory.cpp + ${CMAKE_CURRENT_LIST_DIR}/VdeVizDataExtractor.cpp ) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +set(COMMAND_QT_MOC_HEADERS + ${COMMAND_QT_MOC_HEADERS} ${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.h ) -set (COMMAND_QT_MOC_HEADERS -${COMMAND_QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RicHoloLensRestClient.h -${CMAKE_CURRENT_LIST_DIR}/RicExportToSharingServerScheduler.h +source_group( + "CommandFeature\\HoloLens" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - - - -source_group( "CommandFeature\\HoloLens" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/Commands/HoloLensCommands/RicHoloLensSession.cpp b/ApplicationLibCode/Commands/HoloLensCommands/RicHoloLensSession.cpp index 33e387a2ce..c48e816abb 100644 --- a/ApplicationLibCode/Commands/HoloLensCommands/RicHoloLensSession.cpp +++ b/ApplicationLibCode/Commands/HoloLensCommands/RicHoloLensSession.cpp @@ -21,6 +21,7 @@ #include "RiaLogging.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "VdeArrayDataPacket.h" #include "VdeFileExporter.h" @@ -80,7 +81,7 @@ RicHoloLensSession* RicHoloLensSession::createSession( const QString& newSession->m_sessionObserver = sessionObserver; - const QString dbgExportFolder = RiaPreferences::current()->holoLensExportFolder(); + const QString dbgExportFolder = RiaPreferencesSystem::current()->holoLensExportFolder(); if ( !dbgExportFolder.isEmpty() ) { newSession->m_dbgFileExportDestinationFolder = dbgExportFolder; @@ -99,7 +100,7 @@ RicHoloLensSession* RicHoloLensSession::createDummyFileBackedSession() newSession->m_isSessionValid = true; - newSession->m_dbgFileExportDestinationFolder = RiaPreferences::current()->holoLensExportFolder(); + newSession->m_dbgFileExportDestinationFolder = RiaPreferencesSystem::current()->holoLensExportFolder(); return newSession; } diff --git a/ApplicationLibCode/Commands/IntersectionBoxCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/IntersectionBoxCommands/CMakeLists_files.cmake index 56b6383bd2..2439f5fa1f 100644 --- a/ApplicationLibCode/Commands/IntersectionBoxCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/IntersectionBoxCommands/CMakeLists_files.cmake @@ -1,36 +1,34 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionBoxFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxXSliceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxYSliceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxZSliceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxAtPosFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionBoxFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxXSliceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxYSliceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxZSliceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxAtPosFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionBoxFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxXSliceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxYSliceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxZSliceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxAtPosFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAppendIntersectionBoxFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxXSliceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxYSliceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxZSliceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionBoxAtPosFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -set (COMMAND_QT_MOC_HEADERS -${COMMAND_QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.h +set(COMMAND_QT_MOC_HEADERS + ${COMMAND_QT_MOC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/RicBoxManipulatorEventHandler.h ) - -source_group( "CommandFeature\\IntersectionBox" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\IntersectionBox" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/IntersectionViewCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/IntersectionViewCommands/CMakeLists_files.cmake index 389be0fefe..1622024aa3 100644 --- a/ApplicationLibCode/Commands/IntersectionViewCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/IntersectionViewCommands/CMakeLists_files.cmake @@ -1,18 +1,17 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewIntersectionViewFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewIntersectionViewFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewIntersectionViewFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewIntersectionViewFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\IntersectionView" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\IntersectionView" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/IntersectionViewCommands/RicNewIntersectionViewFeature.cpp b/ApplicationLibCode/Commands/IntersectionViewCommands/RicNewIntersectionViewFeature.cpp index ef7b1d844b..cb211c5cbf 100644 --- a/ApplicationLibCode/Commands/IntersectionViewCommands/RicNewIntersectionViewFeature.cpp +++ b/ApplicationLibCode/Commands/IntersectionViewCommands/RicNewIntersectionViewFeature.cpp @@ -62,7 +62,7 @@ void RicNewIntersectionViewFeature::onActionTriggered( bool isChecked ) intersection->firstAncestorOrThisOfType( rimCase ); if ( rimCase ) { - if ( intersection->direction() != RimExtrudedCurveIntersection::CS_VERTICAL ) + if ( intersection->direction() != RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_VERTICAL ) { QString text = QString( "The intersection view only supports vertical intersections.\n" "The intersection '%1' is not vertical but a converted version will be shown " diff --git a/ApplicationLibCode/Commands/MeasurementCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/MeasurementCommands/CMakeLists_files.cmake index 3d69470b24..a375b3b2f9 100644 --- a/ApplicationLibCode/Commands/MeasurementCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/MeasurementCommands/CMakeLists_files.cmake @@ -1,23 +1,21 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicToggleMeasurementModeFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicMeasurementPickEventHandler.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicToggleMeasurementModeFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicMeasurementPickEventHandler.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicToggleMeasurementModeFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMeasurementPickEventHandler.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicToggleMeasurementModeFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMeasurementPickEventHandler.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_QT_MOC_HEADERS -) +list(APPEND COMMAND_QT_MOC_HEADERS) -source_group( "CommandFeature\\Measurement" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Measurement" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/OctaveScriptCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/OctaveScriptCommands/CMakeLists_files.cmake index 510d51190c..dcd6da42fe 100644 --- a/ApplicationLibCode/Commands/OctaveScriptCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/OctaveScriptCommands/CMakeLists_files.cmake @@ -1,41 +1,40 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddScriptPathFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteScriptPathFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEditScriptFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExecuteLastUsedScriptFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewOctaveScriptFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPythonScriptFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicScriptFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicRefreshScriptsFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddScriptPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteScriptPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEditScriptFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteLastUsedScriptFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewOctaveScriptFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPythonScriptFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicScriptFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicRefreshScriptsFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddScriptPathFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteScriptPathFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEditScriptFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExecuteLastUsedScriptFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewOctaveScriptFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPythonScriptFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicScriptFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRefreshScriptsFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddScriptPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteScriptPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEditScriptFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteLastUsedScriptFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewOctaveScriptFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPythonScriptFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicScriptFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRefreshScriptsFeature.cpp ) -set (COMMAND_QT_MOC_HEADERS -${COMMAND_QT_MOC_HEADERS} -${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.h +set(COMMAND_QT_MOC_HEADERS + ${COMMAND_QT_MOC_HEADERS} + ${CMAKE_CURRENT_LIST_DIR}/RicExecuteScriptForCasesFeature.h ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\Script" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\Script" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/OperationsUsingObjReferences/CMakeLists_files.cmake b/ApplicationLibCode/Commands/OperationsUsingObjReferences/CMakeLists_files.cmake index 35106e62b9..2aef75e722 100644 --- a/ApplicationLibCode/Commands/OperationsUsingObjReferences/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/OperationsUsingObjReferences/CMakeLists_files.cmake @@ -1,32 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCopyReferencesToClipboardFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCutReferencesToClipboardFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteFeatureImpl.h - -${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseCasesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseViewsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteGeoMechViewsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteIntersectionsFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCopyReferencesToClipboardFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCutReferencesToClipboardFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseCasesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseViewsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteGeoMechViewsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteIntersectionsFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicCopyReferencesToClipboardFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCutReferencesToClipboardFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteFeatureImpl.cpp - -${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseCasesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseViewsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteGeoMechViewsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteIntersectionsFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicCopyReferencesToClipboardFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCutReferencesToClipboardFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseCasesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEclipseViewsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteGeoMechViewsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteIntersectionsFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\ObjReferences" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\ObjReferences" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicCopyReferencesToClipboardFeature.cpp b/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicCopyReferencesToClipboardFeature.cpp index 064862a03a..5354c46ef8 100644 --- a/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicCopyReferencesToClipboardFeature.cpp +++ b/ApplicationLibCode/Commands/OperationsUsingObjReferences/RicCopyReferencesToClipboardFeature.cpp @@ -29,6 +29,7 @@ #include "RimGridCrossPlotCurve.h" #include "RimGridCrossPlotDataSet.h" #include "RimMimeData.h" +#include "RimModeledWellPath.h" #include "RimSummaryCurveFilter.h" #include "RimSummaryPlot.h" #include "RimWellAllocationPlot.h" @@ -177,6 +178,10 @@ bool RicCopyReferencesToClipboardFeature::isCopyOfObjectSupported( caf::PdmObjec { return true; } + else if ( dynamic_cast( pdmObject ) ) + { + return true; + } return false; } diff --git a/ApplicationLibCode/Commands/PlotTemplateCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/PlotTemplateCommands/CMakeLists_files.cmake index c0d8a635a9..82de557305 100644 --- a/ApplicationLibCode/Commands/PlotTemplateCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/PlotTemplateCommands/CMakeLists_files.cmake @@ -1,34 +1,31 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicSavePlotTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromSelectionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSelectPlotTemplateUi.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotTemplateTools.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadPlotTemplatesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateByShortcutFeature.h -) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicSavePlotTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromSelectionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSelectPlotTemplateUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotTemplateTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadPlotTemplatesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateByShortcutFeature.cpp +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicSavePlotTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromSelectionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSelectPlotTemplateUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotTemplateTools.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadPlotTemplatesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateByShortcutFeature.h ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicSavePlotTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromSelectionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSelectPlotTemplateUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotTemplateTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadPlotTemplatesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreatePlotFromTemplateByShortcutFeature.cpp ) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_QT_MOC_HEADERS -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\PlotTemplate" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +list(APPEND COMMAND_QT_MOC_HEADERS) +source_group( + "CommandFeature\\PlotTemplate" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.cpp b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.cpp new file mode 100644 index 0000000000..9b1c31c497 --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.cpp @@ -0,0 +1,149 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateEnsembleSurfaceFeature.h" + +#include "RiaApplication.h" +#include "RiaLogging.h" + +#include "CommandRouter/RimcExtractSurfaces.h" +#include "RicCreateEnsembleSurfaceUi.h" +#include "RicImportEnsembleSurfaceFeature.h" +#include "RicRecursiveFileSearchDialog.h" +#include "RimDialogData.h" +#include "RimProject.h" + +#include "Riu3DMainWindowTools.h" +#include "RiuPropertyViewTabWidget.h" + +#include "cafCmdFeatureManager.h" +#include "cafPdmSettings.h" +#include "cafPdmUiPropertyViewDialog.h" +#include "cafProgressInfo.h" +#include "cafSelectionManager.h" + +#include +#include +#include + +CAF_CMD_SOURCE_INIT( RicCreateEnsembleSurfaceFeature, "RicCreateEnsembleSurfaceFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceFeature::openDialogAndExecuteCommand() +{ + // Get the list of egrid files + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory( "BINARY_GRID" ); + + QString pathFilter( "*" ); + QString fileNameFilter( "*" ); + + RicRecursiveFileSearchDialogResult result = + RicRecursiveFileSearchDialog::runRecursiveSearchDialog( nullptr, + "Choose Eclipse Cases", + defaultDir, + pathFilter, + fileNameFilter, + QStringList( ".EGRID" ) ); + + if ( !result.ok || result.files.isEmpty() ) + { + return; + } + + // Read min/max k layer from first grid case + int minLayerK = -1; + int maxLayerK = -1; + if ( !RimcCommandRouter_extractSurfaces::readMinMaxLayerFromGridFile( result.files[0], minLayerK, maxLayerK ) ) + return; + + RicCreateEnsembleSurfaceUi* ui = RimProject::current()->dialogData()->createEnsembleSurfaceUi(); + ui->setLayersMinMax( minLayerK, maxLayerK ); + + RiuPropertyViewTabWidget propertyDialog( Riu3DMainWindowTools::mainWindowWidget(), + ui, + "Create Ensemble Surface", + ui->tabNames() ); + + if ( propertyDialog.exec() == QDialog::Accepted ) + { + executeCommand( *ui, result.files.toVector().toStdVector() ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceFeature::executeCommand( const RicCreateEnsembleSurfaceUi& ui, + const std::vector& fileNames ) +{ + std::vector layers = ui.layers(); + + caf::ProgressInfo progress( fileNames.size(), "Generating ensemble surface" ); + + QStringList allSurfaceFileNames; + + auto fileCount = static_cast( fileNames.size() ); +#pragma omp parallel for + for ( int i = 0; i < fileCount; i++ ) + { + auto fileName = fileNames[i]; + + // Not possible to use structured bindings here due to a bug in clang + auto surfaceResult = RimcCommandRouter_extractSurfaces::extractSurfaces( fileName, layers ); + auto isOk = surfaceResult.first; + auto surfaceFileNames = surfaceResult.second; + +#pragma omp critical( RicCreateEnsembleSurfaceFeature ) + { + auto task = progress.task( QString( "Extracting surfaces for %1" ).arg( fileName ) ); + if ( isOk ) allSurfaceFileNames << surfaceFileNames; + } + } + progress.setProgress( fileNames.size() ); + + if ( ui.autoCreateEnsembleSurfaces() ) + RicImportEnsembleSurfaceFeature::importEnsembleSurfaceFromFiles( allSurfaceFileNames, + RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateEnsembleSurfaceFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceFeature::onActionTriggered( bool isChecked ) +{ + openDialogAndExecuteCommand(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create Ensemble Surface..." ); +} diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.h b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.h new file mode 100644 index 0000000000..d95ee48397 --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceFeature.h @@ -0,0 +1,42 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include + +class RicCreateEnsembleSurfaceUi; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateEnsembleSurfaceFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +public: + static void openDialogAndExecuteCommand(); + static void executeCommand( const RicCreateEnsembleSurfaceUi& ui, const std::vector& fileNames ); + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.cpp b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.cpp new file mode 100644 index 0000000000..198229fbad --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.cpp @@ -0,0 +1,138 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateEnsembleSurfaceUi.h" + +#include "RiaApplication.h" + +#include "cafPdmObject.h" +#include "cafPdmUiCheckBoxEditor.h" +#include "cafPdmUiListEditor.h" +#include "cafPdmUiOrdering.h" + +CAF_PDM_SOURCE_INIT( RicCreateEnsembleSurfaceUi, "RicCreateEnsembleSurfaceUi" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleSurfaceUi::RicCreateEnsembleSurfaceUi() +{ + CAF_PDM_InitObject( "Export Multiple Surfaces", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_layers, "Layers", "Layers", "", "", "" ); + CAF_PDM_InitField( &m_autoCreateEnsembleSurfaces, + "AutoCreateEnsembleSurfaces", + false, + "Create Ensemble Surfaces From Exported Files", + "", + "", + "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_autoCreateEnsembleSurfaces ); + + CAF_PDM_InitFieldNoDefault( &m_minLayer, "MinLayer", "MinLayer", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_maxLayer, "MaxLayer", "MaxLayer", "", "", "" ); + + m_tabNames << "Configuration"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleSurfaceUi::~RicCreateEnsembleSurfaceUi() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QStringList& RicCreateEnsembleSurfaceUi::tabNames() const +{ + return m_tabNames; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceUi::setLayersMinMax( int minLayer, int maxLayer ) +{ + m_minLayer = minLayer; + m_maxLayer = maxLayer; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceUi::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_layers ) + { + caf::PdmUiListEditorAttribute* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_heightHint = 280; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleSurfaceUi::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + if ( uiConfigName == m_tabNames[0] ) + { + uiOrdering.add( &m_layers ); + uiOrdering.add( &m_autoCreateEnsembleSurfaces ); + } + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RicCreateEnsembleSurfaceUi::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + if ( fieldNeedingOptions == &m_layers ) + { + for ( int layer = m_minLayer; layer < m_maxLayer; layer++ ) + { + options.push_back( caf::PdmOptionItemInfo( QString::number( layer ), layer ) ); + } + } + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicCreateEnsembleSurfaceUi::layers() const +{ + return m_layers(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateEnsembleSurfaceUi::autoCreateEnsembleSurfaces() const +{ + return m_autoCreateEnsembleSurfaces; +} diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.h b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.h new file mode 100644 index 0000000000..95bc6dd1ee --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleSurfaceUi.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObject.h" + +#include +#include + +class RigEclipseCaseData; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateEnsembleSurfaceUi : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RicCreateEnsembleSurfaceUi(); + ~RicCreateEnsembleSurfaceUi() override; + const QStringList& tabNames() const; + + void setLayersMinMax( int minLayer, int maxLayer ); + + std::vector layers() const; + + bool autoCreateEnsembleSurfaces() const; + +protected: + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + caf::PdmField> m_layers; + caf::PdmField m_autoCreateEnsembleSurfaces; + caf::PdmField m_minLayer; + caf::PdmField m_maxLayer; + + QStringList m_tabNames; +}; diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.cpp b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.cpp new file mode 100644 index 0000000000..d9ab651e14 --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.cpp @@ -0,0 +1,331 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateEnsembleWellLogFeature.h" + +#include "RiaApplication.h" +#include "RiaColorTables.h" +#include "RiaImportEclipseCaseTools.h" +#include "RiaLogging.h" + +#include "ExportCommands/RicExportToLasFileFeature.h" +#include "RicCloseCaseFeature.h" +#include "RicCreateEnsembleWellLogUi.h" +#include "RicImportEnsembleWellLogsFeature.h" +#include "RicImportGeneralDataFeature.h" +#include "RicRecursiveFileSearchDialog.h" +#include "RifReaderSettings.h" +#include "WellPathCommands/RicImportWellPaths.h" + +#include "RimDialogData.h" +#include "RimEclipseCase.h" +#include "RimEnsembleWellLogCurveSet.h" +#include "RimMainPlotCollection.h" +#include "RimProject.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" +#include "RimcWellLogPlot.h" +#include "RimcWellLogPlotCollection.h" +#include "RimcWellLogTrack.h" + +#include "Riu3DMainWindowTools.h" +#include "RiuPlotMainWindowTools.h" +#include "RiuPropertyViewTabWidget.h" + +#include "cafCmdFeatureManager.h" +#include "cafPdmSettings.h" +#include "cafPdmUiPropertyViewDialog.h" +#include "cafProgressInfo.h" +#include "cafSelectionManager.h" + +#include +#include +#include + +CAF_CMD_SOURCE_INIT( RicCreateEnsembleWellLogFeature, "RicCreateEnsembleWellLogFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogFeature::openDialogAndExecuteCommand() +{ + // Get the list of egrid files + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory( "BINARY_GRID" ); + + QString pathFilter( "*" ); + QString fileNameFilter( "*" ); + + RicRecursiveFileSearchDialogResult result = + RicRecursiveFileSearchDialog::runRecursiveSearchDialog( nullptr, + "Choose Eclipse Cases", + defaultDir, + pathFilter, + fileNameFilter, + { ".GRDECL", ".EGRID" } ); + + if ( !result.ok || result.files.isEmpty() ) + { + return; + } + + // Use case data from first case + RimEclipseCase* eclipseCase = loadEclipseCase( result.files[0] ); + if ( !eclipseCase ) return; + + RicCreateEnsembleWellLogUi* ui = RimProject::current()->dialogData()->createEnsembleWellLogUi(); + ui->setCaseData( eclipseCase->eclipseCaseData() ); + + // Automatically selected the well path the dialog was triggered on (if any) + auto* wellPath = caf::SelectionManager::instance()->selectedItemOfType(); + if ( wellPath ) + { + ui->setWellPathSource( RicCreateEnsembleWellLogUi::WellPathSource::PROJECT_WELLS ); + ui->setWellPathFromProject( wellPath ); + } + + RiuPropertyViewTabWidget propertyDialog( Riu3DMainWindowTools::mainWindowWidget(), + ui, + "Create Ensemble Well Log", + ui->tabNames() ); + + if ( propertyDialog.exec() == QDialog::Accepted && !ui->properties().empty() ) + { + executeCommand( *ui, result.files.toStdList() ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogFeature::executeCommand( const RicCreateEnsembleWellLogUi& ui, + const std::list& fileNames ) +{ + caf::ProgressInfo progress( fileNames.size(), "Creating ensemble well log" ); + + std::vector> properties = ui.properties(); + + RimWellLogPlotCollection* plotCollection = RimProject::current()->mainPlotCollection()->wellLogPlotCollection(); + + RimWellPath* wellPath = nullptr; + + if ( ui.wellPathSource() == RicCreateEnsembleWellLogUi::WellPathSource::FILE ) + { + if ( ui.wellPathFilePath().isEmpty() ) return; + + // Load well path from file + QStringList wellPathFilePaths; + wellPathFilePaths << ui.wellPathFilePath(); + bool importGrouped = false; + QStringList errorMessages; + std::vector wellPaths = + RicImportWellPaths::importWellPaths( wellPathFilePaths, importGrouped, &errorMessages ); + if ( wellPaths.empty() ) return; + + wellPath = wellPaths[0]; + } + else + { + CAF_ASSERT( ui.wellPathSource() == RicCreateEnsembleWellLogUi::WellPathSource::PROJECT_WELLS ); + wellPath = ui.wellPathFromProject(); + } + + if ( !wellPath ) return; + + std::vector tmpPlotsToDelete; + QStringList allLasFileNames; + for ( const auto& fileName : fileNames ) + { + auto task = progress.task( QString( "Extracting well log for %1" ).arg( fileName ) ); + + // Load eclipse case + RimEclipseCase* eclipseCase = loadEclipseCase( fileName ); + if ( !eclipseCase ) + { + RiaLogging::error( QString( "Failed to load model from file: " ).arg( fileName ) ); + return; + } + + // Create the well log plot + RimWellLogPlot* wellLogPlot = + RimcWellLogPlotCollection_newWellLogPlot::createWellLogPlot( plotCollection, wellPath, eclipseCase ); + + // Create well log track + QString title = "Track"; + RimWellLogTrack* wellLogTrack = + RimcWellLogPlot_newWellLogTrack::createWellLogTrack( wellLogPlot, eclipseCase, wellPath, title ); + + // Create a well log curve for each property + for ( const auto& property : properties ) + { + QString propertyName = property.first; + RiaDefines::ResultCatType resultCategoryType = property.second; + int timeStep = ui.timeStep(); + RimcWellLogTrack_addExtractionCurve::addExtractionCurve( wellLogTrack, + eclipseCase, + wellPath, + propertyName, + resultCategoryType, + timeStep ); + } + + { + // Create missing directories + QString wellLogExportDirName = "lasexport"; + QFileInfo fi( fileName ); + QString exportFolder = fi.absoluteDir().absolutePath() + QString( "/%1/" ).arg( wellLogExportDirName ); + + if ( !fi.absoluteDir().exists( wellLogExportDirName ) ) + { + if ( !fi.absoluteDir().mkpath( wellLogExportDirName ) ) + { + RiaLogging::error( QString( "Unable to create directory for well log export: " ).arg( exportFolder ) ); + return; + } + } + + // Export to las file + QString filePrefix = ""; + bool exportTvdRkb = false; + bool capitalizeFileNames = false; + bool alwaysOverwrite = true; + double resampleInterval = 0.0; + bool convertCurveUnits = false; + + std::vector lasFiles = RicExportToLasFileFeature::exportToLasFiles( exportFolder, + filePrefix, + wellLogPlot, + exportTvdRkb, + capitalizeFileNames, + alwaysOverwrite, + resampleInterval, + convertCurveUnits ); + for ( const auto& lasFile : lasFiles ) + allLasFileNames << lasFile; + } + + tmpPlotsToDelete.push_back( wellLogPlot ); + + RicCloseCaseFeature::deleteEclipseCase( eclipseCase ); + } + + for ( auto wlp : tmpPlotsToDelete ) + { + // Hide window to avoid flickering + wlp->setShowWindow( false ); + wlp->updateMdiWindowVisibility(); + + plotCollection->removePlot( wlp ); + delete wlp; + } + + if ( ui.autoCreateEnsembleWellLogs() ) + { + std::vector ensembleWellLogs = + RicImportEnsembleWellLogsFeature::createEnsembleWellLogsFromFiles( allLasFileNames, + RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE ); + + for ( auto ensembleWellLog : ensembleWellLogs ) + { + if ( ensembleWellLog ) + { + RimEclipseCase* eclipseCase = nullptr; + + // Create the well log plot + RimWellLogPlot* wellLogPlot = + RimcWellLogPlotCollection_newWellLogPlot::createWellLogPlot( plotCollection, wellPath, eclipseCase ); + + // Create a track per property + int trackNum = 0; + for ( const auto& property : properties ) + { + // Create well log track + cvf::Color3f color = RiaColorTables::normalPaletteColors().cycledColor3f( trackNum ); + QString title = QString( "Track %1" ).arg( trackNum ); + RimWellLogTrack* wellLogTrack = + RimcWellLogPlot_newWellLogTrack::createWellLogTrack( wellLogPlot, eclipseCase, wellPath, title ); + auto* ensembleWellLogCurveSet = new RimEnsembleWellLogCurveSet(); + ensembleWellLogCurveSet->setEnsembleWellLogs( ensembleWellLog ); + ensembleWellLogCurveSet->setColor( color ); + ensembleWellLogCurveSet->setWellLogChannelName( property.first ); + wellLogTrack->setEnsembleWellLogCurveSet( ensembleWellLogCurveSet ); + ensembleWellLogCurveSet->loadDataAndUpdate( true ); + trackNum++; + } + + wellLogPlot->updateConnectedEditors(); + + RiuPlotMainWindowTools::showPlotMainWindow(); + RiuPlotMainWindowTools::selectAsCurrentItem( wellLogPlot ); + } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEclipseCase* RicCreateEnsembleWellLogFeature::loadEclipseCase( const QString& fileName ) +{ + QString absolutePath = fileName; + QFileInfo projectPathInfo( absolutePath ); + if ( !projectPathInfo.exists() ) + { + QDir startDir( RiaApplication::instance()->startDir() ); + absolutePath = startDir.absoluteFilePath( fileName ); + } + bool createView = false; + bool createPlot = false; + + std::shared_ptr readerSettings = RifReaderSettings::createGridOnlyReaderSettings(); + auto openResult = RicImportGeneralDataFeature::openEclipseFilesFromFileNames( QStringList( { absolutePath } ), + createPlot, + createView, + readerSettings ); + + if ( !openResult.createdCaseIds.empty() ) + { + return RimProject::current()->eclipseCaseFromCaseId( openResult.createdCaseIds.front() ); + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateEnsembleWellLogFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogFeature::onActionTriggered( bool isChecked ) +{ + openDialogAndExecuteCommand(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create Ensemble Well Log..." ); +} diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.h b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.h new file mode 100644 index 0000000000..125e135765 --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogFeature.h @@ -0,0 +1,44 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include + +class RicCreateEnsembleWellLogUi; +class RimEclipseCase; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateEnsembleWellLogFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +public: + static void openDialogAndExecuteCommand(); + static void executeCommand( const RicCreateEnsembleWellLogUi& ui, const std::list& fileNames ); + static RimEclipseCase* loadEclipseCase( const QString& fileName ); + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.cpp b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.cpp new file mode 100644 index 0000000000..7a7cc052aa --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.cpp @@ -0,0 +1,306 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateEnsembleWellLogUi.h" + +#include "RiaApplication.h" + +#include "RiaDefines.h" +#include "RigEclipseCaseData.h" + +#include "RigEclipseResultAddress.h" +#include "RimEclipseCase.h" +#include "RimEclipseResultDefinition.h" +#include "RimTools.h" +#include "RimWellPath.h" + +#include "cafAppEnum.h" +#include "cafPdmObject.h" +#include "cafPdmUiCheckBoxEditor.h" +#include "cafPdmUiFilePathEditor.h" +#include "cafPdmUiListEditor.h" +#include "cafPdmUiOrdering.h" +#include "cafPdmUiTreeSelectionEditor.h" + +CAF_PDM_SOURCE_INIT( RicCreateEnsembleWellLogUi, "RicCreateEnsembleWellLogUi" ); + +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RicCreateEnsembleWellLogUi::WellPathSource::FILE, "FILE", "From file" ); + addItem( RicCreateEnsembleWellLogUi::WellPathSource::PROJECT_WELLS, "PROJECT_WELLS", "From Project Wells" ); + setDefault( RicCreateEnsembleWellLogUi::WellPathSource::FILE ); +} +}; // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleWellLogUi::RicCreateEnsembleWellLogUi() +{ + CAF_PDM_InitObject( "Create Ensemble Well Log", "", "", "" ); + + CAF_PDM_InitField( &m_autoCreateEnsembleWellLogs, + "AutoCreateEnsembleWellLogs", + true, + "Create Ensemble Well Logs From Exported Files", + "", + "", + "" ); + caf::PdmUiNativeCheckBoxEditor::configureFieldForEditor( &m_autoCreateEnsembleWellLogs ); + + CAF_PDM_InitField( &m_timeStep, "TimeStep", 0, "Time Step", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_wellPathSource, "WellPathSource", "Well Path Source", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_wellPath, "WellPath", "Well Path", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_wellFilePath, "WellFilePath", "Well File Path", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_selectedKeywords, "SelectedProperties", "Selected Properties", "", "", "" ); + m_selectedKeywords.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + + m_tabNames << "Well" + << "Properties"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleWellLogUi::~RicCreateEnsembleWellLogUi() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const QStringList& RicCreateEnsembleWellLogUi::tabNames() const +{ + return m_tabNames; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogUi::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + if ( uiConfigName == m_tabNames[0] ) + { + uiOrdering.add( &m_wellPathSource ); + + bool fileSource = ( m_wellPathSource == RicCreateEnsembleWellLogUi::WellPathSource::FILE ); + uiOrdering.add( &m_wellFilePath ); + uiOrdering.add( &m_wellPath ); + m_wellFilePath.uiCapability()->setUiHidden( !fileSource ); + m_wellPath.uiCapability()->setUiHidden( fileSource ); + uiOrdering.add( &m_autoCreateEnsembleWellLogs ); + } + else if ( uiConfigName == m_tabNames[1] ) + { + uiOrdering.add( &m_selectedKeywords ); + uiOrdering.add( &m_timeStep ); + } + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RicCreateEnsembleWellLogUi::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_selectedKeywords ) + { + RigCaseCellResultsData* resultData = m_caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); + + std::vector resultCategories = validResultCategories(); + for ( auto catType : resultCategories ) + { + QList allOptions = + RimEclipseResultDefinition::calcOptionsForVariableUiFieldStandard( catType, resultData ); + + bool isFirstOfCategory = true; + for ( caf::PdmOptionItemInfo option : allOptions ) + { + if ( resultData->hasResultEntry( RigEclipseResultAddress( catType, option.optionUiText() ) ) ) + { + if ( isFirstOfCategory ) + { + // Add the category title only when there is at least one valid result + options.push_back( + caf::PdmOptionItemInfo::createHeader( caf::AppEnum::uiText( catType ), + true ) ); + isFirstOfCategory = false; + } + + options.push_back( option ); + } + } + } + } + else if ( fieldNeedingOptions == &m_timeStep ) + { + RimTools::timeStepsForCase( m_caseData->ownerCase(), &options ); + } + else if ( fieldNeedingOptions == &m_wellPath ) + { + RimTools::wellPathOptionItems( &options ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogUi::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_wellFilePath ) + { + auto* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_fileSelectionFilter = "Well Path Files(*.dev);;All Files (*.*)"; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateEnsembleWellLogUi::autoCreateEnsembleWellLogs() const +{ + return m_autoCreateEnsembleWellLogs; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RicCreateEnsembleWellLogUi::properties() const +{ + std::vector selectedKeyWords = m_selectedKeywords(); + + auto findResultCategory = []( const QString& keyword, + const std::vector& categories, + RigEclipseCaseData* caseData ) { + // Find the result category for a given keyword + RigCaseCellResultsData* resultData = caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); + for ( auto category : categories ) + if ( resultData->hasResultEntry( RigEclipseResultAddress( category, keyword ) ) ) return category; + + return RiaDefines::ResultCatType::UNDEFINED; + }; + + std::vector resultCategories = validResultCategories(); + + std::vector> props; + for ( auto keyword : selectedKeyWords ) + { + auto resultCategory = findResultCategory( keyword, resultCategories, m_caseData ); + props.push_back( std::make_pair( keyword, resultCategory ) ); + } + + return props; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicCreateEnsembleWellLogUi::validResultCategories() const +{ + return { RiaDefines::ResultCatType::STATIC_NATIVE, + RiaDefines::ResultCatType::DYNAMIC_NATIVE, + RiaDefines::ResultCatType::INPUT_PROPERTY }; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RicCreateEnsembleWellLogUi::timeStep() const +{ + return m_timeStep; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RicCreateEnsembleWellLogUi::wellPathFilePath() const +{ + return m_wellFilePath().path(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleWellLogUi::WellPathSource RicCreateEnsembleWellLogUi::wellPathSource() const +{ + return m_wellPathSource(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogUi::setWellPathSource( RicCreateEnsembleWellLogUi::WellPathSource wellPathSource ) +{ + m_wellPathSource = wellPathSource; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellPath* RicCreateEnsembleWellLogUi::wellPathFromProject() const +{ + return m_wellPath; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogUi::setWellPathFromProject( RimWellPath* wellPath ) +{ + m_wellPath = wellPath; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateEnsembleWellLogUi::setCaseData( RigEclipseCaseData* caseData ) +{ + m_caseData = caseData; + + if ( m_selectedKeywords().empty() ) + { + RigCaseCellResultsData* resultData = caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL ); + std::vector defaultKeywords = { "INDEX_K", "PORO", "PERMX", "PRESSURE" }; + std::vector categories = validResultCategories(); + + for ( auto keyword : defaultKeywords ) + { + for ( auto category : categories ) + { + if ( resultData->hasResultEntry( RigEclipseResultAddress( category, keyword ) ) ) + { + m_selectedKeywords.v().push_back( keyword ); + break; + } + } + } + } +} diff --git a/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.h b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.h new file mode 100644 index 0000000000..3fa77a06ec --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateEnsembleWellLogUi.h @@ -0,0 +1,88 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include "cafPdmField.h" +#include "cafPdmObject.h" +#include "cafPdmPtrField.h" + +#include +#include + +class RigEclipseCaseData; +class RimWellPath; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateEnsembleWellLogUi : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + enum class WellPathSource + { + FILE, + PROJECT_WELLS + }; + + RicCreateEnsembleWellLogUi(); + ~RicCreateEnsembleWellLogUi() override; + const QStringList& tabNames() const; + + bool autoCreateEnsembleWellLogs() const; + + int timeStep() const; + QString wellPathFilePath() const; + + WellPathSource wellPathSource() const; + void setWellPathSource( WellPathSource wellPathSource ); + + void setWellPathFromProject( RimWellPath* wellPath ); + RimWellPath* wellPathFromProject() const; + + std::vector> properties() const; + + void setCaseData( RigEclipseCaseData* caseData ); + +protected: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + + std::vector validResultCategories() const; + +private: + caf::PdmField m_wellFilePath; + caf::PdmField> m_wellPathSource; + caf::PdmPtrField m_wellPath; + caf::PdmField m_autoCreateEnsembleWellLogs; + + caf::PdmField> m_selectedKeywords; + caf::PdmField m_timeStep; + + QStringList m_tabNames; + RigEclipseCaseData* m_caseData; +}; diff --git a/ApplicationLibCode/Commands/RicCreateGridStatisticsPlotFeature.cpp b/ApplicationLibCode/Commands/RicCreateGridStatisticsPlotFeature.cpp index a1d0246488..4585c53686 100644 --- a/ApplicationLibCode/Commands/RicCreateGridStatisticsPlotFeature.cpp +++ b/ApplicationLibCode/Commands/RicCreateGridStatisticsPlotFeature.cpp @@ -20,6 +20,8 @@ #include "RiaGuiApplication.h" +#include "RimEclipseResultDefinition.h" +#include "RimEclipseView.h" #include "RimGridStatisticsPlot.h" #include "RimGridStatisticsPlotCollection.h" #include "RimMainPlotCollection.h" @@ -50,6 +52,10 @@ void RicCreateGridStatisticsPlotFeature::onActionTriggered( bool isChecked ) RimGridStatisticsPlotCollection* collection = project->mainPlotCollection()->gridStatisticsPlotCollection(); RimGridStatisticsPlot* plot = new RimGridStatisticsPlot(); + + RimEclipseView* activeView = dynamic_cast( RiaApplication::instance()->activeGridView() ); + if ( activeView ) plot->setPropertiesFromView( activeView ); + plot->zoomAll(); plot->updateConnectedEditors(); plot->setAsPlotMdiWindow(); diff --git a/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.cpp b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.cpp new file mode 100644 index 0000000000..62c207979d --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.cpp @@ -0,0 +1,142 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateSurfaceIntersectionBandFeature.h" + +#include "RiaColorTables.h" + +#include "RimAnnotationLineAppearance.h" +#include "RimEnsembleSurface.h" +#include "RimExtrudedCurveIntersection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSurface.h" +#include "RimSurfaceCollection.h" +#include "RimSurfaceIntersectionBand.h" + +#include "Riu3DMainWindowTools.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT( RicCreateSurfaceIntersectionBandFeature, "RicCreateSurfaceIntersectionBandFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceCollection* RicCreateSurfaceIntersectionBandFeature::surfaceCollection() +{ + RimProject* proj = RimProject::current(); + return proj->activeOilField()->surfaceCollection(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateSurfaceIntersectionBandFeature::isCommandEnabled() +{ + auto* surfColl = RicCreateSurfaceIntersectionBandFeature::surfaceCollection(); + auto surfaces = surfColl->ensembleSurfaces(); + + return !surfaces.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateSurfaceIntersectionBandFeature::onActionTriggered( bool isChecked ) +{ + auto* intersection = caf::SelectionManager::instance()->selectedItemAncestorOfType(); + if ( intersection ) + { + RimEnsembleSurface* firstEnsembleSurface = nullptr; + { + auto surfColl = RicCreateSurfaceIntersectionBandFeature::surfaceCollection(); + auto surfaces = surfColl->ensembleSurfaces(); + if ( !surfaces.empty() ) firstEnsembleSurface = surfaces.front(); + } + + RimSurfaceIntersectionBand* objectToSelect = nullptr; + + if ( firstEnsembleSurface ) + { + const double defaultOpacity = 0.6; + + auto colors = RiaColorTables::structuralUncertaintyColors(); + + // Create min/max band + { + auto surf1 = + firstEnsembleSurface->findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType::MIN ); + auto surf2 = + firstEnsembleSurface->findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType::MAX ); + + if ( surf2 && surf1 ) + { + auto band = intersection->addIntersectionBand(); + band->setSurfaces( surf1, surf2 ); + + auto color = colors.cycledColor3f( 0 ); + band->setBandColor( color ); + band->setBandOpacity( defaultOpacity ); + band->setPolygonOffsetUnit( 0.08 ); + + band->lineAppearance()->setColor( color ); + + objectToSelect = band; + } + } + + // Create p10/p90 band + { + auto surf1 = + firstEnsembleSurface->findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType::P10 ); + auto surf2 = + firstEnsembleSurface->findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType::P90 ); + + if ( surf2 && surf1 ) + { + auto band = intersection->addIntersectionBand(); + band->setSurfaces( surf1, surf2 ); + + auto color = colors.cycledColor3f( 1 ); + band->setBandColor( color ); + band->setBandOpacity( defaultOpacity ); + band->setPolygonOffsetUnit( 0.1 ); + + band->lineAppearance()->setColor( color ); + } + } + } + + intersection->rebuildGeometryAndScheduleCreateDisplayModel(); + intersection->updateAllRequiredEditors(); + + Riu3DMainWindowTools::selectAsCurrentItem( objectToSelect ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateSurfaceIntersectionBandFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create Surface Intersection Band" ); + actionToSetup->setIcon( QIcon( ":/ReservoirSurface16x16.png" ) ); +} diff --git a/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.h b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.h new file mode 100644 index 0000000000..e8a832a1bf --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionBandFeature.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +class RimSurfaceCollection; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateSurfaceIntersectionBandFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +public: + static RimSurfaceCollection* surfaceCollection(); + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.cpp b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.cpp new file mode 100644 index 0000000000..2d286cb312 --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.cpp @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateSurfaceIntersectionCurveFeature.h" + +#include "RimExtrudedCurveIntersection.h" +#include "RimSurfaceIntersectionCurve.h" + +#include "Riu3DMainWindowTools.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT( RicCreateSurfaceIntersectionCurveFeature, "RicCreateSurfaceIntersectionCurveFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateSurfaceIntersectionCurveFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateSurfaceIntersectionCurveFeature::onActionTriggered( bool isChecked ) +{ + auto* intersection = caf::SelectionManager::instance()->selectedItemAncestorOfType(); + if ( intersection ) + { + auto curve = intersection->addIntersectionCurve(); + intersection->updateAllRequiredEditors(); + + Riu3DMainWindowTools::selectAsCurrentItem( curve ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateSurfaceIntersectionCurveFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create Surface Intersection Curve" ); + actionToSetup->setIcon( QIcon( ":/ReservoirSurface16x16.png" ) ); +} diff --git a/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.h b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.h new file mode 100644 index 0000000000..aa74574bfc --- /dev/null +++ b/ApplicationLibCode/Commands/RicCreateSurfaceIntersectionCurveFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicCreateSurfaceIntersectionCurveFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp index cd220942cf..8e5f05b181 100644 --- a/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportEnsembleFeature.cpp @@ -19,6 +19,7 @@ #include "RicImportEnsembleFeature.h" #include "RiaApplication.h" +#include "RiaEnsembleNameTools.h" #include "RiaFilePathTools.h" #include "RiaPreferences.h" #include "RiaSummaryTools.h" @@ -51,6 +52,7 @@ #include #include #include +#include #include @@ -69,16 +71,41 @@ bool RicImportEnsembleFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicImportEnsembleFeature::onActionTriggered( bool isChecked ) { - RiaApplication* app = RiaApplication::instance(); - QString pathCacheName = "ENSEMBLE_FILES"; - QStringList fileNames = - RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialog( "Import Ensemble", pathCacheName ); + QString pathCacheName = "ENSEMBLE_FILES"; + auto [fileNames, ensembleGroupingMode] = + RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialogWithGrouping( "Import Ensemble", + pathCacheName ); if ( fileNames.isEmpty() ) return; - QString ensembleNameSuggestion = RiaSummaryTools::findSuitableEnsembleName( fileNames ); + if ( ensembleGroupingMode == RiaEnsembleNameTools::EnsembleGroupingMode::NONE ) + { + bool useEnsembleNameDialog = true; + importSingleEnsemble( fileNames, useEnsembleNameDialog, ensembleGroupingMode ); + } + else + { + std::vector groupedByEnsemble = + RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, ensembleGroupingMode ); + for ( const QStringList& groupedFileNames : groupedByEnsemble ) + { + bool useEnsembleNameDialog = false; + importSingleEnsemble( groupedFileNames, useEnsembleNameDialog, ensembleGroupingMode ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleFeature::importSingleEnsemble( const QStringList& fileNames, + bool useEnsembleNameDialog, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) +{ + QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, groupingMode ); + + if ( useEnsembleNameDialog ) ensembleName = askForEnsembleName( ensembleName ); - QString ensembleName = askForEnsembleName( ensembleNameSuggestion ); if ( ensembleName.isEmpty() ) return; std::vector cases; @@ -101,7 +128,7 @@ void RicImportEnsembleFeature::onActionTriggered( bool isChecked ) } std::vector allCases; - app->project()->allCases( allCases ); + RiaApplication::instance()->project()->allCases( allCases ); if ( allCases.size() == 0 ) { diff --git a/ApplicationLibCode/Commands/RicImportEnsembleFeature.h b/ApplicationLibCode/Commands/RicImportEnsembleFeature.h index 33f473f114..5400f3f19e 100644 --- a/ApplicationLibCode/Commands/RicImportEnsembleFeature.h +++ b/ApplicationLibCode/Commands/RicImportEnsembleFeature.h @@ -18,6 +18,8 @@ #pragma once +#include "RiaEnsembleNameTools.h" + #include "cafCmdFeature.h" #include @@ -37,5 +39,8 @@ class RicImportEnsembleFeature : public caf::CmdFeature void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - QString askForEnsembleName( const QString& suggestion ); + static QString askForEnsembleName( const QString& suggestion ); + static void importSingleEnsemble( const QStringList& fileNames, + bool useEnsembleNameDialog, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ); }; diff --git a/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.cpp b/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.cpp new file mode 100644 index 0000000000..6e0b4504c9 --- /dev/null +++ b/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.cpp @@ -0,0 +1,213 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicImportEnsembleSurfaceFeature.h" + +#include "RiaApplication.h" +#include "RiaEnsembleNameTools.h" +#include "RiaFilePathTools.h" +#include "RiaLogging.h" +#include "RiaSummaryTools.h" + +#include "RicImportEnsembleFeature.h" +#include "RicRecursiveFileSearchDialog.h" + +#include "RimEnsembleSurface.h" +#include "RimFileSurface.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSurfaceCollection.h" + +#include "Riu3DMainWindowTools.h" + +#include +#include + +CAF_CMD_SOURCE_INIT( RicImportEnsembleSurfaceFeature, "RicImportEnsembleSurfaceFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicImportEnsembleSurfaceFeature::RicImportEnsembleSurfaceFeature() + : m_pathFilter( "*" ) + , m_fileNameFilter( "*" ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportEnsembleSurfaceFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleSurfaceFeature::onActionTriggered( bool isChecked ) +{ + RiaApplication* app = RiaApplication::instance(); + QString pathCacheName = "ENSEMBLE_SURFACE_FILES"; + auto [fileNames, groupByEnsemble] = runRecursiveFileSearchDialog( "Import Ensemble Surface", pathCacheName ); + + importEnsembleSurfaceFromFiles( fileNames, groupByEnsemble ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleSurfaceFeature::importEnsembleSurfaceFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) +{ + if ( fileNames.isEmpty() ) return; + + std::vector groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, groupingMode ); + for ( const QStringList& groupedFileNames : groupedByEnsemble ) + { + importSingleEnsembleSurfaceFromFiles( groupedFileNames, groupingMode ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleSurfaceFeature::importSingleEnsembleSurfaceFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) +{ + // Create a list of file names for each layer + std::map fileNamesForEachLayer; + for ( const auto& fileName : fileNames ) + { + QFileInfo fi( fileName ); + + auto layerName = fi.baseName(); + fileNamesForEachLayer[layerName].push_back( fileName ); + } + + RimEnsembleSurface* ensembleToSelect = nullptr; + for ( const auto& fileNamesForLayer : fileNamesForEachLayer ) + { + // NB! This must be a const reference to avoid threading issues + const QStringList& layerFileNames = fileNamesForLayer.second; + + QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( layerFileNames, groupingMode ); + QString layerName = fileNamesForLayer.first; + if ( !layerName.isEmpty() ) + { + ensembleName += QString( " : %1" ).arg( layerName ); + } + + if ( ensembleName.isEmpty() ) ensembleName = "Ensemble Surface"; + + std::map keyFileComponentsForAllFiles = + RiaFilePathTools::keyPathComponentsForEachFilePath( layerFileNames ); + + std::vector surfaces; + for ( int i = 0; i < layerFileNames.size(); i++ ) + { + surfaces.push_back( new RimFileSurface ); + } + + auto fileCount = static_cast( layerFileNames.size() ); +#pragma omp parallel for + for ( int i = 0; i < fileCount; i++ ) + { + auto fileName = layerFileNames[i]; + + auto fileSurface = surfaces[i]; + fileSurface->setSurfaceFilePath( fileName ); + + auto shortName = + RiaEnsembleNameTools::uniqueShortNameFromComponents( fileName, keyFileComponentsForAllFiles, ensembleName ); + fileSurface->setUserDescription( shortName ); + + auto isOk = fileSurface->onLoadData(); + if ( !isOk ) + { + delete fileSurface; + surfaces[i] = nullptr; + } + } + + { + // Remove null pointers from vector of surfaces + std::vector tmp; + for ( auto s : surfaces ) + { + if ( s != nullptr ) tmp.push_back( s ); + } + + surfaces.swap( tmp ); + } + + if ( surfaces.empty() ) return; + + auto ensemble = new RimEnsembleSurface; + ensemble->setCollectionName( ensembleName ); + for ( auto surface : surfaces ) + ensemble->addFileSurface( surface ); + + ensemble->loadDataAndUpdate(); + RimProject::current()->activeOilField()->surfaceCollection->addEnsembleSurface( ensemble ); + + ensembleToSelect = ensemble; + } + + RimProject::current()->activeOilField()->surfaceCollection->updateConnectedEditors(); + Riu3DMainWindowTools::selectAsCurrentItem( ensembleToSelect ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleSurfaceFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/ReservoirSurfaces16x16.png" ) ); + actionToSetup->setText( "Import Ensemble Surface" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RicImportEnsembleSurfaceFeature::runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ) +{ + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory( pathCacheName ); + + RicRecursiveFileSearchDialogResult result = RicRecursiveFileSearchDialog::runRecursiveSearchDialog( nullptr, + dialogTitle, + defaultDir, + m_pathFilter, + m_fileNameFilter, + QStringList() + << ".TS" + << ".ts" ); + + // Remember filters + m_pathFilter = result.pathFilter; + m_fileNameFilter = result.fileNameFilter; + + if ( !result.ok ) return std::pair( QStringList(), RiaEnsembleNameTools::EnsembleGroupingMode::NONE ); + + // Remember the path to next time + app->setLastUsedDialogDirectory( pathCacheName, QFileInfo( result.rootDir ).absoluteFilePath() ); + + return std::pair( result.files, result.groupingMode ); +} diff --git a/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.h b/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.h new file mode 100644 index 0000000000..0e458eb02d --- /dev/null +++ b/ApplicationLibCode/Commands/RicImportEnsembleSurfaceFeature.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include "RiaEnsembleNameTools.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RicImportEnsembleSurfaceFeature : public caf::CmdFeature +{ +public: + CAF_CMD_HEADER_INIT; + + RicImportEnsembleSurfaceFeature(); + + static void importEnsembleSurfaceFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ); + +protected: + // Overrides + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + + std::pair + runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); + + static void importSingleEnsembleSurfaceFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ); + +private: + QString m_pathFilter; + QString m_fileNameFilter; +}; diff --git a/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.cpp b/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.cpp new file mode 100644 index 0000000000..1e6d8f5626 --- /dev/null +++ b/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.cpp @@ -0,0 +1,161 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicImportEnsembleWellLogsFeature.h" + +#include "RiaApplication.h" +#include "RiaEnsembleNameTools.h" +#include "RiaLogging.h" + +#include "RimEnsembleWellLogs.h" +#include "RimEnsembleWellLogsCollection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimWellLogFile.h" + +#include "RicRecursiveFileSearchDialog.h" +#include "WellLogCommands/RicWellLogsImportFileFeature.h" + +#include +#include + +CAF_CMD_SOURCE_INIT( RicImportEnsembleWellLogsFeature, "RicImportEnsembleWellLogsFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicImportEnsembleWellLogsFeature::RicImportEnsembleWellLogsFeature() + : m_pathFilter( "*" ) + , m_fileNameFilter( "*" ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicImportEnsembleWellLogsFeature::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleWellLogsFeature::onActionTriggered( bool isChecked ) +{ + RiaApplication* app = RiaApplication::instance(); + QString pathCacheName = "ENSEMBLE_WELL_LOGS_FILES"; + auto [fileNames, groupByEnsemble] = runRecursiveFileSearchDialog( "Import Ensemble Well Logs", pathCacheName ); + if ( fileNames.isEmpty() ) return; + + createEnsembleWellLogsFromFiles( fileNames, groupByEnsemble ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RicImportEnsembleWellLogsFeature::createEnsembleWellLogsFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) +{ + std::vector ensembleWellLogs; + + std::vector groupedByEnsemble = RiaEnsembleNameTools::groupFilesByEnsemble( fileNames, groupingMode ); + for ( const QStringList& groupedFileNames : groupedByEnsemble ) + { + auto ensembleWellLog = createSingleEnsembleWellLogsFromFiles( groupedFileNames, groupingMode ); + ensembleWellLogs.push_back( ensembleWellLog ); + } + + return ensembleWellLogs; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogs* RicImportEnsembleWellLogsFeature::createSingleEnsembleWellLogsFromFiles( + const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) +{ + if ( fileNames.isEmpty() ) return nullptr; + + std::vector cases; + for ( QString fileNames : fileNames ) + { + QString errorMessage; + RimWellLogFile* logFileInfo = RimWellLogFile::readWellLogFile( fileNames, &errorMessage ); + cases.push_back( logFileInfo ); + if ( !errorMessage.isEmpty() ) + { + RiaLogging::warning( errorMessage ); + } + } + + if ( cases.empty() ) return nullptr; + + RimEnsembleWellLogs* ensemble = new RimEnsembleWellLogs; + + QString ensembleName = RiaEnsembleNameTools::findSuitableEnsembleName( fileNames, groupingMode ); + ensemble->setName( ensembleName ); + for ( auto wellLogFile : cases ) + ensemble->addWellLogFile( wellLogFile ); + + RimProject::current()->activeOilField()->ensembleWellLogsCollection->addEnsembleWellLogs( ensemble ); + RimProject::current()->activeOilField()->ensembleWellLogsCollection->updateConnectedEditors(); + + return ensemble; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicImportEnsembleWellLogsFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setIcon( QIcon( ":/LasFile16x16.png" ) ); + actionToSetup->setText( "Import Ensemble Well Logs" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RicImportEnsembleWellLogsFeature::runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ) +{ + RiaApplication* app = RiaApplication::instance(); + QString defaultDir = app->lastUsedDialogDirectory( pathCacheName ); + + RicRecursiveFileSearchDialogResult result = RicRecursiveFileSearchDialog::runRecursiveSearchDialog( nullptr, + dialogTitle, + defaultDir, + m_pathFilter, + m_fileNameFilter, + QStringList() + << ".LAS" + << ".las" ); + + // Remember filters + m_pathFilter = result.pathFilter; + m_fileNameFilter = result.fileNameFilter; + + if ( !result.ok ) return std::make_pair( QStringList(), RiaEnsembleNameTools::EnsembleGroupingMode::NONE ); + + // Remember the path to next time + app->setLastUsedDialogDirectory( pathCacheName, QFileInfo( result.rootDir ).absoluteFilePath() ); + + return std::make_pair( result.files, result.groupingMode ); +} diff --git a/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.h b/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.h new file mode 100644 index 0000000000..f9739c7bd3 --- /dev/null +++ b/ApplicationLibCode/Commands/RicImportEnsembleWellLogsFeature.h @@ -0,0 +1,57 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include "RiaEnsembleNameTools.h" + +#include + +class RimEnsembleWellLogs; + +//================================================================================================== +/// +//================================================================================================== +class RicImportEnsembleWellLogsFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + + RicImportEnsembleWellLogsFeature(); + + static std::vector + createEnsembleWellLogsFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ); + +private: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + + std::pair + runRecursiveFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); + + static RimEnsembleWellLogs* + createSingleEnsembleWellLogsFromFiles( const QStringList& fileNames, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ); + +private: + QString m_pathFilter; + QString m_fileNameFilter; +}; diff --git a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp index 6b0558bab0..6aa3f1b3ff 100644 --- a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.cpp @@ -43,7 +43,10 @@ CAF_CMD_SOURCE_INIT( RicImportGeneralDataFeature, "RicImportGeneralDataFeature" /// //-------------------------------------------------------------------------------------------------- RicImportGeneralDataFeature::OpenCaseResults - RicImportGeneralDataFeature::openEclipseFilesFromFileNames( const QStringList& fileNames, bool doCreateDefaultPlot ) + RicImportGeneralDataFeature::openEclipseFilesFromFileNames( const QStringList& fileNames, + bool doCreateDefaultPlot, + bool createDefaultView, + std::shared_ptr readerSettings ) { CVF_ASSERT( !fileNames.empty() ); @@ -73,7 +76,7 @@ RicImportGeneralDataFeature::OpenCaseResults OpenCaseResults results; if ( !eclipseCaseFiles.empty() ) { - if ( !openEclipseCaseFromFileNames( eclipseCaseFiles ) ) + if ( !openEclipseCaseFromFileNames( eclipseCaseFiles, createDefaultView, results.createdCaseIds, readerSettings ) ) { return OpenCaseResults(); } @@ -83,7 +86,7 @@ RicImportGeneralDataFeature::OpenCaseResults } if ( !eclipseInputFiles.empty() ) { - if ( !openInputEclipseCaseFromFileNames( eclipseInputFiles ) ) + if ( !openInputEclipseCaseFromFileNames( eclipseInputFiles, createDefaultView, results.createdCaseIds ) ) { return OpenCaseResults(); } @@ -219,23 +222,34 @@ void RicImportGeneralDataFeature::openFileDialog( ImportFileType fileTypes ) fileNames.front() ); } - if ( !openEclipseFilesFromFileNames( fileNames, true ) ) + if ( !openEclipseFilesFromFileNames( fileNames, true, true, nullptr ) ) { RiaLogging::error( QString( "Failed to open file names: %1" ).arg( fileNames.join( ", " ) ) ); } + else + { + if ( fileNames.size() == 1 ) + { + RiaApplication::instance()->addToRecentFiles( fileNames.front() ); + } + } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames( const QStringList& fileNames ) +bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds, + std::shared_ptr readerSettings ) { + bool noDialog = false; RiaImportEclipseCaseTools::FileCaseIdMap newCaseFiles; - if ( RiaImportEclipseCaseTools::openEclipseCasesFromFile( fileNames, &newCaseFiles ) ) + if ( RiaImportEclipseCaseTools::openEclipseCasesFromFile( fileNames, createDefaultView, &newCaseFiles, noDialog, readerSettings ) ) { for ( const auto& newCaseFileAndId : newCaseFiles ) { - RiaApplication::instance()->addToRecentFiles( newCaseFileAndId.first ); + createdCaseIds.push_back( newCaseFileAndId.second ); } return true; } @@ -245,12 +259,15 @@ bool RicImportGeneralDataFeature::openEclipseCaseFromFileNames( const QStringLis //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RicImportGeneralDataFeature::openInputEclipseCaseFromFileNames( const QStringList& fileNames ) +bool RicImportGeneralDataFeature::openInputEclipseCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds ) { - QString fileContainingGrid; - if ( RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( fileNames, &fileContainingGrid ) >= 0 ) + auto generatedCaseId = RiaImportEclipseCaseTools::openEclipseInputCaseFromFileNames( fileNames, createDefaultView ); + if ( generatedCaseId >= 0 ) { - RiaApplication::instance()->addToRecentFiles( fileContainingGrid ); + RiaApplication::instance()->addToRecentFiles( fileNames[0] ); + createdCaseIds.push_back( generatedCaseId ); return true; } return false; diff --git a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h index b0b1f0947a..91d6c6847a 100644 --- a/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h +++ b/ApplicationLibCode/Commands/RicImportGeneralDataFeature.h @@ -24,8 +24,11 @@ #include +#include #include +class RifReaderSettings; + //================================================================================================== /// //================================================================================================== @@ -40,13 +43,18 @@ class RicImportGeneralDataFeature : public caf::CmdFeature QStringList eclipseInputFiles; QStringList eclipseSummaryFiles; + std::vector createdCaseIds; + operator bool() const { return !( eclipseCaseFiles.empty() && eclipseInputFiles.empty() && eclipseSummaryFiles.empty() ); } }; - static OpenCaseResults openEclipseFilesFromFileNames( const QStringList& fileNames, bool doCreateDefaultPlot ); + static OpenCaseResults openEclipseFilesFromFileNames( const QStringList& fileNames, + bool doCreateDefaultPlot, + bool createDefaultView, + std::shared_ptr readerSettings = nullptr ); static QStringList fileNamesFromCaseNames( const QStringList& caseNames ); static QStringList getEclipseFileNamesWithDialog( RiaDefines::ImportFileType fileTypes ); @@ -58,7 +66,12 @@ class RicImportGeneralDataFeature : public caf::CmdFeature static void openFileDialog( RiaDefines::ImportFileType fileTypes ); - static bool openEclipseCaseFromFileNames( const QStringList& fileNames ); - static bool openInputEclipseCaseFromFileNames( const QStringList& fileNames ); + static bool openEclipseCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds, + std::shared_ptr readerSettings ); + static bool openInputEclipseCaseFromFileNames( const QStringList& fileNames, + bool createDefaultView, + std::vector& createdCaseIds ); static bool openSummaryCaseFromFileNames( const QStringList& fileNames, bool doCreateDefaultPlot = true ); }; diff --git a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp index 53b626a1c9..44710aed8b 100644 --- a/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportGridModelFromSummaryCaseFeature.cpp @@ -51,7 +51,8 @@ bool RicImportGridModelFromSummaryCaseFeature::openOrImportGridModelFromSummaryC if ( QFileInfo::exists( candidateGridFileName ) ) { - auto id = RiaImportEclipseCaseTools::openEclipseCaseFromFile( candidateGridFileName ); + bool createView = true; + auto id = RiaImportEclipseCaseTools::openEclipseCaseFromFile( candidateGridFileName, createView ); if ( id > -1 ) { RiaLogging::info( QString( "Imported %1" ).arg( candidateGridFileName ) ); diff --git a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp index fd41bd452e..5830d65bbc 100644 --- a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp +++ b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.cpp @@ -251,8 +251,9 @@ void RicImportSummaryCasesFeature::addCasesToGroupIfRelevant( const std::vector< //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QStringList RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialog( const QString& dialogTitle, - const QString& pathCacheName ) +std::pair + RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialogWithGrouping( const QString& dialogTitle, + const QString& pathCacheName ) { RiaApplication* app = RiaApplication::instance(); QString defaultDir = app->lastUsedDialogDirectory( pathCacheName ); @@ -269,10 +270,20 @@ QStringList RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialo m_pathFilter = result.pathFilter; m_fileNameFilter = result.fileNameFilter; - if ( !result.ok ) return QStringList(); + if ( !result.ok ) return std::make_pair( QStringList(), RiaEnsembleNameTools::EnsembleGroupingMode::NONE ); // Remember the path to next time app->setLastUsedDialogDirectory( pathCacheName, QFileInfo( result.rootDir ).absoluteFilePath() ); - return result.files; + return std::make_pair( result.files, result.groupingMode ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList RicImportSummaryCasesFeature::runRecursiveSummaryCaseFileSearchDialog( const QString& dialogTitle, + const QString& pathCacheName ) +{ + auto result = runRecursiveSummaryCaseFileSearchDialogWithGrouping( dialogTitle, pathCacheName ); + return result.first; } diff --git a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h index ccc2ef72d9..c5f170c29f 100644 --- a/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h +++ b/ApplicationLibCode/Commands/RicImportSummaryCasesFeature.h @@ -18,6 +18,8 @@ #pragma once +#include "RiaEnsembleNameTools.h" + #include "cafCmdFeature.h" #include @@ -48,6 +50,9 @@ class RicImportSummaryCasesFeature : public caf::CmdFeature static QStringList runRecursiveSummaryCaseFileSearchDialog( const QString& dialogTitle, const QString& pathCacheName ); + static std::pair + runRecursiveSummaryCaseFileSearchDialogWithGrouping( const QString& dialogTitle, const QString& pathCacheName ); + protected: // Overrides bool isCommandEnabled() override; diff --git a/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp b/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp index 8b73f0106a..a0966d46b9 100644 --- a/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp +++ b/ApplicationLibCode/Commands/RicNewContourMapViewFeature.cpp @@ -20,6 +20,7 @@ #include "RigActiveCellInfo.h" #include "RigEclipseCaseData.h" +#include "RigFemPartCollection.h" #include "Rim3dView.h" #include "RimCellEdgeColors.h" @@ -65,6 +66,14 @@ bool RicNewContourMapViewFeature::isCommandEnabled() { bool selectedView = caf::SelectionManager::instance()->selectedItemOfType() != nullptr; bool selectedCase = caf::SelectionManager::instance()->selectedItemOfType() != nullptr; + + RimGeoMechView* gmView = caf::SelectionManager::instance()->selectedItemOfType(); + if ( gmView ) + { + // if we have more than one geomech part, contour maps does not work with the current implementation + if ( gmView->femParts()->partCount() > 1 ) return false; + } + bool selectedEclipseContourMapCollection = caf::SelectionManager::instance()->selectedItemOfType(); bool selectedGeoMechContourMapCollection = @@ -302,8 +311,6 @@ RimEclipseContourMapView* RicNewContourMapViewFeature::createEclipseContourMap( eclipseCase->contourMapCollection()->push_back( contourMap ); - contourMap->hasUserRequestedAnimation = true; - auto col = RiuGuiTheme::getColorByVariableName( "backgroundColor2" ); contourMap->setBackgroundColor( RiaColorTools::fromQColorTo3f( col ) ); // Ignore original view background @@ -386,8 +393,6 @@ RimGeoMechContourMapView* RicNewContourMapViewFeature::createGeoMechContourMap( contourMap->setName( QString( "Contour Map %1" ).arg( i + 1 ) ); geoMechCase->contourMapCollection()->push_back( contourMap ); - contourMap->hasUserRequestedAnimation = true; - auto col = RiuGuiTheme::getColorByVariableName( "backgroundColor2" ); contourMap->setBackgroundColor( RiaColorTools::fromQColorTo3f( col ) ); // Ignore original view background diff --git a/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp b/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp index a245af4a35..f3a251f36f 100644 --- a/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp +++ b/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.cpp @@ -18,6 +18,7 @@ #include "RicRecursiveFileSearchDialog.h" +#include "RiaEnsembleNameTools.h" #include "RiaFilePathTools.h" #include "RiaGuiApplication.h" #include "RiaStringListSerializer.h" @@ -40,6 +41,7 @@ #include #include #include +#include #include #include #include @@ -69,68 +71,92 @@ RicRecursiveFileSearchDialogResult RicRecursiveFileSearchDialog::runRecursiveSea const QString& fileNameFilter, const QStringList& fileExtensions ) { - RicRecursiveFileSearchDialog dialog( parent ); + const QString filePathRegistryKey = QString( "RicRecursiveFileSearchDialog %1" ).arg( caption ).replace( " ", "_" ); + const QString fileFilterRegistryKey = + QString( "RicRecursiveFileSearchDialog file filter %1" ).arg( caption ).replace( " ", "_" ); + const QString useRealizationStarRegistryKey = "RecursiveFileSearchDialog_use_realization"; + QSettings settings; - dialog.setWindowTitle( caption ); + RicRecursiveFileSearchDialog dialog( parent, fileExtensions ); + { + QSignalBlocker signalBlocker( dialog.m_pathFilterField ); + QSignalBlocker signalBlocker2( dialog.m_ensembleGroupingMode ); - QString pathFilterText = dir; - RiaFilePathTools::appendSeparatorIfNo( pathFilterText ); - pathFilterText += pathFilter; + dialog.setWindowTitle( caption ); - const QString searchHistoryStringsRegistryKey = - QString( "RicRecursiveFileSearchDialog %1" ).arg( caption ).replace( " ", "_" ); - const int maxItemsInRegistry = 10; - { - RiaStringListSerializer stringListSerializer( searchHistoryStringsRegistryKey ); - QStringList files = stringListSerializer.textStrings(); + QString pathFilterText = dir; + RiaFilePathTools::appendSeparatorIfNo( pathFilterText ); + pathFilterText += pathFilter; + dialog.m_fileFilterField->addItem( fileNameFilter ); + dialog.m_pathFilterField->addItem( QDir::toNativeSeparators( pathFilterText ) ); - int numRecentFiles = std::min( files.size(), maxItemsInRegistry ); - for ( int i = 0; i < numRecentFiles; i++ ) + for ( const auto& s : fileExtensions ) { - dialog.m_pathFilterField->addItem( files[i] ); + QString joined = fileExtensions.join( '|' ); + dialog.m_fileExtensionsField->setText( joined ); } - } - QSettings settings; - const QString useRealizationStarRegistryKey = "RecursiveFileSearchDialog_use_realization"; + dialog.m_fileFilterField->addItem( fileNameFilter ); + + populateComboBoxHistoryFromRegistry( dialog.m_pathFilterField, filePathRegistryKey ); + + populateComboBoxHistoryFromRegistry( dialog.m_fileFilterField, fileFilterRegistryKey ); + + bool isChecked = settings.value( useRealizationStarRegistryKey, true ).toBool(); + dialog.m_useRealizationStarCheckBox->setChecked( isChecked ); + + dialog.m_fileFilterField->setCurrentText( fileNameFilter ); + dialog.m_fileFilterField->setEditable( true ); - bool isChecked = settings.value( useRealizationStarRegistryKey, true ).toBool(); - dialog.m_useRealizationStarCheckBox->setChecked( isChecked ); + dialog.m_pathFilterField->setCurrentText( QDir::toNativeSeparators( pathFilterText ) ); + dialog.m_pathFilterField->setEditable( true ); - dialog.m_pathFilterField->addItem( QDir::toNativeSeparators( pathFilterText ) ); - dialog.m_pathFilterField->setCurrentText( QDir::toNativeSeparators( pathFilterText ) ); + dialog.m_fileExtensions = trimLeftStrings( fileExtensions, "." ); - dialog.m_pathFilterField->setEditable( true ); - dialog.m_fileFilterField->setText( fileNameFilter ); - dialog.m_fileExtensions = trimLeftStrings( fileExtensions, "." ); + for ( const auto& s : caf::AppEnum::uiTexts() ) + { + dialog.m_ensembleGroupingMode->addItem( s ); + } + + dialog.updateEffectiveFilter(); + dialog.clearFileList(); + dialog.setOkButtonEnabled( false ); - dialog.updateEffectiveFilter(); - dialog.clearFileList(); - dialog.setOkButtonEnabled( false ); + dialog.resize( 800, 150 ); + } - dialog.resize( 800, 150 ); dialog.exec(); if ( dialog.result() == QDialog::Accepted ) { - RiaStringListSerializer stringListSerializer( searchHistoryStringsRegistryKey ); - stringListSerializer.addString( dialog.m_pathFilterField->currentText(), maxItemsInRegistry ); - settings.setValue( useRealizationStarRegistryKey, dialog.m_useRealizationStarCheckBox->isChecked() ); + + const int maxItemsInRegistry = 10; + + { + RiaStringListSerializer stringListSerializer( filePathRegistryKey ); + stringListSerializer.addString( dialog.m_pathFilterField->currentText(), maxItemsInRegistry ); + } + { + RiaStringListSerializer stringListSerializer( fileFilterRegistryKey ); + stringListSerializer.addString( dialog.m_fileFilterField->currentText(), maxItemsInRegistry ); + } } return RicRecursiveFileSearchDialogResult( dialog.result() == QDialog::Accepted, dialog.m_foundFiles, dialog.rootDirWithEndSeparator(), dialog.pathFilterWithoutStartSeparator(), - dialog.fileNameFilter() ); + dialog.fileNameFilter(), + dialog.ensembleGroupingMode() ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) +RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent, const QStringList& fileExtensions ) : QDialog( parent, RiuTools::defaultDialogFlags() ) + , m_incomingFileExtensions( fileExtensions ) { // Create widgets m_browseButton = new QPushButton(); @@ -141,9 +167,12 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) m_pathFilterLabel = new QLabel(); m_pathFilterField = new QComboBox(); m_fileFilterLabel = new QLabel(); - m_fileFilterField = new QLineEdit(); + m_fileFilterField = new QComboBox(); + m_fileExtensionsLabel = new QLabel(); + m_fileExtensionsField = new QLineEdit(); m_effectiveFilterLabel = new QLabel(); m_effectiveFilterContentLabel = new QLabel(); + m_ensembleGroupingMode = new QComboBox(); m_searchRootLabel = new QLabel(); m_searchRootContentLabel = new QLabel(); m_findOrCancelButton = new QPushButton(); @@ -155,13 +184,22 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) connect( m_pathFilterField, SIGNAL( currentTextChanged( const QString& ) ), this, - SLOT( slotFilterChanged( const QString& ) ) ); + SLOT( slotPathFilterChanged( const QString& ) ) ); connect( m_pathFilterField, SIGNAL( editTextChanged( const QString& ) ), this, - SLOT( slotFilterChanged( const QString& ) ) ); + SLOT( slotPathFilterChanged( const QString& ) ) ); - connect( m_fileFilterField, SIGNAL( textChanged( const QString& ) ), this, SLOT( slotFilterChanged( const QString& ) ) ); + connect( m_fileFilterField, + SIGNAL( currentTextChanged( const QString& ) ), + this, + SLOT( slotFileFilterChanged( const QString& ) ) ); + connect( m_fileFilterField, + SIGNAL( editTextChanged( const QString& ) ), + this, + SLOT( slotFileFilterChanged( const QString& ) ) ); + + connect( m_fileExtensionsField, SIGNAL( editingFinished() ), this, SLOT( slotFileExtensionsChanged() ) ); connect( m_fileListWidget, SIGNAL( customContextMenuRequested( const QPoint& ) ), @@ -170,6 +208,8 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) connect( m_browseButton, SIGNAL( clicked() ), this, SLOT( slotBrowseButtonClicked() ) ); + connect( m_ensembleGroupingMode, SIGNAL( currentIndexChanged( int ) ), this, SLOT( slotFindOrCancelButtonClicked() ) ); + connect( m_findOrCancelButton, SIGNAL( clicked() ), this, SLOT( slotFindOrCancelButtonClicked() ) ); connect( m_buttons, SIGNAL( accepted() ), this, SLOT( slotDialogOkClicked() ) ); @@ -178,6 +218,7 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) // Set widget properties m_pathFilterLabel->setText( "Path pattern" ); m_fileFilterLabel->setText( "File pattern" ); + m_fileExtensionsLabel->setText( "File Extensions" ); m_effectiveFilterLabel->setText( "Effective filter" ); m_searchRootLabel->setText( "Root" ); m_searchRootLabel->setVisible( false ); @@ -203,15 +244,34 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) QGroupBox* inputGroup = new QGroupBox( "Filter" ); QGridLayout* inputGridLayout = new QGridLayout(); - inputGridLayout->addWidget( m_pathFilterLabel, 0, 0 ); - inputGridLayout->addWidget( m_pathFilterField, 0, 1, 1, 2 ); - inputGridLayout->addWidget( m_browseButton, 0, 3 ); - inputGridLayout->addWidget( m_fileFilterLabel, 1, 0 ); - inputGridLayout->addWidget( m_fileFilterField, 1, 1, 1, 2 ); - inputGridLayout->addWidget( m_useRealizationStarCheckBox, 2, 1 ); - inputGridLayout->addWidget( m_effectiveFilterLabel, 3, 0 ); - inputGridLayout->addWidget( m_effectiveFilterContentLabel, 3, 1 ); - inputGridLayout->addWidget( m_findOrCancelButton, 3, 2, 1, 2 ); + int row = 0; + inputGridLayout->addWidget( m_pathFilterLabel, row, 0 ); + inputGridLayout->addWidget( m_pathFilterField, row, 1, 1, 2 ); + inputGridLayout->addWidget( m_browseButton, row, 3 ); + + row++; + inputGridLayout->addWidget( m_fileFilterLabel, row, 0 ); + inputGridLayout->addWidget( m_fileFilterField, row, 1, 1, 2 ); + + row++; + inputGridLayout->addWidget( m_fileExtensionsLabel, row, 0 ); + inputGridLayout->addWidget( m_fileExtensionsField, row, 1, 1, 2 ); + + row++; + { + QHBoxLayout* horizontalLayout = new QHBoxLayout; + horizontalLayout->addWidget( m_useRealizationStarCheckBox ); + QLabel* ensembleGroupingLabel = new QLabel( "Ensemble Grouping" ); + horizontalLayout->addWidget( ensembleGroupingLabel ); + horizontalLayout->addWidget( m_ensembleGroupingMode ); + horizontalLayout->addStretch( 1 ); + inputGridLayout->addLayout( horizontalLayout, row, 1 ); + } + + row++; + inputGridLayout->addWidget( m_effectiveFilterLabel, row, 0 ); + inputGridLayout->addWidget( m_effectiveFilterContentLabel, row, 1 ); + inputGridLayout->addWidget( m_findOrCancelButton, row, 2 ); inputGroup->setLayout( inputGridLayout ); @@ -230,33 +290,44 @@ RicRecursiveFileSearchDialog::RicRecursiveFileSearchDialog( QWidget* parent ) setLayout( dialogLayout ); - QString pathFilterHelpText = - "The path filter uses normal wildcard file globbing, like in any unix shell. \n" - "When the filter ends with a single \"*\" (eg. \"/home/*\"), however, ResInsight will \n" - "search recursively in all subdirectories from that point.\n" - "This is indicated by \"...\" in the Effective Filter label below.\n" - "\n" - "An asterix \"*\" matches any number of any characters, except the path separator.\n" - "A question mark \"?\" matches any single character, except the path separator.\n" - "Square brackets \"[]\" encloses a list of characters and matches one of the enclosed characters.\n" - "they are also used to escape the characters *,? and []"; - - // https://doc.qt.io/qt-5/qregularexpression.html#wildcardToRegularExpression + { + QString text = + "The path filter uses normal wildcard file globbing, like in any unix shell. \n" + "When the filter ends with a single \"*\" (eg. \"/home/*\"), however, ResInsight will \n" + "search recursively in all subdirectories from that point.\n" + "This is indicated by \"...\" in the Effective Filter label below.\n" + "\n" + "An asterix \"*\" matches any number of any characters, except the path separator.\n" + "A question mark \"?\" matches any single character, except the path separator.\n" + "Square brackets \"[]\" encloses a list of characters and matches one of the enclosed characters.\n" + "they are also used to escape the characters *,? and []"; + + // https://doc.qt.io/qt-5/qregularexpression.html#wildcardToRegularExpression + + m_pathFilterLabel->setToolTip( text ); + m_pathFilterField->setToolTip( text ); + } - m_pathFilterLabel->setToolTip( pathFilterHelpText ); - m_pathFilterField->setToolTip( pathFilterHelpText ); + { + QString text = "Define the extension using \".EGRID|.GRDECL\""; + m_fileExtensionsLabel->setToolTip( text ); + m_fileExtensionsField->setToolTip( text ); + } - QString fileFilterHelpText = - "The file filter uses normal wildcards, but is not allowed to contain path separators. "; + { + QString text = "The file filter uses normal wild cards, but is not allowed to contain path separators. "; - m_fileFilterLabel->setToolTip( fileFilterHelpText ); - m_fileFilterField->setToolTip( fileFilterHelpText ); + m_fileFilterLabel->setToolTip( text ); + m_fileFilterField->setToolTip( text ); + } - QString effectiveFilterHelpText = "This label displays the complete filter that is being applied. \n" - "The possible \"...\" indicates a complete recursive directory search."; + { + QString text = "This label displays the complete filter that is being applied. \n" + "The possible \"...\" indicates a complete recursive directory search."; - m_effectiveFilterLabel->setToolTip( effectiveFilterHelpText ); - m_effectiveFilterContentLabel->setToolTip( effectiveFilterHelpText ); + m_effectiveFilterLabel->setToolTip( text ); + m_effectiveFilterContentLabel->setToolTip( text ); + } } //-------------------------------------------------------------------------------------------------- @@ -312,7 +383,7 @@ QString RicRecursiveFileSearchDialog::pathFilterWithoutStartSeparator() const //-------------------------------------------------------------------------------------------------- QString RicRecursiveFileSearchDialog::fileNameFilter() const { - return m_fileFilterField->text().trimmed(); + return m_fileFilterField->currentText().trimmed(); } //-------------------------------------------------------------------------------------------------- @@ -338,7 +409,7 @@ QString RicRecursiveFileSearchDialog::extensionFromFileNameFilter() const { for ( const QString& ext : m_fileExtensions ) { - if ( m_fileFilterField->text().endsWith( ext, Qt::CaseInsensitive ) ) + if ( m_fileFilterField->currentText().endsWith( ext, Qt::CaseInsensitive ) ) { return ext; } @@ -353,9 +424,32 @@ void RicRecursiveFileSearchDialog::updateFileListWidget() { m_fileListWidget->clear(); + if ( ensembleGroupingMode() != RiaEnsembleNameTools::EnsembleGroupingMode::NONE ) + { + std::vector groupedByEnsemble = + RiaEnsembleNameTools::groupFilesByEnsemble( m_foundFiles, ensembleGroupingMode() ); + for ( const QStringList& groupedFileNames : groupedByEnsemble ) + { + QString ensembleName = + RiaEnsembleNameTools::findSuitableEnsembleName( groupedFileNames, ensembleGroupingMode() ); + QListWidgetItem* item = new QListWidgetItem( QDir::toNativeSeparators( ensembleName ), m_fileListWidget ); + addToFileListWidget( groupedFileNames ); + } + } + else + { + addToFileListWidget( m_foundFiles ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRecursiveFileSearchDialog::addToFileListWidget( const QStringList& fileNames ) +{ int rootSearchPathLength = rootDirWithEndSeparator().size(); - for ( const auto& fileName : m_foundFiles ) + for ( const auto& fileName : fileNames ) { QString itemText = fileName; itemText.remove( 0, rootSearchPathLength ); @@ -559,6 +653,23 @@ QString RicRecursiveFileSearchDialog::replaceWithRealizationStar( const QString& return textWithStar; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRecursiveFileSearchDialog::populateComboBoxHistoryFromRegistry( QComboBox* comboBox, const QString& registryKey ) +{ + RiaStringListSerializer stringListSerializer( registryKey ); + QStringList files = stringListSerializer.textStrings(); + + const int maxItemsInRegistry = 10; + + int numRecentFiles = std::min( files.size(), maxItemsInRegistry ); + for ( int i = 0; i < numRecentFiles; i++ ) + { + comboBox->addItem( files[i] ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -609,11 +720,36 @@ void RicRecursiveFileSearchDialog::warningIfInvalidCharacters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RicRecursiveFileSearchDialog::slotFilterChanged( const QString& text ) +void RicRecursiveFileSearchDialog::slotPathFilterChanged( const QString& text ) { updateEffectiveFilter(); warningIfInvalidCharacters(); m_findOrCancelButton->setDefault( true ); + + slotFindOrCancelButtonClicked(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRecursiveFileSearchDialog::slotFileFilterChanged( const QString& text ) +{ + clearFileList(); + updateEffectiveFilter(); + warningIfInvalidCharacters(); + m_findOrCancelButton->setDefault( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicRecursiveFileSearchDialog::slotFileExtensionsChanged() +{ + QStringList items = m_fileExtensionsField->text().split( '|' ); + + m_fileExtensions = trimLeftStrings( items, "." ); + + updateEffectiveFilter(); } //-------------------------------------------------------------------------------------------------- @@ -809,6 +945,20 @@ void RicRecursiveFileSearchDialog::slotUseRealizationStarClicked() updateEffectiveFilter(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaEnsembleNameTools::EnsembleGroupingMode RicRecursiveFileSearchDialog::ensembleGroupingMode() const +{ + if ( m_ensembleGroupingMode->currentIndex() == 0 ) + return RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE; + if ( m_ensembleGroupingMode->currentIndex() == 1 ) + return RiaEnsembleNameTools::EnsembleGroupingMode::EVEREST_FOLDER_STRUCTURE; + if ( m_ensembleGroupingMode->currentIndex() == 2 ) return RiaEnsembleNameTools::EnsembleGroupingMode::NONE; + + return RiaEnsembleNameTools::EnsembleGroupingMode::FMU_FOLDER_STRUCTURE; +} + //-------------------------------------------------------------------------------------------------- /// Internal functions //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.h b/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.h index 70341d9a5e..1d354a8486 100644 --- a/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.h +++ b/ApplicationLibCode/Commands/RicRecursiveFileSearchDialog.h @@ -22,6 +22,7 @@ #include "cafPdmPointer.h" +#include "RiaEnsembleNameTools.h" #include class QLabel; @@ -60,7 +61,7 @@ class RicRecursiveFileSearchDialog : public QDialog const QStringList& fileExtensions = QStringList() ); private: - RicRecursiveFileSearchDialog( QWidget* parent ); + RicRecursiveFileSearchDialog( QWidget* parent, const QStringList& fileExtensions ); ~RicRecursiveFileSearchDialog() override; QString cleanTextFromPathFilterField() const; @@ -71,6 +72,8 @@ class RicRecursiveFileSearchDialog : public QDialog QStringList fileExtensions() const; QString extensionFromFileNameFilter() const; + RiaEnsembleNameTools::EnsembleGroupingMode ensembleGroupingMode() const; + void setOkButtonEnabled( bool enabled ); void warningIfInvalidCharacters(); void updateEffectiveFilter(); @@ -78,6 +81,7 @@ class RicRecursiveFileSearchDialog : public QDialog void updateFileListWidget(); void clearFileList(); + void addToFileListWidget( const QStringList& fileNames ); // File search methods @@ -89,8 +93,12 @@ class RicRecursiveFileSearchDialog : public QDialog QStringList createFileNameFilterList(); static QString replaceWithRealizationStar( const QString& text ); + static void populateComboBoxHistoryFromRegistry( QComboBox* comboBox, const QString& registryKey ); + private slots: - void slotFilterChanged( const QString& text ); + void slotPathFilterChanged( const QString& text ); + void slotFileFilterChanged( const QString& text ); + void slotFileExtensionsChanged(); void slotBrowseButtonClicked(); void slotUseRealizationStarClicked(); void slotFindOrCancelButtonClicked(); @@ -111,12 +119,17 @@ private slots: QCheckBox* m_useRealizationStarCheckBox; QLabel* m_fileFilterLabel; - QLineEdit* m_fileFilterField; + QComboBox* m_fileFilterField; + + QLabel* m_fileExtensionsLabel; + QLineEdit* m_fileExtensionsField; QLabel* m_effectiveFilterLabel; QLabel* m_effectiveFilterContentLabel; QPushButton* m_findOrCancelButton; + QComboBox* m_ensembleGroupingMode; + QGroupBox* m_outputGroup; QLabel* m_searchRootLabel; QLabel* m_searchRootContentLabel; @@ -124,8 +137,9 @@ private slots: QDialogButtonBox* m_buttons; - QStringList m_foundFiles; - QStringList m_fileExtensions; + QStringList m_foundFiles; + const QStringList m_incomingFileExtensions; + QStringList m_fileExtensions; bool m_isCancelPressed; @@ -140,16 +154,18 @@ private slots: class RicRecursiveFileSearchDialogResult { public: - RicRecursiveFileSearchDialogResult( bool ok, - const QStringList& files, - const QString& rootDir, - const QString& pathFilter, - const QString& fileNameFilter ) + RicRecursiveFileSearchDialogResult( bool ok, + const QStringList& files, + const QString& rootDir, + const QString& pathFilter, + const QString& fileNameFilter, + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode ) : ok( ok ) , files( files ) , rootDir( rootDir ) , pathFilter( pathFilter ) , fileNameFilter( fileNameFilter ) + , groupingMode( groupingMode ) { } @@ -158,4 +174,6 @@ class RicRecursiveFileSearchDialogResult QString rootDir; QString pathFilter; QString fileNameFilter; + + RiaEnsembleNameTools::EnsembleGroupingMode groupingMode; }; diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/SsiHubImportCommands/CMakeLists_files.cmake index 3de66c1113..965f2d80a2 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/CMakeLists_files.cmake @@ -1,32 +1,31 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsImportSsihubFeature.h -${CMAKE_CURRENT_LIST_DIR}/RimOilFieldEntry.h -${CMAKE_CURRENT_LIST_DIR}/RimOilRegionEntry.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathImport.h -${CMAKE_CURRENT_LIST_DIR}/RimWellsEntry.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsImportSsihubFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RimOilFieldEntry.h + ${CMAKE_CURRENT_LIST_DIR}/RimOilRegionEntry.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathImport.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellsEntry.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsImportSsihubFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RimOilFieldEntry.cpp -${CMAKE_CURRENT_LIST_DIR}/RimOilRegionEntry.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathImport.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellsEntry.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsImportSsihubFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimOilFieldEntry.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimOilRegionEntry.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathImport.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellsEntry.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellImportWizard.h ) -source_group( "CommandFeature\\SsiHub" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\SsiHub" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilFieldEntry.cpp b/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilFieldEntry.cpp index 860b13bc57..cb684c6ac0 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilFieldEntry.cpp +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilFieldEntry.cpp @@ -44,7 +44,7 @@ RimOilFieldEntry::RimOilFieldEntry() CAF_PDM_InitFieldNoDefault( &wellsFilePath, "wellsFilePath", "Wells File Path", "", "", "" ); CAF_PDM_InitFieldNoDefault( &wells, "Wells", "", "", "", "" ); - wells.uiCapability()->setUiHidden( true ); + wells.uiCapability()->setUiTreeHidden( true ); wells.uiCapability()->setUiTreeChildrenHidden( true ); } diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilRegionEntry.cpp b/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilRegionEntry.cpp index 0d37e7ae0c..0e44542c6a 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilRegionEntry.cpp +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RimOilRegionEntry.cpp @@ -31,7 +31,7 @@ RimOilRegionEntry::RimOilRegionEntry() CAF_PDM_InitFieldNoDefault( &name, "OilRegionEntry", "OilRegionEntry", "", "", "" ); CAF_PDM_InitFieldNoDefault( &fields, "Fields", "", "", "", "" ); - fields.uiCapability()->setUiHidden( true ); + fields.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &selected, "Selected", false, "Selected", "", "", "" ); } diff --git a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp index c20a7f0ff4..bab5838747 100644 --- a/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp +++ b/ApplicationLibCode/Commands/SsiHubImportCommands/RimWellPathImport.cpp @@ -63,7 +63,7 @@ RimWellPathImport::RimWellPathImport() CAF_PDM_InitField( &west, "UtmWest", 0.0, "West", "", "", "" ); CAF_PDM_InitFieldNoDefault( ®ions, "Regions", "", "", "", "" ); - regions.uiCapability()->setUiHidden( true ); + regions.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/StreamlineCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/StreamlineCommands/CMakeLists_files.cmake index e1388bbc5a..09205b8636 100644 --- a/ApplicationLibCode/Commands/StreamlineCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/StreamlineCommands/CMakeLists_files.cmake @@ -1,18 +1,17 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewStreamlineFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewStreamlineFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewStreamlineFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewStreamlineFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\StreamlineCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\StreamlineCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake index d7571f18dd..96ff126b96 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/CMakeLists_files.cmake @@ -1,111 +1,112 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewDefaultSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeatureUi.h -${CMAKE_CURRENT_LIST_DIR}/RicViewZoomAllFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveSwitchAxisFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCaseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewGridTimeHistoryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSelectSummaryPlotUI.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteTimeHistoryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCrossPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorUi.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicShowSummaryCurveCalculatorFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCurveCalculationFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorUi.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryEnsembleCurveSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteEnsembleCurveSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleCurveFilterFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedEnsembleFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedSummaryFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewDefaultSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeatureUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicViewZoomAllFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveSwitchAxisFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCaseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewGridTimeHistoryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSelectSummaryPlotUI.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteTimeHistoryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCrossPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowSummaryCurveCalculatorFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCurveCalculationFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryEnsembleCurveSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEnsembleCurveSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleCurveFilterFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedEnsembleFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedSummaryFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewDefaultSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicViewZoomAllFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveSwitchAxisFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCaseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewGridTimeHistoryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSelectSummaryPlotUI.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteTimeHistoryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCrossPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowSummaryCurveCalculatorFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCurveCalculationFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryEnsembleCurveSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteEnsembleCurveSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleCurveFilterFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedEnsembleFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedSummaryFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewDefaultSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDuplicateSummaryCrossPlotCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataToSummaryPlotFeatureUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicViewZoomAllFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveSwitchAxisFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCrossPlotCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteSummaryCaseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewGridTimeHistoryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSelectSummaryPlotUI.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteTimeHistoryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteAsciiDataCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCrossPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowSummaryCurveCalculatorFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicEditSummaryCurveCalculationFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryCrossPlotCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSummaryEnsembleCurveSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteEnsembleCurveSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleCurveFilterFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedEnsembleFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingSummaryCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicClearSourceSteppingEnsembleCurveSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSetSourceSteppingEnsembleCurveSetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicActivateCurveFilterInToolbarFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewDerivedSummaryFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.h -${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.h +list( + APPEND + COMMAND_QT_MOC_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorWidgetCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryPlotEditorDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorWidgetCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RicSummaryCurveCalculatorDialog.h ) -source_group( "CommandFeature\\SummaryPlot" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\SummaryPlot" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp index 5ffc988f55..edb01800f5 100644 --- a/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp +++ b/ApplicationLibCode/Commands/SummaryPlotCommands/RicSummaryPlotEditorUi.cpp @@ -121,7 +121,7 @@ RicSummaryPlotEditorUi::RicSummaryPlotEditorUi() CAF_PDM_InitFieldNoDefault( &m_curveNameConfig, "SummaryCurveNameConfig", "SummaryCurveNameConfig", "", "", "" ); m_curveNameConfig = new RimSummaryCurveAutoName(); - m_curveNameConfig.uiCapability()->setUiHidden( true ); + m_curveNameConfig.uiCapability()->setUiTreeHidden( true ); m_curveNameConfig.uiCapability()->setUiTreeChildrenHidden( true ); m_summaryCurveSelectionEditor.reset( new RiuSummaryVectorSelectionWidgetCreator() ); diff --git a/ApplicationLibCode/Commands/SurfaceCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/SurfaceCommands/CMakeLists_files.cmake index 3377f29986..63e20f2e9b 100644 --- a/ApplicationLibCode/Commands/SurfaceCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/SurfaceCommands/CMakeLists_files.cmake @@ -1,36 +1,32 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportSurfacesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicReloadSurfaceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCopySurfaceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewGridCaseSurfaceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportKLayerToPtlFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicExportSurfaceToTsurfFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewSurfaceCollectionFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportSurfacesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicReloadSurfaceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCopySurfaceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewGridCaseSurfaceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportKLayerToPtlFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicExportSurfaceToTsurfFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewSurfaceCollectionFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportSurfacesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicReloadSurfaceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCopySurfaceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewGridCaseSurfaceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportKLayerToPtlFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExportSurfaceToTsurfFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewSurfaceCollectionFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportSurfacesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicReloadSurfaceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCopySurfaceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewGridCaseSurfaceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportKLayerToPtlFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExportSurfaceToTsurfFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewSurfaceCollectionFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -#set (COMMAND_QT_MOC_HEADERS -#${COMMAND_QT_MOC_HEADERS} -#${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h -#) +# set (COMMAND_QT_MOC_HEADERS ${COMMAND_QT_MOC_HEADERS} +# ${CMAKE_CURRENT_LIST_DIR}/RicTextAnnotation3dEditor.h ) - -source_group( "CommandFeature\\SurfaceCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\SurfaceCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/ToggleCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/ToggleCommands/CMakeLists_files.cmake index 05a4eddcec..2aa14ec6de 100644 --- a/ApplicationLibCode/Commands/ToggleCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/ToggleCommands/CMakeLists_files.cmake @@ -1,30 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOffFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnOthersOffFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCollapseSiblingsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicMoveItemsToTopFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOffFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnOthersOffFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCollapseSiblingsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicMoveItemsToTopFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOffFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnOthersOffFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCollapseSiblingsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMoveItemsToTopFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOffFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicToggleItemsOnOthersOffFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCollapseSiblingsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMoveItemsToTopFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\ToggleItems" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\ToggleItems" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/ViewLink/CMakeLists_files.cmake b/ApplicationLibCode/Commands/ViewLink/CMakeLists_files.cmake index c8c5d91265..ad5911aa3e 100644 --- a/ApplicationLibCode/Commands/ViewLink/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/ViewLink/CMakeLists_files.cmake @@ -1,36 +1,35 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeatureUi.h -${CMAKE_CURRENT_LIST_DIR}/RicShowAllLinkedViewsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicLinkViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeatureUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowAllLinkedViewsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicLinkViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeatureUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowAllLinkedViewsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicLinkViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicLinkVisibleViewsFeatureUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowAllLinkedViewsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicLinkViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicUnLinkViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowLinkOptionsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteAllLinkedViewsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicSetMasterViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicRemoveComparison3dViewFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCompareTo3dViewFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\ViewLink" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\ViewLink" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake index 237500ff06..84d957aec4 100644 --- a/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/WellLogCommands/CMakeLists_files.cmake @@ -1,70 +1,71 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddWellLogToPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogCurveExtractionFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogRftCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewRftPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPltPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogFileCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotTrackFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotCurveFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicWellLogsImportFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotTrackFeatureImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogTrackFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicChangeDataSourceFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportWellLogPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellLogFileCloseFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicMoveWellLogFilesFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogFileCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogRftCurveFeature.h -${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurveDeleteFeature.h -${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurvePickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellBoreStabilityPlotFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellMeasurementCurveFeature.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddWellLogToPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogCurveExtractionFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogRftCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewRftPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPltPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogFileCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotTrackFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotCurveFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogsImportFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotTrackFeatureImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogTrackFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicChangeDataSourceFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportWellLogPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogFileCloseFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicMoveWellLogFilesFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogFileCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogRftCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurveDeleteFeature.h + ${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurvePickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellBoreStabilityPlotFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellMeasurementCurveFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleWellLogCurveSetFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicAddWellLogToPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogCurveExtractionFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogRftCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewRftPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPltPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogFileCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotTrackFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotCurveFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellLogsImportFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotTrackFeatureImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogTrackFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicChangeDataSourceFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportWellLogPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellLogFileCloseFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicMoveWellLogFilesFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogFileCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogRftCurveFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurveDeleteFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurvePickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellBoreStabilityPlotFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellMeasurementCurveFeature.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicAddWellLogToPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogCurveExtractionFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogRftCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewRftPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPltPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogFileCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellLogPlotTrackFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotCurveFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogsImportFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteSubPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogPlotTrackFeatureImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogTrackFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteWellLogPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicChangeDataSourceFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAsciiExportWellLogPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellLogFileCloseFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicMoveWellLogFilesFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogFileCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAdd3dWellLogRftCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurveDeleteFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/Ric3dWellLogCurvePickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellBoreStabilityPlotFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellMeasurementCurveFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewEnsembleWellLogCurveSetFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "CommandFeature\\WellLog" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\WellLog" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.cpp b/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.cpp new file mode 100644 index 0000000000..ac990ccdcf --- /dev/null +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.cpp @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2015- Statoil ASA +// Copyright (C) 2015- Ceetron Solutions AS +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicNewEnsembleWellLogCurveSetFeature.h" + +#include "RimEnsembleWellLogCurveSet.h" +#include "RimWellLogTrack.h" + +#include "RiuPlotMainWindow.h" +#include "RiuPlotMainWindowTools.h" + +#include "cafSelectionManager.h" + +#include + +#include + +CAF_CMD_SOURCE_INIT( RicNewEnsembleWellLogCurveSetFeature, "RicNewEnsembleWellLogCurveSetFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicNewEnsembleWellLogCurveSetFeature::isCommandEnabled() +{ + return caf::SelectionManager::instance()->selectedItemOfType() != nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewEnsembleWellLogCurveSetFeature::onActionTriggered( bool isChecked ) +{ + RimWellLogTrack* wellLogPlotTrack = caf::SelectionManager::instance()->selectedItemOfType(); + if ( wellLogPlotTrack ) + { + RimEnsembleWellLogCurveSet* curveSet = new RimEnsembleWellLogCurveSet(); + wellLogPlotTrack->setEnsembleWellLogCurveSet( curveSet ); + wellLogPlotTrack->updateEditors(); + RiuPlotMainWindowTools::selectAsCurrentItem( curveSet ); + } + RiuPlotMainWindowTools::refreshToolbars(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicNewEnsembleWellLogCurveSetFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "New Ensemble Well Log Curve Set" ); + actionToSetup->setIcon( QIcon( ":/EnsembleCurveSet16x16.png" ) ); +} diff --git a/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.h b/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.h new file mode 100644 index 0000000000..c4b8148378 --- /dev/null +++ b/ApplicationLibCode/Commands/WellLogCommands/RicNewEnsembleWellLogCurveSetFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Eqinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicNewEnsembleWellLogCurveSetFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +private: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/CMakeLists_files.cmake b/ApplicationLibCode/Commands/WellPathCommands/CMakeLists_files.cmake index 1eb7525036..90e939a2f7 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/Commands/WellPathCommands/CMakeLists_files.cmake @@ -1,76 +1,90 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportWellPaths.h -${CMAKE_CURRENT_LIST_DIR}/RicNewEditableWellPathFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicShowWellPlanFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathListTargetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathAttributeFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathTargetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathAttributeFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsImpl.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsUi.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicCreateWellTargetsPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFormationsImportFileFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicPolylineTargetsPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineTargetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicDeletePolylineTargetFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicImportWellMeasurementsFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralAtDepthFeature.h -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralFeature.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/Ric3dObjectEditorHandle.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportWellPaths.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewEditableWellPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicShowWellPlanFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathListTargetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathAttributeFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathTargetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathAttributeFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsImpl.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateWellTargetsPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFormationsImportFileFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPolylineTargetsPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineTargetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicDeletePolylineTargetFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicImportWellMeasurementsFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralAtDepthFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicPasteModeledWellPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleWellPathLaterals.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleWellPathLateralsUi.h + ${CMAKE_CURRENT_LIST_DIR}/RicLinkWellPathFeature.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/Ric3dObjectEditorHandle.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/RicAppendPointsToPolygonFilterFeature.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RicImportWellPaths.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewEditableWellPathFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicShowWellPlanFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathListTargetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathAttributeFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathTargetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathAttributeFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsImpl.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicCreateWellTargetsPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicIntersectionPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicWellPathFormationsImportFileFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicPolylineTargetsPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineTargetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicDeletePolylineTargetFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicImportWellMeasurementsFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralAtDepthFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralFeature.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/Ric3dObjectEditorHandle.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.cpp -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RicImportWellPaths.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewEditableWellPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicShowWellPlanFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathListTargetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathAttributeFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathTargetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathAttributeFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeleteWellPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsImpl.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathsUnitSystemSettingsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateWellTargetsPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicIntersectionPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicWellPathFormationsImportFileFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPolylineTargetsPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewPolylineTargetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicDeletePolylineTargetFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicImportWellMeasurementsFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralAtDepthFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicNewWellPathLateralFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicPasteModeledWellPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleWellPathLaterals.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleWellPathLateralsUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicLinkWellPathFeature.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/Ric3dObjectEditorHandle.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.cpp + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicAppendPointsToPolygonFilterFeature.cpp ) -list(APPEND COMMAND_CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND COMMAND_CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND COMMAND_CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND COMMAND_CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.h -${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.h +list( + APPEND + COMMAND_QT_MOC_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPointTangentManipulator.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellTarget3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicWellPathGeometry3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolyline3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/PointTangentManipulator/RicPolylineTarget3dEditor.h + ${CMAKE_CURRENT_LIST_DIR}/RicCreateMultipleWellPathLaterals.h ) -source_group( "CommandFeature\\WellPath" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "CommandFeature\\WellPath" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.cpp b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.cpp index a3a667a18e..e7f9325ba8 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.cpp @@ -79,6 +79,14 @@ void RicPointTangentManipulator::setHandleSize( double handleSize ) m_partManager->setHandleSize( handleSize ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPointTangentManipulator::setPolyline( const std::vector& polyline ) +{ + m_partManager->setPolyline( polyline ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -94,7 +102,7 @@ bool RicPointTangentManipulator::eventFilter( QObject* obj, QEvent* inputEvent ) { if ( inputEvent->type() == QEvent::MouseButtonPress ) { - QMouseEvent* mouseEvent = static_cast( inputEvent ); + auto* mouseEvent = static_cast( inputEvent ); if ( mouseEvent->button() == Qt::LeftButton ) { @@ -119,7 +127,7 @@ bool RicPointTangentManipulator::eventFilter( QObject* obj, QEvent* inputEvent ) { if ( m_partManager->isManipulatorActive() ) { - QMouseEvent* mouseEvent = static_cast( inputEvent ); + auto* mouseEvent = static_cast( inputEvent ); cvf::ref rayIs = m_viewer->rayIntersectSpecFromWindowCoordinates( mouseEvent->pos().x(), diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.h b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.h index 4a23514af2..e7b2dd60b6 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.h +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulator.h @@ -55,6 +55,7 @@ class RicPointTangentManipulator : public QObject void setOrigin( const cvf::Vec3d& origin ); void setTangent( const cvf::Vec3d& tangent ); void setHandleSize( double handleSize ); + void setPolyline( const std::vector& polyline ); void appendPartsToModel( cvf::ModelBasicList* model ); diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp index 732d30d8b3..a9fdaf08d4 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.cpp @@ -15,6 +15,7 @@ // for more details. // ///////////////////////////////////////////////////////////////////////////////// + #include "RicPointTangentManipulatorPartMgr.h" #include "RivPartPriority.h" @@ -36,17 +37,16 @@ #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfRay.h" +#include "cvfGeometryTools.h" #include "cvfMath.h" -#include - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RicPointTangentManipulatorPartMgr::RicPointTangentManipulatorPartMgr() : m_tangentOnStartManipulation( cvf::Vec3d::UNDEFINED ) , m_originOnStartManipulation( cvf::Vec3d::UNDEFINED ) - , m_activeHandle( NONE ) + , m_activeHandle( HandleType::NONE ) , m_handleSize( 1.0 ) , m_isGeometryUpdateNeeded( true ) { @@ -104,12 +104,20 @@ void RicPointTangentManipulatorPartMgr::originAndTangent( cvf::Vec3d* origin, cv *tangent = m_tangent; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPointTangentManipulatorPartMgr::setPolyline( const std::vector& polyline ) +{ + m_polyline = polyline; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- bool RicPointTangentManipulatorPartMgr::isManipulatorActive() const { - return m_activeHandle != NONE; + return m_activeHandle != HandleType::NONE; } //-------------------------------------------------------------------------------------------------- @@ -172,7 +180,37 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray { if ( !isManipulatorActive() ) return; - if ( m_activeHandle == HORIZONTAL_PLANE ) + if ( m_activeHandle == HandleType::PRESCRIBED_POLYLINE ) + { + cvf::Plane plane; + plane.setFromPointAndNormal( m_origin, newMouseRay->direction() ); + cvf::Vec3d newIntersection; + newMouseRay->planeIntersect( plane, &newIntersection ); + + const cvf::Vec3d newOrigin = m_originOnStartManipulation + ( newIntersection - m_initialPickPoint ); + + double closestDistance = std::numeric_limits::max(); + cvf::Vec3d closestPoint; + + for ( size_t i = 1; i < m_polyline.size(); i++ ) + { + const auto& p1 = m_polyline[i]; + const auto& p2 = m_polyline[i - 1]; + + double normalizedIntersection; + const auto pointOnLine = cvf::GeometryTools::projectPointOnLine( p1, p2, newOrigin, &normalizedIntersection ); + + const double candidateDistance = pointOnLine.pointDistanceSquared( newOrigin ); + if ( candidateDistance < closestDistance ) + { + closestDistance = candidateDistance; + closestPoint = pointOnLine; + } + } + + m_origin = closestPoint; + } + else if ( m_activeHandle == HandleType::HORIZONTAL_PLANE ) { cvf::Plane plane; plane.setFromPointAndNormal( m_origin, cvf::Vec3d::Z_AXIS ); @@ -183,7 +221,7 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray m_origin = newOrigin; } - else if ( m_activeHandle == VERTICAL_AXIS ) + else if ( m_activeHandle == HandleType::VERTICAL_AXIS ) { cvf::Plane plane; cvf::Vec3d planeNormal = ( newMouseRay->direction() ^ cvf::Vec3d::Z_AXIS ) ^ cvf::Vec3d::Z_AXIS; @@ -201,7 +239,6 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray m_origin = newOrigin; } - // m_tangent = newTangent; m_isGeometryUpdateNeeded = true; } @@ -211,7 +248,7 @@ void RicPointTangentManipulatorPartMgr::updateManipulatorFromRay( const cvf::Ray //-------------------------------------------------------------------------------------------------- void RicPointTangentManipulatorPartMgr::endManipulator() { - m_activeHandle = NONE; + m_activeHandle = HandleType::NONE; } //-------------------------------------------------------------------------------------------------- @@ -219,8 +256,15 @@ void RicPointTangentManipulatorPartMgr::endManipulator() //-------------------------------------------------------------------------------------------------- void RicPointTangentManipulatorPartMgr::recreateAllGeometryAndParts() { - createHorizontalPlaneHandle(); - createVerticalAxisHandle(); + if ( m_polyline.empty() ) + { + createHorizontalPlaneHandle(); + createVerticalAxisHandle(); + } + else + { + createPolylineHandle(); + } } //-------------------------------------------------------------------------------------------------- @@ -228,8 +272,15 @@ void RicPointTangentManipulatorPartMgr::recreateAllGeometryAndParts() //-------------------------------------------------------------------------------------------------- void RicPointTangentManipulatorPartMgr::createGeometryOnly() { - m_handleParts[HORIZONTAL_PLANE]->setDrawable( createHorizontalPlaneGeo().p() ); - m_handleParts[VERTICAL_AXIS]->setDrawable( createVerticalAxisGeo().p() ); + if ( m_polyline.empty() ) + { + m_handleParts[HandleType::HORIZONTAL_PLANE]->setDrawable( createHorizontalPlaneGeo().p() ); + m_handleParts[HandleType::VERTICAL_AXIS]->setDrawable( createVerticalAxisGeo().p() ); + } + else + { + m_handleParts[HandleType::PRESCRIBED_POLYLINE]->setDrawable( createPolylineGeo().p() ); + } } //-------------------------------------------------------------------------------------------------- @@ -241,7 +292,7 @@ void RicPointTangentManipulatorPartMgr::createHorizontalPlaneHandle() ref geo = createHorizontalPlaneGeo(); - HandleType handleId = HORIZONTAL_PLANE; + HandleType handleId = HandleType::HORIZONTAL_PLANE; cvf::Color4f color = cvf::Color4f( 1.0f, 0.0f, 1.0f, 0.7f ); cvf::String partName( "PointTangentManipulator Horizontal Plane Handle" ); @@ -318,7 +369,7 @@ void RicPointTangentManipulatorPartMgr::createVerticalAxisHandle() using namespace cvf; cvf::ref geo = createVerticalAxisGeo(); - HandleType handleId = VERTICAL_AXIS; + HandleType handleId = HandleType::VERTICAL_AXIS; cvf::Color4f color = cvf::Color4f( 0.0f, 0.7f, 0.8f, 0.7f ); cvf::String partName( "PointTangentManipulator Vertical Axis Handle" ); @@ -362,6 +413,42 @@ cvf::ref RicPointTangentManipulatorPartMgr::createVerticalAxis return createIndexedTriangelDrawableGeo( vertexArray.p(), indexArray.p() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPointTangentManipulatorPartMgr::createPolylineHandle() +{ + cvf::ref geo = createPolylineGeo(); + + HandleType handleId = HandleType::PRESCRIBED_POLYLINE; + cvf::Color4f color = cvf::Color4f( 0.8f, 0.7f, 0.8f, 0.7f ); + cvf::String partName( "PointTangentManipulator Polyline Handle" ); + + addHandlePart( geo.p(), color, handleId, partName ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RicPointTangentManipulatorPartMgr::createPolylineGeo() +{ + using namespace cvf; + + cvf::ref geomBuilder = new cvf::GeometryBuilderTriangles; + + double radius = m_handleSize * 0.3; + cvf::GeometryUtils::createSphere( radius, 10, 10, geomBuilder.p() ); + + Vec3f origin( m_origin ); + + geomBuilder->transformVertexRange( 0, geomBuilder->vertexCount() - 1, cvf::Mat4f::fromTranslation( origin ) ); + + cvf::ref vertexArray = geomBuilder->vertices(); + cvf::ref indexArray = geomBuilder->triangles(); + + return createIndexedTriangelDrawableGeo( vertexArray.p(), indexArray.p() ); +} + #if 0 //-------------------------------------------------------------------------------------------------- /// diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h index d339749496..96379d9ddb 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicPointTangentManipulatorPartMgr.h @@ -38,18 +38,19 @@ class String; template class Array; -typedef Array Vec3fArray; -typedef Array UIntArray; +using Vec3fArray = Array; +using UIntArray = Array; } // namespace cvf class RicPointTangentManipulatorPartMgr : public cvf::Object { public: - enum HandleType + enum class HandleType { HORIZONTAL_PLANE, VERTICAL_AXIS, + PRESCRIBED_POLYLINE, AZIMUTH, INCLINATION, NONE @@ -63,6 +64,7 @@ class RicPointTangentManipulatorPartMgr : public cvf::Object void setTangent( const cvf::Vec3d& tangent ); void setHandleSize( double handleSize ); void originAndTangent( cvf::Vec3d* origin, cvf::Vec3d* tangent ); + void setPolyline( const std::vector& polyline ); bool isManipulatorActive() const; void tryToActivateManipulator( const cvf::HitItem* hitItem ); @@ -81,6 +83,9 @@ class RicPointTangentManipulatorPartMgr : public cvf::Object void createVerticalAxisHandle(); cvf::ref createVerticalAxisGeo(); + void createPolylineHandle(); + cvf::ref createPolylineGeo(); + void addHandlePart( cvf::DrawableGeo* geo, const cvf::Color4f& color, HandleType handleId, const cvf::String& partName ); void addActiveModePart( cvf::DrawableGeo* geo, const cvf::Color4f& color, HandleType handleId, const cvf::String& partName ); @@ -99,6 +104,8 @@ class RicPointTangentManipulatorPartMgr : public cvf::Object double m_handleSize; bool m_isGeometryUpdateNeeded; + std::vector m_polyline; + HandleType m_activeHandle; cvf::Vec3d m_initialPickPoint; cvf::Vec3d m_tangentOnStartManipulation; diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.cpp b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.cpp index c0d8b6b2e3..e283bbd8e4 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.cpp @@ -20,11 +20,16 @@ #include "RicPointTangentManipulator.h" +#include "RigWellPath.h" + +#include "Rim2dIntersectionView.h" #include "Rim3dView.h" #include "RimCase.h" #include "RimModeledWellPath.h" #include "RimWellPathGeometryDef.h" +#include "RimWellPathGeometryDefTools.h" #include "RimWellPathTarget.h" +#include "RimWellPathTieIn.h" #include "RiuViewer.h" @@ -49,7 +54,7 @@ RicWellTarget3dEditor::RicWellTarget3dEditor() //-------------------------------------------------------------------------------------------------- RicWellTarget3dEditor::~RicWellTarget3dEditor() { - RiuViewer* ownerRiuViewer = dynamic_cast( ownerViewer() ); + auto* ownerRiuViewer = dynamic_cast( ownerViewer() ); if ( m_cvfModel.notNull() && ownerRiuViewer ) { @@ -57,14 +62,7 @@ RicWellTarget3dEditor::~RicWellTarget3dEditor() ownerRiuViewer->removeStaticModel( m_cvfModel.p() ); } - RimWellPathTarget* oldTarget = dynamic_cast( this->pdmObject() ); - if ( oldTarget ) - { - oldTarget->m_targetType.uiCapability()->removeFieldEditor( this ); - oldTarget->m_targetPoint.uiCapability()->removeFieldEditor( this ); - oldTarget->m_azimuth.uiCapability()->removeFieldEditor( this ); - oldTarget->m_inclination.uiCapability()->removeFieldEditor( this ); - } + removeAllFieldEditors(); delete m_manipulator; } @@ -74,9 +72,13 @@ RicWellTarget3dEditor::~RicWellTarget3dEditor() //-------------------------------------------------------------------------------------------------- void RicWellTarget3dEditor::configureAndUpdateUi( const QString& uiConfigName ) { - RimWellPathTarget* target = dynamic_cast( this->pdmObject() ); - RiuViewer* ownerRiuViewer = dynamic_cast( ownerViewer() ); - Rim3dView* view = mainOrComparisonView(); + auto* target = dynamic_cast( this->pdmObject() ); + auto* ownerRiuViewer = dynamic_cast( ownerViewer() ); + Rim3dView* view = mainOrComparisonView(); + + // TODO: The location of the well target must be updated before displayed in the 2D intersection view. Currently + // disabled. + if ( dynamic_cast( view ) ) return; if ( !target || !target->isEnabled() || !view ) { @@ -88,10 +90,10 @@ void RicWellTarget3dEditor::configureAndUpdateUi( const QString& uiConfigName ) RimWellPathGeometryDef* geomDef; target->firstAncestorOrThisOfTypeAsserted( geomDef ); - target->m_targetType.uiCapability()->addFieldEditor( this ); - target->m_targetPoint.uiCapability()->addFieldEditor( this ); - target->m_azimuth.uiCapability()->addFieldEditor( this ); - target->m_inclination.uiCapability()->addFieldEditor( this ); + for ( auto field : target->fieldsFor3dManipulator() ) + { + field->uiCapability()->addFieldEditor( this ); + } if ( m_manipulator.isNull() ) { @@ -116,6 +118,29 @@ void RicWellTarget3dEditor::configureAndUpdateUi( const QString& uiConfigName ) m_manipulator->setTangent( target->tangent() ); m_manipulator->setHandleSize( handleSize ); + { + RimWellPath* wellPath = nullptr; + target->firstAncestorOrThisOfType( wellPath ); + + if ( wellPath && !wellPath->isTopLevelWellPath() && geomDef->firstActiveTarget() == target ) + { + if ( auto parentWellPath = wellPath->wellPathTieIn()->parentWell() ) + { + auto geo = parentWellPath->wellPathGeometry(); + auto points = geo->wellPathPoints(); + + for ( auto& p : points ) + { + p = dispXf->transformToDisplayCoord( p ); + } + + // For the first target of a lateral, use the coordinates from the parent well as snap-to locations for + // the 3D manipulator sphere + m_manipulator->setPolyline( points ); + } + } + } + m_cvfModel->removeAllParts(); m_manipulator->appendPartsToModel( m_cvfModel.p() ); @@ -127,14 +152,7 @@ void RicWellTarget3dEditor::configureAndUpdateUi( const QString& uiConfigName ) //-------------------------------------------------------------------------------------------------- void RicWellTarget3dEditor::cleanupBeforeSettingPdmObject() { - RimWellPathTarget* oldTarget = dynamic_cast( this->pdmObject() ); - if ( oldTarget ) - { - oldTarget->m_targetType.uiCapability()->removeFieldEditor( this ); - oldTarget->m_targetPoint.uiCapability()->removeFieldEditor( this ); - oldTarget->m_azimuth.uiCapability()->removeFieldEditor( this ); - oldTarget->m_inclination.uiCapability()->removeFieldEditor( this ); - } + removeAllFieldEditors(); } //-------------------------------------------------------------------------------------------------- @@ -142,26 +160,168 @@ void RicWellTarget3dEditor::cleanupBeforeSettingPdmObject() //-------------------------------------------------------------------------------------------------- void RicWellTarget3dEditor::slotUpdated( const cvf::Vec3d& origin, const cvf::Vec3d& tangent ) { - RimWellPathTarget* target = dynamic_cast( this->pdmObject() ); - Rim3dView* view = mainOrComparisonView(); + auto* manipulatedTarget = dynamic_cast( this->pdmObject() ); + Rim3dView* view = mainOrComparisonView(); - if ( !target || !view ) + if ( !manipulatedTarget || !view ) { return; } - cvf::ref dispXf = view->displayCoordTransform(); - RimWellPathGeometryDef* geomDef; - target->firstAncestorOrThisOfTypeAsserted( geomDef ); + manipulatedTarget->firstAncestorOrThisOfTypeAsserted( geomDef ); + if ( !geomDef ) return; + + RimModeledWellPath* modeledWellPath = nullptr; + geomDef->firstAncestorOfType( modeledWellPath ); + + cvf::Vec3d domainCoordXYZ; // domain coordinate of the new location + cvf::Vec3d deltaManipulatorMovement; // delta change relative current location of target + cvf::Vec3d relativePositionXYZ; // position of well target relative to anchor point + { + cvf::ref dispXf = view->displayCoordTransform(); + domainCoordXYZ = dispXf->transformToDomainCoord( origin ); + + relativePositionXYZ = domainCoordXYZ - geomDef->anchorPointXyz(); + deltaManipulatorMovement = manipulatedTarget->targetPointXYZ() - relativePositionXYZ; + } + + if ( geomDef->activeWellTargets().front() == manipulatedTarget ) + { + // The first well target of a lateral is the tie-in well target + + if ( modeledWellPath && modeledWellPath->wellPathTieIn() && modeledWellPath->wellPathTieIn()->parentWell() ) + { + auto parentWell = modeledWellPath->wellPathTieIn()->parentWell(); + auto wellPathGeo = parentWell->wellPathGeometry(); + auto closestMD = wellPathGeo->closestMeasuredDepth( domainCoordXYZ ); + + modeledWellPath->wellPathTieIn()->setTieInMeasuredDepth( closestMD ); + modeledWellPath->wellPathTieIn()->updateChildWellGeometry(); + } + + bool modifyAllTargetsOnAllWells = ( ( QApplication::keyboardModifiers() & Qt::ControlModifier ) && + ( QApplication::keyboardModifiers() & Qt::SHIFT ) ); + + if ( modifyAllTargetsOnAllWells ) + { + for ( auto wellLateral : modeledWellPath->wellPathLaterals() ) + { + if ( auto modeledLateral = dynamic_cast( wellLateral ) ) + { + auto activeTargets = modeledLateral->geometryDefinition()->activeWellTargets(); + for ( auto t : activeTargets ) + { + if ( t == activeTargets.front() ) continue; + if ( t == manipulatedTarget ) continue; + + // Does not work very well + // Must update the tie-in MD also + updateTargetWithDeltaChange( t, deltaManipulatorMovement ); + } + } + } + } + + if ( QApplication::keyboardModifiers() & Qt::ControlModifier ) + { + for ( auto target : geomDef->activeWellTargets() ) + { + if ( target == geomDef->activeWellTargets().front() ) continue; + + updateTargetWithDeltaChange( target, deltaManipulatorMovement ); + } + } + + cvf::Vec3d relativePositionXYD = relativePositionXYZ; + relativePositionXYD.z() = -relativePositionXYD.z(); + + manipulatedTarget->updateFrom3DManipulator( relativePositionXYD ); + + return; + } - cvf::Vec3d domainOrigin = dispXf->transformToDomainCoord( origin ) - geomDef->anchorPointXyz(); - domainOrigin.z() = -domainOrigin.z(); - QVariant originVariant = caf::PdmValueFieldSpecialization::convert( domainOrigin ); + if ( modeledWellPath && modeledWellPath->isTopLevelWellPath() ) + { + // Modification of top level well path + + bool modifyReferencePoint = ( ( QApplication::keyboardModifiers() & Qt::ControlModifier ) && + ( QApplication::keyboardModifiers() & Qt::SHIFT ) ); + if ( modifyReferencePoint ) + { + // Find all linked wells and update reference point with delta change + std::vector linkedWellPathGeoDefs; + if ( geomDef->isReferencePointUpdatesLinked() ) + { + linkedWellPathGeoDefs = RimWellPathGeometryDefTools::linkedDefinitions(); + } + else + { + linkedWellPathGeoDefs.push_back( geomDef ); + } + + RimWellPathGeometryDefTools::updateLinkedGeometryDefinitions( linkedWellPathGeoDefs, deltaManipulatorMovement ); + + return; + } + + bool modifyAllTargetOnWell = ( QApplication::keyboardModifiers() & Qt::ControlModifier ); + if ( modifyAllTargetOnWell ) + { + for ( auto t : geomDef->activeWellTargets() ) + { + if ( t == manipulatedTarget ) continue; + + updateTargetWithDeltaChange( t, deltaManipulatorMovement ); + } + } + } + else if ( modeledWellPath && !modeledWellPath->isTopLevelWellPath() ) + { + bool modifyAllTargetsOnAllWells = ( ( QApplication::keyboardModifiers() & Qt::ControlModifier ) && + ( QApplication::keyboardModifiers() & Qt::SHIFT ) ); + if ( modifyAllTargetsOnAllWells ) + { + // Update all well targets on all connected laterals + + for ( auto wellLateral : modeledWellPath->wellPathLaterals() ) + { + if ( auto modeledLateral = dynamic_cast( wellLateral ) ) + { + auto activeTargets = modeledLateral->geometryDefinition()->activeWellTargets(); + for ( auto t : activeTargets ) + { + if ( t == activeTargets.front() ) continue; + if ( t == manipulatedTarget ) continue; + + updateTargetWithDeltaChange( t, deltaManipulatorMovement ); + } + } + } + } + + bool modifyAllTargets = ( QApplication::keyboardModifiers() & Qt::ControlModifier ); + if ( modifyAllTargets ) + { + // Update all well targets on current well path + + for ( auto t : geomDef->activeWellTargets() ) + { + if ( t == geomDef->activeWellTargets().front() ) continue; + if ( t == manipulatedTarget ) continue; + + updateTargetWithDeltaChange( t, deltaManipulatorMovement ); + } + } + } - target->enableFullUpdate( false ); - caf::PdmUiCommandSystemProxy::instance()->setUiValueToField( target->m_targetPoint.uiCapability(), originVariant ); - target->enableFullUpdate( true ); + // Modify a single well target + { + cvf::Vec3d relativePositionXYD = relativePositionXYZ; + relativePositionXYD.z() = -relativePositionXYD.z(); + + manipulatedTarget->updateFrom3DManipulator( relativePositionXYD ); + } } //-------------------------------------------------------------------------------------------------- @@ -169,7 +329,7 @@ void RicWellTarget3dEditor::slotUpdated( const cvf::Vec3d& origin, const cvf::Ve //-------------------------------------------------------------------------------------------------- void RicWellTarget3dEditor::slotSelectedIn3D() { - RimWellPathTarget* target = dynamic_cast( this->pdmObject() ); + auto* target = dynamic_cast( this->pdmObject() ); if ( !target ) { return; @@ -183,7 +343,7 @@ void RicWellTarget3dEditor::slotSelectedIn3D() //-------------------------------------------------------------------------------------------------- void RicWellTarget3dEditor::slotDragFinished() { - RimWellPathTarget* target = dynamic_cast( this->pdmObject() ); + auto* target = dynamic_cast( this->pdmObject() ); if ( !target ) { return; @@ -191,3 +351,27 @@ void RicWellTarget3dEditor::slotDragFinished() target->onMoved(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicWellTarget3dEditor::removeAllFieldEditors() +{ + if ( auto* oldTarget = dynamic_cast( this->pdmObject() ) ) + { + for ( auto field : oldTarget->fieldsFor3dManipulator() ) + { + field->uiCapability()->removeFieldEditor( this ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicWellTarget3dEditor::updateTargetWithDeltaChange( RimWellPathTarget* target, const cvf::Vec3d& delta ) +{ + auto coordXYZ = target->targetPointXYZ() - delta; + target->setPointXYZ( coordXYZ ); + target->updateConnectedEditors(); +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.h b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.h index 4017843381..3b46859cd3 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.h +++ b/ApplicationLibCode/Commands/WellPathCommands/PointTangentManipulator/RicWellTarget3dEditor.h @@ -20,18 +20,20 @@ #include "Ric3dObjectEditorHandle.h" -class RicPointTangentManipulator; - #include "cvfObject.h" #include "cvfVector3.h" +#include + +class RicPointTangentManipulator; +class RimWellPathTarget; + namespace cvf { class ModelBasicList; } class QString; -#include class RicWellTarget3dEditor : public Ric3dObjectEditorHandle { @@ -50,6 +52,11 @@ private slots: void slotSelectedIn3D(); void slotDragFinished(); +private: + void removeAllFieldEditors(); + + static void updateTargetWithDeltaChange( RimWellPathTarget* target, const cvf::Vec3d& delta ); + private: QPointer m_manipulator; cvf::ref m_cvfModel; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.cpp new file mode 100644 index 0000000000..2b986fd7f5 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.cpp @@ -0,0 +1,89 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicAppendPointsToPolygonFilterFeature.h" + +CAF_CMD_SOURCE_INIT( RicAppendPointsToPolygonFilterFeature, "RicAppendPointsToPolygonFilterFeature" ); + +#include "RimPolygonFilter.h" +#include "RimPolylineTarget.h" + +#include "OperationsUsingObjReferences/RicPasteFeatureImpl.h" + +#include "cafSelectionManager.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicAppendPointsToPolygonFilterFeature::isCommandEnabled() +{ + caf::PdmObject* selectedObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !selectedObject ) return false; + + RimPolygonFilter* polygonFilter = nullptr; + selectedObject->firstAncestorOrThisOfType( polygonFilter ); + + return ( polygonFilter != nullptr ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicAppendPointsToPolygonFilterFeature::onActionTriggered( bool isChecked ) +{ + caf::PdmObject* selectedObject = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + if ( !selectedObject ) return; + + RimPolygonFilter* polygonFilter = nullptr; + selectedObject->firstAncestorOrThisOfType( polygonFilter ); + if ( !polygonFilter ) return; + + QStringList listOfThreeDoubles; + + QClipboard* clipboard = QApplication::clipboard(); + if ( clipboard ) + { + QString content = clipboard->text(); + listOfThreeDoubles = content.split( "\n", QString::SkipEmptyParts ); + } + + std::vector points; + caf::PdmValueFieldSpecialization>::setFromVariant( listOfThreeDoubles, points ); + + for ( const auto& p : points ) + { + auto newTarget = new RimPolylineTarget; + newTarget->setAsPointTargetXYD( p ); + polygonFilter->insertTarget( nullptr, newTarget ); + } + + polygonFilter->updateEditorsAndVisualization(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicAppendPointsToPolygonFilterFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Append Points from Clipboard" ); + + RicPasteFeatureImpl::setIconAndShortcuts( actionToSetup ); +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.h b/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.h new file mode 100644 index 0000000000..6497249e30 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicAppendPointsToPolygonFilterFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicAppendPointsToPolygonFilterFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.cpp new file mode 100644 index 0000000000..2f95de8917 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.cpp @@ -0,0 +1,226 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateMultipleWellPathLaterals.h" + +#include "RicNewWellPathLateralAtDepthFeature.h" + +#include "RigWellPath.h" + +#include "RimModeledWellPath.h" +#include "RimProject.h" +#include "RimTools.h" +#include "RimWellPathCollection.h" +#include "RimWellPathCompletions.h" +#include "RimWellPathGeometryDef.h" +#include "RimWellPathTarget.h" +#include "RimWellPathTieIn.h" + +#include "Riu3DMainWindowTools.h" + +#include "cafPdmUiPropertyViewDialog.h" +#include "cafSelectionManager.h" +#include "cafSelectionManagerTools.h" + +#include +#include +#include + +#include + +CAF_CMD_SOURCE_INIT( RicCreateMultipleWellPathLaterals, "RicCreateMultipleWellPathLaterals" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicCreateMultipleWellPathLaterals::isCommandEnabled() +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLaterals::onActionTriggered( bool isChecked ) +{ + m_ui = std::make_unique(); + + if ( m_ui.get() == nullptr ) m_ui = std::make_unique(); + + auto selected = dynamic_cast( caf::SelectionManager::instance()->selectedItem() ); + + if ( selected ) + { + m_ui->setTopLevelWellPath( selected->topLevelWellPath() ); + + double startMD = 0.0; + double endMD = 0.0; + + auto sourceLateral = m_ui->sourceLateral(); + if ( sourceLateral ) + { + if ( auto tieIn = sourceLateral->wellPathTieIn() ) + { + startMD = sourceLateral->wellPathTieIn()->tieInMeasuredDepth() + 50.0; + endMD = startMD + 50.0; + + if ( auto parentWell = sourceLateral->wellPathTieIn()->parentWell() ) + { + if ( !parentWell->wellPathGeometry()->measuredDepths().empty() ) + { + double candidate = parentWell->wellPathGeometry()->measuredDepths().back() - 50.0; + + if ( candidate > startMD ) endMD = candidate; + } + } + } + } + + m_ui->setDefaultValues( startMD, endMD ); + } + + { + caf::PdmUiPropertyViewDialog propertyDialog( Riu3DMainWindowTools::mainWindowWidget(), + m_ui.get(), + "Create Multiple Well Path Laterals", + "" ); + + propertyDialog.resize( QSize( 700, 450 ) ); + + QDialogButtonBox* dialogButtonBox = propertyDialog.dialogButtonBox(); + + dialogButtonBox->clear(); + + { + QPushButton* pushButton = dialogButtonBox->addButton( "Create Laterals", QDialogButtonBox::ActionRole ); + connect( pushButton, SIGNAL( clicked() ), this, SLOT( slotAppendFractures() ) ); + pushButton->setDefault( false ); + pushButton->setAutoDefault( false ); + pushButton->setToolTip( "Add new fractures" ); + } + + { + QPushButton* pushButton = dialogButtonBox->addButton( "Close", QDialogButtonBox::ActionRole ); + connect( pushButton, SIGNAL( clicked() ), &propertyDialog, SLOT( close() ) ); + pushButton->setDefault( false ); + pushButton->setAutoDefault( false ); + } + + propertyDialog.exec(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLaterals::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Create Multiple Well Path Laterals" ); + actionToSetup->setIcon( QIcon( ":/Well.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLaterals::slotAppendFractures() +{ + RimModeledWellPath* sourceLateral = m_ui->sourceLateral(); + + if ( !sourceLateral ) return; + + auto parentWellPath = sourceLateral->wellPathTieIn()->parentWell(); + if ( !parentWellPath ) return; + + auto sourceLocationOfFirstWellTarget = sourceLateral->geometryDefinition()->firstActiveTarget()->targetPointXYZ(); + auto sourceTieInMeasuredDepth = sourceLateral->wellPathTieIn()->tieInMeasuredDepth(); + + RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); + if ( wellPathCollection ) + { + int index = 0; + for ( auto measuredDepth : m_ui->locationConfig()->locations() ) + { + RimModeledWellPath* newModeledWellPath = dynamic_cast( + sourceLateral->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); + + auto nameOfNewWell = + RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( parentWellPath ); + newModeledWellPath->setName( nameOfNewWell ); + + newModeledWellPath->wellPathTieIn()->setTieInMeasuredDepth( measuredDepth ); + + wellPathCollection->addWellPath( newModeledWellPath, false ); + newModeledWellPath->resolveReferencesRecursively(); + + newModeledWellPath->updateReferencePoint(); + + updateLocationOfTargets( newModeledWellPath, sourceLocationOfFirstWellTarget ); + updateLocationOfCompletions( newModeledWellPath, sourceTieInMeasuredDepth ); + + newModeledWellPath->updateWellPathVisualization(); + } + + wellPathCollection->rebuildWellPathNodes(); + wellPathCollection->uiCapability()->updateConnectedEditors(); + + Riu3DMainWindowTools::selectAsCurrentItem( sourceLateral ); + + RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); + + m_ui->updateConnectedEditors(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLaterals::updateLocationOfTargets( RimModeledWellPath* newModeledWellPath, + const cvf::Vec3d& sourceLocationOfFirstWellTarget ) +{ + newModeledWellPath->updateTieInLocationFromParentWell(); + newModeledWellPath->wellPathTieIn()->updateFirstTargetFromParentWell(); + + auto firstTarget = newModeledWellPath->geometryDefinition()->firstActiveTarget(); + auto locationOfFirstWellTarget = firstTarget->targetPointXYZ(); + auto offsetFirstTarget = locationOfFirstWellTarget - sourceLocationOfFirstWellTarget; + + auto targets = newModeledWellPath->geometryDefinition()->activeWellTargets(); + for ( auto wellTarget : targets ) + { + // Skip first target, as this is already updated by wellPathTieIn()->updateFirstTargetFromParentWell() + if ( wellTarget == firstTarget ) continue; + + auto newTargetLocationXYZ = wellTarget->targetPointXYZ() + offsetFirstTarget; + wellTarget->setPointXYZ( newTargetLocationXYZ ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLaterals::updateLocationOfCompletions( RimModeledWellPath* newModeledWellPath, + const double sourceTieInMeasuredDepth ) +{ + auto tieInMeasuredDepth = newModeledWellPath->wellPathTieIn()->tieInMeasuredDepth(); + auto diffMD = tieInMeasuredDepth - sourceTieInMeasuredDepth; + + for ( auto completion : newModeledWellPath->completions()->allCompletionsNoConst() ) + { + completion->applyOffset( diffMD ); + } +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.h b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.h new file mode 100644 index 0000000000..695a8203b6 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLaterals.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +#include "RicCreateMultipleWellPathLateralsUi.h" + +#include "cvfVector3.h" + +#include + +class RimModeledWellPath; + +//================================================================================================== +/// +//================================================================================================== +class RicCreateMultipleWellPathLaterals : public caf::CmdFeature +{ + Q_OBJECT + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + +private slots: + void slotAppendFractures(); + +private: + void updateLocationOfTargets( RimModeledWellPath* newModeledWellPath, + const cvf::Vec3d& sourceLocationOfFirstWellTarget ); + + void updateLocationOfCompletions( RimModeledWellPath* newModeledWellPath, const double sourceTieInMeasuredDepth ); + +private: + std::unique_ptr m_ui; +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.cpp new file mode 100644 index 0000000000..3e216b7d0b --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.cpp @@ -0,0 +1,132 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicCreateMultipleWellPathLateralsUi.h" + +#include "RifTextDataTableFormatter.h" + +#include "RigMainGrid.h" +#include "RigWellPath.h" + +#include "RimModeledWellPath.h" +#include "RimTools.h" +#include "RimWellPathCollection.h" +#include "RimWellPathTieIn.h" + +#include "cafCmdFeatureMenuBuilder.h" +#include "cafPdmUiPropertyViewDialog.h" +#include "cafPdmUiTableViewEditor.h" +#include "cafPdmUiTextEditor.h" +#include "cafSelectionManagerTools.h" + +#include "cvfBoundingBox.h" + +#include + +CAF_PDM_SOURCE_INIT( RicCreateMultipleWellPathLateralsUi, "RicCreateMultipleWellPathLateralsUi" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateMultipleWellPathLateralsUi::RicCreateMultipleWellPathLateralsUi() +{ + CAF_PDM_InitFieldNoDefault( &m_sourceLateral, "SourceLaterals", "Source Well Path Lateral", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_topLevelWellPath, "TopLevelWellPath", "Top Level Well Path", "", "", "" ); + m_topLevelWellPath.uiCapability()->setUiHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_locations, "Locations", "Locations", "", "", "" ); + m_locations = new RimMultipleLocations; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLateralsUi::setTopLevelWellPath( RimWellPath* wellPath ) +{ + m_topLevelWellPath = wellPath; + + auto laterals = RimTools::wellPathCollection()->connectedWellPathLaterals( m_topLevelWellPath ); + + if ( !laterals.empty() ) m_sourceLateral = dynamic_cast( laterals.front() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLateralsUi::setDefaultValues( double start, double end ) +{ + m_locations->setRange( start, end ); + m_locations->computeRangesAndLocations(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimModeledWellPath* RicCreateMultipleWellPathLateralsUi::sourceLateral() const +{ + return m_sourceLateral; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimMultipleLocations* RicCreateMultipleWellPathLateralsUi::locationConfig() const +{ + return m_locations; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicCreateMultipleWellPathLateralsUi::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_sourceLateral ); + + { + auto group = uiOrdering.addNewGroup( "Locations" ); + m_locations->uiOrdering( uiConfigName, *group ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RicCreateMultipleWellPathLateralsUi::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_sourceLateral ) + { + if ( m_topLevelWellPath ) + { + auto laterals = RimTools::wellPathCollection()->connectedWellPathLaterals( m_topLevelWellPath ); + + for ( auto lateral : laterals ) + { + caf::IconProvider iconProvider = lateral->uiIconProvider(); + + options.push_back( caf::PdmOptionItemInfo( lateral->name(), lateral, false, iconProvider ) ); + } + } + } + + return options; +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.h b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.h new file mode 100644 index 0000000000..9378a756ca --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateMultipleWellPathLateralsUi.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimMultipleLocations.h" + +#include "cafPdmChildArrayField.h" +#include "cafPdmChildField.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrField.h" + +#include + +class RimModeledWellPath; +class RimWellPath; + +namespace caf +{ +class PdmUiPropertyViewDialog; +} + +//================================================================================================== +/// +//================================================================================================== +class RicCreateMultipleWellPathLateralsUi : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RicCreateMultipleWellPathLateralsUi(); + + void setTopLevelWellPath( RimWellPath* wellPath ); + void setDefaultValues( double start, double end ); + + RimModeledWellPath* sourceLateral() const; + RimMultipleLocations* locationConfig() const; + +private: + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + +private: + caf::PdmPtrField m_sourceLateral; + caf::PdmPtrField m_topLevelWellPath; + + caf::PdmChildField m_locations; +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp index 558eb41e23..24a383985f 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.cpp @@ -27,6 +27,7 @@ #include "RigHexIntersectionTools.h" #include "RigMainGrid.h" #include "RigWellPath.h" +#include "RigWellPathGeometryTools.h" #include "Rim3dView.h" #include "RimEclipseView.h" @@ -111,8 +112,15 @@ bool RicCreateWellTargetsPickEventHandler::handle3dPickEvent( const Ric3dPickEve targetPointInDomain = wellPathSourceInfo->closestPointOnCenterLine( firstPickItem.faceIdx(), intersectionPointInDomain ); double md = wellPathSourceInfo->measuredDepth( firstPickItem.faceIdx(), intersectionPointInDomain ); - doSetAzimuthAndInclination = calculateAzimuthAndInclinationAtMd( md, wellPathGeometry, &azimuth, &inclination ); - double rkbDiff = wellPathGeometry->rkbDiff(); + + { + const auto [az, inc] = RigWellPathGeometryTools::calculateAzimuthAndInclinationAtMd( md, wellPathGeometry ); + azimuth = az; + inclination = inc; + doSetAzimuthAndInclination = true; + } + + double rkbDiff = wellPathGeometry->rkbDiff(); if ( m_geometryToAddTargetsTo->airGap() == 0.0 && rkbDiff != std::numeric_limits::infinity() ) { m_geometryToAddTargetsTo->setAirGap( rkbDiff ); @@ -190,59 +198,6 @@ bool RicCreateWellTargetsPickEventHandler::handle3dPickEvent( const Ric3dPickEve return false; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RicCreateWellTargetsPickEventHandler::calculateAzimuthAndInclinationAtMd( double measuredDepth, - gsl::not_null wellPathGeometry, - double* azimuth, - double* inclination ) const -{ - int mdIndex = -1; - auto mdList = wellPathGeometry->measuredDepths(); - - for ( int i = 0; i < (int)mdList.size(); i++ ) - { - if ( mdList[i] > measuredDepth ) - { - mdIndex = i - 1; - break; - } - } - - auto ptList = wellPathGeometry->wellPathPoints(); - if ( mdIndex > 0 && mdIndex < (int)ptList.size() - 2 ) - { - auto v1 = cvf::Vec3d( ptList[mdIndex - 1] ); - auto v2 = cvf::Vec3d( ptList[mdIndex] ); - auto v3 = cvf::Vec3d( ptList[mdIndex + 1] ); - auto v4 = cvf::Vec3d( ptList[mdIndex + 2] ); - - auto v21 = v2 - v1; - auto v32 = v3 - v2; - auto v43 = v4 - v3; - - v21.normalize(); - v32.normalize(); - v43.normalize(); - - auto v13mean = ( v21 + v32 ) / 2; - auto v24mean = ( v32 + v43 ) / 2; - - double weight = ( measuredDepth - mdList[mdIndex] ) / ( mdList[mdIndex + 1] - mdList[mdIndex] ); - auto vTan = v13mean * weight + v24mean * ( 1 - weight ); - - RiaOffshoreSphericalCoords coords( vTan ); - *azimuth = coords.azi(); - *inclination = coords.inc(); - return true; - } - - *azimuth = 0.0; - *inclination = 0.0; - return false; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.h b/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.h index 1f81abd7ce..be0c8acd69 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.h +++ b/ApplicationLibCode/Commands/WellPathCommands/RicCreateWellTargetsPickEventHandler.h @@ -43,11 +43,6 @@ class RicCreateWellTargetsPickEventHandler : public Ric3dViewPickEventHandler void notifyUnregistered() override; private: - bool calculateAzimuthAndInclinationAtMd( double measuredDepth, - gsl::not_null wellPathGeometry, - double* azimuth, - double* inclination ) const; - static bool isGridSourceObject( const cvf::Object* object ); static cvf::Vec3d findHexElementIntersection( gsl::not_null view, const RiuPickItemInfo& pickItem, diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.cpp new file mode 100644 index 0000000000..8adc133bd0 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.cpp @@ -0,0 +1,75 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicDeleteWellPathFeature.h" + +#include "RimTools.h" +#include "RimWellPath.h" +#include "RimWellPathCollection.h" + +#include "cafSelectionManager.h" + +#include + +CAF_CMD_SOURCE_INIT( RicDeleteWellPathFeature, "RicDeleteWellPathFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicDeleteWellPathFeature::isCommandEnabled() +{ + std::vector objects; + caf::SelectionManager::instance()->objectsByType( &objects ); + + return !objects.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicDeleteWellPathFeature::onActionTriggered( bool isChecked ) +{ + std::vector wellPaths; + caf::SelectionManager::instance()->objectsByType( &wellPaths ); + + if ( !wellPaths.empty() ) + { + auto wpc = RimTools::wellPathCollection(); + + for ( auto w : wellPaths ) + { + for ( auto wl : w->allWellPathLaterals() ) + { + wpc->deleteWell( wl ); + } + } + + wpc->rebuildWellPathNodes(); + wpc->scheduleRedrawAffectedViews(); + wpc->updateAllRequiredEditors(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicDeleteWellPathFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Delete Well Path" ); + actionToSetup->setIcon( QIcon( ":/Erase.svg" ) ); +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.h b/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.h new file mode 100644 index 0000000000..77eb96346b --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicDeleteWellPathFeature.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +//================================================================================================== +/// +//================================================================================================== +class RicDeleteWellPathFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicImportWellPaths.h b/ApplicationLibCode/Commands/WellPathCommands/RicImportWellPaths.h index 0c53f1dbe1..8d2378ad6a 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicImportWellPaths.h +++ b/ApplicationLibCode/Commands/WellPathCommands/RicImportWellPaths.h @@ -42,9 +42,10 @@ class RicImportWellPaths : public caf::CmdFeature, public RicfCommandObject RicImportWellPaths(); caf::PdmScriptResponse execute() override; -protected: static std::vector - importWellPaths( const QStringList& wellPathFilePaths, bool importGrouped, QStringList* errorMessages ); + importWellPaths( const QStringList& wellPathFilePaths, bool importGrouped, QStringList* errorMessages ); + +protected: static QStringList wellPathNameFilters(); bool isCommandEnabled() override; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.cpp new file mode 100644 index 0000000000..ee89e4545c --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.cpp @@ -0,0 +1,112 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicLinkWellPathFeature.h" + +#include "RimModeledWellPath.h" +#include "RimWellPathGeometryDef.h" + +#include "Riu3dSelectionManager.h" + +#include "cafSelectionManager.h" +#include "cafSelectionManagerTools.h" + +#include + +CAF_CMD_SOURCE_INIT( RicLinkWellPathFeature, "RicLinkWellPathFeature" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicLinkWellPathFeature::isCommandEnabled() +{ + return ( !wellPaths().empty() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicLinkWellPathFeature::onActionTriggered( bool isChecked ) +{ + for ( auto w : wellPaths() ) + { + if ( auto modeledWell = dynamic_cast( w ) ) + { + auto geoDef = modeledWell->geometryDefinition(); + geoDef->enableLinkOfReferencePointUpdates( isChecked ); + geoDef->updateConnectedEditors(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicLinkWellPathFeature::setupActionLook( QAction* actionToSetup ) +{ + QString text = "Link Reference Point"; + actionToSetup->setText( text ); + actionToSetup->setCheckable( true ); + actionToSetup->setChecked( isCommandChecked() ); + + actionToSetup->setIcon( QIcon( ":/chain.png" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicLinkWellPathFeature::isCommandChecked() +{ + if ( !wellPaths().empty() ) + { + if ( auto firstWell = dynamic_cast( wellPaths().front() ) ) + { + if ( auto geoDef = firstWell->geometryDefinition() ) + { + return geoDef->isReferencePointUpdatesLinked(); + } + } + } + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicLinkWellPathFeature::wellPaths() +{ + std::vector wellPaths; + + auto wellPathSelectionItem = RiuWellPathSelectionItem::wellPathSelectionItem(); + if ( wellPathSelectionItem && wellPathSelectionItem->m_wellpath ) + { + if ( auto modeledWellPath = + dynamic_cast( wellPathSelectionItem->m_wellpath->topLevelWellPath() ) ) + { + wellPaths.push_back( modeledWellPath ); + } + } + + auto selectedWells = caf::selectedObjectsByTypeStrict(); + for ( auto w : selectedWells ) + { + wellPaths.push_back( w->topLevelWellPath() ); + } + + return wellPaths; +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.h b/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.h new file mode 100644 index 0000000000..5f5320aebd --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicLinkWellPathFeature.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +class RimWellPath; + +//================================================================================================== +/// +//================================================================================================== +class RicLinkWellPathFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +public: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + bool isCommandChecked() override; + +private: + static std::vector wellPaths(); +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.cpp index adb9bff4fd..47f270c79c 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.cpp @@ -48,7 +48,7 @@ CAF_CMD_SOURCE_INIT( RicNewWellPathLateralAtDepthFeature, "RicNewWellPathLateral //-------------------------------------------------------------------------------------------------- bool RicNewWellPathLateralAtDepthFeature::isCommandEnabled() { - if ( wellPathSelectionItem() ) + if ( RiuWellPathSelectionItem::wellPathSelectionItem() ) { return true; } @@ -61,7 +61,7 @@ bool RicNewWellPathLateralAtDepthFeature::isCommandEnabled() //-------------------------------------------------------------------------------------------------- void RicNewWellPathLateralAtDepthFeature::onActionTriggered( bool isChecked ) { - RiuWellPathSelectionItem* wellPathSelItem = wellPathSelectionItem(); + RiuWellPathSelectionItem* wellPathSelItem = RiuWellPathSelectionItem::wellPathSelectionItem(); CVF_ASSERT( wellPathSelItem ); RimWellPath* parentWellPath = wellPathSelItem->m_wellpath; @@ -84,14 +84,15 @@ void RicNewWellPathLateralAtDepthFeature::setupActionLook( QAction* actionToSetu //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimWellPath* RicNewWellPathLateralAtDepthFeature::createLateralAtMeasuredDepth( RimWellPath* parentWellPath, - double parentWellMD ) +RimModeledWellPath* RicNewWellPathLateralAtDepthFeature::createLateralAtMeasuredDepth( RimWellPath* parentWellPath, + double parentWellMD ) { RimProject* project = RimProject::current(); RimWellPathCollection* wellPathColl = RimTools::wellPathCollection(); if ( project && wellPathColl ) { auto newModeledWellPath = new RimModeledWellPath(); + newModeledWellPath->geometryDefinition()->enableReferencePointFromTopLevelWell( true ); if ( parentWellPath->wellPathGeometry() && parentWellPath->wellPathGeometry()->measuredDepths().size() > 2 ) { @@ -133,26 +134,13 @@ RimWellPath* RicNewWellPathLateralAtDepthFeature::createLateralAtMeasuredDepth( //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RiuWellPathSelectionItem* RicNewWellPathLateralAtDepthFeature::wellPathSelectionItem() +QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentWellPath ) { - Riu3dSelectionManager* riuSelManager = Riu3dSelectionManager::instance(); - RiuSelectionItem* selItem = riuSelManager->selectedItem( Riu3dSelectionManager::RUI_TEMPORARY ); - - RiuWellPathSelectionItem* wellPathItem = dynamic_cast( selItem ); - - return wellPathItem; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentwWellPath ) -{ - if ( !parentwWellPath ) return ""; + if ( !parentWellPath ) return ""; QString nameOfNewWell; - auto topLevelWell = parentwWellPath->topLevelWellPath(); + auto topLevelWell = parentWellPath->topLevelWellPath(); QStringList allNames; { @@ -174,7 +162,7 @@ QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSide if ( allNames.size() == 1 ) { - QString name = parentwWellPath->name(); + QString name = parentWellPath->name(); if ( name.contains( "Y1" ) ) { @@ -182,7 +170,7 @@ QString RicNewWellPathLateralAtDepthFeature::updateNameOfParentAndFindNameOfSide } else { - parentwWellPath->setNameNoUpdateOfExportName( name + " Y1" ); + parentWellPath->setNameNoUpdateOfExportName( name + " Y1" ); nameOfNewWell = name + " Y2"; } diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.h b/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.h index 5d456c9107..372ab372f1 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.h +++ b/ApplicationLibCode/Commands/WellPathCommands/RicNewWellPathLateralAtDepthFeature.h @@ -20,7 +20,7 @@ #include "cafCmdFeature.h" -class RiuWellPathSelectionItem; +class RimModeledWellPath; class RimWellPath; //================================================================================================== @@ -35,9 +35,6 @@ class RicNewWellPathLateralAtDepthFeature : public caf::CmdFeature void onActionTriggered( bool isChecked ) override; void setupActionLook( QAction* actionToSetup ) override; - static RimWellPath* createLateralAtMeasuredDepth( RimWellPath* parentWellPath, double parentWellMD ); - -private: - static RiuWellPathSelectionItem* wellPathSelectionItem(); - static QString updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentwWellPath ); + static RimModeledWellPath* createLateralAtMeasuredDepth( RimWellPath* parentWellPath, double parentWellMD ); + static QString updateNameOfParentAndFindNameOfSideStep( RimWellPath* parentWellPath ); }; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.cpp new file mode 100644 index 0000000000..0d1e758b53 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.cpp @@ -0,0 +1,155 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RicPasteModeledWellPathFeature.h" + +CAF_CMD_SOURCE_INIT( RicPasteModeledWellPathFeature, "RicPasteModeledWellPathFeature" ); + +#include "OperationsUsingObjReferences/RicPasteFeatureImpl.h" + +#include "RimModeledWellPath.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimTools.h" +#include "RimWellPathCollection.h" +#include "RimWellPathTieIn.h" + +#include "Riu3DMainWindowTools.h" + +#include "cafPdmObjectGroup.h" +#include "cafSelectionManager.h" + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RicPasteModeledWellPathFeature::isCommandEnabled() +{ + if ( !modeledWellPathsFromClipboard().empty() ) return true; + { + std::vector objects; + caf::SelectionManager::instance()->objectsByType( &objects ); + + if ( objects.size() > 0 ) + { + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPasteModeledWellPathFeature::onActionTriggered( bool isChecked ) +{ + if ( modeledWellPathsFromClipboard().empty() ) return; + + RimProject* proj = RimProject::current(); + + if ( proj && proj->activeOilField() ) + { + RimWellPathCollection* wellPathCollection = proj->activeOilField()->wellPathCollection(); + + if ( wellPathCollection ) + { + RimModeledWellPath* wellPathToSelect = nullptr; + for ( auto sourceWellPath : modeledWellPathsFromClipboard() ) + { + RimModeledWellPath* destinationWellPath = dynamic_cast( + sourceWellPath->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); + + QString name = sourceWellPath->name() + " (copy)"; + destinationWellPath->setName( name ); + + wellPathCollection->addWellPath( destinationWellPath, false ); + wellPathToSelect = destinationWellPath; + + duplicateLaterals( sourceWellPath, destinationWellPath ); + } + + RimTools::wellPathCollection()->rebuildWellPathNodes(); + + wellPathCollection->uiCapability()->updateConnectedEditors(); + + proj->scheduleCreateDisplayModelAndRedrawAllViews(); + + Riu3DMainWindowTools::selectAsCurrentItem( wellPathToSelect ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPasteModeledWellPathFeature::setupActionLook( QAction* actionToSetup ) +{ + actionToSetup->setText( "Paste Well Path" ); + actionToSetup->setIcon( QIcon( ":/Well.svg" ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RicPasteModeledWellPathFeature::modeledWellPathsFromClipboard() +{ + caf::PdmObjectGroup objectGroup; + RicPasteFeatureImpl::findObjectsFromClipboardRefs( &objectGroup ); + + std::vector> typedObjects; + objectGroup.objectsByType( &typedObjects ); + + std::vector wellPaths; + for ( auto obj : typedObjects ) + { + wellPaths.push_back( obj ); + } + + return wellPaths; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RicPasteModeledWellPathFeature::duplicateLaterals( RimModeledWellPath* source, RimModeledWellPath* destination ) +{ + auto wpc = RimTools::wellPathCollection(); + + auto sourceLaterals = wpc->connectedWellPathLaterals( source ); + + destination->createWellPathGeometry(); + for ( auto lateral : sourceLaterals ) + { + auto sourceLateral = dynamic_cast( lateral ); + if ( !sourceLateral ) continue; + + auto* destinationLateral = dynamic_cast( + sourceLateral->xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); + + QString name = sourceLateral->name() + " (copy)"; + destinationLateral->setName( name ); + + wpc->addWellPath( destinationLateral, false ); + + destinationLateral->connectWellPaths( destination, sourceLateral->wellPathTieIn()->tieInMeasuredDepth() ); + + duplicateLaterals( sourceLateral, destinationLateral ); + } +} diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.h b/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.h new file mode 100644 index 0000000000..ce6e553365 --- /dev/null +++ b/ApplicationLibCode/Commands/WellPathCommands/RicPasteModeledWellPathFeature.h @@ -0,0 +1,40 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafCmdFeature.h" + +class RimModeledWellPath; +//================================================================================================== +/// +//================================================================================================== +class RicPasteModeledWellPathFeature : public caf::CmdFeature +{ + CAF_CMD_HEADER_INIT; + +protected: + bool isCommandEnabled() override; + void onActionTriggered( bool isChecked ) override; + void setupActionLook( QAction* actionToSetup ) override; + +private: + static std::vector modeledWellPathsFromClipboard(); + + void duplicateLaterals( RimModeledWellPath* source, RimModeledWellPath* destination ); +}; diff --git a/ApplicationLibCode/Commands/WellPathCommands/RicWellPathPickEventHandler.cpp b/ApplicationLibCode/Commands/WellPathCommands/RicWellPathPickEventHandler.cpp index fdb5c9c551..e14e5b59fe 100644 --- a/ApplicationLibCode/Commands/WellPathCommands/RicWellPathPickEventHandler.cpp +++ b/ApplicationLibCode/Commands/WellPathCommands/RicWellPathPickEventHandler.cpp @@ -31,14 +31,15 @@ #include "RimWellPath.h" #include "RimWellPathAttribute.h" #include "RimWellPathAttributeCollection.h" +#include "RimWellPathGeometryDef.h" #include "RimWellPathValve.h" #include "RiuMainWindow.h" +#include "RivExtrudedCurveIntersectionPartMgr.h" #include "RivObjectSourceInfo.h" #include "RivWellPathSourceInfo.h" -#include "RivExtrudedCurveIntersectionPartMgr.h" #include "cafDisplayCoordTransform.h" #include "cafSelectionManager.h" #include "cvfPart.h" @@ -179,6 +180,10 @@ bool RicWellPathPickEventHandler::handle3dPickEvent( const Ric3dPickEvent& event } } } + else if ( auto geoDef = dynamic_cast( sourceInfo->object() ) ) + { + RiuMainWindow::instance()->selectAsCurrentItem( geoDef ); + } } if ( dynamic_cast( firstPickedPart->sourceInfo() ) ) diff --git a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake index 0f8a314edd..a9f5eb43d4 100644 --- a/ApplicationLibCode/FileInterface/CMakeLists_files.cmake +++ b/ApplicationLibCode/FileInterface/CMakeLists_files.cmake @@ -1,154 +1,152 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryTools.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUnifiedRestartFileAccess.h -${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseInput.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput.h -${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderInterface.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataParserTools.h -${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserDataParser.h -${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorParser.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderObservedData.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderRftInterface.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseRft.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderFmuRft.h -${CMAKE_CURRENT_LIST_DIR}/RifJsonEncodeDecode.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderInterface.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderMockModel.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderSettings.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddressQMetaType.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRftAddress.h -${CMAKE_CURRENT_LIST_DIR}/RifWellPathImporter.h -${CMAKE_CURRENT_LIST_DIR}/RifHdf5ReaderInterface.h -${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserData.h -${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorUserData.h -${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPlt.h -${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPltQMetaType.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataKeywordTools.h -${CMAKE_CURRENT_LIST_DIR}/RifCsvUserData.h -${CMAKE_CURRENT_LIST_DIR}/RifCsvUserDataParser.h -${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader.h -${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationReader.h -${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationsImporter.h -${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader.h -${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyReader.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader.h -${CMAKE_CURRENT_LIST_DIR}/RifSummaryCaseRestartSelector.h -${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader.h -${CMAKE_CURRENT_LIST_DIR}/RifFileParseTools.h -${CMAKE_CURRENT_LIST_DIR}/RifEnsembleStatisticsReader.h -${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.h -${CMAKE_CURRENT_LIST_DIR}/RifDerivedEnsembleReader.h -${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.h -${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.h -${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.h -${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.h -${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.h -${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.h -${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelGeologicalFrkExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.h -${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.h -${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.h -${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.h -${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.h -${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.h -${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.h - -# HDF5 file reader is directly included in ResInsight main CmakeList.txt -#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUnifiedRestartFileAccess.h + ${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseInput.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput.h + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataParserTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserDataParser.h + ${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorParser.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderObservedData.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderRftInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseRft.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderFmuRft.h + ${CMAKE_CURRENT_LIST_DIR}/RifJsonEncodeDecode.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderMockModel.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddressQMetaType.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRftAddress.h + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathImporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifHdf5ReaderInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserData.h + ${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorUserData.h + ${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPlt.h + ${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPltQMetaType.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataKeywordTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifCsvUserData.h + ${CMAKE_CURRENT_LIST_DIR}/RifCsvUserDataParser.h + ${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationsImporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryCaseRestartSelector.h + ${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifFileParseTools.h + ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleStatisticsReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.h + ${CMAKE_CURRENT_LIST_DIR}/RifDerivedEnsembleReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.h + ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.h + ${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelGeologicalFrkExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.h + ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.h + ${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.h + ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.h + ${CMAKE_CURRENT_LIST_DIR}/RifWellIAFileWriter.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseTextFileReader.h + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseKeywordContent.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUnifiedRestartFileAccess.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseInput.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataParserTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserDataParser.cpp -${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorParser.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderObservedData.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderRftInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseRft.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderFmuRft.cpp -${CMAKE_CURRENT_LIST_DIR}/RifJsonEncodeDecode.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderMockModel.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseRftAddress.cpp -${CMAKE_CURRENT_LIST_DIR}/RifWellPathImporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifHdf5ReaderInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserData.cpp -${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorUserData.cpp -${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPlt.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataKeywordTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCsvUserData.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCsvUserDataParser.cpp -${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationsImporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSummaryCaseRestartSelector.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifFileParseTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEnsembleStatisticsReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifDerivedEnsembleReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.cpp -${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelGeologicalFrkExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.cpp - -# HDF5 file reader is directly included in ResInsight main CmakeList.txt -#${CMAKE_CURRENT_LIST_DIR}/RifHdf5Reader.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseOutputFileTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartDataAccess.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRestartFilesetAccess.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUnifiedRestartFileAccess.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseInput.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataParserTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserDataParser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorParser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderObservedData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderRftInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseRft.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderFmuRft.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifJsonEncodeDecode.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderMockModel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseRftAddress.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathImporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifHdf5ReaderInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifColumnBasedUserData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifKeywordVectorUserData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifDataSourceForRftPlt.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseUserDataKeywordTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCsvUserData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCsvUserDataParser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellPathFormationsImporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryCaseRestartSelector.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifFileParseTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleStatisticsReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifDerivedEnsembleReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEnsembleStatisticsRft.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputPropertyLoader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelGeologicalFrkExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelPerfsFrkExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelAsymmetricFrkExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAXmlWriter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifFaultRAJsonWriter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifParameterXmlReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifOpmCommonSummary.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEnsembleFractureStatisticsExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryReaderMultipleFiles.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclEclipseSummary.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellIAFileWriter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseTextFileReader.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "FileInterface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "FileInterface" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp index f160e01456..6fe91ff015 100644 --- a/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp +++ b/ApplicationLibCode/FileInterface/RifCsvUserDataParser.cpp @@ -319,8 +319,9 @@ bool RifCsvUserDataParser::parseColumnInfo( QTextStream* dataStr for ( int iCol = 0; iCol < colCount; iCol++ ) { QString colName = RiaTextStringTools::trimAndRemoveDoubleSpaces( lineColumns[iCol] ); - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( colName.toStdString() ); - Column col = Column::createColumnInfoFromCsvData( addr, "" ); + RifEclipseSummaryAddress addr = + RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( colName.toStdString() ); + Column col = Column::createColumnInfoFromCsvData( addr, "" ); columnInfoList->push_back( col ); } @@ -520,7 +521,7 @@ bool RifCsvUserDataParser::parseLineBasedData() { auto textAddr = dataItems[colIndexes[(size_t)CsvLineBasedColumnType::VECTOR]]; - auto addr = RifEclipseSummaryAddress::fromEclipseTextAddress( textAddr.toStdString() ); + auto addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( textAddr.toStdString() ); auto errAddr = addr; errAddr.setAsErrorResult(); diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp index 4e6be80240..95a9da6c0a 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.cpp @@ -24,6 +24,9 @@ #include "RiaLogging.h" #include "RiaStringEncodingTools.h" +#include "RifEclipseInputPropertyLoader.h" +#include "RifEclipseKeywordContent.h" +#include "RifEclipseTextFileReader.h" #include "RifReaderEclipseOutput.h" #include "RigActiveCellInfo.h" @@ -77,183 +80,125 @@ bool RifEclipseInputFileTools::openGridFile( const QString& fileName, bool readFaultData, QString* errorMessages ) { - CVF_ASSERT( eclipseCase && errorMessages ); + std::string filename = fileName.toStdString(); - std::vector keywordsAndFilePos; - findKeywordsOnFile( fileName, &keywordsAndFilePos ); + auto objects = RifEclipseTextFileReader::readKeywordAndValues( filename ); - qint64 coordPos = -1; - qint64 zcornPos = -1; - qint64 specgridPos = -1; - qint64 actnumPos = -1; - qint64 mapaxesPos = -1; - qint64 gridunitPos = -1; - - findGridKeywordPositions( keywordsAndFilePos, &coordPos, &zcornPos, &specgridPos, &actnumPos, &mapaxesPos, &gridunitPos ); + ecl_kw_type* specGridKw = nullptr; + ecl_kw_type* zCornKw = nullptr; + ecl_kw_type* coordKw = nullptr; + ecl_kw_type* actNumKw = nullptr; + ecl_kw_type* mapAxesKw = nullptr; - if ( coordPos < 0 || zcornPos < 0 || specgridPos < 0 ) + for ( const auto& obj : objects ) { - QString errorText = QString( "Failed to import grid file '%1'\n" ).arg( fileName ); - - if ( coordPos < 0 ) { - errorText += " Missing required keyword COORD"; + std::string keyword = "SPECGRID"; + if ( obj.keyword.compare( keyword ) == 0 ) + { + std::vector intValues; + for ( const auto& val : obj.values ) + { + intValues.push_back( val ); + } + + specGridKw = ecl_kw_alloc_new( keyword.data(), (int)obj.values.size(), ECL_INT, intValues.data() ); + continue; + } } - if ( zcornPos < 0 ) { - errorText += " Missing required keyword ZCORN"; + std::string keyword = "COORD"; + if ( obj.keyword.compare( keyword ) == 0 ) + { + coordKw = ecl_kw_alloc_new( keyword.data(), (int)obj.values.size(), ECL_FLOAT, obj.values.data() ); + continue; + } } - if ( specgridPos < 0 ) { - errorText += " Missing required keyword SPECGRID"; + std::string keyword = "ZCORN"; + if ( obj.keyword.compare( keyword ) == 0 ) + { + zCornKw = ecl_kw_alloc_new( keyword.data(), (int)obj.values.size(), ECL_FLOAT, obj.values.data() ); + continue; + } } - *errorMessages += errorText; + { + std::string keyword = "ACTNUM"; + if ( obj.keyword.compare( keyword ) == 0 ) + { + std::vector intValues; + for ( const auto& val : obj.values ) + { + intValues.push_back( val ); + } - return false; - } + actNumKw = ecl_kw_alloc_new( keyword.data(), (int)obj.values.size(), ECL_INT, intValues.data() ); + continue; + } + } - if ( gridunitPos >= 0 ) - { - QFile gridFile( fileName ); - if ( gridFile.open( QFile::ReadOnly ) ) { - RiaDefines::EclipseUnitSystem units = readUnitSystem( gridFile, gridunitPos ); - if ( units != RiaDefines::EclipseUnitSystem::UNITS_UNKNOWN ) + std::string keyword = "MAPAXES"; + if ( obj.keyword.compare( keyword ) == 0 ) { - eclipseCase->setUnitsType( units ); + mapAxesKw = ecl_kw_alloc_new( keyword.data(), (int)obj.values.size(), ECL_FLOAT, obj.values.data() ); + continue; } } } - FILE* gridFilePointer = util_fopen( fileName.toLatin1().data(), "r" ); - if ( !gridFilePointer ) return false; - - // Main grid dimensions - // SPECGRID - This is whats normally available, but not really the input to Eclipse. - // DIMENS - Is what Eclipse expects and uses, but is not defined in the GRID section and is not (?) available - // normally ZCORN, COORD, ACTNUM, MAPAXES - - // ecl_kw_type * ecl_kw_fscanf_alloc_grdecl_dynamic__( FILE * stream , const char * kw , bool strict , - // ecl_type_enum ecl_type); ecl_grid_type * ecl_grid_alloc_GRDECL_kw( int nx, int ny , int nz , const ecl_kw_type * - // zcorn_kw , const ecl_kw_type * coord_kw , const ecl_kw_type * actnum_kw , const ecl_kw_type * mapaxes_kw ); - - ecl_kw_type* specGridKw = nullptr; - ecl_kw_type* zCornKw = nullptr; - ecl_kw_type* coordKw = nullptr; - ecl_kw_type* actNumKw = nullptr; - ecl_kw_type* mapAxesKw = nullptr; - - // Try to read all the needed keywords. Early exit if some are not found - caf::ProgressInfo progress( 8, "Read Grid from Eclipse Input file" ); - - bool allKwReadOk = true; - - fseek( gridFilePointer, specgridPos, SEEK_SET ); - allKwReadOk = - allKwReadOk && - nullptr != ( specGridKw = ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, - false, - ecl_type_create_from_type( ECL_INT_TYPE ) ) ); - progress.setProgress( 1 ); - - fseek( gridFilePointer, zcornPos, SEEK_SET ); - allKwReadOk = allKwReadOk && - nullptr != - ( zCornKw = ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, - false, - ecl_type_create_from_type( ECL_FLOAT_TYPE ) ) ); - progress.setProgress( 2 ); - - fseek( gridFilePointer, coordPos, SEEK_SET ); - allKwReadOk = allKwReadOk && - nullptr != - ( coordKw = ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, - false, - ecl_type_create_from_type( ECL_FLOAT_TYPE ) ) ); - progress.setProgress( 3 ); - - // If ACTNUM is not defined, this pointer will be nullptr, which is a valid condition - if ( actnumPos >= 0 ) - { - fseek( gridFilePointer, actnumPos, SEEK_SET ); - allKwReadOk = - allKwReadOk && - nullptr != ( actNumKw = ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, - false, - ecl_type_create_from_type( ECL_INT_TYPE ) ) ); - progress.setProgress( 4 ); - } - - // If MAPAXES is not defined, this pointer will be nullptr, which is a valid condition - if ( mapaxesPos >= 0 ) + if ( specGridKw && zCornKw && coordKw ) { - fseek( gridFilePointer, mapaxesPos, SEEK_SET ); - mapAxesKw = - ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, false, ecl_type_create_from_type( ECL_FLOAT_TYPE ) ); - } + int nx = ecl_kw_iget_int( specGridKw, 0 ); + int ny = ecl_kw_iget_int( specGridKw, 1 ); + int nz = ecl_kw_iget_int( specGridKw, 2 ); - if ( !allKwReadOk ) - { - if ( specGridKw ) ecl_kw_free( specGridKw ); - if ( zCornKw ) ecl_kw_free( zCornKw ); - if ( coordKw ) ecl_kw_free( coordKw ); - if ( actNumKw ) ecl_kw_free( actNumKw ); - if ( mapAxesKw ) ecl_kw_free( mapAxesKw ); + ecl_grid_type* inputGrid = ecl_grid_alloc_GRDECL_kw( nx, ny, nz, zCornKw, coordKw, actNumKw, mapAxesKw ); - return false; - } + RifReaderEclipseOutput::transferGeometry( inputGrid, eclipseCase ); - progress.setProgress( 5 ); - - int nx = ecl_kw_iget_int( specGridKw, 0 ); - int ny = ecl_kw_iget_int( specGridKw, 1 ); - int nz = ecl_kw_iget_int( specGridKw, 2 ); - - ecl_grid_type* inputGrid = ecl_grid_alloc_GRDECL_kw( nx, ny, nz, zCornKw, coordKw, actNumKw, mapAxesKw ); + if ( readFaultData ) + { + bool isFaultKeywordPresent = false; + for ( const auto& keywordObj : objects ) + { + if ( keywordObj.keyword == "FAULTS" ) isFaultKeywordPresent = true; + } - progress.setProgress( 6 ); + if ( isFaultKeywordPresent ) + { + importFaultsFromFile( eclipseCase, fileName ); + } + } - RifReaderEclipseOutput::transferGeometry( inputGrid, eclipseCase ); + bool useMapAxes = ecl_grid_use_mapaxes( inputGrid ); + eclipseCase->mainGrid()->setUseMapAxes( useMapAxes ); - progress.setProgress( 7 ); - progress.setProgressDescription( "Read faults ..." ); + if ( useMapAxes ) + { + std::array mapAxesValues; + ecl_grid_init_mapaxes_data_double( inputGrid, mapAxesValues.data() ); + eclipseCase->mainGrid()->setMapAxes( mapAxesValues ); + } - if ( readFaultData ) - { - cvf::Collection faults; - RifEclipseInputFileTools::readFaults( fileName, keywordsAndFilePos, &faults ); + ecl_kw_free( specGridKw ); + ecl_kw_free( zCornKw ); + ecl_kw_free( coordKw ); + if ( actNumKw ) ecl_kw_free( actNumKw ); + if ( mapAxesKw ) ecl_kw_free( mapAxesKw ); - RigMainGrid* mainGrid = eclipseCase->mainGrid(); - mainGrid->setFaults( faults ); - } + ecl_grid_free( inputGrid ); - bool useMapAxes = ecl_grid_use_mapaxes( inputGrid ); - eclipseCase->mainGrid()->setUseMapAxes( useMapAxes ); + // Import additional keywords as input properties + RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( eclipseCase, objects ); - if ( useMapAxes ) - { - std::array mapAxesValues; - ecl_grid_init_mapaxes_data_double( inputGrid, mapAxesValues.data() ); - eclipseCase->mainGrid()->setMapAxes( mapAxesValues ); + return true; } - progress.setProgress( 8 ); - progress.setProgressDescription( "Cleaning up ..." ); - - ecl_kw_free( specGridKw ); - ecl_kw_free( zCornKw ); - ecl_kw_free( coordKw ); - if ( actNumKw ) ecl_kw_free( actNumKw ); - if ( mapAxesKw ) ecl_kw_free( mapAxesKw ); - - ecl_grid_free( inputGrid ); - - fclose( gridFilePointer ); - - return true; + return false; } //-------------------------------------------------------------------------------------------------- @@ -761,254 +706,60 @@ void RifEclipseInputFileTools::saveFaults( QTextStream& stream, } //-------------------------------------------------------------------------------------------------- -/// Read known properties from the input file -//-------------------------------------------------------------------------------------------------- -std::map RifEclipseInputFileTools::readProperties( const QString& fileName, RigEclipseCaseData* caseData ) -{ - CVF_ASSERT( caseData ); - - caf::ProgressInfo mainProgress( 2, "Reading Eclipse Input properties" ); - - std::vector fileKeywords; - RifEclipseInputFileTools::findKeywordsOnFile( fileName, &fileKeywords ); - - if ( !fileKeywords.size() ) - { - RiaLogging::warning( QString( "No keywords found in file: %1" ).arg( fileName ) ); - } - mainProgress.setProgress( 1 ); - caf::ProgressInfo progress( fileKeywords.size(), "Reading properties" ); - - FILE* gridFilePointer = util_fopen( fileName.toLatin1().data(), "r" ); - - if ( !gridFilePointer ) - { - RiaLogging::warning( QString( "Could not open file: %1" ).arg( fileName ) ); - return std::map(); - } - - std::map newResults; - for ( size_t i = 0; i < fileKeywords.size(); ++i ) - { - if ( !isValidDataKeyword( fileKeywords[i].keyword ) ) - { - continue; - } - - fseek( gridFilePointer, fileKeywords[i].filePos, SEEK_SET ); - - ecl_kw_type* eclipseKeywordData = - ecl_kw_fscanf_alloc_current_grdecl__( gridFilePointer, false, ecl_type_create_from_type( ECL_FLOAT_TYPE ) ); - if ( eclipseKeywordData ) - { - QString newResultName = - caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->makeResultNameUnique( fileKeywords[i].keyword ); - QString errMsg; - if ( readDataFromKeyword( eclipseKeywordData, caseData, newResultName, &errMsg ) ) - { - newResults[newResultName] = fileKeywords[i].keyword; - } - else - { - RiaLogging::error( QString( "Failed to read keyword: %1" ).arg( errMsg ) ); - } - ecl_kw_free( eclipseKeywordData ); - } - else - { - RiaLogging::error( QString( "Failed to allocate keyword: %1" ).arg( fileKeywords[i].keyword ) ); - } - - progress.setProgress( i ); - } - - fclose( gridFilePointer ); - return newResults; -} - -//-------------------------------------------------------------------------------------------------- -/// Reads the property data requested into the \a reservoir, overwriting any previous -/// properties with the same name. +/// //-------------------------------------------------------------------------------------------------- -bool RifEclipseInputFileTools::readProperty( const QString& fileName, - RigEclipseCaseData* caseData, - const QString& eclipseKeyWord, - const QString& resultName ) +bool RifEclipseInputFileTools::importFaultsFromFile( RigEclipseCaseData* eclipseCaseData, const QString& fileName ) { - CVF_ASSERT( caseData ); - - if ( !isValidDataKeyword( eclipseKeyWord ) ) return false; - - FILE* filePointer = util_fopen( fileName.toLatin1().data(), "r" ); - if ( !filePointer ) + cvf::Collection faultCollectionFromFile; + RifEclipseInputFileTools::parseAndReadFaults( fileName, &faultCollectionFromFile ); + if ( faultCollectionFromFile.empty() ) { - RiaLogging::error( QString( "Could not open property file: %1" ).arg( fileName ) ); return false; } - qint64 filePos = -1; - + cvf::Collection faults; { - std::vector keywordsAndFilePos; - findKeywordsOnFile( fileName, &keywordsAndFilePos ); - for ( auto kwAndPos : keywordsAndFilePos ) + cvf::Collection faultCollection = eclipseCaseData->mainGrid()->faults(); + for ( size_t i = 0; i < faultCollection.size(); i++ ) { - if ( kwAndPos.keyword == eclipseKeyWord ) + RigFault* f = faultCollection.at( i ); + if ( f->name() == RiaResultNames::undefinedGridFaultName() || + f->name() == RiaResultNames::undefinedGridFaultName() ) { - filePos = kwAndPos.filePos; + // Do not include undefined grid faults, as these are recomputed based on the imported faults from files + continue; } + + faults.push_back( f ); } } - bool isOk = false; - - if ( filePos == -1 ) - { - RiaLogging::error( QString( "Failed to load keyword %1 from file: %2" ).arg( eclipseKeyWord ).arg( fileName ) ); - } - else + for ( size_t i = 0; i < faultCollectionFromFile.size(); i++ ) { - fseek( filePointer, filePos, SEEK_SET ); - - ecl_kw_type* eclipseKeywordData = - ecl_kw_fscanf_alloc_grdecl_dynamic__( filePointer, - eclipseKeyWord.toLatin1().data(), - false, - ecl_type_create_from_type( ECL_FLOAT_TYPE ) ); + RigFault* faultFromFile = faultCollectionFromFile.at( i ); - if ( eclipseKeywordData ) + bool existFaultWithSameName = false; + for ( size_t j = 0; j < faults.size(); j++ ) { - QString errMsg; - isOk = readDataFromKeyword( eclipseKeywordData, caseData, resultName, &errMsg ); - if ( !isOk ) + RigFault* existingFault = faults.at( j ); + + if ( existingFault->name() == faultFromFile->name() ) { - RiaLogging::error( QString( "Failed to read property: %1" ).arg( errMsg ) ); + existFaultWithSameName = true; } - ecl_kw_free( eclipseKeywordData ); - } - else - { - RiaLogging::error( QString( "Failed to load keyword %1 from file: %2" ).arg( eclipseKeyWord ).arg( fileName ) ); - } - } - - fclose( filePointer ); - - return isOk; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RifEclipseInputFileTools::readDataFromKeyword( ecl_kw_type* eclipseKeywordData, - RigEclipseCaseData* caseData, - const QString& resultName, - QString* errMsg ) -{ - CVF_ASSERT( caseData ); - CVF_ASSERT( eclipseKeywordData ); - CVF_ASSERT( errMsg ); - - // Number of values to allocate in the result data structure. Must either be number of active cells or - // number of total cells in case to match the criteria in RigCaseCellResultsData::isUsingGlobalActiveIndex - size_t scalarValueCount = 0u; - - { - bool mathingItemCount = false; - size_t keywordItemCount = static_cast( ecl_kw_get_size( eclipseKeywordData ) ); - if ( keywordItemCount == caseData->mainGrid()->cellCount() ) - { - mathingItemCount = true; - - scalarValueCount = caseData->mainGrid()->globalCellArray().size(); - } - else if ( keywordItemCount == - caseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL )->reservoirActiveCellCount() ) - { - mathingItemCount = true; - scalarValueCount = - caseData->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL )->reservoirActiveCellCount(); } - if ( !mathingItemCount ) + if ( !existFaultWithSameName ) { - QString errFormat( "Size mismatch: Main Grid has %1 cells, keyword %2 has %3 cells" ); - *errMsg = errFormat.arg( caseData->mainGrid()->cellCount() ).arg( resultName ).arg( keywordItemCount ); - return false; + faults.push_back( faultFromFile ); } } - RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::INPUT_PROPERTY, resultName ); - caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createResultEntry( resAddr, false ); - - auto newPropertyData = - caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->modifiableCellScalarResultTimesteps( resAddr ); - - newPropertyData->push_back( std::vector() ); - newPropertyData->at( 0 ).resize( scalarValueCount, HUGE_VAL ); - - ecl_kw_get_data_as_double( eclipseKeywordData, newPropertyData->at( 0 ).data() ); + eclipseCaseData->mainGrid()->setFaults( faults ); return true; } -//-------------------------------------------------------------------------------------------------- -/// Read all the keywords from a file -// -// This code was originally written using QTextStream, but due to a bug in Qt version up to 4.8.0 -// we had to implement the reading using QFile and QFile::readLine -// -// See: -// https://bugreports.qt-project.org/browse/QTBUG-9814 -// -//-------------------------------------------------------------------------------------------------- -void RifEclipseInputFileTools::findKeywordsOnFile( const QString& fileName, std::vector* keywords ) -{ - char buf[1024]; - - QFile data( fileName ); - data.open( QFile::ReadOnly ); - - QString line; - qint64 filepos = -1; - qint64 lineLength = -1; - - do - { - lineLength = data.readLine( buf, sizeof( buf ) ); - if ( lineLength > 0 ) - { - line = QString::fromLatin1( buf ); - RifKeywordAndFilePos keyPos; - - filepos = data.pos() - lineLength; - keyPos.filePos = filepos; - - QString trimmedLine = line; - int commentStart = trimmedLine.indexOf( "--" ); - if ( commentStart > 0 ) - { - trimmedLine = trimmedLine.left( commentStart ); - } - - trimmedLine = trimmedLine.trimmed(); - if ( !trimmedLine.isEmpty() && trimmedLine[0].isLetter() ) - { - // Ensure we don't attempt to find keywords with a space in it. - QStringList keywordCandidates = trimmedLine.split( " " ); - if ( !keywordCandidates.isEmpty() ) - { - QString keywordCandidate = keywordCandidates.front(); - - keyPos.keyword = keywordCandidate; - keywords->push_back( keyPos ); - // qDebug() << keyPos.keyword << " - " << keyPos.filePos; - } - } - } - } while ( lineLength != -1 ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1076,33 +827,6 @@ void RifEclipseInputFileTools::parseAndReadPathAliasKeyword( const QString& } while ( !data.atEnd() ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const std::vector& RifEclipseInputFileTools::invalidPropertyDataKeywords() -{ - static std::vector keywords; - static bool isInitialized = false; - if ( !isInitialized ) - { - // Related to geometry - keywords.push_back( "COORD" ); - keywords.push_back( "ZCORN" ); - keywords.push_back( "SPECGRID" ); - keywords.push_back( "MAPAXES" ); - keywords.push_back( "NOECHO" ); - keywords.push_back( "ECHO" ); - keywords.push_back( "MAPUNITS" ); - keywords.push_back( "GRIDUNIT" ); - - keywords.push_back( faultsKeyword ); - - isInitialized = true; - } - - return keywords; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1282,23 +1006,6 @@ qint64 RifEclipseInputFileTools::findKeyword( const QString& keyword, QFile& fil return -1; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RifEclipseInputFileTools::isValidDataKeyword( const QString& keyword ) -{ - const std::vector& keywordsToSkip = RifEclipseInputFileTools::invalidPropertyDataKeywords(); - for ( const QString& keywordToSkip : keywordsToSkip ) - { - if ( keywordToSkip == keyword.toUpper() ) - { - return false; - } - } - - return true; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h index 380e9b7e68..c6351298da 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h +++ b/ApplicationLibCode/FileInterface/RifEclipseInputFileTools.h @@ -97,37 +97,17 @@ class RifEclipseInputFileTools : public cvf::Object const cvf::Vec3st& max = cvf::Vec3st::UNDEFINED, const cvf::Vec3st& refinement = cvf::Vec3st( 1, 1, 1 ) ); - // Returns map of assigned resultName and Eclipse Keyword. - static std::map readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); - static bool readProperty( const QString& fileName, - RigEclipseCaseData* eclipseCase, - const QString& eclipseKeyWord, - const QString& resultName ); + static bool importFaultsFromFile( RigEclipseCaseData* eclipseCase, const QString& fileName ); static void readFaultsInGridSection( const QString& fileName, cvf::Collection* faults, std::vector* filenamesWithFaults, const QString& faultIncludeFileAbsolutePathPrefix ); - static void readFaults( const QString& fileName, - const std::vector& fileKeywords, - cvf::Collection* faults ); static void parseAndReadFaults( const QString& fileName, cvf::Collection* faults ); - static void readFaults( QFile& data, qint64 filePos, cvf::Collection* faults, bool* isEditKeywordDetected ); - static void findKeywordsOnFile( const QString& fileName, std::vector* keywords ); - static void parseAndReadPathAliasKeyword( const QString& fileName, std::vector>* pathAliasDefinitions ); - static bool - readFaultsAndParseIncludeStatementsRecursively( QFile& file, - qint64 startPos, - const std::vector>& pathAliasDefinitions, - cvf::Collection* faults, - std::vector* filenamesWithFaults, - bool* isEditKeywordDetected, - const QString& faultIncludeFileAbsolutePathPrefix ); - static bool readKeywordAndParseIncludeStatementsRecursively( const QString& keyword, const QString& keywordToStopParsing, @@ -141,12 +121,27 @@ class RifEclipseInputFileTools : public cvf::Object // includeStatementAbsolutePathPrefix ); - static void readKeywordDataContent( QFile& data, qint64 filePos, QStringList* textContent, bool* isEditKeywordDetected ); static RiaDefines::EclipseUnitSystem readUnitSystem( QFile& file, qint64 gridunitPos ); static cvf::StructGridInterface::FaceEnum faceEnumFromText( const QString& faceString ); private: + static void readFaults( QFile& data, qint64 filePos, cvf::Collection* faults, bool* isEditKeywordDetected ); + + static void readFaults( const QString& fileName, + const std::vector& fileKeywords, + cvf::Collection* faults ); + static bool + readFaultsAndParseIncludeStatementsRecursively( QFile& file, + qint64 startPos, + const std::vector>& pathAliasDefinitions, + cvf::Collection* faults, + std::vector* filenamesWithFaults, + bool* isEditKeywordDetected, + const QString& faultIncludeFileAbsolutePathPrefix ); + + static void readKeywordDataContent( QFile& data, qint64 filePos, QStringList* textContent, bool* isEditKeywordDetected ); + static bool readDataFromKeyword( ecl_kw_type* eclipseKeywordData, RigEclipseCaseData* caseData, const QString& resultName, @@ -162,7 +157,6 @@ class RifEclipseInputFileTools : public cvf::Object static size_t findFaultByName( const cvf::Collection& faults, const QString& name ); static qint64 findKeyword( const QString& keyword, QFile& file, qint64 startPos ); - static bool isValidDataKeyword( const QString& keyword ); static void writeFaultLine( QTextStream& stream, QString faultName, @@ -173,7 +167,4 @@ class RifEclipseInputFileTools : public cvf::Object cvf::StructGridInterface::FaceType faceType ); static QString faultFaceText( cvf::StructGridInterface::FaceType faceType ); - -private: - static const std::vector& invalidPropertyDataKeywords(); }; diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp index d2023460d2..581ab2c71f 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.cpp @@ -18,10 +18,13 @@ #include "RifEclipseInputPropertyLoader.h" +#include "RiaLogging.h" + #include "RifEclipseInputFileTools.h" +#include "RifEclipseKeywordContent.h" +#include "RifEclipseTextFileReader.h" #include "RifReaderEclipseInput.h" -#include "RigActiveCellInfo.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" #include "RigMainGrid.h" @@ -32,262 +35,202 @@ #include "cafProgressInfo.h" -#include +#include //-------------------------------------------------------------------------------------------------- -/// Loads input property data from the gridFile and additional files -/// Creates new InputProperties if necessary, and flags the unused ones as obsolete +/// //-------------------------------------------------------------------------------------------------- void RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( RimEclipseInputPropertyCollection* inputPropertyCollection, RigEclipseCaseData* eclipseCaseData, const std::vector& filenames, bool allowImportOfFaults ) { - CVF_ASSERT( inputPropertyCollection ); - CVF_ASSERT( eclipseCaseData ); - CVF_ASSERT( eclipseCaseData->mainGrid()->gridPointDimensions() != cvf::Vec3st( 0, 0, 0 ) ); + std::vector existingProperties = inputPropertyCollection->inputProperties.childObjects(); - size_t inputPropCount = inputPropertyCollection->inputProperties.size(); - caf::ProgressInfo progInfo( static_cast( filenames.size() * inputPropCount ), "Reading Input properties" ); + caf::ProgressInfo progInfo( static_cast( filenames.size() ), "Reading Input properties" ); - int i = 0; - for ( const QString& filename : filenames ) + for ( const auto& filename : filenames ) { - int progress = static_cast( i * inputPropCount ); progInfo.setProgressDescription( filename ); - QFileInfo fileNameInfo( filename ); - bool isExistingFile = fileNameInfo.exists(); + auto resultNamesEclipseKeywords = RifEclipseInputPropertyLoader::readProperties( filename, eclipseCaseData ); - // Find all the keywords present on the file - std::set fileKeywordSet = extractKeywordsOnFile( filenames[i], isExistingFile ); + for ( const auto& [resultName, eclipseKeyword] : resultNamesEclipseKeywords ) + { + bool isProperyPresent = false; + bool isFaultKeywordPresent = false; + for ( const auto* propertyObj : existingProperties ) + { + if ( propertyObj->resultName() == resultName ) + { + isProperyPresent = true; + } + else if ( propertyObj->resultName() == "FAULTS" ) + { + isFaultKeywordPresent = true; + } + } - readDataForEachInputProperty( inputPropertyCollection, - eclipseCaseData, - filename, - isExistingFile, - allowImportOfFaults, - &fileKeywordSet, - &progInfo, - progress ); + if ( !isProperyPresent ) + { + RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; + inputProperty->resultName = resultName; + inputProperty->eclipseKeyword = eclipseKeyword; + inputProperty->fileName = filename; + inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; + inputPropertyCollection->inputProperties.push_back( inputProperty ); + } - progInfo.setProgress( static_cast( progress + inputPropCount ) ); + if ( allowImportOfFaults && isFaultKeywordPresent ) + { + RifEclipseInputFileTools::importFaultsFromFile( eclipseCaseData, filename ); + } + } - // Check if there are more known property keywords left on file. - // If it is, read them and create inputProperty objects - readInputPropertiesForRemainingKeywords( inputPropertyCollection, eclipseCaseData, filename, &fileKeywordSet ); - i++; + progInfo.incrementProgress(); } - - // All input properties still unknown at this stage is missing a file - setResolvedState( inputPropertyCollection, RimEclipseInputProperty::UNKNOWN, RimEclipseInputProperty::FILE_MISSING ); } //-------------------------------------------------------------------------------------------------- -/// Loads input property data from additional files. +/// //-------------------------------------------------------------------------------------------------- -bool RifEclipseInputPropertyLoader::readInputPropertiesFromFiles( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - bool importFaults, - const std::vector& filenames ) +QString RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( RigEclipseCaseData* eclipseCase, + const RifEclipseKeywordContent& keywordContent, + QString* errorMessage ) { - for ( const QString& propertyFileName : filenames ) + auto eclipseKeyword = keywordContent.keyword; + if ( isInputPropertyCandidate( eclipseCase, eclipseKeyword, keywordContent.values.size() ) ) { - std::map readProperties = - RifEclipseInputFileTools::readProperties( propertyFileName, eclipseCaseData ); + QString newResultName = eclipseCase->results( RiaDefines::PorosityModelType::MATRIX_MODEL ) + ->makeResultNameUnique( QString::fromStdString( eclipseKeyword ) ); - std::map::iterator it; - for ( it = readProperties.begin(); it != readProperties.end(); ++it ) + if ( appendNewInputPropertyResult( eclipseCase, newResultName, eclipseKeyword, keywordContent.values, errorMessage ) ) { - RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; - inputProperty->resultName = it->first; - inputProperty->eclipseKeyword = it->second; - inputProperty->fileName = propertyFileName; - inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; - inputPropertyCollection->inputProperties.push_back( inputProperty ); - } - - if ( importFaults ) - { - bool anyFaultsImported = importFaultsFromFile( eclipseCaseData, propertyFileName ); - if ( anyFaultsImported ) - { - RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; - inputProperty->resultName = "FAULTS"; - inputProperty->eclipseKeyword = "FAULTS"; - inputProperty->fileName = propertyFileName; - inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; - inputPropertyCollection->inputProperties.push_back( inputProperty ); - } + return newResultName; } } - return true; + return ""; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifEclipseInputPropertyLoader::importFaultsFromFile( RigEclipseCaseData* eclipseCaseData, const QString& fileName ) +void RifEclipseInputPropertyLoader::createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase, + const std::vector& keywordContent ) { - cvf::Collection faultCollectionFromFile; - RifEclipseInputFileTools::parseAndReadFaults( fileName, &faultCollectionFromFile ); - if ( faultCollectionFromFile.empty() ) + for ( const auto& keywordAndValues : keywordContent ) { - return false; + RifEclipseInputPropertyLoader::evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, nullptr ); } +} - cvf::Collection faults; - { - cvf::Collection faultCollection = eclipseCaseData->mainGrid()->faults(); - for ( size_t i = 0; i < faultCollection.size(); i++ ) - { - RigFault* f = faultCollection.at( i ); - if ( f->name() == RiaResultNames::undefinedGridFaultName() || - f->name() == RiaResultNames::undefinedGridFaultName() ) - { - // Do not include undefined grid faults, as these are recomputed based on the imported faults from filesa - continue; - } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifEclipseInputPropertyLoader::isInputPropertyCandidate( const RigEclipseCaseData* caseData, + const std::string& eclipseKeyword, + size_t numberOfValues ) +{ + CVF_ASSERT( caseData ); - faults.push_back( f ); - } - } + if ( !isValidDataKeyword( QString::fromStdString( eclipseKeyword ) ) ) return false; - for ( size_t i = 0; i < faultCollectionFromFile.size(); i++ ) + return ( numberOfValues == caseData->mainGrid()->cellCount() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map RifEclipseInputPropertyLoader::readProperties( const QString& fileName, + RigEclipseCaseData* eclipseCase ) +{ + std::map resultNameAndEclipseNameMap; + + auto keywordContent = RifEclipseTextFileReader::readKeywordAndValues( fileName.toStdString() ); + for ( const auto& keywordAndValues : keywordContent ) { - RigFault* faultFromFile = faultCollectionFromFile.at( i ); + QString errorText; - bool existFaultWithSameName = false; - for ( size_t j = 0; j < faults.size(); j++ ) + QString newResultName = evaluateAndCreateInputPropertyResult( eclipseCase, keywordAndValues, &errorText ); + if ( !newResultName.isEmpty() ) { - RigFault* existingFault = faults.at( j ); - - if ( existingFault->name() == faultFromFile->name() ) - { - existFaultWithSameName = true; - } + resultNameAndEclipseNameMap[newResultName] = QString::fromStdString( keywordAndValues.keyword ); } - - if ( !existFaultWithSameName ) + else { - faults.push_back( faultFromFile ); + RiaLogging::error( errorText ); } } - eclipseCaseData->mainGrid()->setFaults( faults ); - - return true; + return resultNameAndEclipseNameMap; } //-------------------------------------------------------------------------------------------------- -/// Extract keywords from a input property file. +/// //-------------------------------------------------------------------------------------------------- -std::set RifEclipseInputPropertyLoader::extractKeywordsOnFile( const QString& filename, bool isExistingFile ) +const std::vector& RifEclipseInputPropertyLoader::invalidPropertyDataKeywords() { - std::set fileKeywordSet; - if ( isExistingFile ) - { - std::vector fileKeywords; - RifEclipseInputFileTools::findKeywordsOnFile( filename, &fileKeywords ); + // List of keywords that will be skipped when looking for property data - for ( const RifKeywordAndFilePos& fileKeyword : fileKeywords ) - { - fileKeywordSet.insert( fileKeyword.keyword ); - } - } - return fileKeywordSet; + static std::vector keywords = + { "COORD", "ZCORN", "SPECGRID", "MAPAXES", "NOECHO", "ECHO", "MAPUNITS", "GRIDUNIT", "GDORIENT", "INC", "DEC", "FAULTS" }; + + return keywords; } //-------------------------------------------------------------------------------------------------- -/// Change the resolved state of all matching input properties in a collection. +/// //-------------------------------------------------------------------------------------------------- -void RifEclipseInputPropertyLoader::setResolvedState( RimEclipseInputPropertyCollection* inputPropertyCollection, - RimEclipseInputProperty::ResolveState currentState, - RimEclipseInputProperty::ResolveState newState ) +bool RifEclipseInputPropertyLoader::isValidDataKeyword( const QString& keyword ) { - for ( RimEclipseInputProperty* inputProperty : inputPropertyCollection->inputProperties ) + const std::vector& keywordsToSkip = RifEclipseInputPropertyLoader::invalidPropertyDataKeywords(); + for ( const QString& keywordToSkip : keywordsToSkip ) { - if ( inputProperty->resolvedState() == currentState ) + if ( keywordToSkip == keyword.toUpper() ) { - inputProperty->resolvedState = newState; + return false; } } + + return true; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifEclipseInputPropertyLoader::readDataForEachInputProperty( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const QString& filename, - bool isExistingFile, - bool allowImportOfFaults, - std::set* fileKeywordSet, - caf::ProgressInfo* progressInfo, - int progressOffset ) +bool RifEclipseInputPropertyLoader::appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& eclipseKeyword, + const std::vector& values, + QString* errMsg ) { - // Find the input property objects referring to the file - std::vector ipsUsingThisFile = inputPropertyCollection->findInputProperties( filename ); + if ( !isValidDataKeyword( QString::fromStdString( eclipseKeyword ) ) ) return false; + + CVF_ASSERT( caseData ); - // Read property data for each inputProperty - int progress = 0; - for ( RimEclipseInputProperty* inputProperty : ipsUsingThisFile ) + size_t keywordItemCount = values.size(); + if ( keywordItemCount != caseData->mainGrid()->cellCount() ) { - if ( !isExistingFile ) + if ( errMsg ) { - inputProperty->resolvedState = RimEclipseInputProperty::FILE_MISSING; + QString errFormat( "Size mismatch: Main Grid has %1 cells, keyword %2 has %3 cells" ); + *errMsg = errFormat.arg( caseData->mainGrid()->cellCount() ).arg( resultName ).arg( keywordItemCount ); } - else - { - inputProperty->resolvedState = RimEclipseInputProperty::KEYWORD_NOT_IN_FILE; - QString kw = inputProperty->eclipseKeyword(); - if ( kw == "FAULTS" ) - { - if ( allowImportOfFaults ) - { - importFaultsFromFile( eclipseCaseData, filename ); - } - } - else - { - if ( fileKeywordSet->count( kw ) ) - { - if ( RifEclipseInputFileTools::readProperty( filename, eclipseCaseData, kw, inputProperty->resultName ) ) - { - inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; - } - } - fileKeywordSet->erase( kw ); - } - } - - progressInfo->setProgress( static_cast( progressOffset + progress ) ); - progress++; + return false; } -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RifEclipseInputPropertyLoader::readInputPropertiesForRemainingKeywords( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const QString& filename, - std::set* fileKeywordSet ) -{ - for ( const QString& fileKeyword : *fileKeywordSet ) - { - QString resultName = - eclipseCaseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->makeResultNameUnique( fileKeyword ); - if ( RifEclipseInputFileTools::readProperty( filename, eclipseCaseData, fileKeyword, resultName ) ) - { - RimEclipseInputProperty* inputProperty = new RimEclipseInputProperty; - inputProperty->resultName = resultName; - inputProperty->eclipseKeyword = fileKeyword; - inputProperty->fileName = filename; - inputProperty->resolvedState = RimEclipseInputProperty::RESOLVED; - inputPropertyCollection->inputProperties.push_back( inputProperty ); - } - } + RigEclipseResultAddress resAddr( RiaDefines::ResultCatType::INPUT_PROPERTY, resultName ); + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createResultEntry( resAddr, false ); + + auto newPropertyData = + caseData->results( RiaDefines::PorosityModelType::MATRIX_MODEL )->modifiableCellScalarResultTimesteps( resAddr ); + + std::vector doubleVals; + doubleVals.insert( doubleVals.begin(), values.begin(), values.end() ); + + newPropertyData->push_back( doubleVals ); + + return true; } diff --git a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h index e9cd2c703a..81b8c92a64 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h +++ b/ApplicationLibCode/FileInterface/RifEclipseInputPropertyLoader.h @@ -18,15 +18,16 @@ #pragma once -#include "RimEclipseInputProperty.h" +#include +#include #include #include -#include - class RimEclipseInputPropertyCollection; class RigEclipseCaseData; +class RifEclipseKeywordContent; + namespace caf { class ProgressInfo; @@ -45,34 +46,30 @@ class RifEclipseInputPropertyLoader const std::vector& filenames, bool allowImportOfFaults ); - static bool readInputPropertiesFromFiles( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - bool importFaults, - const std::vector& filenames ); - - static bool importFaultsFromFile( RigEclipseCaseData* eclipseCase, const QString& fileName ); + static void createInputPropertiesFromKeywords( RigEclipseCaseData* eclipseCase, + const std::vector& keywordContent ); private: // Hide constructor to prevent instantiation RifEclipseInputPropertyLoader(); - static std::set extractKeywordsOnFile( const QString& filename, bool isExistingFile ); + // Returns map of assigned resultName and Eclipse Keyword. + static std::map readProperties( const QString& fileName, RigEclipseCaseData* eclipseCase ); + + static const std::vector& invalidPropertyDataKeywords(); + static bool isValidDataKeyword( const QString& keyword ); - static void setResolvedState( RimEclipseInputPropertyCollection* inputPropertyCollection, - RimEclipseInputProperty::ResolveState currentState, - RimEclipseInputProperty::ResolveState newState ); + static bool isInputPropertyCandidate( const RigEclipseCaseData* caseData, + const std::string& eclipseKeyword, + size_t numberOfValues ); - static void readDataForEachInputProperty( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const QString& filename, - bool isExistingFile, - bool allowImportOfFaults, - std::set* fileKeywordSet, - caf::ProgressInfo* progressInfo, - int progressOffset ); + static bool appendNewInputPropertyResult( RigEclipseCaseData* caseData, + const QString& resultName, + const std::string& eclipseKeyword, + const std::vector& values, + QString* errMsg ); - static void readInputPropertiesForRemainingKeywords( RimEclipseInputPropertyCollection* inputPropertyCollection, - RigEclipseCaseData* eclipseCaseData, - const QString& filename, - std::set* fileKeywordSet ); + static QString evaluateAndCreateInputPropertyResult( RigEclipseCaseData* eclipseCase, + const RifEclipseKeywordContent& keywordContent, + QString* errorMessage ); }; diff --git a/ApplicationLibCode/FileInterface/RifEclipseKeywordContent.h b/ApplicationLibCode/FileInterface/RifEclipseKeywordContent.h new file mode 100644 index 0000000000..013c5329a5 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifEclipseKeywordContent.h @@ -0,0 +1,31 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include + +class RifEclipseKeywordContent +{ +public: + std::string keyword; + std::string content; + std::vector values; + size_t offset; +}; diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp index 31a5b6bd99..b862af5a0b 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.cpp @@ -112,173 +112,47 @@ RifEclipseSummaryAddress::RifEclipseSummaryAddress( SummaryVarCategory //-------------------------------------------------------------------------------------------------- /// Column header text format: [:]:[:][....] //-------------------------------------------------------------------------------------------------- -RifEclipseSummaryAddress RifEclipseSummaryAddress::fromEclipseTextAddress( const std::string& textAddress ) +RifEclipseSummaryAddress RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( const std::string& textAddress ) { - QStringList names = QString().fromStdString( textAddress ).split( ":" ); + auto tokens = RiaStdStringTools::splitString( textAddress, ':' ); bool isErrorResult = false; - if ( names.size() > 1 ) + if ( tokens.size() > 1 ) { - QString name = names[0].trimmed(); - if ( name.compare( "ER", Qt::CaseInsensitive ) == 0 || name.compare( "ERR", Qt::CaseInsensitive ) == 0 || - name.compare( "ERROR", Qt::CaseInsensitive ) == 0 ) + auto firstToken = RiaStdStringTools::trimString( tokens[0] ); + firstToken = RiaStdStringTools::toUpper( firstToken ); + + if ( ( firstToken == "ER" ) || ( firstToken == "ERR" ) || ( firstToken == "ERROR" ) ) { isErrorResult = true; - names.pop_front(); + tokens.erase( tokens.begin() ); } } - else if ( names.empty() ) - { - return RifEclipseSummaryAddress(); - } - - std::string quantityName = names[0].trimmed().toStdString(); - names.pop_front(); - - SummaryVarCategory category = identifyCategory( quantityName ); - - RifEclipseSummaryAddress address; - switch ( category ) - { - case SUMMARY_FIELD: - address = fieldAddress( quantityName ); - break; - - case SUMMARY_AQUIFER: - if ( names.size() > 0 ) - address = aquiferAddress( quantityName, RiaStdStringTools::toInt( names[0].toStdString() ) ); - break; - - case SUMMARY_NETWORK: - address = networkAddress( quantityName ); - break; - - case SUMMARY_MISC: - address = miscAddress( quantityName ); - break; - - case SUMMARY_REGION: - if ( names.size() > 0 ) - address = regionAddress( quantityName, RiaStdStringTools::toInt( names[0].toStdString() ) ); - break; - - case SUMMARY_REGION_2_REGION: - if ( names.size() > 0 ) - { - QStringList regions = names[0].trimmed().split( "-" ); - if ( regions.size() == 2 ) - { - address = regionToRegionAddress( quantityName, - RiaStdStringTools::toInt( regions[0].toStdString() ), - RiaStdStringTools::toInt( regions[1].toStdString() ) ); - } - } - break; - - case SUMMARY_WELL_GROUP: - if ( names.size() > 0 ) address = wellGroupAddress( quantityName, names[0].toStdString() ); - break; - - case SUMMARY_WELL: - if ( names.size() > 0 ) address = wellAddress( quantityName, names[0].toStdString() ); - break; - - case SUMMARY_WELL_COMPLETION: - if ( names.size() > 1 ) - { - QStringList ijk = names[1].trimmed().split( "," ); - if ( ijk.size() == 3 ) - { - address = wellCompletionAddress( quantityName, - names[0].toStdString(), - RiaStdStringTools::toInt( ijk[0].toStdString() ), - RiaStdStringTools::toInt( ijk[1].toStdString() ), - RiaStdStringTools::toInt( ijk[2].toStdString() ) ); - } - } - break; - - case SUMMARY_WELL_LGR: - if ( names.size() > 1 ) - address = wellLgrAddress( quantityName, names[0].toStdString(), names[1].toStdString() ); - break; - - case SUMMARY_WELL_COMPLETION_LGR: - if ( names.size() > 2 ) - { - QStringList ijk = names[2].trimmed().split( "," ); - if ( ijk.size() == 3 ) - { - address = wellCompletionLgrAddress( quantityName, - names[0].toStdString(), - names[1].toStdString(), - RiaStdStringTools::toInt( ijk[0].toStdString() ), - RiaStdStringTools::toInt( ijk[1].toStdString() ), - RiaStdStringTools::toInt( ijk[2].toStdString() ) ); - } - } - break; - - case SUMMARY_WELL_SEGMENT: - if ( names.size() > 1 ) - address = wellSegmentAddress( quantityName, - names[0].toStdString(), - RiaStdStringTools::toInt( names[1].toStdString() ) ); - break; - - case SUMMARY_BLOCK: - if ( names.size() > 0 ) - { - QStringList ijk = names[0].trimmed().split( "," ); - if ( ijk.size() == 3 ) - { - address = blockAddress( quantityName, - RiaStdStringTools::toInt( ijk[0].toStdString() ), - RiaStdStringTools::toInt( ijk[1].toStdString() ), - RiaStdStringTools::toInt( ijk[2].toStdString() ) ); - } - } - break; - case SUMMARY_BLOCK_LGR: - if ( names.size() > 1 ) - { - QStringList ijk = names[1].trimmed().split( "," ); - if ( ijk.size() == 3 ) - { - address = blockLgrAddress( quantityName, - names[0].toStdString(), - RiaStdStringTools::toInt( ijk[0].toStdString() ), - RiaStdStringTools::toInt( ijk[1].toStdString() ), - RiaStdStringTools::toInt( ijk[2].toStdString() ) ); - } - } - break; - - case SUMMARY_CALCULATED: - address = calculatedAddress( quantityName, RiaStdStringTools::toInt( names[0].toStdString() ) ); - break; - - case SUMMARY_IMPORTED: - case SUMMARY_INVALID: - default: - break; - } + auto address = fromTokens( tokens ); if ( address.category() == SUMMARY_INVALID || address.category() == SUMMARY_IMPORTED ) { - // Address category not recognized, use complete text address - // QString addr = QString::fromStdString(quantityName) + (!names.empty() ? (":" + names.join(":")) : ""); - QStringList addr = names; - addr.push_front( QString::fromStdString( quantityName ) ); - address = importedAddress( addr.join( ":" ).toStdString() ); + // Address category not recognized, use incoming text string without error prefix as quantity name + auto text = RiaStdStringTools::joinStrings( tokens, ':' ); + address = importedAddress( text ); } if ( isErrorResult ) address.setAsErrorResult(); return address; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::fromEclipseTextAddress( const std::string& textAddress ) +{ + auto tokens = RiaStdStringTools::splitString( textAddress, ':' ); + + return fromTokens( tokens ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -286,9 +160,6 @@ RifEclipseSummaryAddress::SummaryVarCategory RifEclipseSummaryAddress::identifyC { if ( quantityName.size() < 3 || quantityName.size() > 8 ) return SUMMARY_INVALID; - QRegExp regexp( "^[A-Za-z0-9_\\-+#]*$" ); - if ( !regexp.exactMatch( QString::fromStdString( quantityName ) ) ) return SUMMARY_INVALID; - // First, try to lookup vector in vector table auto category = RiuSummaryQuantityNameInfoProvider::instance()->categoryFromQuantityName( quantityName ); if ( category != SUMMARY_INVALID ) return category; @@ -861,6 +732,148 @@ bool RifEclipseSummaryAddress::hasAccumulatedData() const return qBaseName.endsWith( "T" ) || qBaseName.endsWith( "TH" ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RifEclipseSummaryAddress RifEclipseSummaryAddress::fromTokens( const std::vector& tokens ) +{ + if ( tokens.empty() ) + { + return RifEclipseSummaryAddress(); + } + + std::string quantityName; + std::string token1; + std::string token2; + + quantityName = tokens[0]; + + if ( tokens.size() > 1 ) token1 = tokens[1]; + if ( tokens.size() > 2 ) token2 = tokens[2]; + + SummaryVarCategory category = identifyCategory( quantityName ); + + switch ( category ) + { + case SUMMARY_FIELD: + return fieldAddress( quantityName ); + + case SUMMARY_AQUIFER: + if ( !token1.empty() ) return aquiferAddress( quantityName, RiaStdStringTools::toInt( token1 ) ); + break; + + case SUMMARY_NETWORK: + return networkAddress( quantityName ); + break; + + case SUMMARY_MISC: + return miscAddress( quantityName ); + break; + + case SUMMARY_REGION: + if ( !token1.empty() ) return regionAddress( quantityName, RiaStdStringTools::toInt( token1 ) ); + break; + + case SUMMARY_REGION_2_REGION: + if ( !token1.empty() ) + { + auto regions = RiaStdStringTools::splitString( token1, '-' ); + if ( regions.size() == 2 ) + { + return regionToRegionAddress( quantityName, + RiaStdStringTools::toInt( regions[0] ), + RiaStdStringTools::toInt( regions[1] ) ); + } + } + break; + + case SUMMARY_WELL_GROUP: + if ( !token1.empty() ) return wellGroupAddress( quantityName, token1 ); + break; + + case SUMMARY_WELL: + if ( !token1.empty() ) return wellAddress( quantityName, token1 ); + break; + + case SUMMARY_WELL_COMPLETION: + if ( !token2.empty() ) + { + auto ijk = RiaStdStringTools::splitString( token2, ',' ); + if ( ijk.size() == 3 ) + { + return wellCompletionAddress( quantityName, + token1, + RiaStdStringTools::toInt( ijk[0] ), + RiaStdStringTools::toInt( ijk[1] ), + RiaStdStringTools::toInt( ijk[2] ) ); + } + } + break; + + case SUMMARY_WELL_LGR: + if ( !token1.empty() && !token2.empty() ) return wellLgrAddress( quantityName, token1, token2 ); + break; + + case SUMMARY_WELL_COMPLETION_LGR: + if ( tokens.size() > 2 ) + { + auto token3 = tokens[3]; + auto ijk = RiaStdStringTools::splitString( token3, ',' ); + if ( ijk.size() == 3 ) + { + return wellCompletionLgrAddress( quantityName, + token1, + token2, + RiaStdStringTools::toInt( ijk[0] ), + RiaStdStringTools::toInt( ijk[1] ), + RiaStdStringTools::toInt( ijk[2] ) ); + } + } + break; + + case SUMMARY_WELL_SEGMENT: + if ( !token2.empty() ) + return wellSegmentAddress( quantityName, token1, RiaStdStringTools::toInt( token2 ) ); + break; + + case SUMMARY_BLOCK: + if ( !token1.empty() ) + { + auto ijk = RiaStdStringTools::splitString( token1, ',' ); + if ( ijk.size() == 3 ) + { + return blockAddress( quantityName, + RiaStdStringTools::toInt( ijk[0] ), + RiaStdStringTools::toInt( ijk[1] ), + RiaStdStringTools::toInt( ijk[2] ) ); + } + } + break; + + case SUMMARY_BLOCK_LGR: + if ( !token2.empty() ) + { + auto ijk = RiaStdStringTools::splitString( token2, ',' ); + if ( ijk.size() == 3 ) + { + return blockLgrAddress( quantityName, + token1, + RiaStdStringTools::toInt( ijk[0] ), + RiaStdStringTools::toInt( ijk[1] ), + RiaStdStringTools::toInt( ijk[2] ) ); + } + } + break; + + case SUMMARY_IMPORTED: + case SUMMARY_INVALID: + default: + break; + } + + return RifEclipseSummaryAddress(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h index dae8f6aabe..719aa9b9b4 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h +++ b/ApplicationLibCode/FileInterface/RifEclipseSummaryAddress.h @@ -125,7 +125,9 @@ class RifEclipseSummaryAddress // Static specialized creation methods static RifEclipseSummaryAddress fromEclipseTextAddress( const std::string& textAddress ); - static SummaryVarCategory identifyCategory( const std::string& quantityName ); + static RifEclipseSummaryAddress fromEclipseTextAddressParseErrorTokens( const std::string& textAddress ); + + static SummaryVarCategory identifyCategory( const std::string& quantityName ); static RifEclipseSummaryAddress fieldAddress( const std::string& quantityName ); static RifEclipseSummaryAddress aquiferAddress( const std::string& quantityName, int aquiferNumber ); @@ -209,6 +211,8 @@ class RifEclipseSummaryAddress static QString baseQuantityName( const QString& quantityName ); private: + static RifEclipseSummaryAddress fromTokens( const std::vector& tokens ); + bool isValidEclipseCategory() const; static std::tuple ijkTupleFromUiText( const std::string& s ); std::string formatUiTextRegionToRegion() const; diff --git a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp new file mode 100644 index 0000000000..255ae2a9e0 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.cpp @@ -0,0 +1,278 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifEclipseTextFileReader.h" +#include "RifEclipseKeywordContent.h" + +// Utility class for fast conversion from string to float +#include "fast_float/include/fast_float/fast_float.h" + +// Utility class memory mapping of files +#include "mio/mio.hpp" + +#include "RiaPreferencesSystem.h" +#include "RiaStdStringTools.h" + +#include +#include +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifEclipseTextFileReader::readKeywordAndValues( const std::string& filename ) +{ + if ( RiaPreferencesSystem::current()->eclipseTextFileReaderMode() == + RiaPreferencesSystem::EclipseTextFileReaderMode::MEMORY_MAPPED_FILE ) + { + return readKeywordAndValuesMemoryMappedFile( filename ); + } + + return readKeywordAndValuesFile( filename ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifEclipseTextFileReader::readKeywordAndValuesFile( const std::string& filename ) +{ + std::string stringData; + + std::ifstream inFile; + inFile.open( filename ); + + std::stringstream strStream; + strStream << inFile.rdbuf(); + + stringData = strStream.str(); + + return parseStringData( stringData ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RifEclipseTextFileReader::readKeywordAndValuesMemoryMappedFile( const std::string& filename ) +{ + mio::mmap_source mmap( filename ); + + std::error_code error; + mio::mmap_sink rw_mmap = mio::make_mmap_sink( filename, 0, mio::map_entire_file, error ); + std::string_view stringData = rw_mmap.data(); + + return parseStringData( stringData ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair> + RifEclipseTextFileReader::readKeywordAndValues( const std::string_view& stringData, const size_t offset, size_t& bytesRead ) +{ + std::vector values; + + const auto commentChar = '-'; + + std::string keywordName; + std::string_view line; + bool isEndTokenKeywordRead = false; + + bytesRead = 0; + float value = 0.0f; + + bool isFaultKeyword = false; + + while ( !isEndTokenKeywordRead && ( offset + bytesRead < stringData.size() ) ) + { + size_t bytesReadLine = 0; + line = readLine( stringData, offset + bytesRead, bytesReadLine ); + bytesRead += bytesReadLine; + + if ( isFaultKeyword ) + { + // Read data until the FAULTS section is closed with a single / on one line + ltrim( line ); + if ( !line.empty() && line[0] == '/' ) + { + return std::make_pair( keywordName, values ); + } + continue; + } + + // Check for '--', used to define start of comments + if ( line.size() > 2 && line[0] == commentChar && line[1] == commentChar ) continue; + + if ( keywordName.empty() ) + { + trim( line ); + if ( !line.empty() ) + { + keywordName = line; + if ( keywordName == "FAULTS" ) isFaultKeyword = true; + } + continue; + } + + if ( !isEndTokenKeywordRead ) + { + size_t start = 0; + size_t end = 0; + + // Index in token for the '*' character used to define a multiplier for the float value + // + size_t multiplierIndex = 0; + + while ( ( start = line.find_first_not_of( RifEclipseTextFileReader::m_whiteSpace, end ) ) != std::string::npos ) + { + end = line.find_first_of( RifEclipseTextFileReader::m_whiteSpace, start ); + + int multiplier = 1; + + multiplierIndex = line.find_first_of( '*', start ); + if ( multiplierIndex < end ) + { + int multiplierCandidate = 1; + + if ( RiaStdStringTools::toInt( line.substr( start, multiplierIndex - start ), multiplierCandidate ) ) + { + multiplier = multiplierCandidate; + } + + start = multiplierIndex + 1; + } + + auto resultObject = fast_float::from_chars( line.data() + start, line.data() + end, value ); + if ( resultObject.ec == std::errc() ) + { + for ( size_t i = 0; i < static_cast( multiplier ); i++ ) + { + values.emplace_back( value ); + } + } + } + } + + // End of keyword is defined by '/' + if ( line.find_first_of( '/' ) != std::string::npos ) + { + isEndTokenKeywordRead = true; + continue; + } + } + + return std::make_pair( keywordName, values ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifEclipseTextFileReader::parseStringData( const std::string_view& stringData ) +{ + size_t offset = 0; + size_t bytesRead = 0; + + std::vector dataObjects; + + while ( offset < stringData.size() ) + { + auto [keyword, values] = RifEclipseTextFileReader::readKeywordAndValues( stringData, offset, bytesRead ); + + if ( !keyword.empty() ) + { + RifEclipseKeywordContent content; + content.keyword = keyword; + content.offset = offset; + if ( values.empty() ) + { + content.content = stringData.substr( offset, bytesRead ); + } + else + { + content.values = values; + } + + dataObjects.emplace_back( content ); + } + + offset += bytesRead; + } + + return dataObjects; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string_view RifEclipseTextFileReader::readLine( const std::string_view& source, const size_t offset, size_t& bytesRead ) +{ + if ( offset >= source.size() ) return {}; + + auto start = source.find_first_not_of( RifEclipseTextFileReader::m_whiteSpace, offset ); + if ( start == std::string::npos ) + { + bytesRead = source.size() - offset; + return source.substr( offset, bytesRead ); + } + + auto end = source.find_first_of( '\n', start ); + if ( end != std::string::npos ) + { + // Add 1 to skip the \n we have found + bytesRead = end - offset + 1; + return source.substr( start, end - start ); + } + + // No line shift found, reached end of string data + end = source.size(); + + bytesRead = end - offset; + return source.substr( start, bytesRead ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifEclipseTextFileReader::rtrim( std::string_view& s, const char* t /*= ws */ ) +{ + if ( s.empty() ) return; + + s = s.substr( 0, s.find_last_not_of( t ) + 1 ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifEclipseTextFileReader::ltrim( std::string_view& s, const char* t /*= ws */ ) +{ + if ( s.empty() ) return; + + s = s.substr( s.find_first_not_of( t ), s.size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifEclipseTextFileReader::trim( std::string_view& s, const char* t /*= ws */ ) +{ + if ( s.empty() ) return; + + rtrim( s, t ); + ltrim( s, t ); +} diff --git a/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h new file mode 100644 index 0000000000..259a49e9d9 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifEclipseTextFileReader.h @@ -0,0 +1,64 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RifReaderInterface.h" + +class RifEclipseKeywordContent; + +//================================================================================================== +// +// File interface for Eclipse output files +// +//================================================================================================== +class RifEclipseTextFileReader +{ +public: + // Settings in Preferences will be used to forward to either file-direct or memory mapped file reader + static std::vector readKeywordAndValues( const std::string& filename ); + + // Read data directly from file + static std::vector readKeywordAndValuesFile( const std::string& filename ); + + // Read data using memory mapped file + static std::vector readKeywordAndValuesMemoryMappedFile( const std::string& filename ); + + // Data import function, public to be able to use from unit test + static std::pair> + readKeywordAndValues( const std::string_view& stringData, const size_t startOffset, size_t& bytesRead ); + +private: + static constexpr const char* m_whiteSpace = " \t\n\r\f\v"; + + // TODO: Make private or move to separate file, now public to be able to test code +public: + static std::string_view readLine( const std::string_view& source, const size_t offset, size_t& bytesRead ); + + // trim from end of string (right) + static void rtrim( std::string_view& s, const char* t = m_whiteSpace ); + + // trim from beginning of string (left) + static void ltrim( std::string_view& s, const char* t = m_whiteSpace ); + + // trim from both ends of string (right then left) + static void trim( std::string_view& s, const char* t = m_whiteSpace ); + + // Parse string data for Eclipse keywords + static std::vector parseStringData( const std::string_view& stringData ); +}; diff --git a/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp b/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp index 2fd5138d9b..36912a1381 100644 --- a/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp +++ b/ApplicationLibCode/FileInterface/RifEclipseUserDataKeywordTools.cpp @@ -365,7 +365,7 @@ bool RifEclipseUserDataKeywordTools::knownKeywordsWithZeroRequiredHeaderLines( c //-------------------------------------------------------------------------------------------------- void RifEclipseUserDataKeywordTools::extractThreeInts( int* cellI, int* cellJ, int* cellK, const std::string& line ) { - std::vector words = RiaStdStringTools::splitStringBySpace( line ); + std::vector words = RiaStdStringTools::splitString( line, ' ' ); if ( words.size() > 2 ) { *cellI = RiaStdStringTools::toInt( words[0] ); diff --git a/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.cpp b/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.cpp index 006ddec513..a220691015 100644 --- a/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.cpp @@ -33,11 +33,12 @@ //-------------------------------------------------------------------------------------------------- bool RifEnsembleFractureStatisticsExporter::writeAsStimPlanXml( const std::vector>& statistics, const std::vector>& properties, - const QString& filePath, - const std::vector& gridXs, - const std::vector& gridYs, - double time, - RiaDefines::EclipseUnitSystem unitSystem ) + const QString& filePath, + const std::vector& gridXs, + const std::vector& gridYs, + double time, + RiaDefines::EclipseUnitSystem unitSystem, + RigStimPlanFractureDefinition::Orientation orientation ) { QFile data( filePath ); if ( !data.open( QFile::WriteOnly | QFile::Truncate ) ) @@ -47,6 +48,7 @@ bool RifEnsembleFractureStatisticsExporter::writeAsStimPlanXml( const std::vecto QTextStream stream( &data ); appendHeaderToStream( stream ); + appendOrientationToStream( stream, orientation ); appendGridDimensionsToStream( stream, gridXs, gridYs, unitSystem ); appendPropertiesToStream( stream, statistics, properties, gridYs, time ); appendFooterToStream( stream ); @@ -105,6 +107,19 @@ void RifEnsembleFractureStatisticsExporter::appendPropertiesToStream( stream << "" << endl; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifEnsembleFractureStatisticsExporter::appendOrientationToStream( QTextStream& stream, + RigStimPlanFractureDefinition::Orientation orientation ) +{ + if ( orientation != RigStimPlanFractureDefinition::Orientation::UNDEFINED ) + { + QString orientationString = getStringForOrientation( orientation ); + stream << QString( "%1" ).arg( orientationString ) << endl; + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -150,3 +165,16 @@ QString RifEnsembleFractureStatisticsExporter::getStringForUnitSystem( RiaDefine else return ""; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifEnsembleFractureStatisticsExporter::getStringForOrientation( RigStimPlanFractureDefinition::Orientation orientation ) +{ + if ( orientation == RigStimPlanFractureDefinition::Orientation::TRANSVERSE ) + return "transverse"; + else if ( orientation == RigStimPlanFractureDefinition::Orientation::LONGITUDINAL ) + return "longitudinal"; + else + return ""; +} diff --git a/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.h b/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.h index c8064209e6..99d93470bb 100644 --- a/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.h +++ b/ApplicationLibCode/FileInterface/RifEnsembleFractureStatisticsExporter.h @@ -20,6 +20,8 @@ #include "RiaDefines.h" +#include "RigStimPlanFractureDefinition.h" + #include #include @@ -40,10 +42,12 @@ class RifEnsembleFractureStatisticsExporter const std::vector& gridXs, const std::vector& gridYs, double time, - RiaDefines::EclipseUnitSystem unitSystem ); + RiaDefines::EclipseUnitSystem unitSystem, + RigStimPlanFractureDefinition::Orientation orientation ); private: static void appendHeaderToStream( QTextStream& stream ); + static void appendOrientationToStream( QTextStream& stream, RigStimPlanFractureDefinition::Orientation orientation ); static void appendGridDimensionsToStream( QTextStream& stream, const std::vector& gridXs, const std::vector& gridYs, @@ -56,4 +60,6 @@ class RifEnsembleFractureStatisticsExporter static void appendFooterToStream( QTextStream& stream ); static QString getStringForUnitSystem( RiaDefines::EclipseUnitSystem unitSystem ); + + static QString getStringForOrientation( RigStimPlanFractureDefinition::Orientation orientation ); }; diff --git a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp b/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp index 355739ef34..23630bcf28 100644 --- a/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp +++ b/ApplicationLibCode/FileInterface/RifFaultRAJsonWriter.cpp @@ -36,7 +36,7 @@ bool RifFaultRAJSonWriter::writeToPreprocFile( RimFaultRAPreprocSettings& settin outErrorText = "Unable to write to file \"" + filename + "\" - "; QFile file( filename ); - if ( file.open( QIODevice::ReadWrite ) ) + if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) { QTextStream stream( &file ); @@ -69,7 +69,7 @@ bool RifFaultRAJSonWriter::writeToPostprocFile( int faultID, RimFaultRAPostprocS outErrorText = "Unable to write to file \"" + filename + "\" - "; QFile file( filename ); - if ( file.open( QIODevice::ReadWrite ) ) + if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) { QTextStream stream( &file ); diff --git a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp index 2370a4ee35..560f54f7de 100644 --- a/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifHdf5SummaryExporter.cpp @@ -20,6 +20,7 @@ #include "RiaLogging.h" #include "RiaPreferencesSummary.h" +#include "RiaStdStringTools.h" #include "RifHdf5Exporter.h" #include "RifSummaryReaderInterface.h" @@ -225,6 +226,8 @@ bool RifHdf5SummaryExporter::writeSummaryVectors( RifHdf5Exporter& exporter, Opm } } + std::set exportErrorKeywords; + for ( const auto& nodesForKeyword : mapKeywordToSummaryNodeIndex ) { std::string keyword = nodesForKeyword.first; @@ -237,17 +240,36 @@ bool RifHdf5SummaryExporter::writeSummaryVectors( RifHdf5Exporter& exporter, Opm auto smspecKeywordIndex = summaryNode.smspecKeywordIndex; const QString& smspecKeywordText = QString( "%1" ).arg( smspecKeywordIndex ); - auto dataValuesGroup = exporter.createGroup( &keywordGroup, smspecKeywordText.toStdString() ); - const std::vector& values = sourceSummaryData.get( summaryNode ); - - exporter.writeDataset( dataValuesGroup, datasetName, values ); + try + { + const std::vector& values = sourceSummaryData.get( summaryNode ); + auto dataValuesGroup = exporter.createGroup( &keywordGroup, smspecKeywordText.toStdString() ); - dataValuesGroup.close(); + exporter.writeDataset( dataValuesGroup, datasetName, values ); + dataValuesGroup.close(); + } + catch ( ... ) + { + exportErrorKeywords.insert( keyword ); + } } keywordGroup.close(); } + if ( !exportErrorKeywords.empty() ) + { + std::vector keywordVector; + for ( const auto& k : exportErrorKeywords ) + { + keywordVector.push_back( k ); + } + auto txt = RiaStdStringTools::joinStrings( keywordVector, ',' ); + + QString errorTxt = QString( "Failed to export keywords %1 " ).arg( QString::fromStdString( txt ) ); + RiaLogging::error( errorTxt ); + } + return true; } diff --git a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp index 7da8170bb3..9d11b2f4ec 100644 --- a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.cpp @@ -21,59 +21,60 @@ #include "RiaLogging.h" #include "opm/io/eclipse/ESmry.hpp" +#include "opm/io/eclipse/ExtESmry.hpp" #ifdef USE_OPENMP #include #endif -size_t RifOpmCommonEclipseSummary::sm_createdLodFileCount = 0; +#include + +size_t RifOpmCommonEclipseSummary::sm_createdEsmryFileCount = 0; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RifOpmCommonEclipseSummary::RifOpmCommonEclipseSummary() - : m_useLodsmryFiles( false ) - , m_createLodsmryFiles( false ) + : m_useEsmryFiles( false ) + , m_createEsmryFiles( false ) { } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RifOpmCommonEclipseSummary::~RifOpmCommonEclipseSummary() -{ -} +RifOpmCommonEclipseSummary::~RifOpmCommonEclipseSummary() = default; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifOpmCommonEclipseSummary::useLodsmaryFiles( bool enable ) +void RifOpmCommonEclipseSummary::useEnhancedSummaryFiles( bool enable ) { - m_useLodsmryFiles = enable; + m_useEsmryFiles = enable; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifOpmCommonEclipseSummary::createLodsmaryFiles( bool enable ) +void RifOpmCommonEclipseSummary::createEnhancedSummaryFiles( bool enable ) { - m_createLodsmryFiles = enable; + m_createEsmryFiles = enable; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifOpmCommonEclipseSummary::resetLodCount() +void RifOpmCommonEclipseSummary::resetEnhancedSummaryFileCount() { - sm_createdLodFileCount = 0; + sm_createdEsmryFileCount = 0; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -size_t RifOpmCommonEclipseSummary::numberOfLodFilesCreated() +size_t RifOpmCommonEclipseSummary::numberOfEnhancedSummaryFileCreated() { - return sm_createdLodFileCount; + return sm_createdEsmryFileCount; } //-------------------------------------------------------------------------------------------------- @@ -83,26 +84,34 @@ bool RifOpmCommonEclipseSummary::open( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ) { - if ( !openESmryFile( headerFileName, includeRestartFiles, threadSafeLogger ) ) return false; - - if ( m_createLodsmryFiles && !includeRestartFiles ) + if ( m_createEsmryFiles ) { - // Create the lodsmry file, no-op if already present. - bool hasFileBeenCreated = m_eSmry->make_lodsmry_file(); - - if ( hasFileBeenCreated ) + auto candidateFileName = enhancedSummaryFilename( headerFileName ); + if ( !QFileInfo::exists( candidateFileName ) ) { - RifOpmCommonEclipseSummary::increaseLodFileCount(); + try + { + auto temporarySummaryFile = + std::make_unique( headerFileName.toStdString(), includeRestartFiles ); - // If a LODSMRY file has been created, all data for all vectors has now been loaded into the summary file - // object. Close the file object to make sure allocated data is released, and create a new file object - // that will import only the meta data and no curve data. This is a relatively fast operation. + temporarySummaryFile->make_esmry_file(); - if ( !openESmryFile( headerFileName, includeRestartFiles, threadSafeLogger ) ) return false; + RifOpmCommonEclipseSummary::increaseEsmryFileCount(); + } + catch ( std::exception& e ) + { + QString txt = QString( "Failed to create optimized summary file. Error text : %1" ).arg( e.what() ); + + if ( threadSafeLogger ) threadSafeLogger->error( txt ); + + return false; + } } } - if ( !m_eSmry ) return false; + if ( !openFileReader( headerFileName, includeRestartFiles, threadSafeLogger ) ) return false; + + if ( !m_standardReader && !m_enhancedReader ) return false; buildMetaData(); @@ -122,17 +131,20 @@ const std::vector& RifOpmCommonEclipseSummary::timeSteps( const RifEclip //-------------------------------------------------------------------------------------------------- bool RifOpmCommonEclipseSummary::values( const RifEclipseSummaryAddress& resultAddress, std::vector* values ) const { - if ( m_eSmry ) + auto it = m_summaryAddressToKeywordMap.find( resultAddress ); + if ( it != m_summaryAddressToKeywordMap.end() ) { - auto it = m_adrToSummaryNodeIndex.find( resultAddress ); - if ( it != m_adrToSummaryNodeIndex.end() ) + auto keyword = it->second; + if ( m_enhancedReader ) { - auto index = it->second; - auto node = m_eSmry->summaryNodeList()[index]; - auto fileValues = m_eSmry->get( node ); + auto fileValues = m_enhancedReader->get( keyword ); + values->insert( values->begin(), fileValues.begin(), fileValues.end() ); + } + else if ( m_standardReader ) + { + auto fileValues = m_standardReader->get( keyword ); values->insert( values->begin(), fileValues.begin(), fileValues.end() ); } - return true; } @@ -144,14 +156,18 @@ bool RifOpmCommonEclipseSummary::values( const RifEclipseSummaryAddress& resultA //-------------------------------------------------------------------------------------------------- std::string RifOpmCommonEclipseSummary::unitName( const RifEclipseSummaryAddress& resultAddress ) const { - if ( m_eSmry ) + auto it = m_summaryAddressToKeywordMap.find( resultAddress ); + if ( it != m_summaryAddressToKeywordMap.end() ) { - auto it = m_adrToSummaryNodeIndex.find( resultAddress ); - if ( it != m_adrToSummaryNodeIndex.end() ) + auto keyword = it->second; + if ( m_enhancedReader ) + { + return m_enhancedReader->get_unit( keyword ); + } + + if ( m_standardReader ) { - auto index = it->second; - auto node = m_eSmry->summaryNodeList()[index]; - return m_eSmry->get_unit( node ); + return m_standardReader->get_unit( keyword ); } } @@ -172,33 +188,58 @@ RiaDefines::EclipseUnitSystem RifOpmCommonEclipseSummary::unitSystem() const //-------------------------------------------------------------------------------------------------- void RifOpmCommonEclipseSummary::buildMetaData() { - if ( m_eSmry ) - { - auto dates = m_eSmry->dates(); - for ( const auto& d : dates ) - { - auto timeAsTimeT = std::chrono::system_clock::to_time_t( d ); - m_timeSteps.push_back( timeAsTimeT ); - } + std::vector dates; + std::vector keywords; - auto [addresses, addressMap] = RifOpmCommonSummaryTools::buildMetaData( m_eSmry.get() ); + if ( m_enhancedReader ) + { + dates = m_enhancedReader->dates(); + keywords = m_enhancedReader->keywordList(); + } + else if ( m_standardReader ) + { + dates = m_standardReader->dates(); + keywords = m_standardReader->keywordList(); + } - m_allResultAddresses = addresses; - m_adrToSummaryNodeIndex = addressMap; + for ( const auto& d : dates ) + { + auto timeAsTimeT = std::chrono::system_clock::to_time_t( d ); + m_timeSteps.push_back( timeAsTimeT ); } + + auto [addresses, addressMap] = RifOpmCommonSummaryTools::buildMetaDataKeyword( keywords ); + + m_allResultAddresses = addresses; + m_summaryAddressToKeywordMap = addressMap; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RifOpmCommonEclipseSummary::openESmryFile( const QString& headerFileName, - bool includeRestartFiles, - RiaThreadSafeLogger* threadSafeLogger ) +bool RifOpmCommonEclipseSummary::openFileReader( const QString& headerFileName, + bool includeRestartFiles, + RiaThreadSafeLogger* threadSafeLogger ) { + if ( m_useEsmryFiles ) + { + try + { + auto candidateFileName = enhancedSummaryFilename( headerFileName ); + m_enhancedReader = + std::make_unique( candidateFileName.toStdString(), includeRestartFiles ); + + return true; + } + catch ( ... ) + { + // Do not do anything here, try to open the file using standard esmy reader + } + } + try { - m_eSmry = - std::make_unique( headerFileName.toStdString(), includeRestartFiles, m_useLodsmryFiles ); + m_standardReader = std::make_unique( headerFileName.toStdString(), includeRestartFiles ); } catch ( std::exception& e ) { @@ -215,11 +256,20 @@ bool RifOpmCommonEclipseSummary::openESmryFile( const QString& headerFileN //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RifOpmCommonEclipseSummary::increaseLodFileCount() +void RifOpmCommonEclipseSummary::increaseEsmryFileCount() { // This function can be called from a parallel loop, make it thread safe #pragma omp critical - sm_createdLodFileCount++; + sm_createdEsmryFileCount++; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RifOpmCommonEclipseSummary::enhancedSummaryFilename( const QString& headerFileName ) +{ + QString s( headerFileName ); + return s.replace( ".SMSPEC", ".ESMRY" ); } //-------------------------------------------------------------------------------------------------- @@ -332,3 +382,26 @@ std::pair, std::map, std::map> + RifOpmCommonSummaryTools::buildMetaDataKeyword( const std::vector& keywords ) +{ + std::set addresses; + std::map addressToNodeIndexMap; + + for ( const auto& keyword : keywords ) + { + auto eclAdr = RifEclipseSummaryAddress::fromEclipseTextAddress( keyword ); + + if ( eclAdr.isValid() ) + { + addresses.insert( eclAdr ); + addressToNodeIndexMap[eclAdr] = keyword; + } + } + + return { addresses, addressToNodeIndexMap }; +} diff --git a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h index 4563f47a32..9a45a6114b 100644 --- a/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h +++ b/ApplicationLibCode/FileInterface/RifOpmCommonSummary.h @@ -37,6 +37,7 @@ namespace Opm namespace EclIO { class ESmry; + class ExtESmry; struct SummaryNode; } // namespace EclIO } // namespace Opm @@ -51,6 +52,9 @@ class RifOpmCommonSummaryTools static std::pair, std::map> buildMetaData( const Opm::EclIO::ESmry* summaryFile ); + + static std::pair, std::map> + buildMetaDataKeyword( const std::vector& keywords ); }; //================================================================================================== @@ -63,11 +67,11 @@ class RifOpmCommonEclipseSummary : public RifSummaryReaderInterface RifOpmCommonEclipseSummary(); ~RifOpmCommonEclipseSummary() override; - void useLodsmaryFiles( bool enable ); - void createLodsmaryFiles( bool enable ); + void useEnhancedSummaryFiles( bool enable ); + void createEnhancedSummaryFiles( bool enable ); - static void resetLodCount(); - static size_t numberOfLodFilesCreated(); + static void resetEnhancedSummaryFileCount(); + static size_t numberOfEnhancedSummaryFileCreated(); bool open( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); @@ -78,18 +82,20 @@ class RifOpmCommonEclipseSummary : public RifSummaryReaderInterface private: void buildMetaData(); - bool openESmryFile( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); + bool openFileReader( const QString& headerFileName, bool includeRestartFiles, RiaThreadSafeLogger* threadSafeLogger ); - static void increaseLodFileCount(); + static void increaseEsmryFileCount(); + static QString enhancedSummaryFilename( const QString& headerFileName ); private: - std::unique_ptr m_eSmry; - std::vector m_eSmryKeywords; - std::map m_adrToSummaryNodeIndex; - std::vector m_timeSteps; + std::unique_ptr m_standardReader; + std::unique_ptr m_enhancedReader; + + std::map m_summaryAddressToKeywordMap; + std::vector m_timeSteps; - static size_t sm_createdLodFileCount; + static size_t sm_createdEsmryFileCount; - bool m_useLodsmryFiles; - bool m_createLodsmryFiles; + bool m_useEsmryFiles; + bool m_createEsmryFiles; }; diff --git a/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp b/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp index 09bc31fc73..369e02c351 100644 --- a/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp +++ b/ApplicationLibCode/FileInterface/RifOpmHdf5Summary.cpp @@ -124,7 +124,11 @@ std::string RifOpmHdf5Summary::unitName( const RifEclipseSummaryAddress& resultA { auto index = it->second; auto node = m_eSmry->summaryNodeList()[index]; - return m_eSmry->get_unit( node ); + + if ( m_eSmry->hasKey( node.keyword ) ) + { + return m_eSmry->get_unit( node ); + } } } @@ -180,7 +184,7 @@ bool RifOpmHdf5Summary::openESmryFile( const QString& headerFileName, { try { - m_eSmry = std::make_unique( headerFileName.toStdString(), includeRestartFiles, false ); + m_eSmry = std::make_unique( headerFileName.toStdString(), includeRestartFiles ); } catch ( std::exception& e ) { diff --git a/ApplicationLibCode/FileInterface/RifParameterXmlReader.cpp b/ApplicationLibCode/FileInterface/RifParameterXmlReader.cpp index 8a4650e069..790e439bab 100644 --- a/ApplicationLibCode/FileInterface/RifParameterXmlReader.cpp +++ b/ApplicationLibCode/FileInterface/RifParameterXmlReader.cpp @@ -21,6 +21,7 @@ #include "RimDoubleParameter.h" #include "RimGenericParameter.h" #include "RimIntegerParameter.h" +#include "RimListParameter.h" #include "RimStringParameter.h" #include "RimParameterGroup.h" @@ -52,6 +53,10 @@ RimGenericParameter* getParameterFromTypeStr( QString typestr ) { return new RimStringParameter(); } + else if ( typestr == "list" ) + { + return new RimListParameter(); + } return nullptr; } @@ -76,7 +81,8 @@ bool RifParameterXmlReader::parseFile( QString& outErrorText ) RimParameterGroup* group = nullptr; - std::list reqattrs = { QString( "name" ), QString( "label" ), QString( "type" ) }; + std::list reqGroupAttrs = { QString( "name" ) }; + std::list reqParamAttrs = { QString( "name" ), QString( "label" ), QString( "type" ) }; bool bResult = true; @@ -91,15 +97,35 @@ bool RifParameterXmlReader::parseFile( QString& outErrorText ) m_parameters.push_back( group ); } + // check that we have the required attributes + for ( auto& reqattr : reqGroupAttrs ) + { + if ( !xml.attributes().hasAttribute( reqattr ) ) + { + outErrorText += "Missing required attribute \"" + reqattr + "\" for a parameter group."; + bResult = false; + break; + } + } + if ( !bResult ) break; + group = new RimParameterGroup(); + if ( xml.attributes().hasAttribute( "name" ) ) + { + group->setName( xml.attributes().value( "name" ).toString() ); + } if ( xml.attributes().hasAttribute( "label" ) ) { - group->setName( xml.attributes().value( "label" ).toString() ); + group->setLabel( xml.attributes().value( "label" ).toString() ); } if ( xml.attributes().hasAttribute( "expanded" ) ) { group->setExpanded( xml.attributes().value( "expanded" ).toString().toLower() == "true" ); } + if ( xml.attributes().hasAttribute( "comment" ) ) + { + group->setComment( xml.attributes().value( "comment" ).toString() ); + } continue; } @@ -108,7 +134,7 @@ bool RifParameterXmlReader::parseFile( QString& outErrorText ) if ( group == nullptr ) continue; // check that we have the required attributes - for ( auto& reqattr : reqattrs ) + for ( auto& reqattr : reqParamAttrs ) { if ( !xml.attributes().hasAttribute( reqattr ) ) { @@ -117,6 +143,7 @@ bool RifParameterXmlReader::parseFile( QString& outErrorText ) break; } } + if ( !bResult ) break; // get a parameter of the required type QString paramtypestr = xml.attributes().value( "type" ).toString().toLower(); diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp index 6b1a09b995..e1dd69efa9 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseOutput.cpp @@ -23,7 +23,6 @@ #include "RiaCellDividingTools.h" #include "RiaEclipseUnitTools.h" #include "RiaLogging.h" -#include "RiaPreferences.h" #include "RiaStringEncodingTools.h" #include "RifActiveCellsReader.h" @@ -490,15 +489,14 @@ bool RifReaderEclipseOutput::open( const QString& fileName, RigEclipseCaseData* RigActiveCellInfo* activeCellInfo = m_eclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); - bool includeInactiveCells = RiaPreferences::current()->readerSettings()->includeInactiveCellsInFaultGeometry; - + bool includeInactiveCells = includeInactiveCellsInFaultGeometry(); mainGrid->nncData()->setSourceDataForProcessing( mainGrid, activeCellInfo, includeInactiveCells ); } } { auto task = progress.task( "Handling well information", 10 ); - if ( !RiaPreferences::current()->readerSettings()->skipWellData() ) + if ( !isSkipWellData() ) { readWellCells( mainEclGrid, isImportOfCompleteMswDataEnabled() ); } diff --git a/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp b/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp index 6ec1f08d55..c4cdf56630 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEclipseSummary.cpp @@ -60,54 +60,89 @@ bool RifReaderEclipseSummary::open( const QString& headerFileName, RiaThreadSafe { bool isValid = false; - // Try to create readers. If HDF5 or Opm readers fails to create, use libecl reader + // Create reader as specified by the user using the following fallback strategy + // + // ESMRY + // - if h5 file is present on disk + // - use h5 reader + // - else + // - create ESMRY file if defined in preference + // - use ESMRY reader + // - if no reader has been created, fallback to libecl + // + // H5 + // - if h5 file is present on disk + // - use h5 reader + // - else + // - create h5 file if defined in preference + // - use h5 reader + // - if no reader has been created, fallback to libecl + // + // For all import modes, use libecl to read data if no data is imported with ESMRY or h5 RiaPreferencesSummary* prefSummary = RiaPreferencesSummary::current(); - if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON ) + if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON || + prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON ) { -#ifdef USE_HDF5 - if ( prefSummary->createH5SummaryDataFiles() ) + bool h5FileFound = false; { QFileInfo fi( headerFileName ); - QString h5FilenameCandidate = fi.absolutePath() + "/" + fi.baseName() + ".h5"; + QString basenameNoExtension = fi.absolutePath() + "/" + fi.baseName(); + + QString h5FileName = basenameNoExtension + ".h5"; - size_t createdH5FileCount = 0; - RifHdf5SummaryExporter::ensureHdf5FileIsCreated( headerFileName.toStdString(), - h5FilenameCandidate.toStdString(), - createdH5FileCount ); + h5FileFound = QFile::exists( h5FileName ); + } - if ( createdH5FileCount > 0 ) + if ( h5FileFound || + ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::HDF5_OPM_COMMON ) ) + { +#ifdef USE_HDF5 + if ( prefSummary->createH5SummaryDataFiles() ) { - QString txt = QString( "Created %1 " ).arg( h5FilenameCandidate ); - if ( threadSafeLogger ) threadSafeLogger->info( txt ); + QFileInfo fi( headerFileName ); + QString h5FilenameCandidate = fi.absolutePath() + "/" + fi.baseName() + ".h5"; + + size_t createdH5FileCount = 0; + RifHdf5SummaryExporter::ensureHdf5FileIsCreated( headerFileName.toStdString(), + h5FilenameCandidate.toStdString(), + createdH5FileCount ); + + if ( createdH5FileCount > 0 ) + { + QString txt = QString( "Created %1 " ).arg( h5FilenameCandidate ); + if ( threadSafeLogger ) threadSafeLogger->info( txt ); + } } - } - auto hdfReader = std::make_unique(); + auto hdfReader = std::make_unique(); - isValid = hdfReader->open( headerFileName, false, threadSafeLogger ); - if ( isValid ) - { - m_summaryReader = std::move( hdfReader ); - } + isValid = hdfReader->open( headerFileName, false, threadSafeLogger ); + if ( isValid ) + { + m_summaryReader = std::move( hdfReader ); + } #endif - } - else if ( prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON ) - { - auto opmCommonReader = std::make_unique(); - - opmCommonReader->useLodsmaryFiles( prefSummary->useOptimizedSummaryDataFiles() ); - opmCommonReader->createLodsmaryFiles( prefSummary->createOptimizedSummaryDataFiles() ); - isValid = opmCommonReader->open( headerFileName, false, threadSafeLogger ); + } - if ( isValid ) + if ( !isValid && prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::OPM_COMMON ) { - m_summaryReader = std::move( opmCommonReader ); + auto opmCommonReader = std::make_unique(); + + opmCommonReader->useEnhancedSummaryFiles( prefSummary->useEnhancedSummaryDataFiles() ); + opmCommonReader->createEnhancedSummaryFiles( prefSummary->createEnhancedSummaryDataFiles() ); + isValid = opmCommonReader->open( headerFileName, false, threadSafeLogger ); + + if ( isValid ) + { + m_summaryReader = std::move( opmCommonReader ); + } } } - if ( !isValid || prefSummary->summaryDataReader() == RiaPreferencesSummary::SummaryReaderMode::LIBECL ) + // If no summary reader has been created, always try to read data using libecl + if ( !isValid ) { auto libeclReader = std::make_unique(); diff --git a/ApplicationLibCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp b/ApplicationLibCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp index dcbca7f567..b47c0ef84d 100644 --- a/ApplicationLibCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderEnsembleStatisticsRft.cpp @@ -240,7 +240,12 @@ void RifReaderEnsembleStatisticsRft::calculateStatistics( const RifEclipseRftAdd pressuresAtDepth.push_back( curvePressures[depthIdx] ); } double p10, p50, p90, mean; - RigStatisticsMath::calculateStatisticsCurves( pressuresAtDepth, &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( pressuresAtDepth, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); m_cachedValues[depthAddress].push_back( allDepths[depthIdx] ); diff --git a/ApplicationLibCode/FileInterface/RifReaderInterface.cpp b/ApplicationLibCode/FileInterface/RifReaderInterface.cpp index de35270785..9012df12ca 100644 --- a/ApplicationLibCode/FileInterface/RifReaderInterface.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderInterface.cpp @@ -47,6 +47,14 @@ bool RifReaderInterface::isNNCsEnabled() return readerSettings()->importNNCs; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifReaderInterface::isSkipWellData() +{ + return readerSettings()->skipWellData; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -115,9 +123,24 @@ size_t RifReaderInterface::timeStepIndexOnFile( size_t timeStepIndex ) const //-------------------------------------------------------------------------------------------------- const RifReaderSettings* RifReaderInterface::readerSettings() const { - RiaPreferences* prefs = RiaPreferences::current(); + if ( m_readerSettings ) + { + return m_readerSettings.get(); + } + else + { + RiaPreferences* prefs = RiaPreferences::current(); + + CVF_ASSERT( prefs->readerSettings() ); - CVF_ASSERT( prefs->readerSettings() ); + return prefs->readerSettings(); + } +} - return prefs->readerSettings(); +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RifReaderInterface::setReaderSettings( std::shared_ptr readerSettings ) +{ + m_readerSettings = readerSettings; } diff --git a/ApplicationLibCode/FileInterface/RifReaderInterface.h b/ApplicationLibCode/FileInterface/RifReaderInterface.h index d57dc71fc3..846a4ee168 100644 --- a/ApplicationLibCode/FileInterface/RifReaderInterface.h +++ b/ApplicationLibCode/FileInterface/RifReaderInterface.h @@ -30,6 +30,7 @@ #include #include +#include #include #include @@ -47,10 +48,13 @@ class RifReaderInterface : public cvf::Object RifReaderInterface() {} ~RifReaderInterface() override {} + void setReaderSettings( std::shared_ptr readerSettings ); + bool isFaultImportEnabled(); bool isImportOfCompleteMswDataEnabled(); bool isNNCsEnabled(); bool includeInactiveCellsInFaultGeometry(); + bool isSkipWellData(); const QString faultIncludeFileAbsolutePathPrefix(); virtual bool open( const QString& fileName, RigEclipseCaseData* eclipseCase ) = 0; @@ -83,4 +87,6 @@ class RifReaderInterface : public cvf::Object std::vector m_filenamesWithFaults; std::vector m_fileTimeStepIndices; + + std::shared_ptr m_readerSettings; }; diff --git a/ApplicationLibCode/FileInterface/RifReaderSettings.cpp b/ApplicationLibCode/FileInterface/RifReaderSettings.cpp index 5b34f14184..f105900974 100644 --- a/ApplicationLibCode/FileInterface/RifReaderSettings.cpp +++ b/ApplicationLibCode/FileInterface/RifReaderSettings.cpp @@ -72,6 +72,9 @@ RifReaderSettings::RifReaderSettings() "Path used to prefix absolute UNIX paths in include statements on Windows, used when searching " "for FAULTS and EQUIL", "" ); + + CAF_PDM_InitField( &importSummaryData, "importSummaryData", true, "Import summary data", "", "", "" ); + importSummaryData.uiCapability()->setUiHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -95,3 +98,19 @@ void RifReaderSettings::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi includeFileAbsolutePathPrefix.uiCapability()->setUiReadOnly( setFaultImportSettingsReadOnly ); importNNCs.uiCapability()->setUiReadOnly( setFaultImportSettingsReadOnly ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::shared_ptr RifReaderSettings::createGridOnlyReaderSettings() +{ + std::shared_ptr readerSettings = std::make_shared(); + // Disable as much as possible + readerSettings->importNNCs = false; + readerSettings->importFaults = false; + readerSettings->skipWellData = true; + readerSettings->includeInactiveCellsInFaultGeometry = false; + readerSettings->importAdvancedMswData = false; + readerSettings->importSummaryData = false; + return readerSettings; +} diff --git a/ApplicationLibCode/FileInterface/RifReaderSettings.h b/ApplicationLibCode/FileInterface/RifReaderSettings.h index 326835b455..3beeb2bf41 100644 --- a/ApplicationLibCode/FileInterface/RifReaderSettings.h +++ b/ApplicationLibCode/FileInterface/RifReaderSettings.h @@ -42,6 +42,9 @@ class RifReaderSettings : public caf::PdmObject caf::PdmField includeFileAbsolutePathPrefix; caf::PdmField useResultIndexFile; caf::PdmField skipWellData; + caf::PdmField importSummaryData; + + static std::shared_ptr createGridOnlyReaderSettings(); private: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/FileInterface/RifStimPlanModelDeviationFrkExporter.cpp b/ApplicationLibCode/FileInterface/RifStimPlanModelDeviationFrkExporter.cpp index 8736b9dcac..a1120f8f8e 100644 --- a/ApplicationLibCode/FileInterface/RifStimPlanModelDeviationFrkExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifStimPlanModelDeviationFrkExporter.cpp @@ -147,7 +147,9 @@ void RifStimPlanModelDeviationFrkExporter::fixupDepthValuesForExport( const std: // Move the MD value to produce a file which can be imported. if ( changeMd < changeTvd ) { - exportMdValues.push_back( exportMdValues[i - 1] + changeTvd ); + // Add small amount in addition to delta TVD to work around floating point imprecision. + double wiggle = 0.001; + exportMdValues.push_back( exportMdValues[i - 1] + changeTvd + wiggle ); } else { diff --git a/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.cpp b/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.cpp index d2794aa3d5..cb921fa19f 100644 --- a/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.cpp @@ -18,10 +18,13 @@ #include "RifStimPlanModelGeologicalFrkExporter.h" +#include "RiaEclipseUnitTools.h" #include "RiaLogging.h" #include "RiaPreferences.h" #include "RifCsvDataTableFormatter.h" +#include "RifStimPlanModelPerfsFrkExporter.h" +#include "RifTextDataTableFormatter.h" #include "RimStimPlanModel.h" #include "RimStimPlanModelCalculator.h" @@ -110,6 +113,16 @@ bool RifStimPlanModelGeologicalFrkExporter::writeToFile( RimStimPlanModel* stimP std::vector stressGradients = stimPlanModel->calculator()->calculateStressGradient(); fixupStressGradients( stressGradients, MIN_STRESS_GRADIENT, MAX_STRESS_GRADIENT, DEFAULT_STRESS_GRADIENT ); + // Make sure porosity and permeability is valid + std::vector porosity = stimPlanModel->calculator()->calculatePorosity(); + fixupLowerBoundary( porosity, stimPlanModel->defaultPorosity(), "porosity" ); + + std::vector horizontalPermeability = stimPlanModel->calculator()->calculateHorizontalPermeability(); + fixupLowerBoundary( horizontalPermeability, stimPlanModel->defaultPermeability(), "horizontal permeability" ); + + std::vector verticalPermeability = stimPlanModel->calculator()->calculateVerticalPermeability(); + fixupLowerBoundary( verticalPermeability, stimPlanModel->defaultPermeability() * 0.1, "vertical permeability" ); + std::map> values; values["dpthlyr"] = tvd; values["strs"] = stimPlanModel->calculator()->calculateStress(); @@ -122,23 +135,41 @@ bool RifStimPlanModelGeologicalFrkExporter::writeToFile( RimStimPlanModel* stimP values["pembed"] = stimPlanModel->calculator()->calculateProppandEmbedment(); values["zoneResPres"] = stimPlanModel->calculator()->calculateReservoirPressure(); values["zoneWaterSat"] = stimPlanModel->calculator()->calculateImmobileFluidSaturation(); - values["zonePorosity"] = stimPlanModel->calculator()->calculatePorosity(); - values["zoneHorizPerm"] = stimPlanModel->calculator()->calculateHorizontalPermeability(); - values["zoneVertPerm"] = stimPlanModel->calculator()->calculateVerticalPermeability(); + values["zonePorosity"] = porosity; + values["zoneHorizPerm"] = horizontalPermeability; + values["zoneVertPerm"] = verticalPermeability; values["zoneTemp"] = stimPlanModel->calculator()->calculateTemperature(); values["zoneRelPerm"] = stimPlanModel->calculator()->calculateRelativePermeabilityFactor(); values["zonePoroElas"] = stimPlanModel->calculator()->calculatePoroElasticConstant(); values["zoneThermalExp"] = stimPlanModel->calculator()->calculateThermalExpansionCoefficient(); + auto [faciesIndex, faciesNames] = stimPlanModel->calculator()->calculateFacies(); + values["faciesIdx"] = faciesIndex; + if ( faciesIndex.size() != tvd.size() || faciesNames.size() != tvd.size() ) return false; + + auto [formationIndex, formationNames] = stimPlanModel->calculator()->calculateFormation(); + values["formationIdx"] = formationIndex; + if ( formationIndex.size() != tvd.size() || formationNames.size() != tvd.size() ) return false; + // Special values for csv export - auto [depthStart, depthEnd] = createDepthRanges( tvd ); - values["dpthstart"] = depthStart; - values["dpthend"] = depthEnd; - std::vector csvLabels = { "dpthstart", "dpthend" }; + auto [depthStart, depthEnd] = createDepthRanges( tvd ); + values["dpthstart"] = depthStart; + values["dpthend"] = depthEnd; + + auto [perforationTop, perforationBottom] = + RifStimPlanModelPerfsFrkExporter::calculateTopAndBottomMeasuredDepth( stimPlanModel, stimPlanModel->wellPath() ); + + values["perfs"] = createPerforationValues( depthStart, + depthEnd, + RiaEclipseUnitTools::meterToFeet( perforationTop ), + RiaEclipseUnitTools::meterToFeet( perforationBottom ) ); + + std::vector csvLabels = { "dpthstart", "dpthend", "faciesIdx", "formationIdx", "perfs" }; for ( const QString& label : labels ) csvLabels.push_back( label ); - return writeToFrkFile( filepath, labels, values ) && writeToCsvFile( filepath, csvLabels, values ); + return writeToFrkFile( filepath, labels, values ) && + writeToCsvFile( filepath, csvLabels, values, faciesNames, formationNames ); } //-------------------------------------------------------------------------------------------------- @@ -177,8 +208,9 @@ bool RifStimPlanModelGeologicalFrkExporter::writeToFrkFile( const QString& //-------------------------------------------------------------------------------------------------- bool RifStimPlanModelGeologicalFrkExporter::writeToCsvFile( const QString& filepath, const std::vector& labels, - const std::map>& values ) - + const std::map>& values, + const std::vector& faciesNames, + const std::vector& formationNames ) { // Create the csv in the same directory as the frk file QFileInfo fi( filepath ); @@ -200,6 +232,8 @@ bool RifStimPlanModelGeologicalFrkExporter::writeToCsvFile( const QString& { header.push_back( RifTextDataTableColumn( label, RifTextDataTableDoubleFormat::RIF_FLOAT ) ); } + header.push_back( RifTextDataTableColumn( "Facies" ) ); + header.push_back( RifTextDataTableColumn( "Formation" ) ); formatter.header( header ); // The length of the vectors are assumed to be equal @@ -220,6 +254,11 @@ bool RifStimPlanModelGeologicalFrkExporter::writeToCsvFile( const QString& formatter.add( vals->second[idx] ); } } + if ( !isDone ) + { + formatter.add( faciesNames[idx] ); + formatter.add( formationNames[idx] ); + } formatter.rowCompleted(); idx++; } @@ -295,6 +334,27 @@ void RifStimPlanModelGeologicalFrkExporter::fixupStressGradients( std::vector& values, + double minValue, + const QString& property ) +{ + for ( double& value : values ) + { + if ( value < minValue ) + { + RiaLogging::warning( + QString( "Found %1 outside valid lower boundary (%2). Replacing %3 with default value: %2." ) + .arg( property ) + .arg( minValue ) + .arg( value ) ); + value = minValue; + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -343,3 +403,25 @@ std::pair, std::vector> return std::make_pair( startTvd, endTvd ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RifStimPlanModelGeologicalFrkExporter::createPerforationValues( const std::vector& depthStart, + const std::vector& depthEnd, + double perforationTop, + double perforationBottom ) +{ + std::vector perfs; + for ( size_t idx = 0; idx < depthStart.size(); idx++ ) + { + double top = depthStart[idx]; + double bottom = depthEnd[idx]; + + // Layer is perforation if end points are inside the perforation interval + bool isPerforation = !( bottom < perforationTop || top > perforationBottom ); + perfs.push_back( static_cast( isPerforation ) ); + } + + return perfs; +} diff --git a/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.h b/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.h index c1b0f7a9df..717beec3e1 100644 --- a/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.h +++ b/ApplicationLibCode/FileInterface/RifStimPlanModelGeologicalFrkExporter.h @@ -44,7 +44,9 @@ class RifStimPlanModelGeologicalFrkExporter const std::map>& values ); static bool writeToCsvFile( const QString& filepath, const std::vector& labels, - const std::map>& values ); + const std::map>& values, + const std::vector& faciesNames, + const std::vector& formationNames ); static void appendHeaderToStream( QTextStream& stream ); static void appendToStream( QTextStream& stream, const QString& label, const std::vector& values ); @@ -54,9 +56,14 @@ class RifStimPlanModelGeologicalFrkExporter double minStressGradient, double maxStressGradient, double defaultStressGradient ); - + static void fixupLowerBoundary( std::vector& values, double minValue, const QString& property ); static std::pair, std::vector> createDepthRanges( const std::vector& tvd ); static bool warnOnInvalidData( const QString& label, const std::vector& values ); static bool hasInvalidData( const std::vector& values ); + + static std::vector createPerforationValues( const std::vector& depthStart, + const std::vector& depthEnd, + double perforationTop, + double perforationBottom ); }; diff --git a/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.cpp b/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.cpp index 9df42a1975..901ca11efb 100644 --- a/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.cpp +++ b/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.cpp @@ -59,12 +59,7 @@ bool RifStimPlanModelPerfsFrkExporter::writeToFile( RimStimPlanModel* stimPlanMo appendFractureOrientationToStream( stream, isTransverse ); // Unit: meter - double perforationLength = stimPlanModel->perforationLength(); - - double anchorPositionMD = computeMeasuredDepthForPosition( wellPath, stimPlanModel->anchorPosition() ); - double topMD = anchorPositionMD - ( perforationLength / 2.0 ); - double bottomMD = anchorPositionMD + ( perforationLength / 2.0 ); - + auto [topMD, bottomMD] = calculateTopAndBottomMeasuredDepth( stimPlanModel, wellPath ); appendPerforationToStream( stream, 1, RiaEclipseUnitTools::meterToFeet( topMD ), @@ -158,3 +153,19 @@ double RifStimPlanModelPerfsFrkExporter::computeMeasuredDepthForPosition( const return -1.0; } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RifStimPlanModelPerfsFrkExporter::calculateTopAndBottomMeasuredDepth( RimStimPlanModel* stimPlanModel, + RimWellPath* wellPath ) +{ + double perforationLength = stimPlanModel->perforationLength(); + + double anchorPositionMD = computeMeasuredDepthForPosition( wellPath, stimPlanModel->anchorPosition() ); + double topMD = anchorPositionMD - ( perforationLength / 2.0 ); + double bottomMD = anchorPositionMD + ( perforationLength / 2.0 ); + + return std::make_pair( topMD, bottomMD ); +} diff --git a/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.h b/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.h index fc5000c4b1..e4c1b5bfba 100644 --- a/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.h +++ b/ApplicationLibCode/FileInterface/RifStimPlanModelPerfsFrkExporter.h @@ -20,6 +20,8 @@ #include "cvfVector3.h" +#include + class RimStimPlanModel; class RimWellPath; @@ -34,10 +36,14 @@ class RifStimPlanModelPerfsFrkExporter public: static bool writeToFile( RimStimPlanModel* stimPlanModel, const QString& filepath ); -private: - static void appendHeaderToStream( QTextStream& stream ); - static void appendFractureOrientationToStream( QTextStream& stream, bool isTranseverse ); - static void appendPerforationToStream( QTextStream& stream, int index, double topMd, double bottomMd ); - static void appendFooterToStream( QTextStream& stream ); + static std::pair calculateTopAndBottomMeasuredDepth( RimStimPlanModel* stimPlanModel, + RimWellPath* wellPath ); + static double computeMeasuredDepthForPosition( const RimWellPath* wellPath, const cvf::Vec3d& position ); + +private: + static void appendHeaderToStream( QTextStream& stream ); + static void appendFractureOrientationToStream( QTextStream& stream, bool isTranseverse ); + static void appendPerforationToStream( QTextStream& stream, int index, double topMd, double bottomMd ); + static void appendFooterToStream( QTextStream& stream ); }; diff --git a/ApplicationLibCode/FileInterface/RifSurfaceImporter.cpp b/ApplicationLibCode/FileInterface/RifSurfaceImporter.cpp index 975ab44152..4f476abb57 100644 --- a/ApplicationLibCode/FileInterface/RifSurfaceImporter.cpp +++ b/ApplicationLibCode/FileInterface/RifSurfaceImporter.cpp @@ -17,6 +17,7 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RifSurfaceImporter.h" +#include "RiaStdStringTools.h" #include "RigGocadData.h" #include "cafProgressInfo.h" @@ -61,85 +62,100 @@ void RifSurfaceImporter::readGocadFile( const QString& filename, RigGocadData* g std::vector> propertyValues; { - std::ifstream stream( filename.toLatin1().data() ); + std::stringstream stream; + { + // Read the file content into a stringstream to avoid expensive file operations + std::ifstream t( filename.toLatin1().data() ); + stream << t.rdbuf(); + } bool isInTfaceSection = false; GocadZPositive zDir = GocadZPositive::Unknown; + int vertexId = -1; + double x = 0.0; + double y = 0.0; + double z = 0.0; + + int id1 = -1; + int id2 = -1; + int id3 = -1; + while ( stream.good() ) { std::string line; std::getline( stream, line ); - std::transform( line.begin(), line.end(), line.begin(), ::toupper ); - - std::istringstream lineStream( line ); + auto tokens = RiaStdStringTools::splitString( line, ' ' ); std::string firstToken; - lineStream >> firstToken; + if ( !tokens.empty() ) firstToken = tokens.front(); if ( isInTfaceSection ) { if ( firstToken.compare( "VRTX" ) == 0 ) { - int vertexId = -1; - double x{ std::numeric_limits::infinity() }; - double y{ std::numeric_limits::infinity() }; - double z{ std::numeric_limits::infinity() }; - std::string endVertex; - - lineStream >> vertexId >> x >> y >> z >> endVertex; - - if ( vertexId > -1 ) + if ( tokens.size() > 4 ) { - if ( zDir == GocadZPositive::Depth ) + RiaStdStringTools::toInt( tokens[1], vertexId ); + RiaStdStringTools::toDouble( tokens[2], x ); + RiaStdStringTools::toDouble( tokens[3], y ); + RiaStdStringTools::toDouble( tokens[4], z ); + + if ( vertexId > -1 ) { - z = -z; - } + if ( zDir == GocadZPositive::Depth ) + { + z = -z; + } - vertices.emplace_back( cvf::Vec3d( x, y, z ) ); - vertexIdToIndex[vertexId] = static_cast( vertices.size() - 1 ); + vertices.emplace_back( cvf::Vec3d( x, y, z ) ); + vertexIdToIndex[vertexId] = static_cast( vertices.size() - 1 ); + } } } else if ( firstToken.compare( "PVRTX" ) == 0 ) { - int vertexId = -1; - double x{ std::numeric_limits::infinity() }; - double y{ std::numeric_limits::infinity() }; - double z{ std::numeric_limits::infinity() }; - - lineStream >> vertexId >> x >> y >> z; - - if ( vertexId > -1 ) + if ( tokens.size() > 4 ) { - if ( zDir == GocadZPositive::Depth ) z = -z; + RiaStdStringTools::toInt( tokens[1], vertexId ); + RiaStdStringTools::toDouble( tokens[2], x ); + RiaStdStringTools::toDouble( tokens[3], y ); + RiaStdStringTools::toDouble( tokens[4], z ); - vertices.emplace_back( cvf::Vec3d( x, y, z ) ); - vertexIdToIndex[vertexId] = static_cast( vertices.size() - 1 ); - } + if ( vertexId > -1 ) + { + if ( zDir == GocadZPositive::Depth ) z = -z; - for ( size_t i = 0; i < propertyNames.size(); i++ ) - { - float value = std::numeric_limits::infinity(); + vertices.emplace_back( cvf::Vec3d( x, y, z ) ); + vertexIdToIndex[vertexId] = static_cast( vertices.size() - 1 ); - lineStream >> value; + double value = std::numeric_limits::infinity(); + for ( size_t i = 0; i < propertyNames.size(); i++ ) + { + auto tokenIndex = 5 + i; + if ( tokenIndex < tokens.size() ) + RiaStdStringTools::toDouble( tokens[tokenIndex], value ); - propertyValues[i].push_back( value ); + propertyValues[i].push_back( static_cast( value ) ); + } + } } } else if ( firstToken.compare( "TRGL" ) == 0 ) { - int id1{ -1 }; - int id2{ -1 }; - int id3{ -1 }; - - lineStream >> id1 >> id2 >> id3; - - if ( id1 >= 0 && id2 >= 0 && id3 >= 0 ) + if ( tokens.size() > 3 ) { - trianglesByIds.emplace_back( static_cast( id1 ) ); - trianglesByIds.emplace_back( static_cast( id2 ) ); - trianglesByIds.emplace_back( static_cast( id3 ) ); + RiaStdStringTools::toInt( tokens[1], id1 ); + RiaStdStringTools::toInt( tokens[2], id2 ); + RiaStdStringTools::toInt( tokens[3], id3 ); + + if ( id1 >= 0 && id2 >= 0 && id3 >= 0 ) + { + trianglesByIds.emplace_back( static_cast( id1 ) ); + trianglesByIds.emplace_back( static_cast( id2 ) ); + trianglesByIds.emplace_back( static_cast( id3 ) ); + } } } else if ( firstToken.compare( "END" ) == 0 ) @@ -153,19 +169,9 @@ void RifSurfaceImporter::readGocadFile( const QString& filename, RigGocadData* g } else if ( firstToken.compare( "PROPERTIES" ) == 0 ) { - QString qstringLine = QString::fromStdString( line ); - - qstringLine.remove( "PROPERTIES" ); - -#if QT_VERSION >= QT_VERSION_CHECK( 5, 15, 0 ) - QStringList words = qstringLine.split( " ", Qt::SkipEmptyParts ); -#else - QStringList words = qstringLine.split( " ", QString::SkipEmptyParts ); -#endif - - for ( auto w : words ) + for ( size_t i = 1; i < tokens.size(); i++ ) { - propertyNames.push_back( w ); + propertyNames.push_back( QString::fromStdString( tokens[i] ) ); } propertyValues.resize( propertyNames.size() ); @@ -173,8 +179,8 @@ void RifSurfaceImporter::readGocadFile( const QString& filename, RigGocadData* g else if ( firstToken.compare( "ZPOSITIVE" ) == 0 ) { std::string secondToken; - lineStream >> secondToken; + if ( tokens.size() > 1 ) secondToken = RiaStdStringTools::toUpper( tokens[1] ); if ( secondToken == "DEPTH" ) { zDir = GocadZPositive::Depth; @@ -368,8 +374,8 @@ std::pair, std::vector> auto to2d = []( const cvf::Vec3d vector ) -> cvf::Vec2d { return cvf::Vec2d( vector.x(), vector.y() ); }; auto to3d = []( const cvf::Vec2d vector ) -> cvf::Vec3d { return cvf::Vec3d( vector.x(), vector.y(), 0.0 ); }; - // Checks if the given vector is a possible new candidate for an axis vector and adds it to the given list of - // axesVectorCandidates. Also increases the number of occurrences of vector candidates. + // Checks if the given vector is a possible new candidate for an axis vector and adds it to the given list + // of axesVectorCandidates. Also increases the number of occurrences of vector candidates. auto maybeInsertAxisVectorCandidate = [epsilon]( const cvf::Vec2d vector, std::map& axesVectorCandidates, diff --git a/ApplicationLibCode/FileInterface/RifWellIAFileWriter.cpp b/ApplicationLibCode/FileInterface/RifWellIAFileWriter.cpp new file mode 100644 index 0000000000..41436e7ac7 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifWellIAFileWriter.cpp @@ -0,0 +1,159 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RifWellIAFileWriter.h" + +#include "RimGenericParameter.h" +#include "RimParameterGroup.h" +#include "RimParameterGroups.h" +#include "RimWellIAModelData.h" +#include "RimWellIASettings.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifWellIAFileWriter::writeToJsonFile( RimWellIASettings& settings, QString& outErrorText ) +{ + QString filename = settings.jsonInputFilename(); + + outErrorText = "Unable to write to file \"" + filename + "\" - "; + + QFile file( filename ); + if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) + { + QTextStream stream( &file ); + + stream << "{" << endl; + stream << "\"comments\": \"All units are SI unless mentioned otherwise; temperature is in Celcius; use forward " + "slash (/) in 'directory' definition\"," + << endl; + stream << "\"directory\": \"" + settings.outputBaseDirectory() + "\"," << endl; + stream << "\"output_name\": \"" + settings.name() + "\""; + + RimParameterGroups mergedGroups; + + bool mergeInCommentParameter = true; + + for ( auto& group : settings.inputParameterGroups() ) + { + mergedGroups.mergeGroup( group, mergeInCommentParameter ); + } + for ( auto& group : settings.resinsightParameterGroups() ) + { + mergedGroups.mergeGroup( group, mergeInCommentParameter ); + } + + for ( auto& group : mergedGroups.groups() ) + { + stream << "," << endl; + + stream << "\"" + group->name() + "\": {" << endl; + + const auto& parameters = group->parameters(); + + for ( size_t i = 0; i < parameters.size(); ) + { + stream << " \"" + parameters[i]->name() + "\": " + parameters[i]->jsonValue(); + + i++; + if ( i < parameters.size() ) + { + stream << ","; + } + stream << endl; + } + + stream << " }"; + } + + stream << endl << "}" << endl; + file.close(); + } + else + { + outErrorText += "Could not open file."; + return false; + } + + outErrorText = ""; + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RifWellIAFileWriter::writeToCSVFile( RimWellIASettings& settings, QString& outErrorText ) +{ + QString filename = settings.csvInputFilename(); + + outErrorText = "Unable to write to file \"" + filename + "\" - "; + + QFile file( filename ); + if ( file.open( QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text ) ) + { + QTextStream stream( &file ); + + stream << "Time_days, Pcasing_Pa, P_form_Pa, Temp_C," + "U1-1,U2,U3,U1-2,U2,U3,U1-3,U2,U3,U1-4,U2,U3,U1-5,U2,U3,U1-6,U2,U3,U1-7,U2,U3,U1-8,U2,U3," + "X,Y,Z,X2,Y,Z,X3,Y,Z,X4,Y,Z,X5,Y,Z,X6,Y,Z,X7,Y,Z,X8,Y,Z"; + stream << endl; + + for ( auto& modeldata : settings.modelData() ) + { + stream << modeldata->dayOffset(); + stream << ","; + stream << modeldata->casingPressure(); + stream << ","; + stream << modeldata->formationPressure(); + stream << ","; + stream << modeldata->temperature(); + + for ( auto& u : modeldata->displacements() ) + { + stream << ","; + stream << u.x(); + stream << ","; + stream << u.y(); + stream << ","; + stream << u.z(); + } + + for ( auto& pos : settings.modelBoxVertices() ) + { + stream << ","; + stream << pos.x(); + stream << ","; + stream << pos.y(); + stream << ","; + stream << pos.z(); + } + stream << endl; + } + } + else + { + outErrorText += "Could not open file."; + return false; + } + + outErrorText = ""; + return true; +} diff --git a/ApplicationLibCode/FileInterface/RifWellIAFileWriter.h b/ApplicationLibCode/FileInterface/RifWellIAFileWriter.h new file mode 100644 index 0000000000..48cb474a95 --- /dev/null +++ b/ApplicationLibCode/FileInterface/RifWellIAFileWriter.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include + +class RimWellIASettings; + +class RifWellIAFileWriter +{ +public: + static bool writeToJsonFile( RimWellIASettings& settings, QString& outErrorText ); + static bool writeToCSVFile( RimWellIASettings& settings, QString& outErrorText ); + +private: + RifWellIAFileWriter(){}; +}; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt b/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt index 8405217acc..4619c4a8d7 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/CMakeLists.txt @@ -36,7 +36,6 @@ add_library( RigFemResultAddress.h RigFemResultPosEnum.h RimFemResultObserver.h - RimFemResultObserver.cpp RigHexGradientTools.h RigHexGradientTools.cpp RigFemPartResultCalculator.h @@ -104,12 +103,14 @@ add_library( RigFemPartResultCalculatorShearSlipIndicator.h RigFemPartResultCalculatorShearSlipIndicator.cpp RimGeoMechGeometrySelectionItem.h - RimGeoMechGeometrySelectionItem.cpp) + RimGeoMechGeometrySelectionItem.cpp +) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) set(LINK_LIBRARIES LibCore cafPdmCvf cafTensor cafUserInterface CommonCode - ResultStatisticsCache) + ResultStatisticsCache +) target_link_libraries(${PROJECT_NAME} ${LINK_LIBRARIES}) diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h index f1ab9ecc52..004d4524d0 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemNativeVisibleCellsStatCalc.h @@ -115,6 +115,8 @@ class RigFemNativeVisibleCellsStatCalc : public RigStatisticsCalculator const std::vector& values = m_resultsData->resultValues( m_resVarAddr, pIdx, (int)timeStepIndex ); int elmCount = part->elementCount(); + if ( values.empty() ) continue; + for ( int elmIdx = 0; elmIdx < elmCount; ++elmIdx ) { if ( !( *m_cellVisibilities )[elmIdx] ) continue; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.cpp index 0eba83ab5c..347dcb9221 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.cpp @@ -29,6 +29,7 @@ RigFemPart::RigFemPart() : m_elementPartId( -1 ) , m_characteristicElementSize( std::numeric_limits::infinity() ) + , m_enabled( true ) { } @@ -91,6 +92,14 @@ int RigFemPart::elementCount() const return static_cast( m_elementId.size() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RigFemPart::allConnectivitiesCount() const +{ + return static_cast( m_allElementConnectivities.size() ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -403,36 +412,42 @@ float RigFemPart::characteristicElementSize() const { if ( m_characteristicElementSize != std::numeric_limits::infinity() ) return m_characteristicElementSize; - int elmsToAverageCount = 0; - float sumMaxEdgeLength = 0; - for ( int elmIdx = 0; elmIdx < elementCount(); elmIdx++ ) - { - RigElementType eType = this->elementType( elmIdx ); + std::vector elementPriority = { HEX8P, HEX8 }; - if ( eType == HEX8P ) + for ( auto elmType : elementPriority ) + { + int elmsToAverageCount = 0; + float sumMaxEdgeLength = 0; + for ( int elmIdx = 0; elmIdx < elementCount(); elmIdx++ ) { - const int* elementConn = this->connectivities( elmIdx ); - cvf::Vec3f nodePos0 = this->nodes().coordinates[elementConn[0]]; - cvf::Vec3f nodePos1 = this->nodes().coordinates[elementConn[1]]; - cvf::Vec3f nodePos3 = this->nodes().coordinates[elementConn[3]]; - cvf::Vec3f nodePos4 = this->nodes().coordinates[elementConn[4]]; + RigElementType eType = this->elementType( elmIdx ); + + if ( eType == elmType ) + { + const int* elementConn = this->connectivities( elmIdx ); + cvf::Vec3f nodePos0 = this->nodes().coordinates[elementConn[0]]; + cvf::Vec3f nodePos1 = this->nodes().coordinates[elementConn[1]]; + cvf::Vec3f nodePos3 = this->nodes().coordinates[elementConn[3]]; + cvf::Vec3f nodePos4 = this->nodes().coordinates[elementConn[4]]; - float l1 = ( nodePos1 - nodePos0 ).length(); - float l3 = ( nodePos3 - nodePos0 ).length(); - float l4 = ( nodePos4 - nodePos0 ).length(); + float l1 = ( nodePos1 - nodePos0 ).length(); + float l3 = ( nodePos3 - nodePos0 ).length(); + float l4 = ( nodePos4 - nodePos0 ).length(); - float maxLength = l1 > l3 ? l1 : l3; - maxLength = maxLength > l4 ? maxLength : l4; + float maxLength = l1 > l3 ? l1 : l3; + maxLength = maxLength > l4 ? maxLength : l4; - sumMaxEdgeLength += maxLength; - ++elmsToAverageCount; + sumMaxEdgeLength += maxLength; + ++elmsToAverageCount; + } + } + if ( elmsToAverageCount > 0 ) + { + m_characteristicElementSize = sumMaxEdgeLength / elmsToAverageCount; + break; } } - CVF_ASSERT( elmsToAverageCount ); - - m_characteristicElementSize = sumMaxEdgeLength / elmsToAverageCount; - return m_characteristicElementSize; } @@ -562,3 +577,35 @@ bool RigFemPart::isHexahedron( size_t elementIdx ) const RigElementType elType = elementType( elementIdx ); return elType == HEX8 || elType == HEX8P; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFemPart::setName( std::string name ) +{ + m_name = name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::string RigFemPart::name() const +{ + return m_name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFemPart::setEnabled( bool enable ) +{ + m_enabled = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigFemPart::enabled() const +{ + return m_enabled; +} diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.h index 3d3c2e54b5..c68189c9f8 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPart.h @@ -27,6 +27,7 @@ #include "cvfBoundingBox.h" #include "cvfObject.h" #include "cvfVector3.h" +#include #include class RigFemPartGrid; @@ -56,6 +57,7 @@ class RigFemPart : public cvf::Object void appendElement( RigElementType elmType, int elementId, const int* connectivities ); int elementCount() const; + int allConnectivitiesCount() const; int elmId( size_t elementIdx ) const; RigElementType elementType( size_t elementIdx ) const; @@ -92,8 +94,16 @@ class RigFemPart : public cvf::Object const RigFemPartGrid* getOrCreateStructGrid() const; const std::vector& elementIdxToId() const; + void setName( std::string name ); + std::string name() const; + + void setEnabled( bool enable ); + bool enabled() const; + private: - int m_elementPartId; + int m_elementPartId; + std::string m_name; + bool m_enabled; std::vector m_elementId; std::vector m_elementTypes; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.cpp index 48e46ee577..3d37813160 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.cpp @@ -39,7 +39,24 @@ RigFemPartCollection::~RigFemPartCollection() //-------------------------------------------------------------------------------------------------- void RigFemPartCollection::addFemPart( RigFemPart* part ) { + size_t globalElementOffset = 0; + size_t globalNodeOffset = 0; + size_t globalConnectivityOffset = 0; + if ( m_femParts.size() > 0 ) + { + size_t lastIndex = m_femParts.size() - 1; + globalElementOffset += m_femParts[lastIndex]->elementCount(); + globalElementOffset += m_partElementOffset[lastIndex]; + globalNodeOffset += m_femParts[lastIndex]->nodes().nodeIds.size(); + globalNodeOffset += m_partNodeOffset[lastIndex]; + globalConnectivityOffset += m_femParts[lastIndex]->allConnectivitiesCount(); + globalConnectivityOffset += m_partConnectivityOffset[lastIndex]; + } + m_femParts.push_back( part ); + m_partElementOffset.push_back( globalElementOffset ); + m_partNodeOffset.push_back( globalNodeOffset ); + m_partConnectivityOffset.push_back( globalConnectivityOffset ); } //-------------------------------------------------------------------------------------------------- @@ -108,3 +125,74 @@ cvf::BoundingBox RigFemPartCollection::boundingBox() const } return bBox; } + +//-------------------------------------------------------------------------------------------------- +/// convert from global element index to part and part-local index +//-------------------------------------------------------------------------------------------------- +std::pair RigFemPartCollection::partIdAndElementIndex( size_t globalIndex ) const +{ + const size_t nParts = m_partElementOffset.size(); + + CVF_ASSERT( nParts > 0 ); + + for ( size_t i = 1; i < nParts; i++ ) + { + if ( globalIndex < m_partElementOffset[i] ) + { + return std::make_pair( (int)( i - 1 ), globalIndex - m_partElementOffset[i - 1] ); + } + } + + return std::make_pair( (int)( nParts - 1 ), globalIndex - m_partElementOffset.back() ); +} + +//-------------------------------------------------------------------------------------------------- +/// convert from global element index to part and part-local index +//-------------------------------------------------------------------------------------------------- +std::pair RigFemPartCollection::partAndElementIndex( size_t globalIndex ) const +{ + auto [partId, elementIdx] = partIdAndElementIndex( globalIndex ); + return std::make_pair( part( partId ), elementIdx ); +} + +//-------------------------------------------------------------------------------------------------- +/// convert from part and part-local index to global index +//-------------------------------------------------------------------------------------------------- +size_t RigFemPartCollection::globalIndex( int partId, size_t localIndex ) const +{ + return localIndex + m_partElementOffset[partId]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RigFemPartCollection::nodeIdxFromElementNodeResultIdx( size_t globalIndex ) const +{ + const size_t nParts = m_partConnectivityOffset.size(); + CVF_ASSERT( nParts > 0 ); + + int partId = (int)( nParts - 1 ); + size_t partIdx = globalIndex - m_partConnectivityOffset.back(); + + for ( size_t i = 1; i < nParts; i++ ) + { + if ( globalIndex < m_partConnectivityOffset[i] ) + { + partId = (int)( i - 1 ); + partIdx = globalIndex - m_partConnectivityOffset[i - 1]; + break; + } + } + + const RigFemPart* part = this->part( partId ); + + return (int)m_partNodeOffset[partId] + part->nodeIdxFromElementNodeResultIdx( partIdx ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RigFemPartCollection::globalElementNodeResultIdx( int partId, int elementIdx, int elmLocalNodeIdx ) const +{ + return m_partElementOffset[partId] * 8 + part( partId )->elementNodeResultIdx( elementIdx, elmLocalNodeIdx ); +} diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.h index 8ab8419d9f..2c17667b8c 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartCollection.h @@ -38,6 +38,19 @@ class RigFemPartCollection : public cvf::Object float characteristicElementSize() const; cvf::BoundingBox boundingBox() const; + std::pair partIdAndElementIndex( size_t globalIndex ) const; + std::pair partAndElementIndex( size_t globalIndex ) const; + size_t globalIndex( int partId, size_t localIndex ) const; + + std::pair partIdAndNodeIndex( size_t globalNodeIndex ) const; + + int nodeIdxFromElementNodeResultIdx( size_t globalResultIdx ) const; + + size_t globalElementNodeResultIdx( int part, int elementIdx, int elmLocalNodeIdx ) const; + private: cvf::Collection m_femParts; + std::vector m_partElementOffset; + std::vector m_partNodeOffset; + std::vector m_partConnectivityOffset; }; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartGrid.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartGrid.cpp index 8783b36ffe..27f91354b0 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartGrid.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartGrid.cpp @@ -74,8 +74,6 @@ void RigFemPartGrid::generateStructGridData() int elmIdxForIJK_000 = findElmIdxForIJK000(); - CVF_ASSERT( elmIdxForIJK_000 != -1 ); // Debug. When we have run enough tests, remove - if ( elmIdxForIJK_000 == -1 ) return; // Find the IJK faces based on the corner cell diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorMudWeightWindow.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorMudWeightWindow.cpp index f824ae99f4..7fc4f63fe6 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorMudWeightWindow.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorMudWeightWindow.cpp @@ -172,8 +172,11 @@ RigFemScalarResultFrames* RigFemPartResultCalculatorMudWeightWindow::calculate( int frameCount = stressDataFrames->frameCount(); for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) { - const std::vector& porFrameData = porePressureDataFrames->frameData( fIdx ); + const std::vector& porFrameData = porePressureDataFrames->frameData( fIdx ); + if ( porFrameData.empty() ) continue; + const std::vector& initialPorFrameData = porePressureDataFrames->frameData( 0 ); + if ( initialPorFrameData.empty() ) continue; const std::vector& stressFrameData = stressDataFrames->frameData( fIdx ); const std::vector& obg0FrameData = obg0DataFrames->frameData( 0 ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorNormalized.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorNormalized.cpp index fb763f5098..9725190e95 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorNormalized.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorNormalized.cpp @@ -100,7 +100,7 @@ RigFemScalarResultFrames* RigFemPartResultCalculatorNormalized::calculate( int const RigFemPart* femPart = m_resultCollection->parts()->part( partIndex ); const RigFemPartGrid* femPartGrid = femPart->getOrCreateStructGrid(); - float inf = std::numeric_limits::infinity(); + const float inf = std::numeric_limits::infinity(); int elmNodeCount = femPart->elementCount(); const std::vector& nodeCoords = femPart->nodes().coordinates; @@ -108,6 +108,7 @@ RigFemScalarResultFrames* RigFemPartResultCalculatorNormalized::calculate( int for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) { const std::vector& porFrameData = porDataFrames->frameData( fIdx ); + if ( porFrameData.empty() ) continue; const std::vector& srcFrameData = srcDataFrames->frameData( fIdx ); std::vector& dstFrameData = dstDataFrames->frameData( fIdx ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.cpp index 03c9a1f7b5..1e6bcc9150 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.cpp @@ -31,9 +31,17 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RigFemPartResultCalculatorPrincipalStrain::RigFemPartResultCalculatorPrincipalStrain( RigFemPartResultsCollection& collection ) +RigFemPartResultCalculatorPrincipalStrain::RigFemPartResultCalculatorPrincipalStrain( RigFemPartResultsCollection& collection, + const std::string fieldName, + const std::string componentPrefix ) : RigFemPartResultCalculator( collection ) + , m_fieldName( fieldName ) + , m_componentPrefix( componentPrefix ) + , m_componentNames( 3 ) { + m_componentNames[0] = componentPrefix + "1"; + m_componentNames[1] = componentPrefix + "2"; + m_componentNames[2] = componentPrefix + "3"; } //-------------------------------------------------------------------------------------------------- @@ -48,8 +56,12 @@ RigFemPartResultCalculatorPrincipalStrain::~RigFemPartResultCalculatorPrincipalS //-------------------------------------------------------------------------------------------------- bool RigFemPartResultCalculatorPrincipalStrain::isMatching( const RigFemResultAddress& resVarAddr ) const { - return ( ( resVarAddr.fieldName == "NE" ) && ( resVarAddr.componentName == "E1" || resVarAddr.componentName == "E2" || - resVarAddr.componentName == "E3" ) ); + if ( resVarAddr.fieldName != m_fieldName ) return false; + + for ( const auto& component : m_componentNames ) + if ( resVarAddr.componentName == component ) return true; + + return false; } //-------------------------------------------------------------------------------------------------- @@ -58,30 +70,32 @@ bool RigFemPartResultCalculatorPrincipalStrain::isMatching( const RigFemResultAd RigFemScalarResultFrames* RigFemPartResultCalculatorPrincipalStrain::calculate( int partIndex, const RigFemResultAddress& resAddr ) { - CVF_ASSERT( resAddr.componentName == "E1" || resAddr.componentName == "E2" || resAddr.componentName == "E3" ); + CVF_ASSERT( resAddr.componentName == m_componentNames[0] || resAddr.componentName == m_componentNames[1] || + resAddr.componentName == m_componentNames[2] ); QString progressText = "Calculating " + QString::fromStdString( resAddr.fieldName + ": " + resAddr.componentName ); caf::ProgressInfo frameCountProgress( static_cast( m_resultCollection->frameCount() ) * 7, progressText ); - auto loadFrameLambda = [&]( const QString& component ) { - auto task = frameCountProgress.task( "Loading " + component, m_resultCollection->frameCount() ); - return m_resultCollection->findOrLoadScalarResult( partIndex, resAddr.copyWithComponent( component.toStdString() ) ); + auto loadFrameLambda = [&]( const std::string& component ) { + auto task = frameCountProgress.task( QString::fromStdString( "Loading " + component ), + m_resultCollection->frameCount() ); + return m_resultCollection->findOrLoadScalarResult( partIndex, resAddr.copyWithComponent( component ) ); }; - RigFemScalarResultFrames* e11Frames = loadFrameLambda( "E11" ); - RigFemScalarResultFrames* e22Frames = loadFrameLambda( "E22" ); - RigFemScalarResultFrames* e33Frames = loadFrameLambda( "E33" ); - RigFemScalarResultFrames* e12Frames = loadFrameLambda( "E12" ); - RigFemScalarResultFrames* e13Frames = loadFrameLambda( "E13" ); - RigFemScalarResultFrames* e23Frames = loadFrameLambda( "E23" ); + RigFemScalarResultFrames* e11Frames = loadFrameLambda( m_componentPrefix + "11" ); + RigFemScalarResultFrames* e22Frames = loadFrameLambda( m_componentPrefix + "22" ); + RigFemScalarResultFrames* e33Frames = loadFrameLambda( m_componentPrefix + "33" ); + RigFemScalarResultFrames* e12Frames = loadFrameLambda( m_componentPrefix + "12" ); + RigFemScalarResultFrames* e13Frames = loadFrameLambda( m_componentPrefix + "13" ); + RigFemScalarResultFrames* e23Frames = loadFrameLambda( m_componentPrefix + "23" ); RigFemScalarResultFrames* e1Frames = - m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( "E1" ) ); + m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( m_componentNames[0] ) ); RigFemScalarResultFrames* e2Frames = - m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( "E2" ) ); + m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( m_componentNames[1] ) ); RigFemScalarResultFrames* e3Frames = - m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( "E3" ) ); + m_resultCollection->createScalarResult( partIndex, resAddr.copyWithComponent( m_componentNames[2] ) ); int frameCount = e11Frames->frameCount(); for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.h index a0febb8e1a..12e7e1f2c1 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorPrincipalStrain.h @@ -20,6 +20,9 @@ #include "RigFemPartResultCalculator.h" +#include +#include + class RigFemPartResultsCollection; class RigFemScalarResultFrames; class RigFemResultAddress; @@ -30,8 +33,15 @@ class RigFemResultAddress; class RigFemPartResultCalculatorPrincipalStrain : public RigFemPartResultCalculator { public: - explicit RigFemPartResultCalculatorPrincipalStrain( RigFemPartResultsCollection& collection ); + explicit RigFemPartResultCalculatorPrincipalStrain( RigFemPartResultsCollection& collection, + const std::string fieldName, + const std::string componentPrefix ); ~RigFemPartResultCalculatorPrincipalStrain() override; bool isMatching( const RigFemResultAddress& resVarAddr ) const override; RigFemScalarResultFrames* calculate( int partIndex, const RigFemResultAddress& resVarAddr ) override; + +private: + const std::string m_fieldName; + const std::string m_componentPrefix; + std::vector m_componentNames; }; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorShearSlipIndicator.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorShearSlipIndicator.cpp index 8326522b8f..298ab3d953 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorShearSlipIndicator.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorShearSlipIndicator.cpp @@ -94,8 +94,10 @@ RigFemScalarResultFrames* for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) { const std::vector& porFrameData = porePressureDataFrames->frameData( fIdx ); + if ( porFrameData.empty() ) continue; const std::vector& stressFrameData = stressDataFrames->frameData( fIdx ); + if ( stressFrameData.empty() ) continue; std::vector& shearSlipIndicatorFrameData = shearSlipIndicatorFrames->frameData( fIdx ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressAnisotropy.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressAnisotropy.cpp index 02005698f6..f2f61fe102 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressAnisotropy.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressAnisotropy.cpp @@ -176,23 +176,23 @@ RigFemScalarResultFrames* RigFemResultAddress( resVarAddr.resultPosType, resVarAddr.fieldName, "SA12", - resVarAddr.timeLapseBaseFrameIdx ) ); + resVarAddr.timeLapseBaseStepIdx ) ); RigFemScalarResultFrames* s13Frames = m_resultCollection->createScalarResult( partIndex, RigFemResultAddress( resVarAddr.resultPosType, resVarAddr.fieldName, "SA13", - resVarAddr.timeLapseBaseFrameIdx ) ); + resVarAddr.timeLapseBaseStepIdx ) ); RigFemScalarResultFrames* s23Frames = m_resultCollection->createScalarResult( partIndex, RigFemResultAddress( resVarAddr.resultPosType, resVarAddr.fieldName, "SA23", - resVarAddr.timeLapseBaseFrameIdx ) ); + resVarAddr.timeLapseBaseStepIdx ) ); float inf = std::numeric_limits::infinity(); int frameCount = s1Frames->frameCount(); - int baseTimeStep = resVarAddr.timeLapseBaseFrameIdx; + int baseTimeStep = resVarAddr.timeLapseBaseStepIdx; for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) { diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressGradients.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressGradients.cpp index fa3788c3bf..83a66c5c39 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressGradients.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorStressGradients.cpp @@ -120,6 +120,8 @@ RigFemScalarResultFrames* RigFemPartResultCalculatorStressGradients::calculate( std::vector& dstFrameDataY = dataFramesY->frameData( fIdx ); std::vector& dstFrameDataZ = dataFramesZ->frameData( fIdx ); size_t valCount = inputData.size(); + if ( valCount == 0 ) continue; + dstFrameDataX.resize( valCount ); dstFrameDataY.resize( valCount ); dstFrameDataZ.resize( valCount ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorSurfaceAlignedStress.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorSurfaceAlignedStress.cpp index 220885c86a..2837a9f112 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorSurfaceAlignedStress.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorSurfaceAlignedStress.cpp @@ -146,6 +146,8 @@ RigFemScalarResultFrames* for ( int fIdx = 0; fIdx < frameCount; ++fIdx ) { const std::vector& s11 = s11Frames->frameData( fIdx ); + if ( s11.empty() ) continue; + const std::vector& s22 = s22Frames->frameData( fIdx ); const std::vector& s33 = s33Frames->frameData( fIdx ); const std::vector& s12 = s12Frames->frameData( fIdx ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorTimeLapse.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorTimeLapse.cpp index d1b0522a47..115e8903d1 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorTimeLapse.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultCalculatorTimeLapse.cpp @@ -112,7 +112,7 @@ RigFemScalarResultFrames* frameCountProgress.incrementProgress(); int frameCount = srcDataFrames->frameCount(); - int baseFrameIdx = resVarAddr.timeLapseBaseFrameIdx; + int baseFrameIdx = resVarAddr.timeLapseBaseStepIdx; if ( baseFrameIdx >= frameCount ) return dstDataFrames; const std::vector& baseFrameData = srcDataFrames->frameData( baseFrameIdx ); if ( baseFrameData.empty() ) return dstDataFrames; @@ -152,7 +152,7 @@ RigFemScalarResultFrames* "Calculating " + QString::fromStdString( resVarAddr.fieldName + ": " + resVarAddr.componentName ) ); frameCountProgress.setNextProgressIncrement( m_resultCollection->frameCount() ); - RigFemResultAddress totStressCompAddr( resVarAddr.resultPosType, "ST", "", resVarAddr.timeLapseBaseFrameIdx ); + RigFemResultAddress totStressCompAddr( resVarAddr.resultPosType, "ST", "", resVarAddr.timeLapseBaseStepIdx ); { std::string scomp; std::string gcomp = resVarAddr.componentName; @@ -175,11 +175,9 @@ RigFemScalarResultFrames* frameCountProgress.incrementProgress(); frameCountProgress.setNextProgressIncrement( m_resultCollection->frameCount() ); RigFemScalarResultFrames* srcPORDataFrames = - m_resultCollection->findOrLoadScalarResult( partIndex, - RigFemResultAddress( RIG_NODAL, - "POR-Bar", - "", - resVarAddr.timeLapseBaseFrameIdx ) ); + m_resultCollection + ->findOrLoadScalarResult( partIndex, + RigFemResultAddress( RIG_NODAL, "POR-Bar", "", resVarAddr.timeLapseBaseStepIdx ) ); RigFemScalarResultFrames* dstDataFrames = m_resultCollection->createScalarResult( partIndex, resVarAddr ); frameCountProgress.incrementProgress(); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp index 04ac5fcf92..beb04230f7 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.cpp @@ -178,8 +178,12 @@ RigFemPartResultsCollection::RigFemPartResultsCollection( RifGeoMechReaderInterf std::unique_ptr( new RigFemPartResultCalculatorNE( *this ) ) ); m_resultCalculators.push_back( std::unique_ptr( new RigFemPartResultCalculatorGamma( *this ) ) ); - m_resultCalculators.push_back( - std::unique_ptr( new RigFemPartResultCalculatorPrincipalStrain( *this ) ) ); + m_resultCalculators.push_back( std::unique_ptr( + new RigFemPartResultCalculatorPrincipalStrain( *this, "NE", "E" ) ) ); + m_resultCalculators.push_back( std::unique_ptr( + new RigFemPartResultCalculatorPrincipalStrain( *this, "LE", "LE" ) ) ); + m_resultCalculators.push_back( std::unique_ptr( + new RigFemPartResultCalculatorPrincipalStrain( *this, "PE", "PE" ) ) ); m_resultCalculators.push_back( std::unique_ptr( new RigFemPartResultCalculatorPrincipalStress( *this ) ) ); m_resultCalculators.push_back( @@ -503,36 +507,35 @@ RigFemScalarResultFrames* RigFemPartResultsCollection::findOrLoadScalarResult( i { std::vector frameTimes = m_readerInterface->frameTimes( stepIndex ); - for ( int fIdx = 1; (size_t)fIdx < frameTimes.size() && fIdx < 2; ++fIdx ) // Read only the second frame + int fIdx = (int)( frameTimes.size() - 1 ); + + std::vector*> componentDataVectors; + for ( auto& componentResult : resultsForEachComponent ) { - std::vector*> componentDataVectors; - for ( auto& componentResult : resultsForEachComponent ) - { - componentDataVectors.push_back( &( componentResult->frameData( stepIndex ) ) ); - } + componentDataVectors.push_back( &( componentResult->frameData( stepIndex ) ) ); + } - switch ( resVarAddr.resultPosType ) - { - case RIG_NODAL: - m_readerInterface->readNodeField( resVarAddr.fieldName, partIndex, stepIndex, fIdx, &componentDataVectors ); - break; - case RIG_ELEMENT_NODAL: - m_readerInterface->readElementNodeField( resVarAddr.fieldName, - partIndex, - stepIndex, - fIdx, - &componentDataVectors ); - break; - case RIG_INTEGRATION_POINT: - m_readerInterface->readIntegrationPointField( resVarAddr.fieldName, - partIndex, - stepIndex, - fIdx, - &componentDataVectors ); - break; - default: - break; - } + switch ( resVarAddr.resultPosType ) + { + case RIG_NODAL: + m_readerInterface->readNodeField( resVarAddr.fieldName, partIndex, stepIndex, fIdx, &componentDataVectors ); + break; + case RIG_ELEMENT_NODAL: + m_readerInterface->readElementNodeField( resVarAddr.fieldName, + partIndex, + stepIndex, + fIdx, + &componentDataVectors ); + break; + case RIG_INTEGRATION_POINT: + m_readerInterface->readIntegrationPointField( resVarAddr.fieldName, + partIndex, + stepIndex, + fIdx, + &componentDataVectors ); + break; + default: + break; } progress.incrementProgress(); @@ -678,6 +681,20 @@ std::map> fieldCompNames["MUD-WEIGHT"].push_back( "MWM" ); fieldCompNames["MUD-WEIGHT"].push_back( "UMWL" ); fieldCompNames["MUD-WEIGHT"].push_back( "LMWL" ); + + if ( fieldCompNames.count( "LE" ) > 0 ) + { + fieldCompNames["LE"].push_back( "LE1" ); + fieldCompNames["LE"].push_back( "LE2" ); + fieldCompNames["LE"].push_back( "LE3" ); + } + + if ( fieldCompNames.count( "PE" ) > 0 ) + { + fieldCompNames["PE"].push_back( "PE1" ); + fieldCompNames["PE"].push_back( "PE2" ); + fieldCompNames["PE"].push_back( "PE3" ); + } } else if ( resPos == RIG_INTEGRATION_POINT ) { @@ -768,6 +785,20 @@ std::map> fieldCompNames["MUD-WEIGHT"].push_back( "MWM" ); fieldCompNames["MUD-WEIGHT"].push_back( "UMWL" ); fieldCompNames["MUD-WEIGHT"].push_back( "LMWL" ); + + if ( fieldCompNames.count( "LE" ) > 0 ) + { + fieldCompNames["LE"].push_back( "LE1" ); + fieldCompNames["LE"].push_back( "LE2" ); + fieldCompNames["LE"].push_back( "LE3" ); + } + + if ( fieldCompNames.count( "PE" ) > 0 ) + { + fieldCompNames["PE"].push_back( "PE1" ); + fieldCompNames["PE"].push_back( "PE2" ); + fieldCompNames["PE"].push_back( "PE3" ); + } } else if ( resPos == RIG_ELEMENT_NODAL_FACE ) { @@ -998,7 +1029,7 @@ void RigFemPartResultsCollection::deleteResultForAllTimeSteps( const std::vector { auto resToDelete = res; - resToDelete.timeLapseBaseFrameIdx = RigFemResultAddress::allTimeLapsesValue(); + resToDelete.timeLapseBaseStepIdx = RigFemResultAddress::allTimeLapsesValue(); deleteResult( resToDelete ); } @@ -1043,6 +1074,54 @@ const std::vector& return scalarResults->frameData( frameIndex ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFemPartResultsCollection::globalResultValues( const RigFemResultAddress& resVarAddr, + int timeStepIndex, + std::vector& resultValues ) +{ + CVF_ASSERT( resVarAddr.isValid() ); + + for ( int i = 0; i < partCount(); i++ ) + { + const std::vector& partResults = this->resultValues( resVarAddr, i, (int)timeStepIndex ); + if ( partResults.empty() ) + { + size_t expectedSize = 0; + + switch ( resVarAddr.resultPosType ) + { + case RIG_NODAL: + expectedSize = m_femParts->part( i )->nodes().nodeIds.size(); + break; + + case RIG_ELEMENT_NODAL: + case RIG_INTEGRATION_POINT: + expectedSize = m_femParts->part( i )->elementNodeResultCount(); + break; + + case RIG_ELEMENT_NODAL_FACE: + expectedSize = m_femParts->part( i )->elementCount() * 6; + break; + + case RIG_ELEMENT: + expectedSize = m_femParts->part( i )->elementCount(); + break; + + default: + break; + } + + resultValues.resize( resultValues.size() + expectedSize, NAN ); + } + else + { + resultValues.insert( resultValues.end(), partResults.begin(), partResults.end() ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h index 45a832ba88..a940e8b7f9 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemPartResultsCollection.h @@ -125,7 +125,9 @@ class RigFemPartResultsCollection : public cvf::Object std::vector loadedResults() const; const std::vector& resultValues( const RigFemResultAddress& resVarAddr, int partIndex, int frameIndex ); - std::vector tensors( const RigFemResultAddress& resVarAddr, int partIndex, int frameIndex ); + void globalResultValues( const RigFemResultAddress& resVarAddr, int timeStepIndex, std::vector& resultValues ); + + std::vector tensors( const RigFemResultAddress& resVarAddr, int partIndex, int frameIndex ); const RigFemPartCollection* parts() const; int partCount() const; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemResultAddress.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemResultAddress.h index 75889e0a81..e86e1216b6 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemResultAddress.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigFemResultAddress.h @@ -33,7 +33,7 @@ class RigFemResultAddress : resultPosType( RIG_NODAL ) , fieldName( "" ) , componentName( "" ) - , timeLapseBaseFrameIdx( NO_TIME_LAPSE ) + , timeLapseBaseStepIdx( NO_TIME_LAPSE ) , refKLayerIndex( NO_COMPACTION ) , normalizedByHydrostaticPressure( false ) { @@ -42,13 +42,13 @@ class RigFemResultAddress RigFemResultAddress( RigFemResultPosEnum resPosType, const std::string& aFieldName, const std::string& aComponentName, - int timeLapseBaseFrameIdx = NO_TIME_LAPSE, + int timeLapseBaseStepIdx = NO_TIME_LAPSE, int refKLayerIndex = NO_COMPACTION, bool normalizedByHydrostaticPressure = false ) : resultPosType( resPosType ) , fieldName( aFieldName ) , componentName( aComponentName ) - , timeLapseBaseFrameIdx( timeLapseBaseFrameIdx ) + , timeLapseBaseStepIdx( timeLapseBaseStepIdx ) , refKLayerIndex( refKLayerIndex ) , normalizedByHydrostaticPressure( normalizedByHydrostaticPressure ) { @@ -58,7 +58,7 @@ class RigFemResultAddress : resultPosType( rhs.resultPosType ) , fieldName( rhs.fieldName ) , componentName( rhs.componentName ) - , timeLapseBaseFrameIdx( rhs.timeLapseBaseFrameIdx ) + , timeLapseBaseStepIdx( rhs.timeLapseBaseStepIdx ) , refKLayerIndex( rhs.refKLayerIndex ) , normalizedByHydrostaticPressure( rhs.normalizedByHydrostaticPressure ) { @@ -69,7 +69,7 @@ class RigFemResultAddress resultPosType = rhs.resultPosType; fieldName = rhs.fieldName; componentName = rhs.componentName; - timeLapseBaseFrameIdx = rhs.timeLapseBaseFrameIdx; + timeLapseBaseStepIdx = rhs.timeLapseBaseStepIdx; refKLayerIndex = rhs.refKLayerIndex; normalizedByHydrostaticPressure = rhs.normalizedByHydrostaticPressure; return *this; @@ -78,7 +78,7 @@ class RigFemResultAddress RigFemResultPosEnum resultPosType; std::string fieldName; std::string componentName; - int timeLapseBaseFrameIdx; + int timeLapseBaseStepIdx; int refKLayerIndex; bool normalizedByHydrostaticPressure; @@ -93,8 +93,8 @@ class RigFemResultAddress static constexpr int noTimeLapseValue() { return NO_TIME_LAPSE; } static constexpr int noCompactionValue() { return NO_COMPACTION; } - bool isTimeLapse() const { return timeLapseBaseFrameIdx > NO_TIME_LAPSE; } - bool representsAllTimeLapses() const { return timeLapseBaseFrameIdx == ALL_TIME_LAPSES; } + bool isTimeLapse() const { return timeLapseBaseStepIdx > NO_TIME_LAPSE; } + bool representsAllTimeLapses() const { return timeLapseBaseStepIdx == ALL_TIME_LAPSES; } bool normalizeByHydrostaticPressure() const { return normalizedByHydrostaticPressure; } bool isValid() const @@ -115,9 +115,9 @@ class RigFemResultAddress return ( normalizedByHydrostaticPressure < other.normalizedByHydrostaticPressure ); } - if ( timeLapseBaseFrameIdx != other.timeLapseBaseFrameIdx ) + if ( timeLapseBaseStepIdx != other.timeLapseBaseStepIdx ) { - return ( timeLapseBaseFrameIdx < other.timeLapseBaseFrameIdx ); + return ( timeLapseBaseStepIdx < other.timeLapseBaseStepIdx ); } if ( resultPosType != other.resultPosType ) @@ -141,7 +141,7 @@ class RigFemResultAddress bool operator==( const RigFemResultAddress& other ) const { if ( resultPosType != other.resultPosType || fieldName != other.fieldName || - componentName != other.componentName || timeLapseBaseFrameIdx != other.timeLapseBaseFrameIdx || + componentName != other.componentName || timeLapseBaseStepIdx != other.timeLapseBaseStepIdx || normalizedByHydrostaticPressure != other.normalizedByHydrostaticPressure ) { return false; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.cpp index ab93dd16fb..a0e6940ef8 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.cpp @@ -155,3 +155,25 @@ bool RigGeoMechCaseData::readFemParts( std::string* errorMessage, const std::vec *errorMessage = std::string( "Could not read FEM parts" ); return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigGeoMechCaseData::readDisplacements( std::string* errorMessage, + int partId, + int timeStep, + std::vector* displacements ) +{ + CVF_ASSERT( errorMessage ); +#ifdef USE_ODB_API + if ( m_readerInterface.notNull() && m_readerInterface->isOpen() ) + { + const auto& frames = m_readerInterface->frameTimes( timeStep ); + m_readerInterface->readDisplacements( partId, timeStep, (int)frames.size() - 1, displacements ); + return true; + } + +#endif + *errorMessage = std::string( "Could not read displacements." ); + return false; +} diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.h index cbb8766d19..741f162744 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RigGeoMechCaseData.h @@ -41,6 +41,8 @@ class RigGeoMechCaseData : public cvf::Object bool open( std::string* errorMessage ); bool readTimeSteps( std::string* errorMessage, std::vector* stepNames ); bool readFemParts( std::string* errorMessage, const std::vector& timeStepFilter = std::vector() ); + bool readDisplacements( std::string* errorMessage, int partId, int timeStep, std::vector* displacements ); + RigFemPartCollection* femParts(); const RigFemPartCollection* femParts() const; diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.cpp b/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.cpp deleted file mode 100644 index cd0c2003a7..0000000000 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.cpp +++ /dev/null @@ -1,3 +0,0 @@ -#include "RimFemResultObserver.h" - -CAF_PDM_ABSTRACT_SOURCE_INIT( RimFemResultObserver, "RimFemResultObserver" ); diff --git a/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.h b/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.h index c5bee948ac..97da8913ce 100644 --- a/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.h +++ b/ApplicationLibCode/GeoMech/GeoMechDataModel/RimFemResultObserver.h @@ -18,16 +18,12 @@ #pragma once -#include "cafPdmObject.h" - #include class RigFemResultAddress; -class RimFemResultObserver : public caf::PdmObject +class RimFemResultObserver { - CAF_PDM_HEADER_INIT; - public: virtual std::vector observedResults() const = 0; -}; \ No newline at end of file +}; diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/CMakeLists_files.cmake b/ApplicationLibCode/GeoMech/GeoMechVisualization/CMakeLists_files.cmake index 8db4eb3e1a..7f765b58ef 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/CMakeLists_files.cmake +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/CMakeLists_files.cmake @@ -1,32 +1,28 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivFemPartGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivFemPartPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgrCache.h -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechVizLogic.h -${CMAKE_CURRENT_LIST_DIR}/RivFemPickSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivFemElmVisibilityCalculator.h - +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivFemPartGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivFemPartPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgrCache.h + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechVizLogic.h + ${CMAKE_CURRENT_LIST_DIR}/RivFemPickSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivFemElmVisibilityCalculator.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivFemPartGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFemPartPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgrCache.cpp -${CMAKE_CURRENT_LIST_DIR}/RivGeoMechVizLogic.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFemPickSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFemElmVisibilityCalculator.cpp - +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivFemPartGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFemPartPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechPartMgrCache.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivGeoMechVizLogic.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFemPickSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFemElmVisibilityCalculator.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "GeoMechViz" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "GeoMechViz" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp index 719ae5f371..13ad859b75 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemElmVisibilityCalculator.cpp @@ -89,7 +89,7 @@ void RivFemElmVisibilityCalculator::computeRangeVisibility( cvf::UByteArray* /// //-------------------------------------------------------------------------------------------------- void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* cellVisibility, - const RigFemPart* grid, + const RigFemPart* part, int timeStepIndex, const cvf::UByteArray* rangeFilterVisibility, RimGeoMechPropertyFilterCollection* propFilterColl ) @@ -98,12 +98,12 @@ void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* CVF_ASSERT( rangeFilterVisibility != nullptr ); CVF_ASSERT( propFilterColl != nullptr ); - CVF_ASSERT( grid->elementCount() > 0 ); - CVF_ASSERT( rangeFilterVisibility->size() == static_cast( grid->elementCount() ) ); + CVF_ASSERT( part->elementCount() > 0 ); + CVF_ASSERT( rangeFilterVisibility->size() == static_cast( part->elementCount() ) ); // Copy if not equal if ( cellVisibility != rangeFilterVisibility ) ( *cellVisibility ) = *rangeFilterVisibility; - const int elementCount = grid->elementCount(); + const int elementCount = part->elementCount(); if ( !propFilterColl->hasActiveFilters() ) return; @@ -124,10 +124,11 @@ void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* resVarAddress.resultPosType = RIG_ELEMENT_NODAL; const std::vector& resVals = - caseData->femPartResults()->resultValues( resVarAddress, grid->elementPartId(), timeStepIndex ); + caseData->femPartResults()->resultValues( resVarAddress, part->elementPartId(), timeStepIndex ); if ( !propertyFilter->isActive() ) continue; if ( !propertyFilter->resultDefinition->hasResult() ) continue; + if ( resVals.size() == 0 ) continue; const double lowerBound = propertyFilter->lowerBound(); const double upperBound = propertyFilter->upperBound(); @@ -145,7 +146,7 @@ void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* { if ( !( *cellVisibility )[cellIndex] ) continue; - size_t resultValueIndex = grid->elementNodeResultIdx( cellIndex, 0 ); + size_t resultValueIndex = part->elementNodeResultIdx( cellIndex, 0 ); double scalarValue = resVals[resultValueIndex]; int intValue = nearbyint( scalarValue ); if ( integerSet.find( intValue ) != integerSet.end() ) @@ -196,10 +197,10 @@ void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* { if ( !( *cellVisibility )[cellIndex] ) continue; - RigElementType eType = grid->elementType( cellIndex ); + RigElementType eType = part->elementType( cellIndex ); int elmNodeCount = RigFemTypes::elementNodeCount( eType ); - const int* elmNodeIndices = grid->connectivities( cellIndex ); + const int* elmNodeIndices = part->connectivities( cellIndex ); for ( int enIdx = 0; enIdx < elmNodeCount; ++enIdx ) { size_t resultValueIndex = cvf::UNDEFINED_SIZE_T; @@ -209,7 +210,7 @@ void RivFemElmVisibilityCalculator::computePropertyVisibility( cvf::UByteArray* } else { - resultValueIndex = grid->elementNodeResultIdx( cellIndex, enIdx ); + resultValueIndex = part->elementNodeResultIdx( cellIndex, enIdx ); } double scalarValue = resVals[resultValueIndex]; diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp index fda6255651..d4335ec4dc 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.cpp @@ -27,6 +27,7 @@ #include "cvfOutlineEdgeExtractor.h" #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfScalarMapper.h" +#include "cvfStructGridGeometryGenerator.h" #include #include @@ -41,8 +42,9 @@ using namespace cvf; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RivFemPartGeometryGenerator::RivFemPartGeometryGenerator( const RigFemPart* part ) +RivFemPartGeometryGenerator::RivFemPartGeometryGenerator( const RigFemPart* part, cvf::Vec3d displayOffset ) : m_part( part ) + , m_displayOffset( displayOffset ) { CVF_ASSERT( part ); m_triangleMapper = new RivFemPartTriangleToElmMapper; @@ -59,9 +61,9 @@ RivFemPartGeometryGenerator::~RivFemPartGeometryGenerator() /// Generate surface drawable geo from the specified region /// //-------------------------------------------------------------------------------------------------- -ref RivFemPartGeometryGenerator::generateSurface() +ref RivFemPartGeometryGenerator::generateSurface( const std::vector& nodeCoordinates ) { - computeArrays(); + computeArrays( nodeCoordinates ); CVF_ASSERT( m_quadVertices.notNull() ); @@ -84,8 +86,9 @@ ref RivFemPartGeometryGenerator::createMeshDrawable() ref geo = new DrawableGeo; geo->setVertexArray( m_quadVertices.p() ); - ref indices = lineIndicesFromQuadVertexArray( m_quadVertices.p() ); - ref prim = new PrimitiveSetIndexedUInt( PT_LINES ); + ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( m_quadVertices.p() ); + + ref prim = new PrimitiveSetIndexedUInt( PT_LINES ); prim->setIndices( indices.p() ); geo->addPrimitiveSet( prim.p() ); @@ -101,7 +104,7 @@ ref RivFemPartGeometryGenerator::createOutlineMeshDrawable( double cvf::OutlineEdgeExtractor ee( creaseAngle, *m_quadVertices ); - ref indices = lineIndicesFromQuadVertexArray( m_quadVertices.p() ); + ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( m_quadVertices.p() ); ee.addPrimitives( 4, *indices ); ref lineIndices = ee.lineIndices(); @@ -122,42 +125,8 @@ ref RivFemPartGeometryGenerator::createOutlineMeshDrawable( double //-------------------------------------------------------------------------------------------------- /// -/// -/// -/// //-------------------------------------------------------------------------------------------------- -ref RivFemPartGeometryGenerator::lineIndicesFromQuadVertexArray( const Vec3fArray* vertexArray ) -{ - CVF_ASSERT( vertexArray ); - - size_t numVertices = vertexArray->size(); - int numQuads = static_cast( numVertices / 4 ); - CVF_ASSERT( numVertices % 4 == 0 ); - - ref indices = new UIntArray; - indices->resize( numQuads * 8 ); - -#pragma omp parallel for - for ( int i = 0; i < numQuads; i++ ) - { - int idx = 8 * i; - indices->set( idx + 0, i * 4 + 0 ); - indices->set( idx + 1, i * 4 + 1 ); - indices->set( idx + 2, i * 4 + 1 ); - indices->set( idx + 3, i * 4 + 2 ); - indices->set( idx + 4, i * 4 + 2 ); - indices->set( idx + 5, i * 4 + 3 ); - indices->set( idx + 6, i * 4 + 3 ); - indices->set( idx + 7, i * 4 + 0 ); - } - - return indices; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivFemPartGeometryGenerator::computeArrays() +void RivFemPartGeometryGenerator::computeArrays( const std::vector& nodeCoordinates ) { std::vector vertices; std::vector& trianglesToElements = m_triangleMapper->triangleToElmIndexMap(); @@ -179,9 +148,6 @@ void RivFemPartGeometryGenerator::computeArrays() trianglesToElements.reserve( estimatedQuadVxCount / 2 ); trianglesToElementFaces.reserve( estimatedQuadVxCount / 2 ); - cvf::Vec3d displayOffset = m_part->boundingBox().min(); - const std::vector& nodeCoordinates = m_part->nodes().coordinates; - #pragma omp parallel for schedule( dynamic ) for ( int elmIdx = 0; elmIdx < static_cast( m_part->elementCount() ); elmIdx++ ) { @@ -209,13 +175,13 @@ void RivFemPartGeometryGenerator::computeArrays() if ( faceNodeCount == 4 ) { cvf::Vec3f quadVxs0( cvf::Vec3d( nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[0]]] ) - - displayOffset ); + m_displayOffset ); cvf::Vec3f quadVxs1( cvf::Vec3d( nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[1]]] ) - - displayOffset ); + m_displayOffset ); cvf::Vec3f quadVxs2( cvf::Vec3d( nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[2]]] ) - - displayOffset ); + m_displayOffset ); cvf::Vec3f quadVxs3( cvf::Vec3d( nodeCoordinates[elmNodeIndices[localElmNodeIndicesForFace[3]]] ) - - displayOffset ); + m_displayOffset ); int qNodeIdx[4]; qNodeIdx[0] = elmNodeIndices[localElmNodeIndicesForFace[0]]; @@ -304,8 +270,6 @@ cvf::ref const int* elmNodeIndices = part->connectivities( elmIdx ); - // cvf::Vec3d displayOffset = part->boundingBox().min(); - for ( int lfIdx = 0; lfIdx < faceCount; ++lfIdx ) { int faceNodeCount = 0; @@ -336,8 +300,9 @@ cvf::ref ref geo = new DrawableGeo; geo->setVertexArray( quadVertices.p() ); - ref indices = lineIndicesFromQuadVertexArray( quadVertices.p() ); - ref prim = new PrimitiveSetIndexedUInt( PT_LINES ); + ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( quadVertices.p() ); + + ref prim = new PrimitiveSetIndexedUInt( PT_LINES ); prim->setIndices( indices.p() ); geo->addPrimitiveSet( prim.p() ); diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h index 36b1539496..0426c106d8 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartGeometryGenerator.h @@ -21,10 +21,13 @@ #include "cvfArray.h" #include "cvfObject.h" +#include "cvfVector3.h" #include "RigFemPart.h" #include "cvfStructGrid.h" +#include + namespace cvf { class DrawableGeo; @@ -64,7 +67,7 @@ class RivFemPartTriangleToElmMapper : public cvf::Object class RivFemPartGeometryGenerator : public cvf::Object { public: - explicit RivFemPartGeometryGenerator( const RigFemPart* part ); + explicit RivFemPartGeometryGenerator( const RigFemPart* part, cvf::Vec3d displayOffset ); ~RivFemPartGeometryGenerator() override; // Setup methods @@ -77,7 +80,7 @@ class RivFemPartGeometryGenerator : public cvf::Object // Generated geometry - cvf::ref generateSurface(); + cvf::ref generateSurface( const std::vector& nodeCoordinates ); cvf::ref createMeshDrawable(); cvf::ref createOutlineMeshDrawable( double creaseAngle ); @@ -96,21 +99,20 @@ class RivFemPartGeometryGenerator : public cvf::Object const cvf::Vec3d& displayModelOffset ); private: - static cvf::ref lineIndicesFromQuadVertexArray( const cvf::Vec3fArray* vertexArray ); - void computeArrays(); + void computeArrays( const std::vector& nodeCoordinates ); private: // Input cvf::cref m_part; // The part being processed cvf::cref m_elmVisibility; + cvf::Vec3d m_displayOffset; // Created arrays cvf::ref m_quadVertices; - // cvf::ref m_triangleVertices; // If needed, we will do it like this, I think - std::vector m_quadVerticesToNodeIdx; - std::vector m_quadVerticesToGlobalElmNodeIdx; - std::vector m_quadVerticesToGlobalElmFaceNodeIdx; - std::vector m_quadVerticesToGlobalElmIdx; + std::vector m_quadVerticesToNodeIdx; + std::vector m_quadVerticesToGlobalElmNodeIdx; + std::vector m_quadVerticesToGlobalElmFaceNodeIdx; + std::vector m_quadVerticesToGlobalElmIdx; // Mappings cvf::ref m_triangleMapper; diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.cpp index 527df16ae6..bed64fcf4c 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.cpp @@ -19,12 +19,15 @@ #include +#include "RivFemPartPartMgr.h" + #include "RivGeoMechPartMgr.h" #include "RiaPreferences.h" #include "RifGeoMechReaderInterface.h" +#include "RigFemPart.h" #include "RigFemPartResultsCollection.h" #include "RigFemScalarResultFrames.h" #include "RigGeoMechCaseData.h" @@ -61,18 +64,25 @@ //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RivFemPartPartMgr::RivFemPartPartMgr( const RigFemPart* grid ) - : m_surfaceGenerator( grid ) - , m_grid( grid ) +RivFemPartPartMgr::RivFemPartPartMgr( const RigFemPart* part, cvf::Vec3d displayOffset ) + : m_surfaceGenerator( part, displayOffset ) + , m_part( part ) , m_opacityLevel( 1.0f ) , m_defaultColor( cvf::Color3::WHITE ) { - CVF_ASSERT( grid ); - m_gridIdx = grid->elementPartId(); + CVF_ASSERT( part ); + m_partIdx = part->elementPartId(); m_cellVisibility = new cvf::UByteArray; m_surfaceFacesTextureCoords = new cvf::Vec2fArray; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RivFemPartPartMgr::~RivFemPartPartMgr() +{ +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -96,6 +106,33 @@ void RivFemPartPartMgr::setCellVisibility( cvf::UByteArray* cellVisibilities ) generatePartGeometry( m_surfaceGenerator ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFemPartPartMgr::setDisplacements( bool useDisplacements, + double scalingFactor, + const std::vector& displacements ) +{ + size_t nodeCount = m_part->nodes().coordinates.size(); + m_displacedNodeCoordinates.resize( nodeCount ); + const auto coords = m_part->nodes().coordinates; + + if ( useDisplacements ) + { + for ( size_t i = 0; i < nodeCount; i++ ) + { + m_displacedNodeCoordinates[i] = coords[i] + displacements[i] * scalingFactor; + } + } + else + { + for ( size_t i = 0; i < nodeCount; i++ ) + { + m_displacedNodeCoordinates[i] = coords[i]; + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -106,7 +143,7 @@ void RivFemPartPartMgr::generatePartGeometry( RivFemPartGeometryGenerator& geoBu { m_surfaceFaces = nullptr; // To possibly free memory before adding the new stuff - cvf::ref geo = geoBuilder.generateSurface(); + cvf::ref geo = geoBuilder.generateSurface( m_displacedNodeCoordinates ); if ( geo.notNull() ) { geo->computeNormals(); @@ -117,13 +154,13 @@ void RivFemPartPartMgr::generatePartGeometry( RivFemPartGeometryGenerator& geoBu } cvf::ref part = new cvf::Part; - part->setName( "FemPart " + cvf::String( m_gridIdx ) ); - part->setId( m_gridIdx ); // Use grid index as part ID + part->setName( "FemPart " + cvf::String( m_partIdx ) ); + part->setId( m_partIdx ); // Use part index as part ID part->setDrawable( geo.p() ); part->setTransform( m_scaleTransform.p() ); // Set mapping from triangle face index to element index - cvf::ref si = new RivFemPickSourceInfo( m_gridIdx, geoBuilder.triangleToElementMapper() ); + cvf::ref si = new RivFemPickSourceInfo( m_partIdx, geoBuilder.triangleToElementMapper() ); part->setSourceInfo( si.p() ); part->updateBoundingBox(); @@ -150,7 +187,7 @@ void RivFemPartPartMgr::generatePartGeometry( RivFemPartGeometryGenerator& geoBu } cvf::ref part = new cvf::Part; - part->setName( "Grid mesh " + cvf::String( m_gridIdx ) ); + part->setName( "Grid mesh " + cvf::String( m_partIdx ) ); part->setDrawable( geoMesh.p() ); part->setTransform( m_scaleTransform.p() ); @@ -181,8 +218,11 @@ void RivFemPartPartMgr::appendPartsToModel( cvf::ModelBasicList* model ) { CVF_ASSERT( model != nullptr ); - if ( m_surfaceFaces.notNull() ) model->addPart( m_surfaceFaces.p() ); - if ( m_surfaceGridLines.notNull() ) model->addPart( m_surfaceGridLines.p() ); + if ( m_part->enabled() ) + { + if ( m_surfaceFaces.notNull() ) model->addPart( m_surfaceFaces.p() ); + if ( m_surfaceGridLines.notNull() ) model->addPart( m_surfaceGridLines.p() ); + } } //-------------------------------------------------------------------------------------------------- @@ -199,6 +239,7 @@ const RivFemPartGeometryGenerator* RivFemPartPartMgr::surfaceGenerator() const void RivFemPartPartMgr::updateCellColor( cvf::Color4f color ) { if ( m_surfaceFaces.isNull() ) return; + if ( !m_part->enabled() ) return; // Set default effect caf::SurfaceEffectGenerator geometryEffgen( color, caf::PO_1 ); @@ -234,6 +275,8 @@ void RivFemPartPartMgr::updateCellResultColor( size_t timeStepIndex, RimGeoMechC { CVF_ASSERT( cellResultColors ); + if ( !m_part->enabled() ) return; + cvf::ref surfaceFacesColorArray; // Outer surface @@ -254,7 +297,7 @@ void RivFemPartPartMgr::updateCellResultColor( size_t timeStepIndex, RimGeoMechC } const std::vector& resultValues = - caseData->femPartResults()->resultValues( resVarAddress, m_gridIdx, (int)timeStepIndex ); + caseData->femPartResults()->resultValues( resVarAddress, m_partIdx, (int)timeStepIndex ); const std::vector* vxToResultMapping = nullptr; int vxCount = 0; @@ -329,10 +372,3 @@ void RivFemPartPartMgr::updateCellResultColor( size_t timeStepIndex, RimGeoMechC view->isLightingDisabled() ); } } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RivFemPartPartMgr::~RivFemPartPartMgr() -{ -} diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.h b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.h index 7cc8929114..56c40cd771 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.h +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivFemPartPartMgr.h @@ -20,9 +20,12 @@ #pragma once #include "cvfObject.h" +#include "cvfVector3.h" #include "RivFemPartGeometryGenerator.h" +#include + namespace cvf { class StructGridInterface; @@ -46,12 +49,14 @@ class RigFemPart; class RivFemPartPartMgr : public cvf::Object { public: - explicit RivFemPartPartMgr( const RigFemPart* femPart ); + explicit RivFemPartPartMgr( const RigFemPart* part, cvf::Vec3d displayOffset ); ~RivFemPartPartMgr() override; void setTransform( cvf::Transform* scaleTransform ); void setCellVisibility( cvf::UByteArray* cellVisibilities ); cvf::ref cellVisibility() { return m_cellVisibility; } + void setDisplacements( bool useDisplacements, double scalingFactor, const std::vector& displacements ); + void updateCellColor( cvf::Color4f color ); void updateCellResultColor( size_t timeStepIndex, RimGeoMechCellColors* cellResultColors ); @@ -63,8 +68,10 @@ class RivFemPartPartMgr : public cvf::Object void generatePartGeometry( RivFemPartGeometryGenerator& geoBuilder ); private: - int m_gridIdx; - cvf::cref m_grid; + int m_partIdx; + cvf::cref m_part; + + std::vector m_displacedNodeCoordinates; cvf::ref m_scaleTransform; float m_opacityLevel; diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.cpp index fffa6a6f71..c7c147144c 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.cpp @@ -18,13 +18,16 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RivGeoMechPartMgr.h" -#include "cvfModelBasicList.h" -#include "cvfPart.h" -#include #include "RigFemPartCollection.h" #include "RigGeoMechCaseData.h" +#include "RimGeoMechPartCollection.h" + +#include "cvfModelBasicList.h" +#include "cvfPart.h" +#include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -50,13 +53,26 @@ void RivGeoMechPartMgr::clearAndSetReservoir( const RigGeoMechCaseData* geoMechC { const RigFemPartCollection* femParts = geoMechCase->femParts(); + cvf::Vec3d displayOffset = femParts->boundingBox().min(); + for ( int i = 0; i < femParts->partCount(); ++i ) { - m_femPartPartMgrs.push_back( new RivFemPartPartMgr( femParts->part( i ) ) ); + m_femPartPartMgrs.push_back( new RivFemPartPartMgr( femParts->part( i ), displayOffset ) ); } } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivGeoMechPartMgr::updateDisplacements( const RimGeoMechPartCollection* parts, bool showDisplacements, double scaleFactor ) +{ + for ( size_t i = 0; i < m_femPartPartMgrs.size(); i++ ) + { + m_femPartPartMgrs[i]->setDisplacements( showDisplacements, scaleFactor, parts->displacements( (int)i ) ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -71,19 +87,19 @@ void RivGeoMechPartMgr::setTransform( cvf::Transform* scaleTransform ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivGeoMechPartMgr::setCellVisibility( size_t gridIndex, cvf::UByteArray* cellVisibilities ) +void RivGeoMechPartMgr::setCellVisibility( size_t partIndex, cvf::UByteArray* cellVisibilities ) { - CVF_ASSERT( gridIndex < m_femPartPartMgrs.size() ); - m_femPartPartMgrs[gridIndex]->setCellVisibility( cellVisibilities ); + CVF_ASSERT( partIndex < m_femPartPartMgrs.size() ); + m_femPartPartMgrs[partIndex]->setCellVisibility( cellVisibilities ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -cvf::ref RivGeoMechPartMgr::cellVisibility( size_t gridIdx ) +cvf::ref RivGeoMechPartMgr::cellVisibility( size_t partIdx ) { - CVF_ASSERT( gridIdx < m_femPartPartMgrs.size() ); - return m_femPartPartMgrs[gridIdx]->cellVisibility(); + CVF_ASSERT( partIdx < m_femPartPartMgrs.size() ); + return m_femPartPartMgrs[partIdx]->cellVisibility(); } //-------------------------------------------------------------------------------------------------- @@ -122,13 +138,13 @@ void RivGeoMechPartMgr::appendGridPartsToModel( cvf::ModelBasicList* model ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivGeoMechPartMgr::appendGridPartsToModel( cvf::ModelBasicList* model, const std::vector& gridIndices ) +void RivGeoMechPartMgr::appendGridPartsToModel( cvf::ModelBasicList* model, const std::vector& partIndices ) { - for ( size_t i = 0; i < gridIndices.size(); ++i ) + for ( size_t i = 0; i < partIndices.size(); ++i ) { - if ( gridIndices[i] < m_femPartPartMgrs.size() ) + if ( partIndices[i] < m_femPartPartMgrs.size() ) { - m_femPartPartMgrs[gridIndices[i]]->appendPartsToModel( model ); + m_femPartPartMgrs[partIndices[i]]->appendPartsToModel( model ); } } } diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.h b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.h index 6cca1e10fa..4bfcd5a797 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.h +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechPartMgr.h @@ -33,6 +33,7 @@ class Transform; class RimGeoMechCellColors; class RigGeoMechCaseData; class RimGeoMechView; +class RimGeoMechPartCollection; //================================================================================================== /// @@ -51,6 +52,7 @@ class RivGeoMechPartMgr : public cvf::Object void clearAndSetReservoir( const RigGeoMechCaseData* geoMechCase ); void setTransform( cvf::Transform* scaleTransform ); void setCellVisibility( size_t partIndex, cvf::UByteArray* cellVisibilities ); + void updateDisplacements( const RimGeoMechPartCollection* parts, bool showDisplacements, double scaleFactor ); cvf::ref cellVisibility( size_t partIndex ); diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.cpp b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.cpp index 6ae7a42f95..ad8005492e 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.cpp +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.cpp @@ -27,6 +27,7 @@ #include "RimCellFilterCollection.h" #include "RimGeoMechCase.h" #include "RimGeoMechCellColors.h" +#include "RimGeoMechPartCollection.h" #include "RimGeoMechPropertyFilterCollection.h" #include "RimGeoMechView.h" #include "RimViewController.h" @@ -126,6 +127,21 @@ void RivGeoMechVizLogic::scheduleGeometryRegen( RivCellSetEnum geometryType ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivGeoMechVizLogic::scheduleGeometryRegenOfVisiblePartMgrs( int timeStepIndex ) +{ + std::vector visiblePartMgrs = keysToVisiblePartMgrs( timeStepIndex ); + for ( size_t pmIdx = 0; pmIdx < visiblePartMgrs.size(); ++pmIdx ) + { + m_partMgrCache->scheduleRegeneration( visiblePartMgrs[pmIdx] ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- void RivGeoMechVizLogic::scheduleRegenOfDirectlyDependentGeometry( RivCellSetEnum geometryType ) { if ( geometryType == RANGE_FILTERED ) @@ -202,10 +218,15 @@ RivGeoMechPartMgr* RivGeoMechVizLogic::getUpdatedPartMgr( RivGeoMechPartMgrCache partMgrToUpdate->clearAndSetReservoir( caseData ); } + partMgrToUpdate->updateDisplacements( m_geomechView->partsCollection(), + m_geomechView->showDisplacements(), + m_geomechView->displacementScaleFactor() ); + + partMgrToUpdate->setTransform( m_geomechView->scaleTransform() ); + for ( int femPartIdx = 0; femPartIdx < partCount; ++femPartIdx ) { cvf::ref elmVisibility = partMgrToUpdate->cellVisibility( femPartIdx ); - partMgrToUpdate->setTransform( m_geomechView->scaleTransform() ); if ( pMgrKey.geometryType() == RANGE_FILTERED ) { @@ -265,13 +286,15 @@ void RivGeoMechVizLogic::calculateCurrentTotalCellVisibility( cvf::UByteArray* t { if ( !m_geomechView->geoMechCase() ) return; - size_t gridCount = m_geomechView->femParts()->partCount(); - - if ( gridCount == 0 ) return; - - RigFemPart* part = m_geomechView->femParts()->part( 0 ); - int elmCount = part->elementCount(); + int partCount = m_geomechView->femParts()->partCount(); + if ( partCount == 0 ) return; + int elmCount = 0; + for ( int i = 0; i < partCount; i++ ) + { + RigFemPart* part = m_geomechView->femParts()->part( i ); + elmCount += part->elementCount(); + } totalVisibility->resize( elmCount ); totalVisibility->setAll( false ); @@ -282,10 +305,17 @@ void RivGeoMechVizLogic::calculateCurrentTotalCellVisibility( cvf::UByteArray* t CVF_ASSERT( partMgr ); if ( partMgr ) { - cvf::ref visibility = partMgr->cellVisibility( 0 ); - for ( int elmIdx = 0; elmIdx < elmCount; ++elmIdx ) + int elmOffset = 0; + for ( int i = 0; i < partCount; i++ ) { - ( *totalVisibility )[elmIdx] |= ( *visibility )[elmIdx]; + RigFemPart* part = m_geomechView->femParts()->part( i ); + + cvf::ref visibility = partMgr->cellVisibility( i ); + for ( int elmIdx = 0; elmIdx < part->elementCount(); ++elmIdx ) + { + ( *totalVisibility )[elmOffset + elmIdx] |= ( *visibility )[elmIdx]; + } + elmOffset += part->elementCount(); } } } diff --git a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.h b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.h index ff260ebff9..15e66a116b 100644 --- a/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.h +++ b/ApplicationLibCode/GeoMech/GeoMechVisualization/RivGeoMechVizLogic.h @@ -47,6 +47,7 @@ class RivGeoMechVizLogic : public cvf::Object void updateCellResultColor( int timeStepIndex, RimGeoMechCellColors* cellResultColors ); void updateStaticCellColors( int timeStepIndex ); void scheduleGeometryRegen( RivCellSetEnum geometryType ); + void scheduleGeometryRegenOfVisiblePartMgrs( int timeStepIndex ); void calculateCurrentTotalCellVisibility( cvf::UByteArray* totalVisibility, int timeStepIndex ); std::vector keysToVisiblePartMgrs( int timeStepIndex ) const; const cvf::ref partMgrCache() const; diff --git a/ApplicationLibCode/GeoMech/OdbReader/CMakeLists.txt b/ApplicationLibCode/GeoMech/OdbReader/CMakeLists.txt index 3cadd9706a..6685100e92 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/CMakeLists.txt +++ b/ApplicationLibCode/GeoMech/OdbReader/CMakeLists.txt @@ -44,27 +44,26 @@ include_directories(${RESINSIGHT_ODB_API_DIR}/include) add_library( ${PROJECT_NAME} RifOdbReader.h RifOdbReader.cpp RifGeoMechReaderInterface.h - RifGeoMechReaderInterface.cpp OdbSetup.cmake) + RifGeoMechReaderInterface.cpp OdbSetup.cmake +) if(MSVC) list( APPEND RI_ODB_LIBS - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbDdbOdb.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAAbuBasicUtils.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAAbuGeom.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasAlloc.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasCoreUtils.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasShared.lib ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbApi.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbAttrEO.lib ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbCore.lib ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbCoreGeom.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbAttrEO.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAAbuBasicUtils.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasShared.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasCoreUtils.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAStiCAE_StableTime.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMABasMem.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAAbuGeom.lib + ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAOdbDdbOdb.lib ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMARomDiagEx.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMASspUmaCore.lib ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMASimInterface.lib - ${RESINSIGHT_ODB_API_DIR}/lib/ABQSMAMtxCoreModule.lib) + ) else() list( APPEND @@ -77,18 +76,17 @@ else() ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMAAbuBasicUtils.so ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMABasShared.so ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMABasCoreUtils.so - ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMAStiCAE_StableTime.so - ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMABasMem.so + ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMABasAlloc.so ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMAAbuGeom.so ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMARomDiagEx.so - ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMASspUmaCore.so ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMASimInterface.so - ${RESINSIGHT_ODB_API_DIR}/lib/libABQSMAMtxCoreModule.so) + ) endif(MSVC) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) -target_link_libraries(${PROJECT_NAME} ${RI_ODB_LIBS} RigGeoMechDataModel - LibCore) +target_link_libraries( + ${PROJECT_NAME} ${RI_ODB_LIBS} RigGeoMechDataModel LibCore +) source_group("" FILES ${PROJECT_FILES}) diff --git a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp index 415d032baa..11d325f85c 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp +++ b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.cpp @@ -35,6 +35,7 @@ #include "RigFemPart.h" #include "RigFemPartCollection.h" +#include "RigFemTypes.h" #include "cafProgressInfo.h" #include @@ -97,14 +98,16 @@ size_t RifOdbReader::sm_instanceCount = 0; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- - std::map initFemTypeMap() { std::map typeMap; - typeMap["C3D8R"] = HEX8; - typeMap["C3D8"] = HEX8; - typeMap["C3D8P"] = HEX8P; - typeMap["CAX4"] = CAX4; + typeMap["C3D8R"] = HEX8; + typeMap["C3D8"] = HEX8; + typeMap["C3D8P"] = HEX8P; + typeMap["CAX4"] = CAX4; + typeMap["C3D20RT"] = HEX8; + typeMap["C3D8RT"] = HEX8; + typeMap["C3D8R"] = HEX8; return typeMap; } @@ -129,30 +132,6 @@ RigElementType toRigElementType( const odb_String& odbTypeName ) return it->second; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- - -const int* localElmNodeToIntegrationPointMapping( RigElementType elmType ) -{ - static const int HEX8_Mapping[8] = { 0, 1, 3, 2, 4, 5, 7, 6 }; - - switch ( elmType ) - { - case HEX8: - case HEX8P: - return HEX8_Mapping; - break; - case CAX4: - return HEX8_Mapping; // First four is identical to HEX8 - break; - default: - // assert(false); // Element type not supported - break; - } - return NULL; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -271,8 +250,8 @@ std::map> RifOdbReader:: if ( stepFrames.size() > 1 ) { - // Optimization: Get results metadata for the second frame of the first step only - const odb_Frame& frame = stepFrames.constGet( 1 ); + // Optimization: Get results metadata for the last frame of the first step only + const odb_Frame& frame = stepFrames.constGet( stepFrames.size() - 1 ); const odb_FieldOutputRepository& fieldCon = frame.fieldOutputs(); odb_FieldOutputRepositoryIT fieldConIT( fieldCon ); @@ -335,7 +314,7 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts ) odb_InstanceRepository instanceRepository = m_odb->rootAssembly().instances(); odb_InstanceRepositoryIT iter( instanceRepository ); - caf::ProgressInfo modelProgress( instanceRepository.size() * ( 2 + 4 ), "Reading Odb Parts" ); + caf::ProgressInfo modelProgress( instanceRepository.size() * ( size_t )( 2 + 4 ), "Reading Odb Parts" ); int instanceCount = 0; for ( iter.first(); !iter.isDone(); iter.next(), instanceCount++ ) @@ -343,10 +322,14 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts ) modelProgress.setProgressDescription( QString( iter.currentKey().cStr() ) + ": Reading Nodes" ); m_nodeIdToIdxMaps.push_back( std::map() ); - odb_Instance& inst = instanceRepository[iter.currentKey()]; + const auto& key = iter.currentKey(); + + odb_Instance& inst = instanceRepository[key]; RigFemPart* femPart = new RigFemPart; + femPart->setName( key.cStr() ); + // Extract nodes const odb_SequenceNode& odbNodes = inst.nodes(); @@ -372,7 +355,7 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts ) } modelProgress.incrementProgress(); - modelProgress.setProgressDescription( QString( iter.currentKey().cStr() ) + ": Reading Elements" ); + modelProgress.setProgressDescription( QString( key.cStr() ) + ": Reading Elements" ); // Extract elements const odb_SequenceElement& elements = inst.elements(); @@ -396,6 +379,8 @@ bool RifOdbReader::readFemParts( RigFemPartCollection* femParts ) int nodeCount = 0; const int* idBasedConnectivities = odbElm.connectivity( nodeCount ); + nodeCount = std::min( nodeCount, RigFemTypes::elementNodeCount( elmType ) ); + CVF_TIGHT_ASSERT( nodeCount == RigFemTypes::elementNodeCount( elmType ) ); indexBasedConnectivities.resize( nodeCount ); @@ -633,22 +618,60 @@ odb_Instance* RifOdbReader::instance( int instanceIndex ) //-------------------------------------------------------------------------------------------------- /// Get the number of result items (== #nodes or #elements) //-------------------------------------------------------------------------------------------------- -size_t RifOdbReader::resultItemCount( const std::string& fieldName, int partIndex, int stepIndex, int frameIndex ) +size_t RifOdbReader::resultItemCount( const std::string& fieldName, + int partIndex, + int stepIndex, + int frameIndex, + ResultPosition resultPosition ) { odb_Instance* partInstance = instance( partIndex ); CVF_ASSERT( partInstance != NULL ); const odb_Frame& frame = stepFrame( stepIndex, frameIndex ); const odb_FieldOutput& instanceFieldOutput = frame.fieldOutputs()[fieldName.c_str()].getSubset( *partInstance ); - const odb_SequenceFieldBulkData& seqFieldBulkData = instanceFieldOutput.bulkDataBlocks(); + + odb_Enum::odb_ResultPositionEnum odbResultPos = odb_Enum::NODAL; + if ( resultPosition == ELEMENT_NODAL ) + odbResultPos = odb_Enum::ELEMENT_NODAL; + else if ( resultPosition == INTEGRATION_POINT ) + odbResultPos = odb_Enum::INTEGRATION_POINT; + + const odb_FieldOutput& subsetOutput = instanceFieldOutput.getSubset( odbResultPos ); + const odb_SequenceFieldBulkData& seqFieldBulkData = subsetOutput.bulkDataBlocks(); size_t resultItemCount = 0; int numBlocks = seqFieldBulkData.size(); for ( int block = 0; block < numBlocks; block++ ) { - const odb_FieldBulkData& bulkData = seqFieldBulkData[block]; - resultItemCount += bulkData.length(); + const odb_FieldBulkData& bulkData = seqFieldBulkData[block]; + int numValues = bulkData.length(); + + if ( resultPosition == INTEGRATION_POINT ) + { + int numValues = bulkData.length(); + int elemCount = bulkData.numberOfElements(); + int ipCount = numValues / elemCount; + + // handle reduced integration point elements by using the same value 8 times + if ( ipCount == 1 ) + resultItemCount += numValues * 8; + else + resultItemCount += numValues; + } + else if ( resultPosition == ELEMENT_NODAL ) + { + int numValues = bulkData.length(); + int elemCount = bulkData.numberOfElements(); + int elemNodeCount = numValues / elemCount; + + // handle that we use just 8 nodes per element + resultItemCount += elemCount * std::min( elemNodeCount, 8 ); + } + else + { + resultItemCount += numValues; + } } return resultItemCount; @@ -713,7 +736,7 @@ void RifOdbReader::readDisplacements( int partIndex, int stepIndex, int frameInd odb_Instance* partInstance = instance( partIndex ); CVF_ASSERT( partInstance != NULL ); - size_t dataSize = resultItemCount( "U", partIndex, stepIndex, frameIndex ); + size_t dataSize = resultItemCount( "U", partIndex, stepIndex, frameIndex, NODAL ); if ( dataSize > 0 ) { displacements->resize( dataSize ); @@ -821,7 +844,7 @@ void RifOdbReader::readElementNodeField( const std::string& field size_t compCount = componentsCount( fieldName, ELEMENT_NODAL ); CVF_ASSERT( compCount == resultValues->size() ); - size_t dataSize = resultItemCount( fieldName, partIndex, stepIndex, frameIndex ); + size_t dataSize = resultItemCount( fieldName, partIndex, stepIndex, frameIndex, ELEMENT_NODAL ); if ( dataSize > 0 ) { for ( int comp = 0; comp < compCount; comp++ ) @@ -853,13 +876,16 @@ void RifOdbReader::readElementNodeField( const std::string& field int* elementLabels = bulkData.elementLabels(); float* data = bulkDataGetter.data(); + // use max HEX8 nodes + int usedElemNodeCount = std::min( elemNodeCount, 8 ); + for ( int elem = 0; elem < elemCount; elem++ ) { int elementIdx = elementIdToIdxMap[elementLabels[elem * elemNodeCount]]; - int elementResultStartDestIdx = elementIdx * elemNodeCount; // Ikke generellt riktig ! + int elementResultStartDestIdx = elementIdx * usedElemNodeCount; int elementResultStartSourceIdx = elem * elemNodeCount * numComp; - for ( int elemNode = 0; elemNode < elemNodeCount; elemNode++ ) + for ( int elemNode = 0; elemNode < usedElemNodeCount; elemNode++ ) { int destIdx = elementResultStartDestIdx + elemNode; int srcIdx = elementResultStartSourceIdx + elemNode * numComp; @@ -890,7 +916,7 @@ void RifOdbReader::readIntegrationPointField( const std::string& size_t compCount = componentsCount( fieldName, INTEGRATION_POINT ); CVF_ASSERT( compCount == resultValues->size() ); - size_t dataSize = resultItemCount( fieldName, partIndex, stepIndex, frameIndex ); + size_t dataSize = resultItemCount( fieldName, partIndex, stepIndex, frameIndex, INTEGRATION_POINT ); if ( dataSize > 0 ) { for ( int comp = 0; comp < compCount; comp++ ) @@ -919,27 +945,26 @@ void RifOdbReader::readIntegrationPointField( const std::string& int numComp = bulkData.width(); int elemCount = bulkData.numberOfElements(); int ipCount = numValues / elemCount; + int ipDestCount = std::max( ipCount, 8 ); // always use max. 8 integration points in destination int* elementLabels = bulkData.elementLabels(); float* data = bulkDataGetter.data(); - RigElementType eType = toRigElementType( bulkData.baseElementType() ); - const int* elmNodeToIpResultMapping = - localElmNodeToIntegrationPointMapping( eType ); // Todo: Use the one in RigFemTypes.h, but we need to guard - // against unknown element types first. - if ( !elmNodeToIpResultMapping ) continue; + RigElementType eType = toRigElementType( bulkData.baseElementType() ); + const int* elmNodeToIpResultMapping = RigFemTypes::localElmNodeToIntegrationPointMapping( eType ); for ( int elem = 0; elem < elemCount; elem++ ) { int elementIdx = elementIdToIdxMap[elementLabels[elem * ipCount]]; - int elementResultStartDestIdx = elementIdx * ipCount; // Ikke generellt riktig ! + int elementResultStartDestIdx = elementIdx * ipDestCount; int elementResultStartSourceIdx = elem * ipCount * numComp; - for ( int ipIdx = 0; ipIdx < ipCount; ipIdx++ ) + for ( int ipIdx = 0; ipIdx < ipDestCount; ipIdx++ ) { - int resultIpIdx = elmNodeToIpResultMapping[ipIdx]; - int destIdx = elementResultStartDestIdx + ipIdx; + int resultIpIdx = elmNodeToIpResultMapping[std::min( ipIdx, ipCount - 1 )]; int srcIdx = elementResultStartSourceIdx + resultIpIdx * numComp; + int destIdx = elementResultStartDestIdx + ipIdx; + for ( int comp = 0; comp < numComp; comp++ ) { ( *( *resultValues )[comp] )[destIdx] = data[srcIdx + comp]; diff --git a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.h b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.h index 5c9e6dbbb9..f9efbd9954 100644 --- a/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.h +++ b/ApplicationLibCode/GeoMech/OdbReader/RifOdbReader.h @@ -104,7 +104,11 @@ class RifOdbReader : public RifGeoMechReaderInterface void assertMetaDataLoaded(); void close(); - size_t resultItemCount( const std::string& fieldName, int partIndex, int stepIndex, int frameIndex ); + size_t resultItemCount( const std::string& fieldName, + int partIndex, + int stepIndex, + int frameIndex, + ResultPosition resultPosition ); size_t componentsCount( const std::string& fieldName, ResultPosition position ); const odb_Frame& stepFrame( int stepIndex, int frameIndex ) const; odb_Instance* instance( int instanceIndex ); diff --git a/ApplicationLibCode/GeoMech/OdbReader_UnitTests/CMakeLists.txt b/ApplicationLibCode/GeoMech/OdbReader_UnitTests/CMakeLists.txt index 4b744bf9e4..95e17c3061 100644 --- a/ApplicationLibCode/GeoMech/OdbReader_UnitTests/CMakeLists.txt +++ b/ApplicationLibCode/GeoMech/OdbReader_UnitTests/CMakeLists.txt @@ -4,13 +4,16 @@ project(OdbReader_UnitTests) set(RI_VIZ_FWK_ROOT ../../../Fwk/VizFwk - CACHE PATH "Path to VizFwk") + CACHE PATH "Path to VizFwk" +) set(RI_GTEST_ROOT ../../../ThirdParty - CACHE PATH "Path to folder containing gtest folder") + CACHE PATH "Path to folder containing gtest folder" +) set(RI_TEST_FILE "" - CACHE FILEPATH "Path to test file") + CACHE FILEPATH "Path to test file" +) include(${RI_VIZ_FWK_ROOT}/CMake/Utils/ceeDetermineCompilerFlags.cmake) @@ -29,7 +32,8 @@ include_directories(../GeoMechDataModel) include_directories(${RI_GTEST_ROOT}) set(UNIT_TEST_CPP_SOURCES main.cpp RifOdbReader-Test.cpp - ${RI_GTEST_ROOT}/gtest/gtest-all.cc) + ${RI_GTEST_ROOT}/gtest/gtest-all.cc +) add_executable(${PROJECT_NAME} ${UNIT_TEST_CPP_SOURCES}) target_link_libraries(${PROJECT_NAME} RifOdbReader) diff --git a/ApplicationLibCode/ModelVisualization/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/CMakeLists_files.cmake index 17d1b814a1..d57c872507 100644 --- a/ApplicationLibCode/ModelVisualization/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/CMakeLists_files.cmake @@ -1,129 +1,132 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeEffectGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivFaultPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivFaultGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivNNCGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivGridPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivTernarySaturationOverlayItem.h -${CMAKE_CURRENT_LIST_DIR}/RivReservoirPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivReservoirViewPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivReservoirFaultsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivReservoirSimWellsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivWellPathSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivWellPathPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivWellPathsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipesPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivWellHeadPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivResultToTextureMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivCompletionTypeResultToTextureMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivDefaultResultToTextureMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivTernaryResultToTextureMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivTextureCoordsCreator.h -${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivTernaryTextureCoordsCreator.h -${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapperEffectGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivScalarMapperUtils.h -${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeGeometryUtils.h -${CMAKE_CURRENT_LIST_DIR}/RivPipeQuadToSegmentMapper.h -${CMAKE_CURRENT_LIST_DIR}/RivSingleCellPartGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipeSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivWellSpheresPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivPartPriority.h -${CMAKE_CURRENT_LIST_DIR}/RivObjectSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivFishbonesSubsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivTensorResultPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivWellFracturePartMgr.h -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogPlanePartMgr.h -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogDrawSurfaceGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivMeshLinesSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivContourMapProjectionPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivAnnotationsPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivMeasurementPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivTextLabelSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivDiskGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivWellDiskPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivElementVectorResultPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivPolylinePartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivCellFilterPartMgr.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeEffectGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivFaultPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivFaultGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivNNCGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivGridPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivTernarySaturationOverlayItem.h + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirViewPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirFaultsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirSimWellsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipesPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellHeadPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivResultToTextureMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivCompletionTypeResultToTextureMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivDefaultResultToTextureMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryResultToTextureMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivTextureCoordsCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryTextureCoordsCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapperEffectGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivScalarMapperUtils.h + ${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeGeometryUtils.h + ${CMAKE_CURRENT_LIST_DIR}/RivPipeQuadToSegmentMapper.h + ${CMAKE_CURRENT_LIST_DIR}/RivSingleCellPartGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipeSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellSpheresPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivPartPriority.h + ${CMAKE_CURRENT_LIST_DIR}/RivObjectSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivFishbonesSubsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivTensorResultPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellFracturePartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogPlanePartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogDrawSurfaceGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivMeshLinesSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivContourMapProjectionPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivAnnotationsPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivMeasurementPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivTextLabelSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivDiskGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivWellDiskPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivElementVectorResultPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivPolylinePartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivCellFilterPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivDrawableSpheres.h + ${CMAKE_CURRENT_LIST_DIR}/RivBoxGeometryGenerator.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeEffectGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFaultPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivNNCGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFaultGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivGridPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTernarySaturationOverlayItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReservoirFaultsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReservoirPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReservoirViewPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReservoirSimWellsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellPathSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellPathPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellPathsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipesPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellHeadPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTextureCoordsCreator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTernaryTextureCoordsCreator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapperEffectGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivScalarMapperUtils.cpp -${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeGeometryUtils.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPipeQuadToSegmentMapper.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSingleCellPartGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipeSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellSpheresPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivObjectSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivFishbonesSubsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTensorResultPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellFracturePartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogPlanePartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogDrawSurfaceGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivMeshLinesSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivContourMapProjectionPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivAnnotationsPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivMeasurementPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTextLabelSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivDiskGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivWellDiskPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivElementVectorResultPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPolylinePartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivCellFilterPartMgr.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeEffectGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFaultPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivNNCGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFaultGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivGridPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTernarySaturationOverlayItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirFaultsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirViewPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirSimWellsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellPathsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipesPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellHeadPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTextureCoordsCreator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryTextureCoordsCreator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapperEffectGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivScalarMapperUtils.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivCellEdgeGeometryUtils.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPipeQuadToSegmentMapper.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSingleCellPartGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellPipeSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellSpheresPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivObjectSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFishbonesSubsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTensorResultPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellFracturePartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogPlanePartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogCurveGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionFactorGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellConnectionSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSimWellConnectionSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/Riv3dWellLogDrawSurfaceGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivMeshLinesSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivContourMapProjectionPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivAnnotationsPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTextAnnotationPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReachCircleAnnotationSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPolylinesAnnotationSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPolylineGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivMeasurementPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTextLabelSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivDiskGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivWellDiskPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivElementVectorResultPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPolylinePartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivCellFilterPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivDrawableSpheres.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivBoxGeometryGenerator.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ModelVisualization" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ModelVisualization" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ModelVisualization/GridBox/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/GridBox/CMakeLists_files.cmake index 3406423cc9..2dc3aa8249 100644 --- a/ApplicationLibCode/ModelVisualization/GridBox/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/GridBox/CMakeLists_files.cmake @@ -1,21 +1,17 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivPatchGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivGridBoxGenerator.h +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RivPatchGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivGridBoxGenerator.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivPatchGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivGridBoxGenerator.cpp - +set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RivPatchGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivGridBoxGenerator.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ModelVisualization\\GridBox" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ModelVisualization\\GridBox" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ModelVisualization/Intersections/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/Intersections/CMakeLists_files.cmake index d897137b40..b5c295808d 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/Intersections/CMakeLists_files.cmake @@ -1,34 +1,37 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivIntersectionResultsColoringTools.h -${CMAKE_CURRENT_LIST_DIR}/RivHexGridIntersectionTools.h -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionPartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionSourceInfo.h -${CMAKE_CURRENT_LIST_DIR}/RivSectionFlattner.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivIntersectionResultsColoringTools.h + ${CMAKE_CURRENT_LIST_DIR}/RivHexGridIntersectionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionPartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionSourceInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RivSectionFlattener.h + ${CMAKE_CURRENT_LIST_DIR}/RivEclipseIntersectionGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RivFemIntersectionGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RivIntersectionGeometryGeneratorInterface.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivIntersectionResultsColoringTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RivHexGridIntersectionTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionPartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionSourceInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSectionFlattner.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivExtrudedCurveIntersectionSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivIntersectionResultsColoringTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionPartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivBoxIntersectionSourceInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSectionFlattener.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivEclipseIntersectionGrid.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivFemIntersectionGrid.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ModelVisualization\\Intersections" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ModelVisualization\\Intersections" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.cpp index e4af05cec0..3e60fdd555 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.cpp @@ -18,6 +18,8 @@ #include "RivBoxIntersectionGeometryGenerator.h" +#include "RivIntersectionHexGridInterface.h" + #include "RimBoxIntersection.h" #include "RimCase.h" #include "RimGridView.h" diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.h index abb6c3a89a..1caa9dba43 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionGeometryGenerator.h @@ -18,7 +18,7 @@ #pragma once -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionGeometryGeneratorInterface.h" #include "cafPdmPointer.h" @@ -30,6 +30,7 @@ #include class RimBoxIntersection; +class RivIntersectionHexGridInterface; namespace cvf { @@ -37,7 +38,7 @@ class ScalarMapper; class DrawableGeo; } // namespace cvf -class RivBoxIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorIF +class RivBoxIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorInterface { public: RivBoxIntersectionGeometryGenerator( RimBoxIntersection* intersectionBox, const RivIntersectionHexGridInterface* grid ); diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.cpp index 8867ef5620..237ab76f87 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.cpp @@ -36,6 +36,8 @@ #include "RivBoxIntersectionSourceInfo.h" #include "RivExtrudedCurveIntersectionPartMgr.h" +#include "RivIntersectionGeometryGeneratorInterface.h" +#include "RivIntersectionHexGridInterface.h" #include "RivIntersectionResultsColoringTools.h" #include "RivMeshLinesSourceInfo.h" #include "RivPartPriority.h" @@ -219,7 +221,7 @@ void RivBoxIntersectionPartMgr::appendMeshLinePartsToModel( cvf::ModelBasicList* //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RivBoxIntersectionPartMgr::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RivBoxIntersectionPartMgr::intersectionGeometryGenerator() const { if ( m_intersectionBoxGenerator.notNull() ) return m_intersectionBoxGenerator.p(); diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.h b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.h index 54c3e15026..9bcfaeffeb 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivBoxIntersectionPartMgr.h @@ -34,6 +34,7 @@ class RigMainGrid; class RigResultAccessor; class RivTernaryScalarMapper; +class RivIntersectionGeometryGeneratorInterface; class RimCellEdgeColors; class RimEclipseCellColors; @@ -60,7 +61,7 @@ class RivBoxIntersectionPartMgr : public cvf::Object void appendNativeIntersectionFacesToModel( cvf::ModelBasicList* model, cvf::Transform* scaleTransform ); void appendMeshLinePartsToModel( cvf::ModelBasicList* model, cvf::Transform* scaleTransform ); - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const; + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const; private: void updatePartEffect(); diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.cpp new file mode 100644 index 0000000000..7e74dd44d4 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.cpp @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RivEclipseIntersectionGrid.h" + +#include "RigActiveCellInfo.h" +#include "RigFemPart.h" +#include "RigMainGrid.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RivEclipseIntersectionGrid::RivEclipseIntersectionGrid( const RigMainGrid* mainGrid, + const RigActiveCellInfo* activeCellInfo, + bool showInactiveCells ) + : m_mainGrid( mainGrid ) + , m_activeCellInfo( activeCellInfo ) + , m_showInactiveCells( showInactiveCells ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RivEclipseIntersectionGrid::displayOffset() const +{ + return m_mainGrid->displayModelOffset(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::BoundingBox RivEclipseIntersectionGrid::boundingBox() const +{ + return m_mainGrid->boundingBox(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivEclipseIntersectionGrid::findIntersectingCells( const cvf::BoundingBox& intersectingBB, + std::vector* intersectedCells ) const +{ + m_mainGrid->findIntersectingCells( intersectingBB, intersectedCells ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RivEclipseIntersectionGrid::useCell( size_t cellIndex ) const +{ + const RigCell& cell = m_mainGrid->globalCellArray()[cellIndex]; + if ( m_showInactiveCells ) + return !( cell.isInvalid() || ( cell.subGrid() != nullptr ) ); + else + return m_activeCellInfo->isActive( cellIndex ) && ( cell.subGrid() == nullptr ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivEclipseIntersectionGrid::cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const +{ + m_mainGrid->cellCornerVertices( cellIndex, cellCorners ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivEclipseIntersectionGrid::cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const +{ + const std::array& cornerIndicesSource = m_mainGrid->globalCellArray()[cellIndex].cornerIndices(); + + for ( size_t i = 0; i < 8; i++ ) + { + cornerIndices[i] = cornerIndicesSource[i]; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RigFault* RivEclipseIntersectionGrid::findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, + cvf::StructGridInterface::FaceType face ) const +{ + return m_mainGrid->findFaultFromCellIndexAndCellFace( reservoirCellIndex, face ); +} diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.h b/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.h new file mode 100644 index 0000000000..9526c3385e --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivEclipseIntersectionGrid.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RivIntersectionHexGridInterface.h" + +#include "cvfBoundingBox.h" +#include "cvfObject.h" +#include "cvfVector3.h" + +#include "cvfStructGrid.h" + +#include +#include + +class RigActiveCellInfo; +class RigMainGrid; +class RigFault; + +class RivEclipseIntersectionGrid : public RivIntersectionHexGridInterface +{ +public: + RivEclipseIntersectionGrid( const RigMainGrid* mainGrid, const RigActiveCellInfo* activeCellInfo, bool showInactiveCells ); + + cvf::Vec3d displayOffset() const override; + cvf::BoundingBox boundingBox() const override; + void findIntersectingCells( const cvf::BoundingBox& intersectingBB, + std::vector* intersectedCells ) const override; + bool useCell( size_t cellIndex ) const override; + void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const override; + void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const override; + const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, + cvf::StructGridInterface::FaceType face ) const override; + +private: + cvf::cref m_mainGrid; + cvf::cref m_activeCellInfo; + bool m_showInactiveCells; +}; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.cpp index 9cb1b03433..0fcd42c618 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.cpp @@ -21,15 +21,22 @@ #include "RigMainGrid.h" #include "RigResultAccessor.h" +#include "RigSurface.h" +#include "RigSurfaceResampler.h" +#include "RigWellPath.h" #include "Rim3dView.h" #include "RimCase.h" #include "RimExtrudedCurveIntersection.h" #include "RimGridView.h" +#include "RimSurface.h" +#include "RimSurfaceIntersectionBand.h" +#include "RimSurfaceIntersectionCurve.h" #include "RivExtrudedCurveIntersectionPartMgr.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionHexGridInterface.h" #include "RivPolylineGenerator.h" +#include "RivSectionFlattener.h" #include "cafDisplayCoordTransform.h" #include "cafHexGridIntersectionTools/cafHexGridIntersectionTools.h" @@ -42,8 +49,6 @@ #include "cvfRay.h" #include "cvfScalarMapper.h" -#include "RivSectionFlattner.h" - cvf::ref displayCoordTransform( const RimExtrudedCurveIntersection* intersection ) { Rim3dView* rimView = nullptr; @@ -66,7 +71,7 @@ RivExtrudedCurveIntersectionGeometryGenerator::RivExtrudedCurveIntersectionGeome bool isFlattened, const cvf::Vec3d& flattenedPolylineStartPoint ) : m_intersection( crossSection ) - , m_polyLines( polylines ) + , m_polylines( polylines ) , m_extrusionDirection( extrusionDirection ) , m_hexGrid( grid ) , m_isFlattened( isFlattened ) @@ -89,28 +94,27 @@ RivExtrudedCurveIntersectionGeometryGenerator::~RivExtrudedCurveIntersectionGeom //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivExtrudedCurveIntersectionGeometryGenerator::calculateSegementTransformPrLinePoint() +void RivExtrudedCurveIntersectionGeometryGenerator::calculateLineSegementTransforms() { if ( m_isFlattened ) { - if ( !( m_polyLines.size() && m_polyLines.back().size() ) ) return; + if ( m_polylines.empty() || m_polylines.back().empty() ) return; cvf::Vec3d startOffset = m_flattenedPolylineStartPoint; - for ( size_t pLineIdx = 0; pLineIdx < m_polyLines.size(); ++pLineIdx ) + for ( const std::vector& polyLine : m_polylines ) { - const std::vector& polyLine = m_polyLines[pLineIdx]; - startOffset.z() = polyLine[0].z(); - m_segementTransformPrLinePoint.emplace_back( - RivSectionFlattner::calculateFlatteningCSsForPolyline( polyLine, - m_extrusionDirection, - startOffset, - &startOffset ) ); + startOffset.z() = polyLine[0].z(); + m_lineSegmentTransforms.emplace_back( + RivSectionFlattener::calculateFlatteningCSsForPolyline( polyLine, + m_extrusionDirection, + startOffset, + &startOffset ) ); } } else { - m_segementTransformPrLinePoint.clear(); + m_lineSegmentTransforms.clear(); cvf::Vec3d displayOffset( 0, 0, 0 ); { @@ -124,10 +128,10 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateSegementTransformPr cvf::Mat4d invSectionCS = cvf::Mat4d::fromTranslation( -displayOffset ); - for ( const auto& polyLine : m_polyLines ) + for ( const auto& polyLine : m_polylines ) { - m_segementTransformPrLinePoint.emplace_back(); - std::vector& segmentTransforms = m_segementTransformPrLinePoint.back(); + m_lineSegmentTransforms.emplace_back(); + std::vector& segmentTransforms = m_lineSegmentTransforms.back(); for ( size_t lIdx = 0; lIdx < polyLine.size(); ++lIdx ) { segmentTransforms.push_back( invSectionCS ); @@ -139,21 +143,73 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateSegementTransformPr //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivExtrudedCurveIntersectionGeometryGenerator::calculateFlattenedOrOffsetedPolyline() +void RivExtrudedCurveIntersectionGeometryGenerator::calculateTransformedPolyline() { - CVF_ASSERT( m_segementTransformPrLinePoint.size() == m_polyLines.size() ); + CVF_ASSERT( m_lineSegmentTransforms.size() == m_polylines.size() ); - for ( size_t pLineIdx = 0; pLineIdx < m_polyLines.size(); ++pLineIdx ) + for ( size_t lineIdx = 0; lineIdx < m_polylines.size(); ++lineIdx ) { - m_flattenedOrOffsettedPolyLines.emplace_back(); - const std::vector& polyLine = m_polyLines[pLineIdx]; + auto flatPolyline = m_transformedPolyLines.emplace_back(); + const auto& polyline = m_polylines[lineIdx]; - CVF_ASSERT( polyLine.size() == m_polyLines[pLineIdx].size() ); + for ( size_t index = 0; index < polyline.size(); ++index ) + { + flatPolyline.push_back( transformPointByPolylineSegmentIndex( polyline[index], lineIdx, index ) ); + } + } +} - for ( size_t pIdx = 0; pIdx < polyLine.size(); ++pIdx ) +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivExtrudedCurveIntersectionGeometryGenerator::calculateSurfaceIntersectionPoints() +{ + m_transformedSurfaceIntersectionPolylines.clear(); + + if ( !m_polylines.empty() ) + { + auto firstPolyLine = m_polylines.front(); + + std::vector surfaces; + for ( auto curve : m_intersection->surfaceIntersectionCurves() ) + { + if ( curve->surface() ) surfaces.push_back( curve->surface() ); + } + for ( auto band : m_intersection->surfaceIntersectionBands() ) + { + if ( band->surface1() ) surfaces.push_back( band->surface1() ); + if ( band->surface2() ) surfaces.push_back( band->surface2() ); + } + + for ( auto rimSurface : surfaces ) { - m_flattenedOrOffsettedPolyLines.back().push_back( - polyLine[pIdx].getTransformedPoint( m_segementTransformPrLinePoint[pLineIdx][pIdx] ) ); + if ( !rimSurface ) return; + + rimSurface->loadDataIfRequired(); + auto surface = rimSurface->surfaceData(); + if ( !surface ) return; + + std::vector transformedSurfacePolyline; + + // Resample polyline to required resolution + const double maxLineSegmentLength = 1.0; + auto resampledPolyline = computeResampledPolyline( firstPolyLine, maxLineSegmentLength ); + + for ( auto [point, segmentIndex] : resampledPolyline ) + { + cvf::Vec3d pointAbove = cvf::Vec3d( point.x(), point.y(), 10000.0 ); + cvf::Vec3d pointBelow = cvf::Vec3d( point.x(), point.y(), -10000.0 ); + + cvf::Vec3d intersectionPoint; + bool foundMatch = RigSurfaceResampler::resamplePoint( surface, pointAbove, pointBelow, intersectionPoint ); + if ( !foundMatch ) + intersectionPoint = cvf::Vec3d( point.x(), point.y(), std::numeric_limits::infinity() ); + + const size_t lineIndex = 0; + transformedSurfacePolyline.push_back( + transformPointByPolylineSegmentIndex( intersectionPoint, lineIndex, segmentIndex ) ); + } + m_transformedSurfaceIntersectionPolylines[rimSurface] = transformedSurfacePolyline; } } } @@ -228,12 +284,12 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() cvf::BoundingBox gridBBox = m_hexGrid->boundingBox(); - calculateSegementTransformPrLinePoint(); - calculateFlattenedOrOffsetedPolyline(); + calculateLineSegementTransforms(); + calculateTransformedPolyline(); - for ( size_t pLineIdx = 0; pLineIdx < m_polyLines.size(); ++pLineIdx ) + for ( size_t pLineIdx = 0; pLineIdx < m_polylines.size(); ++pLineIdx ) { - const std::vector& polyLine = m_polyLines[pLineIdx]; + const std::vector& polyLine = m_polylines[pLineIdx]; if ( polyLine.size() < 2 ) continue; @@ -241,7 +297,7 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() size_t lIdx = 0; while ( lIdx < lineCount - 1 ) { - size_t idxToNextP = RivSectionFlattner::indexToNextValidPoint( polyLine, m_extrusionDirection, lIdx ); + size_t idxToNextP = RivSectionFlattener::indexToNextValidPoint( polyLine, m_extrusionDirection, lIdx ); if ( idxToNextP == size_t( -1 ) ) break; @@ -257,7 +313,7 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() double maxSectionHeightUp = 0; double maxSectionHeightDown = 0; - if ( m_intersection->type == RimExtrudedCurveIntersection::CS_AZIMUTHLINE ) + if ( m_intersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_AZIMUTHLINE ) { maxSectionHeightUp = m_intersection->lengthUp(); maxSectionHeightDown = m_intersection->lengthDown(); @@ -305,12 +361,10 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() cvf::Vec3d cellCorners[8]; size_t cornerIndices[8]; - cvf::Mat4d invSectionCS = m_segementTransformPrLinePoint[pLineIdx][lIdx]; + cvf::Mat4d invSectionCS = m_lineSegmentTransforms[pLineIdx][lIdx]; - for ( size_t cccIdx = 0; cccIdx < columnCellCandidates.size(); ++cccIdx ) + for ( auto globalCellIdx : columnCellCandidates ) { - size_t globalCellIdx = columnCellCandidates[cccIdx]; - if ( !m_hexGrid->useCell( globalCellIdx ) ) continue; hexPlaneCutTriangleVxes.clear(); @@ -323,10 +377,10 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() &hexPlaneCutTriangleVxes, &cellFaceForEachTriangleEdge ); - if ( m_intersection->type == RimExtrudedCurveIntersection::CS_AZIMUTHLINE ) + if ( m_intersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_AZIMUTHLINE ) { bool hasAnyPointsOnSurface = false; - for ( caf::HexGridIntersectionTools::ClipVx vertex : hexPlaneCutTriangleVxes ) + for ( const caf::HexGridIntersectionTools::ClipVx& vertex : hexPlaneCutTriangleVxes ) { cvf::Vec3d temp = vertex.vx - p1; double dot = temp.dot( m_extrusionDirection ); @@ -400,22 +454,22 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() caf::HexGridIntersectionTools::ClipVx cvx = clippedTriangleVxes[triVxIdx + i]; if ( cvx.isVxIdsNative ) { - m_triVxToCellCornerWeights.push_back( RivIntersectionVertexWeights( cvx.clippedEdgeVx1Id, - cvx.clippedEdgeVx2Id, - cvx.normDistFromEdgeVx1 ) ); + m_triVxToCellCornerWeights.emplace_back( cvx.clippedEdgeVx1Id, + cvx.clippedEdgeVx2Id, + cvx.normDistFromEdgeVx1 ); } else { caf::HexGridIntersectionTools::ClipVx cvx1 = hexPlaneCutTriangleVxes[cvx.clippedEdgeVx1Id]; caf::HexGridIntersectionTools::ClipVx cvx2 = hexPlaneCutTriangleVxes[cvx.clippedEdgeVx2Id]; - m_triVxToCellCornerWeights.push_back( RivIntersectionVertexWeights( cvx1.clippedEdgeVx1Id, - cvx1.clippedEdgeVx2Id, - cvx1.normDistFromEdgeVx1, - cvx2.clippedEdgeVx1Id, - cvx2.clippedEdgeVx2Id, - cvx2.normDistFromEdgeVx1, - cvx.normDistFromEdgeVx1 ) ); + m_triVxToCellCornerWeights.emplace_back( cvx1.clippedEdgeVx1Id, + cvx1.clippedEdgeVx2Id, + cvx1.normDistFromEdgeVx1, + cvx2.clippedEdgeVx1Id, + cvx2.clippedEdgeVx2Id, + cvx2.normDistFromEdgeVx1, + cvx.normDistFromEdgeVx1 ); } } } @@ -430,8 +484,10 @@ void RivExtrudedCurveIntersectionGeometryGenerator::calculateArrays() for ( const auto& it : meshAcc.faultToHighestFaultMeshVxMap ) { - m_faultMeshLabelAndAnchorPositions.push_back( { it.first->name(), it.second } ); + m_faultMeshLabelAndAnchorPositions.emplace_back( it.first->name(), it.second ); } + + calculateSurfaceIntersectionPoints(); } //-------------------------------------------------------------------------------------------------- @@ -491,7 +547,7 @@ cvf::ref RivExtrudedCurveIntersectionGeometryGenerator::create //-------------------------------------------------------------------------------------------------- cvf::ref RivExtrudedCurveIntersectionGeometryGenerator::createLineAlongPolylineDrawable() { - return RivPolylineGenerator::createLineAlongPolylineDrawable( m_flattenedOrOffsettedPolyLines ); + return RivPolylineGenerator::createLineAlongPolylineDrawable( m_transformedPolyLines ); } //-------------------------------------------------------------------------------------------------- @@ -517,7 +573,7 @@ cvf::ref RivExtrudedCurveIntersectionGeometryGenerator::create //-------------------------------------------------------------------------------------------------- cvf::ref RivExtrudedCurveIntersectionGeometryGenerator::createPointsFromPolylineDrawable() { - return RivPolylineGenerator::createPointsFromPolylineDrawable( m_flattenedOrOffsettedPolyLines ); + return RivPolylineGenerator::createPointsFromPolylineDrawable( m_transformedPolyLines ); } //-------------------------------------------------------------------------------------------------- @@ -538,6 +594,23 @@ cvf::ref RivExtrudedCurveIntersectionGeometryGenerator::create std::vector>( { displayCoords } ) ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector>& RivExtrudedCurveIntersectionGeometryGenerator::flattenedOrOffsettedPolyLines() +{ + return m_transformedPolyLines; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector>& + RivExtrudedCurveIntersectionGeometryGenerator::faultMeshLabelAndAnchorPositions() +{ + return m_faultMeshLabelAndAnchorPositions; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -574,6 +647,75 @@ RimExtrudedCurveIntersection* RivExtrudedCurveIntersectionGeometryGenerator::int return m_intersection; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RivExtrudedCurveIntersectionGeometryGenerator::transformPointByPolylineSegmentIndex( const cvf::Vec3d& domainCoord, + size_t lineIndex, + size_t segmentIndex ) +{ + CVF_ASSERT( lineIndex < m_lineSegmentTransforms.size() ); + CVF_ASSERT( segmentIndex < m_lineSegmentTransforms[lineIndex].size() ); + + // Each line segment along the polyline has a transformation matrix representing the transformation from 3D into + // flat 2D. Return the transformed domain coord using the required transformation matrix + + return domainCoord.getTransformedPoint( m_lineSegmentTransforms[lineIndex][segmentIndex] ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> + RivExtrudedCurveIntersectionGeometryGenerator::computeResampledPolyline( const std::vector& polyline, + double resamplingDistance ) +{ + // Segments along the original polyline must be provided to be able to find the associated transform matrix + std::vector> resampledPolyline; + + if ( polyline.size() > 1 ) + { + std::vector measuredDepth; + { + double aggregatedLength = 0.0; + + cvf::Vec3d previousPoint = polyline.front(); + measuredDepth.push_back( aggregatedLength ); + + for ( size_t i = 1; i < polyline.size(); i++ ) + { + aggregatedLength += ( previousPoint - polyline[i] ).length(); + previousPoint = polyline[i]; + measuredDepth.push_back( aggregatedLength ); + } + } + + // Use RigWellPath to perform the interpolation along a line based on measured depth + RigWellPath dummyWellPath( polyline, measuredDepth ); + + for ( size_t i = 1; i < polyline.size(); i++ ) + { + const auto& lineSegmentStart = polyline[i - 1]; + const auto& lineSegmentEnd = polyline[i]; + + auto startMD = measuredDepth[i - 1]; + auto endMD = measuredDepth[i]; + + const size_t segmentIndex = i - 1; + resampledPolyline.emplace_back( lineSegmentStart, segmentIndex ); + + for ( auto md = startMD + resamplingDistance; md < endMD; md += resamplingDistance ) + { + resampledPolyline.emplace_back( dummyWellPath.interpolatedPointAlongWellPath( md ), segmentIndex ); + } + + resampledPolyline.emplace_back( lineSegmentEnd, segmentIndex ); + } + } + + return resampledPolyline; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -582,20 +724,20 @@ cvf::Mat4d { cvf::Mat4d flattenMx = cvf::Mat4d::IDENTITY; - for ( size_t pLineIdx = 0; pLineIdx < m_flattenedOrOffsettedPolyLines.size(); pLineIdx++ ) + for ( size_t pLineIdx = 0; pLineIdx < m_transformedPolyLines.size(); pLineIdx++ ) { - const std::vector& polyLine = m_flattenedOrOffsettedPolyLines[pLineIdx]; + const std::vector& polyLine = m_transformedPolyLines[pLineIdx]; for ( size_t pIdx = 0; pIdx < polyLine.size(); pIdx++ ) { if ( polyLine[pIdx].x() >= intersectionPointFlat.x() ) { size_t csIdx = pIdx > 0 ? pIdx - 1 : 0; - flattenMx = m_segementTransformPrLinePoint[pLineIdx][csIdx]; + flattenMx = m_lineSegmentTransforms[pLineIdx][csIdx]; break; } - else if ( pIdx == polyLine.size() - 1 ) + if ( pIdx == polyLine.size() - 1 ) { - flattenMx = m_segementTransformPrLinePoint[pLineIdx][pIdx]; + flattenMx = m_lineSegmentTransforms[pLineIdx][pIdx]; } } } @@ -612,8 +754,15 @@ bool RivExtrudedCurveIntersectionGeometryGenerator::isAnyGeometryPresent() const { return false; } - else - { - return true; - } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::map> + RivExtrudedCurveIntersectionGeometryGenerator::transformedSurfaceIntersectionPolylines() const +{ + return m_transformedSurfaceIntersectionPolylines; } diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.h index 226e6129dc..14c75d1038 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionGeometryGenerator.h @@ -21,7 +21,7 @@ #include "cafPdmPointer.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionGeometryGeneratorInterface.h" #include "cvfArray.h" @@ -39,6 +39,7 @@ class RigResultAccessor; class RimExtrudedCurveIntersection; class RivIntersectionHexGridInterface; class RivIntersectionVertexWeights; +class RimSurface; namespace cvf { @@ -46,7 +47,7 @@ class ScalarMapper; class DrawableGeo; } // namespace cvf -class RivExtrudedCurveIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorIF +class RivExtrudedCurveIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorInterface { public: RivExtrudedCurveIntersectionGeometryGenerator( RimExtrudedCurveIntersection* intersection, @@ -68,34 +69,37 @@ class RivExtrudedCurveIntersectionGeometryGenerator : public cvf::Object, public cvf::ref createPointsFromPolylineDrawable(); cvf::ref createPointsFromExtrusionLineDrawable( const std::vector& extrusionLine ); - const std::vector>& flattenedOrOffsettedPolyLines() - { - return m_flattenedOrOffsettedPolyLines; - } - const std::vector>& faultMeshLabelAndAnchorPositions() - { - return m_faultMeshLabelAndAnchorPositions; - } - - RimExtrudedCurveIntersection* intersection() const; + const std::vector>& faultMeshLabelAndAnchorPositions(); cvf::Mat4d unflattenTransformMatrix( const cvf::Vec3d& intersectionPointFlat ) const; // GeomGen Interface bool isAnyGeometryPresent() const override; + std::map> transformedSurfaceIntersectionPolylines() const; + const std::vector& triangleToCellIndex() const override; const std::vector& triangleVxToCellCornerInterpolationWeights() const override; const cvf::Vec3fArray* triangleVxes() const override; private: void calculateArrays(); - void calculateSegementTransformPrLinePoint(); - void calculateFlattenedOrOffsetedPolyline(); + void calculateLineSegementTransforms(); + void calculateTransformedPolyline(); + void calculateSurfaceIntersectionPoints(); + + RimExtrudedCurveIntersection* intersection() const; + const std::vector>& flattenedOrOffsettedPolyLines(); + cvf::Vec3d transformPointByPolylineSegmentIndex( const cvf::Vec3d& domainCoord, size_t lineIndex, size_t segmentIndex ); + + static std::vector> computeResampledPolyline( const std::vector& polyline, + double resamplingDistance ); + +private: RimExtrudedCurveIntersection* m_intersection; cvf::cref m_hexGrid; - const std::vector> m_polyLines; + const std::vector> m_polylines; cvf::Vec3d m_extrusionDirection; bool m_isFlattened; cvf::Vec3d m_flattenedPolylineStartPoint; @@ -106,8 +110,10 @@ class RivExtrudedCurveIntersectionGeometryGenerator : public cvf::Object, public cvf::ref m_faultCellBorderLineVxes; std::vector m_triangleToCellIdxMap; std::vector m_triVxToCellCornerWeights; - std::vector> m_flattenedOrOffsettedPolyLines; - std::vector> m_segementTransformPrLinePoint; + std::vector> m_transformedPolyLines; + std::vector> m_lineSegmentTransforms; std::vector> m_faultMeshLabelAndAnchorPositions; + + std::map> m_transformedSurfaceIntersectionPolylines; }; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.cpp index 313b43f057..a3126df53e 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.cpp @@ -31,6 +31,7 @@ #include "RigResultAccessorFactory.h" #include "Rim2dIntersectionView.h" +#include "RimAnnotationLineAppearance.h" #include "RimEclipseCase.h" #include "RimEclipseCellColors.h" #include "RimEclipseView.h" @@ -42,6 +43,9 @@ #include "RimGeoMechView.h" #include "RimSimWellInView.h" #include "RimSimWellInViewCollection.h" +#include "RimSurface.h" +#include "RimSurfaceIntersectionBand.h" +#include "RimSurfaceIntersectionCurve.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" @@ -49,12 +53,13 @@ #include "RivExtrudedCurveIntersectionGeometryGenerator.h" #include "RivExtrudedCurveIntersectionSourceInfo.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionHexGridInterface.h" #include "RivIntersectionResultsColoringTools.h" #include "RivMeshLinesSourceInfo.h" #include "RivObjectSourceInfo.h" #include "RivPartPriority.h" #include "RivPipeGeometryGenerator.h" +#include "RivPolylineGenerator.h" #include "RivResultToTextureMapper.h" #include "RivScalarMapperUtils.h" #include "RivSimWellPipeSourceInfo.h" @@ -66,6 +71,7 @@ #include "cvfDrawableGeo.h" #include "cvfDrawableText.h" +#include "cvfGeometryBuilderDrawableGeo.h" #include "cvfGeometryTools.h" #include "cvfModelBasicList.h" #include "cvfPart.h" @@ -94,7 +100,7 @@ RivExtrudedCurveIntersectionPartMgr::RivExtrudedCurveIntersectionPartMgr( RimExt cvf::Vec3d flattenedPolylineStartPoint; std::vector> polyLines = m_rimIntersection->polyLines( &flattenedPolylineStartPoint ); - if ( polyLines.size() > 0 ) + if ( !polyLines.empty() ) { cvf::Vec3d direction = m_rimIntersection->extrusionDirection(); cvf::ref hexGrid = m_rimIntersection->createHexGridInterface(); @@ -170,12 +176,12 @@ void RivIntersectionResultsColoringTools::calculateNodeOrElementNodeBasedGeoMech const std::vector& vertexWeights, const std::vector& resultValues, bool isElementNodalResult, - const RigFemPart* femPart, + const RigFemPartCollection* femParts, const cvf::ScalarMapper* mapper ) { textureCoords->resize( vertexWeights.size() ); - if ( resultValues.size() == 0 ) + if ( resultValues.empty() ) { textureCoords->setAll( cvf::Vec2f( 0.0, 1.0f ) ); } @@ -204,7 +210,7 @@ void RivIntersectionResultsColoringTools::calculateNodeOrElementNodeBasedGeoMech } else { - resIdx = femPart->nodeIdxFromElementNodeResultIdx( vertexWeights[triangleVxIdx].vxId( wIdx ) ); + resIdx = femParts->nodeIdxFromElementNodeResultIdx( vertexWeights[triangleVxIdx].vxId( wIdx ) ); } resValue += resultValues[resIdx] * vertexWeights[triangleVxIdx].weight( wIdx ); @@ -249,7 +255,7 @@ void RivExtrudedCurveIntersectionPartMgr::generatePartGeometry() // Set mapping from triangle face index to cell index cvf::ref si = - new RivExtrudedCurveIntersectionSourceInfo( m_intersectionGenerator.p() ); + new RivExtrudedCurveIntersectionSourceInfo( m_intersectionGenerator.p(), m_rimIntersection ); part->setSourceInfo( si.p() ); part->updateBoundingBox(); @@ -314,6 +320,8 @@ void RivExtrudedCurveIntersectionPartMgr::generatePartGeometry() if ( m_isFlattened ) createFaultLabelParts( m_intersectionGenerator->faultMeshLabelAndAnchorPositions() ); applySingleColorEffect(); + + createAnnotationSurfaceParts( useBufferObjects ); } //-------------------------------------------------------------------------------------------------- @@ -324,7 +332,7 @@ void RivExtrudedCurveIntersectionPartMgr::createFaultLabelParts( const std::vect m_faultMeshLabels = nullptr; m_faultMeshLabelLines = nullptr; - if ( !labelAndAnchors.size() ) return; + if ( labelAndAnchors.empty() ) return; RimFaultInViewCollection* faultInViewColl = nullptr; @@ -375,7 +383,7 @@ void RivExtrudedCurveIntersectionPartMgr::createFaultLabelParts( const std::vect textCoord.z() += labelZOffset; drawableText->addText( cvfString, textCoord ); - lineVertices.push_back( cvf::Vec3f( labelAndAnchorPair.second ) ); + lineVertices.emplace_back( labelAndAnchorPair.second ); lineVertices.push_back( textCoord ); visibleFaultNameCount++; } @@ -433,8 +441,8 @@ void RivExtrudedCurveIntersectionPartMgr::createPolyLineParts( bool useBufferObj m_highlightLineAlongPolyline = nullptr; m_highlightPointsForPolyline = nullptr; - if ( m_rimIntersection->type == RimExtrudedCurveIntersection::CS_POLYLINE || - m_rimIntersection->type == RimExtrudedCurveIntersection::CS_AZIMUTHLINE ) + if ( m_rimIntersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_POLYLINE || + m_rimIntersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_AZIMUTHLINE ) { { cvf::ref polylineGeo = m_intersectionGenerator->createLineAlongPolylineDrawable(); @@ -514,7 +522,7 @@ void RivExtrudedCurveIntersectionPartMgr::createExtrusionDirParts( bool useBuffe m_highlightLineAlongExtrusionDir = nullptr; m_highlightPointsForExtrusionDir = nullptr; - if ( m_rimIntersection->direction() == RimExtrudedCurveIntersection::CS_TWO_POINTS ) + if ( m_rimIntersection->direction() == RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_TWO_POINTS ) { { cvf::ref polylineGeo = m_intersectionGenerator->createLineAlongExtrusionLineDrawable( @@ -588,6 +596,175 @@ void RivExtrudedCurveIntersectionPartMgr::createExtrusionDirParts( bool useBuffe } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivExtrudedCurveIntersectionPartMgr::createAnnotationSurfaceParts( bool useBufferObjects ) +{ + m_annotationParts.clear(); + + auto surfPolys = m_intersectionGenerator->transformedSurfaceIntersectionPolylines(); + + for ( auto curve : m_rimIntersection->surfaceIntersectionCurves() ) + { + if ( !curve->isChecked() ) continue; + + auto surface = curve->surface(); + if ( !surface ) continue; + + if ( surfPolys.count( surface ) == 0 ) continue; + auto polylines = surfPolys[surface]; + + auto part = createCurvePart( polylines, + useBufferObjects, + surface->userDescription(), + curve->lineAppearance()->color(), + curve->lineAppearance()->thickness() ); + + if ( part.notNull() ) m_annotationParts.push_back( part.p() ); + } + + for ( auto band : m_rimIntersection->surfaceIntersectionBands() ) + { + if ( !band->isChecked() ) continue; + + auto surface1 = band->surface1(); + auto surface2 = band->surface2(); + + if ( !surface1 || !surface2 ) continue; + + if ( surfPolys.count( surface1 ) == 0 ) continue; + if ( surfPolys.count( surface2 ) == 0 ) continue; + + auto polylineA = surfPolys[surface1]; + auto polylineB = surfPolys[surface2]; + + // Create curve parts + { + auto part = createCurvePart( polylineA, + useBufferObjects, + surface1->userDescription(), + band->lineAppearance()->color(), + band->lineAppearance()->thickness() ); + + if ( part.notNull() ) m_annotationParts.push_back( part.p() ); + } + { + auto part = createCurvePart( polylineB, + useBufferObjects, + surface2->userDescription(), + band->lineAppearance()->color(), + band->lineAppearance()->thickness() ); + + if ( part.notNull() ) m_annotationParts.push_back( part.p() ); + } + + // Create a quad strip between the two polylines + size_t pointCount = std::min( polylineA.size(), polylineB.size() ); + if ( pointCount > 1 ) + { + cvf::GeometryBuilderDrawableGeo geoBuilder; + + for ( size_t i = 1; i < pointCount; i++ ) + { + const auto& pA0 = polylineA[i - 1]; + const auto& pA1 = polylineA[i]; + const auto& pB0 = polylineB[i - 1]; + const auto& pB1 = polylineB[i]; + + geoBuilder.addQuadByVertices( cvf::Vec3f( pA0 ), cvf::Vec3f( pA1 ), cvf::Vec3f( pB1 ), cvf::Vec3f( pB0 ) ); + } + + cvf::ref geo = geoBuilder.drawableGeo(); + if ( geo.notNull() ) + { + geo->computeNormals(); + + if ( useBufferObjects ) + { + geo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT ); + } + + cvf::ref part = new cvf::Part; + part->setName( "Surface Intersection Band" ); + part->setDrawable( geo.p() ); + part->updateBoundingBox(); + part->setEnableMask( intersectionCellFaceBit ); + part->setPriority( RivPartPriority::PartType::Transparent ); + + auto color = cvf::Color4f( band->bandColor(), band->bandOpacity() ); + caf::SurfaceEffectGenerator geometryEffgen( color, caf::PO_NEG_LARGE ); + + cvf::ref geometryOnlyEffect = geometryEffgen.generateUnCachedEffect(); + + { + cvf::ref polyOffset = new cvf::RenderStatePolygonOffset; + + polyOffset->enableFillMode( true ); + + // The factor value is defined by enums in + // EffectGenerator::createAndConfigurePolygonOffsetRenderState() Use a factor that is more negative + // than the existing enums + const double offsetFactor = -5; + polyOffset->setFactor( offsetFactor ); + + polyOffset->setUnits( band->polygonOffsetUnit() ); + + geometryOnlyEffect->setRenderState( polyOffset.p() ); + } + + part->setEffect( geometryOnlyEffect.p() ); + + m_annotationParts.push_back( part.p() ); + } + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RivExtrudedCurveIntersectionPartMgr::createCurvePart( const std::vector& polylines, + bool useBufferObjects, + const QString& description, + const cvf::Color3f& color, + float lineWidth ) +{ + auto polylineGeo = RivPolylineGenerator::createLineAlongPolylineDrawable( polylines ); + if ( polylineGeo.notNull() ) + { + if ( useBufferObjects ) + { + polylineGeo->setRenderMode( cvf::DrawableGeo::BUFFER_OBJECT ); + } + + cvf::ref part = new cvf::Part; + part->setName( "Intersection " + description.toStdString() ); + part->setDrawable( polylineGeo.p() ); + + part->updateBoundingBox(); + part->setPriority( RivPartPriority::PartType::FaultMeshLines ); + + caf::MeshEffectGenerator lineEffGen( color ); + lineEffGen.setLineWidth( lineWidth ); + + cvf::ref eff = lineEffGen.generateUnCachedEffect(); + + cvf::ref polyOffset = new cvf::RenderStatePolygonOffset; + polyOffset->enableFillMode( true ); + polyOffset->setFactor( -5 ); + const double maxOffsetFactor = -1000; + polyOffset->setUnits( maxOffsetFactor ); + + eff->setRenderState( polyOffset.p() ); + + part->setEffect( eff.p() ); + return part; + } + + return nullptr; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -649,9 +826,9 @@ void RivExtrudedCurveIntersectionPartMgr::appendPolylinePartsToModel( Rim3dView& cvf::ModelBasicList* model, cvf::Transform* scaleTransform ) { - Rim2dIntersectionView* curr2dView = dynamic_cast( &view ); + auto* curr2dView = dynamic_cast( &view ); - if ( m_rimIntersection->inputPolyLineFromViewerEnabled || ( curr2dView && curr2dView->showDefiningPoints() ) ) + if ( m_rimIntersection->inputPolyLineFromViewerEnabled() || ( curr2dView && curr2dView->showDefiningPoints() ) ) { if ( m_highlightLineAlongPolyline.notNull() ) { @@ -666,7 +843,7 @@ void RivExtrudedCurveIntersectionPartMgr::appendPolylinePartsToModel( Rim3dView& } } - if ( m_rimIntersection->inputExtrusionPointsFromViewerEnabled ) + if ( m_rimIntersection->inputExtrusionPointsFromViewerEnabled() ) { if ( m_highlightLineAlongExtrusionDir.notNull() ) { @@ -681,7 +858,7 @@ void RivExtrudedCurveIntersectionPartMgr::appendPolylinePartsToModel( Rim3dView& } } - if ( m_rimIntersection->inputTwoAzimuthPointsFromViewerEnabled || ( curr2dView && curr2dView->showDefiningPoints() ) ) + if ( m_rimIntersection->inputTwoAzimuthPointsFromViewerEnabled() || ( curr2dView && curr2dView->showDefiningPoints() ) ) { if ( m_highlightLineAlongPolyline.notNull() ) { @@ -695,14 +872,16 @@ void RivExtrudedCurveIntersectionPartMgr::appendPolylinePartsToModel( Rim3dView& model->addPart( m_highlightPointsForPolyline.p() ); } } -} -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const RimExtrudedCurveIntersection* RivExtrudedCurveIntersectionPartMgr::intersection() const -{ - return m_rimIntersection.p(); + for ( size_t i = 0; i < m_annotationParts.size(); i++ ) + { + auto part = m_annotationParts[i]; + if ( part.notNull() ) + { + part->setTransform( scaleTransform ); + model->addPart( part.p() ); + } + } } //-------------------------------------------------------------------------------------------------- @@ -716,9 +895,9 @@ cvf::Mat4d RivExtrudedCurveIntersectionPartMgr::unflattenTransformMatrix( const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RivExtrudedCurveIntersectionPartMgr::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RivExtrudedCurveIntersectionPartMgr::intersectionGeometryGenerator() const { if ( m_intersectionGenerator.notNull() ) return m_intersectionGenerator.p(); - return NULL; + return nullptr; } diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.h b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.h index 4612801ac9..22ea6f91c3 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionPartMgr.h @@ -26,6 +26,7 @@ #include "cvfVector3.h" #include "cafPdmPointer.h" +#include "cvfCollection.h" #include @@ -55,7 +56,7 @@ class RivExtrudedCurveIntersectionGeometryGenerator; class RivIntersectionHexGridInterface; class RivIntersectionVertexWeights; class RivPipeGeometryGenerator; -class RivIntersectionGeometryGeneratorIF; +class RivIntersectionGeometryGeneratorInterface; //================================================================================================== /// @@ -76,18 +77,22 @@ class RivExtrudedCurveIntersectionPartMgr : public cvf::Object void appendMeshLinePartsToModel( cvf::ModelBasicList* model, cvf::Transform* scaleTransform ); void appendPolylinePartsToModel( Rim3dView& view, cvf::ModelBasicList* model, cvf::Transform* scaleTransform ); - const RimExtrudedCurveIntersection* intersection() const; - cvf::Mat4d unflattenTransformMatrix( const cvf::Vec3d& intersectionPointFlat ) const; - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const; + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const; -public: private: void generatePartGeometry(); void createFaultLabelParts( const std::vector>& labelAndAnchors ); void createPolyLineParts( bool useBufferObjects ); void createExtrusionDirParts( bool useBufferObjects ); + void createAnnotationSurfaceParts( bool useBufferObjects ); + + cvf::ref createCurvePart( const std::vector& polylines, + bool useBufferObjects, + const QString& description, + const cvf::Color3f& color, + float lineWidth ); private: caf::PdmPointer m_rimIntersection; @@ -104,6 +109,8 @@ class RivExtrudedCurveIntersectionPartMgr : public cvf::Object cvf::ref m_highlightLineAlongExtrusionDir; cvf::ref m_highlightPointsForExtrusionDir; + cvf::Collection m_annotationParts; + cvf::ref m_intersectionFacesTextureCoords; struct RivPipeBranchData diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.cpp index b510e211c4..938a0e951b 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.cpp @@ -19,14 +19,17 @@ #include "RivExtrudedCurveIntersectionSourceInfo.h" +#include "RimExtrudedCurveIntersection.h" #include "RivExtrudedCurveIntersectionGeometryGenerator.h" //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RivExtrudedCurveIntersectionSourceInfo::RivExtrudedCurveIntersectionSourceInfo( - RivExtrudedCurveIntersectionGeometryGenerator* geometryGenerator ) + RivExtrudedCurveIntersectionGeometryGenerator* geometryGenerator, + RimExtrudedCurveIntersection* intersection ) : m_intersectionGeometryGenerator( geometryGenerator ) + , m_intersection( intersection ) { CVF_ASSERT( m_intersectionGeometryGenerator.notNull() ); } @@ -59,5 +62,5 @@ std::array RivExtrudedCurveIntersectionSourceInfo::triangle( int //-------------------------------------------------------------------------------------------------- RimExtrudedCurveIntersection* RivExtrudedCurveIntersectionSourceInfo::intersection() const { - return m_intersectionGeometryGenerator->intersection(); + return m_intersection; } diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.h b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.h index 849742f292..ac13397fbf 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivExtrudedCurveIntersectionSourceInfo.h @@ -19,8 +19,11 @@ #pragma once +#include "cafPdmPointer.h" + #include "cvfArray.h" #include "cvfObject.h" + #include class RivExtrudedCurveIntersectionGeometryGenerator; @@ -29,7 +32,8 @@ class RimExtrudedCurveIntersection; class RivExtrudedCurveIntersectionSourceInfo : public cvf::Object { public: - explicit RivExtrudedCurveIntersectionSourceInfo( RivExtrudedCurveIntersectionGeometryGenerator* geometryGenerator ); + explicit RivExtrudedCurveIntersectionSourceInfo( RivExtrudedCurveIntersectionGeometryGenerator* geometryGenerator, + RimExtrudedCurveIntersection* intersection ); const std::vector& triangleToCellIndex() const; std::array triangle( int triangleIdx ) const; @@ -37,4 +41,5 @@ class RivExtrudedCurveIntersectionSourceInfo : public cvf::Object private: cvf::cref m_intersectionGeometryGenerator; + caf::PdmPointer m_intersection; }; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.cpp new file mode 100644 index 0000000000..c76a157c17 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.cpp @@ -0,0 +1,139 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RivFemIntersectionGrid.h" + +#include "RigFemPart.h" +#include "RigFemPartCollection.h" + +#include "RimGeoMechPartCollection.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RivFemIntersectionGrid::RivFemIntersectionGrid( const RigFemPartCollection* femParts, const RimGeoMechPartCollection* parts ) + : m_femParts( femParts ) + , m_parts( parts ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RivFemIntersectionGrid::displayOffset() const +{ + return m_femParts->boundingBox().min(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::BoundingBox RivFemIntersectionGrid::boundingBox() const +{ + return m_femParts->boundingBox(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFemIntersectionGrid::findIntersectingCells( const cvf::BoundingBox& intersectingBB, + std::vector* intersectedCells ) const +{ + for ( int i = 0; i < m_femParts->partCount(); i++ ) + { + const RigFemPart* part = m_femParts->part( i ); + std::vector foundElements; + part->findIntersectingCells( intersectingBB, &foundElements ); + + for ( size_t t = 0; t < foundElements.size(); t++ ) + { + size_t globalIdx = m_femParts->globalIndex( i, foundElements[t] ); + intersectedCells->push_back( globalIdx ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RivFemIntersectionGrid::useCell( size_t globalCellIndex ) const +{ + auto [part, elementIdx] = m_femParts->partAndElementIndex( globalCellIndex ); + + return ( ( part->elementType( elementIdx ) == RigElementType::HEX8 ) || + ( part->elementType( elementIdx ) == RigElementType::HEX8P ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFemIntersectionGrid::cellCornerVertices( size_t globalCellIndex, cvf::Vec3d cellCorners[8] ) const +{ + auto [part, elementIdx] = m_femParts->partAndElementIndex( globalCellIndex ); + + const bool useDisplacements = m_parts->isDisplacementsUsed(); + + const std::vector& nodeCoords = part->nodes().coordinates; + const int* cornerIndices = part->connectivities( elementIdx ); + + if ( useDisplacements ) + { + const double scaleFactor = m_parts->currentDisplacementScaleFactor(); + const std::vector& displacements = m_parts->displacements( part->elementPartId() ); + for ( int i = 0; i < 8; i++ ) + { + const int idx = cornerIndices[i]; + cellCorners[i] = cvf::Vec3d( nodeCoords[idx] + displacements[idx] * scaleFactor ); + } + } + else + { + for ( int i = 0; i < 8; i++ ) + { + cellCorners[i] = cvf::Vec3d( nodeCoords[cornerIndices[i]] ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivFemIntersectionGrid::cellCornerIndices( size_t globalCellIndex, size_t cornerIndices[8] ) const +{ + auto [part, elementIdx] = m_femParts->partAndElementIndex( globalCellIndex ); + + RigElementType elmType = part->elementType( elementIdx ); + if ( !( elmType == HEX8 || elmType == HEX8P ) ) return; + + int elmIdx = static_cast( elementIdx ); + const int partId = part->elementPartId(); + + for ( int i = 0; i < 8; i++ ) + { + cornerIndices[i] = m_femParts->globalElementNodeResultIdx( partId, elmIdx, i ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RigFault* RivFemIntersectionGrid::findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, + cvf::StructGridInterface::FaceType face ) const +{ + return nullptr; +} diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.h b/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.h new file mode 100644 index 0000000000..406135e011 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivFemIntersectionGrid.h @@ -0,0 +1,54 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RivIntersectionHexGridInterface.h" + +#include "cvfBoundingBox.h" +#include "cvfObject.h" +#include "cvfVector3.h" + +#include "cvfStructGrid.h" + +#include + +class RigFemPart; +class RigFemPartCollection; +class RigFault; +class RimGeoMechPartCollection; + +class RivFemIntersectionGrid : public RivIntersectionHexGridInterface +{ +public: + explicit RivFemIntersectionGrid( const RigFemPartCollection* femParts, const RimGeoMechPartCollection* parts ); + + cvf::Vec3d displayOffset() const override; + cvf::BoundingBox boundingBox() const override; + void findIntersectingCells( const cvf::BoundingBox& intersectingBB, + std::vector* intersectedCells ) const override; + bool useCell( size_t cellIndex ) const override; + void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const override; + void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const override; + const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, + cvf::StructGridInterface::FaceType face ) const override; + +private: + cvf::cref m_femParts; + const RimGeoMechPartCollection* m_parts; +}; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.cpp deleted file mode 100644 index 6cb9a6008a..0000000000 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.cpp +++ /dev/null @@ -1,195 +0,0 @@ -///////////////////////////////////////////////////////////////////////////////// -// -// Copyright (C) Statoil ASA -// -// ResInsight is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY -// WARRANTY; without even the implied warranty of MERCHANTABILITY or -// FITNESS FOR A PARTICULAR PURPOSE. -// -// See the GNU General Public License at -// for more details. -// -///////////////////////////////////////////////////////////////////////////////// - -#include "RivHexGridIntersectionTools.h" - -#include "RigActiveCellInfo.h" -#include "RigFemPart.h" -#include "RigMainGrid.h" - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RivEclipseIntersectionGrid::RivEclipseIntersectionGrid( const RigMainGrid* mainGrid, - const RigActiveCellInfo* activeCellInfo, - bool showInactiveCells ) - : m_mainGrid( mainGrid ) - , m_activeCellInfo( activeCellInfo ) - , m_showInactiveCells( showInactiveCells ) -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::Vec3d RivEclipseIntersectionGrid::displayOffset() const -{ - return m_mainGrid->displayModelOffset(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::BoundingBox RivEclipseIntersectionGrid::boundingBox() const -{ - return m_mainGrid->boundingBox(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivEclipseIntersectionGrid::findIntersectingCells( const cvf::BoundingBox& intersectingBB, - std::vector* intersectedCells ) const -{ - m_mainGrid->findIntersectingCells( intersectingBB, intersectedCells ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RivEclipseIntersectionGrid::useCell( size_t cellIndex ) const -{ - const RigCell& cell = m_mainGrid->globalCellArray()[cellIndex]; - if ( m_showInactiveCells ) - return !( cell.isInvalid() || ( cell.subGrid() != nullptr ) ); - else - return m_activeCellInfo->isActive( cellIndex ) && ( cell.subGrid() == nullptr ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivEclipseIntersectionGrid::cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const -{ - m_mainGrid->cellCornerVertices( cellIndex, cellCorners ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivEclipseIntersectionGrid::cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const -{ - const std::array& cornerIndicesSource = m_mainGrid->globalCellArray()[cellIndex].cornerIndices(); - - for ( size_t i = 0; i < 8; i++ ) - { - cornerIndices[i] = cornerIndicesSource[i]; - } -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const RigFault* RivEclipseIntersectionGrid::findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, - cvf::StructGridInterface::FaceType face ) const -{ - return m_mainGrid->findFaultFromCellIndexAndCellFace( reservoirCellIndex, face ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RivFemIntersectionGrid::RivFemIntersectionGrid( const RigFemPart* femPart ) - : m_femPart( femPart ) -{ -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::Vec3d RivFemIntersectionGrid::displayOffset() const -{ - return m_femPart->boundingBox().min(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::BoundingBox RivFemIntersectionGrid::boundingBox() const -{ - return m_femPart->boundingBox(); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivFemIntersectionGrid::findIntersectingCells( const cvf::BoundingBox& intersectingBB, - std::vector* intersectedCells ) const -{ - m_femPart->findIntersectingCells( intersectingBB, intersectedCells ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RivFemIntersectionGrid::useCell( size_t cellIndex ) const -{ - RigElementType elmType = m_femPart->elementType( cellIndex ); - - if ( !( elmType == HEX8 || elmType == HEX8P ) ) return false; - - return true; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivFemIntersectionGrid::cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const -{ - RigElementType elmType = m_femPart->elementType( cellIndex ); - if ( !( elmType == HEX8 || elmType == HEX8P ) ) return; - - const std::vector& nodeCoords = m_femPart->nodes().coordinates; - const int* cornerIndices = m_femPart->connectivities( cellIndex ); - - cellCorners[0] = cvf::Vec3d( nodeCoords[cornerIndices[0]] ); - cellCorners[1] = cvf::Vec3d( nodeCoords[cornerIndices[1]] ); - cellCorners[2] = cvf::Vec3d( nodeCoords[cornerIndices[2]] ); - cellCorners[3] = cvf::Vec3d( nodeCoords[cornerIndices[3]] ); - cellCorners[4] = cvf::Vec3d( nodeCoords[cornerIndices[4]] ); - cellCorners[5] = cvf::Vec3d( nodeCoords[cornerIndices[5]] ); - cellCorners[6] = cvf::Vec3d( nodeCoords[cornerIndices[6]] ); - cellCorners[7] = cvf::Vec3d( nodeCoords[cornerIndices[7]] ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RivFemIntersectionGrid::cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const -{ - RigElementType elmType = m_femPart->elementType( cellIndex ); - if ( !( elmType == HEX8 || elmType == HEX8P ) ) return; - int elmIdx = static_cast( cellIndex ); - cornerIndices[0] = m_femPart->elementNodeResultIdx( elmIdx, 0 ); - cornerIndices[1] = m_femPart->elementNodeResultIdx( elmIdx, 1 ); - cornerIndices[2] = m_femPart->elementNodeResultIdx( elmIdx, 2 ); - cornerIndices[3] = m_femPart->elementNodeResultIdx( elmIdx, 3 ); - cornerIndices[4] = m_femPart->elementNodeResultIdx( elmIdx, 4 ); - cornerIndices[5] = m_femPart->elementNodeResultIdx( elmIdx, 5 ); - cornerIndices[6] = m_femPart->elementNodeResultIdx( elmIdx, 6 ); - cornerIndices[7] = m_femPart->elementNodeResultIdx( elmIdx, 7 ); -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -const RigFault* RivFemIntersectionGrid::findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, - cvf::StructGridInterface::FaceType face ) const -{ - return nullptr; -} diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionGeometryGeneratorInterface.h b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionGeometryGeneratorInterface.h new file mode 100644 index 0000000000..e3e42259eb --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionGeometryGeneratorInterface.h @@ -0,0 +1,34 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RivIntersectionVertexWeights.h" + +#include "cvfArray.h" + +#include + +class RivIntersectionGeometryGeneratorInterface +{ +public: + virtual bool isAnyGeometryPresent() const = 0; + virtual const std::vector& triangleToCellIndex() const = 0; + virtual const std::vector& triangleVxToCellCornerInterpolationWeights() const = 0; + virtual const cvf::Vec3fArray* triangleVxes() const = 0; +}; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionHexGridInterface.h b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionHexGridInterface.h new file mode 100644 index 0000000000..0d5b4eb5e8 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionHexGridInterface.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfBoundingBox.h" +#include "cvfObject.h" +#include "cvfVector3.h" + +#include "cvfStructGrid.h" + +#include + +class RigFault; + +//-------------------------------------------------------------------------------------------------- +/// Interface definition used to compute the geometry for planes intersecting a grid +//-------------------------------------------------------------------------------------------------- +class RivIntersectionHexGridInterface : public cvf::Object +{ +public: + virtual cvf::Vec3d displayOffset() const = 0; + virtual cvf::BoundingBox boundingBox() const = 0; + virtual void findIntersectingCells( const cvf::BoundingBox& intersectingBB, + std::vector* intersectedCells ) const = 0; + virtual bool useCell( size_t cellIndex ) const = 0; + virtual void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const = 0; + virtual void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const = 0; + virtual const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, + cvf::StructGridInterface::FaceType face ) const = 0; +}; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.cpp index b56ab56b48..7692c46199 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.cpp @@ -37,6 +37,8 @@ #include "RigGeoMechCaseData.h" #include "RigResultAccessorFactory.h" +#include "RivIntersectionGeometryGeneratorInterface.h" +#include "RivIntersectionVertexWeights.h" #include "RivScalarMapperUtils.h" #include "RivTernaryTextureCoordsCreator.h" @@ -49,14 +51,14 @@ /// //-------------------------------------------------------------------------------------------------- void RivIntersectionResultsColoringTools::calculateIntersectionResultColors( - size_t timeStepIndex, - bool useSeparateIntersectionResDefTimeStep, - RimIntersection* rimIntersectionHandle, - const RivIntersectionGeometryGeneratorIF* intersectionGeomGenIF, - const cvf::ScalarMapper* explicitScalarColorMapper, - const RivTernaryScalarMapper* explicitTernaryColorMapper, - cvf::Part* intersectionFacesPart, - cvf::Vec2fArray* intersectionFacesTextureCoords ) + size_t timeStepIndex, + bool useSeparateIntersectionResDefTimeStep, + RimIntersection* rimIntersectionHandle, + const RivIntersectionGeometryGeneratorInterface* intersectionGeomGenIF, + const cvf::ScalarMapper* explicitScalarColorMapper, + const RivTernaryScalarMapper* explicitTernaryColorMapper, + cvf::Part* intersectionFacesPart, + cvf::Vec2fArray* intersectionFacesTextureCoords ) { if ( !intersectionGeomGenIF || !intersectionGeomGenIF->isAnyGeometryPresent() ) return; @@ -223,13 +225,14 @@ void RivIntersectionResultsColoringTools::updateEclipseTernaryCellResultColors( //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RivIntersectionResultsColoringTools::updateGeoMechCellResultColors( const RimGeoMechResultDefinition* geomResultDef, - size_t timeStepIndex, - const cvf::ScalarMapper* scalarColorMapper, - bool isLightingDisabled, - const RivIntersectionGeometryGeneratorIF* geomGenerator, - cvf::Part* intersectionFacesPart, - cvf::Vec2fArray* intersectionFacesTextureCoords ) +void RivIntersectionResultsColoringTools::updateGeoMechCellResultColors( + const RimGeoMechResultDefinition* geomResultDef, + size_t timeStepIndex, + const cvf::ScalarMapper* scalarColorMapper, + bool isLightingDisabled, + const RivIntersectionGeometryGeneratorInterface* geomGenerator, + cvf::Part* intersectionFacesPart, + cvf::Vec2fArray* intersectionFacesTextureCoords ) { RigGeoMechCaseData* caseData = nullptr; RigFemResultAddress resVarAddress; @@ -247,35 +250,53 @@ void RivIntersectionResultsColoringTools::updateGeoMechCellResultColors( const R if ( resVarAddress.resultPosType == RIG_ELEMENT ) { - const std::vector& resultValues = - caseData->femPartResults()->resultValues( resVarAddress, 0, (int)timeStepIndex ); + if ( caseData->femPartResults()->partCount() == 1 ) + { + const std::vector& resultValues = + caseData->femPartResults()->resultValues( resVarAddress, 0, (int)timeStepIndex ); - RivIntersectionResultsColoringTools::calculateElementBasedGeoMechTextureCoords( intersectionFacesTextureCoords, - resultValues, - triangleToCellIdx, - scalarColorMapper ); + RivIntersectionResultsColoringTools::calculateElementBasedGeoMechTextureCoords( intersectionFacesTextureCoords, + resultValues, + triangleToCellIdx, + scalarColorMapper ); + } + else + { + std::vector resultValues; + caseData->femPartResults()->globalResultValues( resVarAddress, (int)timeStepIndex, resultValues ); + + RivIntersectionResultsColoringTools::calculateElementBasedGeoMechTextureCoords( intersectionFacesTextureCoords, + resultValues, + triangleToCellIdx, + scalarColorMapper ); + } } else if ( resVarAddress.resultPosType == RIG_ELEMENT_NODAL_FACE ) { // Special direction sensitive result calculation - if ( resVarAddress.componentName == "Pazi" || resVarAddress.componentName == "Pinc" ) + if ( caseData->femPartResults()->partCount() == 1 ) // only supported for single-part geomech cases { - RivIntersectionResultsColoringTools::calculatePlaneAngleTextureCoords( intersectionFacesTextureCoords, - triangelVxes, - resVarAddress, - scalarColorMapper ); + if ( resVarAddress.componentName == "Pazi" || resVarAddress.componentName == "Pinc" ) + { + RivIntersectionResultsColoringTools::calculatePlaneAngleTextureCoords( intersectionFacesTextureCoords, + triangelVxes, + resVarAddress, + scalarColorMapper ); + } + else + { + RivIntersectionResultsColoringTools::calculateGeoMechTensorXfTextureCoords( intersectionFacesTextureCoords, + triangelVxes, + vertexWeights, + caseData, + resVarAddress, + (int)timeStepIndex, + scalarColorMapper ); + } } else - { - RivIntersectionResultsColoringTools::calculateGeoMechTensorXfTextureCoords( intersectionFacesTextureCoords, - triangelVxes, - vertexWeights, - caseData, - resVarAddress, - (int)timeStepIndex, - scalarColorMapper ); - } + return; } else { @@ -285,19 +306,31 @@ void RivIntersectionResultsColoringTools::updateGeoMechCellResultColors( const R { resVarAddress.resultPosType = RIG_ELEMENT_NODAL; } + bool isElementNodalResult = !( resVarAddress.resultPosType == RIG_NODAL ); - const std::vector& resultValues = - caseData->femPartResults()->resultValues( resVarAddress, 0, (int)timeStepIndex ); - - RigFemPart* femPart = caseData->femParts()->part( 0 ); - bool isElementNodalResult = !( resVarAddress.resultPosType == RIG_NODAL ); - - RivIntersectionResultsColoringTools::calculateNodeOrElementNodeBasedGeoMechTextureCoords( intersectionFacesTextureCoords, - vertexWeights, - resultValues, - isElementNodalResult, - femPart, - scalarColorMapper ); + if ( caseData->femPartResults()->partCount() == 1 ) + { + const std::vector& resultValues = + caseData->femPartResults()->resultValues( resVarAddress, 0, (int)timeStepIndex ); + RivIntersectionResultsColoringTools::calculateNodeOrElementNodeBasedGeoMechTextureCoords( intersectionFacesTextureCoords, + vertexWeights, + resultValues, + isElementNodalResult, + caseData->femParts(), + scalarColorMapper ); + } + else + { + std::vector resultValues; + caseData->femPartResults()->globalResultValues( resVarAddress, (int)timeStepIndex, resultValues ); + + RivIntersectionResultsColoringTools::calculateNodeOrElementNodeBasedGeoMechTextureCoords( intersectionFacesTextureCoords, + vertexWeights, + resultValues, + isElementNodalResult, + caseData->femParts(), + scalarColorMapper ); + } } RivScalarMapperUtils::applyTextureResultsToPart( intersectionFacesPart, diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.h b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.h index a488bce0b9..ef9d4b84a8 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionResultsColoringTools.h @@ -20,17 +20,16 @@ #include "cvfArray.h" -#include "RivHexGridIntersectionTools.h" - class RimEclipseResultDefinition; class RimGeoMechResultDefinition; class RimIntersection; -class RivIntersectionGeometryGeneratorIF; +class RivIntersectionGeometryGeneratorInterface; +class RivIntersectionVertexWeights; class RivTernaryScalarMapper; class RigResultAccessor; -class RigFemPart; +class RigFemPartCollection; class RigGeoMechCaseData; class RigFemResultAddress; @@ -46,11 +45,11 @@ class RivIntersectionResultsColoringTools static void calculateIntersectionResultColors( size_t timeStepIndex, bool useSeparateIntersectionResDefTimeStep, RimIntersection* rimIntersectionHandle, - const RivIntersectionGeometryGeneratorIF* intersectionGeomGenIF, - const cvf::ScalarMapper* explicitScalarColorMapper, - const RivTernaryScalarMapper* explicitTernaryColorMapper, - cvf::Part* intersectionFacesPart, - cvf::Vec2fArray* intersectionFacesTextureCoords ); + const RivIntersectionGeometryGeneratorInterface* intersectionGeomGenIF, + const cvf::ScalarMapper* explicitScalarColorMapper, + const RivTernaryScalarMapper* explicitTernaryColorMapper, + cvf::Part* intersectionFacesPart, + cvf::Vec2fArray* intersectionFacesTextureCoords ); private: static void updateEclipseCellResultColors( const RimEclipseResultDefinition* eclipseResDef, @@ -69,12 +68,12 @@ class RivIntersectionResultsColoringTools cvf::Part* m_intersectionBoxFaces, cvf::Vec2fArray* m_intersectionBoxFacesTextureCoords ); - static void updateGeoMechCellResultColors( const RimGeoMechResultDefinition* geomResultDef, - size_t timeStepIndex, - const cvf::ScalarMapper* scalarColorMapper, - bool isLightingDisabled, - const RivIntersectionGeometryGeneratorIF* geomGenerator, - cvf::Part* m_intersectionBoxFaces, + static void updateGeoMechCellResultColors( const RimGeoMechResultDefinition* geomResultDef, + size_t timeStepIndex, + const cvf::ScalarMapper* scalarColorMapper, + bool isLightingDisabled, + const RivIntersectionGeometryGeneratorInterface* geomGenerator, + cvf::Part* m_intersectionBoxFaces, cvf::Vec2fArray* m_intersectionBoxFacesTextureCoords ); static void calculateEclipseTextureCoordinates( cvf::Vec2fArray* textureCoords, @@ -85,10 +84,10 @@ class RivIntersectionResultsColoringTools static void calculateNodeOrElementNodeBasedGeoMechTextureCoords( cvf::Vec2fArray* textureCoords, const std::vector& vertexWeights, - const std::vector& resultValues, - bool isElementNodalResult, - const RigFemPart* femPart, - const cvf::ScalarMapper* mapper ); + const std::vector& resultValues, + bool isElementNodalResult, + const RigFemPartCollection* femParts, + const cvf::ScalarMapper* mapper ); static void calculateElementBasedGeoMechTextureCoords( cvf::Vec2fArray* textureCoords, const std::vector& resultValues, diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.h b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionVertexWeights.h similarity index 54% rename from ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.h rename to ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionVertexWeights.h index f45058497d..28aa52d805 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivHexGridIntersectionTools.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivIntersectionVertexWeights.h @@ -1,6 +1,6 @@ ///////////////////////////////////////////////////////////////////////////////// // -// Copyright (C) Statoil ASA +// Copyright (C) 2021 - Equinor ASA // // ResInsight is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -18,82 +18,8 @@ #pragma once -#include "cvfBoundingBox.h" -#include "cvfObject.h" -#include "cvfVector3.h" - -#include "cvfStructGrid.h" - #include -#include - -class RigActiveCellInfo; -class RigFemPart; -class RigMainGrid; -class RigFault; - -//-------------------------------------------------------------------------------------------------- -/// Interface definition used to compute the geometry for planes intersecting a grid -//-------------------------------------------------------------------------------------------------- -class RivIntersectionHexGridInterface : public cvf::Object -{ -public: - virtual cvf::Vec3d displayOffset() const = 0; - virtual cvf::BoundingBox boundingBox() const = 0; - virtual void findIntersectingCells( const cvf::BoundingBox& intersectingBB, - std::vector* intersectedCells ) const = 0; - virtual bool useCell( size_t cellIndex ) const = 0; - virtual void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const = 0; - virtual void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const = 0; - virtual const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, - cvf::StructGridInterface::FaceType face ) const = 0; -}; - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -class RivEclipseIntersectionGrid : public RivIntersectionHexGridInterface -{ -public: - RivEclipseIntersectionGrid( const RigMainGrid* mainGrid, const RigActiveCellInfo* activeCellInfo, bool showInactiveCells ); - - cvf::Vec3d displayOffset() const override; - cvf::BoundingBox boundingBox() const override; - void findIntersectingCells( const cvf::BoundingBox& intersectingBB, - std::vector* intersectedCells ) const override; - bool useCell( size_t cellIndex ) const override; - void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const override; - void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const override; - const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, - cvf::StructGridInterface::FaceType face ) const override; - -private: - cvf::cref m_mainGrid; - cvf::cref m_activeCellInfo; - bool m_showInactiveCells; -}; - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -class RivFemIntersectionGrid : public RivIntersectionHexGridInterface -{ -public: - explicit RivFemIntersectionGrid( const RigFemPart* femPart ); - - cvf::Vec3d displayOffset() const override; - cvf::BoundingBox boundingBox() const override; - void findIntersectingCells( const cvf::BoundingBox& intersectingBB, - std::vector* intersectedCells ) const override; - bool useCell( size_t cellIndex ) const override; - void cellCornerVertices( size_t cellIndex, cvf::Vec3d cellCorners[8] ) const override; - void cellCornerIndices( size_t cellIndex, size_t cornerIndices[8] ) const override; - const RigFault* findFaultFromCellIndexAndCellFace( size_t reservoirCellIndex, - cvf::StructGridInterface::FaceType face ) const override; - -private: - cvf::cref m_femPart; -}; +#include //-------------------------------------------------------------------------------------------------- /// @@ -222,12 +148,3 @@ class RivIntersectionVertexWeights std::array m_weights; int m_count; }; - -class RivIntersectionGeometryGeneratorIF -{ -public: - virtual bool isAnyGeometryPresent() const = 0; - virtual const std::vector& triangleToCellIndex() const = 0; - virtual const std::vector& triangleVxToCellCornerInterpolationWeights() const = 0; - virtual const cvf::Vec3fArray* triangleVxes() const = 0; -}; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.cpp b/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.cpp similarity index 87% rename from ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.cpp rename to ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.cpp index 884ab835f3..57c339a99d 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.cpp +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.cpp @@ -16,7 +16,7 @@ // ///////////////////////////////////////////////////////////////////////////////// -#include "RivSectionFlattner.h" +#include "RivSectionFlattener.h" #include "cvfGeometryTools.h" //-------------------------------------------------------------------------------------------------- @@ -25,9 +25,9 @@ /// /// Returns size_t(-1) if no point is found //-------------------------------------------------------------------------------------------------- -size_t RivSectionFlattner::indexToNextValidPoint( const std::vector& polyLine, - const cvf::Vec3d extrDir, - size_t idxToStartOfLineSegment ) +size_t RivSectionFlattener::indexToNextValidPoint( const std::vector& polyLine, + const cvf::Vec3d extrDir, + size_t idxToStartOfLineSegment ) { size_t lineCount = polyLine.size(); if ( !( idxToStartOfLineSegment + 1 < lineCount ) ) return -1; @@ -39,7 +39,7 @@ size_t RivSectionFlattner::indexToNextValidPoint( const std::vector& cvf::Vec3d p2 = polyLine[lIdx]; cvf::Vec3d p1p2 = p2 - p1; - if ( ( p1p2 - ( p1p2 * extrDir ) * extrDir ).length() > 0.1 ) + if ( ( p1p2 - ( p1p2 * extrDir ) * extrDir ).length() > 0.001 ) { return lIdx; } @@ -51,10 +51,10 @@ size_t RivSectionFlattner::indexToNextValidPoint( const std::vector& //-------------------------------------------------------------------------------------------------- /// Returns one CS pr point, valid for the next segment //-------------------------------------------------------------------------------------------------- -std::vector RivSectionFlattner::calculateFlatteningCSsForPolyline( const std::vector& polyLine, - const cvf::Vec3d& extrusionDir, - const cvf::Vec3d& startOffset, - cvf::Vec3d* endOffset ) +std::vector RivSectionFlattener::calculateFlatteningCSsForPolyline( const std::vector& polyLine, + const cvf::Vec3d& extrusionDir, + const cvf::Vec3d& startOffset, + cvf::Vec3d* endOffset ) { CVF_ASSERT( endOffset ); size_t pointCount = polyLine.size(); @@ -128,9 +128,9 @@ std::vector RivSectionFlattner::calculateFlatteningCSsForPolyline( c /// Ey normal to the section plane /// Ex in plane along p1-p2 //-------------------------------------------------------------------------------------------------- -cvf::Mat4d RivSectionFlattner::calculateSectionLocalFlatteningCS( const cvf::Vec3d& p1, - const cvf::Vec3d& p2, - const cvf::Vec3d& extrusionDir ) +cvf::Mat4d RivSectionFlattener::calculateSectionLocalFlatteningCS( const cvf::Vec3d& p1, + const cvf::Vec3d& p2, + const cvf::Vec3d& extrusionDir ) { using namespace cvf; diff --git a/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.h b/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.h similarity index 98% rename from ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.h rename to ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.h index e8ec46d7f8..9b1bf50043 100644 --- a/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattner.h +++ b/ApplicationLibCode/ModelVisualization/Intersections/RivSectionFlattener.h @@ -22,7 +22,7 @@ #include -class RivSectionFlattner +class RivSectionFlattener { public: static size_t indexToNextValidPoint( const std::vector& polyLine, diff --git a/ApplicationLibCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp b/ApplicationLibCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp index 605321c144..a6f8712f08 100644 --- a/ApplicationLibCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Riv3dWellLogPlanePartMgr.cpp @@ -141,6 +141,7 @@ void Riv3dWellLogPlanePartMgr::append3dWellLogCurveToModel( cvf::ModelBasicList* cvf::ref effect = meshEffectGen.generateCachedEffect(); cvf::ref part = new cvf::Part; + part->setName( "append3dWellLogCurveToModel" ); part->setDrawable( curveDrawable.p() ); part->setEffect( effect.p() ); @@ -244,6 +245,7 @@ void Riv3dWellLogPlanePartMgr::appendDrawSurfaceToModel( cvf::ModelBasicList* cvf::ref part = createPart( background.p(), backgroundEffect.p() ); if ( part.notNull() ) { + part->setName( "Riv3dWellLogPlanePartMgr::background" ); model->addPart( part.p() ); part->setSourceInfo( sourceInfo.p() ); } @@ -257,6 +259,7 @@ void Riv3dWellLogPlanePartMgr::appendDrawSurfaceToModel( cvf::ModelBasicList* cvf::ref part = createPart( border.p(), borderEffect.p() ); if ( part.notNull() ) { + part->setName( "Riv3dWellLogPlanePartMgr::border" ); model->addPart( part.p() ); } } @@ -273,6 +276,7 @@ void Riv3dWellLogPlanePartMgr::appendDrawSurfaceToModel( cvf::ModelBasicList* cvf::ref part = createPart( normals.p(), curveNormalsEffect.p() ); if ( part.notNull() ) { + part->setName( "Riv3dWellLogPlanePartMgr::normals" ); model->addPart( part.p() ); part->setSourceInfo( sourceInfo.p() ); } diff --git a/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.cpp new file mode 100644 index 0000000000..d9b784bb68 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.cpp @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RivBoxGeometryGenerator.h" + +#include "cafEffectGenerator.h" + +#include "cvfBase.h" +#include "cvfDrawableGeo.h" +#include "cvfPart.h" +#include "cvfPrimitiveSetDirect.h" +#include "cvfPrimitiveSetIndexedUInt.h" +#include "cvfStructGridGeometryGenerator.h" +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RivBoxGeometryGenerator::createBoxFromVertices( const std::vector& vertices, + const cvf::Color3f color ) +{ + std::vector boxVertices; + + for ( int enumInt = cvf::StructGridInterface::POS_I; enumInt < cvf::StructGridInterface::NO_FACE; enumInt++ ) + { + cvf::StructGridInterface::FaceType face = static_cast( enumInt ); + + cvf::ubyte faceConn[4]; + cvf::StructGridInterface::cellFaceVertexIndices( face, faceConn ); + + for ( int n = 0; n < 4; n++ ) + { + boxVertices.push_back( cvf::Vec3f( vertices[faceConn[n]] ) ); + } + } + + cvf::ref geo = new cvf::DrawableGeo; + + cvf::ref cvfVertices = new cvf::Vec3fArray; + cvfVertices->assign( boxVertices ); + + if ( !( cvfVertices.notNull() && cvfVertices->size() != 0 ) ) return nullptr; + + geo->setVertexArray( cvfVertices.p() ); + + cvf::ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( cvfVertices.p() ); + + cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); + prim->setIndices( indices.p() ); + + geo->addPrimitiveSet( prim.p() ); + + cvf::ref part = new cvf::Part; + part->setName( cvf::String( "RivBoxGeometryGenerator::createBoxFromVertices" ) ); + + part->setDrawable( geo.p() ); + + cvf::ref eff; + caf::MeshEffectGenerator effGen( color ); + eff = effGen.generateUnCachedEffect(); + part->setEffect( eff.p() ); + + return part; +} diff --git a/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.h new file mode 100644 index 0000000000..58952c2c31 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/RivBoxGeometryGenerator.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include +#include + +namespace cvf +{ +class Part; +} // namespace cvf + +//================================================================================================== +/// +//================================================================================================== +class RivBoxGeometryGenerator +{ +public: + static cvf::ref createBoxFromVertices( const std::vector& vertices, const cvf::Color3f color ); + +private: + RivBoxGeometryGenerator(){}; +}; diff --git a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp index 034c4f4f1e..7077117ce4 100644 --- a/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivContourMapProjectionPartMgr.cpp @@ -82,6 +82,7 @@ void RivContourMapProjectionPartMgr::appendPickPointVisToModel( cvf::ModelBasicL cvf::ref effect = meshEffectGen.generateCachedEffect(); cvf::ref part = new cvf::Part; + part->setName( "RivContourMapProjectionPartMgr::appendPickPointVisToModel" ); part->setDrawable( drawable.p() ); part->setEffect( effect.p() ); part->setSourceInfo( new RivMeshLinesSourceInfo( m_contourMapProjection.p() ) ); @@ -158,6 +159,7 @@ void RivContourMapProjectionPartMgr::appendContourLinesToModel( const cvf::Camer cvf::ref effect = meshEffectGen.generateCachedEffect(); cvf::ref part = new cvf::Part; + part->setName( "RivContourMapProjectionPartMgr::contourDrawable_mesh" ); part->setDrawable( contourDrawable.p() ); part->setEffect( effect.p() ); part->setPriority( RivPartPriority::MeshLines ); @@ -173,6 +175,7 @@ void RivContourMapProjectionPartMgr::appendContourLinesToModel( const cvf::Camer for ( auto labelDrawableRef : labelDrawables ) { cvf::ref part = new cvf::Part; + part->setName( "RivContourMapProjectionPartMgr::labelDrawableRef" ); part->setDrawable( labelDrawableRef.p() ); part->setEffect( m_labelEffect.p() ); part->setPriority( RivPartPriority::Text ); @@ -237,6 +240,7 @@ cvf::ref geo->setVertexArray( vertexArray.p() ); cvf::ref part = new cvf::Part; + part->setName( "RivContourMapProjectionPartMgr::createProjectionMapPart" ); part->setDrawable( geo.p() ); cvf::ScalarMapper* mapper = m_contourMapProjection->legendConfig()->scalarMapper(); diff --git a/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.cpp b/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.cpp new file mode 100644 index 0000000000..d6f9ee31dd --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.cpp @@ -0,0 +1,84 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RivDrawableSpheres.h" + +#include "cvfRay.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RivDrawableSpheres::RivDrawableSpheres() + : cvf::DrawableVectors() + , m_radius( 1.0 ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RivDrawableSpheres::RivDrawableSpheres( cvf::String vectorMatrixUniformName, cvf::String colorUniformName ) + : cvf::DrawableVectors( vectorMatrixUniformName, colorUniformName ) + , m_radius( 1.0 ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// Estimate the intersection of a sphere by the sphere inscribed in a bounding box +//-------------------------------------------------------------------------------------------------- +bool RivDrawableSpheres::rayIntersectCreateDetail( const cvf::Ray& ray, + cvf::Vec3d* intersectionPoint, + cvf::ref* hitDetail ) const +{ + if ( m_centerCoordArray.isNull() ) return false; + + for ( size_t i = 0; i < m_centerCoordArray->size(); i++ ) + { + cvf::BoundingBox bb; + + cvf::Vec3f center = m_centerCoordArray->get( i ); + cvf::Vec3f corner1 = cvf::Vec3f( center.x() + m_radius, center.y() + m_radius, center.z() + m_radius ); + cvf::Vec3f corner2 = cvf::Vec3f( center.x() - m_radius, center.y() - m_radius, center.z() - m_radius ); + + bb.add( corner1 ); + bb.add( corner2 ); + + if ( ray.boxIntersect( bb, intersectionPoint ) ) + { + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivDrawableSpheres::setRadius( float radius ) +{ + m_radius = radius; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivDrawableSpheres::setCenterCoords( cvf::Vec3fArray* vertexArray ) +{ + m_centerCoordArray = vertexArray; +} diff --git a/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.h b/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.h new file mode 100644 index 0000000000..6b4651d517 --- /dev/null +++ b/ApplicationLibCode/ModelVisualization/RivDrawableSpheres.h @@ -0,0 +1,39 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfDrawableVectors.h" + +class RivDrawableSpheres : public cvf::DrawableVectors +{ +public: + RivDrawableSpheres(); + RivDrawableSpheres( cvf::String vectorMatrixUniformName, cvf::String colorUniformName ); + + bool rayIntersectCreateDetail( const cvf::Ray& ray, + cvf::Vec3d* intersectionPoint, + cvf::ref* hitDetail ) const override; + + void setRadius( float radius ); + void setCenterCoords( cvf::Vec3fArray* vertexArray ); + +private: + cvf::ref m_centerCoordArray; // Coordinates for sphere center + float m_radius; // Sphere radius +}; diff --git a/ApplicationLibCode/ModelVisualization/RivElementVectorResultPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivElementVectorResultPartMgr.cpp index a689b5bb1b..a8ea28a5f6 100644 --- a/ApplicationLibCode/ModelVisualization/RivElementVectorResultPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivElementVectorResultPartMgr.cpp @@ -372,6 +372,8 @@ cvf::ref drawable->setTextureCoordArray( lineTexCoords.p() ); cvf::ref part = new cvf::Part; + part->setName( "RivElementVectorResultPartMgr::createPart" ); + part->setDrawable( drawable.p() ); part->setEffect( effect.p() ); diff --git a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp index 55da4bf588..2e76b81f5a 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.cpp @@ -79,8 +79,9 @@ cvf::ref RivFaultGeometryGenerator::createMeshDrawable() cvf::ref geo = new cvf::DrawableGeo; geo->setVertexArray( m_vertices.p() ); - cvf::ref indices = lineIndicesFromQuadVertexArray( m_vertices.p() ); - cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); + cvf::ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( m_vertices.p() ); + + cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); prim->setIndices( indices.p() ); geo->addPrimitiveSet( prim.p() ); @@ -96,7 +97,7 @@ cvf::ref RivFaultGeometryGenerator::createOutlineMeshDrawable( cvf::OutlineEdgeExtractor ee( creaseAngle, *m_vertices ); - cvf::ref indices = lineIndicesFromQuadVertexArray( m_vertices.p() ); + cvf::ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( m_vertices.p() ); ee.addPrimitives( 4, *indices ); cvf::ref lineIndices = ee.lineIndices(); @@ -115,37 +116,6 @@ cvf::ref RivFaultGeometryGenerator::createOutlineMeshDrawable( return geo; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::ref RivFaultGeometryGenerator::lineIndicesFromQuadVertexArray( const cvf::Vec3fArray* vertexArray ) -{ - CVF_ASSERT( vertexArray ); - - size_t numVertices = vertexArray->size(); - int numQuads = static_cast( numVertices / 4 ); - CVF_ASSERT( numVertices % 4 == 0 ); - - cvf::ref indices = new cvf::UIntArray; - indices->resize( numQuads * 8 ); - -#pragma omp parallel for - for ( int i = 0; i < numQuads; i++ ) - { - int idx = 8 * i; - indices->set( idx + 0, i * 4 + 0 ); - indices->set( idx + 1, i * 4 + 1 ); - indices->set( idx + 2, i * 4 + 1 ); - indices->set( idx + 3, i * 4 + 2 ); - indices->set( idx + 4, i * 4 + 2 ); - indices->set( idx + 5, i * 4 + 3 ); - indices->set( idx + 6, i * 4 + 3 ); - indices->set( idx + 7, i * 4 + 0 ); - } - - return indices; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h index b027e1d16a..cdf24c0688 100644 --- a/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/RivFaultGeometryGenerator.h @@ -57,8 +57,6 @@ class RivFaultGeometryGenerator : public cvf::Object cvf::ref createMeshDrawable(); cvf::ref createOutlineMeshDrawable( double creaseAngle ); - static cvf::ref lineIndicesFromQuadVertexArray( const cvf::Vec3fArray* vertexArray ); - private: void computeArrays(); diff --git a/ApplicationLibCode/ModelVisualization/RivPipeGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivPipeGeometryGenerator.cpp index 2bbe45fd78..a01bc55737 100644 --- a/ApplicationLibCode/ModelVisualization/RivPipeGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivPipeGeometryGenerator.cpp @@ -801,6 +801,7 @@ void RivPipeGeometryGenerator::cylinderWithCenterLineParts( cvf::CollectionsetName( "RivPipeGeometryGenerator::surface" ); part->setDrawable( surfaceGeo.p() ); caf::SurfaceEffectGenerator surfaceGen( cvf::Color4f( color ), caf::PO_1 ); @@ -815,6 +816,7 @@ void RivPipeGeometryGenerator::cylinderWithCenterLineParts( cvf::CollectionsetName( "RivPipeGeometryGenerator::centerLineGeo" ); part->setDrawable( centerLineGeo.p() ); caf::SurfaceEffectGenerator surfaceGen( cvf::Color4f( color ), caf::PO_1 ); @@ -844,6 +846,7 @@ void RivPipeGeometryGenerator::tubeWithCenterLinePartsAndVariableWidth( cvf::Col if ( surfaceGeo.notNull() ) { cvf::Part* part = new cvf::Part; + part->setName( "tubeWithCenterLinePartsAndVariableWidth::surface" ); part->setDrawable( surfaceGeo.p() ); caf::SurfaceEffectGenerator surfaceGen( cvf::Color4f( color ), caf::PO_1 ); @@ -858,6 +861,7 @@ void RivPipeGeometryGenerator::tubeWithCenterLinePartsAndVariableWidth( cvf::Col if ( centerLineGeo.notNull() ) { cvf::Part* part = new cvf::Part; + part->setName( "tubeWithCenterLinePartsAndVariableWidth::centerLineGeo" ); part->setDrawable( centerLineGeo.p() ); caf::SurfaceEffectGenerator surfaceGen( cvf::Color4f( color ), caf::PO_1 ); diff --git a/ApplicationLibCode/ModelVisualization/RivReachCircleAnnotationPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivReachCircleAnnotationPartMgr.cpp index 51be932be9..de0e2ebe15 100644 --- a/ApplicationLibCode/ModelVisualization/RivReachCircleAnnotationPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivReachCircleAnnotationPartMgr.cpp @@ -82,6 +82,7 @@ void RivReachCircleAnnotationPartMgr::buildParts( const caf::DisplayCoordTransfo cvf::ref drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable( points ); cvf::ref part = new cvf::Part; + part->setName( "RivReachCircleAnnotationPartMgr" ); part->setDrawable( drawableGeo.p() ); caf::MeshEffectGenerator effgen( lineColor ); @@ -111,6 +112,7 @@ void RivReachCircleAnnotationPartMgr::buildParts( const caf::DisplayCoordTransfo cvf::ref drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable( symbol ); cvf::ref part = new cvf::Part; + part->setName( "RivReachCircleAnnotationPartMgr" ); part->setDrawable( drawableGeo.p() ); caf::MeshEffectGenerator effgen( lineColor ); diff --git a/ApplicationLibCode/ModelVisualization/RivSimWellPipesPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivSimWellPipesPartMgr.cpp index 815f182e03..63966091c5 100644 --- a/ApplicationLibCode/ModelVisualization/RivSimWellPipesPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivSimWellPipesPartMgr.cpp @@ -37,7 +37,7 @@ #include "RimVirtualPerforationResults.h" #include "RivPipeGeometryGenerator.h" -#include "RivSectionFlattner.h" +#include "RivSectionFlattener.h" #include "RivSimWellConnectionSourceInfo.h" #include "RivSimWellPipeSourceInfo.h" #include "RivWellConnectionFactorGeometryGenerator.h" @@ -203,10 +203,10 @@ void RivSimWellPipesPartMgr::buildWellPipeParts( const caf::DisplayCoordTransfor if ( doFlatten ) { std::vector flatningCSs = - RivSectionFlattner::calculateFlatteningCSsForPolyline( m_pipeBranchesCLCoords[brIdx], - cvf::Vec3d::Z_AXIS, - flattenedStartOffset, - &flattenedStartOffset ); + RivSectionFlattener::calculateFlatteningCSsForPolyline( m_pipeBranchesCLCoords[brIdx], + cvf::Vec3d::Z_AXIS, + flattenedStartOffset, + &flattenedStartOffset ); for ( size_t cIdx = 0; cIdx < cvfCoords->size(); ++cIdx ) { ( *cvfCoords )[cIdx] = ( ( *cvfCoords )[cIdx] ).getTransformedPoint( flatningCSs[cIdx] ); diff --git a/ApplicationLibCode/ModelVisualization/RivTensorResultPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivTensorResultPartMgr.cpp index 81c1312c2f..9b83679601 100644 --- a/ApplicationLibCode/ModelVisualization/RivTensorResultPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivTensorResultPartMgr.cpp @@ -94,8 +94,10 @@ void RivTensorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::ModelBasicL for ( int partIdx = 0; partIdx < femParts->partCount(); partIdx++ ) { std::vector vertexTensors = resultCollection->tensors( address, partIdx, (int)frameIndex ); + if ( vertexTensors.empty() ) continue; + + const RigFemPart* part = femParts->part( partIdx ); - const RigFemPart* part = femParts->part( partIdx ); std::vector elmTensors; calculateElementTensors( *part, vertexTensors, &elmTensors ); @@ -129,7 +131,8 @@ void RivTensorResultPartMgr::appendDynamicGeometryPartsToModel( cvf::ModelBasicL for ( const RivGeoMechPartMgrCache::Key& partKey : partKeys ) { const RivGeoMechPartMgr* partMgr = partMgrCache->partMgr( partKey ); - for ( auto mgr : partMgr->femPartMgrs() ) + + auto mgr = partMgr->femPartMgrs()[partIdx]; { const RivFemPartGeometryGenerator* surfaceGenerator = mgr->surfaceGenerator(); const std::vector& quadVerticesToNodeIdxMapping = surfaceGenerator->quadVerticesToNodeIdxMapping(); @@ -373,6 +376,7 @@ cvf::ref RivTensorResultPartMgr::createPart( const std::vectorsetTextureCoordArray( lineTexCoords.p() ); cvf::ref part = new cvf::Part; + part->setName( "RivTensorResultPartMgr" ); part->setDrawable( drawable.p() ); part->setEffect( scalarMapperMeshEffect.p() ); diff --git a/ApplicationLibCode/ModelVisualization/RivTextAnnotationPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivTextAnnotationPartMgr.cpp index b2dd173829..11d318f891 100644 --- a/ApplicationLibCode/ModelVisualization/RivTextAnnotationPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivTextAnnotationPartMgr.cpp @@ -103,6 +103,7 @@ void RivTextAnnotationPartMgr::buildParts( const caf::DisplayCoordTransform* dis cvf::ref drawableGeo = RivPolylineGenerator::createLineAlongPolylineDrawable( points ); cvf::ref part = new cvf::Part; + part->setName( "RivTextAnnotationPartMgr" ); part->setDrawable( drawableGeo.p() ); caf::MeshEffectGenerator colorEffgen( anchorLineColor ); diff --git a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp index 43a032f25a..f9836b8796 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellConnectionFactorGeometryGenerator.cpp @@ -57,6 +57,7 @@ cvf::ref RivWellConnectionFactorGeometryGenerator::createSurfacePart( if ( drawable.notNull() ) { cvf::ref part = new cvf::Part; + part->setName( "RivWellConnectionFactorGeometryGenerator" ); part->setDrawable( drawable.p() ); // Compute texture coords diff --git a/ApplicationLibCode/ModelVisualization/RivWellConnectionsPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellConnectionsPartMgr.cpp index 381ae6ec8c..e0255cb3cf 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellConnectionsPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellConnectionsPartMgr.cpp @@ -238,8 +238,10 @@ cvf::ref RivWellConnectionsPartMgr::createArrowPart( const cvf::Vec3f const cvf::Color4f& arrowColor, bool enableLighting ) { - cvf::ref part = new cvf::Part; - cvf::ref geo = createArrowGeometry( startPoint, endPoint, width, isProducer ); + cvf::ref part = new cvf::Part; + part->setName( "RivWellConnectionsPartMgr::createArrowPart" ); + + cvf::ref geo = createArrowGeometry( startPoint, endPoint, width, isProducer ); part->setDrawable( geo.p() ); caf::SurfaceEffectGenerator surfaceGen( arrowColor, caf::PO_1 ); diff --git a/ApplicationLibCode/ModelVisualization/RivWellDiskPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellDiskPartMgr.cpp index 2d986385e6..c7403321f9 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellDiskPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellDiskPartMgr.cpp @@ -33,7 +33,7 @@ #include "RivDiskGeometryGenerator.h" #include "RivPartPriority.h" -#include "RivSectionFlattner.h" +#include "RivSectionFlattener.h" #include "RivSimWellPipeSourceInfo.h" #include "RivTextLabelSourceInfo.h" diff --git a/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp index c07e9ba601..bbc73d17ee 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellFracturePartMgr.cpp @@ -60,6 +60,7 @@ #include "cvfPrimitiveSetIndexedUInt.h" #include "cvfRenderStateDepth.h" #include "cvfScalarMapperContinuousLinear.h" +#include "cvfStructGridGeometryGenerator.h" #include "cvfTransform.h" #include @@ -1077,7 +1078,8 @@ cvf::ref cvf::ref stimPlanMeshGeo = new cvf::DrawableGeo; stimPlanMeshGeo->setVertexArray( stimPlanMeshVertexList ); - cvf::ref indices = RivFaultGeometryGenerator::lineIndicesFromQuadVertexArray( stimPlanMeshVertexList ); + cvf::ref indices = + cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( stimPlanMeshVertexList ); cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); prim->setIndices( indices.p() ); diff --git a/ApplicationLibCode/ModelVisualization/RivWellHeadPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellHeadPartMgr.cpp index 4b9b49801d..50a0fdde92 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellHeadPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellHeadPartMgr.cpp @@ -36,7 +36,7 @@ #include "RivPartPriority.h" #include "RivPipeGeometryGenerator.h" -#include "RivSectionFlattner.h" +#include "RivSectionFlattener.h" #include "RivSimWellPipeSourceInfo.h" #include "RivTextLabelSourceInfo.h" diff --git a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp index 0655793a95..152c05a8f6 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.cpp @@ -37,6 +37,8 @@ #include "RimPerforationInterval.h" #include "RimRegularLegendConfig.h" #include "RimTools.h" +#include "RimWellIASettings.h" +#include "RimWellIASettingsCollection.h" #include "RimWellMeasurement.h" #include "RimWellMeasurementCollection.h" #include "RimWellMeasurementFilter.h" @@ -53,11 +55,13 @@ #include "RimWellPathValve.h" #include "Riv3dWellLogPlanePartMgr.h" +#include "RivBoxGeometryGenerator.h" +#include "RivDrawableSpheres.h" #include "RivFishbonesSubsPartMgr.h" #include "RivObjectSourceInfo.h" #include "RivPartPriority.h" #include "RivPipeGeometryGenerator.h" -#include "RivSectionFlattner.h" +#include "RivSectionFlattener.h" #include "RivTextLabelSourceInfo.h" #include "RivWellConnectionFactorPartMgr.h" #include "RivWellFracturePartMgr.h" @@ -437,12 +441,12 @@ void RivWellPathPartMgr::appendPerforationsToModel( cvf::ModelBasicList* { cvf::Vec3d dummy; vector flatningCSs = - RivSectionFlattner::calculateFlatteningCSsForPolyline( perfIntervalCL, - cvf::Vec3d::Z_AXIS, - { horizontalLengthAlongWellPath, - 0.0, - perfIntervalCL[0].z() }, - &dummy ); + RivSectionFlattener::calculateFlatteningCSsForPolyline( perfIntervalCL, + cvf::Vec3d::Z_AXIS, + { horizontalLengthAlongWellPath, + 0.0, + perfIntervalCL[0].z() }, + &dummy ); for ( size_t cIdx = 0; cIdx < perfIntervalCL.size(); ++cIdx ) { @@ -667,12 +671,12 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d { cvf::Vec3d dummy; std::vector flatningCSs = - RivSectionFlattner::calculateFlatteningCSsForPolyline( clippedWellPathCenterLine, - cvf::Vec3d::Z_AXIS, - { horizontalLengthAlongWellToClipPoint, - 0.0, - clippedWellPathCenterLine[0].z() }, - &dummy ); + RivSectionFlattener::calculateFlatteningCSsForPolyline( clippedWellPathCenterLine, + cvf::Vec3d::Z_AXIS, + { horizontalLengthAlongWellToClipPoint, + 0.0, + clippedWellPathCenterLine[0].z() }, + &dummy ); for ( size_t cIdx = 0; cIdx < cvfCoords->size(); ++cIdx ) { @@ -696,6 +700,7 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d if ( m_surfaceDrawable.notNull() ) { m_surfacePart = new cvf::Part; + m_surfacePart->setName( "RivWellPathPartMgr::surface" ); m_surfacePart->setDrawable( m_surfaceDrawable.p() ); RivWellPathSourceInfo* sourceInfo = new RivWellPathSourceInfo( m_rimWellPath, m_pipeGeomGenerator.p() ); @@ -710,6 +715,7 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d if ( m_centerLineDrawable.notNull() ) { m_centerLinePart = new cvf::Part; + m_centerLinePart->setName( "RivWellPathPartMgr::centerLinePart" ); m_centerLinePart->setDrawable( m_centerLineDrawable.p() ); caf::MeshEffectGenerator gen( m_rimWellPath->wellPathColor() ); @@ -789,14 +795,14 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d colors->add( sphereColor ); } - cvf::ref vectorDrawable; + cvf::ref vectorDrawable; if ( RiaGuiApplication::instance()->useShaders() ) { - vectorDrawable = new cvf::DrawableVectors( "u_transformationMatrix", "u_color" ); + vectorDrawable = new RivDrawableSpheres( "u_transformationMatrix", "u_color" ); } else { - vectorDrawable = new cvf::DrawableVectors(); + vectorDrawable = new RivDrawableSpheres(); } vectorDrawable->setVectors( vertices.p(), vecRes.p() ); @@ -813,6 +819,8 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d cvf::GeometryBuilderTriangles builder; cvf::GeometryUtils::createSphere( cellRadius, 15, 15, &builder ); vectorDrawable->setGlyph( builder.trianglesUShort().p(), builder.vertices().p() ); + vectorDrawable->setRadius( cellRadius ); + vectorDrawable->setCenterCoords( vertices.p() ); cvf::ref part = new cvf::Part; part->setName( "RivWellPathPartMgr_WellTargetSpheres" ); @@ -820,6 +828,9 @@ void RivWellPathPartMgr::buildWellPathParts( const caf::DisplayCoordTransform* d part->setEffect( new cvf::Effect() ); + auto sourceInfo = new RivObjectSourceInfo( geoDef ); + part->setSourceInfo( sourceInfo ); + m_spherePart = part; } } @@ -860,6 +871,7 @@ void RivWellPathPartMgr::appendStaticGeometryPartsToModel( cvf::ModelBasicList* appendFishboneSubsPartsToModel( model, displayCoordTransform, characteristicCellSize ); appendWellPathAttributesToModel( model, displayCoordTransform, characteristicCellSize ); + appendWellIntegrityIntervalsToModel( model, displayCoordTransform, characteristicCellSize ); RimGridView* gridView = dynamic_cast( m_rimView.p() ); if ( gridView ) @@ -897,10 +909,16 @@ void RivWellPathPartMgr::appendFlattenedStaticGeometryPartsToModel( cvf::ModelBa model->addPart( m_wellLabelPart.p() ); } - if ( m_spherePart.notNull() ) - { - model->addPart( m_spherePart.p() ); - } + /* + // TODO: Currently not supported. + // Require coordinate transformations of the spheres similar to RivWellPathPartMgr::buildWellPathParts + // https://github.com/OPM/ResInsight/issues/7891 + // + if ( m_spherePart.notNull() ) + { + model->addPart( m_spherePart.p() ); + } + */ } //-------------------------------------------------------------------------------------------------- @@ -1007,3 +1025,76 @@ double RivWellPathPartMgr::wellMeasurementRadius( double return wellPathCollection->wellPathRadiusScaleFactor() * wellMeasurementInView->radiusScaleFactor() * characteristicCellSize; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RivWellPathPartMgr::appendWellIntegrityIntervalsToModel( cvf::ModelBasicList* model, + const caf::DisplayCoordTransform* displayCoordTransform, + double characteristicCellSize ) +{ + if ( !m_rimWellPath ) return; + + RimWellPathCollection* wellPathCollection = this->wellPathCollection(); + if ( !wellPathCollection ) return; + + RigWellPath* wellPathGeometry = m_rimWellPath->wellPathGeometry(); + if ( !wellPathGeometry ) return; + + // Since we're using the index of measured depths to find the index of a point, ensure they're equal + CVF_ASSERT( wellPathGeometry->measuredDepths().size() == wellPathGeometry->wellPathPoints().size() ); + + double wellPathRadius = this->wellPathRadius( characteristicCellSize, wellPathCollection ); + double wiaIntervalRadius = wellPathRadius * 1.15; + + RivPipeGeometryGenerator geoGenerator; + + for ( auto wiaModel : m_rimWellPath->wellIASettingsCollection()->settings() ) + { + if ( !wiaModel->isChecked() ) continue; + if ( wiaModel->startMD() > wiaModel->endMD() ) continue; + + double horizontalLengthAlongWellPath = 0.0; + std::vector intervalCL; + { + std::pair, std::vector> intervalCoordsAndMD = + wellPathGeometry->clippedPointSubset( wiaModel->startMD(), wiaModel->endMD(), &horizontalLengthAlongWellPath ); + intervalCL = intervalCoordsAndMD.first; + } + + if ( intervalCL.size() < 2 ) continue; + + std::vector intervalCLDisplayCS; + + for ( cvf::Vec3d& point : intervalCL ) + { + intervalCLDisplayCS.push_back( displayCoordTransform->transformToDisplayCoord( point ) ); + } + cvf::ref objectSourceInfo = new RivObjectSourceInfo( wiaModel ); + + cvf::Collection parts; + geoGenerator.cylinderWithCenterLineParts( &parts, intervalCLDisplayCS, cvf::Color3f::ORCHID, wiaIntervalRadius ); + for ( auto& part : parts ) + { + part->setSourceInfo( objectSourceInfo.p() ); + model->addPart( part.p() ); + } + + if ( wiaModel->showBox() ) + { + const auto& vertices = wiaModel->modelBoxVertices(); + + std::vector transformedVertices; + + for ( auto& v : vertices ) + { + transformedVertices.push_back( cvf::Vec3f( displayCoordTransform->transformToDisplayCoord( v ) ) ); + } + + cvf::ref boxpart = + RivBoxGeometryGenerator::createBoxFromVertices( transformedVertices, cvf::Color3f::ORCHID ); + boxpart->setSourceInfo( objectSourceInfo.p() ); + model->addPart( boxpart.p() ); + } + } +} diff --git a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.h b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.h index b63d846426..c18565939e 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.h +++ b/ApplicationLibCode/ModelVisualization/RivWellPathPartMgr.h @@ -98,7 +98,6 @@ class RivWellPathPartMgr : public cvf::Object const caf::DisplayCoordTransform* displayCoordTransform, double characteristicCellSize ); - void appendPerforationsToModel( cvf::ModelBasicList* model, size_t timeStepIndex, const caf::DisplayCoordTransform* displayCoordTransform, @@ -116,6 +115,10 @@ class RivWellPathPartMgr : public cvf::Object const caf::DisplayCoordTransform* displayCoordTransform, double characteristicCellSize ); + void appendWellIntegrityIntervalsToModel( cvf::ModelBasicList* model, + const caf::DisplayCoordTransform* displayCoordTransform, + double characteristicCellSize ); + void buildWellPathParts( const caf::DisplayCoordTransform* displayCoordTransform, double characteristicCellSize, const cvf::BoundingBox& wellPathClipBoundingBox, diff --git a/ApplicationLibCode/ModelVisualization/RivWellSpheresPartMgr.cpp b/ApplicationLibCode/ModelVisualization/RivWellSpheresPartMgr.cpp index d5c92ecee3..d32765d161 100644 --- a/ApplicationLibCode/ModelVisualization/RivWellSpheresPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/RivWellSpheresPartMgr.cpp @@ -167,6 +167,8 @@ cvf::ref RivWellSpheresPartMgr::createPart( std::vectorsetGlyph( builder.trianglesUShort().p(), builder.vertices().p() ); cvf::ref part = new cvf::Part; + part->setName( "RivWellSpheresPartMgr" ); + part->setDrawable( vectorDrawable.p() ); cvf::ref eff = new cvf::Effect; diff --git a/ApplicationLibCode/ModelVisualization/Streamlines/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/Streamlines/CMakeLists_files.cmake index b08a593964..1d2ba62e08 100644 --- a/ApplicationLibCode/ModelVisualization/Streamlines/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/Streamlines/CMakeLists_files.cmake @@ -1,18 +1,15 @@ +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RivStreamlinesPartMgr.h) -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivStreamlinesPartMgr.h +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivStreamlinesPartMgr.cpp ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivStreamlinesPartMgr.cpp -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +source_group( + "ModelVisualization\\Streamlines" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "ModelVisualization\\Streamlines" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/ModelVisualization/Streamlines/RivStreamlinesPartMgr.cpp b/ApplicationLibCode/ModelVisualization/Streamlines/RivStreamlinesPartMgr.cpp index b5c44a5ba2..9dbc65b9ab 100644 --- a/ApplicationLibCode/ModelVisualization/Streamlines/RivStreamlinesPartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Streamlines/RivStreamlinesPartMgr.cpp @@ -218,6 +218,8 @@ cvf::ref RivStreamlinesPartMgr::createPart( const RimStreamlineInView drawable->setTextureCoordArray( lineTexCoords.p() ); cvf::ref part = new cvf::Part; + part->setName( "RivStreamlinesPartMgr" ); + part->setDrawable( drawable.p() ); part->setEffect( effect.p() ); part->updateBoundingBox(); diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/Surfaces/CMakeLists_files.cmake index 42ac0d3b3c..398c6d58a3 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/Surfaces/CMakeLists_files.cmake @@ -1,23 +1,21 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivSurfacePartMgr.h -${CMAKE_CURRENT_LIST_DIR}/RivSurfaceIntersectionGeometryGenerator.h -${CMAKE_CURRENT_LIST_DIR}/RivReservoirSurfaceIntersectionSourceInfo.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivSurfacePartMgr.h + ${CMAKE_CURRENT_LIST_DIR}/RivSurfaceIntersectionGeometryGenerator.h + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirSurfaceIntersectionSourceInfo.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivSurfacePartMgr.cpp -${CMAKE_CURRENT_LIST_DIR}/RivSurfaceIntersectionGeometryGenerator.cpp -${CMAKE_CURRENT_LIST_DIR}/RivReservoirSurfaceIntersectionSourceInfo.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivSurfacePartMgr.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivSurfaceIntersectionGeometryGenerator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivReservoirSurfaceIntersectionSourceInfo.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) - -source_group( "ModelVisualization\\Surfaces" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) +source_group( + "ModelVisualization\\Surfaces" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.cpp b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.cpp index ce2f7e710d..e6f9d216e0 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.cpp +++ b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.cpp @@ -19,6 +19,8 @@ #include "RivSurfaceIntersectionGeometryGenerator.h" +#include "RiaLogging.h" + #include "RigMainGrid.h" #include "RigResultAccessor.h" @@ -30,12 +32,16 @@ #include "RimSurfaceInView.h" #include "RivExtrudedCurveIntersectionPartMgr.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionHexGridInterface.h" +#include "RivIntersectionVertexWeights.h" #include "RivPolylineGenerator.h" +#include "RivSectionFlattener.h" #include "cafDisplayCoordTransform.h" #include "cafHexGridIntersectionTools/cafHexGridIntersectionTools.h" +#include "../cafHexInterpolator/cafHexInterpolator.h" // Use relative path, as this is a header only file not part of a library + #include "cvfDrawableGeo.h" #include "cvfGeometryTools.h" #include "cvfPlane.h" @@ -44,12 +50,6 @@ #include "cvfRay.h" #include "cvfScalarMapper.h" -#include "../cafHexInterpolator/cafHexInterpolator.h" -#include "RivSectionFlattner.h" - -#include "RiaLogging.h" -#include "clipper.hpp" - cvf::ref displayCoordTransform( const RimIntersection* intersection ) { Rim3dView* rimView = nullptr; @@ -206,10 +206,8 @@ void RivSurfaceIntersectionGeometryGenerator::calculateArrays() std::array cellCorners; std::array cornerIndices; - for ( size_t ticIdx = 0; ticIdx < triIntersectedCellCandidates.size(); ++ticIdx ) + for ( size_t globalCellIdx : triIntersectedCellCandidates ) { - size_t globalCellIdx = triIntersectedCellCandidates[ticIdx]; - if ( !m_hexGrid->useCell( globalCellIdx ) ) continue; hexPlaneCutTriangleVxes.clear(); @@ -309,7 +307,7 @@ void RivSurfaceIntersectionGeometryGenerator::calculateArrays() for ( const auto& it : meshAcc.faultToHighestFaultMeshVxMap ) { - m_faultMeshLabelAndAnchorPositions.push_back( { it.first->name(), it.second } ); + m_faultMeshLabelAndAnchorPositions.emplace_back( it.first->name(), it.second ); } } @@ -417,8 +415,6 @@ bool RivSurfaceIntersectionGeometryGenerator::isAnyGeometryPresent() const { return false; } - else - { - return true; - } + + return true; } diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.h b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.h index 97a6dd1f03..17b72f28ab 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.h +++ b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfaceIntersectionGeometryGenerator.h @@ -21,7 +21,7 @@ #include "cafPdmPointer.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionGeometryGeneratorInterface.h" #include "cvfArray.h" #include "cvfBoundingBox.h" @@ -47,7 +47,7 @@ class ScalarMapper; class DrawableGeo; } // namespace cvf -class RivSurfaceIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorIF +class RivSurfaceIntersectionGeometryGenerator : public cvf::Object, public RivIntersectionGeometryGeneratorInterface { public: RivSurfaceIntersectionGeometryGenerator( RimSurfaceInView* surfInView, const RivIntersectionHexGridInterface* grid ); diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp index 1a4e2924bc..ffe5c3c56b 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp +++ b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.cpp @@ -28,6 +28,8 @@ #include "RimSurfaceInView.h" #include "RimSurfaceResultDefinition.h" +#include "RivIntersectionGeometryGeneratorInterface.h" +#include "RivIntersectionHexGridInterface.h" #include "RivIntersectionResultsColoringTools.h" #include "RivMeshLinesSourceInfo.h" #include "RivPartPriority.h" @@ -237,6 +239,8 @@ QString RivSurfacePartMgr::resultInfoText( Rim3dView* view, uint hitPart, cvf::V { const auto& values = m_usedSurfaceData->propertyValues( m_surfaceInView->surfaceResultDefinition()->propertyName() ); + if ( values.empty() ) return ""; + const auto& ind = m_usedSurfaceData->triangleIndices(); const auto& vert = m_usedSurfaceData->vertices(); @@ -253,9 +257,11 @@ QString RivSurfacePartMgr::resultInfoText( Rim3dView* view, uint hitPart, cvf::V double dist2 = vert[vertIndex2].pointDistance( hitPoint ); double dist3 = vert[vertIndex3].pointDistance( hitPoint ); - double resultValue = values[vertIndex1]; - if ( dist2 < dist1 ) resultValue = values[vertIndex2]; - if ( ( dist3 < dist1 ) && ( dist3 < dist2 ) ) resultValue = values[vertIndex3]; + double resultValue = -1.0; + if ( vertIndex1 < values.size() ) resultValue = values[vertIndex1]; + if ( dist2 < dist1 && vertIndex2 < values.size() ) resultValue = values[vertIndex2]; + if ( ( dist3 < dist1 ) && ( dist3 < dist2 ) && vertIndex3 < values.size() ) + resultValue = values[vertIndex3]; retval += QString( "%1 : %2\n\n" ).arg( m_surfaceInView->surfaceResultDefinition()->propertyName() ).arg( resultValue ); @@ -267,7 +273,7 @@ QString RivSurfacePartMgr::resultInfoText( Rim3dView* view, uint hitPart, cvf::V //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RivSurfacePartMgr::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RivSurfacePartMgr::intersectionGeometryGenerator() const { if ( m_intersectionGenerator.notNull() ) return m_intersectionGenerator.p(); diff --git a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.h b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.h index 08795ae59f..d1e221b5ae 100644 --- a/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.h +++ b/ApplicationLibCode/ModelVisualization/Surfaces/RivSurfacePartMgr.h @@ -36,7 +36,7 @@ class RigResultAccessor; class Rim3dView; class RivSurfaceIntersectionGeometryGenerator; -class RivIntersectionGeometryGeneratorIF; +class RivIntersectionGeometryGeneratorInterface; class RivSurfacePartMgr : public cvf::Object { @@ -51,7 +51,7 @@ class RivSurfacePartMgr : public cvf::Object QString resultInfoText( Rim3dView* view, uint hitPart, cvf::Vec3d hitPoint ); - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const; + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const; private: void generatePartGeometry(); diff --git a/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/CMakeLists_files.cmake b/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/CMakeLists_files.cmake index 37eb426653..ae8ad88b0f 100644 --- a/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/CMakeLists_files.cmake +++ b/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/CMakeLists_files.cmake @@ -1,19 +1,17 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RivWindowEdgeAxesOverlayItem.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivWindowEdgeAxesOverlayItem.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RivWindowEdgeAxesOverlayItem.cpp - +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RivWindowEdgeAxesOverlayItem.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ModelVisualization\\WindowEdgeAxesOverlayItem" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ModelVisualization\\WindowEdgeAxesOverlayItem" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/RivWindowEdgeAxesOverlayItem.cpp b/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/RivWindowEdgeAxesOverlayItem.cpp index f1a9725adc..c585c8f269 100644 --- a/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/RivWindowEdgeAxesOverlayItem.cpp +++ b/ApplicationLibCode/ModelVisualization/WindowEdgeAxesOverlayItem/RivWindowEdgeAxesOverlayItem.cpp @@ -132,6 +132,9 @@ void RivWindowEdgeAxesOverlayItem::updateFromCamera( const Camera* camera ) windowMaxInDomain = m_dispalyCoordsTransform->transformToDomainCoord( windowMaxInDomain ); } + // For extreme zoom factors we might end up with both variables as zero. Return to avoid divide by zero. + if ( windowOrigoInDomain == windowMaxInDomain ) return; + double domainMinX = windowOrigoInDomain.x(); double domainMaxX = windowMaxInDomain.x(); diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/CMakeLists_files.cmake index be9ce0b379..6a1a92f627 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/CMakeLists_files.cmake @@ -1,29 +1,27 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotDataEntry.h -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterItem.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotDataEntry.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterItem.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotDataEntry.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterItem.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotDataEntry.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnalysisPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotDataFilterItem.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND QT_MOC_HEADERS -) +list(APPEND QT_MOC_HEADERS) -source_group( "ProjectDataModel\\AnalysisPlots" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\AnalysisPlots" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp index 12b7521859..65048e9f08 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.cpp @@ -250,9 +250,9 @@ std::set RimAnalysisPlot::unfilteredAddresses() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAnalysisPlot::ensembleParameters() +std::set RimAnalysisPlot::ensembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); @@ -268,7 +268,7 @@ std::set RimAnalysisPlot::ensembleParameters() for ( RimSummaryCaseCollection* ensemble : ensembles ) { - std::vector parameters = ensemble->variationSortedEnsembleParameters(); + std::vector parameters = ensemble->variationSortedEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } @@ -278,15 +278,15 @@ std::set RimAnalysisPlot::ensembleParameters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimAnalysisPlot::ensembleParameter( const QString& ensembleParameterName ) +RigEnsembleParameter RimAnalysisPlot::ensembleParameter( const QString& ensembleParameterName ) { - std::set ensembleParms = ensembleParameters(); - for ( const EnsembleParameter& eParam : ensembleParms ) + std::set ensembleParms = ensembleParameters(); + for ( const RigEnsembleParameter& eParam : ensembleParms ) { if ( eParam.name == ensembleParameterName ) return eParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } //-------------------------------------------------------------------------------------------------- @@ -1095,7 +1095,7 @@ void RimAnalysisPlot::applyFilter( const RimPlotDataFilterItem* filter, { sumItemsToKeep = ( *filteredSummaryItems ); // Not filtering items - EnsembleParameter eParam = this->ensembleParameter( filter->ensembleParameterName() ); + RigEnsembleParameter eParam = this->ensembleParameter( filter->ensembleParameterName() ); for ( auto sumCase : ( *filteredSumCases ) ) { diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h index 0803d91d08..31cdff91d5 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlot.h @@ -23,6 +23,8 @@ #include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" +#include "RigEnsembleParameter.h" + #include "cafPdmPtrField.h" #include @@ -81,8 +83,8 @@ class RimAnalysisPlot : public RimPlot void setTimeSteps( const std::vector& timeSteps ); std::set unfilteredAddresses(); - std::set ensembleParameters(); - EnsembleParameter ensembleParameter( const QString& ensembleParameterName ); + std::set ensembleParameters(); + RigEnsembleParameter ensembleParameter( const QString& ensembleParameterName ); void maxMinValueFromAddress( const RifEclipseSummaryAddress& address, RimPlotDataFilterItem::TimeStepSourceType timeStepSourceType, diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp index d4d444ab97..394fe93dec 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotCollection.cpp @@ -35,7 +35,7 @@ RimAnalysisPlotCollection::RimAnalysisPlotCollection() CAF_PDM_InitObject( "Analysis Plots", ":/AnalysisPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_analysisPlots, "AnalysisPlots", "Analysis Plots", "", "", "" ); - m_analysisPlots.uiCapability()->setUiHidden( true ); + m_analysisPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotDataEntry.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotDataEntry.cpp index 6d0abfe119..35e75f1e50 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotDataEntry.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimAnalysisPlotDataEntry.cpp @@ -44,7 +44,7 @@ RimAnalysisPlotDataEntry::RimAnalysisPlotDataEntry() m_ensemble.uiCapability()->setAutoAddingOptionFromValue( false ); CAF_PDM_InitFieldNoDefault( &m_summaryAddress, "SummaryAddress", "Summary Address", "", "", "" ); - m_summaryAddress.uiCapability()->setUiHidden( true ); + m_summaryAddress.uiCapability()->setUiTreeHidden( true ); m_summaryAddress.uiCapability()->setUiTreeChildrenHidden( true ); m_summaryAddress = new RimSummaryAddress; diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp index 05c8babb82..2b7d382f7b 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.cpp @@ -298,8 +298,8 @@ QList { if ( m_filterTarget() == ENSEMBLE_CASE ) { - std::set ensembleParams = parentPlot->ensembleParameters(); - for ( const EnsembleParameter& ensParam : ensembleParams ) + std::set ensembleParams = parentPlot->ensembleParameters(); + for ( const RigEnsembleParameter& ensParam : ensembleParams ) { options.push_back( caf::PdmOptionItemInfo( ensParam.uiName(), ensParam.name ) ); } @@ -307,7 +307,7 @@ QList } else if ( fieldNeedingOptions == &m_ensembleParameterValueCategories ) { - EnsembleParameter eParm = selectedEnsembleParameter(); + RigEnsembleParameter eParm = selectedEnsembleParameter(); if ( eParm.isText() ) { for ( const auto& val : eParm.values ) @@ -359,7 +359,7 @@ void RimPlotDataFilterItem::defineUiOrdering( QString uiConfigName, caf::PdmUiOr } } - EnsembleParameter eParm; + RigEnsembleParameter eParm; if ( m_filterTarget() == ENSEMBLE_CASE ) { eParm = selectedEnsembleParameter(); @@ -430,14 +430,14 @@ void RimPlotDataFilterItem::updateMaxMinAndDefaultValues( bool forceDefault ) { if ( !selectedEnsembleParameter().isValid() ) { - std::set ensembleParams = parentPlot->ensembleParameters(); + std::set ensembleParams = parentPlot->ensembleParameters(); if ( !ensembleParams.empty() ) { m_filterEnsembleParameter = ensembleParams.begin()->name; } } - EnsembleParameter eParam = selectedEnsembleParameter(); + RigEnsembleParameter eParam = selectedEnsembleParameter(); if ( eParam.isValid() && eParam.isNumeric() ) { if ( RiaCurveDataTools::isValidValue( eParam.minValue, false ) ) @@ -475,7 +475,7 @@ void RimPlotDataFilterItem::updateMaxMinAndDefaultValues( bool forceDefault ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimPlotDataFilterItem::selectedEnsembleParameter() const +RigEnsembleParameter RimPlotDataFilterItem::selectedEnsembleParameter() const { RimAnalysisPlot* parentPlot; this->firstAncestorOrThisOfTypeAsserted( parentPlot ); diff --git a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h index ed4fecbeb9..a145ebf03a 100644 --- a/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h +++ b/ApplicationLibCode/ProjectDataModel/AnalysisPlots/RimPlotDataFilterItem.h @@ -26,7 +26,7 @@ #include "RifEclipseSummaryAddress.h" #include "RifEclipseSummaryAddressQMetaType.h" -#include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" #include @@ -116,7 +116,7 @@ class RimPlotDataFilterItem : public caf::PdmObject QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; - EnsembleParameter selectedEnsembleParameter() const; + RigEnsembleParameter selectedEnsembleParameter() const; caf::PdmField m_isActive; diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake index b32f471b2d..4366ff8992 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Annotations/CMakeLists_files.cmake @@ -1,55 +1,51 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollectionBase.h -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationLineAppearance.h -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationTextAppearance.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotationInView.h -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotationInView.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotationInView.h -${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotationInView.h -${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.h -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.h -) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollectionBase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationLineAppearance.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationTextAppearance.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotationInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotationInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotationInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotationInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.cpp +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollectionBase.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationLineAppearance.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationTextAppearance.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotationInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotationInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotationInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotationInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.h ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollectionBase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationLineAppearance.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationTextAppearance.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesFromFileAnnotationInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedPolylinesAnnotationInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesAnnotationInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimReachCircleAnnotationInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTextAnnotationInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAnnotationGroupCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolylineTarget.cpp ) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -set (QT_MOC_HEADERS -${QT_MOC_HEADERS} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) +set(QT_MOC_HEADERS ${QT_MOC_HEADERS}) -source_group( "ProjectDataModel\\Annotations" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Annotations" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp index fa6246062b..c97eb9aaa8 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollection.cpp @@ -52,9 +52,9 @@ RimAnnotationCollection::RimAnnotationCollection() "" ); CAF_PDM_InitFieldNoDefault( &m_polylineFromFileAnnotations, "PolylineFromFileAnnotations", "Polylines From File", "", "", "" ); - m_reachCircleAnnotations.uiCapability()->setUiHidden( true ); - m_userDefinedPolylineAnnotations.uiCapability()->setUiHidden( true ); - m_polylineFromFileAnnotations.uiCapability()->setUiHidden( true ); + m_reachCircleAnnotations.uiCapability()->setUiTreeHidden( true ); + m_userDefinedPolylineAnnotations.uiCapability()->setUiTreeHidden( true ); + m_polylineFromFileAnnotations.uiCapability()->setUiTreeHidden( true ); m_reachCircleAnnotations = new RimAnnotationGroupCollection(); m_userDefinedPolylineAnnotations = new RimAnnotationGroupCollection(); diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp index 95a7d78018..141f9c30b8 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.cpp @@ -43,7 +43,7 @@ RimAnnotationCollectionBase::RimAnnotationCollectionBase() CAF_PDM_InitFieldNoDefault( &m_textAnnotations, "TextAnnotations", "Text Annotations", "", "", "" ); - m_textAnnotations.uiCapability()->setUiHidden( true ); + m_textAnnotations.uiCapability()->setUiTreeHidden( true ); m_textAnnotations = new RimAnnotationGroupCollection(); m_textAnnotations->uiCapability()->setUiName( RimAnnotationGroupCollection::TEXT_ANNOTATION_UI_NAME ); m_textAnnotations->uiCapability()->setUiIconFromResourceString( ":/TextAnnotation16x16.png" ); @@ -73,6 +73,14 @@ void RimAnnotationCollectionBase::addAnnotation( RimTextAnnotation* annotation ) updateViewAnnotationCollections(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnnotationCollectionBase::removeAnnotation( RimTextAnnotation* annotation ) +{ + m_textAnnotations->removeAnnotation( annotation ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.h index 8cd17def5c..cee61c5c73 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationCollectionBase.h @@ -44,6 +44,7 @@ class RimAnnotationCollectionBase : public caf::PdmObject bool isActive() const; void addAnnotation( RimTextAnnotation* annotation ); + void removeAnnotation( RimTextAnnotation* annotation ); std::vector textAnnotations() const; diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.cpp index d49dd2bac2..7b261a9d24 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.cpp @@ -50,7 +50,7 @@ RimAnnotationGroupCollection::RimAnnotationGroupCollection() CAF_PDM_InitFieldNoDefault( &m_annotations, "Annotations", "Annotations", "", "", "" ); m_isActive.uiCapability()->setUiHidden( true ); - m_annotations.uiCapability()->setUiHidden( true ); + m_annotations.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -90,6 +90,14 @@ void RimAnnotationGroupCollection::addAnnotation( caf::PdmObject* annotation ) m_annotations.push_back( annotation ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimAnnotationGroupCollection::removeAnnotation( caf::PdmObject* annotation ) +{ + m_annotations.removeChildObject( annotation ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.h index 229989eb4d..10c01b7cb3 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationGroupCollection.h @@ -52,6 +52,7 @@ class RimAnnotationGroupCollection : public caf::PdmObject bool isVisible() const; void addAnnotation( caf::PdmObject* annotation ); + void removeAnnotation( caf::PdmObject* annotation ); std::vector annotations() const; protected: diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp index bd6bcb12a6..47229d8f1e 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationInViewCollection.cpp @@ -108,10 +108,10 @@ RimAnnotationInViewCollection::RimAnnotationInViewCollection() CAF_PDM_InitFieldNoDefault( &m_annotationFontSize, "AnnotationFontSize", "Default Font Size", "", "", "" ); - m_globalTextAnnotations.uiCapability()->setUiHidden( true ); - m_globalReachCircleAnnotations.uiCapability()->setUiHidden( true ); - m_globalUserDefinedPolylineAnnotations.uiCapability()->setUiHidden( true ); - m_globalPolylineFromFileAnnotations.uiCapability()->setUiHidden( true ); + m_globalTextAnnotations.uiCapability()->setUiTreeHidden( true ); + m_globalReachCircleAnnotations.uiCapability()->setUiTreeHidden( true ); + m_globalUserDefinedPolylineAnnotations.uiCapability()->setUiTreeHidden( true ); + m_globalPolylineFromFileAnnotations.uiCapability()->setUiTreeHidden( true ); m_globalTextAnnotations = new RimAnnotationGroupCollection(); m_globalReachCircleAnnotations = new RimAnnotationGroupCollection(); diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp index fe6aa394eb..1f3b55dde6 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.cpp @@ -61,6 +61,7 @@ CAF_PDM_SOURCE_INIT( RimAnnotationLineAppearance, "RimAnnotationLineAppearance" /// //-------------------------------------------------------------------------------------------------- RimAnnotationLineAppearance::RimAnnotationLineAppearance() + : objectChanged( this ) { CAF_PDM_InitObject( "AnnotationLineAppearance", ":/WellCollection.png", "", "" ); @@ -139,8 +140,10 @@ void RimAnnotationLineAppearance::fieldChangedByUi( const caf::PdmFieldHandle* c const QVariant& newValue ) { RimAnnotationCollection* annColl = nullptr; - this->firstAncestorOrThisOfTypeAsserted( annColl ); - annColl->scheduleRedrawOfRelevantViews(); + this->firstAncestorOrThisOfType( annColl ); + if ( annColl ) annColl->scheduleRedrawOfRelevantViews(); + + objectChanged.send(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h index e59c9f75d5..ebb3616ace 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimAnnotationLineAppearance.h @@ -33,6 +33,9 @@ class RimAnnotationLineAppearance : public caf::PdmObject { CAF_PDM_HEADER_INIT; +public: + caf::Signal<> objectChanged; + public: enum LineStyleEnum { diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.cpp b/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.cpp index b87f16a251..435d332b39 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.cpp +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.cpp @@ -121,11 +121,3 @@ void RimPolylineTarget::triggerVisualizationUpdate() const firstAncestorOrThisOfTypeAsserted( ppInterface ); if ( ppInterface ) ppInterface->updateVisualization(); } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimPolylineTarget::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) -{ - m_targetPointXyd.uiCapability()->setUiReadOnly( m_isEnabled() ); -} diff --git a/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.h b/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.h index 343e6854ae..a094c6e9ba 100644 --- a/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.h +++ b/ApplicationLibCode/ProjectDataModel/Annotations/RimPolylineTarget.h @@ -53,7 +53,6 @@ class RimPolylineTarget : public caf::PdmObject QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; private: bool m_isFullUpdateEnabled; diff --git a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake index 0a298bdc7c..0cbdbde466 100644 --- a/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CMakeLists_files.cmake @@ -1,343 +1,270 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimCaseCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimLegendConfigChangeType.h -${CMAKE_CURRENT_LIST_DIR}/RimRegularLegendConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimOilField.h -${CMAKE_CURRENT_LIST_DIR}/RimProject.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCase.h -${CMAKE_CURRENT_LIST_DIR}/RimIdenticalGridCaseGroup.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputProperty.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputPropertyCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputCase.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultCase.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseView.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCellColors.h -${CMAKE_CURRENT_LIST_DIR}/RimCellEdgeColors.h -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInView.h -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewTools.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPath.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathGroup.h -${CMAKE_CURRENT_LIST_DIR}/RimFileWellPath.h -${CMAKE_CURRENT_LIST_DIR}/RimModeledWellPath.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurement.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilePath.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDef.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttribute.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttributeCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathTarget.h -${CMAKE_CURRENT_LIST_DIR}/RimScriptCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCase.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimCalcScript.h -${CMAKE_CURRENT_LIST_DIR}/RimExportInputPropertySettings.h -${CMAKE_CURRENT_LIST_DIR}/RimBinaryExportSettings.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dOverlayInfoConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimHistogramCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimTensorResults.h -${CMAKE_CURRENT_LIST_DIR}/RimReservoirCellResultsStorage.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseEvaluator.h -${CMAKE_CURRENT_LIST_DIR}/RimMimeData.h -${CMAKE_CURRENT_LIST_DIR}/RimCommandObject.h -${CMAKE_CURRENT_LIST_DIR}/RimTools.h -${CMAKE_CURRENT_LIST_DIR}/RimFormationNames.h -${CMAKE_CURRENT_LIST_DIR}/RimFormationNamesCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimMockModelSettings.h -${CMAKE_CURRENT_LIST_DIR}/RimTernaryLegendConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseFaultColors.h -${CMAKE_CURRENT_LIST_DIR}/RimViewWindow.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dView.h -${CMAKE_CURRENT_LIST_DIR}/RimGridView.h -${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionView.h -${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimViewManipulator.h -${CMAKE_CURRENT_LIST_DIR}/RimCase.h -${CMAKE_CURRENT_LIST_DIR}/RimViewController.h -${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimVfpPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimVfpPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimVfpDefines.h -${CMAKE_CURRENT_LIST_DIR}/RimPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotWindow.h -${CMAKE_CURRENT_LIST_DIR}/RimMultiPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimDepthTrackPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWbsParameters.h -${CMAKE_CURRENT_LIST_DIR}/RimViewLinker.h -${CMAKE_CURRENT_LIST_DIR}/RimViewLinkerCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFile.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileChannel.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogWbsCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimIntersection.h -${CMAKE_CURRENT_LIST_DIR}/RimExtrudedCurveIntersection.h -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultsDefinitionCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimContextCommandBuilder.h -${CMAKE_CURRENT_LIST_DIR}/RimGridCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimStackablePlotCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimBoxIntersection.h -${CMAKE_CURRENT_LIST_DIR}/RimAdvancedSnapshotExportDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RimMdiWindowController.h -${CMAKE_CURRENT_LIST_DIR}/RimNamedObject.h -${CMAKE_CURRENT_LIST_DIR}/RimCheckableNamedObject.h -${CMAKE_CURRENT_LIST_DIR}/RimCheckableObject.h -${CMAKE_CURRENT_LIST_DIR}/RimGridTimeHistoryCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimGeometrySelectionItem.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseGeometrySelectionItem.h -${CMAKE_CURRENT_LIST_DIR}/RimDialogData.h -${CMAKE_CURRENT_LIST_DIR}/RimTimeStepFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculation.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationVariable.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanLegendConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanColors.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurve.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogFileCurve.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.h -${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurveNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurveNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimDataSourceSteppingTools.h -${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveCommonDataSource.h -${CMAKE_CURRENT_LIST_DIR}/RimContourMapProjection.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapProjection.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapView.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimMudWeightWindowParameters.h -${CMAKE_CURRENT_LIST_DIR}/RimViewNameConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.h -${CMAKE_CURRENT_LIST_DIR}/RimMultiPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.h -${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.h -${CMAKE_CURRENT_LIST_DIR}/RimColorLegendCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.h -${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.h -${CMAKE_CURRENT_LIST_DIR}/RimAbstractPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinePickerInterface.h -${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.h -${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.h -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.h -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.h -${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.h -${CMAKE_CURRENT_LIST_DIR}/RimPolylinesDataInterface.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathTieIn.h -${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimCaseCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimLegendConfigChangeType.h + ${CMAKE_CURRENT_LIST_DIR}/RimRegularLegendConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimOilField.h + ${CMAKE_CURRENT_LIST_DIR}/RimProject.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimIdenticalGridCaseGroup.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputProperty.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputPropertyCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseView.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCellColors.h + ${CMAKE_CURRENT_LIST_DIR}/RimCellEdgeColors.h + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimScriptCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimCalcScript.h + ${CMAKE_CURRENT_LIST_DIR}/RimExportInputPropertySettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimBinaryExportSettings.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dOverlayInfoConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimHistogramCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimTensorResults.h + ${CMAKE_CURRENT_LIST_DIR}/RimReservoirCellResultsStorage.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseEvaluator.h + ${CMAKE_CURRENT_LIST_DIR}/RimMimeData.h + ${CMAKE_CURRENT_LIST_DIR}/RimCommandObject.h + ${CMAKE_CURRENT_LIST_DIR}/RimTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimFormationNames.h + ${CMAKE_CURRENT_LIST_DIR}/RimFormationNamesCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimMockModelSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimTernaryLegendConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseFaultColors.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewWindow.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dView.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridView.h + ${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionView.h + ${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewManipulator.h + ${CMAKE_CURRENT_LIST_DIR}/RimCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewController.h + ${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimVfpPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimVfpPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimVfpDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RimMultiPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimDepthTrackPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWbsParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewLinker.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewLinkerCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimContextCommandBuilder.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCurveAppearance.h + ${CMAKE_CURRENT_LIST_DIR}/RimStackablePlotCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimAdvancedSnapshotExportDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RimMdiWindowController.h + ${CMAKE_CURRENT_LIST_DIR}/RimNamedObject.h + ${CMAKE_CURRENT_LIST_DIR}/RimCheckableNamedObject.h + ${CMAKE_CURRENT_LIST_DIR}/RimCheckableObject.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridTimeHistoryCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeometrySelectionItem.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseGeometrySelectionItem.h + ${CMAKE_CURRENT_LIST_DIR}/RimDialogData.h + ${CMAKE_CURRENT_LIST_DIR}/RimTimeStepFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculation.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationVariable.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanLegendConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanColors.h + ${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.h + ${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimDataSourceSteppingTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapView.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimMudWeightWindowParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RimViewNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.h + ${CMAKE_CURRENT_LIST_DIR}/RimMultiPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.h + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegendCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.h + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.h + ${CMAKE_CURRENT_LIST_DIR}/RimAbstractPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinePickerInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.h + ${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.h + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.h + ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolylinesDataInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetInterface.h + ${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.h + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleLocations.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionBand.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCollection.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCaseCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimRegularLegendConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimOilField.cpp -${CMAKE_CURRENT_LIST_DIR}/RimProject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIdenticalGridCaseGroup.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputProperty.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputPropertyCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseCellColors.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCellEdgeColors.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPath.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathGroup.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFileWellPath.cpp -${CMAKE_CURRENT_LIST_DIR}/RimModeledWellPath.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurement.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilePath.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDef.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttribute.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttributeCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathTarget.cpp -${CMAKE_CURRENT_LIST_DIR}/RimScriptCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCalcScript.cpp -${CMAKE_CURRENT_LIST_DIR}/RimExportInputPropertySettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimBinaryExportSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dOverlayInfoConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimHistogramCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTensorResults.cpp -${CMAKE_CURRENT_LIST_DIR}/RimReservoirCellResultsStorage.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseEvaluator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMimeData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCommandObject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFormationNames.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFormationNamesCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMockModelSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTernaryLegendConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseFaultColors.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMudWeightWindowParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridView.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionView.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewManipulator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewController.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimVfpPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimVfpPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimVfpDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMultiPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDepthTrackPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWbsParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewLinker.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewLinkerCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFile.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileChannel.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogWbsCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIntersection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimExtrudedCurveIntersection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultsDefinitionCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimContextCommandBuilder.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStackablePlotCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimBoxIntersection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimAdvancedSnapshotExportDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMdiWindowController.cpp -${CMAKE_CURRENT_LIST_DIR}/RimNamedObject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCheckableNamedObject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCheckableObject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridTimeHistoryCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeometrySelectionItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseGeometrySelectionItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDialogData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTimeStepFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationVariable.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanLegendConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanColors.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogFileCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.cpp -${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurveNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurveNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDataSourceSteppingTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveCommonDataSource.cpp -${CMAKE_CURRENT_LIST_DIR}/RimContourMapProjection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapProjection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimViewNameConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMultiPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.cpp -${CMAKE_CURRENT_LIST_DIR}/RimColorLegendCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.cpp -${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathTieIn.cpp -${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCaseCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCaseCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimRegularLegendConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimOilField.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimProject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimIdenticalGridCaseGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputProperty.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputPropertyCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseInputCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseResultDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseCellColors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCellEdgeColors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellInViewTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimScriptCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCalcScript.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimExportInputPropertySettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimBinaryExportSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dOverlayInfoConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimHistogramCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTensorResults.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimReservoirCellResultsStorage.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseStatisticsCaseEvaluator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMimeData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCommandObject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFormationNames.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFormationNamesCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMockModelSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTernaryLegendConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseFaultColors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMudWeightWindowParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridView.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionView.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim2dIntersectionViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewManipulator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewController.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMainPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimRftPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPltPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimVfpPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimVfpPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimVfpDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMultiPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDepthTrackPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellBoreStabilityPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWbsParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewLinker.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewLinkerCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimContextCommandBuilder.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCurveAppearance.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStackablePlotCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimAdvancedSnapshotExportDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMdiWindowController.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimNamedObject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCheckableNamedObject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCheckableObject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridTimeHistoryCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeometrySelectionItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseGeometrySelectionItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDialogData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTimeStepFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCalculationVariable.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanLegendConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanColors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimVirtualPerforationResults.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimLegendConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDataSourceSteppingTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipseContourMapViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimViewNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimReloadCaseTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisPropertiesInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObservedDataCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObservedFmuRftData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMultiPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellDiskConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimElementVectorResult.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegendCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegend.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimColorLegendItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimVfpTableExtractor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCaseDisplayNameTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunction.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCustomObjectiveFunctionWeight.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEquilibriumAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTimeAxisAnnotation.cpp + ${CMAKE_CURRENT_LIST_DIR}/cafTreeNode.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleLocations.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionBand.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceIntersectionCollection.cpp ) if(Qt5Charts_FOUND) - list(APPEND SOURCE_GROUP_HEADER_FILES - ${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.h - ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlot.h - ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlotCollection.h - ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.h - ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.h) - + list( + APPEND + SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.h + ) - list(APPEND SOURCE_GROUP_SOURCE_FILES - ${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlot.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlotCollection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.cpp - ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.cpp) + list( + APPEND + SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStatisticsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridStatisticsPlot.cpp + ) endif() +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND QT_MOC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/RimPlot.h) -list(APPEND QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RimPlot.h +source_group( + "ProjectDataModel" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "ProjectDataModel" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CellFilters/CMakeLists_files.cmake index 981011eb8c..c0ed2d0dc4 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/CMakeLists_files.cmake @@ -1,40 +1,39 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimCellFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimCellFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimCellRangeFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPolygonFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimCellRangeFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPolygonFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimCellFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCellFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCellRangeFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPolygonFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCellRangeFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPropertyFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEclipsePropertyFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPropertyFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPolygonFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimUserDefinedFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCellFilterIntervalTool.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\CellFilters" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\CellFilters" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellFilterCollection.cpp index f4b1dd7fad..bd6f7a7852 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimCellFilterCollection.cpp @@ -32,7 +32,7 @@ #include "cafPdmObjectScriptingCapability.h" #include "cvfStructGridGeometryGenerator.h" -CAF_PDM_SOURCE_INIT( RimCellFilterCollection, "RimCellFilterCollection", "CellRangeFilterCollection" ); +CAF_PDM_SOURCE_INIT( RimCellFilterCollection, "CellFilterCollection", "RimCellFilterCollection", "CellRangeFilterCollection" ); //-------------------------------------------------------------------------------------------------- /// @@ -50,7 +50,7 @@ RimCellFilterCollection::RimCellFilterCollection() // for backwards project file compatibility with old CellRangeFilterCollection CAF_PDM_InitFieldNoDefault( &m_rangeFilters_OBSOLETE, "RangeFilters", "Range Filters", "", "", "" ); - m_rangeFilters_OBSOLETE.uiCapability()->setUiHidden( true ); + m_rangeFilters_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_rangeFilters_OBSOLETE.xmlCapability()->setIOWritable( false ); } diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp index e551ea976a..6cc4919c72 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilter.cpp @@ -60,7 +60,7 @@ RimEclipsePropertyFilter::RimEclipsePropertyFilter() // Set to hidden to avoid this item to been displayed as a child item // Fields in this object are displayed using defineUiOrdering() - m_resultDefinition.uiCapability()->setUiHidden( true ); + m_resultDefinition.uiCapability()->setUiTreeHidden( true ); m_resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &m_rangeLabelText, "Dummy_keyword", QString( "Range Type" ), "Range Type", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp index c119404c0c..abc71541b2 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimEclipsePropertyFilterCollection.cpp @@ -39,7 +39,7 @@ RimEclipsePropertyFilterCollection::RimEclipsePropertyFilterCollection() CAF_PDM_InitObject( "Property Filters", ":/CellFilter_Values.png", "", "" ); CAF_PDM_InitFieldNoDefault( &propertyFilters, "PropertyFilters", "Property Filters", "", "", "" ); - propertyFilters.uiCapability()->setUiHidden( true ); + propertyFilters.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilter.cpp index 2f68414526..1158810d24 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilter.cpp @@ -49,7 +49,7 @@ RimGeoMechPropertyFilter::RimGeoMechPropertyFilter() // Set to hidden to avoid this item to been displayed as a child item // Fields in this object are displayed using defineUiOrdering() - resultDefinition.uiCapability()->setUiHidden( true ); + resultDefinition.uiCapability()->setUiTreeHidden( true ); resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &lowerBound, "LowerBound", 0.0, "Min", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilterCollection.cpp index 46b9b7174c..a1ae588e36 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimGeoMechPropertyFilterCollection.cpp @@ -37,7 +37,7 @@ RimGeoMechPropertyFilterCollection::RimGeoMechPropertyFilterCollection() CAF_PDM_InitObject( "Property Filters", ":/CellFilter_Values.png", "", "" ); CAF_PDM_InitFieldNoDefault( &propertyFilters, "PropertyFilters", "Property Filters", "", "", "" ); - propertyFilters.uiCapability()->setUiHidden( true ); + propertyFilters.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp index 67d97fe4f4..baf82305aa 100644 --- a/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/CellFilters/RimPolygonFilter.cpp @@ -364,6 +364,7 @@ void RimPolygonFilter::defineCustomContextMenu( const caf::PdmFieldHandle* field caf::CmdFeatureMenuBuilder menuBuilder; menuBuilder << "RicDeletePolylineTargetFeature"; + menuBuilder << "RicAppendPointsToPolygonFilterFeature"; menuBuilder.appendToMenu( menu ); } diff --git a/ApplicationLibCode/ProjectDataModel/Completions/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Completions/CMakeLists_files.cmake index 1b4895bb55..954be3b55a 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Completions/CMakeLists_files.cmake @@ -1,82 +1,80 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimCompletionCellIntersectionCalc.h -${CMAKE_CURRENT_LIST_DIR}/RimFishbonesCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimFishbones.h -${CMAKE_CURRENT_LIST_DIR}/RimFishbonesPipeProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimFishboneWellPath.h -${CMAKE_CURRENT_LIST_DIR}/RimFishboneWellPathCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPerforationCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPerforationInterval.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletionSettings.h -${CMAKE_CURRENT_LIST_DIR}/RimEllipseFractureTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RimFracture.h -${CMAKE_CURRENT_LIST_DIR}/RimFractureContainment.h -${CMAKE_CURRENT_LIST_DIR}/RimFractureContainmentTools.h -${CMAKE_CURRENT_LIST_DIR}/RimFractureExportSettings.h -${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RimCompletionTemplateCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplateCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimValveTemplateCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimValveTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RimSimWellFracture.h -${CMAKE_CURRENT_LIST_DIR}/RimSimWellFractureCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanFractureTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathFracture.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathFractureCollection.h -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurveCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimMswCompletionParameters.h -${CMAKE_CURRENT_LIST_DIR}/RimNonDarcyPerforationParameters.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathComponentInterface.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathValve.h -${CMAKE_CURRENT_LIST_DIR}/RimMultipleValveLocations.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAicdParameters.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatistics.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsCollection.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimCompletionCellIntersectionCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RimFishbonesCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimFishbones.h + ${CMAKE_CURRENT_LIST_DIR}/RimFishbonesPipeProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimFishboneWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimFishboneWellPathCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPerforationCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPerforationInterval.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletionSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimEllipseFractureTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimFracture.h + ${CMAKE_CURRENT_LIST_DIR}/RimFractureContainment.h + ${CMAKE_CURRENT_LIST_DIR}/RimFractureContainmentTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimFractureExportSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimCompletionTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimValveTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimValveTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellFracture.h + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellFractureCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanFractureTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathFracture.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathFractureCollection.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurveCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimMswCompletionParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RimNonDarcyPerforationParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathComponentInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathValve.h + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleValveLocations.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAicdParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatistics.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsCollection.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimCompletionCellIntersectionCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFishbonesCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFishbones.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFishbonesPipeProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPerforationCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPerforationInterval.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletionSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEllipseFractureTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFracture.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFractureContainment.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFractureContainmentTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFractureExportSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCompletionTemplateCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplateCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimValveTemplateCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimValveTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSimWellFracture.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSimWellFractureCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanFractureTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathFracture.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathFractureCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurveCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMswCompletionParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RimNonDarcyPerforationParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathValve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimMultipleValveLocations.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathAicdParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatistics.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsCollection.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimCompletionCellIntersectionCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFishbonesCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFishbones.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFishbonesPipeProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPerforationCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPerforationInterval.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletionSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEllipseFractureTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFracture.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFractureContainment.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFractureContainmentTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFractureExportSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCompletionTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFractureTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimValveTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimValveTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellFracture.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSimWellFractureCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanFractureTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathFracture.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathFractureCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurveCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMswCompletionParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimNonDarcyPerforationParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathValve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimMultipleValveLocations.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAicdParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatistics.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleFractureStatisticsCollection.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Completions" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Completions" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimCompletionTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimCompletionTemplateCollection.cpp index 926924cff9..0df5e53e38 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimCompletionTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimCompletionTemplateCollection.cpp @@ -18,8 +18,6 @@ #include "RimCompletionTemplateCollection.h" -#include "RiaApplication.h" - #include "RimEnsembleFractureStatisticsCollection.h" #include "RimFractureTemplateCollection.h" #include "RimStimPlanModelTemplateCollection.h" @@ -147,16 +145,10 @@ const RimEnsembleFractureStatisticsCollection* RimCompletionTemplateCollection:: void RimCompletionTemplateCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName /*= ""*/ ) { - uiTreeOrdering.add( m_fractureTemplates ); - if ( RiaApplication::enableDevelopmentFeatures() ) - { - uiTreeOrdering.add( m_stimPlanModelTemplates ); - } uiTreeOrdering.add( m_valveTemplates ); - if ( RiaApplication::enableDevelopmentFeatures() ) - { - uiTreeOrdering.add( m_fractureGroupStatisticsCollection ); - } + uiTreeOrdering.add( m_fractureTemplates ); + uiTreeOrdering.add( m_stimPlanModelTemplates ); + uiTreeOrdering.add( m_fractureGroupStatisticsCollection ); uiTreeOrdering.skipRemainingChildren( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp index 75b3cacc14..9a3fb5073a 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEllipseFractureTemplate.cpp @@ -229,9 +229,6 @@ cvf::cref RimEllipseFractureTemplate::createFractureGrid( doubl ( cellPolygon[1].y() <= 0.0 && cellPolygon[2].y() >= 0.0 ) ) { wellCenterFractureCellIJ = std::make_pair( fractureCell.getI(), fractureCell.getJ() ); - RiaLogging::debug( - QString( "Setting wellCenterStimPlanCell at cell %1, %2" ) - .arg( QString::number( fractureCell.getI() ), QString::number( fractureCell.getJ() ) ) ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp index 82c98c97bb..d04e78140e 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.cpp @@ -22,6 +22,7 @@ #include "RiaDefines.h" #include "RiaInterpolationTools.h" #include "RiaLogging.h" +#include "RiaNumberFormat.h" #include "RiaPreferences.h" #include "RiaWeightedGeometricMeanCalculator.h" #include "RiaWeightedHarmonicMeanCalculator.h" @@ -33,6 +34,9 @@ #include "RigStatisticsMath.h" #include "RigStimPlanFractureDefinition.h" +#ifdef USE_QTCHARTS +#include "RimEnsembleFractureStatisticsPlot.h" +#endif #include "RimFractureTemplateCollection.h" #include "RimHistogramCalculator.h" #include "RimProject.h" @@ -45,6 +49,7 @@ #include "FractureCommands/RicNewStimPlanFractureTemplateFeature.h" #include "cafAppEnum.h" +#include "cafPdmUiLineEditor.h" #include "cafPdmUiTextEditor.h" #include "cafPdmUiToolButtonEditor.h" #include "cafPdmUiTreeSelectionEditor.h" @@ -53,6 +58,7 @@ #include #include +#include namespace caf { @@ -125,6 +131,14 @@ RimEnsembleFractureStatistics::RimEnsembleFractureStatistics() m_filePathsTable.uiCapability()->setUiReadOnly( true ); m_filePathsTable.xmlCapability()->disableIO(); + CAF_PDM_InitField( &m_excludeZeroWidthFractures, + "ExcludeZeroWidthFractures", + true, + "Exclude Zero Width Fractures", + "", + "", + "" ); + CAF_PDM_InitFieldNoDefault( &m_statisticsTable, "StatisticsTable", "Statistics Table", "", "", "" ); m_statisticsTable.uiCapability()->setUiEditorTypeName( caf::PdmUiTextEditor::uiEditorTypeName() ); m_statisticsTable.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); @@ -170,7 +184,6 @@ RimEnsembleFractureStatistics::~RimEnsembleFractureStatistics() void RimEnsembleFractureStatistics::addFilePath( const QString& filePath ) { m_filePaths.v().push_back( filePath ); - loadAndUpdateData(); } //-------------------------------------------------------------------------------------------------- @@ -245,6 +258,16 @@ void RimEnsembleFractureStatistics::defineEditorAttribute( const caf::PdmFieldHa myAttr->textMode = caf::PdmUiTextEditorAttribute::HTML; } } + else if ( field == &m_adaptiveNumLayers || field == &m_numSamplesX || field == &m_numSamplesY ) + { + caf::PdmUiLineEditorAttribute* lineEditorAttr = dynamic_cast( attribute ); + if ( lineEditorAttr ) + { + // Positive integer + QIntValidator* validator = new QIntValidator( 1, std::numeric_limits::max(), nullptr ); + lineEditorAttr->validator = validator; + } + } } //-------------------------------------------------------------------------------------------------- @@ -272,6 +295,21 @@ void RimEnsembleFractureStatistics::fieldChangedByUi( const caf::PdmFieldHandle* RimProject::current()->scheduleCreateDisplayModelAndRedrawAllViews(); } } + else if ( changedField == &m_excludeZeroWidthFractures ) + { + loadAndUpdateData(); + +#ifdef USE_QTCHARTS + // Update referring plots + std::vector referringObjects; + this->objectsWithReferringPtrFields( referringObjects ); + for ( caf::PdmObjectHandle* obj : referringObjects ) + { + auto plot = dynamic_cast( obj ); + if ( plot ) plot->loadDataAndUpdate(); + } +#endif + } } //-------------------------------------------------------------------------------------------------- @@ -281,6 +319,7 @@ void RimEnsembleFractureStatistics::defineUiOrdering( QString uiConfigName, caf: { caf::PdmUiOrdering* settingsGroup = uiOrdering.addNewGroup( "Settings" ); settingsGroup->add( nameField() ); + settingsGroup->add( &m_excludeZeroWidthFractures ); settingsGroup->add( &m_meshAlignmentType ); settingsGroup->add( &m_meshType ); settingsGroup->add( &m_numSamplesX ); @@ -321,6 +360,24 @@ void RimEnsembleFractureStatistics::loadAndUpdateData() std::vector> stimPlanFractureDefinitions = readFractureDefinitions( m_filePaths.v(), unitSystem ); + // Log area for each fracture for debugging + std::vector area = + RigEnsembleFractureStatisticsCalculator::calculateProperty( stimPlanFractureDefinitions, + RigEnsembleFractureStatisticsCalculator::PropertyType::AREA ); + for ( size_t i = 0; i < m_filePaths.v().size(); i++ ) + { + RiaLogging::info( QString( "%1 Area: %2" ).arg( m_filePaths.v()[i].path() ).arg( area[i] ) ); + } + + if ( m_excludeZeroWidthFractures() ) + { + size_t numBeforeFiltering = stimPlanFractureDefinitions.size(); + stimPlanFractureDefinitions = + RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( stimPlanFractureDefinitions ); + size_t numRemoved = numBeforeFiltering - stimPlanFractureDefinitions.size(); + RiaLogging::info( QString( "Excluded %1 zero width fractures." ).arg( numRemoved ) ); + } + m_statisticsTable = generateStatisticsTable( stimPlanFractureDefinitions ); } @@ -334,6 +391,12 @@ std::vector RimEnsembleFractureStatistics::computeStatistics() std::vector> stimPlanFractureDefinitions = readFractureDefinitions( m_filePaths.v(), unitSystem ); + if ( m_excludeZeroWidthFractures() ) + { + stimPlanFractureDefinitions = + RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( stimPlanFractureDefinitions ); + } + std::set> availableResults = findAllResultNames( stimPlanFractureDefinitions ); std::map, std::shared_ptr> statisticsGridsAll; @@ -344,11 +407,17 @@ std::vector RimEnsembleFractureStatistics::computeStatistics() double timeStep = 1.0; double referenceDepth = 0.0; + + RigStimPlanFractureDefinition::Orientation orientation = RigStimPlanFractureDefinition::Orientation::UNDEFINED; if ( m_meshAlignmentType() == MeshAlignmentType::PERFORATION_DEPTH ) { for ( auto definition : stimPlanFractureDefinitions ) { referenceDepth += computeDepthOfWellPathAtFracture( definition ); + // Take the first orientation which is defined (all the fractures + // should have the same orientation). + if ( orientation == RigStimPlanFractureDefinition::Orientation::UNDEFINED ) + orientation = definition->orientation(); } referenceDepth /= stimPlanFractureDefinitions.size(); } @@ -366,11 +435,27 @@ std::vector RimEnsembleFractureStatistics::computeStatistics() std::vector> fractureGrids = createFractureGrids( stimPlanFractureDefinitions, unitSystem, result.first, m_meshAlignmentType() ); + double numBins = 50; + RigHistogramData areaHistogramData = + RigEnsembleFractureStatisticsCalculator::createStatisticsData( stimPlanFractureDefinitions, + RigEnsembleFractureStatisticsCalculator::PropertyType::AREA, + numBins ); + std::vector> samples( gridXs.size() * gridYs.size() ); - sampleAllGrids( fractureGrids, gridXs, gridYs, samples ); + std::shared_ptr areaGrid = std::make_shared( gridXs.size(), gridYs.size() ); + std::shared_ptr distanceGrid = std::make_shared( gridXs.size(), gridYs.size() ); + sampleAllGrids( fractureGrids, gridXs, gridYs, samples, areaGrid, distanceGrid ); std::map> statisticsGrids; - generateStatisticsGrids( samples, gridXs.size(), gridYs.size(), fractureGrids.size(), statisticsGrids, selectedStatistics ); + generateStatisticsGrids( samples, + gridXs.size(), + gridYs.size(), + fractureGrids.size(), + statisticsGrids, + selectedStatistics, + areaHistogramData, + areaGrid, + distanceGrid ); for ( auto [statType, slice] : statisticsGrids ) { @@ -421,7 +506,8 @@ std::vector RimEnsembleFractureStatistics::computeStatistics() gridXs, gridYsWithOffset, timeStep, - unitSystem ); + unitSystem, + orientation ); xmlFilePaths.push_back( xmlFilePath ); } @@ -471,6 +557,14 @@ std::vector> return results; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleFractureStatistics::excludeZeroWidthFractures() const +{ + return m_excludeZeroWidthFractures; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -595,6 +689,9 @@ void RimEnsembleFractureStatistics::generateUniformMesh( double mi std::vector& gridXs, std::vector& gridYs ) const { + CAF_ASSERT( m_numSamplesX > 0 ); + CAF_ASSERT( m_numSamplesY > 0 ); + int numSamplesX = m_numSamplesX(); double sampleDistanceX = linearSampling( minX, maxX, numSamplesX, gridXs ); @@ -856,7 +953,11 @@ void RimEnsembleFractureStatistics::generateAllLayers( int RimEnsembleFractureStatistics::getTargetNumberOfLayers( const std::vector>& stimPlanFractureDefinitions ) const { - if ( m_adaptiveNumLayersType() == AdaptiveNumLayersType::USER_DEFINED ) return m_adaptiveNumLayers(); + if ( m_adaptiveNumLayersType() == AdaptiveNumLayersType::USER_DEFINED ) + { + CAF_ASSERT( m_adaptiveNumLayers() > 0 ); + return m_adaptiveNumLayers(); + } int maxNy = 0; int minNy = std::numeric_limits::max(); @@ -888,6 +989,7 @@ double RimEnsembleFractureStatistics::linearSampling( double minVa int numSamples, std::vector& samples ) { + CAF_ASSERT( numSamples > 0 ); double sampleDistance = ( maxValue - minValue ) / numSamples; for ( int s = 0; s < numSamples; s++ ) @@ -899,17 +1001,6 @@ double RimEnsembleFractureStatistics::linearSampling( double minVa return sampleDistance; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool RimEnsembleFractureStatistics::isCoordinateInsideFractureCell( double x, double y, const RigFractureCell& cell ) -{ - const cvf::Vec3d& minPoint = cell.getPolygon()[0]; - const cvf::Vec3d& maxPoint = cell.getPolygon()[2]; - // TODO: Investigate strange ordering for y coords. - return ( x > minPoint.x() && x <= maxPoint.x() && y <= minPoint.y() && y > maxPoint.y() ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -937,28 +1028,68 @@ double RimEnsembleFractureStatistics::computeDepthOfWellPathAtFracture( void RimEnsembleFractureStatistics::sampleAllGrids( const std::vector>& fractureGrids, const std::vector& samplesX, const std::vector& samplesY, - std::vector>& samples ) + std::vector>& samples, + std::shared_ptr areaGrid, + std::shared_ptr distanceGrid ) { - for ( size_t y = 0; y < samplesY.size(); y++ ) + auto computeCellSideLength = []( const std::vector& values, size_t idx ) { + if ( idx < values.size() - 1 ) + return values[idx + 1] - values[idx]; + else + return values[1] - values[0]; + }; + + const int ny = static_cast( samplesY.size() ); +#pragma omp parallel for + for ( int y = 0; y < ny; y++ ) { for ( size_t x = 0; x < samplesX.size(); x++ ) { - double posX = samplesX[x]; - double posY = samplesY[y]; + // Position of cell center + const cvf::Vec3d pos( samplesX[x], samplesY[y], 0.0 ); + const size_t idx = y * samplesX.size() + x; + double sumDistance = 0.0; for ( auto fractureGrid : fractureGrids ) { - for ( auto fractureCell : fractureGrid->fractureCells() ) + // Sample each fracture grid at a given position + const RigFractureCell* fractureCell = fractureGrid->getCellFromPosition( pos ); + if ( fractureCell ) + { + double value = fractureCell->getConductivityValue(); + if ( !std::isinf( value ) ) samples[idx].push_back( value ); + } + + // Find distance to the fracture grid well path intersection for the given + // cell center position (X, Y). + std::pair centerIJ = fractureGrid->fractureCellAtWellCenter(); + size_t centerIdx = fractureGrid->getGlobalIndexFromIJ( centerIJ.first, centerIJ.second ); + const RigFractureCell& centerCell = fractureGrid->cellFromIndex( centerIdx ); + const cvf::Vec3d& centerPos = centerCell.centerPosition(); + + sumDistance += pos.pointDistance( centerPos ); + } + + // Average distance for all the fractures + distanceGrid->setValue( x, y, sumDistance / fractureGrids.size() ); + + // Compute the area of the cell + double area = 0.0; + if ( !samples.empty() ) + { + double sum = 0.0; + for ( auto s : samples[idx] ) + sum += s; + + // Only cells with non-zero conductivity have defined area + if ( sum > 0.0 ) { - if ( isCoordinateInsideFractureCell( posX, posY, fractureCell ) ) - { - size_t idx = y * samplesX.size() + x; - double value = fractureCell.getConductivityValue(); - if ( !std::isinf( value ) ) samples[idx].push_back( value ); - break; - } + double diffX = computeCellSideLength( samplesX, x ); + double diffY = computeCellSideLength( samplesY, y ); + area = std::fabs( diffX ) * std::fabs( diffY ); } } + areaGrid->setValue( x, y, area ); } } } @@ -1004,7 +1135,10 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( size_t numSamplesY, size_t numGrids, std::map>& statisticsGrids, - const std::vector>& statisticsTypes ) + const std::vector>& statisticsTypes, + const RigHistogramData& areaHistogram, + std::shared_ptr areaGrid, + std::shared_ptr distanceGrid ) { for ( auto t : statisticsTypes ) { @@ -1030,14 +1164,25 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( grid->setValue( x, y, value ); }; + auto removeNonPositiveValues = []( const std::vector& values ) { + std::vector nonZeroValues; + for ( double value : values ) + if ( value > 0.0 ) nonZeroValues.push_back( value ); + return nonZeroValues; + }; + RigSlice2D occurrenceGrid( numSamplesX, numSamplesY ); - for ( size_t y = 0; y < numSamplesY; y++ ) + const int ny = static_cast( numSamplesY ); +#pragma omp parallel for + for ( int y = 0; y < ny; y++ ) { for ( size_t x = 0; x < numSamplesX; x++ ) { size_t idx = y * numSamplesX + x; + // Remove samples without positive values (no conductivity). + std::vector values = removeNonPositiveValues( samples[idx] ); if ( calculateMin || calculateMax || calculateMean ) { double min; @@ -1046,7 +1191,7 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( double range; double mean; double dev; - RigStatisticsMath::calculateBasicStatistics( samples[idx], &min, &max, &sum, &range, &mean, &dev ); + RigStatisticsMath::calculateBasicStatistics( values, &min, &max, &sum, &range, &mean, &dev ); if ( calculateMean ) setValueNoInf( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MEAN], x, y, mean ); @@ -1064,7 +1209,12 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( double p50; double p90; double mean; - RigStatisticsMath::calculateStatisticsCurves( samples[idx], &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( values, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); if ( calculateP10 ) setValueNoInf( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P10], x, y, p10 ); @@ -1078,51 +1228,117 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( if ( calculateOccurrence ) { - statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::OCCURRENCE]->setValue( x, - y, - samples[idx].size() ); + statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::OCCURRENCE]->setValue( x, y, values.size() ); } // Internal occurrence grid for the area correction is always calculated - occurrenceGrid.setValue( x, y, samples[idx].size() ); + occurrenceGrid.setValue( x, y, values.size() ); } } - auto clearCells = - []( std::shared_ptr& grid, const RigSlice2D& occurrenceGrid, size_t numGrids, double limitFraction ) { - for ( size_t y = 0; y < occurrenceGrid.ny(); y++ ) - { - for ( size_t x = 0; x < occurrenceGrid.nx(); x++ ) - { - double fraction = occurrenceGrid.getValue( x, y ) / numGrids; - if ( fraction < limitFraction ) - { - grid->setValue( x, y, 0.0 ); - } - } - } - }; + std::map areaMapping; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::MIN] = areaHistogram.min; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::MAX] = areaHistogram.max; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::MEAN] = areaHistogram.mean; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::P50] = areaHistogram.mean; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::P10] = areaHistogram.p10; + areaMapping[RimEnsembleFractureStatistics::StatisticsType::P90] = areaHistogram.p90; // Post-process the resulting grids improve area representation - // 1: Mean only include cells which have values in half of more of the grids - if ( calculateMean ) - clearCells( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MEAN], occurrenceGrid, numGrids, 0.5 ); + for ( auto statisticsType : statisticsTypes ) + { + statisticsGrids[statisticsType] = setCellsToFillTargetArea( statisticsGrids[statisticsType], + occurrenceGrid, + *areaGrid, + *distanceGrid, + areaMapping[statisticsType] ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::shared_ptr RimEnsembleFractureStatistics::setCellsToFillTargetArea( std::shared_ptr& grid, + const RigSlice2D& occurrenceGrid, + const RigSlice2D& areaGrid, + const RigSlice2D& distanceGrid, + double targetArea ) +{ + // Internal cell data class for ordering cells. + class CellData + { + public: + size_t x; + size_t y; + double occurrence; + double area; + double distance; + + // The cells are ordered by: + // 1. Occurrence: how often the cell had conductivity in the individual fractures. + // 2. Distance: distance from the well path intersection point (average for all fractures). + // Short distance is preferred. + // 3. Area: The area of the cell. Smaller is preferred. + // 4. X and Y cell index: Not important for sorting, but used to avoid rejecting cells + // when everything else is equal. + bool operator<( CellData const& p ) const + { + if ( occurrence > p.occurrence ) + return true; + else if ( occurrence == p.occurrence && distance < p.distance ) + return true; + else if ( occurrence == p.occurrence && distance == p.distance && area < p.area ) + return true; + else if ( occurrence == p.occurrence && distance == p.distance && area == p.area && x < p.x ) + return true; + else if ( occurrence == p.occurrence && distance == p.distance && area == p.area && x == p.x && y < p.y ) + return true; + + return false; + } + }; - // 2: Minimum only include cells present in every grid - if ( calculateMin ) - clearCells( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::MIN], occurrenceGrid, numGrids, 1.0 ); + // Create ordered list of the cells + std::set cells; + for ( size_t y = 0; y < occurrenceGrid.ny(); y++ ) + { + for ( size_t x = 0; x < occurrenceGrid.nx(); x++ ) + { + CellData cell; + cell.x = x; + cell.y = y; + cell.occurrence = occurrenceGrid.getValue( x, y ); + cell.area = areaGrid.getValue( x, y ); + cell.distance = distanceGrid.getValue( x, y ); + cells.insert( cell ); + } + } - // 3: P10 only include cells with have values in 10% or more of the grids - if ( calculateP10 ) - clearCells( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P10], occurrenceGrid, numGrids, 0.1 ); + // Fill cells in the output grid until the target area is reached. + // This ensures that the statistics fracture grids have representantive sizes. + std::shared_ptr outputGrid = std::make_shared( grid->nx(), grid->ny() ); + double area = 0.0; + for ( const CellData& cellData : cells ) + { + if ( area < targetArea ) + { + double value = grid->getValue( cellData.x, cellData.y ); + if ( !std::isinf( value ) && cellData.area > 0.0 ) + { + outputGrid->setValue( cellData.x, cellData.y, value ); + area += cellData.area; + } + } + else + { + // Target area is reached. + break; + } + } - // 4: P50 only include cells which have values in half of more of the grids - if ( calculateP50 ) - clearCells( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P50], occurrenceGrid, numGrids, 0.5 ); + RiaLogging::info( QString( "Statistics fracture area: %1 target area: %2" ).arg( area ).arg( targetArea ) ); - // 5: P90 only include cells with have values in 90% or more of the grids - if ( calculateP90 ) - clearCells( statisticsGrids[RimEnsembleFractureStatistics::StatisticsType::P90], occurrenceGrid, numGrids, 0.9 ); + return outputGrid; } //-------------------------------------------------------------------------------------------------- @@ -1131,19 +1347,12 @@ void RimEnsembleFractureStatistics::generateStatisticsGrids( QString RimEnsembleFractureStatistics::generateStatisticsTable( const std::vector>& stimPlanFractureDefinitions ) const { - std::vector propertyTypes = { - RigEnsembleFractureStatisticsCalculator::PropertyType::HEIGHT, - RigEnsembleFractureStatisticsCalculator::PropertyType::AREA, - RigEnsembleFractureStatisticsCalculator::PropertyType::WIDTH, - RigEnsembleFractureStatisticsCalculator::PropertyType::XF, - RigEnsembleFractureStatisticsCalculator::PropertyType::KFWF, - RigEnsembleFractureStatisticsCalculator::PropertyType::PERMEABILITY, - RigEnsembleFractureStatisticsCalculator::PropertyType::FORMATION_DIP, - }; + std::vector propertyTypes = + RigEnsembleFractureStatisticsCalculator::propertyTypes(); QString text; text += ""; - std::vector statisticsTypes = { "Name", "Mean", "Minimum", "Maximum", "P10", "P90" }; + std::vector statisticsTypes = { "Name", "Minimum", "P90", "Mean", "P10", "Maximum" }; for ( auto statType : statisticsTypes ) { text += QString( "" ).arg( statType ); @@ -1152,11 +1361,11 @@ QString RimEnsembleFractureStatistics::generateStatisticsTable( text += ""; text += ""; - auto emptyTextOnInf = []( double value ) { + auto emptyTextOnInf = []( double value, RiaNumberFormat::NumberFormatType numberFormat, int precision ) { if ( std::isinf( value ) ) return QString( "" ); else - return QString::number( value ); + return RiaNumberFormat::valueToText( value, numberFormat, precision ); }; for ( auto propertyType : propertyTypes ) @@ -1164,8 +1373,11 @@ QString RimEnsembleFractureStatistics::generateStatisticsTable( QString name = caf::AppEnum::uiText( propertyType ); int numBins = 50; RigHistogramData histogramData = - RigEnsembleFractureStatisticsCalculator::createStatisticsData( this, propertyType, numBins ); + RigEnsembleFractureStatisticsCalculator::createStatisticsData( stimPlanFractureDefinitions, + propertyType, + numBins ); + auto [numberFormat, precision] = RigEnsembleFractureStatisticsCalculator::numberFormatForProperty( propertyType ); text += QString( "" "" "" @@ -1175,11 +1387,11 @@ QString RimEnsembleFractureStatistics::generateStatisticsTable( "" "" ) .arg( name ) - .arg( emptyTextOnInf( histogramData.mean ) ) - .arg( emptyTextOnInf( histogramData.min ) ) - .arg( emptyTextOnInf( histogramData.max ) ) - .arg( emptyTextOnInf( histogramData.p10 ) ) - .arg( emptyTextOnInf( histogramData.p90 ) ); + .arg( emptyTextOnInf( histogramData.min, numberFormat, precision ) ) + .arg( emptyTextOnInf( histogramData.p90, numberFormat, precision ) ) + .arg( emptyTextOnInf( histogramData.mean, numberFormat, precision ) ) + .arg( emptyTextOnInf( histogramData.p10, numberFormat, precision ) ) + .arg( emptyTextOnInf( histogramData.max, numberFormat, precision ) ); } text += ""; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h index 4e534bea9b..af19e8f227 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatistics.h @@ -24,6 +24,7 @@ class RigFractureCell; class RigSlice2D; +class RigHistogramData; class Layer { @@ -104,6 +105,8 @@ class RimEnsembleFractureStatistics : public RimNamedObject const QString& resultName, MeshAlignmentType meshAlignmentType ); + bool excludeZeroWidthFractures() const; + protected: void defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, @@ -175,7 +178,15 @@ class RimEnsembleFractureStatistics : public RimNamedObject static void sampleAllGrids( const std::vector>& fractureGrids, const std::vector& samplesX, const std::vector& samplesY, - std::vector>& samples ); + std::vector>& samples, + std::shared_ptr areaGrid, + std::shared_ptr distanceGrid ); + + static std::shared_ptr setCellsToFillTargetArea( std::shared_ptr& grid, + const RigSlice2D& occurrenceGrid, + const RigSlice2D& areaGrid, + const RigSlice2D& distanceGrid, + double targetArea ); static void generateStatisticsGrids( const std::vector>& samples, @@ -183,7 +194,10 @@ class RimEnsembleFractureStatistics : public RimNamedObject size_t numSamplesY, size_t numGrids, std::map>& statisticsGrids, - const std::vector>& statisticsTypes ); + const std::vector>& statisticsTypes, + const RigHistogramData& areaHistogram, + std::shared_ptr areaGrid, + std::shared_ptr distanceGrid ); static bool writeStatisticsToCsv( const QString& filePath, const RigSlice2D& samples ); @@ -195,6 +209,7 @@ class RimEnsembleFractureStatistics : public RimNamedObject caf::PdmField> m_filePaths; caf::PdmField m_filePathsTable; caf::PdmField m_statisticsTable; + caf::PdmField m_excludeZeroWidthFractures; caf::PdmField m_computeStatistics; caf::PdmField m_numSamplesX; caf::PdmField m_numSamplesY; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatisticsCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatisticsCollection.cpp index e59076705a..b47cd33a1e 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatisticsCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimEnsembleFractureStatisticsCollection.cpp @@ -30,7 +30,7 @@ RimEnsembleFractureStatisticsCollection::RimEnsembleFractureStatisticsCollection CAF_PDM_InitObject( "Ensemble Fracture Statistics", ":/FractureTemplates16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_fractureGroupStatistics, "FractureGroupStatistics", "", "", "", "" ); - m_fractureGroupStatistics.uiCapability()->setUiHidden( true ); + m_fractureGroupStatistics.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp index a1978e7837..9ba0198e99 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.cpp @@ -127,7 +127,7 @@ RimFishbones::RimFishbones() CAF_PDM_InitFieldNoDefault( &m_valveLocations, "ValveLocations", "Valve Locations", "", "", "" ); m_valveLocations = new RimMultipleValveLocations(); m_valveLocations->findField( "RangeValveCount" )->uiCapability()->setUiName( "Number of Subs" ); - m_valveLocations.uiCapability()->setUiHidden( true ); + m_valveLocations.uiCapability()->setUiTreeHidden( true ); m_valveLocations.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &m_subsOrientationMode, @@ -154,7 +154,7 @@ RimFishbones::RimFishbones() "" ); CAF_PDM_InitFieldNoDefault( &m_pipeProperties, "PipeProperties", "Pipe Properties", "", "", "" ); - m_pipeProperties.uiCapability()->setUiHidden( true ); + m_pipeProperties.uiCapability()->setUiTreeHidden( true ); m_pipeProperties.uiCapability()->setUiTreeChildrenHidden( true ); m_pipeProperties = new RimFishbonesPipeProperties; @@ -535,6 +535,14 @@ double RimFishbones::endMD() const return measuredDepth; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFishbones::applyOffset( double offsetMD ) +{ + m_valveLocations->applyOffset( offsetMD ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.h b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.h index 523e2c4c08..779ccd8e38 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbones.h @@ -109,6 +109,7 @@ class RimFishbones : public caf::PdmObject, public Rim3dPropertiesInterface, pub cvf::Color3f defaultComponentColor() const override; double startMD() const override; double endMD() const override; + void applyOffset( double offsetMD ) override; public: caf::PdmField fishbonesColor; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbonesCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbonesCollection.cpp index a0883fc34e..c2ded89a79 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFishbonesCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFishbonesCollection.cpp @@ -46,8 +46,7 @@ RimFishbonesCollection::RimFishbonesCollection() this->setName( "Fishbones" ); CAF_PDM_InitFieldNoDefault( &m_fishbones, "FishbonesSubs", "fishbonesSubs", "", "", "" ); - - m_fishbones.uiCapability()->setUiHidden( true ); + m_fishbones.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_startMD, "StartMD", HUGE_VAL, "Start MD", "", "", "" ); CAF_PDM_InitField( &m_mainBoreDiameter, "MainBoreDiameter", 0.216, "Main Bore Diameter", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp index 7f8591c101..2963c303db 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplate.cpp @@ -27,7 +27,9 @@ #include "RimFractureContainment.h" #include "RimProject.h" +#include "cafPdmFieldScriptingCapability.h" #include "cafPdmObject.h" +#include "cafPdmObjectScriptingCapability.h" #include "cafPdmUiDoubleSliderEditor.h" #include "cafPdmUiDoubleValueEditor.h" #include "cafPdmUiPushButtonEditor.h" @@ -42,9 +44,12 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimFractureTemplate::AZIMUTH, "Az", "Azimuth" ); - addItem( RimFractureTemplate::ALONG_WELL_PATH, "AlongWellPath", "Along Well Path" ); - addItem( RimFractureTemplate::TRANSVERSE_WELL_PATH, "TransverseWellPath", "Transverse (normal) to Well Path" ); + addItem( RimFractureTemplate::AZIMUTH, "Azimuth", "Azimuth", QStringList( "Az" ) ); + addItem( RimFractureTemplate::ALONG_WELL_PATH, "Longitudinal", "Along Well Path", QStringList( "AlongWellPath" ) ); + addItem( RimFractureTemplate::TRANSVERSE_WELL_PATH, + "Transverse", + "Transverse (normal) to Well Path", + QStringList( "TransverseWellPath" ) ); setDefault( RimFractureTemplate::TRANSVERSE_WELL_PATH ); } @@ -101,7 +106,7 @@ void caf::AppEnum::setUp() #define CAF_PDM_InitField_Basic( field, keyword, default, uiName ) \ CAF_PDM_InitField( field, keyword, default, uiName, "", "", "" ) -CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimFractureTemplate, "RimFractureTemplate" ); +CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimFractureTemplate, "FractureTemplate", "RimFractureTemplate" ); //-------------------------------------------------------------------------------------------------- /// @@ -109,7 +114,7 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimFractureTemplate, "RimFractureTemplate" ); RimFractureTemplate::RimFractureTemplate() : wellPathDepthAtFractureChanged( this ) { - CAF_PDM_InitObject( "Fracture Template", ":/FractureTemplate16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Fracture Template", ":/FractureTemplate16x16.png", "", "" ); CAF_PDM_InitField( &m_id, "Id", -1, "ID", "", "", "" ); m_id.uiCapability()->setUiReadOnly( true ); @@ -130,15 +135,16 @@ RimFractureTemplate::RimFractureTemplate() "" ); m_fractureTemplateUnit.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitField( &m_orientationType, - "Orientation", - caf::AppEnum( TRANSVERSE_WELL_PATH ), - "Fracture Orientation", - "", - "", - "" ); - CAF_PDM_InitField( &m_azimuthAngle, "AzimuthAngle", 0.0f, "Azimuth Angle", "", "", "" ); // Is this correct - // description? + CAF_PDM_InitScriptableField( &m_orientationType, + "Orientation", + caf::AppEnum( TRANSVERSE_WELL_PATH ), + "Fracture Orientation", + "", + "", + "" ); + + CAF_PDM_InitScriptableField( &m_azimuthAngle, "AzimuthAngle", 0.0f, "Azimuth Angle", "", "", "" ); + CAF_PDM_InitField( &m_skinFactor, "SkinFactor", 0.0f, "Skin Factor", "", "", "" ); CAF_PDM_InitField( &m_perforationLength, "PerforationLength", 1.0, "Perforation Length", "", "", "" ); @@ -468,7 +474,7 @@ void RimFractureTemplate::defineEditorAttribute( const caf::PdmFieldHandle* fiel if ( field == &m_scaleApplyButton ) { - caf::PdmUiPushButtonEditorAttribute* attrib = dynamic_cast( attribute ); + auto* attrib = dynamic_cast( attribute ); if ( attrib ) { attrib->m_buttonText = "Apply"; @@ -477,7 +483,7 @@ void RimFractureTemplate::defineEditorAttribute( const caf::PdmFieldHandle* fiel if ( field == &m_wellPathDepthAtFracture ) { - caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { auto [minimum, maximum] = wellPathDepthAtFractureRange(); @@ -664,26 +670,24 @@ double RimFractureTemplate::computeEffectivePermeability( const RimFracture* fra { return m_userDefinedEffectivePermeability; } + + double fracPermeability = 0.0; + auto values = wellFractureIntersectionData( fractureInstance ); + if ( values.isWidthAndPermeabilityDefined() ) + { + fracPermeability = values.m_permeability; + } else { - double fracPermeability = 0.0; - auto values = wellFractureIntersectionData( fractureInstance ); - if ( values.isWidthAndPermeabilityDefined() ) - { - fracPermeability = values.m_permeability; - } - else - { - auto conductivity = values.m_conductivity; - auto width = computeFractureWidth( fractureInstance ); + auto conductivity = values.m_conductivity; + auto width = computeFractureWidth( fractureInstance ); - if ( fabs( width ) < 1e-10 ) return std::numeric_limits::infinity(); + if ( fabs( width ) < 1e-10 ) return std::numeric_limits::infinity(); - fracPermeability = conductivity / width; - } - - return fracPermeability * m_relativePermeability; + fracPermeability = conductivity / width; } + + return fracPermeability * m_relativePermeability; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplateCollection.cpp index cd642895b5..1401552e57 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimFractureTemplateCollection.cpp @@ -39,18 +39,20 @@ #include "RimWellPathFracture.h" #include "RimWellPathFractureCollection.h" +#include "cafPdmFieldScriptingCapability.h" #include "cafPdmObject.h" +#include "cafPdmObjectScriptingCapability.h" #include -CAF_PDM_SOURCE_INIT( RimFractureTemplateCollection, "FractureDefinitionCollection" ); +CAF_PDM_SOURCE_INIT( RimFractureTemplateCollection, "FractureTemplateCollection", "FractureDefinitionCollection" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimFractureTemplateCollection::RimFractureTemplateCollection() { - CAF_PDM_InitObject( "Fracture Templates", ":/FractureTemplates16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Fracture Templates", ":/FractureTemplates16x16.png", "", "" ); CAF_PDM_InitField( &m_defaultUnitsForFracTemplates, "DefaultUnitForTemplates", @@ -61,7 +63,7 @@ RimFractureTemplateCollection::RimFractureTemplateCollection() "" ); CAF_PDM_InitFieldNoDefault( &m_fractureDefinitions, "FractureDefinitions", "", "", "", "" ); - m_fractureDefinitions.uiCapability()->setUiHidden( true ); + m_fractureDefinitions.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_nextValidFractureTemplateId, "NextValidFractureTemplateId", 0, "", "", "", "" ); m_nextValidFractureTemplateId.uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.cpp index e7774cfd2d..db382fd77c 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.cpp @@ -217,6 +217,17 @@ void RimMultipleValveLocations::initFields( LocationType locationT } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleValveLocations::applyOffset( double offset ) +{ + m_rangeStart = m_rangeStart + offset; + m_rangeEnd = m_rangeEnd + offset; + + computeRangesAndLocations(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.h b/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.h index 862656239b..eba216e0dc 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimMultipleValveLocations.h @@ -55,6 +55,8 @@ class RimMultipleValveLocations : public caf::PdmObject int valveCount, const std::vector& locationOfValves ); + void applyOffset( double offset ); + protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp index dbfcd04122..d7d1b88003 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.cpp @@ -46,7 +46,7 @@ RimPerforationCollection::RimPerforationCollection() this->setName( "Perforations" ); CAF_PDM_InitFieldNoDefault( &m_perforations, "Perforations", "Perforations", "", "", "" ); - m_perforations.uiCapability()->setUiHidden( true ); + m_perforations.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_nonDarcyParameters, "NonDarcyParameters", "Non-Darcy Parameters", "", "", "" ); m_nonDarcyParameters = new RimNonDarcyPerforationParameters(); @@ -88,8 +88,6 @@ void RimPerforationCollection::appendPerforation( RimPerforationInterval* perfor Rim3dView* activeView = RiaApplication::instance()->activeReservoirView(); if ( activeView ) { - activeView->hasUserRequestedAnimation = true; - RimEclipseCase* eclipseCase = nullptr; activeView->firstAncestorOrThisOfType( eclipseCase ); if ( eclipseCase ) @@ -141,6 +139,21 @@ std::vector RimPerforationCollection::perforation return myPerforations; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimPerforationCollection::perforationsNoConst() const +{ + std::vector myPerforations; + + for ( const auto& perforation : m_perforations ) + { + myPerforations.push_back( perforation ); + } + + return myPerforations; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.h b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.h index 9f3fee0c08..b8db71201a 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationCollection.h @@ -46,6 +46,7 @@ class RimPerforationCollection : public RimCheckableNamedObject const RimNonDarcyPerforationParameters* nonDarcyParameters() const; void appendPerforation( RimPerforationInterval* perforation ); std::vector perforations() const; + std::vector perforationsNoConst() const; std::vector activePerforations() const; private: diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.cpp index a417a8e49f..e7345dad17 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.cpp @@ -58,7 +58,7 @@ RimPerforationInterval::RimPerforationInterval() CAF_PDM_InitField( &m_endDate, "EndDate", QDateTime::currentDateTime(), "End Date", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_valves, "Valves", "Valves", "", "", "" ); - m_valves.uiCapability()->setUiHidden( true ); + m_valves.uiCapability()->setUiTreeHidden( true ); nameField()->uiCapability()->setUiReadOnly( true ); @@ -305,6 +305,15 @@ double RimPerforationInterval::endMD() const return m_endMD(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPerforationInterval::applyOffset( double offsetMD ) +{ + m_startMD = m_startMD + offsetMD; + m_endMD = m_endMD + offsetMD; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.h b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.h index 00eb4fce3e..519826f7a2 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimPerforationInterval.h @@ -76,6 +76,7 @@ class RimPerforationInterval : public RimCheckableNamedObject, cvf::Color3f defaultComponentColor() const override; double startMD() const override; double endMD() const override; + void applyOffset( double offsetMD ) override; protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.cpp index b106970670..23b92f0f4f 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.cpp @@ -155,6 +155,14 @@ bool RimSimWellFracture::isEnabled() const return isChecked(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSimWellFracture::applyOffset( double offsetMD ) +{ + m_location = m_location + offsetMD; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.h b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.h index 5904b4ee6b..194cc07500 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFracture.h @@ -52,6 +52,8 @@ class RimSimWellFracture : public RimFracture bool isEnabled() const override; // RimWellPathCompletionsInterface override + void applyOffset( double offsetMD ) override; + protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFractureCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFractureCollection.cpp index ac06f337eb..ed3f50dfdb 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFractureCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimSimWellFractureCollection.cpp @@ -31,7 +31,7 @@ RimSimWellFractureCollection::RimSimWellFractureCollection( void ) CAF_PDM_InitObject( "Fractures", ":/FractureLayout16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &simwellFractures, "Fractures", "", "", "", "" ); - simwellFractures.uiCapability()->setUiHidden( true ); + simwellFractures.uiCapability()->setUiTreeHidden( true ); setDeletable( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp index 5bc39a509d..f2d44d975c 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.cpp @@ -23,11 +23,13 @@ #include "RiaEclipseUnitTools.h" #include "RiaFractureDefines.h" #include "RiaLogging.h" +#include "RiaNumberFormat.h" #include "RiaWeightedGeometricMeanCalculator.h" #include "RiaWeightedMeanCalculator.h" #include "RifStimPlanXmlReader.h" +#include "RigEnsembleFractureStatisticsCalculator.h" #include "RigFractureGrid.h" #include "RigStimPlanFractureDefinition.h" #include "RigTransmissibilityEquations.h" @@ -45,7 +47,9 @@ #include "RivWellFracturePartMgr.h" +#include "cafPdmFieldScriptingCapability.h" #include "cafPdmObject.h" +#include "cafPdmObjectScriptingCapability.h" #include "cafPdmUiDoubleSliderEditor.h" #include "cafPdmUiFilePathEditor.h" #include "cafPdmUiTextEditor.h" @@ -61,14 +65,14 @@ static std::vector EMPTY_DOUBLE_VECTOR; -CAF_PDM_SOURCE_INIT( RimStimPlanFractureTemplate, "RimStimPlanFractureTemplate" ); +CAF_PDM_SOURCE_INIT( RimStimPlanFractureTemplate, "StimPlanFractureTemplate", "RimStimPlanFractureTemplate" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- RimStimPlanFractureTemplate::RimStimPlanFractureTemplate() { - CAF_PDM_InitObject( "Fracture Template", ":/FractureTemplate16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Fracture Template", ":/FractureTemplate16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_stimPlanFileName, "StimPlanFileName", "File Name", "", "", "" ); m_stimPlanFileName.uiCapability()->setUiEditorTypeName( caf::PdmUiFilePathEditor::uiEditorTypeName() ); @@ -327,6 +331,8 @@ void RimStimPlanFractureTemplate::loadDataAndUpdate() RimEclipseView* activeView = dynamic_cast( RiaApplication::instance()->activeReservoirView() ); if ( activeView ) activeView->fractureColors()->loadDataAndUpdate(); + m_propertiesTable = generatePropertiesTable(); + updateConnectedEditors(); } @@ -1187,11 +1193,24 @@ QString RimStimPlanFractureTemplate::generatePropertiesTable() const if ( !m_stimPlanFractureDefinitionData.isNull() ) { - appendTextIfValidValue( body, "Formation Dip", m_stimPlanFractureDefinitionData->formationDip() ); appendTextIfValidValue( body, "Top MD", m_stimPlanFractureDefinitionData->topPerfMd() ); appendTextIfValidValue( body, "Bottom MD", m_stimPlanFractureDefinitionData->bottomPerfMd() ); appendTextIfValidValue( body, "Top TVD", m_stimPlanFractureDefinitionData->topPerfTvd() ); appendTextIfValidValue( body, "Bottom TVD", m_stimPlanFractureDefinitionData->bottomPerfTvd() ); + + std::vector> fractureDefinitions = { m_stimPlanFractureDefinitionData }; + + std::vector propertyTypes = + RigEnsembleFractureStatisticsCalculator::propertyTypes(); + for ( auto propertyType : propertyTypes ) + { + std::vector values = + RigEnsembleFractureStatisticsCalculator::calculateProperty( fractureDefinitions, propertyType ); + if ( !values.empty() ) + { + appendTextIfValidValue( body, values[0], propertyType ); + } + } } return body; @@ -1207,3 +1226,18 @@ void RimStimPlanFractureTemplate::appendTextIfValidValue( QString& body, const Q body += QString( "%1: %2
" ).arg( title ).arg( value ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStimPlanFractureTemplate::appendTextIfValidValue( QString& body, + double value, + RigEnsembleFractureStatisticsCalculator::PropertyType propertyType ) +{ + if ( value != HUGE_VAL ) + { + QString name = caf::AppEnum::uiText( propertyType ); + auto [numberFormat, precision] = RigEnsembleFractureStatisticsCalculator::numberFormatForProperty( propertyType ); + body += QString( "%1: %2
" ).arg( name ).arg( RiaNumberFormat::valueToText( value, numberFormat, precision ) ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h index e6af8d7810..65ba2bc874 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimStimPlanFractureTemplate.h @@ -30,8 +30,10 @@ #include "cvfObject.h" #include "cvfVector3.h" +#include "RigEnsembleFractureStatisticsCalculator.h" #include "RigFractureCell.h" #include "RigFractureGrid.h" + #include class RigStimPlanFractureDefinition; @@ -137,6 +139,9 @@ class RimStimPlanFractureTemplate : public RimFractureTemplate QString generatePropertiesTable() const; static void appendTextIfValidValue( QString& body, const QString& title, double value ); + static void appendTextIfValidValue( QString& body, + double value, + RigEnsembleFractureStatisticsCalculator::PropertyType propertyType ); private: caf::PdmField m_activeTimeStepIndex; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimValveTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimValveTemplateCollection.cpp index 8a652a4d52..087d3b336b 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimValveTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimValveTemplateCollection.cpp @@ -37,7 +37,7 @@ RimValveTemplateCollection::RimValveTemplateCollection() "", "" ); m_defaultUnitsForValveTemplates = RiaDefines::EclipseUnitSystem::UNITS_METRIC; - m_valveDefinitions.uiCapability()->setUiHidden( true ); + m_valveDefinitions.uiCapability()->setUiTreeHidden( true ); addDefaultValveTemplates(); } diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.cpp index 80ca93b082..7cd6bada20 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.cpp @@ -53,19 +53,19 @@ RimWellPathCompletions::RimWellPathCompletions() CAF_PDM_InitFieldNoDefault( &m_perforationCollection, "Perforations", "Perforations", "", "", "" ); m_perforationCollection = new RimPerforationCollection; - m_perforationCollection.uiCapability()->setUiHidden( true ); + m_perforationCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_fishbonesCollection, "Fishbones", "Fishbones", "", "", "" ); m_fishbonesCollection = new RimFishbonesCollection; - m_fishbonesCollection.uiCapability()->setUiHidden( true ); + m_fishbonesCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_fractureCollection, "Fractures", "Fractures", "", "", "" ); m_fractureCollection = new RimWellPathFractureCollection; - m_fractureCollection.uiCapability()->setUiHidden( true ); + m_fractureCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_stimPlanModelCollection, "StimPlanModels", "StimPlan Models", "", "", "" ); m_stimPlanModelCollection = new RimStimPlanModelCollection; - m_stimPlanModelCollection.uiCapability()->setUiHidden( true ); + m_stimPlanModelCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_wellNameForExport_OBSOLETE, "WellNameForExport", QString(), "Well Name", "", "", "" ); m_wellNameForExport_OBSOLETE.xmlCapability()->setIOWritable( false ); @@ -171,6 +171,35 @@ std::vector RimWellPathCompletions::activeFractures() cons return {}; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellPathCompletions::allCompletionsNoConst() const +{ + std::vector completions; + + for ( RimWellPathFracture* fracture : m_fractureCollection->allFractures() ) + { + completions.push_back( fracture ); + } + for ( RimFishbones* fishbones : m_fishbonesCollection->allFishbonesSubs() ) + { + completions.push_back( fishbones ); + } + for ( RimPerforationInterval* perforation : m_perforationCollection->perforationsNoConst() ) + { + completions.push_back( perforation ); + } + + std::vector allValves = valves(); + for ( RimWellPathValve* valve : allValves ) + { + completions.push_back( valve ); + } + + return completions; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.h b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.h index 0c377d32d7..4dcf699966 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathCompletions.h @@ -50,6 +50,7 @@ class RimWellPathCompletions : public caf::PdmObject RimWellPathFractureCollection* fractureCollection() const; RimStimPlanModelCollection* stimPlanModelCollection() const; + std::vector allCompletionsNoConst() const; std::vector allCompletions() const; bool hasCompletions() const; void setUnitSystemSpecificDefaults(); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathComponentInterface.h b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathComponentInterface.h index 7438ccdeea..b3757dc350 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathComponentInterface.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathComponentInterface.h @@ -30,11 +30,12 @@ class RimWellPathComponentInterface { public: - virtual bool isEnabled() const = 0; - virtual RiaDefines::WellPathComponentType componentType() const = 0; - virtual QString componentLabel() const = 0; - virtual QString componentTypeLabel() const = 0; - virtual cvf::Color3f defaultComponentColor() const = 0; - virtual double startMD() const = 0; - virtual double endMD() const = 0; + virtual bool isEnabled() const = 0; + virtual RiaDefines::WellPathComponentType componentType() const = 0; + virtual QString componentLabel() const = 0; + virtual QString componentTypeLabel() const = 0; + virtual cvf::Color3f defaultComponentColor() const = 0; + virtual double startMD() const = 0; + virtual double endMD() const = 0; + virtual void applyOffset( double offsetMD ) = 0; }; diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp index 38d5c1cd6e..8fe6f71d90 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.cpp @@ -310,3 +310,11 @@ void RimWellPathFracture::triangleGeometry( std::vector* nodeCoords, { m_fractureTemplate->fractureTriangleGeometry( nodeCoords, triangleIndices, m_wellPathDepthAtFracture ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathFracture::applyOffset( double offsetMD ) +{ + m_measuredDepth = m_measuredDepth + offsetMD; +} diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h index 2cc20ae080..b90a1b8ca9 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFracture.h @@ -57,6 +57,8 @@ class RimWellPathFracture : public RimFracture void triangleGeometry( std::vector* nodeCoords, std::vector* triangleIndices ) const override; + void applyOffset( double offsetMD ) override; + protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineEditorAttribute( const caf::PdmFieldHandle* field, diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFractureCollection.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFractureCollection.cpp index 9f1ae83aab..e1cd281aea 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFractureCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathFractureCollection.cpp @@ -33,7 +33,7 @@ RimWellPathFractureCollection::RimWellPathFractureCollection( void ) CAF_PDM_InitObject( "Fractures", ":/FractureLayout16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_fractures, "Fractures", "", "", "", "" ); - m_fractures.uiCapability()->setUiHidden( true ); + m_fractures.uiCapability()->setUiTreeHidden( true ); setName( "Fractures" ); nameField()->uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.cpp b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.cpp index c6c0c2871d..4ec0e90752 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.cpp @@ -434,6 +434,14 @@ double RimWellPathValve::endMD() const } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathValve::applyOffset( double offsetMD ) +{ + m_measuredDepth = m_measuredDepth + offsetMD; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.h b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.h index 27a19eea79..3b8dc9cc62 100644 --- a/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.h +++ b/ApplicationLibCode/ProjectDataModel/Completions/RimWellPathValve.h @@ -75,6 +75,7 @@ class RimWellPathValve : public RimCheckableNamedObject, public RimWellPathCompo cvf::Color3f defaultComponentColor() const override; double startMD() const override; double endMD() const override; + void applyOffset( double offsetMD ) override; void templateUpdated(); diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/CMakeLists_files.cmake index 92143d1593..6a402f087b 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/CMakeLists_files.cmake @@ -1,28 +1,27 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAbstractCorrelationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationMatrixPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimParameterResultCrossPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationReportPlot.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAbstractCorrelationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationMatrixPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimParameterResultCrossPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationReportPlot.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAbstractCorrelationPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationMatrixPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimParameterResultCrossPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCorrelationReportPlot.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAbstractCorrelationPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationMatrixPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimParameterResultCrossPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCorrelationReportPlot.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\CorrelationPlots" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\CorrelationPlots" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp index ed158996b7..fa23d13bbd 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.cpp @@ -469,15 +469,15 @@ void RimAbstractCorrelationPlot::setCaseFilterDataSource( RimEnsembleCurveSet* e //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAbstractCorrelationPlot::ensembleParameters() +std::set RimAbstractCorrelationPlot::ensembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); for ( RimSummaryCaseCollection* ensemble : analyserOfSelectedCurveDefs->m_ensembles ) { - std::vector parameters = ensemble->alphabeticEnsembleParameters(); + std::vector parameters = ensemble->alphabeticEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } return ensembleParms; @@ -486,15 +486,15 @@ std::set RimAbstractCorrelationPlot::ensembleParameters() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::set RimAbstractCorrelationPlot::variationSortedEnsembleParameters() +std::set RimAbstractCorrelationPlot::variationSortedEnsembleParameters() { - std::set ensembleParms; + std::set ensembleParms; RiaSummaryCurveDefinitionAnalyser* analyserOfSelectedCurveDefs = getOrCreateSelectedCurveDefAnalyser(); for ( RimSummaryCaseCollection* ensemble : analyserOfSelectedCurveDefs->m_ensembles ) { - std::vector parameters = ensemble->variationSortedEnsembleParameters(); + std::vector parameters = ensemble->variationSortedEnsembleParameters(); ensembleParms.insert( parameters.begin(), parameters.end() ); } return ensembleParms; @@ -503,15 +503,15 @@ std::set RimAbstractCorrelationPlot::variationSortedEnsembleP //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimAbstractCorrelationPlot::ensembleParameter( const QString& ensembleParameterName ) +RigEnsembleParameter RimAbstractCorrelationPlot::ensembleParameter( const QString& ensembleParameterName ) { - std::set ensembleParms = ensembleParameters(); - for ( const EnsembleParameter& eParam : ensembleParms ) + std::set ensembleParms = ensembleParameters(); + for ( const RigEnsembleParameter& eParam : ensembleParms ) { if ( eParam.name == ensembleParameterName ) return eParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h index 374e0a203c..665ac9920e 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimAbstractCorrelationPlot.h @@ -34,7 +34,7 @@ class RimSummaryAddress; class RimEnsembleCurveSet; class RimSummaryCaseCollection; class RimSummaryCase; -class EnsembleParameter; +class RigEnsembleParameter; class RifEclipseSummaryAddress; class RimAbstractCorrelationPlot : public RimPlot @@ -88,9 +88,9 @@ class RimAbstractCorrelationPlot : public RimPlot bool* useOptionsOnly ) override; std::set addresses(); - std::set ensembleParameters(); - std::set variationSortedEnsembleParameters(); - EnsembleParameter ensembleParameter( const QString& ensembleParameterName ); + std::set ensembleParameters(); + std::set variationSortedEnsembleParameters(); + RigEnsembleParameter ensembleParameter( const QString& ensembleParameterName ); // RimViewWindow overrides QWidget* viewWidget() override; diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp index 642e7fb418..c18f39d799 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationMatrixPlot.cpp @@ -30,6 +30,8 @@ #include "RifSummaryReaderInterface.h" +#include "RigEnsembleParameter.h" + #include "RimDerivedSummaryCase.h" #include "RimEnsembleCurveSet.h" #include "RimPlotAxisProperties.h" @@ -173,7 +175,7 @@ RimCorrelationMatrixPlot::RimCorrelationMatrixPlot() m_legendConfig = new RimRegularLegendConfig(); m_legendConfig->setAutomaticRanges( -1.0, 1.0, -1.0, 1.0 ); m_legendConfig->setColorLegend( - RimRegularLegendConfig::mapToColorLegend( RimRegularLegendConfig::ColorRangesType::RED_WHITE_BLUE ) ); + RimRegularLegendConfig::mapToColorLegend( RimRegularLegendConfig::ColorRangesType::BLUE_WHITE_RED ) ); setLegendsVisible( false ); @@ -221,10 +223,10 @@ RimRegularLegendConfig* RimCorrelationMatrixPlot::legendConfig() void RimCorrelationMatrixPlot::selectAllParameters() { m_selectedParametersList.v().clear(); - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { m_selectedParametersList.v().push_back( param.name ); } @@ -347,10 +349,10 @@ QList if ( fieldNeedingOptions == &m_selectedParametersList ) { - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { options.push_back( caf::PdmOptionItemInfo( param.uiName(), param.name ) ); } @@ -522,7 +524,7 @@ void RimCorrelationMatrixPlot::createMatrix() std::vector caseValuesAtTimestep; std::vector parameterValues; - EnsembleParameter parameter = ensemble->ensembleParameter( paramName ); + RigEnsembleParameter parameter = ensemble->ensembleParameter( paramName ); if ( parameter.isValid() ) { diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp index 6191e0df83..00cb8e2063 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlot.cpp @@ -20,7 +20,6 @@ #include "RiaPreferences.h" #include "RiaQDateTimeTools.h" -#include "RiaStatisticsTools.h" #include "RiuGroupedBarChartBuilder.h" #include "RiuPlotMainWindowTools.h" #include "RiuQwtPlotWidget.h" @@ -156,10 +155,10 @@ QList RimCorrelationPlot::calculateValueOptions( const c if ( fieldNeedingOptions == &m_selectedParametersList ) { - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { options.push_back( caf::PdmOptionItemInfo( param.uiName(), param.name ) ); } @@ -242,7 +241,7 @@ void RimCorrelationPlot::addDataToChartBuilder( RiuGroupedBarChartBuilder& chart std::set activeCases = filterEnsembleCases( ensemble ); - std::vector> correlations = + std::vector> correlations = ensemble->parameterCorrelations( address, selectedTimestep, m_selectedParametersList(), activeCases ); for ( auto parameterCorrPair : correlations ) @@ -332,10 +331,10 @@ void RimCorrelationPlot::setSortByAbsoluteValues( bool sortByAbsoluteValues ) void RimCorrelationPlot::selectAllParameters() { m_selectedParametersList.v().clear(); - std::set params = variationSortedEnsembleParameters(); + std::set params = variationSortedEnsembleParameters(); for ( auto param : params ) { - if ( !m_excludeParametersWithoutVariation() || param.variationBin > EnsembleParameter::NO_VARIATION ) + if ( !m_excludeParametersWithoutVariation() || param.variationBin > RigEnsembleParameter::NO_VARIATION ) { m_selectedParametersList.v().push_back( param.name ); } diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp index 7054e2e6f0..d2397fa512 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimCorrelationPlotCollection.cpp @@ -39,8 +39,8 @@ RimCorrelationPlotCollection::RimCorrelationPlotCollection() CAF_PDM_InitFieldNoDefault( &m_correlationPlots, "CorrelationPlots", "Correlation Plots", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_correlationReports, "CorrelationReports", "Correlation Reports", "", "", "" ); - m_correlationPlots.uiCapability()->setUiHidden( true ); - m_correlationReports.uiCapability()->setUiHidden( true ); + m_correlationPlots.uiCapability()->setUiTreeHidden( true ); + m_correlationReports.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp index be24609ae9..84d8dd3ef3 100644 --- a/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/CorrelationPlots/RimParameterResultCrossPlot.cpp @@ -21,11 +21,12 @@ #include "RiaColorTables.h" #include "RiaPreferences.h" #include "RiaQDateTimeTools.h" -#include "RiaStatisticsTools.h" #include "RiaTextStringTools.h" #include "RifSummaryReaderInterface.h" +#include "RigEnsembleParameter.h" + #include "RimDerivedSummaryCase.h" #include "RimEnsembleCurveSet.h" #include "RimMultiPlot.h" @@ -244,7 +245,7 @@ void RimParameterResultCrossPlot::createPoints() int addressIdx = 0; for ( auto address : addresses() ) { - EnsembleParameter parameter = ensembleParameter( m_ensembleParameter ); + RigEnsembleParameter parameter = ensembleParameter( m_ensembleParameter ); if ( !( parameter.isNumeric() && parameter.isValid() ) ) return; QStringList caseNames = caseNamesOfValidEnsembleCases( ensemble ); diff --git a/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake index 9ef6fc1e25..ab8db4663f 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Faults/CMakeLists_files.cmake @@ -1,26 +1,25 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.h -${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.h -${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.h -${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimFaultInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaultInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRASettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPreprocSettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaultRAPostprocSettings.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Faults" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Faults" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp index 7a5fad8f87..ea0d1cf13c 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.cpp @@ -27,6 +27,7 @@ #include "RigMainGrid.h" #include "RimEclipseCase.h" +#include "RimEclipseFaultColors.h" #include "RimEclipseInputCase.h" #include "RimEclipseView.h" #include "RimFaultInView.h" @@ -91,15 +92,16 @@ RimFaultInViewCollection::RimFaultInViewCollection() "" ); CAF_PDM_InitFieldNoDefault( &faults, "Faults", "Faults", "", "", "" ); - faults.uiCapability()->setUiHidden( true ); + faults.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_enableFaultRA, "EnableFaultRA", false, "Enable Fault RA", "", "", "" ); - m_enableFaultRA.uiCapability()->setUiHidden( true ); m_enableFaultRA.uiCapability()->setUiReadOnly( true ); + m_enableFaultRA.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_faultRASettings, "FaultRASettings", "Reactivation Assessment Settings", "", "", "" ); m_faultRASettings = new RimFaultRASettings(); m_faultRASettings.uiCapability()->setUiHidden( true ); + m_faultRASettings.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -317,6 +319,21 @@ void RimFaultInViewCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiT { uiTreeOrdering.add( &m_faultRASettings ); } + + RimEclipseView* eclipseView = nullptr; + this->firstAncestorOfType( eclipseView ); + if ( eclipseView ) + { + auto uiTree = eclipseView->faultResultSettings()->uiTreeOrdering(); + uiTreeOrdering.appendChild( uiTree ); + } + + for ( const auto& fault : faults ) + { + uiTreeOrdering.add( fault ); + } + + uiTreeOrdering.skipRemainingChildren( true ); } //-------------------------------------------------------------------------------------------------- @@ -364,6 +381,14 @@ bool RimFaultInViewCollection::faultRAEnabled() const return m_enableFaultRA(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimFaultInViewCollection::faultRAAdvancedEnabled() const +{ + return m_enableFaultRA() && ( m_faultRASettings->geomechCase() != nullptr ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h index 6175573cb3..15c3aa0e31 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultInViewCollection.h @@ -64,6 +64,7 @@ class RimFaultInViewCollection : public caf::PdmObject RimFaultRASettings* faultRASettings() const; bool faultRAEnabled() const; + bool faultRAAdvancedEnabled() const; void enableFaultRA( bool enable ); caf::PdmField showFaultFaces; diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp index da4adbf5b7..76c71e509a 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.cpp @@ -40,9 +40,12 @@ #include "cafPdmUiComboBoxEditor.h" #include "cafPdmUiFilePathEditor.h" #include "cafPdmUiTableViewEditor.h" +#include "cafPdmUiTreeOrdering.h" #include +#include + CAF_PDM_SOURCE_INIT( RimFaultRASettings, "RimFaultRASettings" ); //-------------------------------------------------------------------------------------------------- @@ -167,6 +170,16 @@ void RimFaultRASettings::defineUiOrdering( QString uiConfigName, caf::PdmUiOrder uiOrdering.skipRemainingFields( true ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimFaultRASettings::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) +{ + uiTreeOrdering.add( &m_basicParameters ); + uiTreeOrdering.add( &m_advancedParameters ); + uiTreeOrdering.skipRemainingChildren(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -415,7 +428,8 @@ std::list RimFaultRASettings::basicParameters( int faultID //-------------------------------------------------------------------------------------------------- std::list RimFaultRASettings::advancedParameters( int faultID ) { - m_advancedParametersRI->setParameterValue( "eclipse_loadstep_start", loadStepStart() ); + bool advanced = true; + m_advancedParametersRI->setParameterValue( "eclipse_loadstep_start", loadStepStart( advanced ) ); m_advancedParametersRI->setParameterValue( "eclipse_loadstep_end", loadStepEnd() ); m_advancedParametersRI->setParameterValue( "faultid_calibration", faultID ); m_advancedParametersRI->setParameterValue( "abaqus_elastic_properties", elasticPropertiesFilename() ); @@ -505,9 +519,25 @@ QString RimFaultRASettings::advancedMacrisDatabase() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -QString RimFaultRASettings::loadStepStart() const +int RimFaultRASettings::timeStepDigits() const +{ + if ( m_eclipseCase == nullptr ) return 1; + + int timesteps = m_eclipseCase->timeStepStrings().size(); + if ( timesteps <= 0 ) return 1; + + return 1 + (int)( std::log10( 1.0 * timesteps ) ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimFaultRASettings::loadStepStart( bool advanced /* = false */ ) const { - QString retval = QString( "PRESSURE_%1" ).arg( startTimeStepEclipseIndex(), 2, 10, QChar( '0' ) ); + int startStep = 0; + if ( !advanced ) startStep = startTimeStepEclipseIndex(); + + QString retval = QString( "PRESSURE_%1" ).arg( startStep, timeStepDigits(), 10, QChar( '0' ) ); return retval; } @@ -516,7 +546,7 @@ QString RimFaultRASettings::loadStepStart() const //-------------------------------------------------------------------------------------------------- QString RimFaultRASettings::loadStepEnd() const { - QString retval = QString( "PRESSURE_%1" ).arg( endTimeStepEclipseIndex(), 2, 10, QChar( '0' ) ); + QString retval = QString( "PRESSURE_%1" ).arg( endTimeStepEclipseIndex(), timeStepDigits(), 10, QChar( '0' ) ); return retval; } diff --git a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h index e928b672db..94d7b96225 100644 --- a/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h +++ b/ApplicationLibCode/ProjectDataModel/Faults/RimFaultRASettings.h @@ -64,7 +64,7 @@ class RimFaultRASettings : public caf::PdmObject int startTimeStepEclipseIndex() const; QString startTimeStepEclipse() const; - QString loadStepStart() const; + QString loadStepStart( bool advanced = false ) const; int endTimeStepEclipseIndex() const; QString endTimeStepEclipse() const; QString loadStepEnd() const; @@ -89,12 +89,15 @@ class RimFaultRASettings : public caf::PdmObject RimGenericParameter* getInputParameter( QString name ) const; protected: - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; private: void setupResInsightParameters(); + int timeStepDigits() const; private: caf::PdmPtrField m_eclipseFRAGeneratedCase; diff --git a/ApplicationLibCode/ProjectDataModel/Flow/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Flow/CMakeLists_files.cmake index 3aba3f9396..9515ebb9a0 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Flow/CMakeLists_files.cmake @@ -1,46 +1,45 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimFlowDiagSolution.h -${CMAKE_CURRENT_LIST_DIR}/RimFlowPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimTotalWellAllocationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimTofAccumulatedPhaseFractionsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellFlowRateCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlotLegend.h -${CMAKE_CURRENT_LIST_DIR}/RimFlowCharacteristicsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellRftPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPltPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimDataSourceForRftPlt.h -${CMAKE_CURRENT_LIST_DIR}/RimWellPlotTools.h -${CMAKE_CURRENT_LIST_DIR}/RimWellRftEnsembleCurveSet.h -${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlotCollection.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimFlowDiagSolution.h + ${CMAKE_CURRENT_LIST_DIR}/RimFlowPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimTotalWellAllocationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimTofAccumulatedPhaseFractionsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellFlowRateCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlotLegend.h + ${CMAKE_CURRENT_LIST_DIR}/RimFlowCharacteristicsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellRftPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPltPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimDataSourceForRftPlt.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPlotTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellRftEnsembleCurveSet.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlotCollection.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimFlowDiagSolution.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFlowPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTotalWellAllocationPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimTofAccumulatedPhaseFractionsPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellFlowRateCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlotLegend.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFlowCharacteristicsPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellRftPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPltPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDataSourceForRftPlt.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPlotTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellRftEnsembleCurveSet.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlotCollection.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimFlowDiagSolution.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFlowPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTotalWellAllocationPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimTofAccumulatedPhaseFractionsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellFlowRateCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellAllocationPlotLegend.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFlowCharacteristicsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellRftPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPltPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDataSourceForRftPlt.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPlotTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellRftEnsembleCurveSet.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellDistributionPlotCollection.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Flow" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Flow" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimFlowPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimFlowPlotCollection.cpp index cf15909e48..251ee0ed3b 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimFlowPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimFlowPlotCollection.cpp @@ -36,16 +36,16 @@ RimFlowPlotCollection::RimFlowPlotCollection() CAF_PDM_InitObject( "Flow Diagnostics Plots", ":/WellAllocPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_flowCharacteristicsPlot, "FlowCharacteristicsPlot", "", "", "", "" ); - m_flowCharacteristicsPlot.uiCapability()->setUiHidden( true ); + m_flowCharacteristicsPlot.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_defaultWellAllocPlot, "DefaultWellAllocationPlot", "", "", "", "" ); - m_defaultWellAllocPlot.uiCapability()->setUiHidden( true ); + m_defaultWellAllocPlot.uiCapability()->setUiTreeHidden( true ); // CAF_PDM_InitFieldNoDefault( &m_dbgWellDistributionPlot, "DbgWellDistributionPlot", "", "", "", "" ); // m_dbgWellDistributionPlot.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_wellDistributionPlotCollection, "WellDistributionPlotCollection", "", "", "", "" ); - m_wellDistributionPlotCollection.uiCapability()->setUiHidden( true ); + m_wellDistributionPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_storedWellAllocPlots, "StoredWellAllocationPlots", "Stored Well Allocation Plots", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_storedFlowCharacteristicsPlots, diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp index 53b7a0b727..54c262279e 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellAllocationPlot.cpp @@ -99,7 +99,7 @@ RimWellAllocationPlot::RimWellAllocationPlot() CAF_PDM_InitField( &m_groupSmallContributions, "GroupSmallContributions", true, "Group Small Contributions", "", "", "" ); CAF_PDM_InitField( &m_smallContributionsThreshold, "SmallContributionsThreshold", 0.005, "Threshold", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_accumulatedWellFlowPlot, "AccumulatedWellFlowPlot", "Accumulated Well Flow", "", "", "" ); - m_accumulatedWellFlowPlot.uiCapability()->setUiHidden( true ); + m_accumulatedWellFlowPlot.uiCapability()->setUiTreeHidden( true ); m_accumulatedWellFlowPlot = new RimWellLogPlot; m_accumulatedWellFlowPlot->setDepthUnit( RiaDefines::DepthUnitType::UNIT_NONE ); m_accumulatedWellFlowPlot->setDepthType( RiaDefines::DepthTypeEnum::CONNECTION_NUMBER ); @@ -107,11 +107,11 @@ RimWellAllocationPlot::RimWellAllocationPlot() m_accumulatedWellFlowPlot->uiCapability()->setUiIconFromResourceString( ":/WellFlowPlot16x16.png" ); CAF_PDM_InitFieldNoDefault( &m_totalWellAllocationPlot, "TotalWellFlowPlot", "Total Well Flow", "", "", "" ); - m_totalWellAllocationPlot.uiCapability()->setUiHidden( true ); + m_totalWellAllocationPlot.uiCapability()->setUiTreeHidden( true ); m_totalWellAllocationPlot = new RimTotalWellAllocationPlot; CAF_PDM_InitFieldNoDefault( &m_wellAllocationPlotLegend, "WellAllocLegend", "Legend", "", "", "" ); - m_wellAllocationPlotLegend.uiCapability()->setUiHidden( true ); + m_wellAllocationPlotLegend.uiCapability()->setUiTreeHidden( true ); m_wellAllocationPlotLegend = new RimWellAllocationPlotLegend; CAF_PDM_InitFieldNoDefault( &m_tofAccumulatedPhaseFractionsPlot, @@ -120,7 +120,7 @@ RimWellAllocationPlot::RimWellAllocationPlot() "", "", "" ); - m_tofAccumulatedPhaseFractionsPlot.uiCapability()->setUiHidden( true ); + m_tofAccumulatedPhaseFractionsPlot.uiCapability()->setUiTreeHidden( true ); m_tofAccumulatedPhaseFractionsPlot = new RimTofAccumulatedPhaseFractionsPlot; this->setAsPlotMdiWindow(); diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellDistributionPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellDistributionPlotCollection.cpp index ba47ece95d..68d47b1e6a 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellDistributionPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellDistributionPlotCollection.cpp @@ -76,7 +76,7 @@ RimWellDistributionPlotCollection::RimWellDistributionPlotCollection() CAF_PDM_InitField( &m_maximumTof, "MaximumTOF", 20.0, "Maximum Time of Flight [0, 200]", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_plots, "Plots", "", "", "", "" ); - m_plots.uiCapability()->setUiHidden( true ); + m_plots.uiCapability()->setUiTreeHidden( true ); m_plots.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &m_showOil, "ShowOil", true, "Show Oil", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp index 9f3621d0c5..71c8b784ba 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellFlowRateCurve.cpp @@ -28,6 +28,8 @@ #include "RiuQwtPlotCurve.h" +#include "RiaColorTools.h" + #include "qwt_plot.h" #include @@ -201,10 +203,9 @@ void RimWellFlowRateCurve::updateCurveAppearance() if ( m_doFillCurve || isLastCurveInGroup ) // Fill the last curve in group with a transparent color to "tie" the // group together { - QColor curveQColor = - QColor( m_curveColor.value().rByte(), m_curveColor.value().gByte(), m_curveColor.value().bByte() ); - QColor fillColor = curveQColor; - QColor lineColor = curveQColor.darker(); + QColor curveQColor = RiaColorTools::toQColor( m_curveAppearance->color() ); + QColor fillColor = curveQColor; + QColor lineColor = curveQColor.darker(); if ( !m_doFillCurve && isLastCurveInGroup ) { @@ -239,8 +240,6 @@ void RimWellFlowRateCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrd { uiOrdering.add( &m_curveName ); m_curveName.uiCapability()->setUiReadOnly( true ); - uiOrdering.add( &m_curveColor ); - m_curveColor.uiCapability()->setUiReadOnly( true ); uiOrdering.skipRemainingFields(); } diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp index 8c51928c61..77e866a49f 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellPltPlot.cpp @@ -101,7 +101,7 @@ RimWellPltPlot::RimWellPltPlot() CAF_PDM_InitObject( "Well Allocation Plot", ":/WellFlowPlot16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_wellLogPlot_OBSOLETE, "WellLog", "WellLog", "", "", "" ); - m_wellLogPlot_OBSOLETE.uiCapability()->setUiHidden( true ); + m_wellLogPlot_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_wellLogPlot_OBSOLETE.xmlCapability()->setIOWritable( false ); CAF_PDM_InitFieldNoDefault( &m_wellPathName, "WellName", "Well Name", "", "", "" ); @@ -113,7 +113,6 @@ RimWellPltPlot::RimWellPltPlot() m_selectedSources.xmlCapability()->disableIO(); CAF_PDM_InitFieldNoDefault( &m_selectedSourcesForIo, "Sources", "Sources", "", "", "" ); - m_selectedSourcesForIo.uiCapability()->setUiHidden( true ); m_selectedSourcesForIo.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_selectedTimeSteps, "TimeSteps", "Time Steps", "", "", "" ); @@ -1005,7 +1004,7 @@ void RimWellPltPlot::defineEditorAttribute( const caf::PdmFieldHandle* field, //-------------------------------------------------------------------------------------------------- void RimWellPltPlot::initAfterRead() { - RimViewWindow::initAfterRead(); + RimDepthTrackPlot::initAfterRead(); if ( m_wellLogPlot_OBSOLETE ) { diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp index 45c84bed98..6a66cdb702 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.cpp @@ -159,7 +159,7 @@ RimRegularLegendConfig* RimWellRftEnsembleCurveSet::legendConfig() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType() const +RigEnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType() const { if ( m_ensembleColorMode() == ColorMode::BY_ENSEMBLE_PARAM ) { @@ -172,7 +172,7 @@ EnsembleParameter::Type RimWellRftEnsembleCurveSet::currentEnsembleParameterType return eParam.type; } } - return EnsembleParameter::TYPE_NONE; + return RigEnsembleParameter::TYPE_NONE; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h index 0ccf87b507..b50f2a7136 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftEnsembleCurveSet.h @@ -21,6 +21,8 @@ #include "RimEnsembleCurveSetColorManager.h" #include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" + #include "cafPdmChildField.h" #include "cafPdmObject.h" #include "cafPdmProxyValueField.h" @@ -51,9 +53,9 @@ class RimWellRftEnsembleCurveSet : public caf::PdmObject cvf::Color3f caseColor( const RimSummaryCase* summaryCase ) const; QString currentEnsembleParameter() const; - void setEnsembleParameter( const QString& parameterName ); - RimRegularLegendConfig* legendConfig(); - EnsembleParameter::Type currentEnsembleParameterType() const; + void setEnsembleParameter( const QString& parameterName ); + RimRegularLegendConfig* legendConfig(); + RigEnsembleParameter::Type currentEnsembleParameterType() const; protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; diff --git a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp index fac4a21bff..b3d1838b28 100644 --- a/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Flow/RimWellRftPlot.cpp @@ -22,7 +22,6 @@ #include "RiaColorTools.h" #include "RiaDateStringParser.h" #include "RiaSimWellBranchTools.h" -#include "RiaStatisticsTools.h" #include "RifReaderEclipseRft.h" @@ -90,7 +89,7 @@ RimWellRftPlot::RimWellRftPlot() CAF_PDM_InitField( &m_showErrorInObservedData, "ShowErrorObserved", true, "Show Observed Data Error", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_wellLogPlot_OBSOLETE, "WellLog", "Well Log", "", "", "" ); - m_wellLogPlot_OBSOLETE.uiCapability()->setUiHidden( true ); + m_wellLogPlot_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_wellLogPlot_OBSOLETE.xmlCapability()->setIOWritable( false ); m_depthType = RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH; @@ -582,7 +581,6 @@ void RimWellRftPlot::updateCurvesInPlot( const std::set::uiText( rftAddress.wellLogChannel() ); QString label = uiText.replace( ": Pressure", "" ); - label = RiaStatisticsTools::replacePercentileByPValueText( label ); curve->setSymbolLabel( label ); curve->setLineThickness( 3 ); } diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/GeoMech/CMakeLists_files.cmake index 4b4a05231d..c634b8a2b3 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/CMakeLists_files.cmake @@ -1,32 +1,35 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechModels.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCase.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechView.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechResultDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCellColors.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapProjection.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapView.h -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapViewCollection.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechModels.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechView.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechResultDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCellColors.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapProjection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapView.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPartCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPart.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechModels.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechResultDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCellColors.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapProjection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapViewCollection.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechModels.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechResultDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechCellColors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapProjection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechContourMapViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPartCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGeoMechPart.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\GeoMech" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\GeoMech" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCase.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCase.cpp index 2511a90c75..3d4e414d33 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCase.cpp @@ -115,7 +115,7 @@ RimGeoMechCase::RimGeoMechCase( void ) "", "", "All GeoMech Views in the Case" ); - geoMechViews.uiCapability()->setUiHidden( true ); + geoMechViews.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_cohesion, "CaseCohesion", 10.0, "Cohesion", "", "Used to calculate the SE:SFI result", "" ); CAF_PDM_InitField( &m_frictionAngleDeg, diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCellColors.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCellColors.cpp index ce06e602c4..52ff1fb461 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCellColors.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechCellColors.cpp @@ -34,7 +34,7 @@ RimGeoMechCellColors::RimGeoMechCellColors( void ) { CAF_PDM_InitFieldNoDefault( &legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); this->legendConfig = new RimRegularLegendConfig(); - legendConfig.uiCapability()->setUiHidden( true ); + legendConfig.uiCapability()->setUiTreeHidden( true ); legendConfig->changed.connect( this, &RimGeoMechCellColors::onLegendConfigChanged ); } diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp index b87b1f1965..c4bb67d966 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechContourMapProjection.cpp @@ -182,8 +182,13 @@ cvf::BoundingBox RimGeoMechContourMapProjection::calculateExpandedPorBarBBox( in RigFemPartResultsCollection* resultCollection = caseData->femPartResults(); const std::vector& resultValues = resultCollection->resultValues( porBarAddr, 0, timeStep ); + cvf::BoundingBox boundingBox; + + if ( resultValues.empty() ) + { + return boundingBox; + } - cvf::BoundingBox boundingBox; for ( int i = 0; i < m_femPart->elementCount(); ++i ) { size_t resValueIdx = m_femPart->elementNodeResultIdx( (int)i, 0 ); @@ -227,11 +232,17 @@ void RimGeoMechContourMapProjection::updateGridInformation() if ( m_limitToPorePressureRegions ) { m_expandedBoundingBox = calculateExpandedPorBarBBox( view()->currentTimeStep() ); + if ( !m_expandedBoundingBox.isValid() ) + { + m_limitToPorePressureRegions = false; + } } - else + + if ( !m_limitToPorePressureRegions ) { m_expandedBoundingBox = m_gridBoundingBox; } + cvf::Vec3d minExpandedPoint = m_expandedBoundingBox.min() - cvf::Vec3d( gridEdgeOffset(), gridEdgeOffset(), 0.0 ); cvf::Vec3d maxExpandedPoint = m_expandedBoundingBox.max() + cvf::Vec3d( gridEdgeOffset(), gridEdgeOffset(), 0.0 ); if ( m_limitToPorePressureRegions && !m_applyPPRegionLimitVertically ) diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechModels.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechModels.cpp index 9f1a7b26df..7489dd88cd 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechModels.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechModels.cpp @@ -37,7 +37,7 @@ RimGeoMechModels::RimGeoMechModels( void ) CAF_PDM_InitObject( "Geomechanical Models", ":/GeoMechCases48x48.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_cases, "Cases", "", "", "", "" ); - m_cases.uiCapability()->setUiHidden( true ); + m_cases.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.cpp new file mode 100644 index 0000000000..ab35aa23d6 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.cpp @@ -0,0 +1,97 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimGeoMechPart.h" + +#include "RimGeoMechView.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +CAF_PDM_SOURCE_INIT( RimGeoMechPart, "GeoMechPart" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechPart::RimGeoMechPart() +{ + CAF_PDM_InitScriptableObject( "GeoMechPart", ":/GeoMechCase24x24.png", "", "" ); + + CAF_PDM_InitScriptableFieldNoDefault( &m_partId, "PartId", "Part Id", "", "", "" ); + m_partId.uiCapability()->setUiReadOnly( true ); + + nameField()->uiCapability()->setUiReadOnly( true ); + + setDeletable( false ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechPart::~RimGeoMechPart() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechPart::setPartId( int partId ) +{ + m_partId = partId; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimGeoMechPart::partId() const +{ + return m_partId; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechPart::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + updateUiIconFromToggleField(); + + if ( changedField == objectToggleField() ) + { + RimGeoMechView* ownerView; + firstAncestorOrThisOfType( ownerView ); + if ( ownerView ) ownerView->scheduleCreateDisplayModelAndRedraw(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechPart::setDisplacements( const std::vector& displacements ) +{ + m_displacements = displacements; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimGeoMechPart::displacements() const +{ + return m_displacements; +} diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.h new file mode 100644 index 0000000000..9b6b915c80 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPart.h @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RimCheckableNamedObject.h" + +#include "cafPdmChildArrayField.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" + +#include "cvfVector3.h" + +#include + +class RimGeoMechPart : public RimCheckableNamedObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimGeoMechPart(); + ~RimGeoMechPart() override; + + void setPartId( int partId ); + int partId() const; + + void setDisplacements( const std::vector& displacements ); + const std::vector& displacements() const; + +protected: + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + +private: + caf::PdmField m_partId; + + std::vector m_displacements; +}; diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.cpp new file mode 100644 index 0000000000..f26cd94e5b --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.cpp @@ -0,0 +1,205 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimGeoMechPartCollection.h" + +#include "RigFemPartCollection.h" +#include "RigGeoMechCaseData.h" + +#include "RimGeoMechCase.h" +#include "RimGeoMechPart.h" + +#include "RiaLogging.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +CAF_PDM_SOURCE_INIT( RimGeoMechPartCollection, "GeoMechPartCollection" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechPartCollection::RimGeoMechPartCollection() + : m_case( nullptr ) + , m_currentDisplacementTimeStep( -1 ) + , m_displacementsUsed( false ) + , m_currentScaleFactor( 1.0 ) + , m_noDisplacements() +{ + CAF_PDM_InitScriptableObject( "Parts", ":/GeoMechCase24x24.png", "", "" ); + + CAF_PDM_InitScriptableFieldNoDefault( &m_parts, "Parts", "Parts", "", "", "" ); + m_parts.uiCapability()->setUiTreeHidden( true ); + + setDeletable( false ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechPartCollection::~RimGeoMechPartCollection() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechPartCollection::syncWithCase( RimGeoMechCase* geoCase ) +{ + m_case = geoCase; + + if ( geoCase && geoCase->geoMechData() && geoCase->geoMechData()->femParts() ) + { + const int count = geoCase->geoMechData()->femParts()->partCount(); + + if ( count != (int)m_parts.size() ) + { + m_parts.clear(); + + for ( int i = 0; i < count; i++ ) + { + const auto& femPart = geoCase->geoMechData()->femParts()->part( i ); + + RimGeoMechPart* part = new RimGeoMechPart(); + part->setPartId( i ); + part->setName( QString( femPart->name().c_str() ) ); + part->setCheckState( femPart->enabled() ); + m_parts.push_back( part ); + } + } + } + updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimGeoMechPartCollection::parts() const +{ + return m_parts.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechPart* RimGeoMechPartCollection::part( int partId ) const +{ + for ( const auto& part : m_parts ) + { + if ( part->partId() == partId ) return part; + } + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechPartCollection::shouldBeVisibleInTree() const +{ + return m_parts.size() > 1; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechPartCollection::isPartEnabled( int partId ) const +{ + RimGeoMechPart* thepart = part( partId ); + if ( thepart ) return thepart->isChecked(); + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechPartCollection::setCurrentDisplacementSettings( int currentTimeStep, bool showDisplacement, double scaleFactor ) +{ + m_currentDisplacementTimeStep = currentTimeStep; + m_displacementsUsed = showDisplacement; + m_currentScaleFactor = scaleFactor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimGeoMechPartCollection::currentDisplacementTimeStep() const +{ + return m_currentDisplacementTimeStep; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimGeoMechPartCollection::currentDisplacementScaleFactor() const +{ + return m_currentScaleFactor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimGeoMechPartCollection::displacements( int partId ) const +{ + RimGeoMechPart* thepart = part( partId ); + if ( thepart ) return thepart->displacements(); + + return m_noDisplacements; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechPartCollection::isDisplacementsUsed() const +{ + return m_displacementsUsed; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechPartCollection::shouldRebuildPartVisualization( int currentTimeStep, bool showDisplacement, double scaleFactor ) +{ + // if show flag has changed, we need to rebuild grid viz. + bool retVal = m_displacementsUsed != showDisplacement; + + // if scaling or timestep has changed, we need to rebuild grid if the displacement should be visible + if ( showDisplacement ) + retVal = retVal || ( m_currentDisplacementTimeStep != currentTimeStep ) || + ( std::abs( m_currentScaleFactor - scaleFactor ) > 0.0001 ); + + return retVal; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechPartCollection::shouldReloadDisplacements( int currentTimeStep, bool showDisplacement, double scaleFactor ) +{ + // no need to reload something we are not showing + if ( !showDisplacement ) return false; + + // if we have no displacements at all, we need to reload. + for ( const auto& part : m_parts ) + { + if ( part->displacements().size() == 0 ) return true; + } + + // if timestep has changed we need to reload + return m_currentDisplacementTimeStep != currentTimeStep; +} diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.h new file mode 100644 index 0000000000..a095ca5c5b --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechPartCollection.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "cafPdmChildArrayField.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" + +#include "cvfVector3.h" + +#include + +class RimGeoMechPart; +class RimGeoMechCase; + +class RimGeoMechPartCollection : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimGeoMechPartCollection(); + ~RimGeoMechPartCollection() override; + + void syncWithCase( RimGeoMechCase* geoCase ); + + bool shouldRebuildPartVisualization( int currentTimeStep, bool showDisplacement, double scaleFactor ); + bool shouldReloadDisplacements( int currentTimeStep, bool showDisplacement, double scaleFactor ); + bool shouldBeVisibleInTree() const; + + bool isPartEnabled( int partId ) const; + + const std::vector& displacements( int partId ) const; + + void setCurrentDisplacementSettings( int currentTimeStep, bool showDisplacement, double scaleFactor ); + bool isDisplacementsUsed() const; + int currentDisplacementTimeStep() const; + double currentDisplacementScaleFactor() const; + + std::vector parts() const; + +private: + RimGeoMechPart* part( int partId ) const; + + caf::PdmChildArrayField m_parts; + RimGeoMechCase* m_case; + + int m_currentDisplacementTimeStep; + double m_currentScaleFactor; + bool m_displacementsUsed; + + std::vector m_noDisplacements; +}; diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.cpp index fcfdd1bfe4..07841aba05 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.cpp @@ -384,7 +384,7 @@ void RimGeoMechResultDefinition::fieldChangedByUi( const caf::PdmFieldHandle* ch if ( &m_resultVariableUiField == changedField || &m_compactionRefLayerUiField == changedField || &m_timeLapseBaseTimestep == changedField || &m_normalizeByHydrostaticPressure == changedField || - &m_normalizationAirGap == changedField || &m_referenceTimeStep == changedField ) + &m_normalizationAirGap == changedField || &m_referenceTimeStep == changedField || &m_isChecked == changedField ) { QStringList fieldComponentNames = m_resultVariableUiField().split( QRegExp( "\\s+" ) ); if ( fieldComponentNames.size() > 0 ) @@ -411,12 +411,6 @@ void RimGeoMechResultDefinition::fieldChangedByUi( const caf::PdmFieldHandle* ch m_compactionRefLayer = m_compactionRefLayerUiField(); } - if ( m_geomCase->geoMechData() && - m_geomCase->geoMechData()->femPartResults()->assertResultsLoaded( this->resultAddress() ) ) - { - if ( view ) view->hasUserRequestedAnimation = true; - } - if ( propFilter ) { propFilter->setToDefaultValues(); @@ -649,7 +643,7 @@ RigFemResultAddress RimGeoMechResultDefinition::resultAddress() const if ( RigFemPartResultsCollection::isReferenceCaseDependentResult( address ) ) { - address.timeLapseBaseFrameIdx = RigFemResultAddress::noTimeLapseValue(); + address.timeLapseBaseStepIdx = RigFemResultAddress::noTimeLapseValue(); } return address; @@ -677,6 +671,8 @@ RigFemResultPosEnum RimGeoMechResultDefinition::resultPositionType() const //-------------------------------------------------------------------------------------------------- QString RimGeoMechResultDefinition::resultFieldName() const { + if ( !isChecked() ) return ""; + return m_resultFieldName(); } @@ -929,7 +925,7 @@ void RimGeoMechResultDefinition::setResultAddress( const RigFemResultAddress& re m_resultPositionType = resultAddress.resultPosType; m_resultFieldName = QString::fromStdString( resultAddress.fieldName ); m_resultComponentName = QString::fromStdString( resultAddress.componentName ); - m_timeLapseBaseTimestep = resultAddress.timeLapseBaseFrameIdx; + m_timeLapseBaseTimestep = resultAddress.timeLapseBaseStepIdx; m_compactionRefLayer = resultAddress.refKLayerIndex; m_normalizeByHydrostaticPressure = resultAddress.normalizedByHydrostaticPressure; diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.h index 185c860b00..aa3a1dd3dd 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.h +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechResultDefinition.h @@ -20,8 +20,11 @@ #pragma once -#include "RigFemResultPosEnum.h" +#include "RimCheckableObject.h" #include "RimFemResultObserver.h" + +#include "RigFemResultPosEnum.h" + #include "cafAppEnum.h" #include "cafPdmField.h" #include "cafPdmObject.h" @@ -38,7 +41,7 @@ class RimRegularLegendConfig; /// /// //================================================================================================== -class RimGeoMechResultDefinition : public RimFemResultObserver +class RimGeoMechResultDefinition : public RimFemResultObserver, public RimCheckableObject { CAF_PDM_HEADER_INIT; diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp index 371e900d98..c9c94b6228 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.cpp @@ -37,6 +37,8 @@ #include "RimEclipseView.h" #include "RimGeoMechCase.h" #include "RimGeoMechCellColors.h" +#include "RimGeoMechPart.h" +#include "RimGeoMechPartCollection.h" #include "RimGeoMechPropertyFilterCollection.h" #include "RimGridCollection.h" #include "RimIntersectionCollection.h" @@ -86,15 +88,22 @@ RimGeoMechView::RimGeoMechView( void ) CAF_PDM_InitFieldNoDefault( &cellResult, "GridCellResult", "Color Result", ":/CellResult.png", "", "" ); cellResult = new RimGeoMechCellColors(); - cellResult.uiCapability()->setUiHidden( true ); + cellResult.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_tensorResults, "TensorResults", "Tensor Results", "", "", "" ); m_tensorResults = new RimTensorResults(); - m_tensorResults.uiCapability()->setUiHidden( true ); + m_tensorResults.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_propertyFilterCollection, "PropertyFilters", "Property Filters", "", "", "" ); m_propertyFilterCollection = new RimGeoMechPropertyFilterCollection(); - m_propertyFilterCollection.uiCapability()->setUiHidden( true ); + m_propertyFilterCollection.uiCapability()->setUiTreeHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_partsCollection, "Parts", "Parts", "", "", "" ); + m_partsCollection = new RimGeoMechPartCollection(); + m_partsCollection.uiCapability()->setUiTreeHidden( true ); + + CAF_PDM_InitField( &m_showDisplacement, "ShowDisplacement", false, "Show Displacement", "", "", "" ); + CAF_PDM_InitField( &m_displacementScaling, "DisplacementScaling", 1.0, "Scaling Factor", "", "", "" ); m_scaleTransform = new cvf::Transform(); m_vizLogic = new RivGeoMechVizLogic( this ); @@ -162,11 +171,8 @@ void RimGeoMechView::onLoadDataAndUpdate() progress.setProgressDescription( "Reading Current Result" ); CVF_ASSERT( this->cellResult() != nullptr ); - if ( this->hasUserRequestedAnimation() ) - { - m_geomechCase->geoMechData()->femPartResults()->setNormalizationAirGap( this->cellResult()->normalizationAirGap() ); - m_geomechCase->geoMechData()->femPartResults()->assertResultsLoaded( this->cellResult()->resultAddress() ); - } + m_geomechCase->geoMechData()->femPartResults()->setNormalizationAirGap( this->cellResult()->normalizationAirGap() ); + m_geomechCase->geoMechData()->femPartResults()->assertResultsLoaded( this->cellResult()->resultAddress() ); progress.incrementProgress(); progress.setProgressDescription( "Create Display model" ); @@ -175,7 +181,9 @@ void RimGeoMechView::onLoadDataAndUpdate() this->geoMechPropertyFilterCollection()->loadAndInitializePropertyFilters(); m_wellMeasurementCollection->syncWithChangesInWellMeasurementCollection(); - if ( this->m_surfaceCollection ) this->m_surfaceCollection->loadData(); + if ( m_surfaceCollection ) m_surfaceCollection->loadData(); + + if ( m_partsCollection ) m_partsCollection->syncWithCase( m_geomechCase ); this->scheduleCreateDisplayModelAndRedraw(); @@ -184,8 +192,6 @@ void RimGeoMechView::onLoadDataAndUpdate() //-------------------------------------------------------------------------------------------------- /// -/// Todo: Work in progress -/// //-------------------------------------------------------------------------------------------------- void RimGeoMechView::onUpdateScaleTransform() @@ -244,10 +250,18 @@ void RimGeoMechView::onCreateDisplayModel() if ( !( m_geomechCase && m_geomechCase->geoMechData() && m_geomechCase->geoMechData()->femParts() ) ) return; - int partCount = m_geomechCase->geoMechData()->femParts()->partCount(); + const auto& theParts = femParts(); + int partCount = theParts->partCount(); if ( partCount <= 0 ) return; + for ( int i = 0; i < partCount; i++ ) + { + theParts->part( i )->setEnabled( m_partsCollection()->isPartEnabled( i ) ); + } + + updateElementDisplacements(); + // Remove all existing animation frames from the viewer. // The parts are still cached in the RivReservoir geometry and friends @@ -334,6 +348,31 @@ RimPropertyFilterCollection* RimGeoMechView::nativePropertyFilterCollection() return m_propertyFilterCollection(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGeoMechView::updateElementDisplacements() +{ + if ( !m_partsCollection->shouldRebuildPartVisualization( m_currentTimeStep, m_showDisplacement, m_displacementScaling ) ) + return; + + if ( m_partsCollection->shouldReloadDisplacements( m_currentTimeStep, m_showDisplacement, m_displacementScaling ) ) + { + for ( auto part : m_partsCollection->parts() ) + { + std::string errmsg; + std::vector displacements; + m_geomechCase->geoMechData()->readDisplacements( &errmsg, part->partId(), m_currentTimeStep, &displacements ); + part->setDisplacements( displacements ); + } + } + // store current settings so that we know if we need to rebuild later if any of them changes + m_partsCollection->setCurrentDisplacementSettings( m_currentTimeStep, m_showDisplacement, m_displacementScaling ); + + // tell geometry generator to regenerate grid + m_vizLogic->scheduleGeometryRegenOfVisiblePartMgrs( m_currentTimeStep ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -341,6 +380,8 @@ void RimGeoMechView::onUpdateDisplayModelForCurrentTimeStep() { onUpdateLegends(); + updateElementDisplacements(); + if ( this->isTimeStepDependentDataVisibleInThisOrComparisonView() ) { if ( nativeOrOverrideViewer() ) @@ -393,14 +434,21 @@ void RimGeoMechView::onUpdateDisplayModelForCurrentTimeStep() } } - if ( this->cellResult()->hasResult() ) + bool hasGeneralCellResult = this->cellResult()->hasResult(); + + if ( hasGeneralCellResult ) m_vizLogic->updateCellResultColor( m_currentTimeStep(), this->cellResult() ); else m_vizLogic->updateStaticCellColors( m_currentTimeStep() ); - bool hasGeneralCellResult = this->cellResult()->hasResult(); + // Intersections + { + m_intersectionVizModel->removeAllParts(); + m_intersectionCollection->rebuildGeometry(); + m_intersectionCollection->appendPartsToModel( *this, m_intersectionVizModel.p(), scaleTransform() ); + m_intersectionCollection->updateCellResultColor( hasGeneralCellResult, m_currentTimeStep ); + } - m_intersectionCollection->updateCellResultColor( hasGeneralCellResult, m_currentTimeStep ); if ( m_surfaceCollection ) { m_surfaceCollection->updateCellResultColor( hasGeneralCellResult, m_currentTimeStep ); @@ -766,8 +814,7 @@ size_t RimGeoMechView::onTimeStepCountRequested() //-------------------------------------------------------------------------------------------------- bool RimGeoMechView::isTimeStepDependentDataVisible() const { - if ( this->hasUserRequestedAnimation() && - ( this->cellResult()->hasResult() || this->geoMechPropertyFilterCollection()->hasActiveFilters() ) ) + if ( this->cellResult()->hasResult() || this->geoMechPropertyFilterCollection()->hasActiveFilters() ) { return true; } @@ -792,6 +839,11 @@ bool RimGeoMechView::isTimeStepDependentDataVisible() const return true; } + if ( ( m_showDisplacement ) || m_partsCollection->isDisplacementsUsed() ) + { + return true; + } + return false; } @@ -811,6 +863,11 @@ void RimGeoMechView::fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& newValue ) { RimGridView::fieldChangedByUi( changedField, oldValue, newValue ); + + if ( ( changedField == &m_showDisplacement ) || ( ( changedField == &m_displacementScaling ) && m_showDisplacement() ) ) + { + this->createDisplayModelAndRedraw(); + } } //-------------------------------------------------------------------------------------------------- @@ -947,6 +1004,10 @@ void RimGeoMechView::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "View Name" ); nameConfig()->uiOrdering( uiConfigName, *nameGroup ); + + auto displacementGroup = uiOrdering.addNewGroup( "Displacements" ); + displacementGroup->add( &m_showDisplacement ); + displacementGroup->add( &m_displacementScaling ); } //-------------------------------------------------------------------------------------------------- @@ -956,18 +1017,18 @@ void RimGeoMechView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin { uiTreeOrdering.add( m_overlayInfoConfig() ); uiTreeOrdering.add( m_gridCollection() ); + if ( m_partsCollection->shouldBeVisibleInTree() ) uiTreeOrdering.add( m_partsCollection() ); uiTreeOrdering.add( cellResult() ); uiTreeOrdering.add( m_tensorResults() ); + uiTreeOrdering.add( m_cellFilterCollection() ); + uiTreeOrdering.add( m_propertyFilterCollection() ); addRequiredUiTreeObjects( uiTreeOrdering ); uiTreeOrdering.add( m_intersectionCollection() ); if ( surfaceInViewCollection() ) uiTreeOrdering.add( surfaceInViewCollection() ); - uiTreeOrdering.add( m_cellFilterCollection() ); - uiTreeOrdering.add( m_propertyFilterCollection() ); - uiTreeOrdering.skipRemainingChildren( true ); } @@ -986,3 +1047,27 @@ const RimPropertyFilterCollection* RimGeoMechView::propertyFilterCollection() co { return geoMechPropertyFilterCollection(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RimGeoMechPartCollection* RimGeoMechView::partsCollection() const +{ + return m_partsCollection(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimGeoMechView::displacementScaleFactor() const +{ + return m_displacementScaling; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimGeoMechView::showDisplacements() const +{ + return m_showDisplacement; +} diff --git a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h index 070ea116e6..1e63cd01a6 100644 --- a/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h +++ b/ApplicationLibCode/ProjectDataModel/GeoMech/RimGeoMechView.h @@ -37,6 +37,7 @@ class Rim3dOverlayInfoConfig; class RimCellRangeFilterCollection; class RimGeoMechCase; class RimGeoMechCellColors; +class RimGeoMechPartCollection; class RimGeoMechPropertyFilterCollection; class RimGeoMechResultDefinition; class RimRegularLegendConfig; @@ -45,6 +46,7 @@ class RiuViewer; class RivGeoMechPartMgr; class RivGeoMechVizLogic; class RivTensorResultPartMgr; +class RimGeoMechPartCollection; namespace cvf { @@ -73,6 +75,8 @@ class RimGeoMechView : public RimGridView const RimPropertyFilterCollection* propertyFilterCollection() const override; + const RimGeoMechPartCollection* partsCollection() const; + RimGeoMechPropertyFilterCollection* geoMechPropertyFilterCollection(); const RimGeoMechPropertyFilterCollection* geoMechPropertyFilterCollection() const; void setOverridePropertyFilterCollection( RimGeoMechPropertyFilterCollection* pfc ); @@ -102,6 +106,9 @@ class RimGeoMechView : public RimGridView void convertCameraPositionFromOldProjectFiles(); + double displacementScaleFactor() const; + bool showDisplacements() const; + protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; @@ -130,13 +137,18 @@ class RimGeoMechView : public RimGridView void updateTensorLegendTextAndRanges( RimRegularLegendConfig* legendConfig, int timeStepIndex ); + void updateElementDisplacements(); + caf::PdmChildField m_tensorResults; caf::PdmChildField m_propertyFilterCollection; caf::PdmPointer m_overridePropertyFilterCollection; + caf::PdmChildField m_partsCollection; + caf::PdmPointer m_geomechCase; + caf::PdmField m_showDisplacement; + caf::PdmField m_displacementScaling; - caf::PdmPointer m_geomechCase; - cvf::ref m_vizLogic; - cvf::ref m_scaleTransform; + cvf::ref m_vizLogic; + cvf::ref m_scaleTransform; cvf::ref m_tensorPartMgr; }; diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CMakeLists_files.cmake index 7945d82f5e..aff355e8c0 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CMakeLists_files.cmake @@ -1,32 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotDataSet.h -${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlot.h -${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlotCollection.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotDataSet.h + ${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlotCollection.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotDataSet.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlotCollection.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlotDataSet.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSaturationPressurePlotCollection.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.h -) +list(APPEND QT_MOC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/RimGridCrossPlot.h) -source_group( "ProjectDataModel\\GridCrossPlots" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\GridCrossPlots" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/CMakeLists_files.cmake index 46fc736a04..52dcbe9860 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/CMakeLists_files.cmake @@ -1,22 +1,21 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellPropertyFilter.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellPropertyFilter.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotCellPropertyFilter.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotCellPropertyFilter.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\GridCrossPlots\\CellFilters" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\GridCrossPlots\\CellFilters" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellFilterCollection.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellFilterCollection.cpp index 379dffb924..e0d44b0b8d 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellFilterCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellFilterCollection.cpp @@ -31,7 +31,7 @@ RimPlotCellFilterCollection::RimPlotCellFilterCollection() CAF_PDM_InitObject( "Plot Cell Filters", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_cellFilters, "CellFilters", "Cell Filters", "", "", "" ); - m_cellFilters.uiCapability()->setUiHidden( true ); + m_cellFilters.uiCapability()->setUiTreeHidden( true ); setName( "Filter Collection" ); } diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellPropertyFilter.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellPropertyFilter.cpp index a621953999..c4848cd2b1 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellPropertyFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/CellFilters/RimPlotCellPropertyFilter.cpp @@ -45,7 +45,7 @@ RimPlotCellPropertyFilter::RimPlotCellPropertyFilter() // Set to hidden to avoid this item to been displayed as a child item // Fields in this object are displayed using defineUiOrdering() - m_resultDefinition.uiCapability()->setUiHidden( true ); + m_resultDefinition.uiCapability()->setUiTreeHidden( true ); m_resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &m_lowerBound, "LowerBound", 0.0, "Min", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp index aebf1de334..c65369fcfa 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlot.cpp @@ -77,7 +77,7 @@ RimGridCrossPlot::RimGridCrossPlot() connectAxisSignals( m_yAxisProperties() ); CAF_PDM_InitFieldNoDefault( &m_crossPlotDataSets, "CrossPlotCurve", "Cross Plot Data Set", "", "", "" ); - m_crossPlotDataSets.uiCapability()->setUiHidden( true ); + m_crossPlotDataSets.uiCapability()->setUiTreeHidden( true ); setDeletable( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp index 0103654a9f..7543aa02fe 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotCollection.cpp @@ -30,7 +30,7 @@ RimGridCrossPlotCollection::RimGridCrossPlotCollection() CAF_PDM_InitObject( "Grid Cross Plots", ":/SummaryXPlotsLight16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_gridCrossPlots, "GridCrossPlots", "Grid Cross Plots", "", "", "" ); - m_gridCrossPlots.uiCapability()->setUiHidden( true ); + m_gridCrossPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp index 55d0c53b7a..cf1f73583a 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimGridCrossPlotDataSet.cpp @@ -97,13 +97,13 @@ RimGridCrossPlotDataSet::RimGridCrossPlotDataSet() CAF_PDM_InitFieldNoDefault( &m_xAxisProperty, "XAxisProperty", "X-Axis Property", "", "", "" ); m_xAxisProperty = new RimEclipseResultDefinition( caf::PdmUiItemInfo::TOP ); - m_xAxisProperty.uiCapability()->setUiHidden( true ); + m_xAxisProperty.uiCapability()->setUiTreeHidden( true ); m_xAxisProperty.uiCapability()->setUiTreeChildrenHidden( true ); m_xAxisProperty->setTernaryEnabled( false ); CAF_PDM_InitFieldNoDefault( &m_yAxisProperty, "YAxisProperty", "Y-Axis Property", "", "", "" ); m_yAxisProperty = new RimEclipseResultDefinition( caf::PdmUiItemInfo::TOP ); - m_yAxisProperty.uiCapability()->setUiHidden( true ); + m_yAxisProperty.uiCapability()->setUiTreeHidden( true ); m_yAxisProperty.uiCapability()->setUiTreeChildrenHidden( true ); m_yAxisProperty->setTernaryEnabled( false ); @@ -111,7 +111,7 @@ RimGridCrossPlotDataSet::RimGridCrossPlotDataSet() CAF_PDM_InitFieldNoDefault( &m_groupingProperty, "GroupingProperty", "Data Grouping Property", "", "", "" ); m_groupingProperty = new RimEclipseCellColors; m_groupingProperty->useDiscreteLogLevels( true ); - m_groupingProperty.uiCapability()->setUiHidden( true ); + m_groupingProperty.uiCapability()->setUiTreeHidden( true ); CVF_ASSERT( m_groupingProperty->legendConfig() ); m_groupingProperty->legendConfig()->setMappingMode( RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ); m_groupingProperty->setTernaryEnabled( false ); @@ -128,7 +128,6 @@ RimGridCrossPlotDataSet::RimGridCrossPlotDataSet() CAF_PDM_InitField( &m_customColor, "CustomColor", cvf::Color3f( cvf::Color3f::BLACK ), "Custom Color", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_plotCellFilterCollection, "PlotCellFilterCollection", "Cell Filters", "", "", "" ); - m_plotCellFilterCollection.uiCapability()->setUiHidden( true ); m_plotCellFilterCollection.uiCapability()->setUiTreeHidden( true ); m_plotCellFilterCollection.uiCapability()->setUiTreeChildrenHidden( true ); m_plotCellFilterCollection = new RimPlotCellFilterCollection; diff --git a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp index 7be11709f4..50349469b8 100644 --- a/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/GridCrossPlots/RimSaturationPressurePlotCollection.cpp @@ -37,7 +37,7 @@ RimSaturationPressurePlotCollection::RimSaturationPressurePlotCollection() CAF_PDM_InitObject( "Saturation Pressure Plots", ":/SummaryXPlotsLight16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_saturationPressurePlots, "SaturationPressurePlots", "Saturation Pressure Plots", "", "", "" ); - m_saturationPressurePlots.uiCapability()->setUiHidden( true ); + m_saturationPressurePlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Intersections/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Intersections/CMakeLists_files.cmake new file mode 100644 index 0000000000..51adff8c51 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Intersections/CMakeLists_files.cmake @@ -0,0 +1,27 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimBoxIntersection.h + ${CMAKE_CURRENT_LIST_DIR}/RimIntersection.h + ${CMAKE_CURRENT_LIST_DIR}/RimExtrudedCurveIntersection.h + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultsDefinitionCollection.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimIntersection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimExtrudedCurveIntersection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimIntersectionResultsDefinitionCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimBoxIntersection.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "ProjectDataModel\\Intersection" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/RimBoxIntersection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.cpp similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimBoxIntersection.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.cpp index de0dbbd4e4..ea6c0bd8b0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimBoxIntersection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.cpp @@ -51,7 +51,7 @@ CAF_PDM_SOURCE_INIT( RimBoxIntersection, "IntersectionBox" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RimBoxIntersection::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RimBoxIntersection::intersectionGeometryGenerator() const { if ( m_intersectionBoxPartMgr.notNull() ) return m_intersectionBoxPartMgr->intersectionGeometryGenerator(); diff --git a/ApplicationLibCode/ProjectDataModel/RimBoxIntersection.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.h similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimBoxIntersection.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.h index 9669a29a2d..ef15deae18 100644 --- a/ApplicationLibCode/ProjectDataModel/RimBoxIntersection.h +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimBoxIntersection.h @@ -78,7 +78,7 @@ class RimBoxIntersection : public QObject, public RimIntersection void setToDefaultSizeBox(); void setToDefaultSizeSlice( SinglePlaneState plane, const cvf::Vec3d& position ); - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const override; + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const override; protected: caf::PdmFieldHandle* userDescriptionField() final; diff --git a/ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp similarity index 62% rename from ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp index f679373ba0..06ce283e76 100644 --- a/ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.cpp @@ -19,17 +19,29 @@ #include "RimExtrudedCurveIntersection.h" +#include "RiaVec3Tools.h" + #include "RigEclipseCaseData.h" #include "RigWellPath.h" +#include "Rim2dIntersectionView.h" #include "Rim3dView.h" #include "RimCase.h" #include "RimEclipseCase.h" #include "RimEclipseView.h" +#include "RimEnsembleSurface.h" +#include "RimGridView.h" +#include "RimIntersectionResultDefinition.h" +#include "RimIntersectionResultsDefinitionCollection.h" #include "RimOilField.h" #include "RimProject.h" #include "RimSimWellInView.h" #include "RimSimWellInViewCollection.h" +#include "RimSurface.h" +#include "RimSurfaceCollection.h" +#include "RimSurfaceIntersectionBand.h" +#include "RimSurfaceIntersectionCollection.h" +#include "RimSurfaceIntersectionCurve.h" #include "RimTools.h" #include "RimWellPath.h" @@ -42,10 +54,8 @@ #include "cafPdmUiListEditor.h" #include "cafPdmUiPushButtonEditor.h" -#include "Rim2dIntersectionView.h" -#include "RimGridView.h" -#include "RimIntersectionResultDefinition.h" -#include "RimIntersectionResultsDefinitionCollection.h" +#include "cafPdmUiTreeOrdering.h" +#include "cafPdmUiTreeSelectionEditor.h" #include "cvfBoundingBox.h" #include "cvfGeometryTools.h" #include "cvfPlane.h" @@ -55,20 +65,20 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimExtrudedCurveIntersection::CS_WELL_PATH, "CS_WELL_PATH", "Well Path" ); - addItem( RimExtrudedCurveIntersection::CS_SIMULATION_WELL, "CS_SIMULATION_WELL", "Simulation Well" ); - addItem( RimExtrudedCurveIntersection::CS_POLYLINE, "CS_POLYLINE", "Polyline" ); - addItem( RimExtrudedCurveIntersection::CS_AZIMUTHLINE, "CS_AZIMUTHLINE", "Azimuth and Dip" ); - setDefault( RimExtrudedCurveIntersection::CS_WELL_PATH ); + addItem( RimExtrudedCurveIntersection::CrossSectionEnum::CS_WELL_PATH, "CS_WELL_PATH", "Well Path" ); + addItem( RimExtrudedCurveIntersection::CrossSectionEnum::CS_SIMULATION_WELL, "CS_SIMULATION_WELL", "Simulation Well" ); + addItem( RimExtrudedCurveIntersection::CrossSectionEnum::CS_POLYLINE, "CS_POLYLINE", "Polyline" ); + addItem( RimExtrudedCurveIntersection::CrossSectionEnum::CS_AZIMUTHLINE, "CS_AZIMUTHLINE", "Azimuth and Dip" ); + setDefault( RimExtrudedCurveIntersection::CrossSectionEnum::CS_WELL_PATH ); } template <> void caf::AppEnum::setUp() { - addItem( RimExtrudedCurveIntersection::CS_VERTICAL, "CS_VERTICAL", "Vertical" ); - addItem( RimExtrudedCurveIntersection::CS_HORIZONTAL, "CS_HORIZONTAL", "Horizontal" ); - addItem( RimExtrudedCurveIntersection::CS_TWO_POINTS, "CS_TWO_POINTS", "Defined by Two Points" ); - setDefault( RimExtrudedCurveIntersection::CS_VERTICAL ); + addItem( RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_VERTICAL, "CS_VERTICAL", "Vertical" ); + addItem( RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_HORIZONTAL, "CS_HORIZONTAL", "Horizontal" ); + addItem( RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_TWO_POINTS, "CS_TWO_POINTS", "Defined by Two Points" ); + setDefault( RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_VERTICAL ); } } // namespace caf @@ -78,13 +88,105 @@ CAF_PDM_SOURCE_INIT( RimExtrudedCurveIntersection, "CrossSection" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RimExtrudedCurveIntersection::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RimExtrudedCurveIntersection::intersectionGeometryGenerator() const { if ( m_crossSectionPartMgr.notNull() ) return m_crossSectionPartMgr->intersectionGeometryGenerator(); return nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimExtrudedCurveIntersection::CrossSectionEnum RimExtrudedCurveIntersection::type() const +{ + return m_type(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimExtrudedCurveIntersection::CrossSectionDirEnum RimExtrudedCurveIntersection::direction() const +{ + return m_direction(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellPath* RimExtrudedCurveIntersection::wellPath() const +{ + return m_wellPath; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSimWellInView* RimExtrudedCurveIntersection::simulationWell() const +{ + return m_simulationWell; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimExtrudedCurveIntersection::inputPolyLineFromViewerEnabled() const +{ + return m_inputPolylineFromViewerEnabled; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimExtrudedCurveIntersection::inputExtrusionPointsFromViewerEnabled() const +{ + return m_inputExtrusionPointsFromViewerEnabled; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimExtrudedCurveIntersection::inputTwoAzimuthPointsFromViewerEnabled() const +{ + return m_inputTwoAzimuthPointsFromViewerEnabled; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::configureForSimulationWell( RimSimWellInView* simWell ) +{ + m_type = CrossSectionEnum::CS_SIMULATION_WELL; + m_simulationWell = simWell; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::configureForWellPath( RimWellPath* wellPath ) +{ + m_type = CrossSectionEnum::CS_WELL_PATH; + m_wellPath = wellPath; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::configureForPolyLine() +{ + m_type = CrossSectionEnum::CS_POLYLINE; + m_inputPolylineFromViewerEnabled = true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::configureForAzimuthLine() +{ + m_type = CrossSectionEnum::CS_AZIMUTHLINE; + m_inputTwoAzimuthPointsFromViewerEnabled = true; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -93,11 +195,15 @@ RimExtrudedCurveIntersection::RimExtrudedCurveIntersection() CAF_PDM_InitObject( "Intersection", ":/CrossSection16x16.png", "", "" ); CAF_PDM_InitField( &m_name, "UserDescription", QString( "Intersection Name" ), "Name", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &type, "Type", "Type", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &direction, "Direction", "Direction", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &wellPath, "WellPath", "Well Path ", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &simulationWell, "SimulationWell", "Simulation Well", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_userPolyline, "Points", "Points", "", "Use Ctrl-C for copy and Ctrl-V for paste", "" ); + CAF_PDM_InitFieldNoDefault( &m_type, "Type", "Type", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_direction, "Direction", "Direction", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_wellPath, "WellPath", "Well Path ", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_simulationWell, "SimulationWell", "Simulation Well", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_userPolylineXyz, "Points", "Points", "", "Use Ctrl-C for copy and Ctrl-V for paste", "" ); + + CAF_PDM_InitFieldNoDefault( &m_userPolylineXydForUi, "PointsUi", "Points", "", "Use Ctrl-C for copy and Ctrl-V for paste", "" ); + m_userPolylineXydForUi.registerSetMethod( this, &RimExtrudedCurveIntersection::setPointsFromXYD ); + m_userPolylineXydForUi.registerGetMethod( this, &RimExtrudedCurveIntersection::pointsXYD ); CAF_PDM_InitField( &m_azimuthAngle, "AzimuthAngle", 0.0, "Azimuth", "", "", "" ); m_azimuthAngle.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); @@ -118,24 +224,31 @@ RimExtrudedCurveIntersection::RimExtrudedCurveIntersection() CAF_PDM_InitField( &m_lengthUp, "lengthUp", 1000.0, "Length Up", "", "", "" ); CAF_PDM_InitField( &m_lengthDown, "lengthDown", 1000.0, "Length Down", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &inputPolyLineFromViewerEnabled, "m_activateUiAppendPointsCommand", "", "", "", "" ); - caf::PdmUiPushButtonEditor::configureEditorForField( &inputPolyLineFromViewerEnabled ); - inputPolyLineFromViewerEnabled = false; + CAF_PDM_InitFieldNoDefault( &m_inputPolylineFromViewerEnabled, "m_activateUiAppendPointsCommand", "", "", "", "" ); + caf::PdmUiPushButtonEditor::configureEditorForField( &m_inputPolylineFromViewerEnabled ); + m_inputPolylineFromViewerEnabled = false; - CAF_PDM_InitFieldNoDefault( &inputExtrusionPointsFromViewerEnabled, "inputExtrusionPointsFromViewerEnabled", "", "", "", "" ); - caf::PdmUiPushButtonEditor::configureEditorForField( &inputExtrusionPointsFromViewerEnabled ); - inputExtrusionPointsFromViewerEnabled = false; + CAF_PDM_InitFieldNoDefault( &m_inputExtrusionPointsFromViewerEnabled, + "inputExtrusionPointsFromViewerEnabled", + "", + "", + "", + "" ); + caf::PdmUiPushButtonEditor::configureEditorForField( &m_inputExtrusionPointsFromViewerEnabled ); + m_inputExtrusionPointsFromViewerEnabled = false; - CAF_PDM_InitFieldNoDefault( &inputTwoAzimuthPointsFromViewerEnabled, + CAF_PDM_InitFieldNoDefault( &m_inputTwoAzimuthPointsFromViewerEnabled, "inputTwoAzimuthPointsFromViewerEnabled", "", "", "", "" ); - caf::PdmUiPushButtonEditor::configureEditorForField( &inputTwoAzimuthPointsFromViewerEnabled ); - inputTwoAzimuthPointsFromViewerEnabled = false; + caf::PdmUiPushButtonEditor::configureEditorForField( &m_inputTwoAzimuthPointsFromViewerEnabled ); + m_inputTwoAzimuthPointsFromViewerEnabled = false; - uiCapability()->setUiTreeChildrenHidden( true ); + CAF_PDM_InitFieldNoDefault( &m_surfaceIntersections, "SurfaceIntersections", "Surface Intersections", "", "", "" ); + m_surfaceIntersections = new RimSurfaceIntersectionCollection; + m_surfaceIntersections->objectChanged.connect( this, &RimExtrudedCurveIntersection::onSurfaceIntersectionsChanged ); setDeletable( true ); } @@ -178,30 +291,21 @@ void RimExtrudedCurveIntersection::fieldChangedByUi( const caf::PdmFieldHandle* const QVariant& oldValue, const QVariant& newValue ) { - // clang-format off - if ( changedField == &m_isActive || - changedField == &type || - changedField == &direction || - changedField == &wellPath || - changedField == &simulationWell || - changedField == &m_branchIndex || - changedField == &m_extentLength || - changedField == &m_lengthUp || - changedField == &m_lengthDown || - changedField == &m_showInactiveCells || - changedField == &m_useSeparateDataSource || + if ( changedField == &m_isActive || changedField == &m_type || changedField == &m_direction || + changedField == &m_wellPath || changedField == &m_simulationWell || changedField == &m_branchIndex || + changedField == &m_extentLength || changedField == &m_lengthUp || changedField == &m_lengthDown || + changedField == &m_showInactiveCells || changedField == &m_useSeparateDataSource || changedField == &m_separateDataSource ) { rebuildGeometryAndScheduleCreateDisplayModel(); } - // clang-format on - if ( changedField == &simulationWell || changedField == &m_isActive || changedField == &type ) + if ( changedField == &m_simulationWell || changedField == &m_isActive || changedField == &m_type ) { recomputeSimulationWellBranchData(); } - if ( changedField == &simulationWell || changedField == &wellPath || changedField == &m_branchIndex ) + if ( changedField == &m_simulationWell || changedField == &m_wellPath || changedField == &m_branchIndex ) { updateName(); } @@ -216,34 +320,35 @@ void RimExtrudedCurveIntersection::fieldChangedByUi( const caf::PdmFieldHandle* } } - if ( changedField == &inputPolyLineFromViewerEnabled || changedField == &m_userPolyline ) + if ( changedField == &m_inputPolylineFromViewerEnabled || changedField == &m_userPolylineXyz || + changedField == &m_userPolylineXydForUi ) { - if ( inputPolyLineFromViewerEnabled ) + if ( m_inputPolylineFromViewerEnabled ) { - inputExtrusionPointsFromViewerEnabled = false; - inputTwoAzimuthPointsFromViewerEnabled = false; + m_inputExtrusionPointsFromViewerEnabled = false; + m_inputTwoAzimuthPointsFromViewerEnabled = false; } rebuildGeometryAndScheduleCreateDisplayModel(); } - if ( changedField == &inputExtrusionPointsFromViewerEnabled || changedField == &m_customExtrusionPoints ) + if ( changedField == &m_inputExtrusionPointsFromViewerEnabled || changedField == &m_customExtrusionPoints ) { - if ( inputExtrusionPointsFromViewerEnabled ) + if ( m_inputExtrusionPointsFromViewerEnabled ) { - inputPolyLineFromViewerEnabled = false; - inputTwoAzimuthPointsFromViewerEnabled = false; + m_inputPolylineFromViewerEnabled = false; + m_inputTwoAzimuthPointsFromViewerEnabled = false; } rebuildGeometryAndScheduleCreateDisplayModel(); } - if ( changedField == &inputTwoAzimuthPointsFromViewerEnabled || changedField == &m_twoAzimuthPoints ) + if ( changedField == &m_inputTwoAzimuthPointsFromViewerEnabled || changedField == &m_twoAzimuthPoints ) { - if ( inputTwoAzimuthPointsFromViewerEnabled ) + if ( m_inputTwoAzimuthPointsFromViewerEnabled ) { - inputPolyLineFromViewerEnabled = false; - inputExtrusionPointsFromViewerEnabled = false; + m_inputPolylineFromViewerEnabled = false; + m_inputExtrusionPointsFromViewerEnabled = false; } rebuildGeometryAndScheduleCreateDisplayModel(); @@ -268,56 +373,56 @@ void RimExtrudedCurveIntersection::defineUiOrdering( QString uiConfigName, caf:: { uiOrdering.add( &m_name ); caf::PdmUiGroup* geometryGroup = uiOrdering.addNewGroup( "Intersecting Geometry" ); - geometryGroup->add( &type ); + geometryGroup->add( &m_type ); - if ( type == CS_WELL_PATH ) + if ( m_type() == CrossSectionEnum::CS_WELL_PATH ) { - geometryGroup->add( &wellPath ); + geometryGroup->add( &m_wellPath ); } - else if ( type == CS_SIMULATION_WELL ) + else if ( type() == CrossSectionEnum::CS_SIMULATION_WELL ) { - geometryGroup->add( &simulationWell ); + geometryGroup->add( &m_simulationWell ); updateSimulationWellCenterline(); - if ( simulationWell() && m_simulationWellBranchCenterlines.size() > 1 ) + if ( m_simulationWell() && m_simulationWellBranchCenterlines.size() > 1 ) { geometryGroup->add( &m_branchIndex ); } } - else if ( type == CS_POLYLINE ) + else if ( type() == CrossSectionEnum::CS_POLYLINE ) { - geometryGroup->add( &m_userPolyline ); - geometryGroup->add( &inputPolyLineFromViewerEnabled ); + geometryGroup->add( &m_userPolylineXydForUi ); + geometryGroup->add( &m_inputPolylineFromViewerEnabled ); } - else if ( type == CS_AZIMUTHLINE ) + else if ( type() == CrossSectionEnum::CS_AZIMUTHLINE ) { geometryGroup->add( &m_twoAzimuthPoints ); - geometryGroup->add( &inputTwoAzimuthPointsFromViewerEnabled ); + geometryGroup->add( &m_inputTwoAzimuthPointsFromViewerEnabled ); geometryGroup->add( &m_azimuthAngle ); geometryGroup->add( &m_dipAngle ); } caf::PdmUiGroup* optionsGroup = uiOrdering.addNewGroup( "Options" ); - if ( type == CS_AZIMUTHLINE ) + if ( type() == CrossSectionEnum::CS_AZIMUTHLINE ) { optionsGroup->add( &m_lengthUp ); optionsGroup->add( &m_lengthDown ); } else { - optionsGroup->add( &direction ); + optionsGroup->add( &m_direction ); optionsGroup->add( &m_extentLength ); } - if ( direction == CS_TWO_POINTS ) + if ( direction() == CrossSectionDirEnum::CS_TWO_POINTS ) { optionsGroup->add( &m_customExtrusionPoints ); - optionsGroup->add( &inputExtrusionPointsFromViewerEnabled ); + optionsGroup->add( &m_inputExtrusionPointsFromViewerEnabled ); } optionsGroup->add( &m_showInactiveCells ); - if ( type == CS_POLYLINE ) + if ( type() == CrossSectionEnum::CS_POLYLINE ) { m_extentLength.uiCapability()->setUiReadOnly( true ); } @@ -340,16 +445,16 @@ QList { QList options; - if ( fieldNeedingOptions == &wellPath ) + if ( fieldNeedingOptions == &m_wellPath ) { RimTools::wellPathOptionItems( &options ); - if ( options.size() > 0 ) + if ( !options.empty() ) { options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); } } - else if ( fieldNeedingOptions == &simulationWell ) + else if ( fieldNeedingOptions == &m_simulationWell ) { RimSimWellInViewCollection* coll = simulationWellCollection(); if ( coll ) @@ -363,7 +468,7 @@ QList } } - if ( options.size() == 0 ) + if ( options.empty() ) { options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); } @@ -389,6 +494,23 @@ QList return options; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) +{ + for ( auto c : m_surfaceIntersections->surfaceIntersectionCurves() ) + { + uiTreeOrdering.add( c ); + } + for ( auto c : m_surfaceIntersections->surfaceIntersectionBands() ) + { + uiTreeOrdering.add( c ); + } + + uiTreeOrdering.skipRemainingChildren( true ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -438,11 +560,11 @@ std::vector> RimExtrudedCurveIntersection::polyLines( cv double horizontalProjectedLengthAlongWellPathToClipPoint = 0.0; - if ( type == CS_WELL_PATH ) + if ( type() == CrossSectionEnum::CS_WELL_PATH ) { - if ( wellPath() && wellPath->wellPathGeometry() ) + if ( m_wellPath() && wellPath()->wellPathGeometry() ) { - lines.push_back( wellPath->wellPathGeometry()->wellPathPoints() ); + lines.push_back( wellPath()->wellPathGeometry()->wellPathPoints() ); RimCase* ownerCase = nullptr; this->firstAncestorOrThisOfType( ownerCase ); if ( ownerCase ) @@ -455,9 +577,9 @@ std::vector> RimExtrudedCurveIntersection::polyLines( cv } } } - else if ( type == CS_SIMULATION_WELL ) + else if ( type() == CrossSectionEnum::CS_SIMULATION_WELL ) { - if ( simulationWell() ) + if ( m_simulationWell() ) { updateSimulationWellCenterline(); @@ -474,37 +596,35 @@ std::vector> RimExtrudedCurveIntersection::polyLines( cv } } } - else if ( type == CS_POLYLINE ) + else if ( type() == CrossSectionEnum::CS_POLYLINE ) { - lines.push_back( m_userPolyline ); + lines.push_back( m_userPolylineXyz ); } - else if ( type == CS_AZIMUTHLINE ) + else if ( type() == CrossSectionEnum::CS_AZIMUTHLINE ) { lines.push_back( m_twoAzimuthPoints ); } - if ( type == CS_WELL_PATH || type == CS_SIMULATION_WELL ) + if ( type() == CrossSectionEnum::CS_WELL_PATH || type() == CrossSectionEnum::CS_SIMULATION_WELL ) { - if ( type == CS_SIMULATION_WELL && simulationWell() ) + if ( type() == CrossSectionEnum::CS_SIMULATION_WELL && m_simulationWell() ) { cvf::Vec3d top, bottom; - simulationWell->wellHeadTopBottomPosition( -1, &top, &bottom ); + m_simulationWell->wellHeadTopBottomPosition( -1, &top, &bottom ); - for ( size_t lIdx = 0; lIdx < lines.size(); ++lIdx ) + for ( std::vector& polyLine : lines ) { - std::vector& polyLine = lines[lIdx]; polyLine.insert( polyLine.begin(), top ); } } - for ( size_t lIdx = 0; lIdx < lines.size(); ++lIdx ) + for ( std::vector& polyLine : lines ) { - std::vector& polyLine = lines[lIdx]; addExtents( polyLine ); } - if ( flattenedPolylineStartPoint && lines.size() && lines[0].size() > 1 ) + if ( flattenedPolylineStartPoint && !lines.empty() && lines[0].size() > 1 ) { ( *flattenedPolylineStartPoint )[0] = horizontalProjectedLengthAlongWellPathToClipPoint - m_extentLength; ( *flattenedPolylineStartPoint )[2] = lines[0][1].z(); // Depth of first point in first polyline @@ -512,7 +632,7 @@ std::vector> RimExtrudedCurveIntersection::polyLines( cv } else { - if ( flattenedPolylineStartPoint && lines.size() && lines[0].size() ) + if ( flattenedPolylineStartPoint && !lines.empty() && !( lines[0] ).empty() ) { ( *flattenedPolylineStartPoint )[2] = lines[0][0].z(); // Depth of first point in first polyline } @@ -551,11 +671,11 @@ std::vector RimExtrudedCurveIntersection::polyLinesForExtrusionDirec //-------------------------------------------------------------------------------------------------- void RimExtrudedCurveIntersection::updateSimulationWellCenterline() const { - if ( m_isActive() && type == CS_SIMULATION_WELL && simulationWell() ) + if ( m_isActive() && type() == CrossSectionEnum::CS_SIMULATION_WELL && m_simulationWell() ) { if ( m_simulationWellBranchCenterlines.empty() ) { - auto branches = simulationWell->wellPipeBranches(); + auto branches = m_simulationWell->wellPipeBranches(); for ( const auto& branch : branches ) { m_simulationWellBranchCenterlines.push_back( branch->wellPathPoints() ); @@ -629,17 +749,17 @@ void RimExtrudedCurveIntersection::addExtents( std::vector& polyLine //-------------------------------------------------------------------------------------------------- void RimExtrudedCurveIntersection::updateName() { - if ( type == CS_SIMULATION_WELL && simulationWell() ) + if ( type() == CrossSectionEnum::CS_SIMULATION_WELL && m_simulationWell() ) { - m_name = simulationWell()->name(); + m_name = m_simulationWell()->name(); if ( branchIndex() != -1 ) { m_name = m_name() + " Branch " + QString::number( branchIndex() + 1 ); } } - else if ( type() == CS_WELL_PATH && wellPath() ) + else if ( m_type() == CrossSectionEnum::CS_WELL_PATH && m_wellPath() ) { - m_name = wellPath()->name(); + m_name = m_wellPath()->name(); } Rim2dIntersectionView* iView = correspondingIntersectionView(); @@ -708,8 +828,7 @@ void RimExtrudedCurveIntersection::defineEditorAttribute( const caf::PdmFieldHan QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { - caf::PdmUiDoubleSliderEditorAttribute* doubleSliderAttrib = - dynamic_cast( attribute ); + auto* doubleSliderAttrib = dynamic_cast( attribute ); if ( doubleSliderAttrib ) { if ( field == &m_azimuthAngle ) @@ -725,42 +844,44 @@ void RimExtrudedCurveIntersection::defineEditorAttribute( const caf::PdmFieldHan doubleSliderAttrib->m_sliderTickCount = 180; } } - else if ( field == &inputPolyLineFromViewerEnabled ) + else if ( field == &m_inputPolylineFromViewerEnabled ) { - setPushButtonText( inputPolyLineFromViewerEnabled, dynamic_cast( attribute ) ); + setPushButtonText( m_inputPolylineFromViewerEnabled, + dynamic_cast( attribute ) ); } - else if ( field == &m_userPolyline ) + else if ( field == &m_userPolylineXydForUi ) { - setBaseColor( inputPolyLineFromViewerEnabled, dynamic_cast( attribute ) ); + setBaseColor( m_inputPolylineFromViewerEnabled, dynamic_cast( attribute ) ); } - else if ( field == &inputTwoAzimuthPointsFromViewerEnabled ) + else if ( field == &m_inputTwoAzimuthPointsFromViewerEnabled ) { - setPushButtonText( inputTwoAzimuthPointsFromViewerEnabled, + setPushButtonText( m_inputTwoAzimuthPointsFromViewerEnabled, dynamic_cast( attribute ) ); } else if ( field == &m_twoAzimuthPoints ) { - setBaseColor( inputTwoAzimuthPointsFromViewerEnabled, dynamic_cast( attribute ) ); + setBaseColor( m_inputTwoAzimuthPointsFromViewerEnabled, dynamic_cast( attribute ) ); } - else if ( field == &inputExtrusionPointsFromViewerEnabled ) + else if ( field == &m_inputExtrusionPointsFromViewerEnabled ) { - setPushButtonText( inputExtrusionPointsFromViewerEnabled, + setPushButtonText( m_inputExtrusionPointsFromViewerEnabled, dynamic_cast( attribute ) ); } else if ( field == &m_customExtrusionPoints ) { - setBaseColor( inputExtrusionPointsFromViewerEnabled, dynamic_cast( attribute ) ); + setBaseColor( m_inputExtrusionPointsFromViewerEnabled, dynamic_cast( attribute ) ); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimExtrudedCurveIntersection::appendPointToPolyLine( const cvf::Vec3d& point ) +void RimExtrudedCurveIntersection::appendPointToPolyLine( const cvf::Vec3d& pointXyz ) { - m_userPolyline.v().push_back( point ); + m_userPolylineXyz.v().push_back( pointXyz ); - m_userPolyline.uiCapability()->updateConnectedEditors(); + m_userPolylineXyz.uiCapability()->updateConnectedEditors(); + m_userPolylineXydForUi.uiCapability()->updateConnectedEditors(); rebuildGeometryAndScheduleCreateDisplayModel(); } @@ -768,7 +889,7 @@ void RimExtrudedCurveIntersection::appendPointToPolyLine( const cvf::Vec3d& poin //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -Rim2dIntersectionView* RimExtrudedCurveIntersection::correspondingIntersectionView() +Rim2dIntersectionView* RimExtrudedCurveIntersection::correspondingIntersectionView() const { std::vector objects; this->objectsWithReferringPtrFieldsOfType( objects ); @@ -831,10 +952,10 @@ cvf::Vec3d RimExtrudedCurveIntersection::extrusionDirection() const { cvf::Vec3d dir = cvf::Vec3d::Z_AXIS; - if ( direction() == RimExtrudedCurveIntersection::CS_HORIZONTAL ) + if ( m_direction() == RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_HORIZONTAL ) { std::vector> lines = this->polyLines(); - if ( lines.size() > 0 && lines[0].size() > 1 ) + if ( !lines.empty() && lines[0].size() > 1 ) { std::vector firstLine = lines[0]; @@ -846,7 +967,8 @@ cvf::Vec3d RimExtrudedCurveIntersection::extrusionDirection() const dir = polyLineDir ^ up; } } - else if ( direction() == RimExtrudedCurveIntersection::CS_TWO_POINTS && m_customExtrusionPoints().size() > 1 ) + else if ( m_direction() == RimExtrudedCurveIntersection::CrossSectionDirEnum::CS_TWO_POINTS && + m_customExtrusionPoints().size() > 1 ) { dir = m_customExtrusionPoints()[m_customExtrusionPoints().size() - 1] - m_customExtrusionPoints()[0]; } @@ -902,7 +1024,7 @@ double RimExtrudedCurveIntersection::extentLength() //-------------------------------------------------------------------------------------------------- void RimExtrudedCurveIntersection::recomputeSimulationWellBranchData() { - if ( type() == CS_SIMULATION_WELL ) + if ( m_type() == CrossSectionEnum::CS_SIMULATION_WELL ) { m_simulationWellBranchCenterlines.clear(); updateSimulationWellCenterline(); @@ -916,7 +1038,39 @@ void RimExtrudedCurveIntersection::recomputeSimulationWellBranchData() //-------------------------------------------------------------------------------------------------- bool RimExtrudedCurveIntersection::hasDefiningPoints() const { - return type == CS_POLYLINE || type == CS_AZIMUTHLINE; + return m_type() == CrossSectionEnum::CS_POLYLINE || m_type() == CrossSectionEnum::CS_AZIMUTHLINE; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimExtrudedCurveIntersection::surfaceIntersectionCurves() const +{ + return m_surfaceIntersections->surfaceIntersectionCurves(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimExtrudedCurveIntersection::surfaceIntersectionBands() const +{ + return m_surfaceIntersections->surfaceIntersectionBands(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionCurve* RimExtrudedCurveIntersection::addIntersectionCurve() +{ + return m_surfaceIntersections->addIntersectionCurve(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionBand* RimExtrudedCurveIntersection::addIntersectionBand() +{ + return m_surfaceIntersections->addIntersectionBand(); } //-------------------------------------------------------------------------------------------------- @@ -956,3 +1110,52 @@ double RimExtrudedCurveIntersection::azimuthInRadians( cvf::Vec3d vec ) { return cvf::GeometryTools::getAngle( -cvf::Vec3d::Z_AXIS, cvf::Vec3d::Y_AXIS, vec ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::appendOptionItemsForSources( int currentLevel, + RimSurfaceCollection* currentCollection, + QList& options ) const +{ + caf::IconProvider surfaceIcon( ":/ReservoirSurface16x16.png" ); + + options.push_back( caf::PdmOptionItemInfo::createHeader( currentCollection->collectionName(), true ) ); + + for ( auto surf : currentCollection->surfaces() ) + { + auto itemInfo = caf::PdmOptionItemInfo( surf->userDescription(), surf, false, surfaceIcon ); + itemInfo.setLevel( currentLevel + 1 ); + options.push_back( itemInfo ); + } + + for ( auto subColl : currentCollection->subCollections() ) + { + appendOptionItemsForSources( currentLevel, subColl, options ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::onSurfaceIntersectionsChanged( const caf::SignalEmitter* emitter ) +{ + updateAllRequiredEditors(); + rebuildGeometryAndScheduleCreateDisplayModel(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimExtrudedCurveIntersection::pointsXYD() const +{ + return RiaVec3Tools::invertZSign( m_userPolylineXyz() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimExtrudedCurveIntersection::setPointsFromXYD( const std::vector& pointsXYD ) +{ + m_userPolylineXyz = RiaVec3Tools::invertZSign( pointsXYD ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.h similarity index 62% rename from ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.h index 24f637794c..8668c8a223 100644 --- a/ApplicationLibCode/ProjectDataModel/RimExtrudedCurveIntersection.h +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimExtrudedCurveIntersection.h @@ -19,15 +19,11 @@ #pragma once -#include "cafAppEnum.h" -#include "cafPdmField.h" -#include "cafPdmFieldCvfVec3d.h" -#include "cafPdmObject.h" -#include "cafPdmPtrField.h" - #include "RimIntersection.h" -#include "cvfObject.h" -#include "cvfVector3.h" + +#include "cafPdmChildField.h" +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrArrayField.h" class RimWellPath; class RivExtrudedCurveIntersectionPartMgr; @@ -35,6 +31,11 @@ class RimIntersectionResultDefinition; class RimSimWellInView; class RimSimWellInViewCollection; class Rim2dIntersectionView; +class RimSurface; +class RimSurfaceCollection; +class RimSurfaceIntersectionCollection; +class RimSurfaceIntersectionCurve; +class RimSurfaceIntersectionBand; namespace caf { @@ -52,7 +53,7 @@ class RimExtrudedCurveIntersection : public RimIntersection CAF_PDM_HEADER_INIT; public: - enum CrossSectionEnum + enum class CrossSectionEnum { CS_WELL_PATH, CS_SIMULATION_WELL, @@ -60,7 +61,7 @@ class RimExtrudedCurveIntersection : public RimIntersection CS_AZIMUTHLINE }; - enum CrossSectionDirEnum + enum class CrossSectionDirEnum { CS_VERTICAL, CS_HORIZONTAL, @@ -71,26 +72,30 @@ class RimExtrudedCurveIntersection : public RimIntersection RimExtrudedCurveIntersection(); ~RimExtrudedCurveIntersection() override; - caf::PdmField> type; - caf::PdmField> direction; + QString name() const override; + void setName( const QString& newName ); - caf::PdmPtrField wellPath; - caf::PdmPtrField simulationWell; + RimExtrudedCurveIntersection::CrossSectionEnum type() const; + RimExtrudedCurveIntersection::CrossSectionDirEnum direction() const; - caf::PdmField inputPolyLineFromViewerEnabled; - caf::PdmField inputExtrusionPointsFromViewerEnabled; - caf::PdmField inputTwoAzimuthPointsFromViewerEnabled; + RimWellPath* wellPath() const; + RimSimWellInView* simulationWell() const; + bool inputPolyLineFromViewerEnabled() const; + bool inputExtrusionPointsFromViewerEnabled() const; + bool inputTwoAzimuthPointsFromViewerEnabled() const; - QString name() const override; - void setName( const QString& newName ); + void configureForSimulationWell( RimSimWellInView* simWell ); + void configureForWellPath( RimWellPath* wellPath ); + void configureForPolyLine(); + void configureForAzimuthLine(); std::vector> polyLines( cvf::Vec3d* flattenedPolylineStartPoint = nullptr ) const; - void appendPointToPolyLine( const cvf::Vec3d& point ); + void appendPointToPolyLine( const cvf::Vec3d& pointXyz ); - Rim2dIntersectionView* correspondingIntersectionView(); - RivExtrudedCurveIntersectionPartMgr* intersectionPartMgr(); - void rebuildGeometry(); - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const override; + Rim2dIntersectionView* correspondingIntersectionView() const; + RivExtrudedCurveIntersectionPartMgr* intersectionPartMgr(); + void rebuildGeometry(); + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const override; std::vector polyLinesForExtrusionDirection() const; void appendPointToExtrusionDirection( const cvf::Vec3d& point ); @@ -106,6 +111,11 @@ class RimExtrudedCurveIntersection : public RimIntersection void recomputeSimulationWellBranchData(); bool hasDefiningPoints() const; + std::vector surfaceIntersectionCurves() const; + std::vector surfaceIntersectionBands() const; + RimSurfaceIntersectionCurve* addIntersectionCurve(); + RimSurfaceIntersectionBand* addIntersectionBand(); + int branchIndex() const; void rebuildGeometryAndScheduleCreateDisplayModel(); @@ -119,9 +129,41 @@ class RimExtrudedCurveIntersection : public RimIntersection QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + +private: + static void setPushButtonText( bool buttonEnable, caf::PdmUiPushButtonEditorAttribute* attribute ); + static void setBaseColor( bool enable, caf::PdmUiListEditorAttribute* attribute ); + + RimSimWellInViewCollection* simulationWellCollection() const; + void updateAzimuthLine(); + void updateSimulationWellCenterline() const; + void addExtents( std::vector& polyLine ) const; + void updateName(); + static double azimuthInRadians( cvf::Vec3d vec ); + + void appendOptionItemsForSources( int currentLevel, + RimSurfaceCollection* currentCollection, + QList& options ) const; + + void onSurfaceIntersectionsChanged( const caf::SignalEmitter* emitter ); + + std::vector pointsXYD() const; + void setPointsFromXYD( const std::vector& pointsXYD ); + private: caf::PdmField m_name; + caf::PdmField> m_type; + caf::PdmField> m_direction; + + caf::PdmPtrField m_wellPath; + caf::PdmPtrField m_simulationWell; + + caf::PdmField m_inputPolylineFromViewerEnabled; + caf::PdmField m_inputExtrusionPointsFromViewerEnabled; + caf::PdmField m_inputTwoAzimuthPointsFromViewerEnabled; + caf::PdmField m_branchIndex; caf::PdmField m_extentLength; caf::PdmField m_azimuthAngle; @@ -129,21 +171,14 @@ class RimExtrudedCurveIntersection : public RimIntersection caf::PdmField m_lengthUp; caf::PdmField m_lengthDown; - caf::PdmField> m_userPolyline; + caf::PdmProxyValueField> m_userPolylineXydForUi; + + caf::PdmField> m_userPolylineXyz; caf::PdmField> m_customExtrusionPoints; caf::PdmField> m_twoAzimuthPoints; - static void setPushButtonText( bool buttonEnable, caf::PdmUiPushButtonEditorAttribute* attribute ); - static void setBaseColor( bool enable, caf::PdmUiListEditorAttribute* attribute ); - - RimSimWellInViewCollection* simulationWellCollection() const; - void updateAzimuthLine(); - void updateSimulationWellCenterline() const; - void addExtents( std::vector& polyLine ) const; - void updateName(); - static double azimuthInRadians( cvf::Vec3d vec ); + caf::PdmChildField m_surfaceIntersections; -private: cvf::ref m_crossSectionPartMgr; mutable std::vector> m_simulationWellBranchCenterlines; diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.cpp similarity index 91% rename from ApplicationLibCode/ProjectDataModel/RimIntersection.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.cpp index dad04dd5d9..78544f6fa7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.cpp @@ -29,7 +29,9 @@ #include "RimGridView.h" #include "RimIntersectionResultDefinition.h" #include "RimIntersectionResultsDefinitionCollection.h" -#include "RivHexGridIntersectionTools.h" + +#include "RivEclipseIntersectionGrid.h" +#include "RivFemIntersectionGrid.h" CAF_PDM_ABSTRACT_SOURCE_INIT( RimIntersection, "RimIntersectionHandle" ); @@ -148,7 +150,7 @@ void RimIntersection::defineSeparateDataSourceUi( QString uiConfigName, caf::Pdm } caf::PdmUiGroup* separateResultsGroup = - uiOrdering.addNewGroupWithKeyword( "Separate Result Reference" + inactiveText, "SeparateResultReference" ); + uiOrdering.addNewGroupWithKeyword( "Result Reference" + inactiveText, "SeparateResultReference" ); separateResultsGroup->setCollapsedByDefault( true ); separateResultsGroup->add( &m_useSeparateDataSource ); separateResultsGroup->add( &m_separateDataSource ); @@ -170,7 +172,7 @@ void RimIntersection::updateDefaultSeparateDataSource() { std::vector iResDefs = defcoll->intersectionResultsDefinitions(); - if ( iResDefs.size() ) + if ( !iResDefs.empty() ) { m_separateDataSource = iResDefs[0]; } @@ -183,12 +185,15 @@ void RimIntersection::updateDefaultSeparateDataSource() //-------------------------------------------------------------------------------------------------- cvf::ref RimIntersection::createHexGridInterface() { + RimGeoMechView* geoView; + this->firstAncestorOrThisOfType( geoView ); + RimIntersectionResultDefinition* resDef = activeSeparateResultDefinition(); if ( resDef && resDef->activeCase() ) { // Eclipse case - RimEclipseCase* eclipseCase = dynamic_cast( resDef->activeCase() ); + auto* eclipseCase = dynamic_cast( resDef->activeCase() ); if ( eclipseCase && eclipseCase->eclipseCaseData() ) { return new RivEclipseIntersectionGrid( eclipseCase->eclipseCaseData()->mainGrid(), @@ -199,12 +204,11 @@ cvf::ref RimIntersection::createHexGridInterfac // Geomech case - RimGeoMechCase* geomCase = dynamic_cast( resDef->activeCase() ); + auto* geomCase = dynamic_cast( resDef->activeCase() ); - if ( geomCase && geomCase->geoMechData() && geomCase->geoMechData()->femParts() ) + if ( geomCase && geomCase->geoMechData() && geomCase->geoMechData()->femParts() && geoView ) { - RigFemPart* femPart = geomCase->geoMechData()->femParts()->part( 0 ); - return new RivFemIntersectionGrid( femPart ); + return new RivFemIntersectionGrid( geomCase->geoMechData()->femParts(), geoView->partsCollection() ); } } @@ -217,13 +221,9 @@ cvf::ref RimIntersection::createHexGridInterfac return new RivEclipseIntersectionGrid( grid, eclipseView->currentActiveCellInfo(), this->isInactiveCellsVisible() ); } - RimGeoMechView* geoView; - this->firstAncestorOrThisOfType( geoView ); - if ( geoView && geoView->femParts() && geoView->femParts()->partCount() ) + if ( geoView && geoView->femParts() ) { - RigFemPart* femPart = geoView->femParts()->part( 0 ); - - return new RivFemIntersectionGrid( femPart ); + return new RivFemIntersectionGrid( geoView->femParts(), geoView->partsCollection() ); } return nullptr; diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersection.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.h similarity index 93% rename from ApplicationLibCode/ProjectDataModel/RimIntersection.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.h index bc2bab0f2b..bb8258f08a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersection.h +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersection.h @@ -27,7 +27,7 @@ class RimIntersectionResultDefinition; class RivIntersectionHexGridInterface; class RimIntersectionResultsDefinitionCollection; -class RivIntersectionGeometryGeneratorIF; +class RivIntersectionGeometryGeneratorInterface; class RimIntersection : public caf::PdmObject { @@ -46,7 +46,7 @@ class RimIntersection : public caf::PdmObject RimIntersectionResultDefinition* activeSeparateResultDefinition(); cvf::ref createHexGridInterface(); - virtual const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const = 0; + virtual const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const = 0; protected: virtual RimIntersectionResultsDefinitionCollection* findSeparateResultsCollection(); diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.cpp similarity index 93% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.cpp index 837fe6e5f3..f715e1a727 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.cpp @@ -25,6 +25,9 @@ #include "RimBoxIntersection.h" #include "RimCase.h" #include "RimExtrudedCurveIntersection.h" +#include "RimGridView.h" +#include "RimIntersectionResultDefinition.h" +#include "RimIntersectionResultsDefinitionCollection.h" #include "RimSimWellInView.h" #include "Riu3DMainWindowTools.h" @@ -32,7 +35,7 @@ #include "RivBoxIntersectionPartMgr.h" #include "RivExtrudedCurveIntersectionPartMgr.h" -#include "RimIntersectionResultDefinition.h" +#include "cafPdmUiTreeOrdering.h" #include "cvfModelBasicList.h" CAF_PDM_SOURCE_INIT( RimIntersectionCollection, "CrossSectionCollection" ); @@ -45,10 +48,10 @@ RimIntersectionCollection::RimIntersectionCollection() CAF_PDM_InitObject( "Intersections", ":/CrossSections16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_intersections, "CrossSections", "Intersections", "", "", "" ); - m_intersections.uiCapability()->setUiHidden( true ); + m_intersections.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_intersectionBoxes, "IntersectionBoxes", "IntersectionBoxes", "", "", "" ); - m_intersectionBoxes.uiCapability()->setUiHidden( true ); + m_intersectionBoxes.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &isActive, "Active", true, "Active", "", "", "" ); isActive.uiCapability()->setUiHidden( true ); @@ -71,6 +74,22 @@ caf::PdmFieldHandle* RimIntersectionCollection::objectToggleField() return &isActive; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimIntersectionCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, + QString uiConfigName /*= "" */ ) +{ + RimGridView* gridView = nullptr; + this->firstAncestorOfType( gridView ); + if ( gridView ) + { + auto uiTree = gridView->separateIntersectionResultsCollection()->uiTreeOrdering(); + + uiTreeOrdering.appendChild( uiTree ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -364,7 +383,7 @@ bool RimIntersectionCollection::hasActiveIntersectionForSimulationWell( const Ri for ( RimExtrudedCurveIntersection* cs : m_intersections ) { - if ( cs->isActive() && cs->type() == RimExtrudedCurveIntersection::CS_SIMULATION_WELL && + if ( cs->isActive() && cs->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_SIMULATION_WELL && cs->simulationWell() == simWell ) { return true; diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.h similarity index 96% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.h index e35b291a55..7aa4e5f53e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersectionCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionCollection.h @@ -83,6 +83,7 @@ class RimIntersectionCollection : public caf::PdmObject protected: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; caf::PdmFieldHandle* objectToggleField() override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; private: caf::PdmChildArrayField m_intersections; diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultDefinition.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultDefinition.cpp similarity index 98% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionResultDefinition.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultDefinition.cpp index 9236f6f85d..e4edc62bce 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultDefinition.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultDefinition.cpp @@ -57,22 +57,22 @@ RimIntersectionResultDefinition::RimIntersectionResultDefinition() m_autoName.xmlCapability()->setIOWritable( false ); CAF_PDM_InitFieldNoDefault( &m_eclipseResultDefinition, "EclipseResultDef", "EclipseResultDef", "", "", "" ); - m_eclipseResultDefinition.uiCapability()->setUiHidden( true ); + m_eclipseResultDefinition.uiCapability()->setUiTreeHidden( true ); m_eclipseResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_eclipseResultDefinition = new RimEclipseResultDefinition; CAF_PDM_InitFieldNoDefault( &m_geomResultDefinition, "GeoMechResultDef", "GeoMechResultDef", "", "", "" ); - m_geomResultDefinition.uiCapability()->setUiHidden( true ); + m_geomResultDefinition.uiCapability()->setUiTreeHidden( true ); m_geomResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_geomResultDefinition = new RimGeoMechResultDefinition; CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendConfig", "Legend", "", "", "" ); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); m_legendConfig.uiCapability()->setUiTreeChildrenHidden( false ); m_legendConfig = new RimRegularLegendConfig; CAF_PDM_InitFieldNoDefault( &m_ternaryLegendConfig, "TernaryLegendConfig", "Legend", "", "", "" ); - m_ternaryLegendConfig.uiCapability()->setUiHidden( true ); + m_ternaryLegendConfig.uiCapability()->setUiTreeHidden( true ); m_ternaryLegendConfig.uiCapability()->setUiTreeChildrenHidden( false ); m_ternaryLegendConfig = new RimTernaryLegendConfig; diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultDefinition.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultDefinition.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionResultDefinition.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultDefinition.h diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultsDefinitionCollection.cpp b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultsDefinitionCollection.cpp similarity index 98% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionResultsDefinitionCollection.cpp rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultsDefinitionCollection.cpp index 8f33d113f1..157b1b26b2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultsDefinitionCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultsDefinitionCollection.cpp @@ -30,7 +30,7 @@ CAF_PDM_SOURCE_INIT( RimIntersectionResultsDefinitionCollection, "RimIntersectio //-------------------------------------------------------------------------------------------------- RimIntersectionResultsDefinitionCollection::RimIntersectionResultsDefinitionCollection() { - CAF_PDM_InitObject( "Separate Intersection Results", ":/CrossSections16x16.png", "", "" ); + CAF_PDM_InitObject( "Intersection Results", ":/CrossSections16x16.png", "", "" ); CAF_PDM_InitField( &m_isActive, "isActive", false, "Active", "", "", "" ); m_isActive.uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/RimIntersectionResultsDefinitionCollection.h b/ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultsDefinitionCollection.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimIntersectionResultsDefinitionCollection.h rename to ApplicationLibCode/ProjectDataModel/Intersections/RimIntersectionResultsDefinitionCollection.h diff --git a/ApplicationLibCode/ProjectDataModel/Measurement/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Measurement/CMakeLists_files.cmake index 5f9c9c78dc..b45bc96890 100644 --- a/ApplicationLibCode/ProjectDataModel/Measurement/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Measurement/CMakeLists_files.cmake @@ -1,26 +1,23 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimMeasurement.h -${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimMeasurement.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimMeasurement.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimMeasurement.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -set (QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.h -${QT_MOC_HEADERS} +set(QT_MOC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementEventFilter.h + ${QT_MOC_HEADERS} ) - -source_group( "ProjectDataModel\\Measurement" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Measurement" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Parameters/CMakeLists_files.cmake index 406c4bad86..28426a65b7 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Parameters/CMakeLists_files.cmake @@ -1,26 +1,29 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGenericParameter.h -${CMAKE_CURRENT_LIST_DIR}/RimDoubleParameter.h -${CMAKE_CURRENT_LIST_DIR}/RimIntegerParameter.h -${CMAKE_CURRENT_LIST_DIR}/RimStringParameter.h -${CMAKE_CURRENT_LIST_DIR}/RimParameterGroup.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGenericParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RimDoubleParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RimIntegerParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RimStringParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RimListParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RimParameterGroup.h + ${CMAKE_CURRENT_LIST_DIR}/RimParameterGroups.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimGenericParameter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDoubleParameter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimIntegerParameter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStringParameter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimParameterGroup.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimGenericParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDoubleParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimIntegerParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStringParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimListParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimParameterGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimParameterGroups.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Parameters" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Parameters" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.cpp index 970e9b5cf4..b0d0fdbae8 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.cpp @@ -84,3 +84,18 @@ double RimDoubleParameter::value() const { return m_value(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGenericParameter* RimDoubleParameter::duplicate() const +{ + RimDoubleParameter* retval = new RimDoubleParameter(); + retval->setName( name() ); + retval->setValue( value() ); + retval->setDescription( description() ); + retval->setLabel( label() ); + retval->setAdvanced( isAdvanced() ); + + return retval; +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.h index 57cbb413dc..5f2ad99207 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.h +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimDoubleParameter.h @@ -44,6 +44,8 @@ class RimDoubleParameter : public RimGenericParameter double value() const; + RimGenericParameter* duplicate() const override; + private: caf::PdmField m_value; }; diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.cpp index e75feeb38e..2d6975ee0d 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.cpp @@ -143,3 +143,11 @@ QString RimGenericParameter::description() const { return m_description(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimGenericParameter::jsonValue() const +{ + return stringValue(); +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.h index 2b4c2a65f7..6b3cc7d919 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.h +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimGenericParameter.h @@ -43,6 +43,7 @@ class RimGenericParameter : public caf::PdmObject virtual void setValue( QString value ) = 0; virtual QVariant variantValue() const = 0; virtual QString stringValue() const = 0; + virtual QString jsonValue() const; QString name() const; QString label() const; @@ -50,6 +51,8 @@ class RimGenericParameter : public caf::PdmObject bool isAdvanced() const; bool isValid() const; + virtual RimGenericParameter* duplicate() const = 0; + protected: void setValid( bool valid ); diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.cpp index 6ce5c1d358..97c2dc1c84 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.cpp @@ -69,6 +69,14 @@ QVariant RimIntegerParameter::variantValue() const return QVariant( m_value() ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimIntegerParameter::value() const +{ + return m_value(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -76,3 +84,18 @@ QString RimIntegerParameter::stringValue() const { return QString::number( m_value() ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGenericParameter* RimIntegerParameter::duplicate() const +{ + RimIntegerParameter* retval = new RimIntegerParameter(); + retval->setName( name() ); + retval->setValue( value() ); + retval->setDescription( description() ); + retval->setLabel( label() ); + retval->setAdvanced( isAdvanced() ); + + return retval; +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.h index dd53ad7046..3e4468ebdc 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.h +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimIntegerParameter.h @@ -41,6 +41,9 @@ class RimIntegerParameter : public RimGenericParameter void setValue( QString value ) override; QVariant variantValue() const override; QString stringValue() const override; + int value() const; + + RimGenericParameter* duplicate() const override; private: caf::PdmField m_value; diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.cpp new file mode 100644 index 0000000000..67d757a7f4 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.cpp @@ -0,0 +1,60 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimListParameter.h" + +#include + +CAF_PDM_SOURCE_INIT( RimListParameter, "ListParameter" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimListParameter::RimListParameter() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimListParameter::~RimListParameter() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimListParameter::jsonValue() const +{ + return stringValue(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGenericParameter* RimListParameter::duplicate() const +{ + RimListParameter* retval = new RimListParameter(); + retval->setName( name() ); + retval->setValue( stringValue() ); + retval->setDescription( description() ); + retval->setLabel( label() ); + retval->setAdvanced( isAdvanced() ); + + return retval; +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.h new file mode 100644 index 0000000000..884da59238 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimListParameter.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObject.h" + +#include + +#include "RimStringParameter.h" + +//================================================================================================== +/// +/// +//================================================================================================== +class RimListParameter : public RimStringParameter +{ + CAF_PDM_HEADER_INIT; + +public: + RimListParameter(); + ~RimListParameter() override; + + QString jsonValue() const override; + + RimGenericParameter* duplicate() const override; +}; diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.cpp index 40106692bd..b077badd8c 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.cpp +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.cpp @@ -49,9 +49,24 @@ RimParameterGroup::RimParameterGroup() m_name.uiCapability()->setUiHidden( true ); m_name.uiCapability()->setUiReadOnly( true ); + CAF_PDM_InitFieldNoDefault( &m_label, "Label", "Label", "", "", "" ); + m_label.uiCapability()->setUiHidden( true ); + m_label.uiCapability()->setUiReadOnly( true ); + + CAF_PDM_InitFieldNoDefault( &m_comment, "Comment", "Comment", "", "", "" ); + m_comment.uiCapability()->setUiHidden( true ); + m_comment.uiCapability()->setUiReadOnly( true ); + m_comment.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::HIDDEN ); + CAF_PDM_InitFieldNoDefault( &m_showExpanded, "Expanded", "Expanded", "", "", "" ); - m_name.uiCapability()->setUiHidden( true ); - m_name.uiCapability()->setUiReadOnly( true ); + m_showExpanded.uiCapability()->setUiHidden( true ); + m_showExpanded.uiCapability()->setUiReadOnly( true ); + + CAF_PDM_InitFieldNoDefault( &m_labelProxy, "LabelProxy", "Label Proxy", "", "", "" ); + m_labelProxy.registerGetMethod( this, &RimParameterGroup::labelOrName ); + m_labelProxy.uiCapability()->setUiReadOnly( true ); + m_labelProxy.uiCapability()->setUiHidden( true ); + m_labelProxy.xmlCapability()->disableIO(); } //-------------------------------------------------------------------------------------------------- @@ -66,7 +81,16 @@ RimParameterGroup::~RimParameterGroup() //-------------------------------------------------------------------------------------------------- caf::PdmFieldHandle* RimParameterGroup::userDescriptionField() { - return &m_name; + return &m_labelProxy; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimParameterGroup::labelOrName() const +{ + if ( m_label().isEmpty() ) return m_name; + return m_label; } //-------------------------------------------------------------------------------------------------- @@ -87,7 +111,7 @@ void RimParameterGroup::addParameter( QString name, int value ) p->setLabel( name ); p->setValue( value ); - m_parameters.push_back( p ); + addParameter( p ); } //-------------------------------------------------------------------------------------------------- @@ -100,7 +124,7 @@ void RimParameterGroup::addParameter( QString name, QString value ) p->setLabel( name ); p->setValue( value ); - m_parameters.push_back( p ); + addParameter( p ); } //-------------------------------------------------------------------------------------------------- @@ -113,7 +137,7 @@ void RimParameterGroup::addParameter( QString name, double value ) p->setLabel( name ); p->setValue( value ); - m_parameters.push_back( p ); + addParameter( p ); } //-------------------------------------------------------------------------------------------------- @@ -151,7 +175,8 @@ void RimParameterGroup::defineEditorAttribute( const caf::PdmFieldHandle* field, //-------------------------------------------------------------------------------------------------- void RimParameterGroup::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - auto group = uiOrdering.addNewGroup( name() ); + auto group = uiOrdering.addNewGroup( label() ); + if ( !m_comment().isEmpty() ) group->add( &m_comment ); group->add( &m_parameters ); uiOrdering.skipRemainingFields( true ); @@ -165,6 +190,22 @@ void RimParameterGroup::setName( QString name ) m_name = name; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimParameterGroup::setLabel( QString label ) +{ + m_label = label; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimParameterGroup::setComment( QString comment ) +{ + m_comment = comment; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -189,6 +230,22 @@ QString RimParameterGroup::name() const return m_name; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimParameterGroup::comment() const +{ + return m_comment; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimParameterGroup::label() const +{ + return labelOrName(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -237,3 +294,16 @@ RimGenericParameter* RimParameterGroup::parameter( QString name ) const return nullptr; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QVariant RimParameterGroup::parameterValue( QString name ) const +{ + RimGenericParameter* p = parameter( name ); + if ( p ) + { + return p->variantValue(); + } + return QVariant(); +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.h index 52c5f46a4b..0a6f5b3e07 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.h +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroup.h @@ -21,8 +21,10 @@ #include "cafPdmChildArrayField.h" #include "cafPdmField.h" #include "cafPdmObject.h" +#include "cafPdmProxyValueField.h" #include +#include #include class RimGenericParameter; @@ -47,6 +49,8 @@ class RimParameterGroup : public caf::PdmObject void appendParametersToList( std::list& parameterList ); void setName( QString name ); + void setLabel( QString label ); + void setComment( QString comment ); void setExpanded( bool expand ); void setParameterValue( QString name, int value ); @@ -55,20 +59,28 @@ class RimParameterGroup : public caf::PdmObject bool isExpanded() const; QString name() const; + QString comment() const; + QString label() const; std::vector parameters() const; RimGenericParameter* parameter( QString name ) const; + QVariant parameterValue( QString name ) const; private: - void defineEditorAttribute( const caf::PdmFieldHandle* field, - QString uiConfigName, - caf::PdmUiEditorAttribute* attribute ) override; - void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + caf::PdmFieldHandle* userDescriptionField() override; + QString labelOrName() const; private: caf::PdmChildArrayField m_parameters; caf::PdmField m_showExpanded; caf::PdmField m_name; + caf::PdmField m_label; + caf::PdmField m_comment; + caf::PdmProxyValueField m_labelProxy; }; diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.cpp new file mode 100644 index 0000000000..e11b94ea00 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.cpp @@ -0,0 +1,92 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimParameterGroups.h" + +#include "RimGenericParameter.h" +#include "RimParameterGroup.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimParameterGroups::RimParameterGroups() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimParameterGroups::~RimParameterGroups() +{ + clear(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimParameterGroups::clear() +{ + for ( const auto& [key, value] : m_groups ) + { + delete value; + } + m_groups.clear(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimParameterGroups::mergeGroup( RimParameterGroup* group, bool addCommentAsParameter /* = false */ ) +{ + const QString grpName = group->name(); + + if ( m_groups.count( grpName ) == 0 ) + { + RimParameterGroup* newGroup = new RimParameterGroup(); + newGroup->setName( grpName ); + newGroup->setLabel( group->label() ); + newGroup->setComment( group->comment() ); + if ( addCommentAsParameter && !newGroup->comment().isEmpty() ) + { + newGroup->addParameter( "comments", newGroup->comment() ); + } + + m_groups[grpName] = newGroup; + } + + RimParameterGroup* dstGroup = m_groups[grpName]; + for ( auto& parameter : group->parameters() ) + { + dstGroup->addParameter( parameter->duplicate() ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector RimParameterGroups::groups() const +{ + std::vector retGroups; + + for ( const auto& [key, value] : m_groups ) + { + retGroups.push_back( value ); + } + + return retGroups; +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.h new file mode 100644 index 0000000000..d60d02756c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimParameterGroups.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include +#include +#include + +class RimParameterGroup; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimParameterGroups +{ +public: + RimParameterGroups(); + ~RimParameterGroups(); + + void mergeGroup( RimParameterGroup* group, bool addCommentAsParameter = false ); + + const std::vector groups() const; + + void clear(); + +private: + std::map m_groups; +}; diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.cpp b/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.cpp index 9416fac698..cff206b900 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.cpp @@ -66,3 +66,26 @@ QString RimStringParameter::stringValue() const { return m_value(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimStringParameter::jsonValue() const +{ + return QString( "\"%1\"" ).arg( stringValue() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGenericParameter* RimStringParameter::duplicate() const +{ + RimStringParameter* retval = new RimStringParameter(); + retval->setName( name() ); + retval->setValue( stringValue() ); + retval->setDescription( description() ); + retval->setLabel( label() ); + retval->setAdvanced( isAdvanced() ); + + return retval; +} diff --git a/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.h b/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.h index 9929e57ca5..28816bf92d 100644 --- a/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.h +++ b/ApplicationLibCode/ProjectDataModel/Parameters/RimStringParameter.h @@ -40,6 +40,9 @@ class RimStringParameter : public RimGenericParameter void setValue( QString value ) override; QVariant variantValue() const override; QString stringValue() const override; + QString jsonValue() const override; + + RimGenericParameter* duplicate() const override; private: caf::PdmField m_value; diff --git a/ApplicationLibCode/ProjectDataModel/PlotTemplates/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/PlotTemplates/CMakeLists_files.cmake index 4fe667bdbb..2362866b95 100644 --- a/ApplicationLibCode/ProjectDataModel/PlotTemplates/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/PlotTemplates/CMakeLists_files.cmake @@ -1,20 +1,19 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFolderItem.h -${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFileItem.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFolderItem.h + ${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFileItem.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFolderItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFileItem.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFolderItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPlotTemplateFileItem.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\PlotTemplates" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\PlotTemplates" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/PlotTemplates/RimPlotTemplateFolderItem.cpp b/ApplicationLibCode/ProjectDataModel/PlotTemplates/RimPlotTemplateFolderItem.cpp index 9f219cd6a5..a5811a5e6b 100644 --- a/ApplicationLibCode/ProjectDataModel/PlotTemplates/RimPlotTemplateFolderItem.cpp +++ b/ApplicationLibCode/ProjectDataModel/PlotTemplates/RimPlotTemplateFolderItem.cpp @@ -39,9 +39,9 @@ RimPlotTemplateFolderItem::RimPlotTemplateFolderItem() CAF_PDM_InitFieldNoDefault( &m_folderName, "FolderName", "Folder", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_fileNames, "FileNames", "", "", "", "" ); - m_fileNames.uiCapability()->setUiHidden( true ); + m_fileNames.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_subFolders, "SubFolders", "", "", "", "" ); - m_subFolders.uiCapability()->setUiHidden( true ); + m_subFolders.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/ProcessControl/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/ProcessControl/CMakeLists_files.cmake index c35d4e717e..c31e5d13da 100644 --- a/ApplicationLibCode/ProjectDataModel/ProcessControl/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/ProcessControl/CMakeLists_files.cmake @@ -1,24 +1,21 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimProcess.h -${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.h +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimProcess.h + ${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimProcess.cpp -${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.cpp +set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimProcess.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) list(APPEND COMMAND_QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.h + ${CMAKE_CURRENT_LIST_DIR}/RimProcessMonitor.h ) -source_group( "ProjectDataModel\\ProcessControl" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\ProcessControl" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp index 36ff2b0e58..e47e03910f 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim2dIntersectionView.cpp @@ -69,7 +69,7 @@ Rim2dIntersectionView::Rim2dIntersectionView( void ) m_intersection.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); m_legendConfig.uiCapability()->setUiTreeChildrenHidden( true ); m_legendConfig.xmlCapability()->disableIO(); m_legendConfig = new RimRegularLegendConfig(); @@ -92,8 +92,6 @@ Rim2dIntersectionView::Rim2dIntersectionView( void ) m_scaleTransform = new cvf::Transform(); m_intersectionVizModel = new cvf::ModelBasicList; - hasUserRequestedAnimation = true; - ( (RiuViewerToViewInterface*)this )->setCameraPosition( sm_defaultViewMatrix ); disableGridBoxField(); @@ -562,7 +560,8 @@ void Rim2dIntersectionView::onCreateDisplayModel() m_flatSimWellPipePartMgr = nullptr; m_flatWellHeadPartMgr = nullptr; - if ( m_intersection->type() == RimExtrudedCurveIntersection::CS_SIMULATION_WELL && m_intersection->simulationWell() ) + if ( m_intersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_SIMULATION_WELL && + m_intersection->simulationWell() ) { RimEclipseView* eclipseView = nullptr; m_intersection->firstAncestorOrThisOfType( eclipseView ); @@ -575,7 +574,8 @@ void Rim2dIntersectionView::onCreateDisplayModel() } m_flatWellpathPartMgr = nullptr; - if ( m_intersection->type() == RimExtrudedCurveIntersection::CS_WELL_PATH && m_intersection->wellPath() ) + if ( m_intersection->type() == RimExtrudedCurveIntersection::CrossSectionEnum::CS_WELL_PATH && + m_intersection->wellPath() ) { Rim3dView* settingsView = nullptr; m_intersection->firstAncestorOrThisOfType( settingsView ); @@ -593,10 +593,7 @@ void Rim2dIntersectionView::onCreateDisplayModel() m_intersectionVizModel->updateBoundingBoxesRecursive(); - if ( this->hasUserRequestedAnimation() ) - { - if ( viewer() ) viewer()->setCurrentFrame( m_currentTimeStep ); - } + if ( viewer() ) viewer()->setCurrentFrame( m_currentTimeStep ); if ( this->viewer()->mainCamera()->viewMatrix() == sm_defaultViewMatrix ) { @@ -668,7 +665,7 @@ void Rim2dIntersectionView::onUpdateDisplayModelForCurrentTimeStep() } } - if ( ( this->hasUserRequestedAnimation() && this->hasResults() ) ) + if ( this->hasResults() ) { m_flatIntersectionPartMgr->updateCellResultColor( m_currentTimeStep, m_legendConfig->scalarMapper(), diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp index a9caf7b119..c77c69eade 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dOverlayInfoConfig.cpp @@ -432,7 +432,7 @@ QString Rim3dOverlayInfoConfig::resultInfoText( const RigHistogramData& histData } else if ( eclipseView ) { - bool isResultsInfoRelevant = eclipseView->hasUserRequestedAnimation() && eclipseView->cellResult()->hasResult(); + bool isResultsInfoRelevant = eclipseView->cellResult()->hasResult(); if ( eclipseView->cellResult()->isTernarySaturationSelected() ) { @@ -481,9 +481,9 @@ QString Rim3dOverlayInfoConfig::resultInfoText( const RigHistogramData& histData "
" "
%1
%1%2%6
%1 %2 %3 %4 %5 %6
" ) .arg( histData.min ) - .arg( histData.p10 ) - .arg( histData.mean ) .arg( histData.p90 ) + .arg( histData.mean ) + .arg( histData.p10 ) .arg( histData.max ) .arg( histData.sum ); } @@ -519,7 +519,7 @@ QString Rim3dOverlayInfoConfig::resultInfoText( const RigHistogramData& histData } } - if ( eclipseView->hasUserRequestedAnimation() && eclipseView->cellEdgeResult()->hasResult() ) + if ( eclipseView->cellEdgeResult()->hasResult() ) { double min, max; QString cellEdgeName = eclipseView->cellEdgeResult()->resultVariableUiShortName(); @@ -552,8 +552,7 @@ QString Rim3dOverlayInfoConfig::resultInfoText( const RigHistogramData& histData { RimGeoMechCase* geoMechCase = geoMechView->geoMechCase(); RigGeoMechCaseData* caseData = geoMechCase ? geoMechCase->geoMechData() : nullptr; - bool isResultsInfoRelevant = caseData && geoMechView->hasUserRequestedAnimation() && - geoMechView->cellResultResultDefinition()->hasResult(); + bool isResultsInfoRelevant = caseData && geoMechView->cellResultResultDefinition()->hasResult(); if ( isResultsInfoRelevant ) { @@ -652,9 +651,9 @@ QString Rim3dOverlayInfoConfig::resultInfoText( const RigHistogramData& histData " %1 %2 %3 %4 %5 %6 " "" ) .arg( histData.min ) - .arg( histData.p10 ) - .arg( histData.mean ) .arg( histData.p90 ) + .arg( histData.mean ) + .arg( histData.p10 ) .arg( histData.max ) .arg( histData.sum ); } @@ -857,13 +856,13 @@ void Rim3dOverlayInfoConfig::updateEclipse3DInfo( RimEclipseView* eclipseView ) if ( m_showHistogram() ) { - bool isResultsInfoRelevant = eclipseView->hasUserRequestedAnimation() && eclipseView->cellResult()->hasResult(); + bool isResultsInfoRelevant = eclipseView->cellResult()->hasResult(); if ( isResultsInfoRelevant && histData.isHistogramVectorValid() ) { eclipseView->viewer()->showHistogram( true ); eclipseView->viewer()->setHistogram( histData.min, histData.max, histData.histogram ); - eclipseView->viewer()->setHistogramPercentiles( histData.p10, histData.p90, histData.mean ); + eclipseView->viewer()->setHistogramPercentiles( histData.p90, histData.p10, histData.mean ); } } } @@ -905,14 +904,13 @@ void Rim3dOverlayInfoConfig::updateGeoMech3DInfo( RimGeoMechView* geoMechView ) { RimGeoMechCase* geoMechCase = geoMechView->geoMechCase(); RigGeoMechCaseData* caseData = geoMechCase ? geoMechCase->geoMechData() : nullptr; - bool isResultsInfoRelevant = caseData && geoMechView->hasUserRequestedAnimation() && - geoMechView->cellResultResultDefinition()->hasResult(); + bool isResultsInfoRelevant = caseData && geoMechView->cellResultResultDefinition()->hasResult(); if ( isResultsInfoRelevant && histData.isHistogramVectorValid() ) { geoMechView->viewer()->showHistogram( true ); geoMechView->viewer()->setHistogram( histData.min, histData.max, histData.histogram ); - geoMechView->viewer()->setHistogramPercentiles( histData.p10, histData.p90, histData.mean ); + geoMechView->viewer()->setHistogramPercentiles( histData.p90, histData.p10, histData.mean ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp index 8b6dd35ec8..edcc7dd25b 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.cpp @@ -24,6 +24,7 @@ #include "RiaGuiApplication.h" #include "RiaOptionItemFactory.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaViewRedrawScheduler.h" #include "RicfCommandObject.h" @@ -128,8 +129,6 @@ Rim3dView::Rim3dView() CAF_PDM_InitField( &maximumFrameRate, "MaximumFrameRate", 10, "Maximum Frame Rate", "", "", "" ); maximumFrameRate.uiCapability()->setUiHidden( true ); - CAF_PDM_InitField( &hasUserRequestedAnimation, "AnimationMode", false, "Animation Mode", "", "", "" ); - hasUserRequestedAnimation.uiCapability()->setUiHidden( true ); CAF_PDM_InitScriptableField( &m_currentTimeStep, "CurrentTimeStep", 0, "Current Time Step", "", "", "" ); m_currentTimeStep.uiCapability()->setUiHidden( true ); @@ -337,7 +336,7 @@ void Rim3dView::updateViewWidgetAfterCreation() this->onResetLegendsInViewer(); m_viewer->updateNavigationPolicy(); - m_viewer->enablePerfInfoHud( RiaGuiApplication::instance()->preferences()->show3dInformation() ); + m_viewer->enablePerfInfoHud( RiaPreferencesSystem::current()->show3dInformation() ); m_viewer->mainCamera()->setViewMatrix( m_cameraPosition ); m_viewer->setPointOfInterest( m_cameraPointOfInterest() ); @@ -556,8 +555,6 @@ void Rim3dView::setCurrentTimeStep( int frameIndex ) RiuTimeStepChangedHandler::instance()->handleTimeStepChanged( this ); this->onClearReservoirCellVisibilitiesIfNecessary(); } - - this->hasUserRequestedAnimation = true; } //-------------------------------------------------------------------------------------------------- @@ -703,7 +700,6 @@ void Rim3dView::setDefaultView() //-------------------------------------------------------------------------------------------------- void Rim3dView::endAnimation() { - this->hasUserRequestedAnimation = false; this->onUpdateStaticCellColors(); } @@ -751,9 +747,6 @@ void Rim3dView::setupBeforeSave() { if ( m_viewer ) { - hasUserRequestedAnimation = m_viewer->isAnimationActive(); // JJS: This is not conceptually correct. The - // variable is updated as we go, and store the user - // intentions. But I guess that in practice... m_cameraPosition = m_viewer->mainCamera()->viewMatrix(); m_cameraPointOfInterest = m_viewer->pointOfInterest(); } diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dView.h b/ApplicationLibCode/ProjectDataModel/Rim3dView.h index 1e66052836..c0e3b3fee3 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dView.h +++ b/ApplicationLibCode/ProjectDataModel/Rim3dView.h @@ -96,7 +96,6 @@ class Rim3dView : public RimViewWindow, public RiuViewerToViewInterface, public caf::PdmField scaleZ; caf::PdmField isPerspectiveView; caf::PdmField maximumFrameRate; - caf::PdmField hasUserRequestedAnimation; // Draw style diff --git a/ApplicationLibCode/ProjectDataModel/RimBinaryExportSettings.cpp b/ApplicationLibCode/ProjectDataModel/RimBinaryExportSettings.cpp index 9b2a830198..6c84bf4f5f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimBinaryExportSettings.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimBinaryExportSettings.cpp @@ -43,11 +43,11 @@ void RimBinaryExportSettings::defineEditorAttribute( const caf::PdmFieldHandle* { if ( field == &fileName ) { - caf::PdmUiFilePathEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr ) { myAttr->m_selectSaveFileName = true; - myAttr->m_fileSelectionFilter = "Text files (*.txt);;All files (*.*)"; + myAttr->m_fileSelectionFilter = "GRDECL files (*.grdecl *.GRDECL);;All files (*.*)"; } } } diff --git a/ApplicationLibCode/ProjectDataModel/RimCase.cpp b/ApplicationLibCode/ProjectDataModel/RimCase.cpp index 624ce298d2..138d6b0e21 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimCase.cpp @@ -67,7 +67,7 @@ RimCase::RimCase() CAF_PDM_InitFieldNoDefault( &m_activeFormationNames, "DefaultFormationNames", "Formation Names File", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_timeStepFilter, "TimeStepFilter", "Time Step Filter", "", "", "" ); - m_timeStepFilter.uiCapability()->setUiHidden( true ); + m_timeStepFilter.uiCapability()->setUiTreeHidden( true ); m_timeStepFilter.uiCapability()->setUiTreeChildrenHidden( true ); m_timeStepFilter = new RimTimeStepFilter; diff --git a/ApplicationLibCode/ProjectDataModel/RimCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimCaseCollection.cpp index 3ebe7a9612..954e08c5a5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimCaseCollection.cpp @@ -33,7 +33,7 @@ RimCaseCollection::RimCaseCollection() CAF_PDM_InitObject( "Derived Statistics", "", "", "" ); CAF_PDM_InitFieldNoDefault( &reservoirs, "Reservoirs", "Reservoirs ChildArrayField", "", "", "" ); - reservoirs.uiCapability()->setUiHidden( true ); + reservoirs.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimCheckableNamedObject.cpp b/ApplicationLibCode/ProjectDataModel/RimCheckableNamedObject.cpp index b3be03f8e2..f1afe25100 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCheckableNamedObject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimCheckableNamedObject.cpp @@ -18,6 +18,9 @@ #include "RimCheckableNamedObject.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimCheckableNamedObject, "CheckableNamedObject" ); // Do not use. Abstract class //-------------------------------------------------------------------------------------------------- @@ -25,8 +28,8 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimCheckableNamedObject, "CheckableNamedObject //-------------------------------------------------------------------------------------------------- RimCheckableNamedObject::RimCheckableNamedObject( void ) { - CAF_PDM_InitObject( "Checkable object", "", "", "" ); - CAF_PDM_InitField( &m_isChecked, "IsChecked", true, "Active", "", "", "" ); + CAF_PDM_InitScriptableObject( "Checkable object", "", "", "" ); + CAF_PDM_InitScriptableField( &m_isChecked, "IsChecked", true, "Active", "", "", "" ); m_isChecked.uiCapability()->setUiHidden( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimColorLegend.cpp b/ApplicationLibCode/ProjectDataModel/RimColorLegend.cpp index 6bdf7b8089..004ef242b8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimColorLegend.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimColorLegend.cpp @@ -39,7 +39,7 @@ RimColorLegend::RimColorLegend() CAF_PDM_InitField( &m_colorLegendName, "ColorLegendName", QString( "" ), "Color Legend Name", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_colorLegendItems, "ColorLegendItems", "", "", "", "" ); - m_colorLegendItems.uiCapability()->setUiHidden( true ); + m_colorLegendItems.uiCapability()->setUiTreeHidden( true ); setDeletable( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp index 50ccd4e86e..cdebd35895 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContextCommandBuilder.cpp @@ -137,6 +137,7 @@ #include "RimViewLinkerCollection.h" #include "RimVirtualPerforationResults.h" #include "RimWellAllocationPlot.h" +#include "RimWellIASettings.h" #include "RimWellLogCurve.h" #include "RimWellLogFile.h" #include "RimWellLogFileChannel.h" @@ -339,6 +340,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() else if ( dynamic_cast( firstUiItem ) ) { menuBuilder << "RicNewEditableWellPathFeature"; + menuBuilder << "RicPasteModeledWellPathFeature"; + menuBuilder << "RicCreateEnsembleWellLogFeature"; menuBuilder.addSeparator(); menuBuilder.subMenuStart( "Import" ); menuBuilder << "RicWellPathsImportFileFeature"; @@ -371,6 +374,9 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() { menuBuilder << "RicNewEditableWellPathFeature"; menuBuilder << "RicNewWellPathLateralFeature"; + menuBuilder << "RicLinkWellPathFeature"; + + menuBuilder.addSeparator(); menuBuilder << "RicNewWellPathIntersectionFeature"; appendCreateCompletions( menuBuilder ); @@ -382,6 +388,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() appendExportWellPaths( menuBuilder ); menuBuilder.addSeparator(); + menuBuilder << "RicCreateEnsembleWellLogFeature"; menuBuilder.subMenuStart( "Well Plots", QIcon( ":/WellLogTrack16x16.png" ) ); menuBuilder << "RicNewRftPlotFeature"; menuBuilder << "RicNewPltPlotFeature"; @@ -398,11 +405,18 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder.subMenuEnd(); menuBuilder.addSeparator(); + menuBuilder << "RicDeleteWellPathFeature"; + menuBuilder.addSeparator(); - if ( dynamic_cast( firstUiItem ) ) + if ( auto modeledWellPath = dynamic_cast( firstUiItem ) ) { menuBuilder << "RicShowWellPlanFeature"; + + if ( modeledWellPath->isTopLevelWellPath() ) + { + menuBuilder << "RicCreateMultipleWellPathLaterals"; + } } } else if ( dynamic_cast( firstUiItem ) ) @@ -413,10 +427,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewWellPathFractureFeature"; menuBuilder.subMenuEnd(); menuBuilder << "RicCreateTemporaryLgrFeature"; - if ( RiaApplication::enableDevelopmentFeatures() ) - { - menuBuilder << "RicNewStimPlanModelFeature"; - } + menuBuilder << "RicNewStimPlanModelFeature"; menuBuilder.addSeparator(); appendExportCompletions( menuBuilder ); } @@ -447,12 +458,9 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if ( dynamic_cast( firstUiItem ) ) { - if ( RiaApplication::enableDevelopmentFeatures() ) - { - menuBuilder << "RicNewStimPlanModelFeature"; - menuBuilder << "RicNewStimPlanModelPlotFeature"; - menuBuilder << "RicExportStimPlanModelToFileFeature"; - } + menuBuilder << "RicNewStimPlanModelFeature"; + menuBuilder << "RicNewStimPlanModelPlotFeature"; + menuBuilder << "RicExportStimPlanModelToFileFeature"; } else if ( dynamic_cast( firstUiItem ) ) { @@ -460,10 +468,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if ( dynamic_cast( firstUiItem ) ) { - if ( RiaApplication::enableDevelopmentFeatures() ) - { - menuBuilder << "RicNewStimPlanModelFeature"; - } + menuBuilder << "RicNewStimPlanModelFeature"; } else if ( dynamic_cast( firstUiItem ) || dynamic_cast( firstUiItem ) || @@ -617,6 +622,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewWellLogRftCurveFeature"; menuBuilder << "RicNewWellLogFileCurveFeature"; menuBuilder << "RicNewWellMeasurementCurveFeature"; + menuBuilder << "RicNewEnsembleWellLogCurveSetFeature"; menuBuilder << "Separator"; menuBuilder << "RicDeleteSubPlotFeature"; } @@ -804,6 +810,9 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if ( dynamic_cast( firstUiItem ) ) { + menuBuilder << "RicCreateSurfaceIntersectionBandFeature"; + menuBuilder << "RicCreateSurfaceIntersectionCurveFeature"; + menuBuilder.addSeparator(); menuBuilder << "RicPasteIntersectionsFeature"; menuBuilder.addSeparator(); menuBuilder << "RicAppendIntersectionFeature"; @@ -925,10 +934,7 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() } else if ( dynamic_cast( firstUiItem ) ) { - if ( RiaApplication::enableDevelopmentFeatures() ) - { - menuBuilder << "RicNewStimPlanModelTemplateFeature"; - } + menuBuilder << "RicNewStimPlanModelTemplateFeature"; } else if ( dynamic_cast( firstUiItem ) ) { @@ -969,6 +975,8 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() { menuBuilder << "RicImportSurfacesFeature"; menuBuilder << "RicNewGridSurfaceFeature"; + menuBuilder << "RicImportEnsembleSurfaceFeature"; + menuBuilder << "RicCreateEnsembleSurfaceFeature"; menuBuilder.addSeparator(); menuBuilder << "RicNewSurfaceCollectionFeature"; } @@ -1077,6 +1085,10 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicCutReferencesToClipboardFeature"; menuBuilder << "Separator"; + + menuBuilder << "RicDeleteWellPathFeature"; + menuBuilder << "RicLinkWellPathFeature"; + if ( dynamic_cast( firstUiItem ) || dynamic_cast( firstUiItem ) ) { menuBuilder << "RicCreatePlotFromSelectionFeature"; @@ -1092,9 +1104,9 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "RicNewMultiPlotFeature"; // Work in progress -- End + appendCreateCompletions( menuBuilder, menuBuilder.itemCount() > 0u ); - bool addedExportWellPaths = appendExportWellPaths( menuBuilder, menuBuilder.itemCount() > 0u ) > 0; - appendExportCompletions( menuBuilder, menuBuilder.itemCount() > 0u && !addedExportWellPaths ); + appendExportWellPaths( menuBuilder, menuBuilder.itemCount() > 0u ); if ( menuBuilder.itemCount() > 0u ) { @@ -1170,6 +1182,12 @@ caf::CmdFeatureMenuBuilder RimContextCommandBuilder::commandsFromSelection() menuBuilder << "Separator"; menuBuilder << "RicNewSimWellFractureFeature"; } +#ifdef USE_ODB_API + else if ( dynamic_cast( firstUiItem ) ) + { + menuBuilder << "RicRunWellIntegrityAnalysisFeature"; + } +#endif menuBuilder.addSeparator(); menuBuilder << "RicCopyIntersectionsToAllViewsInCaseFeature"; } @@ -1381,10 +1399,7 @@ int RimContextCommandBuilder::appendCreateCompletions( caf::CmdFeatureMenuBuilde candidates << "RicNewWellPathAttributeFeature"; candidates << "Separator"; candidates << "RicCreateTemporaryLgrFeature"; - if ( RiaApplication::enableDevelopmentFeatures() ) - { - candidates << "RicNewStimPlanModelFeature"; - } + candidates << "RicNewStimPlanModelFeature"; return appendSubMenuWithCommands( menuBuilder, candidates, diff --git a/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp index 9f619b7826..3dbdb1ec68 100644 --- a/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimContourMapProjection.cpp @@ -1344,6 +1344,11 @@ std::vector std::vector> kLayerCellIndexVector; kLayerCellIndexVector.resize( kLayers() ); + if ( kLayerCellIndexVector.empty() ) + { + return matchingVisibleCellsAndWeight; + } + for ( size_t globalCellIdx : allCellIndices ) { if ( ( *m_cellGridIdxVisibility )[globalCellIdx] ) diff --git a/ApplicationLibCode/ProjectDataModel/RimCustomObjectiveFunctionWeight.cpp b/ApplicationLibCode/ProjectDataModel/RimCustomObjectiveFunctionWeight.cpp index 540f71f520..a08f6e2fdf 100644 --- a/ApplicationLibCode/ProjectDataModel/RimCustomObjectiveFunctionWeight.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimCustomObjectiveFunctionWeight.cpp @@ -50,7 +50,7 @@ RimCustomObjectiveFunctionWeight::RimCustomObjectiveFunctionWeight() m_objectiveValuesSummaryAddressesUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSummaryAddresses, "ObjectiveSummaryAddress", "Summary Address", "", "", "" ); - m_objectiveValuesSummaryAddresses.uiCapability()->setUiHidden( true ); + m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeHidden( true ); m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSelectSummaryAddressPushButton, diff --git a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp index c0c485e856..ef46fdc3a1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.cpp @@ -20,15 +20,20 @@ #include "RimDepthTrackPlot.h" #include "RiaGuiApplication.h" +#include "RiaOptionItemFactory.h" #include "RiaPreferences.h" +#include "RiaResultNames.h" #include "RigWellLogCurveData.h" #include "RigWellPath.h" #include "RimEclipseCase.h" #include "RimEclipseCaseCollection.h" #include "RimEclipseResultCase.h" +#include "RimEnsembleCurveSet.h" +#include "RimEnsembleWellLogCurveSet.h" #include "RimGeoMechCase.h" +#include "RimMainPlotCollection.h" #include "RimOilField.h" #include "RimPlot.h" #include "RimProject.h" @@ -118,8 +123,11 @@ RimDepthTrackPlot::RimDepthTrackPlot() m_nameConfig.uiCapability()->setUiTreeChildrenHidden( true ); m_nameConfig = new RimWellLogPlotNameConfig(); + CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSet, "FilterEnsembleCurveSet", "Filter by Ensemble Curve Set", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_depthEqualization, "DepthEqualization", "Depth Equalization", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_plots, "Tracks", "", "", "", "" ); - m_plots.uiCapability()->setUiHidden( true ); + m_plots.uiCapability()->setUiTreeHidden( true ); auto reorderability = caf::PdmFieldReorderCapability::addToField( &m_plots ); reorderability->orderChanged.connect( this, &RimDepthTrackPlot::onPlotsReordered ); @@ -830,6 +838,26 @@ void RimDepthTrackPlot::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel { performAutoNameUpdate(); } + else if ( changedField == &m_depthEqualization ) + { + std::vector ensembleWellLogCurveSets; + descendantsOfType( ensembleWellLogCurveSets ); + for ( auto ensembleWellLogCurveSet : ensembleWellLogCurveSets ) + { + ensembleWellLogCurveSet->setDepthEqualization( m_depthEqualization() ); + ensembleWellLogCurveSet->loadDataAndUpdate( true ); + } + } + else if ( changedField == &m_ensembleCurveSet ) + { + std::vector ensembleWellLogCurveSets; + descendantsOfType( ensembleWellLogCurveSets ); + for ( auto ensembleWellLogCurveSet : ensembleWellLogCurveSets ) + { + ensembleWellLogCurveSet->setFilterByEnsembleCurveSet( m_ensembleCurveSet() ); + ensembleWellLogCurveSet->loadDataAndUpdate( true ); + } + } updateConnectedEditors(); } @@ -856,6 +884,22 @@ void RimDepthTrackPlot::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi plotLayoutGroup->add( &m_axisTitleFontSize ); plotLayoutGroup->add( &m_axisValueFontSize ); + std::vector ensembleWellLogCurveSets; + descendantsOfType( ensembleWellLogCurveSets ); + if ( !ensembleWellLogCurveSets.empty() ) + { + caf::PdmUiGroup* ensembleWellLogGroup = uiOrdering.addNewGroup( "Ensemble Well Log" ); + ensembleWellLogGroup->add( &m_depthEqualization ); + ensembleWellLogGroup->add( &m_ensembleCurveSet ); + + // Disable depth equalization if any of the ensmble is missing k-layer info + bool hasKLayerIndex = true; + for ( auto wellLogCurveSet : ensembleWellLogCurveSets ) + if ( !wellLogCurveSet->hasPropertyInFile( RiaResultNames::indexKResultName() ) ) hasKLayerIndex = false; + + m_depthEqualization.uiCapability()->setUiReadOnly( !hasKLayerIndex ); + } + uiOrdering.skipRemainingFields( true ); } @@ -893,6 +937,10 @@ QList RimDepthTrackPlot::calculateValueOptions( const ca { options = caf::FontTools::relativeSizeValueOptions( RiaPreferences::current()->defaultPlotFontSize() ); } + else if ( fieldNeedingOptions == &m_ensembleCurveSet ) + { + RiaOptionItemFactory::appendOptionItemsForEnsembleCurveSets( &options ); + } ( *useOptionsOnly ) = true; return options; diff --git a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h index e75748ec70..af772f2aff 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimDepthTrackPlot.h @@ -21,6 +21,7 @@ #include "RiaDefines.h" #include "RimAbstractPlotCollection.h" +#include "RimEnsembleWellLogStatistics.h" #include "RimPlotWindow.h" #include "RimWellLogPlotNameConfig.h" @@ -30,6 +31,7 @@ #include "cafPdmField.h" #include "cafPdmFieldHandle.h" #include "cafPdmObject.h" +#include "cafPdmPtrField.h" #include @@ -38,6 +40,8 @@ class RimWellLogCurveCommonDataSource; class RiuWellLogPlot; class RimPlot; +class RimEnsembleCurveSet; + class QKeyEvent; //================================================================================================== @@ -175,6 +179,9 @@ class RimDepthTrackPlot : public RimTypedPlotCollection, public RimPlot caf::PdmChildField m_nameConfig; caf::PdmChildArrayField m_plots; + caf::PdmField> m_depthEqualization; + caf::PdmPtrField m_ensembleCurveSet; + QPointer m_viewer; std::set m_availableDepthUnits; std::set m_availableDepthTypes; diff --git a/ApplicationLibCode/ProjectDataModel/RimDialogData.cpp b/ApplicationLibCode/ProjectDataModel/RimDialogData.cpp index 7b9b48f8f6..9a6d6b2f05 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDialogData.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimDialogData.cpp @@ -27,6 +27,8 @@ #include "ExportCommands/RicExportWellPathsUi.h" #include "FractureCommands/RicCreateMultipleFracturesUi.h" #include "HoloLensCommands/RicHoloLensExportToFolderUi.h" +#include "RicCreateEnsembleSurfaceUi.h" +#include "RicCreateEnsembleWellLogUi.h" CAF_PDM_SOURCE_INIT( RimDialogData, "RimDialogData" ); @@ -65,6 +67,12 @@ RimDialogData::RimDialogData() CAF_PDM_InitFieldNoDefault( &m_mockModelSettings, "MockModelSettings", "Mock Model Settings", "", "", "" ); m_mockModelSettings = new RimMockModelSettings(); + + CAF_PDM_InitFieldNoDefault( &m_createEnsembleSurfaceUi, "CreateEnsembleSurfaceUi", "Create Ensmeble Surface Ui", "", "", "" ); + m_createEnsembleSurfaceUi = new RicCreateEnsembleSurfaceUi(); + + CAF_PDM_InitFieldNoDefault( &m_createEnsembleWellLogUi, "CreateEnsembleWellLogUi", "Create Ensemble Well Log Ui", "", "", "" ); + m_createEnsembleWellLogUi = new RicCreateEnsembleWellLogUi(); } //-------------------------------------------------------------------------------------------------- @@ -155,3 +163,19 @@ RimMockModelSettings* RimDialogData::mockModelSettings() const { return m_mockModelSettings; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleSurfaceUi* RimDialogData::createEnsembleSurfaceUi() const +{ + return m_createEnsembleSurfaceUi; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RicCreateEnsembleWellLogUi* RimDialogData::createEnsembleWellLogUi() const +{ + return m_createEnsembleWellLogUi; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimDialogData.h b/ApplicationLibCode/ProjectDataModel/RimDialogData.h index 87c2a3cbd2..4376fb03b5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimDialogData.h +++ b/ApplicationLibCode/ProjectDataModel/RimDialogData.h @@ -29,6 +29,8 @@ class RicHoloLensExportToFolderUi; class RicExportWellPathsUi; class RicExportLgrUi; class RimMockModelSettings; +class RicCreateEnsembleSurfaceUi; +class RicCreateEnsembleWellLogUi; //================================================================================================== /// @@ -61,6 +63,8 @@ class RimDialogData : public caf::PdmObject RicExportLgrUi* exportLgrData() const; RicExportEclipseSectorModelUi* exportSectorModelUi() const; RimMockModelSettings* mockModelSettings() const; + RicCreateEnsembleSurfaceUi* createEnsembleSurfaceUi() const; + RicCreateEnsembleWellLogUi* createEnsembleWellLogUi() const; private: caf::PdmChildField m_exportCarfin; @@ -71,4 +75,6 @@ class RimDialogData : public caf::PdmObject caf::PdmChildField m_exportLgrData; caf::PdmChildField m_exportSectorModelData; caf::PdmChildField m_mockModelSettings; + caf::PdmChildField m_createEnsembleSurfaceUi; + caf::PdmChildField m_createEnsembleWellLogUi; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp index dbbc57228e..a9d962c6f5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.cpp @@ -96,12 +96,12 @@ RimEclipseCase::RimEclipseCase() "", "", "All Eclipse Views in the case" ); - reservoirViews.uiCapability()->setUiHidden( true ); + reservoirViews.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_matrixModelResults, "MatrixModelResults", "", "", "", "" ); - m_matrixModelResults.uiCapability()->setUiHidden( true ); + m_matrixModelResults.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_fractureModelResults, "FractureModelResults", "", "", "", "" ); - m_fractureModelResults.uiCapability()->setUiHidden( true ); + m_fractureModelResults.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_flipXAxis, "FlipXAxis", false, "Flip X Axis", "", "", "" ); CAF_PDM_InitField( &m_flipYAxis, "FlipYAxis", false, "Flip Y Axis", "", "", "" ); @@ -116,16 +116,16 @@ RimEclipseCase::RimEclipseCase() CAF_PDM_InitFieldNoDefault( &m_inputPropertyCollection, "InputPropertyCollection", "", "", "", "" ); m_inputPropertyCollection = new RimEclipseInputPropertyCollection; - m_inputPropertyCollection->parentField()->uiCapability()->setUiHidden( true ); + m_inputPropertyCollection->parentField()->uiCapability()->setUiTreeHidden( true ); // Init m_matrixModelResults = new RimReservoirCellResultsStorage; - m_matrixModelResults.uiCapability()->setUiHidden( true ); + m_matrixModelResults.uiCapability()->setUiTreeHidden( true ); m_matrixModelResults.uiCapability()->setUiTreeChildrenHidden( true ); m_fractureModelResults = new RimReservoirCellResultsStorage; - m_fractureModelResults.uiCapability()->setUiHidden( true ); + m_fractureModelResults.uiCapability()->setUiTreeHidden( true ); m_fractureModelResults.uiCapability()->setUiTreeChildrenHidden( true ); this->setReservoirData( nullptr ); @@ -302,8 +302,6 @@ RimEclipseView* RimEclipseCase::createAndAddReservoirView() rimEclipseView->faultCollection()->showFaultCollection = prefs->enableFaultsByDefault(); - rimEclipseView->hasUserRequestedAnimation = true; - rimEclipseView->cellEdgeResult()->setResultVariable( "MULT" ); rimEclipseView->cellEdgeResult()->setActive( false ); rimEclipseView->fractureColors()->setDefaultResultName(); @@ -680,8 +678,6 @@ void RimEclipseCase::loadAndSyncronizeInputProperties( bool importGridOrFaultDat filenames.push_back( fileName ); } - if ( importGridOrFaultData ) filenames.push_back( gridFileName() ); - RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( inputPropertyCollection(), eclipseCaseData(), filenames, @@ -696,7 +692,8 @@ void RimEclipseCase::ensureFaultDataIsComputed() RigEclipseCaseData* rigEclipseCase = eclipseCaseData(); if ( rigEclipseCase ) { - bool computeFaults = RiaPreferences::current()->readerSettings()->importFaults(); + bool computeFaults = ( m_readerSettings && m_readerSettings->importFaults() ) || + ( !m_readerSettings && RiaPreferences::current()->readerSettings()->importFaults() ); if ( computeFaults ) { RigActiveCellInfo* actCellInfo = rigEclipseCase->activeCellInfo( RiaDefines::PorosityModelType::MATRIX_MODEL ); @@ -905,10 +902,8 @@ void RimEclipseCase::setFilesContainingFaults( const std::vector& pathS //-------------------------------------------------------------------------------------------------- bool RimEclipseCase::ensureReservoirCaseIsOpen() { - if ( m_rigEclipseCase.notNull() ) - { - return true; - } + // Call openReserviorCase, as this is a cheap method to call multiple times + // Add extra testing here if performance issues are seen return openReserviorCase(); } @@ -1118,3 +1113,11 @@ bool RimEclipseCase::importAsciiInputProperties( const QStringList& fileNames ) { return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEclipseCase::setReaderSettings( std::shared_ptr readerSettings ) +{ + m_readerSettings = readerSettings; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h index 3e15d44742..1d9846e148 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCase.h @@ -33,6 +33,7 @@ #include "cvfColor3.h" #include "cvfObject.h" +#include #include class QString; @@ -49,6 +50,7 @@ class RimEclipseInputPropertyCollection; class RimEclipseView; class RimIdenticalGridCaseGroup; class RimReservoirCellResultsStorage; +class RifReaderSettings; //================================================================================================== // @@ -119,6 +121,8 @@ class RimEclipseCase : public RimCase bool ensureNncDataIsComputed(); void createDisplayModelAndUpdateAllViews(); + void setReaderSettings( std::shared_ptr readerSettings ); + protected: void initAfterRead() override; void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; @@ -141,6 +145,8 @@ class RimEclipseCase : public RimCase caf::PdmField m_flipYAxis; caf::PdmChildField m_inputPropertyCollection; + std::shared_ptr m_readerSettings; + private: caf::PdmField m_releaseResultMemory; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp index c7d3da81b2..524c453aec 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCaseCollection.cpp @@ -44,10 +44,10 @@ RimEclipseCaseCollection::RimEclipseCaseCollection( void ) CAF_PDM_InitObject( "Grid Models", ":/Cases16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &cases, "Reservoirs", "", "", "", "" ); - cases.uiCapability()->setUiHidden( true ); + cases.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &caseGroups, "CaseGroups", "", "", "", "" ); - caseGroups.uiCapability()->setUiHidden( true ); + caseGroups.uiCapability()->setUiTreeHidden( true ); m_gridCollection = new RigGridManager; } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp index fecad87c71..2073a237ae 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseCellColors.cpp @@ -20,6 +20,8 @@ #include "RimEclipseCellColors.h" +#include "RiaResultNames.h" + #include "RicfCommandObject.h" #include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" @@ -102,11 +104,6 @@ void RimEclipseCellColors::fieldChangedByUi( const caf::PdmFieldHandle* changedF changeLegendConfig( this->resultVariableUiName() ); } - if ( newValue != RiaResultNames::undefinedResultName() ) - { - if ( m_reservoirView ) m_reservoirView->hasUserRequestedAnimation = true; - } - RimEclipseFaultColors* faultColors = dynamic_cast( this->parentField()->ownerObject() ); if ( faultColors ) { @@ -184,19 +181,7 @@ RimRegularLegendConfig* RimEclipseCellColors::createLegendForResult( const QStri bool useDiscreteLogLevels, bool isCategoryResult ) { - bool useLog = false; - { - QStringList subStringsToMatch{ "TRAN", "MULT", "PERM" }; - - for ( const auto& s : subStringsToMatch ) - { - if ( resultName.contains( s, Qt::CaseInsensitive ) ) - { - useLog = true; - break; - } - } - } + bool useLog = RiaResultNames::isLogarithmicResult( resultName ); RimRegularLegendConfig::ColorRangesType colorRangeType = RimRegularLegendConfig::ColorRangesType::UNDEFINED; if ( isCategoryResult ) diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp index d8c6018f82..4bda551d92 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseContourMapProjection.cpp @@ -66,7 +66,7 @@ RimEclipseContourMapProjection::RimEclipseContourMapProjection() CAF_PDM_InitField( &m_weightByParameter, "WeightByParameter", false, "Weight by Result Parameter", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_weightingResult, "WeightingResult", "", "", "", "" ); - m_weightingResult.uiCapability()->setUiHidden( true ); + m_weightingResult.uiCapability()->setUiTreeHidden( true ); m_weightingResult.uiCapability()->setUiTreeChildrenHidden( true ); m_weightingResult = new RimEclipseResultDefinition; m_weightingResult->findField( "MResultType" )->uiCapability()->setUiName( "Result Type" ); diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseFaultColors.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseFaultColors.cpp index 827ccab784..5659ef0dcd 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseFaultColors.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseFaultColors.cpp @@ -35,7 +35,7 @@ CAF_PDM_SOURCE_INIT( RimEclipseFaultColors, "RimFaultResultSlot" ); //-------------------------------------------------------------------------------------------------- RimEclipseFaultColors::RimEclipseFaultColors() { - CAF_PDM_InitObject( "Separate Fault Result", ":/draw_style_faults_24x24.png", "", "" ); + CAF_PDM_InitObject( "Fault Result", ":/draw_style_faults_24x24.png", "", "" ); CAF_PDM_InitField( &showCustomFaultResult, "ShowCustomFaultResult", false, "Show Custom Fault Result", "", "", "" ); showCustomFaultResult.uiCapability()->setUiHidden( true ); @@ -47,7 +47,7 @@ RimEclipseFaultColors::RimEclipseFaultColors() "", "" ); m_customFaultResultColors = new RimEclipseCellColors(); - m_customFaultResultColors.uiCapability()->setUiHidden( true ); + m_customFaultResultColors.uiCapability()->setUiTreeHidden( true ); m_customFaultResultColors->enableDeltaResults( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp index 8eca71ee5b..5641d7641c 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseInputCase.cpp @@ -111,6 +111,8 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames ) std::vector allErrorMessages; + QString gridFileName; + // First find and read the grid data if ( this->eclipseCaseData()->mainGrid()->gridPointDimensions() == cvf::Vec3st( 0, 0, 0 ) ) { @@ -120,6 +122,7 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames ) if ( RifEclipseInputFileTools::openGridFile( fileNames[i], this->eclipseCaseData(), importFaults, &errorMessages ) ) { setGridFileName( fileNames[i] ); + gridFileName = fileNames[i]; QFileInfo gridFileName( fileNames[i] ); QString caseName = gridFileName.completeBaseName(); @@ -154,6 +157,8 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames ) std::vector filesToRead; for ( const QString& filename : fileNames ) { + if ( filename == gridFileName ) continue; + bool exists = false; for ( const QString& currentFileName : additionalFiles() ) { @@ -169,16 +174,18 @@ bool RimEclipseInputCase::openDataFileSet( const QStringList& fileNames ) } } - RifEclipseInputPropertyLoader::readInputPropertiesFromFiles( m_inputPropertyCollection, - this->eclipseCaseData(), - importFaults, - filesToRead ); + RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( m_inputPropertyCollection, + this->eclipseCaseData(), + filesToRead, + importFaults ); if ( importFaults ) { this->ensureFaultDataIsComputed(); } + results( RiaDefines::PorosityModelType::MATRIX_MODEL )->createPlaceholderResultEntries(); + return true; } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseInputPropertyCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseInputPropertyCollection.cpp index 5271ac21c9..97d19a2db1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseInputPropertyCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseInputPropertyCollection.cpp @@ -34,7 +34,7 @@ RimEclipseInputPropertyCollection::RimEclipseInputPropertyCollection() CAF_PDM_InitObject( "Input Properties", ":/EclipseInput48x48.png", "", "" ); CAF_PDM_InitFieldNoDefault( &inputProperties, "InputProperties", "", "", "", "" ); - inputProperties.uiCapability()->setUiHidden( true ); + inputProperties.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp index 197cfb4d1b..47ddd6a334 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultCase.cpp @@ -77,7 +77,6 @@ RimEclipseResultCase::RimEclipseResultCase() m_unitSystem.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitFieldNoDefault( &m_flowDiagSolutions, "FlowDiagSolutions", "Flow Diagnostics Solutions", "", "", "" ); - m_flowDiagSolutions.uiCapability()->setUiHidden( true ); m_flowDiagSolutions.uiCapability()->setUiTreeHidden( true ); m_flowDiagSolutions.uiCapability()->setUiTreeChildrenHidden( true ); @@ -109,14 +108,16 @@ bool RimEclipseResultCase::openEclipseGridFile() //-------------------------------------------------------------------------------------------------- bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter ) { + // Early exit if data is already read + // Make sure that the progress info dialog is created after the return statement. If created before, the progress + // dialog triggers a redraw with incomplete geometry data and causes a crash + if ( m_gridAndWellDataIsReadFromFile ) return true; + caf::ProgressInfo progInfo( 50, "Reading Eclipse Grid File" ); progInfo.setProgressDescription( "Open Grid File" ); progInfo.setNextProgressIncrement( 48 ); - // Early exit if data is already read - if ( m_gridAndWellDataIsReadFromFile ) return true; - cvf::ref readerInterface; if ( gridFileName().contains( "Result Mock Debug Model" ) ) @@ -132,6 +133,7 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter cvf::ref readerEclipseOutput = new RifReaderEclipseOutput; readerEclipseOutput->setFilenamesWithFaults( this->filesContainingFaults() ); + readerEclipseOutput->setReaderSettings( m_readerSettings ); cvf::ref restartDataAccess = RifEclipseOutputFileTools::createDynamicResultAccess( gridFileName() ); @@ -241,11 +243,13 @@ bool RimEclipseResultCase::importGridAndResultMetaData( bool showTimeStepFilter bool RimEclipseResultCase::importAsciiInputProperties( const QStringList& fileNames ) { bool importFaults = false; - return RifEclipseInputPropertyLoader::readInputPropertiesFromFiles( m_inputPropertyCollection, - this->eclipseCaseData(), - importFaults, - std::vector( fileNames.begin(), - fileNames.end() ) ); + RifEclipseInputPropertyLoader::loadAndSyncronizeInputProperties( m_inputPropertyCollection, + this->eclipseCaseData(), + std::vector( fileNames.begin(), + fileNames.end() ), + importFaults ); + + return true; } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp index c10d9df067..ae47bac7df 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.cpp @@ -257,6 +257,14 @@ RimEclipseCase* RimEclipseResultDefinition::eclipseCase() const return m_eclipseCase; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::ResultCatType RimEclipseResultDefinition::resultType() const +{ + return m_resultType(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -878,6 +886,7 @@ QList //-------------------------------------------------------------------------------------------------- RigEclipseResultAddress RimEclipseResultDefinition::eclipseResultAddress() const { + if ( !isChecked() ) return RigEclipseResultAddress(); if ( isFlowDiagOrInjectionFlooding() ) return RigEclipseResultAddress(); const RigCaseCellResultsData* gridCellResults = this->currentGridCellResults(); @@ -1317,6 +1326,14 @@ void RimEclipseResultDefinition::setResultType( RiaDefines::ResultCatType val ) m_resultTypeUiField = val; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::PorosityModelType RimEclipseResultDefinition::porosityModel() const +{ + return m_porosityModel(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1326,6 +1343,16 @@ void RimEclipseResultDefinition::setPorosityModel( RiaDefines::PorosityModelType m_porosityModelUiField = val; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEclipseResultDefinition::resultVariable() const +{ + if ( !isChecked() ) return RiaResultNames::undefinedResultName(); + + return m_resultVariable(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.h b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.h index a9a25c70bf..ab31a9b1b1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.h +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseResultDefinition.h @@ -24,6 +24,7 @@ #include "RiaPorosityModel.h" #include "RigFlowDiagResultAddress.h" +#include "RimCheckableObject.h" #include "RimFlowDiagSolution.h" #include "cafAppEnum.h" @@ -48,7 +49,7 @@ class RimTernaryLegendConfig; /// /// //================================================================================================== -class RimEclipseResultDefinition : public caf::PdmObject +class RimEclipseResultDefinition : public RimCheckableObject { CAF_PDM_HEADER_INIT; @@ -79,11 +80,11 @@ class RimEclipseResultDefinition : public caf::PdmObject void setEclipseCase( RimEclipseCase* eclipseCase ); RimEclipseCase* eclipseCase() const; - RiaDefines::ResultCatType resultType() const { return m_resultType(); } + RiaDefines::ResultCatType resultType() const; void setResultType( RiaDefines::ResultCatType val ); - RiaDefines::PorosityModelType porosityModel() const { return m_porosityModel(); } + RiaDefines::PorosityModelType porosityModel() const; void setPorosityModel( RiaDefines::PorosityModelType val ); - QString resultVariable() const { return m_resultVariable(); } + QString resultVariable() const; virtual void setResultVariable( const QString& val ); RiaDefines::PhaseType resultPhaseType() const; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCase.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCase.cpp index 675628bda8..d908c7ce37 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCase.cpp @@ -785,7 +785,6 @@ void RimEclipseStatisticsCase::updateConnectedEditorsAndReservoirViews() // It is usually not needed to create new display model, but if any derived geometry based on generated data // (from Octave) a full display model rebuild is required - reservoirViews[i]->hasUserRequestedAnimation = true; reservoirViews[i]->scheduleCreateDisplayModelAndRedraw(); reservoirViews[i]->intersectionCollection()->scheduleCreateDisplayModelAndRedraw2dIntersectionViews(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseCollection.cpp index 85d5697e77..6281cac4cb 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseCollection.cpp @@ -34,7 +34,7 @@ RimEclipseStatisticsCaseCollection::RimEclipseStatisticsCaseCollection() CAF_PDM_InitObject( "Derived Statistics", "", "", "" ); CAF_PDM_InitFieldNoDefault( &cases, "Reservoirs", "", "", "", "" ); - cases.uiCapability()->setUiHidden( true ); + cases.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseEvaluator.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseEvaluator.cpp index 6a3422e517..624c1a3472 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseEvaluator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseStatisticsCaseEvaluator.cpp @@ -97,10 +97,7 @@ QString createResultNameRange( const QString& resultName ) } QString createResultNamePVal( const QString& resultName, double pValPos ) { - // Invert the number for display text - double valueForDisplay = 100.0 - pValPos; - - return resultName + "_P" + QString::number( valueForDisplay ); + return resultName + "_P" + QString::number( pValPos ); } //-------------------------------------------------------------------------------------------------- @@ -296,7 +293,9 @@ void RimEclipseStatisticsCaseEvaluator::evaluateForResults( const QList pValPoss.push_back( m_statisticsConfig.m_pMidPos ); pValPoss.push_back( m_statisticsConfig.m_pMaxPos ); std::vector pVals = - RigStatisticsMath::calculateNearestRankPercentiles( values, pValPoss ); + RigStatisticsMath::calculateNearestRankPercentiles( values, + pValPoss, + RigStatisticsMath::PercentileStyle::SWITCHED ); statParams[PMIN] = pVals[0]; statParams[PMID] = pVals[1]; statParams[PMAX] = pVals[2]; @@ -306,9 +305,15 @@ void RimEclipseStatisticsCaseEvaluator::evaluateForResults( const QList std::vector histogram; RigHistogramCalculator histCalc( statParams[MIN], statParams[MAX], 100, &histogram ); histCalc.addData( values ); - statParams[PMIN] = histCalc.calculatePercentil( m_statisticsConfig.m_pMinPos / 100.0 ); - statParams[PMID] = histCalc.calculatePercentil( m_statisticsConfig.m_pMidPos / 100.0 ); - statParams[PMAX] = histCalc.calculatePercentil( m_statisticsConfig.m_pMaxPos / 100.0 ); + statParams[PMIN] = + histCalc.calculatePercentil( m_statisticsConfig.m_pMinPos / 100.0, + RigStatisticsMath::PercentileStyle::SWITCHED ); + statParams[PMID] = + histCalc.calculatePercentil( m_statisticsConfig.m_pMidPos / 100.0, + RigStatisticsMath::PercentileStyle::SWITCHED ); + statParams[PMAX] = + histCalc.calculatePercentil( m_statisticsConfig.m_pMaxPos / 100.0, + RigStatisticsMath::PercentileStyle::SWITCHED ); } else if ( m_statisticsConfig.m_pValMethod == RimEclipseStatisticsCase::INTERPOLATED_OBSERVATION ) @@ -318,7 +323,9 @@ void RimEclipseStatisticsCaseEvaluator::evaluateForResults( const QList pValPoss.push_back( m_statisticsConfig.m_pMidPos ); pValPoss.push_back( m_statisticsConfig.m_pMaxPos ); std::vector pVals = - RigStatisticsMath::calculateInterpolatedPercentiles( values, pValPoss ); + RigStatisticsMath::calculateInterpolatedPercentiles( values, + pValPoss, + RigStatisticsMath::PercentileStyle::SWITCHED ); statParams[PMIN] = pVals[0]; statParams[PMID] = pVals[1]; statParams[PMAX] = pVals[2]; diff --git a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp index a7b60719e9..1f4b3cf70e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEclipseView.cpp @@ -143,12 +143,12 @@ RimEclipseView::RimEclipseView() "", "" ); m_cellResult = new RimEclipseCellColors(); - m_cellResult.uiCapability()->setUiHidden( true ); + m_cellResult.uiCapability()->setUiTreeHidden( true ); m_cellResult->enableDeltaResults( true ); CAF_PDM_InitFieldNoDefault( &m_cellEdgeResult, "GridCellEdgeResult", "Cell Edge Result", ":/EdgeResult_1.png", "", "" ); m_cellEdgeResult = new RimCellEdgeColors(); - m_cellEdgeResult.uiCapability()->setUiHidden( true ); + m_cellEdgeResult.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_elementVectorResult, "ElementVectorResult", @@ -157,39 +157,39 @@ RimEclipseView::RimEclipseView() "", "" ); m_elementVectorResult = new RimElementVectorResult; - m_elementVectorResult.uiCapability()->setUiHidden( true ); + m_elementVectorResult.uiCapability()->setUiTreeHidden( true ); - CAF_PDM_InitFieldNoDefault( &m_faultResultSettings, "FaultResultSettings", "Separate Fault Result", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_faultResultSettings, "FaultResultSettings", "Fault Result", "", "", "" ); m_faultResultSettings = new RimEclipseFaultColors(); - m_faultResultSettings.uiCapability()->setUiHidden( true ); + m_faultResultSettings.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_fractureColors, "StimPlanColors", "Fracture", "", "", "" ); m_fractureColors = new RimStimPlanColors(); - m_fractureColors.uiCapability()->setUiHidden( true ); + m_fractureColors.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_virtualPerforationResult, "VirtualPerforationResult", "", "", "", "" ); m_virtualPerforationResult = new RimVirtualPerforationResults(); - m_virtualPerforationResult.uiCapability()->setUiHidden( true ); + m_virtualPerforationResult.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_wellCollection, "WellCollection", "Simulation Wells", "", "", "" ); m_wellCollection = new RimSimWellInViewCollection; - m_wellCollection.uiCapability()->setUiHidden( true ); + m_wellCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_faultCollection, "FaultCollection", "Faults", "", "", "" ); m_faultCollection = new RimFaultInViewCollection; - m_faultCollection.uiCapability()->setUiHidden( true ); + m_faultCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_annotationCollection, "AnnotationCollection", "Annotations", "", "", "" ); m_annotationCollection = new RimAnnotationInViewCollection; - m_annotationCollection.uiCapability()->setUiHidden( true ); + m_annotationCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_streamlineCollection, "StreamlineCollection", "Streamlines", "", "", "" ); m_streamlineCollection = new RimStreamlineInViewCollection(); - m_streamlineCollection.uiCapability()->setUiHidden( true ); + m_streamlineCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_propertyFilterCollection, "PropertyFilters", "Property Filters", "", "", "" ); m_propertyFilterCollection = new RimEclipsePropertyFilterCollection(); - m_propertyFilterCollection.uiCapability()->setUiHidden( true ); + m_propertyFilterCollection.uiCapability()->setUiTreeHidden( true ); // Visualization fields CAF_PDM_InitField( &m_showInactiveCells, "ShowInactiveCells", false, "Show Inactive Cells", "", "", "" ); @@ -454,9 +454,11 @@ void RimEclipseView::onCreateDisplayModel() } } else if ( this->cellResult()->hasStaticResult() || this->cellEdgeResult()->hasResult() || - this->eclipsePropertyFilterCollection()->hasActiveFilters() ) + this->eclipsePropertyFilterCollection()->hasActiveFilters() || + this->intersectionCollection()->hasAnyActiveSeparateResults() || + ( this->surfaceInViewCollection() && this->surfaceInViewCollection()->hasAnyActiveSeparateResults() ) ) { - // The one and only result entry + // The one and only static result entry timeStepIndices.push_back( 0 ); } @@ -597,7 +599,6 @@ void RimEclipseView::onCreateDisplayModel() m_surfaceVizModel->removeAllParts(); if ( m_surfaceCollection ) { - m_surfaceCollection->clearGeometry(); m_surfaceCollection->appendPartsToModel( m_surfaceVizModel.p(), m_reservoirGridPartManager->scaleTransform() ); nativeOrOverrideViewer()->addStaticModelOnce( m_surfaceVizModel.p(), isUsingOverrideViewer() ); } @@ -637,7 +638,7 @@ void RimEclipseView::onCreateDisplayModel() // If the animation was active before recreating everything, make viewer view current frame - if ( frameModels.size() > 1 && this->hasUserRequestedAnimation() ) + if ( frameModels.size() > 1 ) { if ( viewer() && !isUsingOverrideViewer() ) viewer()->setCurrentFrame( m_currentTimeStep ); } @@ -887,15 +888,14 @@ void RimEclipseView::updateVisibleCellColors() for ( size_t i = 0; i < geometriesToRecolor.size(); ++i ) { - if ( this->hasUserRequestedAnimation() && this->cellEdgeResult()->hasResult() ) + if ( this->cellEdgeResult()->hasResult() ) { m_reservoirGridPartManager->updateCellEdgeResultColor( geometriesToRecolor[i], m_currentTimeStep, this->cellResult(), this->cellEdgeResult() ); } - else if ( ( this->hasUserRequestedAnimation() && this->cellResult()->hasResult() ) || - this->cellResult()->isTernarySaturationSelected() ) + else if ( this->cellResult()->hasResult() || this->cellResult()->isTernarySaturationSelected() ) { m_reservoirGridPartManager->updateCellResultColor( geometriesToRecolor[i], m_currentTimeStep, @@ -909,8 +909,7 @@ void RimEclipseView::updateVisibleCellColors() this->updateFaultColors(); - bool hasGeneralCellResult = ( this->hasUserRequestedAnimation() && this->cellResult()->hasResult() ) || - this->cellResult()->isTernarySaturationSelected(); + bool hasGeneralCellResult = this->cellResult()->hasResult() || this->cellResult()->isTernarySaturationSelected(); m_intersectionCollection->updateCellResultColor( hasGeneralCellResult, m_currentTimeStep ); if ( m_surfaceCollection ) m_surfaceCollection->updateCellResultColor( hasGeneralCellResult, m_currentTimeStep ); @@ -1800,7 +1799,7 @@ void RimEclipseView::updateDisplayModelForWellResults() onCreateDisplayModel(); updateDisplayModelVisibility(); - if ( hasUserRequestedAnimation() && nativeOrOverrideViewer() ) + if ( nativeOrOverrideViewer() ) { nativeOrOverrideViewer()->animationControl()->setCurrentFrame( m_currentTimeStep ); } @@ -1934,9 +1933,10 @@ void RimEclipseView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin uiTreeOrdering.add( cellResult() ); uiTreeOrdering.add( cellEdgeResult() ); - uiTreeOrdering.add( elementVectorResult() ); - uiTreeOrdering.add( faultResultSettings() ); + uiTreeOrdering.add( cellFilterCollection() ); + uiTreeOrdering.add( m_propertyFilterCollection() ); + uiTreeOrdering.add( elementVectorResult() ); if ( m_streamlineCollection->shouldBeAvailable() ) uiTreeOrdering.add( &m_streamlineCollection ); addRequiredUiTreeObjects( uiTreeOrdering ); @@ -1960,16 +1960,12 @@ void RimEclipseView::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderin } } - uiTreeOrdering.add( m_virtualPerforationResult ); - uiTreeOrdering.add( faultCollection() ); uiTreeOrdering.add( annotationCollection() ); uiTreeOrdering.add( intersectionCollection() ); if ( surfaceInViewCollection() ) uiTreeOrdering.add( surfaceInViewCollection() ); - uiTreeOrdering.add( cellFilterCollection() ); - uiTreeOrdering.add( m_propertyFilterCollection() ); uiTreeOrdering.skipRemainingChildren( true ); } @@ -2006,7 +2002,7 @@ void RimEclipseView::updateFaultColors() for ( RivCellSetEnum cellSetType : faultGeometriesToRecolor ) { - if ( this->hasUserRequestedAnimation() && this->cellEdgeResult()->hasResult() ) + if ( this->cellEdgeResult()->hasResult() ) { m_reservoirGridPartManager->updateFaultCellEdgeResultColor( cellSetType, m_currentTimeStep, @@ -2083,6 +2079,8 @@ std::vector RimEclipseView::currentCellResultData() const std::vector resultData; if ( currentGridCellResults() && cellResult() ) { + if ( !currentGridCellResults()->hasResultEntry( cellResult()->eclipseResultAddress() ) ) return {}; + int timeStep = 0; if ( cellResult()->hasDynamicResult() ) { @@ -2098,7 +2096,7 @@ std::vector RimEclipseView::currentCellResultData() const //-------------------------------------------------------------------------------------------------- void RimEclipseView::setCurrentCellResultData( const std::vector& values ) { - if ( currentGridCellResults() && cellResult() ) + if ( !values.empty() && currentGridCellResults() && cellResult() ) { int timeStep = 0; if ( cellResult()->hasDynamicResult() ) diff --git a/ApplicationLibCode/ProjectDataModel/RimElementVectorResult.cpp b/ApplicationLibCode/ProjectDataModel/RimElementVectorResult.cpp index f133872029..bdc6c455f8 100644 --- a/ApplicationLibCode/ProjectDataModel/RimElementVectorResult.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimElementVectorResult.cpp @@ -74,7 +74,7 @@ RimElementVectorResult::RimElementVectorResult() CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); m_legendConfig = new RimRegularLegendConfig(); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_showOil, "ShowOil", true, "Oil", "", "", "" ); CAF_PDM_InitField( &m_showGas, "ShowGas", true, "Gas", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/RimEnsembleCurveSetInterface.h b/ApplicationLibCode/ProjectDataModel/RimEnsembleCurveSetInterface.h new file mode 100644 index 0000000000..9372990dc4 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimEnsembleCurveSetInterface.h @@ -0,0 +1,35 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleCurveSetInterface +{ +public: + virtual void updateEditors() = 0; + virtual void updateAllCurves() = 0; + virtual void updateStatisticsCurves() = 0; + + virtual bool hasP10Data() const = 0; + virtual bool hasP50Data() const = 0; + virtual bool hasP90Data() const = 0; + virtual bool hasMeanData() const = 0; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp index 18adffee19..9fa5af8421 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.cpp @@ -164,3 +164,13 @@ QString RimEnsembleFractureStatisticsPlot::createAutoName() const return nameTags.join( ", " ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleFractureStatisticsPlot::createXAxisTitle() const +{ + if ( m_ensembleFractureStatistics() == nullptr ) return ""; + + return caf::AppEnum::uiText( m_property() ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.h b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.h index 8b63156f23..4a04d912fb 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlot.h @@ -51,6 +51,7 @@ class RimEnsembleFractureStatisticsPlot : public RimStatisticsPlot bool* useOptionsOnly ) override; QString createAutoName() const override; + QString createXAxisTitle() const override; void setDefaults(); bool hasStatisticsData() const override; diff --git a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlotCollection.cpp index 949ec056f2..2d251988c2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimEnsembleFractureStatisticsPlotCollection.cpp @@ -33,7 +33,7 @@ RimEnsembleFractureStatisticsPlotCollection::RimEnsembleFractureStatisticsPlotCo CAF_PDM_InitObject( "Ensemble Fracture Statistics Plots", ":/WellLogPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_ensembleFractureStatisticsPlots, "EnsembleFractureStatisticsPlots", "", "", "", "" ); - m_ensembleFractureStatisticsPlots.uiCapability()->setUiHidden( true ); + m_ensembleFractureStatisticsPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimFormationNamesCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimFormationNamesCollection.cpp index 5575ed17a5..c9b7f26609 100644 --- a/ApplicationLibCode/ProjectDataModel/RimFormationNamesCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimFormationNamesCollection.cpp @@ -32,7 +32,7 @@ RimFormationNamesCollection::RimFormationNamesCollection() CAF_PDM_InitObject( "Formations", ":/FormationCollection16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_formationNamesList, "FormationNamesList", "Formations", "", "", "" ); - m_formationNamesList.uiCapability()->setUiHidden( true ); + m_formationNamesList.uiCapability()->setUiTreeHidden( true ); setDeletable( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp index 036d79b246..13a9ea8672 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.cpp @@ -24,6 +24,7 @@ #include "RimCase.h" #include "RimEclipseCase.h" #include "RimEclipseCaseCollection.h" +#include "RimEclipseCellColors.h" #include "RimEclipseResultCase.h" #include "RimEclipseResultDefinition.h" #include "RimEclipseView.h" @@ -61,7 +62,7 @@ RimGridStatisticsPlot::RimGridStatisticsPlot() CAF_PDM_InitFieldNoDefault( &m_property, "Property", "Property", "", "", "" ); m_property = new RimEclipseResultDefinition( caf::PdmUiItemInfo::TOP ); - m_property.uiCapability()->setUiHidden( true ); + m_property.uiCapability()->setUiTreeHidden( true ); m_property.uiCapability()->setUiTreeChildrenHidden( true ); m_property->setTernaryEnabled( false ); @@ -99,6 +100,22 @@ void RimGridStatisticsPlot::setDefaults() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridStatisticsPlot::setPropertiesFromView( RimEclipseView* view ) +{ + CAF_ASSERT( view ); + + m_case = view->ownerCase(); + + RimEclipseCase* eclipseCase = dynamic_cast( m_case.value() ); + if ( eclipseCase ) m_property->setEclipseCase( eclipseCase ); + + const RimEclipseResultDefinition* resDef = dynamic_cast( view->cellResult() ); + if ( resDef ) m_property->simpleCopy( resDef ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -297,3 +314,22 @@ QString RimGridStatisticsPlot::timeStepString() const return ""; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimGridStatisticsPlot::createXAxisTitle() const +{ + if ( m_case() == nullptr ) return ""; + + QStringList nameTags; + nameTags += m_property()->resultVariable(); + + QString timeStepStr = timeStepString(); + if ( !timeStepStr.isEmpty() ) + { + nameTags += timeStepStr; + } + + return nameTags.join( ", " ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.h b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.h index f5105988be..0e60a92a32 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlot.h @@ -32,6 +32,7 @@ class RimCase; class RimPlot; class RimGridView; class RimEclipseResultDefinition; +class RimEclipseView; //================================================================================================== /// @@ -47,6 +48,8 @@ class RimGridStatisticsPlot : public RimStatisticsPlot void cellFilterViewUpdated(); + void setPropertiesFromView( RimEclipseView* view ); + protected: // Overridden PDM methods void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; @@ -59,6 +62,8 @@ class RimGridStatisticsPlot : public RimStatisticsPlot QString createAutoName() const override; QString timeStepString() const; + QString createXAxisTitle() const override; + void setDefaults(); bool hasStatisticsData() const override; RigHistogramData createStatisticsData() const override; diff --git a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlotCollection.cpp index 31e7422bc3..189289375e 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridStatisticsPlotCollection.cpp @@ -33,7 +33,7 @@ RimGridStatisticsPlotCollection::RimGridStatisticsPlotCollection() CAF_PDM_InitObject( "Grid Statistics Plots", ":/WellLogPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_gridStatisticsPlots, "GridStatisticsPlots", "", "", "", "" ); - m_gridStatisticsPlots.uiCapability()->setUiHidden( true ); + m_gridStatisticsPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp index 049e20d356..a60e1bd5cc 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridTimeHistoryCurve.cpp @@ -59,11 +59,11 @@ RimGridTimeHistoryCurve::RimGridTimeHistoryCurve() m_geometrySelectionText.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitFieldNoDefault( &m_eclipseResultDefinition, "EclipseResultDefinition", "Eclipse Result Definition", "", "", "" ); - m_eclipseResultDefinition.uiCapability()->setUiHidden( true ); + m_eclipseResultDefinition.uiCapability()->setUiTreeHidden( true ); m_eclipseResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_geoMechResultDefinition, "GeoMechResultDefinition", "GeoMech Result Definition", "", "", "" ); - m_geoMechResultDefinition.uiCapability()->setUiHidden( true ); + m_geoMechResultDefinition.uiCapability()->setUiTreeHidden( true ); m_geoMechResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_geometrySelectionItem, "GeometrySelectionItem", "Geometry Selection", "", "", "" ); @@ -598,6 +598,8 @@ void RimGridTimeHistoryCurve::defineUiOrdering( QString uiConfigName, caf::PdmUi //-------------------------------------------------------------------------------------------------- void RimGridTimeHistoryCurve::initAfterRead() { + RimPlotCurve::initAfterRead(); + updateResultDefinitionFromCase(); } diff --git a/ApplicationLibCode/ProjectDataModel/RimGridView.cpp b/ApplicationLibCode/ProjectDataModel/RimGridView.cpp index 33494918bd..3ee1080ac2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimGridView.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimGridView.cpp @@ -72,35 +72,30 @@ RimGridView::RimGridView() "", "", "" ); - m_overrideCellFilterCollection.uiCapability()->setUiHidden( true ); + m_overrideCellFilterCollection.uiCapability()->setUiTreeHidden( true ); m_overrideCellFilterCollection.xmlCapability()->disableIO(); CAF_PDM_InitFieldNoDefault( &m_intersectionCollection, "CrossSections", "Intersections", "", "", "" ); - m_intersectionCollection.uiCapability()->setUiHidden( true ); + m_intersectionCollection.uiCapability()->setUiTreeHidden( true ); m_intersectionCollection = new RimIntersectionCollection(); CAF_PDM_InitFieldNoDefault( &m_intersectionResultDefCollection, "IntersectionResultDefColl", - "Separate Intersection Results", + "Intersection Results", "", "", "" ); m_intersectionResultDefCollection.uiCapability()->setUiTreeHidden( true ); m_intersectionResultDefCollection = new RimIntersectionResultsDefinitionCollection; - CAF_PDM_InitFieldNoDefault( &m_surfaceResultDefCollection, - "ReservoirSurfaceResultDefColl", - "Separate Surface Results", - "", - "", - "" ); + CAF_PDM_InitFieldNoDefault( &m_surfaceResultDefCollection, "ReservoirSurfaceResultDefColl", "Surface Results", "", "", "" ); m_surfaceResultDefCollection.uiCapability()->setUiTreeHidden( true ); m_surfaceResultDefCollection = new RimIntersectionResultsDefinitionCollection; - m_surfaceResultDefCollection->uiCapability()->setUiName( "Separate Surface Results" ); + m_surfaceResultDefCollection->uiCapability()->setUiName( "Surface Results" ); m_surfaceResultDefCollection->uiCapability()->setUiIcon( caf::IconProvider( ":/ReservoirSurface16x16.png" ) ); CAF_PDM_InitFieldNoDefault( &m_gridCollection, "GridCollection", "GridCollection", "", "", "" ); - m_gridCollection.uiCapability()->setUiHidden( true ); + m_gridCollection.uiCapability()->setUiTreeHidden( true ); m_gridCollection = new RimGridCollection(); m_previousGridModeMeshLinesWasFaults = false; @@ -108,18 +103,18 @@ RimGridView::RimGridView() CAF_PDM_InitFieldNoDefault( &m_overlayInfoConfig, "OverlayInfoConfig", "Info Box", "", "", "" ); m_overlayInfoConfig = new Rim3dOverlayInfoConfig(); m_overlayInfoConfig->setReservoirView( this ); - m_overlayInfoConfig.uiCapability()->setUiHidden( true ); + m_overlayInfoConfig.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_wellMeasurementCollection, "WellMeasurements", "Well Measurements", "", "", "" ); m_wellMeasurementCollection = new RimWellMeasurementInViewCollection; - m_wellMeasurementCollection.uiCapability()->setUiHidden( true ); + m_wellMeasurementCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_surfaceCollection, "SurfaceInViewCollection", "Surface Collection Field", "", "", "" ); m_surfaceCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_cellFilterCollection, "RangeFilters", "Cell Filter Collection Field", "", "", "" ); m_cellFilterCollection = new RimCellFilterCollection(); - m_cellFilterCollection.uiCapability()->setUiHidden( true ); + m_cellFilterCollection.uiCapability()->setUiTreeHidden( true ); m_surfaceVizModel = new cvf::ModelBasicList; m_surfaceVizModel->setName( "SurfaceModel" ); @@ -520,35 +515,13 @@ void RimGridView::clearReservoirCellVisibilities() //-------------------------------------------------------------------------------------------------- void RimGridView::addRequiredUiTreeObjects( caf::PdmUiTreeOrdering& uiTreeOrdering ) { + RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); + if ( wellPathCollection ) { - std::vector intersections; - - this->descendantsIncludingThisOfType( intersections ); - if ( !intersections.empty() ) + const RimWellMeasurementCollection* measurementCollection = wellPathCollection->measurementCollection(); + if ( !measurementCollection->measurements().empty() ) { - uiTreeOrdering.add( &m_intersectionResultDefCollection ); - } - } - - { - std::vector surfaces; - - this->descendantsIncludingThisOfType( surfaces ); - if ( !surfaces.empty() ) - { - uiTreeOrdering.add( &m_surfaceResultDefCollection ); - } - } - - { - RimWellPathCollection* wellPathCollection = RimTools::wellPathCollection(); - if ( wellPathCollection ) - { - const RimWellMeasurementCollection* measurementCollection = wellPathCollection->measurementCollection(); - if ( !measurementCollection->measurements().empty() ) - { - uiTreeOrdering.add( &m_wellMeasurementCollection ); - } + uiTreeOrdering.add( &m_wellMeasurementCollection ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp index 61109447a4..788c8aaad1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimHistogramCalculator.cpp @@ -131,8 +131,8 @@ RigHistogramData RimHistogramCalculator::histogramData( RimEclipseView* { if ( eclipseView ) { - RimEclipseResultDefinition* eclResultDefinition = eclipseView->cellResult(); - bool isResultsInfoRelevant = eclipseView->hasUserRequestedAnimation() && eclResultDefinition->hasResult(); + RimEclipseResultDefinition* eclResultDefinition = eclipseView->cellResult(); + bool isResultsInfoRelevant = eclResultDefinition->hasResult(); if ( isResultsInfoRelevant ) { @@ -270,8 +270,7 @@ RigHistogramData RimHistogramCalculator::histogramData( RimGeoMechView* { RimGeoMechCase* geoMechCase = geoMechView->geoMechCase(); RigGeoMechCaseData* caseData = geoMechCase ? geoMechCase->geoMechData() : nullptr; - bool isResultsInfoRelevant = caseData && geoMechView->hasUserRequestedAnimation() && - geoMechView->cellResultResultDefinition()->hasResult(); + bool isResultsInfoRelevant = caseData && geoMechView->cellResultResultDefinition()->hasResult(); if ( isResultsInfoRelevant ) { diff --git a/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp b/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp index 649324797e..f497df464d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimIdenticalGridCaseGroup.cpp @@ -73,9 +73,10 @@ RimIdenticalGridCaseGroup::RimIdenticalGridCaseGroup() "", "", "" ); - statisticsCaseCollection.uiCapability()->setUiHidden( true ); + statisticsCaseCollection.uiCapability()->setUiTreeHidden( true ); + CAF_PDM_InitFieldNoDefault( &caseCollection, "CaseCollection", "Source Cases ChildArrayField", "", "", "" ); - caseCollection.uiCapability()->setUiHidden( true ); + caseCollection.uiCapability()->setUiTreeHidden( true ); caseCollection = new RimCaseCollection; caseCollection->uiCapability()->setUiName( "Source Cases" ); diff --git a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp index 4204ad4135..b7362f57ad 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMainPlotCollection.cpp @@ -71,31 +71,31 @@ RimMainPlotCollection::RimMainPlotCollection() m_show.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_wellLogPlotCollection, "WellLogPlotCollection", "", "", "", "" ); - m_wellLogPlotCollection.uiCapability()->setUiHidden( true ); + m_wellLogPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_rftPlotCollection, "RftPlotCollection", "", "", "", "" ); - m_rftPlotCollection.uiCapability()->setUiHidden( true ); + m_rftPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_pltPlotCollection, "PltPlotCollection", "", "", "", "" ); - m_pltPlotCollection.uiCapability()->setUiHidden( true ); + m_pltPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_summaryPlotCollection, "SummaryPlotCollection", "Summary Plots", "", "", "" ); - m_summaryPlotCollection.uiCapability()->setUiHidden( true ); + m_summaryPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_analysisPlotCollection, "AnalysisPlotCollection", "Analysis Plots", "", "", "" ); - m_analysisPlotCollection.uiCapability()->setUiHidden( true ); + m_analysisPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_correlationPlotCollection, "CorrelationPlotCollection", "Correlation Plots", "", "", "" ); - m_correlationPlotCollection.uiCapability()->setUiHidden( true ); + m_correlationPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_summaryCrossPlotCollection, "SummaryCrossPlotCollection", "Summary Cross Plots", "", "", "" ); - m_summaryCrossPlotCollection.uiCapability()->setUiHidden( true ); + m_summaryCrossPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_flowPlotCollection, "FlowPlotCollection", "Flow Diagnostics Plots", "", "", "" ); - m_flowPlotCollection.uiCapability()->setUiHidden( true ); + m_flowPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_gridCrossPlotCollection, "Rim3dCrossPlotCollection", "3d Cross Plots", "", "", "" ); - m_gridCrossPlotCollection.uiCapability()->setUiHidden( true ); + m_gridCrossPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_saturationPressurePlotCollection, "RimSaturationPressurePlotCollection", @@ -103,19 +103,19 @@ RimMainPlotCollection::RimMainPlotCollection() "", "", "" ); - m_saturationPressurePlotCollection.uiCapability()->setUiHidden( true ); + m_saturationPressurePlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_multiPlotCollection, "RimMultiPlotCollection", "Multi Plots", "", "", "" ); - m_multiPlotCollection.uiCapability()->setUiHidden( true ); + m_multiPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_stimPlanModelPlotCollection, "StimPlanModelPlotCollection", "", "", "", "" ); - m_stimPlanModelPlotCollection.uiCapability()->setUiHidden( true ); + m_stimPlanModelPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_vfpPlotCollection, "VfpPlotCollection", "", "", "", "" ); - m_vfpPlotCollection.uiCapability()->setUiHidden( true ); + m_vfpPlotCollection.uiCapability()->setUiTreeHidden( true ); #ifdef USE_QTCHARTS CAF_PDM_InitFieldNoDefault( &m_gridStatisticsPlotCollection, "GridStatisticsPlotCollection", "", "", "", "" ); - m_gridStatisticsPlotCollection.uiCapability()->setUiHidden( true ); + m_gridStatisticsPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_ensembleFractureStatisticsPlotCollection, "EnsembleFractureStatisticsPlotCollection", @@ -123,7 +123,7 @@ RimMainPlotCollection::RimMainPlotCollection() "", "", "" ); - m_ensembleFractureStatisticsPlotCollection.uiCapability()->setUiHidden( true ); + m_ensembleFractureStatisticsPlotCollection.uiCapability()->setUiTreeHidden( true ); #endif m_wellLogPlotCollection = new RimWellLogPlotCollection(); diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp index 43ea4b61d5..385a7fd703 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlot.cpp @@ -74,7 +74,7 @@ RimMultiPlot::RimMultiPlot() CAF_PDM_InitField( &m_plotWindowTitle, "PlotDescription", QString( "" ), "Name", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_plots, "Plots", "", "", "", "" ); - m_plots.uiCapability()->setUiHidden( true ); + m_plots.uiCapability()->setUiTreeHidden( true ); auto reorderability = caf::PdmFieldReorderCapability::addToField( &m_plots ); reorderability->orderChanged.connect( this, &RimMultiPlot::onPlotsReordered ); diff --git a/ApplicationLibCode/ProjectDataModel/RimMultiPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimMultiPlotCollection.cpp index 3c63cb0289..100a35af56 100644 --- a/ApplicationLibCode/ProjectDataModel/RimMultiPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimMultiPlotCollection.cpp @@ -32,7 +32,7 @@ RimMultiPlotCollection::RimMultiPlotCollection() CAF_PDM_InitObject( "Multi Plots", ":/MultiPlot16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_multiPlots, "MultiPlots", "Plots Reports", "", "", "" ); - m_multiPlots.uiCapability()->setUiHidden( true ); + m_multiPlots.uiCapability()->setUiTreeHidden( true ); caf::PdmFieldReorderCapability::addToField( &m_multiPlots ); } diff --git a/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.cpp b/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.cpp new file mode 100644 index 0000000000..add52a678a --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.cpp @@ -0,0 +1,340 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimMultipleLocations.h" + +#include "cafPdmUiDoubleValueEditor.h" +#include "cafPdmUiListEditor.h" + +#include + +CAF_PDM_SOURCE_INIT( RimMultipleLocations, "RimMultipleLocations" ); + +namespace caf +{ +template <> +void AppEnum::setUp() +{ + addItem( RimMultipleLocations::LocationType::COUNT, "COUNT", "Start/End/Number" ); + addItem( RimMultipleLocations::LocationType::SPACING, "SPACING", "Start/End/Spacing" ); + addItem( RimMultipleLocations::LocationType::CUSTOM, "CUSTOM", "User Specification" ); + setDefault( RimMultipleLocations::LocationType::COUNT ); +} +} // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimMultipleLocations::RimMultipleLocations() +{ + CAF_PDM_InitObject( "RimMultipleLocations", ":/FishBoneGroup16x16.png", "", "" ); + + CAF_PDM_InitField( &m_locationType, + "LocationMode", + caf::AppEnum( LocationType::COUNT ), + "Location Defined By", + "", + "", + "" ); + CAF_PDM_InitField( &m_rangeStart, "RangeStart", 100.0, "Start MD", "", "", "" ); + m_rangeStart.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_rangeEnd, "RangeEnd", 250.0, "End MD", "", "", "" ); + m_rangeEnd.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_rangeSpacing, "Spacing", "Spacing", "", "", "" ); + m_rangeSpacing.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_rangeCount, "RangeValveCount", 10, "Number of Items", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_locations, "Locations", "Measured Depths", "", "", "" ); + m_locations.uiCapability()->setUiEditorTypeName( caf::PdmUiListEditor::uiEditorTypeName() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::setRange( double minimumMD, double maximumMD ) +{ + m_rangeStart = minimumMD; + m_rangeEnd = maximumMD; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::updateRangesAndLocations() +{ + double existingRangeStart = m_rangeStart(); + double existingRangeEnd = m_rangeEnd(); + if ( existingRangeStart != m_rangeStart() || existingRangeEnd != m_rangeEnd() ) + { + computeRangesAndLocations(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimMultipleLocations::measuredDepth( size_t valveIndex ) const +{ + return m_locations()[valveIndex]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimMultipleLocations::rangeStart() const +{ + return m_rangeStart; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimMultipleLocations::rangeEnd() const +{ + return m_rangeEnd; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimMultipleLocations::locations() const +{ + return m_locations(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::setLocationType( LocationType locationType ) +{ + m_locationType = locationType; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::computeRangesAndLocations() +{ + if ( m_locationType == LocationType::COUNT ) + { + int divisor = 1; + if ( m_rangeCount > 2 ) divisor = m_rangeCount - 1; + + m_rangeSpacing = std::abs( m_rangeStart - m_rangeEnd ) / divisor; + if ( m_rangeSpacing < minimumSpacingMeters() ) + { + m_rangeSpacing = minimumSpacingMeters(); + m_rangeCount = rangeCountFromSpacing(); + } + } + else if ( m_locationType == LocationType::SPACING ) + { + m_rangeCount = rangeCountFromSpacing(); + } + + if ( m_locationType == LocationType::COUNT || m_locationType == LocationType::SPACING ) + { + std::vector validMeasuredDepths; + for ( auto md : locationsFromStartSpacingAndCount( m_rangeStart(), m_rangeSpacing, m_rangeCount ) ) + { + validMeasuredDepths.push_back( md ); + } + + m_locations = validMeasuredDepths; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::initFields( LocationType locationType, + double rangeStart, + double rangeEnd, + double valveSpacing, + int valveCount, + const std::vector& locationOfValves ) +{ + if ( locationType != LocationType::UNDEFINED ) + { + m_locationType = locationType; + } + if ( rangeStart != std::numeric_limits::infinity() ) + { + m_rangeStart = rangeStart; + } + if ( rangeEnd != std::numeric_limits::infinity() ) + { + m_rangeEnd = rangeEnd; + } + if ( valveSpacing != std::numeric_limits::infinity() ) + { + m_rangeSpacing = valveSpacing; + } + if ( valveCount != -1 ) + { + m_rangeCount = valveCount; + } + if ( !locationOfValves.empty() ) + { + m_locations = locationOfValves; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + { + m_locations.uiCapability()->setUiName( "Measured Depths" ); + m_rangeStart.uiCapability()->setUiName( "Start MD" ); + m_rangeEnd.uiCapability()->setUiName( "End MD" ); + m_rangeSpacing.uiCapability()->setUiName( "Spacing" ); + } + + { + uiOrdering.add( &m_locationType ); + if ( m_locationType() != LocationType::CUSTOM ) + { + uiOrdering.add( &m_rangeStart ); + uiOrdering.add( &m_rangeEnd ); + + if ( m_locationType() == LocationType::COUNT ) + { + uiOrdering.add( &m_rangeCount ); + uiOrdering.add( &m_rangeSpacing ); + } + else if ( m_locationType() == LocationType::SPACING ) + { + uiOrdering.add( &m_rangeSpacing ); + uiOrdering.add( &m_rangeCount ); + } + } + + uiOrdering.add( &m_locations ); + } + + if ( m_locationType() == LocationType::CUSTOM ) + { + m_locations.uiCapability()->setUiReadOnly( false ); + + m_rangeSpacing.uiCapability()->setUiReadOnly( true ); + m_rangeCount.uiCapability()->setUiReadOnly( true ); + m_rangeStart.uiCapability()->setUiReadOnly( true ); + m_rangeEnd.uiCapability()->setUiReadOnly( true ); + } + else + { + m_locations.uiCapability()->setUiReadOnly( true ); + + m_rangeSpacing.uiCapability()->setUiReadOnly( false ); + m_rangeCount.uiCapability()->setUiReadOnly( false ); + m_rangeStart.uiCapability()->setUiReadOnly( false ); + m_rangeEnd.uiCapability()->setUiReadOnly( false ); + + if ( m_locationType() == LocationType::COUNT ) + { + m_rangeSpacing.uiCapability()->setUiReadOnly( true ); + m_rangeCount.uiCapability()->setUiReadOnly( false ); + } + else + { + m_rangeSpacing.uiCapability()->setUiReadOnly( false ); + m_rangeCount.uiCapability()->setUiReadOnly( true ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimMultipleLocations::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + bool recomputeLocations = false; + + if ( changedField == &m_locationType ) + { + if ( m_locationType == LocationType::COUNT || m_locationType == LocationType::SPACING ) + { + recomputeLocations = true; + } + } + + if ( changedField == &m_rangeStart || changedField == &m_rangeEnd || changedField == &m_rangeCount || + changedField == &m_rangeSpacing ) + { + recomputeLocations = true; + } + + if ( changedField == &m_rangeSpacing ) + { + double minimumDistanceMeter = minimumSpacingMeters(); + + m_rangeSpacing = + std::clamp( m_rangeSpacing(), minimumDistanceMeter, std::max( m_rangeSpacing(), minimumDistanceMeter ) ); + } + + if ( recomputeLocations ) + { + computeRangesAndLocations(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimMultipleLocations::rangeCountFromSpacing() const +{ + int rangeCount = ( std::fabs( m_rangeStart - m_rangeEnd ) / m_rangeSpacing ) + 1; + + if ( rangeCount < 1 ) + { + rangeCount = 1; + } + return rangeCount; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimMultipleLocations::minimumSpacingMeters() const +{ + // Minimum distance between fishbones is 13.0m + // Use 10.0m to allow for some flexibility + return 10.0; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimMultipleLocations::locationsFromStartSpacingAndCount( double start, double spacing, size_t count ) +{ + std::vector measuredDepths; + + for ( size_t i = 0; i < count; i++ ) + { + measuredDepths.push_back( start + spacing * i ); + } + + return measuredDepths; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.h b/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.h new file mode 100644 index 0000000000..ad2b7bff91 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimMultipleLocations.h @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafAppEnum.h" +#include "cafPdmBase.h" +#include "cafPdmField.h" +#include "cafPdmObject.h" + +class RimMultipleLocations : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + enum class LocationType + { + COUNT, + SPACING, + CUSTOM, + UNDEFINED + }; + +public: + RimMultipleLocations(); + + void setRange( double minimumMD, double maximumMD ); + + void updateRangesAndLocations(); + double measuredDepth( size_t valveIndex ) const; + double rangeStart() const; + double rangeEnd() const; + const std::vector& locations() const; + + void setLocationType( LocationType locationType ); + void computeRangesAndLocations(); + + void initFields( LocationType locationType, + double rangeStart, + double rangeEnd, + double valveSpacing, + int valveCount, + const std::vector& locationOfValves ); + +protected: + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + +private: + int rangeCountFromSpacing() const; + double minimumSpacingMeters() const; + static std::vector locationsFromStartSpacingAndCount( double start, double spacing, size_t count ); + +private: + caf::PdmField> m_locationType; + caf::PdmField m_rangeStart; + caf::PdmField m_rangeEnd; + caf::PdmField m_rangeSpacing; + caf::PdmField m_rangeCount; + + caf::PdmField> m_locations; // Given in measured depth +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimNamedObject.cpp b/ApplicationLibCode/ProjectDataModel/RimNamedObject.cpp index fee2318cdf..e3d06db636 100644 --- a/ApplicationLibCode/ProjectDataModel/RimNamedObject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimNamedObject.cpp @@ -18,6 +18,9 @@ #include "RimNamedObject.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimNamedObject, "NamedObject" ); // Do not use. Abstract class //-------------------------------------------------------------------------------------------------- @@ -25,7 +28,8 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimNamedObject, "NamedObject" ); // Do not use //-------------------------------------------------------------------------------------------------- RimNamedObject::RimNamedObject( void ) { - CAF_PDM_InitField( &m_name, "Name", QString(), "Name", "", "", "" ); + CAF_PDM_InitScriptableObject( "Named object", "", "", "" ); + CAF_PDM_InitScriptableField( &m_name, "Name", QString(), "Name", "", "", "" ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimObservedDataCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimObservedDataCollection.cpp index e001ad5f0d..cad394446a 100644 --- a/ApplicationLibCode/ProjectDataModel/RimObservedDataCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimObservedDataCollection.cpp @@ -52,8 +52,8 @@ RimObservedDataCollection::RimObservedDataCollection() CAF_PDM_InitFieldNoDefault( &m_observedDataArray, "ObservedDataArray", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_observedFmuRftArray, "ObservedFmuRftDataArray", "", "", "", "" ); - m_observedDataArray.uiCapability()->setUiHidden( true ); - m_observedFmuRftArray.uiCapability()->setUiHidden( true ); + m_observedDataArray.uiCapability()->setUiTreeHidden( true ); + m_observedFmuRftArray.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimOilField.cpp b/ApplicationLibCode/ProjectDataModel/RimOilField.cpp index b4c7da7431..73ac144baf 100644 --- a/ApplicationLibCode/ProjectDataModel/RimOilField.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimOilField.cpp @@ -23,6 +23,7 @@ #include "RimAnnotationCollection.h" #include "RimCompletionTemplateCollection.h" #include "RimEclipseCaseCollection.h" +#include "RimEnsembleWellLogsCollection.h" #include "RimFormationNamesCollection.h" #include "RimFractureTemplateCollection.h" #include "RimGeoMechModels.h" @@ -51,6 +52,7 @@ RimOilField::RimOilField( void ) CAF_PDM_InitFieldNoDefault( &observedDataCollection, "ObservedDataCollection", "Observed Data", ":/Cases16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &annotationCollection, "AnnotationCollection", "Annotations", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &ensembleWellLogsCollection, "EnsembleWellLogsCollection", "Ensemble Well Logs", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_fractureTemplateCollection_OBSOLETE, "FractureDefinitionCollection", @@ -74,6 +76,7 @@ RimOilField::RimOilField( void ) observedDataCollection = new RimObservedDataCollection(); formationNamesCollection = new RimFormationNamesCollection(); annotationCollection = new RimAnnotationCollection(); + ensembleWellLogsCollection = new RimEnsembleWellLogsCollection(); m_fractureTemplateCollection_OBSOLETE = new RimFractureTemplateCollection; m_fractureTemplateCollection_OBSOLETE.xmlCapability()->setIOWritable( false ); diff --git a/ApplicationLibCode/ProjectDataModel/RimOilField.h b/ApplicationLibCode/ProjectDataModel/RimOilField.h index ac813a5d11..f62f3a6f67 100644 --- a/ApplicationLibCode/ProjectDataModel/RimOilField.h +++ b/ApplicationLibCode/ProjectDataModel/RimOilField.h @@ -38,6 +38,7 @@ class RimWellPathCollection; class RimAnnotationCollection; class RimMeasurement; class RimSurfaceCollection; +class RimEnsembleWellLogsCollection; //================================================================================================== /// @@ -67,6 +68,7 @@ class RimOilField : public caf::PdmObject caf::PdmChildField annotationCollection; caf::PdmChildField measurement; caf::PdmChildField surfaceCollection; + caf::PdmChildField ensembleWellLogsCollection; protected: void initAfterRead() override; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotAxisProperties.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotAxisProperties.cpp index be43620a4b..e7573e4c73 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotAxisProperties.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotAxisProperties.cpp @@ -96,8 +96,7 @@ RimPlotAxisProperties::RimPlotAxisProperties() CAF_PDM_InitFieldNoDefault(&m_valuesFontSize, "ValueDeltaFontSize", "Font Size", "", "", ""); CAF_PDM_InitFieldNoDefault(&m_annotations, "Annotations", "", "", "", ""); - - m_annotations.uiCapability()->setUiHidden(true); + m_annotations.uiCapability()->setUiTreeHidden(true); // m_annotations.uiCapability()->setUiTreeChildrenHidden(true); updateOptionSensitivity(); diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp index 6a79b0a2fb..58c4f757fa 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.cpp @@ -27,6 +27,7 @@ #include "RimEnsembleCurveSet.h" #include "RimEnsembleCurveSetCollection.h" #include "RimNameConfig.h" +#include "RimProject.h" #include "RimSummaryCrossPlot.h" #include "RimSummaryCurve.h" #include "RimSummaryCurveCollection.h" @@ -50,53 +51,6 @@ CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimPlotCurve, "PlotCurve" ); #define DOUBLE_INF std::numeric_limits::infinity() -namespace caf -{ -template <> -void RimPlotCurve::PointSymbol::setUp() -{ - addItem( RiuQwtSymbol::SYMBOL_NONE, "SYMBOL_NONE", "None" ); - addItem( RiuQwtSymbol::SYMBOL_ELLIPSE, "SYMBOL_ELLIPSE", "Ellipse" ); - addItem( RiuQwtSymbol::SYMBOL_RECT, "SYMBOL_RECT", "Rect" ); - addItem( RiuQwtSymbol::SYMBOL_DIAMOND, "SYMBOL_DIAMOND", "Diamond" ); - addItem( RiuQwtSymbol::SYMBOL_TRIANGLE, "SYMBOL_TRIANGLE", "Triangle" ); - addItem( RiuQwtSymbol::SYMBOL_DOWN_TRIANGLE, "SYMBOL_DOWN_TRIANGLE", "Down Triangle" ); - addItem( RiuQwtSymbol::SYMBOL_CROSS, "SYMBOL_CROSS", "Cross" ); - addItem( RiuQwtSymbol::SYMBOL_XCROSS, "SYMBOL_XCROSS", "X Cross" ); - addItem( RiuQwtSymbol::SYMBOL_STAR1, "SYMBOL_STAR1", "Star 1" ); - addItem( RiuQwtSymbol::SYMBOL_STAR2, "SYMBOL_STAR2", "Star 2" ); - addItem( RiuQwtSymbol::SYMBOL_HEXAGON, "SYMBOL_HEXAGON", "Hexagon" ); - addItem( RiuQwtSymbol::SYMBOL_LEFT_TRIANGLE, "SYMBOL_LEFT_TRIANGLE", "Left Triangle" ); - addItem( RiuQwtSymbol::SYMBOL_RIGHT_TRIANGLE, "SYMBOL_RIGHT_TRIANGLE", "Right Triangle" ); - setDefault( RiuQwtSymbol::SYMBOL_NONE ); -} - -template <> -void RimPlotCurve::LabelPosition::setUp() -{ - addItem( RiuQwtSymbol::LabelAboveSymbol, "LABEL_ABOVE_SYMBOL", "Label above Symbol" ); - addItem( RiuQwtSymbol::LabelBelowSymbol, "LABEL_BELOW_SYMBOL", "Label below Symbol" ); - addItem( RiuQwtSymbol::LabelLeftOfSymbol, "LABEL_LEFT_OF_SYMBOL", "Label left of Symbol" ); - addItem( RiuQwtSymbol::LabelRightOfSymbol, "LABEL_RIGHT_OF_SYMBOL", "Label right of Symbol" ); - setDefault( RiuQwtSymbol::LabelAboveSymbol ); -} - -template <> -void RimPlotCurve::FillStyle::setUp() -{ - addItem( Qt::NoBrush, "NO_FILL", "No Fill" ); - addItem( Qt::SolidPattern, "SOLID_FILL", "Solid Fill" ); - addItem( Qt::Dense1Pattern, "DENSE_FILL", "Dense Pattern" ); - addItem( Qt::Dense7Pattern, "SPARSE_FILL", "Sparse Pattern" ); - addItem( Qt::HorPattern, "HOR_FILL", "Horizontal Lines" ); - addItem( Qt::VerPattern, "VER_FILL", "Vertical Lines" ); - addItem( Qt::BDiagPattern, "DIAG_FILL", "Diagonal Lines" ); - addItem( Qt::CrossPattern, "CROSS_FILL", "Mesh" ); - addItem( Qt::DiagCrossPattern, "DIAG_CROSS_FILL", "Diagonal Mesh" ); -} - -} // namespace caf - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -119,35 +73,64 @@ RimPlotCurve::RimPlotCurve() m_legendEntryText.uiCapability()->setUiHidden( true ); CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name", "", "", "" ); + CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Contribute To Legend", "", "", "" ); + CAF_PDM_InitField( &m_showErrorBars, "ShowErrorBars", true, "Show Error Bars", "", "", "" ); + + // Obsolete field: appearance configuration is moved to RimPlotCurveAppearance + CAF_PDM_InitField( &m_curveColor_OBSOLETE, "Color", RiaColorTools::textColor3f(), "Color", "", "", "" ); + m_curveColor_OBSOLETE.xmlCapability()->setIOWritable( false ); + + CAF_PDM_InitField( &m_fillColor_OBSOLETE, "FillColor", cvf::Color3f( -1.0, -1.0, -1.0 ), "Fill Color", "", "", "" ); + m_fillColor_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitField( &m_curveColor, "Color", RiaColorTools::textColor3f(), "Color", "", "", "" ); - CAF_PDM_InitField( &m_fillColor, "FillColor", cvf::Color3f( -1.0, -1.0, -1.0 ), "Fill Color", "", "", "" ); + CAF_PDM_InitField( &m_curveThickness_OBSOLETE, "Thickness", 1, "Line Thickness", "", "", "" ); + m_curveThickness_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitField( &m_curveThickness, "Thickness", 1, "Line Thickness", "", "", "" ); - m_curveThickness.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); + CAF_PDM_InitFieldNoDefault( &m_curveInterpolation_OBSOLETE, "CurveInterpolation", "Interpolation", "", "", "" ); + m_curveInterpolation_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitFieldNoDefault( &m_curveInterpolation, "CurveInterpolation", "Interpolation", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_lineStyle, "LineStyle", "Line Style", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_fillStyle, "FillStyle", "Area Fill Style", "", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_pointSymbol, "PointSymbol", "Symbol", "", "", "" ); - CAF_PDM_InitField( &m_symbolEdgeColor, "SymbolEdgeColor", RiaColorTools::textColor3f(), "Symbol Edge Color", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_lineStyle_OBSOLETE, "LineStyle", "Line Style", "", "", "" ); + m_lineStyle_OBSOLETE.xmlCapability()->setIOWritable( false ); + + CAF_PDM_InitFieldNoDefault( &m_fillStyle_OBSOLETE, "FillStyle", "Area Fill Style", "", "", "" ); + m_fillStyle_OBSOLETE.xmlCapability()->setIOWritable( false ); + + CAF_PDM_InitFieldNoDefault( &m_pointSymbol_OBSOLETE, "PointSymbol", "Symbol", "", "", "" ); + m_pointSymbol_OBSOLETE.xmlCapability()->setIOWritable( false ); + + CAF_PDM_InitField( &m_symbolEdgeColor_OBSOLETE, + "SymbolEdgeColor", + RiaColorTools::textColor3f(), + "Symbol Edge Color", + "", + "", + "" ); + m_symbolEdgeColor_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitField( &m_symbolSkipPixelDistance, + CAF_PDM_InitField( &m_symbolSkipPixelDistance_OBSOLETE, "SymbolSkipPxDist", 0.0f, "Symbol Skip Distance", "", "Minimum pixel distance between symbols", "" ); + m_symbolSkipPixelDistance_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Contribute To Legend", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_symbolLabel_OBSOLETE, "SymbolLabel", "Symbol Label", "", "", "" ); + m_symbolLabel_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitFieldNoDefault( &m_symbolLabel, "SymbolLabel", "Symbol Label", "", "", "" ); - CAF_PDM_InitField( &m_symbolSize, "SymbolSize", 6, "Symbol Size", "", "", "" ); + CAF_PDM_InitField( &m_symbolSize_OBSOLETE, "SymbolSize", 6, "Symbol Size", "", "", "" ); + m_symbolSize_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitField( &m_showErrorBars, "ShowErrorBars", true, "Show Error Bars", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_symbolLabelPosition_OBSOLETE, "SymbolLabelPosition", "Symbol Label Position", "", "", "" ); + m_symbolLabelPosition_OBSOLETE.xmlCapability()->setIOWritable( false ); - CAF_PDM_InitFieldNoDefault( &m_symbolLabelPosition, "SymbolLabelPosition", "Symbol Label Position", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_curveAppearance, "PlotCurveAppearance", "PlotCurveAppearance", "", "", "" ); + m_curveAppearance = new RimPlotCurveAppearance; + m_curveAppearance.uiCapability()->setUiTreeHidden( true ); + m_curveAppearance.uiCapability()->setUiTreeChildrenHidden( true ); + m_curveAppearance->appearanceChanged.connect( this, &RimPlotCurve::onCurveAppearanceChanged ); + m_curveAppearance->appearanceChanged.connect( this, &RimPlotCurve::onFillColorChanged ); m_qwtPlotCurve = new RiuRimQwtPlotCurve( this ); m_qwtCurveErrorBars = new QwtPlotIntervalCurve(); @@ -195,33 +178,6 @@ void RimPlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, co m_customCurveName = m_curveName; updateCurveNameAndUpdatePlotLegendAndTitle(); } - else if ( &m_curveColor == changedField || &m_curveThickness == changedField || &m_pointSymbol == changedField || - &m_lineStyle == changedField || &m_symbolSkipPixelDistance == changedField || - &m_curveInterpolation == changedField || &m_symbolSize == changedField || - &m_symbolEdgeColor == changedField || &m_fillStyle == changedField || &m_fillColor == changedField ) - { - if ( &m_fillStyle == changedField ) - { - checkAndApplyDefaultFillColor(); - } - - updateCurveAppearance(); - - if ( &m_pointSymbol == changedField ) - { - m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); - m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); - } - else if ( &m_lineStyle == changedField ) - { - m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == - RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == - RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - } - - appearanceChanged.send(); - } else if ( changedField == &m_isUsingAutoName ) { if ( !m_isUsingAutoName ) @@ -311,12 +267,22 @@ void RimPlotCurve::updateCurveVisibility() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::initAfterRead() { - m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); - m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); - m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); - - checkAndApplyDefaultFillColor(); + if ( RimProject::current()->isProjectFileVersionEqualOrOlderThan( "2021.06.0" ) ) + { + // Forward values of obsolete fields to appearance object + m_curveAppearance->setSymbolSize( m_symbolSize_OBSOLETE ); + m_curveAppearance->setSymbolLabel( m_symbolLabel_OBSOLETE ); + m_curveAppearance->setColor( m_curveColor_OBSOLETE ); + m_curveAppearance->setLineThickness( m_curveThickness_OBSOLETE ); + m_curveAppearance->setSymbolSkipDistance( m_symbolSkipPixelDistance_OBSOLETE ); + m_curveAppearance->setSymbol( m_pointSymbol_OBSOLETE() ); + m_curveAppearance->setLineStyle( m_lineStyle_OBSOLETE() ); + m_curveAppearance->setFillStyle( m_fillStyle_OBSOLETE() ); + m_curveAppearance->setFillColor( m_fillColor_OBSOLETE ); + m_curveAppearance->setInterpolation( m_curveInterpolation_OBSOLETE() ); + m_curveAppearance->setSymbolLabelPosition( m_symbolLabelPosition_OBSOLETE() ); + m_curveAppearance->setSymbolEdgeColor( m_symbolEdgeColor_OBSOLETE ); + } } //-------------------------------------------------------------------------------------------------- @@ -383,8 +349,16 @@ caf::PdmFieldHandle* RimPlotCurve::userDescriptionField() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setColor( const cvf::Color3f& color ) { - m_curveColor = color; - m_fillColor = color; + m_curveAppearance->setColor( color ); + m_curveAppearance->setFillColor( color ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimPlotCurve::color() const +{ + return m_curveAppearance->color(); } //-------------------------------------------------------------------------------------------------- @@ -623,22 +597,8 @@ void RimPlotCurve::setSamplesFromTimeTAndYValues( const std::vector& dat //-------------------------------------------------------------------------------------------------- void RimPlotCurve::appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ) { - uiOrdering.add( &m_curveColor ); - uiOrdering.add( &m_pointSymbol ); - if ( RiuQwtSymbol::isFilledSymbol( m_pointSymbol() ) ) - { - uiOrdering.add( &m_symbolEdgeColor ); - } - uiOrdering.add( &m_symbolSize ); - uiOrdering.add( &m_symbolSkipPixelDistance ); - uiOrdering.add( &m_lineStyle ); - uiOrdering.add( &m_fillStyle ); - if ( m_fillStyle != Qt::BrushStyle::NoBrush ) - { - uiOrdering.add( &m_fillColor ); - } - uiOrdering.add( &m_curveThickness ); - uiOrdering.add( &m_curveInterpolation ); + QString configName = "AppearanceOrdering"; + m_curveAppearance->uiOrdering( configName, uiOrdering ); } //-------------------------------------------------------------------------------------------------- @@ -655,11 +615,9 @@ void RimPlotCurve::curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::updateUiIconFromPlotSymbol() { - if ( m_pointSymbol() != RiuQwtSymbol::NoSymbol && m_qwtPlotCurve ) + if ( m_curveAppearance->symbol() != RiuQwtSymbol::SYMBOL_NONE && m_qwtPlotCurve ) { CVF_ASSERT( RiaGuiApplication::isRunning() ); - QColor curveColor( m_curveColor.value().rByte(), m_curveColor.value().gByte(), m_curveColor.value().bByte() ); - QSizeF iconSize( 24, 24 ); QwtGraphic graphic = m_qwtPlotCurve->legendIcon( 0, iconSize ); QPixmap pixmap = graphic.toPixmap(); @@ -715,10 +673,10 @@ void RimPlotCurve::attachCurveAndErrorBars() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::checkAndApplyDefaultFillColor() { - if ( !m_fillColor().isValid() ) - { - m_fillColor = m_curveColor; - } + // if ( m_curveAppearance->fillColor().isValid() ) + // { + // m_curveAppearance->fillColor() = m_curveAppearance->color(); + // } } //-------------------------------------------------------------------------------------------------- @@ -726,10 +684,10 @@ void RimPlotCurve::checkAndApplyDefaultFillColor() //-------------------------------------------------------------------------------------------------- void RimPlotCurve::updateCurveAppearance() { - QColor curveColor( m_curveColor.value().rByte(), m_curveColor.value().gByte(), m_curveColor.value().bByte() ); - QwtSymbol* symbol = nullptr; + QColor curveColor = RiaColorTools::toQColor( m_curveAppearance->color() ); + QwtSymbol* symbol = nullptr; - if ( m_pointSymbol() != RiuQwtSymbol::SYMBOL_NONE ) + if ( m_curveAppearance->symbol() != RiuQwtSymbol::SYMBOL_NONE ) { int legendFontSize = caf::FontTools::absolutePointSize( RiaPreferences::current()->defaultPlotFontSize(), caf::FontTools::RelativeSize::Small ); @@ -741,18 +699,18 @@ void RimPlotCurve::updateCurveAppearance() } // QwtPlotCurve will take ownership of the symbol - symbol = new RiuQwtSymbol( m_pointSymbol(), m_symbolLabel(), m_symbolLabelPosition(), legendFontSize ); - symbol->setSize( m_symbolSize, m_symbolSize ); + symbol = new RiuQwtSymbol( m_curveAppearance->symbol(), + m_curveAppearance->symbolLabel(), + m_curveAppearance->symbolLabelPosition(), + legendFontSize ); + symbol->setSize( m_curveAppearance->symbolSize(), m_curveAppearance->symbolSize() ); symbol->setColor( curveColor ); // If the symbol is a "filled" symbol, we can have a different edge color // Otherwise we'll have to use the curve color. - if ( RiuQwtSymbol::isFilledSymbol( m_pointSymbol() ) ) + if ( RiuQwtSymbol::isFilledSymbol( m_curveAppearance->symbol() ) ) { - QColor symbolEdgeColor( m_symbolEdgeColor.value().rByte(), - m_symbolEdgeColor.value().gByte(), - m_symbolEdgeColor.value().bByte() ); - + QColor symbolEdgeColor = RiaColorTools::toQColor( m_curveAppearance->symbolEdgeColor() ); symbol->setPen( symbolEdgeColor ); } else @@ -770,17 +728,22 @@ void RimPlotCurve::updateCurveAppearance() if ( m_qwtPlotCurve ) { - QColor fillColor( m_fillColor.value().rByte(), m_fillColor.value().gByte(), m_fillColor.value().bByte() ); + QColor fillColor = RiaColorTools::toQColor( m_curveAppearance->fillColor() ); + fillColor = RiaColorTools::blendQColors( fillColor, QColor( Qt::white ), 3, 1 ); - QBrush fillBrush( fillColor, m_fillStyle() ); - m_qwtPlotCurve->setAppearance( m_lineStyle(), m_curveInterpolation(), m_curveThickness(), curveColor, fillBrush ); + QBrush fillBrush( fillColor, m_curveAppearance->fillStyle() ); + m_qwtPlotCurve->setAppearance( m_curveAppearance->lineStyle(), + m_curveAppearance->interpolation(), + m_curveAppearance->lineThickness(), + curveColor, + fillBrush ); m_qwtPlotCurve->setSymbol( symbol ); - m_qwtPlotCurve->setSymbolSkipPixelDistance( m_symbolSkipPixelDistance() ); + m_qwtPlotCurve->setSymbolSkipPixelDistance( m_curveAppearance->symbolSkipDistance() ); // Make sure the legend lines are long enough to distinguish between line types. // Standard width in Qwt is 8 which is too short. // Use 10 and scale this by curve thickness + add space for displaying symbol. - if ( m_lineStyle() != RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ) + if ( m_curveAppearance->lineStyle() != RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ) { QSize legendIconSize = m_qwtPlotCurve->legendIconSize(); @@ -790,7 +753,7 @@ void RimPlotCurve::updateCurveAppearance() symbolWidth = symbol->boundingRect().size().width() + 2; } - int width = std::max( 10 * m_curveThickness, ( symbolWidth * 3 ) / 2 ); + int width = std::max( 10 * m_curveAppearance->lineThickness(), ( symbolWidth * 3 ) / 2 ); legendIconSize.setWidth( width ); m_qwtPlotCurve->setLegendIconSize( legendIconSize ); @@ -810,25 +773,6 @@ bool RimPlotCurve::isCrossPlotCurve() const return false; } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QList RimPlotCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, - bool* useOptionsOnly ) -{ - QList options; - - if ( fieldNeedingOptions == &m_curveThickness ) - { - for ( size_t i = 0; i < 10; i++ ) - { - options.push_back( caf::PdmOptionItemInfo( QString::number( i + 1 ), QVariant::fromValue( i + 1 ) ) ); - } - } - - return options; -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -884,7 +828,7 @@ bool RimPlotCurve::yValueRangeInQwt( double* minimumValue, double* maximumValue //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle ) { - m_lineStyle = lineStyle; + m_curveAppearance->setLineStyle( lineStyle ); } //-------------------------------------------------------------------------------------------------- @@ -892,7 +836,7 @@ void RimPlotCurve::setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ) { - m_pointSymbol = symbolStyle; + m_curveAppearance->setSymbol( symbolStyle ); } //-------------------------------------------------------------------------------------------------- @@ -900,7 +844,7 @@ void RimPlotCurve::setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum curveInterpolation ) { - m_curveInterpolation = curveInterpolation; + m_curveAppearance->setInterpolation( curveInterpolation ); } //-------------------------------------------------------------------------------------------------- @@ -908,7 +852,7 @@ void RimPlotCurve::setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationE //-------------------------------------------------------------------------------------------------- RiuQwtSymbol::PointSymbolEnum RimPlotCurve::symbol() { - return m_pointSymbol(); + return m_curveAppearance->symbol(); } //-------------------------------------------------------------------------------------------------- @@ -916,7 +860,7 @@ RiuQwtSymbol::PointSymbolEnum RimPlotCurve::symbol() //-------------------------------------------------------------------------------------------------- int RimPlotCurve::symbolSize() const { - return m_symbolSize(); + return m_curveAppearance->symbolSize(); } //-------------------------------------------------------------------------------------------------- @@ -924,7 +868,7 @@ int RimPlotCurve::symbolSize() const //-------------------------------------------------------------------------------------------------- cvf::Color3f RimPlotCurve::symbolEdgeColor() const { - return m_symbolEdgeColor; + return m_curveAppearance->symbolEdgeColor(); } //-------------------------------------------------------------------------------------------------- @@ -932,7 +876,7 @@ cvf::Color3f RimPlotCurve::symbolEdgeColor() const //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbolEdgeColor( const cvf::Color3f& edgeColor ) { - m_symbolEdgeColor = edgeColor; + m_curveAppearance->setSymbolEdgeColor( edgeColor ); } //-------------------------------------------------------------------------------------------------- @@ -940,7 +884,7 @@ void RimPlotCurve::setSymbolEdgeColor( const cvf::Color3f& edgeColor ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbolSkipDistance( float distance ) { - m_symbolSkipPixelDistance = distance; + m_curveAppearance->setSymbolSkipDistance( distance ); } //-------------------------------------------------------------------------------------------------- @@ -948,7 +892,7 @@ void RimPlotCurve::setSymbolSkipDistance( float distance ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbolLabel( const QString& label ) { - m_symbolLabel = label; + m_curveAppearance->setSymbolLabel( label ); } //-------------------------------------------------------------------------------------------------- @@ -956,7 +900,7 @@ void RimPlotCurve::setSymbolLabel( const QString& label ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbolLabelPosition( RiuQwtSymbol::LabelPosition labelPosition ) { - m_symbolLabelPosition = labelPosition; + m_curveAppearance->setSymbolLabelPosition( labelPosition ); } //-------------------------------------------------------------------------------------------------- @@ -964,7 +908,7 @@ void RimPlotCurve::setSymbolLabelPosition( RiuQwtSymbol::LabelPosition labelPosi //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setSymbolSize( int sizeInPixels ) { - m_symbolSize = sizeInPixels; + m_curveAppearance->setSymbolSize( sizeInPixels ); } //-------------------------------------------------------------------------------------------------- @@ -972,7 +916,7 @@ void RimPlotCurve::setSymbolSize( int sizeInPixels ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setLineThickness( int thickness ) { - m_curveThickness = thickness; + m_curveAppearance->setLineThickness( thickness ); } //-------------------------------------------------------------------------------------------------- @@ -993,7 +937,7 @@ void RimPlotCurve::resetAppearance() //-------------------------------------------------------------------------------------------------- Qt::BrushStyle RimPlotCurve::fillStyle() const { - return m_fillStyle(); + return m_curveAppearance->fillStyle(); } //-------------------------------------------------------------------------------------------------- @@ -1001,7 +945,7 @@ Qt::BrushStyle RimPlotCurve::fillStyle() const //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setFillStyle( Qt::BrushStyle brushStyle ) { - m_fillStyle = brushStyle; + m_curveAppearance->setFillStyle( brushStyle ); } //-------------------------------------------------------------------------------------------------- @@ -1009,7 +953,7 @@ void RimPlotCurve::setFillStyle( Qt::BrushStyle brushStyle ) //-------------------------------------------------------------------------------------------------- void RimPlotCurve::setFillColor( const cvf::Color3f& fillColor ) { - m_fillColor = fillColor; + m_curveAppearance->setFillColor( fillColor ); } //-------------------------------------------------------------------------------------------------- @@ -1097,3 +1041,20 @@ void RimPlotCurve::updateLegendEntryVisibilityNoPlotUpdate() } m_qwtPlotCurve->setItemAttribute( QwtPlotItem::Legend, showLegendInQwt ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::onCurveAppearanceChanged( const caf::SignalEmitter* emitter ) +{ + checkAndApplyDefaultFillColor(); + updateCurveAppearance(); + appearanceChanged.send(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurve::onFillColorChanged( const caf::SignalEmitter* emitter ) +{ +} diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h index abea8c1817..694ca3f54f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurve.h @@ -19,12 +19,15 @@ #include "RifEclipseSummaryAddress.h" +#include "RimPlotCurveAppearance.h" + #include "RiaCurveDataTools.h" #include "RiaDefines.h" #include "RiuQwtPlotCurveDefines.h" #include "RiuQwtSymbol.h" +#include "cafPdmChildField.h" #include "cafPdmField.h" #include "cafPdmFieldCvfColor.h" #include "cafPdmObject.h" @@ -51,13 +54,6 @@ class RimPlotCurve : public caf::PdmObject caf::Signal<> dataChanged; caf::Signal nameChanged; -public: - typedef caf::AppEnum CurveInterpolation; - typedef caf::AppEnum LineStyle; - typedef caf::AppEnum PointSymbol; - typedef caf::AppEnum LabelPosition; - typedef caf::AppEnum FillStyle; - public: RimPlotCurve(); ~RimPlotCurve() override; @@ -74,7 +70,7 @@ class RimPlotCurve : public caf::PdmObject QwtPlotCurve* qwtPlotCurve() const; void setColor( const cvf::Color3f& color ); - cvf::Color3f color() const { return m_curveColor; } + cvf::Color3f color() const; void setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle ); void setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ); void setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum ); @@ -152,13 +148,14 @@ class RimPlotCurve : public caf::PdmObject protected: // Overridden PDM methods - void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; - caf::PdmFieldHandle* objectToggleField() override; - caf::PdmFieldHandle* userDescriptionField() override; - QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, - bool* useOptionsOnly ) override; - void appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ); - void curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + caf::PdmFieldHandle* objectToggleField() override; + caf::PdmFieldHandle* userDescriptionField() override; + void appearanceUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void curveNameUiOrdering( caf::PdmUiOrdering& uiOrdering ); + + virtual void onCurveAppearanceChanged( const caf::SignalEmitter* emitter ); + virtual void onFillColorChanged( const caf::SignalEmitter* emitter ); private: bool canCurveBeAttached() const; @@ -175,21 +172,22 @@ class RimPlotCurve : public caf::PdmObject caf::PdmField m_curveName; caf::PdmField m_customCurveName; caf::PdmField m_showLegend; - caf::PdmField m_symbolLabel; - caf::PdmField m_symbolSize; caf::PdmField m_legendEntryText; - - caf::PdmField m_isUsingAutoName; - caf::PdmField m_curveColor; - caf::PdmField m_curveThickness; - caf::PdmField m_symbolSkipPixelDistance; - caf::PdmField m_showErrorBars; - - caf::PdmField m_pointSymbol; - caf::PdmField m_lineStyle; - caf::PdmField m_fillStyle; - caf::PdmField m_fillColor; - caf::PdmField m_curveInterpolation; - caf::PdmField m_symbolLabelPosition; - caf::PdmField m_symbolEdgeColor; + caf::PdmField m_showErrorBars; + caf::PdmField m_isUsingAutoName; + + caf::PdmChildField m_curveAppearance; + + caf::PdmField m_symbolLabel_OBSOLETE; + caf::PdmField m_symbolSize_OBSOLETE; + caf::PdmField m_curveColor_OBSOLETE; + caf::PdmField m_curveThickness_OBSOLETE; + caf::PdmField m_symbolSkipPixelDistance_OBSOLETE; + caf::PdmField m_pointSymbol_OBSOLETE; + caf::PdmField m_lineStyle_OBSOLETE; + caf::PdmField m_fillStyle_OBSOLETE; + caf::PdmField m_fillColor_OBSOLETE; + caf::PdmField m_curveInterpolation_OBSOLETE; + caf::PdmField m_symbolLabelPosition_OBSOLETE; + caf::PdmField m_symbolEdgeColor_OBSOLETE; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp new file mode 100644 index 0000000000..104c9165fa --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.cpp @@ -0,0 +1,443 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimPlotCurveAppearance.h" + +#include "RiaColorTools.h" + +#include "cafPdmUiComboBoxEditor.h" + +#include "cvfAssert.h" + +CAF_PDM_XML_ABSTRACT_SOURCE_INIT( RimPlotCurveAppearance, "PlotCurveAppearance" ); + +namespace caf +{ +template <> +void RimPlotCurveAppearance::PointSymbol::setUp() +{ + addItem( RiuQwtSymbol::SYMBOL_NONE, "SYMBOL_NONE", "None" ); + addItem( RiuQwtSymbol::SYMBOL_ELLIPSE, "SYMBOL_ELLIPSE", "Ellipse" ); + addItem( RiuQwtSymbol::SYMBOL_RECT, "SYMBOL_RECT", "Rect" ); + addItem( RiuQwtSymbol::SYMBOL_DIAMOND, "SYMBOL_DIAMOND", "Diamond" ); + addItem( RiuQwtSymbol::SYMBOL_TRIANGLE, "SYMBOL_TRIANGLE", "Triangle" ); + addItem( RiuQwtSymbol::SYMBOL_DOWN_TRIANGLE, "SYMBOL_DOWN_TRIANGLE", "Down Triangle" ); + addItem( RiuQwtSymbol::SYMBOL_CROSS, "SYMBOL_CROSS", "Cross" ); + addItem( RiuQwtSymbol::SYMBOL_XCROSS, "SYMBOL_XCROSS", "X Cross" ); + addItem( RiuQwtSymbol::SYMBOL_STAR1, "SYMBOL_STAR1", "Star 1" ); + addItem( RiuQwtSymbol::SYMBOL_STAR2, "SYMBOL_STAR2", "Star 2" ); + addItem( RiuQwtSymbol::SYMBOL_HEXAGON, "SYMBOL_HEXAGON", "Hexagon" ); + addItem( RiuQwtSymbol::SYMBOL_LEFT_TRIANGLE, "SYMBOL_LEFT_TRIANGLE", "Left Triangle" ); + addItem( RiuQwtSymbol::SYMBOL_RIGHT_TRIANGLE, "SYMBOL_RIGHT_TRIANGLE", "Right Triangle" ); + setDefault( RiuQwtSymbol::SYMBOL_NONE ); +} + +template <> +void RimPlotCurveAppearance::LabelPosition::setUp() +{ + addItem( RiuQwtSymbol::LabelAboveSymbol, "LABEL_ABOVE_SYMBOL", "Label above Symbol" ); + addItem( RiuQwtSymbol::LabelBelowSymbol, "LABEL_BELOW_SYMBOL", "Label below Symbol" ); + addItem( RiuQwtSymbol::LabelLeftOfSymbol, "LABEL_LEFT_OF_SYMBOL", "Label left of Symbol" ); + addItem( RiuQwtSymbol::LabelRightOfSymbol, "LABEL_RIGHT_OF_SYMBOL", "Label right of Symbol" ); + setDefault( RiuQwtSymbol::LabelAboveSymbol ); +} + +template <> +void RimPlotCurveAppearance::FillStyle::setUp() +{ + addItem( Qt::NoBrush, "NO_FILL", "No Fill" ); + addItem( Qt::SolidPattern, "SOLID_FILL", "Solid Fill" ); + addItem( Qt::Dense1Pattern, "DENSE_FILL", "Dense Pattern" ); + addItem( Qt::Dense7Pattern, "SPARSE_FILL", "Sparse Pattern" ); + addItem( Qt::HorPattern, "HOR_FILL", "Horizontal Lines" ); + addItem( Qt::VerPattern, "VER_FILL", "Vertical Lines" ); + addItem( Qt::BDiagPattern, "DIAG_FILL", "Diagonal Lines" ); + addItem( Qt::CrossPattern, "CROSS_FILL", "Mesh" ); + addItem( Qt::DiagCrossPattern, "DIAG_CROSS_FILL", "Diagonal Mesh" ); +} + +} // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlotCurveAppearance::RimPlotCurveAppearance() + : appearanceChanged( this ) + , fillColorChanged( this ) + , m_colorVisible( true ) + , m_interpolationVisible( true ) + , m_fillOptionsVisible( true ) +{ + CAF_PDM_InitObject( "Curve Apperance", "", "", "" ); + + CAF_PDM_InitField( &m_curveColor, "Color", RiaColorTools::textColor3f(), "Color", "", "", "" ); + CAF_PDM_InitField( &m_fillColor, "FillColor", cvf::Color3f( -1.0, -1.0, -1.0 ), "Fill Color", "", "", "" ); + + CAF_PDM_InitField( &m_curveThickness, "Thickness", 1, "Line Thickness", "", "", "" ); + m_curveThickness.uiCapability()->setUiEditorTypeName( caf::PdmUiComboBoxEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_curveInterpolation, "CurveInterpolation", "Interpolation", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_lineStyle, "LineStyle", "Line Style", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_fillStyle, "FillStyle", "Area Fill Style", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_pointSymbol, "PointSymbol", "Symbol", "", "", "" ); + CAF_PDM_InitField( &m_symbolEdgeColor, "SymbolEdgeColor", RiaColorTools::textColor3f(), "Symbol Edge Color", "", "", "" ); + + CAF_PDM_InitField( &m_symbolSkipPixelDistance, + "SymbolSkipPxDist", + 0.0f, + "Symbol Skip Distance", + "", + "Minimum pixel distance between symbols", + "" ); + + CAF_PDM_InitFieldNoDefault( &m_symbolLabel, "SymbolLabel", "Symbol Label", "", "", "" ); + CAF_PDM_InitField( &m_symbolSize, "SymbolSize", 6, "Symbol Size", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_symbolLabelPosition, "SymbolLabelPosition", "Symbol Label Position", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimPlotCurveAppearance::~RimPlotCurveAppearance() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( &m_curveColor == changedField || &m_curveThickness == changedField || &m_pointSymbol == changedField || + &m_lineStyle == changedField || &m_symbolSkipPixelDistance == changedField || + &m_curveInterpolation == changedField || &m_symbolSize == changedField || &m_symbolEdgeColor == changedField || + &m_fillStyle == changedField || &m_fillColor == changedField ) + { + if ( &m_pointSymbol == changedField ) + { + m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); + m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); + } + else if ( &m_lineStyle == changedField ) + { + m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == + RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == + RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + } + else if ( &m_fillColor == changedField ) + { + fillColorChanged.send(); + } + + appearanceChanged.send(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::initAfterRead() +{ + m_symbolSize.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); + m_symbolSkipPixelDistance.uiCapability()->setUiReadOnly( m_pointSymbol() == RiuQwtSymbol::SYMBOL_NONE ); + m_curveThickness.uiCapability()->setUiReadOnly( m_lineStyle() == RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + m_curveInterpolation.uiCapability()->setUiReadOnly( m_lineStyle() == RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setColor( const cvf::Color3f& color ) +{ + m_curveColor = color; + m_fillColor = color; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimPlotCurveAppearance::color() const +{ + return m_curveColor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_curveColor ); + m_curveColor.uiCapability()->setUiHidden( !m_colorVisible ); + + uiOrdering.add( &m_pointSymbol ); + if ( RiuQwtSymbol::isFilledSymbol( m_pointSymbol() ) ) + { + uiOrdering.add( &m_symbolEdgeColor ); + } + uiOrdering.add( &m_symbolSize ); + uiOrdering.add( &m_symbolSkipPixelDistance ); + uiOrdering.add( &m_lineStyle ); + uiOrdering.add( &m_curveThickness ); + + uiOrdering.add( &m_fillStyle ); + m_fillStyle.uiCapability()->setUiHidden( !m_fillOptionsVisible ); + + if ( m_fillStyle != Qt::BrushStyle::NoBrush ) + { + uiOrdering.add( &m_fillColor ); + } + m_fillColor.uiCapability()->setUiHidden( !m_fillOptionsVisible ); + + uiOrdering.add( &m_curveInterpolation ); + m_curveInterpolation.uiCapability()->setUiHidden( !m_interpolationVisible ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimPlotCurveAppearance::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_curveThickness ) + { + for ( size_t i = 0; i < 10; i++ ) + { + options.push_back( caf::PdmOptionItemInfo( QString::number( i + 1 ), QVariant::fromValue( i + 1 ) ) ); + } + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle ) +{ + m_lineStyle = lineStyle; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ) +{ + m_pointSymbol = symbolStyle; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum curveInterpolation ) +{ + m_curveInterpolation = curveInterpolation; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuQwtPlotCurveDefines::CurveInterpolationEnum RimPlotCurveAppearance::interpolation() const +{ + return m_curveInterpolation(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuQwtPlotCurveDefines::LineStyleEnum RimPlotCurveAppearance::lineStyle() const +{ + return m_lineStyle(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuQwtSymbol::PointSymbolEnum RimPlotCurveAppearance::symbol() const +{ + return m_pointSymbol(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimPlotCurveAppearance::symbolSize() const +{ + return m_symbolSize(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimPlotCurveAppearance::symbolEdgeColor() const +{ + return m_symbolEdgeColor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +float RimPlotCurveAppearance::symbolSkipDistance() const +{ + return m_symbolSkipPixelDistance; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbolEdgeColor( const cvf::Color3f& edgeColor ) +{ + m_symbolEdgeColor = edgeColor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbolSkipDistance( float distance ) +{ + m_symbolSkipPixelDistance = distance; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbolLabel( const QString& label ) +{ + m_symbolLabel = label; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimPlotCurveAppearance::symbolLabel() const +{ + return m_symbolLabel; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbolLabelPosition( RiuQwtSymbol::LabelPosition labelPosition ) +{ + m_symbolLabelPosition = labelPosition; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuQwtSymbol::LabelPosition RimPlotCurveAppearance::symbolLabelPosition() const +{ + return m_symbolLabelPosition.value(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setSymbolSize( int sizeInPixels ) +{ + m_symbolSize = sizeInPixels; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setLineThickness( int thickness ) +{ + m_curveThickness = thickness; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimPlotCurveAppearance::lineThickness() const +{ + return m_curveThickness; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::resetAppearance() +{ + setColor( RiaColorTools::textColor3f() ); + setSymbolEdgeColor( RiaColorTools::textColor3f() ); + setLineThickness( 2 ); + setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); + setSymbol( RiuQwtSymbol::SYMBOL_NONE ); + setSymbolSkipDistance( 10 ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +Qt::BrushStyle RimPlotCurveAppearance::fillStyle() const +{ + return m_fillStyle(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setFillStyle( Qt::BrushStyle brushStyle ) +{ + m_fillStyle = brushStyle; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setFillColor( const cvf::Color3f& fillColor ) +{ + m_fillColor = fillColor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimPlotCurveAppearance::fillColor() const +{ + return m_fillColor; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setColorVisible( bool isVisible ) +{ + m_colorVisible = isVisible; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setInterpolationVisible( bool isVisible ) +{ + m_interpolationVisible = isVisible; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimPlotCurveAppearance::setFillOptionsVisible( bool isVisible ) +{ + m_fillOptionsVisible = isVisible; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h new file mode 100644 index 0000000000..e986988c59 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimPlotCurveAppearance.h @@ -0,0 +1,123 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RiaCurveDataTools.h" +#include "RiaDefines.h" + +#include "RiuQwtPlotCurveDefines.h" +#include "RiuQwtSymbol.h" + +#include "cafPdmField.h" +#include "cafPdmFieldCvfColor.h" +#include "cafPdmObject.h" + +//================================================================================================== +/// +/// +//================================================================================================== +class RimPlotCurveAppearance : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + caf::Signal<> appearanceChanged; + caf::Signal<> fillColorChanged; + +public: + typedef caf::AppEnum CurveInterpolation; + typedef caf::AppEnum LineStyle; + typedef caf::AppEnum PointSymbol; + typedef caf::AppEnum LabelPosition; + typedef caf::AppEnum FillStyle; + +public: + RimPlotCurveAppearance(); + ~RimPlotCurveAppearance() override; + + void setColor( const cvf::Color3f& color ); + cvf::Color3f color() const; + + void setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum lineStyle ); + RiuQwtPlotCurveDefines::LineStyleEnum lineStyle() const; + + void setLineThickness( int thickness ); + int lineThickness() const; + + void setSymbol( RiuQwtSymbol::PointSymbolEnum symbolStyle ); + RiuQwtSymbol::PointSymbolEnum symbol() const; + + void setSymbolSize( int sizeInPixels ); + int symbolSize() const; + + cvf::Color3f symbolEdgeColor() const; + void setSymbolEdgeColor( const cvf::Color3f& edgeColor ); + + void setSymbolSkipDistance( float distance ); + float symbolSkipDistance() const; + + void setSymbolLabel( const QString& label ); + QString symbolLabel() const; + + void setSymbolLabelPosition( RiuQwtSymbol::LabelPosition labelPosition ); + RiuQwtSymbol::LabelPosition symbolLabelPosition() const; + + void resetAppearance(); + Qt::BrushStyle fillStyle() const; + void setFillStyle( Qt::BrushStyle brushStyle ); + + void setFillColor( const cvf::Color3f& fillColor ); + cvf::Color3f fillColor() const; + + void setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum ); + RiuQwtPlotCurveDefines::CurveInterpolationEnum interpolation() const; + + void setInterpolationVisible( bool isVisible ); + void setColorVisible( bool isVisible ); + void setFillOptionsVisible( bool isVisible ); + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + +protected: + // Overridden PDM methods + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + void initAfterRead() override; + +protected: + caf::PdmField m_symbolLabel; + caf::PdmField m_symbolSize; + caf::PdmField m_legendEntryText; + + caf::PdmField m_curveColor; + caf::PdmField m_curveThickness; + caf::PdmField m_symbolSkipPixelDistance; + + caf::PdmField m_pointSymbol; + caf::PdmField m_lineStyle; + caf::PdmField m_fillStyle; + caf::PdmField m_fillColor; + caf::PdmField m_curveInterpolation; + caf::PdmField m_symbolLabelPosition; + caf::PdmField m_symbolEdgeColor; + + bool m_colorVisible; + bool m_interpolationVisible; + bool m_fillOptionsVisible; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimPltPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimPltPlotCollection.cpp index 4c1c0c5159..83e1a32c62 100644 --- a/ApplicationLibCode/ProjectDataModel/RimPltPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimPltPlotCollection.cpp @@ -42,7 +42,7 @@ RimPltPlotCollection::RimPltPlotCollection() CAF_PDM_InitObject( "PLT Plots", ":/WellAllocPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_pltPlots, "PltPlots", "", "", "", "" ); - m_pltPlots.uiCapability()->setUiHidden( true ); + m_pltPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimProject.cpp b/ApplicationLibCode/ProjectDataModel/RimProject.cpp index 1643343d22..f664695598 100644 --- a/ApplicationLibCode/ProjectDataModel/RimProject.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimProject.cpp @@ -47,6 +47,7 @@ #include "RimDialogData.h" #include "RimEclipseCase.h" #include "RimEclipseCaseCollection.h" +#include "RimEnsembleWellLogsCollection.h" #include "RimFlowPlotCollection.h" #include "RimFormationNamesCollection.h" #include "RimFractureTemplate.h" @@ -137,23 +138,23 @@ RimProject::RimProject( void ) m_globalPathList.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &oilFields, "OilFields", "Oil Fields", "", "", "" ); - oilFields.uiCapability()->setUiHidden( true ); + oilFields.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &colorLegendCollection, "ColorLegendCollection", "Color Legend Collection", "", "", "" ); colorLegendCollection = new RimColorLegendCollection(); colorLegendCollection->createStandardColorLegends(); CAF_PDM_InitFieldNoDefault( &scriptCollection, "ScriptCollection", "Octave Scripts", ":/octave.png", "", "" ); - scriptCollection.uiCapability()->setUiHidden( true ); + scriptCollection.uiCapability()->setUiTreeHidden( true ); scriptCollection.xmlCapability()->disableIO(); CAF_PDM_InitFieldNoDefault( &wellPathImport, "WellPathImport", "WellPathImport", "", "", "" ); wellPathImport = new RimWellPathImport(); - wellPathImport.uiCapability()->setUiHidden( true ); + wellPathImport.uiCapability()->setUiTreeHidden( true ); wellPathImport.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &mainPlotCollection, "MainPlotCollection", "Plots", "", "", "" ); - mainPlotCollection.uiCapability()->setUiHidden( true ); + mainPlotCollection.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &viewLinkerCollection, "LinkedViews", @@ -161,7 +162,7 @@ RimProject::RimProject( void ) ":/LinkView16x16.png", "", "" ); - viewLinkerCollection.uiCapability()->setUiHidden( true ); + viewLinkerCollection.uiCapability()->setUiTreeHidden( true ); viewLinkerCollection = new RimViewLinkerCollection; CAF_PDM_InitFieldNoDefault( &calculationCollection, "CalculationCollection", "Calculation Collection", "", "", "" ); @@ -196,7 +197,7 @@ RimProject::RimProject( void ) CAF_PDM_InitFieldNoDefault( &m_dialogData, "DialogData", "DialogData", "", "", "" ); m_dialogData = new RimDialogData(); - m_dialogData.uiCapability()->setUiHidden( true ); + m_dialogData.uiCapability()->setUiTreeHidden( true ); m_dialogData.uiCapability()->setUiTreeChildrenHidden( true ); // Obsolete fields. The content is moved to OilFields and friends @@ -357,12 +358,15 @@ void RimProject::initAfterRead() //-------------------------------------------------------------------------------------------------- void RimProject::setupBeforeSave() { - RiaGuiApplication* guiApp = RiaGuiApplication::instance(); - - if ( guiApp ) + if ( RiaGuiApplication::isRunning() ) { - m_show3DWindow = guiApp->mainWindow()->isVisible(); - m_showPlotWindow = guiApp->mainPlotWindow() && guiApp->mainPlotWindow()->isVisible(); + RiaGuiApplication* guiApp = RiaGuiApplication::instance(); + + if ( guiApp ) + { + m_show3DWindow = guiApp->mainWindow()->isVisible(); + m_showPlotWindow = guiApp->mainPlotWindow() && guiApp->mainPlotWindow()->isVisible(); + } } m_projectFileVersionString = STRPRODUCTVER; @@ -1410,6 +1414,10 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q { itemCollection->add( oilField->observedDataCollection() ); } + if ( oilField->ensembleWellLogsCollection() ) + { + itemCollection->add( oilField->ensembleWellLogsCollection() ); + } } } @@ -1474,10 +1482,7 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q if ( mainPlotCollection->stimPlanModelPlotCollection() ) { - if ( RiaApplication::enableDevelopmentFeatures() ) - { - itemCollection->add( mainPlotCollection->stimPlanModelPlotCollection() ); - } + itemCollection->add( mainPlotCollection->stimPlanModelPlotCollection() ); } if ( mainPlotCollection->vfpPlotCollection() ) @@ -1493,12 +1498,7 @@ void RimProject::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, Q statisticsItemCollection->add( mainPlotCollection->gridStatisticsPlotCollection() ); if ( mainPlotCollection->ensembleFractureStatisticsPlotCollection() ) - { - if ( RiaApplication::enableDevelopmentFeatures() ) - { - statisticsItemCollection->add( mainPlotCollection->ensembleFractureStatisticsPlotCollection() ); - } - } + statisticsItemCollection->add( mainPlotCollection->ensembleFractureStatisticsPlotCollection() ); } #endif } diff --git a/ApplicationLibCode/ProjectDataModel/RimReservoirCellResultsStorage.cpp b/ApplicationLibCode/ProjectDataModel/RimReservoirCellResultsStorage.cpp index 2ac5289095..e323ea17f7 100644 --- a/ApplicationLibCode/ProjectDataModel/RimReservoirCellResultsStorage.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimReservoirCellResultsStorage.cpp @@ -56,7 +56,7 @@ RimReservoirCellResultsStorage::RimReservoirCellResultsStorage() CAF_PDM_InitField( &m_resultCacheFileName, "ResultCacheFileName", QString(), "UiDummyname", "", "", "" ); m_resultCacheFileName.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_resultCacheMetaData, "ResultCacheEntries", "UiDummyname", "", "", "" ); - m_resultCacheMetaData.uiCapability()->setUiHidden( true ); + m_resultCacheMetaData.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimRftPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimRftPlotCollection.cpp index 551007eeaa..4031611248 100644 --- a/ApplicationLibCode/ProjectDataModel/RimRftPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimRftPlotCollection.cpp @@ -42,7 +42,7 @@ RimRftPlotCollection::RimRftPlotCollection() CAF_PDM_InitObject( "RFT Plots", ":/RFTPlots16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_rftPlots, "RftPlots", "", "", "", "" ); - m_rftPlots.uiCapability()->setUiHidden( true ); + m_rftPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimScriptCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimScriptCollection.cpp index 1618d64fe2..12d1f15695 100644 --- a/ApplicationLibCode/ProjectDataModel/RimScriptCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimScriptCollection.cpp @@ -39,9 +39,9 @@ RimScriptCollection::RimScriptCollection() CAF_PDM_InitFieldNoDefault( &directory, "ScriptDirectory", "Folder", "", "", "" ); CAF_PDM_InitFieldNoDefault( &calcScripts, "CalcScripts", "", "", "", "" ); - calcScripts.uiCapability()->setUiHidden( true ); + calcScripts.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &subDirectories, "SubDirectories", "", "", "", "" ); - subDirectories.uiCapability()->setUiHidden( true ); + subDirectories.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_searchSubFolders, "SearchSubFolders", false, "Add Subfolders", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.cpp index 5307897c30..86b01ca493 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.cpp @@ -37,6 +37,7 @@ #include "RimSimWellFractureCollection.h" #include "RimSimWellInView.h" #include "RimSimWellInViewTools.h" +#include "RimVirtualPerforationResults.h" #include "RimWellAllocationPlot.h" #include "RimWellDiskConfig.h" @@ -50,6 +51,7 @@ #include "cafPdmUiCheckBoxTristateEditor.h" #include "cafPdmUiListEditor.h" #include "cafPdmUiPushButtonEditor.h" +#include "cafPdmUiTreeOrdering.h" #include @@ -224,7 +226,7 @@ RimSimWellInViewCollection::RimSimWellInViewCollection() "" ); CAF_PDM_InitFieldNoDefault( &wells, "Wells", "Wells", "", "", "" ); - wells.uiCapability()->setUiHidden( true ); + wells.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_showWellCellFence, "ShowWellCellFenceTristate", "Show Well Cell Fence", "", "", "" ); m_showWellCellFence.uiCapability()->setUiEditorTypeName( caf::PdmUiCheckBoxTristateEditor::uiEditorTypeName() ); @@ -366,13 +368,6 @@ void RimSimWellInViewCollection::fieldChangedByUi( const caf::PdmFieldHandle* ch if ( &isActive == changedField ) { this->updateUiIconFromToggleField(); - - Rim3dView* view; - firstAncestorOrThisOfType( view ); - if ( view ) - { - view->hasUserRequestedAnimation = true; - } } if ( &m_showWellLabel == changedField ) @@ -598,6 +593,19 @@ QList return options; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSimWellInViewCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, + QString uiConfigName /*= "" */ ) +{ + if ( m_reservoirView && m_reservoirView->virtualPerforationResult() ) + { + auto uiTree = m_reservoirView->virtualPerforationResult()->uiTreeOrdering( uiConfigName ); + uiTreeOrdering.appendChild( uiTree ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.h b/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.h index 83489f0df2..44eb6ead02 100644 --- a/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/RimSimWellInViewCollection.h @@ -171,6 +171,8 @@ class RimSimWellInViewCollection : public caf::PdmObject QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + caf::PdmFieldHandle* objectToggleField() override; private: diff --git a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp index 909c3b74bc..c63229c8fe 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.cpp @@ -65,13 +65,13 @@ void RimStackablePlotCurve::assignStackColor( size_t index, size_t count ) } } - m_fillColor = curveColor; + setFillColor( curveColor ); { auto moreSaturatedColor = RiaColorTools::toQColor( curveColor ); moreSaturatedColor = RiaColorTools::modifySaturation( moreSaturatedColor, 1.2 ); - m_curveColor = RiaColorTools::fromQColorTo3f( moreSaturatedColor ); + m_curveAppearance->setColor( RiaColorTools::fromQColorTo3f( moreSaturatedColor ) ); } this->updateCurveAppearance(); @@ -100,10 +100,10 @@ void RimStackablePlotCurve::setIsStacked( bool stacked ) { m_isStacked = stacked; - if ( !m_isStacked() && m_fillStyle() != Qt::NoBrush ) + if ( !m_isStacked() && fillStyle() != Qt::NoBrush ) { // Switch off area fill when turning off stacking. - m_fillStyle = Qt::NoBrush; + setFillStyle( Qt::NoBrush ); } stackingChanged.send( m_isStacked() ); } @@ -119,10 +119,10 @@ void RimStackablePlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changed if ( changedField == &m_isStacked ) { - if ( !m_isStacked() && m_fillStyle() != Qt::NoBrush ) + if ( !m_isStacked() && fillStyle() != Qt::NoBrush ) { // Switch off area fill when turning off stacking. - m_fillStyle = Qt::NoBrush; + setFillStyle( Qt::NoBrush ); } stackingChanged.send( m_isStacked() ); } @@ -130,11 +130,16 @@ void RimStackablePlotCurve::fieldChangedByUi( const caf::PdmFieldHandle* changed { stackingColorsChanged.send( m_isStackedWithPhaseColors() ); } - else if ( changedField == &m_fillColor ) - { - m_isStackedWithPhaseColors = false; - this->updateConnectedEditors(); - } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStackablePlotCurve::onFillColorChanged( const caf::SignalEmitter* emitter ) +{ + m_isStackedWithPhaseColors = false; + this->updateConnectedEditors(); + stackingColorsChanged.send( m_isStackedWithPhaseColors() ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h index 2485517f47..a15b593ebc 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h +++ b/ApplicationLibCode/ProjectDataModel/RimStackablePlotCurve.h @@ -38,6 +38,8 @@ class RimStackablePlotCurve : public RimPlotCurve void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; void stackingUiOrdering( caf::PdmUiOrdering& uiOrdering ); + void onFillColorChanged( const caf::SignalEmitter* emitter ) override; + protected: caf::PdmField m_isStacked; caf::PdmField m_isStackedWithPhaseColors; diff --git a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp index 2c0a26089d..2092f656dd 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.cpp @@ -55,10 +55,22 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimStatisticsPlot::HistogramFrequencyType::ABSOLUTE_FREQUENCY, "ABSOLUTE_FREQUENCY", "Absolute" ); - addItem( RimStatisticsPlot::HistogramFrequencyType::RELATIVE_FREQUENCY, "RELATIVE_FREQUENCY", "Relative" ); + addItem( RimStatisticsPlot::HistogramFrequencyType::ABSOLUTE_FREQUENCY, "ABSOLUTE_FREQUENCY", "Absolute Frequency" ); + addItem( RimStatisticsPlot::HistogramFrequencyType::RELATIVE_FREQUENCY, "RELATIVE_FREQUENCY", "Relative Frequency" ); + addItem( RimStatisticsPlot::HistogramFrequencyType::RELATIVE_FREQUENCY_PERCENT, + "RELATIVE_FREQUENCY_PERCENT", + "Relative Frequency [%]" ); setDefault( RimStatisticsPlot::HistogramFrequencyType::ABSOLUTE_FREQUENCY ); } +template <> +void caf::AppEnum::setUp() + +{ + addItem( RimStatisticsPlot::GraphType::BAR_GRAPH, "BAR_GRAPH", "Bar Graph" ); + addItem( RimStatisticsPlot::GraphType::LINE_GRAPH, "LINE_GRAPH", "Line Graph" ); + setDefault( RimStatisticsPlot::GraphType::BAR_GRAPH ); +} + } // namespace caf CAF_PDM_ABSTRACT_SOURCE_INIT( RimStatisticsPlot, "StatisticsPlot" ); @@ -74,7 +86,7 @@ RimStatisticsPlot::RimStatisticsPlot() CAF_PDM_InitField( &m_numHistogramBins, "NumHistogramBins", 50, "Number of Bins", "", "", "" ); m_numHistogramBins.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); - CAF_PDM_InitField( &m_histogramBarColor, "HistogramBarColor", cvf::Color3f( cvf::Color3f::SKY_BLUE ), "Bar Color", "", "", "" ); + CAF_PDM_InitField( &m_histogramBarColor, "HistogramBarColor", cvf::Color3f( cvf::Color3f::SKY_BLUE ), "Color", "", "", "" ); CAF_PDM_InitField( &m_histogramGapWidth, "HistogramGapWidth", 0.0, "Gap Width [%]", "", "", "" ); m_histogramGapWidth.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); @@ -96,6 +108,8 @@ RimStatisticsPlot::RimStatisticsPlot() "", "" ); + CAF_PDM_InitFieldNoDefault( &m_graphType, "GraphType", "Graph Type", "", "", "" ); + m_plotLegendsHorizontal.uiCapability()->setUiHidden( true ); setDeletable( true ); @@ -163,6 +177,7 @@ QImage RimStatisticsPlot::snapshotWindowContent() QWidget* RimStatisticsPlot::createViewWidget( QWidget* mainWindowParent ) { m_viewer = new RiuQtChartView( this, mainWindowParent ); + m_viewer->setRenderHint( QPainter::Antialiasing ); return m_viewer; } @@ -245,7 +260,8 @@ void RimStatisticsPlot::uiOrderingForHistogram( QString uiConfigName, caf::PdmUi caf::PdmUiGroup* histogramGroup = uiOrdering.addNewGroup( "Histogram" ); if ( showHistogramBins ) histogramGroup->add( &m_numHistogramBins ); histogramGroup->add( &m_histogramBarColor ); - histogramGroup->add( &m_histogramGapWidth ); + histogramGroup->add( &m_graphType ); + if ( m_graphType == GraphType::BAR_GRAPH ) histogramGroup->add( &m_histogramGapWidth ); histogramGroup->add( &m_histogramFrequencyType ); histogramGroup->add( &m_precision ); histogramGroup->add( &m_tickNumberFormat ); @@ -277,31 +293,49 @@ void RimStatisticsPlot::updatePlots() double minValue = std::numeric_limits::max(); double maxValue = -std::numeric_limits::max(); + QColor color = RiaColorTools::toQColor( m_histogramBarColor ); + // Make border same color as bar when user wants max bar width if ( m_histogramGapWidth() == 0.0 ) { - set0->setBorderColor( RiaColorTools::toQColor( m_histogramBarColor ) ); + set0->setBorderColor( color ); } double sumElements = 0.0; for ( double value : histogramData.histogram ) sumElements += value; + QLineSeries* lineSeries = new QLineSeries(); + lineSeries->setName( m_plotWindowTitle ); + + QPen pen( color ); + pen.setWidth( 2 ); + lineSeries->setPen( pen ); + + double binSize = ( histogramData.max - histogramData.min ) / histogramData.histogram.size(); + double binCenter = histogramData.min; for ( double value : histogramData.histogram ) { if ( m_histogramFrequencyType() == HistogramFrequencyType::RELATIVE_FREQUENCY ) value /= sumElements; + if ( m_histogramFrequencyType() == HistogramFrequencyType::RELATIVE_FREQUENCY_PERCENT ) + value = value / sumElements * 100.0; *set0 << value; + *lineSeries << QPointF( binCenter, value ); + binCenter += binSize; + minValue = std::min( minValue, value ); maxValue = std::max( maxValue, value ); } - set0->setColor( RiaColorTools::toQColor( m_histogramBarColor ) ); + set0->setColor( color ); + lineSeries->setColor( color ); QBarSeries* series = new QBarSeries(); series->setBarWidth( ( 100.0 - m_histogramGapWidth() ) / 100.0 ); series->append( set0 ); QChart* chart = new QChart(); - chart->addSeries( series ); + if ( m_graphType == GraphType::BAR_GRAPH ) chart->addSeries( series ); + if ( m_graphType == GraphType::LINE_GRAPH ) chart->addSeries( lineSeries ); chart->setTitle( uiName() ); // Axis @@ -311,11 +345,13 @@ void RimStatisticsPlot::updatePlots() QValueAxis* axisX = new QValueAxis(); axisX->setRange( histogramData.min - xAxisExtension, histogramData.max + xAxisExtension ); axisX->setLabelFormat( RiaNumberFormat::sprintfFormat( m_tickNumberFormat(), m_precision ) ); + axisX->setTitleText( createXAxisTitle() ); chart->addAxis( axisX, Qt::AlignBottom ); QValueAxis* axisY = new QValueAxis(); axisY->setRange( minValue, maxValue ); axisY->setLabelFormat( RiaNumberFormat::sprintfFormat( m_tickNumberFormat(), m_precision ) ); + axisY->setTitleText( createYAxisTitle() ); chart->addAxis( axisY, Qt::AlignLeft ); if ( !std::isinf( histogramData.p10 ) ) @@ -329,7 +365,7 @@ void RimStatisticsPlot::updatePlots() p10series->attachAxis( axisY ); } - if ( !std::isinf( histogramData.p10 ) ) + if ( !std::isinf( histogramData.p90 ) ) { QLineSeries* p90series = new QLineSeries(); chart->addSeries( p90series ); @@ -382,3 +418,11 @@ void RimStatisticsPlot::performAutoNameUpdate() m_plotWindowTitle = name; setUiName( name ); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimStatisticsPlot::createYAxisTitle() const +{ + return caf::AppEnum::uiText( m_histogramFrequencyType() ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h index 280af98901..5dc44b7a37 100644 --- a/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h +++ b/ApplicationLibCode/ProjectDataModel/RimStatisticsPlot.h @@ -47,7 +47,14 @@ class RimStatisticsPlot : public RimPlotWindow enum class HistogramFrequencyType { ABSOLUTE_FREQUENCY, - RELATIVE_FREQUENCY + RELATIVE_FREQUENCY, + RELATIVE_FREQUENCY_PERCENT + }; + + enum class GraphType + { + BAR_GRAPH, + LINE_GRAPH }; RimStatisticsPlot(); @@ -79,6 +86,9 @@ class RimStatisticsPlot : public RimPlotWindow virtual RigHistogramData createStatisticsData() const = 0; virtual QString createAutoName() const = 0; + virtual QString createXAxisTitle() const = 0; + virtual QString createYAxisTitle() const; + void performAutoNameUpdate(); private: @@ -97,4 +107,5 @@ class RimStatisticsPlot : public RimPlotWindow caf::PdmField> m_histogramFrequencyType; caf::PdmField m_precision; caf::PdmField> m_tickNumberFormat; + caf::PdmField> m_graphType; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.cpp b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.cpp new file mode 100644 index 0000000000..9aea996cff --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.cpp @@ -0,0 +1,297 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimSurfaceIntersectionBand.h" + +#include "RimAnnotationLineAppearance.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSurface.h" +#include "RimSurfaceCollection.h" +#include "RimSurfaceIntersectionCurve.h" + +#include "cafPdmUiDoubleSliderEditor.h" +#include "cafPdmUiTreeSelectionEditor.h" + +CAF_PDM_SOURCE_INIT( RimSurfaceIntersectionBand, "RimSurfaceIntersectionBand" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimSurfaceIntersectionBand::userDescriptionField() +{ + return &m_nameProxy; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionBand::RimSurfaceIntersectionBand() + : objectChanged( this ) +{ + CAF_PDM_InitObject( "SurfaceIntersectionBand", ":/ReservoirSurface16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_lineAppearance, "LineAppearance", "Line Appearance", "", "", "" ); + m_lineAppearance = new RimAnnotationLineAppearance; + m_lineAppearance->objectChanged.connect( this, &RimSurfaceIntersectionBand::onObjectChanged ); + uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitField( &m_bandColor, "BandColor", cvf::Color3f( cvf::Color3f::BLACK ), "Band Color", "", "", "" ); + CAF_PDM_InitField( &m_bandOpacity, "BandOpacity", 0.8, "Band Opacity", "", "", "" ); + m_bandOpacity.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_bandPolygonOffsetUnit, + "BandPolygonOffsetUnit", + -5.0, + "Depth Offset", + "", + "Larger Value Closer to Camera", + "" ); + m_bandPolygonOffsetUnit.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_surfaces, "Surfaces", "Band Surfaces", "", "", "" ); + m_surfaces.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name", "", "", "" ); + m_nameProxy.registerGetMethod( this, &RimSurfaceIntersectionBand::objectName ); + m_nameProxy.uiCapability()->setUiHidden( true ); + + setDeletable( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::setSurfaces( RimSurface* surface1, RimSurface* surface2 ) +{ + m_surfaces.clear(); + + m_surfaces.push_back( surface1 ); + m_surfaces.push_back( surface2 ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::setBandColor( const cvf::Color3f& color ) +{ + m_bandColor = color; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::setBandOpacity( double opacity ) +{ + m_bandOpacity = opacity; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::setPolygonOffsetUnit( double offset ) +{ + m_bandPolygonOffsetUnit = offset; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimAnnotationLineAppearance* RimSurfaceIntersectionBand::lineAppearance() const +{ + return m_lineAppearance(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Color3f RimSurfaceIntersectionBand::bandColor() const +{ + return m_bandColor(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +float RimSurfaceIntersectionBand::bandOpacity() const +{ + return m_bandOpacity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimSurfaceIntersectionBand::polygonOffsetUnit() const +{ + // The value in user interface is [0..1] + // An offsetUnitValue in the range -5..-1000 seems to give good visual results + + const double minimumValue = 5.0; + auto value = minimumValue + m_bandPolygonOffsetUnit * 1000.0; + + return -value; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurface* RimSurfaceIntersectionBand::surface1() const +{ + auto surfaces = m_surfaces.ptrReferencedObjects(); + if ( !surfaces.empty() ) return surfaces[0]; + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurface* RimSurfaceIntersectionBand::surface2() const +{ + auto surfaces = m_surfaces.ptrReferencedObjects(); + if ( surfaces.size() > 1 ) return surfaces[1]; + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( changedField == &m_surfaces ) + { + auto surfaces = m_surfaces.ptrReferencedObjects(); + + if ( surfaces.size() > 2 ) + { + // Keep first and last surface to make it possible to select a new surface by using a single click + auto firstAndLast = { surfaces.front(), surfaces.back() }; + surfaces = firstAndLast; + } + + m_surfaces.setValue( surfaces ); + } + + onObjectChanged( this ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimSurfaceIntersectionBand::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_surfaces ) + { + RimSurfaceCollection* surfColl = RimProject::current()->activeOilField()->surfaceCollection(); + + RimSurfaceIntersectionCurve::appendOptionItemsForSources( 0, surfColl, false, options ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_bandPolygonOffsetUnit ) + { + auto* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_minimum = 0; + myAttr->m_maximum = 1.0; + } + } + else if ( field == &m_bandOpacity ) + { + auto* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->m_minimum = 0.0; + myAttr->m_maximum = 1.0; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::onObjectChanged( const caf::SignalEmitter* emitter ) +{ + objectChanged.send(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimSurfaceIntersectionBand::objectName() const +{ + auto surfaces = m_surfaces.ptrReferencedObjects(); + + if ( surfaces.size() == 2 ) + { + QString text; + + auto firstSurface = surfaces[0]; + if ( firstSurface ) + { + RimSurfaceCollection* surfColl = nullptr; + firstSurface->firstAncestorOfType( surfColl ); + if ( surfColl ) + { + text += surfColl->collectionName(); + } + } + + auto secondSurface = surfaces[0]; + + if ( firstSurface && secondSurface ) + { + text += "( " + firstSurface->fullName() + " - " + secondSurface->fullName() + " )"; + return text; + } + } + + return "Surface Band"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionBand::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + { + caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Band Appearance" ); + group->add( &m_bandColor ); + group->add( &m_bandOpacity ); + } + { + caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Line Appearance" ); + m_lineAppearance->uiOrdering( uiConfigName, *group ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.h b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.h new file mode 100644 index 0000000000..ebebb43695 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionBand.h @@ -0,0 +1,83 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimCheckableObject.h" + +#include "cafPdmChildField.h" +#include "cafPdmFieldCvfColor.h" // Include to make Pdm work for cvf::Color +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrArrayField.h" + +class RimSurface; +class RimAnnotationLineAppearance; + +//================================================================================================== +// +// +// +//================================================================================================== +class RimSurfaceIntersectionBand : public RimCheckableObject +{ + CAF_PDM_HEADER_INIT; + +public: + caf::Signal<> objectChanged; + +public: + RimSurfaceIntersectionBand(); + + void setSurfaces( RimSurface* surface1, RimSurface* surface2 ); + void setBandColor( const cvf::Color3f& color ); + void setBandOpacity( double opacity ); + void setPolygonOffsetUnit( double offset ); + + RimAnnotationLineAppearance* lineAppearance() const; + cvf::Color3f bandColor() const; + float bandOpacity() const; + + double polygonOffsetUnit() const; + + RimSurface* surface1() const; + RimSurface* surface2() const; + +private: + caf::PdmFieldHandle* userDescriptionField() override; + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void onObjectChanged( const caf::SignalEmitter* emitter ); + + QString objectName() const; + +private: + caf::PdmChildField m_lineAppearance; + caf::PdmField m_bandColor; + caf::PdmField m_bandOpacity; + caf::PdmField m_bandPolygonOffsetUnit; + caf::PdmPtrArrayField m_surfaces; + caf::PdmProxyValueField m_nameProxy; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.cpp new file mode 100644 index 0000000000..a81d302369 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.cpp @@ -0,0 +1,109 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimSurfaceIntersectionCollection.h" + +#include "RimSurfaceIntersectionBand.h" +#include "RimSurfaceIntersectionCurve.h" + +CAF_PDM_SOURCE_INIT( RimSurfaceIntersectionCollection, "RimSurfaceIntersectionCollection" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionCollection::RimSurfaceIntersectionCollection() + : objectChanged( this ) +{ + CAF_PDM_InitObject( "SurfaceIntersectionCollection_msj", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_intersectionBands, "IntersectionBands", "Intersection Bands", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_intersectionCurves, "IntersectionCurves", "Intersection Curves", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionCurve* RimSurfaceIntersectionCollection::addIntersectionCurve() +{ + auto curve = new RimSurfaceIntersectionCurve; + curve->objectChanged.connect( this, &RimSurfaceIntersectionCollection::onObjectChanged ); + m_intersectionCurves.push_back( curve ); + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionBand* RimSurfaceIntersectionCollection::addIntersectionBand() +{ + auto band = new RimSurfaceIntersectionBand; + band->objectChanged.connect( this, &RimSurfaceIntersectionCollection::onObjectChanged ); + m_intersectionBands.push_back( band ); + + return band; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSurfaceIntersectionCollection::surfaceIntersectionCurves() const +{ + return m_intersectionCurves.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSurfaceIntersectionCollection::surfaceIntersectionBands() const +{ + return m_intersectionBands.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) +{ + onObjectChanged( this ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCollection::onObjectChanged( const caf::SignalEmitter* emitter ) +{ + objectChanged.send(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCollection::initAfterRead() +{ + for ( const auto& band : m_intersectionBands ) + { + band->objectChanged.connect( this, &RimSurfaceIntersectionCollection::onObjectChanged ); + } + + for ( const auto& curve : m_intersectionCurves ) + { + curve->objectChanged.connect( this, &RimSurfaceIntersectionCollection::onObjectChanged ); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.h b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.h new file mode 100644 index 0000000000..d8380a1158 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCollection.h @@ -0,0 +1,59 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimCheckableObject.h" + +#include "cafPdmChildArrayField.h" + +class RimSurfaceIntersectionBand; +class RimSurfaceIntersectionCurve; + +//================================================================================================== +// +// +// +//================================================================================================== +class RimSurfaceIntersectionCollection : public RimCheckableObject +{ + CAF_PDM_HEADER_INIT; + +public: + caf::Signal<> objectChanged; + +public: + RimSurfaceIntersectionCollection(); + + RimSurfaceIntersectionCurve* addIntersectionCurve(); + RimSurfaceIntersectionBand* addIntersectionBand(); + + std::vector surfaceIntersectionCurves() const; + std::vector surfaceIntersectionBands() const; + +private: + void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) override; + + void onObjectChanged( const caf::SignalEmitter* emitter ); + void initAfterRead() override; + +private: + caf::PdmChildArrayField m_intersectionBands; + caf::PdmChildArrayField m_intersectionCurves; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.cpp b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.cpp new file mode 100644 index 0000000000..b9e9b1db83 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.cpp @@ -0,0 +1,176 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimSurfaceIntersectionCurve.h" + +#include "RimAnnotationLineAppearance.h" +#include "RimEnsembleSurface.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimSurface.h" +#include "RimSurfaceCollection.h" + +#include "cafPdmUiTreeSelectionEditor.h" + +CAF_PDM_SOURCE_INIT( RimSurfaceIntersectionCurve, "RimSurfaceIntersectionCurve" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceIntersectionCurve::RimSurfaceIntersectionCurve() + : objectChanged( this ) +{ + CAF_PDM_InitObject( "SurfaceIntersectionCurve", ":/SummaryCurve16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_lineAppearance, "LineAppearance", "Line Appearance", "", "", "" ); + m_lineAppearance = new RimAnnotationLineAppearance; + m_lineAppearance->objectChanged.connect( this, &RimSurfaceIntersectionCurve::onObjectChanged ); + uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_surface1, "Surface1", "Surface 1", "", "", "" ); + m_surface1.uiCapability()->setUiEditorTypeName( caf::PdmUiTreeSelectionEditor::uiEditorTypeName() ); + + CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name", "", "", "" ); + m_nameProxy.registerGetMethod( this, &RimSurfaceIntersectionCurve::objectName ); + m_nameProxy.uiCapability()->setUiHidden( true ); + + setDeletable( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurface* RimSurfaceIntersectionCurve::surface() const +{ + return m_surface1(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimAnnotationLineAppearance* RimSurfaceIntersectionCurve::lineAppearance() const +{ + return m_lineAppearance(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimSurfaceIntersectionCurve::userDescriptionField() +{ + return &m_nameProxy; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCurve::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + onObjectChanged( this ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimSurfaceIntersectionCurve::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_surface1 ) + { + RimSurfaceCollection* surfColl = RimProject::current()->activeOilField()->surfaceCollection(); + + appendOptionItemsForSources( 0, surfColl, true, options ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCurve::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Line Appearance" ); + m_lineAppearance->uiOrdering( uiConfigName, *group ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCurve::onObjectChanged( const caf::SignalEmitter* emitter ) +{ + objectChanged.send(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimSurfaceIntersectionCurve::objectName() const +{ + if ( m_surface1() ) + { + RimEnsembleSurface* ensembleSurface = nullptr; + m_surface1()->firstAncestorOfType( ensembleSurface ); + if ( ensembleSurface ) + { + QString text; + text += ensembleSurface->collectionName(); + text += "( " + m_surface1()->fullName() + " )"; + return text; + } + + return m_surface1()->fullName(); + } + + return "Surface Curve"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceIntersectionCurve::appendOptionItemsForSources( int currentLevel, + RimSurfaceCollection* currentCollection, + bool showEnsembleSurfaces, + QList& options ) +{ + if ( !currentCollection ) return; + + caf::IconProvider surfaceIcon( ":/ReservoirSurface16x16.png" ); + + options.push_back( caf::PdmOptionItemInfo::createHeader( currentCollection->collectionName(), true ) ); + + for ( auto surf : currentCollection->surfaces() ) + { + auto itemInfo = caf::PdmOptionItemInfo( surf->fullName(), surf, false, surfaceIcon ); + itemInfo.setLevel( currentLevel + 1 ); + options.push_back( itemInfo ); + } + + auto ensembleSurface = dynamic_cast( currentCollection ); + if ( !ensembleSurface || ( showEnsembleSurfaces && ensembleSurface ) ) + { + for ( auto subColl : currentCollection->subCollections() ) + { + appendOptionItemsForSources( currentLevel, subColl, showEnsembleSurfaces, options ); + } + } +} diff --git a/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.h b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.h new file mode 100644 index 0000000000..a111217845 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/RimSurfaceIntersectionCurve.h @@ -0,0 +1,69 @@ +//////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimCheckableObject.h" +#include "cafPdmChildField.h" +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrField.h" + +class RimSurface; +class RimAnnotationLineAppearance; +class RimSurfaceCollection; + +//================================================================================================== +// +// +// +//================================================================================================== +class RimSurfaceIntersectionCurve : public RimCheckableObject +{ + CAF_PDM_HEADER_INIT; + +public: + caf::Signal<> objectChanged; + +public: + RimSurfaceIntersectionCurve(); + + RimSurface* surface() const; + RimAnnotationLineAppearance* lineAppearance() const; + + static void appendOptionItemsForSources( int currentLevel, + RimSurfaceCollection* currentCollection, + bool showEnsembleSurfaces, + QList& options ); + +private: + caf::PdmFieldHandle* userDescriptionField() override; + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + + void onObjectChanged( const caf::SignalEmitter* emitter ); + QString objectName() const; + +private: + caf::PdmPtrField m_surface1; + caf::PdmChildField m_lineAppearance; + caf::PdmProxyValueField m_nameProxy; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimTensorResults.cpp b/ApplicationLibCode/ProjectDataModel/RimTensorResults.cpp index 2edd90aadb..b03276b12d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTensorResults.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimTensorResults.cpp @@ -64,7 +64,7 @@ RimTensorResults::RimTensorResults() CAF_PDM_InitFieldNoDefault( &arrowColorLegendConfig, "LegendDefinition", "Color Legend", "", "", "" ); this->arrowColorLegendConfig = new RimRegularLegendConfig(); - arrowColorLegendConfig.uiCapability()->setUiHidden( true ); + arrowColorLegendConfig.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_resultFieldName, "ResultVariable", QString( "ST" ), "Value", "", "", "" ); m_resultFieldName.uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/RimTensorResults.h b/ApplicationLibCode/ProjectDataModel/RimTensorResults.h index 6597ea7d1f..8010b8f8c2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimTensorResults.h +++ b/ApplicationLibCode/ProjectDataModel/RimTensorResults.h @@ -37,7 +37,7 @@ class RimRegularLegendConfig; /// /// //================================================================================================== -class RimTensorResults : public RimFemResultObserver +class RimTensorResults : public RimFemResultObserver, public caf::PdmObject { CAF_PDM_HEADER_INIT; diff --git a/ApplicationLibCode/ProjectDataModel/RimVfpPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimVfpPlotCollection.cpp index c3f04d0f0b..aa01154ee4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimVfpPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimVfpPlotCollection.cpp @@ -39,7 +39,7 @@ RimVfpPlotCollection::RimVfpPlotCollection() CAF_PDM_InitObject( "VFP Plots", ":/VfpPlotCollection.svg", "", "" ); CAF_PDM_InitFieldNoDefault( &m_vfpPlots, "VfpPlots", "Vertical Flow Performance Plots", "", "", "" ); - m_vfpPlots.uiCapability()->setUiHidden( true ); + m_vfpPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp b/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp index 8b8ec3490d..24fe576046 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewLinker.cpp @@ -64,10 +64,11 @@ RimViewLinker::RimViewLinker() CAF_PDM_InitFieldNoDefault(&m_masterView, "MainView", "Main View", "", "", ""); m_masterView.uiCapability()->setUiTreeChildrenHidden(true); + m_masterView.uiCapability()->setUiTreeHidden(true); m_masterView.uiCapability()->setUiHidden(true); CAF_PDM_InitFieldNoDefault(&m_viewControllers, "ManagedViews", "Managed Views", "", "", ""); - m_viewControllers.uiCapability()->setUiHidden(true); + m_viewControllers.uiCapability()->setUiTreeHidden(true); m_viewControllers.uiCapability()->setUiTreeChildrenHidden(true); CAF_PDM_InitFieldNoDefault(&m_comparisonView, "LinkedComparisonView", "Comparison View", "", "", ""); diff --git a/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp b/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp index 27af3c9142..4996ab89ba 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewLinkerCollection.cpp @@ -37,7 +37,7 @@ RimViewLinkerCollection::RimViewLinkerCollection( void ) isActive.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &viewLinker, "ViewLinkers", "View Linkers", "", "", "" ); - viewLinker.uiCapability()->setUiHidden( true ); + viewLinker.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp index bb20569b7a..d0c05bb239 100644 --- a/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimViewWindow.cpp @@ -22,7 +22,7 @@ #include "RiaColorTools.h" #include "RiaFieldHandleTools.h" #include "RiaGuiApplication.h" -#include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RicfCommandObject.h" @@ -49,7 +49,7 @@ RimViewWindow::RimViewWindow( void ) "The Base Class for all Views and Plots in ResInsight" ); CAF_PDM_InitFieldNoDefault( &m_windowController, "WindowController", "", "", "", "" ); - m_windowController.uiCapability()->setUiHidden( true ); + m_windowController.uiCapability()->setUiTreeHidden( true ); m_windowController.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitField( &m_showWindow, "ShowWindow", true, "Show Window", "", "", "" ); @@ -328,7 +328,7 @@ void RimViewWindow::initAfterRead() void RimViewWindow::defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { caf::PdmUiTreeViewItemAttribute* treeItemAttribute = dynamic_cast( attribute ); - if ( treeItemAttribute && RiaPreferences::current()->showViewIdInProjectTree() && id() >= 0 ) + if ( treeItemAttribute && RiaPreferencesSystem::current()->showViewIdInProjectTree() && id() >= 0 ) { treeItemAttribute->tags.clear(); auto tag = caf::PdmUiTreeViewItemAttribute::Tag::create(); diff --git a/ApplicationLibCode/ProjectDataModel/RimVirtualPerforationResults.cpp b/ApplicationLibCode/ProjectDataModel/RimVirtualPerforationResults.cpp index d0fc806868..b1f4499e98 100644 --- a/ApplicationLibCode/ProjectDataModel/RimVirtualPerforationResults.cpp +++ b/ApplicationLibCode/ProjectDataModel/RimVirtualPerforationResults.cpp @@ -36,7 +36,7 @@ RimVirtualPerforationResults::RimVirtualPerforationResults() CAF_PDM_InitField( &m_geometryScaleFactor, "GeometryScaleFactor", 2.0, "Geometry Scale Factor", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); m_legendConfig = new RimRegularLegendConfig(); } diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/StimPlanModel/CMakeLists_files.cmake index 215e8ad39c..9231aa59e8 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/CMakeLists_files.cmake @@ -1,63 +1,63 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplate.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModel.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplateCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelElasticPropertyCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelLayerCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPropertyCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPropertyCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelStressCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelWellLogCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPressureCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimElasticProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScaling.h -${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScalingCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimFaciesProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimNonNetLayers.h -${CMAKE_CURRENT_LIST_DIR}/RimFaciesInitialPressureConfig.h -${CMAKE_CURRENT_LIST_DIR}/RimPressureTableItem.h -${CMAKE_CURRENT_LIST_DIR}/RimPressureTable.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplate.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModel.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelElasticPropertyCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelLayerCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPropertyCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPropertyCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelStressCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelWellLogCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPressureCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimElasticProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScaling.h + ${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScalingCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaciesProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimNonNetLayers.h + ${CMAKE_CURRENT_LIST_DIR}/RimFaciesInitialPressureConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimPressureTableItem.h + ${CMAKE_CURRENT_LIST_DIR}/RimPressureTable.h + ${CMAKE_CURRENT_LIST_DIR}/RimExtractionConfiguration.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplate.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModel.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplateCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelElasticPropertyCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelLayerCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelStressCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelWellLogCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPressureCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimElasticProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScaling.cpp -${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScalingCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaciesProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimNonNetLayers.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFaciesInitialPressureConfig.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPressureTableItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RimPressureTable.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplate.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelElasticPropertyCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelLayerCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelStressCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelWellLogCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStimPlanModelPressureCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimElasticProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScaling.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimElasticPropertyScalingCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaciesProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimNonNetLayers.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFaciesInitialPressureConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPressureTableItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimPressureTable.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimExtractionConfiguration.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND QT_MOC_HEADERS -) +list(APPEND QT_MOC_HEADERS) -source_group( "ProjectDataModel\\StimPlanModel" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\StimPlanModel" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticProperties.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticProperties.cpp index 666bb57a11..7c4699e2b7 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticProperties.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticProperties.cpp @@ -51,7 +51,6 @@ RimElasticProperties::RimElasticProperties() CAF_PDM_InitScriptableField( &m_showScaledProperties, "ShowScaledProperties", true, "Show Scaled Properties", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_scalings, "PropertyScalingCollection", "PropertyScalingCollection", "", "", "" ); - m_scalings.uiCapability()->setUiHidden( true ); m_scalings.uiCapability()->setUiTreeHidden( true ); m_scalings = new RimElasticPropertyScalingCollection; m_scalings->changed.connect( this, &RimElasticProperties::elasticPropertyScalingCollectionChanged ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticPropertyScalingCollection.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticPropertyScalingCollection.cpp index 89193f478c..8800a5c602 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticPropertyScalingCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimElasticPropertyScalingCollection.cpp @@ -40,7 +40,6 @@ RimElasticPropertyScalingCollection::RimElasticPropertyScalingCollection() "", "", "" ); - m_elasticPropertyScalings.uiCapability()->setUiHidden( true ); m_elasticPropertyScalings.uiCapability()->setUiTreeHidden( true ); } @@ -72,7 +71,6 @@ void RimElasticPropertyScalingCollection::addElasticPropertyScaling( RimElasticP { scaling->changed.connect( this, &RimElasticPropertyScalingCollection::elasticPropertyScalingChanged ); m_elasticPropertyScalings.push_back( scaling ); - scaling->ensureDefaultFormationAndFacies(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.cpp new file mode 100644 index 0000000000..548548e33c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.cpp @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimExtractionConfiguration.h" + +#include "cafAppEnum.h" + +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RimExtractionConfiguration::EclipseCaseType::STATIC_CASE, "STATIC_CASE", "Static Case" ); + addItem( RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE, "DYNAMIC_CASE", "Dynamic Case" ); + addItem( RimExtractionConfiguration::EclipseCaseType::INITIAL_PRESSURE_CASE, + "INITIAL_PRESSURE_CASE", + "Initial Pressure Case" ); + + setDefault( RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ); +} +}; // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimExtractionConfiguration::RimExtractionConfiguration( const QString& resultVar, + RiaDefines::ResultCatType resultCat, + EclipseCaseType eclipseCase ) +{ + resultVariable = resultVar; + resultCategory = resultCat; + eclipseCaseType = eclipseCase; +} diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.h new file mode 100644 index 0000000000..79f1bf6685 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimExtractionConfiguration.h @@ -0,0 +1,38 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +class RimExtractionConfiguration +{ +public: + enum class EclipseCaseType + { + STATIC_CASE, + DYNAMIC_CASE, + INITIAL_PRESSURE_CASE + }; + + RimExtractionConfiguration( const QString& resultVar, RiaDefines::ResultCatType resultCat, EclipseCaseType eclipseCase ); + + RiaDefines::ResultCatType resultCategory; + QString resultVariable; + EclipseCaseType eclipseCaseType; +}; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesInitialPressureConfig.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesInitialPressureConfig.cpp index b7e01ee320..2e509aaed8 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesInitialPressureConfig.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesInitialPressureConfig.cpp @@ -38,7 +38,7 @@ RimFaciesInitialPressureConfig::RimFaciesInitialPressureConfig() CAF_PDM_InitScriptableFieldNoDefault( &m_faciesName, "FaciesName", "Facies", "", "", "" ); m_faciesName.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitScriptableFieldNoDefault( &m_faciesValue, "FaciesValue", "Value", "", "", "" ); + CAF_PDM_InitScriptableField( &m_faciesValue, "FaciesValue", -1, "Value", "", "", "" ); m_faciesValue.uiCapability()->setUiHidden( true ); // Use unicode for delta letter diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesProperties.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesProperties.cpp index 6a3abdcc38..36aa36aad8 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesProperties.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimFaciesProperties.cpp @@ -53,7 +53,7 @@ RimFaciesProperties::RimFaciesProperties() m_propertiesTable.xmlCapability()->disableIO(); CAF_PDM_InitScriptableFieldNoDefault( &m_faciesDefinition, "FaciesDefinition", "", "", "", "" ); - m_faciesDefinition.uiCapability()->setUiHidden( true ); + m_faciesDefinition.uiCapability()->setUiTreeHidden( true ); m_faciesDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_faciesDefinition = new RimEclipseResultDefinition; m_faciesDefinition->findField( "MResultType" )->uiCapability()->setUiName( "Facies Definiton" ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimNonNetLayers.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimNonNetLayers.cpp index 6588b88afb..2b6f89982a 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimNonNetLayers.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimNonNetLayers.cpp @@ -50,7 +50,7 @@ RimNonNetLayers::RimNonNetLayers() CAF_PDM_InitScriptableFieldNoDefault( &m_facies, "Facies", "Facies", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_resultDefinition, "FaciesDefinition", "", "", "", "" ); - m_resultDefinition.uiCapability()->setUiHidden( true ); + m_resultDefinition.uiCapability()->setUiTreeHidden( true ); m_resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_resultDefinition = new RimEclipseResultDefinition; m_resultDefinition->findField( "MResultType" )->uiCapability()->setUiName( "Facies Definiton" ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp index 2430fbbf95..6dae1565c6 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.cpp @@ -40,13 +40,14 @@ #include "RimEclipseCase.h" #include "RimEclipseResultDefinition.h" #include "RimEclipseView.h" +#include "RimExtractionConfiguration.h" #include "RimFaciesProperties.h" #include "RimFaultInView.h" #include "RimFaultInViewCollection.h" #include "RimModeledWellPath.h" #include "RimNonNetLayers.h" #include "RimOilField.h" -#include "RimPolylineTarget.h" +#include "RimPerforationCollection.h" #include "RimPressureTable.h" #include "RimProject.h" #include "RimStimPlanModelCalculator.h" @@ -55,7 +56,6 @@ #include "RimStimPlanModelTemplateCollection.h" #include "RimTextAnnotation.h" #include "RimTools.h" -#include "RimUserDefinedPolylinesAnnotation.h" #include "RimWellPath.h" #include "RimWellPathCollection.h" #include "RimWellPathGeometryDef.h" @@ -95,11 +95,16 @@ void caf::AppEnum::setUp() template <> void caf::AppEnum::setUp() { - addItem( RimStimPlanModel::FractureOrientation::ALONG_WELL_PATH, "ALONG_WELL_PATH", "Along Well Path" ); + addItem( RimStimPlanModel::FractureOrientation::ALONG_WELL_PATH, + "Longitudinal", + "Along Well Path", + QStringList( "ALONG_WELL_PATH" ) ); addItem( RimStimPlanModel::FractureOrientation::TRANSVERSE_WELL_PATH, - "TRANSVERSE_WELL_PATH", - "Transverse (normal) to Well Path" ); - addItem( RimStimPlanModel::FractureOrientation::AZIMUTH, "AZIMUTH", "Azimuth" ); + "Transverse", + "Transverse (normal) to Well Path", + QStringList( "TRANSVERSE_WELL_PATH" ) ); + + addItem( RimStimPlanModel::FractureOrientation::AZIMUTH, "Azimuth", "Azimuth", QStringList( "AZIMUTH" ) ); setDefault( RimStimPlanModel::FractureOrientation::TRANSVERSE_WELL_PATH ); } @@ -156,11 +161,19 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableField( &m_MD, "MeasuredDepth", 0.0, "Measured Depth", "", "", "" ); m_MD.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); - CAF_PDM_InitScriptableField( &m_extractionDepthTop, "ExtractionDepthTop", -1.0, "Top", "", "", "" ); + CAF_PDM_InitScriptableField( &m_extractionOffsetTop, "ExtractionOffsetTop", -1.0, "Top Offset", "", "", "" ); + m_extractionOffsetTop.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + + CAF_PDM_InitScriptableField( &m_extractionOffsetBottom, "ExtractionOffsetBottom", -1.0, "Bottom Offset", "", "", "" ); + m_extractionOffsetBottom.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + + CAF_PDM_InitScriptableField( &m_extractionDepthTop, "ExtractionDepthTop", -1.0, "Depth", "", "", "" ); m_extractionDepthTop.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + m_extractionDepthTop.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitScriptableField( &m_extractionDepthBottom, "ExtractionDepthBottom", -1.0, "Bottom", "", "", "" ); + CAF_PDM_InitScriptableField( &m_extractionDepthBottom, "ExtractionDepthBottom", -1.0, "Depth", "", "", "" ); m_extractionDepthBottom.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + m_extractionDepthBottom.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitScriptableField( &m_extractionType, "ExtractionType", @@ -172,9 +185,16 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableFieldNoDefault( &m_anchorPosition, "AnchorPosition", "Anchor Position", "", "", "" ); m_anchorPosition.uiCapability()->setUiReadOnly( true ); + m_anchorPosition.xmlCapability()->disableIO(); + + CAF_PDM_InitFieldNoDefault( &m_anchorPositionForUi, "AnchorPositionForUi", "Anchor Position", "", "", "" ); + m_anchorPositionForUi.registerGetMethod( this, &RimStimPlanModel::anchorPositionForUi ); + m_anchorPositionForUi.uiCapability()->setUiReadOnly( true ); + m_anchorPositionForUi.xmlCapability()->disableIO(); CAF_PDM_InitScriptableFieldNoDefault( &m_thicknessDirection, "ThicknessDirection", "Thickness Direction", "", "", "" ); m_thicknessDirection.uiCapability()->setUiReadOnly( true ); + m_thicknessDirection.xmlCapability()->disableIO(); CAF_PDM_InitScriptableFieldNoDefault( &m_thicknessDirectionWellPath, "ThicknessDirectionWellPath", @@ -237,7 +257,6 @@ RimStimPlanModel::RimStimPlanModel() CAF_PDM_InitScriptableField( &m_barrierFaultName, "BarrierFaultName", QString( "" ), "Barrier Fault", "", "", "" ); m_barrierFaultName.uiCapability()->setUiReadOnly( true ); - CAF_PDM_InitScriptableFieldNoDefault( &m_barrierAnnotation, "BarrierAnnotation", "Barrier Annotation", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_barrierTextAnnotation, "BarrierTextAnnotation", "Barrier Text Annotation", @@ -245,6 +264,8 @@ RimStimPlanModel::RimStimPlanModel() "", "" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_perforationInterval, "PerforationInterval", "Perforation Interval", "", "", "" ); + m_calculator = std::shared_ptr( new RimStimPlanModelCalculator ); m_calculator->setStimPlanModel( this ); @@ -309,16 +330,25 @@ void RimStimPlanModel::fieldChangedByUi( const caf::PdmFieldHandle* changedField if ( changedField == &m_MD ) { updatePositionFromMeasuredDepth(); + updateExtractionDepthBoundaries(); + } + + if ( changedField == &m_extractionOffsetTop || changedField == &m_extractionOffsetBottom ) + { + updateExtractionDepthBoundaries(); } if ( changedField == &m_MD || changedField == &m_extractionType || changedField == &m_boundingBoxVertical || changedField == &m_boundingBoxHorizontal || changedField == &m_fractureOrientation || changedField == &m_autoComputeBarrier || changedField == &m_azimuthAngle || changedField == &m_showOnlyBarrierFault || changedField == &m_eclipseCase || - changedField == &m_extractionDepthTop || changedField == &m_extractionDepthBottom ) + changedField == &m_extractionDepthTop || changedField == &m_extractionDepthBottom || + changedField == &m_extractionOffsetTop || changedField == &m_extractionOffsetBottom || + changedField == &m_perforationLength ) { updateThicknessDirection(); updateBarrierProperties(); + updatePerforationInterval(); } if ( changedField == &m_eclipseCase ) @@ -475,6 +505,14 @@ double RimStimPlanModel::endMD() const return m_MD(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStimPlanModel::applyOffset( double offsetMD ) +{ + // Nothing to do here, this operation is inteded for well path completions +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -483,6 +521,16 @@ cvf::Vec3d RimStimPlanModel::anchorPosition() const return m_anchorPosition(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RimStimPlanModel::anchorPositionForUi() const +{ + cvf::Vec3d v = m_anchorPosition; + v.z() = -v.z(); + return v; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -571,8 +619,14 @@ void RimStimPlanModel::updateExtractionDepthBoundaries() if ( eclipseCaseData ) { const cvf::BoundingBox& boundingBox = eclipseCaseData->mainGrid()->boundingBox(); - m_extractionDepthTop = -boundingBox.max().z(); - m_extractionDepthBottom = -boundingBox.min().z(); + + double depth = -m_anchorPosition().z(); + if ( m_extractionOffsetTop() < 0.0 ) m_extractionOffsetTop = boundingBox.extent().z(); + if ( m_extractionOffsetBottom() < 0.0 ) m_extractionOffsetBottom = boundingBox.extent().z(); + + m_extractionDepthTop = std::max( depth - m_extractionOffsetTop, -boundingBox.max().z() ); + m_extractionDepthBottom = std::min( depth + m_extractionOffsetBottom, -boundingBox.min().z() ); + updateConnectedEditors(); } } @@ -681,7 +735,7 @@ void RimStimPlanModel::updateDistanceToBarrierAndDip() .arg( barrierDip ) .arg( foundFault->name() ) ); QString barrierText = - QString( "Barrier Fault: %1\nDistance: %2m" ).arg( foundFault->name() ).arg( shortestDistance ); + QString( "Barrier Fault for %1\nFault: %2\nDistance: %3m" ).arg( name() ).arg( foundFault->name() ).arg( shortestDistance ); clearBarrierAnnotation(); addBarrierAnnotation( position, barrierPosition, barrierText ); @@ -707,23 +761,14 @@ void RimStimPlanModel::updateDistanceToBarrierAndDip() //-------------------------------------------------------------------------------------------------- void RimStimPlanModel::clearBarrierAnnotation() { - auto existingAnnotation = m_barrierAnnotation.value(); - if ( existingAnnotation ) - { - delete existingAnnotation; - m_barrierAnnotation = nullptr; - } + RimAnnotationCollectionBase* coll = annotationCollection(); auto existingTextAnnotation = m_barrierTextAnnotation.value(); - if ( existingTextAnnotation ) + if ( coll && existingTextAnnotation ) { + coll->removeAnnotation( existingTextAnnotation ); delete existingTextAnnotation; m_barrierTextAnnotation = nullptr; - } - - RimAnnotationCollectionBase* coll = annotationCollection(); - if ( coll ) - { coll->onAnnotationDeleted(); } } @@ -738,31 +783,14 @@ void RimStimPlanModel::addBarrierAnnotation( const cvf::Vec3d& startPosition, RimAnnotationCollectionBase* coll = annotationCollection(); if ( !coll ) return; - { - auto newAnnotation = new RimUserDefinedPolylinesAnnotation(); - - RimPolylineTarget* startTarget = new RimPolylineTarget(); - startTarget->setAsPointXYZ( startPosition ); - newAnnotation->insertTarget( nullptr, startTarget ); - - RimPolylineTarget* endTarget = new RimPolylineTarget(); - endTarget->setAsPointXYZ( endPosition ); - newAnnotation->insertTarget( nullptr, endTarget ); - - m_barrierAnnotation = newAnnotation; - dynamic_cast( coll )->addAnnotation( newAnnotation ); - } + auto newAnnotation = new RimTextAnnotation(); + newAnnotation->setText( text ); + newAnnotation->setLabelPoint( endPosition ); + newAnnotation->setAnchorPoint( startPosition ); - { - auto newAnnotation = new RimTextAnnotation(); - newAnnotation->setText( text ); - newAnnotation->setLabelPoint( endPosition ); - newAnnotation->setAnchorPoint( endPosition ); - - m_barrierTextAnnotation = newAnnotation; - coll->addAnnotation( newAnnotation ); - } + m_barrierTextAnnotation = newAnnotation; + coll->addAnnotation( newAnnotation ); coll->scheduleRedrawOfRelevantViews(); coll->updateConnectedEditors(); } @@ -777,13 +805,32 @@ RimAnnotationCollectionBase* RimStimPlanModel::annotationCollection() return oilField ? oilField->annotationCollection() : nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStimPlanModel::updatePerforationInterval() +{ + if ( m_thicknessDirectionWellPath ) + { + if ( !m_perforationInterval ) + { + m_perforationInterval = new RimPerforationInterval; + m_thicknessDirectionWellPath->perforationIntervalCollection()->appendPerforation( m_perforationInterval ); + } + + double closestMd = m_thicknessDirectionWellPath->wellPathGeometry()->closestMeasuredDepth( m_anchorPosition ); + m_perforationInterval->setStartAndEndMD( closestMd - perforationLength(), closestMd + perforationLength() ); + m_perforationInterval->updateConnectedEditors(); + updateViewsAndPlots(); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- void RimStimPlanModel::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { m_thicknessDirectionWellPath.uiCapability()->setUiHidden( true ); - m_barrierAnnotation.uiCapability()->setUiHidden( true ); m_barrierTextAnnotation.uiCapability()->setUiHidden( true ); m_azimuthAngle.uiCapability()->setUiHidden( m_fractureOrientation() != RimStimPlanModel::FractureOrientation::AZIMUTH ); @@ -800,12 +847,15 @@ void RimStimPlanModel::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderin uiOrdering.add( &m_MD ); uiOrdering.add( &m_extractionType ); - uiOrdering.add( &m_anchorPosition ); + uiOrdering.add( &m_anchorPositionForUi ); uiOrdering.add( &m_thicknessDirection ); caf::PdmUiOrdering* extractionBoundariesGroup = uiOrdering.addNewGroup( "Extraction Depth Boundaries" ); - extractionBoundariesGroup->add( &m_extractionDepthTop ); - extractionBoundariesGroup->add( &m_extractionDepthBottom ); + extractionBoundariesGroup->add( &m_extractionOffsetTop, caf::PdmUiOrdering::LayoutOptions( true, 3, 1 ) ); + extractionBoundariesGroup->add( &m_extractionDepthTop, { false, 2, 1 } ); + + extractionBoundariesGroup->add( &m_extractionOffsetBottom, caf::PdmUiOrdering::LayoutOptions( true, 3, 1 ) ); + extractionBoundariesGroup->add( &m_extractionDepthBottom, { false, 2, 1 } ); caf::PdmUiOrdering* boundingBoxGroup = uiOrdering.addNewGroup( "Bounding Box" ); boundingBoxGroup->add( &m_boundingBoxHorizontal ); @@ -913,6 +963,19 @@ void RimStimPlanModel::loadDataAndUpdate() { } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimStimPlanModel::resetAnchorPositionAndThicknessDirection() +{ + // Always recompute thickness direction as MD in project file might have been changed + updatePositionFromMeasuredDepth(); + updateExtractionDepthBoundaries(); + updateThicknessDirection(); + updatePerforationInterval(); + updateBarrierProperties(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1265,7 +1328,9 @@ void RimStimPlanModel::setMD( double md ) { m_MD = md; updatePositionFromMeasuredDepth(); + updateExtractionDepthBoundaries(); updateThicknessDirection(); + updatePerforationInterval(); updateBarrierProperties(); } @@ -1276,7 +1341,9 @@ void RimStimPlanModel::setEclipseCaseAndTimeStep( RimEclipseCase* eclipseCase, i { setEclipseCase( eclipseCase ); setTimeStep( timeStep ); + updateExtractionDepthBoundaries(); updateThicknessDirection(); + updatePerforationInterval(); updateBarrierProperties(); updateViewsAndPlots(); updateConnectedEditors(); @@ -1345,7 +1412,8 @@ bool RimStimPlanModel::useStaticEclipseCase( RiaDefines::CurveProperty curveProp //-------------------------------------------------------------------------------------------------- RimEclipseCase* RimStimPlanModel::eclipseCaseForProperty( RiaDefines::CurveProperty curveProperty ) const { - if ( m_initialPressureEclipseCase && curveProperty == RiaDefines::CurveProperty::INITIAL_PRESSURE ) + if ( m_initialPressureEclipseCase && ( curveProperty == RiaDefines::CurveProperty::INITIAL_PRESSURE || + curveProperty == RiaDefines::CurveProperty::EQLNUM ) ) { return m_initialPressureEclipseCase; } @@ -1481,8 +1549,8 @@ void RimStimPlanModel::stimPlanModelTemplateChanged( const caf::SignalEmitter* e m_initialPressureEclipseCase = m_stimPlanModelTemplate()->initialPressureEclipseCase(); m_staticEclipseCase = m_stimPlanModelTemplate()->staticEclipseCase(); updateExtractionDepthBoundaries(); - updateThicknessDirection(); + updatePerforationInterval(); updateBarrierProperties(); } @@ -1701,3 +1769,74 @@ QString RimStimPlanModel::pressureDate() const else return QString(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::deque + RimStimPlanModel::extractionConfigurations( RiaDefines::CurveProperty curveProperty ) const +{ + if ( curveProperty == RiaDefines::CurveProperty::EQLNUM ) + { + return { + RimExtractionConfiguration( "EQLNUM_1", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::INITIAL_PRESSURE_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::INITIAL_PRESSURE_CASE ), + RimExtractionConfiguration( "EQLNUM_1", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE ), + RimExtractionConfiguration( "EQLNUM_1", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::STATIC_NATIVE, + RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::STATIC_NATIVE, + RimExtractionConfiguration::EclipseCaseType::INITIAL_PRESSURE_CASE ), + RimExtractionConfiguration( "EQLNUM", + RiaDefines::ResultCatType::STATIC_NATIVE, + RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE ), + + }; + } + else if ( curveProperty == RiaDefines::CurveProperty::POROSITY || + curveProperty == RiaDefines::CurveProperty::POROSITY_UNSCALED || + curveProperty == RiaDefines::CurveProperty::PERMEABILITY_X || + curveProperty == RiaDefines::CurveProperty::PERMEABILITY_Z ) + { + QString resultName = eclipseResultVariable( curveProperty ); + return { + RimExtractionConfiguration( QString( "%1_1" ).arg( resultName ), + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ), + RimExtractionConfiguration( resultName, + RiaDefines::ResultCatType::INPUT_PROPERTY, + RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ), + RimExtractionConfiguration( resultName, + RiaDefines::ResultCatType::STATIC_NATIVE, + RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE ), + }; + } + + return std::deque(); +} + +RimEclipseCase* RimStimPlanModel::eclipseCaseForType( RimExtractionConfiguration::EclipseCaseType caseType ) const +{ + if ( caseType == RimExtractionConfiguration::EclipseCaseType::STATIC_CASE ) return m_staticEclipseCase; + if ( caseType == RimExtractionConfiguration::EclipseCaseType::DYNAMIC_CASE ) return m_eclipseCase; + if ( caseType == RimExtractionConfiguration::EclipseCaseType::INITIAL_PRESSURE_CASE ) + return m_initialPressureEclipseCase; + + return nullptr; +} diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.h index 7dc7093f8c..7f43e741a1 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModel.h @@ -21,6 +21,8 @@ #include "RiaStimPlanModelDefines.h" #include "RimCheckableNamedObject.h" +#include "RimExtractionConfiguration.h" +#include "RimPerforationInterval.h" #include "RimWellPathComponentInterface.h" #include "RigWellLogExtractor.h" @@ -145,11 +147,14 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo cvf::Color3f defaultComponentColor() const override; double startMD() const override; double endMD() const override; - bool isEnabled() const override; + void applyOffset( double offsetMD ) override; + + bool isEnabled() const override; RimWellPath* wellPath() const; void loadDataAndUpdate(); + void resetAnchorPositionAndThicknessDirection(); RimModeledWellPath* thicknessDirectionWellPath() const; void setThicknessDirectionWellPath( RimModeledWellPath* thicknessDirectionWellPath ); @@ -176,6 +181,9 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo RiaDefines::ResultCatType eclipseResultCategory( RiaDefines::CurveProperty curveProperty ) const; QString eclipseResultVariable( RiaDefines::CurveProperty curveProperty ) const; + std::deque extractionConfigurations( RiaDefines::CurveProperty curveProperty ) const; + RimEclipseCase* eclipseCaseForType( RimExtractionConfiguration::EclipseCaseType ) const; + static double findFaciesValue( const RimColorLegend& colorLegend, const QString& name ); bool isScaledByNetToGross( RiaDefines::CurveProperty curveProperty ) const; @@ -196,6 +204,7 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo void updateThicknessDirection(); void updateDistanceToBarrierAndDip(); void updateThicknessDirectionWellPathName(); + void updatePerforationInterval(); RigEclipseCaseData* getEclipseCaseData() const; @@ -215,6 +224,8 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo static bool useStaticEclipseCase( RiaDefines::CurveProperty curveProperty ); + cvf::Vec3d anchorPositionForUi() const; + protected: caf::PdmField m_MD; caf::PdmPtrField m_eclipseCase; @@ -222,9 +233,12 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo caf::PdmPtrField m_initialPressureEclipseCase; caf::PdmPtrField m_staticEclipseCase; caf::PdmField> m_extractionType; + caf::PdmField m_extractionOffsetTop; + caf::PdmField m_extractionOffsetBottom; caf::PdmField m_extractionDepthTop; caf::PdmField m_extractionDepthBottom; caf::PdmField m_anchorPosition; + caf::PdmProxyValueField m_anchorPositionForUi; caf::PdmField m_thicknessDirection; caf::PdmField m_boundingBoxVertical; caf::PdmField m_boundingBoxHorizontal; @@ -241,17 +255,17 @@ class RimStimPlanModel : public RimCheckableNamedObject, public RimWellPathCompo caf::PdmField m_azimuthAngle; caf::PdmField m_perforationLength; - caf::PdmField m_formationDip; - caf::PdmField m_autoComputeBarrier; - caf::PdmField m_hasBarrier; - caf::PdmField m_distanceToBarrier; - caf::PdmField m_barrierDip; - caf::PdmField m_wellPenetrationLayer; - caf::PdmPtrField m_barrierAnnotation; - caf::PdmPtrField m_barrierTextAnnotation; - caf::PdmField m_barrierFaultName; - caf::PdmField m_showOnlyBarrierFault; - caf::PdmField m_showAllFaults; + caf::PdmField m_formationDip; + caf::PdmField m_autoComputeBarrier; + caf::PdmField m_hasBarrier; + caf::PdmField m_distanceToBarrier; + caf::PdmField m_barrierDip; + caf::PdmField m_wellPenetrationLayer; + caf::PdmPtrField m_barrierTextAnnotation; + caf::PdmField m_barrierFaultName; + caf::PdmField m_showOnlyBarrierFault; + caf::PdmField m_showAllFaults; + caf::PdmPtrField m_perforationInterval; std::shared_ptr m_calculator; }; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.cpp index 7b8ef268af..351f256506 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.cpp @@ -24,7 +24,10 @@ #include "RigEclipseCaseData.h" +#include "RimColorLegend.h" +#include "RimEclipseCase.h" #include "RimEclipseResultDefinition.h" +#include "RimFaciesProperties.h" #include "RimStimPlanModel.h" #include "RimStimPlanModelCalculator.h" #include "RimStimPlanModelElasticPropertyCalculator.h" @@ -32,7 +35,9 @@ #include "RimStimPlanModelPressureCalculator.h" #include "RimStimPlanModelPropertyCalculator.h" #include "RimStimPlanModelStressCalculator.h" +#include "RimStimPlanModelTemplate.h" #include "RimStimPlanModelWellLogCalculator.h" +#include "RimWellLogTrack.h" #include @@ -707,6 +712,66 @@ double RimStimPlanModelCalculator::calculateStressAtDepth( double depth, return stress; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair, std::vector> RimStimPlanModelCalculator::calculateFacies() const +{ + std::vector values = findCurveAndComputeTopOfLayer( RiaDefines::CurveProperty::FACIES ); + std::vector faciesNames; + + RimStimPlanModelTemplate* stimPlanModelTemplate = m_stimPlanModel->stimPlanModelTemplate(); + if ( !stimPlanModelTemplate ) + { + RiaLogging::error( QString( "No fracture model template found" ) ); + return std::make_pair( values, faciesNames ); + } + + RimFaciesProperties* faciesProperties = stimPlanModelTemplate->faciesProperties(); + if ( !faciesProperties ) + { + RiaLogging::error( QString( "No facies properties found when extracting elastic properties." ) ); + return std::make_pair( values, faciesNames ); + } + + RimColorLegend* colorLegend = faciesProperties->colorLegend(); + if ( !colorLegend ) + { + RiaLogging::error( QString( "No color legend found when extracting elastic properties." ) ); + return std::make_pair( values, faciesNames ); + } + + for ( auto value : values ) + { + faciesNames.push_back( RimStimPlanModelElasticPropertyCalculator::findFaciesName( *colorLegend, value ) ); + } + + return std::make_pair( values, faciesNames ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair, std::vector> RimStimPlanModelCalculator::calculateFormation() const +{ + std::vector values = findCurveAndComputeTopOfLayer( RiaDefines::CurveProperty::FORMATIONS ); + + RimEclipseCase* eclipseCase = m_stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::FACIES ); + std::vector formationNamesVector = RimWellLogTrack::formationNamesVector( eclipseCase ); + + std::vector formationNames; + for ( auto value : values ) + { + int idx = static_cast( value ); + if ( idx < static_cast( formationNamesVector.size() ) ) + formationNames.push_back( formationNamesVector[idx] ); + else + formationNames.push_back( "_" ); + } + + return std::make_pair( values, formationNames ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.h index 73577965c8..2fb9656783 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCalculator.h @@ -65,6 +65,9 @@ class RimStimPlanModelCalculator std::vector calculatePoroElasticConstant() const; std::vector calculateThermalExpansionCoefficient() const; + std::pair, std::vector> calculateFacies() const; + std::pair, std::vector> calculateFormation() const; + void calculateTemperature( std::vector& temperatures ) const; void clearCache(); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCollection.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCollection.cpp index 34064f743b..e45625c461 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCollection.cpp @@ -35,7 +35,7 @@ RimStimPlanModelCollection::RimStimPlanModelCollection( void ) CAF_PDM_InitScriptableObject( "StimPlan Models", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_stimPlanModels, "StimPlanModels", "", "", "", "" ); - m_stimPlanModels.uiCapability()->setUiHidden( true ); + m_stimPlanModels.uiCapability()->setUiTreeHidden( true ); setName( "StimPlan Models" ); nameField()->uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp index a2f539bab6..e73891f001 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.cpp @@ -76,14 +76,6 @@ void RimStimPlanModelCurve::setStimPlanModel( RimStimPlanModel* stimPlanModel ) m_wellPath = stimPlanModel->thicknessDirectionWellPath(); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimStimPlanModelCurve::setEclipseResultCategory( RiaDefines::ResultCatType catType ) -{ - m_eclipseResultDefinition->setResultType( catType ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -176,7 +168,7 @@ void RimStimPlanModelCurve::performDataExtraction( bool* isUsingPseudoLength ) QString RimStimPlanModelCurve::createCurveAutoName() { QString textWithLineFeed = caf::AppEnum::uiText( m_curveProperty() ).trimmed(); - if ( m_curveProperty == RiaDefines::CurveProperty::PRESSURE ) + if ( m_curveProperty == RiaDefines::CurveProperty::PRESSURE || m_curveProperty == RiaDefines::CurveProperty::STRESS ) { // Append date for pressure QString pressureDate = m_stimPlanModel->pressureDate(); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.h index 5d07681e64..85eb4f0c24 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelCurve.h @@ -41,8 +41,6 @@ class RimStimPlanModelCurve : public RimWellLogExtractionCurve, public RimStimPl void setStimPlanModel( RimStimPlanModel* stimPlanModel ); - void setEclipseResultCategory( RiaDefines::ResultCatType catType ); - void setCurveProperty( RiaDefines::CurveProperty ) override; RiaDefines::CurveProperty curveProperty() const override; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp index 146cabb969..1d20513675 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.cpp @@ -164,21 +164,25 @@ bool RimStimPlanModelElasticPropertyCalculator::calculate( RiaDefines::CurveProp RimElasticProperties* elasticProperties = stimPlanModelTemplate->elasticProperties(); if ( !elasticProperties ) { - RiaLogging::error( QString( "No elastic properties found" ) ); + RiaLogging::error( QString( "No elastic properties found weh extracting elastic properties." ) ); return false; } std::vector faciesValues = m_stimPlanModelCalculator->extractValues( RiaDefines::CurveProperty::FACIES, timeStep ); - if ( faciesValues.empty() ) { - RiaLogging::error( QString( "No facies values found." ) ); + RiaLogging::error( QString( "No facies values found when extracting elastic properties." ) ); return false; } std::vector poroValues = m_stimPlanModelCalculator->extractValues( RiaDefines::CurveProperty::POROSITY_UNSCALED, timeStep ); + if ( poroValues.empty() ) + { + RiaLogging::error( QString( "No porosity values found when extracting elastic properties." ) ); + return false; + } double overburdenHeight = stimPlanModel->overburdenHeight(); if ( overburdenHeight > 0.0 ) diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.h index 91b0ccbb4c..c49231a485 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelElasticPropertyCalculator.h @@ -44,6 +44,8 @@ class RimStimPlanModelElasticPropertyCalculator : public RimStimPlanModelPropert bool isMatching( RiaDefines::CurveProperty curveProperty ) const override; + static QString findFaciesName( const RimColorLegend& colorLegend, double value ); + protected: static void addOverburden( std::vector& formationNames, std::vector& formationValues, @@ -59,8 +61,6 @@ class RimStimPlanModelElasticPropertyCalculator : public RimStimPlanModelPropert double underburdenHeight, const QString& formationName ); - static QString findFaciesName( const RimColorLegend& colorLegend, double value ); - private: RimStimPlanModelCalculator* m_stimPlanModelCalculator; }; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp index 30fa66bb94..fa81f7f4ce 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelLayerCalculator.cpp @@ -54,7 +54,7 @@ RimStimPlanModelLayerCalculator::RimStimPlanModelLayerCalculator( RimStimPlanMod //-------------------------------------------------------------------------------------------------- bool RimStimPlanModelLayerCalculator::isMatching( RiaDefines::CurveProperty curveProperty ) const { - return curveProperty == RiaDefines::CurveProperty::LAYERS; + return ( curveProperty == RiaDefines::CurveProperty::LAYERS || curveProperty == RiaDefines::CurveProperty::FORMATIONS ); } //-------------------------------------------------------------------------------------------------- @@ -165,7 +165,16 @@ bool RimStimPlanModelLayerCalculator::calculate( RiaDefines::CurveProperty curve layerNo++; } - values[i] = layerNo; + if ( curveProperty == RiaDefines::CurveProperty::LAYERS ) + { + values[i] = layerNo; + } + else + { + CAF_ASSERT( curveProperty == RiaDefines::CurveProperty::FORMATIONS ); + values[i] = curveData.data[i]; + } + previousFormation = curveData.data[i]; previousFacies = faciesValues[i]; if ( useNetToGross ) diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp index 6545473202..8dd6551cef 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlot.cpp @@ -109,7 +109,7 @@ QList { QList options; - if ( fieldNeedingOptions == &m_stimPlanModel ) + if ( fieldNeedingOptions == &m_stimPlanModel && m_stimPlanModel ) { // The user is not allowed to change this field, but option box looks good options.push_back( caf::PdmOptionItemInfo( m_stimPlanModel->name(), m_stimPlanModel ) ); @@ -161,28 +161,6 @@ void RimStimPlanModelPlot::onLoadDataAndUpdate() m_eclipseCase = stimPlanModel()->eclipseCaseForProperty( RiaDefines::CurveProperty::UNDEFINED ); m_timeStep = stimPlanModel()->timeStep(); updateConnectedEditors(); - - // Enable and disable detailed fluid loss curves - std::vector fluidLossCurves = { RiaDefines::CurveProperty::PORO_ELASTIC_CONSTANT, - RiaDefines::CurveProperty::RELATIVE_PERMEABILITY_FACTOR, - RiaDefines::CurveProperty::THERMAL_EXPANSION_COEFFICIENT, - RiaDefines::CurveProperty::IMMOBILE_FLUID_SATURATION }; - - bool detailedFluidLoss = stimPlanModel()->useDetailedFluidLoss(); - - for ( auto curveProperty : fluidLossCurves ) - { - RimWellLogExtractionCurve* curve = findCurveByProperty( curveProperty ); - if ( curve ) - { - RimWellLogTrack* track = nullptr; - curve->firstAncestorOfType( track ); - if ( track ) - { - track->setShowWindow( detailedFluidLoss ); - } - } - } } RimDepthTrackPlot::onLoadDataAndUpdate(); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlotCollection.cpp index 8d1e30b592..ed7db855b1 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPlotCollection.cpp @@ -33,7 +33,7 @@ RimStimPlanModelPlotCollection::RimStimPlanModelPlotCollection() CAF_PDM_InitScriptableObject( "StimPlan Model Plots", ":/WellLogPlots16x16.png", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_stimPlanModelPlots, "StimPlanModelPlots", "", "", "", "" ); - m_stimPlanModelPlots.uiCapability()->setUiHidden( true ); + m_stimPlanModelPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.cpp index ee344484d6..eb7b7c3073 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.cpp @@ -39,6 +39,7 @@ #include "RimStimPlanModelCalculator.h" #include "RimStimPlanModelTemplate.h" #include "RimStimPlanModelWellLogCalculator.h" +#include "cafAssert.h" #include @@ -160,13 +161,18 @@ bool RimStimPlanModelPressureCalculator::extractValuesForProperty( RiaDefines::C else { // Extract the property we care about - RimStimPlanModelWellLogCalculator::extractValuesForProperty( pressureCurveProperty, - stimPlanModel, - timeStep, - values, - measuredDepthValues, - tvDepthValues, - rkbDiff ); + if ( !RimStimPlanModelWellLogCalculator::extractValuesForProperty( pressureCurveProperty, + stimPlanModel, + timeStep, + values, + measuredDepthValues, + tvDepthValues, + rkbDiff ) ) + { + RiaLogging::error( QString( "Unable to extract pressure values for property: %1" ) + .arg( caf::AppEnum( curveProperty ).uiText() ) ); + return false; + } } if ( targetTvds.size() != tvDepthValues.size() ) @@ -177,6 +183,7 @@ bool RimStimPlanModelPressureCalculator::extractValuesForProperty( RiaDefines::C values = results; } + bool useEqlnumForPressureInterpolation = stimPlanModel->stimPlanModelTemplate()->useEqlnumForPressureInterpolation(); if ( curveProperty == RiaDefines::CurveProperty::INITIAL_PRESSURE ) { auto hasMissingValues = []( const std::vector& vec ) { @@ -185,12 +192,12 @@ bool RimStimPlanModelPressureCalculator::extractValuesForProperty( RiaDefines::C if ( hasMissingValues( values ) ) { - if ( !interpolateInitialPressureByEquilibrationRegion( curveProperty, - stimPlanModel, - timeStep, - measuredDepthValues, - tvDepthValues, - values ) ) + if ( useEqlnumForPressureInterpolation && !interpolateInitialPressureByEquilibrationRegion( curveProperty, + stimPlanModel, + timeStep, + measuredDepthValues, + tvDepthValues, + values ) ) { RiaLogging::error( "Pressure interpolation by equilibration region failed." ); } @@ -204,7 +211,8 @@ bool RimStimPlanModelPressureCalculator::extractValuesForProperty( RiaDefines::C { std::vector initialPressureValues = values; values.clear(); - if ( !interpolatePressureDifferenceByEquilibrationRegion( curveProperty, + if ( useEqlnumForPressureInterpolation && + !interpolatePressureDifferenceByEquilibrationRegion( curveProperty, stimPlanModel, timeStep, measuredDepthValues, @@ -287,8 +295,11 @@ std::tuple, std::vector, std::vector> } else { - // The last point is added without interpolation - value = sourceValues.back(); + if ( !sourceValues.empty() ) + { + // The last point is added without interpolation + value = sourceValues.back(); + } } interpolatedValues.push_back( value ); @@ -448,49 +459,70 @@ bool RimStimPlanModelPressureCalculator::buildPressureTablesPerEqlNum( const Rim EqlNumToDepthValuePairMap& valuesPerEqlNum, const std::set& presentEqlNums ) { - RimEclipseCase* eclipseCase = stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::EQLNUM ); + int gridIndex = 0; + RimEclipseCase* eqlNumEclipseCase = stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::EQLNUM ); + CAF_ASSERT( eqlNumEclipseCase != nullptr ); - // TODO: too naive?? - int gridIndex = 0; - const RigGridBase* grid = eclipseCase->mainGrid()->gridByIndex( gridIndex ); + const RigGridBase* eqlNumGrid = eqlNumEclipseCase->mainGrid()->gridByIndex( gridIndex ); + CAF_ASSERT( eqlNumGrid != nullptr ); - RigEclipseCaseData* caseData = eclipseCase->eclipseCaseData(); + RigEclipseCaseData* eqlNumCaseData = eqlNumEclipseCase->eclipseCaseData(); + CAF_ASSERT( eqlNumCaseData != nullptr ); RiaDefines::PorosityModelType porosityModel = RiaDefines::PorosityModelType::MATRIX_MODEL; const std::vector& eqlNumValues = - RimStimPlanModelWellLogCalculator::loadResults( caseData, + RimStimPlanModelWellLogCalculator::loadResults( eqlNumCaseData, porosityModel, RiaDefines::ResultCatType::STATIC_NATIVE, "EQLNUM" ); + + RimEclipseCase* pressureEclipseCase = + stimPlanModel->eclipseCaseForProperty( RiaDefines::CurveProperty::INITIAL_PRESSURE ); + CAF_ASSERT( pressureEclipseCase != nullptr ); + + const RigGridBase* pressureGrid = pressureEclipseCase->mainGrid()->gridByIndex( gridIndex ); + CAF_ASSERT( pressureGrid ); + + RigEclipseCaseData* pressureCaseData = pressureEclipseCase->eclipseCaseData(); + CAF_ASSERT( pressureCaseData ); + const std::vector& pressureValues = - RimStimPlanModelWellLogCalculator::loadResults( caseData, + RimStimPlanModelWellLogCalculator::loadResults( pressureCaseData, porosityModel, RiaDefines::ResultCatType::DYNAMIC_NATIVE, "PRESSURE" ); - if ( eqlNumValues.size() != pressureValues.size() ) - { - RiaLogging::error( "Unexpected result size for EQLNUM and PRESSURE found for pressure calculation." ); - return false; - } + auto eqlNumActiveCellInfo = eqlNumCaseData->activeCellInfo( porosityModel ); + size_t eqlNumCellCount = eqlNumActiveCellInfo->reservoirCellCount(); - auto activeCellInfo = caseData->activeCellInfo( porosityModel ); - size_t cellCount = activeCellInfo->reservoirActiveCellCount(); + auto pressureActiveCellInfo = pressureCaseData->activeCellInfo( porosityModel ); - if ( cellCount != pressureValues.size() ) + if ( eqlNumGrid->cellCountI() != pressureGrid->cellCountI() || + eqlNumGrid->cellCountJ() != pressureGrid->cellCountJ() || eqlNumGrid->cellCountK() != pressureGrid->cellCountK() ) { - RiaLogging::error( "Unexpected number of active cells in pressure calculation." ); + RiaLogging::error( "Unexpected number of cells when building pressure per EQLNUM table. " ); + RiaLogging::error( "Grid needs to have identical geometry." ); + RiaLogging::error( QString( "EQLNUM grid dimensions: [ %1, %2, %3]" ) + .arg( eqlNumGrid->cellCountI() ) + .arg( eqlNumGrid->cellCountJ() ) + .arg( eqlNumGrid->cellCountK() ) ); + + RiaLogging::error( QString( "PRESSURE grid dimensions: [ %1, %2, %3]" ) + .arg( pressureGrid->cellCountI() ) + .arg( pressureGrid->cellCountJ() ) + .arg( pressureGrid->cellCountK() ) ); return false; } - for ( size_t cellIndex = 0; cellIndex < cellCount; cellIndex++ ) + for ( size_t cellIndex = 0; cellIndex < eqlNumCellCount; cellIndex++ ) { - size_t resultIdx = activeCellInfo->cellResultIndex( cellIndex ); - int eqlNum = static_cast( eqlNumValues[resultIdx] ); - double pressure = pressureValues[resultIdx]; + size_t resultIdx = eqlNumActiveCellInfo->cellResultIndex( cellIndex ); + int eqlNum = static_cast( eqlNumValues[resultIdx] ); + size_t pressureResultIdx = pressureActiveCellInfo->cellResultIndex( cellIndex ); + double pressure = pressureValues[pressureResultIdx]; if ( presentEqlNums.count( eqlNum ) > 0 && !std::isinf( pressure ) ) { - cvf::Vec3d center = grid->cell( cellIndex ).center(); + cvf::Vec3d center = eqlNumGrid->cell( cellIndex ).center(); valuesPerEqlNum[eqlNum].push_back( std::make_pair( -center.z(), pressure ) ); } } @@ -590,7 +622,14 @@ bool RimStimPlanModelPressureCalculator::interpolateInitialPressureByEquilibrati } // EQLNUM data has values for over/underburden, but the pressure values does not. - CAF_ASSERT( eqlNumValues.size() == ( values.size() + 4 ) ); + if ( eqlNumValues.size() != ( values.size() + 4 ) ) + { + RiaLogging::error( + QString( "Failed to build EQLNUM pressure data for initial pressure: result length mismatch." ) ); + RiaLogging::error( + QString( "EQLNUM length: %1 PRESSURE length: %2" ).arg( eqlNumValues.size() ).arg( values.size() ) ); + return false; + } size_t overburdenOffset = 2; for ( size_t i = 0; i < values.size(); i++ ) @@ -654,7 +693,13 @@ bool RimStimPlanModelPressureCalculator::interpolatePressureDifferenceByEquilibr values.resize( initialPressureValues.size(), std::numeric_limits::infinity() ); // EQLNUM data has values for over/underburden, but the pressure values does not. - CAF_ASSERT( eqlNumValues.size() == ( values.size() + 4 ) ); + if ( eqlNumValues.size() != ( values.size() + 4 ) ) + { + RiaLogging::error( QString( "Failed to build EQLNUM pressure data: result length mismatch." ) ); + RiaLogging::error( + QString( "EQLNUM length: %1 PRESSURE length: %2" ).arg( eqlNumValues.size() ).arg( values.size() ) ); + return false; + } size_t overburdenOffset = 2; for ( size_t i = 0; i < values.size(); i++ ) @@ -723,8 +768,12 @@ bool RimStimPlanModelPressureCalculator::handleFaciesWithInitialPressure( const return false; } - CAF_ASSERT( faciesValues.size() == initialPressureValues.size() ); - CAF_ASSERT( faciesValues.size() == values.size() ); + if ( faciesValues.size() != initialPressureValues.size() || faciesValues.size() != values.size() ) + { + RiaLogging::error( "Unable to handle facies with initial pressure: result length mismatch" ); + return false; + } + for ( size_t i = 0; i < faciesValues.size(); i++ ) { // Use the values from initial pressure curve diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.h index b18a79ee39..25f71d3d25 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelPressureCalculator.h @@ -45,6 +45,12 @@ class RimStimPlanModelPressureCalculator : public RimStimPlanModelWellLogCalcula static double pressureDifferenceInterpolationOffset(); + static std::tuple, std::vector, std::vector> + interpolateMissingValues( const std::vector& staticTvDepthValues, + const std::vector& staticMeasuredDepthValues, + const std::vector& measuredDepthValues, + const std::vector& values ); + protected: bool extractValuesForProperty( RiaDefines::CurveProperty curveProperty, const RimStimPlanModel* stimPlanModel, @@ -78,12 +84,6 @@ class RimStimPlanModelPressureCalculator : public RimStimPlanModelWellLogCalcula const std::vector& faciesValues, std::vector& values ) const; - static std::tuple, std::vector, std::vector> - interpolateMissingValues( const std::vector& staticTvDepthValues, - const std::vector& staticMeasuredDepthValues, - const std::vector& measuredDepthValues, - const std::vector& values ); - typedef std::pair DepthValuePair; typedef std::vector DepthValuePairVector; typedef std::map EqlNumToDepthValuePairMap; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.cpp index db77d61e6d..31ef5343b6 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.cpp @@ -95,6 +95,14 @@ RimStimPlanModelTemplate::RimStimPlanModelTemplate() CAF_PDM_InitScriptableFieldNoDefault( &m_staticEclipseCase, "StaticEclipseCase", "Static Case", "", "", "" ); + CAF_PDM_InitField( &m_useEqlnumForPressureInterpolation, + "UseEqlNumForPressureInterpolation", + true, + "Use EQLNUM For Pressure Interpolation", + "", + "", + "" ); + CAF_PDM_InitScriptableField( &m_defaultPorosity, "DefaultPorosity", RiaDefines::defaultPorosity(), @@ -194,20 +202,16 @@ RimStimPlanModelTemplate::RimStimPlanModelTemplate() m_faciesInitialPressureConfigs.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitScriptableFieldNoDefault( &m_pressureTable, "PressureTable", "Pressure Table", "", "", "" ); - m_pressureTable.uiCapability()->setUiHidden( true ); m_pressureTable.uiCapability()->setUiTreeHidden( true ); setPressureTable( new RimPressureTable ); CAF_PDM_InitScriptableFieldNoDefault( &m_elasticProperties, "ElasticProperties", "Elastic Properties", "", "", "" ); - m_elasticProperties.uiCapability()->setUiHidden( true ); m_elasticProperties.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitScriptableFieldNoDefault( &m_faciesProperties, "FaciesProperties", "Facies Properties", "", "", "" ); - m_faciesProperties.uiCapability()->setUiHidden( true ); m_faciesProperties.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitScriptableFieldNoDefault( &m_nonNetLayers, "NonNetLayers", "Non-Net Layers", "", "", "" ); - m_nonNetLayers.uiCapability()->setUiHidden( true ); m_nonNetLayers.uiCapability()->setUiTreeHidden( true ); setNonNetLayers( new RimNonNetLayers ); @@ -312,6 +316,7 @@ void RimStimPlanModelTemplate::defineUiOrdering( QString uiConfigName, caf::PdmU pressureDataSourceGroup->add( &m_useTableForInitialPressure, { true, 2, 1 } ); pressureDataSourceGroup->add( &m_editPressureTable, { false, 1, 0 } ); pressureDataSourceGroup->add( &m_useTableForPressure ); + pressureDataSourceGroup->add( &m_useEqlnumForPressureInterpolation ); m_initialPressureEclipseCase.uiCapability()->setUiReadOnly( m_useTableForInitialPressure() ); caf::PdmUiOrdering* defaultsGroup = uiOrdering.addNewGroup( "Defaults" ); @@ -912,3 +917,11 @@ bool RimStimPlanModelTemplate::usePressureTableForProperty( RiaDefines::CurvePro else return false; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimStimPlanModelTemplate::useEqlnumForPressureInterpolation() const +{ + return m_useEqlnumForPressureInterpolation; +} diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.h index 6190efb451..250947215a 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplate.h @@ -118,6 +118,8 @@ class RimStimPlanModelTemplate : public RimNamedObject bool usePressureTableForProperty( RiaDefines::CurveProperty curveProperty ) const; + bool useEqlnumForPressureInterpolation() const; + protected: void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; @@ -148,6 +150,7 @@ class RimStimPlanModelTemplate : public RimNamedObject caf::PdmPtrField m_initialPressureEclipseCase; caf::PdmField m_useTableForInitialPressure; caf::PdmField m_useTableForPressure; + caf::PdmField m_useEqlnumForPressureInterpolation; caf::PdmField m_editPressureTable; caf::PdmPtrField m_staticEclipseCase; caf::PdmField m_defaultPorosity; diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplateCollection.cpp index 7661c93f3e..b2d24160aa 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelTemplateCollection.cpp @@ -44,7 +44,7 @@ RimStimPlanModelTemplateCollection::RimStimPlanModelTemplateCollection() "", "", "" ); - m_stimPlanModelTemplates.uiCapability()->setUiHidden( true ); + m_stimPlanModelTemplates.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_nextValidId, "NextValidId", 0, "", "", "", "" ); m_nextValidId.uiCapability()->setUiHidden( true ); diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp index a129ef5b84..d7171dcf95 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.cpp @@ -24,6 +24,7 @@ #include "RigActiveCellInfo.h" #include "RigEclipseCaseData.h" +#include "RigEclipseResultAddress.h" #include "RigEclipseWellLogExtractor.h" #include "RigMainGrid.h" #include "RigResultAccessor.h" @@ -36,10 +37,12 @@ #include "RimEclipseInputProperty.h" #include "RimEclipseInputPropertyCollection.h" #include "RimEclipseResultDefinition.h" +#include "RimExtractionConfiguration.h" #include "RimModeledWellPath.h" #include "RimNonNetLayers.h" #include "RimStimPlanModel.h" #include "RimStimPlanModelCalculator.h" +#include "RimStimPlanModelPressureCalculator.h" #include "RimStimPlanModelTemplate.h" #include "RimWellPath.h" @@ -80,23 +83,51 @@ bool RimStimPlanModelWellLogCalculator::calculate( RiaDefines::CurveProperty cur std::vector& tvDepthValues, double& rkbDiff ) const { + RiaLogging::debug( + QString( "Calculating well log for '%1'." ).arg( caf::AppEnum( curveProperty ).uiText() ) ); + + std::deque extractionConfigurations = + stimPlanModel->extractionConfigurations( curveProperty ); + std::deque missingValueStratgies = stimPlanModel->missingValueStrategies( curveProperty ); - if ( !extractValuesForProperty( curveProperty, stimPlanModel, timeStep, values, measuredDepthValues, tvDepthValues, rkbDiff ) ) + if ( extractionConfigurations.empty() ) { - if ( std::find( missingValueStratgies.begin(), - missingValueStratgies.end(), - RimStimPlanModel::MissingValueStrategy::DEFAULT_VALUE ) != missingValueStratgies.end() ) + if ( !extractValuesForProperty( curveProperty, stimPlanModel, timeStep, values, measuredDepthValues, tvDepthValues, rkbDiff ) ) { - RiaLogging::warning( QString( "Extraction failed. Trying fallback" ) ); - if ( !replaceMissingValuesWithDefault( curveProperty, stimPlanModel, values, measuredDepthValues, tvDepthValues, rkbDiff ) ) + if ( std::find( missingValueStratgies.begin(), + missingValueStratgies.end(), + RimStimPlanModel::MissingValueStrategy::DEFAULT_VALUE ) != missingValueStratgies.end() ) { - RiaLogging::error( "Fallback failed too." ); - return false; + RiaLogging::warning( QString( "Extraction failed. Trying fallback" ) ); + if ( !replaceMissingValuesWithDefault( curveProperty, + stimPlanModel, + values, + measuredDepthValues, + tvDepthValues, + rkbDiff ) ) + { + RiaLogging::error( "Fallback failed too." ); + return false; + } } } } + else + { + if ( !extractValuesForPropertyWithConfigurations( curveProperty, + stimPlanModel, + timeStep, + values, + measuredDepthValues, + tvDepthValues, + rkbDiff ) ) + + { + return false; + } + } double overburdenHeight = stimPlanModel->overburdenHeight(); if ( overburdenHeight > 0.0 ) @@ -173,6 +204,39 @@ bool RimStimPlanModelWellLogCalculator::calculate( RiaDefines::CurveProperty cur scaleByNetToGross( stimPlanModel, netToGross, values ); } + // Extracted well log needs to be sampled at same depths as well logs from static grid. + // If the well log is extracted from a different model it needs to be resampled. + if ( curveProperty != RiaDefines::CurveProperty::FACIES ) + { + std::vector targetMds; + std::vector targetTvds; + std::vector faciesValues; + if ( !stimPlanModel->calculator()->extractCurveData( RiaDefines::CurveProperty::FACIES, + timeStep, + faciesValues, + targetMds, + targetTvds, + rkbDiff ) ) + { + return false; + } + + if ( targetMds.size() != measuredDepthValues.size() ) + { + RiaLogging::info( "Resampling data to fit static case." ); + auto [tvds, mds, results] = RimStimPlanModelPressureCalculator::interpolateMissingValues( targetTvds, + targetMds, + measuredDepthValues, + values ); + tvDepthValues = tvds; + measuredDepthValues = mds; + values = results; + } + } + + RiaLogging::debug( QString( "Well log for '%1' done. Size: %2." ) + .arg( caf::AppEnum( curveProperty ).uiText() ) + .arg( values.size() ) ); return true; } @@ -357,7 +421,9 @@ void RimStimPlanModelWellLogCalculator::scaleByNetToGross( const RimStimPlanMode { if ( netToGross.size() != values.size() ) { - RiaLogging::error( QString( "Different sizes for net to gross calculation." ) ); + RiaLogging::error( QString( "Different sizes for net to gross calculation. NTG length: %1. Values length: %2" ) + .arg( netToGross.size() ) + .arg( values.size() ) ); return; } @@ -380,6 +446,65 @@ void RimStimPlanModelWellLogCalculator::scaleByNetToGross( const RimStimPlanMode } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimStimPlanModelWellLogCalculator::extractValuesForPropertyWithConfigurations( RiaDefines::CurveProperty curveProperty, + const RimStimPlanModel* stimPlanModel, + int timeStep, + std::vector& values, + std::vector& measuredDepthValues, + std::vector& tvDepthValues, + double& rkbDiff ) const +{ + std::deque extractionConfigurations = + stimPlanModel->extractionConfigurations( curveProperty ); + + QString curvePropertyName = caf::AppEnum( curveProperty ).uiText(); + + for ( auto extractionConfig : extractionConfigurations ) + { + RiaDefines::ResultCatType resultType = extractionConfig.resultCategory; + QString resultVariable = extractionConfig.resultVariable; + RimExtractionConfiguration::EclipseCaseType eclipseCaseType = extractionConfig.eclipseCaseType; + + RiaLogging::info( + QString( "Trying extraction option for '%1': result property: '%2' result type: '%3' case type: '%4'" ) + .arg( curvePropertyName ) + .arg( resultVariable ) + .arg( caf::AppEnum( resultType ).uiText() ) + .arg( caf::AppEnum( eclipseCaseType ).uiText() ) ); + + RimEclipseCase* eclipseCase = stimPlanModel->eclipseCaseForType( eclipseCaseType ); + + if ( !eclipseCase ) + { + RiaLogging::info( "Skipping extraction config due to missing model." ); + } + else + { + bool isOk = extractValuesForProperty( curveProperty, + stimPlanModel, + eclipseCase, + resultType, + resultVariable, + timeStep, + values, + measuredDepthValues, + tvDepthValues, + rkbDiff ); + if ( isOk ) + { + RiaLogging::info( "Extraction succeeded" ); + return true; + } + } + } + + RiaLogging::info( QString( "Extraction failed. Tried %1 configurations." ).arg( extractionConfigurations.size() ) ); + return false; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -392,11 +517,37 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu double& rkbDiff ) const { RimEclipseCase* eclipseCase = stimPlanModel->eclipseCaseForProperty( curveProperty ); - if ( !eclipseCase ) - { - return false; - } + if ( !eclipseCase ) return false; + + RiaDefines::ResultCatType resultType = stimPlanModel->eclipseResultCategory( curveProperty ); + QString resultVariable = stimPlanModel->eclipseResultVariable( curveProperty ); + + return extractValuesForProperty( curveProperty, + stimPlanModel, + eclipseCase, + resultType, + resultVariable, + timeStep, + values, + measuredDepthValues, + tvDepthValues, + rkbDiff ); +} +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::CurveProperty curveProperty, + const RimStimPlanModel* stimPlanModel, + RimEclipseCase* eclipseCase, + RiaDefines::ResultCatType resultCategory, + const QString resultVariable, + int timeStep, + std::vector& values, + std::vector& measuredDepthValues, + std::vector& tvDepthValues, + double& rkbDiff ) const +{ if ( !stimPlanModel->thicknessDirectionWellPath() ) { return false; @@ -409,6 +560,9 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu return false; } + RiaLogging::info( QString( "Extracting values for '%1' from grid '%2'." ) + .arg( caf::AppEnum( curveProperty ).uiText() ) + .arg( eclipseCase->caseUserDescription() ) ); RigEclipseWellLogExtractor eclExtractor( eclipseCase->eclipseCaseData(), wellPathGeometry, "fracture model" ); measuredDepthValues = eclExtractor.cellIntersectionMDs(); @@ -417,13 +571,13 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu RimEclipseResultDefinition eclipseResultDefinition; eclipseResultDefinition.setEclipseCase( eclipseCase ); - eclipseResultDefinition.setResultType( stimPlanModel->eclipseResultCategory( curveProperty ) ); + eclipseResultDefinition.setResultType( resultCategory ); eclipseResultDefinition.setPorosityModel( RiaDefines::PorosityModelType::MATRIX_MODEL ); - eclipseResultDefinition.setResultVariable( stimPlanModel->eclipseResultVariable( curveProperty ) ); + eclipseResultDefinition.setResultVariable( resultVariable ); eclipseResultDefinition.loadResult(); - if ( stimPlanModel->eclipseResultCategory( curveProperty ) != RiaDefines::ResultCatType::DYNAMIC_NATIVE || + if ( resultCategory != RiaDefines::ResultCatType::DYNAMIC_NATIVE || curveProperty == RiaDefines::CurveProperty::INITIAL_PRESSURE ) { timeStep = 0; @@ -438,6 +592,10 @@ bool RimStimPlanModelWellLogCalculator::extractValuesForProperty( RiaDefines::Cu if ( resAcc.notNull() ) { eclExtractor.curveData( resAcc.p(), &values ); + RiaLogging::info( QString( "Extracted values %1 from grid '%2' for '%3'." ) + .arg( values.size() ) + .arg( eclipseCase->caseUserDescription() ) + .arg( caf::AppEnum( curveProperty ).uiText() ) ); } else { @@ -492,6 +650,8 @@ bool RimStimPlanModelWellLogCalculator::replaceMissingValuesWithDefault( RiaDefi RigEclipseWellLogExtractor eclExtractor( eclipseCase->eclipseCaseData(), wellPathGeometry, "fracture model" ); eclExtractor.curveData( backupResAcc.p(), &replacementValues ); + RiaLogging::debug( QString( "Read %1 values for '%2'" ).arg( replacementValues.size() ).arg( resultVariable ) ); + if ( values.empty() ) { values = replacementValues; @@ -530,6 +690,10 @@ bool RimStimPlanModelWellLogCalculator::replaceMissingValuesWithDefault( RiaDefi replaceMissingValues( values, replacementValues ); } } + else + { + RiaLogging::debug( "No backup result accessor found." ); + } // If the backup accessor is not found, or does not provide all the missing values: // use default value from the fracture model @@ -584,6 +748,12 @@ const std::vector& RimStimPlanModelWellLogCalculator::loadResults( RigEc int timeStepIndex = 0; RigEclipseResultAddress resultAddress( resultType, propertyName ); + if ( !resultData->hasResultEntry( resultAddress ) && resultType != RiaDefines::ResultCatType::INPUT_PROPERTY ) + { + return loadResults( caseData, porosityModel, RiaDefines::ResultCatType::INPUT_PROPERTY, propertyName ); + } + + CAF_ASSERT( resultData->hasResultEntry( resultAddress ) ); resultData->ensureKnownResultLoaded( resultAddress ); return caseData->results( porosityModel )->cellScalarResults( resultAddress, timeStepIndex ); } diff --git a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.h b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.h index a4377227d7..71f557ad0e 100644 --- a/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.h +++ b/ApplicationLibCode/ProjectDataModel/StimPlanModel/RimStimPlanModelWellLogCalculator.h @@ -29,9 +29,10 @@ #include class RigEclipseCaseData; +class RigResultAccessor; class RimEclipseInputPropertyCollection; class RimEclipseResultDefinition; -class RigResultAccessor; +class RimEclipseCase; class RimStimPlanModelWellLogCalculator : public RimStimPlanModelPropertyCalculator { @@ -87,6 +88,25 @@ class RimStimPlanModelWellLogCalculator : public RimStimPlanModelPropertyCalcula std::vector& tvDepthValues, double& rkbDiff ) const; + bool extractValuesForProperty( RiaDefines::CurveProperty curveProperty, + const RimStimPlanModel* stimPlanModel, + RimEclipseCase* eclipseCase, + RiaDefines::ResultCatType resultCategory, + const QString resultVariable, + int timeStep, + std::vector& values, + std::vector& measuredDepthValues, + std::vector& tvDepthValues, + double& rkbDiff ) const; + + bool extractValuesForPropertyWithConfigurations( RiaDefines::CurveProperty curveProperty, + const RimStimPlanModel* stimPlanModel, + int timeStep, + std::vector& values, + std::vector& measuredDepthValues, + std::vector& tvDepthValues, + double& rkbDiff ) const; + bool replaceMissingValuesWithDefault( RiaDefines::CurveProperty curveProperty, const RimStimPlanModel* stimPlanModel, std::vector& values, diff --git a/ApplicationLibCode/ProjectDataModel/Streamlines/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Streamlines/CMakeLists_files.cmake index d130035bb2..17fe7accae 100644 --- a/ApplicationLibCode/ProjectDataModel/Streamlines/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Streamlines/CMakeLists_files.cmake @@ -1,26 +1,25 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimStreamline.h -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGeneratorBase.h -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineDataAccess.h -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGenerator.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStreamline.h + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGeneratorBase.h + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineDataAccess.h + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGenerator.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimStreamline.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGeneratorBase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineDataAccess.cpp -${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGenerator.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimStreamline.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGeneratorBase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineDataAccess.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimStreamlineGenerator.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Streamlines" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Streamlines" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp index 7ee60b8e48..90f7a1b382 100644 --- a/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Streamlines/RimStreamlineInViewCollection.cpp @@ -100,7 +100,7 @@ RimStreamlineInViewCollection::RimStreamlineInViewCollection() CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); m_legendConfig = new RimRegularLegendConfig(); m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::LOG10_CONTINUOUS ); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_collectionName, "Name", "Name", "", "", "" ); m_collectionName = "Streamlines"; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake index f6ceffd2be..a3d2865cd9 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Summary/CMakeLists_files.cmake @@ -1,98 +1,95 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAsciiDataCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimFileSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimGridSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseMainCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryTimeAxisProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.h -${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.h -${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotSourceStepping.h -${CMAKE_CURRENT_LIST_DIR}/RimCsvUserData.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotNameHelper.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSet.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetColorManager.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilter.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilterCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.h -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.h -${CMAKE_CURRENT_LIST_DIR}/RimDerivedSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.h -${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.h -${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAsciiDataCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimFileSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseMainCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryTimeAxisProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.h + ${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.h + ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotSourceStepping.h + ${CMAKE_CURRENT_LIST_DIR}/RimCsvUserData.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotNameHelper.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSet.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetColorManager.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilterCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimDerivedSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.h + ${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.h + ${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimAsciiDataCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFileSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseMainCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryTimeAxisProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotSourceStepping.cpp -${CMAKE_CURRENT_LIST_DIR}/RimCsvUserData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotNameHelper.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSet.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetColorManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilterCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.cpp -${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDerivedSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.cpp -${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimAsciiDataCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFileSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseMainCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAppearanceCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveAutoName.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotAxisFormatter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCurveCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryTimeAxisProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObservedSummaryData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryObservedDataFile.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObservedEclipseUserData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCalculatedSummaryCurveReader.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryAddress.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCrossPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotSourceStepping.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimCsvUserData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotNameHelper.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSet.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveSetColorManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleCurveFilterCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatistics.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDerivedSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimDerivedEnsembleCaseCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlotFilterTextCurveSetEditor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunction.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimObjectiveFunctionTools.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.h -) +list(APPEND QT_MOC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/RimSummaryPlot.h) -source_group( "ProjectDataModel\\Summary" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Summary" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp index cd12460aef..e54a0d5c3b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimAsciiDataCurve.cpp @@ -49,8 +49,8 @@ RimAsciiDataCurve::RimAsciiDataCurve() CAF_PDM_InitFieldNoDefault( &m_values, "Values", "Values", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_title, "Title", "Title", "", "", "" ); - m_symbolSkipPixelDistance = 10.0f; - m_curveThickness = 2; + setSymbolSkipDistance( 10.0f ); + setLineThickness( 2 ); setDeletable( true ); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp index 3b0ebed67b..629eae46db 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.cpp @@ -85,7 +85,7 @@ RimEnsembleCurveFilter::RimEnsembleCurveFilter() m_objectiveValuesSummaryAddressesUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSummaryAddresses, "ObjectiveSummaryAddress", "Summary Address", "", "", "" ); - m_objectiveValuesSummaryAddresses.uiCapability()->setUiHidden( true ); + m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeHidden( true ); m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSelectSummaryAddressPushButton, @@ -100,7 +100,6 @@ RimEnsembleCurveFilter::RimEnsembleCurveFilter() CAF_PDM_InitFieldNoDefault( &m_objectiveFunction, "ObjectiveFunction", "Objective Function", "", "", "" ); m_objectiveFunction = new RimObjectiveFunction(); - m_objectiveFunction.uiCapability()->setUiHidden( true ); m_objectiveFunction.uiCapability()->setUiTreeHidden( true ); m_objectiveFunction.uiCapability()->setUiTreeChildrenHidden( true ); m_objectiveFunction->changed.connect( this, &RimEnsembleCurveFilter::onObjectionFunctionChanged ); @@ -279,7 +278,7 @@ QList { auto curveSet = parentCurveSet(); auto ensemble = curveSet ? curveSet->summaryCaseCollection() : nullptr; - auto eParam = ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : EnsembleParameter(); + auto eParam = ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : RigEnsembleParameter(); if ( eParam.isText() ) { @@ -734,9 +733,9 @@ void RimEnsembleCurveFilter::updateMaxMinAndDefaultValues( bool forceDefault ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimEnsembleCurveFilter::selectedEnsembleParameter() const +RigEnsembleParameter RimEnsembleCurveFilter::selectedEnsembleParameter() const { auto curveSet = parentCurveSet(); auto ensemble = curveSet ? curveSet->summaryCaseCollection() : nullptr; - return ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : EnsembleParameter(); + return ensemble ? ensemble->ensembleParameter( m_ensembleParameterName ) : RigEnsembleParameter(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h index 6547150e03..7ef9186092 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveFilter.h @@ -30,7 +30,7 @@ #include "cafPdmProxyValueField.h" #include "cafPdmPtrField.h" -class EnsembleParameter; +class RigEnsembleParameter; class RimEnsembleCurveSet; class RimSummaryCase; class RimSummaryAddress; @@ -80,8 +80,8 @@ class RimEnsembleCurveFilter : public caf::PdmObject std::vector applyFilter( const std::vector& allSumCases ); - void loadDataAndUpdate(); - EnsembleParameter selectedEnsembleParameter() const; + void loadDataAndUpdate(); + RigEnsembleParameter selectedEnsembleParameter() const; RimEnsembleCurveSet* parentCurveSet() const; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp index 921af0d5c0..0b7d7573e8 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.cpp @@ -22,7 +22,6 @@ #include "RiaGuiApplication.h" #include "RiaPreferences.h" #include "RiaResultNames.h" -#include "RiaStatisticsTools.h" #include "RiaSummaryCurveAnalyzer.h" #include "RiaSummaryCurveDefinition.h" #include "RiaTimeTTools.h" @@ -31,8 +30,6 @@ #include "RifEnsembleStatisticsReader.h" -#include "RigStatisticsMath.h" - #include "RimCustomObjectiveFunction.h" #include "RimCustomObjectiveFunctionCollection.h" #include "RimDerivedEnsembleCaseCollection.h" @@ -104,7 +101,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitObject( "Ensemble Curve Set", ":/EnsembleCurveSet16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_curves, "EnsembleCurveSet", "Ensemble Curve Set", "", "", "" ); - m_curves.uiCapability()->setUiHidden( true ); + m_curves.uiCapability()->setUiTreeHidden( true ); m_curves.uiCapability()->setUiTreeChildrenHidden( false ); CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves", "", "", "" ); @@ -120,7 +117,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() m_yValuesSummaryAddressUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddress, "SummaryAddress", "Summary Address", "", "", "" ); - m_yValuesSummaryAddress.uiCapability()->setUiHidden( true ); + m_yValuesSummaryAddress.uiCapability()->setUiTreeHidden( true ); m_yValuesSummaryAddress.uiCapability()->setUiTreeChildrenHidden( true ); m_yValuesSummaryAddress = new RimSummaryAddress; @@ -143,7 +140,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() m_objectiveValuesSummaryAddressesUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSummaryAddresses, "ObjectiveSummaryAddress", "Summary Address", "", "", "" ); - m_objectiveValuesSummaryAddresses.uiCapability()->setUiHidden( true ); + m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeHidden( true ); m_objectiveValuesSummaryAddresses.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_objectiveValuesSelectSummaryAddressPushButton, @@ -203,11 +200,11 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitFieldNoDefault( &m_objectiveFunction, "ObjectiveFunction", "Objective Function", "", "", "" ); m_objectiveFunction = new RimObjectiveFunction(); - m_objectiveFunction.uiCapability()->setUiHidden( true ); + m_objectiveFunction.uiCapability()->setUiTreeHidden( true ); m_objectiveFunction->changed.connect( this, &RimEnsembleCurveSet::onObjectiveFunctionChanged ); CAF_PDM_InitFieldNoDefault( &m_statistics, "Statistics", "Statistics", "", "", "" ); - m_statistics = new RimEnsembleStatistics(); + m_statistics = new RimEnsembleStatistics( this ); m_statistics.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_userDefinedName, "UserDefinedName", QString( "Ensemble Curve Set" ), "Curve Set Name", "", "", "" ); @@ -219,7 +216,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_summaryAddressNameTools, "SummaryAddressNameTools", "SummaryAddressNameTools", "", "", "" ); - m_summaryAddressNameTools.uiCapability()->setUiHidden( true ); + m_summaryAddressNameTools.uiCapability()->setUiTreeHidden( true ); m_summaryAddressNameTools.uiCapability()->setUiTreeChildrenHidden( true ); m_summaryAddressNameTools = new RimSummaryCurveAutoName; @@ -238,7 +235,7 @@ RimEnsembleCurveSet::RimEnsembleCurveSet() CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryFilter_OBSOLETE, "VarListFilter", "Filter", "", "", "" ); m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeChildrenHidden( true ); - m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiHidden( true ); + m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_yValuesSummaryFilter_OBSOLETE.xmlCapability()->setIOWritable( false ); m_yValuesSummaryFilter_OBSOLETE = new RimSummaryFilter_OBSOLETE; @@ -549,7 +546,7 @@ void RimEnsembleCurveSet::setEnsembleParameter( const QString& parameterName ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() const +RigEnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() const { if ( m_colorMode() == ColorMode::BY_ENSEMBLE_PARAM ) { @@ -562,7 +559,7 @@ EnsembleParameter::Type RimEnsembleCurveSet::currentEnsembleParameterType() cons return eParam.type; } } - return EnsembleParameter::TYPE_NONE; + return RigEnsembleParameter::TYPE_NONE; } //-------------------------------------------------------------------------------------------------- @@ -587,6 +584,14 @@ void RimEnsembleCurveSet::updateAllCurves() filterChanged.send(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleCurveSet::updateEditors() +{ + updateConnectedEditors(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -919,6 +924,14 @@ void RimEnsembleCurveSet::updateMaxMinAndDefaultValues() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RimEnsembleCurveFilterCollection* RimEnsembleCurveSet::curveFilters() const +{ + return m_curveFilters; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1420,66 +1433,85 @@ ObjectiveFunctionTimeConfig RimEnsembleCurveSet::objectiveFunctionTimeConfig() c //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleCurveSet::updateCurveColors() +void RimEnsembleCurveSet::updateLegendTitle() { if ( m_colorMode == ColorMode::BY_ENSEMBLE_PARAM ) { - RimSummaryCaseCollection* group = m_yValuesSummaryCaseCollection(); - QString parameterName = m_ensembleParameter(); - { - QString legendTitle = "Ensemble Parameter"; - legendTitle += "\n"; - legendTitle += parameterName; + QString legendTitle = "Ensemble Parameter"; + legendTitle += "\n"; + legendTitle += parameterName; + + m_legendConfig->setTitle( legendTitle ); + } + else if ( m_colorMode == ColorMode::BY_OBJECTIVE_FUNCTION ) + { + QString legendTitle = "Objective Function"; + + legendTitle += "\n"; + legendTitle += caf::AppEnum( m_objectiveFunction()->functionType() ).uiText(); - m_legendConfig->setTitle( legendTitle ); + m_legendConfig->setTitle( legendTitle ); + } + else if ( m_colorMode == ColorMode::BY_CUSTOM_OBJECTIVE_FUNCTION ) + { + QString legendTitle = "Custom\nObjective Function"; + legendTitle += "\n"; + if ( m_customObjectiveFunction() && m_customObjectiveFunction()->isValid() ) + { + QString descriptions = m_customObjectiveFunction()->title(); + descriptions.truncate( 30 ); + legendTitle += descriptions; + if ( m_customObjectiveFunction()->title().length() > descriptions.length() ) + { + legendTitle += "..."; + } + } + else + { + legendTitle += "(Invalid Objective Function)"; } + m_legendConfig->setTitle( legendTitle ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleCurveSet::generateColorsForCases( const std::vector& summaryCases ) const +{ + std::vector caseColors; + + if ( m_colorMode == ColorMode::BY_ENSEMBLE_PARAM ) + { + RimSummaryCaseCollection* group = m_yValuesSummaryCaseCollection(); + + QString parameterName = m_ensembleParameter(); + if ( group && !parameterName.isEmpty() && !group->allSummaryCases().empty() ) { auto ensembleParam = group->ensembleParameter( parameterName ); if ( ensembleParam.isText() || ensembleParam.isNumeric() ) { RimEnsembleCurveSetColorManager::initializeLegendConfig( m_legendConfig, ensembleParam ); - for ( auto& curve : m_curves ) + for ( auto& rimCase : summaryCases ) { - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - continue; - RimSummaryCase* rimCase = curve->summaryCaseY(); - cvf::Color3f curveColor = - RimEnsembleCurveSetColorManager::caseColor( m_legendConfig, rimCase, ensembleParam ); - curve->setColor( curveColor ); - curve->updateCurveAppearance(); + caseColors.push_back( + RimEnsembleCurveSetColorManager::caseColor( m_legendConfig, rimCase, ensembleParam ) ); } } } } else if ( m_colorMode == ColorMode::SINGLE_COLOR ) { - for ( auto& curve : m_curves ) - { - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - continue; - - curve->setColor( m_color ); - curve->updateCurveAppearance(); - } + caseColors.resize( summaryCases.size(), m_color ); } else if ( m_colorMode == ColorMode::BY_OBJECTIVE_FUNCTION ) { RimSummaryCaseCollection* group = m_yValuesSummaryCaseCollection(); - { - QString legendTitle = "Objective Function"; - - legendTitle += "\n"; - legendTitle += - caf::AppEnum( m_objectiveFunction()->functionType() ).uiText(); - - m_legendConfig->setTitle( legendTitle ); - } - if ( group && !group->allSummaryCases().empty() ) { auto objectiveFunction = m_objectiveFunction(); @@ -1488,25 +1520,20 @@ void RimEnsembleCurveSet::updateCurveColors() { summaryAddresses.push_back( address->address() ); } + + RimEnsembleCurveSetColorManager::initializeLegendConfig( m_legendConfig, + objectiveFunction, + group->allSummaryCases(), + summaryAddresses, + objectiveFunctionTimeConfig() ); + for ( auto& rimCase : summaryCases ) { - RimEnsembleCurveSetColorManager::initializeLegendConfig( m_legendConfig, - objectiveFunction, - group->allSummaryCases(), - summaryAddresses, - objectiveFunctionTimeConfig() ); - for ( auto& curve : m_curves ) - { - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - continue; - RimSummaryCase* rimCase = curve->summaryCaseY(); - cvf::Color3f curveColor = RimEnsembleCurveSetColorManager::caseColor( m_legendConfig, - rimCase, - objectiveFunction, - summaryAddresses, - objectiveFunctionTimeConfig() ); - curve->setColor( curveColor ); - curve->updateCurveAppearance(); - } + cvf::Color3f curveColor = RimEnsembleCurveSetColorManager::caseColor( m_legendConfig, + rimCase, + objectiveFunction, + summaryAddresses, + objectiveFunctionTimeConfig() ); + caseColors.push_back( curveColor ); } } } @@ -1514,44 +1541,51 @@ void RimEnsembleCurveSet::updateCurveColors() { RimSummaryCaseCollection* group = m_yValuesSummaryCaseCollection(); - { - QString legendTitle = "Custom\nObjective Function"; - legendTitle += "\n"; - if ( m_customObjectiveFunction() && m_customObjectiveFunction()->isValid() ) - { - QString descriptions = m_customObjectiveFunction()->title(); - descriptions.truncate( 30 ); - legendTitle += descriptions; - if ( m_customObjectiveFunction()->title().length() > descriptions.length() ) - { - legendTitle += "..."; - } - } - else - { - legendTitle += "(Invalid Objective Function)"; - } - - m_legendConfig->setTitle( legendTitle ); - } - if ( group && !group->allSummaryCases().empty() && m_customObjectiveFunction() && m_customObjectiveFunction->isValid() ) { RimEnsembleCurveSetColorManager::initializeLegendConfig( m_legendConfig, m_customObjectiveFunction() ); - for ( auto& curve : m_curves ) + for ( auto& rimCase : summaryCases ) { - if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - continue; - RimSummaryCase* rimCase = curve->summaryCaseY(); - cvf::Color3f curveColor = + cvf::Color3f curveColor = RimEnsembleCurveSetColorManager::caseColor( m_legendConfig, rimCase, m_customObjectiveFunction() ); - curve->setColor( curveColor ); - curve->updateCurveAppearance(); + caseColors.push_back( curveColor ); } } } + return caseColors; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleCurveSet::updateCurveColors() +{ + updateLegendTitle(); + + // Fint the curves to color (skip the statistics) + std::vector curvesToColor; + std::vector summaryCases; + for ( auto& curve : m_curves ) + { + if ( curve->summaryAddressY().category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) continue; + + curvesToColor.push_back( curve ); + summaryCases.push_back( curve->summaryCaseY() ); + } + + // Get the colors + std::vector caseColors = generateColorsForCases( summaryCases ); + + // Apply the colors + if ( caseColors.size() != curvesToColor.size() ) return; + for ( size_t i = 0; i < curvesToColor.size(); i++ ) + { + curvesToColor[i]->setColor( caseColors[i] ); + curvesToColor[i]->updateCurveAppearance(); + } + RimSummaryPlot* plot; firstAncestorOrThisOfType( plot ); if ( plot && plot->viewer() ) @@ -1767,8 +1801,7 @@ void RimEnsembleCurveSet::updateStatisticsCurves( const std::vectorsetSymbolSkipDistance( 150 ); if ( m_statistics->showCurveLabels() ) { - curve->setSymbolLabel( RiaStatisticsTools::replacePercentileByPValueText( - QString::fromStdString( address.ensembleStatisticsQuantityName() ) ) ); + curve->setSymbolLabel( QString::fromStdString( address.ensembleStatisticsQuantityName() ) ); } curve->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); curve->setSummaryCaseY( m_ensembleStatCase.get() ); @@ -1838,7 +1871,7 @@ void RimEnsembleCurveSet::updateAllTextInPlot() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimEnsembleCurveSet::variationSortedEnsembleParameters() const +std::vector RimEnsembleCurveSet::variationSortedEnsembleParameters() const { RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) @@ -1847,14 +1880,14 @@ std::vector RimEnsembleCurveSet::variationSortedEnsembleParam } else { - return std::vector(); + return std::vector(); } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> RimEnsembleCurveSet::correlationSortedEnsembleParameters() const +std::vector> RimEnsembleCurveSet::correlationSortedEnsembleParameters() const { RimSummaryCaseCollection* ensemble = m_yValuesSummaryCaseCollection; if ( ensemble ) @@ -1863,7 +1896,7 @@ std::vector> RimEnsembleCurveSet::correlati } else { - return std::vector>(); + return std::vector>(); } } @@ -2014,12 +2047,12 @@ void RimEnsembleCurveSet::updateLegendMappingMode() { switch ( currentEnsembleParameterType() ) { - case EnsembleParameter::TYPE_TEXT: + case RigEnsembleParameter::TYPE_TEXT: if ( m_legendConfig->mappingMode() != RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ) m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ); break; - case EnsembleParameter::TYPE_NUMERIC: + case RigEnsembleParameter::TYPE_NUMERIC: if ( m_legendConfig->mappingMode() == RimRegularLegendConfig::MappingType::CATEGORY_INTEGER ) m_legendConfig->setMappingMode( RimRegularLegendConfig::MappingType::LINEAR_CONTINUOUS ); break; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h index c61b89b3d7..ace38eb714 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSet.h @@ -26,12 +26,15 @@ #include "RiaQDateTimeTools.h" #include "RimEnsembleCurveSetColorManager.h" +#include "RimEnsembleCurveSetInterface.h" #include "RimObjectiveFunction.h" #include "RimRegularLegendConfig.h" #include "RimSummaryCase.h" #include "RimSummaryCaseCollection.h" #include "RimTimeStepFilter.h" +#include "RigEnsembleParameter.h" + #include "cafAppEnum.h" #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" @@ -70,7 +73,7 @@ class QDate; //================================================================================================== /// //================================================================================================== -class RimEnsembleCurveSet : public caf::PdmObject +class RimEnsembleCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInterface { CAF_PDM_HEADER_INIT; @@ -114,48 +117,53 @@ class RimEnsembleCurveSet : public caf::PdmObject RimEnsembleCurveFilterCollection* filterCollection() const; - ColorMode colorMode() const; - void setColorMode( ColorMode mode ); - void setEnsembleParameter( const QString& parameterName ); - EnsembleParameter::Type currentEnsembleParameterType() const; + ColorMode colorMode() const; + void setColorMode( ColorMode mode ); + void setEnsembleParameter( const QString& parameterName ); + RigEnsembleParameter::Type currentEnsembleParameterType() const; RimRegularLegendConfig* legendConfig(); void updateEnsembleLegendItem(); RiuDraggableOverlayFrame* legendFrame() const; - void updateAllCurves(); void setTimeSteps( const std::vector& timeStepIndices ); std::vector selectedTimeSteps() const; - void updateStatisticsCurves(); RimEnsembleCurveSet* clone() const; void showCurves( bool show ); - void updateAllTextInPlot(); - std::vector variationSortedEnsembleParameters() const; + void updateAllTextInPlot(); + std::vector variationSortedEnsembleParameters() const; - std::vector> correlationSortedEnsembleParameters() const; + std::vector> correlationSortedEnsembleParameters() const; std::vector filterEnsembleCases( const std::vector& sumCases ); void disableStatisticCurves(); bool isFiltered() const; - bool hasP10Data() const; - bool hasP50Data() const; - bool hasP90Data() const; - bool hasMeanData() const; + void updateEditors() override; + void updateAllCurves() override; + void updateStatisticsCurves() override; + bool hasP10Data() const override; + bool hasP50Data() const override; + bool hasP90Data() const override; + bool hasMeanData() const override; void appendColorGroup( caf::PdmUiOrdering& uiOrdering ); static void appendOptionItemsForSummaryAddresses( QList* options, RimSummaryCaseCollection* summaryCaseGroup ); + const RimEnsembleCurveFilterCollection* curveFilters() const; + void updateFilterLegend(); void updateObjectiveFunctionLegend(); ObjectiveFunctionTimeConfig objectiveFunctionTimeConfig() const; + std::vector generateColorsForCases( const std::vector& summaryCases ) const; + private: void updateEnsembleCurves( const std::vector& sumCases ); void updateStatisticsCurves( const std::vector& sumCases ); @@ -183,6 +191,8 @@ class RimEnsembleCurveSet : public caf::PdmObject QString createAutoName() const; void updateLegendMappingMode(); + void updateLegendTitle(); + void updateMaxMinAndDefaultValues(); void updateCurveColors(); void updateTimeAnnotations(); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetCollection.cpp index 5c3f8fd69a..c192a531d9 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetCollection.cpp @@ -43,7 +43,7 @@ RimEnsembleCurveSetCollection::RimEnsembleCurveSetCollection() CAF_PDM_InitObject( "Ensemble Curve Sets", ":/EnsembleCurveSets16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_curveSets, "EnsembleCurveSets", "Ensemble Curve Sets", "", "", "" ); - m_curveSets.uiCapability()->setUiHidden( true ); + m_curveSets.uiCapability()->setUiTreeHidden( true ); m_curveSets.uiCapability()->setUiTreeChildrenHidden( false ); CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves", "", "", "" ); @@ -52,7 +52,7 @@ RimEnsembleCurveSetCollection::RimEnsembleCurveSetCollection() CAF_PDM_InitFieldNoDefault( &m_ySourceStepping, "YSourceStepping", "", "", "", "" ); m_ySourceStepping = new RimSummaryPlotSourceStepping; m_ySourceStepping->setSourceSteppingType( RimSummaryPlotSourceStepping::Y_AXIS ); - m_ySourceStepping.uiCapability()->setUiHidden( true ); + m_ySourceStepping.uiCapability()->setUiTreeHidden( true ); m_ySourceStepping.uiCapability()->setUiTreeChildrenHidden( true ); m_ySourceStepping.xmlCapability()->disableIO(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp index 9dd25882e9..e53dffe9bc 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.cpp @@ -95,8 +95,8 @@ RimRegularLegendConfig::ColorRangesType RimEnsembleCurveSetColorManager::cycledE //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendConfig* legendConfig, - const EnsembleParameter& ensembleParam ) +void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendConfig* legendConfig, + const RigEnsembleParameter& ensembleParam ) { if ( ensembleParam.isText() ) { @@ -170,7 +170,7 @@ void RimEnsembleCurveSetColorManager::initializeLegendConfig( RimRegularLegendCo //-------------------------------------------------------------------------------------------------- cvf::Color3f RimEnsembleCurveSetColorManager::caseColor( const RimRegularLegendConfig* legendConfig, const RimSummaryCase* summaryCase, - const EnsembleParameter& ensembleParam ) + const RigEnsembleParameter& ensembleParam ) { if ( ensembleParam.isText() ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h index 57f7bd07ac..72af9ff935 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleCurveSetColorManager.h @@ -23,6 +23,8 @@ #include "RimRegularLegendConfig.h" #include "RimSummaryCaseCollection.h" +#include "RigEnsembleParameter.h" + #include "cafPdmPointer.h" #include @@ -58,7 +60,7 @@ class RimEnsembleCurveSetColorManager return m_ensembleColorRanges.find( colorRange ) != m_ensembleColorRanges.end(); } - static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, const EnsembleParameter& parameter ); + static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, const RigEnsembleParameter& parameter ); static void initializeLegendConfig( RimRegularLegendConfig* legendConfig, RimObjectiveFunction* objectiveFunction, const std::vector& summaryCases, @@ -70,7 +72,7 @@ class RimEnsembleCurveSetColorManager static cvf::Color3f caseColor( const RimRegularLegendConfig* legendConfig, const RimSummaryCase* summaryCase, - const EnsembleParameter& parameter ); + const RigEnsembleParameter& parameter ); static cvf::Color3f caseColor( const RimRegularLegendConfig* legendConfig, RimSummaryCase* summaryCase, diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp index 96bbd55edd..76b04bc47b 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.cpp @@ -17,30 +17,29 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RimEnsembleStatistics.h" +#include "RimEnsembleCurveSetInterface.h" #include "RiaColorTools.h" -#include "RifSummaryReaderInterface.h" -#include "RigStatisticsMath.h" #include "RimEnsembleCurveSet.h" -#include "RimSummaryCase.h" -#include "RimSummaryCaseCollection.h" CAF_PDM_SOURCE_INIT( RimEnsembleStatistics, "RimEnsembleStatistics" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimEnsembleStatistics::RimEnsembleStatistics() +RimEnsembleStatistics::RimEnsembleStatistics( RimEnsembleCurveSetInterface* parentCurveSet ) { CAF_PDM_InitObject( "Ensemble Curve Filter", ":/EnsembleCurveSet16x16.png", "", "" ); + m_parentCurveSet = parentCurveSet; + CAF_PDM_InitField( &m_active, "Active", true, "Show Statistics Curves", "", "", "" ); CAF_PDM_InitField( &m_hideEnsembleCurves, "HideEnsembleCurves", false, "Hide Ensemble Curves", "", "", "" ); CAF_PDM_InitField( &m_basedOnFilteredCases, "BasedOnFilteredCases", false, "Based on Filtered Cases", "", "", "" ); - CAF_PDM_InitField( &m_showP10Curve, "ShowP10Curve", true, "P90", "", "", "" ); // Yes, P90 + CAF_PDM_InitField( &m_showP10Curve, "ShowP10Curve", true, "P10", "", "", "" ); CAF_PDM_InitField( &m_showP50Curve, "ShowP50Curve", false, "P50", "", "", "" ); - CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P10", "", "", "" ); // Yes, P10 + CAF_PDM_InitField( &m_showP90Curve, "ShowP90Curve", true, "P90", "", "", "" ); CAF_PDM_InitField( &m_showMeanCurve, "ShowMeanCurve", true, "Mean", "", "", "" ); CAF_PDM_InitField( &m_showCurveLabels, "ShowCurveLabels", true, "Show Curve Labels", "", "", "" ); CAF_PDM_InitField( &m_includeIncompleteCurves, "IncludeIncompleteCurves", false, "Include Incomplete Curves", "", "", "" ); @@ -105,17 +104,17 @@ void RimEnsembleStatistics::fieldChangedByUi( const caf::PdmFieldHandle* changed changedField == &m_showP50Curve || changedField == &m_showP90Curve || changedField == &m_showMeanCurve || changedField == &m_showCurveLabels || changedField == &m_color || changedField == &m_includeIncompleteCurves ) { - auto curveSet = parentCurveSet(); + auto curveSet = m_parentCurveSet; if ( !curveSet ) return; curveSet->updateStatisticsCurves(); - if ( changedField == &m_active || changedField == &m_basedOnFilteredCases ) curveSet->updateConnectedEditors(); + if ( changedField == &m_active || changedField == &m_basedOnFilteredCases ) curveSet->updateEditors(); } if ( changedField == &m_hideEnsembleCurves ) { - auto curveSet = parentCurveSet(); + auto curveSet = m_parentCurveSet; if ( !curveSet ) return; curveSet->updateAllCurves(); @@ -127,7 +126,7 @@ void RimEnsembleStatistics::fieldChangedByUi( const caf::PdmFieldHandle* changed //-------------------------------------------------------------------------------------------------- void RimEnsembleStatistics::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - auto curveSet = parentCurveSet(); + auto curveSet = m_parentCurveSet; uiOrdering.add( &m_active ); uiOrdering.add( &m_hideEnsembleCurves ); @@ -150,18 +149,8 @@ void RimEnsembleStatistics::defineUiOrdering( QString uiConfigName, caf::PdmUiOr m_showCurveLabels.uiCapability()->setUiReadOnly( !m_active ); m_color.uiCapability()->setUiReadOnly( !m_active ); - m_showP10Curve.uiCapability()->setUiName( curveSet->hasP10Data() ? "P90" : "P90 (Needs > 8 curves)" ); - m_showP90Curve.uiCapability()->setUiName( curveSet->hasP90Data() ? "P10" : "P10 (Needs > 8 curves)" ); + m_showP10Curve.uiCapability()->setUiName( curveSet->hasP10Data() ? "P10" : "P10 (Needs > 8 curves)" ); + m_showP90Curve.uiCapability()->setUiName( curveSet->hasP90Data() ? "P90" : "P90 (Needs > 8 curves)" ); uiOrdering.skipRemainingFields( true ); } - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -RimEnsembleCurveSet* RimEnsembleStatistics::parentCurveSet() const -{ - RimEnsembleCurveSet* curveSet; - firstAncestorOrThisOfType( curveSet ); - return curveSet; -} diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.h b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.h index 3b836b65fc..b8ab31fae6 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatistics.h @@ -18,15 +18,11 @@ #pragma once -#include "RimEnsembleCurveSet.h" -#include "RimSummaryCase.h" - #include "cafPdmField.h" +#include "cafPdmFieldCvfColor.h" #include "cafPdmObject.h" -class RifEclipseSummaryAddress; -class RimSummaryCaseCollection; -class RimEnsembleStatisticsCase; +class RimEnsembleCurveSetInterface; //================================================================================================== /// @@ -36,7 +32,7 @@ class RimEnsembleStatistics : public caf::PdmObject CAF_PDM_HEADER_INIT; public: - RimEnsembleStatistics(); + RimEnsembleStatistics( RimEnsembleCurveSetInterface* parentCurveSet = nullptr ); bool isActive() const; bool hideEnsembleCurves() const { return m_hideEnsembleCurves; } @@ -59,7 +55,7 @@ class RimEnsembleStatistics : public caf::PdmObject void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; private: - RimEnsembleCurveSet* parentCurveSet() const; + RimEnsembleCurveSetInterface* m_parentCurveSet; caf::PdmField m_active; caf::PdmField m_hideEnsembleCurves; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp index 44abd72023..30113951f4 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimEnsembleStatisticsCase.cpp @@ -188,8 +188,12 @@ void RimEnsembleStatisticsCase::calculate( const std::vector su } double p10, p50, p90, mean; - RigStatisticsMath::calculateStatisticsCurves( valuesAtTimeStep, &p10, &p50, &p90, &mean ); - + RigStatisticsMath::calculateStatisticsCurves( valuesAtTimeStep, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); m_p10Data.push_back( p10 ); m_p50Data.push_back( p50 ); m_p90Data.push_back( p90 ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp index 80fd9e1a38..04dcec64d0 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimFileSummaryCase.cpp @@ -119,10 +119,6 @@ void RimFileSummaryCase::createSummaryReaderInterface() void RimFileSummaryCase::createRftReaderInterface() { m_summaryEclipseRftReader = RimFileSummaryCase::findRftDataAndCreateReader( this->summaryHeaderFilename() ); - if ( m_summaryEclipseRftReader.notNull() ) - { - RiaLogging::info( QString( "Found RFT Data for %1" ).arg( this->summaryHeaderFilename() ) ); - } } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp index cdb70dae51..8b2adcbee9 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimGridSummaryCase.cpp @@ -145,9 +145,13 @@ RimEclipseCase* RimGridSummaryCase::associatedEclipseCase() //-------------------------------------------------------------------------------------------------- QString RimGridSummaryCase::summaryHeaderFilename() const { - if ( !m_eclipseCase() ) return m_summaryHeaderFilename().path(); + if ( m_eclipseCase() ) + { + auto candidate = summaryHeaderFilenameFromEclipseCase( m_eclipseCase ); + if ( QFileInfo::exists( candidate ) ) return candidate; + } - return summaryHeaderFilenameFromEclipseCase( m_eclipseCase() ); + return m_summaryHeaderFilename().path(); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp index ba1de2153b..7a544f8564 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCase.cpp @@ -33,6 +33,7 @@ #include "cvfAssert.h" +#include "RiaEnsembleNameTools.h" #include #include @@ -296,42 +297,7 @@ QString RimSummaryCase::uniqueShortNameForEnsembleCase( RimSummaryCase* summaryC } } - std::map keyFileComponentsForAllFiles = - RiaFilePathTools::keyPathComponentsForEachFilePath( summaryFilePaths ); - - QStringList keyFileComponents = keyFileComponentsForAllFiles[summaryCase->summaryHeaderFilename()]; - if ( keyFileComponents.empty() ) return ensembleCaseName; - - if ( !ensembleCaseName.isEmpty() ) - { - for ( auto& component : keyFileComponents ) - { - component = component.replace( ensembleCaseName, "" ); - component = component.replace( trimRe, "" ); - } - } - - QStringList shortNameComponents; - QRegularExpression numberRe( "[0-9]+" ); - for ( auto keyComponent : keyFileComponents ) - { - QStringList subComponents; - QString numberGroup = numberRe.match( keyComponent ).captured(); - if ( !numberGroup.isEmpty() ) - { - keyComponent = keyComponent.replace( numberGroup, "" ); - QString stem = keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH ); - if ( !stem.isEmpty() ) subComponents.push_back( stem ); - subComponents.push_back( numberGroup ); - } - else - { - subComponents.push_back( keyComponent.left( RimCaseDisplayNameTools::CASE_SHORT_NAME_LENGTH ) ); - } - - shortNameComponents.push_back( subComponents.join( "-" ) ); - } - return shortNameComponents.join( "," ); + return RiaEnsembleNameTools::uniqueShortName( summaryCase->summaryHeaderFilename(), summaryFilePaths, ensembleCaseName ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp index 29f2622d93..879c99fa7d 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.cpp @@ -49,64 +49,7 @@ CAF_PDM_SOURCE_INIT( RimSummaryCaseCollection, "SummaryCaseSubCollection" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double EnsembleParameter::stdDeviation() const -{ - double N = static_cast( values.size() ); - if ( N > 1 && isNumeric() ) - { - double sumValues = 0.0; - double sumValuesSquared = 0.0; - for ( const QVariant& variant : values ) - { - double value = variant.toDouble(); - sumValues += value; - sumValuesSquared += value * value; - } - - return std::sqrt( ( N * sumValuesSquared - sumValues * sumValues ) / ( N * ( N - 1.0 ) ) ); - } - return 0.0; -} - -//-------------------------------------------------------------------------------------------------- -/// Standard deviation normalized by max absolute value of min/max values. -/// Produces values between 0.0 and sqrt(2.0). -//-------------------------------------------------------------------------------------------------- -double EnsembleParameter::normalizedStdDeviation() const -{ - const double eps = 1.0e-4; - - double maxAbs = std::max( std::fabs( maxValue ), std::fabs( minValue ) ); - if ( maxAbs < eps ) - { - return 0.0; - } - - double normalisedStdDev = stdDeviation() / maxAbs; - if ( normalisedStdDev < eps ) - { - return 0.0; - } - return normalisedStdDev; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -bool EnsembleParameter::operator<( const EnsembleParameter& other ) const -{ - if ( this->variationBin != other.variationBin ) - { - return this->variationBin > other.variationBin; // Larger first - } - - return this->name < other.name; -} - -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void RimSummaryCaseCollection::sortByBinnedVariation( std::vector& parameterVector ) +void RimSummaryCaseCollection::sortByBinnedVariation( std::vector& parameterVector ) { double minStdDev = std::numeric_limits::infinity(); double maxStdDev = 0.0; @@ -124,16 +67,16 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector bins; bins.push_back( 0.0 ); - for ( int i = 0; i < EnsembleParameter::NR_OF_VARIATION_BINS - 1; ++i ) + for ( int i = 0; i < RigEnsembleParameter::NR_OF_VARIATION_BINS - 1; ++i ) { bins.push_back( minStdDev + ( i + 1 ) * delta ); } - for ( EnsembleParameter& nameParamPair : parameterVector ) + for ( RigEnsembleParameter& nameParamPair : parameterVector ) { int binNumber = -1; for ( double bin : bins ) @@ -150,40 +93,11 @@ void RimSummaryCaseCollection::sortByBinnedVariation( std::vector rhs.variationBin; } ); } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -QString EnsembleParameter::uiName() const -{ - QString stem = name; - QString variationString; - if ( isNumeric() ) - { - switch ( variationBin ) - { - case NO_VARIATION: - variationString = QString( " (No variation)" ); - break; - case LOW_VARIATION: - variationString = QString( " (Low variation)" ); - break; - case MEDIUM_VARIATION: - variationString = QString( " (Medium variation)" ); - break; - case HIGH_VARIATION: - variationString = QString( " (High variation)" ); - break; - } - } - - return QString( "%1%2" ).arg( stem ).arg( variationString ); -} - //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -194,7 +108,7 @@ RimSummaryCaseCollection::RimSummaryCaseCollection() CAF_PDM_InitScriptableObject( "Summary Case Group", ":/SummaryGroup16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_cases, "SummaryCases", "", "", "", "" ); - m_cases.uiCapability()->setUiHidden( true ); + m_cases.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitScriptableField( &m_name, "SummaryCollectionName", QString( "Group" ), "Name", "", "", "" ); @@ -448,7 +362,7 @@ RifReaderRftInterface* RimSummaryCaseCollection::rftStatisticsReader() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCaseCollection::variationSortedEnsembleParameters( bool excludeNoVariation ) const +std::vector RimSummaryCaseCollection::variationSortedEnsembleParameters( bool excludeNoVariation ) const { if ( m_cachedSortedEnsembleParameters.empty() ) { @@ -480,8 +394,8 @@ std::vector RimSummaryCaseCollection::variationSortedEnsemble } else { - const double epsilon = 1e-9; - std::vector parametersWithVariation; + const double epsilon = 1e-9; + std::vector parametersWithVariation; for ( const auto& p : m_cachedSortedEnsembleParameters ) { if ( std::abs( p.normalizedStdDeviation() ) > epsilon ) @@ -496,13 +410,13 @@ std::vector RimSummaryCaseCollection::variationSortedEnsemble //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address ) const { auto parameters = parameterCorrelationsAllTimeSteps( address ); std::sort( parameters.begin(), parameters.end(), - []( const std::pair& lhs, const std::pair& rhs ) { + []( const std::pair& lhs, const std::pair& rhs ) { return std::abs( lhs.second ) > std::abs( rhs.second ); } ); return parameters; @@ -511,14 +425,14 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const { auto parameters = parameterCorrelations( address, selectedTimeStep ); std::sort( parameters.begin(), parameters.end(), - []( const std::pair& lhs, const std::pair& rhs ) { + []( const std::pair& lhs, const std::pair& rhs ) { return std::abs( lhs.second ) > std::abs( rhs.second ); } ); return parameters; @@ -536,7 +450,7 @@ time_t timeDiff( time_t lhs, time_t rhs ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::parameterCorrelations( const RifEclipseSummaryAddress& address, time_t timeStep, const std::vector& selectedParameters, @@ -548,7 +462,7 @@ std::vector> { parameters.erase( std::remove_if( parameters.begin(), parameters.end(), - [&selectedParameters]( const EnsembleParameter& parameter ) { + [&selectedParameters]( const RigEnsembleParameter& parameter ) { return std::find( selectedParameters.begin(), selectedParameters.end(), parameter.name ) == selectedParameters.end(); @@ -556,8 +470,8 @@ std::vector> parameters.end() ); } - std::vector caseValuesAtTimestep; - std::map> parameterValues; + std::vector caseValuesAtTimestep; + std::map> parameterValues; for ( size_t caseIdx = 0u; caseIdx < m_cases.size(); ++caseIdx ) { @@ -600,7 +514,7 @@ std::vector> } } - std::vector> correlationResults; + std::vector> correlationResults; for ( auto parameterValuesPair : parameterValues ) { double correlation = 0.0; @@ -614,7 +528,7 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// Returns a vector of the parameters and the average absolute values of correlations per time step //-------------------------------------------------------------------------------------------------- -std::vector> +std::vector> RimSummaryCaseCollection::parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address, const std::vector& selectedParameters ) const { @@ -625,11 +539,11 @@ std::vector> std::vector timeStepsVector( timeSteps.begin(), timeSteps.end() ); size_t stride = std::max( (size_t)1, timeStepsVector.size() / maxTimeStepCount ); - std::vector>> correlationsForChosenTimeSteps; + std::vector>> correlationsForChosenTimeSteps; for ( size_t i = stride; i < timeStepsVector.size(); i += stride ) { - std::vector> correlationsForTimeStep = + std::vector> correlationsForTimeStep = parameterCorrelations( address, timeStepsVector[i], selectedParameters ); correlationsForChosenTimeSteps.push_back( correlationsForTimeStep ); } @@ -652,7 +566,7 @@ std::vector> //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSummaryCaseCollection::alphabeticEnsembleParameters() const +std::vector RimSummaryCaseCollection::alphabeticEnsembleParameters() const { std::set paramSet; for ( RimSummaryCase* rimCase : this->allSummaryCases() ) @@ -667,7 +581,7 @@ std::vector RimSummaryCaseCollection::alphabeticEnsembleParam } } - std::vector sortedEnsembleParameters; + std::vector sortedEnsembleParameters; sortedEnsembleParameters.reserve( paramSet.size() ); for ( const QString& parameterName : paramSet ) { @@ -679,23 +593,23 @@ std::vector RimSummaryCaseCollection::alphabeticEnsembleParam //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -EnsembleParameter RimSummaryCaseCollection::ensembleParameter( const QString& paramName ) const +RigEnsembleParameter RimSummaryCaseCollection::ensembleParameter( const QString& paramName ) const { - if ( !isEnsemble() || paramName.isEmpty() ) return EnsembleParameter(); + if ( !isEnsemble() || paramName.isEmpty() ) return RigEnsembleParameter(); - const std::vector& ensembleParams = variationSortedEnsembleParameters(); + const std::vector& ensembleParams = variationSortedEnsembleParameters(); - for ( const EnsembleParameter& ensParam : ensembleParams ) + for ( const RigEnsembleParameter& ensParam : ensembleParams ) { if ( ensParam.name == paramName ) return ensParam; } - return EnsembleParameter(); + return RigEnsembleParameter(); } -EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QString& paramName ) const +RigEnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QString& paramName ) const { - EnsembleParameter eParam; + RigEnsembleParameter eParam; eParam.name = paramName; size_t numericValuesCount = 0; @@ -734,11 +648,11 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri if ( numericValuesCount && !textValuesCount ) { - eParam.type = EnsembleParameter::TYPE_NUMERIC; + eParam.type = RigEnsembleParameter::TYPE_NUMERIC; } else if ( textValuesCount && !numericValuesCount ) { - eParam.type = EnsembleParameter::TYPE_TEXT; + eParam.type = RigEnsembleParameter::TYPE_TEXT; } if ( numericValuesCount && textValuesCount ) { @@ -753,7 +667,7 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri val.setValue( std::numeric_limits::infinity() ); } } - eParam.type = EnsembleParameter::TYPE_NUMERIC; + eParam.type = RigEnsembleParameter::TYPE_NUMERIC; } else { @@ -765,7 +679,7 @@ EnsembleParameter RimSummaryCaseCollection::createEnsembleParameter( const QStri val.setValue( QString::number( val.value() ) ); } } - eParam.type = EnsembleParameter::TYPE_TEXT; + eParam.type = RigEnsembleParameter::TYPE_TEXT; eParam.minValue = std::numeric_limits::infinity(); eParam.maxValue = -std::numeric_limits::infinity(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h index 360e128eed..d5c389cfcc 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseCollection.h @@ -23,6 +23,8 @@ #include "RifEclipseSummaryAddress.h" #include "RifReaderEnsembleStatisticsRft.h" +#include "RigEnsembleParameter.h" + #include "RimObjectiveFunction.h" #include "cafPdmChildArrayField.h" @@ -39,53 +41,6 @@ class RifReaderRftInterface; class RifReaderEnsembleStatisticsRft; class RimSummaryCase; -//================================================================================================== -/// -//================================================================================================== -class EnsembleParameter -{ -public: - enum Type - { - TYPE_NONE, - TYPE_NUMERIC, - TYPE_TEXT - }; - enum Bins - { - NO_VARIATION = -1, - LOW_VARIATION = 0, - MEDIUM_VARIATION, - HIGH_VARIATION, - NR_OF_VARIATION_BINS - }; - QString uiName() const; - QString name; - Type type; - std::vector values; - double minValue; - double maxValue; - int variationBin; - - EnsembleParameter() - : type( TYPE_NONE ) - , minValue( std::numeric_limits::infinity() ) - , maxValue( -std::numeric_limits::infinity() ) - , variationBin( static_cast( MEDIUM_VARIATION ) ) - { - } - - bool isValid() const { return !name.isEmpty() && type != TYPE_NONE; } - bool isNumeric() const { return type == TYPE_NUMERIC; } - bool isText() const { return type == TYPE_TEXT; } - double normalizedStdDeviation() const; - - bool operator<( const EnsembleParameter& other ) const; - -private: - double stdDeviation() const; -}; - //================================================================================================== /// //================================================================================================== @@ -117,26 +72,26 @@ class RimSummaryCaseCollection : public caf::PdmObject int ensembleId() const; bool hasEnsembleParameters() const; - std::vector variationSortedEnsembleParameters( bool excludeNoVariation = false ) const; - std::vector> + std::vector variationSortedEnsembleParameters( bool excludeNoVariation = false ) const; + std::vector> correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address ) const; - std::vector> + std::vector> correlationSortedEnsembleParameters( const RifEclipseSummaryAddress& address, time_t selectedTimeStep ) const; - std::vector> + std::vector> parameterCorrelations( const RifEclipseSummaryAddress& address, time_t selectedTimeStep, const std::vector& selectedParameters = {}, const std::set& selectedCases = {} ) const; - std::vector> + std::vector> parameterCorrelationsAllTimeSteps( const RifEclipseSummaryAddress& address, const std::vector& selectedParameters = {} ) const; - std::vector alphabeticEnsembleParameters() const; + std::vector alphabeticEnsembleParameters() const; - EnsembleParameter ensembleParameter( const QString& paramName ) const; - void calculateEnsembleParametersIntersectionHash(); - void clearEnsembleParametersHashes(); + RigEnsembleParameter ensembleParameter( const QString& paramName ) const; + void calculateEnsembleParametersIntersectionHash(); + void clearEnsembleParametersHashes(); void loadDataAndUpdate(); @@ -146,8 +101,8 @@ class RimSummaryCaseCollection : public caf::PdmObject RiaDefines::EclipseUnitSystem unitSystem() const; private: - EnsembleParameter createEnsembleParameter( const QString& paramName ) const; - static void sortByBinnedVariation( std::vector& parameterVector ); + RigEnsembleParameter createEnsembleParameter( const QString& paramName ) const; + static void sortByBinnedVariation( std::vector& parameterVector ); friend class RimSummaryCaseCollection_TESTER; caf::PdmFieldHandle* userDescriptionField() override; @@ -177,5 +132,5 @@ class RimSummaryCaseCollection : public caf::PdmObject size_t m_commonAddressCount; // if different address count among cases, set to 0 - mutable std::vector m_cachedSortedEnsembleParameters; + mutable std::vector m_cachedSortedEnsembleParameters; }; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp index bebbc61924..d351bb20f1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCaseMainCollection.cpp @@ -100,8 +100,8 @@ RimSummaryCaseMainCollection::RimSummaryCaseMainCollection() CAF_PDM_InitFieldNoDefault( &m_cases, "SummaryCases", "", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_caseCollections, "SummaryCaseCollections", "", "", "", "" ); - m_cases.uiCapability()->setUiHidden( true ); - m_caseCollections.uiCapability()->setUiHidden( true ); + m_cases.uiCapability()->setUiTreeHidden( true ); + m_caseCollections.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -484,7 +484,7 @@ void RimSummaryCaseMainCollection::loadFileSummaryCaseData( std::vector 0 ) + auto numberOfEsmryFilesCreated = RifOpmCommonEclipseSummary::numberOfEnhancedSummaryFileCreated(); + if ( numberOfEsmryFilesCreated > 0 ) { - RiaLogging::info( QString( "Optimized Summary Reader : Converted and created %1 '*.LODSMRY' files on disk." ) - .arg( numberOfLodFilesCreated ) ); + RiaLogging::info( + QString( "Summary Files : Converted and created %1 '*.ESMRY' files on disk." ).arg( numberOfEsmryFilesCreated ) ); } // This loop is not thread safe, use serial loop diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp index 9bbc5affb0..0f5fb8842a 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCrossPlotCollection.cpp @@ -34,7 +34,7 @@ RimSummaryCrossPlotCollection::RimSummaryCrossPlotCollection() CAF_PDM_InitObject( "Summary Cross Plots", ":/SummaryXPlotsLight16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_summaryCrossPlots, "SummaryCrossPlots", "Summary Cross Plots", "", "", "" ); - m_summaryCrossPlots.uiCapability()->setUiHidden( true ); + m_summaryCrossPlots.uiCapability()->setUiTreeHidden( true ); caf::PdmFieldReorderCapability::addToField( &m_summaryCrossPlots ); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp index 1ae4e4b872..f2db0bec13 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurve.cpp @@ -24,7 +24,6 @@ #include "RiaLogging.h" #include "RiaPreferencesSummary.h" #include "RiaResultNames.h" -#include "RiaStatisticsTools.h" #include "RiaSummaryCurveDefinition.h" #include "RiaSummaryTools.h" @@ -78,7 +77,7 @@ RimSummaryCurve::RimSummaryCurve() m_yValuesSummaryAddressUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryAddress, "SummaryAddress", "Summary Address", "", "", "" ); - m_yValuesSummaryAddress.uiCapability()->setUiHidden( true ); + m_yValuesSummaryAddress.uiCapability()->setUiTreeHidden( true ); m_yValuesSummaryAddress.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_yPushButtonSelectSummaryAddress, "SelectAddress", "", "", "", "" ); @@ -100,7 +99,7 @@ RimSummaryCurve::RimSummaryCurve() m_xValuesSummaryAddressUiField.uiCapability()->setUiEditorTypeName( caf::PdmUiLineEditor::uiEditorTypeName() ); CAF_PDM_InitFieldNoDefault( &m_xValuesSummaryAddress, "SummaryAddressX", "Summary Address", "", "", "" ); - m_xValuesSummaryAddress.uiCapability()->setUiHidden( true ); + m_xValuesSummaryAddress.uiCapability()->setUiTreeHidden( true ); m_xValuesSummaryAddress.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_xPushButtonSelectSummaryAddress, "SelectAddressX", "", "", "", "" ); @@ -118,7 +117,7 @@ RimSummaryCurve::RimSummaryCurve() CAF_PDM_InitFieldNoDefault( &m_plotAxis, "PlotAxis", "Axis", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_curveNameConfig, "SummaryCurveNameConfig", "SummaryCurveNameConfig", "", "", "" ); - m_curveNameConfig.uiCapability()->setUiHidden( true ); + m_curveNameConfig.uiCapability()->setUiTreeHidden( true ); m_curveNameConfig.uiCapability()->setUiTreeChildrenHidden( true ); m_curveNameConfig = new RimSummaryCurveAutoName; @@ -126,18 +125,18 @@ RimSummaryCurve::RimSummaryCurve() CAF_PDM_InitField( &m_isTopZWithinCategory, "isTopZWithinCategory", false, "", "", "", "" ); m_isTopZWithinCategory.uiCapability()->setUiHidden( true ); - m_symbolSkipPixelDistance = 10.0f; - m_curveThickness = 2; + setSymbolSkipDistance( 10.0f ); + setLineThickness( 2 ); CAF_PDM_InitFieldNoDefault( &m_yValuesSummaryFilter_OBSOLETE, "VarListFilter", "Filter", "", "", "" ); m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeChildrenHidden( true ); - m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiHidden( true ); + m_yValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_yValuesSummaryFilter_OBSOLETE.xmlCapability()->setIOWritable( false ); m_yValuesSummaryFilter_OBSOLETE = new RimSummaryFilter_OBSOLETE; CAF_PDM_InitFieldNoDefault( &m_xValuesSummaryFilter_OBSOLETE, "VarListFilterX", "Filter", "", "", "" ); m_xValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeChildrenHidden( true ); - m_xValuesSummaryFilter_OBSOLETE.uiCapability()->setUiHidden( true ); + m_xValuesSummaryFilter_OBSOLETE.uiCapability()->setUiTreeHidden( true ); m_xValuesSummaryFilter_OBSOLETE.xmlCapability()->setIOWritable( false ); m_xValuesSummaryFilter_OBSOLETE = new RimSummaryFilter_OBSOLETE; @@ -381,7 +380,8 @@ double RimSummaryCurve::yValueAtTimeT( time_t time ) const } else if ( i < timeSteps.size() - 1u && timeSteps[i] < time && time < timeSteps[i + 1] ) { - if ( m_curveInterpolation == RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT ) + if ( m_curveAppearance->interpolation() == + RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT ) { return values[i + 1]; } @@ -745,6 +745,8 @@ void RimSummaryCurve::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrderi //-------------------------------------------------------------------------------------------------- void RimSummaryCurve::initAfterRead() { + RimStackablePlotCurve::initAfterRead(); + if ( m_isEnsembleCurve().isPartiallyTrue() ) { m_isEnsembleCurve.v() = ( summaryCaseY() && summaryCaseY()->ensemble() ) ? caf::Tristate::State::True @@ -941,11 +943,6 @@ QString RimSummaryCurve::curveExportDescription( const RifEclipseSummaryAddress& auto group = curveSet ? curveSet->summaryCaseCollection() : nullptr; auto addressUiText = addr.uiText(); - if ( addr.category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) - { - addressUiText = - RiaStatisticsTools::replacePercentileByPValueText( QString::fromStdString( addressUiText ) ).toStdString(); - } if ( group && group->isEnsemble() ) { @@ -982,7 +979,7 @@ void RimSummaryCurve::setCurveAppearanceFromCaseType() if ( prefs->defaultSummaryHistoryCurveStyle() == RiaPreferencesSummary::SummaryHistoryCurveStyleMode::SYMBOLS ) { - m_symbolEdgeColor = m_curveColor; + setSymbolEdgeColor( m_curveAppearance->color() ); setSymbol( RiuQwtSymbol::SYMBOL_XCROSS ); setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); @@ -990,7 +987,7 @@ void RimSummaryCurve::setCurveAppearanceFromCaseType() else if ( prefs->defaultSummaryHistoryCurveStyle() == RiaPreferencesSummary::SummaryHistoryCurveStyleMode::SYMBOLS_AND_LINES ) { - m_symbolEdgeColor = m_curveColor; + setSymbolEdgeColor( m_curveAppearance->color() ); setSymbol( RiuQwtSymbol::SYMBOL_XCROSS ); setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); @@ -1268,11 +1265,12 @@ void RimSummaryCurve::calculateCurveInterpolationFromAddress() auto address = m_yValuesSummaryAddress()->address(); if ( RiaSummaryTools::hasAccumulatedData( address ) ) { - m_curveInterpolation = RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_POINT_TO_POINT; + m_curveAppearance->setInterpolation( + RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_POINT_TO_POINT ); } else { - m_curveInterpolation = RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT; + m_curveAppearance->setInterpolation( RiuQwtPlotCurveDefines::CurveInterpolationEnum::INTERPOLATION_STEP_LEFT ); } } } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp index dac2d8d849..ac6459e6df 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveAutoName.cpp @@ -18,8 +18,6 @@ #include "RimSummaryCurveAutoName.h" -#include "RiaStatisticsTools.h" - #include "RifEclipseSummaryAddress.h" #include "RimEnsembleCurveSet.h" @@ -196,9 +194,7 @@ QString RimSummaryCurveAutoName::buildCurveName( const RifEclipseSummaryAddress& if ( summaryAddress.category() == RifEclipseSummaryAddress::SUMMARY_ENSEMBLE_STATISTICS ) { - text = RiaStatisticsTools::replacePercentileByPValueText( - QString::fromStdString( summaryAddress.quantityName() ) ) - .toStdString(); + text = summaryAddress.quantityName(); } else if ( summaryAddress.category() == RifEclipseSummaryAddress::SUMMARY_CALCULATED ) { diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp index c3406c4980..531d7e7800 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveCollection.cpp @@ -51,12 +51,13 @@ RimSummaryCurveCollection::RimSummaryCurveCollection() CAF_PDM_InitObject( "Summary Curves", ":/SummaryCurveFilter16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_curves, "CollectionCurves", "Collection Curves", "", "", "" ); - m_curves.uiCapability()->setUiHidden( true ); + m_curves.uiCapability()->setUiTreeHidden( true ); m_curves.uiCapability()->setUiTreeChildrenHidden( false ); caf::PdmFieldReorderCapability::addToFieldWithCallback( &m_curves, this, &RimSummaryCurveCollection::onCurvesReordered ); CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves", "", "", "" ); m_showCurves.uiCapability()->setUiHidden( true ); + m_showCurves.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitField( &m_editPlot, "EditPlot", false, "", "", "", "" ); m_editPlot.xmlCapability()->disableIO(); @@ -65,21 +66,21 @@ RimSummaryCurveCollection::RimSummaryCurveCollection() CAF_PDM_InitFieldNoDefault( &m_ySourceStepping, "YSourceStepping", "", "", "", "" ); m_ySourceStepping = new RimSummaryPlotSourceStepping; m_ySourceStepping->setSourceSteppingType( RimSummaryPlotSourceStepping::Y_AXIS ); - m_ySourceStepping.uiCapability()->setUiHidden( true ); + m_ySourceStepping.uiCapability()->setUiTreeHidden( true ); m_ySourceStepping.uiCapability()->setUiTreeChildrenHidden( true ); m_ySourceStepping.xmlCapability()->disableIO(); CAF_PDM_InitFieldNoDefault( &m_xSourceStepping, "XSourceStepping", "", "", "", "" ); m_xSourceStepping = new RimSummaryPlotSourceStepping; m_xSourceStepping->setSourceSteppingType( RimSummaryPlotSourceStepping::X_AXIS ); - m_xSourceStepping.uiCapability()->setUiHidden( true ); + m_xSourceStepping.uiCapability()->setUiTreeHidden( true ); m_xSourceStepping.uiCapability()->setUiTreeChildrenHidden( true ); m_xSourceStepping.xmlCapability()->disableIO(); CAF_PDM_InitFieldNoDefault( &m_unionSourceStepping, "UnionSourceStepping", "", "", "", "" ); m_unionSourceStepping = new RimSummaryPlotSourceStepping; m_unionSourceStepping->setSourceSteppingType( RimSummaryPlotSourceStepping::UNION_X_Y_AXIS ); - m_unionSourceStepping.uiCapability()->setUiHidden( true ); + m_unionSourceStepping.uiCapability()->setUiTreeHidden( true ); m_unionSourceStepping.uiCapability()->setUiTreeChildrenHidden( true ); m_unionSourceStepping.xmlCapability()->disableIO(); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveFilter.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveFilter.cpp index 0cb61ce3ea..3f0f094ef1 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveFilter.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryCurveFilter.cpp @@ -57,7 +57,7 @@ RimSummaryCurveFilter_OBSOLETE::RimSummaryCurveFilter_OBSOLETE() CAF_PDM_InitFieldNoDefault( &m_summaryFilter, "VarListFilter", "Filter", "", "", "" ); m_summaryFilter.uiCapability()->setUiTreeChildrenHidden( true ); - m_summaryFilter.uiCapability()->setUiHidden( true ); + m_summaryFilter.uiCapability()->setUiTreeHidden( true ); m_summaryFilter = new RimSummaryFilter_OBSOLETE; @@ -73,7 +73,7 @@ RimSummaryCurveFilter_OBSOLETE::RimSummaryCurveFilter_OBSOLETE() m_uiFilterResultMultiSelection.uiCapability()->setAutoAddingOptionFromValue( false ); CAF_PDM_InitFieldNoDefault( &m_curves, "FilteredCurves", "Filtered Curves", "", "", "" ); - m_curves.uiCapability()->setUiHidden( true ); + m_curves.uiCapability()->setUiTreeHidden( true ); m_curves.uiCapability()->setUiTreeChildrenHidden( false ); CAF_PDM_InitFieldNoDefault( &m_applyButtonField, "ApplySelection", "", "", "", "" ); @@ -99,7 +99,7 @@ RimSummaryCurveFilter_OBSOLETE::RimSummaryCurveFilter_OBSOLETE() CAF_PDM_InitField( &m_showLegend, "ShowLegend", true, "Contribute To Legend", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_curveNameConfig, "SummaryCurveNameConfig", "SummaryCurveNameConfig", "", "", "" ); - m_curveNameConfig.uiCapability()->setUiHidden( true ); + m_curveNameConfig.uiCapability()->setUiTreeHidden( true ); m_curveNameConfig.uiCapability()->setUiTreeChildrenHidden( true ); m_curveNameConfig = new RimSummaryCurveAutoName; diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp index 650f55b111..23ce5e6053 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlot.cpp @@ -212,7 +212,6 @@ RimSummaryPlot::RimSummaryPlot() CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSetCollection, "EnsembleCurveSetCollection", "", "", "", "" ); m_ensembleCurveSetCollection.uiCapability()->setUiTreeHidden( true ); - m_ensembleCurveSetCollection.uiCapability()->setUiHidden( true ); m_ensembleCurveSetCollection = new RimEnsembleCurveSetCollection(); CAF_PDM_InitFieldNoDefault( &m_gridTimeHistoryCurves, "GridTimeHistoryCurves", "", "", "", "" ); diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp index f98ee0be93..c34ba3b365 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryPlotCollection.cpp @@ -40,7 +40,7 @@ RimSummaryPlotCollection::RimSummaryPlotCollection() CAF_PDM_InitScriptableObject( "Summary Plots", ":/SummaryPlotsLight16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_summaryPlots, "SummaryPlots", "Summary Plots", "", "", "" ); - m_summaryPlots.uiCapability()->setUiHidden( true ); + m_summaryPlots.uiCapability()->setUiTreeHidden( true ); caf::PdmFieldReorderCapability::addToField( &m_summaryPlots ); } diff --git a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp index 349a17e572..44f3305d12 100644 --- a/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp +++ b/ApplicationLibCode/ProjectDataModel/Summary/RimSummaryTimeAxisProperties.cpp @@ -118,8 +118,7 @@ RimSummaryTimeAxisProperties::RimSummaryTimeAxisProperties() CAF_PDM_InitFieldNoDefault( &m_majorTickmarkCount, "MajorTickmarkCount", "Major Tickmark Count", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_annotations, "Annotations", "", "", "", "" ); - - m_annotations.uiCapability()->setUiHidden( true ); + m_annotations.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/Surfaces/CMakeLists_files.cmake index ed70f6f4d3..40d2d3b7fa 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/CMakeLists_files.cmake @@ -1,30 +1,33 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimSurface.h -${CMAKE_CURRENT_LIST_DIR}/RimFileSurface.h -${CMAKE_CURRENT_LIST_DIR}/RimGridCaseSurface.h -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInView.h -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInViewCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceResultDefinition.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RimFileSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RimGridCaseSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInView.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceResultDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsSurface.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimSurface.cpp -${CMAKE_CURRENT_LIST_DIR}/RimFileSurface.cpp -${CMAKE_CURRENT_LIST_DIR}/RimGridCaseSurface.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInView.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInViewCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSurfaceResultDefinition.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimFileSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimGridCaseSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSurfaceResultDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleStatisticsSurface.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModel\\Surface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModel\\Surface" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.cpp new file mode 100644 index 0000000000..d7f45e9301 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.cpp @@ -0,0 +1,153 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleStatisticsSurface.h" + +#include "RigSurface.h" +#include "RigSurfaceStatisticsCalculator.h" +#include "RimEnsembleSurface.h" +#include "RimSurfaceCollection.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +#include + +CAF_PDM_SOURCE_INIT( RimEnsembleStatisticsSurface, "EnsembleStatisticsSurface" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleStatisticsSurface::RimEnsembleStatisticsSurface() +{ + CAF_PDM_InitScriptableObject( "Surface", ":/ReservoirSurface16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_statisticsType, "StatisticsType", "StatisticsType", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleStatisticsSurface::~RimEnsembleStatisticsSurface() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleStatisticsSurface::setStatisticsType( RigSurfaceStatisticsCalculator::StatisticsType statisticsType ) +{ + m_statisticsType = statisticsType; + + setUserDescription( fullName() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigSurfaceStatisticsCalculator::StatisticsType RimEnsembleStatisticsSurface::statisticsType() const +{ + return m_statisticsType(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleStatisticsSurface::fullName() const +{ + return caf::AppEnum::uiText( m_statisticsType.v() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleStatisticsSurface::onLoadData() +{ + return updateSurfaceData(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurface* RimEnsembleStatisticsSurface::createCopy() +{ + auto* newSurface = dynamic_cast( + xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); + + if ( !newSurface->onLoadData() ) + { + delete newSurface; + return nullptr; + } + + return newSurface; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleStatisticsSurface::updateSurfaceData() +{ + RimEnsembleSurface* ensembleSurface; + firstAncestorOrThisOfType( ensembleSurface ); + + if ( ensembleSurface ) + { + const RigSurface* surface = ensembleSurface->statisticsSurface(); + + if ( surface ) + { + const auto indices = surface->triangleIndices(); + const auto verts = extractStatisticalDepthForVertices( surface ); + + m_surfaceData = new RigSurface; + m_surfaceData->setTriangleData( indices, verts ); + + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleStatisticsSurface::extractStatisticalDepthForVertices( const RigSurface* surface ) const + +{ + CVF_ASSERT( surface ); + std::vector verts = surface->vertices(); + + const auto& meanValues = surface->propertyValues( + caf::AppEnum::text( m_statisticsType.v() ) ); + + for ( size_t i = 0; i < verts.size(); i++ ) + { + verts[i].z() = meanValues[i]; + } + + return verts; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleStatisticsSurface::clearCachedNativeData() +{ +} diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.h new file mode 100644 index 0000000000..161de1eb5d --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleStatisticsSurface.h @@ -0,0 +1,53 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RigSurface.h" + +#include "RigSurfaceStatisticsCalculator.h" + +#include "RimSurface.h" +#include "cafAppEnum.h" + +class RimEnsembleStatisticsSurface : public RimSurface +{ + CAF_PDM_HEADER_INIT; + +public: + RimEnsembleStatisticsSurface(); + ~RimEnsembleStatisticsSurface() override; + + bool onLoadData() override; + RimSurface* createCopy() override; + + void setStatisticsType( RigSurfaceStatisticsCalculator::StatisticsType statisticsType ); + RigSurfaceStatisticsCalculator::StatisticsType statisticsType() const; + + QString fullName() const override; + +protected: + bool updateSurfaceData() override; + + std::vector extractStatisticalDepthForVertices( const RigSurface* surface ) const; + + void clearCachedNativeData() override; + +private: + caf::PdmField> m_statisticsType; +}; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp new file mode 100644 index 0000000000..9c0d73058c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.cpp @@ -0,0 +1,328 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleSurface.h" + +#include "RiaLogging.h" +#include "RiaOptionItemFactory.h" + +#include "RigSurfaceResampler.h" +#include "RigSurfaceStatisticsCalculator.h" + +#include "RimEnsembleCurveSet.h" +#include "RimEnsembleStatisticsSurface.h" +#include "RimFileSurface.h" +#include "RimMainPlotCollection.h" +#include "RimProject.h" +#include "RimSurface.h" +#include "RimSurfaceCollection.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +CAF_PDM_SOURCE_INIT( RimEnsembleSurface, "EnsembleSurface" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleSurface::RimEnsembleSurface() +{ + CAF_PDM_InitScriptableObject( "Ensemble Surface", ":/ReservoirSurfaces16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSet, "FilterEnsembleCurveSet", "Filter by Ensemble Curve Set", "", "", "" ); + + std::vector statisticsTypes = + { RigSurfaceStatisticsCalculator::StatisticsType::MIN, + RigSurfaceStatisticsCalculator::StatisticsType::MAX, + RigSurfaceStatisticsCalculator::StatisticsType::MEAN, + RigSurfaceStatisticsCalculator::StatisticsType::P10, + RigSurfaceStatisticsCalculator::StatisticsType::P50, + RigSurfaceStatisticsCalculator::StatisticsType::P90 }; + + for ( auto s : statisticsTypes ) + { + auto statSurface = new RimEnsembleStatisticsSurface; + statSurface->setStatisticsType( s ); + addSurface( statSurface ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::addFileSurface( RimFileSurface* fileSurface ) +{ + if ( !sourceFileSurfaceCollection() ) + { + auto coll = new RimSurfaceCollection; + coll->setCollectionName( ensembleSourceFileCollectionName() ); + addSubCollection( coll ); + } + + sourceFileSurfaceCollection()->addSurface( fileSurface ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleSurface::sourceFileSurfaces() const +{ + std::vector fileSurfs; + for ( auto& w : sourceFileSurfaceCollection()->surfaces() ) + { + if ( auto fsurf = dynamic_cast( w ) ) + { + fileSurfs.push_back( fsurf ); + } + else + { + RiaLogging::warning( QString( "Detected unknown surface type in File Surface collection" ) ); + } + } + + return fileSurfs; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::loadDataAndUpdate() +{ + { + auto fileSurfaces = sourceFileSurfaces(); + auto surfaceCount = static_cast( fileSurfaces.size() ); +#pragma omp parallel for + for ( int i = 0; i < surfaceCount; i++ ) + { + auto surf = fileSurfaces[i]; + surf->onLoadData(); + } + } + + std::vector sourceSurfaceForStatistics = sourceFileSurfaces(); + if ( m_ensembleCurveSet != nullptr ) + { + sourceSurfaceForStatistics = filterByEnsembleCurveSet( sourceSurfaceForStatistics ); + } + + if ( !sourceSurfaceForStatistics.empty() ) + { + for ( auto& surf : sourceSurfaceForStatistics ) + { + // The search tree must be created before the multi threading loop is initiated to avoid crash in + // RigSurfaceResampler::resampleSurface + // NB! Do not use OpenMP on this loop, as the construction of the AABB tree is using OpenMP internally, and + // mixing these causes crash. + + surf->surfaceData()->ensureIntersectionSearchTreeIsBuilt(); + } + + cvf::ref firstSurface = sourceSurfaceForStatistics[0]->surfaceData(); + auto surfaceCount = static_cast( sourceSurfaceForStatistics.size() ); + std::vector> sourceSurfaces( surfaceCount ); +#pragma omp parallel for + for ( int i = 0; i < surfaceCount; i++ ) + { + auto surf = sourceSurfaceForStatistics[i]; + auto resampledSurface = RigSurfaceResampler::resampleSurface( firstSurface, surf->surfaceData() ); + sourceSurfaces[i] = resampledSurface; + } + + m_statisticsSurface = RigSurfaceStatisticsCalculator::computeStatistics( sourceSurfaces ); + if ( !m_statisticsSurface.isNull() ) + { + for ( auto statSurface : surfaces() ) + { + statSurface->onLoadData(); + } + } + } + + RimSurfaceCollection* surfColl; + this->firstAncestorOrThisOfTypeAsserted( surfColl ); + + std::vector surfacesToUpdate; + surfColl->updateViews( surfaces(), false ); + updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RimEnsembleSurface::filterByEnsembleCurveSet( const std::vector& fileSurfaces ) const +{ + std::vector filteredCases; + + if ( m_ensembleCurveSet != nullptr ) + { + // Get the summary cases from the related ensemble summary curve set. + RimSummaryCaseCollection* summaryCaseCollection = m_ensembleCurveSet->summaryCaseCollection(); + + // + std::vector sumCases = + m_ensembleCurveSet->filterEnsembleCases( summaryCaseCollection->allSummaryCases() ); + for ( auto sumCase : sumCases ) + { + for ( auto fileSurface : fileSurfaces ) + { + if ( isSameRealization( sumCase, fileSurface ) ) + { + filteredCases.push_back( fileSurface ); + } + } + } + } + else + { + filteredCases = fileSurfaces; + } + + return filteredCases; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleSurface::isSameRealization( RimSummaryCase* summaryCase, RimFileSurface* fileSurface ) const +{ + // TODO: duplication with RimEnsembleWellLogCurveSet::isSameRealization + QString fileSurfaceName = fileSurface->surfaceFilePath(); + if ( summaryCase->hasCaseRealizationParameters() ) + { + // TODO: make less naive.. + int realizationNumber = summaryCase->caseRealizationParameters()->realizationNumber(); + QString summaryCaseFileName = summaryCase->summaryHeaderFilename(); + + if ( fileSurfaceName.contains( QString( "realization-%1" ).arg( realizationNumber ) ) ) + { + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RigSurface* RimEnsembleSurface::statisticsSurface() const +{ + return m_statisticsSurface.p(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimEnsembleSurface::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_ensembleCurveSet ) + { + RiaOptionItemFactory::appendOptionItemsForEnsembleCurveSets( &options ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::connectEnsembleCurveSetFilterSignals() +{ + if ( m_ensembleCurveSet() ) + { + m_ensembleCurveSet()->filterChanged.connect( this, &RimEnsembleSurface::onFilterSourceChanged ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::onFilterSourceChanged( const caf::SignalEmitter* emitter ) +{ + if ( m_ensembleCurveSet() ) loadDataAndUpdate(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurfaceCollection* RimEnsembleSurface::sourceFileSurfaceCollection() const + +{ + auto name = ensembleSourceFileCollectionName(); + + return getSubCollection( name ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleSurface::ensembleSourceFileCollectionName() +{ + auto name = caf::AppEnum::uiText( RimSurface::SurfaceType::ENSEMBLE_SOURCE ); + + return name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::loadData() +{ + loadDataAndUpdate(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSurface* RimEnsembleSurface::findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType statisticsType ) +{ + for ( auto s : surfaces() ) + { + auto ensembleSurface = dynamic_cast( s ); + + if ( ensembleSurface && ensembleSurface->statisticsType() == statisticsType ) return s; + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::initAfterRead() +{ + connectEnsembleCurveSetFilterSignals(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleSurface::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( changedField == &m_ensembleCurveSet ) + { + connectEnsembleCurveSetFilterSignals(); + loadDataAndUpdate(); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.h new file mode 100644 index 0000000000..495474920c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimEnsembleSurface.h @@ -0,0 +1,79 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimSurfaceCollection.h" + +#include "RigSurfaceStatisticsCalculator.h" + +#include "cafPdmChildArrayField.h" +#include "cafPdmPtrField.h" + +#include "cvfObject.h" + +class RimFileSurface; +class RimSurface; +class RigSurface; +class RimEnsembleStatisticsSurface; +class RimEnsembleCurveSet; +class RimSummaryCase; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleSurface : public RimSurfaceCollection +{ + CAF_PDM_HEADER_INIT; + +public: + RimEnsembleSurface(); + + void addFileSurface( RimFileSurface* fileSurface ); + void loadDataAndUpdate(); + const RigSurface* statisticsSurface() const; + + static QString ensembleSourceFileCollectionName(); + + void loadData() override; + + RimSurface* findStatisticsSurface( RigSurfaceStatisticsCalculator::StatisticsType statisticsType ); + +protected: + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void initAfterRead() override; + + std::vector filterByEnsembleCurveSet( const std::vector& fileSurfaces ) const; + + bool isSameRealization( RimSummaryCase* summaryCase, RimFileSurface* fileSurface ) const; + +private: + void connectEnsembleCurveSetFilterSignals(); + void onFilterSourceChanged( const caf::SignalEmitter* emitter ); + + RimSurfaceCollection* sourceFileSurfaceCollection() const; + std::vector sourceFileSurfaces() const; + +private: + caf::PdmPtrField m_ensembleCurveSet; + + cvf::ref m_statisticsSurface; +}; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimFileSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimFileSurface.cpp index fb91f68ff6..19cff0309f 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimFileSurface.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimFileSurface.cpp @@ -31,10 +31,7 @@ #include -// TODO: Use the alias concept prototyped below when the alias concept for class is ready -// CAF_PDM_SOURCE_INIT( RimFileSurface, "FileSurface", "Surface" ); -// CAF_PDM_SOURCE_INIT( , , ); -CAF_PDM_SOURCE_INIT( RimFileSurface, "Surface" ); +CAF_PDM_SOURCE_INIT( RimFileSurface, "Surface", "FileSurface" ); //-------------------------------------------------------------------------------------------------- /// @@ -59,10 +56,6 @@ RimFileSurface::~RimFileSurface() void RimFileSurface::setSurfaceFilePath( const QString& filePath ) { m_surfaceDefinitionFilePath = filePath; - if ( userDescription().isEmpty() ) - { - setUserDescription( QFileInfo( filePath ).fileName() ); - } clearCachedNativeData(); } diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimGridCaseSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimGridCaseSurface.cpp index 4fb06c4875..6f8d1da5c4 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimGridCaseSurface.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimGridCaseSurface.cpp @@ -18,17 +18,19 @@ #include "RimGridCaseSurface.h" +#include "RigMainGrid.h" +#include "RigReservoirGridTools.h" #include "RigSurface.h" -#include "RigMainGrid.h" #include "RimCase.h" #include "RimEclipseCase.h" #include "RimSurfaceCollection.h" #include "RimTools.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" #include "cafPdmUiSliderEditor.h" -#include "RigReservoirGridTools.h" #include "cvfVector3.h" CAF_PDM_SOURCE_INIT( RimGridCaseSurface, "GridCaseSurface" ); @@ -38,12 +40,14 @@ CAF_PDM_SOURCE_INIT( RimGridCaseSurface, "GridCaseSurface" ); //-------------------------------------------------------------------------------------------------- RimGridCaseSurface::RimGridCaseSurface() { - CAF_PDM_InitObject( "Surface", ":/ReservoirSurface16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Surface", ":/ReservoirSurface16x16.png", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_case, "SourceCase", "Source Case", "", "", "" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_case, "SourceCase", "Source Case", "", "", "" ); - CAF_PDM_InitField( &m_oneBasedSliceIndex, "SliceIndex", 1, "Slice Index (K)", "", "", "" ); + CAF_PDM_InitScriptableField( &m_oneBasedSliceIndex, "SliceIndex", 1, "Slice Index (K)", "", "", "" ); m_oneBasedSliceIndex.uiCapability()->setUiEditorTypeName( caf::PdmUiSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitScriptableField( &m_watertight, "Watertight", false, "Watertight Surface (fill gaps)", "", "", "" ); } //-------------------------------------------------------------------------------------------------- @@ -82,7 +86,7 @@ bool RimGridCaseSurface::onLoadData() //-------------------------------------------------------------------------------------------------- RimSurface* RimGridCaseSurface::createCopy() { - RimGridCaseSurface* newSurface = dynamic_cast( + auto* newSurface = dynamic_cast( xmlCapability()->copyByXmlSerialization( caf::PdmDefaultObjectFactory::instance() ) ); newSurface->setCase( m_case.value() ); // TODO: case seems to get lost in the xml copy, investigate later @@ -120,7 +124,7 @@ void RimGridCaseSurface::defineEditorAttribute( const caf::PdmFieldHandle* field { RimSurface::defineEditorAttribute( field, uiConfigName, attribute ); - caf::PdmUiSliderEditorAttribute* myAttr = dynamic_cast( attribute ); + auto* myAttr = dynamic_cast( attribute ); if ( myAttr && m_case ) { const cvf::StructGridInterface* grid = RigReservoirGridTools::mainGrid( m_case ); @@ -140,7 +144,7 @@ void RimGridCaseSurface::fieldChangedByUi( const caf::PdmFieldHandle* changedFie { RimSurface::fieldChangedByUi( changedField, oldValue, newValue ); - if ( changedField == &m_case || changedField == &m_oneBasedSliceIndex ) + if ( changedField == &m_case || changedField == &m_oneBasedSliceIndex || changedField == &m_watertight ) { clearCachedNativeData(); updateSurfaceData(); @@ -154,13 +158,13 @@ void RimGridCaseSurface::fieldChangedByUi( const caf::PdmFieldHandle* changedFie //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void RimGridCaseSurface::extractDataFromGrid() +void RimGridCaseSurface::extractStructuredSurfaceFromGridData() { clearCachedNativeData(); if ( m_case ) { - RimEclipseCase* eclCase = dynamic_cast( m_case() ); + auto* eclCase = dynamic_cast( m_case() ); if ( eclCase && eclCase->mainGrid() ) { const RigMainGrid* grid = eclCase->mainGrid(); @@ -246,15 +250,15 @@ void RimGridCaseSurface::extractDataFromGrid() cvf::ubyte faceConn[4]; grid->cellFaceVertexIndices( faceType, faceConn ); - structGridVertexIndices.push_back( - std::make_pair( static_cast( column + 1 ), static_cast( row + 1 ) ) ); + structGridVertexIndices.emplace_back( static_cast( column + 1 ), + static_cast( row + 1 ) ); vertices.push_back( cornerVerts[faceConn[cellFaceIndex]] ); if ( row < maxRow && column < maxColumn ) { - cvf::uint triangleIndexLeft = static_cast( column * ( maxRow + 1 ) + row ); - cvf::uint triangleIndexRight = static_cast( ( column + 1 ) * ( maxRow + 1 ) + row ); + auto triangleIndexLeft = static_cast( column * ( maxRow + 1 ) + row ); + auto triangleIndexRight = static_cast( ( column + 1 ) * ( maxRow + 1 ) + row ); triangleIndices.push_back( triangleIndexLeft ); triangleIndices.push_back( triangleIndexLeft + 1 ); @@ -275,6 +279,135 @@ void RimGridCaseSurface::extractDataFromGrid() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCaseSurface::extractGridDataUsingFourVerticesPerCell() +{ + clearCachedNativeData(); + + if ( !m_case ) return; + + auto* eclCase = dynamic_cast( m_case() ); + if ( eclCase && eclCase->mainGrid() ) + { + const RigMainGrid* grid = eclCase->mainGrid(); + + size_t minI = 0; + size_t minJ = 0; + size_t maxI = grid->cellCountI(); + size_t maxJ = grid->cellCountJ(); + + size_t zeroBasedLayerIndex = static_cast( m_oneBasedSliceIndex ) - 1; + + cvf::StructGridInterface::FaceType extractionFace = cvf::StructGridInterface::NEG_K; + + std::vector triangleIndices; + std::vector vertices; + + for ( size_t i = minI; i <= maxI; i++ ) + { + for ( size_t j = minJ; j <= maxJ; j++ ) + { + if ( !grid->isCellValid( i, j, zeroBasedLayerIndex ) ) continue; + + size_t currentCellIndex = grid->cellIndexFromIJK( i, j, zeroBasedLayerIndex ); + const auto& cell = grid->cell( currentCellIndex ); + if ( cell.isInvalid() ) continue; + + cvf::Vec3d currentCornerVerts[8]; + + { + cvf::ubyte currentFaceConn[4]; + grid->cellCornerVertices( currentCellIndex, currentCornerVerts ); + grid->cellFaceVertexIndices( extractionFace, currentFaceConn ); + + auto currentCellStartIndex = static_cast( vertices.size() ); + + for ( auto fc : currentFaceConn ) + { + vertices.push_back( currentCornerVerts[fc] ); + } + + triangleIndices.push_back( currentCellStartIndex ); + triangleIndices.push_back( currentCellStartIndex + 1 ); + triangleIndices.push_back( currentCellStartIndex + 2 ); + + triangleIndices.push_back( currentCellStartIndex ); + triangleIndices.push_back( currentCellStartIndex + 2 ); + triangleIndices.push_back( currentCellStartIndex + 3 ); + } + + if ( m_watertight() ) + { + addGeometryForFaultFaces( grid, + currentCellIndex, + extractionFace, + cvf::StructGridInterface::POS_I, + currentCornerVerts, + vertices, + triangleIndices ); + + addGeometryForFaultFaces( grid, + currentCellIndex, + extractionFace, + cvf::StructGridInterface::POS_J, + currentCornerVerts, + vertices, + triangleIndices ); + } + } + } + + m_vertices = vertices; + m_triangleIndices = triangleIndices; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimGridCaseSurface::addGeometryForFaultFaces( const RigMainGrid* grid, + size_t currentCellIndex, + cvf::StructGridInterface::FaceType extractionFace, + cvf::StructGridInterface::FaceType faultFace, + cvf::Vec3d* currentCornerVerts, + std::vector& vertices, + std::vector& triangleIndices ) +{ + if ( grid->findFaultFromCellIndexAndCellFace( currentCellIndex, faultFace ) ) + { + auto nextCell = grid->cell( currentCellIndex ).neighborCell( faultFace ); + if ( !nextCell.isInvalid() ) + { + size_t nextCellIndex = nextCell.mainGridCellIndex(); + cvf::Vec3d nextCellCornerVerts[8]; + grid->cellCornerVertices( nextCellIndex, nextCellCornerVerts ); + + auto startIndex = static_cast( vertices.size() ); + { + auto edgeVertexIndices = grid->edgeVertexIndices( extractionFace, faultFace ); + vertices.push_back( currentCornerVerts[edgeVertexIndices.first] ); + vertices.push_back( currentCornerVerts[edgeVertexIndices.second] ); + } + { + auto oppositeFaultFace = cvf::StructGridInterface::oppositeFace( faultFace ); + auto edgeVertexIndices = grid->edgeVertexIndices( extractionFace, oppositeFaultFace ); + vertices.push_back( nextCellCornerVerts[edgeVertexIndices.first] ); + vertices.push_back( nextCellCornerVerts[edgeVertexIndices.second] ); + } + + triangleIndices.push_back( startIndex ); + triangleIndices.push_back( startIndex + 1 ); + triangleIndices.push_back( startIndex + 2 ); + + triangleIndices.push_back( startIndex ); + triangleIndices.push_back( startIndex + 2 ); + triangleIndices.push_back( startIndex + 3 ); + } + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -355,7 +488,7 @@ bool RimGridCaseSurface::updateSurfaceData() { if ( m_vertices.empty() || m_triangleIndices.empty() || m_structGridIndices.empty() ) { - extractDataFromGrid(); + extractGridDataUsingFourVerticesPerCell(); } RigSurface* surfaceData = nullptr; @@ -411,7 +544,7 @@ bool RimGridCaseSurface::exportStructSurfaceFromGridCase( std::vector& vertices, + std::vector& triangleIndices ); + + // This method will populate m_structGridIndices used when exporting to PTL file format + // Fault geometry will be smoothed using this method + void extractStructuredSurfaceFromGridData(); bool findValidCellIndex( const RigMainGrid* grid, const cvf::StructGridInterface::FaceType faceType, @@ -75,6 +88,7 @@ class RimGridCaseSurface : public RimSurface private: caf::PdmPtrField m_case; caf::PdmField m_oneBasedSliceIndex; + caf::PdmField m_watertight; std::vector m_triangleIndices; std::vector m_vertices; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.cpp index 19f4b91615..cc1bea4c4f 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.cpp @@ -38,6 +38,16 @@ CAF_PDM_ABSTRACT_SOURCE_INIT( RimSurface, "SurfaceInterface" ); +template <> +void caf::AppEnum::setUp() +{ + addItem( RimSurface::SurfaceType::DEFAULT, "DEFAULT", "Default" ); + addItem( RimSurface::SurfaceType::ENSEMBLE_SOURCE, "ENSEMBLE_SOURCE", "Ensemble Source" ); + addItem( RimSurface::SurfaceType::ENSEMBLE_STATISTICS, "ENSEMBLE_STATISTICS", "Ensemble Statistics" ); + + setDefault( RimSurface::SurfaceType::DEFAULT ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.h index a1a8c801e1..3020a597f1 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.h +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurface.h @@ -34,6 +34,16 @@ class RimSurface : public caf::PdmObject { CAF_PDM_HEADER_INIT; +public: + enum class SurfaceType + { + DEFAULT, + ENSEMBLE_SOURCE, + ENSEMBLE_STATISTICS, + // TODO: Add fault reactivation surfaces + + }; + public: RimSurface(); ~RimSurface() override; @@ -71,11 +81,12 @@ class RimSurface : public caf::PdmObject virtual bool updateSurfaceData() = 0; virtual void clearCachedNativeData() = 0; +protected: + cvf::ref m_surfaceData; + private: caf::PdmField m_userDescription; caf::PdmField m_color; caf::PdmField m_depthOffset; caf::PdmProxyValueField m_nameProxy; - - cvf::ref m_surfaceData; }; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.cpp index aa50132ff3..26b2734666 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.cpp @@ -21,6 +21,10 @@ #include "RiaColorTables.h" #include "RiaLogging.h" +#include "Rim2dIntersectionView.h" +#include "Rim2dIntersectionViewCollection.h" +#include "RimCase.h" +#include "RimEnsembleSurface.h" #include "RimFileSurface.h" #include "RimGridCaseSurface.h" #include "RimGridView.h" @@ -35,7 +39,8 @@ #include "cafPdmFieldScriptingCapability.h" #include "cafPdmObjectScriptingCapability.h" -#include "QFile" +#include +#include CAF_PDM_SOURCE_INIT( RimSurfaceCollection, "SurfaceCollection" ); @@ -108,6 +113,26 @@ void RimSurfaceCollection::addSurface( RimSurface* surface ) m_surfaces.push_back( surface ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceCollection::addEnsembleSurface( RimEnsembleSurface* ensembleSurface ) +{ + addSubCollection( ensembleSurface ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimSurfaceCollection::ensembleSurfaces() const +{ + std::vector ensSurfaces; + + this->descendantsIncludingThisOfType( ensSurfaces ); + + return ensSurfaces; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -126,6 +151,8 @@ RimSurface* RimSurfaceCollection::importSurfacesFromFiles( const QStringList& fi auto newColor = RiaColorTables::categoryPaletteColors().cycledColor3f( existingSurfCount + newSurfCount ); newSurface->setSurfaceFilePath( newFileName ); + newSurface->setUserDescription( QFileInfo( newFileName ).fileName() ); + newSurface->setColor( newColor ); if ( !newSurface->onLoadData() ) @@ -212,13 +239,11 @@ RimSurface* RimSurfaceCollection::copySurfaces( std::vector surface //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimSurface* RimSurfaceCollection::addGridCaseSurface( RimCase* sourceCase ) +RimSurface* RimSurfaceCollection::addGridCaseSurface( RimCase* sourceCase, int oneBasedSliceIndex ) { auto s = new RimGridCaseSurface; s->setCase( sourceCase ); - int oneBasedSliceIndex = 1; - s->setOneBasedIndex( oneBasedSliceIndex ); s->setUserDescription( "Surface" ); @@ -264,6 +289,11 @@ void RimSurfaceCollection::loadData() { surf->loadDataIfRequired(); } + + for ( auto subColl : m_subCollections ) + { + subColl->loadData(); + } } //-------------------------------------------------------------------------------------------------- @@ -306,6 +336,15 @@ void RimSurfaceCollection::updateViews( const std::vector& surfsToR for ( auto view : viewsNeedingUpdate ) { view->scheduleCreateDisplayModelAndRedraw(); + + if ( view->ownerCase() ) + { + auto views = view->ownerCase()->intersectionViewCollection()->views(); + for ( Rim2dIntersectionView* view : views ) + { + view->scheduleCreateDisplayModelAndRedraw(); + } + } } } @@ -456,7 +495,7 @@ void RimSurfaceCollection::addSubCollection( RimSurfaceCollection* subcoll ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimSurfaceCollection* RimSurfaceCollection::getSubCollection( const QString name ) +RimSurfaceCollection* RimSurfaceCollection::getSubCollection( const QString& name ) const { for ( auto coll : m_subCollections ) { @@ -466,6 +505,19 @@ RimSurfaceCollection* RimSurfaceCollection::getSubCollection( const QString name return nullptr; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceCollection::deleteSubCollection( const QString& name ) +{ + auto coll = getSubCollection( name ); + if ( coll ) + { + auto index = m_subCollections.index( coll ); + m_subCollections.erase( index ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -477,6 +529,7 @@ bool RimSurfaceCollection::containsSurface() { containsSurface |= coll->containsSurface(); } + return containsSurface; } diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.h index 214a59020d..8c7fd35a47 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceCollection.h @@ -23,6 +23,7 @@ #include "cafPdmObject.h" class RimSurface; +class RimEnsembleSurface; class RimCase; class RimSurfaceCollection : public caf::PdmObject @@ -36,13 +37,17 @@ class RimSurfaceCollection : public caf::PdmObject void addSurface( RimSurface* surface ); void setAsTopmostFolder(); + void addEnsembleSurface( RimEnsembleSurface* ensembleSurface ); + std::vector ensembleSurfaces() const; + RimSurface* importSurfacesFromFiles( const QStringList& fileNames, bool showLegend = true ); - RimSurface* addGridCaseSurface( RimCase* sourceCase ); + RimSurface* addGridCaseSurface( RimCase* sourceCase, int oneBasedSliceIndex = 1 ); RimSurface* copySurfaces( std::vector surfaces ); RimSurface* addSurfacesAtIndex( int index, std::vector surfaces ); void addSubCollection( RimSurfaceCollection* collection ); - RimSurfaceCollection* getSubCollection( const QString name ); + RimSurfaceCollection* getSubCollection( const QString& name ) const; + void deleteSubCollection( const QString& name ); bool containsFileSurface( QString filename ); bool containsSurface(); @@ -51,7 +56,7 @@ class RimSurfaceCollection : public caf::PdmObject void removeSurface( RimSurface* surface ); void removeMissingFileSurfaces(); - void loadData(); + virtual void loadData(); void updateViews(); void updateViews( const std::vector& surfsToReload, bool showLegend = true ); diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.cpp index 646cdb0a81..6086bcbd72 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.cpp @@ -30,7 +30,6 @@ #include "RiuViewer.h" -#include "RivHexGridIntersectionTools.h" #include "RivSurfacePartMgr.h" #include "cafPdmUiDoubleSliderEditor.h" @@ -50,9 +49,10 @@ RimSurfaceInView::RimSurfaceInView() CAF_PDM_InitFieldNoDefault( &m_surface, "SurfaceRef", "Surface", "", "", "" ); m_surface.uiCapability()->setUiHidden( true ); + m_surface.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_resultDefinition, "ResultDefinition", "Result Definition", "", "", "" ); - m_resultDefinition.uiCapability()->setUiHidden( true ); + m_resultDefinition.uiCapability()->setUiTreeHidden( true ); m_resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_resultDefinition = new RimSurfaceResultDefinition; m_resultDefinition->setCheckState( false ); @@ -144,7 +144,7 @@ RivSurfacePartMgr* RimSurfaceInView::surfacePartMgr() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const RivIntersectionGeometryGeneratorIF* RimSurfaceInView::intersectionGeometryGenerator() const +const RivIntersectionGeometryGeneratorInterface* RimSurfaceInView::intersectionGeometryGenerator() const { if ( m_surfacePartMgr.notNull() ) return m_surfacePartMgr->intersectionGeometryGenerator(); @@ -206,11 +206,18 @@ void RimSurfaceInView::fieldChangedByUi( const caf::PdmFieldHandle* changedField bool scheduleRedraw = false; - if ( changedField == &m_isActive || changedField == &m_useSeparateDataSource || changedField == &m_separateDataSource ) + if ( changedField == &m_useSeparateDataSource || changedField == &m_separateDataSource ) { scheduleRedraw = true; } - else if ( changedField == &m_showInactiveCells ) + else if ( changedField == &m_isActive ) + { + // if ( m_isActive ) clearGeometry(); + + scheduleRedraw = true; + } + + if ( changedField == &m_showInactiveCells ) { clearGeometry(); scheduleRedraw = true; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.h index 258135abfe..da2c73c618 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.h +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInView.h @@ -51,9 +51,9 @@ class RimSurfaceInView : public RimIntersection bool isNativeSurfaceResultsActive() const; RimSurfaceResultDefinition* surfaceResultDefinition(); - void clearGeometry(); - RivSurfacePartMgr* surfacePartMgr(); - const RivIntersectionGeometryGeneratorIF* intersectionGeometryGenerator() const override; + void clearGeometry(); + RivSurfacePartMgr* surfacePartMgr(); + const RivIntersectionGeometryGeneratorInterface* intersectionGeometryGenerator() const override; void loadDataAndUpdate(); diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.cpp index 7ffd524164..96e5ba59d1 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.cpp @@ -18,8 +18,10 @@ #include "RimSurfaceInViewCollection.h" +#include "RimEnsembleSurface.h" #include "RimGridView.h" #include "RimIntersectionResultDefinition.h" +#include "RimIntersectionResultsDefinitionCollection.h" #include "RimOilField.h" #include "RimProject.h" #include "RimSurface.h" @@ -29,6 +31,7 @@ #include "RivSurfacePartMgr.h" +#include "cafPdmUiTreeOrdering.h" #include "cvfModelBasicList.h" CAF_PDM_SOURCE_INIT( RimSurfaceInViewCollection, "SurfaceInViewCollection" ); @@ -77,6 +80,26 @@ caf::PdmFieldHandle* RimSurfaceInViewCollection::userDescriptionField() return &m_collectionName; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimSurfaceInViewCollection::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, + QString uiConfigName /*= ""*/ ) +{ + RimGridView* gridView = nullptr; + this->firstAncestorOfType( gridView ); + + RimSurfaceInViewCollection* surfViewColl = nullptr; + this->firstAncestorOfType( surfViewColl ); + + if ( gridView && !surfViewColl ) + { + auto uiTree = gridView->separateSurfaceResultsCollection()->uiTreeOrdering(); + + uiTreeOrdering.appendChild( uiTree ); + } +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -181,7 +204,7 @@ void RimSurfaceInViewCollection::syncSurfacesWithView() } } - // Create new surfade entries and reorder + // Create new surface entries and reorder std::vector orderedSurfs; if ( m_surfaceCollection ) @@ -196,6 +219,12 @@ void RimSurfaceInViewCollection::syncSurfacesWithView() { RimSurfaceInView* newSurfInView = new RimSurfaceInView(); newSurfInView->setSurface( surf ); + + if ( m_surfaceCollection->collectionName() == RimEnsembleSurface::ensembleSourceFileCollectionName() ) + { + newSurfInView->setActive( false ); + } + orderedSurfs.push_back( newSurfInView ); } else @@ -487,9 +516,9 @@ std::vector RimSurfaceInViewCollection::legendConfigs() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector RimSurfaceInViewCollection::intersectionGeometryGenerators() const +std::vector RimSurfaceInViewCollection::intersectionGeometryGenerators() const { - std::vector generators; + std::vector generators; for ( auto surf : m_surfacesInView ) { diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.h b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.h index c793a183ce..3da396645a 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.h +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceInViewCollection.h @@ -35,9 +35,10 @@ class ScalarMapper; class RimSurfaceInView; class RimSurface; class RimSurfaceCollection; +class RimEnsembleSurface; class RimRegularLegendConfig; class RiuViewer; -class RivIntersectionGeometryGeneratorIF; +class RivIntersectionGeometryGeneratorInterface; class RimSurfaceInViewCollection : public RimCheckableNamedObject { @@ -65,12 +66,14 @@ class RimSurfaceInViewCollection : public RimCheckableNamedObject std::vector legendConfigs(); - std::vector intersectionGeometryGenerators() const; + std::vector intersectionGeometryGenerators() const; protected: void initAfterRead() override; caf::PdmFieldHandle* userDescriptionField() override; + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + private: void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; @@ -81,8 +84,10 @@ class RimSurfaceInViewCollection : public RimCheckableNamedObject void syncCollectionsWithView(); void syncSurfacesWithView(); +private: caf::PdmProxyValueField m_collectionName; - caf::PdmChildArrayField m_collectionsInView; caf::PdmChildArrayField m_surfacesInView; - caf::PdmPtrField m_surfaceCollection; + caf::PdmChildArrayField m_collectionsInView; + + caf::PdmPtrField m_surfaceCollection; }; diff --git a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceResultDefinition.cpp b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceResultDefinition.cpp index b6ab8840e1..6ecd9154db 100644 --- a/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceResultDefinition.cpp +++ b/ApplicationLibCode/ProjectDataModel/Surfaces/RimSurfaceResultDefinition.cpp @@ -41,7 +41,7 @@ RimSurfaceResultDefinition::RimSurfaceResultDefinition() CAF_PDM_InitFieldNoDefault( &m_propertyName, "PropertyName", "Property Name", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendConfig", "Legend", "", "", "" ); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); m_legendConfig.uiCapability()->setUiTreeChildrenHidden( false ); m_legendConfig = new RimRegularLegendConfig; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake new file mode 100644 index 0000000000..861abfda47 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/CMakeLists_files.cmake @@ -0,0 +1,63 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurve.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogFileCurve.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.h + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurveNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurveNameConfig.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveCommonDataSource.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogs.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogsCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogCurveSet.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatistics.h + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatisticsCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFile.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileChannel.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogWbsCurve.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogTrack.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFile.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileChannel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogWbsCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogPlotNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogFileCurveNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogRftCurveNameConfig.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogFileCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogExtractionCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/Rim3dWellLogRftCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogCurveCommonDataSource.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogs.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogsCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogCurveSet.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatistics.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimEnsembleWellLogStatisticsCurve.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "ProjectDataModel\\WellLog" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogCurve.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogCurve.cpp diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogExtractionCurve.cpp similarity index 95% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogExtractionCurve.cpp index e1dc116a32..679b21743d 100644 --- a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogExtractionCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogExtractionCurve.cpp @@ -73,13 +73,13 @@ Rim3dWellLogExtractionCurve::Rim3dWellLogExtractionCurve() CAF_PDM_InitField( &m_timeStep, "CurveTimeStep", -1, "Time Step", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_eclipseResultDefinition, "CurveEclipseResult", "", "", "", "" ); - m_eclipseResultDefinition.uiCapability()->setUiHidden( true ); + m_eclipseResultDefinition.uiCapability()->setUiTreeHidden( true ); m_eclipseResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_eclipseResultDefinition = new RimEclipseResultDefinition; m_eclipseResultDefinition->findField( "MResultType" )->uiCapability()->setUiName( "Result Type" ); CAF_PDM_InitFieldNoDefault( &m_geomResultDefinition, "CurveGeomechResult", "", "", "", "" ); - m_geomResultDefinition.uiCapability()->setUiHidden( true ); + m_geomResultDefinition.uiCapability()->setUiTreeHidden( true ); m_geomResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_geomResultDefinition = new RimGeoMechResultDefinition; m_geomResultDefinition->setAddWellPathDerivedResults( true ); @@ -530,32 +530,5 @@ void Rim3dWellLogExtractionCurve::initAfterRead() //-------------------------------------------------------------------------------------------------- QString Rim3dWellLogExtractionCurve::wellDate() const { - RimGeoMechCase* geomCase = dynamic_cast( m_case.value() ); - RimEclipseCase* eclipseCase = dynamic_cast( m_case.value() ); - - QStringList timeStepNames; - - if ( eclipseCase ) - { - if ( m_eclipseResultDefinition->resultType() == RiaDefines::ResultCatType::STATIC_NATIVE ) - { - return QString(); - } - if ( eclipseCase->eclipseCaseData() ) - { - timeStepNames = eclipseCase->timeStepStrings(); - } - } - else if ( geomCase ) - { - if ( geomCase->geoMechData() ) - { - timeStepNames = geomCase->timeStepStrings(); - } - } - if ( m_timeStep == -1 ) - { - return QString( "Animation Time Step" ); - } - return ( m_timeStep >= 0 && m_timeStep < timeStepNames.size() ) ? timeStepNames[m_timeStep] : ""; + return RimWellLogExtractionCurve::wellDateFromGridCaseModel( m_case, m_timeStep ); } diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogExtractionCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogExtractionCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogExtractionCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogFileCurve.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogFileCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogFileCurve.cpp diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogFileCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogFileCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogFileCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogFileCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogRftCurve.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogRftCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogRftCurve.cpp diff --git a/ApplicationLibCode/ProjectDataModel/Rim3dWellLogRftCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogRftCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/Rim3dWellLogRftCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/Rim3dWellLogRftCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp new file mode 100644 index 0000000000..82b8524397 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.cpp @@ -0,0 +1,1312 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleWellLogCurveSet.h" + +#include "RiaColorTools.h" +#include "RiaLogging.h" +#include "RiaOptionItemFactory.h" +#include "RiaResultNames.h" + +#include "RimEnsembleCurveFilter.h" +#include "RimEnsembleCurveFilterCollection.h" +#include "RimEnsembleCurveSet.h" +#include "RimEnsembleStatistics.h" +#include "RimEnsembleWellLogStatistics.h" +#include "RimEnsembleWellLogStatisticsCurve.h" +#include "RimEnsembleWellLogs.h" +#include "RimEnsembleWellLogsCollection.h" +#include "RimFormationNames.h" +#include "RimFormationNamesCollection.h" +#include "RimMainPlotCollection.h" +#include "RimOilField.h" +#include "RimProject.h" +#include "RimWellLogCurve.h" +#include "RimWellLogFile.h" +#include "RimWellLogFileChannel.h" +#include "RimWellLogFileCurve.h" +#include "RimWellLogPlot.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" + +#include "RigFormationNames.h" +#include "RigWellLogIndexDepthOffset.h" + +#include "RiuAbstractLegendFrame.h" +#include "RiuDraggableOverlayFrame.h" +#include "RiuPlotMainWindow.h" +#include "RiuQwtPlotCurveDefines.h" +#include "RiuQwtPlotWidget.h" +#include "RiuQwtSymbol.h" +#include "RiuTextContentFrame.h" + +#include "cafPdmObject.h" +#include "cafPdmUiItem.h" +#include "cafPdmUiTreeOrdering.h" + +#include "cvfObject.h" + +#include "qwt_plot_curve.h" +#include "qwt_symbol.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// Internal functions +//-------------------------------------------------------------------------------------------------- +int statisticsCurveSymbolSize( RiuQwtSymbol::PointSymbolEnum symbol ); + +namespace caf +{ +template <> +void AppEnum::setUp() +{ + addItem( RimEnsembleWellLogCurveSet::ColorMode::SINGLE_COLOR, "SINGLE_COLOR", "Single Color" ); + addItem( RimEnsembleWellLogCurveSet::ColorMode::COLOR_BY_ENSEMBLE_CURVE_SET, + "BY_ENSEMBLE_CURVE_SET", + "Color by Ensemble Curve Set" ); + setDefault( RimEnsembleWellLogCurveSet::ColorMode::SINGLE_COLOR ); +} +}; // namespace caf + +CAF_PDM_SOURCE_INIT( RimEnsembleWellLogCurveSet, "RimEnsembleWellLogCurveSet" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogCurveSet::RimEnsembleWellLogCurveSet() + : filterChanged( this ) + +{ + CAF_PDM_InitObject( "Ensemble Curve Set", ":/EnsembleCurveSet16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_curves, "EnsembleCurveSet", "Ensemble Curve Set", "", "", "" ); + m_curves.uiCapability()->setUiHidden( true ); + m_curves.uiCapability()->setUiTreeChildrenHidden( false ); + + CAF_PDM_InitField( &m_showCurves, "IsActive", true, "Show Curves", "", "", "" ); + m_showCurves.uiCapability()->setUiHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleWellLogs, "EnsembleWellLogs", "Ensemble Well Logs", "", "", "" ); + m_ensembleWellLogs.uiCapability()->setUiTreeChildrenHidden( true ); + + CAF_PDM_InitField( &m_wellLogChannelName, "WellLogChannelName", QString( "None" ), "Well Log Channel Name", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleCurveSet, "FilterEnsembleCurveSet", "Filter by Ensemble Curve Set", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_depthEqualization, "DepthEqualization", "Depth Equalization", "", "", "" ); + + CAF_PDM_InitField( &m_colorMode, "ColorMode", caf::AppEnum( ColorMode::SINGLE_COLOR ), "Coloring Mode", "", "", "" ); + + CAF_PDM_InitField( &m_color, "Color", RiaColorTools::textColor3f(), "Color", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_statistics, "Statistics", "Statistics", "", "", "" ); + m_statistics = new RimEnsembleStatistics( this ); + m_statistics.uiCapability()->setUiTreeHidden( true ); + + CAF_PDM_InitField( &m_userDefinedName, "UserDefinedName", QString( "Ensemble Curve Set" ), "Curve Set Name", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_autoGeneratedName, "AutoGeneratedName", "Curve Set Name", "", "", "" ); + m_autoGeneratedName.registerGetMethod( this, &RimEnsembleWellLogCurveSet::createAutoName ); + m_autoGeneratedName.uiCapability()->setUiReadOnly( true ); + m_autoGeneratedName.xmlCapability()->disableIO(); + + CAF_PDM_InitField( &m_isUsingAutoName, "AutoName", true, "Auto Name", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_curveAppearance, "PlotCurveAppearance", "PlotCurveAppearance", "", "", "" ); + m_curveAppearance = new RimPlotCurveAppearance; + m_curveAppearance.uiCapability()->setUiTreeHidden( true ); + m_curveAppearance->setInterpolationVisible( false ); + m_curveAppearance->setColorVisible( false ); + m_curveAppearance->setFillOptionsVisible( false ); + + m_curveAppearance->setSymbol( RiuQwtSymbol::PointSymbolEnum::SYMBOL_ELLIPSE ); + m_curveAppearance->setSymbolSize( 5 ); + m_curveAppearance->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_NONE ); + m_curveAppearance->setSymbolEdgeColor( cvf::Color3f::BLACK ); + m_curveAppearance->appearanceChanged.connect( this, &RimEnsembleWellLogCurveSet::onEnsembleCurvesAppearanceChanged ); + + m_qwtPlotCurveForLegendText = new QwtPlotCurve; + m_qwtPlotCurveForLegendText->setLegendAttribute( QwtPlotCurve::LegendShowSymbol, true ); + + m_ensembleWellLogStatistics.reset( new RimEnsembleWellLogStatistics ); + + m_disableStatisticCurves = false; + m_isCurveSetFiltered = false; + + setDeletable( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogCurveSet::~RimEnsembleWellLogCurveSet() +{ + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + if ( plotTrack && plotTrack->viewer() ) + { + if ( m_legendOverlayFrame ) + { + plotTrack->viewer()->removeOverlayFrame( m_legendOverlayFrame ); + } + } + + if ( m_legendOverlayFrame ) + { + m_legendOverlayFrame->setParent( nullptr ); + delete m_legendOverlayFrame; + } + + if ( m_filterOverlayFrame ) + { + m_filterOverlayFrame->setParent( nullptr ); + delete m_filterOverlayFrame; + } + + delete m_qwtPlotCurveForLegendText; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::isCurvesVisible() +{ + return m_showCurves(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setColor( cvf::Color3f color ) +{ + m_color = color; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::loadDataAndUpdate( bool updateParentPlot ) +{ + updateAllCurves(); + updateFilterLegend(); + updateAllTextInPlot(); + + if ( updateParentPlot ) + { + RimWellLogTrack* parentPlot; + firstAncestorOrThisOfTypeAsserted( parentPlot ); + parentPlot->viewer()->scheduleReplot(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setParentQwtPlotNoReplot( QwtPlot* plot ) +{ + for ( RimWellLogCurve* curve : m_curves ) + { + curve->setParentQwtPlotNoReplot( plot ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::detachQwtCurves() +{ + for ( RimWellLogCurve* curve : m_curves ) + { + curve->detachQwtCurve(); + } + + m_qwtPlotCurveForLegendText->detach(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::reattachQwtCurves() +{ + for ( RimWellLogCurve* curve : m_curves ) + { + curve->reattachQwtCurve(); + } + + m_qwtPlotCurveForLegendText->detach(); + + RimWellLogTrack* plot = nullptr; + firstAncestorOrThisOfType( plot ); + if ( plot ) + { + m_qwtPlotCurveForLegendText->attach( plot->viewer() ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleWellLogCurveSet::curves() const +{ + return m_curves.ptrReferencedObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::deleteEnsembleCurves() +{ + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + CVF_ASSERT( plotTrack ); + + std::vector curvesIndexesToDelete; + for ( size_t c = 0; c < m_curves.size(); c++ ) + { + RimWellLogCurve* curve = m_curves[c]; + + if ( dynamic_cast( curve ) == nullptr ) + { + plotTrack->removeCurve( m_curves[c] ); + curvesIndexesToDelete.push_back( c ); + } + } + + while ( curvesIndexesToDelete.size() > 0 ) + { + size_t currIndex = curvesIndexesToDelete.back(); + m_curves.erase( currIndex ); + curvesIndexesToDelete.pop_back(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::deleteStatisticsCurves() +{ + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + CVF_ASSERT( plotTrack ); + + std::vector curvesIndexesToDelete; + for ( size_t c = 0; c < m_curves.size(); c++ ) + { + RimWellLogCurve* curve = m_curves[c]; + + if ( dynamic_cast( curve ) != nullptr ) + { + plotTrack->removeCurve( m_curves[c] ); + curvesIndexesToDelete.push_back( c ); + } + } + + while ( curvesIndexesToDelete.size() > 0 ) + { + size_t currIndex = curvesIndexesToDelete.back(); + m_curves.erase( currIndex ); + curvesIndexesToDelete.pop_back(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuDraggableOverlayFrame* RimEnsembleWellLogCurveSet::legendFrame() const +{ + return m_legendOverlayFrame; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogCurveSet::ColorMode RimEnsembleWellLogCurveSet::colorMode() const +{ + return m_colorMode(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setColorMode( ColorMode mode ) +{ + m_colorMode = mode; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::onEnsembleCurvesAppearanceChanged( const caf::SignalEmitter* emitter ) +{ + loadDataAndUpdate( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateAllCurves() +{ + RimEnsembleWellLogs* group = m_ensembleWellLogs; + + if ( group ) + { + std::vector allWellLogFiles = group->wellLogFiles(); + std::vector filteredCases = filterEnsembleCases( allWellLogFiles ); + + m_isCurveSetFiltered = filteredCases.size() < allWellLogFiles.size(); + + updateEnsembleCurves( filteredCases ); + updateStatisticsCurves( m_statistics->basedOnFilteredCases() ? filteredCases : allWellLogFiles ); + } + + filterChanged.send(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateEditors() +{ + updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + RimWellLogPlot* plot = nullptr; + firstAncestorOrThisOfType( plot ); + CVF_ASSERT( plot ); + + bool updateTextInPlot = false; + + if ( changedField == &m_showCurves ) + { + loadDataAndUpdate( true ); + + updateConnectedEditors(); + + RimWellLogPlot* summaryPlot = nullptr; + this->firstAncestorOrThisOfTypeAsserted( summaryPlot ); + summaryPlot->updateConnectedEditors(); + + updateTextInPlot = true; + } + else if ( changedField == &m_ensembleWellLogs ) + { + updateAllCurves(); + + updateTextInPlot = true; + } + else if ( changedField == &m_ensembleCurveSet ) + { + connectEnsembleCurveSetFilterSignals(); + updateAllCurves(); + loadDataAndUpdate( true ); + updateTextInPlot = true; + } + else if ( changedField == &m_wellLogChannelName ) + { + updateAllCurves(); + updateTextInPlot = true; + } + else if ( changedField == &m_depthEqualization ) + { + updateAllCurves(); + updateTextInPlot = true; + } + else if ( changedField == &m_color ) + { + updateCurveColors(); + + updateTextInPlot = true; + } + else if ( changedField == &m_colorMode ) + { + updateCurveColors(); + + updateTextInPlot = true; + } + else if ( changedField == &m_isUsingAutoName ) + { + if ( !m_isUsingAutoName ) + { + m_userDefinedName = createAutoName(); + } + + updateTextInPlot = true; + } + else if ( changedField == &m_userDefinedName ) + { + updateTextInPlot = true; + } + + if ( updateTextInPlot ) + { + updateAllTextInPlot(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + uiOrdering.add( &m_ensembleWellLogs ); + uiOrdering.add( &m_wellLogChannelName ); + uiOrdering.add( &m_ensembleCurveSet ); + uiOrdering.add( &m_depthEqualization ); + + bool hasKLayerIndex = hasPropertyInFile( RiaResultNames::indexKResultName() ); + m_depthEqualization.uiCapability()->setUiReadOnly( !hasKLayerIndex ); + + appendColorGroup( uiOrdering ); + + { + caf::PdmUiGroup* nameGroup = uiOrdering.addNewGroup( "Curve Name" ); + nameGroup->setCollapsedByDefault( true ); + nameGroup->add( &m_isUsingAutoName ); + if ( m_isUsingAutoName ) + { + nameGroup->add( &m_autoGeneratedName ); + } + else + { + nameGroup->add( &m_userDefinedName ); + } + } + + caf::PdmUiGroup* statGroup = uiOrdering.addNewGroup( "Statistics" ); + m_statistics->defineUiOrdering( uiConfigName, *statGroup ); + + caf::PdmUiGroup* curveAppearanceGroup = uiOrdering.addNewGroup( "Curve Appearance" ); + QString configName = "AppearanceOrdering"; + m_curveAppearance->uiOrdering( configName, *curveAppearanceGroup ); + + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::appendColorGroup( caf::PdmUiOrdering& uiOrdering ) +{ + caf::PdmUiGroup* colorsGroup = uiOrdering.addNewGroup( "Colors" ); + colorsGroup->add( &m_colorMode ); + + if ( m_colorMode == ColorMode::SINGLE_COLOR ) + { + colorsGroup->add( &m_color ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, + QString uiConfigName /*= ""*/ ) +{ + uiTreeOrdering.skipRemainingChildren( true ); + + caf::IconProvider iconProvider = this->uiIconProvider(); + if ( !iconProvider.valid() ) return; + + this->setUiIcon( iconProvider ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimEnsembleWellLogCurveSet::userDescriptionField() +{ + if ( m_isUsingAutoName ) + { + return &m_autoGeneratedName; + } + else + { + return &m_userDefinedName; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimEnsembleWellLogCurveSet::objectToggleField() +{ + return &m_showCurves; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList + RimEnsembleWellLogCurveSet::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_ensembleWellLogs ) + { + RimProject* proj = RimProject::current(); + std::vector groups = + proj->activeOilField()->ensembleWellLogsCollection()->ensembleWellLogs(); + + for ( RimEnsembleWellLogs* ensemble : groups ) + { + options.push_back( caf::PdmOptionItemInfo( ensemble->name(), ensemble ) ); + } + + options.push_front( caf::PdmOptionItemInfo( "None", nullptr ) ); + } + else if ( fieldNeedingOptions == &m_wellLogChannelName ) + { + if ( m_ensembleWellLogs ) + { + std::set wellLogChannelNames; + for ( auto wellLogFile : m_ensembleWellLogs->wellLogFiles() ) + { + std::vector fileLogs = wellLogFile->wellLogChannels(); + for ( size_t i = 0; i < fileLogs.size(); i++ ) + { + QString wellLogChannelName = fileLogs[i]->name(); + wellLogChannelNames.insert( wellLogChannelName ); + } + } + + for ( auto wellLogChannelName : wellLogChannelNames ) + { + options.push_back( caf::PdmOptionItemInfo( wellLogChannelName, wellLogChannelName ) ); + } + } + + if ( options.size() == 0 ) + { + options.push_back( caf::PdmOptionItemInfo( "None", "None" ) ); + } + } + else if ( fieldNeedingOptions == &m_ensembleCurveSet ) + { + RiaOptionItemFactory::appendOptionItemsForEnsembleCurveSets( &options ); + } + else if ( fieldNeedingOptions == &m_colorMode ) + { + auto singleColorOption = caf::AppEnum( ColorMode::SINGLE_COLOR ); + + options.push_back( caf::PdmOptionItemInfo( singleColorOption.uiText(), ColorMode::SINGLE_COLOR ) ); + + if ( m_ensembleWellLogs && m_ensembleCurveSet ) + { + auto byEnsembleOption = caf::AppEnum( ColorMode::COLOR_BY_ENSEMBLE_CURVE_SET ); + options.push_back( caf::PdmOptionItemInfo( byEnsembleOption.uiText(), ColorMode::COLOR_BY_ENSEMBLE_CURVE_SET ) ); + } + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateFilterLegend() +{ + RimWellLogTrack* plotTrack; + firstAncestorOrThisOfType( plotTrack ); + + if ( plotTrack && plotTrack->viewer() ) + { + if ( m_ensembleCurveSet != nullptr && m_ensembleCurveSet->isFiltered() ) + { + if ( !m_filterOverlayFrame ) + { + m_filterOverlayFrame = + new RiuDraggableOverlayFrame( plotTrack->viewer()->canvas(), plotTrack->viewer()->overlayMargins() ); + } + m_filterOverlayFrame->setContentFrame( m_ensembleCurveSet->curveFilters()->makeFilterDescriptionFrame() ); + plotTrack->viewer()->addOverlayFrame( m_filterOverlayFrame ); + } + else + { + if ( m_filterOverlayFrame ) + { + plotTrack->viewer()->removeOverlayFrame( m_filterOverlayFrame ); + } + } + plotTrack->viewer()->scheduleReplot(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimSummaryCase* RimEnsembleWellLogCurveSet::findMatchingSummaryCase( RimWellLogFileCurve* wellLogCurve ) const +{ + RimSummaryCaseCollection* summaryCaseCollection = m_ensembleCurveSet->summaryCaseCollection(); + std::vector sumCases = summaryCaseCollection->allSummaryCases(); + for ( auto sumCase : sumCases ) + { + if ( isSameRealization( sumCase, wellLogCurve->wellLogFile() ) ) + { + return sumCase; + } + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateCurveColors() +{ + if ( m_colorMode == ColorMode::COLOR_BY_ENSEMBLE_CURVE_SET ) + { + if ( m_ensembleCurveSet != nullptr ) + { + // Fint the curves to color (skip the statistics) + std::vector curvesToColor; + std::vector summaryCases; + + for ( auto& curve : m_curves ) + { + // Statistics curves have separate color settings + if ( dynamic_cast( curve.p() ) == nullptr ) + { + // Look for a matching summary case + RimSummaryCase* summaryCase = + findMatchingSummaryCase( dynamic_cast( curve.p() ) ); + if ( summaryCase ) + { + summaryCases.push_back( summaryCase ); + curvesToColor.push_back( curve.p() ); + } + } + } + + // Get the colors + std::vector caseColors = m_ensembleCurveSet->generateColorsForCases( summaryCases ); + + // Apply the colors + if ( caseColors.size() != curvesToColor.size() ) return; + for ( size_t i = 0; i < curvesToColor.size(); i++ ) + { + curvesToColor[i]->setColor( caseColors[i] ); + curvesToColor[i]->updateCurveAppearance(); + } + } + } + else if ( m_colorMode == ColorMode::SINGLE_COLOR ) + { + for ( auto& curve : m_curves ) + { + // Statistics curves have separate color settings + if ( dynamic_cast( curve.p() ) == nullptr ) + { + curve->setColor( m_color ); + curve->updateCurveAppearance(); + } + } + } + + RimWellLogTrack* plotTrack; + firstAncestorOrThisOfType( plotTrack ); + if ( plotTrack && plotTrack->viewer() ) + { + if ( m_colorMode != ColorMode::SINGLE_COLOR && m_ensembleCurveSet != nullptr && + m_ensembleCurveSet->colorMode() != RimEnsembleCurveSet::ColorMode::SINGLE_COLOR ) + { + if ( !m_legendOverlayFrame ) + { + m_legendOverlayFrame = + new RiuDraggableOverlayFrame( plotTrack->viewer()->canvas(), plotTrack->viewer()->overlayMargins() ); + } + m_legendOverlayFrame->setContentFrame( m_ensembleCurveSet->legendConfig()->makeLegendFrame() ); + plotTrack->viewer()->addOverlayFrame( m_legendOverlayFrame ); + } + else + { + if ( m_legendOverlayFrame ) + { + plotTrack->viewer()->removeOverlayFrame( m_legendOverlayFrame ); + } + } + plotTrack->viewer()->scheduleReplot(); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateEnsembleCurves( const std::vector& sumCases ) +{ + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + CVF_ASSERT( plotTrack ); + + RimWellLogPlot* wellLogPlot = nullptr; + firstAncestorOrThisOfType( wellLogPlot ); + CVF_ASSERT( wellLogPlot ); + + deleteEnsembleCurves(); + m_qwtPlotCurveForLegendText->detach(); + deleteStatisticsCurves(); + + if ( m_statistics->hideEnsembleCurves() ) return; + + std::shared_ptr offsets; + cvf::ref wellPathFormations; + + if ( m_depthEqualization() == RimEnsembleWellLogStatistics::DepthEqualization::K_LAYER ) + { + offsets = RimEnsembleWellLogStatistics::calculateIndexDepthOffset( sumCases ); + wellPathFormations = createWellPathFormations( offsets ); + } + + m_qwtPlotCurveForLegendText->attach( plotTrack->viewer() ); + + QString wellLogChannelName = m_wellLogChannelName(); + if ( plotTrack && wellLogChannelName != "None" ) + { + if ( isCurvesVisible() ) + { + bool isFirst = true; + + for ( auto& wellLogFile : sumCases ) + { + RimWellLogFileCurve* curve = new RimWellLogFileCurve; + curve->setUiTreeHidden( true ); + curve->setUiTreeChildrenHidden( true ); + plotTrack->addCurve( curve ); + + QString errorMessage; + if ( wellLogFile->readFile( &errorMessage ) ) + { + RigWellLogFile* wellLogDataFile = wellLogFile->wellLogFileData(); + CVF_ASSERT( wellLogDataFile ); + + if ( isFirst ) + { + // Initialize plot with depth unit from the first log file + wellLogPlot->setDepthUnit( wellLogDataFile->depthUnit() ); + isFirst = false; + } + } + else + { + RiaLogging::warning( errorMessage ); + } + + RimWellPath* wellPath = RimProject::current()->wellPathByName( wellLogFile->wellName() ); + if ( wellPathFormations.notNull() ) wellPath->setFormationsGeometry( wellPathFormations ); + + curve->setWellPath( wellPath ); + curve->setWellLogChannelName( wellLogChannelName ); + curve->setWellLogFile( wellLogFile ); + + curve->setSymbol( m_curveAppearance->symbol() ); + curve->setSymbolSize( m_curveAppearance->symbolSize() ); + curve->setSymbolSkipDistance( m_curveAppearance->symbolSkipDistance() ); + curve->setSymbolEdgeColor( m_curveAppearance->symbolEdgeColor() ); + curve->setLineStyle( m_curveAppearance->lineStyle() ); + curve->setLineThickness( m_curveAppearance->lineThickness() ); + + if ( offsets ) curve->setIndexDepthOffsets( offsets ); + curve->loadDataAndUpdate( true ); + + curve->updateCurveVisibility(); + curve->setShowInLegend( false ); + + m_curves.push_back( curve ); + } + + updateCurveColors(); + setLogScaleFromSelectedResult( wellLogChannelName ); + } + } + + plotTrack->updateLegend(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setLogScaleFromSelectedResult( const QString resVar ) +{ + if ( RiaResultNames::isLogarithmicResult( resVar ) ) + { + RimWellLogTrack* track = nullptr; + this->firstAncestorOrThisOfType( track ); + if ( track ) track->setLogarithmicScale( true ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::updateStatistics() +{ + return updateStatistics( std::vector() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::updateStatistics( const std::vector& sumCases ) +{ + RimEnsembleWellLogs* ensembleWellLogs = m_ensembleWellLogs; + QString wellLogChannelName = m_wellLogChannelName(); + + if ( !isCurvesVisible() || m_disableStatisticCurves || !ensembleWellLogs || wellLogChannelName == "None" ) + { + m_ensembleWellLogStatistics->clearData(); + return false; + } + // Calculate + std::vector wellLogFiles = sumCases; + if ( wellLogFiles.empty() ) + { + if ( m_statistics->basedOnFilteredCases() ) + wellLogFiles = filterEnsembleCases( ensembleWellLogs->wellLogFiles() ); + else + wellLogFiles = ensembleWellLogs->wellLogFiles(); + } + + m_ensembleWellLogStatistics->calculate( wellLogFiles, wellLogChannelName, m_depthEqualization() ); + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateStatisticsCurves( const std::vector& sumCases ) +{ + deleteStatisticsCurves(); + + if ( !updateStatistics( sumCases ) ) return; + + RimWellLogPlot* plot = nullptr; + firstAncestorOrThisOfType( plot ); + CVF_ASSERT( plot ); + + std::vector statisticsTypes; + if ( m_statistics->isActive() ) + { + if ( m_statistics->showP10Curve() && m_ensembleWellLogStatistics->hasP10Data() ) + statisticsTypes.push_back( RimEnsembleWellLogStatistics::StatisticsType::P10 ); + if ( m_statistics->showP50Curve() && m_ensembleWellLogStatistics->hasP50Data() ) + statisticsTypes.push_back( RimEnsembleWellLogStatistics::StatisticsType::P50 ); + if ( m_statistics->showP90Curve() && m_ensembleWellLogStatistics->hasP90Data() ) + statisticsTypes.push_back( RimEnsembleWellLogStatistics::StatisticsType::P90 ); + if ( m_statistics->showMeanCurve() && m_ensembleWellLogStatistics->hasMeanData() ) + statisticsTypes.push_back( RimEnsembleWellLogStatistics::StatisticsType::MEAN ); + } + + auto statisticsCurveSymbolFromStatistics = []( RimEnsembleWellLogStatistics::StatisticsType statisticsType ) { + if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P10 ) return RiuQwtSymbol::SYMBOL_TRIANGLE; + if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P90 ) + return RiuQwtSymbol::SYMBOL_DOWN_TRIANGLE; + if ( statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P50 ) return RiuQwtSymbol::SYMBOL_DIAMOND; + return RiuQwtSymbol::SYMBOL_ELLIPSE; + }; + + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + CVF_ASSERT( plotTrack ); + + for ( auto statisticsType : statisticsTypes ) + { + auto curve = new RimEnsembleWellLogStatisticsCurve(); + curve->setUiTreeHidden( true ); + curve->setUiTreeChildrenHidden( true ); + curve->setEnsembleWellLogCurveSet( this ); + curve->setStatisticsType( statisticsType ); + + m_curves.push_back( curve ); + curve->setColor( m_statistics->color() ); + + auto symbol = statisticsCurveSymbolFromStatistics( statisticsType ); + curve->setSymbol( symbol ); + curve->setSymbolSize( statisticsCurveSymbolSize( symbol ) ); + curve->setSymbolSkipDistance( 150 ); + if ( m_statistics->showCurveLabels() ) + { + curve->setSymbolLabel( caf::AppEnum::uiText( statisticsType ) ); + } + curve->setLineStyle( RiuQwtPlotCurveDefines::LineStyleEnum::STYLE_SOLID ); + + plotTrack->addCurve( curve ); + + curve->updateCurveVisibility(); + curve->loadDataAndUpdate( false ); + } + + updateCurveColors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateStatisticsCurves() +{ + updateStatisticsCurves( std::vector() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::showCurves( bool show ) +{ + m_showCurves = show; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogStatistics::DepthEqualization RimEnsembleWellLogCurveSet::depthEqualization() const +{ + return m_depthEqualization(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setDepthEqualization( RimEnsembleWellLogStatistics::DepthEqualization depthEqualization ) +{ + m_depthEqualization = depthEqualization; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setFilterByEnsembleCurveSet( RimEnsembleCurveSet* ensembleCurveSet ) +{ + m_ensembleCurveSet = ensembleCurveSet; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateAllTextInPlot() +{ + RimWellLogTrack* plotTrack = nullptr; + firstAncestorOrThisOfType( plotTrack ); + CVF_ASSERT( plotTrack ); + plotTrack->viewer()->setPlotTitle( name() ); + + updateEnsembleLegendItem(); + + plotTrack->updateLegend(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RimEnsembleWellLogCurveSet::filterEnsembleCases( const std::vector& wellLogFiles ) +{ + std::vector filteredCases; + + if ( m_ensembleCurveSet != nullptr && m_statistics->basedOnFilteredCases() ) + { + // Get the summary cases from the related ensemble summary curve set. + RimSummaryCaseCollection* summaryCaseCollection = m_ensembleCurveSet->summaryCaseCollection(); + + // + std::vector sumCases = + m_ensembleCurveSet->filterEnsembleCases( summaryCaseCollection->allSummaryCases() ); + for ( auto sumCase : sumCases ) + { + for ( auto wellLogFile : wellLogFiles ) + { + if ( isSameRealization( sumCase, wellLogFile ) ) + { + filteredCases.push_back( wellLogFile ); + } + } + } + } + else + { + filteredCases = wellLogFiles; + } + + return filteredCases; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::isSameRealization( RimSummaryCase* summaryCase, RimWellLogFile* wellLogFile ) const +{ + QString wellLogFileName = wellLogFile->fileName(); + + // + if ( summaryCase->hasCaseRealizationParameters() ) + { + // TODO: make less naive.. + int realizationNumber = summaryCase->caseRealizationParameters()->realizationNumber(); + QString summaryCaseFileName = summaryCase->summaryHeaderFilename(); + + if ( wellLogFileName.contains( QString( "realization-%1" ).arg( realizationNumber ) ) ) + { + return true; + } + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::disableStatisticCurves() +{ + m_disableStatisticCurves = true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::isFiltered() const +{ + return m_isCurveSetFiltered; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::hasP10Data() const +{ + return m_ensembleWellLogStatistics->hasP10Data(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::hasP50Data() const +{ + return m_ensembleWellLogStatistics->hasP50Data(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::hasP90Data() const +{ + return m_ensembleWellLogStatistics->hasP90Data(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::hasMeanData() const +{ + return m_ensembleWellLogStatistics->hasMeanData(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RimEnsembleWellLogStatistics* RimEnsembleWellLogCurveSet::ensembleWellLogStatistics() const +{ + return m_ensembleWellLogStatistics.get(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::updateEnsembleLegendItem() +{ + m_qwtPlotCurveForLegendText->setTitle( name() ); + + { + QwtSymbol* symbol = nullptr; + + if ( m_colorMode == ColorMode::SINGLE_COLOR ) + { + symbol = new QwtSymbol( QwtSymbol::HLine ); + + QColor curveColor( m_color.value().rByte(), m_color.value().gByte(), m_color.value().bByte() ); + QPen curvePen( curveColor ); + curvePen.setWidth( 2 ); + + symbol->setPen( curvePen ); + symbol->setSize( 6, 6 ); + } + else if ( m_colorMode == ColorMode::COLOR_BY_ENSEMBLE_CURVE_SET ) + { + QPixmap p = QPixmap( ":/Legend.png" ); + + symbol = new QwtSymbol; + symbol->setPixmap( p ); + symbol->setSize( 8, 8 ); + } + + m_qwtPlotCurveForLegendText->setSymbol( symbol ); + } + + bool showLegendItem = isCurvesVisible(); + m_qwtPlotCurveForLegendText->setItemAttribute( QwtPlotItem::Legend, showLegendItem ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleWellLogCurveSet::name() const +{ + QString curveSetName; + if ( m_isUsingAutoName ) + { + curveSetName = m_autoGeneratedName(); + } + else + { + curveSetName += m_userDefinedName(); + } + + return curveSetName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleWellLogCurveSet::createAutoName() const +{ + QStringList nameParts; + + if ( m_ensembleWellLogs() ) + { + nameParts.append( m_ensembleWellLogs->name() ); + nameParts.append( m_wellLogChannelName() ); + } + + if ( !nameParts.isEmpty() ) + return nameParts.join( " - " ); + else + return "Ensemble Well Log Curve Set"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::connectEnsembleCurveSetFilterSignals() +{ + if ( m_ensembleCurveSet() ) + { + m_ensembleCurveSet()->filterChanged.connect( this, &RimEnsembleWellLogCurveSet::onFilterSourceChanged ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::onFilterSourceChanged( const caf::SignalEmitter* emitter ) +{ + if ( m_ensembleCurveSet() ) loadDataAndUpdate( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::initAfterRead() +{ + connectEnsembleCurveSetFilterSignals(); + + // Hide the ensemble and statistics curves in the project tree on reload + for ( auto c : m_curves() ) + { + c->setUiTreeHidden( true ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setEnsembleWellLogs( RimEnsembleWellLogs* ensembleWellLogs ) +{ + m_ensembleWellLogs = ensembleWellLogs; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogCurveSet::setWellLogChannelName( const QString& wellLogChannelName ) +{ + m_wellLogChannelName = wellLogChannelName; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref + RimEnsembleWellLogCurveSet::createWellPathFormations( std::shared_ptr offsets ) +{ + RimFormationNamesCollection* formationNamesCollection = + RimProject::current()->activeOilField()->formationNamesCollection.v(); + if ( !formationNamesCollection ) return nullptr; + + if ( formationNamesCollection->formationNamesList().empty() ) return nullptr; + + RimFormationNames* rimFormationNames = formationNamesCollection->formationNamesList()[0]; + if ( !rimFormationNames ) return nullptr; + + RigFormationNames* formationNames = rimFormationNames->formationNamesData(); + if ( !formationNames ) return nullptr; + + std::vector wellPathFormationItems; + for ( int kLayer : offsets->sortedIndexes() ) + { + RigWellPathFormation wellPathFormation; + wellPathFormation.mdTop = offsets->getTopMd( kLayer ); + wellPathFormation.mdBase = offsets->getBottomMd( kLayer ); + wellPathFormation.formationName = formationNames->formationNameFromKLayerIdx( kLayer - 1 ); + wellPathFormationItems.push_back( wellPathFormation ); + } + + QString unusedFilePath = ""; + cvf::ref wellPathFormations = + new RigWellPathFormations( wellPathFormationItems, unusedFilePath, "Ensemble formation" ); + return wellPathFormations; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogCurveSet::hasPropertyInFile( const QString& property ) const +{ + RimEnsembleWellLogs* group = m_ensembleWellLogs; + if ( !group ) return false; + + std::vector allWellLogFiles = group->wellLogFiles(); + for ( auto& wellLogFile : allWellLogFiles ) + { + QString errorMessage; + if ( !wellLogFile->readFile( &errorMessage ) ) return false; + + RigWellLogFile* wellLogDataFile = wellLogFile->wellLogFileData(); + CVF_ASSERT( wellLogDataFile ); + + std::vector values = wellLogDataFile->values( RiaResultNames::indexKResultName() ); + if ( values.empty() ) return false; + } + + return true; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.h new file mode 100644 index 0000000000..adfff2d148 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogCurveSet.h @@ -0,0 +1,192 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include "RimEnsembleCurveSetColorManager.h" +#include "RimEnsembleCurveSetInterface.h" +#include "RimEnsembleWellLogStatistics.h" + +#include "RigEnsembleParameter.h" + +#include "cafAppEnum.h" +#include "cafPdmChildArrayField.h" +#include "cafPdmChildField.h" +#include "cafPdmField.h" +#include "cafPdmFieldCvfColor.h" +#include "cafPdmObject.h" +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrArrayField.h" +#include "cafPdmPtrField.h" + +#include + +class RimEnsembleWellLogs; +class RimEnsembleWellLogsCollection; +class RimEnsembleCurveFilterCollection; +class RimEnsembleStatistics; +class RimEnsembleStatisticsCase; +class RimWellLogCurve; +class RimWellLogFileCurve; +class RimWellLogFile; +class RimPlotCurveAppearance; + +class RigWellPathFormations; + +class RiuDraggableOverlayFrame; + +class QwtPlot; +class QwtPlotCurve; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleWellLogCurveSet : public caf::PdmObject, public RimEnsembleCurveSetInterface +{ + CAF_PDM_HEADER_INIT; + +public: + enum class ColorMode + { + SINGLE_COLOR, + COLOR_BY_ENSEMBLE_CURVE_SET + }; + + RimEnsembleWellLogCurveSet(); + ~RimEnsembleWellLogCurveSet() override; + + caf::Signal<> filterChanged; + + QString name() const; + + bool isCurvesVisible(); + void setColor( cvf::Color3f color ); + + void loadDataAndUpdate( bool updateParentPlot ); + void setParentQwtPlotNoReplot( QwtPlot* plot ); + void detachQwtCurves(); + void reattachQwtCurves(); + + std::vector curves() const; + + void deleteEnsembleCurves(); + void deleteStatisticsCurves(); + + ColorMode colorMode() const; + void setColorMode( ColorMode mode ); + + void updateEnsembleLegendItem(); + RiuDraggableOverlayFrame* legendFrame() const; + + void showCurves( bool show ); + + void updateAllTextInPlot(); + + std::vector filterEnsembleCases( const std::vector& sumCases ); + void disableStatisticCurves(); + bool isFiltered() const; + + void updateEditors() override; + void updateAllCurves() override; + void updateStatisticsCurves() override; + bool hasP10Data() const override; + bool hasP50Data() const override; + bool hasP90Data() const override; + bool hasMeanData() const override; + + void appendColorGroup( caf::PdmUiOrdering& uiOrdering ); + + void updateFilterLegend(); + + const RimEnsembleWellLogStatistics* ensembleWellLogStatistics() const; + RimEnsembleWellLogStatistics::DepthEqualization depthEqualization() const; + void setDepthEqualization( RimEnsembleWellLogStatistics::DepthEqualization depthEqualization ); + + bool updateStatistics(); + + void setEnsembleWellLogs( RimEnsembleWellLogs* ensembleWellLogs ); + void setWellLogChannelName( const QString& wellLogChannelName ); + + void setFilterByEnsembleCurveSet( RimEnsembleCurveSet* ensembleCurveSet ); + + bool hasPropertyInFile( const QString& property ) const; + +private: + void updateEnsembleCurves( const std::vector& curves ); + void updateStatisticsCurves( const std::vector& curves ); + bool updateStatistics( const std::vector& sumCases ); + + caf::PdmFieldHandle* userDescriptionField() override; + caf::PdmFieldHandle* objectToggleField() override; + void initAfterRead() override; + + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + + void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName = "" ) override; + + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + + QString createAutoName() const; + + void updateCurveColors(); + + bool isSameRealization( RimSummaryCase* summaryCase, RimWellLogFile* wellLogFile ) const; + RimSummaryCase* findMatchingSummaryCase( RimWellLogFileCurve* wellLogCurve ) const; + + void connectEnsembleCurveSetFilterSignals(); + void onFilterSourceChanged( const caf::SignalEmitter* emitter ); + void onEnsembleCurvesAppearanceChanged( const caf::SignalEmitter* emitter ); + void setLogScaleFromSelectedResult( const QString resVar ); + + cvf::ref createWellPathFormations( std::shared_ptr offsets ); + +private: + caf::PdmField m_showCurves; + + caf::PdmPtrArrayField m_curves; + caf::PdmPointer m_currentWellLogCurve; + caf::PdmField> m_depthEqualization; + + caf::PdmField> m_colorMode; + caf::PdmField m_color; + + caf::PdmChildField m_statistics; + + caf::PdmField m_isUsingAutoName; + caf::PdmField m_userDefinedName; + caf::PdmProxyValueField m_autoGeneratedName; + + caf::PdmPtrField m_ensembleWellLogs; + caf::PdmField m_wellLogChannelName; + caf::PdmPtrField m_ensembleCurveSet; + caf::PdmChildField m_curveAppearance; + + QwtPlotCurve* m_qwtPlotCurveForLegendText; + QPointer m_legendOverlayFrame; + QPointer m_filterOverlayFrame; + + std::unique_ptr m_ensembleWellLogStatistics; + + bool m_disableStatisticCurves; + bool m_isCurveSetFiltered; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.cpp new file mode 100644 index 0000000000..1e271adf7d --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.cpp @@ -0,0 +1,509 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleWellLogStatistics.h" + +#include "RiaCurveMerger.h" +#include "RiaDefines.h" +#include "RiaLogging.h" +#include "RiaResultNames.h" +#include "RiaWeightedMeanCalculator.h" +#include "RiaWellLogUnitTools.h" + +#include "RigStatisticsMath.h" +#include "RigWellLogFile.h" +#include "RigWellLogIndexDepthOffset.h" + +#include "RimWellLogFile.h" + +#include "cafAppEnum.h" + +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RimEnsembleWellLogStatistics::StatisticsType::P10, "P10", "P10" ); + addItem( RimEnsembleWellLogStatistics::StatisticsType::P50, "P50", "P50" ); + addItem( RimEnsembleWellLogStatistics::StatisticsType::P90, "P90", "P90" ); + addItem( RimEnsembleWellLogStatistics::StatisticsType::MEAN, "MEAN", "Mean" ); + + setDefault( RimEnsembleWellLogStatistics::StatisticsType::MEAN ); +} + +template <> +void caf::AppEnum::setUp() +{ + addItem( RimEnsembleWellLogStatistics::DepthEqualization::K_LAYER, "K_LAYER", "By K-Layer" ); + addItem( RimEnsembleWellLogStatistics::DepthEqualization::NONE, "NONE", "None" ); + + setDefault( RimEnsembleWellLogStatistics::DepthEqualization::NONE ); +} + +}; // namespace caf + +RimEnsembleWellLogStatistics::RimEnsembleWellLogStatistics() +{ + m_depthUnit = RiaDefines::DepthUnitType::UNIT_NONE; + m_logChannelUnitString = RiaWellLogUnitTools::noUnitString(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatistics::calculate( const std::vector& wellLogFiles, + const QString& wellLogChannelName, + DepthEqualization depthEqualization ) +{ + if ( depthEqualization == DepthEqualization::NONE ) + { + calculate( wellLogFiles, wellLogChannelName ); + } + else if ( depthEqualization == DepthEqualization::K_LAYER ) + { + calculateByKLayer( wellLogFiles, wellLogChannelName ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatistics::calculate( const std::vector& wellLogFiles, + const QString& wellLogChannelName ) +{ + RiaCurveMerger curveMerger; + RiaCurveMerger tvdCurveMerger; + + RiaWeightedMeanCalculator dataSetSizeCalc; + + for ( RimWellLogFile* wellLogFile : wellLogFiles ) + { + QString errorMessage; + if ( wellLogFile->readFile( &errorMessage ) ) + { + RigWellLogFile* fileData = wellLogFile->wellLogFileData(); + RiaDefines::DepthUnitType depthUnitInFile = fileData->depthUnit(); + if ( m_depthUnit != RiaDefines::DepthUnitType::UNIT_NONE && m_depthUnit != depthUnitInFile ) + { + RiaLogging::error( QString( "Unexpected depth unit in file %1." ).arg( wellLogFile->fileName() ) ); + } + m_depthUnit = depthUnitInFile; + + QString logChannelUnitString = fileData->wellLogChannelUnitString( wellLogChannelName ); + if ( m_logChannelUnitString != RiaWellLogUnitTools::noUnitString() && + m_logChannelUnitString != logChannelUnitString ) + { + RiaLogging::error( QString( "Unexpected unit in file %1." ).arg( wellLogFile->fileName() ) ); + } + m_logChannelUnitString = logChannelUnitString; + + std::vector depths = fileData->depthValues(); + std::vector tvdMslValues = fileData->tvdMslValues(); + std::vector values = fileData->values( wellLogChannelName ); + if ( !depths.empty() && !values.empty() && !tvdMslValues.empty() ) + { + dataSetSizeCalc.addValueAndWeight( depths.size(), 1.0 ); + curveMerger.addCurveData( depths, values ); + tvdCurveMerger.addCurveData( depths, tvdMslValues ); + } + } + else + { + RiaLogging::error( errorMessage ); + } + } + curveMerger.computeInterpolatedValues( true ); + tvdCurveMerger.computeInterpolatedValues( true ); + + clearData(); + + const std::vector& allDepths = curveMerger.allXValues(); + for ( size_t depthIdx = 0; depthIdx < allDepths.size(); depthIdx++ ) + { + std::vector valuesAtDepth; + valuesAtDepth.reserve( curveMerger.curveCount() ); + for ( size_t curveIdx = 0; curveIdx < curveMerger.curveCount(); ++curveIdx ) + { + std::vector valuesAtDepth; + valuesAtDepth.reserve( curveMerger.curveCount() ); + for ( size_t curveIdx = 0; curveIdx < curveMerger.curveCount(); ++curveIdx ) + { + const std::vector& curveValues = curveMerger.interpolatedYValuesForAllXValues( curveIdx ); + valuesAtDepth.push_back( curveValues[depthIdx] ); + } + + double p10, p50, p90, mean; + RigStatisticsMath::calculateStatisticsCurves( valuesAtDepth, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); + + // TVD is the mean TVD at a given MD + std::vector tvdsAtDepth; + tvdsAtDepth.reserve( tvdCurveMerger.curveCount() ); + + for ( size_t curveIdx = 0; curveIdx < tvdCurveMerger.curveCount(); ++curveIdx ) + { + const std::vector& curveValues = tvdCurveMerger.interpolatedYValuesForAllXValues( curveIdx ); + tvdsAtDepth.push_back( curveValues[depthIdx] ); + } + + double sumTvds = 0.0; + int numTvds = 0; + for ( auto tvd : tvdsAtDepth ) + { + if ( !std::isinf( tvd ) ) + { + sumTvds += tvd; + numTvds++; + } + } + + double meanTvd = sumTvds / numTvds; + + m_tvDepths.push_back( meanTvd ); + m_measuredDepths.push_back( allDepths[depthIdx] ); + m_p10Data.push_back( p10 ); + m_p50Data.push_back( p50 ); + m_p90Data.push_back( p90 ); + m_meanData.push_back( mean ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatistics::calculateByKLayer( const std::vector& wellLogFiles, + const QString& wellLogChannelName ) +{ + std::shared_ptr offsets = + RimEnsembleWellLogStatistics::calculateIndexDepthOffset( wellLogFiles ); + if ( !offsets ) return; + + std::map> topValues; + std::map> bottomValues; + + for ( RimWellLogFile* wellLogFile : wellLogFiles ) + { + QString errorMessage; + if ( wellLogFile->readFile( &errorMessage ) ) + { + RigWellLogFile* fileData = wellLogFile->wellLogFileData(); + + std::vector kIndexValues = fileData->values( RiaResultNames::indexKResultName() ); + std::vector values = fileData->values( wellLogChannelName ); + + if ( values.size() == kIndexValues.size() ) + { + std::set seenTopIndexes; + std::set seenBottomIndexes; + + for ( size_t i = 0; i < values.size(); i++ ) + { + int kLayer = static_cast( kIndexValues[i] ); + if ( seenTopIndexes.count( kLayer ) == 0 ) + { + seenTopIndexes.insert( kLayer ); + topValues[kLayer].push_back( values[i] ); + } + } + + for ( int i = static_cast( values.size() ) - 1; i >= 0; i-- ) + { + int kLayer = static_cast( kIndexValues[i] ); + if ( seenBottomIndexes.count( kLayer ) == 0 ) + { + seenBottomIndexes.insert( kLayer ); + bottomValues[kLayer].push_back( values[i] ); + } + } + } + } + } + + clearData(); + + std::vector kIndexes = offsets->sortedIndexes(); + for ( auto kIndex : kIndexes ) + { + double topMean = 0.0; + double bottomMean = 0.0; + // Top first + { + std::vector valuesAtDepth = topValues[kIndex]; + double p10, p50, p90, mean; + RigStatisticsMath::calculateStatisticsCurves( valuesAtDepth, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); + m_measuredDepths.push_back( offsets->getTopMd( kIndex ) ); + m_tvDepths.push_back( offsets->getTopTvd( kIndex ) ); + m_p10Data.push_back( p10 ); + m_p50Data.push_back( p50 ); + m_p90Data.push_back( p90 ); + m_meanData.push_back( mean ); + + topMean = mean; + } + + // Then bottom of k-layer + { + std::vector valuesAtDepth = bottomValues[kIndex]; + double p10, p50, p90, mean; + RigStatisticsMath::calculateStatisticsCurves( valuesAtDepth, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); + m_measuredDepths.push_back( offsets->getBottomMd( kIndex ) ); + m_tvDepths.push_back( offsets->getBottomTvd( kIndex ) ); + m_p10Data.push_back( p10 ); + m_p50Data.push_back( p50 ); + m_p90Data.push_back( p90 ); + m_meanData.push_back( mean ); + + bottomMean = mean; + } + + RiaLogging::debug( QString( "[%1] top: %2 bttom: %3 %4 %5" ) + .arg( kIndex ) + .arg( offsets->getTopMd( kIndex ) ) + .arg( offsets->getBottomMd( kIndex ) ) + .arg( topMean ) + .arg( bottomMean ) ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::shared_ptr + RimEnsembleWellLogStatistics::calculateIndexDepthOffset( const std::vector& wellLogFiles ) +{ + std::map sumTopMds; + std::map sumTopTvds; + std::map numTopMds; + + std::map sumBottomMds; + std::map sumBottomTvds; + std::map numBottomMds; + + int minLayerK = std::numeric_limits::max(); + int maxLayerK = -std::numeric_limits::max(); + + std::vector> topValues; + + for ( RimWellLogFile* wellLogFile : wellLogFiles ) + { + QString errorMessage; + if ( wellLogFile->readFile( &errorMessage ) ) + { + RigWellLogFile* fileData = wellLogFile->wellLogFileData(); + + std::vector depths = fileData->depthValues(); + std::vector tvdDepths = fileData->tvdMslValues(); + std::vector kIndexValues = fileData->values( RiaResultNames::indexKResultName() ); + + std::set seenTopIndexes; + std::set seenBottomIndexes; + if ( !depths.empty() && !tvdDepths.empty() && !kIndexValues.empty() ) + { + // Find top indexes + for ( size_t i = 0; i < kIndexValues.size(); i++ ) + { + int kLayer = static_cast( kIndexValues[i] ); + if ( seenTopIndexes.count( kLayer ) == 0 ) + { + // Only use the first value encountered per index per file. + // This is depth of the top of the index since the file is + // sorted by increasing depth. + seenTopIndexes.insert( kLayer ); + sumTopMds[kLayer] += depths[i]; + sumTopTvds[kLayer] += tvdDepths[i]; + numTopMds[kLayer] += 1; + minLayerK = std::min( minLayerK, kLayer ); + maxLayerK = std::max( maxLayerK, kLayer ); + } + } + + // Find bottom indexes + for ( int i = static_cast( kIndexValues.size() ) - 1; i >= 0; i-- ) + { + int kLayer = static_cast( kIndexValues[i] ); + if ( seenBottomIndexes.count( kLayer ) == 0 ) + { + // Only use the last value encountered per index per file. + // This is depth of the bottom of the index since the file is + // sorted by increasing depth. + seenBottomIndexes.insert( kLayer ); + sumBottomMds[kLayer] += depths[i]; + sumBottomTvds[kLayer] += tvdDepths[i]; + numBottomMds[kLayer] += 1; + } + } + } + } + else + { + RiaLogging::error( errorMessage ); + } + } + + if ( minLayerK > maxLayerK ) + { + RiaLogging::error( + QString( "Invalid K layers found. Minimum: %1 > Maximum : %2" ).arg( minLayerK ).arg( maxLayerK ) ); + return nullptr; + } + + std::shared_ptr offset = std::make_shared(); + for ( int kLayer = minLayerK; kLayer <= maxLayerK; kLayer++ ) + { + if ( numTopMds[kLayer] > 0 && numBottomMds[kLayer] > 0 ) + { + double topMd = sumTopMds[kLayer] / numTopMds[kLayer]; + double bottomMd = sumBottomMds[kLayer] / numBottomMds[kLayer]; + double topTvd = sumTopTvds[kLayer] / numBottomMds[kLayer]; + double bottomTvd = sumBottomTvds[kLayer] / numBottomMds[kLayer]; + RiaLogging::debug( QString( "K: %1 mean depth range: %2 - %3 Samples: %4 - %5" ) + .arg( kLayer ) + .arg( topMd ) + .arg( bottomMd ) + .arg( numTopMds[kLayer] ) + .arg( numBottomMds[kLayer] ) ); + offset->setIndexOffsetDepth( kLayer, topMd, bottomMd, topTvd, bottomTvd ); + } + } + + return offset; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::measuredDepths() const +{ + return m_measuredDepths; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::tvDepths() const +{ + return m_tvDepths; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::p10() const +{ + return m_p10Data; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::p50() const +{ + return m_p50Data; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::p90() const +{ + return m_p90Data; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::vector& RimEnsembleWellLogStatistics::mean() const +{ + return m_meanData; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogStatistics::hasP10Data() const +{ + return !m_p10Data.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogStatistics::hasP50Data() const +{ + return !m_p50Data.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogStatistics::hasP90Data() const +{ + return !m_p90Data.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimEnsembleWellLogStatistics::hasMeanData() const +{ + return !m_meanData.empty(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatistics::clearData() +{ + m_measuredDepths.clear(); + m_tvDepths.clear(); + m_p10Data.clear(); + m_p50Data.clear(); + m_p90Data.clear(); + m_meanData.clear(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiaDefines::DepthUnitType RimEnsembleWellLogStatistics::depthUnitType() const +{ + return m_depthUnit; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleWellLogStatistics::logChannelUnitString() const +{ + return m_logChannelUnitString; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.h new file mode 100644 index 0000000000..0b647afb98 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatistics.h @@ -0,0 +1,89 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include +#include + +class QString; + +class RimWellLogFile; + +class RigWellLogIndexDepthOffset; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleWellLogStatistics +{ +public: + enum class StatisticsType + { + P10, + P50, + P90, + MEAN + }; + + enum class DepthEqualization + { + K_LAYER, + NONE + }; + + RimEnsembleWellLogStatistics(); + + const std::vector& measuredDepths() const; + const std::vector& tvDepths() const; + const std::vector& p10() const; + const std::vector& p50() const; + const std::vector& p90() const; + const std::vector& mean() const; + QString logChannelUnitString() const; + RiaDefines::DepthUnitType depthUnitType() const; + + bool hasP10Data() const; + bool hasP50Data() const; + bool hasP90Data() const; + bool hasMeanData() const; + + void calculate( const std::vector& sumCases, + const QString& wellLogChannelName, + DepthEqualization depthEqualization ); + + static std::shared_ptr + calculateIndexDepthOffset( const std::vector& wellLogFiles ); + + void clearData(); + +private: + void calculate( const std::vector& sumCases, const QString& wellLogChannelName ); + void calculateByKLayer( const std::vector& sumCases, const QString& wellLogChannelName ); + + QString m_logChannelUnitString; + RiaDefines::DepthUnitType m_depthUnit; + std::vector m_measuredDepths; + std::vector m_tvDepths; + std::vector m_p10Data; + std::vector m_p50Data; + std::vector m_p90Data; + std::vector m_meanData; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.cpp new file mode 100644 index 0000000000..ca1b996876 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.cpp @@ -0,0 +1,195 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleWellLogStatisticsCurve.h" + +#include "RiaApplication.h" +#include "RiaDefines.h" +#include "RiaInterpolationTools.h" +#include "RiaLogging.h" + +#include "RimEnsembleWellLogCurveSet.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" + +#include "RiuQwtPlotCurve.h" +#include "RiuQwtPlotWidget.h" + +#include "cafPdmUiTreeOrdering.h" + +CAF_PDM_SOURCE_INIT( RimEnsembleWellLogStatisticsCurve, "EnsembleWellLogStatisticsCurve" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogStatisticsCurve::RimEnsembleWellLogStatisticsCurve() +{ + CAF_PDM_InitObject( "Ensemble Well Log Statistics Curve", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleWellLogCurveSet, "EnsembleWellLogCurveSet", "Ensemble Well Log Curve Set", "", "", "" ); + m_ensembleWellLogCurveSet.uiCapability()->setUiTreeChildrenHidden( true ); + m_ensembleWellLogCurveSet.uiCapability()->setUiTreeHidden( true ); + + CAF_PDM_InitFieldNoDefault( &m_statisticsType, "StatisticsType", "Statistics Type", "", "", "" ); + m_statisticsType.uiCapability()->setUiHidden( true ); + + m_wellPath = nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogStatisticsCurve::~RimEnsembleWellLogStatisticsCurve() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatisticsCurve::setEnsembleWellLogCurveSet( RimEnsembleWellLogCurveSet* ensembleWellLogCurveSet ) +{ + m_ensembleWellLogCurveSet = ensembleWellLogCurveSet; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatisticsCurve::setStatisticsType( RimEnsembleWellLogStatistics::StatisticsType statisticsType ) +{ + m_statisticsType = statisticsType; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogStatistics::StatisticsType RimEnsembleWellLogStatisticsCurve::statisticsType() const +{ + return m_statisticsType(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatisticsCurve::performDataExtraction( bool* isUsingPseudoLength ) +{ + std::vector values; + std::vector measuredDepthValues; + std::vector tvDepthValues; + double rkbDiff = 0.0; + + *isUsingPseudoLength = false; + + if ( m_ensembleWellLogCurveSet ) + { + const RimEnsembleWellLogStatistics* ensembleWellLogStatistics = + m_ensembleWellLogCurveSet->ensembleWellLogStatistics(); + + m_ensembleWellLogCurveSet->updateStatistics(); + + RiaDefines::DepthUnitType depthUnit = ensembleWellLogStatistics->depthUnitType(); + QString xUnits = ensembleWellLogStatistics->logChannelUnitString(); + + if ( m_statisticsType == RimEnsembleWellLogStatistics::StatisticsType::MEAN ) + { + values = ensembleWellLogStatistics->mean(); + measuredDepthValues = ensembleWellLogStatistics->measuredDepths(); + tvDepthValues = ensembleWellLogStatistics->tvDepths(); + } + else if ( m_statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P10 ) + { + values = ensembleWellLogStatistics->p10(); + measuredDepthValues = ensembleWellLogStatistics->measuredDepths(); + tvDepthValues = ensembleWellLogStatistics->tvDepths(); + } + else if ( m_statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P50 ) + { + values = ensembleWellLogStatistics->p50(); + measuredDepthValues = ensembleWellLogStatistics->measuredDepths(); + tvDepthValues = ensembleWellLogStatistics->tvDepths(); + } + else if ( m_statisticsType == RimEnsembleWellLogStatistics::StatisticsType::P90 ) + { + values = ensembleWellLogStatistics->p90(); + measuredDepthValues = ensembleWellLogStatistics->measuredDepths(); + tvDepthValues = ensembleWellLogStatistics->tvDepths(); + } + + if ( !values.empty() && !measuredDepthValues.empty() && measuredDepthValues.size() == values.size() ) + { + if ( m_ensembleWellLogCurveSet->depthEqualization() == RimEnsembleWellLogStatistics::DepthEqualization::NONE ) + { + std::vector dummyValues( values.begin(), values.end() ); + addDatapointsForBottomOfSegment( measuredDepthValues, values ); + // Pass copy of values vector to avoid adding bottom segments twice + addDatapointsForBottomOfSegment( tvDepthValues, dummyValues ); + } + + std::map> validDepths; + if ( values.size() == measuredDepthValues.size() ) + { + validDepths.insert( std::make_pair( RiaDefines::DepthTypeEnum::MEASURED_DEPTH, measuredDepthValues ) ); + } + if ( values.size() == tvDepthValues.size() ) + { + validDepths.insert( std::make_pair( RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH, tvDepthValues ) ); + validDepths.insert( std::make_pair( RiaDefines::DepthTypeEnum::TRUE_VERTICAL_DEPTH_RKB, tvDepthValues ) ); + } + + this->setValuesAndDepths( values, validDepths, rkbDiff, depthUnit, false ); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimEnsembleWellLogStatisticsCurve::createCurveAutoName() +{ + return caf::AppEnum::uiText( m_statisticsType() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogStatisticsCurve::addDatapointsForBottomOfSegment( std::vector& depthValues, + std::vector& values ) +{ + std::vector depthValuesWithBottomLayers; + std::vector valuesWithBottomLayers; + for ( size_t i = 0; i < values.size(); i++ ) + { + // Add the data point at top of the layer + double topLayerDepth = depthValues[i]; + double value = values[i]; + depthValuesWithBottomLayers.push_back( topLayerDepth ); + valuesWithBottomLayers.push_back( value ); + + // Add extra data points for bottom part of the layer + if ( i < values.size() - 1 ) + { + double bottomLayerDepth = depthValues[i + 1]; + double bottomValue = value; + + depthValuesWithBottomLayers.push_back( bottomLayerDepth ); + valuesWithBottomLayers.push_back( bottomValue ); + } + } + + values = valuesWithBottomLayers; + depthValues = depthValuesWithBottomLayers; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.h new file mode 100644 index 0000000000..930bce3e0a --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogStatisticsCurve.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimEnsembleWellLogStatistics.h" +#include "RimWellLogExtractionCurve.h" + +#include "cafPdmField.h" +#include "cafPdmPtrField.h" + +#include + +class RimEnsembleWellLogCurveSet; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleWellLogStatisticsCurve : public RimWellLogExtractionCurve +{ + CAF_PDM_HEADER_INIT; + +public: + RimEnsembleWellLogStatisticsCurve(); + ~RimEnsembleWellLogStatisticsCurve() override; + + void setEnsembleWellLogCurveSet( RimEnsembleWellLogCurveSet* ensembleWellLogCurveSet ); + + void setStatisticsType( RimEnsembleWellLogStatistics::StatisticsType ); + RimEnsembleWellLogStatistics::StatisticsType statisticsType() const; + +protected: + void performDataExtraction( bool* isUsingPseudoLength ) override; + + QString createCurveAutoName() override; + + static void addDatapointsForBottomOfSegment( std::vector& depthValues, std::vector& values ); + + caf::PdmPtrField m_ensembleWellLogCurveSet; + caf::PdmField> m_statisticsType; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.cpp new file mode 100644 index 0000000000..8e13ad98ff --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.cpp @@ -0,0 +1,78 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleWellLogs.h" + +#include "RiaLogging.h" + +#include "RimWellLogFile.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +CAF_PDM_SOURCE_INIT( RimEnsembleWellLogs, "EnsembleWellLogs" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogs::RimEnsembleWellLogs() +{ + CAF_PDM_InitScriptableObject( "Ensemble Well Logs", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_wellLogFiles, "WellLogFiles", "", "", "", "" ); + m_wellLogFiles.uiCapability()->setUiTreeHidden( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogs::removeWellLogFile( RimWellLogFile* summaryCase ) +{ + m_wellLogFiles.removeChildObject( summaryCase ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogs::addWellLogFile( RimWellLogFile* summaryCase ) +{ + m_wellLogFiles.push_back( summaryCase ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleWellLogs::wellLogFiles() const +{ + return m_wellLogFiles().childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogs::loadDataAndUpdate() +{ + for ( auto& w : m_wellLogFiles ) + { + QString errorMessage; + if ( !w->readFile( &errorMessage ) ) + { + RiaLogging::warning( errorMessage ); + } + } +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.h new file mode 100644 index 0000000000..17287921a8 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogs.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimNamedObject.h" + +#include "cafPdmChildArrayField.h" + +class RimWellLogFile; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleWellLogs : public RimNamedObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimEnsembleWellLogs(); + void removeWellLogFile( RimWellLogFile* wellLogFile ); + void addWellLogFile( RimWellLogFile* wellLogFile ); + + std::vector wellLogFiles() const; + + void loadDataAndUpdate(); + +private: + caf::PdmChildArrayField m_wellLogFiles; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.cpp new file mode 100644 index 0000000000..4d350cedd7 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.cpp @@ -0,0 +1,76 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimEnsembleWellLogsCollection.h" + +#include "RimEnsembleWellLogs.h" + +#include "cafProgressInfo.h" + +CAF_PDM_SOURCE_INIT( RimEnsembleWellLogsCollection, "EnsembleWellLogsCollection" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogsCollection::RimEnsembleWellLogsCollection() +{ + CAF_PDM_InitObject( "Ensemble Well Logs", ":/LasFile16x16.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_ensembleWellLogs, "EnsembleWellLogsCollection", "", "", "", "" ); + m_ensembleWellLogs.uiCapability()->setUiTreeHidden( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimEnsembleWellLogsCollection::~RimEnsembleWellLogsCollection() +{ + m_ensembleWellLogs.deleteAllChildObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogsCollection::addEnsembleWellLogs( RimEnsembleWellLogs* ensembleWellLogs ) +{ + m_ensembleWellLogs.push_back( ensembleWellLogs ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimEnsembleWellLogsCollection::ensembleWellLogs() const +{ + std::vector ensembleWellLogs; + for ( const auto& e : m_ensembleWellLogs ) + { + ensembleWellLogs.push_back( e ); + } + return ensembleWellLogs; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimEnsembleWellLogsCollection::loadDataAndUpdate() +{ + for ( const auto& e : m_ensembleWellLogs ) + { + e->loadDataAndUpdate(); + } +} diff --git a/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.h new file mode 100644 index 0000000000..b53bca398d --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimEnsembleWellLogsCollection.h @@ -0,0 +1,43 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "cafPdmChildArrayField.h" +#include "cafPdmObject.h" + +class RimEnsembleWellLogs; + +//================================================================================================== +/// +//================================================================================================== +class RimEnsembleWellLogsCollection : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimEnsembleWellLogsCollection(); + ~RimEnsembleWellLogsCollection() override; + + std::vector ensembleWellLogs() const; + + void addEnsembleWellLogs( RimEnsembleWellLogs* ensembleWellLogs ); + void loadDataAndUpdate(); + +private: + caf::PdmChildArrayField m_ensembleWellLogs; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimWellLogCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp index 7646791dc1..8662c7c6e2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.cpp @@ -179,7 +179,7 @@ const RigWellLogCurveData* RimWellLogCurve::curveData() const void RimWellLogCurve::updateCurveAppearance() { RimPlotCurve::updateCurveAppearance(); - if ( m_fillStyle != Qt::BrushStyle::NoBrush ) + if ( fillStyle() != Qt::BrushStyle::NoBrush ) { m_qwtPlotCurve->setOrientation( Qt::Horizontal ); m_qwtPlotCurve->setBaseline( -std::numeric_limits::infinity() ); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogCurveCommonDataSource.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogCurveCommonDataSource.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogCurveCommonDataSource.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogCurveCommonDataSource.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp similarity index 96% rename from ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp index d25b234289..271dfb91a5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.cpp @@ -21,6 +21,7 @@ #include "RiaColorTables.h" #include "RiaLogging.h" +#include "RiaResultNames.h" #include "RiaSimWellBranchTools.h" #include "RiaWellLogUnitTools.h" @@ -63,6 +64,8 @@ #include "RiuQwtPlotCurve.h" #include "RiuQwtPlotWidget.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" #include "cafPdmUiTreeOrdering.h" #include "cafUtils.h" @@ -73,7 +76,7 @@ /// //================================================================================================== -CAF_PDM_SOURCE_INIT( RimWellLogExtractionCurve, "RimWellLogExtractionCurve" ); +CAF_PDM_SOURCE_INIT( RimWellLogExtractionCurve, "WellLogExtractionCurve", "RimWellLogExtractionCurve" ); namespace caf { @@ -91,7 +94,7 @@ void AppEnum::setUp() //-------------------------------------------------------------------------------------------------- RimWellLogExtractionCurve::RimWellLogExtractionCurve() { - CAF_PDM_InitObject( "Well Log Curve", RimWellLogCurve::wellLogCurveIconName(), "", "" ); + CAF_PDM_InitScriptableObject( "Well Log Curve", RimWellLogCurve::wellLogCurveIconName(), "", "" ); CAF_PDM_InitFieldNoDefault( &m_trajectoryType, "TrajectoryType", "Trajectory Type", "", "", "" ); @@ -112,13 +115,13 @@ RimWellLogExtractionCurve::RimWellLogExtractionCurve() m_case.uiCapability()->setUiTreeChildrenHidden( true ); CAF_PDM_InitFieldNoDefault( &m_eclipseResultDefinition, "CurveEclipseResult", "", "", "", "" ); - m_eclipseResultDefinition.uiCapability()->setUiHidden( true ); + m_eclipseResultDefinition.uiCapability()->setUiTreeHidden( true ); m_eclipseResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_eclipseResultDefinition = new RimEclipseResultDefinition; m_eclipseResultDefinition->findField( "MResultType" )->uiCapability()->setUiName( "Result Type" ); CAF_PDM_InitFieldNoDefault( &m_geomResultDefinition, "CurveGeomechResult", "", "", "", "" ); - m_geomResultDefinition.uiCapability()->setUiHidden( true ); + m_geomResultDefinition.uiCapability()->setUiTreeHidden( true ); m_geomResultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_geomResultDefinition = new RimGeoMechResultDefinition; m_geomResultDefinition->setAddWellPathDerivedResults( true ); @@ -612,6 +615,36 @@ RiaDefines::PhaseType RimWellLogExtractionCurve::phaseType() const return phase; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellLogExtractionCurve::wellDateFromGridCaseModel( RimCase* gridCaseModel, int timeStep ) +{ + auto* geomCase = dynamic_cast( gridCaseModel ); + auto* eclipseCase = dynamic_cast( gridCaseModel ); + + QStringList timeStepNames; + + if ( eclipseCase ) + { + if ( eclipseCase->eclipseCaseData() ) + { + timeStepNames = eclipseCase->timeStepStrings(); + } + } + else if ( geomCase ) + { + if ( geomCase->geoMechData() ) + { + timeStepNames = geomCase->timeStepStrings(); + } + } + + if ( timeStep >= 0 && timeStep < timeStepNames.size() ) return timeStepNames[timeStep]; + + return "01_Jan_2000"; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -797,18 +830,11 @@ void RimWellLogExtractionCurve::defineUiTreeOrdering( caf::PdmUiTreeOrdering& ui void RimWellLogExtractionCurve::setLogScaleFromSelectedResult() { QString resVar = m_eclipseResultDefinition->resultVariable(); - - if ( resVar.toUpper().contains( "PERM" ) ) + if ( RiaResultNames::isLogarithmicResult( resVar ) ) { RimWellLogTrack* track = nullptr; this->firstAncestorOrThisOfType( track ); - if ( track ) - { - if ( track->curveCount() == 1 ) - { - track->setLogarithmicScale( true ); - } - } + if ( track && track->curveCount() == 1 ) track->setLogarithmicScale( true ); } } @@ -973,27 +999,7 @@ QString RimWellLogExtractionCurve::wellName() const //-------------------------------------------------------------------------------------------------- QString RimWellLogExtractionCurve::wellDate() const { - RimGeoMechCase* geomCase = dynamic_cast( m_case.value() ); - RimEclipseCase* eclipseCase = dynamic_cast( m_case.value() ); - - QStringList timeStepNames; - - if ( eclipseCase ) - { - if ( eclipseCase->eclipseCaseData() ) - { - timeStepNames = eclipseCase->timeStepStrings(); - } - } - else if ( geomCase ) - { - if ( geomCase->geoMechData() ) - { - timeStepNames = geomCase->timeStepStrings(); - } - } - - return ( m_timeStep >= 0 && m_timeStep < timeStepNames.size() ) ? timeStepNames[m_timeStep] : ""; + return RimWellLogExtractionCurve::wellDateFromGridCaseModel( m_case(), m_timeStep ); } //-------------------------------------------------------------------------------------------------- @@ -1071,6 +1077,14 @@ QString RimWellLogExtractionCurve::eclipseResultVariable() const return m_eclipseResultDefinition->resultVariable(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogExtractionCurve::setEclipseResultCategory( RiaDefines::ResultCatType catType ) +{ + m_eclipseResultDefinition->setResultType( catType ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h index e94e225321..42129a11a1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurve.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurve.h @@ -79,6 +79,7 @@ class RimWellLogExtractionCurve : public RimWellLogCurve void setEclipseResultVariable( const QString& resVarname ); QString eclipseResultVariable() const; + void setEclipseResultCategory( RiaDefines::ResultCatType catType ); void setGeoMechResultAddress( const RigFemResultAddress& resAddr ); @@ -93,6 +94,8 @@ class RimWellLogExtractionCurve : public RimWellLogCurve void setAutoNameComponents( bool addCaseName, bool addProperty, bool addWellname, bool addTimeStep, bool addDate ); RiaDefines::PhaseType phaseType() const override; + static QString wellDateFromGridCaseModel( RimCase* gridCaseModel, int timeStep ); + protected: QString createCurveAutoName() override; void onLoadDataAndUpdate( bool updateParentPlot ) override; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurveNameConfig.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurveNameConfig.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurveNameConfig.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogExtractionCurveNameConfig.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogExtractionCurveNameConfig.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFile.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFile.cpp similarity index 98% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFile.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFile.cpp index f36cd486cb..c2547c3aff 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogFile.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFile.cpp @@ -168,9 +168,9 @@ bool RimWellLogFile::readFile( QString* errorMessage ) } else if ( !isDateValid( m_date() ) ) { - *errorMessage = QString( "The LAS-file '%1' contains no recognizable date. Please assign a date in the " - "LAS-file property panel" ) - .arg( m_name() ); + RiaLogging::warning( QString( "The LAS-file '%1' contains no recognizable date. Please assign a date in the " + "LAS-file property panel." ) + .arg( m_name() ) ); m_date = DEFAULT_DATE_TIME; } diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFile.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFile.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFile.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFile.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileChannel.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileChannel.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileChannel.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileChannel.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileChannel.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileChannel.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileChannel.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileChannel.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp similarity index 83% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp index 4d8e2044e6..df7daccfe2 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.cpp @@ -22,7 +22,9 @@ #include "RiaLogging.h" #include "RiaPreferences.h" +#include "RiaResultNames.h" #include "RigWellLogCurveData.h" +#include "RigWellLogIndexDepthOffset.h" #include "RigWellPath.h" #include "RimProject.h" @@ -94,6 +96,20 @@ void RimWellLogFileCurve::onLoadDataAndUpdate( bool updateParentPlot ) bool rkbDiff = m_wellPath->wellPathGeometry() ? m_wellPath->wellPathGeometry()->rkbDiff() : 0.0; + if ( m_indexDepthOffsets ) + { + // Adjust depths by reassigning depths for top and bottom of layer for each K layer + std::vector kIndexValues = wellLogFile->values( RiaResultNames::indexKResultName() ); + if ( values.size() == kIndexValues.size() ) + { + auto [valuesAdjusted, measuredDepthValuesAdjusted] = + adjustByIndexDepthOffsets( measuredDepthValues, values, kIndexValues ); + + values = valuesAdjusted; + measuredDepthValues = measuredDepthValuesAdjusted; + } + } + if ( tvdMslValues.size() != values.size() ) { RigWellPath* rigWellPath = m_wellPath->wellPathGeometry(); @@ -140,20 +156,17 @@ void RimWellLogFileCurve::onLoadDataAndUpdate( bool updateParentPlot ) if ( wellLogPlot && !this->curveData()->availableDepthTypes().count( wellLogPlot->depthType() ) ) { QString depthTitle = wellLogPlot->depthAxisTitle(); - errMsg = QString( "Display of %1 for LAS curves is not possible without %1 " + errMsg = QString( "Display of %1 for LAS curves is not possible without %2 " "values in the LAS-file or a well path to derive them from." ) .arg( depthTitle ) .arg( depthTitle ); } - bool showWarning = !RiaPreferences::current()->showLasCurveWithoutTvdWarning(); - if ( !errMsg.isEmpty() && showWarning ) + if ( !errMsg.isEmpty() ) { QString tmp = QString( "The LAS curve can not be displayed.\n%1\n" ).arg( errMsg ); - tmp += "Control display of this warning from \"Preferences->Show LAS curve without TVD " - "warning\""; - RiaLogging::errorInMessageBox( nullptr, "LAS curve without current depth type", tmp ); + RiaLogging::warning( tmp ); } } @@ -192,6 +205,55 @@ void RimWellLogFileCurve::onLoadDataAndUpdate( bool updateParentPlot ) } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair, std::vector> + RimWellLogFileCurve::adjustByIndexDepthOffsets( const std::vector& measuredDepthValues, + const std::vector& values, + const std::vector& kIndexValues ) const +{ + CAF_ASSERT( values.size() == kIndexValues.size() ); + + auto findFirstIndex = []( int kLayer, const std::vector& vals ) { + for ( size_t i = 0; i < vals.size(); i++ ) + if ( kLayer == static_cast( vals[i] ) ) return i; + + return vals.size(); + }; + + auto findLastIndex = []( int kLayer, const std::vector& vals ) { + for ( int i = static_cast( vals.size() ) - 1; i >= 0; i-- ) + if ( kLayer == static_cast( vals[i] ) ) return static_cast( i ); + + return vals.size(); + }; + + std::vector kIndexes = m_indexDepthOffsets->sortedIndexes(); + + std::vector valuesAdjusted; + std::vector measuredDepthValuesAdjusted; + + for ( int kLayer : kIndexes ) + { + size_t firstIndex = findFirstIndex( kLayer, kIndexValues ); + size_t lastIndex = findLastIndex( kLayer, kIndexValues ); + + if ( firstIndex != kIndexValues.size() && lastIndex != kIndexValues.size() ) + { + // Add top + measuredDepthValuesAdjusted.push_back( m_indexDepthOffsets->getTopMd( kLayer ) ); + valuesAdjusted.push_back( values[firstIndex] ); + + // Add bottom of layer + measuredDepthValuesAdjusted.push_back( m_indexDepthOffsets->getBottomMd( kLayer ) ); + valuesAdjusted.push_back( values[lastIndex] ); + } + } + + return std::make_pair( valuesAdjusted, measuredDepthValuesAdjusted ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -224,6 +286,14 @@ void RimWellLogFileCurve::setWellLogFile( RimWellLogFile* wellLogFile ) m_wellLogFile = wellLogFile; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogFileCurve::setIndexDepthOffsets( std::shared_ptr depthOffsets ) +{ + m_indexDepthOffsets = depthOffsets; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -353,6 +423,8 @@ QList RimWellLogFileCurve::calculateValueOptions( const //-------------------------------------------------------------------------------------------------- void RimWellLogFileCurve::initAfterRead() { + RimWellLogCurve::initAfterRead(); + if ( !m_wellPath ) return; if ( m_wellPath->wellLogFiles().size() == 1 ) diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.h similarity index 85% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.h index b888a6b064..302e4d4496 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurve.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurve.h @@ -29,6 +29,7 @@ class RimWellPath; class RimWellLogFileChannel; class RimWellLogFile; +class RigWellLogIndexDepthOffset; //================================================================================================== /// @@ -46,6 +47,7 @@ class RimWellLogFileCurve : public RimWellLogCurve RimWellPath* wellPath() const; void setWellLogChannelName( const QString& name ); void setWellLogFile( RimWellLogFile* wellLogFile ); + void setIndexDepthOffsets( std::shared_ptr depthOffsets ); // Overrides from RimWellLogPlotCurve QString wellName() const override; @@ -69,9 +71,16 @@ class RimWellLogFileCurve : public RimWellLogCurve bool isRftPlotChild() const; + std::pair, std::vector> + adjustByIndexDepthOffsets( const std::vector& measuredDepthValues, + const std::vector& values, + const std::vector& kIndexValues ) const; + protected: caf::PdmPtrField m_wellPath; caf::PdmPtrField m_wellLogFile; caf::PdmField m_wellLogChannelName; caf::PdmField m_wellLogChannnelUnit; + + std::shared_ptr m_indexDepthOffsets; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurveNameConfig.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileCurveNameConfig.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurveNameConfig.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurveNameConfig.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogFileCurveNameConfig.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogFileCurveNameConfig.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlot.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlot.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlot.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlot.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlot.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlot.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlot.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlot.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.cpp similarity index 93% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.cpp index ba71f18913..0be5aad571 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.cpp @@ -34,6 +34,9 @@ #include "RimWellPath.h" #include "RimWellPathCollection.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + #include "cvfAssert.h" CAF_PDM_SOURCE_INIT( RimWellLogPlotCollection, "WellLogPlotCollection" ); @@ -43,10 +46,10 @@ CAF_PDM_SOURCE_INIT( RimWellLogPlotCollection, "WellLogPlotCollection" ); //-------------------------------------------------------------------------------------------------- RimWellLogPlotCollection::RimWellLogPlotCollection() { - CAF_PDM_InitObject( "Well Log Plots", ":/WellLogPlots16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Well Log Plots", ":/WellLogPlots16x16.png", "", "" ); - CAF_PDM_InitFieldNoDefault( &m_wellLogPlots, "WellLogPlots", "", "", "", "" ); - m_wellLogPlots.uiCapability()->setUiHidden( true ); + CAF_PDM_InitScriptableFieldNoDefault( &m_wellLogPlots, "WellLogPlots", "", "", "", "" ); + m_wellLogPlots.uiCapability()->setUiTreeHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -163,6 +166,15 @@ void RimWellLogPlotCollection::deleteAllPlots() m_wellLogPlots.deleteAllChildObjects(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogPlotCollection::removePlot( gsl::not_null plot ) +{ + m_wellLogPlots.removeChildObject( plot ); + updateAllRequiredEditors(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.h similarity index 91% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.h index c00e47076b..cacbe501f1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotCollection.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotCollection.h @@ -59,10 +59,12 @@ class RimWellLogPlotCollection : public caf::PdmObject, public RimPlotCollection RigGeoMechWellLogExtractor* findOrCreateExtractor( RimWellPath* wellPath, RimGeoMechCase* geoMechCase ); std::vector wellLogPlots() const; - void addWellLogPlot( gsl::not_null wellLogPlot ); - void deleteAllPlots() override; - void loadDataAndUpdateAllPlots() override; - size_t plotCount() const override; + + void addWellLogPlot( gsl::not_null wellLogPlot ); + void removePlot( gsl::not_null plot ); + void deleteAllPlots() override; + void loadDataAndUpdateAllPlots() override; + size_t plotCount() const override; void deleteAllExtractors(); void removeExtractors( const RigWellPath* wellPathGeometry ); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlotNameConfig.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogPlotNameConfig.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogPlotNameConfig.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogPlotNameConfig.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogRftCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimWellLogRftCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp index 008f8ff534..491e77398b 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogRftCurve.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.cpp @@ -22,7 +22,6 @@ #include "RiaEclipseUnitTools.h" #include "RiaQDateTimeTools.h" #include "RiaSimWellBranchTools.h" -#include "RiaStatisticsTools.h" #include "RifEclipseRftAddress.h" #include "RifReaderEclipseRft.h" @@ -359,7 +358,6 @@ QString RimWellLogRftCurve::createCurveAutoName() RifEclipseRftAddress::RftWellLogChannelType channelNameEnum = caf::AppEnum::fromText( wellLogChannelUiName() ); QString channelName = caf::AppEnum::uiText( channelNameEnum ); - channelName = RiaStatisticsTools::replacePercentileByPValueText( channelName ); name.push_back( channelName ); } if ( !m_timeStep().isNull() ) diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogRftCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogRftCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurveNameConfig.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogRftCurveNameConfig.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurveNameConfig.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurveNameConfig.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogRftCurveNameConfig.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogRftCurveNameConfig.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogTrack.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp similarity index 94% rename from ApplicationLibCode/ProjectDataModel/RimWellLogTrack.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp index 682e5c7fc9..9b8eac313d 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogTrack.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.cpp @@ -25,6 +25,7 @@ #include "RiaLogging.h" #include "RiaPreferences.h" #include "RiaSimWellBranchTools.h" +#include "RiaWellLogCurveMerger.h" #include "RigEclipseCaseData.h" #include "RigEclipseResultAddress.h" @@ -49,6 +50,7 @@ #include "RimColorLegendItem.h" #include "RimEclipseCase.h" #include "RimEclipseResultDefinition.h" +#include "RimEnsembleWellLogCurveSet.h" #include "RimFishbones.h" #include "RimFishbonesCollection.h" #include "RimGeoMechCase.h" @@ -83,8 +85,11 @@ #include "RiuWellPathComponentPlotItem.h" #include "cafPdmFieldReorderCapability.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" #include "cafPdmUiSliderEditor.h" #include "cafSelectionManager.h" + #include "cvfAssert.h" #include @@ -169,14 +174,14 @@ RimWellLogTrack::RimWellLogTrack() , m_availableDepthRangeMax( RI_LOGPLOTTRACK_MAXX_DEFAULT ) { - CAF_PDM_InitObject( "Track", ":/WellLogTrack16x16.png", "", "" ); + CAF_PDM_InitScriptableObject( "Track", ":/WellLogTrack16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_description, "TrackDescription", "Name", "", "", "" ); m_description.uiCapability()->setUiReadOnly( true ); CAF_PDM_InitFieldNoDefault( &m_curves, "Curves", "", "", "", "" ); - m_curves.uiCapability()->setUiHidden( true ); + m_curves.uiCapability()->setUiTreeHidden( true ); auto reorderability = caf::PdmFieldReorderCapability::addToField( &m_curves ); reorderability->orderChanged.connect( this, &RimWellLogTrack::curveDataChanged ); @@ -197,6 +202,7 @@ RimWellLogTrack::RimWellLogTrack() CAF_PDM_InitFieldNoDefault( &m_xAxisGridVisibility, "ShowXGridLines", "Show Grid Lines", "", "", "" ); CAF_PDM_InitField( &m_explicitTickIntervals, "ExplicitTickIntervals", false, "Manually Set Tick Intervals", "", "", "" ); + CAF_PDM_InitField( &m_minAndMaxTicksOnly, "MinAndMaxTicksOnly", false, "Show Ticks at Min and Max", "", "", "" ); CAF_PDM_InitField( &m_majorTickInterval, "MajorTickIntervals", 0.0, "Major Tick Interval", "", "", "" ); CAF_PDM_InitField( &m_minorTickInterval, "MinorTickIntervals", 0.0, "Minor Tick Interval", "", "", "" ); m_majorTickInterval.uiCapability()->setUiHidden( true ); @@ -215,6 +221,9 @@ RimWellLogTrack::RimWellLogTrack() CAF_PDM_InitField( &m_showRegionLabels, "ShowFormationLabels", true, "Show Labels", "", "", "" ); + caf::FontTools::RelativeSizeEnum regionLabelFontSizeDefault = caf::FontTools::RelativeSize::XSmall; + CAF_PDM_InitField( &m_regionLabelFontSize, "RegionLabelFontSize", regionLabelFontSizeDefault, "Font Size", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_formationSource, "FormationSource", "Source", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_formationTrajectoryType, "FormationTrajectoryType", "Trajectory", "", "", "" ); @@ -262,10 +271,18 @@ RimWellLogTrack::RimWellLogTrack() m_underburdenHeight.uiCapability()->setUiHidden( true ); CAF_PDM_InitFieldNoDefault( &m_resultDefinition, "ResultDefinition", "Result Definition", "", "", "" ); - m_resultDefinition.uiCapability()->setUiHidden( true ); + m_resultDefinition.uiCapability()->setUiTreeHidden( true ); m_resultDefinition.uiCapability()->setUiTreeChildrenHidden( true ); m_resultDefinition = new RimEclipseResultDefinition; + CAF_PDM_InitFieldNoDefault( &m_ensembleWellLogCurveSet, + "EnsembleWellLogCurveSet", + "Ensemble Well Logs Curve Set", + "", + "", + "" ); + m_ensembleWellLogCurveSet.uiCapability()->setUiTreeHidden( true ); + m_formationsForCaseWithSimWellOnly = false; } @@ -544,14 +561,13 @@ void RimWellLogTrack::fieldChangedByUi( const caf::PdmFieldHandle* changedField, } } else if ( changedField == &m_xAxisGridVisibility || changedField == &m_majorTickInterval || - changedField == &m_minorTickInterval ) + changedField == &m_minorTickInterval || changedField == &m_minAndMaxTicksOnly ) { updateXAxisAndGridTickIntervals(); } else if ( changedField == &m_visibleXRangeMin || changedField == &m_visibleXRangeMax ) { - bool emptyRange = std::abs( m_visibleXRangeMax() - m_visibleXRangeMin ) < - 1.0e-6 * std::max( 1.0, std::max( m_visibleXRangeMax(), m_visibleXRangeMin() ) ); + bool emptyRange = isEmptyVisibleXRange(); m_explicitTickIntervals.uiCapability()->setUiReadOnly( emptyRange ); m_xAxisGridVisibility.uiCapability()->setUiReadOnly( emptyRange ); @@ -605,7 +621,7 @@ void RimWellLogTrack::fieldChangedByUi( const caf::PdmFieldHandle* changedField, updateConnectedEditors(); RiuPlotMainWindowTools::refreshToolbars(); } - else if ( changedField == &m_showRegionLabels ) + else if ( changedField == &m_showRegionLabels || changedField == &m_regionLabelFontSize ) { loadDataAndUpdate(); } @@ -753,9 +769,7 @@ void RimWellLogTrack::updateXAxisAndGridTickIntervals() { if ( !m_plotWidget ) return; - bool emptyRange = std::abs( m_visibleXRangeMax() - m_visibleXRangeMin ) < - 1.0e-6 * std::max( 1.0, std::max( m_visibleXRangeMax(), m_visibleXRangeMin() ) ); - + bool emptyRange = isEmptyVisibleXRange(); if ( emptyRange ) { m_plotWidget->enableGridLines( QwtPlot::xTop, false, false ); @@ -765,7 +779,43 @@ void RimWellLogTrack::updateXAxisAndGridTickIntervals() else { m_plotWidget->setAxisLabelsAndTicksEnabled( QwtPlot::xTop, true, true ); - if ( m_explicitTickIntervals ) + if ( m_minAndMaxTicksOnly ) + { + auto roundToDigits = []( double value, int numberOfDigits, bool useFloor ) { + if ( value == 0.0 ) return 0.0; + + double factor = std::pow( 10.0, numberOfDigits - std::ceil( std::log10( std::fabs( value ) ) ) ); + + if ( useFloor ) + { + // Use floor for maximum value to ensure we get a value inside the complete range + return std::floor( value * factor ) / factor; + } + + // Use ceil for minimum value to ensure we get a value inside the complete range + return std::ceil( value * factor ) / factor; + }; + + auto div = QwtScaleDiv( m_visibleXRangeMin(), m_visibleXRangeMax() ); + + QList majorTicks; + + auto min = roundToDigits( m_visibleXRangeMin(), 2, false ); + auto max = roundToDigits( m_visibleXRangeMax(), 2, true ); + if ( min == max ) + { + min = roundToDigits( m_visibleXRangeMin(), 3, false ); + max = roundToDigits( m_visibleXRangeMax(), 3, true ); + } + + majorTicks.push_back( min ); + majorTicks.push_back( max ); + + div.setTicks( QwtScaleDiv::TickType::MajorTick, majorTicks ); + + m_plotWidget->setAxisScaleDiv( QwtPlot::xTop, div ); + } + else if ( m_explicitTickIntervals ) { m_plotWidget->setMajorAndMinorTickIntervals( QwtPlot::xTop, m_majorTickInterval(), @@ -832,6 +882,9 @@ QString RimWellLogTrack::asciiDataForPlotExport() const } } + RiaWellLogCurveMerger curveMerger; + bool foundNonMatchingDepths = false; + for ( RimWellLogCurve* curve : m_curves() ) { if ( !curve->isCurveVisible() ) continue; @@ -846,7 +899,7 @@ QString RimWellLogTrack::asciiDataForPlotExport() const } std::vector xPlotValues = curveData->xPlotValues(); - if ( curveDepths.size() != xPlotValues.size() || xPlotValues.empty() ) + if ( xPlotValues.empty() ) { curveNames.pop_back(); @@ -856,6 +909,15 @@ QString RimWellLogTrack::asciiDataForPlotExport() const } continue; } + + if ( curveDepths.size() != xPlotValues.size() ) + { + foundNonMatchingDepths = true; + } + + std::vector depths = curveData->depthPlotValues( depthType, depthUnit ); + curveMerger.addCurveData( depths, xPlotValues ); + curvesPlotXValues.push_back( xPlotValues ); } @@ -888,6 +950,26 @@ QString RimWellLogTrack::asciiDataForPlotExport() const } out += "\n"; + // Resample when curves have different depth + if ( foundNonMatchingDepths ) + { + curvesPlotXValues.clear(); + curveDepths.clear(); + + curveMerger.computeLookupValues(); + + const std::vector& allDepths = curveMerger.allXValues(); + curveDepths = allDepths; + for ( size_t depthIdx = 0; depthIdx < allDepths.size(); depthIdx++ ) + { + for ( size_t curveIdx = 0; curveIdx < curveMerger.curveCount(); ++curveIdx ) + { + const std::vector& curveValues = curveMerger.lookupYValuesForAllXValues( curveIdx ); + curvesPlotXValues.push_back( curveValues ); + } + } + } + for ( size_t dIdx = 0; dIdx < curveDepths.size(); ++dIdx ) { size_t i = dIdx; @@ -1031,6 +1113,9 @@ QList RimWellLogTrack::calculateValueOptions( const caf: { RimTools::colorLegendOptionItems( &options ); } + else if ( fieldNeedingOptions == &m_ensembleWellLogCurveSet ) + { + } return options; } @@ -1132,6 +1217,15 @@ void RimWellLogTrack::visibleDepthRange( double* minDepth, double* maxDepth ) *maxDepth = m_visibleDepthRangeMax; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellLogTrack::isEmptyVisibleXRange() const +{ + return std::abs( m_visibleXRangeMax() - m_visibleXRangeMin ) < + 1.0e-6 * std::max( 1.0, std::max( m_visibleXRangeMax(), m_visibleXRangeMin() ) ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1180,8 +1274,7 @@ void RimWellLogTrack::onLoadDataAndUpdate() m_majorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); m_minorTickInterval.uiCapability()->setUiHidden( !m_explicitTickIntervals() ); - bool emptyRange = std::abs( m_visibleXRangeMax() - m_visibleXRangeMin ) < - 1.0e-6 * std::max( 1.0, std::max( m_visibleXRangeMax(), m_visibleXRangeMin() ) ); + bool emptyRange = isEmptyVisibleXRange(); m_explicitTickIntervals.uiCapability()->setUiReadOnly( emptyRange ); m_xAxisGridVisibility.uiCapability()->setUiReadOnly( emptyRange ); @@ -1264,6 +1357,10 @@ void RimWellLogTrack::setAutoScaleYEnabled( bool enabled ) //-------------------------------------------------------------------------------------------------- void RimWellLogTrack::setAutoScaleXIfNecessary() { + // Avoid resetting if visible range has set to empty by user + bool emptyRange = isEmptyVisibleXRange(); + if ( !m_isAutoScaleXEnabled && emptyRange ) return; + const double eps = 1.0e-8; calculateXZoomRange(); @@ -1527,6 +1624,14 @@ void RimWellLogTrack::setTickIntervals( double majorTickInterval, double minorTi m_minorTickInterval = minorTickInterval; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogTrack::setMinAndMaxTicksOnly( bool enable ) +{ + m_minAndMaxTicksOnly = enable; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -1727,6 +1832,8 @@ void RimWellLogTrack::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering annotationGroup->add( &m_regionAnnotationType ); annotationGroup->add( &m_regionAnnotationDisplay ); annotationGroup->add( &m_showRegionLabels ); + if ( m_regionAnnotationType() == RiuPlotAnnotationTool::RegionAnnotationType::RESULT_PROPERTY_ANNOTATIONS ) + annotationGroup->add( &m_regionLabelFontSize ); if ( m_regionAnnotationDisplay() & RiuPlotAnnotationTool::COLOR_SHADING || m_regionAnnotationDisplay() & RiuPlotAnnotationTool::COLORED_LINES ) @@ -1796,6 +1903,8 @@ void RimWellLogTrack::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering componentGroup->add( &m_wellPathComponentSource ); + uiOrdering.add( &m_ensembleWellLogCurveSet ); + uiOrderingForXAxisSettings( uiOrdering ); uiOrdering.skipRemainingFields( true ); @@ -2131,12 +2240,13 @@ void RimWellLogTrack::uiOrderingForXAxisSettings( caf::PdmUiOrdering& uiOrdering gridGroup->add( &m_visibleXRangeMin ); gridGroup->add( &m_visibleXRangeMax ); gridGroup->add( &m_xAxisGridVisibility ); + gridGroup->add( &m_minAndMaxTicksOnly ); // TODO Revisit if these settings are required // See issue https://github.com/OPM/ResInsight/issues/4367 - // gridGroup->add(&m_explicitTickIntervals); - // gridGroup->add(&m_majorTickInterval); - // gridGroup->add(&m_minorTickInterval); + // gridGroup->add( &m_explicitTickIntervals ); + // gridGroup->add( &m_majorTickInterval ); + // gridGroup->add( &m_minorTickInterval ); } //-------------------------------------------------------------------------------------------------- @@ -2661,7 +2771,13 @@ void RimWellLogTrack::updateResultPropertyNamesOnPlot() RigResultAccessorFactory::createFromResultDefinition( eclipseCase->eclipseCaseData(), 0, m_timeStep, m_resultDefinition ); if ( !resultAccessor.notNull() ) { - RiaLogging::error( "Unable to get result accessor" ); + QString resultTypeStr = caf::AppEnum( m_resultDefinition->resultType() ).uiText(); + RiaLogging::error( + QString( "Unable to find result for region annotation for '%1' track. Tried '%2' (%3) on case: '%4'" ) + .arg( m_description() ) + .arg( m_resultDefinition->resultVariable() ) + .arg( resultTypeStr ) + .arg( eclipseCase->caseUserDescription() ) ); return; } @@ -2737,6 +2853,10 @@ void RimWellLogTrack::updateResultPropertyNamesOnPlot() } caf::ColorTable colorTable( colors ); + + int fontSize = caf::FontTools::absolutePointSize( RiaPreferences::current()->defaultPlotFontSize(), + m_regionLabelFontSize() ); + m_annotationTool->attachNamedRegions( m_plotWidget, namesToPlot, xRange, @@ -2744,7 +2864,10 @@ void RimWellLogTrack::updateResultPropertyNamesOnPlot() m_regionAnnotationDisplay(), colorTable, ( ( 100 - m_colorShadingTransparency ) * 255 ) / 100, - m_showRegionLabels() ); + m_showRegionLabels(), + RiuPlotAnnotationTool::TrackSpan::FULL_WIDTH, + {}, + fontSize ); } } @@ -3074,3 +3197,19 @@ void RimWellLogTrack::addUnderburden( std::vector& namesVector, CurveSa curveData.data.push_back( namesVector.size() - 1 ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogTrack::setCurvesTreeVisibility( bool isVisible ) +{ + m_curves.uiCapability()->setUiTreeChildrenHidden( !isVisible ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellLogTrack::setEnsembleWellLogCurveSet( RimEnsembleWellLogCurveSet* curveSet ) +{ + m_ensembleWellLogCurveSet = curveSet; +} diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogTrack.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h similarity index 96% rename from ApplicationLibCode/ProjectDataModel/RimWellLogTrack.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h index 4f70305ece..b3a9ce9159 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellLogTrack.h +++ b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogTrack.h @@ -57,6 +57,7 @@ class RigFemResultAddress; class RigWellLogExtractor; class RimEclipseResultDefinition; class RimColorLegend; +class RimEnsembleWellLogCurveSet; class QwtPlotCurve; @@ -161,6 +162,7 @@ class RimWellLogTrack : public RimPlot void updateEditors(); void setTickIntervals( double majorTickInterval, double minorTickInterval ); + void setMinAndMaxTicksOnly( bool enable ); void setXAxisGridVisibility( RimWellLogPlot::AxisGridVisibility gridLines ); void setAnnotationType( RiuPlotAnnotationTool::RegionAnnotationType annotationType ); @@ -230,6 +232,10 @@ class RimWellLogTrack : public RimPlot static void addOverburden( std::vector& namesVector, CurveSamplingPointData& curveData, double height ); static void addUnderburden( std::vector& namesVector, CurveSamplingPointData& curveData, double height ); + void setCurvesTreeVisibility( bool isVisible ); + + void setEnsembleWellLogCurveSet( RimEnsembleWellLogCurveSet* curveSet ); + protected: // RimViewWindow overrides void deleteViewWidget() override; @@ -298,6 +304,7 @@ class RimWellLogTrack : public RimPlot const RigGeoMechWellLogExtractor* extractor ) const; void connectCurveSignals( RimWellLogCurve* curve ); + bool isEmptyVisibleXRange() const; private: QString m_xAxisTitle; @@ -313,9 +320,11 @@ class RimWellLogTrack : public RimPlot caf::PdmField m_isAutoScaleXEnabled; caf::PdmField m_isLogarithmicScaleEnabled; caf::PdmField m_xAxisGridVisibility; - caf::PdmField m_explicitTickIntervals; - caf::PdmField m_majorTickInterval; - caf::PdmField m_minorTickInterval; + + caf::PdmField m_explicitTickIntervals; + caf::PdmField m_minAndMaxTicksOnly; + caf::PdmField m_majorTickInterval; + caf::PdmField m_minorTickInterval; caf::PdmField m_axisFontSize; @@ -324,6 +333,7 @@ class RimWellLogTrack : public RimPlot caf::PdmPtrField m_colorShadingLegend; caf::PdmField m_colorShadingTransparency; caf::PdmField m_showRegionLabels; + caf::PdmField m_regionLabelFontSize; caf::PdmField> m_formationSource; caf::PdmPtrField m_formationCase; caf::PdmField> m_formationTrajectoryType; @@ -345,6 +355,7 @@ class RimWellLogTrack : public RimPlot caf::PdmChildField m_resultDefinition; caf::PdmField m_overburdenHeight; caf::PdmField m_underburdenHeight; + caf::PdmChildField m_ensembleWellLogCurveSet; std::vector> m_wellPathAttributePlotObjects; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogWbsCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogWbsCurve.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogWbsCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogWbsCurve.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellLogWbsCurve.h b/ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogWbsCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellLogWbsCurve.h rename to ApplicationLibCode/ProjectDataModel/WellLog/RimWellLogWbsCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/WellMeasurement/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/WellMeasurement/CMakeLists_files.cmake new file mode 100644 index 0000000000..cc215728d6 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellMeasurement/CMakeLists_files.cmake @@ -0,0 +1,29 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurement.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilePath.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurement.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilePath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInViewCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellMeasurementInView.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "ProjectDataModel\\WellMeasurement" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurement.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurement.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurement.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurement.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurement.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurement.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurement.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurement.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCollection.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementCollection.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCollection.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementCollection.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCollection.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementCollection.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCollection.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementCurve.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementCurve.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementCurve.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementCurve.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementCurve.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilePath.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilePath.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilePath.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilePath.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilePath.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilePath.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilePath.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilePath.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilter.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilter.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilter.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilter.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilter.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilter.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementFilter.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementFilter.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInView.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInView.cpp similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementInView.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInView.cpp index 4b370cd7c1..b9dac31c47 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInView.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInView.cpp @@ -55,7 +55,7 @@ RimWellMeasurementInView::RimWellMeasurementInView() CAF_PDM_InitFieldNoDefault( &m_legendConfig, "LegendDefinition", "Color Legend", "", "", "" ); m_legendConfig = new RimRegularLegendConfig(); - m_legendConfig.uiCapability()->setUiHidden( true ); + m_legendConfig.uiCapability()->setUiTreeHidden( true ); CAF_PDM_InitFieldNoDefault( &m_wells, "Wells", "Wells", "", "", "" ); m_wells.uiCapability()->setAutoAddingOptionFromValue( false ); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInView.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInView.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementInView.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInView.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInViewCollection.cpp similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInViewCollection.cpp index 2979b9cf6c..de0fb11e97 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInViewCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInViewCollection.cpp @@ -46,7 +46,7 @@ RimWellMeasurementInViewCollection::RimWellMeasurementInViewCollection() CAF_PDM_InitObject( "Well Measurements", ":/WellMeasurement16x16.png", "", "" ); CAF_PDM_InitFieldNoDefault( &m_measurementsInView, "MeasurementKinds", "Measurement Kinds", "", "", "" ); - m_measurementsInView.uiCapability()->setUiHidden( true ); + m_measurementsInView.uiCapability()->setUiTreeHidden( true ); m_isChecked = false; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellMeasurementInViewCollection.h b/ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInViewCollection.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellMeasurementInViewCollection.h rename to ApplicationLibCode/ProjectDataModel/WellMeasurement/RimWellMeasurementInViewCollection.h diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModel/WellPath/CMakeLists_files.cmake new file mode 100644 index 0000000000..fd3d9472d2 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/CMakeLists_files.cmake @@ -0,0 +1,47 @@ +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGroup.h + ${CMAKE_CURRENT_LIST_DIR}/RimFileWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimModeledWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDef.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDefTools.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttribute.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttributeCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathTarget.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathTieIn.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellIASettings.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellIASettingsCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellIAModelBox.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellIAModelData.h + ${CMAKE_CURRENT_LIST_DIR}/RimWellIADataAccess.h +) + +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimFileWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimModeledWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttribute.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathAttributeCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDef.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGeometryDefTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathTarget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathTieIn.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellIASettings.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellIASettingsCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellIAModelBox.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellIAModelData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellIADataAccess.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "ProjectDataModel\\WellPath" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModel/RimFileWellPath.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimFileWellPath.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimFileWellPath.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimFileWellPath.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimFileWellPath.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimFileWellPath.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimFileWellPath.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimFileWellPath.h diff --git a/ApplicationLibCode/ProjectDataModel/RimModeledWellPath.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.cpp similarity index 87% rename from ApplicationLibCode/ProjectDataModel/RimModeledWellPath.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.cpp index e4124b4371..a86ad9dbed 100644 --- a/ApplicationLibCode/ProjectDataModel/RimModeledWellPath.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.cpp @@ -34,6 +34,7 @@ #include "RimWellPathTarget.h" #include "RimWellPathTieIn.h" +#include "RigWellPathGeometryTools.h" #include "cafPdmFieldScriptingCapability.h" #include "cafPdmUiDoubleValueEditor.h" #include "cafPdmUiTreeOrdering.h" @@ -87,7 +88,7 @@ void RimModeledWellPath::createWellPathGeometry() //-------------------------------------------------------------------------------------------------- void RimModeledWellPath::updateWellPathVisualization() { - this->setWellPathGeometry( m_geometryDefinition->createWellPathGeometry().p() ); + createWellPathGeometry(); std::vector refferingCurves; this->objectsWithReferringPtrFieldsOfType( refferingCurves ); @@ -265,23 +266,34 @@ void RimModeledWellPath::updateTieInLocationFromParentWell() parentWellPath = tieIn->parentWell(); auto targets = m_geometryDefinition->activeWellTargets(); - if ( parentWellPath && !targets.empty() ) + if ( parentWellPath && !targets.empty() && parentWellPath->wellPathGeometry() && + !parentWellPath->wellPathGeometry()->measuredDepths().empty() ) { auto [pointVector, measuredDepths] = parentWellPath->wellPathGeometry() ->clippedPointSubset( parentWellPath->wellPathGeometry()->measuredDepths().front(), tieIn->tieInMeasuredDepth() ); - if ( pointVector.size() > 2u ) + if ( pointVector.size() >= 2u ) { - auto firstTarget = targets.front(); - firstTarget->setPointXYZ( pointVector.back() ); - m_geometryDefinition->setIsAttachedToParentWell( true ); m_geometryDefinition->setMdAtFirstTarget( measuredDepths.back() ); m_geometryDefinition->setFixedWellPathPoints( pointVector ); m_geometryDefinition->setFixedMeasuredDepths( measuredDepths ); + updateReferencePoint(); + + auto lastPointXYZ = pointVector.back(); + + cvf::Vec3d referencePointXYZ = m_geometryDefinition->anchorPointXyz(); + cvf::Vec3d relativePointXYZ = lastPointXYZ - referencePointXYZ; + + auto firstTarget = targets.front(); + const auto [azimuth, inclination] = + RigWellPathGeometryTools::calculateAzimuthAndInclinationAtMd( tieIn->tieInMeasuredDepth(), + parentWellPath->wellPathGeometry() ); + firstTarget->setAsPointXYZAndTangentTarget( relativePointXYZ, azimuth, inclination ); + updateGeometry( true ); } } @@ -294,3 +306,20 @@ void RimModeledWellPath::updateTieInLocationFromParentWell() m_geometryDefinition->setFixedMeasuredDepths( {} ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimModeledWellPath::updateReferencePoint() +{ + if ( !m_geometryDefinition->useReferencePointFromTopLevelWell() ) return; + + RimWellPathTieIn* tieIn = wellPathTieIn(); + if ( !tieIn ) return; + + auto topLevelModelledWell = dynamic_cast( this->topLevelWellPath() ); + if ( !topLevelModelledWell ) return; + + auto refPoint = topLevelModelledWell->geometryDefinition()->anchorPointXyz(); + m_geometryDefinition->setReferencePointXyz( refPoint ); +} diff --git a/ApplicationLibCode/ProjectDataModel/RimModeledWellPath.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.h similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimModeledWellPath.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.h index 3f6f23c0e2..39ae1e880f 100644 --- a/ApplicationLibCode/ProjectDataModel/RimModeledWellPath.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimModeledWellPath.h @@ -40,6 +40,7 @@ class RimModeledWellPath : public RimWellPath RimWellPathGeometryDef* geometryDefinition() const; QString wellPlanText(); void updateTieInLocationFromParentWell(); + void updateReferencePoint(); private: void defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, QString uiConfigName ) override; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.cpp new file mode 100644 index 0000000000..7d48dbf649 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.cpp @@ -0,0 +1,130 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellIADataAccess.h" + +#include "RigFemClosestResultIndexCalculator.h" +#include "RigFemPartCollection.h" +#include "RigFemPartResultsCollection.h" +#include "RigGeoMechCaseData.h" +#include "RimGeoMechCase.h" + +#include "../cafHexInterpolator/cafHexInterpolator.h" // Use relative path, as this is a header only file not part of a library + +#include "cvfBoundingBox.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIADataAccess::RimWellIADataAccess( RimGeoMechCase* thecase ) + : m_case( thecase ) + , m_caseData( nullptr ) +{ + if ( m_case ) m_caseData = m_case->geoMechData(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIADataAccess::~RimWellIADataAccess() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimWellIADataAccess::resultIndex( RigFemResultPosEnum resultType, cvf::Vec3d position ) +{ + int closestCell = elementIndex( position ); + + if ( closestCell < 0 ) return -1; + + RigFemClosestResultIndexCalculator closestIndexCalc( m_caseData->femParts()->part( 0 ), resultType, closestCell, -1, position ); + + return closestIndexCalc.resultIndexToClosestResult(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimWellIADataAccess::elementIndex( cvf::Vec3d position ) +{ + cvf::BoundingBox bb; + bb.add( position ); + + std::vector closeCells; + m_caseData->femParts()->part( 0 )->findIntersectingCells( bb, &closeCells ); + if ( closeCells.size() == 0 ) return -1; + + return (int)closeCells[0]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIADataAccess::resultValue( QString fieldName, + QString componentName, + RigFemResultPosEnum resultType, + size_t resultIndex, + int timeStep ) +{ + RigFemResultAddress address( resultType, fieldName.toStdString(), componentName.toStdString() ); + + const std::vector& scalarResults = m_caseData->femPartResults()->resultValues( address, 0, timeStep ); + + if ( resultIndex < scalarResults.size() ) return scalarResults[resultIndex]; + + return 0.0; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIADataAccess::interpolatedResultValue( QString fieldName, + QString componentName, + RigFemResultPosEnum resultType, + cvf::Vec3d position, + int timeStep ) +{ + RigFemResultAddress address( resultType, fieldName.toStdString(), componentName.toStdString() ); + + int elmIdx = elementIndex( position ); + + RigFemPart* femPart = m_caseData->femParts()->part( 0 ); + RigElementType elmType = femPart->elementType( elmIdx ); + const int* elementConn = femPart->connectivities( elmIdx ); + int elmNodeCount = RigFemTypes::elementNodeCount( elmType ); + + const std::vector& scalarResults = m_caseData->femPartResults()->resultValues( address, 0, timeStep ); + + std::array nodeResults; + std::array nodeCorners; + + for ( int lNodeIdx = 0; lNodeIdx < elmNodeCount; ++lNodeIdx ) + { + int nodeIdx = elementConn[lNodeIdx]; + size_t resIdx = femPart->resultValueIdxFromResultPosType( resultType, elmIdx, lNodeIdx ); + if ( resIdx >= scalarResults.size() ) + nodeResults[lNodeIdx] = 0.0; + else + nodeResults[lNodeIdx] = scalarResults[resIdx]; + nodeCorners[lNodeIdx] = cvf::Vec3d( femPart->nodes().coordinates[nodeIdx] ); + } + + return caf::HexInterpolator::interpolateHex( nodeCorners, nodeResults, position ); +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.h new file mode 100644 index 0000000000..9b1c64f280 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIADataAccess.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RigFemResultPosEnum.h" + +#include "cvfVector3.h" + +#include + +#include + +class RimGeoMechCase; +class RigGeoMechCaseData; + +//================================================================================================== +/// +/// +//================================================================================================== +class RimWellIADataAccess +{ +public: + RimWellIADataAccess( RimGeoMechCase* thecase ); + ~RimWellIADataAccess(); + + int resultIndex( RigFemResultPosEnum resultType, cvf::Vec3d position ); + int elementIndex( cvf::Vec3d position ); + double resultValue( QString fieldName, + QString componentName, + RigFemResultPosEnum resultType, + size_t resultIndex, + int timeStep ); + double interpolatedResultValue( QString fieldname, + QString componentName, + RigFemResultPosEnum resultType, + cvf::Vec3d position, + int timeStep ); + +private: + RimGeoMechCase* m_case; + RigGeoMechCaseData* m_caseData; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.cpp new file mode 100644 index 0000000000..b22c61a403 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.cpp @@ -0,0 +1,109 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellIAModelBox.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIAModelBox::RimWellIAModelBox() +{ + m_vertices.resize( 8 ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIAModelBox::~RimWellIAModelBox() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIAModelBox::vertices() const +{ + return m_vertices; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RimWellIAModelBox::center() const +{ + return m_center; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIAModelBox::updateBox( cvf::Vec3d startPos, cvf::Vec3d endPos, double xyBuffer, double depthBuffer ) +{ + m_center = startPos + endPos; + m_center /= 2.0; + + cvf::Vec3d upwards = startPos - endPos; + upwards.normalize(); + cvf::Vec3d downwards = upwards * -1.0; + cvf::Vec3d xdir = upwards.perpendicularVector(); + xdir.normalize(); + cvf::Vec3d ydir = upwards ^ xdir; + ydir.normalize(); + + cvf::Vec3d topCenter = startPos + upwards * depthBuffer; + cvf::Vec3d bottomCenter = endPos + downwards * depthBuffer; + + std::vector topVertices = generateRectangle( topCenter, xdir, ydir, xyBuffer ); + std::vector bottomVertices = generateRectangle( bottomCenter, xdir, ydir, xyBuffer ); + + for ( size_t i = 0; i < 4; i++ ) + { + m_vertices[i] = bottomVertices[i]; + m_vertices[i + 4] = topVertices[i]; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector + RimWellIAModelBox::generateRectangle( cvf::Vec3d center, cvf::Vec3d unitX, cvf::Vec3d unitY, double buffer ) +{ + std::vector corners; + corners.resize( 4 ); + + corners[0] = center; + corners[0] -= unitX * buffer; + corners[0] -= unitY * buffer; + + corners[1] = center; + corners[1] += unitX * buffer; + corners[1] -= unitY * buffer; + + corners[2] = center; + corners[2] += unitX * buffer; + corners[2] += unitY * buffer; + + corners[3] = center; + corners[3] -= unitX * buffer; + corners[3] += unitY * buffer; + + return corners; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.h new file mode 100644 index 0000000000..70bba17d19 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelBox.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfVector3.h" + +#include +#include +#include + +//================================================================================================== +/// +/// +//================================================================================================== +class RimWellIAModelBox +{ +public: + RimWellIAModelBox(); + ~RimWellIAModelBox(); + + std::vector vertices() const; + cvf::Vec3d center() const; + + bool updateBox( cvf::Vec3d startPos, cvf::Vec3d endPos, double xyBuffer, double depthBuffer ); + +private: + std::vector generateRectangle( cvf::Vec3d center, cvf::Vec3d unitX, cvf::Vec3d unitY, double buffer ); + + std::vector m_vertices; + cvf::Vec3d m_center; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.cpp new file mode 100644 index 0000000000..7b4df7c8c9 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.cpp @@ -0,0 +1,120 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellIAModelData.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIAModelData::RimWellIAModelData() +{ + m_displacements.resize( 8 ); + m_casingPressure = 0.0; + m_formationPressure = 0.0; + m_temperature = 0.0; + m_dayoffset = 0; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIAModelData::~RimWellIAModelData() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIAModelData::displacements() const +{ + return m_displacements; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIAModelData::setDisplacement( int cornerIndex, cvf::Vec3d displacement ) +{ + size_t ci = cornerIndex; + + if ( ( cornerIndex >= 0 ) && ( ci < m_displacements.size() ) ) m_displacements[ci] = displacement; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIAModelData::setCasingPressure( double pressure ) +{ + m_casingPressure = pressure; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIAModelData::casingPressure() const +{ + return m_casingPressure; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIAModelData::setFormationPressure( double pressure ) +{ + m_formationPressure = pressure; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIAModelData::formationPressure() const +{ + return m_formationPressure; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIAModelData::setTemperature( double temp ) +{ + m_temperature = temp; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIAModelData::temperature() const +{ + return m_temperature; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +int RimWellIAModelData::dayOffset() const +{ + return m_dayoffset; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIAModelData::setDayOffset( int days ) +{ + m_dayoffset = days; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.h new file mode 100644 index 0000000000..c4bdf48736 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIAModelData.h @@ -0,0 +1,58 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cvfVector3.h" + +#include +#include +#include + +//================================================================================================== +/// +/// +//================================================================================================== +class RimWellIAModelData +{ +public: + RimWellIAModelData(); + ~RimWellIAModelData(); + + std::vector displacements() const; + void setDisplacement( int cornerIndex, cvf::Vec3d displacement ); + + void setCasingPressure( double pressure ); + double casingPressure() const; + + void setFormationPressure( double pressure ); + double formationPressure() const; + + void setTemperature( double temp ); + double temperature() const; + + int dayOffset() const; + void setDayOffset( int days ); + +private: + std::vector m_displacements; + double m_casingPressure; + double m_formationPressure; + double m_temperature; + int m_dayoffset; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.cpp new file mode 100644 index 0000000000..e49e76f486 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.cpp @@ -0,0 +1,678 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 - Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellIASettings.h" + +#include "RiaApplication.h" +#include "RiaPreferencesGeoMech.h" + +#include "RigWellPath.h" +#include "RigWellPathGeometryTools.h" + +#include "RimDoubleParameter.h" +#include "RimGenericParameter.h" +#include "RimGeoMechCase.h" +#include "RimIntegerParameter.h" +#include "RimParameterGroup.h" +#include "RimProject.h" +#include "RimStringParameter.h" +#include "RimTools.h" +#include "RimWellIADataAccess.h" +#include "RimWellIAModelData.h" +#include "RimWellPath.h" + +#include "RifParameterXmlReader.h" + +#include "cafPdmFieldCvfVec3d.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" +#include "cafPdmUiComboBoxEditor.h" +#include "cafPdmUiDateEditor.h" +#include "cafPdmUiDoubleSliderEditor.h" +#include "cafPdmUiFilePathEditor.h" +#include "cafPdmUiTableViewEditor.h" + +#include +#include + +#include + +CAF_PDM_SOURCE_INIT( RimWellIASettings, "RimWellIASettings" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettings::RimWellIASettings() +{ + CAF_PDM_InitObject( "Integrity Analysis Model Settings", ":/WellIntAnalysis.png", "", "" ); + + setName( "Model" ); + + CAF_PDM_InitFieldNoDefault( &m_geomechCase, "GeomechCase", "GeoMech Case", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_baseDir, "BaseDir", "Working Directory", "", "", "" ); + m_baseDir.uiCapability()->setUiReadOnly( true ); + + CAF_PDM_InitField( &m_startMD, "StartMeasuredDepth", 0.0, "Start MD", "", "", "" ); + CAF_PDM_InitField( &m_endMD, "EndMeasuredDepth", 0.0, "End MD", "", "", "" ); + m_startMD.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + m_endMD.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); + + CAF_PDM_InitField( &m_bufferXY, "BufferXY", 20.0, "Model Size (XY)", "", "", "" ); + CAF_PDM_InitField( &m_bufferZ, "BufferZ", 15.0, "Depth buffer size", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_parameters, "ModelingParameters", "Modeling Parameters", ":/Bullet.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_csvParameters, "TimeStepParameters", "Time Step Parameters", ":/Bullet.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_nameProxy, "NameProxy", "Name Proxy", "", "", "" ); + m_nameProxy.registerGetMethod( this, &RimWellIASettings::fullName ); + m_nameProxy.uiCapability()->setUiReadOnly( true ); + m_nameProxy.uiCapability()->setUiHidden( true ); + m_nameProxy.xmlCapability()->disableIO(); + + CAF_PDM_InitField( &m_showBox, "showBox", false, "Show model box", "", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_geostaticDate, "startDate", "Start Date (geostatic):", "", "", "" ); + + CAF_PDM_InitField( &m_boxValid, "boxValid", false, "Model box is valid", "", "", "" ); + m_boxValid.uiCapability()->setUiHidden( true ); + + this->setDeletable( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettings::~RimWellIASettings() +{ + resetResInsightParameters(); + resetModelData(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettings::initSettings( QString& outErrmsg ) +{ + initCsvParameters(); + + RifParameterXmlReader basicreader( RiaPreferencesGeoMech::current()->geomechWIADefaultXML() ); + if ( !basicreader.parseFile( outErrmsg ) ) return false; + + m_parameters.clear(); + for ( auto group : basicreader.parameterGroups() ) + { + m_parameters.push_back( group ); + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::updateVisualization() +{ + generateModelBox(); + RiaApplication::instance()->project()->scheduleCreateDisplayModelAndRedrawAllViews(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::fieldChangedByUi( const caf::PdmFieldHandle* changedField, + const QVariant& oldValue, + const QVariant& newValue ) +{ + if ( ( changedField == &m_startMD ) || ( changedField == &m_endMD ) || ( changedField == objectToggleField() ) || + ( changedField == &m_bufferXY ) || ( changedField == &m_bufferZ ) || ( changedField == &m_showBox ) ) + { + updateVisualization(); + } + + this->updateConnectedEditors(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QList RimWellIASettings::calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) +{ + QList options; + + if ( fieldNeedingOptions == &m_geomechCase ) + { + RimTools::geoMechCaseOptionItems( &options ); + } + + return options; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) +{ + RimWellPath* wellPath; + firstAncestorOrThisOfType( wellPath ); + if ( wellPath ) + { + if ( wellPath->unitSystem() == RiaDefines::EclipseUnitSystem::UNITS_METRIC ) + { + m_startMD.uiCapability()->setUiName( "Start MD [m]" ); + m_endMD.uiCapability()->setUiName( "End MD [m]" ); + } + else if ( wellPath->unitSystem() == RiaDefines::EclipseUnitSystem::UNITS_FIELD ) + { + m_startMD.uiCapability()->setUiName( "Start MD [ft]" ); + m_endMD.uiCapability()->setUiName( "End MD [ft]" ); + } + } + + auto generalGroup = uiOrdering.addNewGroup( "General" ); + generalGroup->add( nameField() ); + generalGroup->add( &m_baseDir ); + + auto geoGroup = uiOrdering.addNewGroup( "GeoMechanical Settings" ); + geoGroup->add( &m_geomechCase ); + geoGroup->add( &m_geostaticDate ); + + auto modelGroup = uiOrdering.addNewGroup( "Model Settings" ); + modelGroup->add( &m_startMD ); + modelGroup->add( &m_endMD ); + modelGroup->add( &m_bufferXY ); + modelGroup->add( &m_bufferZ ); + modelGroup->add( &m_showBox ); + + uiOrdering.skipRemainingFields( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_startMD || field == &m_endMD ) + { + caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast( attribute ); + + if ( myAttr ) + { + RimWellPath* wellPath = nullptr; + this->firstAncestorOrThisOfType( wellPath ); + if ( !wellPath ) return; + + myAttr->m_minimum = wellPath->uniqueStartMD(); + myAttr->m_maximum = wellPath->uniqueEndMD(); + } + } + else if ( field == &m_geostaticDate ) + { + caf::PdmUiDateEditorAttribute* myAttr = dynamic_cast( attribute ); + if ( myAttr ) + { + myAttr->dateFormat = "dd MMM yyyy"; + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// Return the name to show in the tree selector +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::fullName() const +{ + return QString( "%1 - [%2 - %3]" ).arg( name() ).arg( m_startMD ).arg( m_endMD ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettings::modelBoxValid() const +{ + return m_boxValid; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIASettings::modelBoxVertices() const +{ + return m_modelbox.vertices(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIASettings::modelData() const +{ + return m_modelData; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimWellIASettings::userDescriptionField() +{ + return &m_nameProxy; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::geomechCaseFilename() const +{ + if ( m_geomechCase ) return m_geomechCase->gridFileName(); + return ""; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::geomechCaseName() const +{ + QFileInfo fi( geomechCaseFilename() ); + return fi.baseName(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimGeoMechCase* RimWellIASettings::geomechCase() const +{ + return m_geomechCase; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QDateTime RimWellIASettings::geostaticDate() const +{ + return m_geostaticDate; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::outputBaseDirectory() const +{ + return m_baseDir(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::outputOdbFilename() const +{ + return m_baseDir() + "/" + name() + ".odb"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::outputHeatOdbFilename() const +{ + return m_baseDir() + "/" + name() + "_heat.odb"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::jsonInputFilename() const +{ + return m_baseDir() + "/model_input.json"; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RimWellIASettings::csvInputFilename() const +{ + return m_baseDir() + "/model_input.csv"; +} + +QStringList RimWellIASettings::commandParameters() const +{ + QStringList retlist; + + retlist << m_baseDir(); + retlist << jsonInputFilename(); + retlist << csvInputFilename(); + + return retlist; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::setGeoMechCase( RimGeoMechCase* geomechCase ) +{ + m_geomechCase = geomechCase; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::setOutputBaseDirectory( QString baseDir ) +{ + m_baseDir = baseDir; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::setShowBox( bool show ) +{ + m_showBox = show; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettings::showBox() const +{ + return m_showBox && m_boxValid; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::list RimWellIASettings::inputParameterGroups() const +{ + std::list retlist; + + for ( auto& group : m_parameters ) + retlist.push_back( group ); + + return retlist; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const std::list RimWellIASettings::resinsightParameterGroups() const +{ + std::list retlist; + + for ( auto& group : m_parametersRI ) + retlist.push_back( group ); + + return retlist; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::resetResInsightParameters() +{ + for ( auto& group : m_parametersRI ) + { + delete group; + } + m_parametersRI.clear(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettings::updateResInsightParameters() +{ + resetResInsightParameters(); + + RimParameterGroup* wellcoords = new RimParameterGroup(); + wellcoords->setName( "well_coordinates" ); + wellcoords->setLabel( "Well Coordinates" ); + wellcoords->addParameter( "x_well", m_modelbox.center().x() ); + wellcoords->addParameter( "y_well", m_modelbox.center().y() ); + wellcoords->addParameter( "z_well", m_modelbox.center().z() ); + m_parametersRI.push_back( wellcoords ); + + RimParameterGroup* initcond = new RimParameterGroup(); + initcond->setName( "BC_initial_conditions" ); + initcond->setLabel( "BC Initial Conditions" ); + initcond->addParameter( "analysis_depth", std::abs( m_modelbox.center().z() ) ); + + m_parametersRI.push_back( initcond ); + + RimParameterGroup* initialStress = new RimParameterGroup(); + initialStress->setName( "initial_stress" ); + initialStress->setLabel( "Initial Stress" ); + initialStress->setComment( + "SXX is in North direction, SYY is East, SZZ is vertical; PP is the initial pore pressure in the " + "formation, set to 0 for hydrostatic assumption; inclination is 0 for a vertical well" ); + + cvf::Vec3d position = m_modelbox.center(); + RimWellIADataAccess dataAccess( m_geomechCase ); + std::vector nativeKeys{ "S11", "S22", "S33", "S12", "S13", "S23" }; + std::vector paramKeys{ "SXX", "SYY", "SZZ", "SXY", "SXZ", "SYZ" }; + + for ( size_t i = 0; i < nativeKeys.size(); i++ ) + { + double stressValue = + dataAccess.interpolatedResultValue( "ST", nativeKeys[i], RigFemResultPosEnum::RIG_ELEMENT_NODAL, position, 0 ); + initialStress->addParameter( paramKeys[i], stressValue ); + if ( std::isfinite( stressValue ) ) + { + initialStress->addParameter( paramKeys[i], stressValue ); + } + else + { + return false; + } + } + + double ppValue = dataAccess.interpolatedResultValue( "POR-Bar", "", RigFemResultPosEnum::RIG_NODAL, position, 0 ); + if ( std::isfinite( ppValue ) ) + { + initialStress->addParameter( "PP", ppValue ); + } + else + { + initialStress->addParameter( "PP", 0.0 ); + } + + auto angles = RigWellPathGeometryTools::calculateAzimuthAndInclinationAtMd( ( m_startMD + m_endMD ) / 2.0, + wellPath()->wellPathGeometry() ); + initialStress->addParameter( "azimuth_well", angles.first ); + initialStress->addParameter( "inclination_well", angles.second ); + + m_parametersRI.push_back( initialStress ); + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::addCsvGroup( QString name, QStringList timeSteps, double defaultValue /* = 0.0 */ ) +{ + RimParameterGroup* group = new RimParameterGroup(); + group->setName( name ); + const int noParams = timeSteps.size(); + + for ( int i = 0; i < noParams; i++ ) + { + group->addParameter( timeSteps[i], defaultValue ); + } + m_csvParameters.push_back( group ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::initCsvParameters() +{ + m_csvParameters.clear(); + + QStringList timeSteps = m_geomechCase->timeStepStrings(); + + addCsvGroup( m_csvGroupNames[(size_t)CSV_GROUPNAME::CASING_PRESSURE], timeSteps ); + addCsvGroup( m_csvGroupNames[(size_t)CSV_GROUPNAME::FORMATION_PRESSURE], timeSteps ); + addCsvGroup( m_csvGroupNames[(size_t)CSV_GROUPNAME::TEMPERATURE], timeSteps, 70.0 ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::setDepthInterval( double startMD, double endMD ) +{ + m_startMD = startMD; + m_endMD = endMD; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIASettings::startMD() +{ + return m_startMD; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellIASettings::endMD() +{ + return m_endMD; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::resetModelData() +{ + for ( auto& modeldata : m_modelData ) + { + delete modeldata; + } + m_modelData.clear(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellPath* RimWellIASettings::wellPath() const +{ + RimWellPath* wellpath = nullptr; + this->firstAncestorOrThisOfTypeAsserted( wellpath ); + return wellpath; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettings::generateModelBox() +{ + RimWellPath* path = wellPath(); + if ( !path ) return; + + RigWellPath* wellgeom = path->wellPathGeometry(); + if ( !wellgeom ) return; + + cvf::Vec3d startPos = wellgeom->interpolatedPointAlongWellPath( m_startMD ); + cvf::Vec3d endPos = wellgeom->interpolatedPointAlongWellPath( m_endMD ); + + m_boxValid = m_modelbox.updateBox( startPos, endPos, m_bufferXY, m_bufferZ ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettings::extractModelData() +{ + generateModelBox(); + resetModelData(); + if ( !updateResInsightParameters() ) + { + return false; + } + + QDateTime startDate = geostaticDate(); + + int timestep = 0; + auto timeStepStrings = m_geomechCase->timeStepStrings(); + + for ( auto& date : timeStepDates() ) + { + RimWellIAModelData* data = new RimWellIAModelData(); + data->setDayOffset( startDate.daysTo( date ) ); + + for ( auto& group : m_csvParameters ) + { + if ( group->name() == m_csvGroupNames[(size_t)CSV_GROUPNAME::CASING_PRESSURE] ) + { + data->setCasingPressure( group->parameterValue( timeStepStrings[timestep] ).toDouble() ); + } + else if ( group->name() == m_csvGroupNames[(size_t)CSV_GROUPNAME::FORMATION_PRESSURE] ) + { + data->setFormationPressure( group->parameterValue( timeStepStrings[timestep] ).toDouble() ); + } + else if ( group->name() == m_csvGroupNames[(size_t)CSV_GROUPNAME::TEMPERATURE] ) + { + data->setTemperature( group->parameterValue( timeStepStrings[timestep] ).toDouble() ); + } + } + + const std::vector displacements = extractDisplacements( m_modelbox.vertices(), timestep ); + + for ( size_t i = 0; i < displacements.size(); i++ ) + { + data->setDisplacement( (int)i, displacements[i] ); + } + m_modelData.push_back( data ); + timestep++; + } + + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIASettings::timeStepDates() +{ + std::vector dates = m_geomechCase->timeStepDates(); + + if ( dates.size() < (size_t)m_geomechCase->timeStepStrings().size() ) + dates.insert( dates.begin(), m_geostaticDate ); + + return dates; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIASettings::extractDisplacements( std::vector corners, int timeStep ) +{ + RimWellIADataAccess dataAccess( m_geomechCase ); + + std::vector displacements; + + for ( auto& pos : corners ) + { + double u1 = dataAccess.interpolatedResultValue( "U", "U1", RigFemResultPosEnum::RIG_NODAL, pos, timeStep ); + double u2 = dataAccess.interpolatedResultValue( "U", "U2", RigFemResultPosEnum::RIG_NODAL, pos, timeStep ); + double u3 = dataAccess.interpolatedResultValue( "U", "U3", RigFemResultPosEnum::RIG_NODAL, pos, timeStep ); + + displacements.push_back( cvf::Vec3d( u1, u2, u3 ) ); + } + return displacements; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.h new file mode 100644 index 0000000000..4a6a3cbab2 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettings.h @@ -0,0 +1,147 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RimCheckableNamedObject.h" +#include "RimWellIAModelBox.h" + +#include "cafPdmChildArrayField.h" +#include "cafPdmField.h" +#include "cafPdmFieldCvfVec3d.h" +#include "cafPdmObject.h" +#include "cafPdmProxyValueField.h" +#include "cafPdmPtrField.h" + +#include "cvfVector3.h" + +#include +#include +#include + +#include +#include +#include + +class RimGeoMechCase; +class RimParameterGroup; +class RimGenericParameter; +class RimWellPath; +class RimWellIAModelData; + +class RimWellIASettings : public RimCheckableNamedObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimWellIASettings(); + ~RimWellIASettings() override; + + bool initSettings( QString& outErrmsg ); + + void setGeoMechCase( RimGeoMechCase* geomechCase ); + RimGeoMechCase* geomechCase() const; + QString geomechCaseFilename() const; + QString geomechCaseName() const; + + QDateTime geostaticDate() const; + + void setOutputBaseDirectory( QString baseDir ); + QString outputBaseDirectory() const; + QString outputOdbFilename() const; + QString outputHeatOdbFilename() const; + + bool showBox() const; + void setShowBox( bool show ); + + const std::list inputParameterGroups() const; + const std::list resinsightParameterGroups() const; + + void setDepthInterval( double startMD, double endMD ); + double startMD(); + double endMD(); + + QString jsonInputFilename() const; + QString csvInputFilename() const; + + QStringList commandParameters() const; + + RimWellPath* wellPath() const; + + bool modelBoxValid() const; + std::vector modelBoxVertices() const; + std::vector modelData() const; + + bool extractModelData(); + void updateVisualization(); + +protected: + QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, + bool* useOptionsOnly ) override; + + void fieldChangedByUi( const caf::PdmFieldHandle* changedField, const QVariant& oldValue, const QVariant& newValue ) override; + void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + + caf::PdmFieldHandle* userDescriptionField() override; + + QString fullName() const; + +private: + std::vector timeStepDates(); + + void initCsvParameters(); + bool updateResInsightParameters(); + void generateModelBox(); + void resetModelData(); + void resetResInsightParameters(); + + void addCsvGroup( QString name, QStringList timeSteps, double defaultValue = 0.0 ); + + std::vector extractDisplacements( std::vector corners, int timeStep ); + +private: + caf::PdmProxyValueField m_nameProxy; + + caf::PdmPtrField m_geomechCase; + caf::PdmField m_baseDir; + + caf::PdmField m_showBox; + caf::PdmField m_boxValid; + caf::PdmField m_startMD; + caf::PdmField m_endMD; + caf::PdmField m_bufferXY; + caf::PdmField m_bufferZ; + caf::PdmField m_geostaticDate; + + caf::PdmChildArrayField m_parameters; + std::vector m_parametersRI; + caf::PdmChildArrayField m_csvParameters; + + RimWellIAModelBox m_modelbox; + std::vector m_modelData; + + enum class CSV_GROUPNAME + { + FORMATION_PRESSURE = 0, + CASING_PRESSURE = 1, + TEMPERATURE = 2 + }; + const std::vector m_csvGroupNames{ "Formation Pressure", "Casing Pressure", "Temperature" }; +}; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.cpp new file mode 100644 index 0000000000..fa8042fbf7 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.cpp @@ -0,0 +1,121 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellIASettingsCollection.h" + +#include "RiaApplication.h" +#include "RiaLogging.h" + +#include "RimGeoMechCase.h" +#include "RimProject.h" +#include "RimWellIASettings.h" +#include "RimWellPath.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +#include "QFile" + +CAF_PDM_SOURCE_INIT( RimWellIASettingsCollection, "RimWellIASettingsCollection" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettingsCollection::RimWellIASettingsCollection() +{ + CAF_PDM_InitObject( "Integrity Analysis Models", ":/WellIntAnalysis.png", "", "" ); + + CAF_PDM_InitFieldNoDefault( &m_wellIASettings, "WellIASettings", "Settings", "", "", "" ); + m_wellIASettings.uiCapability()->setUiHidden( true ); + m_wellIASettings.uiCapability()->setUiTreeHidden( true ); + + setDeletable( true ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettingsCollection::~RimWellIASettingsCollection() +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettings* RimWellIASettingsCollection::startWellIntegrationAnalysis( QString baseDir, + RimWellPath* wellPath, + double measuredDepth, + RimGeoMechCase* theCase, + QString& outErrmsg ) +{ + RimWellIASettings* modelSettings = new RimWellIASettings(); + modelSettings->setGeoMechCase( theCase ); + + double depthSize = 50; + if ( theCase ) depthSize = theCase->characteristicCellSize(); + modelSettings->setDepthInterval( measuredDepth, measuredDepth + depthSize ); + modelSettings->setOutputBaseDirectory( baseDir ); + + QString errmsg; + if ( !modelSettings->initSettings( errmsg ) ) + { + delete modelSettings; + outErrmsg = "Unable to load default parameters from the WIA default parameter XML file:\n" + errmsg; + return nullptr; + } + + m_wellIASettings.push_back( modelSettings ); + + return modelSettings; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellIASettingsCollection::settings() const +{ + return m_wellIASettings.childObjects(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettingsCollection::isEnabled() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellIASettingsCollection::hasSettings() const +{ + return m_wellIASettings.size() > 0; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellIASettingsCollection::onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) +{ + RimWellPath* wellPath; + this->firstAncestorOrThisOfType( wellPath ); + if ( wellPath ) wellPath->updateConnectedEditors(); + RiaApplication::instance()->project()->scheduleCreateDisplayModelAndRedrawAllViews(); +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.h new file mode 100644 index 0000000000..7d6bc735cb --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellIASettingsCollection.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "cafPdmField.h" + +#include "cafPdmChildArrayField.h" +#include "cafPdmObject.h" + +#include + +class RimWellIASettings; +class RimWellPath; +class RimGeoMechCase; + +class RimWellIASettingsCollection : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimWellIASettingsCollection(); + ~RimWellIASettingsCollection() override; + + std::vector settings() const; + + bool isEnabled() const; + bool hasSettings() const; + + RimWellIASettings* startWellIntegrationAnalysis( QString baseDir, + RimWellPath* wellPath, + double measuredDepth, + RimGeoMechCase* theCase, + QString& outErrmsg ); + + void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, + std::vector& referringObjects ) override; + +private: + caf::PdmChildArrayField m_wellIASettings; +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPath.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.cpp similarity index 95% rename from ApplicationLibCode/ProjectDataModel/RimWellPath.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.cpp index 5d9bf44f40..c84d6c8ee0 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPath.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.cpp @@ -42,6 +42,7 @@ #include "RimProject.h" #include "RimStimPlanModelCollection.h" #include "RimTools.h" +#include "RimWellIASettingsCollection.h" #include "RimWellLogFile.h" #include "RimWellLogFileChannel.h" #include "RimWellLogPlotCollection.h" @@ -138,6 +139,9 @@ RimWellPath::RimWellPath() m_wellPathTieIn = new RimWellPathTieIn; m_wellPathTieIn->connectWellPaths( nullptr, this, 0.0 ); + CAF_PDM_InitFieldNoDefault( &m_wellIASettingsCollection, "WellIASettings", "Integrity Analysis Settings", "", "", "" ); + m_wellIASettingsCollection = new RimWellIASettingsCollection(); + this->setDeletable( true ); } @@ -239,6 +243,14 @@ cvf::Color3f RimWellPath::defaultComponentColor() const return RiaColorTables::wellPathComponentColors()[componentType()]; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPath::applyOffset( double offsetMD ) +{ + // Nothing to do here, as the offset is intended for well path completions +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -604,6 +616,14 @@ const RimWellPathAttributeCollection* RimWellPath::attributeCollection() const return m_wellPathAttributes; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellIASettingsCollection* RimWellPath::wellIASettingsCollection() +{ + return m_wellIASettingsCollection; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -708,6 +728,11 @@ void RimWellPath::defineUiTreeOrdering( caf::PdmUiTreeOrdering& uiTreeOrdering, { uiTreeOrdering.add( &m_wellLogFiles ); + if ( m_wellIASettingsCollection()->isEnabled() && m_wellIASettingsCollection()->hasSettings() ) + { + uiTreeOrdering.add( m_wellIASettingsCollection() ); + } + if ( m_completionSettings() && !allCompletionsRecursively().empty() ) { uiTreeOrdering.add( m_completionSettings() ); @@ -1162,6 +1187,31 @@ std::vector RimWellPath::allWellPathLaterals() const return laterals; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellPath::wellPathLaterals() const +{ + std::vector laterals; + + std::vector referringObjects; + this->objectsWithReferringPtrFields( referringObjects ); + for ( auto obj : referringObjects ) + { + if ( auto tieIn = dynamic_cast( obj ) ) + { + auto tieInWellPath = tieIn->childWell(); + if ( tieInWellPath == this ) continue; + if ( tieInWellPath ) + { + laterals.push_back( tieInWellPath ); + } + } + } + + return laterals; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPath.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.h similarity index 96% rename from ApplicationLibCode/ProjectDataModel/RimWellPath.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.h index ebec75ccc7..0cd051badd 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPath.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPath.h @@ -59,6 +59,7 @@ class Rim3dWellLogCurve; class Rim3dWellLogCurveCollection; class RimWellPathTieIn; class RimMswCompletionParameters; +class RimWellIASettingsCollection; //================================================================================================== /// @@ -136,6 +137,7 @@ class RimWellPath : public caf::PdmObject, public RimWellPathComponentInterface const RimStimPlanModelCollection* stimPlanModelCollection() const; RimWellPathAttributeCollection* attributeCollection(); const RimWellPathAttributeCollection* attributeCollection() const; + RimWellIASettingsCollection* wellIASettingsCollection(); bool showWellPathLabel() const; bool showWellPath() const; @@ -153,6 +155,7 @@ class RimWellPath : public caf::PdmObject, public RimWellPathComponentInterface QString componentLabel() const override; QString componentTypeLabel() const override; cvf::Color3f defaultComponentColor() const override; + void applyOffset( double offsetMD ) override; void onChildDeleted( caf::PdmChildArrayFieldHandle* childArray, std::vector& referringObjects ) override; @@ -162,6 +165,7 @@ class RimWellPath : public caf::PdmObject, public RimWellPathComponentInterface RimWellPath* topLevelWellPath(); const RimWellPath* topLevelWellPath() const; std::vector allWellPathLaterals() const; + std::vector wellPathLaterals() const; RimWellPathTieIn* wellPathTieIn() const; void connectWellPaths( RimWellPath* childWell, double tieInMeasuredDepth ); @@ -208,6 +212,7 @@ class RimWellPath : public caf::PdmObject, public RimWellPathComponentInterface caf::PdmChildField m_completionSettings; caf::PdmChildField m_completions; caf::PdmChildField m_wellPathAttributes; + caf::PdmChildField m_wellIASettingsCollection; caf::PdmChildField m_wellPathTieIn; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.cpp similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.cpp index f53db8a111..90bb5711d5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.cpp @@ -153,6 +153,15 @@ double RimWellPathAttribute::endMD() const return m_endMD(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathAttribute::applyOffset( double offsetMD ) +{ + m_startMD = m_startMD + offsetMD; + m_endMD = m_endMD + offsetMD; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.h similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.h index 0e7049bece..31128a6bb5 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathAttribute.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttribute.h @@ -54,6 +54,7 @@ class RimWellPathAttribute : public caf::PdmObject, public RimWellPathComponentI cvf::Color3f defaultComponentColor() const override; double startMD() const override; double endMD() const override; + void applyOffset( double offsetMD ) override; private: static std::set supportedDiameters( RiaDefines::WellPathComponentType type ); diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathAttributeCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttributeCollection.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellPathAttributeCollection.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttributeCollection.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathAttributeCollection.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttributeCollection.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellPathAttributeCollection.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathAttributeCollection.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathCollection.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp similarity index 97% rename from ApplicationLibCode/ProjectDataModel/RimWellPathCollection.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp index f31df93ae2..aa2b59d153 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathCollection.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.cpp @@ -60,6 +60,7 @@ #include "cafPdmUiTreeOrdering.h" #include "cafProgressInfo.h" +#include #include #include #include @@ -117,7 +118,6 @@ RimWellPathCollection::RimWellPathCollection() CAF_PDM_InitField( &wellPathClipZDistance, "WellPathClipZDistance", 100, "Well Path Clipping Depth Distance", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_wellPaths, "WellPaths", "Well Paths", "", "", "" ); - m_wellPaths.uiCapability()->setUiHidden( true ); m_wellPaths.uiCapability()->setUiTreeHidden( true ); m_wellPaths.uiCapability()->setUiTreeChildrenHidden( true ); @@ -582,6 +582,15 @@ void RimWellPathCollection::deleteAllWellPaths() updateAllRequiredEditors(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathCollection::deleteWell( RimWellPath* wellPath ) +{ + m_wellPaths.removeChildObject( wellPath ); + delete wellPath; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -729,7 +738,13 @@ void RimWellPathCollection::removeWellPath( gsl::not_null wellPath bool lessWellPath( const caf::PdmPointer& w1, const caf::PdmPointer& w2 ) { if ( w1.notNull() && w2.notNull() ) - return ( w1->name() < w2->name() ); + { + // Use QCollator to sort integer values in addition to text + + QCollator collator; + collator.setNumericMode( true ); + return collator.compare( w1->name(), w2->name() ) < 0; + } else if ( w1.notNull() ) return true; else @@ -899,12 +914,16 @@ std::map> QString rootWellName = wellPath->name().left( indexOfLateralStart ); rootWells[rootWellName].push_back( wellPath ); + continue; } } - else - { - rootWells[RimWellPathCollection::unGroupedText()].push_back( wellPath ); - } + + rootWells[RimWellPathCollection::unGroupedText()].push_back( wellPath ); + } + + for ( auto [groupName, wellPaths] : rootWells ) + { + std::sort( wellPaths.begin(), wellPaths.end(), lessWellPath ); } return rootWells; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathCollection.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.h similarity index 99% rename from ApplicationLibCode/ProjectDataModel/RimWellPathCollection.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.h index 2f22495b2d..6e4a429594 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathCollection.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathCollection.h @@ -98,10 +98,13 @@ class RimWellPathCollection : public caf::PdmObject void removeWellPath( gsl::not_null wellPath ); void deleteAllWellPaths(); + void deleteWell( RimWellPath* wellPath ); void groupWellPaths( const std::vector& wellPaths ); void rebuildWellPathNodes(); + std::vector connectedWellPathLaterals( const RimWellPath* parentWellPath ) const; + RimWellPath* mostRecentlyUpdatedWellPath(); void readWellPathFormationFiles(); @@ -146,7 +149,6 @@ class RimWellPathCollection : public caf::PdmObject cafTreeNode* addWellToWellNode( cafTreeNode* parent, RimWellPath* wellPath ); std::vector wellPathsWithNoParent( const std::vector& sourceWellPaths ) const; - std::vector connectedWellPathLaterals( const RimWellPath* parentWellPath ) const; std::map> wellPathsForWellNameStem( const std::vector& sourceWellPaths ) const; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp similarity index 84% rename from ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp index 4abd9ccc9e..1ea4923911 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.cpp @@ -32,6 +32,7 @@ #include "RimModeledWellPath.h" #include "RimProject.h" +#include "RimWellPathGeometryDefTools.h" #include "RimWellPathTarget.h" #include "RiuViewerCommands.h" @@ -84,6 +85,15 @@ RimWellPathGeometryDef::RimWellPathGeometryDef() m_wellTargets.uiCapability()->setUiLabelPosition( caf::PdmUiItemInfo::TOP ); m_wellTargets.uiCapability()->setCustomContextMenuEnabled( true ); + CAF_PDM_InitField( &m_showAbsolutePosForWellTargets, "ShowAbsolutePosForWellTargets", false, "Show UTM Coords", "", "", "" ); + CAF_PDM_InitField( &m_useTopLevelWellReferencePoint, + "UseTopLevelWellReferencePoint", + false, + "Use Top Level Well Reference Point", + "", + "", + "" ); + CAF_PDM_InitScriptableField( &m_useAutoGeneratedTargetAtSeaLevel, "UseAutoGeneratedTargetAtSeaLevel", true, @@ -92,6 +102,14 @@ RimWellPathGeometryDef::RimWellPathGeometryDef() "", "" ); + CAF_PDM_InitScriptableField( &m_linkReferencePointUpdates, + "LinkReferencePointUpdates", + false, + "Link Reference Point", + "", + "", + "" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_autoTargetAtSeaLevel, "AutoGeneratedTarget", "Auto Generated Target", "", "", "" ); m_autoTargetAtSeaLevel = new RimWellPathTarget; m_autoTargetAtSeaLevel->setEnabled( false ); @@ -103,7 +121,7 @@ RimWellPathGeometryDef::RimWellPathGeometryDef() CAF_PDM_InitField( &m_pickPointsEnabled, "m_pickPointsEnabled", false, "", "", "", "" ); caf::PdmUiPushButtonEditor::configureEditorForField( &m_pickPointsEnabled ); - CAF_PDM_InitScriptableField( &m_showSpheres, "ShowSpheres", false, "Spheres", "", "", "" ); + CAF_PDM_InitScriptableField( &m_showSpheres, "ShowSpheres", true, "Spheres", "", "", "" ); CAF_PDM_InitField( &m_sphereColor, "SphereColor", cvf::Color3f( cvf::Color3f::CEETRON ), "Sphere Color", "", "", "" ); CAF_PDM_InitField( &m_sphereRadiusFactor, "SphereRadiusFactor", 0.15, "Sphere Radius Factor", "", "", "" ); } @@ -125,6 +143,14 @@ cvf::Vec3d RimWellPathGeometryDef::anchorPointXyz() const return xyz; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RimWellPathGeometryDef::anchorPointXyd() const +{ + return m_referencePointUtmXyd(); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -135,6 +161,38 @@ void RimWellPathGeometryDef::setReferencePointXyz( const cvf::Vec3d& refPointXyz m_referencePointUtmXyd = xyd; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellPathGeometryDef::useReferencePointFromTopLevelWell() const +{ + return m_useTopLevelWellReferencePoint; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathGeometryDef::enableReferencePointFromTopLevelWell( bool enable ) +{ + m_useTopLevelWellReferencePoint = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathGeometryDef::enableLinkOfReferencePointUpdates( bool enable ) +{ + m_linkReferencePointUpdates = enable; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellPathGeometryDef::isReferencePointUpdatesLinked() const +{ + return m_linkReferencePointUpdates; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -231,7 +289,17 @@ cvf::ref RimWellPathGeometryDef::createWellPathGeometry() RiaPolyArcLineSampler arcLineSampler( wellPathCalculator.startTangent(), wellPathCalculator.lineArcEndpoints() ); auto [sampledWellPathPoints, sampledMeasuredDepths] = arcLineSampler.sampledPointsAndMDs( 30, false ); wellPathPoints.insert( wellPathPoints.end(), sampledWellPathPoints.begin(), sampledWellPathPoints.end() ); - double startMD = measuredDepths.empty() ? 0.0 : measuredDepths.back(); + + double startMD = 0.0; + if ( !measuredDepths.empty() ) + { + startMD = measuredDepths.back(); + } + else if ( !m_useAutoGeneratedTargetAtSeaLevel ) + { + startMD = m_mdAtFirstTarget; + } + for ( auto md : sampledMeasuredDepths ) { measuredDepths.push_back( md + startMD ); @@ -284,6 +352,14 @@ double RimWellPathGeometryDef::sphereRadiusFactor() const return m_sphereRadiusFactor(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimWellPathGeometryDef::showAbsoluteCoordinates() const +{ + return m_showAbsolutePosForWellTargets; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -437,6 +513,43 @@ void RimWellPathGeometryDef::fieldChangedByUi( const caf::PdmFieldHandle* change { this->updateConnectedEditors(); } + else if ( changedField == &m_referencePointUtmXyd ) + { + if ( isReferencePointUpdatesLinked() ) + { + auto linkedDefs = RimWellPathGeometryDefTools::linkedDefinitions(); + + // Remove this to avoid duplicate updates + linkedDefs.erase( std::remove_if( linkedDefs.begin(), + linkedDefs.end(), + [this]( auto const& geoDef ) { return geoDef == this; } ), + linkedDefs.end() ); + + cvf::Vec3d oldPos; + caf::PdmValueFieldSpecialization::setFromVariant( oldValue, oldPos ); + + auto delta = m_referencePointUtmXyd() - oldPos; + + RimWellPathGeometryDefTools::updateLinkedGeometryDefinitions( linkedDefs, delta ); + } + } + else if ( changedField == &m_useAutoGeneratedTargetAtSeaLevel && !m_useAutoGeneratedTargetAtSeaLevel ) + { + auto firstTarget = firstActiveTarget(); + if ( firstTarget != nullptr ) + { + auto firstLocationXYZ = firstTarget->targetPointXYZ() + anchorPointXyz(); + + // Temporarily enable target at sea level to be able to create a complete geometry to find MD of first + // target of the complete geometry + m_useAutoGeneratedTargetAtSeaLevel = true; + auto wellPathGeo = createWellPathGeometry(); + m_useAutoGeneratedTargetAtSeaLevel = false; + + double mdAtFirstTarget = wellPathGeo->closestMeasuredDepth( firstLocationXYZ ); + m_mdAtFirstTarget = mdAtFirstTarget; + } + } changed.send( false ); } @@ -446,19 +559,27 @@ void RimWellPathGeometryDef::fieldChangedByUi( const caf::PdmFieldHandle* change //-------------------------------------------------------------------------------------------------- void RimWellPathGeometryDef::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { + uiOrdering.add( &m_referencePointUtmXyd ); + m_referencePointUtmXyd.uiCapability()->setUiReadOnly( m_useTopLevelWellReferencePoint ); + if ( !m_isAttachedToParentWell ) { - uiOrdering.add( &m_referencePointUtmXyd ); + uiOrdering.add( &m_linkReferencePointUpdates ); uiOrdering.add( &m_airGap ); uiOrdering.add( &m_mdAtFirstTarget ); uiOrdering.add( &m_useAutoGeneratedTargetAtSeaLevel ); } + else + { + uiOrdering.add( &m_useTopLevelWellReferencePoint ); + } auto group = uiOrdering.addNewGroup( "Well Target Appearance" ); group->add( &m_showSpheres ); group->add( &m_sphereColor ); group->add( &m_sphereRadiusFactor ); + uiOrdering.add( &m_showAbsolutePosForWellTargets ); uiOrdering.add( &m_wellTargets ); uiOrdering.add( &m_pickPointsEnabled ); @@ -665,6 +786,14 @@ void RimWellPathGeometryDef::defineObjectEditorAttribute( QString uiConfigName, } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmFieldHandle* RimWellPathGeometryDef::objectToggleField() +{ + return &m_showSpheres; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h similarity index 82% rename from ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h index 6cdb415696..50b2a66802 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathGeometryDef.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDef.h @@ -50,7 +50,12 @@ class RimWellPathGeometryDef : public caf::PdmObject ~RimWellPathGeometryDef() override; cvf::Vec3d anchorPointXyz() const; + cvf::Vec3d anchorPointXyd() const; void setReferencePointXyz( const cvf::Vec3d& refPointXyz ); + bool useReferencePointFromTopLevelWell() const; + void enableReferencePointFromTopLevelWell( bool enable ); + void enableLinkOfReferencePointUpdates( bool enable ); + bool isReferencePointUpdatesLinked() const; double airGap() const; void setAirGap( double airGap ); @@ -87,6 +92,7 @@ class RimWellPathGeometryDef : public caf::PdmObject bool showSpheres() const; cvf::Color3f sphereColor() const; double sphereRadiusFactor() const; + bool showAbsoluteCoordinates() const; protected: void defineCustomContextMenu( const caf::PdmFieldHandle* fieldNeedingMenu, QMenu* menu, QWidget* fieldEditorWidget ) override; @@ -96,6 +102,7 @@ class RimWellPathGeometryDef : public caf::PdmObject caf::PdmUiEditorAttribute* attribute ) override; void defineObjectEditorAttribute( QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + caf::PdmFieldHandle* objectToggleField() override; void onTargetMoved( const caf::SignalEmitter* emitter, bool fullUpdate ); @@ -116,13 +123,18 @@ class RimWellPathGeometryDef : public caf::PdmObject caf::PdmField m_airGap; - caf::PdmField m_mdAtFirstTarget; + caf::PdmField m_mdAtFirstTarget; + caf::PdmChildArrayField m_wellTargets; - caf::PdmField m_useAutoGeneratedTargetAtSeaLevel; - caf::PdmChildField m_autoTargetAtSeaLevel; - caf::PdmField m_pickPointsEnabled; - caf::PdmField> m_fixedWellPathPoints; - caf::PdmField> m_fixedMeasuredDepths; + caf::PdmField m_showAbsolutePosForWellTargets; + caf::PdmField m_useTopLevelWellReferencePoint; + caf::PdmField m_linkReferencePointUpdates; + + caf::PdmField m_useAutoGeneratedTargetAtSeaLevel; + caf::PdmChildField m_autoTargetAtSeaLevel; + caf::PdmField m_pickPointsEnabled; + caf::PdmField> m_fixedWellPathPoints; + caf::PdmField> m_fixedMeasuredDepths; caf::PdmField m_isAttachedToParentWell; diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.cpp new file mode 100644 index 0000000000..bd90ad7828 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.cpp @@ -0,0 +1,68 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimWellPathGeometryDefTools.h" + +#include "RimModeledWellPath.h" +#include "RimTools.h" +#include "RimWellPathCollection.h" +#include "RimWellPathGeometryDef.h" +#include "RimWellPathTarget.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathGeometryDefTools::updateLinkedGeometryDefinitions( std::vector& definitions, + const cvf::Vec3d& delta ) +{ + for ( auto wellPathGeoDef : definitions ) + { + auto currentRefPointXyz = wellPathGeoDef->anchorPointXyz(); + auto newRefPointXyz = currentRefPointXyz - delta; + + wellPathGeoDef->setReferencePointXyz( newRefPointXyz ); + + wellPathGeoDef->changed.send( false ); + wellPathGeoDef->updateWellPathVisualization( true ); + for ( auto wt : wellPathGeoDef->activeWellTargets() ) + { + wt->updateConnectedEditors(); + } + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellPathGeometryDefTools::linkedDefinitions() +{ + std::vector linkedWellPathGeoDefs; + + for ( auto w : RimTools::wellPathCollection()->allWellPaths() ) + { + auto modeledWellPath = dynamic_cast( w ); + if ( !modeledWellPath ) continue; + + if ( modeledWellPath->geometryDefinition()->isReferencePointUpdatesLinked() ) + { + linkedWellPathGeoDefs.push_back( modeledWellPath->geometryDefinition() ); + } + } + + return linkedWellPathGeoDefs; +} diff --git a/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.h new file mode 100644 index 0000000000..68e5cf1802 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGeometryDefTools.h @@ -0,0 +1,33 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "cvfVector3.h" + +#include + +class RimWellPathGeometryDef; + +class RimWellPathGeometryDefTools +{ +public: + static void updateLinkedGeometryDefinitions( std::vector& definitions, + const cvf::Vec3d& delta ); + + static std::vector linkedDefinitions(); +}; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathGroup.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGroup.cpp similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellPathGroup.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGroup.cpp diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathGroup.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGroup.h similarity index 100% rename from ApplicationLibCode/ProjectDataModel/RimWellPathGroup.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathGroup.h diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathTarget.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.cpp similarity index 70% rename from ApplicationLibCode/ProjectDataModel/RimWellPathTarget.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.cpp index 97dfb1c189..9087b479a4 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathTarget.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.cpp @@ -41,9 +41,9 @@ namespace caf template <> void caf::AppEnum::setUp() { - addItem( RimWellPathTarget::POINT_AND_TANGENT, "POINT_AND_TANGENT", "Point and Tangent" ); - addItem( RimWellPathTarget::POINT, "POINT", "Point" ); - setDefault( RimWellPathTarget::POINT_AND_TANGENT ); + addItem( RimWellPathTarget::TargetTypeEnum::POINT_AND_TANGENT, "POINT_AND_TANGENT", "Point and Tangent" ); + addItem( RimWellPathTarget::TargetTypeEnum::POINT, "POINT", "Point" ); + setDefault( RimWellPathTarget::TargetTypeEnum::POINT ); } } // namespace caf //-------------------------------------------------------------------------------------------------- @@ -51,8 +51,8 @@ void caf::AppEnum::setUp() //-------------------------------------------------------------------------------------------------- RimWellPathTarget::RimWellPathTarget() : moved( this ) - , m_targetType( POINT_AND_TANGENT ) - , m_targetPoint( cvf::Vec3d::ZERO ) + , m_targetType( TargetTypeEnum::POINT ) + , m_targetPointXYD( cvf::Vec3d::ZERO ) , m_azimuth( 0.0 ) , m_inclination( 0.0 ) , m_isFullUpdateEnabled( true ) @@ -67,20 +67,25 @@ RimWellPathTarget::RimWellPathTarget() CAF_PDM_InitField( &m_isEnabled, "IsEnabled", true, "", "", "", "" ); CAF_PDM_InitField( &m_isLocked, "IsLocked", false, "", "", "", "" ); m_isLocked.uiCapability()->setUiHidden( true ); - // m_targetType.uiCapability()->setUiHidden(true); - CAF_PDM_InitScriptableFieldNoDefault( &m_targetPoint, "TargetPoint", "Point", "", "", "" ); + + CAF_PDM_InitScriptableFieldNoDefault( &m_targetPointXYD, "TargetPoint", "Relative Coord", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_targetPointForDisplay, "TargetPointForDisplay", "UTM Coord", "", "", "" ); + m_targetPointForDisplay.registerGetMethod( this, &RimWellPathTarget::targetPointForDisplayXYD ); + m_targetPointForDisplay.registerSetMethod( this, &RimWellPathTarget::setTargetPointFromDisplayCoord ); + + CAF_PDM_InitScriptableFieldNoDefault( &m_targetMeasuredDepth, "TargetMeasuredDepth", "MD", "", "", "" ); + m_targetMeasuredDepth.registerGetMethod( this, &RimWellPathTarget::measuredDepth ); + CAF_PDM_InitScriptableField( &m_dogleg1, "Dogleg1", 3.0, "DL in", "", "[deg/30m]", "" ); CAF_PDM_InitScriptableField( &m_dogleg2, "Dogleg2", 3.0, "DL out", "", "[deg/30m]", "" ); + CAF_PDM_InitFieldNoDefault( &m_targetType, "TargetType", "Type", "", "", "" ); m_targetType.uiCapability()->setUiHidden( true ); + CAF_PDM_InitField( &m_hasTangentConstraintUiField, "HasTangentConstraint", false, "Dir", "", "", "" ); m_hasTangentConstraintUiField.xmlCapability()->disableIO(); CAF_PDM_InitScriptableField( &m_azimuth, "Azimuth", 0.0, "Azi(deg)", "", "", "" ); CAF_PDM_InitScriptableField( &m_inclination, "Inclination", 0.0, "Inc(deg)", "", "", "" ); - - CAF_PDM_InitFieldNoDefault( &m_parentWellPath, "ParentWellPath", "Parent Well Path", "", "", "" ); - - m_parentWellPath.uiCapability()->setUiHidden( true ); } //-------------------------------------------------------------------------------------------------- @@ -111,7 +116,7 @@ bool RimWellPathTarget::isEnabled() const //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::setPointXYZ( const cvf::Vec3d& point ) { - m_targetPoint = { point.x(), point.y(), -point.z() }; + m_targetPointXYD = { point.x(), point.y(), -point.z() }; } //-------------------------------------------------------------------------------------------------- @@ -119,10 +124,10 @@ void RimWellPathTarget::setPointXYZ( const cvf::Vec3d& point ) //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::setAsPointTargetXYD( const cvf::Vec3d& point ) { - m_targetType = POINT; - m_targetPoint = point; - m_azimuth = 0.0; - m_inclination = 0.0; + m_targetType = TargetTypeEnum::POINT; + m_targetPointXYD = point; + m_azimuth = 0.0; + m_inclination = 0.0; } //-------------------------------------------------------------------------------------------------- @@ -130,10 +135,10 @@ void RimWellPathTarget::setAsPointTargetXYD( const cvf::Vec3d& point ) //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::setAsPointTargetXYZ( const cvf::Vec3d& point ) { - m_targetType = POINT; - m_targetPoint = cvf::Vec3d( point.x(), point.y(), -point.z() ); - m_azimuth = 0.0; - m_inclination = 0.0; + m_targetType = TargetTypeEnum::POINT; + m_targetPointXYD = cvf::Vec3d( point.x(), point.y(), -point.z() ); + m_azimuth = 0.0; + m_inclination = 0.0; } //-------------------------------------------------------------------------------------------------- @@ -150,10 +155,10 @@ void RimWellPathTarget::setAsPointXYZAndTangentTarget( const cvf::Vec3d& point, //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::setAsPointXYZAndTangentTarget( const cvf::Vec3d& point, double azimuth, double inclination ) { - m_targetType = POINT_AND_TANGENT; - m_targetPoint = cvf::Vec3d( point.x(), point.y(), -point.z() ); - m_azimuth = cvf::Math::toDegrees( azimuth ); - m_inclination = cvf::Math::toDegrees( inclination ); + m_targetType = TargetTypeEnum::POINT_AND_TANGENT; + m_targetPointXYD = cvf::Vec3d( point.x(), point.y(), -point.z() ); + m_azimuth = cvf::Math::toDegrees( azimuth ); + m_inclination = cvf::Math::toDegrees( inclination ); } //-------------------------------------------------------------------------------------------------- @@ -161,13 +166,23 @@ void RimWellPathTarget::setAsPointXYZAndTangentTarget( const cvf::Vec3d& point, //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::setDerivedTangent( double azimuth, double inclination ) { - if ( m_targetType == POINT ) + if ( m_targetType == TargetTypeEnum::POINT ) { m_azimuth = cvf::Math::toDegrees( azimuth ); m_inclination = cvf::Math::toDegrees( inclination ); } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathTarget::updateFrom3DManipulator( const cvf::Vec3d& pointXYD ) +{ + enableFullUpdate( false ); + m_targetPointXYD.setValueWithFieldChanged( pointXYD ); + enableFullUpdate( true ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -176,7 +191,7 @@ RiaLineArcWellPathCalculator::WellTarget RimWellPathTarget::wellTargetData() RiaLineArcWellPathCalculator::WellTarget targetData; targetData.targetPointXYZ = targetPointXYZ(); - targetData.isTangentConstrained = ( targetType() == POINT_AND_TANGENT ); + targetData.isTangentConstrained = ( targetType() == TargetTypeEnum::POINT_AND_TANGENT ); targetData.azimuth = azimuth(); targetData.inclination = inclination(); targetData.radius1 = radius1(); @@ -198,7 +213,7 @@ RimWellPathTarget::TargetTypeEnum RimWellPathTarget::targetType() const //-------------------------------------------------------------------------------------------------- cvf::Vec3d RimWellPathTarget::targetPointXYZ() const { - cvf::Vec3d xyzPoint( m_targetPoint() ); + cvf::Vec3d xyzPoint( m_targetPointXYD() ); xyzPoint.z() = -xyzPoint.z(); return xyzPoint; } @@ -208,14 +223,12 @@ cvf::Vec3d RimWellPathTarget::targetPointXYZ() const //-------------------------------------------------------------------------------------------------- double RimWellPathTarget::azimuth() const { - if ( m_targetType() == POINT_AND_TANGENT ) + if ( m_targetType() == TargetTypeEnum::POINT_AND_TANGENT ) { return cvf::Math::toRadians( m_azimuth ); } - else - { - return std::numeric_limits::infinity(); - } + + return std::numeric_limits::infinity(); } //-------------------------------------------------------------------------------------------------- @@ -223,14 +236,12 @@ double RimWellPathTarget::azimuth() const //-------------------------------------------------------------------------------------------------- double RimWellPathTarget::inclination() const { - if ( m_targetType() == POINT_AND_TANGENT ) + if ( m_targetType() == TargetTypeEnum::POINT_AND_TANGENT ) { return cvf::Math::toRadians( m_inclination ); } - else - { - return std::numeric_limits::infinity(); - } + + return std::numeric_limits::infinity(); } //-------------------------------------------------------------------------------------------------- @@ -338,6 +349,14 @@ void RimWellPathTarget::flagRadius2AsIncorrect( bool isEditable, bool isIncorrec m_dogleg2.uiCapability()->setUiReadOnly( !isEditable ); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RimWellPathTarget::fieldsFor3dManipulator() +{ + return { &m_targetType, &m_targetPointXYD, &m_azimuth, &m_inclination }; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -361,19 +380,99 @@ void RimWellPathTarget::defineEditorAttribute( const caf::PdmFieldHandle* field, QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) { - if ( field == &m_targetPoint ) + if ( field == &m_targetPointXYD ) + { + auto uiDisplayStringAttr = dynamic_cast( attribute ); + + if ( uiDisplayStringAttr ) + { + uiDisplayStringAttr->m_displayString = QString::number( m_targetPointXYD()[0], 'f', 2 ) + " " + + QString::number( m_targetPointXYD()[1], 'f', 2 ) + " " + + QString::number( m_targetPointXYD()[2], 'f', 2 ); + } + } + else if ( field == &m_targetPointForDisplay ) { auto uiDisplayStringAttr = dynamic_cast( attribute ); if ( uiDisplayStringAttr ) { - uiDisplayStringAttr->m_displayString = QString::number( m_targetPoint()[0], 'f', 2 ) + " " + - QString::number( m_targetPoint()[1], 'f', 2 ) + " " + - QString::number( m_targetPoint()[2], 'f', 2 ); + uiDisplayStringAttr->m_displayString = QString::number( m_targetPointForDisplay()[0], 'f', 2 ) + " " + + QString::number( m_targetPointForDisplay()[1], 'f', 2 ) + " " + + QString::number( m_targetPointForDisplay()[2], 'f', 2 ); } } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RimWellPathTarget::targetPointForDisplayXYD() const +{ + auto geoDef = geometryDefinition(); + if ( geoDef && geoDef->showAbsoluteCoordinates() ) + { + auto offsetXYZ = geoDef->anchorPointXyz(); + + auto coordXYD = targetPointXYZ() + offsetXYZ; + coordXYD.z() = -coordXYD.z(); + + return coordXYD; + } + + return m_targetPointXYD(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathTarget::setTargetPointFromDisplayCoord( const cvf::Vec3d& coordInXYD ) +{ + cvf::Vec3d offsetXYD = cvf::Vec3d::ZERO; + + auto geoDef = geometryDefinition(); + if ( geoDef && geoDef->showAbsoluteCoordinates() ) + { + offsetXYD = geoDef->anchorPointXyd(); + } + + auto newCoordInXYD = coordInXYD - offsetXYD; + m_targetPointXYD = newCoordInXYD; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RimWellPathTarget::measuredDepth() const +{ + RimWellPath* wellPath = nullptr; + this->firstAncestorOfType( wellPath ); + + auto geoDef = geometryDefinition(); + + if ( geoDef && wellPath && wellPath->wellPathGeometry() ) + { + auto offsetXYZ = geoDef->anchorPointXyz(); + auto coordXYZ = targetPointXYZ() + offsetXYZ; + + auto wellPathGeo = wellPath->wellPathGeometry(); + return wellPathGeo->closestMeasuredDepth( coordXYZ ); + } + + return 0.0; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellPathGeometryDef* RimWellPathTarget::geometryDefinition() const +{ + RimWellPathGeometryDef* geoDef = nullptr; + this->firstAncestorOfType( geoDef ); + + return geoDef; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -385,11 +484,12 @@ QList RimWellPathTarget::calculateValueOptions( const ca { options.push_back( caf::PdmOptionItemInfo( "o->", - RimWellPathTarget::POINT_AND_TANGENT ) ); //, false, - // QIcon(":/WellTargetPointTangent16x16.png") - //)); - options.push_back( caf::PdmOptionItemInfo( "o", RimWellPathTarget::POINT ) ); //, false, - // QIcon(":/WellTargetPoint16x16.png"))); + RimWellPathTarget::TargetTypeEnum::POINT_AND_TANGENT ) ); //, false, + // QIcon(":/WellTargetPointTangent16x16.png") + //)); + options.push_back( + caf::PdmOptionItemInfo( "o", RimWellPathTarget::TargetTypeEnum::POINT ) ); //, false, + // QIcon(":/WellTargetPoint16x16.png"))); } return options; } @@ -404,9 +504,9 @@ void RimWellPathTarget::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel if ( changedField == &m_hasTangentConstraintUiField ) { if ( m_hasTangentConstraintUiField ) - m_targetType = POINT_AND_TANGENT; + m_targetType = TargetTypeEnum::POINT_AND_TANGENT; else - m_targetType = POINT; + m_targetType = TargetTypeEnum::POINT; } moved.send( m_isFullUpdateEnabled ); @@ -417,15 +517,15 @@ void RimWellPathTarget::fieldChangedByUi( const caf::PdmFieldHandle* changedFiel //-------------------------------------------------------------------------------------------------- void RimWellPathTarget::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) { - m_hasTangentConstraintUiField = ( m_targetType == POINT_AND_TANGENT ); + m_hasTangentConstraintUiField = ( m_targetType == TargetTypeEnum::POINT_AND_TANGENT ); if ( m_isEnabled() && !m_isLocked() ) { m_hasTangentConstraintUiField.uiCapability()->setUiReadOnly( false ); m_targetType.uiCapability()->setUiReadOnly( false ); - m_targetPoint.uiCapability()->setUiReadOnly( false ); + m_targetPointXYD.uiCapability()->setUiReadOnly( false ); - if ( m_targetType == POINT ) + if ( m_targetType == TargetTypeEnum::POINT ) { m_azimuth.uiCapability()->setUiReadOnly( true ); m_inclination.uiCapability()->setUiReadOnly( true ); @@ -440,7 +540,7 @@ void RimWellPathTarget::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi { m_dogleg1.uiCapability()->setUiReadOnly( true ); m_targetType.uiCapability()->setUiReadOnly( true ); - m_targetPoint.uiCapability()->setUiReadOnly( true ); + m_targetPointXYD.uiCapability()->setUiReadOnly( true ); m_azimuth.uiCapability()->setUiReadOnly( true ); m_inclination.uiCapability()->setUiReadOnly( true ); m_dogleg2.uiCapability()->setUiReadOnly( true ); @@ -451,4 +551,15 @@ void RimWellPathTarget::defineUiOrdering( QString uiConfigName, caf::PdmUiOrderi { m_isEnabled.uiCapability()->setUiReadOnly( true ); } + + { + bool showAbsCoords = false; + auto geoDef = geometryDefinition(); + if ( geoDef && geoDef->showAbsoluteCoordinates() ) + { + showAbsCoords = true; + } + + m_targetPointForDisplay.uiCapability()->setUiHidden( !showAbsCoords ); + } } diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathTarget.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.h similarity index 79% rename from ApplicationLibCode/ProjectDataModel/RimWellPathTarget.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.h index 88780b709e..f383e91e73 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathTarget.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTarget.h @@ -20,13 +20,15 @@ #include "cafPdmObject.h" #include "RiaLineArcWellPathCalculator.h" + #include "cafAppEnum.h" #include "cafPdmCoreVec3d.h" #include "cafPdmField.h" +#include "cafPdmProxyValueField.h" #include "cafPdmPtrField.h" #include "cvfVector3.h" -class RimWellPath; +class RimWellPathGeometryDef; class RimWellPathTarget : public caf::PdmObject { @@ -48,14 +50,16 @@ class RimWellPathTarget : public caf::PdmObject void setAsPointXYZAndTangentTarget( const cvf::Vec3d& point, const cvf::Vec3d& tangent ); void setAsPointXYZAndTangentTarget( const cvf::Vec3d& point, double azimuth, double inclination ); void setDerivedTangent( double azimuth, double inclination ); + void updateFrom3DManipulator( const cvf::Vec3d& pointXYD ); RiaLineArcWellPathCalculator::WellTarget wellTargetData(); - enum TargetTypeEnum + enum class TargetTypeEnum { POINT_AND_TANGENT, POINT }; + TargetTypeEnum targetType() const; cvf::Vec3d targetPointXYZ() const; double azimuth() const; @@ -66,6 +70,8 @@ class RimWellPathTarget : public caf::PdmObject void flagRadius1AsIncorrect( bool isEditable, bool isIncorrect, double actualRadius ); void flagRadius2AsIncorrect( bool isEditable, bool isIncorrect, double actualRadius ); + std::vector fieldsFor3dManipulator(); + void onMoved(); private: @@ -77,19 +83,25 @@ class RimWellPathTarget : public caf::PdmObject QString uiConfigName, caf::PdmUiEditorAttribute* attribute ) override; + cvf::Vec3d targetPointForDisplayXYD() const; + void setTargetPointFromDisplayCoord( const cvf::Vec3d& coordInXYZ ); + double measuredDepth() const; + + RimWellPathGeometryDef* geometryDefinition() const; + private: - friend class RicWellTarget3dEditor; void enableFullUpdate( bool enable ); bool m_isFullUpdateEnabled; caf::PdmField m_isEnabled; caf::PdmField m_isLocked; caf::PdmField> m_targetType; - caf::PdmField m_targetPoint; - caf::PdmField m_azimuth; - caf::PdmField m_inclination; - caf::PdmField m_dogleg1; - caf::PdmField m_dogleg2; - caf::PdmField m_hasTangentConstraintUiField; - - caf::PdmPtrField m_parentWellPath; + caf::PdmField m_targetPointXYD; + caf::PdmProxyValueField m_targetPointForDisplay; + caf::PdmProxyValueField m_targetMeasuredDepth; + + caf::PdmField m_azimuth; + caf::PdmField m_inclination; + caf::PdmField m_dogleg1; + caf::PdmField m_dogleg2; + caf::PdmField m_hasTangentConstraintUiField; }; diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.cpp b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.cpp similarity index 77% rename from ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.cpp rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.cpp index 1158a25e86..cd9352efd3 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.cpp +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.cpp @@ -30,9 +30,8 @@ #include "RiuMainWindow.h" -#include "cafPdmFieldScriptingCapability.h" -#include "cafPdmObjectScriptingCapability.h" -#include "cafPdmUiDoubleValueEditor.h" +#include "RigWellPathGeometryTools.h" +#include "cafPdmUiDoubleSliderEditor.h" CAF_PDM_SOURCE_INIT( RimWellPathTieIn, "RimWellPathTieIn" ); @@ -46,17 +45,11 @@ RimWellPathTieIn::RimWellPathTieIn() CAF_PDM_InitFieldNoDefault( &m_parentWell, "ParentWellPath", "Parent Well Path", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_childWell, "ChildWellPath", "ChildWellPath", "", "", "" ); CAF_PDM_InitFieldNoDefault( &m_tieInMeasuredDepth, "TieInMeasuredDepth", "Tie In Measured Depth", "", "", "" ); - m_tieInMeasuredDepth.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleValueEditor::uiEditorTypeName() ); + m_tieInMeasuredDepth.uiCapability()->setUiEditorTypeName( caf::PdmUiDoubleSliderEditor::uiEditorTypeName() ); - CAF_PDM_InitScriptableField( &m_addValveAtConnection, - "AddValveAtConnection", - false, - "Add Outlet Valve for Branches", - "", - "", - "" ); + CAF_PDM_InitField( &m_addValveAtConnection, "AddValveAtConnection", false, "Add Outlet Valve for Branches", "", "", "" ); - CAF_PDM_InitScriptableFieldNoDefault( &m_valve, "Valve", "Branch Outlet Valve", "", "", "" ); + CAF_PDM_InitFieldNoDefault( &m_valve, "Valve", "Branch Outlet Valve", "", "", "" ); m_valve = new RimWellPathValve; } @@ -87,6 +80,14 @@ double RimWellPathTieIn::tieInMeasuredDepth() const return m_tieInMeasuredDepth(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathTieIn::setTieInMeasuredDepth( double measuredDepth ) +{ + m_tieInMeasuredDepth = measuredDepth; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -135,9 +136,15 @@ void RimWellPathTieIn::updateFirstTargetFromParentWell() newTarget = modeledWellPath->geometryDefinition()->activeWellTargets().front(); } - auto lastPoint = pointVector.back(); - auto tangent = lastPoint - pointVector[pointVector.size() - 2]; - newTarget->setAsPointXYZAndTangentTarget( { lastPoint[0], lastPoint[1], lastPoint[2] }, tangent ); + auto lastPointXYZ = pointVector.back(); + auto tangent = lastPointXYZ - pointVector[pointVector.size() - 2]; + + modeledWellPath->updateReferencePoint(); + cvf::Vec3d referencePointXYZ = modeledWellPath->geometryDefinition()->anchorPointXyz(); + cvf::Vec3d relativePointXYZ = lastPointXYZ - referencePointXYZ; + + newTarget->setAsPointXYZAndTangentTarget( { relativePointXYZ[0], relativePointXYZ[1], relativePointXYZ[2] }, + tangent ); } } @@ -221,3 +228,32 @@ QList RimWellPathTieIn::calculateValueOptions( const caf return options; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RimWellPathTieIn::defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) +{ + if ( field == &m_tieInMeasuredDepth ) + { + caf::PdmUiDoubleSliderEditorAttribute* myAttr = dynamic_cast( attribute ); + + if ( myAttr && parentWell() ) + { + double minimumValue = 0.0, maximumValue = 0.0; + + auto wellPathGeo = parentWell()->wellPathGeometry(); + + if ( wellPathGeo ) + { + minimumValue = wellPathGeo->measuredDepths().front(); + maximumValue = wellPathGeo->measuredDepths().back(); + + myAttr->m_minimum = minimumValue; + myAttr->m_maximum = maximumValue; + } + } + } +} diff --git a/ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.h b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.h similarity index 88% rename from ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.h rename to ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.h index 0edc980799..77ddbf05f1 100644 --- a/ApplicationLibCode/ProjectDataModel/RimWellPathTieIn.h +++ b/ApplicationLibCode/ProjectDataModel/WellPath/RimWellPathTieIn.h @@ -36,6 +36,7 @@ class RimWellPathTieIn : public caf::PdmObject void connectWellPaths( RimWellPath* parentWell, RimWellPath* childWell, double tieInMeasuredDepth ); RimWellPath* parentWell() const; double tieInMeasuredDepth() const; + void setTieInMeasuredDepth( double measuredDepth ); RimWellPath* childWell() const; void updateChildWellGeometry(); @@ -52,6 +53,10 @@ class RimWellPathTieIn : public caf::PdmObject QList calculateValueOptions( const caf::PdmFieldHandle* fieldNeedingOptions, bool* useOptionsOnly ) override; + void defineEditorAttribute( const caf::PdmFieldHandle* field, + QString uiConfigName, + caf::PdmUiEditorAttribute* attribute ) override; + private: caf::PdmPtrField m_parentWell; caf::PdmPtrField m_childWell; diff --git a/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake index cebd9c8ccd..46472a002b 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake +++ b/ApplicationLibCode/ProjectDataModelCommands/CMakeLists_files.cmake @@ -1,42 +1,57 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryCase.h -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryResampleData.h -${CMAKE_CURRENT_LIST_DIR}/RimcProject.h -${CMAKE_CURRENT_LIST_DIR}/RimcElasticProperties.h -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelTemplateCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelPlotCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModel.h -${CMAKE_CURRENT_LIST_DIR}/RimcSurfaceCollection.h -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerDouble.h -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerString.h -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerTime.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryCase.h + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryResampleData.h + ${CMAKE_CURRENT_LIST_DIR}/RimcProject.h + ${CMAKE_CURRENT_LIST_DIR}/RimcElasticProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelTemplateCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModel.h + ${CMAKE_CURRENT_LIST_DIR}/RimcSurfaceCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerDouble.h + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerString.h + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerTime.h + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogPlotCollection.h + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogTrack.h + ${CMAKE_CURRENT_LIST_DIR}/RimcWellPathGeometryDef.h + ${CMAKE_CURRENT_LIST_DIR}/RimcModeledWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimcWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplateCollection.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryCase.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcSummaryResampleData.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcProject.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcElasticProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelTemplateCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelPlotCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModel.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcSurfaceCollection.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerDouble.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerString.cpp -${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerTime.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryCase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcSummaryResampleData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcProject.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcElasticProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelTemplateCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModelPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcStimPlanModel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcSurfaceCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerDouble.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerString.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcDataContainerTime.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogPlotCollection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcWellLogTrack.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcWellPathGeometryDef.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcModeledWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcFractureTemplateCollection.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ProjectDataModelCommands" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ProjectDataModelCommands" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/CMakeLists_files.cmake b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/CMakeLists_files.cmake new file mode 100644 index 0000000000..d7fc5659af --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/CMakeLists_files.cmake @@ -0,0 +1,17 @@ +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RimCommandRouter.h + ${CMAKE_CURRENT_LIST_DIR}/RimcExtractSurfaces.h +) + +set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RimCommandRouter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimcExtractSurfaces.cpp +) + +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) + +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) + +source_group( + "ProjectDataModelCommands\\CommandRouter" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.cpp b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.cpp new file mode 100644 index 0000000000..9e888b4778 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.cpp @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimCommandRouter.h" + +#include "cafPdmObjectScriptingCapability.h" + +CAF_PDM_SOURCE_INIT( RimCommandRouter, "RimCommandRouter" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimCommandRouter::RimCommandRouter() +{ + CAF_PDM_InitScriptableObjectWithNameAndComment( "CommandRouter", + "", + "", + "", + "CommandRouter", + "The CommandRouter is used to call code independent to the " + "project" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +/// RimCommandRouterMethod +/// +/// +/// +/// +//-------------------------------------------------------------------------------------------------- +RimCommandRouterMethod::RimCommandRouterMethod( PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimCommandRouterMethod::isNullptrValidResult() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimCommandRouterMethod::resultIsPersistent() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimCommandRouterMethod::defaultResult() const +{ + return nullptr; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.h b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.h new file mode 100644 index 0000000000..f1dc3a1f46 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimCommandRouter.h @@ -0,0 +1,62 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmObject.h" +#include "cafPdmObjectMethod.h" + +//-------------------------------------------------------------------------------------------------- +/// Usually, command router classes will require only the execute() method. Derive from RimCommandRouterMethod to get +/// default values for the other required virtual functions +//-------------------------------------------------------------------------------------------------- +class RimCommandRouterMethod : public caf::PdmObjectMethod +{ +public: + RimCommandRouterMethod( PdmObjectHandle* self ); + + bool isNullptrValidResult() const override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; +}; + +//================================================================================================== +/// The command router object is used as a hub for data processing commands independent to a ResInsight project +/// (RimProject). The intention for this object is to have a hub to connect to when using ResInsight as a data +/// processing server. Avoid dependency on a GUI, and make sure the execute() commands works in headless mode. +/// +/// The router object is made available from Python using +/// +/// resinsight = rips.Instance.find() +/// command_router = resinsight.command_router +/// +/// Steps to add a new processing function +/// 1) Create a new class deriving from RimCommandRouterMethod +/// 2) Add Pdm fields to this class. These fields will be made available as parameters from Python +/// 2) Implement data processing in execute() method using the input values specified in the Pdm fields +/// +/// Example : RimcCommandRouter_extractSurfaces +/// +//================================================================================================== +class RimCommandRouter : public caf::PdmObject +{ + CAF_PDM_HEADER_INIT; + +public: + RimCommandRouter(); +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.cpp b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.cpp new file mode 100644 index 0000000000..248422020c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.cpp @@ -0,0 +1,185 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimcExtractSurfaces.h" + +#include "RiaLogging.h" +#include "RifSurfaceExporter.h" +#include "RimCommandRouter.h" + +#include "opm/io/eclipse/EGrid.hpp" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectHandle.h" + +#include +#include + +#include + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimCommandRouter, RimcCommandRouter_extractSurfaces, "ExtractSurfaces" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcCommandRouter_extractSurfaces::RimcCommandRouter_extractSurfaces( caf::PdmObjectHandle* self ) + : RimCommandRouterMethod( self ) +{ + CAF_PDM_InitObject( "Extract Layer Surface", "", "", "Extract Layer Surface" ); + + CAF_PDM_InitScriptableField( &m_gridModelFilename, "GridModelFilename", QString(), "Grid Model Case Filename", "", "", "" ); + CAF_PDM_InitScriptableField( &m_layers, "Layers", std::vector(), "Layers", "", "", "" ); + CAF_PDM_InitScriptableField( &m_minimumI, "MinimumI", -1, "Minimum I", "", "", "" ); + CAF_PDM_InitScriptableField( &m_maximumI, "MaximumI", -1, "Maximum I", "", "", "" ); + CAF_PDM_InitScriptableField( &m_minimumJ, "MinimumJ", -1, "Minimum J", "", "", "" ); + CAF_PDM_InitScriptableField( &m_maximumJ, "MaximumJ", -1, "Maximum J", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcCommandRouter_extractSurfaces::execute() +{ + extractSurfaces( m_gridModelFilename, m_layers(), m_minimumI(), m_maximumI(), m_minimumJ(), m_maximumJ() ); + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair RimcCommandRouter_extractSurfaces::extractSurfaces( const QString& gridModelFilename, + const std::vector& layers, + int minI, + int maxI, + int minJ, + int maxJ ) +{ + QStringList surfaceFileNames; + + try + { + std::string filename = gridModelFilename.toStdString(); + Opm::EclIO::EGrid grid1( filename ); + + auto dims = grid1.dimension(); + minI = minI == -1 ? 0 : minI; + maxI = maxI == -1 ? dims[0] - 1 : maxI; + minJ = minJ == -1 ? 0 : minJ; + maxJ = maxJ == -1 ? dims[1] - 1 : maxJ; + + std::array range = { minI, maxI, minJ, maxJ }; + + for ( auto layer : layers ) + { + bool bottom = false; + auto xyz_data = grid1.getXYZ_layer( layer, range, bottom ); + auto mapAxis = grid1.get_mapaxes(); + + // Create surface from coords + + std::vector triangleIndices; + std::vector vertices; + + unsigned startOfCellCoordIndex = 0; + while ( startOfCellCoordIndex + 4 < xyz_data.size() ) + { + for ( size_t cornerIdx = 0; cornerIdx < 4; cornerIdx++ ) + { + auto coord1 = xyz_data[startOfCellCoordIndex + cornerIdx]; + auto cvfCoord = cvf::Vec3d( coord1[0], coord1[1], -coord1[2] ); + + if ( !mapAxis.empty() ) + { + cvfCoord[0] += mapAxis[2]; + cvfCoord[1] += mapAxis[3]; + } + vertices.push_back( cvfCoord ); + } + + triangleIndices.push_back( startOfCellCoordIndex ); + triangleIndices.push_back( startOfCellCoordIndex + 3 ); + triangleIndices.push_back( startOfCellCoordIndex + 2 ); + + triangleIndices.push_back( startOfCellCoordIndex ); + triangleIndices.push_back( startOfCellCoordIndex + 1 ); + triangleIndices.push_back( startOfCellCoordIndex + 3 ); + + // Coordinates are given for each four corners for each cell of the surface + startOfCellCoordIndex += 4; + } + + QString surfaceExportDirName = "surfaceexport"; + + // Create missing directories + QFileInfo fi( gridModelFilename ); + if ( !fi.absoluteDir().exists( surfaceExportDirName ) ) + { + if ( !fi.absoluteDir().mkpath( surfaceExportDirName ) ) + { + RiaLogging::error( "Unable to create directory for surface export: " + fi.absoluteDir().absolutePath() ); + return std::make_pair( false, surfaceFileNames ); + } + } + + // Write to TS file on disk + QString surfaceFilename = fi.absoluteDir().absolutePath() + + QString( "/%1/layer-%2.ts" ).arg( surfaceExportDirName ).arg( layer ); + + // TODO: Add more info in surface comment + if ( !RifSurfaceExporter::writeGocadTSurfFile( surfaceFilename, "Surface comment", vertices, triangleIndices ) ) + { + RiaLogging::error( "Failed to export surface data to " + surfaceFilename ); + return std::make_pair( false, surfaceFileNames ); + } + else + { + surfaceFileNames << surfaceFilename; + RiaLogging::info( "Successfully exported surface data to " + surfaceFilename ); + } + } + + return std::make_pair( true, surfaceFileNames ); + } + catch ( ... ) + { + RiaLogging::error( "Error during creation of surface data for model " + gridModelFilename ); + return std::make_pair( false, surfaceFileNames ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcCommandRouter_extractSurfaces::readMinMaxLayerFromGridFile( const QString& gridFileName, int& minK, int& maxK ) +{ + try + { + Opm::EclIO::EGrid grid1( gridFileName.toStdString() ); + + auto dims = grid1.dimension(); + minK = 1; + maxK = dims[2]; + return true; + } + catch ( ... ) + { + RiaLogging::error( "Unable to read dimensions from " + gridFileName ); + return false; + } +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.h b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.h new file mode 100644 index 0000000000..da11e780cf --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/CommandRouter/RimcExtractSurfaces.h @@ -0,0 +1,59 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimCommandRouter.h" + +#include "cafPdmField.h" + +#include "cvfVector3.h" + +#include +#include + +#include + +//================================================================================================== +/// +//================================================================================================== +class RimcCommandRouter_extractSurfaces : public RimCommandRouterMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcCommandRouter_extractSurfaces( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + + static bool readMinMaxLayerFromGridFile( const QString& gridFileName, int& minK, int& maxK ); + static std::pair extractSurfaces( const QString& gridModelFileName, + const std::vector& layers, + int minI = -1, + int maxI = -1, + int minJ = -1, + int maxJ = -1 ); + +private: + caf::PdmField m_gridModelFilename; + caf::PdmField> m_layers; + caf::PdmField m_minimumI; + caf::PdmField m_maximumI; + caf::PdmField m_minimumJ; + caf::PdmField m_maximumJ; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp new file mode 100644 index 0000000000..66b7ce3816 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.cpp @@ -0,0 +1,80 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcFractureTemplateCollection.h" + +#include "FractureCommands/RicFractureNameGenerator.h" +#include "FractureCommands/RicNewStimPlanFractureTemplateFeature.h" +#include "FractureCommands/RicNewStimPlanModelFeature.h" + +#include "RimEclipseCase.h" +#include "RimFractureTemplate.h" + +#include "RimFractureTemplateCollection.h" +#include "RimStimPlanFractureTemplate.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimFractureTemplateCollection, + RimcFractureTemplateCollection_appendFractureTemplate, + "AppendFractureTemplate" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcFractureTemplateCollection_appendFractureTemplate::RimcFractureTemplateCollection_appendFractureTemplate( + caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create Fracture Template", "", "", "Create a new StimPlan Fracture Template" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_filePath, "FilePath", "", "", "", "File Path to StimPlan Countour File" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcFractureTemplateCollection_appendFractureTemplate::execute() +{ + RimFractureTemplateCollection* stimPlanModelTemplateCollection = self(); + + bool reuseExistingTemplatesWithMatchingNames = false; + auto newTemplates = + RicNewStimPlanFractureTemplateFeature::createNewTemplatesFromFiles( { m_filePath }, + reuseExistingTemplatesWithMatchingNames ); + + if ( newTemplates.empty() ) return nullptr; + + stimPlanModelTemplateCollection->updateAllRequiredEditors(); + return newTemplates[0]; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcFractureTemplateCollection_appendFractureTemplate::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcFractureTemplateCollection_appendFractureTemplate::defaultResult() const +{ + return std::unique_ptr( new RimStimPlanFractureTemplate ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h new file mode 100644 index 0000000000..4cbdba71dc --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcFractureTemplateCollection.h @@ -0,0 +1,45 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimFractureTemplateCollection.h" + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RimcFractureTemplateCollection_appendFractureTemplate : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcFractureTemplateCollection_appendFractureTemplate( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_filePath; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.cpp new file mode 100644 index 0000000000..ab73cf2d9b --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.cpp @@ -0,0 +1,133 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimcModeledWellPath.h" + +#include "RimModeledWellPath.h" +#include "RimPerforationCollection.h" +#include "RimPerforationInterval.h" +#include "RimTools.h" +#include "RimWellPathCollection.h" +#include "RimWellPathGeometryDef.h" +#include "RimWellPathTarget.h" + +#include "WellPathCommands/RicNewWellPathLateralAtDepthFeature.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimModeledWellPath, RimcModeledWellPath_appendLateral, "AppendLateral" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcModeledWellPath_appendLateral::RimcModeledWellPath_appendLateral( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Append Well Path Lateral", "", "", "Append Well Path Lateral" ); + CAF_PDM_InitScriptableField( &m_tieInDepth, "TieInDepth", 0.0, "", "", "", "Measured Depth on the Parent Well Path" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_lateralName, "LateralName", "", "", "", "Lateral Name" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcModeledWellPath_appendLateral::execute() +{ + auto parentWellPath = self(); + + auto lateral = RicNewWellPathLateralAtDepthFeature::createLateralAtMeasuredDepth( parentWellPath, m_tieInDepth ); + if ( !m_lateralName().isEmpty() ) + { + lateral->setName( m_lateralName ); + } + lateral->geometryDefinition()->enableTargetPointPicking( false ); + + return lateral; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcModeledWellPath_appendLateral::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcModeledWellPath_appendLateral::defaultResult() const +{ + return std::unique_ptr( new RimModeledWellPath ); +} + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimModeledWellPath, + RimcModeledWellPath_appendPerforationInterval, + "AppendPerforationInterval" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcModeledWellPath_appendPerforationInterval::RimcModeledWellPath_appendPerforationInterval( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Append Perforation Interval", "", "", "Append Perforation Interval" ); + CAF_PDM_InitScriptableField( &m_startMD, "StartMd", 0.0, "", "", "", "Start Measured Depth" ); + CAF_PDM_InitScriptableField( &m_endMD, "EndMd", 0.0, "", "", "", "End Measured Depth" ); + CAF_PDM_InitScriptableField( &m_diameter, "Diameter", 0.0, "", "", "", "Diameter" ); + CAF_PDM_InitScriptableField( &m_skinFactor, "SkinFactor", 0.0, "", "", "", "Skin Factor" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcModeledWellPath_appendPerforationInterval::execute() +{ + auto wellPath = self(); + + auto perforationInterval = new RimPerforationInterval; + perforationInterval->setStartAndEndMD( m_startMD, m_endMD ); + perforationInterval->setSkinFactor( m_skinFactor ); + perforationInterval->setDiameter( m_diameter ); + + wellPath->perforationIntervalCollection()->appendPerforation( perforationInterval ); + + auto* wellPathCollection = RimTools::wellPathCollection(); + + wellPathCollection->uiCapability()->updateConnectedEditors(); + wellPathCollection->scheduleRedrawAffectedViews(); + + return perforationInterval; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcModeledWellPath_appendPerforationInterval::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcModeledWellPath_appendPerforationInterval::defaultResult() const +{ + return std::unique_ptr( new RimPerforationInterval ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.h b/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.h new file mode 100644 index 0000000000..a6725c69dc --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcModeledWellPath.h @@ -0,0 +1,67 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" + +#include "cvfVector3.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RimcModeledWellPath_appendLateral : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcModeledWellPath_appendLateral( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_tieInDepth; + caf::PdmField m_lateralName; +}; + +//================================================================================================== +/// +//================================================================================================== +class RimcModeledWellPath_appendPerforationInterval : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcModeledWellPath_appendPerforationInterval( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_startMD; + caf::PdmField m_endMD; + caf::PdmField m_diameter; + caf::PdmField m_skinFactor; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp index 8d5d47ecd9..ac971634e3 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcProject.cpp @@ -122,7 +122,7 @@ RimProject_summaryCase::RimProject_summaryCase( caf::PdmObjectHandle* self ) : caf::PdmObjectMethod( self ) { CAF_PDM_InitObject( "Find Summary Case", "", "", "Find Summary Case" ); - CAF_PDM_InitScriptableFieldNoDefault( &m_caseId, "CaseId", "", "", "", "" ); + CAF_PDM_InitScriptableField( &m_caseId, "CaseId", -1, "", "", "", "" ); } //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.cpp index ee71ebedf5..a4e85ae916 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.cpp @@ -32,50 +32,50 @@ #include "cafPdmFieldScriptingCapability.h" CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimStimPlanModelCollection, - RimcStimPlanModelCollection_newStimPlanModel, - "NewStimPlanModel" ); + RimcStimPlanModelCollection_appendStimPlanModel, + "AppendStimPlanModel" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimcStimPlanModelCollection_newStimPlanModel::RimcStimPlanModelCollection_newStimPlanModel( caf::PdmObjectHandle* self ) +RimcStimPlanModelCollection_appendStimPlanModel::RimcStimPlanModelCollection_appendStimPlanModel( caf::PdmObjectHandle* self ) : caf::PdmObjectMethod( self ) { CAF_PDM_InitObject( "Create StimPlan Model", "", "", "Create a new StimPlan Model" ); CAF_PDM_InitScriptableFieldNoDefault( &m_wellPath, "WellPath", "", "", "", "Well Path" ); - CAF_PDM_InitScriptableFieldNoDefault( &m_md, "MeasuredDepth", "", "", "", "Measured Depth" ); + CAF_PDM_InitScriptableField( &m_md, "MeasuredDepth", 0.0, "Measured Depth", "", "", "" ); CAF_PDM_InitScriptableFieldNoDefault( &m_stimPlanModelTemplate, "StimPlanModelTemplate", "", "", "", "StimPlan Model Template" ); } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmObjectHandle* RimcStimPlanModelCollection_newStimPlanModel::execute() +caf::PdmObjectHandle* RimcStimPlanModelCollection_appendStimPlanModel::execute() { - RimStimPlanModel* newStimPlanModel = nullptr; + RimStimPlanModel* stimPlanModel = nullptr; RimStimPlanModelCollection* stimPlanModelCollection = self(); if ( m_wellPath ) { RimWellPathCollection* wellPathCollection = nullptr; stimPlanModelCollection->firstAncestorOrThisOfTypeAsserted( wellPathCollection ); - newStimPlanModel = RicNewStimPlanModelFeature::addStimPlanModel( m_wellPath, wellPathCollection ); + stimPlanModel = RicNewStimPlanModelFeature::addStimPlanModel( m_wellPath, wellPathCollection ); } - if ( newStimPlanModel ) + if ( stimPlanModel ) { - newStimPlanModel->setMD( m_md() ); - newStimPlanModel->setStimPlanModelTemplate( m_stimPlanModelTemplate() ); + stimPlanModel->setMD( m_md() ); + stimPlanModel->setStimPlanModelTemplate( m_stimPlanModelTemplate() ); stimPlanModelCollection->updateAllRequiredEditors(); } - return newStimPlanModel; + return stimPlanModel; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimcStimPlanModelCollection_newStimPlanModel::resultIsPersistent() const +bool RimcStimPlanModelCollection_appendStimPlanModel::resultIsPersistent() const { return true; } @@ -83,7 +83,7 @@ bool RimcStimPlanModelCollection_newStimPlanModel::resultIsPersistent() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::unique_ptr RimcStimPlanModelCollection_newStimPlanModel::defaultResult() const +std::unique_ptr RimcStimPlanModelCollection_appendStimPlanModel::defaultResult() const { return std::unique_ptr( new RimStimPlanModel ); } diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.h index b049bcf901..87665ccb3f 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelCollection.h @@ -36,12 +36,12 @@ class RimEclipseCase; //================================================================================================== /// //================================================================================================== -class RimcStimPlanModelCollection_newStimPlanModel : public caf::PdmObjectMethod +class RimcStimPlanModelCollection_appendStimPlanModel : public caf::PdmObjectMethod { CAF_PDM_HEADER_INIT; public: - RimcStimPlanModelCollection_newStimPlanModel( caf::PdmObjectHandle* self ); + RimcStimPlanModelCollection_appendStimPlanModel( caf::PdmObjectHandle* self ); caf::PdmObjectHandle* execute() override; bool resultIsPersistent() const override; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.cpp index 841f57fd13..5af7bfbc96 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.cpp @@ -28,13 +28,13 @@ #include "cafPdmFieldScriptingCapability.h" CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimStimPlanModelPlotCollection, - RimcStimPlanModelPlotCollection_newStimPlanModelPlot, - "NewStimPlanModelPlot" ); + RimcStimPlanModelPlotCollection_appendStimPlanModelPlot, + "AppendStimPlanModelPlot" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimcStimPlanModelPlotCollection_newStimPlanModelPlot::RimcStimPlanModelPlotCollection_newStimPlanModelPlot( +RimcStimPlanModelPlotCollection_appendStimPlanModelPlot::RimcStimPlanModelPlotCollection_appendStimPlanModelPlot( caf::PdmObjectHandle* self ) : caf::PdmObjectMethod( self ) { @@ -45,23 +45,23 @@ RimcStimPlanModelPlotCollection_newStimPlanModelPlot::RimcStimPlanModelPlotColle //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmObjectHandle* RimcStimPlanModelPlotCollection_newStimPlanModelPlot::execute() +caf::PdmObjectHandle* RimcStimPlanModelPlotCollection_appendStimPlanModelPlot::execute() { - RimStimPlanModelPlot* newStimPlanModelPlot = nullptr; + RimStimPlanModelPlot* stimPlanModelPlot = nullptr; RimStimPlanModelPlotCollection* stimPlanModelPlotCollection = self(); if ( m_stimPlanModel && stimPlanModelPlotCollection ) { - newStimPlanModelPlot = RicNewStimPlanModelPlotFeature::createPlot( m_stimPlanModel ); + stimPlanModelPlot = RicNewStimPlanModelPlotFeature::createPlot( m_stimPlanModel ); } - return newStimPlanModelPlot; + return stimPlanModelPlot; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimcStimPlanModelPlotCollection_newStimPlanModelPlot::resultIsPersistent() const +bool RimcStimPlanModelPlotCollection_appendStimPlanModelPlot::resultIsPersistent() const { return true; } @@ -69,7 +69,7 @@ bool RimcStimPlanModelPlotCollection_newStimPlanModelPlot::resultIsPersistent() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::unique_ptr RimcStimPlanModelPlotCollection_newStimPlanModelPlot::defaultResult() const +std::unique_ptr RimcStimPlanModelPlotCollection_appendStimPlanModelPlot::defaultResult() const { return std::unique_ptr( new RimStimPlanModelPlot ); } diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.h index a9e0cdd10a..bb41d5dd31 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelPlotCollection.h @@ -31,12 +31,12 @@ class RimStimPlanModel; //================================================================================================== /// //================================================================================================== -class RimcStimPlanModelPlotCollection_newStimPlanModelPlot : public caf::PdmObjectMethod +class RimcStimPlanModelPlotCollection_appendStimPlanModelPlot : public caf::PdmObjectMethod { CAF_PDM_HEADER_INIT; public: - RimcStimPlanModelPlotCollection_newStimPlanModelPlot( caf::PdmObjectHandle* self ); + RimcStimPlanModelPlotCollection_appendStimPlanModelPlot( caf::PdmObjectHandle* self ); caf::PdmObjectHandle* execute() override; bool resultIsPersistent() const override; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.cpp index ed9db7a7e8..5c9c667231 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.cpp @@ -31,13 +31,13 @@ #include "cafPdmFieldScriptingCapability.h" CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimStimPlanModelTemplateCollection, - RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate, - "NewStimPlanModelTemplate" ); + RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate, + "AppendStimPlanModelTemplate" ); //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate( +RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate::RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate( caf::PdmObjectHandle* self ) : caf::PdmObjectMethod( self ) { @@ -62,34 +62,34 @@ RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::RimcStimPlanModelT //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmObjectHandle* RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::execute() +caf::PdmObjectHandle* RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate::execute() { if ( !m_eclipseCase ) return nullptr; - RimStimPlanModelTemplate* newStimPlanModelTemplate = new RimStimPlanModelTemplate; + RimStimPlanModelTemplate* appendStimPlanModelTemplate = new RimStimPlanModelTemplate; RimStimPlanModelTemplateCollection* stimPlanModelTemplateCollection = self(); - newStimPlanModelTemplate->setName( RicFractureNameGenerator::nameForNewStimPlanModelTemplate() ); - newStimPlanModelTemplate->setDynamicEclipseCase( m_eclipseCase ); - newStimPlanModelTemplate->setTimeStep( m_timeStep ); - newStimPlanModelTemplate->setInitialPressureEclipseCase( m_eclipseCase ); - newStimPlanModelTemplate->setStaticEclipseCase( m_eclipseCase ); + appendStimPlanModelTemplate->setName( RicFractureNameGenerator::nameForNewStimPlanModelTemplate() ); + appendStimPlanModelTemplate->setDynamicEclipseCase( m_eclipseCase ); + appendStimPlanModelTemplate->setTimeStep( m_timeStep ); + appendStimPlanModelTemplate->setInitialPressureEclipseCase( m_eclipseCase ); + appendStimPlanModelTemplate->setStaticEclipseCase( m_eclipseCase ); - stimPlanModelTemplateCollection->addStimPlanModelTemplate( newStimPlanModelTemplate ); + stimPlanModelTemplateCollection->addStimPlanModelTemplate( appendStimPlanModelTemplate ); RicElasticPropertiesImportTools::importElasticPropertiesFromFile( m_elasticPropertiesFilePath, - newStimPlanModelTemplate ); + appendStimPlanModelTemplate ); RicFaciesPropertiesImportTools::importFaciesPropertiesFromFile( m_faciesPropertiesFilePath, - newStimPlanModelTemplate, + appendStimPlanModelTemplate, true ); stimPlanModelTemplateCollection->updateAllRequiredEditors(); - return newStimPlanModelTemplate; + return appendStimPlanModelTemplate; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::resultIsPersistent() const +bool RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate::resultIsPersistent() const { return true; } @@ -97,7 +97,7 @@ bool RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::resultIsPersi //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::unique_ptr RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate::defaultResult() const +std::unique_ptr RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate::defaultResult() const { return std::unique_ptr( new RimStimPlanModelTemplate ); } diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.h index bcc1ae97c5..19a10e7c24 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcStimPlanModelTemplateCollection.h @@ -34,12 +34,12 @@ class RimEclipseCase; //================================================================================================== /// //================================================================================================== -class RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate : public caf::PdmObjectMethod +class RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate : public caf::PdmObjectMethod { CAF_PDM_HEADER_INIT; public: - RimcStimPlanModelTemplateCollection_newStimPlanModelTemplate( caf::PdmObjectHandle* self ); + RimcStimPlanModelTemplateCollection_appendStimPlanModelTemplate( caf::PdmObjectHandle* self ); caf::PdmObjectHandle* execute() override; bool resultIsPersistent() const override; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryCase.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryCase.cpp index b6402031f5..56af273041 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryCase.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSummaryCase.cpp @@ -51,7 +51,7 @@ caf::PdmObjectHandle* RimSummaryCase_summaryVectorValues::execute() auto* summaryCase = self(); RifSummaryReaderInterface* sumReader = summaryCase->summaryReader(); - auto adr = RifEclipseSummaryAddress::fromEclipseTextAddress( m_addressString().toStdString() ); + auto adr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( m_addressString().toStdString() ); std::vector values; @@ -205,7 +205,7 @@ caf::PdmObjectHandle* RimSummaryCase_resampleValues::execute() auto* summaryCase = self(); RifSummaryReaderInterface* sumReader = summaryCase->summaryReader(); - auto adr = RifEclipseSummaryAddress::fromEclipseTextAddress( m_addressString().toStdString() ); + auto adr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( m_addressString().toStdString() ); auto dataObject = new RimcSummaryResampleData(); diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.cpp new file mode 100644 index 0000000000..32e3b17ed0 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.cpp @@ -0,0 +1,91 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcSurface.h" + +#include "RimCase.h" +#include "RimSurface.h" +#include "RimcDataContainerString.h" + +#include "RigSurface.h" + +#include "RifSurfaceExporter.h" + +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmObjectScriptingCapability.h" + +#include + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimSurface, RimcSurface_exportToFile, "ExportToFile" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcSurface_exportToFile::RimcSurface_exportToFile( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Export Surface To fiole", "", "", "Export a surface to file" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_fileName, "FileName", "", "", "", "Filename to export surface to" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcSurface_exportToFile::execute() +{ + RimSurface* surface = self(); + + auto dataObject = new RimcDataContainerString(); + + if ( surface ) + { + RigSurface* surfaceData = surface->surfaceData(); + + RifSurfaceExporter::writeGocadTSurfFile( m_fileName(), + surface->userDescription(), + surfaceData->vertices(), + surfaceData->triangleIndices() ); + + dataObject->m_stringValues = { m_fileName() }; + } + + return dataObject; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcSurface_exportToFile::resultIsPersistent() const +{ + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcSurface_exportToFile::defaultResult() const +{ + return std::unique_ptr( new RimcDataContainerString() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcSurface_exportToFile::isNullptrValidResult() const +{ + return true; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.h b/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.h new file mode 100644 index 0000000000..a8c9fbff6c --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSurface.h @@ -0,0 +1,48 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimSurface.h" + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" + +#include + +#include + +//================================================================================================== +/// +//================================================================================================== +class RimcSurface_exportToFile : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcSurface_exportToFile( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + bool isNullptrValidResult() const override; + +private: + caf::PdmField m_fileName; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.cpp index 1913e4a010..16985c5482 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.cpp +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.cpp @@ -19,7 +19,9 @@ #include "SurfaceCommands/RicImportSurfacesFeature.h" +#include "RimCase.h" #include "RimFileSurface.h" +#include "RimGridCaseSurface.h" #include "RimSurface.h" #include "RimSurfaceCollection.h" @@ -30,6 +32,7 @@ CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimSurfaceCollection, RimcSurfaceCollection_importSurface, "ImportSurface" ); CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimSurfaceCollection, RimcSurfaceCollection_addFolder, "AddFolder" ); +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimSurfaceCollection, RimcSurfaceCollection_newSurface, "NewSurface" ); //-------------------------------------------------------------------------------------------------- /// @@ -130,3 +133,52 @@ bool RimcSurfaceCollection_addFolder::isNullptrValidResult() const { return true; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcSurfaceCollection_newSurface::RimcSurfaceCollection_newSurface( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "New Surface", "", "", "Create a new surface" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_case, "Case", "", "", "", "" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_kIndex, "KIndex", "", "", "", "" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcSurfaceCollection_newSurface::execute() +{ + RimSurfaceCollection* coll = self(); + if ( coll && m_case ) + { + RimSurface* surface = coll->addGridCaseSurface( m_case(), m_kIndex ); + return surface; + } + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcSurfaceCollection_newSurface::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcSurfaceCollection_newSurface::defaultResult() const +{ + return std::unique_ptr( new RimGridCaseSurface ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcSurfaceCollection_newSurface::isNullptrValidResult() const +{ + return true; +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.h index beb46bbe4c..40e4b5f0ff 100644 --- a/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.h +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcSurfaceCollection.h @@ -32,6 +32,7 @@ class RimSurface; class RimSurfaceCollection; +class RimCase; //================================================================================================== /// @@ -70,3 +71,23 @@ class RimcSurfaceCollection_addFolder : public caf::PdmObjectMethod private: caf::PdmField m_folderName; }; + +//================================================================================================== +/// +//================================================================================================== +class RimcSurfaceCollection_newSurface : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcSurfaceCollection_newSurface( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + bool isNullptrValidResult() const override; + +private: + caf::PdmPtrField m_case; + caf::PdmField m_kIndex; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.cpp new file mode 100644 index 0000000000..9f3176f494 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.cpp @@ -0,0 +1,104 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcWellLogPlot.h" + +#include "RiaApplication.h" + +#include "WellLogCommands/RicNewWellLogPlotFeatureImpl.h" + +#include "RimEclipseCase.h" +#include "RimProject.h" +#include "RimWellLogCurveCommonDataSource.h" +#include "RimWellLogExtractionCurve.h" +#include "RimWellLogPlot.h" +#include "RimWellLogPlotCollection.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellLogPlot, RimcWellLogPlot_newWellLogTrack, "NewWellLogTrack" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcWellLogPlot_newWellLogTrack::RimcWellLogPlot_newWellLogTrack( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create Well Log Track", "", "", "Create a new well log track" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_title, "Title", "", "", "", "Title" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_case, "Case", "", "", "", "Case" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_wellPath, "WellPath", "", "", "", "Well Path" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcWellLogPlot_newWellLogTrack::execute() +{ + RimWellLogPlot* wellLogPlot = self(); + + if ( !wellLogPlot ) return nullptr; + + return createWellLogTrack( wellLogPlot, m_case(), m_wellPath(), m_title() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogTrack* RimcWellLogPlot_newWellLogTrack::createWellLogTrack( RimWellLogPlot* wellLogPlot, + RimEclipseCase* eclipseCase, + RimWellPath* wellPath, + const QString& title ) +{ + RimWellLogTrack* plotTrack = RicNewWellLogPlotFeatureImpl::createWellLogPlotTrack( false, title, wellLogPlot ); + if ( eclipseCase ) plotTrack->setFormationCase( eclipseCase ); + if ( wellPath ) plotTrack->setFormationWellPath( wellPath ); + plotTrack->setColSpan( RimPlot::TWO ); + plotTrack->setLegendsVisible( true ); + plotTrack->setPlotTitleVisible( true ); + plotTrack->setShowWindow( true ); + plotTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR ); + plotTrack->setShowRegionLabels( true ); + plotTrack->setAutoScaleXEnabled( true ); + plotTrack->updateConnectedEditors(); + wellLogPlot->setShowWindow( true ); + wellLogPlot->updateConnectedEditors(); + + RiaApplication::instance()->project()->updateConnectedEditors(); + + wellLogPlot->loadDataAndUpdate(); + return plotTrack; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcWellLogPlot_newWellLogTrack::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcWellLogPlot_newWellLogTrack::defaultResult() const +{ + return std::unique_ptr( new RimWellLogTrack ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.h new file mode 100644 index 0000000000..4c38a9da9b --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlot.h @@ -0,0 +1,56 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimWellLogPlot.h" + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" +#include "cafPdmPtrArrayField.h" +#include "cafPdmPtrField.h" + +class RimEclipseCase; +class RimWellPath; +class RimWellLogTrack; + +//================================================================================================== +/// +//================================================================================================== +class RimcWellLogPlot_newWellLogTrack : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcWellLogPlot_newWellLogTrack( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + + static RimWellLogTrack* createWellLogTrack( RimWellLogPlot* wellLogPlot, + RimEclipseCase* eclipseCase, + RimWellPath* wellPath, + const QString& title ); + +private: + caf::PdmField m_title; + caf::PdmPtrField m_case; + caf::PdmPtrField m_wellPath; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.cpp new file mode 100644 index 0000000000..0674410c58 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.cpp @@ -0,0 +1,103 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcWellLogPlotCollection.h" + +#include "RiaApplication.h" + +#include "RimcWellLogPlot.h" +#include "WellLogCommands/RicNewWellLogPlotFeatureImpl.h" + +#include "RimEclipseCase.h" +#include "RimProject.h" +#include "RimWellLogCurveCommonDataSource.h" +#include "RimWellLogExtractionCurve.h" +#include "RimWellLogPlot.h" +#include "RimWellLogPlotCollection.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellLogPlotCollection, RimcWellLogPlotCollection_newWellLogPlot, "NewWellLogPlot" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcWellLogPlotCollection_newWellLogPlot::RimcWellLogPlotCollection_newWellLogPlot( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create Well Log Plot", "", "", "Create a new well log plot" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_case, "Case", "", "", "", "Case" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_wellPath, "WellPath", "", "", "", "Well Path" ); + + CAF_PDM_InitScriptableFieldNoDefault( &m_propertyType, "PropertyType", "", "", "", "Property Type" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_propertyName, "PropertyName", "", "", "", "Property Name" ); + CAF_PDM_InitScriptableField( &m_timeStep, "TimeStep", 0, "", "", "", "Time Step" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcWellLogPlotCollection_newWellLogPlot::execute() +{ + RimWellLogPlot* newWellLogPlot = nullptr; + RimWellLogPlotCollection* wellLogPlotCollection = self(); + + if ( m_case && m_wellPath && wellLogPlotCollection ) + { + newWellLogPlot = createWellLogPlot( wellLogPlotCollection, m_wellPath, m_case ); + } + + return newWellLogPlot; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogPlot* RimcWellLogPlotCollection_newWellLogPlot::createWellLogPlot( RimWellLogPlotCollection* wellLogPlotCollection, + RimWellPath* wellPath, + RimEclipseCase* eclipseCase ) +{ + RimWellLogPlot* newWellLogPlot = new RimWellLogPlot; + newWellLogPlot->setAsPlotMdiWindow(); + + wellLogPlotCollection->addWellLogPlot( newWellLogPlot ); + + newWellLogPlot->commonDataSource()->setCaseToApply( eclipseCase ); + newWellLogPlot->commonDataSource()->setWellPathToApply( wellPath ); + newWellLogPlot->loadDataAndUpdate(); + newWellLogPlot->updateConnectedEditors(); + return newWellLogPlot; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcWellLogPlotCollection_newWellLogPlot::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcWellLogPlotCollection_newWellLogPlot::defaultResult() const +{ + return std::unique_ptr( new RimWellLogPlot ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.h new file mode 100644 index 0000000000..f31c3cc2c5 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogPlotCollection.h @@ -0,0 +1,55 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RimWellLogPlotCollection.h" + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" +#include "cafPdmPtrArrayField.h" +#include "cafPdmPtrField.h" + +class RimStimPlanModel; + +//================================================================================================== +/// +//================================================================================================== +class RimcWellLogPlotCollection_newWellLogPlot : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcWellLogPlotCollection_newWellLogPlot( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + + static RimWellLogPlot* createWellLogPlot( RimWellLogPlotCollection* wellLogPlotCollection, + RimWellPath* wellPath, + RimEclipseCase* eclipseCase ); + +private: + caf::PdmPtrField m_case; + caf::PdmPtrField m_wellPath; + caf::PdmField m_propertyType; + caf::PdmField m_propertyName; + caf::PdmField m_timeStep; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.cpp new file mode 100644 index 0000000000..61e2d26a81 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.cpp @@ -0,0 +1,131 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RimcWellLogTrack.h" + +#include "RiaApplication.h" +#include "RiaDefines.h" +#include "RiaResultNames.h" + +#include "WellLogCommands/RicNewWellLogPlotFeatureImpl.h" + +#include "RimEclipseCase.h" +#include "RimProject.h" +#include "RimWellLogCurveCommonDataSource.h" +#include "RimWellLogExtractionCurve.h" +#include "RimWellLogPlot.h" +#include "RimWellLogTrack.h" +#include "RimWellPath.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellLogTrack, RimcWellLogTrack_addExtractionCurve, "AddExtractionCurve" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcWellLogTrack_addExtractionCurve::RimcWellLogTrack_addExtractionCurve( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create Well Log Extraction Curve", "", "", "Create a well log extraction curve" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_case, "Case", "", "", "", "Case" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_wellPath, "WellPath", "", "", "", "Well Path" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_propertyType, "PropertyType", "", "", "", "Property Type" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_propertyName, "PropertyName", "", "", "", "Property Name" ); + CAF_PDM_InitScriptableField( &m_timeStep, "TimeStep", 0, "", "", "", "Time Step" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcWellLogTrack_addExtractionCurve::execute() +{ + RimWellLogTrack* wellLogTrack = self(); + + if ( m_case && m_wellPath && wellLogTrack ) + { + RiaDefines::ResultCatType resultCategoryType = caf::AppEnum::fromText( m_propertyType ); + + return addExtractionCurve( wellLogTrack, m_case, m_wellPath, m_propertyName, resultCategoryType, m_timeStep ); + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimWellLogExtractionCurve* + RimcWellLogTrack_addExtractionCurve::addExtractionCurve( RimWellLogTrack* wellLogTrack, + RimEclipseCase* eclipseCase, + RimWellPath* wellPath, + const QString& propertyName, + RiaDefines::ResultCatType resultCategoryType, + int timeStep ) +{ + RimWellLogExtractionCurve* curve = new RimWellLogExtractionCurve; + curve->setWellPath( wellPath ); + curve->setCase( eclipseCase ); + curve->setCurrentTimeStep( timeStep ); + + if ( resultCategoryType == RiaDefines::ResultCatType::FORMATION_NAMES ) + { + // The result name for formations is fragile. Always use the application result name for this + curve->setEclipseResultVariable( RiaResultNames::activeFormationNamesResultName() ); + } + else + { + curve->setEclipseResultVariable( propertyName ); + } + + curve->setEclipseResultCategory( resultCategoryType ); + + wellLogTrack->addCurve( curve ); + curve->loadDataAndUpdate( true ); + + curve->updateConnectedEditors(); + + wellLogTrack->setXAxisGridVisibility( RimWellLogPlot::AXIS_GRID_MAJOR ); + wellLogTrack->setShowRegionLabels( true ); + wellLogTrack->setAutoScaleXEnabled( true ); + wellLogTrack->updateConnectedEditors(); + wellLogTrack->setShowWindow( true ); + + RiaApplication::instance()->project()->updateConnectedEditors(); + + RimWellLogPlot* wellLogPlot = dynamic_cast( wellLogTrack->parentField() ); + if ( wellLogPlot ) wellLogPlot->loadDataAndUpdate(); + + return curve; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcWellLogTrack_addExtractionCurve::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcWellLogTrack_addExtractionCurve::defaultResult() const +{ + return std::unique_ptr( new RimWellLogExtractionCurve ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.h new file mode 100644 index 0000000000..b7cead3bee --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellLogTrack.h @@ -0,0 +1,61 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" +#include "cafPdmPtrArrayField.h" +#include "cafPdmPtrField.h" + +class RimEclipseCase; +class RimWellPath; +class RimWellLogTrack; +class RimWellLogExtractionCurve; + +//================================================================================================== +/// +//================================================================================================== +class RimcWellLogTrack_addExtractionCurve : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcWellLogTrack_addExtractionCurve( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + + static RimWellLogExtractionCurve* addExtractionCurve( RimWellLogTrack* wellLogTrack, + RimEclipseCase* eclipseCase, + RimWellPath* wellPath, + const QString& propertyName, + RiaDefines::ResultCatType resultCategoryType, + int timeStep ); + +private: + caf::PdmPtrField m_case; + caf::PdmPtrField m_wellPath; + caf::PdmField m_propertyType; + caf::PdmField m_propertyName; + caf::PdmField m_timeStep; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp new file mode 100644 index 0000000000..190203bc1f --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.cpp @@ -0,0 +1,77 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimcWellPath.h" + +#include "RimStimPlanFractureTemplate.h" +#include "RimWellPath.h" +#include "RimWellPathFracture.h" + +#include "FractureCommands/RicNewWellPathFractureFeature.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellPath, RimcWellPath_addFracture, "AddFracture" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcWellPath_addFracture::RimcWellPath_addFracture( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Add StimPlan Fracture", "", "", "Add StimPlan Fracture" ); + + CAF_PDM_InitScriptableField( &m_md, "MeasuredDepth", 0.0, "Measured Depth", "", "", "" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_stimPlanFractureTemplate, + "StimPlanFractureTemplate", + "", + "", + "", + "StimPlan Fracture Template" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcWellPath_addFracture::execute() +{ + auto wellPath = self(); + + RimWellPathFracture* wellPathFracture = RicNewWellPathFractureFeature::addFracture( wellPath, m_md() ); + + if ( m_stimPlanFractureTemplate ) wellPathFracture->setFractureTemplate( m_stimPlanFractureTemplate() ); + + return wellPathFracture; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcWellPath_addFracture::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcWellPath_addFracture::defaultResult() const +{ + return std::unique_ptr( new RimWellPathFracture ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h new file mode 100644 index 0000000000..2080d3c161 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPath.h @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" +#include "cafPdmPtrField.h" + +#include + +class RimStimPlanFractureTemplate; + +//================================================================================================== +/// +//================================================================================================== +class RimcWellPath_addFracture : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcWellPath_addFracture( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_md; + caf::PdmPtrField m_stimPlanFractureTemplate; +}; diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.cpp b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.cpp new file mode 100644 index 0000000000..98db4c9822 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.cpp @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RimcWellPathGeometryDef.h" + +#include "RimModeledWellPath.h" +#include "RimWellPathCollection.h" +#include "RimWellPathGeometryDef.h" +#include "RimWellPathTarget.h" + +#include "cafPdmAbstractFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapability.h" +#include "cafPdmFieldScriptingCapabilityCvfVec3d.h" + +CAF_PDM_OBJECT_METHOD_SOURCE_INIT( RimWellPathGeometryDef, + RimcRimWellPathGeometryDef_appendNewWellTarget, + "AppendWellTarget" ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RimcRimWellPathGeometryDef_appendNewWellTarget::RimcRimWellPathGeometryDef_appendNewWellTarget( caf::PdmObjectHandle* self ) + : caf::PdmObjectMethod( self ) +{ + CAF_PDM_InitObject( "Create and Add New Well Target", "", "", "Create and Add New Well Target" ); + CAF_PDM_InitScriptableFieldNoDefault( &m_coordinate, "Coordinate", "", "", "", "Coordinate" ); + CAF_PDM_InitScriptableField( &m_isAbsolute, "Absolute", false, "", "", "", "Relative or Absolute Coordinate" ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmObjectHandle* RimcRimWellPathGeometryDef_appendNewWellTarget::execute() +{ + auto geoDef = self(); + + cvf::Vec3d relativeTargetPoint = m_coordinate(); + relativeTargetPoint.z() = -relativeTargetPoint.z(); + if ( m_isAbsolute ) + { + cvf::Vec3d referencePoint = geoDef->anchorPointXyz(); + relativeTargetPoint -= referencePoint; + } + + auto newTarget = new RimWellPathTarget; + newTarget->setAsPointTargetXYD( + cvf::Vec3d( relativeTargetPoint.x(), relativeTargetPoint.y(), -relativeTargetPoint.z() ) ); + geoDef->insertTarget( nullptr, newTarget ); + + geoDef->updateConnectedEditors(); + geoDef->updateWellPathVisualization( false ); + + return newTarget; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RimcRimWellPathGeometryDef_appendNewWellTarget::resultIsPersistent() const +{ + return true; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::unique_ptr RimcRimWellPathGeometryDef_appendNewWellTarget::defaultResult() const +{ + return std::unique_ptr( new RimWellPathTarget ); +} diff --git a/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.h b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.h new file mode 100644 index 0000000000..b22ad820e0 --- /dev/null +++ b/ApplicationLibCode/ProjectDataModelCommands/RimcWellPathGeometryDef.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "cafPdmField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmObjectMethod.h" + +#include "cvfVector3.h" + +#include + +//================================================================================================== +/// +//================================================================================================== +class RimcRimWellPathGeometryDef_appendNewWellTarget : public caf::PdmObjectMethod +{ + CAF_PDM_HEADER_INIT; + +public: + RimcRimWellPathGeometryDef_appendNewWellTarget( caf::PdmObjectHandle* self ); + + caf::PdmObjectHandle* execute() override; + bool resultIsPersistent() const override; + std::unique_ptr defaultResult() const override; + +private: + caf::PdmField m_coordinate; + caf::PdmField m_isAbsolute; +}; diff --git a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake index 1b23d6c9ca..86ebebf947 100644 --- a/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/CMakeLists_files.cmake @@ -1,186 +1,192 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo.h -${CMAKE_CURRENT_LIST_DIR}/RigCell.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseCaseData.h -${CMAKE_CURRENT_LIST_DIR}/RigGridBase.h -${CMAKE_CURRENT_LIST_DIR}/RigGridManager.h -${CMAKE_CURRENT_LIST_DIR}/RigResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigResultAccessorFactory.h -${CMAKE_CURRENT_LIST_DIR}/RigAllGridCellsResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigActiveCellsResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigCellEdgeResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h -${CMAKE_CURRENT_LIST_DIR}/RigCombTransResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigCombMultResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigResultModifier.h -${CMAKE_CURRENT_LIST_DIR}/RigResultModifierFactory.h -${CMAKE_CURRENT_LIST_DIR}/RigFormationNames.h -${CMAKE_CURRENT_LIST_DIR}/RigAllanDiagramData.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultAddress.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResults.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultFrames.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagSolverInterface.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagInterfaceTools.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagVisibleCellsStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigAccWellFlowCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseWellLogExtractor.h -${CMAKE_CURRENT_LIST_DIR}/RigLocalGrid.h -${CMAKE_CURRENT_LIST_DIR}/RigMainGrid.h -${CMAKE_CURRENT_LIST_DIR}/RigReservoirBuilderMock.h -${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultsData.h -${CMAKE_CURRENT_LIST_DIR}/RigSimWellData.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPath.h -${CMAKE_CURRENT_LIST_DIR}/RigFault.h -${CMAKE_CURRENT_LIST_DIR}/RigNNCData.h -${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.h -${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.inl -${CMAKE_CURRENT_LIST_DIR}/RigPipeInCellEvaluator.h -${CMAKE_CURRENT_LIST_DIR}/RigTernaryResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeVisibleCellsStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseMultiPropertyStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData.h -${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractionTools.h -${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools.h -${CMAKE_CURRENT_LIST_DIR}/RigTimeHistoryResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RigLasFileExporter.h -${CMAKE_CURRENT_LIST_DIR}/RigSimulationWellCoordsAndMD.h -${CMAKE_CURRENT_LIST_DIR}/RigFishbonesGeometry.h -${CMAKE_CURRENT_LIST_DIR}/RigTesselatorTools.h -${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultInfo.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultAddress.h -${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigTofWellDistributionCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityEquations.h -${CMAKE_CURRENT_LIST_DIR}/RigNumberOfFloodedPoreVolumesCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPathFormations.h -${CMAKE_CURRENT_LIST_DIR}/RigStimPlanFractureDefinition.h -${CMAKE_CURRENT_LIST_DIR}/RigFractureGrid.h -${CMAKE_CURRENT_LIST_DIR}/RigFractureCell.h -${CMAKE_CURRENT_LIST_DIR}/RigWellResultPoint.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter.h -${CMAKE_CURRENT_LIST_DIR}/RigSurface.h -${CMAKE_CURRENT_LIST_DIR}/RigCaseRealizationParameters.h -${CMAKE_CURRENT_LIST_DIR}/RigGeoMechBoreHoleStressCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigPolyLinesData.h -${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigGridCrossPlotCurveGrouping.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseCrossPlotDataExtractor.h -${CMAKE_CURRENT_LIST_DIR}/RigEquil.h -${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.h -${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.h -${CMAKE_CURRENT_LIST_DIR}/RigNncConnection.h -${CMAKE_CURRENT_LIST_DIR}/RigWellDiskData.h -${CMAKE_CURRENT_LIST_DIR}/RigGocadData.h -${CMAKE_CURRENT_LIST_DIR}/RigElasticProperties.h -${CMAKE_CURRENT_LIST_DIR}/RigEnsembleFractureStatisticsCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigHistogramData.h -${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.h -${CMAKE_CURRENT_LIST_DIR}/RigTracer.h -${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.h -${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RigCell.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseCaseData.h + ${CMAKE_CURRENT_LIST_DIR}/RigGridBase.h + ${CMAKE_CURRENT_LIST_DIR}/RigGridManager.h + ${CMAKE_CURRENT_LIST_DIR}/RigResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigResultAccessorFactory.h + ${CMAKE_CURRENT_LIST_DIR}/RigAllGridCellsResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigActiveCellsResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigCellEdgeResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigCombTransResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigCombMultResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigResultModifier.h + ${CMAKE_CURRENT_LIST_DIR}/RigResultModifierFactory.h + ${CMAKE_CURRENT_LIST_DIR}/RigFormationNames.h + ${CMAKE_CURRENT_LIST_DIR}/RigAllanDiagramData.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultAddress.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResults.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultFrames.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagSolverInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagInterfaceTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagVisibleCellsStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigAccWellFlowCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseWellLogExtractor.h + ${CMAKE_CURRENT_LIST_DIR}/RigLocalGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RigMainGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RigReservoirBuilderMock.h + ${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultsData.h + ${CMAKE_CURRENT_LIST_DIR}/RigSimWellData.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPath.h + ${CMAKE_CURRENT_LIST_DIR}/RigFault.h + ${CMAKE_CURRENT_LIST_DIR}/RigNNCData.h + ${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.h + ${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.inl + ${CMAKE_CURRENT_LIST_DIR}/RigPipeInCellEvaluator.h + ${CMAKE_CURRENT_LIST_DIR}/RigTernaryResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeVisibleCellsStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseMultiPropertyStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigTimeHistoryResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RigLasFileExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RigSimulationWellCoordsAndMD.h + ${CMAKE_CURRENT_LIST_DIR}/RigFishbonesGeometry.h + ${CMAKE_CURRENT_LIST_DIR}/RigTesselatorTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultAddress.h + ${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigTofWellDistributionCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityEquations.h + ${CMAKE_CURRENT_LIST_DIR}/RigNumberOfFloodedPoreVolumesCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathFormations.h + ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanFractureDefinition.h + ${CMAKE_CURRENT_LIST_DIR}/RigFractureGrid.h + ${CMAKE_CURRENT_LIST_DIR}/RigFractureCell.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellResultPoint.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter.h + ${CMAKE_CURRENT_LIST_DIR}/RigSurface.h + ${CMAKE_CURRENT_LIST_DIR}/RigCaseRealizationParameters.h + ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechBoreHoleStressCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigPolyLinesData.h + ${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigGridCrossPlotCurveGrouping.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseCrossPlotDataExtractor.h + ${CMAKE_CURRENT_LIST_DIR}/RigEquil.h + ${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.h + ${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigNncConnection.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellDiskData.h + ${CMAKE_CURRENT_LIST_DIR}/RigGocadData.h + ${CMAKE_CURRENT_LIST_DIR}/RigElasticProperties.h + ${CMAKE_CURRENT_LIST_DIR}/RigEnsembleFractureStatisticsCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigHistogramData.h + ${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.h + ${CMAKE_CURRENT_LIST_DIR}/RigTracer.h + ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.h + ${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.h + ${CMAKE_CURRENT_LIST_DIR}/RigEnsembleParameter.h + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceResampler.h + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceStatisticsCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogIndexDepthOffset.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCell.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseCaseData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigGridBase.cpp -${CMAKE_CURRENT_LIST_DIR}/RigGridManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RigResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigResultAccessorFactory.cpp -${CMAKE_CURRENT_LIST_DIR}/RigAllGridCellsResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigActiveCellsResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCellEdgeResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCombTransResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCombMultResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigResultModifierFactory.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFormationNames.cpp -${CMAKE_CURRENT_LIST_DIR}/RigAllanDiagramData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultAddress.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResults.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultFrames.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagSolverInterface.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagVisibleCellsStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigAccWellFlowCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseWellLogExtractor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigLocalGrid.cpp -${CMAKE_CURRENT_LIST_DIR}/RigMainGrid.cpp -${CMAKE_CURRENT_LIST_DIR}/RigReservoirBuilderMock.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultsData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigSimWellData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPath.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFault.cpp -${CMAKE_CURRENT_LIST_DIR}/RigNNCData.cpp -${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTernaryResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeVisibleCellsStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseMultiPropertyStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTimeHistoryResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigLasFileExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RigSimulationWellCoordsAndMD.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFishbonesGeometry.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTesselatorTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTofWellDistributionCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityEquations.cpp -${CMAKE_CURRENT_LIST_DIR}/RigNumberOfFloodedPoreVolumesCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathFormations.cpp -${CMAKE_CURRENT_LIST_DIR}/RigStimPlanFractureDefinition.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFractureGrid.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFractureCell.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellResultPoint.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter.cpp -${CMAKE_CURRENT_LIST_DIR}/RigSurface.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCaseRealizationParameters.cpp -${CMAKE_CURRENT_LIST_DIR}/RigGeoMechBoreHoleStressCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigPolyLinesData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseCrossPlotDataExtractor.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEquil.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigNncConnection.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellDiskData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigGocadData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigElasticProperties.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEnsembleFractureStatisticsCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigHistogramData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTracer.cpp -${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCell.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseCaseData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigGridBase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigGridManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigResultAccessorFactory.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigAllGridCellsResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigActiveCellsResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCellEdgeResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCombTransResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCombMultResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigResultModifierFactory.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFormationNames.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigAllanDiagramData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultAddress.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResults.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagResultFrames.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagSolverInterface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFlowDiagVisibleCellsStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigAccWellFlowCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseWellLogExtractor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigLocalGrid.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigMainGrid.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigReservoirBuilderMock.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultsData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSimWellData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPath.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFault.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigNNCData.cpp + ${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTernaryResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseNativeVisibleCellsStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseMultiPropertyStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogCurveData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTimeHistoryResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigLasFileExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSimulationWellCoordsAndMD.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFishbonesGeometry.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTesselatorTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseResultInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTofWellDistributionCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityEquations.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigNumberOfFloodedPoreVolumesCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWeightedMeanCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathFormations.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanFractureDefinition.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFractureGrid.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFractureCell.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellResultPoint.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSurface.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCaseRealizationParameters.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechBoreHoleStressCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigPolyLinesData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCaseCellResultCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseCrossPlotDataExtractor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEquil.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWbsParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseAllanFaultsStatCalc.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCellFaceGeometryTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigNncConnection.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellDiskData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigGocadData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigElasticProperties.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEnsembleFractureStatisticsCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigHistogramData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigVisibleCategoriesCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTracerPoint.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTracer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigStimPlanModelTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSlice2D.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEnsembleParameter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceResampler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceStatisticsCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogIndexDepthOffset.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ReservoirDataModel" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ReservoirDataModel" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake b/ApplicationLibCode/ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake index 8de6209ac7..db93b2faa9 100644 --- a/ApplicationLibCode/ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake +++ b/ApplicationLibCode/ReservoirDataModel/CMakeLists_filesNotToUnitTest.cmake @@ -1,5 +1,4 @@ - -set (SOURCE_GROUP_HEADER_FILES +set(SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechWellLogExtractor.h ${CMAKE_CURRENT_LIST_DIR}/RigCaseToCaseCellMapper.h ${CMAKE_CURRENT_LIST_DIR}/RigCaseToCaseCellMapperTools.h @@ -9,7 +8,7 @@ set (SOURCE_GROUP_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RigReservoirGridTools.h ) -set (SOURCE_GROUP_SOURCE_FILES +set(SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigGeoMechWellLogExtractor.cpp ${CMAKE_CURRENT_LIST_DIR}/RigCaseToCaseCellMapper.cpp ${CMAKE_CURRENT_LIST_DIR}/RigCaseToCaseCellMapperTools.cpp @@ -19,12 +18,12 @@ set (SOURCE_GROUP_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RigReservoirGridTools.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ReservoirDataModel2" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_filesNotToUnitTest.cmake ) +source_group( + "ReservoirDataModel2" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_filesNotToUnitTest.cmake +) diff --git a/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake b/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake index 0f956a1c82..b4ba15d3d4 100644 --- a/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake +++ b/ApplicationLibCode/ReservoirDataModel/Completions/CMakeLists_files.cmake @@ -1,35 +1,33 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.h -${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.h -${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.h -${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.h -${CMAKE_CURRENT_LIST_DIR}/RigVirtualPerforationTransmissibilities.h -${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCalculator.h -${CMAKE_CURRENT_LIST_DIR}/RigPerforationTransmissibilityEquations.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.h + ${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.h + ${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.h + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.h + ${CMAKE_CURRENT_LIST_DIR}/RigVirtualPerforationTransmissibilities.h + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCalculator.h + ${CMAKE_CURRENT_LIST_DIR}/RigPerforationTransmissibilityEquations.h ) - -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.cpp -${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.cpp -${CMAKE_CURRENT_LIST_DIR}/RigVirtualPerforationTransmissibilities.cpp -${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCalculator.cpp -${CMAKE_CURRENT_LIST_DIR}/RigPerforationTransmissibilityEquations.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RigCompletionData.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCompletionDataGridCell.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCellTransmissibilityCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigFractureTransmissibilityEquations.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathStimplanIntersector.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigVirtualPerforationTransmissibilities.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigEclipseToStimPlanCalculator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigPerforationTransmissibilityEquations.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "ReservoirDataModel\\Completions" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "ReservoirDataModel\\Completions" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp index de37a8010c..f6cd7c597d 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigActiveCellInfo.cpp @@ -94,12 +94,10 @@ void RigActiveCellInfo::setCellResultIndex( size_t reservoirCellIndex, size_t re m_cellIndexToResultIndex[reservoirCellIndex] = reservoirCellResultIndex; -#pragma omp critical + if ( reservoirCellResultIndex >= m_reservoirCellResultCount ) { - if ( reservoirCellResultIndex >= m_reservoirCellResultCount ) - { - m_reservoirCellResultCount = reservoirCellResultIndex + 1; - } +#pragma omp critical + m_reservoirCellResultCount = reservoirCellResultIndex + 1; } } diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp index 853d4ad981..5857f71402 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.cpp @@ -24,6 +24,7 @@ #include "RiaEclipseUnitTools.h" #include "RiaLogging.h" +#include "RiaResultNames.h" #include "RigAllanDiagramData.h" #include "RigCaseCellResultCalculator.h" #include "RigEclipseCaseData.h" @@ -519,7 +520,6 @@ const RigActiveCellInfo* RigCaseCellResultsData::activeCellInfo() const void RigCaseCellResultsData::recalculateStatistics( const RigEclipseResultAddress& resVarAddr ) { size_t scalarResultIndex = findScalarResultIndexFromAddress( resVarAddr ); - CVF_TIGHT_ASSERT( scalarResultIndex < m_cellScalarResults.size() ); if ( scalarResultIndex < m_cellScalarResults.size() ) { m_statisticsDataCache[scalarResultIndex]->clearAllStatistics(); @@ -1098,6 +1098,13 @@ void RigCaseCellResultsData::createPlaceholderResultEntries() addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::mobilePoreVolumeName(), false, 0 ); } } + + // I/J/K indexes + { + addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexIResultName(), false, 0 ); + addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexJResultName(), false, 0 ); + addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, RiaResultNames::indexKResultName(), false, 0 ); + } } //-------------------------------------------------------------------------------------------------- @@ -1308,6 +1315,11 @@ size_t RigCaseCellResultsData::findOrLoadKnownScalarResult( const RigEclipseResu } computeAllanResults( this, m_ownerMainGrid, includeInactiveCells ); } + else if ( resultName == RiaResultNames::indexIResultName() || + resultName == RiaResultNames::indexJResultName() || resultName == RiaResultNames::indexKResultName() ) + { + computeIndexResults(); + } } else if ( type == RiaDefines::ResultCatType::DYNAMIC_NATIVE ) { @@ -1987,6 +1999,116 @@ void RigCaseCellResultsData::computeDepthRelatedResults() } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigCaseCellResultsData::computeIndexResults() +{ + size_t reservoirCellCount = activeCellInfo()->reservoirCellCount(); + if ( reservoirCellCount == 0 ) return; + + size_t iResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexIResultName() ), + false ); + size_t jResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexJResultName() ), + false ); + size_t kResultIndex = findOrCreateScalarResultIndex( RigEclipseResultAddress( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexKResultName() ), + false ); + + bool computeIndexI = false; + bool computeIndexJ = false; + bool computeIndexK = false; + + if ( iResultIndex == cvf::UNDEFINED_SIZE_T ) + { + iResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexIResultName(), + false, + reservoirCellCount ); + computeIndexI = true; + } + + if ( jResultIndex == cvf::UNDEFINED_SIZE_T ) + { + jResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexJResultName(), + false, + reservoirCellCount ); + computeIndexJ = true; + } + + if ( kResultIndex == cvf::UNDEFINED_SIZE_T ) + { + kResultIndex = this->addStaticScalarResult( RiaDefines::ResultCatType::STATIC_NATIVE, + RiaResultNames::indexKResultName(), + false, + reservoirCellCount ); + computeIndexK = true; + } + + std::vector>& indexI = m_cellScalarResults[iResultIndex]; + std::vector>& indexJ = m_cellScalarResults[jResultIndex]; + std::vector>& indexK = m_cellScalarResults[kResultIndex]; + + { + if ( indexI[0].size() < reservoirCellCount ) + { + indexI[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); + computeIndexI = true; + } + + if ( indexJ[0].size() < reservoirCellCount ) + { + indexJ[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); + computeIndexJ = true; + } + + if ( indexK[0].size() < reservoirCellCount ) + { + indexK[0].resize( reservoirCellCount, std::numeric_limits::infinity() ); + computeIndexK = true; + } + } + + const std::vector& globalCellArray = m_ownerMainGrid->globalCellArray(); + long long numCells = static_cast( globalCellArray.size() ); +#pragma omp for + for ( long long cellIdx = 0; cellIdx < numCells; cellIdx++ ) + { + const RigCell& cell = globalCellArray[cellIdx]; + + size_t resultIndex = cellIdx; + if ( resultIndex == cvf::UNDEFINED_SIZE_T ) continue; + + bool isTemporaryGrid = cell.hostGrid()->isTempGrid(); + + size_t gridLocalNativeCellIndex = cell.gridLocalCellIndex(); + RigGridBase* grid = cell.hostGrid(); + + size_t i, j, k; + if ( grid->ijkFromCellIndex( gridLocalNativeCellIndex, &i, &j, &k ) ) + { + // I/J/K is 1-indexed when shown to user, thus "+ 1" + if ( computeIndexI || isTemporaryGrid ) + { + indexI[0][resultIndex] = i + 1; + } + + if ( computeIndexJ || isTemporaryGrid ) + { + indexJ[0][resultIndex] = j + 1; + } + + if ( computeIndexK || isTemporaryGrid ) + { + indexK[0][resultIndex] = k + 1; + } + } + } +} + namespace RigTransmissibilityCalcTools { void calculateConnectionGeometry( const RigCell& c1, diff --git a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h index dc790c8c6d..4cb1a3efcb 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h +++ b/ApplicationLibCode/ReservoirDataModel/RigCaseCellResultsData.h @@ -188,6 +188,8 @@ class RigCaseCellResultsData : public cvf::Object void computeOilVolumes(); void computeMobilePV(); + void computeIndexResults(); + bool isDataPresent( size_t scalarResultIndex ) const; void assignValuesToTemporaryLgrs( const QString& resultName, std::vector& values ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp index c9b9ac3c22..6d3f60aef0 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.cpp @@ -115,6 +115,9 @@ void RigEclipseNativeVisibleCellsStatCalc::mobileVolumeWeightedMean( size_t time m_caseData->ensureKnownResultLoaded( mobPorvAddress ); + if ( !m_caseData->hasResultEntry( m_resultAddress ) ) return; + if ( m_caseData->timeStepCount( m_resultAddress ) == 0 ) return; + const std::vector& weights = m_caseData->cellScalarResults( mobPorvAddress, 0 ); const std::vector& values = m_caseData->cellScalarResults( m_resultAddress, timeStepIndex ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h index 4288421890..641e89b977 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h +++ b/ApplicationLibCode/ReservoirDataModel/RigEclipseNativeVisibleCellsStatCalc.h @@ -52,6 +52,9 @@ class RigEclipseNativeVisibleCellsStatCalc : public RigStatisticsCalculator template void traverseCells( StatisticsAccumulator& accumulator, size_t timeStepIndex ) { + if ( !m_caseData->hasResultEntry( m_resultAddress ) ) return; + if ( m_caseData->timeStepCount( m_resultAddress ) == 0 ) return; + size_t clampedTimeStepIndex = std::min( timeStepIndex, m_caseData->timeStepCount( m_resultAddress ) - 1 ); const std::vector& values = m_caseData->cellScalarResults( m_resultAddress, clampedTimeStepIndex ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp index 4d3d0666b9..2a2faf2873 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.cpp @@ -20,6 +20,7 @@ #include "RiaDefines.h" #include "RiaEclipseUnitTools.h" +#include "RiaNumberFormat.h" #include "RiaWeightedMeanCalculator.h" #include "RigFractureCell.h" @@ -61,41 +62,26 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( PropertyType propertyType, int numBins ) { - std::vector> defs = esf->readFractureDefinitions(); + std::vector> fractureDefinitions = esf->readFractureDefinitions(); - std::vector samples; - if ( propertyType == PropertyType::HEIGHT ) - { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateHeight ); - } - else if ( propertyType == PropertyType::AREA ) - { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateArea ); - } - else if ( propertyType == PropertyType::WIDTH ) - { - samples = - calculateAreaWeightedStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); - } - else if ( propertyType == PropertyType::PERMEABILITY ) - { - samples = - calculateAreaWeightedStatistics( defs, - &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedPermeability ); - } - else if ( propertyType == PropertyType::XF ) - { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateXf ); - } - else if ( propertyType == PropertyType::KFWF ) - { - samples = calculateGridStatistics( defs, &RigEnsembleFractureStatisticsCalculator::calculateKfWf ); - } - else if ( propertyType == PropertyType::FORMATION_DIP ) + if ( esf->excludeZeroWidthFractures() ) { - samples = calculateFormationDip( defs ); + fractureDefinitions = RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( fractureDefinitions ); } + return createStatisticsData( fractureDefinitions, propertyType, numBins ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( + const std::vector>& fractureDefinitions, + PropertyType propertyType, + int numBins ) +{ + std::vector samples = calculateProperty( fractureDefinitions, propertyType ); + RigHistogramData histogramData; double sum; @@ -111,7 +97,12 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( double p50; double mean; - RigStatisticsMath::calculateStatisticsCurves( samples, &histogramData.p10, &p50, &histogramData.p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( samples, + &histogramData.p10, + &p50, + &histogramData.p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); std::vector histogram; RigHistogramCalculator histogramCalculator( histogramData.min, histogramData.max, numBins, &histogram ); @@ -123,21 +114,64 @@ RigHistogramData RigEnsembleFractureStatisticsCalculator::createStatisticsData( return histogramData; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigEnsembleFractureStatisticsCalculator::calculateProperty( + const std::vector>& fractureDefinitions, + PropertyType propertyType ) +{ + std::vector samples; + if ( propertyType == PropertyType::HEIGHT ) + { + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateHeight ); + } + else if ( propertyType == PropertyType::AREA ) + { + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateArea ); + } + else if ( propertyType == PropertyType::WIDTH ) + { + samples = calculateAreaWeightedStatistics( fractureDefinitions, + &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); + } + else if ( propertyType == PropertyType::PERMEABILITY ) + { + samples = + calculateAreaWeightedStatistics( fractureDefinitions, + &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedPermeability ); + } + else if ( propertyType == PropertyType::XF ) + { + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateXf ); + } + else if ( propertyType == PropertyType::KFWF ) + { + samples = calculateGridStatistics( fractureDefinitions, &RigEnsembleFractureStatisticsCalculator::calculateKfWf ); + } + else if ( propertyType == PropertyType::FORMATION_DIP ) + { + samples = calculateFormationDip( fractureDefinitions ); + } + + return samples; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- std::vector RigEnsembleFractureStatisticsCalculator::calculateGridStatistics( - const std::vector>& defs, + const std::vector>& fractureDefinitions, double( func )( cvf::cref ) ) { std::vector samples; - if ( defs.empty() ) return samples; + if ( fractureDefinitions.empty() ) return samples; // TODO: heuristic to find conductivity name? - QString conductivityResultName = defs[0]->conductivityResultNames()[0]; + QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0]; std::vector> grids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, conductivityResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); @@ -225,24 +259,25 @@ double RigEnsembleFractureStatisticsCalculator::calculateKfWf( cvf::cref RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedStatistics( - const std::vector>& defs, + const std::vector>& fractureDefinitions, double( func )( cvf::cref, cvf::cref, RiaDefines::EclipseUnitSystem, const QString& ) ) { std::vector samples; - if ( defs.empty() ) return samples; + if ( fractureDefinitions.empty() ) return samples; // TODO: heuristic to find conductivity name? - QString conductivityResultName = defs[0]->conductivityResultNames()[0]; + QString conductivityResultName = fractureDefinitions[0]->conductivityResultNames()[0]; std::vector> grids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, conductivityResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); - auto [widthResultName, widthResultUnit] = RimStimPlanFractureTemplate::widthParameterNameAndUnit( defs[0] ); + auto [widthResultName, widthResultUnit] = + RimStimPlanFractureTemplate::widthParameterNameAndUnit( fractureDefinitions[0] ); std::vector> widthGrids = - RimEnsembleFractureStatistics::createFractureGrids( defs, + RimEnsembleFractureStatistics::createFractureGrids( fractureDefinitions, RiaDefines::EclipseUnitSystem::UNITS_METRIC, widthResultName, RimEnsembleFractureStatistics::MeshAlignmentType::PERFORATION_DEPTH ); @@ -337,12 +372,12 @@ double RigEnsembleFractureStatisticsCalculator::calculateXf( cvf::cref RigEnsembleFractureStatisticsCalculator::calculateFormationDip( - const std::vector>& defs ) + const std::vector>& fractureDefinitions ) { std::vector formationDips; - for ( auto def : defs ) + for ( auto fractureDefinition : fractureDefinitions ) { - formationDips.push_back( def->formationDip() ); + formationDips.push_back( fractureDefinition->formationDip() ); } return formationDips; @@ -365,3 +400,57 @@ double RigEnsembleFractureStatisticsCalculator::convertUnit( double } return value; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector> RigEnsembleFractureStatisticsCalculator::removeZeroWidthDefinitions( + const std::vector>& fractureDefinitions ) +{ + std::vector samples = + calculateAreaWeightedStatistics( fractureDefinitions, + &RigEnsembleFractureStatisticsCalculator::calculateAreaWeightedWidth ); + + std::vector> filteredFractureDefinitions; + + int index = 0; + for ( double sample : samples ) + { + if ( sample > 0.0 ) + { + filteredFractureDefinitions.push_back( fractureDefinitions[index] ); + } + index++; + } + + return filteredFractureDefinitions; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigEnsembleFractureStatisticsCalculator::propertyTypes() +{ + std::vector types = { + RigEnsembleFractureStatisticsCalculator::PropertyType::HEIGHT, + RigEnsembleFractureStatisticsCalculator::PropertyType::XF, + RigEnsembleFractureStatisticsCalculator::PropertyType::AREA, + RigEnsembleFractureStatisticsCalculator::PropertyType::PERMEABILITY, + RigEnsembleFractureStatisticsCalculator::PropertyType::WIDTH, + RigEnsembleFractureStatisticsCalculator::PropertyType::KFWF, + RigEnsembleFractureStatisticsCalculator::PropertyType::FORMATION_DIP, + }; + return types; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RigEnsembleFractureStatisticsCalculator::numberFormatForProperty( PropertyType propertyType ) +{ + if ( propertyType == PropertyType::WIDTH ) + return std::make_pair( RiaNumberFormat::NumberFormatType::FIXED, 4 ); + else + return std::make_pair( RiaNumberFormat::NumberFormatType::FIXED, 1 ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h index 9972d7839d..dad82aa9f5 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleFractureStatisticsCalculator.h @@ -20,6 +20,7 @@ #include "RiaDefines.h" +#include "RiaNumberFormat.h" #include "RigHistogramData.h" #include "cvfObject.h" @@ -52,18 +53,36 @@ class RigEnsembleFractureStatisticsCalculator static RigHistogramData createStatisticsData( const RimEnsembleFractureStatistics* esf, PropertyType propertyType, int numBins ); + static RigHistogramData + createStatisticsData( const std::vector>& fractureDefinitions, + PropertyType propertyType, + int numBins ); + + static std::vector> + removeZeroWidthDefinitions( const std::vector>& fractureDefinitions ); + + static std::vector + calculateProperty( const std::vector>& fractureDefinitions, + PropertyType propertyType ); + + static std::vector propertyTypes(); + + static std::pair numberFormatForProperty( PropertyType propertyType ); + private: - static std::vector calculateGridStatistics( const std::vector>& defs, - double( func )( cvf::cref ) ); + static std::vector + calculateGridStatistics( const std::vector>& fractureDefinitions, + double( func )( cvf::cref ) ); static std::vector - calculateAreaWeightedStatistics( const std::vector>& defs, + calculateAreaWeightedStatistics( const std::vector>& fractureDefinitions, double( func )( cvf::cref, cvf::cref, RiaDefines::EclipseUnitSystem, const QString& ) ); - static std::vector calculateFormationDip( const std::vector>& defs ); + static std::vector + calculateFormationDip( const std::vector>& fractureDefinitions ); static double calculateHeight( cvf::cref fractureGrid ); static double calculateArea( cvf::cref fractureGrid ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp new file mode 100644 index 0000000000..ade8d3bcfc --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.cpp @@ -0,0 +1,108 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2017- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigEnsembleParameter.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigEnsembleParameter::stdDeviation() const +{ + double N = static_cast( values.size() ); + if ( N > 1 && isNumeric() ) + { + double sumValues = 0.0; + double sumValuesSquared = 0.0; + for ( const QVariant& variant : values ) + { + double value = variant.toDouble(); + sumValues += value; + sumValuesSquared += value * value; + } + + return std::sqrt( ( N * sumValuesSquared - sumValues * sumValues ) / ( N * ( N - 1.0 ) ) ); + } + return 0.0; +} + +//-------------------------------------------------------------------------------------------------- +/// Standard deviation normalized by max absolute value of min/max values. +/// Produces values between 0.0 and sqrt(2.0). +//-------------------------------------------------------------------------------------------------- +double RigEnsembleParameter::normalizedStdDeviation() const +{ + const double eps = 1.0e-4; + + double maxAbs = std::max( std::fabs( maxValue ), std::fabs( minValue ) ); + if ( maxAbs < eps ) + { + return 0.0; + } + + double normalisedStdDev = stdDeviation() / maxAbs; + if ( normalisedStdDev < eps ) + { + return 0.0; + } + return normalisedStdDev; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigEnsembleParameter::operator<( const RigEnsembleParameter& other ) const +{ + if ( this->variationBin != other.variationBin ) + { + return this->variationBin > other.variationBin; // Larger first + } + + return this->name < other.name; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString RigEnsembleParameter::uiName() const +{ + QString stem = name; + QString variationString; + if ( isNumeric() ) + { + switch ( variationBin ) + { + case NO_VARIATION: + variationString = QString( " (No variation)" ); + break; + case LOW_VARIATION: + variationString = QString( " (Low variation)" ); + break; + case MEDIUM_VARIATION: + variationString = QString( " (Medium variation)" ); + break; + case HIGH_VARIATION: + variationString = QString( " (High variation)" ); + break; + } + } + + return QString( "%1%2" ).arg( stem ).arg( variationString ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h new file mode 100644 index 0000000000..ac847bb8b5 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigEnsembleParameter.h @@ -0,0 +1,74 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2016- Statoil ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RiaDefines.h" + +#include +#include + +#include +#include + +//================================================================================================== +/// +//================================================================================================== +class RigEnsembleParameter +{ +public: + enum Type + { + TYPE_NONE, + TYPE_NUMERIC, + TYPE_TEXT + }; + enum Bins + { + NO_VARIATION = -1, + LOW_VARIATION = 0, + MEDIUM_VARIATION, + HIGH_VARIATION, + NR_OF_VARIATION_BINS + }; + QString uiName() const; + QString name; + Type type; + std::vector values; + double minValue; + double maxValue; + int variationBin; + + RigEnsembleParameter() + : type( TYPE_NONE ) + , minValue( std::numeric_limits::infinity() ) + , maxValue( -std::numeric_limits::infinity() ) + , variationBin( static_cast( MEDIUM_VARIATION ) ) + { + } + + bool isValid() const { return !name.isEmpty() && type != TYPE_NONE; } + bool isNumeric() const { return type == TYPE_NUMERIC; } + bool isText() const { return type == TYPE_TEXT; } + double normalizedStdDeviation() const; + + bool operator<( const RigEnsembleParameter& other ) const; + +private: + double stdDeviation() const; +}; diff --git a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp index 85b20e8eda..e3ebbb1781 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFlowDiagSolverInterface.cpp @@ -121,13 +121,13 @@ class RigOpmFlowDiagStaticData : public cvf::Object { Opm::ECLInitFileData initData( init ); - m_eclGraph.reset( new Opm::ECLGraph( Opm::ECLGraph::load( mainGrid, initData ) ) ); - - m_hasUnifiedRestartFile = false; - m_poreVolume = m_eclGraph->poreVolume(); - try { + m_eclGraph.reset( new Opm::ECLGraph( Opm::ECLGraph::load( mainGrid, initData ) ) ); + + m_hasUnifiedRestartFile = false; + m_poreVolume = m_eclGraph->poreVolume(); + m_eclSaturationFunc.reset( new Opm::ECLSaturationFunc( *m_eclGraph, initData ) ); } catch ( ... ) diff --git a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp index 8776aae6f4..47e494ea01 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.cpp @@ -20,6 +20,8 @@ #include "RiaLogging.h" +#include "cvfGeometryTools.h" + #include //-------------------------------------------------------------------------------------------------- @@ -107,3 +109,11 @@ double RigFractureCell::area() const { return cellSizeX() * cellSizeZ(); } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::Vec3d RigFractureCell::centerPosition() const +{ + return cvf::GeometryTools::computePolygonCenter( m_polygon ); +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.h b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.h index de3558c849..be642e25d7 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFractureCell.h +++ b/ApplicationLibCode/ReservoirDataModel/RigFractureCell.h @@ -43,6 +43,8 @@ class RigFractureCell double cellSizeZ() const; double area() const; + cvf::Vec3d centerPosition() const; + private: std::vector m_polygon; double m_conductivityValue; diff --git a/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.cpp b/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.cpp index f3fa79d41d..cf6b1362a0 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.cpp @@ -20,6 +20,9 @@ #include "RiaLogging.h" +#include "cvfBoundingBox.h" +#include "cvfBoundingBoxTree.h" + #include //-------------------------------------------------------------------------------------------------- @@ -122,3 +125,54 @@ std::pair RigFractureGrid::fractureCellAtWellCenter() const { return m_wellCenterFractureCellIJ; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigFractureGrid::ensureCellSearchTreeIsBuilt() +{ + if ( m_cellBoundingBoxTree.isNull() ) + { + size_t itemCount = m_fractureCells.size(); + + std::vector cellBoundingBoxes( itemCount ); + std::vector boundingBoxIds( itemCount ); + + for ( size_t idx = 0; idx < itemCount; ++idx ) + { + const RigFractureCell& cell = m_fractureCells[idx]; + cvf::BoundingBox& cellBB = cellBoundingBoxes[idx]; + const std::vector& corners = cell.getPolygon(); + for ( auto c : corners ) + cellBB.add( c ); + + boundingBoxIds[idx] = idx; + } + + m_cellBoundingBoxTree = new cvf::BoundingBoxTree; + m_cellBoundingBoxTree->buildTreeFromBoundingBoxes( cellBoundingBoxes, &boundingBoxIds ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +const RigFractureCell* RigFractureGrid::getCellFromPosition( const cvf::Vec3d& position ) const +{ + cvf::BoundingBox inputBB; + inputBB.add( position ); + + std::vector indexes; + m_cellBoundingBoxTree->findIntersections( inputBB, &indexes ); + + if ( !indexes.empty() ) + { + // Hit: should only one cell since they have no overlap + return &m_fractureCells[indexes[0]]; + } + else + { + // No hit + return nullptr; + } +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.h b/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.h index 526ec80957..655ac88f1b 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.h +++ b/ApplicationLibCode/ReservoirDataModel/RigFractureGrid.h @@ -23,6 +23,12 @@ #include +namespace cvf +{ +class BoundingBox; +class BoundingBoxTree; +} // namespace cvf + class RigFractureCell; //================================================================================================== @@ -47,9 +53,14 @@ class RigFractureGrid : public cvf::Object std::pair fractureCellAtWellCenter() const; + const RigFractureCell* getCellFromPosition( const cvf::Vec3d& position ) const; + void ensureCellSearchTreeIsBuilt(); + private: std::vector m_fractureCells; std::pair m_wellCenterFractureCellIJ; size_t m_iCellCount; size_t m_jCellCount; + + cvf::ref m_cellBoundingBoxTree; }; diff --git a/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp b/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp index ccef694bd5..355f8dae08 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigStimPlanFractureDefinition.cpp @@ -464,11 +464,7 @@ cvf::cref { if ( cellPolygon[1].y() >= 0.0 && cellPolygon[2].y() <= 0.0 ) { - wellCenterStimPlanCellIJ = std::make_pair( stimPlanCell.getI(), stimPlanCell.getJ() ); - RiaLogging::debug( - QString( "Setting wellCenterStimPlanCell at cell %1, %2" ) - .arg( QString::number( stimPlanCell.getI() ), QString::number( stimPlanCell.getJ() ) ) ); - + wellCenterStimPlanCellIJ = std::make_pair( stimPlanCell.getI(), stimPlanCell.getJ() ); wellCenterStimPlanCellFound = true; } } @@ -487,6 +483,7 @@ cvf::cref fractureGrid->setWellCenterFractureCellIJ( wellCenterStimPlanCellIJ ); fractureGrid->setICellCount( this->m_Xs.size() - 2 ); fractureGrid->setJCellCount( this->m_Ys.size() - 2 ); + fractureGrid->ensureCellSearchTreeIsBuilt(); return cvf::cref( fractureGrid.p() ); } diff --git a/ApplicationLibCode/ReservoirDataModel/RigStimPlanModelTools.cpp b/ApplicationLibCode/ReservoirDataModel/RigStimPlanModelTools.cpp index 479d8fbdd0..9e20662f97 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigStimPlanModelTools.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigStimPlanModelTools.cpp @@ -88,6 +88,10 @@ cvf::Vec3d RigStimPlanModelTools::calculateTSTDirection( RigEclipseCaseData* ecl direction *= -1.0; } + // Calculate an adjusted TST direction to improve the zone thickness in the well log plot. + // Using average of TST and TVD (default direction) in 3D. + direction = ( direction + defaultDirection ) / 2.0; + return direction; } diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurface.cpp b/ApplicationLibCode/ReservoirDataModel/RigSurface.cpp index fcce78b08f..1ca3c64758 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigSurface.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigSurface.cpp @@ -15,26 +15,27 @@ // for more details. // ///////////////////////////////////////////////////////////////////////////////// + #include "RigSurface.h" +#include "cafAssert.h" +#include "cvfBoundingBox.h" +#include "cvfBoundingBoxTree.h" + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RigSurface::RigSurface() -{ -} +RigSurface::RigSurface() = default; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -RigSurface::~RigSurface() -{ -} +RigSurface::~RigSurface() = default; //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const std::vector& RigSurface::triangleIndices() +const std::vector& RigSurface::triangleIndices() const { return m_triangleIndices; } @@ -42,7 +43,7 @@ const std::vector& RigSurface::triangleIndices() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -const std::vector& RigSurface::vertices() +const std::vector& RigSurface::vertices() const { return m_vertices; } @@ -92,3 +93,75 @@ std::vector RigSurface::propertyNames() const return names; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigSurface::findIntersectingTriangles( const cvf::BoundingBox& inputBB, std::vector* triangleStartIndices ) const +{ + CAF_ASSERT( m_surfaceBoundingBoxTree.notNull() ); + + m_surfaceBoundingBoxTree->findIntersections( inputBB, triangleStartIndices ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigSurface::maxExtentTriangleInXDirection() const +{ + return m_maxExtentTriangleInXDirection; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigSurface::maxExtentTriangleInYDirection() const +{ + return m_maxExtentTriangleInYDirection; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigSurface::ensureIntersectionSearchTreeIsBuilt() +{ + if ( m_surfaceBoundingBoxTree.isNull() ) + { + size_t itemCount = triangleCount(); + + std::vector cellBoundingBoxes; + std::vector boundingBoxIds; + cellBoundingBoxes.resize( itemCount ); + boundingBoxIds.resize( itemCount ); + + double maxX = -1.0; + double maxY = -1.0; + + for ( size_t triangleIdx = 0; triangleIdx < itemCount; ++triangleIdx ) + { + cvf::BoundingBox& cellBB = cellBoundingBoxes[triangleIdx]; + cellBB.add( m_vertices[m_triangleIndices[triangleIdx * 3 + 0]] ); + cellBB.add( m_vertices[m_triangleIndices[triangleIdx * 3 + 1]] ); + cellBB.add( m_vertices[m_triangleIndices[triangleIdx * 3 + 2]] ); + + boundingBoxIds[triangleIdx] = triangleIdx * 3; + + if ( cellBB.extent().x() > maxX ) maxX = cellBB.extent().x(); + if ( cellBB.extent().y() > maxY ) maxY = cellBB.extent().y(); + } + + m_maxExtentTriangleInXDirection = maxX; + m_maxExtentTriangleInYDirection = maxY; + + m_surfaceBoundingBoxTree = new cvf::BoundingBoxTree; + m_surfaceBoundingBoxTree->buildTreeFromBoundingBoxes( cellBoundingBoxes, &boundingBoxIds ); + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +size_t RigSurface::triangleCount() const +{ + return m_triangleIndices.size() / 3; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurface.h b/ApplicationLibCode/ReservoirDataModel/RigSurface.h index 72a4a3225a..3d53081dcd 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigSurface.h +++ b/ApplicationLibCode/ReservoirDataModel/RigSurface.h @@ -25,14 +25,20 @@ #include #include +namespace cvf +{ +class BoundingBox; +class BoundingBoxTree; +} // namespace cvf + class RigSurface : public cvf::Object { public: RigSurface(); ~RigSurface() override; - const std::vector& triangleIndices(); - const std::vector& vertices(); + const std::vector& triangleIndices() const; + const std::vector& vertices() const; void setTriangleData( const std::vector& tringleIndices, const std::vector& vertices ); void addVerticeResult( const QString resultName, const std::vector& resultValues ); @@ -40,8 +46,22 @@ class RigSurface : public cvf::Object std::vector propertyValues( const QString& propertyName ) const; std::vector propertyNames() const; + void ensureIntersectionSearchTreeIsBuilt(); + void findIntersectingTriangles( const cvf::BoundingBox& inputBB, std::vector* triangleStartIndices ) const; + + double maxExtentTriangleInXDirection() const; + double maxExtentTriangleInYDirection() const; + +private: + size_t triangleCount() const; + private: std::vector m_triangleIndices; std::vector m_vertices; std::map> m_verticeResults; + + cvf::ref m_surfaceBoundingBoxTree; + + double m_maxExtentTriangleInXDirection; + double m_maxExtentTriangleInYDirection; }; diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.cpp b/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.cpp new file mode 100644 index 0000000000..5d5fd5f8fd --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.cpp @@ -0,0 +1,180 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigSurfaceResampler.h" + +#include "cvfGeometryTools.h" + +#include "cvfBoundingBox.h" +#include "cvfObject.h" + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RigSurfaceResampler::resampleSurface( cvf::ref targetSurface, cvf::ref surface ) +{ + cvf::ref resampledSurface = cvf::make_ref(); + + const std::vector& targetVerts = targetSurface->vertices(); + const std::vector& targetIndices = targetSurface->triangleIndices(); + + std::vector resampledVerts; + + for ( auto targetVert : targetVerts ) + { + cvf::Vec3d pointAbove = cvf::Vec3d( targetVert.x(), targetVert.y(), 10000.0 ); + cvf::Vec3d pointBelow = cvf::Vec3d( targetVert.x(), targetVert.y(), -10000.0 ); + + cvf::Vec3d intersectionPoint; + bool foundMatch = resamplePoint( surface.p(), pointAbove, pointBelow, intersectionPoint ); + if ( !foundMatch ) + intersectionPoint = cvf::Vec3d( targetVert.x(), targetVert.y(), std::numeric_limits::infinity() ); + + resampledVerts.push_back( intersectionPoint ); + } + + resampledSurface->setTriangleData( targetIndices, resampledVerts ); + + return resampledSurface; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigSurfaceResampler::resamplePoint( RigSurface* surface, + const cvf::Vec3d& pointAbove, + const cvf::Vec3d& pointBelow, + cvf::Vec3d& intersectionPoint ) +{ + surface->ensureIntersectionSearchTreeIsBuilt(); + + cvf::BoundingBox bb; + bb.add( pointAbove ); + bb.add( pointBelow ); + + const std::vector& triIndices = surface->triangleIndices(); + const std::vector& vertices = surface->vertices(); + + { + std::vector triangleStartIndices; + surface->findIntersectingTriangles( bb, &triangleStartIndices ); + + if ( !triangleStartIndices.empty() ) + { + for ( auto triangleStartIndex : triangleStartIndices ) + { + bool isLineDirDotNormalNegative = false; + if ( cvf::GeometryTools::intersectLineSegmentTriangle( pointAbove, + pointBelow, + vertices[triIndices[triangleStartIndex + 0]], + vertices[triIndices[triangleStartIndex + 1]], + vertices[triIndices[triangleStartIndex + 2]], + &intersectionPoint, + &isLineDirDotNormalNegative ) == 1 ) + return true; + } + } + } + + double maxDistance = computeMaxDistance( surface ); + + // Expand the bounding box to cover a larger volume. Use this volume to find intersections. + bb.expand( maxDistance ); + + std::vector triangleStartIndices; + surface->findIntersectingTriangles( bb, &triangleStartIndices ); + + return findClosestPointXY( pointAbove, vertices, triIndices, triangleStartIndices, maxDistance, intersectionPoint ); +} + +//-------------------------------------------------------------------------------------------------- +/// Find the closest vertex to targetPoint (must be closer than maxDistance) in XY plane. +/// Unit maxDistance: meter. +//-------------------------------------------------------------------------------------------------- +bool RigSurfaceResampler::findClosestPointXY( const cvf::Vec3d& targetPoint, + const std::vector& vertices, + const std::vector& triangleIndices, + const std::vector& triangleStartIndices, + double maxDistance, + cvf::Vec3d& intersectionPoint ) +{ + double maxDistanceSquared = maxDistance * maxDistance; + + // Find closest vertices + double shortestDistanceSquared = std::numeric_limits::max(); + double closestZ = std::numeric_limits::infinity(); + cvf::Vec3d p; + double distanceSquared = 0.0; + for ( auto triangleStartIndex : triangleStartIndices ) + { + for ( size_t localIdx = 0; localIdx < 3; localIdx++ ) + { + const auto& v = vertices[triangleIndices[triangleStartIndex + localIdx]]; + + if ( std::fabs( targetPoint.x() - v.x() ) > maxDistance ) continue; + if ( std::fabs( targetPoint.y() - v.y() ) > maxDistance ) continue; + + // Ignore height (z) component when finding closest by + // moving point to same height as target point above + p.x() = v.x(); + p.y() = v.y(); + p.z() = targetPoint.z(); + + distanceSquared = p.pointDistanceSquared( targetPoint ); + if ( distanceSquared < shortestDistanceSquared ) + { + shortestDistanceSquared = distanceSquared; + closestZ = v.z(); + } + } + } + + // Check if the closest point is not to far away to be valid + if ( shortestDistanceSquared < maxDistanceSquared ) + { + intersectionPoint = cvf::Vec3d( targetPoint.x(), targetPoint.y(), closestZ ); + return true; + } + + return false; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigSurfaceResampler::computeMaxDistance( RigSurface* surface ) +{ + // Handle cases where no match is found due to floating point imprecision, + // or when falling off resulting grid slightly. + // Use the XY extent of a triangle to define a suitable search distance + + const double minimumDistance = 10.0; + + if ( !surface ) return minimumDistance; + + auto maxX = surface->maxExtentTriangleInXDirection() / 2.0; + auto maxY = surface->maxExtentTriangleInYDirection() / 2.0; + + auto candidate = std::min( maxX, maxY ); + + double distance = std::max( minimumDistance, candidate ); + + return distance; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.h b/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.h new file mode 100644 index 0000000000..9590b8115d --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigSurfaceResampler.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "RigSurface.h" + +#include "cvfObject.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +class RigSurfaceResampler +{ +public: + static cvf::ref resampleSurface( cvf::ref targetSurface, cvf::ref surface ); + + static bool resamplePoint( RigSurface* surface, + const cvf::Vec3d& pointAbove, + const cvf::Vec3d& pointBelow, + cvf::Vec3d& intersectionPoint ); + +private: + static bool findClosestPointXY( const cvf::Vec3d& targetPoint, + const std::vector& vertices, + const std::vector& triangleIndices, + const std::vector& triangleStartIndices, + double maxDistance, + cvf::Vec3d& intersectionPoint ); + + static double computeMaxDistance( RigSurface* surface ); +}; diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.cpp new file mode 100644 index 0000000000..e7c74823c9 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.cpp @@ -0,0 +1,134 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "RigSurfaceStatisticsCalculator.h" + +#include "RigStatisticsMath.h" + +#include "cafAppEnum.h" +#include "cafAssert.h" + +#include "cvfObject.h" + +#include + +namespace caf +{ +template <> +void caf::AppEnum::setUp() +{ + addItem( RigSurfaceStatisticsCalculator::StatisticsType::MEAN, "MEAN", "Mean" ); + addItem( RigSurfaceStatisticsCalculator::StatisticsType::MIN, "MIN", "Minimum" ); + addItem( RigSurfaceStatisticsCalculator::StatisticsType::MAX, "MAX", "Maximum" ); + addItem( RigSurfaceStatisticsCalculator::StatisticsType::P10, "P10", "P10" ); + addItem( RigSurfaceStatisticsCalculator::StatisticsType::P50, "P50", "P50" ); + addItem( RigSurfaceStatisticsCalculator::StatisticsType::P90, "P90", "P90" ); + setDefault( RigSurfaceStatisticsCalculator::StatisticsType::MEAN ); +} +}; // namespace caf + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +cvf::ref RigSurfaceStatisticsCalculator::computeStatistics( const std::vector>& surfaces ) +{ + // Need at least one surface to generate statistics + if ( surfaces.empty() ) return nullptr; + + // Check that the size of all the surfaces are the same + if ( !areSurfacesSameSize( surfaces ) ) return nullptr; + + size_t vecSize = surfaces[0]->vertices().size(); + + std::vector meanValues( vecSize, std::numeric_limits::infinity() ); + std::vector minValues( vecSize, std::numeric_limits::infinity() ); + std::vector maxValues( vecSize, std::numeric_limits::infinity() ); + std::vector p10Values( vecSize, std::numeric_limits::infinity() ); + std::vector p50Values( vecSize, std::numeric_limits::infinity() ); + std::vector p90Values( vecSize, std::numeric_limits::infinity() ); + + for ( size_t i = 0; i < vecSize; i++ ) + { + std::vector samples; + for ( auto surface : surfaces ) + { + double z = surface->vertices()[i].z(); + samples.push_back( z ); + } + + double min; + double max; + double sum; + double range; + double mean; + double dev; + RigStatisticsMath::calculateBasicStatistics( samples, &min, &max, &sum, &range, &mean, &dev ); + + double p10; + double p50; + double p90; + RigStatisticsMath::calculateStatisticsCurves( samples, + &p10, + &p50, + &p90, + &mean, + RigStatisticsMath::PercentileStyle::SWITCHED ); + + // TODO: improve handling of these cases + auto makeValid = []( double val ) { + if ( std::isinf( val ) || std::isnan( val ) ) return 0.0; + return val; + }; + + meanValues[i] = makeValid( mean ); + minValues[i] = makeValid( min ); + maxValues[i] = makeValid( max ); + p10Values[i] = makeValid( p10 ); + p50Values[i] = makeValid( p50 ); + p90Values[i] = makeValid( p90 ); + } + + cvf::ref statSurface = cvf::make_ref(); + statSurface->setTriangleData( surfaces[0]->triangleIndices(), surfaces[0]->vertices() ); + + auto enumToText = []( auto statisticsType ) { return caf::AppEnum::text( statisticsType ); }; + + statSurface->addVerticeResult( enumToText( StatisticsType::MEAN ), meanValues ); + statSurface->addVerticeResult( enumToText( StatisticsType::MIN ), minValues ); + statSurface->addVerticeResult( enumToText( StatisticsType::MAX ), maxValues ); + statSurface->addVerticeResult( enumToText( StatisticsType::P10 ), p10Values ); + statSurface->addVerticeResult( enumToText( StatisticsType::P50 ), p50Values ); + statSurface->addVerticeResult( enumToText( StatisticsType::P90 ), p90Values ); + + return statSurface; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool RigSurfaceStatisticsCalculator::areSurfacesSameSize( const std::vector>& surfaces ) +{ + CAF_ASSERT( !surfaces.empty() ); + + size_t vecSize = surfaces[0]->vertices().size(); + for ( auto surface : surfaces ) + { + if ( vecSize != surface->vertices().size() ) return false; + } + return true; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.h b/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.h new file mode 100644 index 0000000000..2cc3f8da62 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigSurfaceStatisticsCalculator.h @@ -0,0 +1,46 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#pragma once + +#include "RigSurface.h" + +#include "cvfObject.h" + +#include + +//================================================================================================== +/// +/// +//================================================================================================== +class RigSurfaceStatisticsCalculator +{ +public: + enum class StatisticsType + { + MIN, + MAX, + P10, + P50, + P90, + MEAN + }; + + static cvf::ref computeStatistics( const std::vector>& surfaces ); + static bool areSurfacesSameSize( const std::vector>& surfaces ); +}; diff --git a/ApplicationLibCode/ReservoirDataModel/RigVisibleCategoriesCalculator.cpp b/ApplicationLibCode/ReservoirDataModel/RigVisibleCategoriesCalculator.cpp index cddb86932e..10b9aa00f2 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigVisibleCategoriesCalculator.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigVisibleCategoriesCalculator.cpp @@ -45,7 +45,7 @@ #include "RimSurfaceInView.h" #include "RimSurfaceInViewCollection.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionGeometryGeneratorInterface.h" #include @@ -199,7 +199,7 @@ void RigVisibleCategoriesCalculator::appendVisibleFaultCells( RimEclipseView* ec void RigVisibleCategoriesCalculator::appendVisibleIntersectionCells( RimEclipseView* eclView, std::set& visibleCells ) { // Intersections - std::vector intersectionGeoGenerators; + std::vector intersectionGeoGenerators; if ( !eclView->separateIntersectionResultsCollection()->isActive() ) { diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp new file mode 100644 index 0000000000..3a37b52043 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.cpp @@ -0,0 +1,101 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#include "RigWellLogIndexDepthOffset.h" + +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +void RigWellLogIndexDepthOffset::setIndexOffsetDepth( int kIndex, double topMd, double bottomMd, double topTvd, double bottomTvd ) +{ + m_mdOffsets[kIndex] = std::pair( topMd, bottomMd ); + m_tvdOffsets[kIndex] = std::pair( topTvd, bottomTvd ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigWellLogIndexDepthOffset::getTopMd( int kIndex ) const +{ + auto hit = m_mdOffsets.find( kIndex ); + if ( hit != m_mdOffsets.end() ) + { + return hit->second.first; + } + + return std::numeric_limits::infinity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigWellLogIndexDepthOffset::getBottomMd( int kIndex ) const +{ + auto hit = m_mdOffsets.find( kIndex ); + if ( hit != m_mdOffsets.end() ) + { + return hit->second.second; + } + + return std::numeric_limits::infinity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigWellLogIndexDepthOffset::getTopTvd( int kIndex ) const +{ + auto hit = m_tvdOffsets.find( kIndex ); + if ( hit != m_tvdOffsets.end() ) + { + return hit->second.first; + } + + return std::numeric_limits::infinity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigWellLogIndexDepthOffset::getBottomTvd( int kIndex ) const +{ + auto hit = m_tvdOffsets.find( kIndex ); + if ( hit != m_tvdOffsets.end() ) + { + return hit->second.second; + } + + return std::numeric_limits::infinity(); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::vector RigWellLogIndexDepthOffset::sortedIndexes() const +{ + std::vector indexes; + for ( auto m : m_mdOffsets ) + { + indexes.push_back( m.first ); + } + + std::sort( indexes.begin(), indexes.end() ); + return indexes; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h new file mode 100644 index 0000000000..3bf5cb1852 --- /dev/null +++ b/ApplicationLibCode/ReservoirDataModel/RigWellLogIndexDepthOffset.h @@ -0,0 +1,41 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include "cvfObject.h" + +#include +#include + +class RigWellLogIndexDepthOffset : public cvf::Object +{ +public: + RigWellLogIndexDepthOffset() = default; + ~RigWellLogIndexDepthOffset() override = default; + + void setIndexOffsetDepth( int kIndex, double topMd, double bottomMd, double topTvd, double bottomTvd ); + double getTopMd( int kIndex ) const; + double getBottomMd( int kIndex ) const; + double getTopTvd( int kIndex ) const; + double getBottomTvd( int kIndex ) const; + std::vector sortedIndexes() const; + +private: + std::map> m_mdOffsets; + std::map> m_tvdOffsets; +}; diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellPath.cpp b/ApplicationLibCode/ReservoirDataModel/RigWellPath.cpp index 783ac6c09e..6a4dbb8e03 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellPath.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigWellPath.cpp @@ -315,41 +315,15 @@ cvf::Vec3d RigWellPath::tangentAlongWellPath( double measuredDepth ) const //-------------------------------------------------------------------------------------------------- double RigWellPath::wellPathAzimuthAngle( const cvf::Vec3d& position ) const { - size_t closestIndex = cvf::UNDEFINED_SIZE_T; - double closestDistance = cvf::UNDEFINED_DOUBLE; - - for ( size_t i = 1; i < m_wellPathPoints.size(); i++ ) - { - cvf::Vec3d p1 = m_wellPathPoints[i - 1]; - cvf::Vec3d p2 = m_wellPathPoints[i - 0]; - - double candidateDistance = cvf::GeometryTools::linePointSquareDist( p1, p2, position ); - if ( candidateDistance < closestDistance ) - { - closestDistance = candidateDistance; - closestIndex = i; - } - } - // For vertical well (x-component of direction = 0) returned angle will be 90. double azimuthAngleDegrees = 90.0; - if ( closestIndex != cvf::UNDEFINED_DOUBLE ) - { - cvf::Vec3d p1; - cvf::Vec3d p2; - - if ( closestIndex > 0 ) - { - p1 = m_wellPathPoints[closestIndex - 1]; - p2 = m_wellPathPoints[closestIndex - 0]; - } - else - { - p1 = m_wellPathPoints[closestIndex + 1]; - p2 = m_wellPathPoints[closestIndex + 0]; - } + cvf::Vec3d p1 = cvf::Vec3d::UNDEFINED; + cvf::Vec3d p2 = cvf::Vec3d::UNDEFINED; + twoClosestPoints( position, &p1, &p2 ); + if ( !p1.isUndefined() ) + { cvf::Vec3d direction = p2 - p1; if ( fabs( direction.y() ) > 1e-5 ) @@ -370,34 +344,11 @@ void RigWellPath::twoClosestPoints( const cvf::Vec3d& position, cvf::Vec3d* p1, { CVF_ASSERT( p1 && p2 ); - size_t closestIndex = cvf::UNDEFINED_SIZE_T; - double closestDistance = cvf::UNDEFINED_DOUBLE; - - for ( size_t i = 1; i < m_wellPathPoints.size(); i++ ) - { - cvf::Vec3d point1 = m_wellPathPoints[i - 1]; - cvf::Vec3d point2 = m_wellPathPoints[i - 0]; - - double candidateDistance = cvf::GeometryTools::linePointSquareDist( point1, point2, position ); - if ( candidateDistance < closestDistance ) - { - closestDistance = candidateDistance; - closestIndex = i; - } - } - - if ( closestIndex != cvf::UNDEFINED_SIZE_T ) + auto closeIndices = closestIndices( position ); + if ( closeIndices.first != cvf::UNDEFINED_SIZE_T ) { - if ( closestIndex > 0 ) - { - *p1 = m_wellPathPoints[closestIndex - 1]; - *p2 = m_wellPathPoints[closestIndex - 0]; - } - else - { - *p1 = m_wellPathPoints[closestIndex + 1]; - *p2 = m_wellPathPoints[closestIndex + 0]; - } + *p1 = m_wellPathPoints[closeIndices.first]; + *p2 = m_wellPathPoints[closeIndices.second]; } } @@ -429,6 +380,32 @@ double RigWellPath::identicalTubeLength( const RigWellPath& other ) const return identicalLength; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +double RigWellPath::closestMeasuredDepth( const cvf::Vec3d& position ) const +{ + auto [firstIndex, secondIndex] = closestIndices( position ); + if ( firstIndex != cvf::UNDEFINED_SIZE_T ) + { + cvf::Vec3d p1 = m_wellPathPoints[firstIndex]; + cvf::Vec3d p2 = m_wellPathPoints[secondIndex]; + + double diffP1 = ( p1 - position ).length(); + double diffP2 = ( p2 - position ).length(); + + double weigth1 = diffP2 / ( diffP1 + diffP2 ); + + double measureDepth1 = m_measuredDepths[firstIndex]; + double measureDepth2 = m_measuredDepths[secondIndex]; + + double interpolatedValue = measureDepth1 * weigth1 + measureDepth2 * ( 1.0 - weigth1 ); + return interpolatedValue; + } + + return -1.0; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -681,3 +658,40 @@ std::vector RigWellPath::clipPolylineStartAboveZ( const std::vector< return clippedPolyLine; } + +//-------------------------------------------------------------------------------------------------- +// Returns the closes indices with smallest index first +// If not found, cvf::UNDEFINED_SIZE_T is returned for both +//-------------------------------------------------------------------------------------------------- +std::pair RigWellPath::closestIndices( const cvf::Vec3d& position ) const +{ + size_t closestIndex = cvf::UNDEFINED_SIZE_T; + double closestDistance = cvf::UNDEFINED_DOUBLE; + + for ( size_t i = 1; i < m_wellPathPoints.size(); i++ ) + { + cvf::Vec3d point1 = m_wellPathPoints[i - 1]; + cvf::Vec3d point2 = m_wellPathPoints[i - 0]; + + double candidateDistance = cvf::GeometryTools::linePointSquareDist( point1, point2, position ); + if ( candidateDistance < closestDistance ) + { + closestDistance = candidateDistance; + closestIndex = i; + } + } + + if ( closestIndex != cvf::UNDEFINED_SIZE_T ) + { + if ( closestIndex > 0 ) + { + return { closestIndex - 1, closestIndex }; + } + else + { + return { closestIndex, closestIndex + 1 }; + } + } + + return { cvf::UNDEFINED_SIZE_T, cvf::UNDEFINED_SIZE_T }; +} diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellPath.h b/ApplicationLibCode/ReservoirDataModel/RigWellPath.h index 86d7df76d1..754e1e0599 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellPath.h +++ b/ApplicationLibCode/ReservoirDataModel/RigWellPath.h @@ -70,6 +70,7 @@ class RigWellPath : public cvf::Object, public caf::SignalEmitter double wellPathAzimuthAngle( const cvf::Vec3d& position ) const; void twoClosestPoints( const cvf::Vec3d& position, cvf::Vec3d* p1, cvf::Vec3d* p2 ) const; double identicalTubeLength( const RigWellPath& otherWellPathGeometry ) const; + double closestMeasuredDepth( const cvf::Vec3d& position ) const; static cvf::ref commonGeometry( const std::vector& allGeometries ); void setUniqueStartAndEndIndex( size_t uniqueStartIndex, size_t uniqueEndIndex ); @@ -90,6 +91,9 @@ class RigWellPath : public cvf::Object, public caf::SignalEmitter double* horizontalLengthAlongWellToClipPoint, size_t* indexToFirstVisibleSegment ); +private: + std::pair closestIndices( const cvf::Vec3d& position ) const; + private: std::vector m_wellPathPoints; std::vector m_measuredDepths; diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryExporter.cpp b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryExporter.cpp index e9788c64ca..83f0edfe3e 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryExporter.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryExporter.cpp @@ -53,10 +53,6 @@ void RigWellPathGeometryExporter::exportWellPathGeometry( gsl::not_nullgeometryDefinition()->airGap(); } - else - { - rkbOffset = modeledWellPath->geometryDefinition()->mdAtFirstTarget(); - } } } exportWellPathGeometry( *wellPathGeom, mdStepSize, rkbOffset, xValues, yValues, tvdValues, mdValues ); diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.cpp b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.cpp index 141c614b84..e849e2b0c4 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.cpp +++ b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.cpp @@ -23,6 +23,7 @@ #include "cvfMath.h" #include "cvfMatrix3.h" +#include "RiaOffshoreSphericalCoords.h" #include #include @@ -133,6 +134,61 @@ std::vector RigWellPathGeometryTools::interpolateMdFromTvd( const std::v return interpolatedMdValues; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair + RigWellPathGeometryTools::calculateAzimuthAndInclinationAtMd( double measuredDepth, + gsl::not_null wellPathGeometry ) +{ + int mdIndex = -1; + auto mdList = wellPathGeometry->measuredDepths(); + + for ( int i = 0; i < (int)mdList.size(); i++ ) + { + if ( mdList[i] > measuredDepth ) + { + mdIndex = i - 1; + break; + } + } + + auto ptList = wellPathGeometry->wellPathPoints(); + if ( mdIndex >= 0 && mdIndex < (int)ptList.size() - 1 ) + { + const auto& v2 = cvf::Vec3d( ptList[mdIndex] ); + const auto& v3 = cvf::Vec3d( ptList[mdIndex + 1] ); + + auto v32 = ( v3 - v2 ).getNormalized(); + + auto v13mean = v32; + + if ( mdIndex > 0 ) + { + const auto& v1 = cvf::Vec3d( ptList[mdIndex - 1] ); + auto v21 = ( v2 - v1 ).getNormalized(); + v13mean = ( v21 + v32 ) / 2; + } + + auto v24mean = v32; + if ( mdIndex < (int)ptList.size() - 2 ) + { + const auto& v4 = cvf::Vec3d( ptList[mdIndex + 2] ); + auto v43 = ( v4 - v3 ).getNormalized(); + v24mean = ( v32 + v43 ) / 2; + } + + double weight = ( measuredDepth - mdList[mdIndex] ) / ( mdList[mdIndex + 1] - mdList[mdIndex] ); + auto vTan = v13mean * ( 1.0 - weight ) + v24mean * ( weight ); + + RiaOffshoreSphericalCoords coords( vTan ); + + return { coords.azi(), coords.inc() }; + } + + return { 0.0, 0.0 }; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.h b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.h index 56874d5c08..94fbfef20e 100644 --- a/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.h +++ b/ApplicationLibCode/ReservoirDataModel/RigWellPathGeometryTools.h @@ -25,6 +25,8 @@ #include +#include + class RigWellPath; //================================================================================================== @@ -45,6 +47,9 @@ class RigWellPathGeometryTools const std::vector& originalTvdValues, const std::vector& tvdValuesToInterpolateFrom ); + static std::pair + calculateAzimuthAndInclinationAtMd( double measuredDepth, gsl::not_null wellPathGeometry ); + private: static std::vector interpolateUndefinedNormals( const cvf::Vec3d& planeNormal, const std::vector& normals, diff --git a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp index 1d61abf91f..16c77cff30 100644 --- a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp +++ b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.cpp @@ -515,13 +515,13 @@ double GeometryTools::linePointSquareDist( const cvf::Vec3d& p1, const cvf::Vec3 // dot product (3D) which allows vector operations in arguments #define dot( u, v ) ( ( u ).x() * ( v ).x() + ( u ).y() * ( v ).y() + ( u ).z() * ( v ).z() ) -int GeometryTools::intersectLineSegmentTriangle( const cvf::Vec3d p0, - const cvf::Vec3d p1, - const cvf::Vec3d t0, - const cvf::Vec3d t1, - const cvf::Vec3d t2, - cvf::Vec3d* intersectionPoint, - bool* isLineDirDotNormalNegative ) +int GeometryTools::intersectLineSegmentTriangle( const cvf::Vec3d& p0, + const cvf::Vec3d& p1, + const cvf::Vec3d& t0, + const cvf::Vec3d& t1, + const cvf::Vec3d& t2, + cvf::Vec3d* intersectionPoint, + bool* isLineDirDotNormalNegative ) { CVF_TIGHT_ASSERT( intersectionPoint != nullptr ); CVF_TIGHT_ASSERT( isLineDirDotNormalNegative != nullptr ); diff --git a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h index 80b1a8ff2a..87a641c2a8 100644 --- a/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h +++ b/ApplicationLibCode/ReservoirDataModel/cvfGeometryTools.h @@ -47,13 +47,13 @@ class GeometryTools double* normalizedIntersection ); static double linePointSquareDist( const cvf::Vec3d& p1, const cvf::Vec3d& p2, const cvf::Vec3d& p3 ); - static int intersectLineSegmentTriangle( const cvf::Vec3d p0, - const cvf::Vec3d p1, - const cvf::Vec3d t0, - const cvf::Vec3d t1, - const cvf::Vec3d t2, - cvf::Vec3d* intersectionPoint, - bool* isLineDirDotNormalNegative ); + static int intersectLineSegmentTriangle( const cvf::Vec3d& p0, + const cvf::Vec3d& p1, + const cvf::Vec3d& t0, + const cvf::Vec3d& t1, + const cvf::Vec3d& t2, + cvf::Vec3d* intersectionPoint, + bool* isLineDirDotNormalNegative ); static cvf::Vec3d barycentricCoords( const cvf::Vec3d& t0, const cvf::Vec3d& t1, const cvf::Vec3d& t2, const cvf::Vec3d& p ); static cvf::Vec4d barycentricCoords( const cvf::Vec3d& v0, diff --git a/ApplicationLibCode/ResultStatisticsCache/CMakeLists.txt b/ApplicationLibCode/ResultStatisticsCache/CMakeLists.txt index bf91ad13d5..4d5325a1f2 100644 --- a/ApplicationLibCode/ResultStatisticsCache/CMakeLists.txt +++ b/ApplicationLibCode/ResultStatisticsCache/CMakeLists.txt @@ -8,7 +8,8 @@ add_library( ${PROJECT_NAME} RigStatisticsCalculator.h RigStatisticsCalculator.cpp RigStatisticsDataCache.h RigStatisticsDataCache.cpp RigStatisticsMath.h - RigStatisticsMath.cpp) + RigStatisticsMath.cpp +) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp index 87c44a4c0a..72e37c971b 100644 --- a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp +++ b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsDataCache.cpp @@ -343,8 +343,8 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded() m_statisticsCalculator->addDataToHistogramCalculator( histCalc ); - m_statsAllTimesteps.m_p10 = histCalc.calculatePercentil( 0.1 ); - m_statsAllTimesteps.m_p90 = histCalc.calculatePercentil( 0.9 ); + m_statsAllTimesteps.m_p10 = histCalc.calculatePercentil( 0.1, RigStatisticsMath::PercentileStyle::SWITCHED ); + m_statsAllTimesteps.m_p90 = histCalc.calculatePercentil( 0.9, RigStatisticsMath::PercentileStyle::SWITCHED ); } } @@ -364,8 +364,8 @@ void RigStatisticsDataCache::computeHistogramStatisticsIfNeeded( size_t timeStep m_statisticsCalculator->addDataToHistogramCalculator( timeStepIndex, histCalc ); - m_statsPrTs[timeStepIndex].m_p10 = histCalc.calculatePercentil( 0.1 ); - m_statsPrTs[timeStepIndex].m_p90 = histCalc.calculatePercentil( 0.9 ); + m_statsPrTs[timeStepIndex].m_p10 = histCalc.calculatePercentil( 0.1, RigStatisticsMath::PercentileStyle::SWITCHED ); + m_statsPrTs[timeStepIndex].m_p90 = histCalc.calculatePercentil( 0.9, RigStatisticsMath::PercentileStyle::SWITCHED ); } } diff --git a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.cpp b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.cpp index 88154b68f8..0ae38b380b 100644 --- a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.cpp +++ b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.cpp @@ -91,7 +91,8 @@ void RigStatisticsMath::calculateStatisticsCurves( const std::vector& va double* p10, double* p50, double* p90, - double* mean ) + double* mean, + PercentileStyle percentileStyle ) { CVF_ASSERT( p10 && p50 && p90 && mean ); @@ -145,9 +146,20 @@ void RigStatisticsMath::calculateStatisticsCurves( const std::vector& va } } - *p10 = pValues[P10]; - *p50 = pValues[P50]; - *p90 = pValues[P90]; + *p50 = pValues[P50]; + + if ( percentileStyle == PercentileStyle::REGULAR ) + { + *p10 = pValues[P10]; + *p90 = pValues[P90]; + } + else + { + CVF_ASSERT( percentileStyle == PercentileStyle::SWITCHED ); + *p10 = pValues[P90]; + *p90 = pValues[P10]; + } + *mean = valueSum / valueCount; } @@ -158,7 +170,8 @@ void RigStatisticsMath::calculateStatisticsCurves( const std::vector& va //-------------------------------------------------------------------------------------------------- std::vector RigStatisticsMath::calculateNearestRankPercentiles( const std::vector& inputValues, - const std::vector& pValPositions ) + const std::vector& pValPositions, + RigStatisticsMath::PercentileStyle percentileStyle ) { std::vector sortedValues; sortedValues.reserve( inputValues.size() ); @@ -180,7 +193,10 @@ std::vector RigStatisticsMath::calculateNearestRankPercentiles( const st { double pVal = HUGE_VAL; - size_t pValIndex = static_cast( sortedValues.size() * cvf::Math::abs( pValPositions[i] ) / 100 ); + double pValPosition = cvf::Math::abs( pValPositions[i] ) / 100; + if ( percentileStyle == RigStatisticsMath::PercentileStyle::SWITCHED ) pValPosition = 1.0 - pValPosition; + + size_t pValIndex = static_cast( sortedValues.size() * pValPosition ); if ( pValIndex >= sortedValues.size() ) pValIndex = sortedValues.size() - 1; @@ -198,7 +214,8 @@ std::vector RigStatisticsMath::calculateNearestRankPercentiles( const st /// the inputValues does not contain any valid values //-------------------------------------------------------------------------------------------------- std::vector RigStatisticsMath::calculateInterpolatedPercentiles( const std::vector& inputValues, - const std::vector& pValPositions ) + const std::vector& pValPositions, + RigStatisticsMath::PercentileStyle percentileStyle ) { std::vector sortedValues; sortedValues.reserve( inputValues.size() ); @@ -220,7 +237,10 @@ std::vector RigStatisticsMath::calculateInterpolatedPercentiles( const s { double pVal = HUGE_VAL; - double doubleIndex = ( sortedValues.size() - 1 ) * cvf::Math::abs( pValPositions[i] ) / 100.0; + double pValPosition = cvf::Math::abs( pValPositions[i] ) / 100.0; + if ( percentileStyle == RigStatisticsMath::PercentileStyle::SWITCHED ) pValPosition = 1.0 - pValPosition; + + double doubleIndex = ( sortedValues.size() - 1 ) * pValPosition; size_t lowerValueIndex = static_cast( floor( doubleIndex ) ); size_t upperValueIndex = lowerValueIndex + 1; @@ -315,12 +335,16 @@ void RigHistogramCalculator::addData( const std::vector& data ) //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -double RigHistogramCalculator::calculatePercentil( double pVal ) +double RigHistogramCalculator::calculatePercentil( double pVal, RigStatisticsMath::PercentileStyle percentileStyle ) { assert( m_histogram ); assert( m_histogram->size() ); auto pValClamped = cvf::Math::clamp( pVal, 0.0, 1.0 ); assert( 0.0 <= pValClamped && pValClamped <= 1.0 ); + if ( percentileStyle == RigStatisticsMath::PercentileStyle::SWITCHED ) + { + pValClamped = 1.0 - pValClamped; + } double pValObservationCount = pValClamped * m_observationCount; if ( pValObservationCount == 0.0 ) return m_min; diff --git a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.h b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.h index 8d4992b0c6..b1209edb07 100644 --- a/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.h +++ b/ApplicationLibCode/ResultStatisticsCache/RigStatisticsMath.h @@ -27,6 +27,12 @@ class RigStatisticsMath { public: + enum class PercentileStyle + { + REGULAR, + SWITCHED + }; + static void calculateBasicStatistics( const std::vector& values, double* min, double* max, @@ -34,13 +40,21 @@ class RigStatisticsMath double* range, double* mean, double* dev ); - static void - calculateStatisticsCurves( const std::vector& values, double* p10, double* p50, double* p90, double* mean ); + + static void calculateStatisticsCurves( const std::vector& values, + double* p10, + double* p50, + double* p90, + double* mean, + PercentileStyle percentileStyle ); static std::vector calculateNearestRankPercentiles( const std::vector& inputValues, - const std::vector& pValPositions ); + const std::vector& pValPositions, + PercentileStyle percentileStyle ); + static std::vector calculateInterpolatedPercentiles( const std::vector& inputValues, - const std::vector& pValPositions ); + const std::vector& pValPositions, + PercentileStyle percentileStyle ); }; //================================================================================================== @@ -61,7 +75,7 @@ class RigHistogramCalculator /// the percentile is the domain value at which pVal of the observations are below it. /// Will only consider observed values between min and max, as all other values are discarded from the histogram - double calculatePercentil( double pVal ); + double calculatePercentil( double pVal, RigStatisticsMath::PercentileStyle percentileStyle ); private: size_t m_maxIndex; diff --git a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake index b9ba75dac0..7ab65025b3 100644 --- a/ApplicationLibCode/UnitTests/CMakeLists_files.cmake +++ b/ApplicationLibCode/UnitTests/CMakeLists_files.cmake @@ -1,99 +1,100 @@ - -CONFIGURE_FILE( ${CMAKE_CURRENT_LIST_DIR}/RiaTestDataDirectory.h.cmake - ${CMAKE_BINARY_DIR}/Generated/RiaTestDataDirectory.h +configure_file( + ${CMAKE_CURRENT_LIST_DIR}/RiaTestDataDirectory.h.cmake + ${CMAKE_BINARY_DIR}/Generated/RiaTestDataDirectory.h ) -set (SOURCE_GROUP_HEADER_FILES -) +set(SOURCE_GROUP_HEADER_FILES) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/Ert-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifcCommandCore-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigReservoir-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigStatisticsMath-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveImpl-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/ScalarMapper-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/WellPathAsciiFileReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/opm-flowdiagnostics-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/HDF5FileReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/HDF5FileWriter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/ObservedDataParser-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/EclipseRftReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RicExpressionParser-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorDescriptionMap-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/FixedWidthDataParser-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTimeCurveHistoryMerger-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/ListKeywordsForObjectsAndFields-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RimRelocatePath-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/SolveSpaceSolver-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMean-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaMedianCalculator-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/Intersect-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigHexGradientTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifRoffReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RifSummaryDataReader-Test.cpp -${CMAKE_CURRENT_LIST_DIR}/RigSlice2D-Test.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/cvfGeometryTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/Ert-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifcCommandCore-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseInputFileTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseOutput-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifReaderEclipseSummary-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigActiveCellInfo-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigReservoir-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigStatisticsMath-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathIntersectionTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellLogExtractionCurveImpl-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivPipeGeometryGenerator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RivTernaryScalarMapper-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/ScalarMapper-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/WellPathAsciiFileReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/opm-flowdiagnostics-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTofAccumulatedPhaseFractionsCalculator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/HDF5FileReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/HDF5FileWriter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigCellGeometryTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigHexIntersectionTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/ObservedDataParser-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/EclipseRftReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RicExpressionParser-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorDescriptionMap-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/FixedWidthDataParser-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTimeCurveHistoryMerger-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/ListKeywordsForObjectsAndFields-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaProjectFileVersionTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifElementPropertyTableReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimRelocatePath-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigTransmissibilityCondenser-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaEclipseUnitTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTextFileCompare-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCaseRealizationParametersReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellLogExtractor-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseSummaryAddress-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaTimeHistoryCurveTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/SolveSpaceSolver-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaPolyArcLineSampler-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifTextDataTableFormatter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedMean-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaMedianCalculator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedGeometricMeanCalculator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaWeightedHarmonicMeanCalculator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaCellDividingTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaFilePathTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/Intersect-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifPerforationIntervalReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimWellPathCompletions-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RimSummaryCaseCollection-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifActiveCellsReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifCsvDataTableFormatter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaSummaryCurveAnalyzer-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStdStringTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaInterpolationTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifWellMeasurementReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaDateStringParser-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigHexGradientTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSurfaceImporter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifColorLegendData-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifRoffReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifElasticPropertiesReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiaStatisticsTools-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanXmlReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigWellPathGeometryExporter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifStimPlanModelDeviationFrkExporter-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifSummaryDataReader-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSlice2D-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceResampler-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RigSurfaceStatisticsCalculator-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/StructGridInterface-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/opm-summary-Test.cpp + ${CMAKE_CURRENT_LIST_DIR}/RifEclipseTextFileReader-Test.cpp ) -if (RESINSIGHT_ENABLE_GRPC) - list(APPEND GPRC_UNIT_TEST_SOURCE_FILES - ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcInterface-Test.cpp - ) - list(APPEND SOURCE_GROUP_SOURCE_FILES - ${GRPC_UNIT_TEST_SOURCE_FILES} - ) +if(RESINSIGHT_ENABLE_GRPC) + list(APPEND GPRC_UNIT_TEST_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiaGrpcInterface-Test.cpp + ) + list(APPEND SOURCE_GROUP_SOURCE_FILES ${GRPC_UNIT_TEST_SOURCE_FILES}) endif(RESINSIGHT_ENABLE_GRPC) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -source_group( "UnitTests" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) +source_group( + "UnitTests" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake +) diff --git a/ApplicationLibCode/UnitTests/RiaStdStringTools-Test.cpp b/ApplicationLibCode/UnitTests/RiaStdStringTools-Test.cpp index 07732214de..e665f53204 100644 --- a/ApplicationLibCode/UnitTests/RiaStdStringTools-Test.cpp +++ b/ApplicationLibCode/UnitTests/RiaStdStringTools-Test.cpp @@ -3,6 +3,7 @@ #include "RiaStdStringTools.h" #include +#include //-------------------------------------------------------------------------------------------------- /// @@ -57,3 +58,59 @@ TEST( RiaStdStringToolsTest, TrimStrings ) EXPECT_EQ( text, expectedText ); } } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RiaStdStringToolsTest, DISABLED_PerformanceConversion ) +{ + size_t itemCount = 1000000; + std::string valueAsString = "1234567"; + + int intValue = 0; + + { + auto start = std::chrono::high_resolution_clock::now(); + + for ( size_t i = 0; i < itemCount; i++ ) + { + intValue = std::stoi( valueAsString ); + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "std::stoi (no try/catch) " << std::setw( 9 ) << diff.count() << " s\n"; + } + + { + auto start = std::chrono::high_resolution_clock::now(); + + for ( size_t i = 0; i < itemCount; i++ ) + { + try + { + intValue = std::stoi( valueAsString ); + } + catch ( ... ) + { + } + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "std::stoi incl try/catch" << std::setw( 9 ) << diff.count() << " s\n"; + } + + { + auto start = std::chrono::high_resolution_clock::now(); + + for ( size_t i = 0; i < itemCount; i++ ) + { + std::from_chars( valueAsString.data(), valueAsString.data() + valueAsString.size(), intValue ); + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "std::from_chars " << std::setw( 9 ) << diff.count() << " s\n"; + } +} diff --git a/ApplicationLibCode/UnitTests/RifEclipseSummaryAddress-Test.cpp b/ApplicationLibCode/UnitTests/RifEclipseSummaryAddress-Test.cpp index a5a78a886b..bca7090bf7 100644 --- a/ApplicationLibCode/UnitTests/RifEclipseSummaryAddress-Test.cpp +++ b/ApplicationLibCode/UnitTests/RifEclipseSummaryAddress-Test.cpp @@ -12,7 +12,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Field ) { std::string addrString = "FOPT"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_FIELD, addr.category() ); @@ -24,7 +24,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Aquifer ) { std::string addrString = "AAQR:456"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_AQUIFER, addr.category() ); @@ -37,7 +37,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Network ) { std::string addrString = "NETW"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_NETWORK, addr.category() ); @@ -49,7 +49,7 @@ TEST( RifEclipseSummaryAddressTest, DISABLED_TestEclipseAddressParsing_Misc ) { std::string addrString = "CPU"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_MISC, addr.category() ); @@ -61,7 +61,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Region ) { std::string addrString = "RPR:7081"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_REGION, addr.category() ); @@ -74,7 +74,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_RegionToRegion ) { std::string addrString = "ROFR:7081-8001"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_REGION_2_REGION, addr.category() ); @@ -88,7 +88,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_WellGroup ) { std::string addrString = "GOPR:WELLS1"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_GROUP, addr.category() ); @@ -101,7 +101,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Well ) { std::string addrString = "WOPR:B-2H"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL, addr.category() ); @@ -114,7 +114,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_WellCompletion ) { std::string addrString = "COFRL:B-1H:15,13,14"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION, addr.category() ); @@ -130,7 +130,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_WellLgr ) { std::string addrString = "LWABC:LGRNA:B-10H"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_LGR, addr.category() ); @@ -144,7 +144,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_WellCompletionLgr { std::string addrString = "LCGAS:LGR1:B-1H:11,12,13"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR, addr.category() ); @@ -161,7 +161,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_WellSegment ) { std::string addrString = "SOFR:B-5H:32"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_SEGMENT, addr.category() ); @@ -175,7 +175,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Block ) { std::string addrString = "BPR:123,122,121"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_BLOCK, addr.category() ); @@ -190,7 +190,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_BlockLgr ) { std::string addrString = "LBABC:LGRN:45,47,49"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_BLOCK_LGR, addr.category() ); @@ -206,7 +206,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_Imported ) { std::string addrString = "FAULT (Imp)"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_IMPORTED, addr.category() ); @@ -218,7 +218,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_ErrorResult1 ) { std::string addrString = "ER:AAQR:456"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_AQUIFER, addr.category() ); @@ -231,7 +231,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_ErrorResult2 ) { std::string addrString = "ERR:LCGAS:LGR1:B-1H:11,12,13"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_WELL_COMPLETION_LGR, addr.category() ); @@ -248,7 +248,7 @@ TEST( RifEclipseSummaryAddressTest, TestEclipseAddressParsing_ErrorResult3 ) { std::string addrString = "ERROR:FAULT (Imp)"; - RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddress( addrString ); + RifEclipseSummaryAddress addr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( addrString ); EXPECT_TRUE( addr.isValid() ); EXPECT_EQ( RifEclipseSummaryAddress::SUMMARY_IMPORTED, addr.category() ); diff --git a/ApplicationLibCode/UnitTests/RifEclipseTextFileReader-Test.cpp b/ApplicationLibCode/UnitTests/RifEclipseTextFileReader-Test.cpp new file mode 100644 index 0000000000..592b91d085 --- /dev/null +++ b/ApplicationLibCode/UnitTests/RifEclipseTextFileReader-Test.cpp @@ -0,0 +1,183 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2020- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "gtest/gtest.h" + +#include "RiaTestDataDirectory.h" + +#include "RifEclipseKeywordContent.h" +#include "RifEclipseTextFileReader.h" + +#include +#include +#include +#include +#include +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, DISABLED_ReadKeywordsAndValuesPerformanceTest ) +{ + // Remove DISABLED_ from the name of the test to run this performance test + // Intended to be executed locally + + std::string filename = "c:/temp/GRID.GRDECL"; + size_t iterationCount = 10; + + { + auto aggregatedStart = std::chrono::high_resolution_clock::now(); + + for ( size_t i = 0; i < iterationCount; i++ ) + { + auto start = std::chrono::high_resolution_clock::now(); + + auto objects = RifEclipseTextFileReader::readKeywordAndValuesMemoryMappedFile( filename ); + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "RifEclipseTextFileReader MM : " << std::setw( 9 ) << diff.count() << " s\n"; + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - aggregatedStart; + std::cout << "RifEclipseTextFileReader MM [" << iterationCount << " runs] : " << std::setw( 9 ) << diff.count() + << " s\n"; + } + + { + auto aggregatedStart = std::chrono::high_resolution_clock::now(); + + for ( size_t i = 0; i < iterationCount; i++ ) + { + auto start = std::chrono::high_resolution_clock::now(); + + auto objects = RifEclipseTextFileReader::readKeywordAndValuesFile( filename ); + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "RifEclipseTextFileReader File : " << std::setw( 9 ) << diff.count() << " s\n"; + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - aggregatedStart; + std::cout << "RifEclipseTextFileReader File [" << iterationCount << " runs] : " << std::setw( 9 ) + << diff.count() << " s\n"; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ReadKeywordsAndValuesFromFile ) +{ + QString qtFileName = QString( "%1/RifEclipseTextFileParser/GRID.GRDECL" ).arg( TEST_DATA_DIR ); + std::string filename = qtFileName.toStdString(); + + auto objects = RifEclipseTextFileReader::readKeywordAndValues( filename ); + + EXPECT_EQ( size_t( 7 ), objects.size() ); + for ( const auto& obj : objects ) + { + std::cout << obj.keyword << "\n"; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ReadLine_EmptyString ) +{ + std::string fileContent; + size_t offset = 0; + size_t bytesRead = 0; + auto line = RifEclipseTextFileReader::readLine( fileContent, offset, bytesRead ); + + EXPECT_EQ( size_t( 0 ), bytesRead ); + EXPECT_EQ( size_t( 0 ), line.size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ReadLine_TooLargeOffset ) +{ + std::string fileContent = "f"; + size_t offset = 10; + size_t bytesRead = 0; + auto line = RifEclipseTextFileReader::readLine( fileContent, offset, bytesRead ); + + EXPECT_EQ( size_t( 0 ), bytesRead ); + EXPECT_EQ( size_t( 0 ), line.size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ReadLine_SingleLineNoLineBreak ) +{ + std::string fileContent = "file content"; + size_t offset = 0; + size_t bytesRead = 0; + auto line = RifEclipseTextFileReader::readLine( fileContent, offset, bytesRead ); + + EXPECT_EQ( size_t( 12 ), bytesRead ); + EXPECT_EQ( size_t( 12 ), line.size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ReadLine_TwoLinesWithLineBreak ) +{ + std::string fileContent = "file content\n next Line"; + size_t offset = 0; + size_t bytesRead = 0; + auto line = RifEclipseTextFileReader::readLine( fileContent, offset, bytesRead ); + + // bytesRead includes line break + EXPECT_EQ( size_t( 13 ), bytesRead ); + EXPECT_EQ( size_t( 12 ), line.size() ); + + auto secondLine = RifEclipseTextFileReader::readLine( fileContent, offset + bytesRead, bytesRead ); + EXPECT_EQ( size_t( 10 ), bytesRead ); + EXPECT_EQ( size_t( 9 ), secondLine.size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RifEclipseTextFileReader, ValueMultiplier ) +{ + std::string fileContent = "ZCORN\n" + "2*2.21 0.5 3*12345.12\n" + "/\n"; + + auto keywordDataItems = RifEclipseTextFileReader::parseStringData( fileContent ); + + EXPECT_EQ( size_t( 1 ), keywordDataItems.size() ); + + auto firstKeyword = keywordDataItems.front(); + + EXPECT_EQ( size_t( 6 ), firstKeyword.values.size() ); + EXPECT_FLOAT_EQ( 2.21f, firstKeyword.values[0] ); + EXPECT_FLOAT_EQ( 2.21f, firstKeyword.values[1] ); + EXPECT_FLOAT_EQ( 0.5f, firstKeyword.values[2] ); + EXPECT_FLOAT_EQ( 12345.12f, firstKeyword.values[3] ); +} diff --git a/ApplicationLibCode/UnitTests/RigStatisticsMath-Test.cpp b/ApplicationLibCode/UnitTests/RigStatisticsMath-Test.cpp index 899777b474..17e42e4c6a 100644 --- a/ApplicationLibCode/UnitTests/RigStatisticsMath-Test.cpp +++ b/ApplicationLibCode/UnitTests/RigStatisticsMath-Test.cpp @@ -86,7 +86,8 @@ TEST( RigStatisticsMath, RankPercentiles ) pValPos.push_back( 40 ); pValPos.push_back( 50 ); pValPos.push_back( 90 ); - std::vector pVals = RigStatisticsMath::calculateNearestRankPercentiles( values, pValPos ); + std::vector pVals = + RigStatisticsMath::calculateNearestRankPercentiles( values, pValPos, RigStatisticsMath::PercentileStyle::REGULAR ); EXPECT_DOUBLE_EQ( -76092.8157632591000, pVals[0] ); EXPECT_DOUBLE_EQ( 2788.2723335651900, pVals[1] ); @@ -126,9 +127,9 @@ TEST( RigStatisticsMath, HistogramPercentiles ) histCalc.addData( values ); double p10, p50, p90; - p10 = histCalc.calculatePercentil( 0.1 ); - p50 = histCalc.calculatePercentil( 0.5 ); - p90 = histCalc.calculatePercentil( 0.9 ); + p10 = histCalc.calculatePercentil( 0.1, RigStatisticsMath::PercentileStyle::REGULAR ); + p50 = histCalc.calculatePercentil( 0.5, RigStatisticsMath::PercentileStyle::REGULAR ); + p90 = histCalc.calculatePercentil( 0.9, RigStatisticsMath::PercentileStyle::REGULAR ); EXPECT_DOUBLE_EQ( -76273.240559989776, p10 ); EXPECT_DOUBLE_EQ( 5312.1312871307755, p50 ); @@ -164,10 +165,11 @@ TEST( RigStatisticsMath, InterpolatedPercentiles ) pValPos.push_back( 40 ); pValPos.push_back( 50 ); pValPos.push_back( 90 ); - std::vector pVals = RigStatisticsMath::calculateInterpolatedPercentiles( values, pValPos ); + std::vector pVals = + RigStatisticsMath::calculateInterpolatedPercentiles( values, pValPos, RigStatisticsMath::PercentileStyle::REGULAR ); EXPECT_DOUBLE_EQ( -72278.340409937548, pVals[0] ); - EXPECT_DOUBLE_EQ( -2265.6006907818719, pVals[1] ); + EXPECT_DOUBLE_EQ( -2265.6006907818496, pVals[1] ); EXPECT_DOUBLE_EQ( 6391.9799990972897, pVals[2] ); EXPECT_DOUBLE_EQ( 93073.49128098879, pVals[3] ); } @@ -226,6 +228,8 @@ TEST( RigStatisticsMath, Accumulators ) //-------------------------------------------------------------------------------------------------- TEST( RigStatisticsMath, calculateStatisticsCurves ) { + RigStatisticsMath::PercentileStyle percentileStyle = RigStatisticsMath::PercentileStyle::REGULAR; + { std::vector values; @@ -234,7 +238,7 @@ TEST( RigStatisticsMath, calculateStatisticsCurves ) double p50 = HUGE_VAL; double p90 = HUGE_VAL; - RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean, percentileStyle ); EXPECT_TRUE( std::isinf( p10 ) ); EXPECT_TRUE( std::isinf( p50 ) ); EXPECT_TRUE( std::isinf( p90 ) ); @@ -254,7 +258,7 @@ TEST( RigStatisticsMath, calculateStatisticsCurves ) double p90 = HUGE_VAL; // If we have few samples, P10 and P90 cannot be computed - RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean, percentileStyle ); EXPECT_TRUE( std::isinf( p10 ) ); EXPECT_TRUE( std::isinf( p90 ) ); EXPECT_DOUBLE_EQ( 1.0, p50 ); @@ -269,7 +273,7 @@ TEST( RigStatisticsMath, calculateStatisticsCurves ) double p50 = HUGE_VAL; double p90 = HUGE_VAL; - RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean, percentileStyle ); EXPECT_DOUBLE_EQ( 1.0, p10 ); EXPECT_DOUBLE_EQ( 1.0, p50 ); EXPECT_FALSE( std::isinf( p90 ) ); @@ -284,7 +288,7 @@ TEST( RigStatisticsMath, calculateStatisticsCurves ) double p50 = HUGE_VAL; double p90 = HUGE_VAL; - RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean ); + RigStatisticsMath::calculateStatisticsCurves( values, &p10, &p50, &p90, &mean, percentileStyle ); EXPECT_DOUBLE_EQ( 1.0, p10 ); EXPECT_DOUBLE_EQ( 1.0, p50 ); EXPECT_DOUBLE_EQ( 1.0, p90 ); diff --git a/ApplicationLibCode/UnitTests/RigSurfaceResampler-Test.cpp b/ApplicationLibCode/UnitTests/RigSurfaceResampler-Test.cpp new file mode 100644 index 0000000000..5828ab9686 --- /dev/null +++ b/ApplicationLibCode/UnitTests/RigSurfaceResampler-Test.cpp @@ -0,0 +1,85 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "gtest/gtest.h" + +#include "RigSurfaceResampler.h" +#include "cvfObject.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RigSurfaceResamplerTests, sameFlatGeometry ) +{ + cvf::ref targetSurface = cvf::make_ref(); + cvf::ref surface = cvf::make_ref(); + + // Make single triangle, and assign to both surfaces + double z = 2.0; + std::vector vertices = { cvf::Vec3d( -1.0, -1.0, z ), cvf::Vec3d( 1.0, -1.0, z ), cvf::Vec3d( -1.0, 1.0, z ) }; + std::vector indices = { 2, 1, 0 }; + + targetSurface->setTriangleData( indices, vertices ); + surface->setTriangleData( indices, vertices ); + + cvf::ref resampledSurface = RigSurfaceResampler::resampleSurface( targetSurface, surface ); + + ASSERT_EQ( resampledSurface->triangleIndices().size(), targetSurface->triangleIndices().size() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RigSurfaceResamplerTests, flatGeometryLargerSource ) +{ + cvf::ref targetSurface = cvf::make_ref(); + cvf::ref surface = cvf::make_ref(); + + // Make two triangle: target smaller than the surface + std::vector indices = { 2, 1, 0 }; + + std::vector targetVertices = { cvf::Vec3d( -1.0, -1.0, 1.0 ), + cvf::Vec3d( 1.0, -1.0, 1.0 ), + cvf::Vec3d( -1.0, 1.0, 1.0 ) }; + + targetSurface->setTriangleData( indices, targetVertices ); + + std::vector surfaceVertices = { cvf::Vec3d( -2.0, -2.0, 2.0 ), + cvf::Vec3d( 2.0, -2.0, 2.0 ), + cvf::Vec3d( -2.0, 2.0, 2.0 ) }; + + surface->setTriangleData( indices, surfaceVertices ); + + cvf::ref resampledSurface = RigSurfaceResampler::resampleSurface( targetSurface, surface ); + + ASSERT_EQ( resampledSurface->triangleIndices().size(), targetSurface->triangleIndices().size() ); + cvf::Vec3d r1 = resampledSurface->vertices()[0]; + ASSERT_EQ( r1.x(), -1.0 ); + ASSERT_EQ( r1.y(), -1.0 ); + ASSERT_EQ( r1.z(), 2.0 ); + + cvf::Vec3d r2 = resampledSurface->vertices()[1]; + ASSERT_EQ( r2.x(), 1.0 ); + ASSERT_EQ( r2.y(), -1.0 ); + ASSERT_EQ( r2.z(), 2.0 ); + + cvf::Vec3d r3 = resampledSurface->vertices()[2]; + ASSERT_EQ( r3.x(), -1.0 ); + ASSERT_EQ( r3.y(), 1.0 ); + ASSERT_EQ( r3.z(), 2.0 ); +} diff --git a/ApplicationLibCode/UnitTests/RigSurfaceStatisticsCalculator-Test.cpp b/ApplicationLibCode/UnitTests/RigSurfaceStatisticsCalculator-Test.cpp new file mode 100644 index 0000000000..5a68147422 --- /dev/null +++ b/ApplicationLibCode/UnitTests/RigSurfaceStatisticsCalculator-Test.cpp @@ -0,0 +1,81 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021 Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "gtest/gtest.h" + +#include "RigSurface.h" +#include "RigSurfaceStatisticsCalculator.h" + +#include "cvfObject.h" + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( RigSurfaceStatisticsTests, computeStatistics ) +{ + std::vector> surfaces; + for ( size_t i = 0; i < 100; i++ ) + { + cvf::ref surface = cvf::make_ref(); + std::vector indices = { 2, 1, 0 }; + std::vector vertices = { cvf::Vec3d( -1.0, -1.0, i ), + cvf::Vec3d( 1.0, -1.0, i ), + cvf::Vec3d( -1.0, 1.0, i ) }; + + surface->setTriangleData( indices, vertices ); + surfaces.push_back( surface ); + } + + cvf::ref statSurface = RigSurfaceStatisticsCalculator::computeStatistics( surfaces ); + ASSERT_TRUE( statSurface.notNull() ); + + ASSERT_EQ( statSurface->triangleIndices().size(), surfaces[0]->triangleIndices().size() ); + + const std::vector& propertyNames = statSurface->propertyNames(); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "MEAN" ) != propertyNames.end() ); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "MIN" ) != propertyNames.end() ); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "MAX" ) != propertyNames.end() ); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "P10" ) != propertyNames.end() ); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "P50" ) != propertyNames.end() ); + ASSERT_TRUE( std::find( propertyNames.begin(), propertyNames.end(), "P90" ) != propertyNames.end() ); + + const std::vector& meanValues = statSurface->propertyValues( "MEAN" ); + const std::vector& minValues = statSurface->propertyValues( "MIN" ); + const std::vector& maxValues = statSurface->propertyValues( "MAX" ); + const std::vector& p10Values = statSurface->propertyValues( "P10" ); + const std::vector& p50Values = statSurface->propertyValues( "P50" ); + const std::vector& p90Values = statSurface->propertyValues( "P90" ); + + // One value per vertex + ASSERT_EQ( 3u, meanValues.size() ); + ASSERT_EQ( 3u, minValues.size() ); + ASSERT_EQ( 3u, maxValues.size() ); + ASSERT_EQ( 3u, p10Values.size() ); + ASSERT_EQ( 3u, p50Values.size() ); + ASSERT_EQ( 3u, p90Values.size() ); + + for ( size_t i = 0; i < 3u; i++ ) + { + ASSERT_EQ( 49.5, meanValues[i] ); + ASSERT_EQ( 0, minValues[i] ); + ASSERT_EQ( 99, maxValues[i] ); + ASSERT_NEAR( 9.1, p90Values[i], 0.0001 ); + ASSERT_NEAR( 49.5, p50Values[i], 0.0001 ); + ASSERT_NEAR( 89.9, p10Values[i], 0.0001 ); + } +} diff --git a/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp b/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp index 500ae627eb..798c6f164a 100644 --- a/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp +++ b/ApplicationLibCode/UnitTests/RimSummaryCaseCollection-Test.cpp @@ -1,5 +1,6 @@ #include "gtest/gtest.h" +#include "RigEnsembleParameter.h" #include "RimSummaryCaseCollection.h" #include @@ -12,7 +13,7 @@ class RimSummaryCaseCollection_TESTER static void test1(); }; -TEST( RimSummaryCaseCollection, EnsembleParameter ) +TEST( RimSummaryCaseCollection, RigEnsembleParameter ) { RimSummaryCaseCollection_TESTER::test1(); } @@ -26,11 +27,11 @@ void RimSummaryCaseCollection_TESTER::test1() std::uniform_int_distribution countDistribution( 1u, 1000u ); size_t N = 1000; - std::vector parameters; + std::vector parameters; for ( size_t i = 0; i < N; ++i ) { - EnsembleParameter param; - param.type = EnsembleParameter::TYPE_NUMERIC; + RigEnsembleParameter param; + param.type = RigEnsembleParameter::TYPE_NUMERIC; size_t valueCount = countDistribution( gen ); @@ -77,18 +78,18 @@ void RimSummaryCaseCollection_TESTER::test1() size_t currentSize = parameters.size(); EXPECT_EQ( previousSize, currentSize ); - int currentVariation = (int)EnsembleParameter::HIGH_VARIATION; - for ( const EnsembleParameter& nameParamPair : parameters ) + int currentVariation = (int)RigEnsembleParameter::HIGH_VARIATION; + for ( const RigEnsembleParameter& nameParamPair : parameters ) { if ( nameParamPair.normalizedStdDeviation() == 0.0 ) { - EXPECT_EQ( nameParamPair.variationBin, (int)EnsembleParameter::NO_VARIATION ); + EXPECT_EQ( nameParamPair.variationBin, (int)RigEnsembleParameter::NO_VARIATION ); } else { - EXPECT_GE( nameParamPair.variationBin, (int)EnsembleParameter::LOW_VARIATION ); + EXPECT_GE( nameParamPair.variationBin, (int)RigEnsembleParameter::LOW_VARIATION ); } - EXPECT_LE( nameParamPair.variationBin, (int)EnsembleParameter::HIGH_VARIATION ); + EXPECT_LE( nameParamPair.variationBin, (int)RigEnsembleParameter::HIGH_VARIATION ); EXPECT_LE( nameParamPair.variationBin, currentVariation ); currentVariation = nameParamPair.variationBin; } diff --git a/ApplicationLibCode/UnitTests/RiuSummaryVectorDescriptionMap-Test.cpp b/ApplicationLibCode/UnitTests/RiuSummaryVectorDescriptionMap-Test.cpp index bdd571cb29..ace8b00d5a 100644 --- a/ApplicationLibCode/UnitTests/RiuSummaryVectorDescriptionMap-Test.cpp +++ b/ApplicationLibCode/UnitTests/RiuSummaryVectorDescriptionMap-Test.cpp @@ -1,6 +1,7 @@ #include "gtest/gtest.h" #include "RiuSummaryQuantityNameInfoProvider.h" +#include //-------------------------------------------------------------------------------------------------- /// @@ -87,3 +88,31 @@ TEST( RiuSummaryQuantityNameInfoProvider, Test6x ) EXPECT_TRUE( cat == RifEclipseSummaryAddress::SUMMARY_WELL ); } } + +TEST( DISABLED_RiuSummaryQuantityNameInfoProvider, PerformanceLookup ) +{ + std::vector values; + + values.emplace_back( "WOPT" ); + values.emplace_back( "WOPR" ); + values.emplace_back( "FOPT" ); + values.emplace_back( "FOPR" ); + values.emplace_back( "BHP" ); + values.emplace_back( "nothing" ); + + auto start = std::chrono::high_resolution_clock::now(); + + const size_t iterationCount = 10000000; + + for ( size_t i = 0; i < iterationCount; i++ ) + { + for ( const auto& s : values ) + { + RiuSummaryQuantityNameInfoProvider::instance()->categoryFromQuantityName( s ); + } + } + + auto end = std::chrono::high_resolution_clock::now(); + std::chrono::duration diff = end - start; + std::cout << "RiuSummaryQuantityNameInfoProvider : Duration " << std::setw( 9 ) << diff.count() << " s\n"; +} diff --git a/ApplicationLibCode/UnitTests/StructGridInterface-Test.cpp b/ApplicationLibCode/UnitTests/StructGridInterface-Test.cpp new file mode 100644 index 0000000000..b75adae292 --- /dev/null +++ b/ApplicationLibCode/UnitTests/StructGridInterface-Test.cpp @@ -0,0 +1,51 @@ +///////////////////////////////////////////////////////////////////////////////// +// +// Copyright (C) 2021- Equinor ASA +// +// ResInsight is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// ResInsight is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. +// +// See the GNU General Public License at +// for more details. +// +///////////////////////////////////////////////////////////////////////////////// + +#include "gtest/gtest.h" + +#include "cvfStructGrid.h" + +using namespace cvf; + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( StructGridInterfaceTest, TestEdgeVertices ) +{ + { + // Baseline + + StructGridInterface::FaceType face1 = StructGridInterface::NEG_K; + StructGridInterface::FaceType face2 = StructGridInterface::POS_I; + + auto indices = StructGridInterface::edgeVertexIndices( face1, face2 ); + EXPECT_EQ( indices.first, 2 ); + EXPECT_EQ( indices.second, 1 ); + } + + { + // Opposite order as baseline test + + StructGridInterface::FaceType face1 = StructGridInterface::POS_I; + StructGridInterface::FaceType face2 = StructGridInterface::NEG_K; + + auto indices = StructGridInterface::edgeVertexIndices( face1, face2 ); + EXPECT_EQ( indices.first, 2 ); + EXPECT_EQ( indices.second, 1 ); + } +} diff --git a/ApplicationLibCode/UnitTests/TestData/RifEclipseTextFileParser/GRID.GRDECL b/ApplicationLibCode/UnitTests/TestData/RifEclipseTextFileParser/GRID.GRDECL new file mode 100644 index 0000000000..fbf01f205a --- /dev/null +++ b/ApplicationLibCode/UnitTests/TestData/RifEclipseTextFileParser/GRID.GRDECL @@ -0,0 +1,15586 @@ +MAPUNITS + 'METRES ' +/ + +MAPAXES + 0.00000000E+00 0.10000000E+01 0.00000000E+00 0.00000000E+00 + 0.10000000E+01 0.00000000E+00 +/ +GRIDUNIT + 'METRES ' ' ' +/ + +SPECGRID + 11 16 40 1 F / + +COORD + 0.43280816E+06 0.64773790E+07 0.31619771E+04 0.43278591E+06 + 0.64773670E+07 0.32246011E+04 0.43285609E+06 0.64773775E+07 + 0.31642310E+04 0.43283372E+06 0.64773660E+07 0.32219600E+04 + 0.43290422E+06 0.64773760E+07 0.31656680E+04 0.43288031E+06 + 0.64773645E+07 0.32246951E+04 0.43295306E+06 0.64773755E+07 + 0.31638479E+04 0.43292725E+06 0.64773635E+07 0.32259551E+04 + 0.43300275E+06 0.64773750E+07 0.31582041E+04 0.43297541E+06 + 0.64773625E+07 0.32222300E+04 0.43305178E+06 0.64773745E+07 + 0.31545210E+04 0.43302481E+06 0.64773625E+07 0.32137300E+04 + 0.43309897E+06 0.64773730E+07 0.31585811E+04 0.43307294E+06 + 0.64773620E+07 0.32106650E+04 0.43314650E+06 0.64773720E+07 + 0.31632771E+04 0.43311928E+06 0.64773605E+07 0.32139089E+04 + 0.43319562E+06 0.64773715E+07 0.31624380E+04 0.43316569E+06 + 0.64773590E+07 0.32173350E+04 0.43324394E+06 0.64773705E+07 + 0.31635171E+04 0.43321300E+06 0.64773580E+07 0.32189241E+04 + 0.43329119E+06 0.64773695E+07 0.31693369E+04 0.43325962E+06 + 0.64773570E+07 0.32238279E+04 0.43333819E+06 0.64773685E+07 + 0.31770769E+04 0.43330556E+06 0.64773555E+07 0.32317981E+04 + 0.43281162E+06 0.64774305E+07 0.31514070E+04 0.43278756E+06 + 0.64774180E+07 0.32151350E+04 0.43285894E+06 0.64774290E+07 + 0.31562490E+04 0.43283491E+06 0.64774165E+07 0.32139880E+04 + 0.43290672E+06 0.64774275E+07 0.31590840E+04 0.43288091E+06 + 0.64774145E+07 0.32192219E+04 0.43295550E+06 0.64774265E+07 + 0.31570471E+04 0.43292759E+06 0.64774135E+07 0.32215000E+04 + 0.43300419E+06 0.64774255E+07 0.31544800E+04 0.43297550E+06 + 0.64774125E+07 0.32188110E+04 0.43305169E+06 0.64774240E+07 + 0.31563140E+04 0.43302372E+06 0.64774120E+07 0.32149519E+04 + 0.43309803E+06 0.64774225E+07 0.31633149E+04 0.43307044E+06 + 0.64774105E+07 0.32167400E+04 0.43314562E+06 0.64774215E+07 + 0.31671631E+04 0.43311594E+06 0.64774090E+07 0.32229519E+04 + 0.43319416E+06 0.64774205E+07 0.31667939E+04 0.43316234E+06 + 0.64774075E+07 0.32267510E+04 0.43324150E+06 0.64774195E+07 + 0.31707561E+04 0.43320947E+06 0.64774065E+07 0.32289221E+04 + 0.43328881E+06 0.64774185E+07 0.31760559E+04 0.43325566E+06 + 0.64774050E+07 0.32338330E+04 0.43333547E+06 0.64774175E+07 + 0.31831150E+04 0.43330278E+06 0.64774045E+07 0.32365320E+04 + 0.43281562E+06 0.64774825E+07 0.31420371E+04 0.43278909E+06 + 0.64774685E+07 0.32076941E+04 0.43286331E+06 0.64774810E+07 + 0.31449299E+04 0.43283622E+06 0.64774670E+07 0.32074009E+04 + 0.43291134E+06 0.64774795E+07 0.31463611E+04 0.43288231E+06 + 0.64774650E+07 0.32117749E+04 0.43295934E+06 0.64774780E+07 + 0.31455249E+04 0.43293009E+06 0.64774640E+07 0.32103140E+04 + 0.43300581E+06 0.64774760E+07 0.31497041E+04 0.43297850E+06 + 0.64774635E+07 0.32064790E+04 0.43305172E+06 0.64774740E+07 + 0.31567629E+04 0.43302594E+06 0.64774630E+07 0.32056521E+04 + 0.43309778E+06 0.64774725E+07 0.31641479E+04 0.43307153E+06 + 0.64774610E+07 0.32101089E+04 0.43314494E+06 0.64774710E+07 + 0.31683960E+04 0.43311634E+06 0.64774590E+07 0.32176599E+04 + 0.43319256E+06 0.64774700E+07 0.31704871E+04 0.43316200E+06 + 0.64774570E+07 0.32231699E+04 0.43323913E+06 0.64774685E+07 + 0.31763640E+04 0.43320788E+06 0.64774560E+07 0.32287280E+04 + 0.43328572E+06 0.64774675E+07 0.31827891E+04 0.43325359E+06 + 0.64774545E+07 0.32350840E+04 0.43333175E+06 0.64774660E+07 + 0.31902439E+04 0.43330166E+06 0.64774540E+07 0.32352319E+04 + 0.43281863E+06 0.64775340E+07 0.31404900E+04 0.43279372E+06 + 0.64775210E+07 0.31948870E+04 0.43286766E+06 0.64775330E+07 + 0.31353750E+04 0.43284309E+06 0.64775205E+07 0.31863420E+04 + 0.43291522E+06 0.64775310E+07 0.31359189E+04 0.43289003E+06 + 0.64775190E+07 0.31868660E+04 0.43296131E+06 0.64775290E+07 + 0.31403711E+04 0.43293875E+06 0.64775180E+07 0.31827380E+04 + 0.43300528E+06 0.64775260E+07 0.31520720E+04 0.43298303E+06 + 0.64775160E+07 0.31888679E+04 0.43304966E+06 0.64775230E+07 + 0.31638501E+04 0.43302634E+06 0.64775130E+07 0.31995500E+04 + 0.43309622E+06 0.64775215E+07 0.31693440E+04 0.43307053E+06 + 0.64775105E+07 0.32086741E+04 0.43314369E+06 0.64775205E+07 + 0.31712581E+04 0.43311603E+06 0.64775085E+07 0.32148530E+04 + 0.43319025E+06 0.64775190E+07 0.31755310E+04 0.43316219E+06 + 0.64775075E+07 0.32196111E+04 0.43323553E+06 0.64775170E+07 + 0.31842871E+04 0.43320837E+06 0.64775060E+07 0.32243230E+04 + 0.43328047E+06 0.64775155E+07 0.31938650E+04 0.43325425E+06 + 0.64775050E+07 0.32292271E+04 0.43332559E+06 0.64775140E+07 + 0.32019231E+04 0.43330103E+06 0.64775040E+07 0.32314761E+04 + 0.43281678E+06 0.64775825E+07 0.31559419E+04 0.43279809E+06 + 0.64775725E+07 0.31851211E+04 0.43286509E+06 0.64775815E+07 + 0.31500779E+04 0.43284472E+06 0.64775710E+07 0.31799961E+04 + 0.43291234E+06 0.64775795E+07 0.31494661E+04 0.43288994E+06 + 0.64775685E+07 0.31830969E+04 0.43295981E+06 0.64775780E+07 + 0.31493491E+04 0.43293694E+06 0.64775670E+07 0.31842219E+04 + 0.43300634E+06 0.64775760E+07 0.31525459E+04 0.43298300E+06 + 0.64775655E+07 0.31874829E+04 0.43305206E+06 0.64775740E+07 + 0.31588330E+04 0.43302878E+06 0.64775635E+07 0.31937061E+04 + 0.43309822E+06 0.64775725E+07 0.31638240E+04 0.43307491E+06 + 0.64775625E+07 0.31981750E+04 0.43314453E+06 0.64775705E+07 + 0.31676121E+04 0.43312200E+06 0.64775610E+07 0.31991721E+04 + 0.43318937E+06 0.64775685E+07 0.31752500E+04 0.43316684E+06 + 0.64775595E+07 0.32037520E+04 0.43323303E+06 0.64775665E+07 + 0.31867500E+04 0.43321006E+06 0.64775570E+07 0.32140200E+04 + 0.43327656E+06 0.64775640E+07 0.31980371E+04 0.43325347E+06 + 0.64775550E+07 0.32240430E+04 0.43332047E+06 0.64775620E+07 + 0.32074351E+04 0.43329684E+06 0.64775530E+07 0.32328181E+04 + 0.43281428E+06 0.64776310E+07 0.31693369E+04 0.43279341E+06 + 0.64776200E+07 0.31985049E+04 0.43285941E+06 0.64776280E+07 + 0.31722129E+04 0.43283900E+06 0.64776175E+07 0.31994351E+04 + 0.43290609E+06 0.64776260E+07 0.31723989E+04 0.43288503E+06 + 0.64776160E+07 0.32010200E+04 0.43295503E+06 0.64776255E+07 + 0.31672771E+04 0.43293306E+06 0.64776155E+07 0.31985129E+04 + 0.43300475E+06 0.64776250E+07 0.31600669E+04 0.43298328E+06 + 0.64776155E+07 0.31900500E+04 0.43305237E+06 0.64776240E+07 + 0.31583291E+04 0.43303238E+06 0.64776155E+07 0.31843020E+04 + 0.43309837E+06 0.64776225E+07 0.31616670E+04 0.43307834E+06 + 0.64776135E+07 0.31856721E+04 0.43314447E+06 0.64776205E+07 + 0.31654570E+04 0.43312253E+06 0.64776115E+07 0.31913911E+04 + 0.43318937E+06 0.64776185E+07 0.31721111E+04 0.43316825E+06 + 0.64776100E+07 0.31970710E+04 0.43323288E+06 0.64776165E+07 + 0.31825061E+04 0.43321250E+06 0.64776080E+07 0.32049819E+04 + 0.43327556E+06 0.64776140E+07 0.31943081E+04 0.43325397E+06 + 0.64776055E+07 0.32171780E+04 0.43331812E+06 0.64776115E+07 + 0.32060591E+04 0.43329572E+06 0.64776030E+07 0.32296489E+04 + 0.43281603E+06 0.64776815E+07 0.31705061E+04 0.43279697E+06 + 0.64776715E+07 0.31957891E+04 0.43285922E+06 0.64776775E+07 + 0.31785049E+04 0.43283956E+06 0.64776675E+07 0.32035020E+04 + 0.43290547E+06 0.64776755E+07 0.31788760E+04 0.43288356E+06 + 0.64776650E+07 0.32083931E+04 0.43295275E+06 0.64776740E+07 + 0.31762061E+04 0.43293056E+06 0.64776635E+07 0.32072561E+04 + 0.43300006E+06 0.64776730E+07 0.31734431E+04 0.43297875E+06 + 0.64776630E+07 0.32026689E+04 0.43304753E+06 0.64776720E+07 + 0.31708181E+04 0.43302766E+06 0.64776635E+07 0.31960471E+04 + 0.43309516E+06 0.64776710E+07 0.31691819E+04 0.43307450E+06 + 0.64776620E+07 0.31940100E+04 0.43314344E+06 0.64776700E+07 + 0.31669150E+04 0.43312247E+06 0.64776615E+07 0.31928140E+04 + 0.43319000E+06 0.64776690E+07 0.31683059E+04 0.43317144E+06 + 0.64776615E+07 0.31902019E+04 0.43323425E+06 0.64776670E+07 + 0.31750569E+04 0.43321503E+06 0.64776590E+07 0.31949751E+04 + 0.43327706E+06 0.64776645E+07 0.31847830E+04 0.43325463E+06 + 0.64776560E+07 0.32087791E+04 0.43331984E+06 0.64776625E+07 + 0.31949451E+04 0.43329534E+06 0.64776530E+07 0.32239180E+04 + 0.43281844E+06 0.64777320E+07 0.31697939E+04 0.43279953E+06 + 0.64777225E+07 0.31929009E+04 0.43286153E+06 0.64777280E+07 + 0.31761289E+04 0.43284159E+06 0.64777185E+07 0.31991870E+04 + 0.43290609E+06 0.64777255E+07 0.31793479E+04 0.43288475E+06 + 0.64777155E+07 0.32063730E+04 0.43295259E+06 0.64777240E+07 + 0.31778140E+04 0.43293138E+06 0.64777140E+07 0.32059561E+04 + 0.43299891E+06 0.64777220E+07 0.31772271E+04 0.43297825E+06 + 0.64777130E+07 0.32043799E+04 0.43304575E+06 0.64777210E+07 + 0.31758789E+04 0.43302528E+06 0.64777120E+07 0.32022959E+04 + 0.43309437E+06 0.64777205E+07 0.31709221E+04 0.43307262E+06 + 0.64777110E+07 0.31998159E+04 0.43314397E+06 0.64777205E+07 + 0.31637581E+04 0.43312300E+06 0.64777115E+07 0.31913970E+04 + 0.43319103E+06 0.64777195E+07 0.31623020E+04 0.43317156E+06 + 0.64777115E+07 0.31858860E+04 0.43323559E+06 0.64777175E+07 + 0.31671589E+04 0.43321672E+06 0.64777100E+07 0.31880371E+04 + 0.43327938E+06 0.64777155E+07 0.31734929E+04 0.43325856E+06 + 0.64777075E+07 0.31966230E+04 0.43332316E+06 0.64777140E+07 + 0.31790391E+04 0.43329997E+06 0.64777055E+07 0.32079341E+04 + 0.43281731E+06 0.64777805E+07 0.31773850E+04 0.43279688E+06 + 0.64777705E+07 0.32027839E+04 0.43286050E+06 0.64777770E+07 + 0.31809250E+04 0.43284134E+06 0.64777680E+07 0.32020381E+04 + 0.43290369E+06 0.64777740E+07 0.31867710E+04 0.43288341E+06 + 0.64777645E+07 0.32102759E+04 0.43295059E+06 0.64777725E+07 + 0.31838091E+04 0.43292922E+06 0.64777630E+07 0.32116321E+04 + 0.43299831E+06 0.64777715E+07 0.31787371E+04 0.43297778E+06 + 0.64777625E+07 0.32056389E+04 0.43304559E+06 0.64777705E+07 + 0.31753521E+04 0.43302531E+06 0.64777620E+07 0.32013940E+04 + 0.43309378E+06 0.64777700E+07 0.31703840E+04 0.43307262E+06 + 0.64777615E+07 0.31984441E+04 0.43314316E+06 0.64777700E+07 + 0.31625081E+04 0.43312231E+06 0.64777615E+07 0.31912141E+04 + 0.43319059E+06 0.64777690E+07 0.31591340E+04 0.43317200E+06 + 0.64777615E+07 0.31831250E+04 0.43323541E+06 0.64777675E+07 + 0.31629509E+04 0.43321716E+06 0.64777605E+07 0.31845300E+04 + 0.43327956E+06 0.64777655E+07 0.31678440E+04 0.43326119E+06 + 0.64777585E+07 0.31892351E+04 0.43332344E+06 0.64777640E+07 + 0.31717700E+04 0.43330441E+06 0.64777570E+07 0.31935540E+04 + 0.43281594E+06 0.64778290E+07 0.31846421E+04 0.43279234E+06 + 0.64778175E+07 0.32163730E+04 0.43285919E+06 0.64778260E+07 + 0.31868779E+04 0.43283875E+06 0.64778165E+07 0.32114131E+04 + 0.43290238E+06 0.64778230E+07 0.31916211E+04 0.43288184E+06 + 0.64778135E+07 0.32161809E+04 0.43294906E+06 0.64778215E+07 + 0.31881489E+04 0.43292734E+06 0.64778115E+07 0.32170149E+04 + 0.43299738E+06 0.64778210E+07 0.31807539E+04 0.43297562E+06 + 0.64778115E+07 0.32106660E+04 0.43304512E+06 0.64778200E+07 + 0.31751809E+04 0.43302450E+06 0.64778115E+07 0.32035330E+04 + 0.43309313E+06 0.64778195E+07 0.31696140E+04 0.43307250E+06 + 0.64778110E+07 0.31976841E+04 0.43314194E+06 0.64778190E+07 + 0.31621660E+04 0.43312216E+06 0.64778115E+07 0.31899971E+04 + 0.43318975E+06 0.64778185E+07 0.31572219E+04 0.43317116E+06 + 0.64778110E+07 0.31816069E+04 0.43323509E+06 0.64778170E+07 + 0.31588159E+04 0.43321613E+06 0.64778100E+07 0.31827251E+04 + 0.43327897E+06 0.64778150E+07 0.31643540E+04 0.43325997E+06 + 0.64778080E+07 0.31887729E+04 0.43332147E+06 0.64778135E+07 + 0.31705049E+04 0.43330056E+06 0.64778060E+07 0.31975701E+04 + 0.43281828E+06 0.64778795E+07 0.31805740E+04 0.43279484E+06 + 0.64778685E+07 0.32137849E+04 0.43286150E+06 0.64778765E+07 + 0.31829209E+04 0.43284019E+06 0.64778665E+07 0.32111289E+04 + 0.43290500E+06 0.64778735E+07 0.31857739E+04 0.43288406E+06 + 0.64778645E+07 0.32132190E+04 0.43295144E+06 0.64778725E+07 + 0.31819810E+04 0.43292909E+06 0.64778625E+07 0.32132219E+04 + 0.43300016E+06 0.64778720E+07 0.31726799E+04 0.43297728E+06 + 0.64778625E+07 0.32061670E+04 0.43304859E+06 0.64778715E+07 + 0.31642461E+04 0.43302609E+06 0.64778620E+07 0.31972170E+04 + 0.43309497E+06 0.64778700E+07 0.31612881E+04 0.43307353E+06 + 0.64778615E+07 0.31918789E+04 0.43314125E+06 0.64778685E+07 + 0.31594629E+04 0.43312075E+06 0.64778605E+07 0.31888799E+04 + 0.43318778E+06 0.64778675E+07 0.31579031E+04 0.43316753E+06 + 0.64778600E+07 0.31866089E+04 0.43323312E+06 0.64778660E+07 + 0.31591609E+04 0.43321253E+06 0.64778585E+07 0.31882090E+04 + 0.43336238E+06 0.64778945E+07 0.30396069E+04 0.43335069E+06 + 0.64778905E+07 0.30565840E+04 0.43341050E+06 0.64778930E+07 + 0.30378870E+04 0.43339662E+06 0.64778885E+07 0.30579741E+04 + 0.43282138E+06 0.64779305E+07 0.31739939E+04 0.43279741E+06 + 0.64779190E+07 0.32083479E+04 0.43286591E+06 0.64779280E+07 + 0.31714270E+04 0.43284525E+06 0.64779185E+07 0.31994309E+04 + 0.43290931E+06 0.64779250E+07 0.31738069E+04 0.43288903E+06 + 0.64779160E+07 0.32002180E+04 0.43295519E+06 0.64779235E+07 + 0.31707161E+04 0.43293263E+06 0.64779140E+07 0.32024290E+04 + 0.43300237E+06 0.64779225E+07 0.31633660E+04 0.43297909E+06 + 0.64779130E+07 0.31986499E+04 0.43304850E+06 0.64779210E+07 + 0.31594060E+04 0.43302581E+06 0.64779115E+07 0.31938889E+04 + 0.43309428E+06 0.64779190E+07 0.31584500E+04 0.43307228E+06 + 0.64779105E+07 0.31912620E+04 0.43313981E+06 0.64779175E+07 + 0.31580530E+04 0.43311856E+06 0.64779095E+07 0.31898911E+04 + 0.43324384E+06 0.64779380E+07 0.30688320E+04 0.43322319E+06 + 0.64779300E+07 0.31003931E+04 0.43329187E+06 0.64779370E+07 + 0.30650581E+04 0.43327072E+06 0.64779290E+07 0.30975911E+04 + 0.43335184E+06 0.64779395E+07 0.30443081E+04 0.43334059E+06 + 0.64779355E+07 0.30615081E+04 0.43340225E+06 0.64779385E+07 + 0.30391899E+04 0.43338875E+06 0.64779345E+07 0.30593091E+04 + 0.43282128E+06 0.64779795E+07 0.31742510E+04 0.43279603E+06 + 0.64779680E+07 0.32134060E+04 0.43286781E+06 0.64779785E+07 + 0.31643491E+04 0.43284575E+06 0.64779685E+07 0.31960139E+04 + 0.43291222E+06 0.64779760E+07 0.31635901E+04 0.43289084E+06 + 0.64779665E+07 0.31928420E+04 0.43295662E+06 0.64779735E+07 + 0.31629141E+04 0.43293509E+06 0.64779645E+07 0.31932749E+04 + 0.43300172E+06 0.64779715E+07 0.31605281E+04 0.43298006E+06 + 0.64779630E+07 0.31924060E+04 0.43304722E+06 0.64779700E+07 + 0.31582561E+04 0.43302544E+06 0.64779615E+07 0.31909280E+04 + 0.43314350E+06 0.64779870E+07 0.30796479E+04 0.43312225E+06 + 0.64779790E+07 0.31118359E+04 0.43319097E+06 0.64779860E+07 + 0.30752080E+04 0.43316975E+06 0.64779780E+07 0.31078359E+04 + 0.43323941E+06 0.64779850E+07 0.30694199E+04 0.43322116E+06 + 0.64779790E+07 0.30979490E+04 0.43328659E+06 0.64779835E+07 + 0.30664719E+04 0.43326606E+06 0.64779770E+07 0.30985791E+04 + 0.43334587E+06 0.64779855E+07 0.30436489E+04 0.43333462E+06 + 0.64779825E+07 0.30613030E+04 0.43339541E+06 0.64779845E+07 + 0.30400640E+04 0.43338291E+06 0.64779820E+07 0.30590549E+04 + 0.43282028E+06 0.64780285E+07 0.31749939E+04 0.43279547E+06 + 0.64780170E+07 0.32147251E+04 0.43286625E+06 0.64780270E+07 + 0.31663750E+04 0.43284438E+06 0.64780170E+07 0.31995430E+04 + 0.43291141E+06 0.64780250E+07 0.31624290E+04 0.43289031E+06 + 0.64780160E+07 0.31930920E+04 0.43295616E+06 0.64780225E+07 + 0.31599041E+04 0.43293566E+06 0.64780145E+07 0.31896499E+04 + 0.43304691E+06 0.64780385E+07 0.30894851E+04 0.43302600E+06 + 0.64780300E+07 0.31201870E+04 0.43309319E+06 0.64780365E+07 + 0.30855090E+04 0.43307225E+06 0.64780285E+07 0.31168540E+04 + 0.43314006E+06 0.64780345E+07 0.30810410E+04 0.43311891E+06 + 0.64780275E+07 0.31132729E+04 0.43318784E+06 0.64780330E+07 + 0.30766809E+04 0.43316578E+06 0.64780265E+07 0.31108840E+04 + 0.43323544E+06 0.64780315E+07 0.30716570E+04 0.43321378E+06 + 0.64780260E+07 0.31057671E+04 0.43328187E+06 0.64780300E+07 + 0.30680640E+04 0.43326066E+06 0.64780255E+07 0.31016521E+04 + 0.43334050E+06 0.64780310E+07 0.30440330E+04 0.43332928E+06 + 0.64780285E+07 0.30618491E+04 0.43338978E+06 0.64780300E+07 + 0.30406421E+04 0.43337744E+06 0.64780285E+07 0.30596750E+04 + 0.43281975E+06 0.64780780E+07 0.31740330E+04 0.43279706E+06 + 0.64780675E+07 0.32086021E+04 0.43286378E+06 0.64780750E+07 + 0.31688369E+04 0.43284234E+06 0.64780655E+07 0.32008870E+04 + 0.43295181E+06 0.64780915E+07 0.31000591E+04 0.43293037E+06 + 0.64780820E+07 0.31313740E+04 0.43299722E+06 0.64780885E+07 + 0.30960471E+04 0.43297578E+06 0.64780800E+07 0.31275879E+04 + 0.43304400E+06 0.64780865E+07 0.30904160E+04 0.43302266E+06 + 0.64780785E+07 0.31223450E+04 0.43309106E+06 0.64780840E+07 + 0.30862791E+04 0.43306934E+06 0.64780770E+07 0.31197451E+04 + 0.43313734E+06 0.64780815E+07 0.30829929E+04 0.43311619E+06 + 0.64780760E+07 0.31161069E+04 0.43318441E+06 0.64780800E+07 + 0.30795471E+04 0.43316338E+06 0.64780750E+07 0.31127981E+04 + 0.43323194E+06 0.64780780E+07 0.30736631E+04 0.43321069E+06 + 0.64780745E+07 0.31077051E+04 0.43327834E+06 0.64780765E+07 + 0.30689561E+04 0.43325731E+06 0.64780740E+07 0.31028979E+04 + 0.43333650E+06 0.64780765E+07 0.30439971E+04 0.43332519E+06 + 0.64780750E+07 0.30623730E+04 0.43338509E+06 0.64780755E+07 + 0.30409109E+04 0.43337263E+06 0.64780750E+07 0.30607461E+04 + 0.43286084E+06 0.64781465E+07 0.31105750E+04 0.43283919E+06 + 0.64781365E+07 0.31427661E+04 0.43290400E+06 0.64781425E+07 + 0.31074189E+04 0.43288213E+06 0.64781325E+07 0.31397749E+04 + 0.43294866E+06 0.64781395E+07 0.31024351E+04 0.43292694E+06 + 0.64781300E+07 0.31348391E+04 0.43299581E+06 0.64781365E+07 + 0.30966189E+04 0.43297344E+06 0.64781285E+07 0.31311201E+04 + 0.43304247E+06 0.64781335E+07 0.30911479E+04 0.43302081E+06 + 0.64781270E+07 0.31253469E+04 0.43308884E+06 0.64781310E+07 + 0.30874309E+04 0.43306875E+06 0.64781260E+07 0.31201621E+04 + 0.43313628E+06 0.64781285E+07 0.30811321E+04 0.43311616E+06 + 0.64781250E+07 0.31135811E+04 0.43318337E+06 0.64781265E+07 + 0.30761279E+04 0.43316269E+06 0.64781240E+07 0.31101931E+04 + 0.43322925E+06 0.64781250E+07 0.30741741E+04 0.43320859E+06 + 0.64781235E+07 0.31084209E+04 0.43327497E+06 0.64781230E+07 + 0.30711021E+04 0.43325469E+06 0.64781225E+07 0.31046770E+04 + 0.43331978E+06 0.64781220E+07 0.30669861E+04 0.43329919E+06 + 0.64781215E+07 0.31010540E+04 0.43336647E+06 0.64781210E+07 + 0.30638850E+04 0.43334516E+06 0.64781215E+07 0.30988621E+04 + 0.43285831E+06 0.64781940E+07 0.31123191E+04 0.43283656E+06 + 0.64781840E+07 0.31445811E+04 0.43290159E+06 0.64781900E+07 + 0.31094260E+04 0.43287972E+06 0.64781805E+07 0.31426670E+04 + 0.43294553E+06 0.64781860E+07 0.31067229E+04 0.43292391E+06 + 0.64781780E+07 0.31406760E+04 0.43299219E+06 0.64781830E+07 + 0.31010149E+04 0.43297122E+06 0.64781770E+07 0.31355400E+04 + 0.43304037E+06 0.64781805E+07 0.30910649E+04 0.43302125E+06 + 0.64781760E+07 0.31227871E+04 0.43308781E+06 0.64781775E+07 + 0.30841770E+04 0.43306925E+06 0.64781750E+07 0.31143850E+04 + 0.43313469E+06 0.64781750E+07 0.30797019E+04 0.43311628E+06 + 0.64781735E+07 0.31095510E+04 0.43318088E+06 0.64781730E+07 + 0.30776550E+04 0.43316175E+06 0.64781725E+07 0.31086121E+04 + 0.43322597E+06 0.64781710E+07 0.30789141E+04 0.43320609E+06 + 0.64781715E+07 0.31122520E+04 0.43327297E+06 0.64781695E+07 + 0.30740969E+04 0.43325309E+06 0.64781710E+07 0.31081089E+04 + 0.43331884E+06 0.64781685E+07 0.30691150E+04 0.43329922E+06 + 0.64781705E+07 0.31023120E+04 0.43336444E+06 0.64781685E+07 + 0.30655620E+04 0.43334450E+06 0.64781715E+07 0.30988889E+04 +/ + +ZCORN + 0.31619771E+04 0.31642310E+04 0.31642310E+04 0.31656680E+04 + 0.31656680E+04 0.31638479E+04 0.31638479E+04 0.31582041E+04 + 0.31582041E+04 0.31545210E+04 0.31545210E+04 0.31585811E+04 + 0.31585811E+04 0.31632771E+04 0.31632771E+04 0.31624380E+04 + 0.31624380E+04 0.31635171E+04 0.31635171E+04 0.31693369E+04 + 0.31693369E+04 0.31770769E+04 0.31514070E+04 0.31562490E+04 + 0.31562490E+04 0.31590840E+04 0.31590840E+04 0.31570471E+04 + 0.31570471E+04 0.31544800E+04 0.31544800E+04 0.31563140E+04 + 0.31563140E+04 0.31633149E+04 0.31633149E+04 0.31671631E+04 + 0.31671631E+04 0.31667939E+04 0.31667939E+04 0.31707561E+04 + 0.31707561E+04 0.31760559E+04 0.31760559E+04 0.31831150E+04 + 0.31514070E+04 0.31562490E+04 0.31562490E+04 0.31590840E+04 + 0.31590840E+04 0.31570471E+04 0.31570471E+04 0.31544800E+04 + 0.31544800E+04 0.31563140E+04 0.31563140E+04 0.31633149E+04 + 0.31633149E+04 0.31671631E+04 0.31671631E+04 0.31667939E+04 + 0.31667939E+04 0.31707561E+04 0.31707561E+04 0.31760559E+04 + 0.31760559E+04 0.31831150E+04 0.31420371E+04 0.31449299E+04 + 0.31449299E+04 0.31463611E+04 0.31463611E+04 0.31455249E+04 + 0.31455249E+04 0.31497041E+04 0.31497041E+04 0.31567629E+04 + 0.31567629E+04 0.31641479E+04 0.31641479E+04 0.31683960E+04 + 0.31683960E+04 0.31704871E+04 0.31704871E+04 0.31763640E+04 + 0.31763640E+04 0.31827891E+04 0.31827891E+04 0.31902439E+04 + 0.31420371E+04 0.31449299E+04 0.31449299E+04 0.31463611E+04 + 0.31463611E+04 0.31455249E+04 0.31455249E+04 0.31497041E+04 + 0.31497041E+04 0.31567629E+04 0.31567629E+04 0.31641479E+04 + 0.31641479E+04 0.31683960E+04 0.31683960E+04 0.31704871E+04 + 0.31704871E+04 0.31763640E+04 0.31763640E+04 0.31827891E+04 + 0.31827891E+04 0.31902439E+04 0.31404900E+04 0.31353750E+04 + 0.31353750E+04 0.31359189E+04 0.31359189E+04 0.31403711E+04 + 0.31403711E+04 0.31520720E+04 0.31520720E+04 0.31638501E+04 + 0.31638501E+04 0.31693440E+04 0.31693440E+04 0.31712581E+04 + 0.31712581E+04 0.31755310E+04 0.31755310E+04 0.31842871E+04 + 0.31842871E+04 0.31938650E+04 0.31938650E+04 0.32019231E+04 + 0.31404900E+04 0.31353750E+04 0.31353750E+04 0.31359189E+04 + 0.31359189E+04 0.31403711E+04 0.31403711E+04 0.31520720E+04 + 0.31520720E+04 0.31638501E+04 0.31638501E+04 0.31693440E+04 + 0.31693440E+04 0.31712581E+04 0.31712581E+04 0.31755310E+04 + 0.31755310E+04 0.31842871E+04 0.31842871E+04 0.31938650E+04 + 0.31938650E+04 0.32019231E+04 0.31559419E+04 0.31500779E+04 + 0.31500779E+04 0.31494661E+04 0.31494661E+04 0.31493491E+04 + 0.31493491E+04 0.31525459E+04 0.31525459E+04 0.31588330E+04 + 0.31588330E+04 0.31638240E+04 0.31638240E+04 0.31676121E+04 + 0.31676121E+04 0.31752500E+04 0.31752500E+04 0.31867500E+04 + 0.31867500E+04 0.31980371E+04 0.31980371E+04 0.32074351E+04 + 0.31559419E+04 0.31500779E+04 0.31500779E+04 0.31494661E+04 + 0.31494661E+04 0.31493491E+04 0.31493491E+04 0.31525459E+04 + 0.31525459E+04 0.31588330E+04 0.31588330E+04 0.31638240E+04 + 0.31638240E+04 0.31676121E+04 0.31676121E+04 0.31752500E+04 + 0.31752500E+04 0.31867500E+04 0.31867500E+04 0.31980371E+04 + 0.31980371E+04 0.32074351E+04 0.31693369E+04 0.31722129E+04 + 0.31722129E+04 0.31723989E+04 0.31723989E+04 0.31672771E+04 + 0.31672771E+04 0.31600669E+04 0.31600669E+04 0.31583291E+04 + 0.31583291E+04 0.31616670E+04 0.31616670E+04 0.31654570E+04 + 0.31654570E+04 0.31721111E+04 0.31721111E+04 0.31825061E+04 + 0.31825061E+04 0.31943081E+04 0.31943081E+04 0.32060591E+04 + 0.31693369E+04 0.31722129E+04 0.31722129E+04 0.31723989E+04 + 0.31723989E+04 0.31672771E+04 0.31672771E+04 0.31600669E+04 + 0.31600669E+04 0.31583291E+04 0.31583291E+04 0.31616670E+04 + 0.31616670E+04 0.31654570E+04 0.31654570E+04 0.31721111E+04 + 0.31721111E+04 0.31825061E+04 0.31825061E+04 0.31943081E+04 + 0.31943081E+04 0.32060591E+04 0.31705061E+04 0.31785049E+04 + 0.31785049E+04 0.31788760E+04 0.31788760E+04 0.31762061E+04 + 0.31762061E+04 0.31734431E+04 0.31734431E+04 0.31708181E+04 + 0.31708181E+04 0.31691819E+04 0.31691819E+04 0.31669150E+04 + 0.31669150E+04 0.31683059E+04 0.31683059E+04 0.31750569E+04 + 0.31750569E+04 0.31847830E+04 0.31847830E+04 0.31949451E+04 + 0.31705061E+04 0.31785049E+04 0.31785049E+04 0.31788760E+04 + 0.31788760E+04 0.31762061E+04 0.31762061E+04 0.31734431E+04 + 0.31734431E+04 0.31708181E+04 0.31708181E+04 0.31691819E+04 + 0.31691819E+04 0.31669150E+04 0.31669150E+04 0.31683059E+04 + 0.31683059E+04 0.31750569E+04 0.31750569E+04 0.31847830E+04 + 0.31847830E+04 0.31949451E+04 0.31697939E+04 0.31761289E+04 + 0.31761289E+04 0.31793479E+04 0.31793479E+04 0.31778140E+04 + 0.31778140E+04 0.31772271E+04 0.31772271E+04 0.31758789E+04 + 0.31758789E+04 0.31709221E+04 0.31709221E+04 0.31637581E+04 + 0.31637581E+04 0.31623020E+04 0.31623020E+04 0.31671589E+04 + 0.31671589E+04 0.31734929E+04 0.31734929E+04 0.31790391E+04 + 0.31697939E+04 0.31761289E+04 0.31761289E+04 0.31793479E+04 + 0.31793479E+04 0.31778140E+04 0.31778140E+04 0.31772271E+04 + 0.31772271E+04 0.31758789E+04 0.31758789E+04 0.31709221E+04 + 0.31709221E+04 0.31637581E+04 0.31637581E+04 0.31623020E+04 + 0.31623020E+04 0.31671589E+04 0.31671589E+04 0.31734929E+04 + 0.31734929E+04 0.31790391E+04 0.31773850E+04 0.31809250E+04 + 0.31809250E+04 0.31867710E+04 0.31867710E+04 0.31838091E+04 + 0.31838091E+04 0.31787371E+04 0.31787371E+04 0.31753521E+04 + 0.31753521E+04 0.31703840E+04 0.31703840E+04 0.31625081E+04 + 0.31625081E+04 0.31591340E+04 0.31591340E+04 0.31629509E+04 + 0.31629509E+04 0.31678440E+04 0.31678440E+04 0.31717700E+04 + 0.31773850E+04 0.31809250E+04 0.31809250E+04 0.31867710E+04 + 0.31867710E+04 0.31838091E+04 0.31838091E+04 0.31787371E+04 + 0.31787371E+04 0.31753521E+04 0.31753521E+04 0.31703840E+04 + 0.31703840E+04 0.31625081E+04 0.31625081E+04 0.31591340E+04 + 0.31591340E+04 0.31629509E+04 0.31629509E+04 0.31678440E+04 + 0.31678440E+04 0.31717700E+04 0.31846421E+04 0.31868779E+04 + 0.31868779E+04 0.31916211E+04 0.31916211E+04 0.31881489E+04 + 0.31881489E+04 0.31807539E+04 0.31807539E+04 0.31751809E+04 + 0.31751809E+04 0.31696140E+04 0.31696140E+04 0.31621660E+04 + 0.31621660E+04 0.31572219E+04 0.31572219E+04 0.31588159E+04 + 0.31588159E+04 0.31643540E+04 0.31643540E+04 0.31705049E+04 + 0.31846421E+04 0.31868779E+04 0.31868779E+04 0.31916211E+04 + 0.31916211E+04 0.31881489E+04 0.31881489E+04 0.31807539E+04 + 0.31807539E+04 0.31751809E+04 0.31751809E+04 0.31696140E+04 + 0.31696140E+04 0.31621660E+04 0.31621660E+04 0.31572219E+04 + 0.31572219E+04 0.31588159E+04 0.31588159E+04 0.31643540E+04 + 0.31643540E+04 0.31705049E+04 0.31805740E+04 0.31829209E+04 + 0.31829209E+04 0.31857739E+04 0.31857739E+04 0.31819810E+04 + 0.31819810E+04 0.31726799E+04 0.31726799E+04 0.31642461E+04 + 0.31642461E+04 0.31612881E+04 0.31612881E+04 0.31594629E+04 + 0.31594629E+04 0.31579031E+04 0.31579031E+04 0.31591609E+04 + 0.31591609E+04 0.31637480E+04 0.31637480E+04 0.31710701E+04 + 0.31805740E+04 0.31829209E+04 0.31829209E+04 0.31857739E+04 + 0.31857739E+04 0.31819810E+04 0.31819810E+04 0.31726799E+04 + 0.31726799E+04 0.31642461E+04 0.31642461E+04 0.31612881E+04 + 0.31612881E+04 0.31594629E+04 0.31594629E+04 0.31579031E+04 + 0.31579031E+04 0.31591609E+04 0.31591609E+04 0.31637480E+04 + 0.30396069E+04 0.30378870E+04 0.31739939E+04 0.31714270E+04 + 0.31714270E+04 0.31738069E+04 0.31738069E+04 0.31707161E+04 + 0.31707161E+04 0.31633660E+04 0.31633660E+04 0.31594060E+04 + 0.31594060E+04 0.31584500E+04 0.31584500E+04 0.31580530E+04 + 0.31580530E+04 0.31584390E+04 0.31584390E+04 0.31597380E+04 + 0.31597380E+04 0.31618130E+04 0.30443081E+04 0.30391899E+04 + 0.31739939E+04 0.31714270E+04 0.31714270E+04 0.31738069E+04 + 0.31738069E+04 0.31707161E+04 0.31707161E+04 0.31633660E+04 + 0.31633660E+04 0.31594060E+04 0.31594060E+04 0.31584500E+04 + 0.31584500E+04 0.31580530E+04 0.31580530E+04 0.31584390E+04 + 0.30688320E+04 0.30650581E+04 0.30650581E+04 0.30631189E+04 + 0.30443081E+04 0.30391899E+04 0.31742510E+04 0.31643491E+04 + 0.31643491E+04 0.31635901E+04 0.31635901E+04 0.31629141E+04 + 0.31629141E+04 0.31605281E+04 0.31605281E+04 0.31582561E+04 + 0.31582561E+04 0.31568730E+04 0.31568730E+04 0.31571599E+04 + 0.31571599E+04 0.31563401E+04 0.30694199E+04 0.30664719E+04 + 0.30664719E+04 0.30633989E+04 0.30436489E+04 0.30400640E+04 + 0.31742510E+04 0.31643491E+04 0.31643491E+04 0.31635901E+04 + 0.31635901E+04 0.31629141E+04 0.31629141E+04 0.31605281E+04 + 0.31605281E+04 0.31582561E+04 0.31582561E+04 0.31568730E+04 + 0.30796479E+04 0.30752080E+04 0.30752080E+04 0.30694199E+04 + 0.30694199E+04 0.30664719E+04 0.30664719E+04 0.30633989E+04 + 0.30436489E+04 0.30400640E+04 0.31749939E+04 0.31663750E+04 + 0.31663750E+04 0.31624290E+04 0.31624290E+04 0.31599041E+04 + 0.31599041E+04 0.31575359E+04 0.31575359E+04 0.31570920E+04 + 0.31570920E+04 0.31559041E+04 0.30810410E+04 0.30766809E+04 + 0.30766809E+04 0.30716570E+04 0.30716570E+04 0.30680640E+04 + 0.30680640E+04 0.30648279E+04 0.30440330E+04 0.30406421E+04 + 0.31749939E+04 0.31663750E+04 0.31663750E+04 0.31624290E+04 + 0.31624290E+04 0.31599041E+04 0.31599041E+04 0.31575359E+04 + 0.30894851E+04 0.30855090E+04 0.30855090E+04 0.30810410E+04 + 0.30810410E+04 0.30766809E+04 0.30766809E+04 0.30716570E+04 + 0.30716570E+04 0.30680640E+04 0.30680640E+04 0.30648279E+04 + 0.30440330E+04 0.30406421E+04 0.31740330E+04 0.31688369E+04 + 0.31688369E+04 0.31640110E+04 0.31640110E+04 0.31615620E+04 + 0.31615620E+04 0.31570930E+04 0.30904160E+04 0.30862791E+04 + 0.30862791E+04 0.30829929E+04 0.30829929E+04 0.30795471E+04 + 0.30795471E+04 0.30736631E+04 0.30736631E+04 0.30689561E+04 + 0.30689561E+04 0.30656050E+04 0.30439971E+04 0.30409109E+04 + 0.31740330E+04 0.31688369E+04 0.31688369E+04 0.31640110E+04 + 0.31000591E+04 0.30960471E+04 0.30960471E+04 0.30904160E+04 + 0.30904160E+04 0.30862791E+04 0.30862791E+04 0.30829929E+04 + 0.30829929E+04 0.30795471E+04 0.30795471E+04 0.30736631E+04 + 0.30736631E+04 0.30689561E+04 0.30689561E+04 0.30656050E+04 + 0.30439971E+04 0.30409109E+04 0.31738501E+04 0.31708040E+04 + 0.31708040E+04 0.31655049E+04 0.31024351E+04 0.30966189E+04 + 0.30966189E+04 0.30911479E+04 0.30911479E+04 0.30874309E+04 + 0.30874309E+04 0.30811321E+04 0.30811321E+04 0.30761279E+04 + 0.30761279E+04 0.30741741E+04 0.30741741E+04 0.30711021E+04 + 0.30711021E+04 0.30669861E+04 0.30443140E+04 0.30409771E+04 + 0.31105750E+04 0.31074189E+04 0.31074189E+04 0.31024351E+04 + 0.31024351E+04 0.30966189E+04 0.30966189E+04 0.30911479E+04 + 0.30911479E+04 0.30874309E+04 0.30874309E+04 0.30811321E+04 + 0.30811321E+04 0.30761279E+04 0.30761279E+04 0.30741741E+04 + 0.30741741E+04 0.30711021E+04 0.30711021E+04 0.30669861E+04 + 0.30669861E+04 0.30638850E+04 0.31123191E+04 0.31094260E+04 + 0.31094260E+04 0.31067229E+04 0.31067229E+04 0.31010149E+04 + 0.31010149E+04 0.30910649E+04 0.30910649E+04 0.30841770E+04 + 0.30841770E+04 0.30797019E+04 0.30797019E+04 0.30776550E+04 + 0.30776550E+04 0.30789141E+04 0.30789141E+04 0.30740969E+04 + 0.30740969E+04 0.30691150E+04 0.30691150E+04 0.30655620E+04 + 0.31637280E+04 0.31659390E+04 0.31659390E+04 0.31674880E+04 + 0.31674880E+04 0.31657959E+04 0.31657959E+04 0.31601990E+04 + 0.31601990E+04 0.31563679E+04 0.31563679E+04 0.31602290E+04 + 0.31602290E+04 0.31650249E+04 0.31650249E+04 0.31643989E+04 + 0.31643989E+04 0.31654509E+04 0.31654509E+04 0.31712100E+04 + 0.31712100E+04 0.31789309E+04 0.31531990E+04 0.31580139E+04 + 0.31580139E+04 0.31609751E+04 0.31609751E+04 0.31590901E+04 + 0.31590901E+04 0.31565000E+04 0.31565000E+04 0.31581531E+04 + 0.31581531E+04 0.31650439E+04 0.31650439E+04 0.31690979E+04 + 0.31690979E+04 0.31688059E+04 0.31688059E+04 0.31727229E+04 + 0.31727229E+04 0.31779839E+04 0.31779839E+04 0.31848870E+04 + 0.31531990E+04 0.31580139E+04 0.31580139E+04 0.31609751E+04 + 0.31609751E+04 0.31590901E+04 0.31590901E+04 0.31565000E+04 + 0.31565000E+04 0.31581531E+04 0.31581531E+04 0.31650439E+04 + 0.31650439E+04 0.31690979E+04 0.31690979E+04 0.31688059E+04 + 0.31688059E+04 0.31727229E+04 0.31727229E+04 0.31779839E+04 + 0.31779839E+04 0.31848870E+04 0.31439290E+04 0.31468750E+04 + 0.31468750E+04 0.31484419E+04 0.31484419E+04 0.31474060E+04 + 0.31474060E+04 0.31513379E+04 0.31513379E+04 0.31582290E+04 + 0.31582290E+04 0.31656379E+04 0.31656379E+04 0.31701101E+04 + 0.31701101E+04 0.31722930E+04 0.31722930E+04 0.31781431E+04 + 0.31781431E+04 0.31844260E+04 0.31844260E+04 0.31916250E+04 + 0.31439290E+04 0.31468750E+04 0.31468750E+04 0.31484419E+04 + 0.31484419E+04 0.31474060E+04 0.31474060E+04 0.31513379E+04 + 0.31513379E+04 0.31582290E+04 0.31582290E+04 0.31656379E+04 + 0.31656379E+04 0.31701101E+04 0.31701101E+04 0.31722930E+04 + 0.31722930E+04 0.31781431E+04 0.31781431E+04 0.31844260E+04 + 0.31844260E+04 0.31916250E+04 0.31418540E+04 0.31367451E+04 + 0.31367451E+04 0.31372539E+04 0.31372539E+04 0.31415161E+04 + 0.31415161E+04 0.31532190E+04 0.31532190E+04 0.31650300E+04 + 0.31650300E+04 0.31707170E+04 0.31707170E+04 0.31727261E+04 + 0.31727261E+04 0.31769199E+04 0.31769199E+04 0.31855249E+04 + 0.31855249E+04 0.31949519E+04 0.31949519E+04 0.32028989E+04 + 0.31418540E+04 0.31367451E+04 0.31367451E+04 0.31372539E+04 + 0.31372539E+04 0.31415161E+04 0.31415161E+04 0.31532190E+04 + 0.31532190E+04 0.31650300E+04 0.31650300E+04 0.31707170E+04 + 0.31707170E+04 0.31727261E+04 0.31727261E+04 0.31769199E+04 + 0.31769199E+04 0.31855249E+04 0.31855249E+04 0.31949519E+04 + 0.31949519E+04 0.32028989E+04 0.31568091E+04 0.31509861E+04 + 0.31509861E+04 0.31505010E+04 0.31505010E+04 0.31504250E+04 + 0.31504250E+04 0.31536541E+04 0.31536541E+04 0.31599070E+04 + 0.31599070E+04 0.31648831E+04 0.31648831E+04 0.31686221E+04 + 0.31686221E+04 0.31762070E+04 0.31762070E+04 0.31876790E+04 + 0.31876790E+04 0.31989431E+04 0.31989431E+04 0.32083459E+04 + 0.31568091E+04 0.31509861E+04 0.31509861E+04 0.31505010E+04 + 0.31505010E+04 0.31504250E+04 0.31504250E+04 0.31536541E+04 + 0.31536541E+04 0.31599070E+04 0.31599070E+04 0.31648831E+04 + 0.31648831E+04 0.31686221E+04 0.31686221E+04 0.31762070E+04 + 0.31762070E+04 0.31876790E+04 0.31876790E+04 0.31989431E+04 + 0.31989431E+04 0.32083459E+04 0.31702161E+04 0.31730750E+04 + 0.31730750E+04 0.31732739E+04 0.31732739E+04 0.31682371E+04 + 0.31682371E+04 0.31610149E+04 0.31610149E+04 0.31591770E+04 + 0.31591770E+04 0.31625061E+04 0.31625061E+04 0.31663821E+04 + 0.31663821E+04 0.31729221E+04 0.31729221E+04 0.31832920E+04 + 0.31832920E+04 0.31951499E+04 0.31951499E+04 0.32069260E+04 + 0.31702161E+04 0.31730750E+04 0.31730750E+04 0.31732739E+04 + 0.31732739E+04 0.31682371E+04 0.31682371E+04 0.31610149E+04 + 0.31610149E+04 0.31591770E+04 0.31591770E+04 0.31625061E+04 + 0.31625061E+04 0.31663821E+04 0.31663821E+04 0.31729221E+04 + 0.31729221E+04 0.31832920E+04 0.31832920E+04 0.31951499E+04 + 0.31951499E+04 0.32069260E+04 0.31712161E+04 0.31792981E+04 + 0.31792981E+04 0.31798110E+04 0.31798110E+04 0.31771770E+04 + 0.31771770E+04 0.31743521E+04 0.31743521E+04 0.31716489E+04 + 0.31716489E+04 0.31700430E+04 0.31700430E+04 0.31677720E+04 + 0.31677720E+04 0.31690281E+04 0.31690281E+04 0.31758010E+04 + 0.31758010E+04 0.31857461E+04 0.31857461E+04 0.31960581E+04 + 0.31712161E+04 0.31792981E+04 0.31792981E+04 0.31798110E+04 + 0.31798110E+04 0.31771770E+04 0.31771770E+04 0.31743521E+04 + 0.31743521E+04 0.31716489E+04 0.31716489E+04 0.31700430E+04 + 0.31700430E+04 0.31677720E+04 0.31677720E+04 0.31690281E+04 + 0.31690281E+04 0.31758010E+04 0.31758010E+04 0.31857461E+04 + 0.31857461E+04 0.31960581E+04 0.31704541E+04 0.31768450E+04 + 0.31768450E+04 0.31801770E+04 0.31801770E+04 0.31786931E+04 + 0.31786931E+04 0.31780730E+04 0.31780730E+04 0.31767581E+04 + 0.31767581E+04 0.31719150E+04 0.31719150E+04 0.31646941E+04 + 0.31646941E+04 0.31630991E+04 0.31630991E+04 0.31678970E+04 + 0.31678970E+04 0.31743589E+04 0.31743589E+04 0.31801060E+04 + 0.31704541E+04 0.31768450E+04 0.31768450E+04 0.31801770E+04 + 0.31801770E+04 0.31786931E+04 0.31786931E+04 0.31780730E+04 + 0.31780730E+04 0.31767581E+04 0.31767581E+04 0.31719150E+04 + 0.31719150E+04 0.31646941E+04 0.31646941E+04 0.31630991E+04 + 0.31630991E+04 0.31678970E+04 0.31678970E+04 0.31743589E+04 + 0.31743589E+04 0.31801060E+04 0.31780891E+04 0.31815500E+04 + 0.31815500E+04 0.31874929E+04 0.31874929E+04 0.31846699E+04 + 0.31846699E+04 0.31795869E+04 0.31795869E+04 0.31762070E+04 + 0.31762070E+04 0.31713401E+04 0.31713401E+04 0.31634399E+04 + 0.31634399E+04 0.31599109E+04 0.31599109E+04 0.31636970E+04 + 0.31636970E+04 0.31685891E+04 0.31685891E+04 0.31726780E+04 + 0.31780891E+04 0.31815500E+04 0.31815500E+04 0.31874929E+04 + 0.31874929E+04 0.31846699E+04 0.31846699E+04 0.31795869E+04 + 0.31795869E+04 0.31762070E+04 0.31762070E+04 0.31713401E+04 + 0.31713401E+04 0.31634399E+04 0.31634399E+04 0.31599109E+04 + 0.31599109E+04 0.31636970E+04 0.31636970E+04 0.31685891E+04 + 0.31685891E+04 0.31726780E+04 0.31855300E+04 0.31875779E+04 + 0.31875779E+04 0.31923630E+04 0.31923630E+04 0.31890559E+04 + 0.31890559E+04 0.31816919E+04 0.31816919E+04 0.31760601E+04 + 0.31760601E+04 0.31705381E+04 0.31705381E+04 0.31630481E+04 + 0.31630481E+04 0.31581631E+04 0.31581631E+04 0.31597739E+04 + 0.31597739E+04 0.31654780E+04 0.31654780E+04 0.31717981E+04 + 0.31855300E+04 0.31875779E+04 0.31875779E+04 0.31923630E+04 + 0.31923630E+04 0.31890559E+04 0.31890559E+04 0.31816919E+04 + 0.31816919E+04 0.31760601E+04 0.31760601E+04 0.31705381E+04 + 0.31705381E+04 0.31630481E+04 0.31630481E+04 0.31581631E+04 + 0.31581631E+04 0.31597739E+04 0.31597739E+04 0.31654780E+04 + 0.31654780E+04 0.31717981E+04 0.31814409E+04 0.31836890E+04 + 0.31836890E+04 0.31865610E+04 0.31865610E+04 0.31829319E+04 + 0.31829319E+04 0.31737209E+04 0.31737209E+04 0.31653049E+04 + 0.31653049E+04 0.31623430E+04 0.31623430E+04 0.31606919E+04 + 0.31606919E+04 0.31594380E+04 0.31594380E+04 0.31609180E+04 + 0.31609180E+04 0.31652729E+04 0.31652729E+04 0.31725701E+04 + 0.31814409E+04 0.31836890E+04 0.31836890E+04 0.31865610E+04 + 0.31865610E+04 0.31829319E+04 0.31829319E+04 0.31737209E+04 + 0.31737209E+04 0.31653049E+04 0.31653049E+04 0.31623430E+04 + 0.31623430E+04 0.31606919E+04 0.31606919E+04 0.31594380E+04 + 0.31594380E+04 0.31609180E+04 0.31609180E+04 0.31652729E+04 + 0.30402109E+04 0.30385769E+04 0.31748821E+04 0.31721621E+04 + 0.31721621E+04 0.31745969E+04 0.31745969E+04 0.31717729E+04 + 0.31717729E+04 0.31645471E+04 0.31645471E+04 0.31606909E+04 + 0.31606909E+04 0.31599441E+04 0.31599441E+04 0.31598479E+04 + 0.31598479E+04 0.31601379E+04 0.31601379E+04 0.31616021E+04 + 0.31616021E+04 0.31637981E+04 0.30449050E+04 0.30399060E+04 + 0.31748821E+04 0.31721621E+04 0.31721621E+04 0.31745969E+04 + 0.31745969E+04 0.31717729E+04 0.31717729E+04 0.31645471E+04 + 0.31645471E+04 0.31606909E+04 0.31606909E+04 0.31599441E+04 + 0.31599441E+04 0.31598479E+04 0.31598479E+04 0.31601379E+04 + 0.30695081E+04 0.30657539E+04 0.30657539E+04 0.30638369E+04 + 0.30449050E+04 0.30399060E+04 0.31752830E+04 0.31651760E+04 + 0.31651760E+04 0.31645291E+04 0.31645291E+04 0.31640869E+04 + 0.31640869E+04 0.31619460E+04 0.31619460E+04 0.31599641E+04 + 0.31599641E+04 0.31584399E+04 0.31584399E+04 0.31588750E+04 + 0.31588750E+04 0.31582949E+04 0.30700491E+04 0.30671589E+04 + 0.30671589E+04 0.30641340E+04 0.30442041E+04 0.30406731E+04 + 0.31752830E+04 0.31651760E+04 0.31651760E+04 0.31645291E+04 + 0.31645291E+04 0.31640869E+04 0.31640869E+04 0.31619460E+04 + 0.31619460E+04 0.31599641E+04 0.31599641E+04 0.31584399E+04 + 0.30804370E+04 0.30759871E+04 0.30759871E+04 0.30700491E+04 + 0.30700491E+04 0.30671589E+04 0.30671589E+04 0.30641340E+04 + 0.30442041E+04 0.30406731E+04 0.31762729E+04 0.31675481E+04 + 0.31675481E+04 0.31636941E+04 0.31636941E+04 0.31611179E+04 + 0.31611179E+04 0.31588501E+04 0.31588501E+04 0.31586680E+04 + 0.31586680E+04 0.31575969E+04 0.30818491E+04 0.30775190E+04 + 0.30775190E+04 0.30724041E+04 0.30724041E+04 0.30687720E+04 + 0.30687720E+04 0.30655540E+04 0.30445249E+04 0.30411331E+04 + 0.31762729E+04 0.31675481E+04 0.31675481E+04 0.31636941E+04 + 0.31636941E+04 0.31611179E+04 0.31611179E+04 0.31588501E+04 + 0.30902290E+04 0.30862839E+04 0.30862839E+04 0.30818491E+04 + 0.30818491E+04 0.30775190E+04 0.30775190E+04 0.30724041E+04 + 0.30724041E+04 0.30687720E+04 0.30687720E+04 0.30655540E+04 + 0.30445249E+04 0.30411331E+04 0.31754790E+04 0.31700859E+04 + 0.31700859E+04 0.31651831E+04 0.31651831E+04 0.31628181E+04 + 0.31628181E+04 0.31583921E+04 0.30911890E+04 0.30870901E+04 + 0.30870901E+04 0.30838611E+04 0.30838611E+04 0.30804089E+04 + 0.30804089E+04 0.30744741E+04 0.30744741E+04 0.30696460E+04 + 0.30696460E+04 0.30663330E+04 0.30444819E+04 0.30414390E+04 + 0.31754790E+04 0.31700859E+04 0.31700859E+04 0.31651831E+04 + 0.31008159E+04 0.30968110E+04 0.30968110E+04 0.30911890E+04 + 0.30911890E+04 0.30870901E+04 0.30870901E+04 0.30838611E+04 + 0.30838611E+04 0.30804089E+04 0.30804089E+04 0.30744741E+04 + 0.30744741E+04 0.30696460E+04 0.30696460E+04 0.30663330E+04 + 0.30444819E+04 0.30414390E+04 0.31752080E+04 0.31720449E+04 + 0.31720449E+04 0.31666951E+04 0.31032271E+04 0.30974529E+04 + 0.30974529E+04 0.30919800E+04 0.30919800E+04 0.30882161E+04 + 0.30882161E+04 0.30819500E+04 0.30819500E+04 0.30769961E+04 + 0.30769961E+04 0.30750171E+04 0.30750171E+04 0.30718450E+04 + 0.30718450E+04 0.30676831E+04 0.30448220E+04 0.30415029E+04 + 0.31114131E+04 0.31082419E+04 0.31082419E+04 0.31032271E+04 + 0.31032271E+04 0.30974529E+04 0.30974529E+04 0.30919800E+04 + 0.30919800E+04 0.30882161E+04 0.30882161E+04 0.30819500E+04 + 0.30819500E+04 0.30769961E+04 0.30769961E+04 0.30750171E+04 + 0.30750171E+04 0.30718450E+04 0.30718450E+04 0.30676831E+04 + 0.30676831E+04 0.30645500E+04 0.31131589E+04 0.31102920E+04 + 0.31102920E+04 0.31075210E+04 0.31075210E+04 0.31018940E+04 + 0.31018940E+04 0.30917991E+04 0.30917991E+04 0.30848931E+04 + 0.30848931E+04 0.30804121E+04 0.30804121E+04 0.30784441E+04 + 0.30784441E+04 0.30796721E+04 0.30796721E+04 0.30748560E+04 + 0.30748560E+04 0.30697461E+04 0.30697461E+04 0.30661631E+04 + 0.31637280E+04 0.31659390E+04 0.31659390E+04 0.31674880E+04 + 0.31674880E+04 0.31657959E+04 0.31657959E+04 0.31601990E+04 + 0.31601990E+04 0.31563679E+04 0.31563679E+04 0.31602290E+04 + 0.31602290E+04 0.31650249E+04 0.31650249E+04 0.31643989E+04 + 0.31643989E+04 0.31654509E+04 0.31654509E+04 0.31712100E+04 + 0.31712100E+04 0.31789309E+04 0.31531990E+04 0.31580139E+04 + 0.31580139E+04 0.31609751E+04 0.31609751E+04 0.31590901E+04 + 0.31590901E+04 0.31565000E+04 0.31565000E+04 0.31581531E+04 + 0.31581531E+04 0.31650439E+04 0.31650439E+04 0.31690979E+04 + 0.31690979E+04 0.31688059E+04 0.31688059E+04 0.31727229E+04 + 0.31727229E+04 0.31779839E+04 0.31779839E+04 0.31848870E+04 + 0.31531990E+04 0.31580139E+04 0.31580139E+04 0.31609751E+04 + 0.31609751E+04 0.31590901E+04 0.31590901E+04 0.31565000E+04 + 0.31565000E+04 0.31581531E+04 0.31581531E+04 0.31650439E+04 + 0.31650439E+04 0.31690979E+04 0.31690979E+04 0.31688059E+04 + 0.31688059E+04 0.31727229E+04 0.31727229E+04 0.31779839E+04 + 0.31779839E+04 0.31848870E+04 0.31439290E+04 0.31468750E+04 + 0.31468750E+04 0.31484419E+04 0.31484419E+04 0.31474060E+04 + 0.31474060E+04 0.31513379E+04 0.31513379E+04 0.31582290E+04 + 0.31582290E+04 0.31656379E+04 0.31656379E+04 0.31701101E+04 + 0.31701101E+04 0.31722930E+04 0.31722930E+04 0.31781431E+04 + 0.31781431E+04 0.31844260E+04 0.31844260E+04 0.31916250E+04 + 0.31439290E+04 0.31468750E+04 0.31468750E+04 0.31484419E+04 + 0.31484419E+04 0.31474060E+04 0.31474060E+04 0.31513379E+04 + 0.31513379E+04 0.31582290E+04 0.31582290E+04 0.31656379E+04 + 0.31656379E+04 0.31701101E+04 0.31701101E+04 0.31722930E+04 + 0.31722930E+04 0.31781431E+04 0.31781431E+04 0.31844260E+04 + 0.31844260E+04 0.31916250E+04 0.31418540E+04 0.31367451E+04 + 0.31367451E+04 0.31372539E+04 0.31372539E+04 0.31415161E+04 + 0.31415161E+04 0.31532190E+04 0.31532190E+04 0.31650300E+04 + 0.31650300E+04 0.31707170E+04 0.31707170E+04 0.31727261E+04 + 0.31727261E+04 0.31769199E+04 0.31769199E+04 0.31855249E+04 + 0.31855249E+04 0.31949519E+04 0.31949519E+04 0.32028989E+04 + 0.31418540E+04 0.31367451E+04 0.31367451E+04 0.31372539E+04 + 0.31372539E+04 0.31415161E+04 0.31415161E+04 0.31532190E+04 + 0.31532190E+04 0.31650300E+04 0.31650300E+04 0.31707170E+04 + 0.31707170E+04 0.31727261E+04 0.31727261E+04 0.31769199E+04 + 0.31769199E+04 0.31855249E+04 0.31855249E+04 0.31949519E+04 + 0.31949519E+04 0.32028989E+04 0.31568091E+04 0.31509861E+04 + 0.31509861E+04 0.31505010E+04 0.31505010E+04 0.31504250E+04 + 0.31504250E+04 0.31536541E+04 0.31536541E+04 0.31599070E+04 + 0.31599070E+04 0.31648831E+04 0.31648831E+04 0.31686221E+04 + 0.31686221E+04 0.31762070E+04 0.31762070E+04 0.31876790E+04 + 0.31876790E+04 0.31989431E+04 0.31989431E+04 0.32083459E+04 + 0.31568091E+04 0.31509861E+04 0.31509861E+04 0.31505010E+04 + 0.31505010E+04 0.31504250E+04 0.31504250E+04 0.31536541E+04 + 0.31536541E+04 0.31599070E+04 0.31599070E+04 0.31648831E+04 + 0.31648831E+04 0.31686221E+04 0.31686221E+04 0.31762070E+04 + 0.31762070E+04 0.31876790E+04 0.31876790E+04 0.31989431E+04 + 0.31989431E+04 0.32083459E+04 0.31702161E+04 0.31730750E+04 + 0.31730750E+04 0.31732739E+04 0.31732739E+04 0.31682371E+04 + 0.31682371E+04 0.31610149E+04 0.31610149E+04 0.31591770E+04 + 0.31591770E+04 0.31625061E+04 0.31625061E+04 0.31663821E+04 + 0.31663821E+04 0.31729221E+04 0.31729221E+04 0.31832920E+04 + 0.31832920E+04 0.31951499E+04 0.31951499E+04 0.32069260E+04 + 0.31702161E+04 0.31730750E+04 0.31730750E+04 0.31732739E+04 + 0.31732739E+04 0.31682371E+04 0.31682371E+04 0.31610149E+04 + 0.31610149E+04 0.31591770E+04 0.31591770E+04 0.31625061E+04 + 0.31625061E+04 0.31663821E+04 0.31663821E+04 0.31729221E+04 + 0.31729221E+04 0.31832920E+04 0.31832920E+04 0.31951499E+04 + 0.31951499E+04 0.32069260E+04 0.31712161E+04 0.31792981E+04 + 0.31792981E+04 0.31798110E+04 0.31798110E+04 0.31771770E+04 + 0.31771770E+04 0.31743521E+04 0.31743521E+04 0.31716489E+04 + 0.31716489E+04 0.31700430E+04 0.31700430E+04 0.31677720E+04 + 0.31677720E+04 0.31690281E+04 0.31690281E+04 0.31758010E+04 + 0.31758010E+04 0.31857461E+04 0.31857461E+04 0.31960581E+04 + 0.31712161E+04 0.31792981E+04 0.31792981E+04 0.31798110E+04 + 0.31798110E+04 0.31771770E+04 0.31771770E+04 0.31743521E+04 + 0.31743521E+04 0.31716489E+04 0.31716489E+04 0.31700430E+04 + 0.31700430E+04 0.31677720E+04 0.31677720E+04 0.31690281E+04 + 0.31690281E+04 0.31758010E+04 0.31758010E+04 0.31857461E+04 + 0.31857461E+04 0.31960581E+04 0.31704541E+04 0.31768450E+04 + 0.31768450E+04 0.31801770E+04 0.31801770E+04 0.31786931E+04 + 0.31786931E+04 0.31780730E+04 0.31780730E+04 0.31767581E+04 + 0.31767581E+04 0.31719150E+04 0.31719150E+04 0.31646941E+04 + 0.31646941E+04 0.31630991E+04 0.31630991E+04 0.31678970E+04 + 0.31678970E+04 0.31743589E+04 0.31743589E+04 0.31801060E+04 + 0.31704541E+04 0.31768450E+04 0.31768450E+04 0.31801770E+04 + 0.31801770E+04 0.31786931E+04 0.31786931E+04 0.31780730E+04 + 0.31780730E+04 0.31767581E+04 0.31767581E+04 0.31719150E+04 + 0.31719150E+04 0.31646941E+04 0.31646941E+04 0.31630991E+04 + 0.31630991E+04 0.31678970E+04 0.31678970E+04 0.31743589E+04 + 0.31743589E+04 0.31801060E+04 0.31780891E+04 0.31815500E+04 + 0.31815500E+04 0.31874929E+04 0.31874929E+04 0.31846699E+04 + 0.31846699E+04 0.31795869E+04 0.31795869E+04 0.31762070E+04 + 0.31762070E+04 0.31713401E+04 0.31713401E+04 0.31634399E+04 + 0.31634399E+04 0.31599109E+04 0.31599109E+04 0.31636970E+04 + 0.31636970E+04 0.31685891E+04 0.31685891E+04 0.31726780E+04 + 0.31780891E+04 0.31815500E+04 0.31815500E+04 0.31874929E+04 + 0.31874929E+04 0.31846699E+04 0.31846699E+04 0.31795869E+04 + 0.31795869E+04 0.31762070E+04 0.31762070E+04 0.31713401E+04 + 0.31713401E+04 0.31634399E+04 0.31634399E+04 0.31599109E+04 + 0.31599109E+04 0.31636970E+04 0.31636970E+04 0.31685891E+04 + 0.31685891E+04 0.31726780E+04 0.31855300E+04 0.31875779E+04 + 0.31875779E+04 0.31923630E+04 0.31923630E+04 0.31890559E+04 + 0.31890559E+04 0.31816919E+04 0.31816919E+04 0.31760601E+04 + 0.31760601E+04 0.31705381E+04 0.31705381E+04 0.31630481E+04 + 0.31630481E+04 0.31581631E+04 0.31581631E+04 0.31597739E+04 + 0.31597739E+04 0.31654780E+04 0.31654780E+04 0.31717981E+04 + 0.31855300E+04 0.31875779E+04 0.31875779E+04 0.31923630E+04 + 0.31923630E+04 0.31890559E+04 0.31890559E+04 0.31816919E+04 + 0.31816919E+04 0.31760601E+04 0.31760601E+04 0.31705381E+04 + 0.31705381E+04 0.31630481E+04 0.31630481E+04 0.31581631E+04 + 0.31581631E+04 0.31597739E+04 0.31597739E+04 0.31654780E+04 + 0.31654780E+04 0.31717981E+04 0.31814409E+04 0.31836890E+04 + 0.31836890E+04 0.31865610E+04 0.31865610E+04 0.31829319E+04 + 0.31829319E+04 0.31737209E+04 0.31737209E+04 0.31653049E+04 + 0.31653049E+04 0.31623430E+04 0.31623430E+04 0.31606919E+04 + 0.31606919E+04 0.31594380E+04 0.31594380E+04 0.31609180E+04 + 0.31609180E+04 0.31652729E+04 0.31652729E+04 0.31725701E+04 + 0.31814409E+04 0.31836890E+04 0.31836890E+04 0.31865610E+04 + 0.31865610E+04 0.31829319E+04 0.31829319E+04 0.31737209E+04 + 0.31737209E+04 0.31653049E+04 0.31653049E+04 0.31623430E+04 + 0.31623430E+04 0.31606919E+04 0.31606919E+04 0.31594380E+04 + 0.31594380E+04 0.31609180E+04 0.31609180E+04 0.31652729E+04 + 0.30402109E+04 0.30385769E+04 0.31748821E+04 0.31721621E+04 + 0.31721621E+04 0.31745969E+04 0.31745969E+04 0.31717729E+04 + 0.31717729E+04 0.31645471E+04 0.31645471E+04 0.31606909E+04 + 0.31606909E+04 0.31599441E+04 0.31599441E+04 0.31598479E+04 + 0.31598479E+04 0.31601379E+04 0.31601379E+04 0.31616021E+04 + 0.31616021E+04 0.31637981E+04 0.30449050E+04 0.30399060E+04 + 0.31748821E+04 0.31721621E+04 0.31721621E+04 0.31745969E+04 + 0.31745969E+04 0.31717729E+04 0.31717729E+04 0.31645471E+04 + 0.31645471E+04 0.31606909E+04 0.31606909E+04 0.31599441E+04 + 0.31599441E+04 0.31598479E+04 0.31598479E+04 0.31601379E+04 + 0.30695081E+04 0.30657539E+04 0.30657539E+04 0.30638369E+04 + 0.30449050E+04 0.30399060E+04 0.31752830E+04 0.31651760E+04 + 0.31651760E+04 0.31645291E+04 0.31645291E+04 0.31640869E+04 + 0.31640869E+04 0.31619460E+04 0.31619460E+04 0.31599641E+04 + 0.31599641E+04 0.31584399E+04 0.31584399E+04 0.31588750E+04 + 0.31588750E+04 0.31582949E+04 0.30700491E+04 0.30671589E+04 + 0.30671589E+04 0.30641340E+04 0.30442041E+04 0.30406731E+04 + 0.31752830E+04 0.31651760E+04 0.31651760E+04 0.31645291E+04 + 0.31645291E+04 0.31640869E+04 0.31640869E+04 0.31619460E+04 + 0.31619460E+04 0.31599641E+04 0.31599641E+04 0.31584399E+04 + 0.30804370E+04 0.30759871E+04 0.30759871E+04 0.30700491E+04 + 0.30700491E+04 0.30671589E+04 0.30671589E+04 0.30641340E+04 + 0.30442041E+04 0.30406731E+04 0.31762729E+04 0.31675481E+04 + 0.31675481E+04 0.31636941E+04 0.31636941E+04 0.31611179E+04 + 0.31611179E+04 0.31588501E+04 0.31588501E+04 0.31586680E+04 + 0.31586680E+04 0.31575969E+04 0.30818491E+04 0.30775190E+04 + 0.30775190E+04 0.30724041E+04 0.30724041E+04 0.30687720E+04 + 0.30687720E+04 0.30655540E+04 0.30445249E+04 0.30411331E+04 + 0.31762729E+04 0.31675481E+04 0.31675481E+04 0.31636941E+04 + 0.31636941E+04 0.31611179E+04 0.31611179E+04 0.31588501E+04 + 0.30902290E+04 0.30862839E+04 0.30862839E+04 0.30818491E+04 + 0.30818491E+04 0.30775190E+04 0.30775190E+04 0.30724041E+04 + 0.30724041E+04 0.30687720E+04 0.30687720E+04 0.30655540E+04 + 0.30445249E+04 0.30411331E+04 0.31754790E+04 0.31700859E+04 + 0.31700859E+04 0.31651831E+04 0.31651831E+04 0.31628181E+04 + 0.31628181E+04 0.31583921E+04 0.30911890E+04 0.30870901E+04 + 0.30870901E+04 0.30838611E+04 0.30838611E+04 0.30804089E+04 + 0.30804089E+04 0.30744741E+04 0.30744741E+04 0.30696460E+04 + 0.30696460E+04 0.30663330E+04 0.30444819E+04 0.30414390E+04 + 0.31754790E+04 0.31700859E+04 0.31700859E+04 0.31651831E+04 + 0.31008159E+04 0.30968110E+04 0.30968110E+04 0.30911890E+04 + 0.30911890E+04 0.30870901E+04 0.30870901E+04 0.30838611E+04 + 0.30838611E+04 0.30804089E+04 0.30804089E+04 0.30744741E+04 + 0.30744741E+04 0.30696460E+04 0.30696460E+04 0.30663330E+04 + 0.30444819E+04 0.30414390E+04 0.31752080E+04 0.31720449E+04 + 0.31720449E+04 0.31666951E+04 0.31032271E+04 0.30974529E+04 + 0.30974529E+04 0.30919800E+04 0.30919800E+04 0.30882161E+04 + 0.30882161E+04 0.30819500E+04 0.30819500E+04 0.30769961E+04 + 0.30769961E+04 0.30750171E+04 0.30750171E+04 0.30718450E+04 + 0.30718450E+04 0.30676831E+04 0.30448220E+04 0.30415029E+04 + 0.31114131E+04 0.31082419E+04 0.31082419E+04 0.31032271E+04 + 0.31032271E+04 0.30974529E+04 0.30974529E+04 0.30919800E+04 + 0.30919800E+04 0.30882161E+04 0.30882161E+04 0.30819500E+04 + 0.30819500E+04 0.30769961E+04 0.30769961E+04 0.30750171E+04 + 0.30750171E+04 0.30718450E+04 0.30718450E+04 0.30676831E+04 + 0.30676831E+04 0.30645500E+04 0.31131589E+04 0.31102920E+04 + 0.31102920E+04 0.31075210E+04 0.31075210E+04 0.31018940E+04 + 0.31018940E+04 0.30917991E+04 0.30917991E+04 0.30848931E+04 + 0.30848931E+04 0.30804121E+04 0.30804121E+04 0.30784441E+04 + 0.30784441E+04 0.30796721E+04 0.30796721E+04 0.30748560E+04 + 0.30748560E+04 0.30697461E+04 0.30697461E+04 0.30661631E+04 + 0.31654790E+04 0.31676479E+04 0.31676479E+04 0.31693091E+04 + 0.31693091E+04 0.31677439E+04 0.31677439E+04 0.31621951E+04 + 0.31621951E+04 0.31582141E+04 0.31582141E+04 0.31618770E+04 + 0.31618770E+04 0.31667739E+04 0.31667739E+04 0.31663601E+04 + 0.31663601E+04 0.31673850E+04 0.31673850E+04 0.31730840E+04 + 0.31730840E+04 0.31807859E+04 0.31549900E+04 0.31597800E+04 + 0.31597800E+04 0.31628669E+04 0.31628669E+04 0.31611331E+04 + 0.31611331E+04 0.31585200E+04 0.31585200E+04 0.31599929E+04 + 0.31599929E+04 0.31667739E+04 0.31667739E+04 0.31710330E+04 + 0.31710330E+04 0.31708181E+04 0.31708181E+04 0.31746899E+04 + 0.31746899E+04 0.31799121E+04 0.31799121E+04 0.31866589E+04 + 0.31549900E+04 0.31597800E+04 0.31597800E+04 0.31628669E+04 + 0.31628669E+04 0.31611331E+04 0.31611331E+04 0.31585200E+04 + 0.31585200E+04 0.31599929E+04 0.31599929E+04 0.31667739E+04 + 0.31667739E+04 0.31710330E+04 0.31710330E+04 0.31708181E+04 + 0.31708181E+04 0.31746899E+04 0.31746899E+04 0.31799121E+04 + 0.31799121E+04 0.31866589E+04 0.31458210E+04 0.31488201E+04 + 0.31488201E+04 0.31505229E+04 0.31505229E+04 0.31492881E+04 + 0.31492881E+04 0.31529709E+04 0.31529709E+04 0.31596951E+04 + 0.31596951E+04 0.31671279E+04 0.31671279E+04 0.31718230E+04 + 0.31718230E+04 0.31741001E+04 0.31741001E+04 0.31799231E+04 + 0.31799231E+04 0.31860640E+04 0.31860640E+04 0.31930071E+04 + 0.31458210E+04 0.31488201E+04 0.31488201E+04 0.31505229E+04 + 0.31505229E+04 0.31492881E+04 0.31492881E+04 0.31529709E+04 + 0.31529709E+04 0.31596951E+04 0.31596951E+04 0.31671279E+04 + 0.31671279E+04 0.31718230E+04 0.31718230E+04 0.31741001E+04 + 0.31741001E+04 0.31799231E+04 0.31799231E+04 0.31860640E+04 + 0.31860640E+04 0.31930071E+04 0.31432190E+04 0.31381140E+04 + 0.31381140E+04 0.31385891E+04 0.31385891E+04 0.31426609E+04 + 0.31426609E+04 0.31543650E+04 0.31543650E+04 0.31662090E+04 + 0.31662090E+04 0.31720901E+04 0.31720901E+04 0.31741931E+04 + 0.31741931E+04 0.31783091E+04 0.31783091E+04 0.31867620E+04 + 0.31867620E+04 0.31960410E+04 0.31960410E+04 0.32038740E+04 + 0.31432190E+04 0.31381140E+04 0.31381140E+04 0.31385891E+04 + 0.31385891E+04 0.31426609E+04 0.31426609E+04 0.31543650E+04 + 0.31543650E+04 0.31662090E+04 0.31662090E+04 0.31720901E+04 + 0.31720901E+04 0.31741931E+04 0.31741931E+04 0.31783091E+04 + 0.31783091E+04 0.31867620E+04 0.31867620E+04 0.31960410E+04 + 0.31960410E+04 0.32038740E+04 0.31576750E+04 0.31518940E+04 + 0.31518940E+04 0.31515359E+04 0.31515359E+04 0.31515000E+04 + 0.31515000E+04 0.31547629E+04 0.31547629E+04 0.31609810E+04 + 0.31609810E+04 0.31659431E+04 0.31659431E+04 0.31696331E+04 + 0.31696331E+04 0.31771650E+04 0.31771650E+04 0.31886089E+04 + 0.31886089E+04 0.31998501E+04 0.31998501E+04 0.32092571E+04 + 0.31576750E+04 0.31518940E+04 0.31518940E+04 0.31515359E+04 + 0.31515359E+04 0.31515000E+04 0.31515000E+04 0.31547629E+04 + 0.31547629E+04 0.31609810E+04 0.31609810E+04 0.31659431E+04 + 0.31659431E+04 0.31696331E+04 0.31696331E+04 0.31771650E+04 + 0.31771650E+04 0.31886089E+04 0.31886089E+04 0.31998501E+04 + 0.31998501E+04 0.32092571E+04 0.31710950E+04 0.31739380E+04 + 0.31739380E+04 0.31741489E+04 0.31741489E+04 0.31691970E+04 + 0.31691970E+04 0.31619629E+04 0.31619629E+04 0.31600239E+04 + 0.31600239E+04 0.31633459E+04 0.31633459E+04 0.31673081E+04 + 0.31673081E+04 0.31737329E+04 0.31737329E+04 0.31840769E+04 + 0.31840769E+04 0.31959919E+04 0.31959919E+04 0.32077930E+04 + 0.31710950E+04 0.31739380E+04 0.31739380E+04 0.31741489E+04 + 0.31741489E+04 0.31691970E+04 0.31691970E+04 0.31619629E+04 + 0.31619629E+04 0.31600239E+04 0.31600239E+04 0.31633459E+04 + 0.31633459E+04 0.31673081E+04 0.31673081E+04 0.31737329E+04 + 0.31737329E+04 0.31840769E+04 0.31840769E+04 0.31959919E+04 + 0.31959919E+04 0.32077930E+04 0.31719250E+04 0.31800901E+04 + 0.31800901E+04 0.31807461E+04 0.31807461E+04 0.31781479E+04 + 0.31781479E+04 0.31752600E+04 0.31752600E+04 0.31724790E+04 + 0.31724790E+04 0.31709041E+04 0.31709041E+04 0.31686289E+04 + 0.31686289E+04 0.31697500E+04 0.31697500E+04 0.31765449E+04 + 0.31765449E+04 0.31867080E+04 0.31867080E+04 0.31971699E+04 + 0.31719250E+04 0.31800901E+04 0.31800901E+04 0.31807461E+04 + 0.31807461E+04 0.31781479E+04 0.31781479E+04 0.31752600E+04 + 0.31752600E+04 0.31724790E+04 0.31724790E+04 0.31709041E+04 + 0.31709041E+04 0.31686289E+04 0.31686289E+04 0.31697500E+04 + 0.31697500E+04 0.31765449E+04 0.31765449E+04 0.31867080E+04 + 0.31867080E+04 0.31971699E+04 0.31711140E+04 0.31775610E+04 + 0.31775610E+04 0.31810071E+04 0.31810071E+04 0.31795710E+04 + 0.31795710E+04 0.31789189E+04 0.31789189E+04 0.31776370E+04 + 0.31776370E+04 0.31729089E+04 0.31729089E+04 0.31656289E+04 + 0.31656289E+04 0.31638960E+04 0.31638960E+04 0.31686360E+04 + 0.31686360E+04 0.31752251E+04 0.31752251E+04 0.31811731E+04 + 0.31711140E+04 0.31775610E+04 0.31775610E+04 0.31810071E+04 + 0.31810071E+04 0.31795710E+04 0.31795710E+04 0.31789189E+04 + 0.31789189E+04 0.31776370E+04 0.31776370E+04 0.31729089E+04 + 0.31729089E+04 0.31656289E+04 0.31656289E+04 0.31638960E+04 + 0.31638960E+04 0.31686360E+04 0.31686360E+04 0.31752251E+04 + 0.31752251E+04 0.31811731E+04 0.31787939E+04 0.31821760E+04 + 0.31821760E+04 0.31882151E+04 0.31882151E+04 0.31855310E+04 + 0.31855310E+04 0.31804370E+04 0.31804370E+04 0.31770620E+04 + 0.31770620E+04 0.31722959E+04 0.31722959E+04 0.31643721E+04 + 0.31643721E+04 0.31606880E+04 0.31606880E+04 0.31644419E+04 + 0.31644419E+04 0.31693340E+04 0.31693340E+04 0.31735869E+04 + 0.31787939E+04 0.31821760E+04 0.31821760E+04 0.31882151E+04 + 0.31882151E+04 0.31855310E+04 0.31855310E+04 0.31804370E+04 + 0.31804370E+04 0.31770620E+04 0.31770620E+04 0.31722959E+04 + 0.31722959E+04 0.31643721E+04 0.31643721E+04 0.31606880E+04 + 0.31606880E+04 0.31644419E+04 0.31644419E+04 0.31693340E+04 + 0.31693340E+04 0.31735869E+04 0.31864170E+04 0.31882781E+04 + 0.31882781E+04 0.31931050E+04 0.31931050E+04 0.31899619E+04 + 0.31899619E+04 0.31826289E+04 0.31826289E+04 0.31769390E+04 + 0.31769390E+04 0.31714609E+04 0.31714609E+04 0.31639299E+04 + 0.31639299E+04 0.31591040E+04 0.31591040E+04 0.31607319E+04 + 0.31607319E+04 0.31666011E+04 0.31666011E+04 0.31730920E+04 + 0.31864170E+04 0.31882781E+04 0.31882781E+04 0.31931050E+04 + 0.31931050E+04 0.31899619E+04 0.31899619E+04 0.31826289E+04 + 0.31826289E+04 0.31769390E+04 0.31769390E+04 0.31714609E+04 + 0.31714609E+04 0.31639299E+04 0.31639299E+04 0.31591040E+04 + 0.31591040E+04 0.31607319E+04 0.31607319E+04 0.31666011E+04 + 0.31666011E+04 0.31730920E+04 0.31823081E+04 0.31844580E+04 + 0.31844580E+04 0.31873479E+04 0.31873479E+04 0.31838831E+04 + 0.31838831E+04 0.31747629E+04 0.31747629E+04 0.31663640E+04 + 0.31663640E+04 0.31633979E+04 0.31633979E+04 0.31619209E+04 + 0.31619209E+04 0.31609719E+04 0.31609719E+04 0.31626741E+04 + 0.31626741E+04 0.31667981E+04 0.31667981E+04 0.31740691E+04 + 0.31823081E+04 0.31844580E+04 0.31844580E+04 0.31873479E+04 + 0.31873479E+04 0.31838831E+04 0.31838831E+04 0.31747629E+04 + 0.31747629E+04 0.31663640E+04 0.31663640E+04 0.31633979E+04 + 0.31633979E+04 0.31619209E+04 0.31619209E+04 0.31609719E+04 + 0.31609719E+04 0.31626741E+04 0.31626741E+04 0.31667981E+04 + 0.30408149E+04 0.30392681E+04 0.31757700E+04 0.31728960E+04 + 0.31728960E+04 0.31753879E+04 0.31753879E+04 0.31728311E+04 + 0.31728311E+04 0.31657290E+04 0.31657290E+04 0.31619761E+04 + 0.31619761E+04 0.31614370E+04 0.31614370E+04 0.31616431E+04 + 0.31616431E+04 0.31618359E+04 0.31618359E+04 0.31634661E+04 + 0.31634661E+04 0.31657839E+04 0.30455020E+04 0.30406221E+04 + 0.31757700E+04 0.31728960E+04 0.31728960E+04 0.31753879E+04 + 0.31753879E+04 0.31728311E+04 0.31728311E+04 0.31657290E+04 + 0.31657290E+04 0.31619761E+04 0.31619761E+04 0.31614370E+04 + 0.31614370E+04 0.31616431E+04 0.31616431E+04 0.31618359E+04 + 0.30701841E+04 0.30664509E+04 0.30664509E+04 0.30645559E+04 + 0.30455020E+04 0.30406221E+04 0.31763140E+04 0.31660029E+04 + 0.31660029E+04 0.31654670E+04 0.31654670E+04 0.31652600E+04 + 0.31652600E+04 0.31633640E+04 0.31633640E+04 0.31616721E+04 + 0.31616721E+04 0.31600071E+04 0.31600071E+04 0.31605891E+04 + 0.31605891E+04 0.31602510E+04 0.30706790E+04 0.30678469E+04 + 0.30678469E+04 0.30648689E+04 0.30447590E+04 0.30412830E+04 + 0.31763140E+04 0.31660029E+04 0.31660029E+04 0.31654670E+04 + 0.31654670E+04 0.31652600E+04 0.31652600E+04 0.31633640E+04 + 0.31633640E+04 0.31616721E+04 0.31616721E+04 0.31600071E+04 + 0.30812251E+04 0.30767661E+04 0.30767661E+04 0.30706790E+04 + 0.30706790E+04 0.30678469E+04 0.30678469E+04 0.30648689E+04 + 0.30447590E+04 0.30412830E+04 0.31775520E+04 0.31687200E+04 + 0.31687200E+04 0.31649580E+04 0.31649580E+04 0.31623330E+04 + 0.31623330E+04 0.31601641E+04 0.31601641E+04 0.31602451E+04 + 0.31602451E+04 0.31592910E+04 0.30826570E+04 0.30783560E+04 + 0.30783560E+04 0.30731509E+04 0.30731509E+04 0.30694800E+04 + 0.30694800E+04 0.30662810E+04 0.30450161E+04 0.30416240E+04 + 0.31775520E+04 0.31687200E+04 0.31687200E+04 0.31649580E+04 + 0.31649580E+04 0.31623330E+04 0.31623330E+04 0.31601641E+04 + 0.30909729E+04 0.30870591E+04 0.30870591E+04 0.30826570E+04 + 0.30826570E+04 0.30783560E+04 0.30783560E+04 0.30731509E+04 + 0.30731509E+04 0.30694800E+04 0.30694800E+04 0.30662810E+04 + 0.30450161E+04 0.30416240E+04 0.31769260E+04 0.31713359E+04 + 0.31713359E+04 0.31663550E+04 0.31663550E+04 0.31640750E+04 + 0.31640750E+04 0.31596909E+04 0.30919629E+04 0.30879009E+04 + 0.30879009E+04 0.30847290E+04 0.30847290E+04 0.30812710E+04 + 0.30812710E+04 0.30752849E+04 0.30752849E+04 0.30703369E+04 + 0.30703369E+04 0.30670620E+04 0.30449670E+04 0.30419661E+04 + 0.31769260E+04 0.31713359E+04 0.31713359E+04 0.31663550E+04 + 0.31015730E+04 0.30975740E+04 0.30975740E+04 0.30919629E+04 + 0.30919629E+04 0.30879009E+04 0.30879009E+04 0.30847290E+04 + 0.30847290E+04 0.30812710E+04 0.30812710E+04 0.30752849E+04 + 0.30752849E+04 0.30703369E+04 0.30703369E+04 0.30670620E+04 + 0.30449670E+04 0.30419661E+04 0.31765669E+04 0.31732849E+04 + 0.31732849E+04 0.31678840E+04 0.31040190E+04 0.30982871E+04 + 0.30982871E+04 0.30928120E+04 0.30928120E+04 0.30890010E+04 + 0.30890010E+04 0.30827671E+04 0.30827671E+04 0.30778640E+04 + 0.30778640E+04 0.30758601E+04 0.30758601E+04 0.30725879E+04 + 0.30725879E+04 0.30683799E+04 0.30453301E+04 0.30420281E+04 + 0.31122510E+04 0.31090640E+04 0.31090640E+04 0.31040190E+04 + 0.31040190E+04 0.30982871E+04 0.30982871E+04 0.30928120E+04 + 0.30928120E+04 0.30890010E+04 0.30890010E+04 0.30827671E+04 + 0.30827671E+04 0.30778640E+04 0.30778640E+04 0.30758601E+04 + 0.30758601E+04 0.30725879E+04 0.30725879E+04 0.30683799E+04 + 0.30683799E+04 0.30652141E+04 0.31139990E+04 0.31111580E+04 + 0.31111580E+04 0.31083181E+04 0.31083181E+04 0.31027729E+04 + 0.31027729E+04 0.30925330E+04 0.30925330E+04 0.30856089E+04 + 0.30856089E+04 0.30811230E+04 0.30811230E+04 0.30792319E+04 + 0.30792319E+04 0.30804299E+04 0.30804299E+04 0.30756150E+04 + 0.30756150E+04 0.30703760E+04 0.30703760E+04 0.30667639E+04 + 0.31654790E+04 0.31676479E+04 0.31676479E+04 0.31693091E+04 + 0.31693091E+04 0.31677439E+04 0.31677439E+04 0.31621951E+04 + 0.31621951E+04 0.31582141E+04 0.31582141E+04 0.31618770E+04 + 0.31618770E+04 0.31667739E+04 0.31667739E+04 0.31663601E+04 + 0.31663601E+04 0.31673850E+04 0.31673850E+04 0.31730840E+04 + 0.31730840E+04 0.31807859E+04 0.31549900E+04 0.31597800E+04 + 0.31597800E+04 0.31628669E+04 0.31628669E+04 0.31611331E+04 + 0.31611331E+04 0.31585200E+04 0.31585200E+04 0.31599929E+04 + 0.31599929E+04 0.31667739E+04 0.31667739E+04 0.31710330E+04 + 0.31710330E+04 0.31708181E+04 0.31708181E+04 0.31746899E+04 + 0.31746899E+04 0.31799121E+04 0.31799121E+04 0.31866589E+04 + 0.31549900E+04 0.31597800E+04 0.31597800E+04 0.31628669E+04 + 0.31628669E+04 0.31611331E+04 0.31611331E+04 0.31585200E+04 + 0.31585200E+04 0.31599929E+04 0.31599929E+04 0.31667739E+04 + 0.31667739E+04 0.31710330E+04 0.31710330E+04 0.31708181E+04 + 0.31708181E+04 0.31746899E+04 0.31746899E+04 0.31799121E+04 + 0.31799121E+04 0.31866589E+04 0.31458210E+04 0.31488201E+04 + 0.31488201E+04 0.31505229E+04 0.31505229E+04 0.31492881E+04 + 0.31492881E+04 0.31529709E+04 0.31529709E+04 0.31596951E+04 + 0.31596951E+04 0.31671279E+04 0.31671279E+04 0.31718230E+04 + 0.31718230E+04 0.31741001E+04 0.31741001E+04 0.31799231E+04 + 0.31799231E+04 0.31860640E+04 0.31860640E+04 0.31930071E+04 + 0.31458210E+04 0.31488201E+04 0.31488201E+04 0.31505229E+04 + 0.31505229E+04 0.31492881E+04 0.31492881E+04 0.31529709E+04 + 0.31529709E+04 0.31596951E+04 0.31596951E+04 0.31671279E+04 + 0.31671279E+04 0.31718230E+04 0.31718230E+04 0.31741001E+04 + 0.31741001E+04 0.31799231E+04 0.31799231E+04 0.31860640E+04 + 0.31860640E+04 0.31930071E+04 0.31432190E+04 0.31381140E+04 + 0.31381140E+04 0.31385891E+04 0.31385891E+04 0.31426609E+04 + 0.31426609E+04 0.31543650E+04 0.31543650E+04 0.31662090E+04 + 0.31662090E+04 0.31720901E+04 0.31720901E+04 0.31741931E+04 + 0.31741931E+04 0.31783091E+04 0.31783091E+04 0.31867620E+04 + 0.31867620E+04 0.31960410E+04 0.31960410E+04 0.32038740E+04 + 0.31432190E+04 0.31381140E+04 0.31381140E+04 0.31385891E+04 + 0.31385891E+04 0.31426609E+04 0.31426609E+04 0.31543650E+04 + 0.31543650E+04 0.31662090E+04 0.31662090E+04 0.31720901E+04 + 0.31720901E+04 0.31741931E+04 0.31741931E+04 0.31783091E+04 + 0.31783091E+04 0.31867620E+04 0.31867620E+04 0.31960410E+04 + 0.31960410E+04 0.32038740E+04 0.31576750E+04 0.31518940E+04 + 0.31518940E+04 0.31515359E+04 0.31515359E+04 0.31515000E+04 + 0.31515000E+04 0.31547629E+04 0.31547629E+04 0.31609810E+04 + 0.31609810E+04 0.31659431E+04 0.31659431E+04 0.31696331E+04 + 0.31696331E+04 0.31771650E+04 0.31771650E+04 0.31886089E+04 + 0.31886089E+04 0.31998501E+04 0.31998501E+04 0.32092571E+04 + 0.31576750E+04 0.31518940E+04 0.31518940E+04 0.31515359E+04 + 0.31515359E+04 0.31515000E+04 0.31515000E+04 0.31547629E+04 + 0.31547629E+04 0.31609810E+04 0.31609810E+04 0.31659431E+04 + 0.31659431E+04 0.31696331E+04 0.31696331E+04 0.31771650E+04 + 0.31771650E+04 0.31886089E+04 0.31886089E+04 0.31998501E+04 + 0.31998501E+04 0.32092571E+04 0.31710950E+04 0.31739380E+04 + 0.31739380E+04 0.31741489E+04 0.31741489E+04 0.31691970E+04 + 0.31691970E+04 0.31619629E+04 0.31619629E+04 0.31600239E+04 + 0.31600239E+04 0.31633459E+04 0.31633459E+04 0.31673081E+04 + 0.31673081E+04 0.31737329E+04 0.31737329E+04 0.31840769E+04 + 0.31840769E+04 0.31959919E+04 0.31959919E+04 0.32077930E+04 + 0.31710950E+04 0.31739380E+04 0.31739380E+04 0.31741489E+04 + 0.31741489E+04 0.31691970E+04 0.31691970E+04 0.31619629E+04 + 0.31619629E+04 0.31600239E+04 0.31600239E+04 0.31633459E+04 + 0.31633459E+04 0.31673081E+04 0.31673081E+04 0.31737329E+04 + 0.31737329E+04 0.31840769E+04 0.31840769E+04 0.31959919E+04 + 0.31959919E+04 0.32077930E+04 0.31719250E+04 0.31800901E+04 + 0.31800901E+04 0.31807461E+04 0.31807461E+04 0.31781479E+04 + 0.31781479E+04 0.31752600E+04 0.31752600E+04 0.31724790E+04 + 0.31724790E+04 0.31709041E+04 0.31709041E+04 0.31686289E+04 + 0.31686289E+04 0.31697500E+04 0.31697500E+04 0.31765449E+04 + 0.31765449E+04 0.31867080E+04 0.31867080E+04 0.31971699E+04 + 0.31719250E+04 0.31800901E+04 0.31800901E+04 0.31807461E+04 + 0.31807461E+04 0.31781479E+04 0.31781479E+04 0.31752600E+04 + 0.31752600E+04 0.31724790E+04 0.31724790E+04 0.31709041E+04 + 0.31709041E+04 0.31686289E+04 0.31686289E+04 0.31697500E+04 + 0.31697500E+04 0.31765449E+04 0.31765449E+04 0.31867080E+04 + 0.31867080E+04 0.31971699E+04 0.31711140E+04 0.31775610E+04 + 0.31775610E+04 0.31810071E+04 0.31810071E+04 0.31795710E+04 + 0.31795710E+04 0.31789189E+04 0.31789189E+04 0.31776370E+04 + 0.31776370E+04 0.31729089E+04 0.31729089E+04 0.31656289E+04 + 0.31656289E+04 0.31638960E+04 0.31638960E+04 0.31686360E+04 + 0.31686360E+04 0.31752251E+04 0.31752251E+04 0.31811731E+04 + 0.31711140E+04 0.31775610E+04 0.31775610E+04 0.31810071E+04 + 0.31810071E+04 0.31795710E+04 0.31795710E+04 0.31789189E+04 + 0.31789189E+04 0.31776370E+04 0.31776370E+04 0.31729089E+04 + 0.31729089E+04 0.31656289E+04 0.31656289E+04 0.31638960E+04 + 0.31638960E+04 0.31686360E+04 0.31686360E+04 0.31752251E+04 + 0.31752251E+04 0.31811731E+04 0.31787939E+04 0.31821760E+04 + 0.31821760E+04 0.31882151E+04 0.31882151E+04 0.31855310E+04 + 0.31855310E+04 0.31804370E+04 0.31804370E+04 0.31770620E+04 + 0.31770620E+04 0.31722959E+04 0.31722959E+04 0.31643721E+04 + 0.31643721E+04 0.31606880E+04 0.31606880E+04 0.31644419E+04 + 0.31644419E+04 0.31693340E+04 0.31693340E+04 0.31735869E+04 + 0.31787939E+04 0.31821760E+04 0.31821760E+04 0.31882151E+04 + 0.31882151E+04 0.31855310E+04 0.31855310E+04 0.31804370E+04 + 0.31804370E+04 0.31770620E+04 0.31770620E+04 0.31722959E+04 + 0.31722959E+04 0.31643721E+04 0.31643721E+04 0.31606880E+04 + 0.31606880E+04 0.31644419E+04 0.31644419E+04 0.31693340E+04 + 0.31693340E+04 0.31735869E+04 0.31864170E+04 0.31882781E+04 + 0.31882781E+04 0.31931050E+04 0.31931050E+04 0.31899619E+04 + 0.31899619E+04 0.31826289E+04 0.31826289E+04 0.31769390E+04 + 0.31769390E+04 0.31714609E+04 0.31714609E+04 0.31639299E+04 + 0.31639299E+04 0.31591040E+04 0.31591040E+04 0.31607319E+04 + 0.31607319E+04 0.31666011E+04 0.31666011E+04 0.31730920E+04 + 0.31864170E+04 0.31882781E+04 0.31882781E+04 0.31931050E+04 + 0.31931050E+04 0.31899619E+04 0.31899619E+04 0.31826289E+04 + 0.31826289E+04 0.31769390E+04 0.31769390E+04 0.31714609E+04 + 0.31714609E+04 0.31639299E+04 0.31639299E+04 0.31591040E+04 + 0.31591040E+04 0.31607319E+04 0.31607319E+04 0.31666011E+04 + 0.31666011E+04 0.31730920E+04 0.31823081E+04 0.31844580E+04 + 0.31844580E+04 0.31873479E+04 0.31873479E+04 0.31838831E+04 + 0.31838831E+04 0.31747629E+04 0.31747629E+04 0.31663640E+04 + 0.31663640E+04 0.31633979E+04 0.31633979E+04 0.31619209E+04 + 0.31619209E+04 0.31609719E+04 0.31609719E+04 0.31626741E+04 + 0.31626741E+04 0.31667981E+04 0.31667981E+04 0.31740691E+04 + 0.31823081E+04 0.31844580E+04 0.31844580E+04 0.31873479E+04 + 0.31873479E+04 0.31838831E+04 0.31838831E+04 0.31747629E+04 + 0.31747629E+04 0.31663640E+04 0.31663640E+04 0.31633979E+04 + 0.31633979E+04 0.31619209E+04 0.31619209E+04 0.31609719E+04 + 0.31609719E+04 0.31626741E+04 0.31626741E+04 0.31667981E+04 + 0.30408149E+04 0.30392681E+04 0.31757700E+04 0.31728960E+04 + 0.31728960E+04 0.31753879E+04 0.31753879E+04 0.31728311E+04 + 0.31728311E+04 0.31657290E+04 0.31657290E+04 0.31619761E+04 + 0.31619761E+04 0.31614370E+04 0.31614370E+04 0.31616431E+04 + 0.31616431E+04 0.31618359E+04 0.31618359E+04 0.31634661E+04 + 0.31634661E+04 0.31657839E+04 0.30455020E+04 0.30406221E+04 + 0.31757700E+04 0.31728960E+04 0.31728960E+04 0.31753879E+04 + 0.31753879E+04 0.31728311E+04 0.31728311E+04 0.31657290E+04 + 0.31657290E+04 0.31619761E+04 0.31619761E+04 0.31614370E+04 + 0.31614370E+04 0.31616431E+04 0.31616431E+04 0.31618359E+04 + 0.30701841E+04 0.30664509E+04 0.30664509E+04 0.30645559E+04 + 0.30455020E+04 0.30406221E+04 0.31763140E+04 0.31660029E+04 + 0.31660029E+04 0.31654670E+04 0.31654670E+04 0.31652600E+04 + 0.31652600E+04 0.31633640E+04 0.31633640E+04 0.31616721E+04 + 0.31616721E+04 0.31600071E+04 0.31600071E+04 0.31605891E+04 + 0.31605891E+04 0.31602510E+04 0.30706790E+04 0.30678469E+04 + 0.30678469E+04 0.30648689E+04 0.30447590E+04 0.30412830E+04 + 0.31763140E+04 0.31660029E+04 0.31660029E+04 0.31654670E+04 + 0.31654670E+04 0.31652600E+04 0.31652600E+04 0.31633640E+04 + 0.31633640E+04 0.31616721E+04 0.31616721E+04 0.31600071E+04 + 0.30812251E+04 0.30767661E+04 0.30767661E+04 0.30706790E+04 + 0.30706790E+04 0.30678469E+04 0.30678469E+04 0.30648689E+04 + 0.30447590E+04 0.30412830E+04 0.31775520E+04 0.31687200E+04 + 0.31687200E+04 0.31649580E+04 0.31649580E+04 0.31623330E+04 + 0.31623330E+04 0.31601641E+04 0.31601641E+04 0.31602451E+04 + 0.31602451E+04 0.31592910E+04 0.30826570E+04 0.30783560E+04 + 0.30783560E+04 0.30731509E+04 0.30731509E+04 0.30694800E+04 + 0.30694800E+04 0.30662810E+04 0.30450161E+04 0.30416240E+04 + 0.31775520E+04 0.31687200E+04 0.31687200E+04 0.31649580E+04 + 0.31649580E+04 0.31623330E+04 0.31623330E+04 0.31601641E+04 + 0.30909729E+04 0.30870591E+04 0.30870591E+04 0.30826570E+04 + 0.30826570E+04 0.30783560E+04 0.30783560E+04 0.30731509E+04 + 0.30731509E+04 0.30694800E+04 0.30694800E+04 0.30662810E+04 + 0.30450161E+04 0.30416240E+04 0.31769260E+04 0.31713359E+04 + 0.31713359E+04 0.31663550E+04 0.31663550E+04 0.31640750E+04 + 0.31640750E+04 0.31596909E+04 0.30919629E+04 0.30879009E+04 + 0.30879009E+04 0.30847290E+04 0.30847290E+04 0.30812710E+04 + 0.30812710E+04 0.30752849E+04 0.30752849E+04 0.30703369E+04 + 0.30703369E+04 0.30670620E+04 0.30449670E+04 0.30419661E+04 + 0.31769260E+04 0.31713359E+04 0.31713359E+04 0.31663550E+04 + 0.31015730E+04 0.30975740E+04 0.30975740E+04 0.30919629E+04 + 0.30919629E+04 0.30879009E+04 0.30879009E+04 0.30847290E+04 + 0.30847290E+04 0.30812710E+04 0.30812710E+04 0.30752849E+04 + 0.30752849E+04 0.30703369E+04 0.30703369E+04 0.30670620E+04 + 0.30449670E+04 0.30419661E+04 0.31765669E+04 0.31732849E+04 + 0.31732849E+04 0.31678840E+04 0.31040190E+04 0.30982871E+04 + 0.30982871E+04 0.30928120E+04 0.30928120E+04 0.30890010E+04 + 0.30890010E+04 0.30827671E+04 0.30827671E+04 0.30778640E+04 + 0.30778640E+04 0.30758601E+04 0.30758601E+04 0.30725879E+04 + 0.30725879E+04 0.30683799E+04 0.30453301E+04 0.30420281E+04 + 0.31122510E+04 0.31090640E+04 0.31090640E+04 0.31040190E+04 + 0.31040190E+04 0.30982871E+04 0.30982871E+04 0.30928120E+04 + 0.30928120E+04 0.30890010E+04 0.30890010E+04 0.30827671E+04 + 0.30827671E+04 0.30778640E+04 0.30778640E+04 0.30758601E+04 + 0.30758601E+04 0.30725879E+04 0.30725879E+04 0.30683799E+04 + 0.30683799E+04 0.30652141E+04 0.31139990E+04 0.31111580E+04 + 0.31111580E+04 0.31083181E+04 0.31083181E+04 0.31027729E+04 + 0.31027729E+04 0.30925330E+04 0.30925330E+04 0.30856089E+04 + 0.30856089E+04 0.30811230E+04 0.30811230E+04 0.30792319E+04 + 0.30792319E+04 0.30804299E+04 0.30804299E+04 0.30756150E+04 + 0.30756150E+04 0.30703760E+04 0.30703760E+04 0.30667639E+04 + 0.31672290E+04 0.31693560E+04 0.31693560E+04 0.31711289E+04 + 0.31711289E+04 0.31696919E+04 0.31696919E+04 0.31641899E+04 + 0.31641899E+04 0.31600610E+04 0.31600610E+04 0.31635259E+04 + 0.31635259E+04 0.31685220E+04 0.31685220E+04 0.31683210E+04 + 0.31683210E+04 0.31693191E+04 0.31693191E+04 0.31749580E+04 + 0.31749580E+04 0.31826399E+04 0.31567820E+04 0.31615459E+04 + 0.31615459E+04 0.31647581E+04 0.31647581E+04 0.31631760E+04 + 0.31631760E+04 0.31605400E+04 0.31605400E+04 0.31618320E+04 + 0.31618320E+04 0.31685029E+04 0.31685029E+04 0.31729680E+04 + 0.31729680E+04 0.31728301E+04 0.31728301E+04 0.31766570E+04 + 0.31766570E+04 0.31818401E+04 0.31818401E+04 0.31884319E+04 + 0.31567820E+04 0.31615459E+04 0.31615459E+04 0.31647581E+04 + 0.31647581E+04 0.31631760E+04 0.31631760E+04 0.31605400E+04 + 0.31605400E+04 0.31618320E+04 0.31618320E+04 0.31685029E+04 + 0.31685029E+04 0.31729680E+04 0.31729680E+04 0.31728301E+04 + 0.31728301E+04 0.31766570E+04 0.31766570E+04 0.31818401E+04 + 0.31818401E+04 0.31884319E+04 0.31477129E+04 0.31507649E+04 + 0.31507649E+04 0.31526040E+04 0.31526040E+04 0.31511699E+04 + 0.31511699E+04 0.31546040E+04 0.31546040E+04 0.31611609E+04 + 0.31611609E+04 0.31686179E+04 0.31686179E+04 0.31735359E+04 + 0.31735359E+04 0.31759060E+04 0.31759060E+04 0.31817019E+04 + 0.31817019E+04 0.31877009E+04 0.31877009E+04 0.31943879E+04 + 0.31477129E+04 0.31507649E+04 0.31507649E+04 0.31526040E+04 + 0.31526040E+04 0.31511699E+04 0.31511699E+04 0.31546040E+04 + 0.31546040E+04 0.31611609E+04 0.31611609E+04 0.31686179E+04 + 0.31686179E+04 0.31735359E+04 0.31735359E+04 0.31759060E+04 + 0.31759060E+04 0.31817019E+04 0.31817019E+04 0.31877009E+04 + 0.31877009E+04 0.31943879E+04 0.31445840E+04 0.31394839E+04 + 0.31394839E+04 0.31399231E+04 0.31399231E+04 0.31438059E+04 + 0.31438059E+04 0.31555110E+04 0.31555110E+04 0.31673879E+04 + 0.31673879E+04 0.31734629E+04 0.31734629E+04 0.31756609E+04 + 0.31756609E+04 0.31796980E+04 0.31796980E+04 0.31880000E+04 + 0.31880000E+04 0.31971289E+04 0.31971289E+04 0.32048491E+04 + 0.31445840E+04 0.31394839E+04 0.31394839E+04 0.31399231E+04 + 0.31399231E+04 0.31438059E+04 0.31438059E+04 0.31555110E+04 + 0.31555110E+04 0.31673879E+04 0.31673879E+04 0.31734629E+04 + 0.31734629E+04 0.31756609E+04 0.31756609E+04 0.31796980E+04 + 0.31796980E+04 0.31880000E+04 0.31880000E+04 0.31971289E+04 + 0.31971289E+04 0.32048491E+04 0.31585420E+04 0.31528010E+04 + 0.31528010E+04 0.31525710E+04 0.31525710E+04 0.31525759E+04 + 0.31525759E+04 0.31558711E+04 0.31558711E+04 0.31620549E+04 + 0.31620549E+04 0.31670029E+04 0.31670029E+04 0.31706431E+04 + 0.31706431E+04 0.31781221E+04 0.31781221E+04 0.31895391E+04 + 0.31895391E+04 0.32007561E+04 0.32007561E+04 0.32101680E+04 + 0.31585420E+04 0.31528010E+04 0.31528010E+04 0.31525710E+04 + 0.31525710E+04 0.31525759E+04 0.31525759E+04 0.31558711E+04 + 0.31558711E+04 0.31620549E+04 0.31620549E+04 0.31670029E+04 + 0.31670029E+04 0.31706431E+04 0.31706431E+04 0.31781221E+04 + 0.31781221E+04 0.31895391E+04 0.31895391E+04 0.32007561E+04 + 0.32007561E+04 0.32101680E+04 0.31719741E+04 0.31748000E+04 + 0.31748000E+04 0.31750249E+04 0.31750249E+04 0.31701570E+04 + 0.31701570E+04 0.31629109E+04 0.31629109E+04 0.31608721E+04 + 0.31608721E+04 0.31641860E+04 0.31641860E+04 0.31682339E+04 + 0.31682339E+04 0.31745439E+04 0.31745439E+04 0.31848630E+04 + 0.31848630E+04 0.31968330E+04 0.31968330E+04 0.32086599E+04 + 0.31719741E+04 0.31748000E+04 0.31748000E+04 0.31750249E+04 + 0.31750249E+04 0.31701570E+04 0.31701570E+04 0.31629109E+04 + 0.31629109E+04 0.31608721E+04 0.31608721E+04 0.31641860E+04 + 0.31641860E+04 0.31682339E+04 0.31682339E+04 0.31745439E+04 + 0.31745439E+04 0.31848630E+04 0.31848630E+04 0.31968330E+04 + 0.31968330E+04 0.32086599E+04 0.31726340E+04 0.31808831E+04 + 0.31808831E+04 0.31816809E+04 0.31816809E+04 0.31791201E+04 + 0.31791201E+04 0.31761689E+04 0.31761689E+04 0.31733101E+04 + 0.31733101E+04 0.31717649E+04 0.31717649E+04 0.31694851E+04 + 0.31694851E+04 0.31704709E+04 0.31704709E+04 0.31772891E+04 + 0.31772891E+04 0.31876709E+04 0.31876709E+04 0.31982830E+04 + 0.31726340E+04 0.31808831E+04 0.31808831E+04 0.31816809E+04 + 0.31816809E+04 0.31791201E+04 0.31791201E+04 0.31761689E+04 + 0.31761689E+04 0.31733101E+04 0.31733101E+04 0.31717649E+04 + 0.31717649E+04 0.31694851E+04 0.31694851E+04 0.31704709E+04 + 0.31704709E+04 0.31772891E+04 0.31772891E+04 0.31876709E+04 + 0.31876709E+04 0.31982830E+04 0.31717729E+04 0.31782771E+04 + 0.31782771E+04 0.31818359E+04 0.31818359E+04 0.31804490E+04 + 0.31804490E+04 0.31797639E+04 0.31797639E+04 0.31785161E+04 + 0.31785161E+04 0.31739021E+04 0.31739021E+04 0.31665649E+04 + 0.31665649E+04 0.31646941E+04 0.31646941E+04 0.31693750E+04 + 0.31693750E+04 0.31760920E+04 0.31760920E+04 0.31822400E+04 + 0.31717729E+04 0.31782771E+04 0.31782771E+04 0.31818359E+04 + 0.31818359E+04 0.31804490E+04 0.31804490E+04 0.31797639E+04 + 0.31797639E+04 0.31785161E+04 0.31785161E+04 0.31739021E+04 + 0.31739021E+04 0.31665649E+04 0.31665649E+04 0.31646941E+04 + 0.31646941E+04 0.31693750E+04 0.31693750E+04 0.31760920E+04 + 0.31760920E+04 0.31822400E+04 0.31794990E+04 0.31828020E+04 + 0.31828020E+04 0.31889380E+04 0.31889380E+04 0.31863921E+04 + 0.31863921E+04 0.31812859E+04 0.31812859E+04 0.31779160E+04 + 0.31779160E+04 0.31732520E+04 0.31732520E+04 0.31653030E+04 + 0.31653030E+04 0.31614661E+04 0.31614661E+04 0.31651880E+04 + 0.31651880E+04 0.31700791E+04 0.31700791E+04 0.31744951E+04 + 0.31794990E+04 0.31828020E+04 0.31828020E+04 0.31889380E+04 + 0.31889380E+04 0.31863921E+04 0.31863921E+04 0.31812859E+04 + 0.31812859E+04 0.31779160E+04 0.31779160E+04 0.31732520E+04 + 0.31732520E+04 0.31653030E+04 0.31653030E+04 0.31614661E+04 + 0.31614661E+04 0.31651880E+04 0.31651880E+04 0.31700791E+04 + 0.31700791E+04 0.31744951E+04 0.31873040E+04 0.31889780E+04 + 0.31889780E+04 0.31938479E+04 0.31938479E+04 0.31908679E+04 + 0.31908679E+04 0.31835669E+04 0.31835669E+04 0.31778181E+04 + 0.31778181E+04 0.31723850E+04 0.31723850E+04 0.31648120E+04 + 0.31648120E+04 0.31600449E+04 0.31600449E+04 0.31616899E+04 + 0.31616899E+04 0.31677251E+04 0.31677251E+04 0.31743860E+04 + 0.31873040E+04 0.31889780E+04 0.31889780E+04 0.31938479E+04 + 0.31938479E+04 0.31908679E+04 0.31908679E+04 0.31835669E+04 + 0.31835669E+04 0.31778181E+04 0.31778181E+04 0.31723850E+04 + 0.31723850E+04 0.31648120E+04 0.31648120E+04 0.31600449E+04 + 0.31600449E+04 0.31616899E+04 0.31616899E+04 0.31677251E+04 + 0.31677251E+04 0.31743860E+04 0.31831750E+04 0.31852251E+04 + 0.31852251E+04 0.31881350E+04 0.31881350E+04 0.31848340E+04 + 0.31848340E+04 0.31758049E+04 0.31758049E+04 0.31674231E+04 + 0.31674231E+04 0.31644541E+04 0.31644541E+04 0.31631499E+04 + 0.31631499E+04 0.31625061E+04 0.31625061E+04 0.31644299E+04 + 0.31644299E+04 0.31683240E+04 0.31683240E+04 0.31755691E+04 + 0.31831750E+04 0.31852251E+04 0.31852251E+04 0.31881350E+04 + 0.31881350E+04 0.31848340E+04 0.31848340E+04 0.31758049E+04 + 0.31758049E+04 0.31674231E+04 0.31674231E+04 0.31644541E+04 + 0.31644541E+04 0.31631499E+04 0.31631499E+04 0.31625061E+04 + 0.31625061E+04 0.31644299E+04 0.31644299E+04 0.31683240E+04 + 0.30414189E+04 0.30399580E+04 0.31766580E+04 0.31736299E+04 + 0.31736299E+04 0.31761790E+04 0.31761790E+04 0.31738889E+04 + 0.31738889E+04 0.31669099E+04 0.31669099E+04 0.31632610E+04 + 0.31632610E+04 0.31629309E+04 0.31629309E+04 0.31634380E+04 + 0.31634380E+04 0.31635349E+04 0.31635349E+04 0.31653301E+04 + 0.31653301E+04 0.31677700E+04 0.30461001E+04 0.30413369E+04 + 0.31766580E+04 0.31736299E+04 0.31736299E+04 0.31761790E+04 + 0.31761790E+04 0.31738889E+04 0.31738889E+04 0.31669099E+04 + 0.31669099E+04 0.31632610E+04 0.31632610E+04 0.31629309E+04 + 0.31629309E+04 0.31634380E+04 0.31634380E+04 0.31635349E+04 + 0.30708601E+04 0.30671479E+04 0.30671479E+04 0.30652749E+04 + 0.30461001E+04 0.30413369E+04 0.31773450E+04 0.31668311E+04 + 0.31668311E+04 0.31664050E+04 0.31664050E+04 0.31664331E+04 + 0.31664331E+04 0.31647820E+04 0.31647820E+04 0.31633799E+04 + 0.31633799E+04 0.31615730E+04 0.31615730E+04 0.31623040E+04 + 0.31623040E+04 0.31622061E+04 0.30713081E+04 0.30685349E+04 + 0.30685349E+04 0.30656040E+04 0.30453130E+04 0.30418931E+04 + 0.31773450E+04 0.31668311E+04 0.31668311E+04 0.31664050E+04 + 0.31664050E+04 0.31664331E+04 0.31664331E+04 0.31647820E+04 + 0.31647820E+04 0.31633799E+04 0.31633799E+04 0.31615730E+04 + 0.30820139E+04 0.30775449E+04 0.30775449E+04 0.30713081E+04 + 0.30713081E+04 0.30685349E+04 0.30685349E+04 0.30656040E+04 + 0.30453130E+04 0.30418931E+04 0.31788311E+04 0.31698921E+04 + 0.31698921E+04 0.31662229E+04 0.31662229E+04 0.31635471E+04 + 0.31635471E+04 0.31614771E+04 0.31614771E+04 0.31618210E+04 + 0.31618210E+04 0.31609839E+04 0.30834661E+04 0.30791941E+04 + 0.30791941E+04 0.30738979E+04 0.30738979E+04 0.30701880E+04 + 0.30701880E+04 0.30670081E+04 0.30455081E+04 0.30421150E+04 + 0.31788311E+04 0.31698921E+04 0.31698921E+04 0.31662229E+04 + 0.31662229E+04 0.31635471E+04 0.31635471E+04 0.31614771E+04 + 0.30917170E+04 0.30878330E+04 0.30878330E+04 0.30834661E+04 + 0.30834661E+04 0.30791941E+04 0.30791941E+04 0.30738979E+04 + 0.30738979E+04 0.30701880E+04 0.30701880E+04 0.30670081E+04 + 0.30455081E+04 0.30421150E+04 0.31783721E+04 0.31725850E+04 + 0.31725850E+04 0.31675271E+04 0.31675271E+04 0.31653311E+04 + 0.31653311E+04 0.31609900E+04 0.30927361E+04 0.30887119E+04 + 0.30887119E+04 0.30855959E+04 0.30855959E+04 0.30821331E+04 + 0.30821331E+04 0.30760959E+04 0.30760959E+04 0.30710281E+04 + 0.30710281E+04 0.30677910E+04 0.30454519E+04 0.30424939E+04 + 0.31783721E+04 0.31725850E+04 0.31725850E+04 0.31675271E+04 + 0.31023301E+04 0.30983379E+04 0.30983379E+04 0.30927361E+04 + 0.30927361E+04 0.30887119E+04 0.30887119E+04 0.30855959E+04 + 0.30855959E+04 0.30821331E+04 0.30821331E+04 0.30760959E+04 + 0.30760959E+04 0.30710281E+04 0.30710281E+04 0.30677910E+04 + 0.30454519E+04 0.30424939E+04 0.31779250E+04 0.31745259E+04 + 0.31745259E+04 0.31690730E+04 0.31048110E+04 0.30991211E+04 + 0.30991211E+04 0.30936450E+04 0.30936450E+04 0.30897859E+04 + 0.30897859E+04 0.30835840E+04 0.30835840E+04 0.30787319E+04 + 0.30787319E+04 0.30767041E+04 0.30767041E+04 0.30733311E+04 + 0.30733311E+04 0.30690769E+04 0.30458379E+04 0.30425540E+04 + 0.31130901E+04 0.31098870E+04 0.31098870E+04 0.31048110E+04 + 0.31048110E+04 0.30991211E+04 0.30991211E+04 0.30936450E+04 + 0.30936450E+04 0.30897859E+04 0.30897859E+04 0.30835840E+04 + 0.30835840E+04 0.30787319E+04 0.30787319E+04 0.30767041E+04 + 0.30767041E+04 0.30733311E+04 0.30733311E+04 0.30690769E+04 + 0.30690769E+04 0.30658770E+04 0.31148401E+04 0.31120239E+04 + 0.31120239E+04 0.31091160E+04 0.31091160E+04 0.31036509E+04 + 0.31036509E+04 0.30932671E+04 0.30932671E+04 0.30863250E+04 + 0.30863250E+04 0.30818330E+04 0.30818330E+04 0.30800210E+04 + 0.30800210E+04 0.30811880E+04 0.30811880E+04 0.30763740E+04 + 0.30763740E+04 0.30710061E+04 0.30710061E+04 0.30673660E+04 + 0.31672290E+04 0.31693560E+04 0.31693560E+04 0.31711289E+04 + 0.31711289E+04 0.31696919E+04 0.31696919E+04 0.31641899E+04 + 0.31641899E+04 0.31600610E+04 0.31600610E+04 0.31635259E+04 + 0.31635259E+04 0.31685220E+04 0.31685220E+04 0.31683210E+04 + 0.31683210E+04 0.31693191E+04 0.31693191E+04 0.31749580E+04 + 0.31749580E+04 0.31826399E+04 0.31567820E+04 0.31615459E+04 + 0.31615459E+04 0.31647581E+04 0.31647581E+04 0.31631760E+04 + 0.31631760E+04 0.31605400E+04 0.31605400E+04 0.31618320E+04 + 0.31618320E+04 0.31685029E+04 0.31685029E+04 0.31729680E+04 + 0.31729680E+04 0.31728301E+04 0.31728301E+04 0.31766570E+04 + 0.31766570E+04 0.31818401E+04 0.31818401E+04 0.31884319E+04 + 0.31567820E+04 0.31615459E+04 0.31615459E+04 0.31647581E+04 + 0.31647581E+04 0.31631760E+04 0.31631760E+04 0.31605400E+04 + 0.31605400E+04 0.31618320E+04 0.31618320E+04 0.31685029E+04 + 0.31685029E+04 0.31729680E+04 0.31729680E+04 0.31728301E+04 + 0.31728301E+04 0.31766570E+04 0.31766570E+04 0.31818401E+04 + 0.31818401E+04 0.31884319E+04 0.31477129E+04 0.31507649E+04 + 0.31507649E+04 0.31526040E+04 0.31526040E+04 0.31511699E+04 + 0.31511699E+04 0.31546040E+04 0.31546040E+04 0.31611609E+04 + 0.31611609E+04 0.31686179E+04 0.31686179E+04 0.31735359E+04 + 0.31735359E+04 0.31759060E+04 0.31759060E+04 0.31817019E+04 + 0.31817019E+04 0.31877009E+04 0.31877009E+04 0.31943879E+04 + 0.31477129E+04 0.31507649E+04 0.31507649E+04 0.31526040E+04 + 0.31526040E+04 0.31511699E+04 0.31511699E+04 0.31546040E+04 + 0.31546040E+04 0.31611609E+04 0.31611609E+04 0.31686179E+04 + 0.31686179E+04 0.31735359E+04 0.31735359E+04 0.31759060E+04 + 0.31759060E+04 0.31817019E+04 0.31817019E+04 0.31877009E+04 + 0.31877009E+04 0.31943879E+04 0.31445840E+04 0.31394839E+04 + 0.31394839E+04 0.31399231E+04 0.31399231E+04 0.31438059E+04 + 0.31438059E+04 0.31555110E+04 0.31555110E+04 0.31673879E+04 + 0.31673879E+04 0.31734629E+04 0.31734629E+04 0.31756609E+04 + 0.31756609E+04 0.31796980E+04 0.31796980E+04 0.31880000E+04 + 0.31880000E+04 0.31971289E+04 0.31971289E+04 0.32048491E+04 + 0.31445840E+04 0.31394839E+04 0.31394839E+04 0.31399231E+04 + 0.31399231E+04 0.31438059E+04 0.31438059E+04 0.31555110E+04 + 0.31555110E+04 0.31673879E+04 0.31673879E+04 0.31734629E+04 + 0.31734629E+04 0.31756609E+04 0.31756609E+04 0.31796980E+04 + 0.31796980E+04 0.31880000E+04 0.31880000E+04 0.31971289E+04 + 0.31971289E+04 0.32048491E+04 0.31585420E+04 0.31528010E+04 + 0.31528010E+04 0.31525710E+04 0.31525710E+04 0.31525759E+04 + 0.31525759E+04 0.31558711E+04 0.31558711E+04 0.31620549E+04 + 0.31620549E+04 0.31670029E+04 0.31670029E+04 0.31706431E+04 + 0.31706431E+04 0.31781221E+04 0.31781221E+04 0.31895391E+04 + 0.31895391E+04 0.32007561E+04 0.32007561E+04 0.32101680E+04 + 0.31585420E+04 0.31528010E+04 0.31528010E+04 0.31525710E+04 + 0.31525710E+04 0.31525759E+04 0.31525759E+04 0.31558711E+04 + 0.31558711E+04 0.31620549E+04 0.31620549E+04 0.31670029E+04 + 0.31670029E+04 0.31706431E+04 0.31706431E+04 0.31781221E+04 + 0.31781221E+04 0.31895391E+04 0.31895391E+04 0.32007561E+04 + 0.32007561E+04 0.32101680E+04 0.31719741E+04 0.31748000E+04 + 0.31748000E+04 0.31750249E+04 0.31750249E+04 0.31701570E+04 + 0.31701570E+04 0.31629109E+04 0.31629109E+04 0.31608721E+04 + 0.31608721E+04 0.31641860E+04 0.31641860E+04 0.31682339E+04 + 0.31682339E+04 0.31745439E+04 0.31745439E+04 0.31848630E+04 + 0.31848630E+04 0.31968330E+04 0.31968330E+04 0.32086599E+04 + 0.31719741E+04 0.31748000E+04 0.31748000E+04 0.31750249E+04 + 0.31750249E+04 0.31701570E+04 0.31701570E+04 0.31629109E+04 + 0.31629109E+04 0.31608721E+04 0.31608721E+04 0.31641860E+04 + 0.31641860E+04 0.31682339E+04 0.31682339E+04 0.31745439E+04 + 0.31745439E+04 0.31848630E+04 0.31848630E+04 0.31968330E+04 + 0.31968330E+04 0.32086599E+04 0.31726340E+04 0.31808831E+04 + 0.31808831E+04 0.31816809E+04 0.31816809E+04 0.31791201E+04 + 0.31791201E+04 0.31761689E+04 0.31761689E+04 0.31733101E+04 + 0.31733101E+04 0.31717649E+04 0.31717649E+04 0.31694851E+04 + 0.31694851E+04 0.31704709E+04 0.31704709E+04 0.31772891E+04 + 0.31772891E+04 0.31876709E+04 0.31876709E+04 0.31982830E+04 + 0.31726340E+04 0.31808831E+04 0.31808831E+04 0.31816809E+04 + 0.31816809E+04 0.31791201E+04 0.31791201E+04 0.31761689E+04 + 0.31761689E+04 0.31733101E+04 0.31733101E+04 0.31717649E+04 + 0.31717649E+04 0.31694851E+04 0.31694851E+04 0.31704709E+04 + 0.31704709E+04 0.31772891E+04 0.31772891E+04 0.31876709E+04 + 0.31876709E+04 0.31982830E+04 0.31717729E+04 0.31782771E+04 + 0.31782771E+04 0.31818359E+04 0.31818359E+04 0.31804490E+04 + 0.31804490E+04 0.31797639E+04 0.31797639E+04 0.31785161E+04 + 0.31785161E+04 0.31739021E+04 0.31739021E+04 0.31665649E+04 + 0.31665649E+04 0.31646941E+04 0.31646941E+04 0.31693750E+04 + 0.31693750E+04 0.31760920E+04 0.31760920E+04 0.31822400E+04 + 0.31717729E+04 0.31782771E+04 0.31782771E+04 0.31818359E+04 + 0.31818359E+04 0.31804490E+04 0.31804490E+04 0.31797639E+04 + 0.31797639E+04 0.31785161E+04 0.31785161E+04 0.31739021E+04 + 0.31739021E+04 0.31665649E+04 0.31665649E+04 0.31646941E+04 + 0.31646941E+04 0.31693750E+04 0.31693750E+04 0.31760920E+04 + 0.31760920E+04 0.31822400E+04 0.31794990E+04 0.31828020E+04 + 0.31828020E+04 0.31889380E+04 0.31889380E+04 0.31863921E+04 + 0.31863921E+04 0.31812859E+04 0.31812859E+04 0.31779160E+04 + 0.31779160E+04 0.31732520E+04 0.31732520E+04 0.31653030E+04 + 0.31653030E+04 0.31614661E+04 0.31614661E+04 0.31651880E+04 + 0.31651880E+04 0.31700791E+04 0.31700791E+04 0.31744951E+04 + 0.31794990E+04 0.31828020E+04 0.31828020E+04 0.31889380E+04 + 0.31889380E+04 0.31863921E+04 0.31863921E+04 0.31812859E+04 + 0.31812859E+04 0.31779160E+04 0.31779160E+04 0.31732520E+04 + 0.31732520E+04 0.31653030E+04 0.31653030E+04 0.31614661E+04 + 0.31614661E+04 0.31651880E+04 0.31651880E+04 0.31700791E+04 + 0.31700791E+04 0.31744951E+04 0.31873040E+04 0.31889780E+04 + 0.31889780E+04 0.31938479E+04 0.31938479E+04 0.31908679E+04 + 0.31908679E+04 0.31835669E+04 0.31835669E+04 0.31778181E+04 + 0.31778181E+04 0.31723850E+04 0.31723850E+04 0.31648120E+04 + 0.31648120E+04 0.31600449E+04 0.31600449E+04 0.31616899E+04 + 0.31616899E+04 0.31677251E+04 0.31677251E+04 0.31743860E+04 + 0.31873040E+04 0.31889780E+04 0.31889780E+04 0.31938479E+04 + 0.31938479E+04 0.31908679E+04 0.31908679E+04 0.31835669E+04 + 0.31835669E+04 0.31778181E+04 0.31778181E+04 0.31723850E+04 + 0.31723850E+04 0.31648120E+04 0.31648120E+04 0.31600449E+04 + 0.31600449E+04 0.31616899E+04 0.31616899E+04 0.31677251E+04 + 0.31677251E+04 0.31743860E+04 0.31831750E+04 0.31852251E+04 + 0.31852251E+04 0.31881350E+04 0.31881350E+04 0.31848340E+04 + 0.31848340E+04 0.31758049E+04 0.31758049E+04 0.31674231E+04 + 0.31674231E+04 0.31644541E+04 0.31644541E+04 0.31631499E+04 + 0.31631499E+04 0.31625061E+04 0.31625061E+04 0.31644299E+04 + 0.31644299E+04 0.31683240E+04 0.31683240E+04 0.31755691E+04 + 0.31831750E+04 0.31852251E+04 0.31852251E+04 0.31881350E+04 + 0.31881350E+04 0.31848340E+04 0.31848340E+04 0.31758049E+04 + 0.31758049E+04 0.31674231E+04 0.31674231E+04 0.31644541E+04 + 0.31644541E+04 0.31631499E+04 0.31631499E+04 0.31625061E+04 + 0.31625061E+04 0.31644299E+04 0.31644299E+04 0.31683240E+04 + 0.30414189E+04 0.30399580E+04 0.31766580E+04 0.31736299E+04 + 0.31736299E+04 0.31761790E+04 0.31761790E+04 0.31738889E+04 + 0.31738889E+04 0.31669099E+04 0.31669099E+04 0.31632610E+04 + 0.31632610E+04 0.31629309E+04 0.31629309E+04 0.31634380E+04 + 0.31634380E+04 0.31635349E+04 0.31635349E+04 0.31653301E+04 + 0.31653301E+04 0.31677700E+04 0.30461001E+04 0.30413369E+04 + 0.31766580E+04 0.31736299E+04 0.31736299E+04 0.31761790E+04 + 0.31761790E+04 0.31738889E+04 0.31738889E+04 0.31669099E+04 + 0.31669099E+04 0.31632610E+04 0.31632610E+04 0.31629309E+04 + 0.31629309E+04 0.31634380E+04 0.31634380E+04 0.31635349E+04 + 0.30708601E+04 0.30671479E+04 0.30671479E+04 0.30652749E+04 + 0.30461001E+04 0.30413369E+04 0.31773450E+04 0.31668311E+04 + 0.31668311E+04 0.31664050E+04 0.31664050E+04 0.31664331E+04 + 0.31664331E+04 0.31647820E+04 0.31647820E+04 0.31633799E+04 + 0.31633799E+04 0.31615730E+04 0.31615730E+04 0.31623040E+04 + 0.31623040E+04 0.31622061E+04 0.30713081E+04 0.30685349E+04 + 0.30685349E+04 0.30656040E+04 0.30453130E+04 0.30418931E+04 + 0.31773450E+04 0.31668311E+04 0.31668311E+04 0.31664050E+04 + 0.31664050E+04 0.31664331E+04 0.31664331E+04 0.31647820E+04 + 0.31647820E+04 0.31633799E+04 0.31633799E+04 0.31615730E+04 + 0.30820139E+04 0.30775449E+04 0.30775449E+04 0.30713081E+04 + 0.30713081E+04 0.30685349E+04 0.30685349E+04 0.30656040E+04 + 0.30453130E+04 0.30418931E+04 0.31788311E+04 0.31698921E+04 + 0.31698921E+04 0.31662229E+04 0.31662229E+04 0.31635471E+04 + 0.31635471E+04 0.31614771E+04 0.31614771E+04 0.31618210E+04 + 0.31618210E+04 0.31609839E+04 0.30834661E+04 0.30791941E+04 + 0.30791941E+04 0.30738979E+04 0.30738979E+04 0.30701880E+04 + 0.30701880E+04 0.30670081E+04 0.30455081E+04 0.30421150E+04 + 0.31788311E+04 0.31698921E+04 0.31698921E+04 0.31662229E+04 + 0.31662229E+04 0.31635471E+04 0.31635471E+04 0.31614771E+04 + 0.30917170E+04 0.30878330E+04 0.30878330E+04 0.30834661E+04 + 0.30834661E+04 0.30791941E+04 0.30791941E+04 0.30738979E+04 + 0.30738979E+04 0.30701880E+04 0.30701880E+04 0.30670081E+04 + 0.30455081E+04 0.30421150E+04 0.31783721E+04 0.31725850E+04 + 0.31725850E+04 0.31675271E+04 0.31675271E+04 0.31653311E+04 + 0.31653311E+04 0.31609900E+04 0.30927361E+04 0.30887119E+04 + 0.30887119E+04 0.30855959E+04 0.30855959E+04 0.30821331E+04 + 0.30821331E+04 0.30760959E+04 0.30760959E+04 0.30710281E+04 + 0.30710281E+04 0.30677910E+04 0.30454519E+04 0.30424939E+04 + 0.31783721E+04 0.31725850E+04 0.31725850E+04 0.31675271E+04 + 0.31023301E+04 0.30983379E+04 0.30983379E+04 0.30927361E+04 + 0.30927361E+04 0.30887119E+04 0.30887119E+04 0.30855959E+04 + 0.30855959E+04 0.30821331E+04 0.30821331E+04 0.30760959E+04 + 0.30760959E+04 0.30710281E+04 0.30710281E+04 0.30677910E+04 + 0.30454519E+04 0.30424939E+04 0.31779250E+04 0.31745259E+04 + 0.31745259E+04 0.31690730E+04 0.31048110E+04 0.30991211E+04 + 0.30991211E+04 0.30936450E+04 0.30936450E+04 0.30897859E+04 + 0.30897859E+04 0.30835840E+04 0.30835840E+04 0.30787319E+04 + 0.30787319E+04 0.30767041E+04 0.30767041E+04 0.30733311E+04 + 0.30733311E+04 0.30690769E+04 0.30458379E+04 0.30425540E+04 + 0.31130901E+04 0.31098870E+04 0.31098870E+04 0.31048110E+04 + 0.31048110E+04 0.30991211E+04 0.30991211E+04 0.30936450E+04 + 0.30936450E+04 0.30897859E+04 0.30897859E+04 0.30835840E+04 + 0.30835840E+04 0.30787319E+04 0.30787319E+04 0.30767041E+04 + 0.30767041E+04 0.30733311E+04 0.30733311E+04 0.30690769E+04 + 0.30690769E+04 0.30658770E+04 0.31148401E+04 0.31120239E+04 + 0.31120239E+04 0.31091160E+04 0.31091160E+04 0.31036509E+04 + 0.31036509E+04 0.30932671E+04 0.30932671E+04 0.30863250E+04 + 0.30863250E+04 0.30818330E+04 0.30818330E+04 0.30800210E+04 + 0.30800210E+04 0.30811880E+04 0.30811880E+04 0.30763740E+04 + 0.30763740E+04 0.30710061E+04 0.30710061E+04 0.30673660E+04 + 0.31689800E+04 0.31710649E+04 0.31710649E+04 0.31729500E+04 + 0.31729500E+04 0.31716399E+04 0.31716399E+04 0.31661860E+04 + 0.31661860E+04 0.31619080E+04 0.31619080E+04 0.31651741E+04 + 0.31651741E+04 0.31702700E+04 0.31702700E+04 0.31702820E+04 + 0.31702820E+04 0.31712529E+04 0.31712529E+04 0.31768320E+04 + 0.31768320E+04 0.31844951E+04 0.31585740E+04 0.31633110E+04 + 0.31633110E+04 0.31666489E+04 0.31666489E+04 0.31652190E+04 + 0.31652190E+04 0.31625591E+04 0.31625591E+04 0.31636721E+04 + 0.31636721E+04 0.31702319E+04 0.31702319E+04 0.31749031E+04 + 0.31749031E+04 0.31748420E+04 0.31748420E+04 0.31786250E+04 + 0.31786250E+04 0.31837690E+04 0.31837690E+04 0.31902051E+04 + 0.31585740E+04 0.31633110E+04 0.31633110E+04 0.31666489E+04 + 0.31666489E+04 0.31652190E+04 0.31652190E+04 0.31625591E+04 + 0.31625591E+04 0.31636721E+04 0.31636721E+04 0.31702319E+04 + 0.31702319E+04 0.31749031E+04 0.31749031E+04 0.31748420E+04 + 0.31748420E+04 0.31786250E+04 0.31786250E+04 0.31837690E+04 + 0.31837690E+04 0.31902051E+04 0.31496050E+04 0.31527090E+04 + 0.31527090E+04 0.31546851E+04 0.31546851E+04 0.31530520E+04 + 0.31530520E+04 0.31562371E+04 0.31562371E+04 0.31626270E+04 + 0.31626270E+04 0.31701079E+04 0.31701079E+04 0.31752500E+04 + 0.31752500E+04 0.31777119E+04 0.31777119E+04 0.31834810E+04 + 0.31834810E+04 0.31893391E+04 0.31893391E+04 0.31957690E+04 + 0.31496050E+04 0.31527090E+04 0.31527090E+04 0.31546851E+04 + 0.31546851E+04 0.31530520E+04 0.31530520E+04 0.31562371E+04 + 0.31562371E+04 0.31626270E+04 0.31626270E+04 0.31701079E+04 + 0.31701079E+04 0.31752500E+04 0.31752500E+04 0.31777119E+04 + 0.31777119E+04 0.31834810E+04 0.31834810E+04 0.31893391E+04 + 0.31893391E+04 0.31957690E+04 0.31459490E+04 0.31408530E+04 + 0.31408530E+04 0.31412581E+04 0.31412581E+04 0.31449509E+04 + 0.31449509E+04 0.31566570E+04 0.31566570E+04 0.31685681E+04 + 0.31685681E+04 0.31748359E+04 0.31748359E+04 0.31771289E+04 + 0.31771289E+04 0.31810859E+04 0.31810859E+04 0.31892380E+04 + 0.31892380E+04 0.31982170E+04 0.31982170E+04 0.32058240E+04 + 0.31459490E+04 0.31408530E+04 0.31408530E+04 0.31412581E+04 + 0.31412581E+04 0.31449509E+04 0.31449509E+04 0.31566570E+04 + 0.31566570E+04 0.31685681E+04 0.31685681E+04 0.31748359E+04 + 0.31748359E+04 0.31771289E+04 0.31771289E+04 0.31810859E+04 + 0.31810859E+04 0.31892380E+04 0.31892380E+04 0.31982170E+04 + 0.31982170E+04 0.32058240E+04 0.31594089E+04 0.31537090E+04 + 0.31537090E+04 0.31536050E+04 0.31536050E+04 0.31536521E+04 + 0.31536521E+04 0.31569790E+04 0.31569790E+04 0.31631289E+04 + 0.31631289E+04 0.31680620E+04 0.31680620E+04 0.31716531E+04 + 0.31716531E+04 0.31790801E+04 0.31790801E+04 0.31904690E+04 + 0.31904690E+04 0.32016621E+04 0.32016621E+04 0.32110801E+04 + 0.31594089E+04 0.31537090E+04 0.31537090E+04 0.31536050E+04 + 0.31536050E+04 0.31536521E+04 0.31536521E+04 0.31569790E+04 + 0.31569790E+04 0.31631289E+04 0.31631289E+04 0.31680620E+04 + 0.31680620E+04 0.31716531E+04 0.31716531E+04 0.31790801E+04 + 0.31790801E+04 0.31904690E+04 0.31904690E+04 0.32016621E+04 + 0.32016621E+04 0.32110801E+04 0.31728540E+04 0.31756631E+04 + 0.31756631E+04 0.31758999E+04 0.31758999E+04 0.31711169E+04 + 0.31711169E+04 0.31638589E+04 0.31638589E+04 0.31617200E+04 + 0.31617200E+04 0.31650249E+04 0.31650249E+04 0.31691589E+04 + 0.31691589E+04 0.31753540E+04 0.31753540E+04 0.31856479E+04 + 0.31856479E+04 0.31976750E+04 0.31976750E+04 0.32095271E+04 + 0.31728540E+04 0.31756631E+04 0.31756631E+04 0.31758999E+04 + 0.31758999E+04 0.31711169E+04 0.31711169E+04 0.31638589E+04 + 0.31638589E+04 0.31617200E+04 0.31617200E+04 0.31650249E+04 + 0.31650249E+04 0.31691589E+04 0.31691589E+04 0.31753540E+04 + 0.31753540E+04 0.31856479E+04 0.31856479E+04 0.31976750E+04 + 0.31976750E+04 0.32095271E+04 0.31733430E+04 0.31816760E+04 + 0.31816760E+04 0.31826160E+04 0.31826160E+04 0.31800911E+04 + 0.31800911E+04 0.31770779E+04 0.31770779E+04 0.31741399E+04 + 0.31741399E+04 0.31726260E+04 0.31726260E+04 0.31703420E+04 + 0.31703420E+04 0.31711931E+04 0.31711931E+04 0.31780330E+04 + 0.31780330E+04 0.31886340E+04 0.31886340E+04 0.31993960E+04 + 0.31733430E+04 0.31816760E+04 0.31816760E+04 0.31826160E+04 + 0.31826160E+04 0.31800911E+04 0.31800911E+04 0.31770779E+04 + 0.31770779E+04 0.31741399E+04 0.31741399E+04 0.31726260E+04 + 0.31726260E+04 0.31703420E+04 0.31703420E+04 0.31711931E+04 + 0.31711931E+04 0.31780330E+04 0.31780330E+04 0.31886340E+04 + 0.31886340E+04 0.31993960E+04 0.31724331E+04 0.31789919E+04 + 0.31789919E+04 0.31826660E+04 0.31826660E+04 0.31813279E+04 + 0.31813279E+04 0.31806101E+04 0.31806101E+04 0.31793950E+04 + 0.31793950E+04 0.31748950E+04 0.31748950E+04 0.31675010E+04 + 0.31675010E+04 0.31654910E+04 0.31654910E+04 0.31701140E+04 + 0.31701140E+04 0.31769580E+04 0.31769580E+04 0.31833059E+04 + 0.31724331E+04 0.31789919E+04 0.31789919E+04 0.31826660E+04 + 0.31826660E+04 0.31813279E+04 0.31813279E+04 0.31806101E+04 + 0.31806101E+04 0.31793950E+04 0.31793950E+04 0.31748950E+04 + 0.31748950E+04 0.31675010E+04 0.31675010E+04 0.31654910E+04 + 0.31654910E+04 0.31701140E+04 0.31701140E+04 0.31769580E+04 + 0.31769580E+04 0.31833059E+04 0.31802041E+04 0.31834270E+04 + 0.31834270E+04 0.31896599E+04 0.31896599E+04 0.31872529E+04 + 0.31872529E+04 0.31821360E+04 0.31821360E+04 0.31787710E+04 + 0.31787710E+04 0.31742090E+04 0.31742090E+04 0.31662351E+04 + 0.31662351E+04 0.31622429E+04 0.31622429E+04 0.31659331E+04 + 0.31659331E+04 0.31708240E+04 0.31708240E+04 0.31754041E+04 + 0.31802041E+04 0.31834270E+04 0.31834270E+04 0.31896599E+04 + 0.31896599E+04 0.31872529E+04 0.31872529E+04 0.31821360E+04 + 0.31821360E+04 0.31787710E+04 0.31787710E+04 0.31742090E+04 + 0.31742090E+04 0.31662351E+04 0.31662351E+04 0.31622429E+04 + 0.31622429E+04 0.31659331E+04 0.31659331E+04 0.31708240E+04 + 0.31708240E+04 0.31754041E+04 0.31881909E+04 0.31896780E+04 + 0.31896780E+04 0.31945901E+04 0.31945901E+04 0.31917739E+04 + 0.31917739E+04 0.31845049E+04 0.31845049E+04 0.31786970E+04 + 0.31786970E+04 0.31733091E+04 0.31733091E+04 0.31656941E+04 + 0.31656941E+04 0.31609861E+04 0.31609861E+04 0.31626489E+04 + 0.31626489E+04 0.31688491E+04 0.31688491E+04 0.31756799E+04 + 0.31881909E+04 0.31896780E+04 0.31896780E+04 0.31945901E+04 + 0.31945901E+04 0.31917739E+04 0.31917739E+04 0.31845049E+04 + 0.31845049E+04 0.31786970E+04 0.31786970E+04 0.31733091E+04 + 0.31733091E+04 0.31656941E+04 0.31656941E+04 0.31609861E+04 + 0.31609861E+04 0.31626489E+04 0.31626489E+04 0.31688491E+04 + 0.31688491E+04 0.31756799E+04 0.31840420E+04 0.31859929E+04 + 0.31859929E+04 0.31889221E+04 0.31889221E+04 0.31857849E+04 + 0.31857849E+04 0.31768459E+04 0.31768459E+04 0.31684810E+04 + 0.31684810E+04 0.31655090E+04 0.31655090E+04 0.31643799E+04 + 0.31643799E+04 0.31640410E+04 0.31640410E+04 0.31661870E+04 + 0.31661870E+04 0.31698491E+04 0.31698491E+04 0.31770681E+04 + 0.31840420E+04 0.31859929E+04 0.31859929E+04 0.31889221E+04 + 0.31889221E+04 0.31857849E+04 0.31857849E+04 0.31768459E+04 + 0.31768459E+04 0.31684810E+04 0.31684810E+04 0.31655090E+04 + 0.31655090E+04 0.31643799E+04 0.31643799E+04 0.31640410E+04 + 0.31640410E+04 0.31661870E+04 0.31661870E+04 0.31698491E+04 + 0.30420229E+04 0.30406489E+04 0.31775471E+04 0.31743650E+04 + 0.31743650E+04 0.31769700E+04 0.31769700E+04 0.31749470E+04 + 0.31749470E+04 0.31680920E+04 0.31680920E+04 0.31645471E+04 + 0.31645471E+04 0.31644241E+04 0.31644241E+04 0.31652319E+04 + 0.31652319E+04 0.31652339E+04 0.31652339E+04 0.31671941E+04 + 0.31671941E+04 0.31697549E+04 0.30466970E+04 0.30420530E+04 + 0.31775471E+04 0.31743650E+04 0.31743650E+04 0.31769700E+04 + 0.31769700E+04 0.31749470E+04 0.31749470E+04 0.31680920E+04 + 0.31680920E+04 0.31645471E+04 0.31645471E+04 0.31644241E+04 + 0.31644241E+04 0.31652319E+04 0.31652319E+04 0.31652339E+04 + 0.30715359E+04 0.30678450E+04 0.30678450E+04 0.30659939E+04 + 0.30466970E+04 0.30420530E+04 0.31783760E+04 0.31676580E+04 + 0.31676580E+04 0.31673430E+04 0.31673430E+04 0.31676060E+04 + 0.31676060E+04 0.31662009E+04 0.31662009E+04 0.31650879E+04 + 0.31650879E+04 0.31631399E+04 0.31631399E+04 0.31640190E+04 + 0.31640190E+04 0.31641609E+04 0.30719370E+04 0.30692219E+04 + 0.30692219E+04 0.30663379E+04 0.30458679E+04 0.30425020E+04 + 0.31783760E+04 0.31676580E+04 0.31676580E+04 0.31673430E+04 + 0.31673430E+04 0.31676060E+04 0.31676060E+04 0.31662009E+04 + 0.31662009E+04 0.31650879E+04 0.31650879E+04 0.31631399E+04 + 0.30828020E+04 0.30783230E+04 0.30783230E+04 0.30719370E+04 + 0.30719370E+04 0.30692219E+04 0.30692219E+04 0.30663379E+04 + 0.30458679E+04 0.30425020E+04 0.31801101E+04 0.31710640E+04 + 0.31710640E+04 0.31674880E+04 0.31674880E+04 0.31647610E+04 + 0.31647610E+04 0.31627910E+04 0.31627910E+04 0.31633979E+04 + 0.31633979E+04 0.31626770E+04 0.30842739E+04 0.30800320E+04 + 0.30800320E+04 0.30746450E+04 0.30746450E+04 0.30708960E+04 + 0.30708960E+04 0.30677339E+04 0.30459990E+04 0.30426060E+04 + 0.31801101E+04 0.31710640E+04 0.31710640E+04 0.31674880E+04 + 0.31674880E+04 0.31647610E+04 0.31647610E+04 0.31627910E+04 + 0.30924600E+04 0.30886079E+04 0.30886079E+04 0.30842739E+04 + 0.30842739E+04 0.30800320E+04 0.30800320E+04 0.30746450E+04 + 0.30746450E+04 0.30708960E+04 0.30708960E+04 0.30677339E+04 + 0.30459990E+04 0.30426060E+04 0.31798191E+04 0.31738340E+04 + 0.31738340E+04 0.31686980E+04 0.31686980E+04 0.31665879E+04 + 0.31665879E+04 0.31622891E+04 0.30935100E+04 0.30895220E+04 + 0.30895220E+04 0.30864641E+04 0.30864641E+04 0.30829951E+04 + 0.30829951E+04 0.30769070E+04 0.30769070E+04 0.30717180E+04 + 0.30717180E+04 0.30685190E+04 0.30459370E+04 0.30430210E+04 + 0.31798191E+04 0.31738340E+04 0.31738340E+04 0.31686980E+04 + 0.31030869E+04 0.30991021E+04 0.30991021E+04 0.30935100E+04 + 0.30935100E+04 0.30895220E+04 0.30895220E+04 0.30864641E+04 + 0.30864641E+04 0.30829951E+04 0.30829951E+04 0.30769070E+04 + 0.30769070E+04 0.30717180E+04 0.30717180E+04 0.30685190E+04 + 0.30459370E+04 0.30430210E+04 0.31792830E+04 0.31757671E+04 + 0.31757671E+04 0.31702629E+04 0.31056030E+04 0.30999551E+04 + 0.30999551E+04 0.30944771E+04 0.30944771E+04 0.30905710E+04 + 0.30905710E+04 0.30844021E+04 0.30844021E+04 0.30796001E+04 + 0.30796001E+04 0.30775471E+04 0.30775471E+04 0.30740740E+04 + 0.30740740E+04 0.30697749E+04 0.30463469E+04 0.30430801E+04 + 0.31139280E+04 0.31107090E+04 0.31107090E+04 0.31056030E+04 + 0.31056030E+04 0.30999551E+04 0.30999551E+04 0.30944771E+04 + 0.30944771E+04 0.30905710E+04 0.30905710E+04 0.30844021E+04 + 0.30844021E+04 0.30796001E+04 0.30796001E+04 0.30775471E+04 + 0.30775471E+04 0.30740740E+04 0.30740740E+04 0.30697749E+04 + 0.30697749E+04 0.30665420E+04 0.31156799E+04 0.31128889E+04 + 0.31128889E+04 0.31099141E+04 0.31099141E+04 0.31045300E+04 + 0.31045300E+04 0.30940010E+04 0.30940010E+04 0.30870410E+04 + 0.30870410E+04 0.30825439E+04 0.30825439E+04 0.30808101E+04 + 0.30808101E+04 0.30819451E+04 0.30819451E+04 0.30771331E+04 + 0.30771331E+04 0.30716360E+04 0.30716360E+04 0.30679670E+04 + 0.31689800E+04 0.31710649E+04 0.31710649E+04 0.31729500E+04 + 0.31729500E+04 0.31716399E+04 0.31716399E+04 0.31661860E+04 + 0.31661860E+04 0.31619080E+04 0.31619080E+04 0.31651741E+04 + 0.31651741E+04 0.31702700E+04 0.31702700E+04 0.31702820E+04 + 0.31702820E+04 0.31712529E+04 0.31712529E+04 0.31768320E+04 + 0.31768320E+04 0.31844951E+04 0.31585740E+04 0.31633110E+04 + 0.31633110E+04 0.31666489E+04 0.31666489E+04 0.31652190E+04 + 0.31652190E+04 0.31625591E+04 0.31625591E+04 0.31636721E+04 + 0.31636721E+04 0.31702319E+04 0.31702319E+04 0.31749031E+04 + 0.31749031E+04 0.31748420E+04 0.31748420E+04 0.31786250E+04 + 0.31786250E+04 0.31837690E+04 0.31837690E+04 0.31902051E+04 + 0.31585740E+04 0.31633110E+04 0.31633110E+04 0.31666489E+04 + 0.31666489E+04 0.31652190E+04 0.31652190E+04 0.31625591E+04 + 0.31625591E+04 0.31636721E+04 0.31636721E+04 0.31702319E+04 + 0.31702319E+04 0.31749031E+04 0.31749031E+04 0.31748420E+04 + 0.31748420E+04 0.31786250E+04 0.31786250E+04 0.31837690E+04 + 0.31837690E+04 0.31902051E+04 0.31496050E+04 0.31527090E+04 + 0.31527090E+04 0.31546851E+04 0.31546851E+04 0.31530520E+04 + 0.31530520E+04 0.31562371E+04 0.31562371E+04 0.31626270E+04 + 0.31626270E+04 0.31701079E+04 0.31701079E+04 0.31752500E+04 + 0.31752500E+04 0.31777119E+04 0.31777119E+04 0.31834810E+04 + 0.31834810E+04 0.31893391E+04 0.31893391E+04 0.31957690E+04 + 0.31496050E+04 0.31527090E+04 0.31527090E+04 0.31546851E+04 + 0.31546851E+04 0.31530520E+04 0.31530520E+04 0.31562371E+04 + 0.31562371E+04 0.31626270E+04 0.31626270E+04 0.31701079E+04 + 0.31701079E+04 0.31752500E+04 0.31752500E+04 0.31777119E+04 + 0.31777119E+04 0.31834810E+04 0.31834810E+04 0.31893391E+04 + 0.31893391E+04 0.31957690E+04 0.31459490E+04 0.31408530E+04 + 0.31408530E+04 0.31412581E+04 0.31412581E+04 0.31449509E+04 + 0.31449509E+04 0.31566570E+04 0.31566570E+04 0.31685681E+04 + 0.31685681E+04 0.31748359E+04 0.31748359E+04 0.31771289E+04 + 0.31771289E+04 0.31810859E+04 0.31810859E+04 0.31892380E+04 + 0.31892380E+04 0.31982170E+04 0.31982170E+04 0.32058240E+04 + 0.31459490E+04 0.31408530E+04 0.31408530E+04 0.31412581E+04 + 0.31412581E+04 0.31449509E+04 0.31449509E+04 0.31566570E+04 + 0.31566570E+04 0.31685681E+04 0.31685681E+04 0.31748359E+04 + 0.31748359E+04 0.31771289E+04 0.31771289E+04 0.31810859E+04 + 0.31810859E+04 0.31892380E+04 0.31892380E+04 0.31982170E+04 + 0.31982170E+04 0.32058240E+04 0.31594089E+04 0.31537090E+04 + 0.31537090E+04 0.31536050E+04 0.31536050E+04 0.31536521E+04 + 0.31536521E+04 0.31569790E+04 0.31569790E+04 0.31631289E+04 + 0.31631289E+04 0.31680620E+04 0.31680620E+04 0.31716531E+04 + 0.31716531E+04 0.31790801E+04 0.31790801E+04 0.31904690E+04 + 0.31904690E+04 0.32016621E+04 0.32016621E+04 0.32110801E+04 + 0.31594089E+04 0.31537090E+04 0.31537090E+04 0.31536050E+04 + 0.31536050E+04 0.31536521E+04 0.31536521E+04 0.31569790E+04 + 0.31569790E+04 0.31631289E+04 0.31631289E+04 0.31680620E+04 + 0.31680620E+04 0.31716531E+04 0.31716531E+04 0.31790801E+04 + 0.31790801E+04 0.31904690E+04 0.31904690E+04 0.32016621E+04 + 0.32016621E+04 0.32110801E+04 0.31728540E+04 0.31756631E+04 + 0.31756631E+04 0.31758999E+04 0.31758999E+04 0.31711169E+04 + 0.31711169E+04 0.31638589E+04 0.31638589E+04 0.31617200E+04 + 0.31617200E+04 0.31650249E+04 0.31650249E+04 0.31691589E+04 + 0.31691589E+04 0.31753540E+04 0.31753540E+04 0.31856479E+04 + 0.31856479E+04 0.31976750E+04 0.31976750E+04 0.32095271E+04 + 0.31728540E+04 0.31756631E+04 0.31756631E+04 0.31758999E+04 + 0.31758999E+04 0.31711169E+04 0.31711169E+04 0.31638589E+04 + 0.31638589E+04 0.31617200E+04 0.31617200E+04 0.31650249E+04 + 0.31650249E+04 0.31691589E+04 0.31691589E+04 0.31753540E+04 + 0.31753540E+04 0.31856479E+04 0.31856479E+04 0.31976750E+04 + 0.31976750E+04 0.32095271E+04 0.31733430E+04 0.31816760E+04 + 0.31816760E+04 0.31826160E+04 0.31826160E+04 0.31800911E+04 + 0.31800911E+04 0.31770779E+04 0.31770779E+04 0.31741399E+04 + 0.31741399E+04 0.31726260E+04 0.31726260E+04 0.31703420E+04 + 0.31703420E+04 0.31711931E+04 0.31711931E+04 0.31780330E+04 + 0.31780330E+04 0.31886340E+04 0.31886340E+04 0.31993960E+04 + 0.31733430E+04 0.31816760E+04 0.31816760E+04 0.31826160E+04 + 0.31826160E+04 0.31800911E+04 0.31800911E+04 0.31770779E+04 + 0.31770779E+04 0.31741399E+04 0.31741399E+04 0.31726260E+04 + 0.31726260E+04 0.31703420E+04 0.31703420E+04 0.31711931E+04 + 0.31711931E+04 0.31780330E+04 0.31780330E+04 0.31886340E+04 + 0.31886340E+04 0.31993960E+04 0.31724331E+04 0.31789919E+04 + 0.31789919E+04 0.31826660E+04 0.31826660E+04 0.31813279E+04 + 0.31813279E+04 0.31806101E+04 0.31806101E+04 0.31793950E+04 + 0.31793950E+04 0.31748950E+04 0.31748950E+04 0.31675010E+04 + 0.31675010E+04 0.31654910E+04 0.31654910E+04 0.31701140E+04 + 0.31701140E+04 0.31769580E+04 0.31769580E+04 0.31833059E+04 + 0.31724331E+04 0.31789919E+04 0.31789919E+04 0.31826660E+04 + 0.31826660E+04 0.31813279E+04 0.31813279E+04 0.31806101E+04 + 0.31806101E+04 0.31793950E+04 0.31793950E+04 0.31748950E+04 + 0.31748950E+04 0.31675010E+04 0.31675010E+04 0.31654910E+04 + 0.31654910E+04 0.31701140E+04 0.31701140E+04 0.31769580E+04 + 0.31769580E+04 0.31833059E+04 0.31802041E+04 0.31834270E+04 + 0.31834270E+04 0.31896599E+04 0.31896599E+04 0.31872529E+04 + 0.31872529E+04 0.31821360E+04 0.31821360E+04 0.31787710E+04 + 0.31787710E+04 0.31742090E+04 0.31742090E+04 0.31662351E+04 + 0.31662351E+04 0.31622429E+04 0.31622429E+04 0.31659331E+04 + 0.31659331E+04 0.31708240E+04 0.31708240E+04 0.31754041E+04 + 0.31802041E+04 0.31834270E+04 0.31834270E+04 0.31896599E+04 + 0.31896599E+04 0.31872529E+04 0.31872529E+04 0.31821360E+04 + 0.31821360E+04 0.31787710E+04 0.31787710E+04 0.31742090E+04 + 0.31742090E+04 0.31662351E+04 0.31662351E+04 0.31622429E+04 + 0.31622429E+04 0.31659331E+04 0.31659331E+04 0.31708240E+04 + 0.31708240E+04 0.31754041E+04 0.31881909E+04 0.31896780E+04 + 0.31896780E+04 0.31945901E+04 0.31945901E+04 0.31917739E+04 + 0.31917739E+04 0.31845049E+04 0.31845049E+04 0.31786970E+04 + 0.31786970E+04 0.31733091E+04 0.31733091E+04 0.31656941E+04 + 0.31656941E+04 0.31609861E+04 0.31609861E+04 0.31626489E+04 + 0.31626489E+04 0.31688491E+04 0.31688491E+04 0.31756799E+04 + 0.31881909E+04 0.31896780E+04 0.31896780E+04 0.31945901E+04 + 0.31945901E+04 0.31917739E+04 0.31917739E+04 0.31845049E+04 + 0.31845049E+04 0.31786970E+04 0.31786970E+04 0.31733091E+04 + 0.31733091E+04 0.31656941E+04 0.31656941E+04 0.31609861E+04 + 0.31609861E+04 0.31626489E+04 0.31626489E+04 0.31688491E+04 + 0.31688491E+04 0.31756799E+04 0.31840420E+04 0.31859929E+04 + 0.31859929E+04 0.31889221E+04 0.31889221E+04 0.31857849E+04 + 0.31857849E+04 0.31768459E+04 0.31768459E+04 0.31684810E+04 + 0.31684810E+04 0.31655090E+04 0.31655090E+04 0.31643799E+04 + 0.31643799E+04 0.31640410E+04 0.31640410E+04 0.31661870E+04 + 0.31661870E+04 0.31698491E+04 0.31698491E+04 0.31770681E+04 + 0.31840420E+04 0.31859929E+04 0.31859929E+04 0.31889221E+04 + 0.31889221E+04 0.31857849E+04 0.31857849E+04 0.31768459E+04 + 0.31768459E+04 0.31684810E+04 0.31684810E+04 0.31655090E+04 + 0.31655090E+04 0.31643799E+04 0.31643799E+04 0.31640410E+04 + 0.31640410E+04 0.31661870E+04 0.31661870E+04 0.31698491E+04 + 0.30420229E+04 0.30406489E+04 0.31775471E+04 0.31743650E+04 + 0.31743650E+04 0.31769700E+04 0.31769700E+04 0.31749470E+04 + 0.31749470E+04 0.31680920E+04 0.31680920E+04 0.31645471E+04 + 0.31645471E+04 0.31644241E+04 0.31644241E+04 0.31652319E+04 + 0.31652319E+04 0.31652339E+04 0.31652339E+04 0.31671941E+04 + 0.31671941E+04 0.31697549E+04 0.30466970E+04 0.30420530E+04 + 0.31775471E+04 0.31743650E+04 0.31743650E+04 0.31769700E+04 + 0.31769700E+04 0.31749470E+04 0.31749470E+04 0.31680920E+04 + 0.31680920E+04 0.31645471E+04 0.31645471E+04 0.31644241E+04 + 0.31644241E+04 0.31652319E+04 0.31652319E+04 0.31652339E+04 + 0.30715359E+04 0.30678450E+04 0.30678450E+04 0.30659939E+04 + 0.30466970E+04 0.30420530E+04 0.31783760E+04 0.31676580E+04 + 0.31676580E+04 0.31673430E+04 0.31673430E+04 0.31676060E+04 + 0.31676060E+04 0.31662009E+04 0.31662009E+04 0.31650879E+04 + 0.31650879E+04 0.31631399E+04 0.31631399E+04 0.31640190E+04 + 0.31640190E+04 0.31641609E+04 0.30719370E+04 0.30692219E+04 + 0.30692219E+04 0.30663379E+04 0.30458679E+04 0.30425020E+04 + 0.31783760E+04 0.31676580E+04 0.31676580E+04 0.31673430E+04 + 0.31673430E+04 0.31676060E+04 0.31676060E+04 0.31662009E+04 + 0.31662009E+04 0.31650879E+04 0.31650879E+04 0.31631399E+04 + 0.30828020E+04 0.30783230E+04 0.30783230E+04 0.30719370E+04 + 0.30719370E+04 0.30692219E+04 0.30692219E+04 0.30663379E+04 + 0.30458679E+04 0.30425020E+04 0.31801101E+04 0.31710640E+04 + 0.31710640E+04 0.31674880E+04 0.31674880E+04 0.31647610E+04 + 0.31647610E+04 0.31627910E+04 0.31627910E+04 0.31633979E+04 + 0.31633979E+04 0.31626770E+04 0.30842739E+04 0.30800320E+04 + 0.30800320E+04 0.30746450E+04 0.30746450E+04 0.30708960E+04 + 0.30708960E+04 0.30677339E+04 0.30459990E+04 0.30426060E+04 + 0.31801101E+04 0.31710640E+04 0.31710640E+04 0.31674880E+04 + 0.31674880E+04 0.31647610E+04 0.31647610E+04 0.31627910E+04 + 0.30924600E+04 0.30886079E+04 0.30886079E+04 0.30842739E+04 + 0.30842739E+04 0.30800320E+04 0.30800320E+04 0.30746450E+04 + 0.30746450E+04 0.30708960E+04 0.30708960E+04 0.30677339E+04 + 0.30459990E+04 0.30426060E+04 0.31798191E+04 0.31738340E+04 + 0.31738340E+04 0.31686980E+04 0.31686980E+04 0.31665879E+04 + 0.31665879E+04 0.31622891E+04 0.30935100E+04 0.30895220E+04 + 0.30895220E+04 0.30864641E+04 0.30864641E+04 0.30829951E+04 + 0.30829951E+04 0.30769070E+04 0.30769070E+04 0.30717180E+04 + 0.30717180E+04 0.30685190E+04 0.30459370E+04 0.30430210E+04 + 0.31798191E+04 0.31738340E+04 0.31738340E+04 0.31686980E+04 + 0.31030869E+04 0.30991021E+04 0.30991021E+04 0.30935100E+04 + 0.30935100E+04 0.30895220E+04 0.30895220E+04 0.30864641E+04 + 0.30864641E+04 0.30829951E+04 0.30829951E+04 0.30769070E+04 + 0.30769070E+04 0.30717180E+04 0.30717180E+04 0.30685190E+04 + 0.30459370E+04 0.30430210E+04 0.31792830E+04 0.31757671E+04 + 0.31757671E+04 0.31702629E+04 0.31056030E+04 0.30999551E+04 + 0.30999551E+04 0.30944771E+04 0.30944771E+04 0.30905710E+04 + 0.30905710E+04 0.30844021E+04 0.30844021E+04 0.30796001E+04 + 0.30796001E+04 0.30775471E+04 0.30775471E+04 0.30740740E+04 + 0.30740740E+04 0.30697749E+04 0.30463469E+04 0.30430801E+04 + 0.31139280E+04 0.31107090E+04 0.31107090E+04 0.31056030E+04 + 0.31056030E+04 0.30999551E+04 0.30999551E+04 0.30944771E+04 + 0.30944771E+04 0.30905710E+04 0.30905710E+04 0.30844021E+04 + 0.30844021E+04 0.30796001E+04 0.30796001E+04 0.30775471E+04 + 0.30775471E+04 0.30740740E+04 0.30740740E+04 0.30697749E+04 + 0.30697749E+04 0.30665420E+04 0.31156799E+04 0.31128889E+04 + 0.31128889E+04 0.31099141E+04 0.31099141E+04 0.31045300E+04 + 0.31045300E+04 0.30940010E+04 0.30940010E+04 0.30870410E+04 + 0.30870410E+04 0.30825439E+04 0.30825439E+04 0.30808101E+04 + 0.30808101E+04 0.30819451E+04 0.30819451E+04 0.30771331E+04 + 0.30771331E+04 0.30716360E+04 0.30716360E+04 0.30679670E+04 + 0.31707310E+04 0.31727729E+04 0.31727729E+04 0.31747710E+04 + 0.31747710E+04 0.31735869E+04 0.31735869E+04 0.31681809E+04 + 0.31681809E+04 0.31637539E+04 0.31637539E+04 0.31668220E+04 + 0.31668220E+04 0.31720181E+04 0.31720181E+04 0.31722429E+04 + 0.31722429E+04 0.31731870E+04 0.31731870E+04 0.31787051E+04 + 0.31787051E+04 0.31863491E+04 0.31603660E+04 0.31650769E+04 + 0.31650769E+04 0.31685400E+04 0.31685400E+04 0.31672620E+04 + 0.31672620E+04 0.31645791E+04 0.31645791E+04 0.31655110E+04 + 0.31655110E+04 0.31719619E+04 0.31719619E+04 0.31768379E+04 + 0.31768379E+04 0.31768540E+04 0.31768540E+04 0.31805920E+04 + 0.31805920E+04 0.31856970E+04 0.31856970E+04 0.31919771E+04 + 0.31603660E+04 0.31650769E+04 0.31650769E+04 0.31685400E+04 + 0.31685400E+04 0.31672620E+04 0.31672620E+04 0.31645791E+04 + 0.31645791E+04 0.31655110E+04 0.31655110E+04 0.31719619E+04 + 0.31719619E+04 0.31768379E+04 0.31768379E+04 0.31768540E+04 + 0.31768540E+04 0.31805920E+04 0.31805920E+04 0.31856970E+04 + 0.31856970E+04 0.31919771E+04 0.31514971E+04 0.31546541E+04 + 0.31546541E+04 0.31567661E+04 0.31567661E+04 0.31549341E+04 + 0.31549341E+04 0.31578701E+04 0.31578701E+04 0.31640930E+04 + 0.31640930E+04 0.31715979E+04 0.31715979E+04 0.31769629E+04 + 0.31769629E+04 0.31795190E+04 0.31795190E+04 0.31852610E+04 + 0.31852610E+04 0.31909771E+04 0.31909771E+04 0.31971499E+04 + 0.31514971E+04 0.31546541E+04 0.31546541E+04 0.31567661E+04 + 0.31567661E+04 0.31549341E+04 0.31549341E+04 0.31578701E+04 + 0.31578701E+04 0.31640930E+04 0.31640930E+04 0.31715979E+04 + 0.31715979E+04 0.31769629E+04 0.31769629E+04 0.31795190E+04 + 0.31795190E+04 0.31852610E+04 0.31852610E+04 0.31909771E+04 + 0.31909771E+04 0.31971499E+04 0.31473140E+04 0.31422229E+04 + 0.31422229E+04 0.31425930E+04 0.31425930E+04 0.31460959E+04 + 0.31460959E+04 0.31578030E+04 0.31578030E+04 0.31697471E+04 + 0.31697471E+04 0.31762090E+04 0.31762090E+04 0.31785969E+04 + 0.31785969E+04 0.31824751E+04 0.31824751E+04 0.31904751E+04 + 0.31904751E+04 0.31993049E+04 0.31993049E+04 0.32068000E+04 + 0.31473140E+04 0.31422229E+04 0.31422229E+04 0.31425930E+04 + 0.31425930E+04 0.31460959E+04 0.31460959E+04 0.31578030E+04 + 0.31578030E+04 0.31697471E+04 0.31697471E+04 0.31762090E+04 + 0.31762090E+04 0.31785969E+04 0.31785969E+04 0.31824751E+04 + 0.31824751E+04 0.31904751E+04 0.31904751E+04 0.31993049E+04 + 0.31993049E+04 0.32068000E+04 0.31602749E+04 0.31546169E+04 + 0.31546169E+04 0.31546399E+04 0.31546399E+04 0.31547271E+04 + 0.31547271E+04 0.31580879E+04 0.31580879E+04 0.31642029E+04 + 0.31642029E+04 0.31691221E+04 0.31691221E+04 0.31726641E+04 + 0.31726641E+04 0.31800371E+04 0.31800371E+04 0.31913989E+04 + 0.31913989E+04 0.32025681E+04 0.32025681E+04 0.32119900E+04 + 0.31602749E+04 0.31546169E+04 0.31546169E+04 0.31546399E+04 + 0.31546399E+04 0.31547271E+04 0.31547271E+04 0.31580879E+04 + 0.31580879E+04 0.31642029E+04 0.31642029E+04 0.31691221E+04 + 0.31691221E+04 0.31726641E+04 0.31726641E+04 0.31800371E+04 + 0.31800371E+04 0.31913989E+04 0.31913989E+04 0.32025681E+04 + 0.32025681E+04 0.32119900E+04 0.31737319E+04 0.31765249E+04 + 0.31765249E+04 0.31767749E+04 0.31767749E+04 0.31720769E+04 + 0.31720769E+04 0.31648069E+04 0.31648069E+04 0.31625681E+04 + 0.31625681E+04 0.31658650E+04 0.31658650E+04 0.31700850E+04 + 0.31700850E+04 0.31761650E+04 0.31761650E+04 0.31864341E+04 + 0.31864341E+04 0.31985171E+04 0.31985171E+04 0.32103940E+04 + 0.31737319E+04 0.31765249E+04 0.31765249E+04 0.31767749E+04 + 0.31767749E+04 0.31720769E+04 0.31720769E+04 0.31648069E+04 + 0.31648069E+04 0.31625681E+04 0.31625681E+04 0.31658650E+04 + 0.31658650E+04 0.31700850E+04 0.31700850E+04 0.31761650E+04 + 0.31761650E+04 0.31864341E+04 0.31864341E+04 0.31985171E+04 + 0.31985171E+04 0.32103940E+04 0.31740530E+04 0.31824690E+04 + 0.31824690E+04 0.31835510E+04 0.31835510E+04 0.31810620E+04 + 0.31810620E+04 0.31779871E+04 0.31779871E+04 0.31749709E+04 + 0.31749709E+04 0.31734871E+04 0.31734871E+04 0.31711990E+04 + 0.31711990E+04 0.31719150E+04 0.31719150E+04 0.31787771E+04 + 0.31787771E+04 0.31895959E+04 0.31895959E+04 0.32005081E+04 + 0.31740530E+04 0.31824690E+04 0.31824690E+04 0.31835510E+04 + 0.31835510E+04 0.31810620E+04 0.31810620E+04 0.31779871E+04 + 0.31779871E+04 0.31749709E+04 0.31749709E+04 0.31734871E+04 + 0.31734871E+04 0.31711990E+04 0.31711990E+04 0.31719150E+04 + 0.31719150E+04 0.31787771E+04 0.31787771E+04 0.31895959E+04 + 0.31895959E+04 0.32005081E+04 0.31730930E+04 0.31797080E+04 + 0.31797080E+04 0.31834951E+04 0.31834951E+04 0.31822070E+04 + 0.31822070E+04 0.31814561E+04 0.31814561E+04 0.31802739E+04 + 0.31802739E+04 0.31758879E+04 0.31758879E+04 0.31684370E+04 + 0.31684370E+04 0.31662881E+04 0.31662881E+04 0.31708521E+04 + 0.31708521E+04 0.31778230E+04 0.31778230E+04 0.31843730E+04 + 0.31730930E+04 0.31797080E+04 0.31797080E+04 0.31834951E+04 + 0.31834951E+04 0.31822070E+04 0.31822070E+04 0.31814561E+04 + 0.31814561E+04 0.31802739E+04 0.31802739E+04 0.31758879E+04 + 0.31758879E+04 0.31684370E+04 0.31684370E+04 0.31662881E+04 + 0.31662881E+04 0.31708521E+04 0.31708521E+04 0.31778230E+04 + 0.31778230E+04 0.31843730E+04 0.31809080E+04 0.31840520E+04 + 0.31840520E+04 0.31903821E+04 0.31903821E+04 0.31881150E+04 + 0.31881150E+04 0.31829861E+04 0.31829861E+04 0.31796250E+04 + 0.31796250E+04 0.31751650E+04 0.31751650E+04 0.31671660E+04 + 0.31671660E+04 0.31630210E+04 0.31630210E+04 0.31666790E+04 + 0.31666790E+04 0.31715701E+04 0.31715701E+04 0.31763120E+04 + 0.31809080E+04 0.31840520E+04 0.31840520E+04 0.31903821E+04 + 0.31903821E+04 0.31881150E+04 0.31881150E+04 0.31829861E+04 + 0.31829861E+04 0.31796250E+04 0.31796250E+04 0.31751650E+04 + 0.31751650E+04 0.31671660E+04 0.31671660E+04 0.31630210E+04 + 0.31630210E+04 0.31666790E+04 0.31666790E+04 0.31715701E+04 + 0.31715701E+04 0.31763120E+04 0.31890791E+04 0.31903779E+04 + 0.31903779E+04 0.31953320E+04 0.31953320E+04 0.31926809E+04 + 0.31926809E+04 0.31854431E+04 0.31854431E+04 0.31795759E+04 + 0.31795759E+04 0.31742319E+04 0.31742319E+04 0.31665759E+04 + 0.31665759E+04 0.31619270E+04 0.31619270E+04 0.31636069E+04 + 0.31636069E+04 0.31699719E+04 0.31699719E+04 0.31769741E+04 + 0.31890791E+04 0.31903779E+04 0.31903779E+04 0.31953320E+04 + 0.31953320E+04 0.31926809E+04 0.31926809E+04 0.31854431E+04 + 0.31854431E+04 0.31795759E+04 0.31795759E+04 0.31742319E+04 + 0.31742319E+04 0.31665759E+04 0.31665759E+04 0.31619270E+04 + 0.31619270E+04 0.31636069E+04 0.31636069E+04 0.31699719E+04 + 0.31699719E+04 0.31769741E+04 0.31849089E+04 0.31867610E+04 + 0.31867610E+04 0.31897090E+04 0.31897090E+04 0.31867371E+04 + 0.31867371E+04 0.31778879E+04 0.31778879E+04 0.31695400E+04 + 0.31695400E+04 0.31665640E+04 0.31665640E+04 0.31656089E+04 + 0.31656089E+04 0.31655750E+04 0.31655750E+04 0.31679431E+04 + 0.31679431E+04 0.31713750E+04 0.31713750E+04 0.31785669E+04 + 0.31849089E+04 0.31867610E+04 0.31867610E+04 0.31897090E+04 + 0.31897090E+04 0.31867371E+04 0.31867371E+04 0.31778879E+04 + 0.31778879E+04 0.31695400E+04 0.31695400E+04 0.31665640E+04 + 0.31665640E+04 0.31656089E+04 0.31656089E+04 0.31655750E+04 + 0.31655750E+04 0.31679431E+04 0.31679431E+04 0.31713750E+04 + 0.30426270E+04 0.30413391E+04 0.31784351E+04 0.31750991E+04 + 0.31750991E+04 0.31777610E+04 0.31777610E+04 0.31760049E+04 + 0.31760049E+04 0.31692729E+04 0.31692729E+04 0.31658320E+04 + 0.31658320E+04 0.31659170E+04 0.31659170E+04 0.31670271E+04 + 0.31670271E+04 0.31669331E+04 0.31669331E+04 0.31690581E+04 + 0.31690581E+04 0.31717410E+04 0.30472939E+04 0.30427690E+04 + 0.31784351E+04 0.31750991E+04 0.31750991E+04 0.31777610E+04 + 0.31777610E+04 0.31760049E+04 0.31760049E+04 0.31692729E+04 + 0.31692729E+04 0.31658320E+04 0.31658320E+04 0.31659170E+04 + 0.31659170E+04 0.31670271E+04 0.31670271E+04 0.31669331E+04 + 0.30722119E+04 0.30685420E+04 0.30685420E+04 0.30667119E+04 + 0.30472939E+04 0.30427690E+04 0.31794080E+04 0.31684861E+04 + 0.31684861E+04 0.31682810E+04 0.31682810E+04 0.31687791E+04 + 0.31687791E+04 0.31676189E+04 0.31676189E+04 0.31667959E+04 + 0.31667959E+04 0.31647070E+04 0.31647070E+04 0.31657339E+04 + 0.31657339E+04 0.31661160E+04 0.30725659E+04 0.30699099E+04 + 0.30699099E+04 0.30670730E+04 0.30464231E+04 0.30431121E+04 + 0.31794080E+04 0.31684861E+04 0.31684861E+04 0.31682810E+04 + 0.31682810E+04 0.31687791E+04 0.31687791E+04 0.31676189E+04 + 0.31676189E+04 0.31667959E+04 0.31667959E+04 0.31647070E+04 + 0.30835911E+04 0.30791021E+04 0.30791021E+04 0.30725659E+04 + 0.30725659E+04 0.30699099E+04 0.30699099E+04 0.30670730E+04 + 0.30464231E+04 0.30431121E+04 0.31813889E+04 0.31722361E+04 + 0.31722361E+04 0.31687520E+04 0.31687520E+04 0.31659761E+04 + 0.31659761E+04 0.31641050E+04 0.31641050E+04 0.31649751E+04 + 0.31649751E+04 0.31643711E+04 0.30850820E+04 0.30808701E+04 + 0.30808701E+04 0.30753921E+04 0.30753921E+04 0.30716040E+04 + 0.30716040E+04 0.30684609E+04 0.30464900E+04 0.30430969E+04 + 0.31813889E+04 0.31722361E+04 0.31722361E+04 0.31687520E+04 + 0.31687520E+04 0.31659761E+04 0.31659761E+04 0.31641050E+04 + 0.30932051E+04 0.30893831E+04 0.30893831E+04 0.30850820E+04 + 0.30850820E+04 0.30808701E+04 0.30808701E+04 0.30753921E+04 + 0.30753921E+04 0.30716040E+04 0.30716040E+04 0.30684609E+04 + 0.30464900E+04 0.30430969E+04 0.31812649E+04 0.31750830E+04 + 0.31750830E+04 0.31698701E+04 0.31698701E+04 0.31678440E+04 + 0.31678440E+04 0.31635879E+04 0.30942830E+04 0.30903330E+04 + 0.30903330E+04 0.30873320E+04 0.30873320E+04 0.30838560E+04 + 0.30838560E+04 0.30777180E+04 0.30777180E+04 0.30724089E+04 + 0.30724089E+04 0.30692480E+04 0.30464221E+04 0.30435491E+04 + 0.31812649E+04 0.31750830E+04 0.31750830E+04 0.31698701E+04 + 0.31038440E+04 0.30998650E+04 0.30998650E+04 0.30942830E+04 + 0.30942830E+04 0.30903330E+04 0.30903330E+04 0.30873320E+04 + 0.30873320E+04 0.30838560E+04 0.30838560E+04 0.30777180E+04 + 0.30777180E+04 0.30724089E+04 0.30724089E+04 0.30692480E+04 + 0.30464221E+04 0.30435491E+04 0.31806411E+04 0.31770081E+04 + 0.31770081E+04 0.31714519E+04 0.31063950E+04 0.31007891E+04 + 0.31007891E+04 0.30953091E+04 0.30953091E+04 0.30913560E+04 + 0.30913560E+04 0.30852190E+04 0.30852190E+04 0.30804690E+04 + 0.30804690E+04 0.30783899E+04 0.30783899E+04 0.30748169E+04 + 0.30748169E+04 0.30704719E+04 0.30468550E+04 0.30436050E+04 + 0.31147671E+04 0.31115320E+04 0.31115320E+04 0.31063950E+04 + 0.31063950E+04 0.31007891E+04 0.31007891E+04 0.30953091E+04 + 0.30953091E+04 0.30913560E+04 0.30913560E+04 0.30852190E+04 + 0.30852190E+04 0.30804690E+04 0.30804690E+04 0.30783899E+04 + 0.30783899E+04 0.30748169E+04 0.30748169E+04 0.30704719E+04 + 0.30704719E+04 0.30672061E+04 0.31165200E+04 0.31137549E+04 + 0.31137549E+04 0.31107119E+04 0.31107119E+04 0.31054089E+04 + 0.31054089E+04 0.30947361E+04 0.30947361E+04 0.30877571E+04 + 0.30877571E+04 0.30832539E+04 0.30832539E+04 0.30815979E+04 + 0.30815979E+04 0.30827029E+04 0.30827029E+04 0.30778921E+04 + 0.30778921E+04 0.30722671E+04 0.30722671E+04 0.30685691E+04 + 0.31707310E+04 0.31727729E+04 0.31727729E+04 0.31747710E+04 + 0.31747710E+04 0.31735869E+04 0.31735869E+04 0.31681809E+04 + 0.31681809E+04 0.31637539E+04 0.31637539E+04 0.31668220E+04 + 0.31668220E+04 0.31720181E+04 0.31720181E+04 0.31722429E+04 + 0.31722429E+04 0.31731870E+04 0.31731870E+04 0.31787051E+04 + 0.31787051E+04 0.31863491E+04 0.31603660E+04 0.31650769E+04 + 0.31650769E+04 0.31685400E+04 0.31685400E+04 0.31672620E+04 + 0.31672620E+04 0.31645791E+04 0.31645791E+04 0.31655110E+04 + 0.31655110E+04 0.31719619E+04 0.31719619E+04 0.31768379E+04 + 0.31768379E+04 0.31768540E+04 0.31768540E+04 0.31805920E+04 + 0.31805920E+04 0.31856970E+04 0.31856970E+04 0.31919771E+04 + 0.31603660E+04 0.31650769E+04 0.31650769E+04 0.31685400E+04 + 0.31685400E+04 0.31672620E+04 0.31672620E+04 0.31645791E+04 + 0.31645791E+04 0.31655110E+04 0.31655110E+04 0.31719619E+04 + 0.31719619E+04 0.31768379E+04 0.31768379E+04 0.31768540E+04 + 0.31768540E+04 0.31805920E+04 0.31805920E+04 0.31856970E+04 + 0.31856970E+04 0.31919771E+04 0.31514971E+04 0.31546541E+04 + 0.31546541E+04 0.31567661E+04 0.31567661E+04 0.31549341E+04 + 0.31549341E+04 0.31578701E+04 0.31578701E+04 0.31640930E+04 + 0.31640930E+04 0.31715979E+04 0.31715979E+04 0.31769629E+04 + 0.31769629E+04 0.31795190E+04 0.31795190E+04 0.31852610E+04 + 0.31852610E+04 0.31909771E+04 0.31909771E+04 0.31971499E+04 + 0.31514971E+04 0.31546541E+04 0.31546541E+04 0.31567661E+04 + 0.31567661E+04 0.31549341E+04 0.31549341E+04 0.31578701E+04 + 0.31578701E+04 0.31640930E+04 0.31640930E+04 0.31715979E+04 + 0.31715979E+04 0.31769629E+04 0.31769629E+04 0.31795190E+04 + 0.31795190E+04 0.31852610E+04 0.31852610E+04 0.31909771E+04 + 0.31909771E+04 0.31971499E+04 0.31473140E+04 0.31422229E+04 + 0.31422229E+04 0.31425930E+04 0.31425930E+04 0.31460959E+04 + 0.31460959E+04 0.31578030E+04 0.31578030E+04 0.31697471E+04 + 0.31697471E+04 0.31762090E+04 0.31762090E+04 0.31785969E+04 + 0.31785969E+04 0.31824751E+04 0.31824751E+04 0.31904751E+04 + 0.31904751E+04 0.31993049E+04 0.31993049E+04 0.32068000E+04 + 0.31473140E+04 0.31422229E+04 0.31422229E+04 0.31425930E+04 + 0.31425930E+04 0.31460959E+04 0.31460959E+04 0.31578030E+04 + 0.31578030E+04 0.31697471E+04 0.31697471E+04 0.31762090E+04 + 0.31762090E+04 0.31785969E+04 0.31785969E+04 0.31824751E+04 + 0.31824751E+04 0.31904751E+04 0.31904751E+04 0.31993049E+04 + 0.31993049E+04 0.32068000E+04 0.31602749E+04 0.31546169E+04 + 0.31546169E+04 0.31546399E+04 0.31546399E+04 0.31547271E+04 + 0.31547271E+04 0.31580879E+04 0.31580879E+04 0.31642029E+04 + 0.31642029E+04 0.31691221E+04 0.31691221E+04 0.31726641E+04 + 0.31726641E+04 0.31800371E+04 0.31800371E+04 0.31913989E+04 + 0.31913989E+04 0.32025681E+04 0.32025681E+04 0.32119900E+04 + 0.31602749E+04 0.31546169E+04 0.31546169E+04 0.31546399E+04 + 0.31546399E+04 0.31547271E+04 0.31547271E+04 0.31580879E+04 + 0.31580879E+04 0.31642029E+04 0.31642029E+04 0.31691221E+04 + 0.31691221E+04 0.31726641E+04 0.31726641E+04 0.31800371E+04 + 0.31800371E+04 0.31913989E+04 0.31913989E+04 0.32025681E+04 + 0.32025681E+04 0.32119900E+04 0.31737319E+04 0.31765249E+04 + 0.31765249E+04 0.31767749E+04 0.31767749E+04 0.31720769E+04 + 0.31720769E+04 0.31648069E+04 0.31648069E+04 0.31625681E+04 + 0.31625681E+04 0.31658650E+04 0.31658650E+04 0.31700850E+04 + 0.31700850E+04 0.31761650E+04 0.31761650E+04 0.31864341E+04 + 0.31864341E+04 0.31985171E+04 0.31985171E+04 0.32103940E+04 + 0.31737319E+04 0.31765249E+04 0.31765249E+04 0.31767749E+04 + 0.31767749E+04 0.31720769E+04 0.31720769E+04 0.31648069E+04 + 0.31648069E+04 0.31625681E+04 0.31625681E+04 0.31658650E+04 + 0.31658650E+04 0.31700850E+04 0.31700850E+04 0.31761650E+04 + 0.31761650E+04 0.31864341E+04 0.31864341E+04 0.31985171E+04 + 0.31985171E+04 0.32103940E+04 0.31740530E+04 0.31824690E+04 + 0.31824690E+04 0.31835510E+04 0.31835510E+04 0.31810620E+04 + 0.31810620E+04 0.31779871E+04 0.31779871E+04 0.31749709E+04 + 0.31749709E+04 0.31734871E+04 0.31734871E+04 0.31711990E+04 + 0.31711990E+04 0.31719150E+04 0.31719150E+04 0.31787771E+04 + 0.31787771E+04 0.31895959E+04 0.31895959E+04 0.32005081E+04 + 0.31740530E+04 0.31824690E+04 0.31824690E+04 0.31835510E+04 + 0.31835510E+04 0.31810620E+04 0.31810620E+04 0.31779871E+04 + 0.31779871E+04 0.31749709E+04 0.31749709E+04 0.31734871E+04 + 0.31734871E+04 0.31711990E+04 0.31711990E+04 0.31719150E+04 + 0.31719150E+04 0.31787771E+04 0.31787771E+04 0.31895959E+04 + 0.31895959E+04 0.32005081E+04 0.31730930E+04 0.31797080E+04 + 0.31797080E+04 0.31834951E+04 0.31834951E+04 0.31822070E+04 + 0.31822070E+04 0.31814561E+04 0.31814561E+04 0.31802739E+04 + 0.31802739E+04 0.31758879E+04 0.31758879E+04 0.31684370E+04 + 0.31684370E+04 0.31662881E+04 0.31662881E+04 0.31708521E+04 + 0.31708521E+04 0.31778230E+04 0.31778230E+04 0.31843730E+04 + 0.31730930E+04 0.31797080E+04 0.31797080E+04 0.31834951E+04 + 0.31834951E+04 0.31822070E+04 0.31822070E+04 0.31814561E+04 + 0.31814561E+04 0.31802739E+04 0.31802739E+04 0.31758879E+04 + 0.31758879E+04 0.31684370E+04 0.31684370E+04 0.31662881E+04 + 0.31662881E+04 0.31708521E+04 0.31708521E+04 0.31778230E+04 + 0.31778230E+04 0.31843730E+04 0.31809080E+04 0.31840520E+04 + 0.31840520E+04 0.31903821E+04 0.31903821E+04 0.31881150E+04 + 0.31881150E+04 0.31829861E+04 0.31829861E+04 0.31796250E+04 + 0.31796250E+04 0.31751650E+04 0.31751650E+04 0.31671660E+04 + 0.31671660E+04 0.31630210E+04 0.31630210E+04 0.31666790E+04 + 0.31666790E+04 0.31715701E+04 0.31715701E+04 0.31763120E+04 + 0.31809080E+04 0.31840520E+04 0.31840520E+04 0.31903821E+04 + 0.31903821E+04 0.31881150E+04 0.31881150E+04 0.31829861E+04 + 0.31829861E+04 0.31796250E+04 0.31796250E+04 0.31751650E+04 + 0.31751650E+04 0.31671660E+04 0.31671660E+04 0.31630210E+04 + 0.31630210E+04 0.31666790E+04 0.31666790E+04 0.31715701E+04 + 0.31715701E+04 0.31763120E+04 0.31890791E+04 0.31903779E+04 + 0.31903779E+04 0.31953320E+04 0.31953320E+04 0.31926809E+04 + 0.31926809E+04 0.31854431E+04 0.31854431E+04 0.31795759E+04 + 0.31795759E+04 0.31742319E+04 0.31742319E+04 0.31665759E+04 + 0.31665759E+04 0.31619270E+04 0.31619270E+04 0.31636069E+04 + 0.31636069E+04 0.31699719E+04 0.31699719E+04 0.31769741E+04 + 0.31890791E+04 0.31903779E+04 0.31903779E+04 0.31953320E+04 + 0.31953320E+04 0.31926809E+04 0.31926809E+04 0.31854431E+04 + 0.31854431E+04 0.31795759E+04 0.31795759E+04 0.31742319E+04 + 0.31742319E+04 0.31665759E+04 0.31665759E+04 0.31619270E+04 + 0.31619270E+04 0.31636069E+04 0.31636069E+04 0.31699719E+04 + 0.31699719E+04 0.31769741E+04 0.31849089E+04 0.31867610E+04 + 0.31867610E+04 0.31897090E+04 0.31897090E+04 0.31867371E+04 + 0.31867371E+04 0.31778879E+04 0.31778879E+04 0.31695400E+04 + 0.31695400E+04 0.31665640E+04 0.31665640E+04 0.31656089E+04 + 0.31656089E+04 0.31655750E+04 0.31655750E+04 0.31679431E+04 + 0.31679431E+04 0.31713750E+04 0.31713750E+04 0.31785669E+04 + 0.31849089E+04 0.31867610E+04 0.31867610E+04 0.31897090E+04 + 0.31897090E+04 0.31867371E+04 0.31867371E+04 0.31778879E+04 + 0.31778879E+04 0.31695400E+04 0.31695400E+04 0.31665640E+04 + 0.31665640E+04 0.31656089E+04 0.31656089E+04 0.31655750E+04 + 0.31655750E+04 0.31679431E+04 0.31679431E+04 0.31713750E+04 + 0.30426270E+04 0.30413391E+04 0.31784351E+04 0.31750991E+04 + 0.31750991E+04 0.31777610E+04 0.31777610E+04 0.31760049E+04 + 0.31760049E+04 0.31692729E+04 0.31692729E+04 0.31658320E+04 + 0.31658320E+04 0.31659170E+04 0.31659170E+04 0.31670271E+04 + 0.31670271E+04 0.31669331E+04 0.31669331E+04 0.31690581E+04 + 0.31690581E+04 0.31717410E+04 0.30472939E+04 0.30427690E+04 + 0.31784351E+04 0.31750991E+04 0.31750991E+04 0.31777610E+04 + 0.31777610E+04 0.31760049E+04 0.31760049E+04 0.31692729E+04 + 0.31692729E+04 0.31658320E+04 0.31658320E+04 0.31659170E+04 + 0.31659170E+04 0.31670271E+04 0.31670271E+04 0.31669331E+04 + 0.30722119E+04 0.30685420E+04 0.30685420E+04 0.30667119E+04 + 0.30472939E+04 0.30427690E+04 0.31794080E+04 0.31684861E+04 + 0.31684861E+04 0.31682810E+04 0.31682810E+04 0.31687791E+04 + 0.31687791E+04 0.31676189E+04 0.31676189E+04 0.31667959E+04 + 0.31667959E+04 0.31647070E+04 0.31647070E+04 0.31657339E+04 + 0.31657339E+04 0.31661160E+04 0.30725659E+04 0.30699099E+04 + 0.30699099E+04 0.30670730E+04 0.30464231E+04 0.30431121E+04 + 0.31794080E+04 0.31684861E+04 0.31684861E+04 0.31682810E+04 + 0.31682810E+04 0.31687791E+04 0.31687791E+04 0.31676189E+04 + 0.31676189E+04 0.31667959E+04 0.31667959E+04 0.31647070E+04 + 0.30835911E+04 0.30791021E+04 0.30791021E+04 0.30725659E+04 + 0.30725659E+04 0.30699099E+04 0.30699099E+04 0.30670730E+04 + 0.30464231E+04 0.30431121E+04 0.31813889E+04 0.31722361E+04 + 0.31722361E+04 0.31687520E+04 0.31687520E+04 0.31659761E+04 + 0.31659761E+04 0.31641050E+04 0.31641050E+04 0.31649751E+04 + 0.31649751E+04 0.31643711E+04 0.30850820E+04 0.30808701E+04 + 0.30808701E+04 0.30753921E+04 0.30753921E+04 0.30716040E+04 + 0.30716040E+04 0.30684609E+04 0.30464900E+04 0.30430969E+04 + 0.31813889E+04 0.31722361E+04 0.31722361E+04 0.31687520E+04 + 0.31687520E+04 0.31659761E+04 0.31659761E+04 0.31641050E+04 + 0.30932051E+04 0.30893831E+04 0.30893831E+04 0.30850820E+04 + 0.30850820E+04 0.30808701E+04 0.30808701E+04 0.30753921E+04 + 0.30753921E+04 0.30716040E+04 0.30716040E+04 0.30684609E+04 + 0.30464900E+04 0.30430969E+04 0.31812649E+04 0.31750830E+04 + 0.31750830E+04 0.31698701E+04 0.31698701E+04 0.31678440E+04 + 0.31678440E+04 0.31635879E+04 0.30942830E+04 0.30903330E+04 + 0.30903330E+04 0.30873320E+04 0.30873320E+04 0.30838560E+04 + 0.30838560E+04 0.30777180E+04 0.30777180E+04 0.30724089E+04 + 0.30724089E+04 0.30692480E+04 0.30464221E+04 0.30435491E+04 + 0.31812649E+04 0.31750830E+04 0.31750830E+04 0.31698701E+04 + 0.31038440E+04 0.30998650E+04 0.30998650E+04 0.30942830E+04 + 0.30942830E+04 0.30903330E+04 0.30903330E+04 0.30873320E+04 + 0.30873320E+04 0.30838560E+04 0.30838560E+04 0.30777180E+04 + 0.30777180E+04 0.30724089E+04 0.30724089E+04 0.30692480E+04 + 0.30464221E+04 0.30435491E+04 0.31806411E+04 0.31770081E+04 + 0.31770081E+04 0.31714519E+04 0.31063950E+04 0.31007891E+04 + 0.31007891E+04 0.30953091E+04 0.30953091E+04 0.30913560E+04 + 0.30913560E+04 0.30852190E+04 0.30852190E+04 0.30804690E+04 + 0.30804690E+04 0.30783899E+04 0.30783899E+04 0.30748169E+04 + 0.30748169E+04 0.30704719E+04 0.30468550E+04 0.30436050E+04 + 0.31147671E+04 0.31115320E+04 0.31115320E+04 0.31063950E+04 + 0.31063950E+04 0.31007891E+04 0.31007891E+04 0.30953091E+04 + 0.30953091E+04 0.30913560E+04 0.30913560E+04 0.30852190E+04 + 0.30852190E+04 0.30804690E+04 0.30804690E+04 0.30783899E+04 + 0.30783899E+04 0.30748169E+04 0.30748169E+04 0.30704719E+04 + 0.30704719E+04 0.30672061E+04 0.31165200E+04 0.31137549E+04 + 0.31137549E+04 0.31107119E+04 0.31107119E+04 0.31054089E+04 + 0.31054089E+04 0.30947361E+04 0.30947361E+04 0.30877571E+04 + 0.30877571E+04 0.30832539E+04 0.30832539E+04 0.30815979E+04 + 0.30815979E+04 0.30827029E+04 0.30827029E+04 0.30778921E+04 + 0.30778921E+04 0.30722671E+04 0.30722671E+04 0.30685691E+04 + 0.31731140E+04 0.31749709E+04 0.31749709E+04 0.31770349E+04 + 0.31770349E+04 0.31759609E+04 0.31759609E+04 0.31705811E+04 + 0.31705811E+04 0.31659270E+04 0.31659270E+04 0.31687180E+04 + 0.31687180E+04 0.31739431E+04 0.31739431E+04 0.31743469E+04 + 0.31743469E+04 0.31752571E+04 0.31752571E+04 0.31807290E+04 + 0.31807290E+04 0.31883250E+04 0.31627571E+04 0.31672800E+04 + 0.31672800E+04 0.31708501E+04 0.31708501E+04 0.31697141E+04 + 0.31697141E+04 0.31669690E+04 0.31669690E+04 0.31676450E+04 + 0.31676450E+04 0.31739141E+04 0.31739141E+04 0.31789570E+04 + 0.31789570E+04 0.31790310E+04 0.31790310E+04 0.31827061E+04 + 0.31827061E+04 0.31877681E+04 0.31877681E+04 0.31938711E+04 + 0.31627571E+04 0.31672800E+04 0.31672800E+04 0.31708501E+04 + 0.31708501E+04 0.31697141E+04 0.31697141E+04 0.31669690E+04 + 0.31669690E+04 0.31676450E+04 0.31676450E+04 0.31739141E+04 + 0.31739141E+04 0.31789570E+04 0.31789570E+04 0.31790310E+04 + 0.31790310E+04 0.31827061E+04 0.31827061E+04 0.31877681E+04 + 0.31877681E+04 0.31938711E+04 0.31539331E+04 0.31570830E+04 + 0.31570830E+04 0.31592520E+04 0.31592520E+04 0.31573040E+04 + 0.31573040E+04 0.31598491E+04 0.31598491E+04 0.31658030E+04 + 0.31658030E+04 0.31732581E+04 0.31732581E+04 0.31788040E+04 + 0.31788040E+04 0.31814309E+04 0.31814309E+04 0.31871599E+04 + 0.31871599E+04 0.31927639E+04 0.31927639E+04 0.31986440E+04 + 0.31539331E+04 0.31570830E+04 0.31570830E+04 0.31592520E+04 + 0.31592520E+04 0.31573040E+04 0.31573040E+04 0.31598491E+04 + 0.31598491E+04 0.31658030E+04 0.31658030E+04 0.31732581E+04 + 0.31732581E+04 0.31788040E+04 0.31788040E+04 0.31814309E+04 + 0.31814309E+04 0.31871599E+04 0.31871599E+04 0.31927639E+04 + 0.31927639E+04 0.31986440E+04 0.31491370E+04 0.31439609E+04 + 0.31439609E+04 0.31442649E+04 0.31442649E+04 0.31475391E+04 + 0.31475391E+04 0.31591331E+04 0.31591331E+04 0.31710681E+04 + 0.31710681E+04 0.31777000E+04 0.31777000E+04 0.31801870E+04 + 0.31801870E+04 0.31839929E+04 0.31839929E+04 0.31918269E+04 + 0.31918269E+04 0.32004719E+04 0.32004719E+04 0.32078049E+04 + 0.31491370E+04 0.31439609E+04 0.31439609E+04 0.31442649E+04 + 0.31442649E+04 0.31475391E+04 0.31475391E+04 0.31591331E+04 + 0.31591331E+04 0.31710681E+04 0.31710681E+04 0.31777000E+04 + 0.31777000E+04 0.31801870E+04 0.31801870E+04 0.31839929E+04 + 0.31839929E+04 0.31918269E+04 0.31918269E+04 0.32004719E+04 + 0.32004719E+04 0.32078049E+04 0.31613579E+04 0.31557170E+04 + 0.31557170E+04 0.31559080E+04 0.31559080E+04 0.31560400E+04 + 0.31560400E+04 0.31593689E+04 0.31593689E+04 0.31654360E+04 + 0.31654360E+04 0.31703149E+04 0.31703149E+04 0.31737480E+04 + 0.31737480E+04 0.31810359E+04 0.31810359E+04 0.31923601E+04 + 0.31923601E+04 0.32034880E+04 0.32034880E+04 0.32128979E+04 + 0.31613579E+04 0.31557170E+04 0.31557170E+04 0.31559080E+04 + 0.31559080E+04 0.31560400E+04 0.31560400E+04 0.31593689E+04 + 0.31593689E+04 0.31654360E+04 0.31654360E+04 0.31703149E+04 + 0.31703149E+04 0.31737480E+04 0.31737480E+04 0.31810359E+04 + 0.31810359E+04 0.31923601E+04 0.31923601E+04 0.32034880E+04 + 0.32034880E+04 0.32128979E+04 0.31748740E+04 0.31775400E+04 + 0.31775400E+04 0.31778430E+04 0.31778430E+04 0.31732190E+04 + 0.31732190E+04 0.31658989E+04 0.31658989E+04 0.31635110E+04 + 0.31635110E+04 0.31667539E+04 0.31667539E+04 0.31710540E+04 + 0.31710540E+04 0.31770200E+04 0.31770200E+04 0.31872351E+04 + 0.31872351E+04 0.31993459E+04 0.31993459E+04 0.32112520E+04 + 0.31748740E+04 0.31775400E+04 0.31775400E+04 0.31778430E+04 + 0.31778430E+04 0.31732190E+04 0.31732190E+04 0.31658989E+04 + 0.31658989E+04 0.31635110E+04 0.31635110E+04 0.31667539E+04 + 0.31667539E+04 0.31710540E+04 0.31710540E+04 0.31770200E+04 + 0.31770200E+04 0.31872351E+04 0.31872351E+04 0.31993459E+04 + 0.31993459E+04 0.32112520E+04 0.31749719E+04 0.31833870E+04 + 0.31833870E+04 0.31846770E+04 0.31846770E+04 0.31822151E+04 + 0.31822151E+04 0.31790471E+04 0.31790471E+04 0.31758940E+04 + 0.31758940E+04 0.31744150E+04 0.31744150E+04 0.31721240E+04 + 0.31721240E+04 0.31726609E+04 0.31726609E+04 0.31795271E+04 + 0.31795271E+04 0.31905100E+04 0.31905100E+04 0.32015950E+04 + 0.31749719E+04 0.31833870E+04 0.31833870E+04 0.31846770E+04 + 0.31846770E+04 0.31822151E+04 0.31822151E+04 0.31790471E+04 + 0.31790471E+04 0.31758940E+04 0.31758940E+04 0.31744150E+04 + 0.31744150E+04 0.31721240E+04 0.31721240E+04 0.31726609E+04 + 0.31726609E+04 0.31795271E+04 0.31795271E+04 0.31905100E+04 + 0.31905100E+04 0.32015950E+04 0.31739341E+04 0.31806160E+04 + 0.31806160E+04 0.31845161E+04 0.31845161E+04 0.31832590E+04 + 0.31832590E+04 0.31824490E+04 0.31824490E+04 0.31812581E+04 + 0.31812581E+04 0.31769790E+04 0.31769790E+04 0.31694331E+04 + 0.31694331E+04 0.31671211E+04 0.31671211E+04 0.31716160E+04 + 0.31716160E+04 0.31786880E+04 0.31786880E+04 0.31854360E+04 + 0.31739341E+04 0.31806160E+04 0.31806160E+04 0.31845161E+04 + 0.31845161E+04 0.31832590E+04 0.31832590E+04 0.31824490E+04 + 0.31824490E+04 0.31812581E+04 0.31812581E+04 0.31769790E+04 + 0.31769790E+04 0.31694331E+04 0.31694331E+04 0.31671211E+04 + 0.31671211E+04 0.31716160E+04 0.31716160E+04 0.31786880E+04 + 0.31786880E+04 0.31854360E+04 0.31818191E+04 0.31848669E+04 + 0.31848669E+04 0.31912810E+04 0.31912810E+04 0.31891660E+04 + 0.31891660E+04 0.31839890E+04 0.31839890E+04 0.31806040E+04 + 0.31806040E+04 0.31762339E+04 0.31762339E+04 0.31682019E+04 + 0.31682019E+04 0.31638560E+04 0.31638560E+04 0.31674709E+04 + 0.31674709E+04 0.31723469E+04 0.31723469E+04 0.31770750E+04 + 0.31818191E+04 0.31848669E+04 0.31848669E+04 0.31912810E+04 + 0.31912810E+04 0.31891660E+04 0.31891660E+04 0.31839890E+04 + 0.31839890E+04 0.31806040E+04 0.31806040E+04 0.31762339E+04 + 0.31762339E+04 0.31682019E+04 0.31682019E+04 0.31638560E+04 + 0.31638560E+04 0.31674709E+04 0.31674709E+04 0.31723469E+04 + 0.31723469E+04 0.31770750E+04 0.31902310E+04 0.31913240E+04 + 0.31913240E+04 0.31962781E+04 0.31962781E+04 0.31938010E+04 + 0.31938010E+04 0.31865791E+04 0.31865791E+04 0.31806240E+04 + 0.31806240E+04 0.31753000E+04 0.31753000E+04 0.31675840E+04 + 0.31675840E+04 0.31626609E+04 0.31626609E+04 0.31644099E+04 + 0.31644099E+04 0.31705320E+04 0.31705320E+04 0.31773630E+04 + 0.31902310E+04 0.31913240E+04 0.31913240E+04 0.31962781E+04 + 0.31962781E+04 0.31938010E+04 0.31938010E+04 0.31865791E+04 + 0.31865791E+04 0.31806240E+04 0.31806240E+04 0.31753000E+04 + 0.31753000E+04 0.31675840E+04 0.31675840E+04 0.31626609E+04 + 0.31626609E+04 0.31644099E+04 0.31644099E+04 0.31705320E+04 + 0.31705320E+04 0.31773630E+04 0.31861130E+04 0.31878140E+04 + 0.31878140E+04 0.31907500E+04 0.31907500E+04 0.31879470E+04 + 0.31879470E+04 0.31791799E+04 0.31791799E+04 0.31709041E+04 + 0.31709041E+04 0.31677480E+04 0.31677480E+04 0.31664060E+04 + 0.31664060E+04 0.31660190E+04 0.31660190E+04 0.31681980E+04 + 0.31681980E+04 0.31718491E+04 0.31718491E+04 0.31790449E+04 + 0.31861130E+04 0.31878140E+04 0.31878140E+04 0.31907500E+04 + 0.31907500E+04 0.31879470E+04 0.31879470E+04 0.31791799E+04 + 0.31791799E+04 0.31709041E+04 0.31709041E+04 0.31677480E+04 + 0.31677480E+04 0.31664060E+04 0.31664060E+04 0.31660190E+04 + 0.31660190E+04 0.31681980E+04 0.31681980E+04 0.31718491E+04 + 0.30432170E+04 0.30420530E+04 0.31796870E+04 0.31761289E+04 + 0.31761289E+04 0.31787771E+04 0.31787771E+04 0.31772029E+04 + 0.31772029E+04 0.31706289E+04 0.31706289E+04 0.31669919E+04 + 0.31669919E+04 0.31667241E+04 0.31667241E+04 0.31674490E+04 + 0.31674490E+04 0.31673850E+04 0.31673850E+04 0.31693889E+04 + 0.31693889E+04 0.31720300E+04 0.30479009E+04 0.30434680E+04 + 0.31796870E+04 0.31761289E+04 0.31761289E+04 0.31787771E+04 + 0.31787771E+04 0.31772029E+04 0.31772029E+04 0.31706289E+04 + 0.31706289E+04 0.31669919E+04 0.31669919E+04 0.31667241E+04 + 0.31667241E+04 0.31674490E+04 0.31674490E+04 0.31673850E+04 + 0.30735000E+04 0.30698689E+04 0.30698689E+04 0.30680820E+04 + 0.30479009E+04 0.30434680E+04 0.31808789E+04 0.31696470E+04 + 0.31696470E+04 0.31692690E+04 0.31692690E+04 0.31695911E+04 + 0.31695911E+04 0.31682390E+04 0.31682390E+04 0.31671631E+04 + 0.31671631E+04 0.31652690E+04 0.31652690E+04 0.31662471E+04 + 0.31662471E+04 0.31665759E+04 0.30737129E+04 0.30712200E+04 + 0.30712200E+04 0.30684810E+04 0.30470759E+04 0.30438149E+04 + 0.31808789E+04 0.31696470E+04 0.31696470E+04 0.31692690E+04 + 0.31692690E+04 0.31695911E+04 0.31695911E+04 0.31682390E+04 + 0.31682390E+04 0.31671631E+04 0.31671631E+04 0.31652690E+04 + 0.30848130E+04 0.30803589E+04 0.30803589E+04 0.30737129E+04 + 0.30737129E+04 0.30712200E+04 0.30712200E+04 0.30684810E+04 + 0.30470759E+04 0.30438149E+04 0.31825491E+04 0.31729729E+04 + 0.31729729E+04 0.31692019E+04 0.31692019E+04 0.31665720E+04 + 0.31665720E+04 0.31646819E+04 0.31646819E+04 0.31653899E+04 + 0.31653899E+04 0.31647351E+04 0.30862910E+04 0.30821680E+04 + 0.30821680E+04 0.30767671E+04 0.30767671E+04 0.30729861E+04 + 0.30729861E+04 0.30698889E+04 0.30471750E+04 0.30438450E+04 + 0.31825491E+04 0.31729729E+04 0.31729729E+04 0.31692019E+04 + 0.31692019E+04 0.31665720E+04 0.31665720E+04 0.31646819E+04 + 0.30942810E+04 0.30905000E+04 0.30905000E+04 0.30862910E+04 + 0.30862910E+04 0.30821680E+04 0.30821680E+04 0.30767671E+04 + 0.30767671E+04 0.30729861E+04 0.30729861E+04 0.30698889E+04 + 0.30471750E+04 0.30438450E+04 0.31822261E+04 0.31758589E+04 + 0.31758589E+04 0.31704800E+04 0.31704800E+04 0.31684170E+04 + 0.31684170E+04 0.31642251E+04 0.30953999E+04 0.30915071E+04 + 0.30915071E+04 0.30885701E+04 0.30885701E+04 0.30851760E+04 + 0.30851760E+04 0.30790759E+04 0.30790759E+04 0.30738301E+04 + 0.30738301E+04 0.30706880E+04 0.30471270E+04 0.30443030E+04 + 0.31822261E+04 0.31758589E+04 0.31758589E+04 0.31704800E+04 + 0.31048740E+04 0.31009209E+04 0.31009209E+04 0.30953999E+04 + 0.30953999E+04 0.30915071E+04 0.30915071E+04 0.30885701E+04 + 0.30885701E+04 0.30851760E+04 0.30851760E+04 0.30790759E+04 + 0.30790759E+04 0.30738301E+04 0.30738301E+04 0.30706880E+04 + 0.30471270E+04 0.30443030E+04 0.31816721E+04 0.31777930E+04 + 0.31777930E+04 0.31721909E+04 0.31074141E+04 0.31019231E+04 + 0.31019231E+04 0.30965190E+04 0.30965190E+04 0.30925710E+04 + 0.30925710E+04 0.30864971E+04 0.30864971E+04 0.30818359E+04 + 0.30818359E+04 0.30797219E+04 0.30797219E+04 0.30761931E+04 + 0.30761931E+04 0.30718921E+04 0.30475820E+04 0.30444241E+04 + 0.31156790E+04 0.31124641E+04 0.31124641E+04 0.31074141E+04 + 0.31074141E+04 0.31019231E+04 0.31019231E+04 0.30965190E+04 + 0.30965190E+04 0.30925710E+04 0.30925710E+04 0.30864971E+04 + 0.30864971E+04 0.30818359E+04 0.30818359E+04 0.30797219E+04 + 0.30797219E+04 0.30761931E+04 0.30761931E+04 0.30718921E+04 + 0.30718921E+04 0.30686841E+04 0.31174351E+04 0.31146980E+04 + 0.31146980E+04 0.31117390E+04 0.31117390E+04 0.31065669E+04 + 0.31065669E+04 0.30959380E+04 0.30959380E+04 0.30889290E+04 + 0.30889290E+04 0.30844260E+04 0.30844260E+04 0.30828621E+04 + 0.30828621E+04 0.30839741E+04 0.30839741E+04 0.30792820E+04 + 0.30792820E+04 0.30736689E+04 0.30736689E+04 0.30699900E+04 + 0.31731140E+04 0.31749709E+04 0.31749709E+04 0.31770349E+04 + 0.31770349E+04 0.31759609E+04 0.31759609E+04 0.31705811E+04 + 0.31705811E+04 0.31659270E+04 0.31659270E+04 0.31687180E+04 + 0.31687180E+04 0.31739431E+04 0.31739431E+04 0.31743469E+04 + 0.31743469E+04 0.31752571E+04 0.31752571E+04 0.31807290E+04 + 0.31807290E+04 0.31883250E+04 0.31627571E+04 0.31672800E+04 + 0.31672800E+04 0.31708501E+04 0.31708501E+04 0.31697141E+04 + 0.31697141E+04 0.31669690E+04 0.31669690E+04 0.31676450E+04 + 0.31676450E+04 0.31739141E+04 0.31739141E+04 0.31789570E+04 + 0.31789570E+04 0.31790310E+04 0.31790310E+04 0.31827061E+04 + 0.31827061E+04 0.31877681E+04 0.31877681E+04 0.31938711E+04 + 0.31627571E+04 0.31672800E+04 0.31672800E+04 0.31708501E+04 + 0.31708501E+04 0.31697141E+04 0.31697141E+04 0.31669690E+04 + 0.31669690E+04 0.31676450E+04 0.31676450E+04 0.31739141E+04 + 0.31739141E+04 0.31789570E+04 0.31789570E+04 0.31790310E+04 + 0.31790310E+04 0.31827061E+04 0.31827061E+04 0.31877681E+04 + 0.31877681E+04 0.31938711E+04 0.31539331E+04 0.31570830E+04 + 0.31570830E+04 0.31592520E+04 0.31592520E+04 0.31573040E+04 + 0.31573040E+04 0.31598491E+04 0.31598491E+04 0.31658030E+04 + 0.31658030E+04 0.31732581E+04 0.31732581E+04 0.31788040E+04 + 0.31788040E+04 0.31814309E+04 0.31814309E+04 0.31871599E+04 + 0.31871599E+04 0.31927639E+04 0.31927639E+04 0.31986440E+04 + 0.31539331E+04 0.31570830E+04 0.31570830E+04 0.31592520E+04 + 0.31592520E+04 0.31573040E+04 0.31573040E+04 0.31598491E+04 + 0.31598491E+04 0.31658030E+04 0.31658030E+04 0.31732581E+04 + 0.31732581E+04 0.31788040E+04 0.31788040E+04 0.31814309E+04 + 0.31814309E+04 0.31871599E+04 0.31871599E+04 0.31927639E+04 + 0.31927639E+04 0.31986440E+04 0.31491370E+04 0.31439609E+04 + 0.31439609E+04 0.31442649E+04 0.31442649E+04 0.31475391E+04 + 0.31475391E+04 0.31591331E+04 0.31591331E+04 0.31710681E+04 + 0.31710681E+04 0.31777000E+04 0.31777000E+04 0.31801870E+04 + 0.31801870E+04 0.31839929E+04 0.31839929E+04 0.31918269E+04 + 0.31918269E+04 0.32004719E+04 0.32004719E+04 0.32078049E+04 + 0.31491370E+04 0.31439609E+04 0.31439609E+04 0.31442649E+04 + 0.31442649E+04 0.31475391E+04 0.31475391E+04 0.31591331E+04 + 0.31591331E+04 0.31710681E+04 0.31710681E+04 0.31777000E+04 + 0.31777000E+04 0.31801870E+04 0.31801870E+04 0.31839929E+04 + 0.31839929E+04 0.31918269E+04 0.31918269E+04 0.32004719E+04 + 0.32004719E+04 0.32078049E+04 0.31613579E+04 0.31557170E+04 + 0.31557170E+04 0.31559080E+04 0.31559080E+04 0.31560400E+04 + 0.31560400E+04 0.31593689E+04 0.31593689E+04 0.31654360E+04 + 0.31654360E+04 0.31703149E+04 0.31703149E+04 0.31737480E+04 + 0.31737480E+04 0.31810359E+04 0.31810359E+04 0.31923601E+04 + 0.31923601E+04 0.32034880E+04 0.32034880E+04 0.32128979E+04 + 0.31613579E+04 0.31557170E+04 0.31557170E+04 0.31559080E+04 + 0.31559080E+04 0.31560400E+04 0.31560400E+04 0.31593689E+04 + 0.31593689E+04 0.31654360E+04 0.31654360E+04 0.31703149E+04 + 0.31703149E+04 0.31737480E+04 0.31737480E+04 0.31810359E+04 + 0.31810359E+04 0.31923601E+04 0.31923601E+04 0.32034880E+04 + 0.32034880E+04 0.32128979E+04 0.31748740E+04 0.31775400E+04 + 0.31775400E+04 0.31778430E+04 0.31778430E+04 0.31732190E+04 + 0.31732190E+04 0.31658989E+04 0.31658989E+04 0.31635110E+04 + 0.31635110E+04 0.31667539E+04 0.31667539E+04 0.31710540E+04 + 0.31710540E+04 0.31770200E+04 0.31770200E+04 0.31872351E+04 + 0.31872351E+04 0.31993459E+04 0.31993459E+04 0.32112520E+04 + 0.31748740E+04 0.31775400E+04 0.31775400E+04 0.31778430E+04 + 0.31778430E+04 0.31732190E+04 0.31732190E+04 0.31658989E+04 + 0.31658989E+04 0.31635110E+04 0.31635110E+04 0.31667539E+04 + 0.31667539E+04 0.31710540E+04 0.31710540E+04 0.31770200E+04 + 0.31770200E+04 0.31872351E+04 0.31872351E+04 0.31993459E+04 + 0.31993459E+04 0.32112520E+04 0.31749719E+04 0.31833870E+04 + 0.31833870E+04 0.31846770E+04 0.31846770E+04 0.31822151E+04 + 0.31822151E+04 0.31790471E+04 0.31790471E+04 0.31758940E+04 + 0.31758940E+04 0.31744150E+04 0.31744150E+04 0.31721240E+04 + 0.31721240E+04 0.31726609E+04 0.31726609E+04 0.31795271E+04 + 0.31795271E+04 0.31905100E+04 0.31905100E+04 0.32015950E+04 + 0.31749719E+04 0.31833870E+04 0.31833870E+04 0.31846770E+04 + 0.31846770E+04 0.31822151E+04 0.31822151E+04 0.31790471E+04 + 0.31790471E+04 0.31758940E+04 0.31758940E+04 0.31744150E+04 + 0.31744150E+04 0.31721240E+04 0.31721240E+04 0.31726609E+04 + 0.31726609E+04 0.31795271E+04 0.31795271E+04 0.31905100E+04 + 0.31905100E+04 0.32015950E+04 0.31739341E+04 0.31806160E+04 + 0.31806160E+04 0.31845161E+04 0.31845161E+04 0.31832590E+04 + 0.31832590E+04 0.31824490E+04 0.31824490E+04 0.31812581E+04 + 0.31812581E+04 0.31769790E+04 0.31769790E+04 0.31694331E+04 + 0.31694331E+04 0.31671211E+04 0.31671211E+04 0.31716160E+04 + 0.31716160E+04 0.31786880E+04 0.31786880E+04 0.31854360E+04 + 0.31739341E+04 0.31806160E+04 0.31806160E+04 0.31845161E+04 + 0.31845161E+04 0.31832590E+04 0.31832590E+04 0.31824490E+04 + 0.31824490E+04 0.31812581E+04 0.31812581E+04 0.31769790E+04 + 0.31769790E+04 0.31694331E+04 0.31694331E+04 0.31671211E+04 + 0.31671211E+04 0.31716160E+04 0.31716160E+04 0.31786880E+04 + 0.31786880E+04 0.31854360E+04 0.31818191E+04 0.31848669E+04 + 0.31848669E+04 0.31912810E+04 0.31912810E+04 0.31891660E+04 + 0.31891660E+04 0.31839890E+04 0.31839890E+04 0.31806040E+04 + 0.31806040E+04 0.31762339E+04 0.31762339E+04 0.31682019E+04 + 0.31682019E+04 0.31638560E+04 0.31638560E+04 0.31674709E+04 + 0.31674709E+04 0.31723469E+04 0.31723469E+04 0.31770750E+04 + 0.31818191E+04 0.31848669E+04 0.31848669E+04 0.31912810E+04 + 0.31912810E+04 0.31891660E+04 0.31891660E+04 0.31839890E+04 + 0.31839890E+04 0.31806040E+04 0.31806040E+04 0.31762339E+04 + 0.31762339E+04 0.31682019E+04 0.31682019E+04 0.31638560E+04 + 0.31638560E+04 0.31674709E+04 0.31674709E+04 0.31723469E+04 + 0.31723469E+04 0.31770750E+04 0.31902310E+04 0.31913240E+04 + 0.31913240E+04 0.31962781E+04 0.31962781E+04 0.31938010E+04 + 0.31938010E+04 0.31865791E+04 0.31865791E+04 0.31806240E+04 + 0.31806240E+04 0.31753000E+04 0.31753000E+04 0.31675840E+04 + 0.31675840E+04 0.31626609E+04 0.31626609E+04 0.31644099E+04 + 0.31644099E+04 0.31705320E+04 0.31705320E+04 0.31773630E+04 + 0.31902310E+04 0.31913240E+04 0.31913240E+04 0.31962781E+04 + 0.31962781E+04 0.31938010E+04 0.31938010E+04 0.31865791E+04 + 0.31865791E+04 0.31806240E+04 0.31806240E+04 0.31753000E+04 + 0.31753000E+04 0.31675840E+04 0.31675840E+04 0.31626609E+04 + 0.31626609E+04 0.31644099E+04 0.31644099E+04 0.31705320E+04 + 0.31705320E+04 0.31773630E+04 0.31861130E+04 0.31878140E+04 + 0.31878140E+04 0.31907500E+04 0.31907500E+04 0.31879470E+04 + 0.31879470E+04 0.31791799E+04 0.31791799E+04 0.31709041E+04 + 0.31709041E+04 0.31677480E+04 0.31677480E+04 0.31664060E+04 + 0.31664060E+04 0.31660190E+04 0.31660190E+04 0.31681980E+04 + 0.31681980E+04 0.31718491E+04 0.31718491E+04 0.31790449E+04 + 0.31861130E+04 0.31878140E+04 0.31878140E+04 0.31907500E+04 + 0.31907500E+04 0.31879470E+04 0.31879470E+04 0.31791799E+04 + 0.31791799E+04 0.31709041E+04 0.31709041E+04 0.31677480E+04 + 0.31677480E+04 0.31664060E+04 0.31664060E+04 0.31660190E+04 + 0.31660190E+04 0.31681980E+04 0.31681980E+04 0.31718491E+04 + 0.30432170E+04 0.30420530E+04 0.31796870E+04 0.31761289E+04 + 0.31761289E+04 0.31787771E+04 0.31787771E+04 0.31772029E+04 + 0.31772029E+04 0.31706289E+04 0.31706289E+04 0.31669919E+04 + 0.31669919E+04 0.31667241E+04 0.31667241E+04 0.31674490E+04 + 0.31674490E+04 0.31673850E+04 0.31673850E+04 0.31693889E+04 + 0.31693889E+04 0.31720300E+04 0.30479009E+04 0.30434680E+04 + 0.31796870E+04 0.31761289E+04 0.31761289E+04 0.31787771E+04 + 0.31787771E+04 0.31772029E+04 0.31772029E+04 0.31706289E+04 + 0.31706289E+04 0.31669919E+04 0.31669919E+04 0.31667241E+04 + 0.31667241E+04 0.31674490E+04 0.31674490E+04 0.31673850E+04 + 0.30735000E+04 0.30698689E+04 0.30698689E+04 0.30680820E+04 + 0.30479009E+04 0.30434680E+04 0.31808789E+04 0.31696470E+04 + 0.31696470E+04 0.31692690E+04 0.31692690E+04 0.31695911E+04 + 0.31695911E+04 0.31682390E+04 0.31682390E+04 0.31671631E+04 + 0.31671631E+04 0.31652690E+04 0.31652690E+04 0.31662471E+04 + 0.31662471E+04 0.31665759E+04 0.30737129E+04 0.30712200E+04 + 0.30712200E+04 0.30684810E+04 0.30470759E+04 0.30438149E+04 + 0.31808789E+04 0.31696470E+04 0.31696470E+04 0.31692690E+04 + 0.31692690E+04 0.31695911E+04 0.31695911E+04 0.31682390E+04 + 0.31682390E+04 0.31671631E+04 0.31671631E+04 0.31652690E+04 + 0.30848130E+04 0.30803589E+04 0.30803589E+04 0.30737129E+04 + 0.30737129E+04 0.30712200E+04 0.30712200E+04 0.30684810E+04 + 0.30470759E+04 0.30438149E+04 0.31825491E+04 0.31729729E+04 + 0.31729729E+04 0.31692019E+04 0.31692019E+04 0.31665720E+04 + 0.31665720E+04 0.31646819E+04 0.31646819E+04 0.31653899E+04 + 0.31653899E+04 0.31647351E+04 0.30862910E+04 0.30821680E+04 + 0.30821680E+04 0.30767671E+04 0.30767671E+04 0.30729861E+04 + 0.30729861E+04 0.30698889E+04 0.30471750E+04 0.30438450E+04 + 0.31825491E+04 0.31729729E+04 0.31729729E+04 0.31692019E+04 + 0.31692019E+04 0.31665720E+04 0.31665720E+04 0.31646819E+04 + 0.30942810E+04 0.30905000E+04 0.30905000E+04 0.30862910E+04 + 0.30862910E+04 0.30821680E+04 0.30821680E+04 0.30767671E+04 + 0.30767671E+04 0.30729861E+04 0.30729861E+04 0.30698889E+04 + 0.30471750E+04 0.30438450E+04 0.31822261E+04 0.31758589E+04 + 0.31758589E+04 0.31704800E+04 0.31704800E+04 0.31684170E+04 + 0.31684170E+04 0.31642251E+04 0.30953999E+04 0.30915071E+04 + 0.30915071E+04 0.30885701E+04 0.30885701E+04 0.30851760E+04 + 0.30851760E+04 0.30790759E+04 0.30790759E+04 0.30738301E+04 + 0.30738301E+04 0.30706880E+04 0.30471270E+04 0.30443030E+04 + 0.31822261E+04 0.31758589E+04 0.31758589E+04 0.31704800E+04 + 0.31048740E+04 0.31009209E+04 0.31009209E+04 0.30953999E+04 + 0.30953999E+04 0.30915071E+04 0.30915071E+04 0.30885701E+04 + 0.30885701E+04 0.30851760E+04 0.30851760E+04 0.30790759E+04 + 0.30790759E+04 0.30738301E+04 0.30738301E+04 0.30706880E+04 + 0.30471270E+04 0.30443030E+04 0.31816721E+04 0.31777930E+04 + 0.31777930E+04 0.31721909E+04 0.31074141E+04 0.31019231E+04 + 0.31019231E+04 0.30965190E+04 0.30965190E+04 0.30925710E+04 + 0.30925710E+04 0.30864971E+04 0.30864971E+04 0.30818359E+04 + 0.30818359E+04 0.30797219E+04 0.30797219E+04 0.30761931E+04 + 0.30761931E+04 0.30718921E+04 0.30475820E+04 0.30444241E+04 + 0.31156790E+04 0.31124641E+04 0.31124641E+04 0.31074141E+04 + 0.31074141E+04 0.31019231E+04 0.31019231E+04 0.30965190E+04 + 0.30965190E+04 0.30925710E+04 0.30925710E+04 0.30864971E+04 + 0.30864971E+04 0.30818359E+04 0.30818359E+04 0.30797219E+04 + 0.30797219E+04 0.30761931E+04 0.30761931E+04 0.30718921E+04 + 0.30718921E+04 0.30686841E+04 0.31174351E+04 0.31146980E+04 + 0.31146980E+04 0.31117390E+04 0.31117390E+04 0.31065669E+04 + 0.31065669E+04 0.30959380E+04 0.30959380E+04 0.30889290E+04 + 0.30889290E+04 0.30844260E+04 0.30844260E+04 0.30828621E+04 + 0.30828621E+04 0.30839741E+04 0.30839741E+04 0.30792820E+04 + 0.30792820E+04 0.30736689E+04 0.30736689E+04 0.30699900E+04 + 0.31754971E+04 0.31771680E+04 0.31771680E+04 0.31793000E+04 + 0.31793000E+04 0.31783350E+04 0.31783350E+04 0.31729800E+04 + 0.31729800E+04 0.31680991E+04 0.31680991E+04 0.31706140E+04 + 0.31706140E+04 0.31758679E+04 0.31758679E+04 0.31764500E+04 + 0.31764500E+04 0.31773269E+04 0.31773269E+04 0.31827520E+04 + 0.31827520E+04 0.31903010E+04 0.31651470E+04 0.31694839E+04 + 0.31694839E+04 0.31731599E+04 0.31731599E+04 0.31721650E+04 + 0.31721650E+04 0.31693589E+04 0.31693589E+04 0.31697791E+04 + 0.31697791E+04 0.31758669E+04 0.31758669E+04 0.31810759E+04 + 0.31810759E+04 0.31812080E+04 0.31812080E+04 0.31848201E+04 + 0.31848201E+04 0.31898401E+04 0.31898401E+04 0.31957649E+04 + 0.31651470E+04 0.31694839E+04 0.31694839E+04 0.31731599E+04 + 0.31731599E+04 0.31721650E+04 0.31721650E+04 0.31693589E+04 + 0.31693589E+04 0.31697791E+04 0.31697791E+04 0.31758669E+04 + 0.31758669E+04 0.31810759E+04 0.31810759E+04 0.31812080E+04 + 0.31812080E+04 0.31848201E+04 0.31848201E+04 0.31898401E+04 + 0.31898401E+04 0.31957649E+04 0.31563679E+04 0.31595110E+04 + 0.31595110E+04 0.31617380E+04 0.31617380E+04 0.31596741E+04 + 0.31596741E+04 0.31618279E+04 0.31618279E+04 0.31675129E+04 + 0.31675129E+04 0.31749170E+04 0.31749170E+04 0.31806460E+04 + 0.31806460E+04 0.31833420E+04 0.31833420E+04 0.31890591E+04 + 0.31890591E+04 0.31945520E+04 0.31945520E+04 0.32001379E+04 + 0.31563679E+04 0.31595110E+04 0.31595110E+04 0.31617380E+04 + 0.31617380E+04 0.31596741E+04 0.31596741E+04 0.31618279E+04 + 0.31618279E+04 0.31675129E+04 0.31675129E+04 0.31749170E+04 + 0.31749170E+04 0.31806460E+04 0.31806460E+04 0.31833420E+04 + 0.31833420E+04 0.31890591E+04 0.31890591E+04 0.31945520E+04 + 0.31945520E+04 0.32001379E+04 0.31509600E+04 0.31456990E+04 + 0.31456990E+04 0.31459370E+04 0.31459370E+04 0.31489819E+04 + 0.31489819E+04 0.31604619E+04 0.31604619E+04 0.31723879E+04 + 0.31723879E+04 0.31791909E+04 0.31791909E+04 0.31817759E+04 + 0.31817759E+04 0.31855100E+04 0.31855100E+04 0.31931780E+04 + 0.31931780E+04 0.32016389E+04 0.32016389E+04 0.32088110E+04 + 0.31509600E+04 0.31456990E+04 0.31456990E+04 0.31459370E+04 + 0.31459370E+04 0.31489819E+04 0.31489819E+04 0.31604619E+04 + 0.31604619E+04 0.31723879E+04 0.31723879E+04 0.31791909E+04 + 0.31791909E+04 0.31817759E+04 0.31817759E+04 0.31855100E+04 + 0.31855100E+04 0.31931780E+04 0.31931780E+04 0.32016389E+04 + 0.32016389E+04 0.32088110E+04 0.31624399E+04 0.31568169E+04 + 0.31568169E+04 0.31571750E+04 0.31571750E+04 0.31573530E+04 + 0.31573530E+04 0.31606489E+04 0.31606489E+04 0.31666680E+04 + 0.31666680E+04 0.31715090E+04 0.31715090E+04 0.31748330E+04 + 0.31748330E+04 0.31820339E+04 0.31820339E+04 0.31933210E+04 + 0.31933210E+04 0.32044070E+04 0.32044070E+04 0.32138059E+04 + 0.31624399E+04 0.31568169E+04 0.31568169E+04 0.31571750E+04 + 0.31571750E+04 0.31573530E+04 0.31573530E+04 0.31606489E+04 + 0.31606489E+04 0.31666680E+04 0.31666680E+04 0.31715090E+04 + 0.31715090E+04 0.31748330E+04 0.31748330E+04 0.31820339E+04 + 0.31820339E+04 0.31933210E+04 0.31933210E+04 0.32044070E+04 + 0.32044070E+04 0.32138059E+04 0.31760161E+04 0.31785549E+04 + 0.31785549E+04 0.31789109E+04 0.31789109E+04 0.31743611E+04 + 0.31743611E+04 0.31669919E+04 0.31669919E+04 0.31644551E+04 + 0.31644551E+04 0.31676431E+04 0.31676431E+04 0.31720229E+04 + 0.31720229E+04 0.31778750E+04 0.31778750E+04 0.31880371E+04 + 0.31880371E+04 0.32001760E+04 0.32001760E+04 0.32121101E+04 + 0.31760161E+04 0.31785549E+04 0.31785549E+04 0.31789109E+04 + 0.31789109E+04 0.31743611E+04 0.31743611E+04 0.31669919E+04 + 0.31669919E+04 0.31644551E+04 0.31644551E+04 0.31676431E+04 + 0.31676431E+04 0.31720229E+04 0.31720229E+04 0.31778750E+04 + 0.31778750E+04 0.31880371E+04 0.31880371E+04 0.32001760E+04 + 0.32001760E+04 0.32121101E+04 0.31758911E+04 0.31843049E+04 + 0.31843049E+04 0.31858020E+04 0.31858020E+04 0.31833669E+04 + 0.31833669E+04 0.31801069E+04 0.31801069E+04 0.31768159E+04 + 0.31768159E+04 0.31753420E+04 0.31753420E+04 0.31730481E+04 + 0.31730481E+04 0.31734080E+04 0.31734080E+04 0.31802781E+04 + 0.31802781E+04 0.31914241E+04 0.31914241E+04 0.32026819E+04 + 0.31758911E+04 0.31843049E+04 0.31843049E+04 0.31858020E+04 + 0.31858020E+04 0.31833669E+04 0.31833669E+04 0.31801069E+04 + 0.31801069E+04 0.31768159E+04 0.31768159E+04 0.31753420E+04 + 0.31753420E+04 0.31730481E+04 0.31730481E+04 0.31734080E+04 + 0.31734080E+04 0.31802781E+04 0.31802781E+04 0.31914241E+04 + 0.31914241E+04 0.32026819E+04 0.31747739E+04 0.31815249E+04 + 0.31815249E+04 0.31855371E+04 0.31855371E+04 0.31843110E+04 + 0.31843110E+04 0.31834431E+04 0.31834431E+04 0.31822410E+04 + 0.31822410E+04 0.31780691E+04 0.31780691E+04 0.31704290E+04 + 0.31704290E+04 0.31679541E+04 0.31679541E+04 0.31723789E+04 + 0.31723789E+04 0.31795530E+04 0.31795530E+04 0.31864980E+04 + 0.31747739E+04 0.31815249E+04 0.31815249E+04 0.31855371E+04 + 0.31855371E+04 0.31843110E+04 0.31843110E+04 0.31834431E+04 + 0.31834431E+04 0.31822410E+04 0.31822410E+04 0.31780691E+04 + 0.31780691E+04 0.31704290E+04 0.31704290E+04 0.31679541E+04 + 0.31679541E+04 0.31723789E+04 0.31723789E+04 0.31795530E+04 + 0.31795530E+04 0.31864980E+04 0.31827290E+04 0.31856819E+04 + 0.31856819E+04 0.31921790E+04 0.31921790E+04 0.31902161E+04 + 0.31902161E+04 0.31849919E+04 0.31849919E+04 0.31815811E+04 + 0.31815811E+04 0.31773030E+04 0.31773030E+04 0.31692380E+04 + 0.31692380E+04 0.31646899E+04 0.31646899E+04 0.31682629E+04 + 0.31682629E+04 0.31731250E+04 0.31731250E+04 0.31778379E+04 + 0.31827290E+04 0.31856819E+04 0.31856819E+04 0.31921790E+04 + 0.31921790E+04 0.31902161E+04 0.31902161E+04 0.31849919E+04 + 0.31849919E+04 0.31815811E+04 0.31815811E+04 0.31773030E+04 + 0.31773030E+04 0.31692380E+04 0.31692380E+04 0.31646899E+04 + 0.31646899E+04 0.31682629E+04 0.31682629E+04 0.31731250E+04 + 0.31731250E+04 0.31778379E+04 0.31913831E+04 0.31922710E+04 + 0.31922710E+04 0.31972229E+04 0.31972229E+04 0.31949209E+04 + 0.31949209E+04 0.31877151E+04 0.31877151E+04 0.31816731E+04 + 0.31816731E+04 0.31763679E+04 0.31763679E+04 0.31685920E+04 + 0.31685920E+04 0.31633950E+04 0.31633950E+04 0.31652141E+04 + 0.31652141E+04 0.31710930E+04 0.31710930E+04 0.31777510E+04 + 0.31913831E+04 0.31922710E+04 0.31922710E+04 0.31972229E+04 + 0.31972229E+04 0.31949209E+04 0.31949209E+04 0.31877151E+04 + 0.31877151E+04 0.31816731E+04 0.31816731E+04 0.31763679E+04 + 0.31763679E+04 0.31685920E+04 0.31685920E+04 0.31633950E+04 + 0.31633950E+04 0.31652141E+04 0.31652141E+04 0.31710930E+04 + 0.31710930E+04 0.31777510E+04 0.31873169E+04 0.31888660E+04 + 0.31888660E+04 0.31917900E+04 0.31917900E+04 0.31891570E+04 + 0.31891570E+04 0.31804719E+04 0.31804719E+04 0.31722681E+04 + 0.31722681E+04 0.31689309E+04 0.31689309E+04 0.31672041E+04 + 0.31672041E+04 0.31664641E+04 0.31664641E+04 0.31684541E+04 + 0.31684541E+04 0.31723240E+04 0.31723240E+04 0.31795220E+04 + 0.31873169E+04 0.31888660E+04 0.31888660E+04 0.31917900E+04 + 0.31917900E+04 0.31891570E+04 0.31891570E+04 0.31804719E+04 + 0.31804719E+04 0.31722681E+04 0.31722681E+04 0.31689309E+04 + 0.31689309E+04 0.31672041E+04 0.31672041E+04 0.31664641E+04 + 0.31664641E+04 0.31684541E+04 0.31684541E+04 0.31723240E+04 + 0.30438069E+04 0.30427661E+04 0.31809380E+04 0.31771599E+04 + 0.31771599E+04 0.31797939E+04 0.31797939E+04 0.31784009E+04 + 0.31784009E+04 0.31719851E+04 0.31719851E+04 0.31681531E+04 + 0.31681531E+04 0.31675300E+04 0.31675300E+04 0.31678711E+04 + 0.31678711E+04 0.31678379E+04 0.31678379E+04 0.31697200E+04 + 0.31697200E+04 0.31723181E+04 0.30485090E+04 0.30441670E+04 + 0.31809380E+04 0.31771599E+04 0.31771599E+04 0.31797939E+04 + 0.31797939E+04 0.31784009E+04 0.31784009E+04 0.31719851E+04 + 0.31719851E+04 0.31681531E+04 0.31681531E+04 0.31675300E+04 + 0.31675300E+04 0.31678711E+04 0.31678711E+04 0.31678379E+04 + 0.30747881E+04 0.30711970E+04 0.30711970E+04 0.30694509E+04 + 0.30485090E+04 0.30441670E+04 0.31823511E+04 0.31708091E+04 + 0.31708091E+04 0.31702561E+04 0.31702561E+04 0.31704031E+04 + 0.31704031E+04 0.31688589E+04 0.31688589E+04 0.31675300E+04 + 0.31675300E+04 0.31658311E+04 0.31658311E+04 0.31667600E+04 + 0.31667600E+04 0.31670359E+04 0.30748601E+04 0.30725310E+04 + 0.30725310E+04 0.30698899E+04 0.30477300E+04 0.30445181E+04 + 0.31823511E+04 0.31708091E+04 0.31708091E+04 0.31702561E+04 + 0.31702561E+04 0.31704031E+04 0.31704031E+04 0.31688589E+04 + 0.31688589E+04 0.31675300E+04 0.31675300E+04 0.31658311E+04 + 0.30860349E+04 0.30816169E+04 0.30816169E+04 0.30748601E+04 + 0.30748601E+04 0.30725310E+04 0.30725310E+04 0.30698899E+04 + 0.30477300E+04 0.30445181E+04 0.31837080E+04 0.31737090E+04 + 0.31737090E+04 0.31696509E+04 0.31696509E+04 0.31671670E+04 + 0.31671670E+04 0.31652581E+04 0.31652581E+04 0.31658049E+04 + 0.31658049E+04 0.31650991E+04 0.30875000E+04 0.30834670E+04 + 0.30834670E+04 0.30781421E+04 0.30781421E+04 0.30743669E+04 + 0.30743669E+04 0.30713159E+04 0.30478589E+04 0.30445940E+04 + 0.31837080E+04 0.31737090E+04 0.31737090E+04 0.31696509E+04 + 0.31696509E+04 0.31671670E+04 0.31671670E+04 0.31652581E+04 + 0.30953569E+04 0.30916169E+04 0.30916169E+04 0.30875000E+04 + 0.30875000E+04 0.30834670E+04 0.30834670E+04 0.30781421E+04 + 0.30781421E+04 0.30743669E+04 0.30743669E+04 0.30713159E+04 + 0.30478589E+04 0.30445940E+04 0.31831880E+04 0.31766350E+04 + 0.31766350E+04 0.31710891E+04 0.31710891E+04 0.31689910E+04 + 0.31689910E+04 0.31648621E+04 0.30965171E+04 0.30926799E+04 + 0.30926799E+04 0.30898081E+04 0.30898081E+04 0.30864951E+04 + 0.30864951E+04 0.30804341E+04 0.30804341E+04 0.30752510E+04 + 0.30752510E+04 0.30721289E+04 0.30478320E+04 0.30450581E+04 + 0.31831880E+04 0.31766350E+04 0.31766350E+04 0.31710891E+04 + 0.31059031E+04 0.31019771E+04 0.31019771E+04 0.30965171E+04 + 0.30965171E+04 0.30926799E+04 0.30926799E+04 0.30898081E+04 + 0.30898081E+04 0.30864951E+04 0.30864951E+04 0.30804341E+04 + 0.30804341E+04 0.30752510E+04 0.30752510E+04 0.30721289E+04 + 0.30478320E+04 0.30450581E+04 0.31827019E+04 0.31785779E+04 + 0.31785779E+04 0.31729299E+04 0.31084319E+04 0.31030581E+04 + 0.31030581E+04 0.30977300E+04 0.30977300E+04 0.30937859E+04 + 0.30937859E+04 0.30877749E+04 0.30877749E+04 0.30832041E+04 + 0.30832041E+04 0.30810530E+04 0.30810530E+04 0.30775691E+04 + 0.30775691E+04 0.30733120E+04 0.30483081E+04 0.30452429E+04 + 0.31165920E+04 0.31133970E+04 0.31133970E+04 0.31084319E+04 + 0.31084319E+04 0.31030581E+04 0.31030581E+04 0.30977300E+04 + 0.30977300E+04 0.30937859E+04 0.30937859E+04 0.30877749E+04 + 0.30877749E+04 0.30832041E+04 0.30832041E+04 0.30810530E+04 + 0.30810530E+04 0.30775691E+04 0.30775691E+04 0.30733120E+04 + 0.30733120E+04 0.30701609E+04 0.31183491E+04 0.31156399E+04 + 0.31156399E+04 0.31127671E+04 0.31127671E+04 0.31077251E+04 + 0.31077251E+04 0.30971411E+04 0.30971411E+04 0.30901021E+04 + 0.30901021E+04 0.30855979E+04 0.30855979E+04 0.30841250E+04 + 0.30841250E+04 0.30852451E+04 0.30852451E+04 0.30806731E+04 + 0.30806731E+04 0.30750720E+04 0.30750720E+04 0.30714109E+04 + 0.31754971E+04 0.31771680E+04 0.31771680E+04 0.31793000E+04 + 0.31793000E+04 0.31783350E+04 0.31783350E+04 0.31729800E+04 + 0.31729800E+04 0.31680991E+04 0.31680991E+04 0.31706140E+04 + 0.31706140E+04 0.31758679E+04 0.31758679E+04 0.31764500E+04 + 0.31764500E+04 0.31773269E+04 0.31773269E+04 0.31827520E+04 + 0.31827520E+04 0.31903010E+04 0.31651470E+04 0.31694839E+04 + 0.31694839E+04 0.31731599E+04 0.31731599E+04 0.31721650E+04 + 0.31721650E+04 0.31693589E+04 0.31693589E+04 0.31697791E+04 + 0.31697791E+04 0.31758669E+04 0.31758669E+04 0.31810759E+04 + 0.31810759E+04 0.31812080E+04 0.31812080E+04 0.31848201E+04 + 0.31848201E+04 0.31898401E+04 0.31898401E+04 0.31957649E+04 + 0.31651470E+04 0.31694839E+04 0.31694839E+04 0.31731599E+04 + 0.31731599E+04 0.31721650E+04 0.31721650E+04 0.31693589E+04 + 0.31693589E+04 0.31697791E+04 0.31697791E+04 0.31758669E+04 + 0.31758669E+04 0.31810759E+04 0.31810759E+04 0.31812080E+04 + 0.31812080E+04 0.31848201E+04 0.31848201E+04 0.31898401E+04 + 0.31898401E+04 0.31957649E+04 0.31563679E+04 0.31595110E+04 + 0.31595110E+04 0.31617380E+04 0.31617380E+04 0.31596741E+04 + 0.31596741E+04 0.31618279E+04 0.31618279E+04 0.31675129E+04 + 0.31675129E+04 0.31749170E+04 0.31749170E+04 0.31806460E+04 + 0.31806460E+04 0.31833420E+04 0.31833420E+04 0.31890591E+04 + 0.31890591E+04 0.31945520E+04 0.31945520E+04 0.32001379E+04 + 0.31563679E+04 0.31595110E+04 0.31595110E+04 0.31617380E+04 + 0.31617380E+04 0.31596741E+04 0.31596741E+04 0.31618279E+04 + 0.31618279E+04 0.31675129E+04 0.31675129E+04 0.31749170E+04 + 0.31749170E+04 0.31806460E+04 0.31806460E+04 0.31833420E+04 + 0.31833420E+04 0.31890591E+04 0.31890591E+04 0.31945520E+04 + 0.31945520E+04 0.32001379E+04 0.31509600E+04 0.31456990E+04 + 0.31456990E+04 0.31459370E+04 0.31459370E+04 0.31489819E+04 + 0.31489819E+04 0.31604619E+04 0.31604619E+04 0.31723879E+04 + 0.31723879E+04 0.31791909E+04 0.31791909E+04 0.31817759E+04 + 0.31817759E+04 0.31855100E+04 0.31855100E+04 0.31931780E+04 + 0.31931780E+04 0.32016389E+04 0.32016389E+04 0.32088110E+04 + 0.31509600E+04 0.31456990E+04 0.31456990E+04 0.31459370E+04 + 0.31459370E+04 0.31489819E+04 0.31489819E+04 0.31604619E+04 + 0.31604619E+04 0.31723879E+04 0.31723879E+04 0.31791909E+04 + 0.31791909E+04 0.31817759E+04 0.31817759E+04 0.31855100E+04 + 0.31855100E+04 0.31931780E+04 0.31931780E+04 0.32016389E+04 + 0.32016389E+04 0.32088110E+04 0.31624399E+04 0.31568169E+04 + 0.31568169E+04 0.31571750E+04 0.31571750E+04 0.31573530E+04 + 0.31573530E+04 0.31606489E+04 0.31606489E+04 0.31666680E+04 + 0.31666680E+04 0.31715090E+04 0.31715090E+04 0.31748330E+04 + 0.31748330E+04 0.31820339E+04 0.31820339E+04 0.31933210E+04 + 0.31933210E+04 0.32044070E+04 0.32044070E+04 0.32138059E+04 + 0.31624399E+04 0.31568169E+04 0.31568169E+04 0.31571750E+04 + 0.31571750E+04 0.31573530E+04 0.31573530E+04 0.31606489E+04 + 0.31606489E+04 0.31666680E+04 0.31666680E+04 0.31715090E+04 + 0.31715090E+04 0.31748330E+04 0.31748330E+04 0.31820339E+04 + 0.31820339E+04 0.31933210E+04 0.31933210E+04 0.32044070E+04 + 0.32044070E+04 0.32138059E+04 0.31760161E+04 0.31785549E+04 + 0.31785549E+04 0.31789109E+04 0.31789109E+04 0.31743611E+04 + 0.31743611E+04 0.31669919E+04 0.31669919E+04 0.31644551E+04 + 0.31644551E+04 0.31676431E+04 0.31676431E+04 0.31720229E+04 + 0.31720229E+04 0.31778750E+04 0.31778750E+04 0.31880371E+04 + 0.31880371E+04 0.32001760E+04 0.32001760E+04 0.32121101E+04 + 0.31760161E+04 0.31785549E+04 0.31785549E+04 0.31789109E+04 + 0.31789109E+04 0.31743611E+04 0.31743611E+04 0.31669919E+04 + 0.31669919E+04 0.31644551E+04 0.31644551E+04 0.31676431E+04 + 0.31676431E+04 0.31720229E+04 0.31720229E+04 0.31778750E+04 + 0.31778750E+04 0.31880371E+04 0.31880371E+04 0.32001760E+04 + 0.32001760E+04 0.32121101E+04 0.31758911E+04 0.31843049E+04 + 0.31843049E+04 0.31858020E+04 0.31858020E+04 0.31833669E+04 + 0.31833669E+04 0.31801069E+04 0.31801069E+04 0.31768159E+04 + 0.31768159E+04 0.31753420E+04 0.31753420E+04 0.31730481E+04 + 0.31730481E+04 0.31734080E+04 0.31734080E+04 0.31802781E+04 + 0.31802781E+04 0.31914241E+04 0.31914241E+04 0.32026819E+04 + 0.31758911E+04 0.31843049E+04 0.31843049E+04 0.31858020E+04 + 0.31858020E+04 0.31833669E+04 0.31833669E+04 0.31801069E+04 + 0.31801069E+04 0.31768159E+04 0.31768159E+04 0.31753420E+04 + 0.31753420E+04 0.31730481E+04 0.31730481E+04 0.31734080E+04 + 0.31734080E+04 0.31802781E+04 0.31802781E+04 0.31914241E+04 + 0.31914241E+04 0.32026819E+04 0.31747739E+04 0.31815249E+04 + 0.31815249E+04 0.31855371E+04 0.31855371E+04 0.31843110E+04 + 0.31843110E+04 0.31834431E+04 0.31834431E+04 0.31822410E+04 + 0.31822410E+04 0.31780691E+04 0.31780691E+04 0.31704290E+04 + 0.31704290E+04 0.31679541E+04 0.31679541E+04 0.31723789E+04 + 0.31723789E+04 0.31795530E+04 0.31795530E+04 0.31864980E+04 + 0.31747739E+04 0.31815249E+04 0.31815249E+04 0.31855371E+04 + 0.31855371E+04 0.31843110E+04 0.31843110E+04 0.31834431E+04 + 0.31834431E+04 0.31822410E+04 0.31822410E+04 0.31780691E+04 + 0.31780691E+04 0.31704290E+04 0.31704290E+04 0.31679541E+04 + 0.31679541E+04 0.31723789E+04 0.31723789E+04 0.31795530E+04 + 0.31795530E+04 0.31864980E+04 0.31827290E+04 0.31856819E+04 + 0.31856819E+04 0.31921790E+04 0.31921790E+04 0.31902161E+04 + 0.31902161E+04 0.31849919E+04 0.31849919E+04 0.31815811E+04 + 0.31815811E+04 0.31773030E+04 0.31773030E+04 0.31692380E+04 + 0.31692380E+04 0.31646899E+04 0.31646899E+04 0.31682629E+04 + 0.31682629E+04 0.31731250E+04 0.31731250E+04 0.31778379E+04 + 0.31827290E+04 0.31856819E+04 0.31856819E+04 0.31921790E+04 + 0.31921790E+04 0.31902161E+04 0.31902161E+04 0.31849919E+04 + 0.31849919E+04 0.31815811E+04 0.31815811E+04 0.31773030E+04 + 0.31773030E+04 0.31692380E+04 0.31692380E+04 0.31646899E+04 + 0.31646899E+04 0.31682629E+04 0.31682629E+04 0.31731250E+04 + 0.31731250E+04 0.31778379E+04 0.31913831E+04 0.31922710E+04 + 0.31922710E+04 0.31972229E+04 0.31972229E+04 0.31949209E+04 + 0.31949209E+04 0.31877151E+04 0.31877151E+04 0.31816731E+04 + 0.31816731E+04 0.31763679E+04 0.31763679E+04 0.31685920E+04 + 0.31685920E+04 0.31633950E+04 0.31633950E+04 0.31652141E+04 + 0.31652141E+04 0.31710930E+04 0.31710930E+04 0.31777510E+04 + 0.31913831E+04 0.31922710E+04 0.31922710E+04 0.31972229E+04 + 0.31972229E+04 0.31949209E+04 0.31949209E+04 0.31877151E+04 + 0.31877151E+04 0.31816731E+04 0.31816731E+04 0.31763679E+04 + 0.31763679E+04 0.31685920E+04 0.31685920E+04 0.31633950E+04 + 0.31633950E+04 0.31652141E+04 0.31652141E+04 0.31710930E+04 + 0.31710930E+04 0.31777510E+04 0.31873169E+04 0.31888660E+04 + 0.31888660E+04 0.31917900E+04 0.31917900E+04 0.31891570E+04 + 0.31891570E+04 0.31804719E+04 0.31804719E+04 0.31722681E+04 + 0.31722681E+04 0.31689309E+04 0.31689309E+04 0.31672041E+04 + 0.31672041E+04 0.31664641E+04 0.31664641E+04 0.31684541E+04 + 0.31684541E+04 0.31723240E+04 0.31723240E+04 0.31795220E+04 + 0.31873169E+04 0.31888660E+04 0.31888660E+04 0.31917900E+04 + 0.31917900E+04 0.31891570E+04 0.31891570E+04 0.31804719E+04 + 0.31804719E+04 0.31722681E+04 0.31722681E+04 0.31689309E+04 + 0.31689309E+04 0.31672041E+04 0.31672041E+04 0.31664641E+04 + 0.31664641E+04 0.31684541E+04 0.31684541E+04 0.31723240E+04 + 0.30438069E+04 0.30427661E+04 0.31809380E+04 0.31771599E+04 + 0.31771599E+04 0.31797939E+04 0.31797939E+04 0.31784009E+04 + 0.31784009E+04 0.31719851E+04 0.31719851E+04 0.31681531E+04 + 0.31681531E+04 0.31675300E+04 0.31675300E+04 0.31678711E+04 + 0.31678711E+04 0.31678379E+04 0.31678379E+04 0.31697200E+04 + 0.31697200E+04 0.31723181E+04 0.30485090E+04 0.30441670E+04 + 0.31809380E+04 0.31771599E+04 0.31771599E+04 0.31797939E+04 + 0.31797939E+04 0.31784009E+04 0.31784009E+04 0.31719851E+04 + 0.31719851E+04 0.31681531E+04 0.31681531E+04 0.31675300E+04 + 0.31675300E+04 0.31678711E+04 0.31678711E+04 0.31678379E+04 + 0.30747881E+04 0.30711970E+04 0.30711970E+04 0.30694509E+04 + 0.30485090E+04 0.30441670E+04 0.31823511E+04 0.31708091E+04 + 0.31708091E+04 0.31702561E+04 0.31702561E+04 0.31704031E+04 + 0.31704031E+04 0.31688589E+04 0.31688589E+04 0.31675300E+04 + 0.31675300E+04 0.31658311E+04 0.31658311E+04 0.31667600E+04 + 0.31667600E+04 0.31670359E+04 0.30748601E+04 0.30725310E+04 + 0.30725310E+04 0.30698899E+04 0.30477300E+04 0.30445181E+04 + 0.31823511E+04 0.31708091E+04 0.31708091E+04 0.31702561E+04 + 0.31702561E+04 0.31704031E+04 0.31704031E+04 0.31688589E+04 + 0.31688589E+04 0.31675300E+04 0.31675300E+04 0.31658311E+04 + 0.30860349E+04 0.30816169E+04 0.30816169E+04 0.30748601E+04 + 0.30748601E+04 0.30725310E+04 0.30725310E+04 0.30698899E+04 + 0.30477300E+04 0.30445181E+04 0.31837080E+04 0.31737090E+04 + 0.31737090E+04 0.31696509E+04 0.31696509E+04 0.31671670E+04 + 0.31671670E+04 0.31652581E+04 0.31652581E+04 0.31658049E+04 + 0.31658049E+04 0.31650991E+04 0.30875000E+04 0.30834670E+04 + 0.30834670E+04 0.30781421E+04 0.30781421E+04 0.30743669E+04 + 0.30743669E+04 0.30713159E+04 0.30478589E+04 0.30445940E+04 + 0.31837080E+04 0.31737090E+04 0.31737090E+04 0.31696509E+04 + 0.31696509E+04 0.31671670E+04 0.31671670E+04 0.31652581E+04 + 0.30953569E+04 0.30916169E+04 0.30916169E+04 0.30875000E+04 + 0.30875000E+04 0.30834670E+04 0.30834670E+04 0.30781421E+04 + 0.30781421E+04 0.30743669E+04 0.30743669E+04 0.30713159E+04 + 0.30478589E+04 0.30445940E+04 0.31831880E+04 0.31766350E+04 + 0.31766350E+04 0.31710891E+04 0.31710891E+04 0.31689910E+04 + 0.31689910E+04 0.31648621E+04 0.30965171E+04 0.30926799E+04 + 0.30926799E+04 0.30898081E+04 0.30898081E+04 0.30864951E+04 + 0.30864951E+04 0.30804341E+04 0.30804341E+04 0.30752510E+04 + 0.30752510E+04 0.30721289E+04 0.30478320E+04 0.30450581E+04 + 0.31831880E+04 0.31766350E+04 0.31766350E+04 0.31710891E+04 + 0.31059031E+04 0.31019771E+04 0.31019771E+04 0.30965171E+04 + 0.30965171E+04 0.30926799E+04 0.30926799E+04 0.30898081E+04 + 0.30898081E+04 0.30864951E+04 0.30864951E+04 0.30804341E+04 + 0.30804341E+04 0.30752510E+04 0.30752510E+04 0.30721289E+04 + 0.30478320E+04 0.30450581E+04 0.31827019E+04 0.31785779E+04 + 0.31785779E+04 0.31729299E+04 0.31084319E+04 0.31030581E+04 + 0.31030581E+04 0.30977300E+04 0.30977300E+04 0.30937859E+04 + 0.30937859E+04 0.30877749E+04 0.30877749E+04 0.30832041E+04 + 0.30832041E+04 0.30810530E+04 0.30810530E+04 0.30775691E+04 + 0.30775691E+04 0.30733120E+04 0.30483081E+04 0.30452429E+04 + 0.31165920E+04 0.31133970E+04 0.31133970E+04 0.31084319E+04 + 0.31084319E+04 0.31030581E+04 0.31030581E+04 0.30977300E+04 + 0.30977300E+04 0.30937859E+04 0.30937859E+04 0.30877749E+04 + 0.30877749E+04 0.30832041E+04 0.30832041E+04 0.30810530E+04 + 0.30810530E+04 0.30775691E+04 0.30775691E+04 0.30733120E+04 + 0.30733120E+04 0.30701609E+04 0.31183491E+04 0.31156399E+04 + 0.31156399E+04 0.31127671E+04 0.31127671E+04 0.31077251E+04 + 0.31077251E+04 0.30971411E+04 0.30971411E+04 0.30901021E+04 + 0.30901021E+04 0.30855979E+04 0.30855979E+04 0.30841250E+04 + 0.30841250E+04 0.30852451E+04 0.30852451E+04 0.30806731E+04 + 0.30806731E+04 0.30750720E+04 0.30750720E+04 0.30714109E+04 + 0.31778799E+04 0.31793660E+04 0.31793660E+04 0.31815649E+04 + 0.31815649E+04 0.31807090E+04 0.31807090E+04 0.31753789E+04 + 0.31753789E+04 0.31702720E+04 0.31702720E+04 0.31725100E+04 + 0.31725100E+04 0.31777930E+04 0.31777930E+04 0.31785540E+04 + 0.31785540E+04 0.31793960E+04 0.31793960E+04 0.31847759E+04 + 0.31847759E+04 0.31922771E+04 0.31675381E+04 0.31716870E+04 + 0.31716870E+04 0.31754700E+04 0.31754700E+04 0.31746160E+04 + 0.31746160E+04 0.31717490E+04 0.31717490E+04 0.31719131E+04 + 0.31719131E+04 0.31778201E+04 0.31778201E+04 0.31831951E+04 + 0.31831951E+04 0.31833840E+04 0.31833840E+04 0.31869341E+04 + 0.31869341E+04 0.31919109E+04 0.31919109E+04 0.31976580E+04 + 0.31675381E+04 0.31716870E+04 0.31716870E+04 0.31754700E+04 + 0.31754700E+04 0.31746160E+04 0.31746160E+04 0.31717490E+04 + 0.31717490E+04 0.31719131E+04 0.31719131E+04 0.31778201E+04 + 0.31778201E+04 0.31831951E+04 0.31831951E+04 0.31833840E+04 + 0.31833840E+04 0.31869341E+04 0.31869341E+04 0.31919109E+04 + 0.31919109E+04 0.31976580E+04 0.31588040E+04 0.31619390E+04 + 0.31619390E+04 0.31642241E+04 0.31642241E+04 0.31620439E+04 + 0.31620439E+04 0.31638059E+04 0.31638059E+04 0.31692229E+04 + 0.31692229E+04 0.31765759E+04 0.31765759E+04 0.31824871E+04 + 0.31824871E+04 0.31852539E+04 0.31852539E+04 0.31909580E+04 + 0.31909580E+04 0.31963401E+04 0.31963401E+04 0.32016321E+04 + 0.31588040E+04 0.31619390E+04 0.31619390E+04 0.31642241E+04 + 0.31642241E+04 0.31620439E+04 0.31620439E+04 0.31638059E+04 + 0.31638059E+04 0.31692229E+04 0.31692229E+04 0.31765759E+04 + 0.31765759E+04 0.31824871E+04 0.31824871E+04 0.31852539E+04 + 0.31852539E+04 0.31909580E+04 0.31909580E+04 0.31963401E+04 + 0.31963401E+04 0.32016321E+04 0.31527820E+04 0.31474370E+04 + 0.31474370E+04 0.31476089E+04 0.31476089E+04 0.31504250E+04 + 0.31504250E+04 0.31617920E+04 0.31617920E+04 0.31737090E+04 + 0.31737090E+04 0.31806819E+04 0.31806819E+04 0.31833660E+04 + 0.31833660E+04 0.31870281E+04 0.31870281E+04 0.31945291E+04 + 0.31945291E+04 0.32028059E+04 0.32028059E+04 0.32098169E+04 + 0.31527820E+04 0.31474370E+04 0.31474370E+04 0.31476089E+04 + 0.31476089E+04 0.31504250E+04 0.31504250E+04 0.31617920E+04 + 0.31617920E+04 0.31737090E+04 0.31737090E+04 0.31806819E+04 + 0.31806819E+04 0.31833660E+04 0.31833660E+04 0.31870281E+04 + 0.31870281E+04 0.31945291E+04 0.31945291E+04 0.32028059E+04 + 0.32028059E+04 0.32098169E+04 0.31635229E+04 0.31579170E+04 + 0.31579170E+04 0.31584419E+04 0.31584419E+04 0.31586660E+04 + 0.31586660E+04 0.31619299E+04 0.31619299E+04 0.31679009E+04 + 0.31679009E+04 0.31727019E+04 0.31727019E+04 0.31759180E+04 + 0.31759180E+04 0.31830320E+04 0.31830320E+04 0.31942820E+04 + 0.31942820E+04 0.32053259E+04 0.32053259E+04 0.32147129E+04 + 0.31635229E+04 0.31579170E+04 0.31579170E+04 0.31584419E+04 + 0.31584419E+04 0.31586660E+04 0.31586660E+04 0.31619299E+04 + 0.31619299E+04 0.31679009E+04 0.31679009E+04 0.31727019E+04 + 0.31727019E+04 0.31759180E+04 0.31759180E+04 0.31830320E+04 + 0.31830320E+04 0.31942820E+04 0.31942820E+04 0.32053259E+04 + 0.32053259E+04 0.32147129E+04 0.31771570E+04 0.31795701E+04 + 0.31795701E+04 0.31799790E+04 0.31799790E+04 0.31755029E+04 + 0.31755029E+04 0.31680840E+04 0.31680840E+04 0.31653989E+04 + 0.31653989E+04 0.31685320E+04 0.31685320E+04 0.31729910E+04 + 0.31729910E+04 0.31787300E+04 0.31787300E+04 0.31888379E+04 + 0.31888379E+04 0.32010049E+04 0.32010049E+04 0.32129690E+04 + 0.31771570E+04 0.31795701E+04 0.31795701E+04 0.31799790E+04 + 0.31799790E+04 0.31755029E+04 0.31755029E+04 0.31680840E+04 + 0.31680840E+04 0.31653989E+04 0.31653989E+04 0.31685320E+04 + 0.31685320E+04 0.31729910E+04 0.31729910E+04 0.31787300E+04 + 0.31787300E+04 0.31888379E+04 0.31888379E+04 0.32010049E+04 + 0.32010049E+04 0.32129690E+04 0.31768101E+04 0.31852241E+04 + 0.31852241E+04 0.31869280E+04 0.31869280E+04 0.31845200E+04 + 0.31845200E+04 0.31811670E+04 0.31811670E+04 0.31777390E+04 + 0.31777390E+04 0.31762700E+04 0.31762700E+04 0.31739729E+04 + 0.31739729E+04 0.31741541E+04 0.31741541E+04 0.31810291E+04 + 0.31810291E+04 0.31923379E+04 0.31923379E+04 0.32037690E+04 + 0.31768101E+04 0.31852241E+04 0.31852241E+04 0.31869280E+04 + 0.31869280E+04 0.31845200E+04 0.31845200E+04 0.31811670E+04 + 0.31811670E+04 0.31777390E+04 0.31777390E+04 0.31762700E+04 + 0.31762700E+04 0.31739729E+04 0.31739729E+04 0.31741541E+04 + 0.31741541E+04 0.31810291E+04 0.31810291E+04 0.31923379E+04 + 0.31923379E+04 0.32037690E+04 0.31756150E+04 0.31824331E+04 + 0.31824331E+04 0.31865581E+04 0.31865581E+04 0.31853630E+04 + 0.31853630E+04 0.31844370E+04 0.31844370E+04 0.31832251E+04 + 0.31832251E+04 0.31791589E+04 0.31791589E+04 0.31714260E+04 + 0.31714260E+04 0.31687881E+04 0.31687881E+04 0.31731431E+04 + 0.31731431E+04 0.31804180E+04 0.31804180E+04 0.31875610E+04 + 0.31756150E+04 0.31824331E+04 0.31824331E+04 0.31865581E+04 + 0.31865581E+04 0.31853630E+04 0.31853630E+04 0.31844370E+04 + 0.31844370E+04 0.31832251E+04 0.31832251E+04 0.31791589E+04 + 0.31791589E+04 0.31714260E+04 0.31714260E+04 0.31687881E+04 + 0.31687881E+04 0.31731431E+04 0.31731431E+04 0.31804180E+04 + 0.31804180E+04 0.31875610E+04 0.31836399E+04 0.31864961E+04 + 0.31864961E+04 0.31930779E+04 0.31930779E+04 0.31912671E+04 + 0.31912671E+04 0.31859951E+04 0.31859951E+04 0.31825591E+04 + 0.31825591E+04 0.31783730E+04 0.31783730E+04 0.31702729E+04 + 0.31702729E+04 0.31655249E+04 0.31655249E+04 0.31690540E+04 + 0.31690540E+04 0.31739031E+04 0.31739031E+04 0.31786001E+04 + 0.31836399E+04 0.31864961E+04 0.31864961E+04 0.31930779E+04 + 0.31930779E+04 0.31912671E+04 0.31912671E+04 0.31859951E+04 + 0.31859951E+04 0.31825591E+04 0.31825591E+04 0.31783730E+04 + 0.31783730E+04 0.31702729E+04 0.31702729E+04 0.31655249E+04 + 0.31655249E+04 0.31690540E+04 0.31690540E+04 0.31739031E+04 + 0.31739031E+04 0.31786001E+04 0.31925349E+04 0.31932180E+04 + 0.31932180E+04 0.31981689E+04 0.31981689E+04 0.31960410E+04 + 0.31960410E+04 0.31888501E+04 0.31888501E+04 0.31827209E+04 + 0.31827209E+04 0.31774360E+04 0.31774360E+04 0.31696001E+04 + 0.31696001E+04 0.31641299E+04 0.31641299E+04 0.31660181E+04 + 0.31660181E+04 0.31716531E+04 0.31716531E+04 0.31781399E+04 + 0.31925349E+04 0.31932180E+04 0.31932180E+04 0.31981689E+04 + 0.31981689E+04 0.31960410E+04 0.31960410E+04 0.31888501E+04 + 0.31888501E+04 0.31827209E+04 0.31827209E+04 0.31774360E+04 + 0.31774360E+04 0.31696001E+04 0.31696001E+04 0.31641299E+04 + 0.31641299E+04 0.31660181E+04 0.31660181E+04 0.31716531E+04 + 0.31716531E+04 0.31781399E+04 0.31885210E+04 0.31899180E+04 + 0.31899180E+04 0.31928311E+04 0.31928311E+04 0.31903669E+04 + 0.31903669E+04 0.31817639E+04 0.31817639E+04 0.31736321E+04 + 0.31736321E+04 0.31701140E+04 0.31701140E+04 0.31680020E+04 + 0.31680020E+04 0.31669080E+04 0.31669080E+04 0.31687090E+04 + 0.31687090E+04 0.31727981E+04 0.31727981E+04 0.31800000E+04 + 0.31885210E+04 0.31899180E+04 0.31899180E+04 0.31928311E+04 + 0.31928311E+04 0.31903669E+04 0.31903669E+04 0.31817639E+04 + 0.31817639E+04 0.31736321E+04 0.31736321E+04 0.31701140E+04 + 0.31701140E+04 0.31680020E+04 0.31680020E+04 0.31669080E+04 + 0.31669080E+04 0.31687090E+04 0.31687090E+04 0.31727981E+04 + 0.30443970E+04 0.30434800E+04 0.31821899E+04 0.31781909E+04 + 0.31781909E+04 0.31808101E+04 0.31808101E+04 0.31795991E+04 + 0.31795991E+04 0.31733401E+04 0.31733401E+04 0.31693140E+04 + 0.31693140E+04 0.31683359E+04 0.31683359E+04 0.31682920E+04 + 0.31682920E+04 0.31682910E+04 0.31682910E+04 0.31700510E+04 + 0.31700510E+04 0.31726069E+04 0.30491160E+04 0.30448669E+04 + 0.31821899E+04 0.31781909E+04 0.31781909E+04 0.31808101E+04 + 0.31808101E+04 0.31795991E+04 0.31795991E+04 0.31733401E+04 + 0.31733401E+04 0.31693140E+04 0.31693140E+04 0.31683359E+04 + 0.31683359E+04 0.31682920E+04 0.31682920E+04 0.31682910E+04 + 0.30760759E+04 0.30725249E+04 0.30725249E+04 0.30708210E+04 + 0.30491160E+04 0.30448669E+04 0.31838230E+04 0.31719709E+04 + 0.31719709E+04 0.31712429E+04 0.31712429E+04 0.31712151E+04 + 0.31712151E+04 0.31694800E+04 0.31694800E+04 0.31678970E+04 + 0.31678970E+04 0.31663921E+04 0.31663921E+04 0.31672720E+04 + 0.31672720E+04 0.31674951E+04 0.30760081E+04 0.30738411E+04 + 0.30738411E+04 0.30712981E+04 0.30483840E+04 0.30452219E+04 + 0.31838230E+04 0.31719709E+04 0.31719709E+04 0.31712429E+04 + 0.31712429E+04 0.31712151E+04 0.31712151E+04 0.31694800E+04 + 0.31694800E+04 0.31678970E+04 0.31678970E+04 0.31663921E+04 + 0.30872571E+04 0.30828740E+04 0.30828740E+04 0.30760081E+04 + 0.30760081E+04 0.30738411E+04 0.30738411E+04 0.30712981E+04 + 0.30483840E+04 0.30452219E+04 0.31848679E+04 0.31744460E+04 + 0.31744460E+04 0.31701011E+04 0.31701011E+04 0.31677620E+04 + 0.31677620E+04 0.31658350E+04 0.31658350E+04 0.31662209E+04 + 0.31662209E+04 0.31654629E+04 0.30887080E+04 0.30847649E+04 + 0.30847649E+04 0.30795181E+04 0.30795181E+04 0.30757490E+04 + 0.30757490E+04 0.30727439E+04 0.30485439E+04 0.30453420E+04 + 0.31848679E+04 0.31744460E+04 0.31744460E+04 0.31701011E+04 + 0.31701011E+04 0.31677620E+04 0.31677620E+04 0.31658350E+04 + 0.30964341E+04 0.30927339E+04 0.30927339E+04 0.30887080E+04 + 0.30887080E+04 0.30847649E+04 0.30847649E+04 0.30795181E+04 + 0.30795181E+04 0.30757490E+04 0.30757490E+04 0.30727439E+04 + 0.30485439E+04 0.30453420E+04 0.31841489E+04 0.31774109E+04 + 0.31774109E+04 0.31716990E+04 0.31716990E+04 0.31695649E+04 + 0.31695649E+04 0.31654990E+04 0.30976340E+04 0.30938540E+04 + 0.30938540E+04 0.30910459E+04 0.30910459E+04 0.30878140E+04 + 0.30878140E+04 0.30817930E+04 0.30817930E+04 0.30766721E+04 + 0.30766721E+04 0.30735691E+04 0.30485371E+04 0.30458120E+04 + 0.31841489E+04 0.31774109E+04 0.31774109E+04 0.31716990E+04 + 0.31069331E+04 0.31030330E+04 0.31030330E+04 0.30976340E+04 + 0.30976340E+04 0.30938540E+04 0.30938540E+04 0.30910459E+04 + 0.30910459E+04 0.30878140E+04 0.30878140E+04 0.30817930E+04 + 0.30817930E+04 0.30766721E+04 0.30766721E+04 0.30735691E+04 + 0.30485371E+04 0.30458120E+04 0.31837319E+04 0.31793630E+04 + 0.31793630E+04 0.31736680E+04 0.31094509E+04 0.31041919E+04 + 0.31041919E+04 0.30989399E+04 0.30989399E+04 0.30950000E+04 + 0.30950000E+04 0.30890530E+04 0.30890530E+04 0.30845720E+04 + 0.30845720E+04 0.30823850E+04 0.30823850E+04 0.30789460E+04 + 0.30789460E+04 0.30747319E+04 0.30490349E+04 0.30460630E+04 + 0.31175049E+04 0.31143291E+04 0.31143291E+04 0.31094509E+04 + 0.31094509E+04 0.31041919E+04 0.31041919E+04 0.30989399E+04 + 0.30989399E+04 0.30950000E+04 0.30950000E+04 0.30890530E+04 + 0.30890530E+04 0.30845720E+04 0.30845720E+04 0.30823850E+04 + 0.30823850E+04 0.30789460E+04 0.30789460E+04 0.30747319E+04 + 0.30747319E+04 0.30716389E+04 0.31192639E+04 0.31165820E+04 + 0.31165820E+04 0.31137949E+04 0.31137949E+04 0.31088840E+04 + 0.31088840E+04 0.30983440E+04 0.30983440E+04 0.30912739E+04 + 0.30912739E+04 0.30867700E+04 0.30867700E+04 0.30853879E+04 + 0.30853879E+04 0.30865161E+04 0.30865161E+04 0.30820630E+04 + 0.30820630E+04 0.30764751E+04 0.30764751E+04 0.30728320E+04 + 0.31778799E+04 0.31793660E+04 0.31793660E+04 0.31815649E+04 + 0.31815649E+04 0.31807090E+04 0.31807090E+04 0.31753789E+04 + 0.31753789E+04 0.31702720E+04 0.31702720E+04 0.31725100E+04 + 0.31725100E+04 0.31777930E+04 0.31777930E+04 0.31785540E+04 + 0.31785540E+04 0.31793960E+04 0.31793960E+04 0.31847759E+04 + 0.31847759E+04 0.31922771E+04 0.31675381E+04 0.31716870E+04 + 0.31716870E+04 0.31754700E+04 0.31754700E+04 0.31746160E+04 + 0.31746160E+04 0.31717490E+04 0.31717490E+04 0.31719131E+04 + 0.31719131E+04 0.31778201E+04 0.31778201E+04 0.31831951E+04 + 0.31831951E+04 0.31833840E+04 0.31833840E+04 0.31869341E+04 + 0.31869341E+04 0.31919109E+04 0.31919109E+04 0.31976580E+04 + 0.31675381E+04 0.31716870E+04 0.31716870E+04 0.31754700E+04 + 0.31754700E+04 0.31746160E+04 0.31746160E+04 0.31717490E+04 + 0.31717490E+04 0.31719131E+04 0.31719131E+04 0.31778201E+04 + 0.31778201E+04 0.31831951E+04 0.31831951E+04 0.31833840E+04 + 0.31833840E+04 0.31869341E+04 0.31869341E+04 0.31919109E+04 + 0.31919109E+04 0.31976580E+04 0.31588040E+04 0.31619390E+04 + 0.31619390E+04 0.31642241E+04 0.31642241E+04 0.31620439E+04 + 0.31620439E+04 0.31638059E+04 0.31638059E+04 0.31692229E+04 + 0.31692229E+04 0.31765759E+04 0.31765759E+04 0.31824871E+04 + 0.31824871E+04 0.31852539E+04 0.31852539E+04 0.31909580E+04 + 0.31909580E+04 0.31963401E+04 0.31963401E+04 0.32016321E+04 + 0.31588040E+04 0.31619390E+04 0.31619390E+04 0.31642241E+04 + 0.31642241E+04 0.31620439E+04 0.31620439E+04 0.31638059E+04 + 0.31638059E+04 0.31692229E+04 0.31692229E+04 0.31765759E+04 + 0.31765759E+04 0.31824871E+04 0.31824871E+04 0.31852539E+04 + 0.31852539E+04 0.31909580E+04 0.31909580E+04 0.31963401E+04 + 0.31963401E+04 0.32016321E+04 0.31527820E+04 0.31474370E+04 + 0.31474370E+04 0.31476089E+04 0.31476089E+04 0.31504250E+04 + 0.31504250E+04 0.31617920E+04 0.31617920E+04 0.31737090E+04 + 0.31737090E+04 0.31806819E+04 0.31806819E+04 0.31833660E+04 + 0.31833660E+04 0.31870281E+04 0.31870281E+04 0.31945291E+04 + 0.31945291E+04 0.32028059E+04 0.32028059E+04 0.32098169E+04 + 0.31527820E+04 0.31474370E+04 0.31474370E+04 0.31476089E+04 + 0.31476089E+04 0.31504250E+04 0.31504250E+04 0.31617920E+04 + 0.31617920E+04 0.31737090E+04 0.31737090E+04 0.31806819E+04 + 0.31806819E+04 0.31833660E+04 0.31833660E+04 0.31870281E+04 + 0.31870281E+04 0.31945291E+04 0.31945291E+04 0.32028059E+04 + 0.32028059E+04 0.32098169E+04 0.31635229E+04 0.31579170E+04 + 0.31579170E+04 0.31584419E+04 0.31584419E+04 0.31586660E+04 + 0.31586660E+04 0.31619299E+04 0.31619299E+04 0.31679009E+04 + 0.31679009E+04 0.31727019E+04 0.31727019E+04 0.31759180E+04 + 0.31759180E+04 0.31830320E+04 0.31830320E+04 0.31942820E+04 + 0.31942820E+04 0.32053259E+04 0.32053259E+04 0.32147129E+04 + 0.31635229E+04 0.31579170E+04 0.31579170E+04 0.31584419E+04 + 0.31584419E+04 0.31586660E+04 0.31586660E+04 0.31619299E+04 + 0.31619299E+04 0.31679009E+04 0.31679009E+04 0.31727019E+04 + 0.31727019E+04 0.31759180E+04 0.31759180E+04 0.31830320E+04 + 0.31830320E+04 0.31942820E+04 0.31942820E+04 0.32053259E+04 + 0.32053259E+04 0.32147129E+04 0.31771570E+04 0.31795701E+04 + 0.31795701E+04 0.31799790E+04 0.31799790E+04 0.31755029E+04 + 0.31755029E+04 0.31680840E+04 0.31680840E+04 0.31653989E+04 + 0.31653989E+04 0.31685320E+04 0.31685320E+04 0.31729910E+04 + 0.31729910E+04 0.31787300E+04 0.31787300E+04 0.31888379E+04 + 0.31888379E+04 0.32010049E+04 0.32010049E+04 0.32129690E+04 + 0.31771570E+04 0.31795701E+04 0.31795701E+04 0.31799790E+04 + 0.31799790E+04 0.31755029E+04 0.31755029E+04 0.31680840E+04 + 0.31680840E+04 0.31653989E+04 0.31653989E+04 0.31685320E+04 + 0.31685320E+04 0.31729910E+04 0.31729910E+04 0.31787300E+04 + 0.31787300E+04 0.31888379E+04 0.31888379E+04 0.32010049E+04 + 0.32010049E+04 0.32129690E+04 0.31768101E+04 0.31852241E+04 + 0.31852241E+04 0.31869280E+04 0.31869280E+04 0.31845200E+04 + 0.31845200E+04 0.31811670E+04 0.31811670E+04 0.31777390E+04 + 0.31777390E+04 0.31762700E+04 0.31762700E+04 0.31739729E+04 + 0.31739729E+04 0.31741541E+04 0.31741541E+04 0.31810291E+04 + 0.31810291E+04 0.31923379E+04 0.31923379E+04 0.32037690E+04 + 0.31768101E+04 0.31852241E+04 0.31852241E+04 0.31869280E+04 + 0.31869280E+04 0.31845200E+04 0.31845200E+04 0.31811670E+04 + 0.31811670E+04 0.31777390E+04 0.31777390E+04 0.31762700E+04 + 0.31762700E+04 0.31739729E+04 0.31739729E+04 0.31741541E+04 + 0.31741541E+04 0.31810291E+04 0.31810291E+04 0.31923379E+04 + 0.31923379E+04 0.32037690E+04 0.31756150E+04 0.31824331E+04 + 0.31824331E+04 0.31865581E+04 0.31865581E+04 0.31853630E+04 + 0.31853630E+04 0.31844370E+04 0.31844370E+04 0.31832251E+04 + 0.31832251E+04 0.31791589E+04 0.31791589E+04 0.31714260E+04 + 0.31714260E+04 0.31687881E+04 0.31687881E+04 0.31731431E+04 + 0.31731431E+04 0.31804180E+04 0.31804180E+04 0.31875610E+04 + 0.31756150E+04 0.31824331E+04 0.31824331E+04 0.31865581E+04 + 0.31865581E+04 0.31853630E+04 0.31853630E+04 0.31844370E+04 + 0.31844370E+04 0.31832251E+04 0.31832251E+04 0.31791589E+04 + 0.31791589E+04 0.31714260E+04 0.31714260E+04 0.31687881E+04 + 0.31687881E+04 0.31731431E+04 0.31731431E+04 0.31804180E+04 + 0.31804180E+04 0.31875610E+04 0.31836399E+04 0.31864961E+04 + 0.31864961E+04 0.31930779E+04 0.31930779E+04 0.31912671E+04 + 0.31912671E+04 0.31859951E+04 0.31859951E+04 0.31825591E+04 + 0.31825591E+04 0.31783730E+04 0.31783730E+04 0.31702729E+04 + 0.31702729E+04 0.31655249E+04 0.31655249E+04 0.31690540E+04 + 0.31690540E+04 0.31739031E+04 0.31739031E+04 0.31786001E+04 + 0.31836399E+04 0.31864961E+04 0.31864961E+04 0.31930779E+04 + 0.31930779E+04 0.31912671E+04 0.31912671E+04 0.31859951E+04 + 0.31859951E+04 0.31825591E+04 0.31825591E+04 0.31783730E+04 + 0.31783730E+04 0.31702729E+04 0.31702729E+04 0.31655249E+04 + 0.31655249E+04 0.31690540E+04 0.31690540E+04 0.31739031E+04 + 0.31739031E+04 0.31786001E+04 0.31925349E+04 0.31932180E+04 + 0.31932180E+04 0.31981689E+04 0.31981689E+04 0.31960410E+04 + 0.31960410E+04 0.31888501E+04 0.31888501E+04 0.31827209E+04 + 0.31827209E+04 0.31774360E+04 0.31774360E+04 0.31696001E+04 + 0.31696001E+04 0.31641299E+04 0.31641299E+04 0.31660181E+04 + 0.31660181E+04 0.31716531E+04 0.31716531E+04 0.31781399E+04 + 0.31925349E+04 0.31932180E+04 0.31932180E+04 0.31981689E+04 + 0.31981689E+04 0.31960410E+04 0.31960410E+04 0.31888501E+04 + 0.31888501E+04 0.31827209E+04 0.31827209E+04 0.31774360E+04 + 0.31774360E+04 0.31696001E+04 0.31696001E+04 0.31641299E+04 + 0.31641299E+04 0.31660181E+04 0.31660181E+04 0.31716531E+04 + 0.31716531E+04 0.31781399E+04 0.31885210E+04 0.31899180E+04 + 0.31899180E+04 0.31928311E+04 0.31928311E+04 0.31903669E+04 + 0.31903669E+04 0.31817639E+04 0.31817639E+04 0.31736321E+04 + 0.31736321E+04 0.31701140E+04 0.31701140E+04 0.31680020E+04 + 0.31680020E+04 0.31669080E+04 0.31669080E+04 0.31687090E+04 + 0.31687090E+04 0.31727981E+04 0.31727981E+04 0.31800000E+04 + 0.31885210E+04 0.31899180E+04 0.31899180E+04 0.31928311E+04 + 0.31928311E+04 0.31903669E+04 0.31903669E+04 0.31817639E+04 + 0.31817639E+04 0.31736321E+04 0.31736321E+04 0.31701140E+04 + 0.31701140E+04 0.31680020E+04 0.31680020E+04 0.31669080E+04 + 0.31669080E+04 0.31687090E+04 0.31687090E+04 0.31727981E+04 + 0.30443970E+04 0.30434800E+04 0.31821899E+04 0.31781909E+04 + 0.31781909E+04 0.31808101E+04 0.31808101E+04 0.31795991E+04 + 0.31795991E+04 0.31733401E+04 0.31733401E+04 0.31693140E+04 + 0.31693140E+04 0.31683359E+04 0.31683359E+04 0.31682920E+04 + 0.31682920E+04 0.31682910E+04 0.31682910E+04 0.31700510E+04 + 0.31700510E+04 0.31726069E+04 0.30491160E+04 0.30448669E+04 + 0.31821899E+04 0.31781909E+04 0.31781909E+04 0.31808101E+04 + 0.31808101E+04 0.31795991E+04 0.31795991E+04 0.31733401E+04 + 0.31733401E+04 0.31693140E+04 0.31693140E+04 0.31683359E+04 + 0.31683359E+04 0.31682920E+04 0.31682920E+04 0.31682910E+04 + 0.30760759E+04 0.30725249E+04 0.30725249E+04 0.30708210E+04 + 0.30491160E+04 0.30448669E+04 0.31838230E+04 0.31719709E+04 + 0.31719709E+04 0.31712429E+04 0.31712429E+04 0.31712151E+04 + 0.31712151E+04 0.31694800E+04 0.31694800E+04 0.31678970E+04 + 0.31678970E+04 0.31663921E+04 0.31663921E+04 0.31672720E+04 + 0.31672720E+04 0.31674951E+04 0.30760081E+04 0.30738411E+04 + 0.30738411E+04 0.30712981E+04 0.30483840E+04 0.30452219E+04 + 0.31838230E+04 0.31719709E+04 0.31719709E+04 0.31712429E+04 + 0.31712429E+04 0.31712151E+04 0.31712151E+04 0.31694800E+04 + 0.31694800E+04 0.31678970E+04 0.31678970E+04 0.31663921E+04 + 0.30872571E+04 0.30828740E+04 0.30828740E+04 0.30760081E+04 + 0.30760081E+04 0.30738411E+04 0.30738411E+04 0.30712981E+04 + 0.30483840E+04 0.30452219E+04 0.31848679E+04 0.31744460E+04 + 0.31744460E+04 0.31701011E+04 0.31701011E+04 0.31677620E+04 + 0.31677620E+04 0.31658350E+04 0.31658350E+04 0.31662209E+04 + 0.31662209E+04 0.31654629E+04 0.30887080E+04 0.30847649E+04 + 0.30847649E+04 0.30795181E+04 0.30795181E+04 0.30757490E+04 + 0.30757490E+04 0.30727439E+04 0.30485439E+04 0.30453420E+04 + 0.31848679E+04 0.31744460E+04 0.31744460E+04 0.31701011E+04 + 0.31701011E+04 0.31677620E+04 0.31677620E+04 0.31658350E+04 + 0.30964341E+04 0.30927339E+04 0.30927339E+04 0.30887080E+04 + 0.30887080E+04 0.30847649E+04 0.30847649E+04 0.30795181E+04 + 0.30795181E+04 0.30757490E+04 0.30757490E+04 0.30727439E+04 + 0.30485439E+04 0.30453420E+04 0.31841489E+04 0.31774109E+04 + 0.31774109E+04 0.31716990E+04 0.31716990E+04 0.31695649E+04 + 0.31695649E+04 0.31654990E+04 0.30976340E+04 0.30938540E+04 + 0.30938540E+04 0.30910459E+04 0.30910459E+04 0.30878140E+04 + 0.30878140E+04 0.30817930E+04 0.30817930E+04 0.30766721E+04 + 0.30766721E+04 0.30735691E+04 0.30485371E+04 0.30458120E+04 + 0.31841489E+04 0.31774109E+04 0.31774109E+04 0.31716990E+04 + 0.31069331E+04 0.31030330E+04 0.31030330E+04 0.30976340E+04 + 0.30976340E+04 0.30938540E+04 0.30938540E+04 0.30910459E+04 + 0.30910459E+04 0.30878140E+04 0.30878140E+04 0.30817930E+04 + 0.30817930E+04 0.30766721E+04 0.30766721E+04 0.30735691E+04 + 0.30485371E+04 0.30458120E+04 0.31837319E+04 0.31793630E+04 + 0.31793630E+04 0.31736680E+04 0.31094509E+04 0.31041919E+04 + 0.31041919E+04 0.30989399E+04 0.30989399E+04 0.30950000E+04 + 0.30950000E+04 0.30890530E+04 0.30890530E+04 0.30845720E+04 + 0.30845720E+04 0.30823850E+04 0.30823850E+04 0.30789460E+04 + 0.30789460E+04 0.30747319E+04 0.30490349E+04 0.30460630E+04 + 0.31175049E+04 0.31143291E+04 0.31143291E+04 0.31094509E+04 + 0.31094509E+04 0.31041919E+04 0.31041919E+04 0.30989399E+04 + 0.30989399E+04 0.30950000E+04 0.30950000E+04 0.30890530E+04 + 0.30890530E+04 0.30845720E+04 0.30845720E+04 0.30823850E+04 + 0.30823850E+04 0.30789460E+04 0.30789460E+04 0.30747319E+04 + 0.30747319E+04 0.30716389E+04 0.31192639E+04 0.31165820E+04 + 0.31165820E+04 0.31137949E+04 0.31137949E+04 0.31088840E+04 + 0.31088840E+04 0.30983440E+04 0.30983440E+04 0.30912739E+04 + 0.30912739E+04 0.30867700E+04 0.30867700E+04 0.30853879E+04 + 0.30853879E+04 0.30865161E+04 0.30865161E+04 0.30820630E+04 + 0.30820630E+04 0.30764751E+04 0.30764751E+04 0.30728320E+04 + 0.31802620E+04 0.31815640E+04 0.31815640E+04 0.31838301E+04 + 0.31838301E+04 0.31830820E+04 0.31830820E+04 0.31777791E+04 + 0.31777791E+04 0.31724441E+04 0.31724441E+04 0.31744050E+04 + 0.31744050E+04 0.31797180E+04 0.31797180E+04 0.31806580E+04 + 0.31806580E+04 0.31814661E+04 0.31814661E+04 0.31868000E+04 + 0.31868000E+04 0.31942529E+04 0.31699290E+04 0.31738899E+04 + 0.31738899E+04 0.31777800E+04 0.31777800E+04 0.31770681E+04 + 0.31770681E+04 0.31741389E+04 0.31741389E+04 0.31740471E+04 + 0.31740471E+04 0.31797720E+04 0.31797720E+04 0.31853140E+04 + 0.31853140E+04 0.31855610E+04 0.31855610E+04 0.31890481E+04 + 0.31890481E+04 0.31939829E+04 0.31939829E+04 0.31995520E+04 + 0.31699290E+04 0.31738899E+04 0.31738899E+04 0.31777800E+04 + 0.31777800E+04 0.31770681E+04 0.31770681E+04 0.31741389E+04 + 0.31741389E+04 0.31740471E+04 0.31740471E+04 0.31797720E+04 + 0.31797720E+04 0.31853140E+04 0.31853140E+04 0.31855610E+04 + 0.31855610E+04 0.31890481E+04 0.31890481E+04 0.31939829E+04 + 0.31939829E+04 0.31995520E+04 0.31612400E+04 0.31643669E+04 + 0.31643669E+04 0.31667100E+04 0.31667100E+04 0.31644141E+04 + 0.31644141E+04 0.31657849E+04 0.31657849E+04 0.31709341E+04 + 0.31709341E+04 0.31782351E+04 0.31782351E+04 0.31843279E+04 + 0.31843279E+04 0.31871660E+04 0.31871660E+04 0.31928569E+04 + 0.31928569E+04 0.31981279E+04 0.31981279E+04 0.32031270E+04 + 0.31612400E+04 0.31643669E+04 0.31643669E+04 0.31667100E+04 + 0.31667100E+04 0.31644141E+04 0.31644141E+04 0.31657849E+04 + 0.31657849E+04 0.31709341E+04 0.31709341E+04 0.31782351E+04 + 0.31782351E+04 0.31843279E+04 0.31843279E+04 0.31871660E+04 + 0.31871660E+04 0.31928569E+04 0.31928569E+04 0.31981279E+04 + 0.31981279E+04 0.32031270E+04 0.31546050E+04 0.31491750E+04 + 0.31491750E+04 0.31492810E+04 0.31492810E+04 0.31518679E+04 + 0.31518679E+04 0.31631211E+04 0.31631211E+04 0.31750300E+04 + 0.31750300E+04 0.31821731E+04 0.31821731E+04 0.31849561E+04 + 0.31849561E+04 0.31885449E+04 0.31885449E+04 0.31958811E+04 + 0.31958811E+04 0.32039729E+04 0.32039729E+04 0.32108230E+04 + 0.31546050E+04 0.31491750E+04 0.31491750E+04 0.31492810E+04 + 0.31492810E+04 0.31518679E+04 0.31518679E+04 0.31631211E+04 + 0.31631211E+04 0.31750300E+04 0.31750300E+04 0.31821731E+04 + 0.31821731E+04 0.31849561E+04 0.31849561E+04 0.31885449E+04 + 0.31885449E+04 0.31958811E+04 0.31958811E+04 0.32039729E+04 + 0.32039729E+04 0.32108230E+04 0.31646060E+04 0.31590181E+04 + 0.31590181E+04 0.31597100E+04 0.31597100E+04 0.31599790E+04 + 0.31599790E+04 0.31632109E+04 0.31632109E+04 0.31691340E+04 + 0.31691340E+04 0.31738950E+04 0.31738950E+04 0.31770029E+04 + 0.31770029E+04 0.31840310E+04 0.31840310E+04 0.31952429E+04 + 0.31952429E+04 0.32062451E+04 0.32062451E+04 0.32156211E+04 + 0.31646060E+04 0.31590181E+04 0.31590181E+04 0.31597100E+04 + 0.31597100E+04 0.31599790E+04 0.31599790E+04 0.31632109E+04 + 0.31632109E+04 0.31691340E+04 0.31691340E+04 0.31738950E+04 + 0.31738950E+04 0.31770029E+04 0.31770029E+04 0.31840310E+04 + 0.31840310E+04 0.31952429E+04 0.31952429E+04 0.32062451E+04 + 0.32062451E+04 0.32156211E+04 0.31782991E+04 0.31805850E+04 + 0.31805850E+04 0.31810471E+04 0.31810471E+04 0.31766460E+04 + 0.31766460E+04 0.31691770E+04 0.31691770E+04 0.31663430E+04 + 0.31663430E+04 0.31694209E+04 0.31694209E+04 0.31739600E+04 + 0.31739600E+04 0.31795850E+04 0.31795850E+04 0.31896389E+04 + 0.31896389E+04 0.32018340E+04 0.32018340E+04 0.32138259E+04 + 0.31782991E+04 0.31805850E+04 0.31805850E+04 0.31810471E+04 + 0.31810471E+04 0.31766460E+04 0.31766460E+04 0.31691770E+04 + 0.31691770E+04 0.31663430E+04 0.31663430E+04 0.31694209E+04 + 0.31694209E+04 0.31739600E+04 0.31739600E+04 0.31795850E+04 + 0.31795850E+04 0.31896389E+04 0.31896389E+04 0.32018340E+04 + 0.32018340E+04 0.32138259E+04 0.31777290E+04 0.31861421E+04 + 0.31861421E+04 0.31880530E+04 0.31880530E+04 0.31856721E+04 + 0.31856721E+04 0.31822280E+04 0.31822280E+04 0.31786621E+04 + 0.31786621E+04 0.31771980E+04 0.31771980E+04 0.31748979E+04 + 0.31748979E+04 0.31748999E+04 0.31748999E+04 0.31817791E+04 + 0.31817791E+04 0.31932520E+04 0.31932520E+04 0.32048560E+04 + 0.31777290E+04 0.31861421E+04 0.31861421E+04 0.31880530E+04 + 0.31880530E+04 0.31856721E+04 0.31856721E+04 0.31822280E+04 + 0.31822280E+04 0.31786621E+04 0.31786621E+04 0.31771980E+04 + 0.31771980E+04 0.31748979E+04 0.31748979E+04 0.31748999E+04 + 0.31748999E+04 0.31817791E+04 0.31817791E+04 0.31932520E+04 + 0.31932520E+04 0.32048560E+04 0.31764551E+04 0.31833411E+04 + 0.31833411E+04 0.31875791E+04 0.31875791E+04 0.31864150E+04 + 0.31864150E+04 0.31854309E+04 0.31854309E+04 0.31842080E+04 + 0.31842080E+04 0.31802500E+04 0.31802500E+04 0.31724221E+04 + 0.31724221E+04 0.31696211E+04 0.31696211E+04 0.31739070E+04 + 0.31739070E+04 0.31812830E+04 0.31812830E+04 0.31886240E+04 + 0.31764551E+04 0.31833411E+04 0.31833411E+04 0.31875791E+04 + 0.31875791E+04 0.31864150E+04 0.31864150E+04 0.31854309E+04 + 0.31854309E+04 0.31842080E+04 0.31842080E+04 0.31802500E+04 + 0.31802500E+04 0.31724221E+04 0.31724221E+04 0.31696211E+04 + 0.31696211E+04 0.31739070E+04 0.31739070E+04 0.31812830E+04 + 0.31812830E+04 0.31886240E+04 0.31845500E+04 0.31873110E+04 + 0.31873110E+04 0.31939771E+04 0.31939771E+04 0.31923181E+04 + 0.31923181E+04 0.31869980E+04 0.31869980E+04 0.31835371E+04 + 0.31835371E+04 0.31794419E+04 0.31794419E+04 0.31713091E+04 + 0.31713091E+04 0.31663601E+04 0.31663601E+04 0.31698459E+04 + 0.31698459E+04 0.31746809E+04 0.31746809E+04 0.31793630E+04 + 0.31845500E+04 0.31873110E+04 0.31873110E+04 0.31939771E+04 + 0.31939771E+04 0.31923181E+04 0.31923181E+04 0.31869980E+04 + 0.31869980E+04 0.31835371E+04 0.31835371E+04 0.31794419E+04 + 0.31794419E+04 0.31713091E+04 0.31713091E+04 0.31663601E+04 + 0.31663601E+04 0.31698459E+04 0.31698459E+04 0.31746809E+04 + 0.31746809E+04 0.31793630E+04 0.31936880E+04 0.31941641E+04 + 0.31941641E+04 0.31991150E+04 0.31991150E+04 0.31971609E+04 + 0.31971609E+04 0.31899861E+04 0.31899861E+04 0.31837700E+04 + 0.31837700E+04 0.31785029E+04 0.31785029E+04 0.31706069E+04 + 0.31706069E+04 0.31648640E+04 0.31648640E+04 0.31668210E+04 + 0.31668210E+04 0.31722129E+04 0.31722129E+04 0.31785291E+04 + 0.31936880E+04 0.31941641E+04 0.31941641E+04 0.31991150E+04 + 0.31991150E+04 0.31971609E+04 0.31971609E+04 0.31899861E+04 + 0.31899861E+04 0.31837700E+04 0.31837700E+04 0.31785029E+04 + 0.31785029E+04 0.31706069E+04 0.31706069E+04 0.31648640E+04 + 0.31648640E+04 0.31668210E+04 0.31668210E+04 0.31722129E+04 + 0.31722129E+04 0.31785291E+04 0.31897241E+04 0.31909700E+04 + 0.31909700E+04 0.31938711E+04 0.31938711E+04 0.31915779E+04 + 0.31915779E+04 0.31830559E+04 0.31830559E+04 0.31749961E+04 + 0.31749961E+04 0.31712971E+04 0.31712971E+04 0.31688000E+04 + 0.31688000E+04 0.31673521E+04 0.31673521E+04 0.31689641E+04 + 0.31689641E+04 0.31732729E+04 0.31732729E+04 0.31804771E+04 + 0.31897241E+04 0.31909700E+04 0.31909700E+04 0.31938711E+04 + 0.31938711E+04 0.31915779E+04 0.31915779E+04 0.31830559E+04 + 0.31830559E+04 0.31749961E+04 0.31749961E+04 0.31712971E+04 + 0.31712971E+04 0.31688000E+04 0.31688000E+04 0.31673521E+04 + 0.31673521E+04 0.31689641E+04 0.31689641E+04 0.31732729E+04 + 0.30449871E+04 0.30441931E+04 0.31834409E+04 0.31792209E+04 + 0.31792209E+04 0.31818269E+04 0.31818269E+04 0.31807981E+04 + 0.31807981E+04 0.31746960E+04 0.31746960E+04 0.31704751E+04 + 0.31704751E+04 0.31691421E+04 0.31691421E+04 0.31687141E+04 + 0.31687141E+04 0.31687439E+04 0.31687439E+04 0.31703811E+04 + 0.31703811E+04 0.31728950E+04 0.30497241E+04 0.30455659E+04 + 0.31834409E+04 0.31792209E+04 0.31792209E+04 0.31818269E+04 + 0.31818269E+04 0.31807981E+04 0.31807981E+04 0.31746960E+04 + 0.31746960E+04 0.31704751E+04 0.31704751E+04 0.31691421E+04 + 0.31691421E+04 0.31687141E+04 0.31687141E+04 0.31687439E+04 + 0.30773640E+04 0.30738530E+04 0.30738530E+04 0.30721899E+04 + 0.30497241E+04 0.30455659E+04 0.31852949E+04 0.31731321E+04 + 0.31731321E+04 0.31722300E+04 0.31722300E+04 0.31720271E+04 + 0.31720271E+04 0.31701001E+04 0.31701001E+04 0.31682639E+04 + 0.31682639E+04 0.31669541E+04 0.31669541E+04 0.31677849E+04 + 0.31677849E+04 0.31679551E+04 0.30771550E+04 0.30751509E+04 + 0.30751509E+04 0.30727070E+04 0.30490371E+04 0.30459250E+04 + 0.31852949E+04 0.31731321E+04 0.31731321E+04 0.31722300E+04 + 0.31722300E+04 0.31720271E+04 0.31720271E+04 0.31701001E+04 + 0.31701001E+04 0.31682639E+04 0.31682639E+04 0.31669541E+04 + 0.30884790E+04 0.30841311E+04 0.30841311E+04 0.30771550E+04 + 0.30771550E+04 0.30751509E+04 0.30751509E+04 0.30727070E+04 + 0.30490371E+04 0.30459250E+04 0.31860281E+04 0.31751831E+04 + 0.31751831E+04 0.31705500E+04 0.31705500E+04 0.31683579E+04 + 0.31683579E+04 0.31664121E+04 0.31664121E+04 0.31666360E+04 + 0.31666360E+04 0.31658269E+04 0.30899170E+04 0.30860640E+04 + 0.30860640E+04 0.30808931E+04 0.30808931E+04 0.30771311E+04 + 0.30771311E+04 0.30741709E+04 0.30492290E+04 0.30460901E+04 + 0.31860281E+04 0.31751831E+04 0.31751831E+04 0.31705500E+04 + 0.31705500E+04 0.31683579E+04 0.31683579E+04 0.31664121E+04 + 0.30975100E+04 0.30938511E+04 0.30938511E+04 0.30899170E+04 + 0.30899170E+04 0.30860640E+04 0.30860640E+04 0.30808931E+04 + 0.30808931E+04 0.30771311E+04 0.30771311E+04 0.30741709E+04 + 0.30492290E+04 0.30460901E+04 0.31851111E+04 0.31781870E+04 + 0.31781870E+04 0.31723091E+04 0.31723091E+04 0.31701379E+04 + 0.31701379E+04 0.31661360E+04 0.30987510E+04 0.30950271E+04 + 0.30950271E+04 0.30922839E+04 0.30922839E+04 0.30891340E+04 + 0.30891340E+04 0.30831509E+04 0.30831509E+04 0.30780930E+04 + 0.30780930E+04 0.30750090E+04 0.30492419E+04 0.30465669E+04 + 0.31851111E+04 0.31781870E+04 0.31781870E+04 0.31723091E+04 + 0.31079619E+04 0.31040891E+04 0.31040891E+04 0.30987510E+04 + 0.30987510E+04 0.30950271E+04 0.30950271E+04 0.30922839E+04 + 0.30922839E+04 0.30891340E+04 0.30891340E+04 0.30831509E+04 + 0.30831509E+04 0.30780930E+04 0.30780930E+04 0.30750090E+04 + 0.30492419E+04 0.30465669E+04 0.31847620E+04 0.31801479E+04 + 0.31801479E+04 0.31744070E+04 0.31104690E+04 0.31053259E+04 + 0.31053259E+04 0.31001499E+04 0.31001499E+04 0.30962151E+04 + 0.30962151E+04 0.30903311E+04 0.30903311E+04 0.30859399E+04 + 0.30859399E+04 0.30837161E+04 0.30837161E+04 0.30803220E+04 + 0.30803220E+04 0.30761521E+04 0.30497620E+04 0.30468821E+04 + 0.31184170E+04 0.31152620E+04 0.31152620E+04 0.31104690E+04 + 0.31104690E+04 0.31053259E+04 0.31053259E+04 0.31001499E+04 + 0.31001499E+04 0.30962151E+04 0.30962151E+04 0.30903311E+04 + 0.30903311E+04 0.30859399E+04 0.30859399E+04 0.30837161E+04 + 0.30837161E+04 0.30803220E+04 0.30803220E+04 0.30761521E+04 + 0.30761521E+04 0.30731169E+04 0.31201780E+04 0.31175249E+04 + 0.31175249E+04 0.31148220E+04 0.31148220E+04 0.31100420E+04 + 0.31100420E+04 0.30995471E+04 0.30995471E+04 0.30924460E+04 + 0.30924460E+04 0.30879419E+04 0.30879419E+04 0.30866509E+04 + 0.30866509E+04 0.30877871E+04 0.30877871E+04 0.30834529E+04 + 0.30834529E+04 0.30778770E+04 0.30778770E+04 0.30742520E+04 + 0.31802620E+04 0.31815640E+04 0.31815640E+04 0.31838301E+04 + 0.31838301E+04 0.31830820E+04 0.31830820E+04 0.31777791E+04 + 0.31777791E+04 0.31724441E+04 0.31724441E+04 0.31744050E+04 + 0.31744050E+04 0.31797180E+04 0.31797180E+04 0.31806580E+04 + 0.31806580E+04 0.31814661E+04 0.31814661E+04 0.31868000E+04 + 0.31868000E+04 0.31942529E+04 0.31699290E+04 0.31738899E+04 + 0.31738899E+04 0.31777800E+04 0.31777800E+04 0.31770681E+04 + 0.31770681E+04 0.31741389E+04 0.31741389E+04 0.31740471E+04 + 0.31740471E+04 0.31797720E+04 0.31797720E+04 0.31853140E+04 + 0.31853140E+04 0.31855610E+04 0.31855610E+04 0.31890481E+04 + 0.31890481E+04 0.31939829E+04 0.31939829E+04 0.31995520E+04 + 0.31699290E+04 0.31738899E+04 0.31738899E+04 0.31777800E+04 + 0.31777800E+04 0.31770681E+04 0.31770681E+04 0.31741389E+04 + 0.31741389E+04 0.31740471E+04 0.31740471E+04 0.31797720E+04 + 0.31797720E+04 0.31853140E+04 0.31853140E+04 0.31855610E+04 + 0.31855610E+04 0.31890481E+04 0.31890481E+04 0.31939829E+04 + 0.31939829E+04 0.31995520E+04 0.31612400E+04 0.31643669E+04 + 0.31643669E+04 0.31667100E+04 0.31667100E+04 0.31644141E+04 + 0.31644141E+04 0.31657849E+04 0.31657849E+04 0.31709341E+04 + 0.31709341E+04 0.31782351E+04 0.31782351E+04 0.31843279E+04 + 0.31843279E+04 0.31871660E+04 0.31871660E+04 0.31928569E+04 + 0.31928569E+04 0.31981279E+04 0.31981279E+04 0.32031270E+04 + 0.31612400E+04 0.31643669E+04 0.31643669E+04 0.31667100E+04 + 0.31667100E+04 0.31644141E+04 0.31644141E+04 0.31657849E+04 + 0.31657849E+04 0.31709341E+04 0.31709341E+04 0.31782351E+04 + 0.31782351E+04 0.31843279E+04 0.31843279E+04 0.31871660E+04 + 0.31871660E+04 0.31928569E+04 0.31928569E+04 0.31981279E+04 + 0.31981279E+04 0.32031270E+04 0.31546050E+04 0.31491750E+04 + 0.31491750E+04 0.31492810E+04 0.31492810E+04 0.31518679E+04 + 0.31518679E+04 0.31631211E+04 0.31631211E+04 0.31750300E+04 + 0.31750300E+04 0.31821731E+04 0.31821731E+04 0.31849561E+04 + 0.31849561E+04 0.31885449E+04 0.31885449E+04 0.31958811E+04 + 0.31958811E+04 0.32039729E+04 0.32039729E+04 0.32108230E+04 + 0.31546050E+04 0.31491750E+04 0.31491750E+04 0.31492810E+04 + 0.31492810E+04 0.31518679E+04 0.31518679E+04 0.31631211E+04 + 0.31631211E+04 0.31750300E+04 0.31750300E+04 0.31821731E+04 + 0.31821731E+04 0.31849561E+04 0.31849561E+04 0.31885449E+04 + 0.31885449E+04 0.31958811E+04 0.31958811E+04 0.32039729E+04 + 0.32039729E+04 0.32108230E+04 0.31646060E+04 0.31590181E+04 + 0.31590181E+04 0.31597100E+04 0.31597100E+04 0.31599790E+04 + 0.31599790E+04 0.31632109E+04 0.31632109E+04 0.31691340E+04 + 0.31691340E+04 0.31738950E+04 0.31738950E+04 0.31770029E+04 + 0.31770029E+04 0.31840310E+04 0.31840310E+04 0.31952429E+04 + 0.31952429E+04 0.32062451E+04 0.32062451E+04 0.32156211E+04 + 0.31646060E+04 0.31590181E+04 0.31590181E+04 0.31597100E+04 + 0.31597100E+04 0.31599790E+04 0.31599790E+04 0.31632109E+04 + 0.31632109E+04 0.31691340E+04 0.31691340E+04 0.31738950E+04 + 0.31738950E+04 0.31770029E+04 0.31770029E+04 0.31840310E+04 + 0.31840310E+04 0.31952429E+04 0.31952429E+04 0.32062451E+04 + 0.32062451E+04 0.32156211E+04 0.31782991E+04 0.31805850E+04 + 0.31805850E+04 0.31810471E+04 0.31810471E+04 0.31766460E+04 + 0.31766460E+04 0.31691770E+04 0.31691770E+04 0.31663430E+04 + 0.31663430E+04 0.31694209E+04 0.31694209E+04 0.31739600E+04 + 0.31739600E+04 0.31795850E+04 0.31795850E+04 0.31896389E+04 + 0.31896389E+04 0.32018340E+04 0.32018340E+04 0.32138259E+04 + 0.31782991E+04 0.31805850E+04 0.31805850E+04 0.31810471E+04 + 0.31810471E+04 0.31766460E+04 0.31766460E+04 0.31691770E+04 + 0.31691770E+04 0.31663430E+04 0.31663430E+04 0.31694209E+04 + 0.31694209E+04 0.31739600E+04 0.31739600E+04 0.31795850E+04 + 0.31795850E+04 0.31896389E+04 0.31896389E+04 0.32018340E+04 + 0.32018340E+04 0.32138259E+04 0.31777290E+04 0.31861421E+04 + 0.31861421E+04 0.31880530E+04 0.31880530E+04 0.31856721E+04 + 0.31856721E+04 0.31822280E+04 0.31822280E+04 0.31786621E+04 + 0.31786621E+04 0.31771980E+04 0.31771980E+04 0.31748979E+04 + 0.31748979E+04 0.31748999E+04 0.31748999E+04 0.31817791E+04 + 0.31817791E+04 0.31932520E+04 0.31932520E+04 0.32048560E+04 + 0.31777290E+04 0.31861421E+04 0.31861421E+04 0.31880530E+04 + 0.31880530E+04 0.31856721E+04 0.31856721E+04 0.31822280E+04 + 0.31822280E+04 0.31786621E+04 0.31786621E+04 0.31771980E+04 + 0.31771980E+04 0.31748979E+04 0.31748979E+04 0.31748999E+04 + 0.31748999E+04 0.31817791E+04 0.31817791E+04 0.31932520E+04 + 0.31932520E+04 0.32048560E+04 0.31764551E+04 0.31833411E+04 + 0.31833411E+04 0.31875791E+04 0.31875791E+04 0.31864150E+04 + 0.31864150E+04 0.31854309E+04 0.31854309E+04 0.31842080E+04 + 0.31842080E+04 0.31802500E+04 0.31802500E+04 0.31724221E+04 + 0.31724221E+04 0.31696211E+04 0.31696211E+04 0.31739070E+04 + 0.31739070E+04 0.31812830E+04 0.31812830E+04 0.31886240E+04 + 0.31764551E+04 0.31833411E+04 0.31833411E+04 0.31875791E+04 + 0.31875791E+04 0.31864150E+04 0.31864150E+04 0.31854309E+04 + 0.31854309E+04 0.31842080E+04 0.31842080E+04 0.31802500E+04 + 0.31802500E+04 0.31724221E+04 0.31724221E+04 0.31696211E+04 + 0.31696211E+04 0.31739070E+04 0.31739070E+04 0.31812830E+04 + 0.31812830E+04 0.31886240E+04 0.31845500E+04 0.31873110E+04 + 0.31873110E+04 0.31939771E+04 0.31939771E+04 0.31923181E+04 + 0.31923181E+04 0.31869980E+04 0.31869980E+04 0.31835371E+04 + 0.31835371E+04 0.31794419E+04 0.31794419E+04 0.31713091E+04 + 0.31713091E+04 0.31663601E+04 0.31663601E+04 0.31698459E+04 + 0.31698459E+04 0.31746809E+04 0.31746809E+04 0.31793630E+04 + 0.31845500E+04 0.31873110E+04 0.31873110E+04 0.31939771E+04 + 0.31939771E+04 0.31923181E+04 0.31923181E+04 0.31869980E+04 + 0.31869980E+04 0.31835371E+04 0.31835371E+04 0.31794419E+04 + 0.31794419E+04 0.31713091E+04 0.31713091E+04 0.31663601E+04 + 0.31663601E+04 0.31698459E+04 0.31698459E+04 0.31746809E+04 + 0.31746809E+04 0.31793630E+04 0.31936880E+04 0.31941641E+04 + 0.31941641E+04 0.31991150E+04 0.31991150E+04 0.31971609E+04 + 0.31971609E+04 0.31899861E+04 0.31899861E+04 0.31837700E+04 + 0.31837700E+04 0.31785029E+04 0.31785029E+04 0.31706069E+04 + 0.31706069E+04 0.31648640E+04 0.31648640E+04 0.31668210E+04 + 0.31668210E+04 0.31722129E+04 0.31722129E+04 0.31785291E+04 + 0.31936880E+04 0.31941641E+04 0.31941641E+04 0.31991150E+04 + 0.31991150E+04 0.31971609E+04 0.31971609E+04 0.31899861E+04 + 0.31899861E+04 0.31837700E+04 0.31837700E+04 0.31785029E+04 + 0.31785029E+04 0.31706069E+04 0.31706069E+04 0.31648640E+04 + 0.31648640E+04 0.31668210E+04 0.31668210E+04 0.31722129E+04 + 0.31722129E+04 0.31785291E+04 0.31897241E+04 0.31909700E+04 + 0.31909700E+04 0.31938711E+04 0.31938711E+04 0.31915779E+04 + 0.31915779E+04 0.31830559E+04 0.31830559E+04 0.31749961E+04 + 0.31749961E+04 0.31712971E+04 0.31712971E+04 0.31688000E+04 + 0.31688000E+04 0.31673521E+04 0.31673521E+04 0.31689641E+04 + 0.31689641E+04 0.31732729E+04 0.31732729E+04 0.31804771E+04 + 0.31897241E+04 0.31909700E+04 0.31909700E+04 0.31938711E+04 + 0.31938711E+04 0.31915779E+04 0.31915779E+04 0.31830559E+04 + 0.31830559E+04 0.31749961E+04 0.31749961E+04 0.31712971E+04 + 0.31712971E+04 0.31688000E+04 0.31688000E+04 0.31673521E+04 + 0.31673521E+04 0.31689641E+04 0.31689641E+04 0.31732729E+04 + 0.30449871E+04 0.30441931E+04 0.31834409E+04 0.31792209E+04 + 0.31792209E+04 0.31818269E+04 0.31818269E+04 0.31807981E+04 + 0.31807981E+04 0.31746960E+04 0.31746960E+04 0.31704751E+04 + 0.31704751E+04 0.31691421E+04 0.31691421E+04 0.31687141E+04 + 0.31687141E+04 0.31687439E+04 0.31687439E+04 0.31703811E+04 + 0.31703811E+04 0.31728950E+04 0.30497241E+04 0.30455659E+04 + 0.31834409E+04 0.31792209E+04 0.31792209E+04 0.31818269E+04 + 0.31818269E+04 0.31807981E+04 0.31807981E+04 0.31746960E+04 + 0.31746960E+04 0.31704751E+04 0.31704751E+04 0.31691421E+04 + 0.31691421E+04 0.31687141E+04 0.31687141E+04 0.31687439E+04 + 0.30773640E+04 0.30738530E+04 0.30738530E+04 0.30721899E+04 + 0.30497241E+04 0.30455659E+04 0.31852949E+04 0.31731321E+04 + 0.31731321E+04 0.31722300E+04 0.31722300E+04 0.31720271E+04 + 0.31720271E+04 0.31701001E+04 0.31701001E+04 0.31682639E+04 + 0.31682639E+04 0.31669541E+04 0.31669541E+04 0.31677849E+04 + 0.31677849E+04 0.31679551E+04 0.30771550E+04 0.30751509E+04 + 0.30751509E+04 0.30727070E+04 0.30490371E+04 0.30459250E+04 + 0.31852949E+04 0.31731321E+04 0.31731321E+04 0.31722300E+04 + 0.31722300E+04 0.31720271E+04 0.31720271E+04 0.31701001E+04 + 0.31701001E+04 0.31682639E+04 0.31682639E+04 0.31669541E+04 + 0.30884790E+04 0.30841311E+04 0.30841311E+04 0.30771550E+04 + 0.30771550E+04 0.30751509E+04 0.30751509E+04 0.30727070E+04 + 0.30490371E+04 0.30459250E+04 0.31860281E+04 0.31751831E+04 + 0.31751831E+04 0.31705500E+04 0.31705500E+04 0.31683579E+04 + 0.31683579E+04 0.31664121E+04 0.31664121E+04 0.31666360E+04 + 0.31666360E+04 0.31658269E+04 0.30899170E+04 0.30860640E+04 + 0.30860640E+04 0.30808931E+04 0.30808931E+04 0.30771311E+04 + 0.30771311E+04 0.30741709E+04 0.30492290E+04 0.30460901E+04 + 0.31860281E+04 0.31751831E+04 0.31751831E+04 0.31705500E+04 + 0.31705500E+04 0.31683579E+04 0.31683579E+04 0.31664121E+04 + 0.30975100E+04 0.30938511E+04 0.30938511E+04 0.30899170E+04 + 0.30899170E+04 0.30860640E+04 0.30860640E+04 0.30808931E+04 + 0.30808931E+04 0.30771311E+04 0.30771311E+04 0.30741709E+04 + 0.30492290E+04 0.30460901E+04 0.31851111E+04 0.31781870E+04 + 0.31781870E+04 0.31723091E+04 0.31723091E+04 0.31701379E+04 + 0.31701379E+04 0.31661360E+04 0.30987510E+04 0.30950271E+04 + 0.30950271E+04 0.30922839E+04 0.30922839E+04 0.30891340E+04 + 0.30891340E+04 0.30831509E+04 0.30831509E+04 0.30780930E+04 + 0.30780930E+04 0.30750090E+04 0.30492419E+04 0.30465669E+04 + 0.31851111E+04 0.31781870E+04 0.31781870E+04 0.31723091E+04 + 0.31079619E+04 0.31040891E+04 0.31040891E+04 0.30987510E+04 + 0.30987510E+04 0.30950271E+04 0.30950271E+04 0.30922839E+04 + 0.30922839E+04 0.30891340E+04 0.30891340E+04 0.30831509E+04 + 0.30831509E+04 0.30780930E+04 0.30780930E+04 0.30750090E+04 + 0.30492419E+04 0.30465669E+04 0.31847620E+04 0.31801479E+04 + 0.31801479E+04 0.31744070E+04 0.31104690E+04 0.31053259E+04 + 0.31053259E+04 0.31001499E+04 0.31001499E+04 0.30962151E+04 + 0.30962151E+04 0.30903311E+04 0.30903311E+04 0.30859399E+04 + 0.30859399E+04 0.30837161E+04 0.30837161E+04 0.30803220E+04 + 0.30803220E+04 0.30761521E+04 0.30497620E+04 0.30468821E+04 + 0.31184170E+04 0.31152620E+04 0.31152620E+04 0.31104690E+04 + 0.31104690E+04 0.31053259E+04 0.31053259E+04 0.31001499E+04 + 0.31001499E+04 0.30962151E+04 0.30962151E+04 0.30903311E+04 + 0.30903311E+04 0.30859399E+04 0.30859399E+04 0.30837161E+04 + 0.30837161E+04 0.30803220E+04 0.30803220E+04 0.30761521E+04 + 0.30761521E+04 0.30731169E+04 0.31201780E+04 0.31175249E+04 + 0.31175249E+04 0.31148220E+04 0.31148220E+04 0.31100420E+04 + 0.31100420E+04 0.30995471E+04 0.30995471E+04 0.30924460E+04 + 0.30924460E+04 0.30879419E+04 0.30879419E+04 0.30866509E+04 + 0.30866509E+04 0.30877871E+04 0.30877871E+04 0.30834529E+04 + 0.30834529E+04 0.30778770E+04 0.30778770E+04 0.30742520E+04 + 0.31826450E+04 0.31837610E+04 0.31837610E+04 0.31860950E+04 + 0.31860950E+04 0.31854561E+04 0.31854561E+04 0.31801780E+04 + 0.31801780E+04 0.31746169E+04 0.31746169E+04 0.31763010E+04 + 0.31763010E+04 0.31816431E+04 0.31816431E+04 0.31827610E+04 + 0.31827610E+04 0.31835359E+04 0.31835359E+04 0.31888230E+04 + 0.31888230E+04 0.31962290E+04 0.31723201E+04 0.31760940E+04 + 0.31760940E+04 0.31800901E+04 0.31800901E+04 0.31795190E+04 + 0.31795190E+04 0.31765291E+04 0.31765291E+04 0.31761809E+04 + 0.31761809E+04 0.31817251E+04 0.31817251E+04 0.31874331E+04 + 0.31874331E+04 0.31877380E+04 0.31877380E+04 0.31911621E+04 + 0.31911621E+04 0.31960540E+04 0.31960540E+04 0.32014460E+04 + 0.31723201E+04 0.31760940E+04 0.31760940E+04 0.31800901E+04 + 0.31800901E+04 0.31795190E+04 0.31795190E+04 0.31765291E+04 + 0.31765291E+04 0.31761809E+04 0.31761809E+04 0.31817251E+04 + 0.31817251E+04 0.31874331E+04 0.31874331E+04 0.31877380E+04 + 0.31877380E+04 0.31911621E+04 0.31911621E+04 0.31960540E+04 + 0.31960540E+04 0.32014460E+04 0.31636750E+04 0.31667949E+04 + 0.31667949E+04 0.31691960E+04 0.31691960E+04 0.31667830E+04 + 0.31667830E+04 0.31677639E+04 0.31677639E+04 0.31726440E+04 + 0.31726440E+04 0.31798940E+04 0.31798940E+04 0.31861699E+04 + 0.31861699E+04 0.31890779E+04 0.31890779E+04 0.31947561E+04 + 0.31947561E+04 0.31999160E+04 0.31999160E+04 0.32046211E+04 + 0.31636750E+04 0.31667949E+04 0.31667949E+04 0.31691960E+04 + 0.31691960E+04 0.31667830E+04 0.31667830E+04 0.31677639E+04 + 0.31677639E+04 0.31726440E+04 0.31726440E+04 0.31798940E+04 + 0.31798940E+04 0.31861699E+04 0.31861699E+04 0.31890779E+04 + 0.31890779E+04 0.31947561E+04 0.31947561E+04 0.31999160E+04 + 0.31999160E+04 0.32046211E+04 0.31564280E+04 0.31509131E+04 + 0.31509131E+04 0.31509541E+04 0.31509541E+04 0.31533110E+04 + 0.31533110E+04 0.31644509E+04 0.31644509E+04 0.31763501E+04 + 0.31763501E+04 0.31836641E+04 0.31836641E+04 0.31865449E+04 + 0.31865449E+04 0.31900620E+04 0.31900620E+04 0.31972319E+04 + 0.31972319E+04 0.32051399E+04 0.32051399E+04 0.32118291E+04 + 0.31564280E+04 0.31509131E+04 0.31509131E+04 0.31509541E+04 + 0.31509541E+04 0.31533110E+04 0.31533110E+04 0.31644509E+04 + 0.31644509E+04 0.31763501E+04 0.31763501E+04 0.31836641E+04 + 0.31836641E+04 0.31865449E+04 0.31865449E+04 0.31900620E+04 + 0.31900620E+04 0.31972319E+04 0.31972319E+04 0.32051399E+04 + 0.32051399E+04 0.32118291E+04 0.31656880E+04 0.31601179E+04 + 0.31601179E+04 0.31609771E+04 0.31609771E+04 0.31612920E+04 + 0.31612920E+04 0.31644910E+04 0.31644910E+04 0.31703660E+04 + 0.31703660E+04 0.31750879E+04 0.31750879E+04 0.31780879E+04 + 0.31780879E+04 0.31850291E+04 0.31850291E+04 0.31962029E+04 + 0.31962029E+04 0.32071650E+04 0.32071650E+04 0.32165291E+04 + 0.31656880E+04 0.31601179E+04 0.31601179E+04 0.31609771E+04 + 0.31609771E+04 0.31612920E+04 0.31612920E+04 0.31644910E+04 + 0.31644910E+04 0.31703660E+04 0.31703660E+04 0.31750879E+04 + 0.31750879E+04 0.31780879E+04 0.31780879E+04 0.31850291E+04 + 0.31850291E+04 0.31962029E+04 0.31962029E+04 0.32071650E+04 + 0.32071650E+04 0.32165291E+04 0.31794409E+04 0.31816011E+04 + 0.31816011E+04 0.31821150E+04 0.31821150E+04 0.31777881E+04 + 0.31777881E+04 0.31702690E+04 0.31702690E+04 0.31672871E+04 + 0.31672871E+04 0.31703101E+04 0.31703101E+04 0.31749290E+04 + 0.31749290E+04 0.31804399E+04 0.31804399E+04 0.31904409E+04 + 0.31904409E+04 0.32026641E+04 0.32026641E+04 0.32146851E+04 + 0.31794409E+04 0.31816011E+04 0.31816011E+04 0.31821150E+04 + 0.31821150E+04 0.31777881E+04 0.31777881E+04 0.31702690E+04 + 0.31702690E+04 0.31672871E+04 0.31672871E+04 0.31703101E+04 + 0.31703101E+04 0.31749290E+04 0.31749290E+04 0.31804399E+04 + 0.31804399E+04 0.31904409E+04 0.31904409E+04 0.32026641E+04 + 0.32026641E+04 0.32146851E+04 0.31786489E+04 0.31870601E+04 + 0.31870601E+04 0.31891790E+04 0.31891790E+04 0.31868250E+04 + 0.31868250E+04 0.31832881E+04 0.31832881E+04 0.31795840E+04 + 0.31795840E+04 0.31781250E+04 0.31781250E+04 0.31758230E+04 + 0.31758230E+04 0.31756460E+04 0.31756460E+04 0.31825300E+04 + 0.31825300E+04 0.31941660E+04 0.31941660E+04 0.32059431E+04 + 0.31786489E+04 0.31870601E+04 0.31870601E+04 0.31891790E+04 + 0.31891790E+04 0.31868250E+04 0.31868250E+04 0.31832881E+04 + 0.31832881E+04 0.31795840E+04 0.31795840E+04 0.31781250E+04 + 0.31781250E+04 0.31758230E+04 0.31758230E+04 0.31756460E+04 + 0.31756460E+04 0.31825300E+04 0.31825300E+04 0.31941660E+04 + 0.31941660E+04 0.32059431E+04 0.31772949E+04 0.31842490E+04 + 0.31842490E+04 0.31886001E+04 0.31886001E+04 0.31874680E+04 + 0.31874680E+04 0.31864241E+04 0.31864241E+04 0.31851919E+04 + 0.31851919E+04 0.31813401E+04 0.31813401E+04 0.31734189E+04 + 0.31734189E+04 0.31704541E+04 0.31704541E+04 0.31746699E+04 + 0.31746699E+04 0.31821479E+04 0.31821479E+04 0.31896860E+04 + 0.31772949E+04 0.31842490E+04 0.31842490E+04 0.31886001E+04 + 0.31886001E+04 0.31874680E+04 0.31874680E+04 0.31864241E+04 + 0.31864241E+04 0.31851919E+04 0.31851919E+04 0.31813401E+04 + 0.31813401E+04 0.31734189E+04 0.31734189E+04 0.31704541E+04 + 0.31704541E+04 0.31746699E+04 0.31746699E+04 0.31821479E+04 + 0.31821479E+04 0.31896860E+04 0.31854600E+04 0.31881250E+04 + 0.31881250E+04 0.31948750E+04 0.31948750E+04 0.31933689E+04 + 0.31933689E+04 0.31880010E+04 0.31880010E+04 0.31845149E+04 + 0.31845149E+04 0.31805110E+04 0.31805110E+04 0.31723450E+04 + 0.31723450E+04 0.31671951E+04 0.31671951E+04 0.31706379E+04 + 0.31706379E+04 0.31754580E+04 0.31754580E+04 0.31801260E+04 + 0.31854600E+04 0.31881250E+04 0.31881250E+04 0.31948750E+04 + 0.31948750E+04 0.31933689E+04 0.31933689E+04 0.31880010E+04 + 0.31880010E+04 0.31845149E+04 0.31845149E+04 0.31805110E+04 + 0.31805110E+04 0.31723450E+04 0.31723450E+04 0.31671951E+04 + 0.31671951E+04 0.31706379E+04 0.31706379E+04 0.31754580E+04 + 0.31754580E+04 0.31801260E+04 0.31948401E+04 0.31951111E+04 + 0.31951111E+04 0.32000601E+04 0.32000601E+04 0.31982810E+04 + 0.31982810E+04 0.31911221E+04 0.31911221E+04 0.31848191E+04 + 0.31848191E+04 0.31795710E+04 0.31795710E+04 0.31716150E+04 + 0.31716150E+04 0.31655991E+04 0.31655991E+04 0.31676250E+04 + 0.31676250E+04 0.31727729E+04 0.31727729E+04 0.31789170E+04 + 0.31948401E+04 0.31951111E+04 0.31951111E+04 0.32000601E+04 + 0.32000601E+04 0.31982810E+04 0.31982810E+04 0.31911221E+04 + 0.31911221E+04 0.31848191E+04 0.31848191E+04 0.31795710E+04 + 0.31795710E+04 0.31716150E+04 0.31716150E+04 0.31655991E+04 + 0.31655991E+04 0.31676250E+04 0.31676250E+04 0.31727729E+04 + 0.31727729E+04 0.31789170E+04 0.31909280E+04 0.31920220E+04 + 0.31920220E+04 0.31949121E+04 0.31949121E+04 0.31927881E+04 + 0.31927881E+04 0.31843479E+04 0.31843479E+04 0.31763601E+04 + 0.31763601E+04 0.31724800E+04 0.31724800E+04 0.31695969E+04 + 0.31695969E+04 0.31677959E+04 0.31677959E+04 0.31692190E+04 + 0.31692190E+04 0.31737471E+04 0.31737471E+04 0.31809541E+04 + 0.31909280E+04 0.31920220E+04 0.31920220E+04 0.31949121E+04 + 0.31949121E+04 0.31927881E+04 0.31927881E+04 0.31843479E+04 + 0.31843479E+04 0.31763601E+04 0.31763601E+04 0.31724800E+04 + 0.31724800E+04 0.31695969E+04 0.31695969E+04 0.31677959E+04 + 0.31677959E+04 0.31692190E+04 0.31692190E+04 0.31737471E+04 + 0.30455769E+04 0.30449070E+04 0.31846931E+04 0.31802520E+04 + 0.31802520E+04 0.31828440E+04 0.31828440E+04 0.31819961E+04 + 0.31819961E+04 0.31760520E+04 0.31760520E+04 0.31716350E+04 + 0.31716350E+04 0.31699480E+04 0.31699480E+04 0.31691360E+04 + 0.31691360E+04 0.31691970E+04 0.31691970E+04 0.31707119E+04 + 0.31707119E+04 0.31731841E+04 0.30503311E+04 0.30462649E+04 + 0.31846931E+04 0.31802520E+04 0.31802520E+04 0.31828440E+04 + 0.31828440E+04 0.31819961E+04 0.31819961E+04 0.31760520E+04 + 0.31760520E+04 0.31716350E+04 0.31716350E+04 0.31699480E+04 + 0.31699480E+04 0.31691360E+04 0.31691360E+04 0.31691970E+04 + 0.30786521E+04 0.30751799E+04 0.30751799E+04 0.30735601E+04 + 0.30503311E+04 0.30462649E+04 0.31867661E+04 0.31742939E+04 + 0.31742939E+04 0.31732180E+04 0.31732180E+04 0.31728379E+04 + 0.31728379E+04 0.31707200E+04 0.31707200E+04 0.31686311E+04 + 0.31686311E+04 0.31675149E+04 0.31675149E+04 0.31682981E+04 + 0.31682981E+04 0.31684150E+04 0.30783020E+04 0.30764619E+04 + 0.30764619E+04 0.30741150E+04 0.30496909E+04 0.30466279E+04 + 0.31867661E+04 0.31742939E+04 0.31742939E+04 0.31732180E+04 + 0.31732180E+04 0.31728379E+04 0.31728379E+04 0.31707200E+04 + 0.31707200E+04 0.31686311E+04 0.31686311E+04 0.31675149E+04 + 0.30897009E+04 0.30853889E+04 0.30853889E+04 0.30783020E+04 + 0.30783020E+04 0.30764619E+04 0.30764619E+04 0.30741150E+04 + 0.30496909E+04 0.30466279E+04 0.31871870E+04 0.31759199E+04 + 0.31759199E+04 0.31710000E+04 0.31710000E+04 0.31689529E+04 + 0.31689529E+04 0.31669880E+04 0.31669880E+04 0.31670520E+04 + 0.31670520E+04 0.31661909E+04 0.30911260E+04 0.30873630E+04 + 0.30873630E+04 0.30822681E+04 0.30822681E+04 0.30785120E+04 + 0.30785120E+04 0.30755991E+04 0.30499131E+04 0.30468379E+04 + 0.31871870E+04 0.31759199E+04 0.31759199E+04 0.31710000E+04 + 0.31710000E+04 0.31689529E+04 0.31689529E+04 0.31669880E+04 + 0.30985869E+04 0.30949680E+04 0.30949680E+04 0.30911260E+04 + 0.30911260E+04 0.30873630E+04 0.30873630E+04 0.30822681E+04 + 0.30822681E+04 0.30785120E+04 0.30785120E+04 0.30755991E+04 + 0.30499131E+04 0.30468379E+04 0.31860720E+04 0.31789629E+04 + 0.31789629E+04 0.31729189E+04 0.31729189E+04 0.31707119E+04 + 0.31707119E+04 0.31667729E+04 0.30998679E+04 0.30962000E+04 + 0.30962000E+04 0.30935220E+04 0.30935220E+04 0.30904529E+04 + 0.30904529E+04 0.30845100E+04 0.30845100E+04 0.30795139E+04 + 0.30795139E+04 0.30764500E+04 0.30499470E+04 0.30473220E+04 + 0.31860720E+04 0.31789629E+04 0.31789629E+04 0.31729189E+04 + 0.31089919E+04 0.31051440E+04 0.31051440E+04 0.30998679E+04 + 0.30998679E+04 0.30962000E+04 0.30962000E+04 0.30935220E+04 + 0.30935220E+04 0.30904529E+04 0.30904529E+04 0.30845100E+04 + 0.30845100E+04 0.30795139E+04 0.30795139E+04 0.30764500E+04 + 0.30499470E+04 0.30473220E+04 0.31857920E+04 0.31809331E+04 + 0.31809331E+04 0.31751460E+04 0.31114880E+04 0.31064600E+04 + 0.31064600E+04 0.31013611E+04 0.31013611E+04 0.30974299E+04 + 0.30974299E+04 0.30916079E+04 0.30916079E+04 0.30873081E+04 + 0.30873081E+04 0.30850481E+04 0.30850481E+04 0.30816980E+04 + 0.30816980E+04 0.30775720E+04 0.30504890E+04 0.30477009E+04 + 0.31193301E+04 0.31161941E+04 0.31161941E+04 0.31114880E+04 + 0.31114880E+04 0.31064600E+04 0.31064600E+04 0.31013611E+04 + 0.31013611E+04 0.30974299E+04 0.30974299E+04 0.30916079E+04 + 0.30916079E+04 0.30873081E+04 0.30873081E+04 0.30850481E+04 + 0.30850481E+04 0.30816980E+04 0.30816980E+04 0.30775720E+04 + 0.30775720E+04 0.30745950E+04 0.31210930E+04 0.31184670E+04 + 0.31184670E+04 0.31158501E+04 0.31158501E+04 0.31112000E+04 + 0.31112000E+04 0.31007500E+04 0.31007500E+04 0.30936179E+04 + 0.30936179E+04 0.30891140E+04 0.30891140E+04 0.30879150E+04 + 0.30879150E+04 0.30890591E+04 0.30890591E+04 0.30848440E+04 + 0.30848440E+04 0.30792800E+04 0.30792800E+04 0.30756741E+04 + 0.31826450E+04 0.31837610E+04 0.31837610E+04 0.31860950E+04 + 0.31860950E+04 0.31854561E+04 0.31854561E+04 0.31801780E+04 + 0.31801780E+04 0.31746169E+04 0.31746169E+04 0.31763010E+04 + 0.31763010E+04 0.31816431E+04 0.31816431E+04 0.31827610E+04 + 0.31827610E+04 0.31835359E+04 0.31835359E+04 0.31888230E+04 + 0.31888230E+04 0.31962290E+04 0.31723201E+04 0.31760940E+04 + 0.31760940E+04 0.31800901E+04 0.31800901E+04 0.31795190E+04 + 0.31795190E+04 0.31765291E+04 0.31765291E+04 0.31761809E+04 + 0.31761809E+04 0.31817251E+04 0.31817251E+04 0.31874331E+04 + 0.31874331E+04 0.31877380E+04 0.31877380E+04 0.31911621E+04 + 0.31911621E+04 0.31960540E+04 0.31960540E+04 0.32014460E+04 + 0.31723201E+04 0.31760940E+04 0.31760940E+04 0.31800901E+04 + 0.31800901E+04 0.31795190E+04 0.31795190E+04 0.31765291E+04 + 0.31765291E+04 0.31761809E+04 0.31761809E+04 0.31817251E+04 + 0.31817251E+04 0.31874331E+04 0.31874331E+04 0.31877380E+04 + 0.31877380E+04 0.31911621E+04 0.31911621E+04 0.31960540E+04 + 0.31960540E+04 0.32014460E+04 0.31636750E+04 0.31667949E+04 + 0.31667949E+04 0.31691960E+04 0.31691960E+04 0.31667830E+04 + 0.31667830E+04 0.31677639E+04 0.31677639E+04 0.31726440E+04 + 0.31726440E+04 0.31798940E+04 0.31798940E+04 0.31861699E+04 + 0.31861699E+04 0.31890779E+04 0.31890779E+04 0.31947561E+04 + 0.31947561E+04 0.31999160E+04 0.31999160E+04 0.32046211E+04 + 0.31636750E+04 0.31667949E+04 0.31667949E+04 0.31691960E+04 + 0.31691960E+04 0.31667830E+04 0.31667830E+04 0.31677639E+04 + 0.31677639E+04 0.31726440E+04 0.31726440E+04 0.31798940E+04 + 0.31798940E+04 0.31861699E+04 0.31861699E+04 0.31890779E+04 + 0.31890779E+04 0.31947561E+04 0.31947561E+04 0.31999160E+04 + 0.31999160E+04 0.32046211E+04 0.31564280E+04 0.31509131E+04 + 0.31509131E+04 0.31509541E+04 0.31509541E+04 0.31533110E+04 + 0.31533110E+04 0.31644509E+04 0.31644509E+04 0.31763501E+04 + 0.31763501E+04 0.31836641E+04 0.31836641E+04 0.31865449E+04 + 0.31865449E+04 0.31900620E+04 0.31900620E+04 0.31972319E+04 + 0.31972319E+04 0.32051399E+04 0.32051399E+04 0.32118291E+04 + 0.31564280E+04 0.31509131E+04 0.31509131E+04 0.31509541E+04 + 0.31509541E+04 0.31533110E+04 0.31533110E+04 0.31644509E+04 + 0.31644509E+04 0.31763501E+04 0.31763501E+04 0.31836641E+04 + 0.31836641E+04 0.31865449E+04 0.31865449E+04 0.31900620E+04 + 0.31900620E+04 0.31972319E+04 0.31972319E+04 0.32051399E+04 + 0.32051399E+04 0.32118291E+04 0.31656880E+04 0.31601179E+04 + 0.31601179E+04 0.31609771E+04 0.31609771E+04 0.31612920E+04 + 0.31612920E+04 0.31644910E+04 0.31644910E+04 0.31703660E+04 + 0.31703660E+04 0.31750879E+04 0.31750879E+04 0.31780879E+04 + 0.31780879E+04 0.31850291E+04 0.31850291E+04 0.31962029E+04 + 0.31962029E+04 0.32071650E+04 0.32071650E+04 0.32165291E+04 + 0.31656880E+04 0.31601179E+04 0.31601179E+04 0.31609771E+04 + 0.31609771E+04 0.31612920E+04 0.31612920E+04 0.31644910E+04 + 0.31644910E+04 0.31703660E+04 0.31703660E+04 0.31750879E+04 + 0.31750879E+04 0.31780879E+04 0.31780879E+04 0.31850291E+04 + 0.31850291E+04 0.31962029E+04 0.31962029E+04 0.32071650E+04 + 0.32071650E+04 0.32165291E+04 0.31794409E+04 0.31816011E+04 + 0.31816011E+04 0.31821150E+04 0.31821150E+04 0.31777881E+04 + 0.31777881E+04 0.31702690E+04 0.31702690E+04 0.31672871E+04 + 0.31672871E+04 0.31703101E+04 0.31703101E+04 0.31749290E+04 + 0.31749290E+04 0.31804399E+04 0.31804399E+04 0.31904409E+04 + 0.31904409E+04 0.32026641E+04 0.32026641E+04 0.32146851E+04 + 0.31794409E+04 0.31816011E+04 0.31816011E+04 0.31821150E+04 + 0.31821150E+04 0.31777881E+04 0.31777881E+04 0.31702690E+04 + 0.31702690E+04 0.31672871E+04 0.31672871E+04 0.31703101E+04 + 0.31703101E+04 0.31749290E+04 0.31749290E+04 0.31804399E+04 + 0.31804399E+04 0.31904409E+04 0.31904409E+04 0.32026641E+04 + 0.32026641E+04 0.32146851E+04 0.31786489E+04 0.31870601E+04 + 0.31870601E+04 0.31891790E+04 0.31891790E+04 0.31868250E+04 + 0.31868250E+04 0.31832881E+04 0.31832881E+04 0.31795840E+04 + 0.31795840E+04 0.31781250E+04 0.31781250E+04 0.31758230E+04 + 0.31758230E+04 0.31756460E+04 0.31756460E+04 0.31825300E+04 + 0.31825300E+04 0.31941660E+04 0.31941660E+04 0.32059431E+04 + 0.31786489E+04 0.31870601E+04 0.31870601E+04 0.31891790E+04 + 0.31891790E+04 0.31868250E+04 0.31868250E+04 0.31832881E+04 + 0.31832881E+04 0.31795840E+04 0.31795840E+04 0.31781250E+04 + 0.31781250E+04 0.31758230E+04 0.31758230E+04 0.31756460E+04 + 0.31756460E+04 0.31825300E+04 0.31825300E+04 0.31941660E+04 + 0.31941660E+04 0.32059431E+04 0.31772949E+04 0.31842490E+04 + 0.31842490E+04 0.31886001E+04 0.31886001E+04 0.31874680E+04 + 0.31874680E+04 0.31864241E+04 0.31864241E+04 0.31851919E+04 + 0.31851919E+04 0.31813401E+04 0.31813401E+04 0.31734189E+04 + 0.31734189E+04 0.31704541E+04 0.31704541E+04 0.31746699E+04 + 0.31746699E+04 0.31821479E+04 0.31821479E+04 0.31896860E+04 + 0.31772949E+04 0.31842490E+04 0.31842490E+04 0.31886001E+04 + 0.31886001E+04 0.31874680E+04 0.31874680E+04 0.31864241E+04 + 0.31864241E+04 0.31851919E+04 0.31851919E+04 0.31813401E+04 + 0.31813401E+04 0.31734189E+04 0.31734189E+04 0.31704541E+04 + 0.31704541E+04 0.31746699E+04 0.31746699E+04 0.31821479E+04 + 0.31821479E+04 0.31896860E+04 0.31854600E+04 0.31881250E+04 + 0.31881250E+04 0.31948750E+04 0.31948750E+04 0.31933689E+04 + 0.31933689E+04 0.31880010E+04 0.31880010E+04 0.31845149E+04 + 0.31845149E+04 0.31805110E+04 0.31805110E+04 0.31723450E+04 + 0.31723450E+04 0.31671951E+04 0.31671951E+04 0.31706379E+04 + 0.31706379E+04 0.31754580E+04 0.31754580E+04 0.31801260E+04 + 0.31854600E+04 0.31881250E+04 0.31881250E+04 0.31948750E+04 + 0.31948750E+04 0.31933689E+04 0.31933689E+04 0.31880010E+04 + 0.31880010E+04 0.31845149E+04 0.31845149E+04 0.31805110E+04 + 0.31805110E+04 0.31723450E+04 0.31723450E+04 0.31671951E+04 + 0.31671951E+04 0.31706379E+04 0.31706379E+04 0.31754580E+04 + 0.31754580E+04 0.31801260E+04 0.31948401E+04 0.31951111E+04 + 0.31951111E+04 0.32000601E+04 0.32000601E+04 0.31982810E+04 + 0.31982810E+04 0.31911221E+04 0.31911221E+04 0.31848191E+04 + 0.31848191E+04 0.31795710E+04 0.31795710E+04 0.31716150E+04 + 0.31716150E+04 0.31655991E+04 0.31655991E+04 0.31676250E+04 + 0.31676250E+04 0.31727729E+04 0.31727729E+04 0.31789170E+04 + 0.31948401E+04 0.31951111E+04 0.31951111E+04 0.32000601E+04 + 0.32000601E+04 0.31982810E+04 0.31982810E+04 0.31911221E+04 + 0.31911221E+04 0.31848191E+04 0.31848191E+04 0.31795710E+04 + 0.31795710E+04 0.31716150E+04 0.31716150E+04 0.31655991E+04 + 0.31655991E+04 0.31676250E+04 0.31676250E+04 0.31727729E+04 + 0.31727729E+04 0.31789170E+04 0.31909280E+04 0.31920220E+04 + 0.31920220E+04 0.31949121E+04 0.31949121E+04 0.31927881E+04 + 0.31927881E+04 0.31843479E+04 0.31843479E+04 0.31763601E+04 + 0.31763601E+04 0.31724800E+04 0.31724800E+04 0.31695969E+04 + 0.31695969E+04 0.31677959E+04 0.31677959E+04 0.31692190E+04 + 0.31692190E+04 0.31737471E+04 0.31737471E+04 0.31809541E+04 + 0.31909280E+04 0.31920220E+04 0.31920220E+04 0.31949121E+04 + 0.31949121E+04 0.31927881E+04 0.31927881E+04 0.31843479E+04 + 0.31843479E+04 0.31763601E+04 0.31763601E+04 0.31724800E+04 + 0.31724800E+04 0.31695969E+04 0.31695969E+04 0.31677959E+04 + 0.31677959E+04 0.31692190E+04 0.31692190E+04 0.31737471E+04 + 0.30455769E+04 0.30449070E+04 0.31846931E+04 0.31802520E+04 + 0.31802520E+04 0.31828440E+04 0.31828440E+04 0.31819961E+04 + 0.31819961E+04 0.31760520E+04 0.31760520E+04 0.31716350E+04 + 0.31716350E+04 0.31699480E+04 0.31699480E+04 0.31691360E+04 + 0.31691360E+04 0.31691970E+04 0.31691970E+04 0.31707119E+04 + 0.31707119E+04 0.31731841E+04 0.30503311E+04 0.30462649E+04 + 0.31846931E+04 0.31802520E+04 0.31802520E+04 0.31828440E+04 + 0.31828440E+04 0.31819961E+04 0.31819961E+04 0.31760520E+04 + 0.31760520E+04 0.31716350E+04 0.31716350E+04 0.31699480E+04 + 0.31699480E+04 0.31691360E+04 0.31691360E+04 0.31691970E+04 + 0.30786521E+04 0.30751799E+04 0.30751799E+04 0.30735601E+04 + 0.30503311E+04 0.30462649E+04 0.31867661E+04 0.31742939E+04 + 0.31742939E+04 0.31732180E+04 0.31732180E+04 0.31728379E+04 + 0.31728379E+04 0.31707200E+04 0.31707200E+04 0.31686311E+04 + 0.31686311E+04 0.31675149E+04 0.31675149E+04 0.31682981E+04 + 0.31682981E+04 0.31684150E+04 0.30783020E+04 0.30764619E+04 + 0.30764619E+04 0.30741150E+04 0.30496909E+04 0.30466279E+04 + 0.31867661E+04 0.31742939E+04 0.31742939E+04 0.31732180E+04 + 0.31732180E+04 0.31728379E+04 0.31728379E+04 0.31707200E+04 + 0.31707200E+04 0.31686311E+04 0.31686311E+04 0.31675149E+04 + 0.30897009E+04 0.30853889E+04 0.30853889E+04 0.30783020E+04 + 0.30783020E+04 0.30764619E+04 0.30764619E+04 0.30741150E+04 + 0.30496909E+04 0.30466279E+04 0.31871870E+04 0.31759199E+04 + 0.31759199E+04 0.31710000E+04 0.31710000E+04 0.31689529E+04 + 0.31689529E+04 0.31669880E+04 0.31669880E+04 0.31670520E+04 + 0.31670520E+04 0.31661909E+04 0.30911260E+04 0.30873630E+04 + 0.30873630E+04 0.30822681E+04 0.30822681E+04 0.30785120E+04 + 0.30785120E+04 0.30755991E+04 0.30499131E+04 0.30468379E+04 + 0.31871870E+04 0.31759199E+04 0.31759199E+04 0.31710000E+04 + 0.31710000E+04 0.31689529E+04 0.31689529E+04 0.31669880E+04 + 0.30985869E+04 0.30949680E+04 0.30949680E+04 0.30911260E+04 + 0.30911260E+04 0.30873630E+04 0.30873630E+04 0.30822681E+04 + 0.30822681E+04 0.30785120E+04 0.30785120E+04 0.30755991E+04 + 0.30499131E+04 0.30468379E+04 0.31860720E+04 0.31789629E+04 + 0.31789629E+04 0.31729189E+04 0.31729189E+04 0.31707119E+04 + 0.31707119E+04 0.31667729E+04 0.30998679E+04 0.30962000E+04 + 0.30962000E+04 0.30935220E+04 0.30935220E+04 0.30904529E+04 + 0.30904529E+04 0.30845100E+04 0.30845100E+04 0.30795139E+04 + 0.30795139E+04 0.30764500E+04 0.30499470E+04 0.30473220E+04 + 0.31860720E+04 0.31789629E+04 0.31789629E+04 0.31729189E+04 + 0.31089919E+04 0.31051440E+04 0.31051440E+04 0.30998679E+04 + 0.30998679E+04 0.30962000E+04 0.30962000E+04 0.30935220E+04 + 0.30935220E+04 0.30904529E+04 0.30904529E+04 0.30845100E+04 + 0.30845100E+04 0.30795139E+04 0.30795139E+04 0.30764500E+04 + 0.30499470E+04 0.30473220E+04 0.31857920E+04 0.31809331E+04 + 0.31809331E+04 0.31751460E+04 0.31114880E+04 0.31064600E+04 + 0.31064600E+04 0.31013611E+04 0.31013611E+04 0.30974299E+04 + 0.30974299E+04 0.30916079E+04 0.30916079E+04 0.30873081E+04 + 0.30873081E+04 0.30850481E+04 0.30850481E+04 0.30816980E+04 + 0.30816980E+04 0.30775720E+04 0.30504890E+04 0.30477009E+04 + 0.31193301E+04 0.31161941E+04 0.31161941E+04 0.31114880E+04 + 0.31114880E+04 0.31064600E+04 0.31064600E+04 0.31013611E+04 + 0.31013611E+04 0.30974299E+04 0.30974299E+04 0.30916079E+04 + 0.30916079E+04 0.30873081E+04 0.30873081E+04 0.30850481E+04 + 0.30850481E+04 0.30816980E+04 0.30816980E+04 0.30775720E+04 + 0.30775720E+04 0.30745950E+04 0.31210930E+04 0.31184670E+04 + 0.31184670E+04 0.31158501E+04 0.31158501E+04 0.31112000E+04 + 0.31112000E+04 0.31007500E+04 0.31007500E+04 0.30936179E+04 + 0.30936179E+04 0.30891140E+04 0.30891140E+04 0.30879150E+04 + 0.30879150E+04 0.30890591E+04 0.30890591E+04 0.30848440E+04 + 0.30848440E+04 0.30792800E+04 0.30792800E+04 0.30756741E+04 + 0.31838401E+04 0.31848569E+04 0.31848569E+04 0.31872180E+04 + 0.31872180E+04 0.31866389E+04 0.31866389E+04 0.31813870E+04 + 0.31813870E+04 0.31757141E+04 0.31757141E+04 0.31772600E+04 + 0.31772600E+04 0.31825991E+04 0.31825991E+04 0.31838000E+04 + 0.31838000E+04 0.31845830E+04 0.31845830E+04 0.31898521E+04 + 0.31898521E+04 0.31972371E+04 0.31735349E+04 0.31771899E+04 + 0.31771899E+04 0.31812361E+04 0.31812361E+04 0.31807429E+04 + 0.31807429E+04 0.31777351E+04 0.31777351E+04 0.31772620E+04 + 0.31772620E+04 0.31827119E+04 0.31827119E+04 0.31884951E+04 + 0.31884951E+04 0.31888511E+04 0.31888511E+04 0.31922390E+04 + 0.31922390E+04 0.31971150E+04 0.31971150E+04 0.32024170E+04 + 0.31735349E+04 0.31771899E+04 0.31771899E+04 0.31812361E+04 + 0.31812361E+04 0.31807429E+04 0.31807429E+04 0.31777351E+04 + 0.31777351E+04 0.31772620E+04 0.31772620E+04 0.31827119E+04 + 0.31827119E+04 0.31884951E+04 0.31884951E+04 0.31888511E+04 + 0.31888511E+04 0.31922390E+04 0.31922390E+04 0.31971150E+04 + 0.31971150E+04 0.32024170E+04 0.31649331E+04 0.31679810E+04 + 0.31679810E+04 0.31704351E+04 0.31704351E+04 0.31679971E+04 + 0.31679971E+04 0.31687939E+04 0.31687939E+04 0.31735271E+04 + 0.31735271E+04 0.31807361E+04 0.31807361E+04 0.31870950E+04 + 0.31870950E+04 0.31900620E+04 0.31900620E+04 0.31957209E+04 + 0.31957209E+04 0.32008550E+04 0.32008550E+04 0.32054089E+04 + 0.31649331E+04 0.31679810E+04 0.31679810E+04 0.31704351E+04 + 0.31704351E+04 0.31679971E+04 0.31679971E+04 0.31687939E+04 + 0.31687939E+04 0.31735271E+04 0.31735271E+04 0.31807361E+04 + 0.31807361E+04 0.31870950E+04 0.31870950E+04 0.31900620E+04 + 0.31900620E+04 0.31957209E+04 0.31957209E+04 0.32008550E+04 + 0.32008550E+04 0.32054089E+04 0.31573750E+04 0.31517991E+04 + 0.31517991E+04 0.31518430E+04 0.31518430E+04 0.31540940E+04 + 0.31540940E+04 0.31651279E+04 0.31651279E+04 0.31770161E+04 + 0.31770161E+04 0.31844109E+04 0.31844109E+04 0.31873540E+04 + 0.31873540E+04 0.31908711E+04 0.31908711E+04 0.31979409E+04 + 0.31979409E+04 0.32057561E+04 0.32057561E+04 0.32123469E+04 + 0.31573750E+04 0.31517991E+04 0.31517991E+04 0.31518430E+04 + 0.31518430E+04 0.31540940E+04 0.31540940E+04 0.31651279E+04 + 0.31651279E+04 0.31770161E+04 0.31770161E+04 0.31844109E+04 + 0.31844109E+04 0.31873540E+04 0.31873540E+04 0.31908711E+04 + 0.31908711E+04 0.31979409E+04 0.31979409E+04 0.32057561E+04 + 0.32057561E+04 0.32123469E+04 0.31662190E+04 0.31606580E+04 + 0.31606580E+04 0.31616160E+04 0.31616160E+04 0.31619519E+04 + 0.31619519E+04 0.31651421E+04 0.31651421E+04 0.31710039E+04 + 0.31710039E+04 0.31757109E+04 0.31757109E+04 0.31786440E+04 + 0.31786440E+04 0.31855559E+04 0.31855559E+04 0.31966951E+04 + 0.31966951E+04 0.32076321E+04 0.32076321E+04 0.32169861E+04 + 0.31662190E+04 0.31606580E+04 0.31606580E+04 0.31616160E+04 + 0.31616160E+04 0.31619519E+04 0.31619519E+04 0.31651421E+04 + 0.31651421E+04 0.31710039E+04 0.31710039E+04 0.31757109E+04 + 0.31757109E+04 0.31786440E+04 0.31786440E+04 0.31855559E+04 + 0.31855559E+04 0.31966951E+04 0.31966951E+04 0.32076321E+04 + 0.32076321E+04 0.32169861E+04 0.31799990E+04 0.31821121E+04 + 0.31821121E+04 0.31826531E+04 0.31826531E+04 0.31783679E+04 + 0.31783679E+04 0.31708240E+04 0.31708240E+04 0.31677661E+04 + 0.31677661E+04 0.31707529E+04 0.31707529E+04 0.31754150E+04 + 0.31754150E+04 0.31808921E+04 0.31808921E+04 0.31908469E+04 + 0.31908469E+04 0.32030779E+04 0.32030779E+04 0.32151160E+04 + 0.31799990E+04 0.31821121E+04 0.31821121E+04 0.31826531E+04 + 0.31826531E+04 0.31783679E+04 0.31783679E+04 0.31708240E+04 + 0.31708240E+04 0.31677661E+04 0.31677661E+04 0.31707529E+04 + 0.31707529E+04 0.31754150E+04 0.31754150E+04 0.31808921E+04 + 0.31808921E+04 0.31908469E+04 0.31908469E+04 0.32030779E+04 + 0.32030779E+04 0.32151160E+04 0.31791121E+04 0.31875229E+04 + 0.31875229E+04 0.31897390E+04 0.31897390E+04 0.31874060E+04 + 0.31874060E+04 0.31838291E+04 0.31838291E+04 0.31800491E+04 + 0.31800491E+04 0.31785901E+04 0.31785901E+04 0.31762971E+04 + 0.31762971E+04 0.31760229E+04 0.31760229E+04 0.31828989E+04 + 0.31828989E+04 0.31946079E+04 0.31946079E+04 0.32064819E+04 + 0.31791121E+04 0.31875229E+04 0.31875229E+04 0.31897390E+04 + 0.31897390E+04 0.31874060E+04 0.31874060E+04 0.31838291E+04 + 0.31838291E+04 0.31800491E+04 0.31800491E+04 0.31785901E+04 + 0.31785901E+04 0.31762971E+04 0.31762971E+04 0.31760229E+04 + 0.31760229E+04 0.31828989E+04 0.31828989E+04 0.31946079E+04 + 0.31946079E+04 0.32064819E+04 0.31777090E+04 0.31846899E+04 + 0.31846899E+04 0.31891121E+04 0.31891121E+04 0.31879971E+04 + 0.31879971E+04 0.31869299E+04 0.31869299E+04 0.31856851E+04 + 0.31856851E+04 0.31818899E+04 0.31818899E+04 0.31739189E+04 + 0.31739189E+04 0.31708721E+04 0.31708721E+04 0.31750540E+04 + 0.31750540E+04 0.31825750E+04 0.31825750E+04 0.31902129E+04 + 0.31777090E+04 0.31846899E+04 0.31846899E+04 0.31891121E+04 + 0.31891121E+04 0.31879971E+04 0.31879971E+04 0.31869299E+04 + 0.31869299E+04 0.31856851E+04 0.31856851E+04 0.31818899E+04 + 0.31818899E+04 0.31739189E+04 0.31739189E+04 0.31708721E+04 + 0.31708721E+04 0.31750540E+04 0.31750540E+04 0.31825750E+04 + 0.31825750E+04 0.31902129E+04 0.31859089E+04 0.31885339E+04 + 0.31885339E+04 0.31953230E+04 0.31953230E+04 0.31938970E+04 + 0.31938970E+04 0.31885039E+04 0.31885039E+04 0.31850039E+04 + 0.31850039E+04 0.31810471E+04 0.31810471E+04 0.31728711E+04 + 0.31728711E+04 0.31676150E+04 0.31676150E+04 0.31710349E+04 + 0.31710349E+04 0.31758469E+04 0.31758469E+04 0.31805000E+04 + 0.31859089E+04 0.31885339E+04 0.31885339E+04 0.31953230E+04 + 0.31953230E+04 0.31938970E+04 0.31938970E+04 0.31885039E+04 + 0.31885039E+04 0.31850039E+04 0.31850039E+04 0.31810471E+04 + 0.31810471E+04 0.31728711E+04 0.31728711E+04 0.31676150E+04 + 0.31676150E+04 0.31710349E+04 0.31710349E+04 0.31758469E+04 + 0.31758469E+04 0.31805000E+04 0.31954121E+04 0.31955830E+04 + 0.31955830E+04 0.32005310E+04 0.32005310E+04 0.31988391E+04 + 0.31988391E+04 0.31916899E+04 0.31916899E+04 0.31853479E+04 + 0.31853479E+04 0.31801069E+04 0.31801069E+04 0.31721250E+04 + 0.31721250E+04 0.31660259E+04 0.31660259E+04 0.31679719E+04 + 0.31679719E+04 0.31730330E+04 0.31730330E+04 0.31791069E+04 + 0.31954121E+04 0.31955830E+04 0.31955830E+04 0.32005310E+04 + 0.32005310E+04 0.31988391E+04 0.31988391E+04 0.31916899E+04 + 0.31916899E+04 0.31853479E+04 0.31853479E+04 0.31801069E+04 + 0.31801069E+04 0.31721250E+04 0.31721250E+04 0.31660259E+04 + 0.31660259E+04 0.31679719E+04 0.31679719E+04 0.31730330E+04 + 0.31730330E+04 0.31791069E+04 0.31915359E+04 0.31925581E+04 + 0.31925581E+04 0.31954341E+04 0.31954341E+04 0.31933889E+04 + 0.31933889E+04 0.31849890E+04 0.31849890E+04 0.31769419E+04 + 0.31769419E+04 0.31730371E+04 0.31730371E+04 0.31700920E+04 + 0.31700920E+04 0.31680891E+04 0.31680891E+04 0.31693799E+04 + 0.31693799E+04 0.31739851E+04 0.31739851E+04 0.31812000E+04 + 0.31915359E+04 0.31925581E+04 0.31925581E+04 0.31954341E+04 + 0.31954341E+04 0.31933889E+04 0.31933889E+04 0.31849890E+04 + 0.31849890E+04 0.31769419E+04 0.31769419E+04 0.31730371E+04 + 0.31730371E+04 0.31700920E+04 0.31700920E+04 0.31680891E+04 + 0.31680891E+04 0.31693799E+04 0.31693799E+04 0.31739851E+04 + 0.30458401E+04 0.30452290E+04 0.31853359E+04 0.31807671E+04 + 0.31807671E+04 0.31833491E+04 0.31833491E+04 0.31825830E+04 + 0.31825830E+04 0.31766021E+04 0.31766021E+04 0.31720439E+04 + 0.31720439E+04 0.31702310E+04 0.31702310E+04 0.31693081E+04 + 0.31693081E+04 0.31694441E+04 0.31694441E+04 0.31709231E+04 + 0.31709231E+04 0.31733650E+04 0.30506040E+04 0.30465759E+04 + 0.31853359E+04 0.31807671E+04 0.31807671E+04 0.31833491E+04 + 0.31833491E+04 0.31825830E+04 0.31825830E+04 0.31766021E+04 + 0.31766021E+04 0.31720439E+04 0.31720439E+04 0.31702310E+04 + 0.31702310E+04 0.31693081E+04 0.31693081E+04 0.31694441E+04 + 0.30791641E+04 0.30757080E+04 0.30757080E+04 0.30741050E+04 + 0.30506040E+04 0.30465759E+04 0.31874871E+04 0.31748789E+04 + 0.31748789E+04 0.31736770E+04 0.31736770E+04 0.31731960E+04 + 0.31731960E+04 0.31709590E+04 0.31709590E+04 0.31687520E+04 + 0.31687520E+04 0.31677129E+04 0.31677129E+04 0.31684961E+04 + 0.31684961E+04 0.31686021E+04 0.30787781E+04 0.30769829E+04 + 0.30769829E+04 0.30746721E+04 0.30499880E+04 0.30469500E+04 + 0.31874871E+04 0.31748789E+04 0.31748789E+04 0.31736770E+04 + 0.31736770E+04 0.31731960E+04 0.31731960E+04 0.31709590E+04 + 0.31709590E+04 0.31687520E+04 0.31687520E+04 0.31677129E+04 + 0.30903191E+04 0.30859910E+04 0.30859910E+04 0.30787781E+04 + 0.30787781E+04 0.30769829E+04 0.30769829E+04 0.30746721E+04 + 0.30499880E+04 0.30469500E+04 0.31877749E+04 0.31763069E+04 + 0.31763069E+04 0.31712290E+04 0.31712290E+04 0.31692261E+04 + 0.31692261E+04 0.31672310E+04 0.31672310E+04 0.31671970E+04 + 0.31671970E+04 0.31663110E+04 0.30917749E+04 0.30880190E+04 + 0.30880190E+04 0.30828181E+04 0.30828181E+04 0.30790500E+04 + 0.30790500E+04 0.30761541E+04 0.30502271E+04 0.30471819E+04 + 0.31877749E+04 0.31763069E+04 0.31763069E+04 0.31712290E+04 + 0.31712290E+04 0.31692261E+04 0.31692261E+04 0.31672310E+04 + 0.30992810E+04 0.30956599E+04 0.30956599E+04 0.30917749E+04 + 0.30917749E+04 0.30880190E+04 0.30880190E+04 0.30828181E+04 + 0.30828181E+04 0.30790500E+04 0.30790500E+04 0.30761541E+04 + 0.30502271E+04 0.30471819E+04 0.31865500E+04 0.31793560E+04 + 0.31793560E+04 0.31732251E+04 0.31732251E+04 0.31709800E+04 + 0.31709800E+04 0.31670640E+04 0.31005879E+04 0.30969570E+04 + 0.30969570E+04 0.30942019E+04 0.30942019E+04 0.30910879E+04 + 0.30910879E+04 0.30851609E+04 0.30851609E+04 0.30800540E+04 + 0.30800540E+04 0.30770161E+04 0.30502710E+04 0.30476680E+04 + 0.31865500E+04 0.31793560E+04 0.31793560E+04 0.31732251E+04 + 0.31098230E+04 0.31059409E+04 0.31059409E+04 0.31005879E+04 + 0.31005879E+04 0.30969570E+04 0.30969570E+04 0.30942019E+04 + 0.30942019E+04 0.30910879E+04 0.30910879E+04 0.30851609E+04 + 0.30851609E+04 0.30800540E+04 0.30800540E+04 0.30770161E+04 + 0.30502710E+04 0.30476680E+04 0.31862590E+04 0.31813291E+04 + 0.31813291E+04 0.31755210E+04 0.31124680E+04 0.31073760E+04 + 0.31073760E+04 0.31020850E+04 0.31020850E+04 0.30980620E+04 + 0.30980620E+04 0.30922500E+04 0.30922500E+04 0.30879780E+04 + 0.30879780E+04 0.30857100E+04 0.30857100E+04 0.30822820E+04 + 0.30822820E+04 0.30781980E+04 0.30508230E+04 0.30480830E+04 + 0.31206350E+04 0.31174460E+04 0.31174460E+04 0.31124680E+04 + 0.31124680E+04 0.31073760E+04 0.31073760E+04 0.31020850E+04 + 0.31020850E+04 0.30980620E+04 0.30980620E+04 0.30922500E+04 + 0.30922500E+04 0.30879780E+04 0.30879780E+04 0.30857100E+04 + 0.30857100E+04 0.30822820E+04 0.30822820E+04 0.30781980E+04 + 0.30781980E+04 0.30752690E+04 0.31224009E+04 0.31198149E+04 + 0.31198149E+04 0.31169690E+04 0.31169690E+04 0.31119451E+04 + 0.31119451E+04 0.31013479E+04 0.31013479E+04 0.30942100E+04 + 0.30942100E+04 0.30896980E+04 0.30896980E+04 0.30885281E+04 + 0.30885281E+04 0.30896990E+04 0.30896990E+04 0.30855540E+04 + 0.30855540E+04 0.30799189E+04 0.30799189E+04 0.30763069E+04 + 0.31838401E+04 0.31848569E+04 0.31848569E+04 0.31872180E+04 + 0.31872180E+04 0.31866389E+04 0.31866389E+04 0.31813870E+04 + 0.31813870E+04 0.31757141E+04 0.31757141E+04 0.31772600E+04 + 0.31772600E+04 0.31825991E+04 0.31825991E+04 0.31838000E+04 + 0.31838000E+04 0.31845830E+04 0.31845830E+04 0.31898521E+04 + 0.31898521E+04 0.31972371E+04 0.31735349E+04 0.31771899E+04 + 0.31771899E+04 0.31812361E+04 0.31812361E+04 0.31807429E+04 + 0.31807429E+04 0.31777351E+04 0.31777351E+04 0.31772620E+04 + 0.31772620E+04 0.31827119E+04 0.31827119E+04 0.31884951E+04 + 0.31884951E+04 0.31888511E+04 0.31888511E+04 0.31922390E+04 + 0.31922390E+04 0.31971150E+04 0.31971150E+04 0.32024170E+04 + 0.31735349E+04 0.31771899E+04 0.31771899E+04 0.31812361E+04 + 0.31812361E+04 0.31807429E+04 0.31807429E+04 0.31777351E+04 + 0.31777351E+04 0.31772620E+04 0.31772620E+04 0.31827119E+04 + 0.31827119E+04 0.31884951E+04 0.31884951E+04 0.31888511E+04 + 0.31888511E+04 0.31922390E+04 0.31922390E+04 0.31971150E+04 + 0.31971150E+04 0.32024170E+04 0.31649331E+04 0.31679810E+04 + 0.31679810E+04 0.31704351E+04 0.31704351E+04 0.31679971E+04 + 0.31679971E+04 0.31687939E+04 0.31687939E+04 0.31735271E+04 + 0.31735271E+04 0.31807361E+04 0.31807361E+04 0.31870950E+04 + 0.31870950E+04 0.31900620E+04 0.31900620E+04 0.31957209E+04 + 0.31957209E+04 0.32008550E+04 0.32008550E+04 0.32054089E+04 + 0.31649331E+04 0.31679810E+04 0.31679810E+04 0.31704351E+04 + 0.31704351E+04 0.31679971E+04 0.31679971E+04 0.31687939E+04 + 0.31687939E+04 0.31735271E+04 0.31735271E+04 0.31807361E+04 + 0.31807361E+04 0.31870950E+04 0.31870950E+04 0.31900620E+04 + 0.31900620E+04 0.31957209E+04 0.31957209E+04 0.32008550E+04 + 0.32008550E+04 0.32054089E+04 0.31573750E+04 0.31517991E+04 + 0.31517991E+04 0.31518430E+04 0.31518430E+04 0.31540940E+04 + 0.31540940E+04 0.31651279E+04 0.31651279E+04 0.31770161E+04 + 0.31770161E+04 0.31844109E+04 0.31844109E+04 0.31873540E+04 + 0.31873540E+04 0.31908711E+04 0.31908711E+04 0.31979409E+04 + 0.31979409E+04 0.32057561E+04 0.32057561E+04 0.32123469E+04 + 0.31573750E+04 0.31517991E+04 0.31517991E+04 0.31518430E+04 + 0.31518430E+04 0.31540940E+04 0.31540940E+04 0.31651279E+04 + 0.31651279E+04 0.31770161E+04 0.31770161E+04 0.31844109E+04 + 0.31844109E+04 0.31873540E+04 0.31873540E+04 0.31908711E+04 + 0.31908711E+04 0.31979409E+04 0.31979409E+04 0.32057561E+04 + 0.32057561E+04 0.32123469E+04 0.31662190E+04 0.31606580E+04 + 0.31606580E+04 0.31616160E+04 0.31616160E+04 0.31619519E+04 + 0.31619519E+04 0.31651421E+04 0.31651421E+04 0.31710039E+04 + 0.31710039E+04 0.31757109E+04 0.31757109E+04 0.31786440E+04 + 0.31786440E+04 0.31855559E+04 0.31855559E+04 0.31966951E+04 + 0.31966951E+04 0.32076321E+04 0.32076321E+04 0.32169861E+04 + 0.31662190E+04 0.31606580E+04 0.31606580E+04 0.31616160E+04 + 0.31616160E+04 0.31619519E+04 0.31619519E+04 0.31651421E+04 + 0.31651421E+04 0.31710039E+04 0.31710039E+04 0.31757109E+04 + 0.31757109E+04 0.31786440E+04 0.31786440E+04 0.31855559E+04 + 0.31855559E+04 0.31966951E+04 0.31966951E+04 0.32076321E+04 + 0.32076321E+04 0.32169861E+04 0.31799990E+04 0.31821121E+04 + 0.31821121E+04 0.31826531E+04 0.31826531E+04 0.31783679E+04 + 0.31783679E+04 0.31708240E+04 0.31708240E+04 0.31677661E+04 + 0.31677661E+04 0.31707529E+04 0.31707529E+04 0.31754150E+04 + 0.31754150E+04 0.31808921E+04 0.31808921E+04 0.31908469E+04 + 0.31908469E+04 0.32030779E+04 0.32030779E+04 0.32151160E+04 + 0.31799990E+04 0.31821121E+04 0.31821121E+04 0.31826531E+04 + 0.31826531E+04 0.31783679E+04 0.31783679E+04 0.31708240E+04 + 0.31708240E+04 0.31677661E+04 0.31677661E+04 0.31707529E+04 + 0.31707529E+04 0.31754150E+04 0.31754150E+04 0.31808921E+04 + 0.31808921E+04 0.31908469E+04 0.31908469E+04 0.32030779E+04 + 0.32030779E+04 0.32151160E+04 0.31791121E+04 0.31875229E+04 + 0.31875229E+04 0.31897390E+04 0.31897390E+04 0.31874060E+04 + 0.31874060E+04 0.31838291E+04 0.31838291E+04 0.31800491E+04 + 0.31800491E+04 0.31785901E+04 0.31785901E+04 0.31762971E+04 + 0.31762971E+04 0.31760229E+04 0.31760229E+04 0.31828989E+04 + 0.31828989E+04 0.31946079E+04 0.31946079E+04 0.32064819E+04 + 0.31791121E+04 0.31875229E+04 0.31875229E+04 0.31897390E+04 + 0.31897390E+04 0.31874060E+04 0.31874060E+04 0.31838291E+04 + 0.31838291E+04 0.31800491E+04 0.31800491E+04 0.31785901E+04 + 0.31785901E+04 0.31762971E+04 0.31762971E+04 0.31760229E+04 + 0.31760229E+04 0.31828989E+04 0.31828989E+04 0.31946079E+04 + 0.31946079E+04 0.32064819E+04 0.31777090E+04 0.31846899E+04 + 0.31846899E+04 0.31891121E+04 0.31891121E+04 0.31879971E+04 + 0.31879971E+04 0.31869299E+04 0.31869299E+04 0.31856851E+04 + 0.31856851E+04 0.31818899E+04 0.31818899E+04 0.31739189E+04 + 0.31739189E+04 0.31708721E+04 0.31708721E+04 0.31750540E+04 + 0.31750540E+04 0.31825750E+04 0.31825750E+04 0.31902129E+04 + 0.31777090E+04 0.31846899E+04 0.31846899E+04 0.31891121E+04 + 0.31891121E+04 0.31879971E+04 0.31879971E+04 0.31869299E+04 + 0.31869299E+04 0.31856851E+04 0.31856851E+04 0.31818899E+04 + 0.31818899E+04 0.31739189E+04 0.31739189E+04 0.31708721E+04 + 0.31708721E+04 0.31750540E+04 0.31750540E+04 0.31825750E+04 + 0.31825750E+04 0.31902129E+04 0.31859089E+04 0.31885339E+04 + 0.31885339E+04 0.31953230E+04 0.31953230E+04 0.31938970E+04 + 0.31938970E+04 0.31885039E+04 0.31885039E+04 0.31850039E+04 + 0.31850039E+04 0.31810471E+04 0.31810471E+04 0.31728711E+04 + 0.31728711E+04 0.31676150E+04 0.31676150E+04 0.31710349E+04 + 0.31710349E+04 0.31758469E+04 0.31758469E+04 0.31805000E+04 + 0.31859089E+04 0.31885339E+04 0.31885339E+04 0.31953230E+04 + 0.31953230E+04 0.31938970E+04 0.31938970E+04 0.31885039E+04 + 0.31885039E+04 0.31850039E+04 0.31850039E+04 0.31810471E+04 + 0.31810471E+04 0.31728711E+04 0.31728711E+04 0.31676150E+04 + 0.31676150E+04 0.31710349E+04 0.31710349E+04 0.31758469E+04 + 0.31758469E+04 0.31805000E+04 0.31954121E+04 0.31955830E+04 + 0.31955830E+04 0.32005310E+04 0.32005310E+04 0.31988391E+04 + 0.31988391E+04 0.31916899E+04 0.31916899E+04 0.31853479E+04 + 0.31853479E+04 0.31801069E+04 0.31801069E+04 0.31721250E+04 + 0.31721250E+04 0.31660259E+04 0.31660259E+04 0.31679719E+04 + 0.31679719E+04 0.31730330E+04 0.31730330E+04 0.31791069E+04 + 0.31954121E+04 0.31955830E+04 0.31955830E+04 0.32005310E+04 + 0.32005310E+04 0.31988391E+04 0.31988391E+04 0.31916899E+04 + 0.31916899E+04 0.31853479E+04 0.31853479E+04 0.31801069E+04 + 0.31801069E+04 0.31721250E+04 0.31721250E+04 0.31660259E+04 + 0.31660259E+04 0.31679719E+04 0.31679719E+04 0.31730330E+04 + 0.31730330E+04 0.31791069E+04 0.31915359E+04 0.31925581E+04 + 0.31925581E+04 0.31954341E+04 0.31954341E+04 0.31933889E+04 + 0.31933889E+04 0.31849890E+04 0.31849890E+04 0.31769419E+04 + 0.31769419E+04 0.31730371E+04 0.31730371E+04 0.31700920E+04 + 0.31700920E+04 0.31680891E+04 0.31680891E+04 0.31693799E+04 + 0.31693799E+04 0.31739851E+04 0.31739851E+04 0.31812000E+04 + 0.31915359E+04 0.31925581E+04 0.31925581E+04 0.31954341E+04 + 0.31954341E+04 0.31933889E+04 0.31933889E+04 0.31849890E+04 + 0.31849890E+04 0.31769419E+04 0.31769419E+04 0.31730371E+04 + 0.31730371E+04 0.31700920E+04 0.31700920E+04 0.31680891E+04 + 0.31680891E+04 0.31693799E+04 0.31693799E+04 0.31739851E+04 + 0.30458401E+04 0.30452290E+04 0.31853359E+04 0.31807671E+04 + 0.31807671E+04 0.31833491E+04 0.31833491E+04 0.31825830E+04 + 0.31825830E+04 0.31766021E+04 0.31766021E+04 0.31720439E+04 + 0.31720439E+04 0.31702310E+04 0.31702310E+04 0.31693081E+04 + 0.31693081E+04 0.31694441E+04 0.31694441E+04 0.31709231E+04 + 0.31709231E+04 0.31733650E+04 0.30506040E+04 0.30465759E+04 + 0.31853359E+04 0.31807671E+04 0.31807671E+04 0.31833491E+04 + 0.31833491E+04 0.31825830E+04 0.31825830E+04 0.31766021E+04 + 0.31766021E+04 0.31720439E+04 0.31720439E+04 0.31702310E+04 + 0.31702310E+04 0.31693081E+04 0.31693081E+04 0.31694441E+04 + 0.30791641E+04 0.30757080E+04 0.30757080E+04 0.30741050E+04 + 0.30506040E+04 0.30465759E+04 0.31874871E+04 0.31748789E+04 + 0.31748789E+04 0.31736770E+04 0.31736770E+04 0.31731960E+04 + 0.31731960E+04 0.31709590E+04 0.31709590E+04 0.31687520E+04 + 0.31687520E+04 0.31677129E+04 0.31677129E+04 0.31684961E+04 + 0.31684961E+04 0.31686021E+04 0.30787781E+04 0.30769829E+04 + 0.30769829E+04 0.30746721E+04 0.30499880E+04 0.30469500E+04 + 0.31874871E+04 0.31748789E+04 0.31748789E+04 0.31736770E+04 + 0.31736770E+04 0.31731960E+04 0.31731960E+04 0.31709590E+04 + 0.31709590E+04 0.31687520E+04 0.31687520E+04 0.31677129E+04 + 0.30903191E+04 0.30859910E+04 0.30859910E+04 0.30787781E+04 + 0.30787781E+04 0.30769829E+04 0.30769829E+04 0.30746721E+04 + 0.30499880E+04 0.30469500E+04 0.31877749E+04 0.31763069E+04 + 0.31763069E+04 0.31712290E+04 0.31712290E+04 0.31692261E+04 + 0.31692261E+04 0.31672310E+04 0.31672310E+04 0.31671970E+04 + 0.31671970E+04 0.31663110E+04 0.30917749E+04 0.30880190E+04 + 0.30880190E+04 0.30828181E+04 0.30828181E+04 0.30790500E+04 + 0.30790500E+04 0.30761541E+04 0.30502271E+04 0.30471819E+04 + 0.31877749E+04 0.31763069E+04 0.31763069E+04 0.31712290E+04 + 0.31712290E+04 0.31692261E+04 0.31692261E+04 0.31672310E+04 + 0.30992810E+04 0.30956599E+04 0.30956599E+04 0.30917749E+04 + 0.30917749E+04 0.30880190E+04 0.30880190E+04 0.30828181E+04 + 0.30828181E+04 0.30790500E+04 0.30790500E+04 0.30761541E+04 + 0.30502271E+04 0.30471819E+04 0.31865500E+04 0.31793560E+04 + 0.31793560E+04 0.31732251E+04 0.31732251E+04 0.31709800E+04 + 0.31709800E+04 0.31670640E+04 0.31005879E+04 0.30969570E+04 + 0.30969570E+04 0.30942019E+04 0.30942019E+04 0.30910879E+04 + 0.30910879E+04 0.30851609E+04 0.30851609E+04 0.30800540E+04 + 0.30800540E+04 0.30770161E+04 0.30502710E+04 0.30476680E+04 + 0.31865500E+04 0.31793560E+04 0.31793560E+04 0.31732251E+04 + 0.31098230E+04 0.31059409E+04 0.31059409E+04 0.31005879E+04 + 0.31005879E+04 0.30969570E+04 0.30969570E+04 0.30942019E+04 + 0.30942019E+04 0.30910879E+04 0.30910879E+04 0.30851609E+04 + 0.30851609E+04 0.30800540E+04 0.30800540E+04 0.30770161E+04 + 0.30502710E+04 0.30476680E+04 0.31862590E+04 0.31813291E+04 + 0.31813291E+04 0.31755210E+04 0.31124680E+04 0.31073760E+04 + 0.31073760E+04 0.31020850E+04 0.31020850E+04 0.30980620E+04 + 0.30980620E+04 0.30922500E+04 0.30922500E+04 0.30879780E+04 + 0.30879780E+04 0.30857100E+04 0.30857100E+04 0.30822820E+04 + 0.30822820E+04 0.30781980E+04 0.30508230E+04 0.30480830E+04 + 0.31206350E+04 0.31174460E+04 0.31174460E+04 0.31124680E+04 + 0.31124680E+04 0.31073760E+04 0.31073760E+04 0.31020850E+04 + 0.31020850E+04 0.30980620E+04 0.30980620E+04 0.30922500E+04 + 0.30922500E+04 0.30879780E+04 0.30879780E+04 0.30857100E+04 + 0.30857100E+04 0.30822820E+04 0.30822820E+04 0.30781980E+04 + 0.30781980E+04 0.30752690E+04 0.31224009E+04 0.31198149E+04 + 0.31198149E+04 0.31169690E+04 0.31169690E+04 0.31119451E+04 + 0.31119451E+04 0.31013479E+04 0.31013479E+04 0.30942100E+04 + 0.30942100E+04 0.30896980E+04 0.30896980E+04 0.30885281E+04 + 0.30885281E+04 0.30896990E+04 0.30896990E+04 0.30855540E+04 + 0.30855540E+04 0.30799189E+04 0.30799189E+04 0.30763069E+04 + 0.31850339E+04 0.31859529E+04 0.31859529E+04 0.31883420E+04 + 0.31883420E+04 0.31878220E+04 0.31878220E+04 0.31825959E+04 + 0.31825959E+04 0.31768120E+04 0.31768120E+04 0.31782190E+04 + 0.31782190E+04 0.31835559E+04 0.31835559E+04 0.31848379E+04 + 0.31848379E+04 0.31856311E+04 0.31856311E+04 0.31908811E+04 + 0.31908811E+04 0.31982439E+04 0.31747500E+04 0.31782871E+04 + 0.31782871E+04 0.31823821E+04 0.31823821E+04 0.31819661E+04 + 0.31819661E+04 0.31789409E+04 0.31789409E+04 0.31783440E+04 + 0.31783440E+04 0.31836990E+04 0.31836990E+04 0.31895581E+04 + 0.31895581E+04 0.31899629E+04 0.31899629E+04 0.31933159E+04 + 0.31933159E+04 0.31981760E+04 0.31981760E+04 0.32033889E+04 + 0.31747500E+04 0.31782871E+04 0.31782871E+04 0.31823821E+04 + 0.31823821E+04 0.31819661E+04 0.31819661E+04 0.31789409E+04 + 0.31789409E+04 0.31783440E+04 0.31783440E+04 0.31836990E+04 + 0.31836990E+04 0.31895581E+04 0.31895581E+04 0.31899629E+04 + 0.31899629E+04 0.31933159E+04 0.31933159E+04 0.31981760E+04 + 0.31981760E+04 0.32033889E+04 0.31661909E+04 0.31691660E+04 + 0.31691660E+04 0.31716741E+04 0.31716741E+04 0.31692100E+04 + 0.31692100E+04 0.31698250E+04 0.31698250E+04 0.31744099E+04 + 0.31744099E+04 0.31815779E+04 0.31815779E+04 0.31880200E+04 + 0.31880200E+04 0.31910459E+04 0.31910459E+04 0.31966860E+04 + 0.31966860E+04 0.32017949E+04 0.32017949E+04 0.32061970E+04 + 0.31661909E+04 0.31691660E+04 0.31691660E+04 0.31716741E+04 + 0.31716741E+04 0.31692100E+04 0.31692100E+04 0.31698250E+04 + 0.31698250E+04 0.31744099E+04 0.31744099E+04 0.31815779E+04 + 0.31815779E+04 0.31880200E+04 0.31880200E+04 0.31910459E+04 + 0.31910459E+04 0.31966860E+04 0.31966860E+04 0.32017949E+04 + 0.32017949E+04 0.32061970E+04 0.31583210E+04 0.31526860E+04 + 0.31526860E+04 0.31527319E+04 0.31527319E+04 0.31548760E+04 + 0.31548760E+04 0.31658040E+04 0.31658040E+04 0.31776819E+04 + 0.31776819E+04 0.31851580E+04 0.31851580E+04 0.31881641E+04 + 0.31881641E+04 0.31916790E+04 0.31916790E+04 0.31986499E+04 + 0.31986499E+04 0.32063721E+04 0.32063721E+04 0.32128650E+04 + 0.31583210E+04 0.31526860E+04 0.31526860E+04 0.31527319E+04 + 0.31527319E+04 0.31548760E+04 0.31548760E+04 0.31658040E+04 + 0.31658040E+04 0.31776819E+04 0.31776819E+04 0.31851580E+04 + 0.31851580E+04 0.31881641E+04 0.31881641E+04 0.31916790E+04 + 0.31916790E+04 0.31986499E+04 0.31986499E+04 0.32063721E+04 + 0.32063721E+04 0.32128650E+04 0.31667500E+04 0.31611990E+04 + 0.31611990E+04 0.31622549E+04 0.31622549E+04 0.31626121E+04 + 0.31626121E+04 0.31657930E+04 0.31657930E+04 0.31716431E+04 + 0.31716431E+04 0.31763330E+04 0.31763330E+04 0.31791990E+04 + 0.31791990E+04 0.31860840E+04 0.31860840E+04 0.31971860E+04 + 0.31971860E+04 0.32081001E+04 0.32081001E+04 0.32174431E+04 + 0.31667500E+04 0.31611990E+04 0.31611990E+04 0.31622549E+04 + 0.31622549E+04 0.31626121E+04 0.31626121E+04 0.31657930E+04 + 0.31657930E+04 0.31716431E+04 0.31716431E+04 0.31763330E+04 + 0.31763330E+04 0.31791990E+04 0.31791990E+04 0.31860840E+04 + 0.31860840E+04 0.31971860E+04 0.31971860E+04 0.32081001E+04 + 0.32081001E+04 0.32174431E+04 0.31805581E+04 0.31826230E+04 + 0.31826230E+04 0.31831919E+04 0.31831919E+04 0.31789490E+04 + 0.31789490E+04 0.31713799E+04 0.31713799E+04 0.31682439E+04 + 0.31682439E+04 0.31711970E+04 0.31711970E+04 0.31759009E+04 + 0.31759009E+04 0.31813430E+04 0.31813430E+04 0.31912520E+04 + 0.31912520E+04 0.32034919E+04 0.32034919E+04 0.32155471E+04 + 0.31805581E+04 0.31826230E+04 0.31826230E+04 0.31831919E+04 + 0.31831919E+04 0.31789490E+04 0.31789490E+04 0.31713799E+04 + 0.31713799E+04 0.31682439E+04 0.31682439E+04 0.31711970E+04 + 0.31711970E+04 0.31759009E+04 0.31759009E+04 0.31813430E+04 + 0.31813430E+04 0.31912520E+04 0.31912520E+04 0.32034919E+04 + 0.32034919E+04 0.32155471E+04 0.31795750E+04 0.31879861E+04 + 0.31879861E+04 0.31902991E+04 0.31902991E+04 0.31879880E+04 + 0.31879880E+04 0.31843701E+04 0.31843701E+04 0.31805129E+04 + 0.31805129E+04 0.31790540E+04 0.31790540E+04 0.31767710E+04 + 0.31767710E+04 0.31763989E+04 0.31763989E+04 0.31832681E+04 + 0.31832681E+04 0.31950500E+04 0.31950500E+04 0.32070210E+04 + 0.31795750E+04 0.31879861E+04 0.31879861E+04 0.31902991E+04 + 0.31902991E+04 0.31879880E+04 0.31879880E+04 0.31843701E+04 + 0.31843701E+04 0.31805129E+04 0.31805129E+04 0.31790540E+04 + 0.31790540E+04 0.31767710E+04 0.31767710E+04 0.31763989E+04 + 0.31763989E+04 0.31832681E+04 0.31832681E+04 0.31950500E+04 + 0.31950500E+04 0.32070210E+04 0.31781230E+04 0.31851311E+04 + 0.31851311E+04 0.31896250E+04 0.31896250E+04 0.31885271E+04 + 0.31885271E+04 0.31874351E+04 0.31874351E+04 0.31861770E+04 + 0.31861770E+04 0.31824399E+04 0.31824399E+04 0.31744189E+04 + 0.31744189E+04 0.31712910E+04 0.31712910E+04 0.31754380E+04 + 0.31754380E+04 0.31830020E+04 0.31830020E+04 0.31907400E+04 + 0.31781230E+04 0.31851311E+04 0.31851311E+04 0.31896250E+04 + 0.31896250E+04 0.31885271E+04 0.31885271E+04 0.31874351E+04 + 0.31874351E+04 0.31861770E+04 0.31861770E+04 0.31824399E+04 + 0.31824399E+04 0.31744189E+04 0.31744189E+04 0.31712910E+04 + 0.31712910E+04 0.31754380E+04 0.31754380E+04 0.31830020E+04 + 0.31830020E+04 0.31907400E+04 0.31863579E+04 0.31889419E+04 + 0.31889419E+04 0.31957710E+04 0.31957710E+04 0.31944260E+04 + 0.31944260E+04 0.31890081E+04 0.31890081E+04 0.31854929E+04 + 0.31854929E+04 0.31815840E+04 0.31815840E+04 0.31733970E+04 + 0.31733970E+04 0.31680339E+04 0.31680339E+04 0.31714319E+04 + 0.31714319E+04 0.31762361E+04 0.31762361E+04 0.31808740E+04 + 0.31863579E+04 0.31889419E+04 0.31889419E+04 0.31957710E+04 + 0.31957710E+04 0.31944260E+04 0.31944260E+04 0.31890081E+04 + 0.31890081E+04 0.31854929E+04 0.31854929E+04 0.31815840E+04 + 0.31815840E+04 0.31733970E+04 0.31733970E+04 0.31680339E+04 + 0.31680339E+04 0.31714319E+04 0.31714319E+04 0.31762361E+04 + 0.31762361E+04 0.31808740E+04 0.31959839E+04 0.31960559E+04 + 0.31960559E+04 0.32010020E+04 0.32010020E+04 0.31993960E+04 + 0.31993960E+04 0.31922581E+04 0.31922581E+04 0.31858760E+04 + 0.31858760E+04 0.31806421E+04 0.31806421E+04 0.31726350E+04 + 0.31726350E+04 0.31664541E+04 0.31664541E+04 0.31683191E+04 + 0.31683191E+04 0.31732939E+04 0.31732939E+04 0.31792971E+04 + 0.31959839E+04 0.31960559E+04 0.31960559E+04 0.32010020E+04 + 0.32010020E+04 0.31993960E+04 0.31993960E+04 0.31922581E+04 + 0.31922581E+04 0.31858760E+04 0.31858760E+04 0.31806421E+04 + 0.31806421E+04 0.31726350E+04 0.31726350E+04 0.31664541E+04 + 0.31664541E+04 0.31683191E+04 0.31683191E+04 0.31732939E+04 + 0.31732939E+04 0.31792971E+04 0.31921440E+04 0.31930930E+04 + 0.31930930E+04 0.31959561E+04 0.31959561E+04 0.31939910E+04 + 0.31939910E+04 0.31856299E+04 0.31856299E+04 0.31775229E+04 + 0.31775229E+04 0.31735940E+04 0.31735940E+04 0.31705869E+04 + 0.31705869E+04 0.31683811E+04 0.31683811E+04 0.31695400E+04 + 0.31695400E+04 0.31742229E+04 0.31742229E+04 0.31814460E+04 + 0.31921440E+04 0.31930930E+04 0.31930930E+04 0.31959561E+04 + 0.31959561E+04 0.31939910E+04 0.31939910E+04 0.31856299E+04 + 0.31856299E+04 0.31775229E+04 0.31775229E+04 0.31735940E+04 + 0.31735940E+04 0.31705869E+04 0.31705869E+04 0.31683811E+04 + 0.31683811E+04 0.31695400E+04 0.31695400E+04 0.31742229E+04 + 0.30461021E+04 0.30455500E+04 0.31859800E+04 0.31812820E+04 + 0.31812820E+04 0.31838540E+04 0.31838540E+04 0.31831699E+04 + 0.31831699E+04 0.31771521E+04 0.31771521E+04 0.31724529E+04 + 0.31724529E+04 0.31705139E+04 0.31705139E+04 0.31694800E+04 + 0.31694800E+04 0.31696909E+04 0.31696909E+04 0.31711350E+04 + 0.31711350E+04 0.31735459E+04 0.30508750E+04 0.30468870E+04 + 0.31859800E+04 0.31812820E+04 0.31812820E+04 0.31838540E+04 + 0.31838540E+04 0.31831699E+04 0.31831699E+04 0.31771521E+04 + 0.31771521E+04 0.31724529E+04 0.31724529E+04 0.31705139E+04 + 0.31705139E+04 0.31694800E+04 0.31694800E+04 0.31696909E+04 + 0.30796770E+04 0.30762361E+04 0.30762361E+04 0.30746489E+04 + 0.30508750E+04 0.30468870E+04 0.31882070E+04 0.31754641E+04 + 0.31754641E+04 0.31741360E+04 0.31741360E+04 0.31735530E+04 + 0.31735530E+04 0.31711980E+04 0.31711980E+04 0.31688730E+04 + 0.31688730E+04 0.31679109E+04 0.31679109E+04 0.31686941E+04 + 0.31686941E+04 0.31687891E+04 0.30792549E+04 0.30775039E+04 + 0.30775039E+04 0.30752290E+04 0.30502849E+04 0.30472710E+04 + 0.31882070E+04 0.31754641E+04 0.31754641E+04 0.31741360E+04 + 0.31741360E+04 0.31735530E+04 0.31735530E+04 0.31711980E+04 + 0.31711980E+04 0.31688730E+04 0.31688730E+04 0.31679109E+04 + 0.30909370E+04 0.30865930E+04 0.30865930E+04 0.30792549E+04 + 0.30792549E+04 0.30775039E+04 0.30775039E+04 0.30752290E+04 + 0.30502849E+04 0.30472710E+04 0.31883621E+04 0.31766941E+04 + 0.31766941E+04 0.31714590E+04 0.31714590E+04 0.31694990E+04 + 0.31694990E+04 0.31674741E+04 0.31674741E+04 0.31673420E+04 + 0.31673420E+04 0.31664309E+04 0.30924241E+04 0.30886750E+04 + 0.30886750E+04 0.30833689E+04 0.30833689E+04 0.30795891E+04 + 0.30795891E+04 0.30767100E+04 0.30505420E+04 0.30475259E+04 + 0.31883621E+04 0.31766941E+04 0.31766941E+04 0.31714590E+04 + 0.31714590E+04 0.31694990E+04 0.31694990E+04 0.31674741E+04 + 0.30999751E+04 0.30963530E+04 0.30963530E+04 0.30924241E+04 + 0.30924241E+04 0.30886750E+04 0.30886750E+04 0.30833689E+04 + 0.30833689E+04 0.30795891E+04 0.30795891E+04 0.30767100E+04 + 0.30505420E+04 0.30475259E+04 0.31870281E+04 0.31797500E+04 + 0.31797500E+04 0.31735310E+04 0.31735310E+04 0.31712490E+04 + 0.31712490E+04 0.31673560E+04 0.31013091E+04 0.30977141E+04 + 0.30977141E+04 0.30948821E+04 0.30948821E+04 0.30917241E+04 + 0.30917241E+04 0.30858130E+04 0.30858130E+04 0.30805950E+04 + 0.30805950E+04 0.30775830E+04 0.30505950E+04 0.30480161E+04 + 0.31870281E+04 0.31797500E+04 0.31797500E+04 0.31735310E+04 + 0.31106541E+04 0.31067380E+04 0.31067380E+04 0.31013091E+04 + 0.31013091E+04 0.30977141E+04 0.30977141E+04 0.30948821E+04 + 0.30948821E+04 0.30917241E+04 0.30917241E+04 0.30858130E+04 + 0.30858130E+04 0.30805950E+04 0.30805950E+04 0.30775830E+04 + 0.30505950E+04 0.30480161E+04 0.31867271E+04 0.31817251E+04 + 0.31817251E+04 0.31758960E+04 0.31134480E+04 0.31082920E+04 + 0.31082920E+04 0.31028091E+04 0.31028091E+04 0.30986951E+04 + 0.30986951E+04 0.30928911E+04 0.30928911E+04 0.30886479E+04 + 0.30886479E+04 0.30863730E+04 0.30863730E+04 0.30828650E+04 + 0.30828650E+04 0.30788230E+04 0.30511570E+04 0.30484641E+04 + 0.31219409E+04 0.31186980E+04 0.31186980E+04 0.31134480E+04 + 0.31134480E+04 0.31082920E+04 0.31082920E+04 0.31028091E+04 + 0.31028091E+04 0.30986951E+04 0.30986951E+04 0.30928911E+04 + 0.30928911E+04 0.30886479E+04 0.30886479E+04 0.30863730E+04 + 0.30863730E+04 0.30828650E+04 0.30828650E+04 0.30788230E+04 + 0.30788230E+04 0.30759419E+04 0.31237100E+04 0.31211631E+04 + 0.31211631E+04 0.31180891E+04 0.31180891E+04 0.31126909E+04 + 0.31126909E+04 0.31019470E+04 0.31019470E+04 0.30948020E+04 + 0.30948020E+04 0.30902820E+04 0.30902820E+04 0.30891411E+04 + 0.30891411E+04 0.30903391E+04 0.30903391E+04 0.30862639E+04 + 0.30862639E+04 0.30805591E+04 0.30805591E+04 0.30769409E+04 + 0.31850339E+04 0.31859529E+04 0.31859529E+04 0.31883420E+04 + 0.31883420E+04 0.31878220E+04 0.31878220E+04 0.31825959E+04 + 0.31825959E+04 0.31768120E+04 0.31768120E+04 0.31782190E+04 + 0.31782190E+04 0.31835559E+04 0.31835559E+04 0.31848379E+04 + 0.31848379E+04 0.31856311E+04 0.31856311E+04 0.31908811E+04 + 0.31908811E+04 0.31982439E+04 0.31747500E+04 0.31782871E+04 + 0.31782871E+04 0.31823821E+04 0.31823821E+04 0.31819661E+04 + 0.31819661E+04 0.31789409E+04 0.31789409E+04 0.31783440E+04 + 0.31783440E+04 0.31836990E+04 0.31836990E+04 0.31895581E+04 + 0.31895581E+04 0.31899629E+04 0.31899629E+04 0.31933159E+04 + 0.31933159E+04 0.31981760E+04 0.31981760E+04 0.32033889E+04 + 0.31747500E+04 0.31782871E+04 0.31782871E+04 0.31823821E+04 + 0.31823821E+04 0.31819661E+04 0.31819661E+04 0.31789409E+04 + 0.31789409E+04 0.31783440E+04 0.31783440E+04 0.31836990E+04 + 0.31836990E+04 0.31895581E+04 0.31895581E+04 0.31899629E+04 + 0.31899629E+04 0.31933159E+04 0.31933159E+04 0.31981760E+04 + 0.31981760E+04 0.32033889E+04 0.31661909E+04 0.31691660E+04 + 0.31691660E+04 0.31716741E+04 0.31716741E+04 0.31692100E+04 + 0.31692100E+04 0.31698250E+04 0.31698250E+04 0.31744099E+04 + 0.31744099E+04 0.31815779E+04 0.31815779E+04 0.31880200E+04 + 0.31880200E+04 0.31910459E+04 0.31910459E+04 0.31966860E+04 + 0.31966860E+04 0.32017949E+04 0.32017949E+04 0.32061970E+04 + 0.31661909E+04 0.31691660E+04 0.31691660E+04 0.31716741E+04 + 0.31716741E+04 0.31692100E+04 0.31692100E+04 0.31698250E+04 + 0.31698250E+04 0.31744099E+04 0.31744099E+04 0.31815779E+04 + 0.31815779E+04 0.31880200E+04 0.31880200E+04 0.31910459E+04 + 0.31910459E+04 0.31966860E+04 0.31966860E+04 0.32017949E+04 + 0.32017949E+04 0.32061970E+04 0.31583210E+04 0.31526860E+04 + 0.31526860E+04 0.31527319E+04 0.31527319E+04 0.31548760E+04 + 0.31548760E+04 0.31658040E+04 0.31658040E+04 0.31776819E+04 + 0.31776819E+04 0.31851580E+04 0.31851580E+04 0.31881641E+04 + 0.31881641E+04 0.31916790E+04 0.31916790E+04 0.31986499E+04 + 0.31986499E+04 0.32063721E+04 0.32063721E+04 0.32128650E+04 + 0.31583210E+04 0.31526860E+04 0.31526860E+04 0.31527319E+04 + 0.31527319E+04 0.31548760E+04 0.31548760E+04 0.31658040E+04 + 0.31658040E+04 0.31776819E+04 0.31776819E+04 0.31851580E+04 + 0.31851580E+04 0.31881641E+04 0.31881641E+04 0.31916790E+04 + 0.31916790E+04 0.31986499E+04 0.31986499E+04 0.32063721E+04 + 0.32063721E+04 0.32128650E+04 0.31667500E+04 0.31611990E+04 + 0.31611990E+04 0.31622549E+04 0.31622549E+04 0.31626121E+04 + 0.31626121E+04 0.31657930E+04 0.31657930E+04 0.31716431E+04 + 0.31716431E+04 0.31763330E+04 0.31763330E+04 0.31791990E+04 + 0.31791990E+04 0.31860840E+04 0.31860840E+04 0.31971860E+04 + 0.31971860E+04 0.32081001E+04 0.32081001E+04 0.32174431E+04 + 0.31667500E+04 0.31611990E+04 0.31611990E+04 0.31622549E+04 + 0.31622549E+04 0.31626121E+04 0.31626121E+04 0.31657930E+04 + 0.31657930E+04 0.31716431E+04 0.31716431E+04 0.31763330E+04 + 0.31763330E+04 0.31791990E+04 0.31791990E+04 0.31860840E+04 + 0.31860840E+04 0.31971860E+04 0.31971860E+04 0.32081001E+04 + 0.32081001E+04 0.32174431E+04 0.31805581E+04 0.31826230E+04 + 0.31826230E+04 0.31831919E+04 0.31831919E+04 0.31789490E+04 + 0.31789490E+04 0.31713799E+04 0.31713799E+04 0.31682439E+04 + 0.31682439E+04 0.31711970E+04 0.31711970E+04 0.31759009E+04 + 0.31759009E+04 0.31813430E+04 0.31813430E+04 0.31912520E+04 + 0.31912520E+04 0.32034919E+04 0.32034919E+04 0.32155471E+04 + 0.31805581E+04 0.31826230E+04 0.31826230E+04 0.31831919E+04 + 0.31831919E+04 0.31789490E+04 0.31789490E+04 0.31713799E+04 + 0.31713799E+04 0.31682439E+04 0.31682439E+04 0.31711970E+04 + 0.31711970E+04 0.31759009E+04 0.31759009E+04 0.31813430E+04 + 0.31813430E+04 0.31912520E+04 0.31912520E+04 0.32034919E+04 + 0.32034919E+04 0.32155471E+04 0.31795750E+04 0.31879861E+04 + 0.31879861E+04 0.31902991E+04 0.31902991E+04 0.31879880E+04 + 0.31879880E+04 0.31843701E+04 0.31843701E+04 0.31805129E+04 + 0.31805129E+04 0.31790540E+04 0.31790540E+04 0.31767710E+04 + 0.31767710E+04 0.31763989E+04 0.31763989E+04 0.31832681E+04 + 0.31832681E+04 0.31950500E+04 0.31950500E+04 0.32070210E+04 + 0.31795750E+04 0.31879861E+04 0.31879861E+04 0.31902991E+04 + 0.31902991E+04 0.31879880E+04 0.31879880E+04 0.31843701E+04 + 0.31843701E+04 0.31805129E+04 0.31805129E+04 0.31790540E+04 + 0.31790540E+04 0.31767710E+04 0.31767710E+04 0.31763989E+04 + 0.31763989E+04 0.31832681E+04 0.31832681E+04 0.31950500E+04 + 0.31950500E+04 0.32070210E+04 0.31781230E+04 0.31851311E+04 + 0.31851311E+04 0.31896250E+04 0.31896250E+04 0.31885271E+04 + 0.31885271E+04 0.31874351E+04 0.31874351E+04 0.31861770E+04 + 0.31861770E+04 0.31824399E+04 0.31824399E+04 0.31744189E+04 + 0.31744189E+04 0.31712910E+04 0.31712910E+04 0.31754380E+04 + 0.31754380E+04 0.31830020E+04 0.31830020E+04 0.31907400E+04 + 0.31781230E+04 0.31851311E+04 0.31851311E+04 0.31896250E+04 + 0.31896250E+04 0.31885271E+04 0.31885271E+04 0.31874351E+04 + 0.31874351E+04 0.31861770E+04 0.31861770E+04 0.31824399E+04 + 0.31824399E+04 0.31744189E+04 0.31744189E+04 0.31712910E+04 + 0.31712910E+04 0.31754380E+04 0.31754380E+04 0.31830020E+04 + 0.31830020E+04 0.31907400E+04 0.31863579E+04 0.31889419E+04 + 0.31889419E+04 0.31957710E+04 0.31957710E+04 0.31944260E+04 + 0.31944260E+04 0.31890081E+04 0.31890081E+04 0.31854929E+04 + 0.31854929E+04 0.31815840E+04 0.31815840E+04 0.31733970E+04 + 0.31733970E+04 0.31680339E+04 0.31680339E+04 0.31714319E+04 + 0.31714319E+04 0.31762361E+04 0.31762361E+04 0.31808740E+04 + 0.31863579E+04 0.31889419E+04 0.31889419E+04 0.31957710E+04 + 0.31957710E+04 0.31944260E+04 0.31944260E+04 0.31890081E+04 + 0.31890081E+04 0.31854929E+04 0.31854929E+04 0.31815840E+04 + 0.31815840E+04 0.31733970E+04 0.31733970E+04 0.31680339E+04 + 0.31680339E+04 0.31714319E+04 0.31714319E+04 0.31762361E+04 + 0.31762361E+04 0.31808740E+04 0.31959839E+04 0.31960559E+04 + 0.31960559E+04 0.32010020E+04 0.32010020E+04 0.31993960E+04 + 0.31993960E+04 0.31922581E+04 0.31922581E+04 0.31858760E+04 + 0.31858760E+04 0.31806421E+04 0.31806421E+04 0.31726350E+04 + 0.31726350E+04 0.31664541E+04 0.31664541E+04 0.31683191E+04 + 0.31683191E+04 0.31732939E+04 0.31732939E+04 0.31792971E+04 + 0.31959839E+04 0.31960559E+04 0.31960559E+04 0.32010020E+04 + 0.32010020E+04 0.31993960E+04 0.31993960E+04 0.31922581E+04 + 0.31922581E+04 0.31858760E+04 0.31858760E+04 0.31806421E+04 + 0.31806421E+04 0.31726350E+04 0.31726350E+04 0.31664541E+04 + 0.31664541E+04 0.31683191E+04 0.31683191E+04 0.31732939E+04 + 0.31732939E+04 0.31792971E+04 0.31921440E+04 0.31930930E+04 + 0.31930930E+04 0.31959561E+04 0.31959561E+04 0.31939910E+04 + 0.31939910E+04 0.31856299E+04 0.31856299E+04 0.31775229E+04 + 0.31775229E+04 0.31735940E+04 0.31735940E+04 0.31705869E+04 + 0.31705869E+04 0.31683811E+04 0.31683811E+04 0.31695400E+04 + 0.31695400E+04 0.31742229E+04 0.31742229E+04 0.31814460E+04 + 0.31921440E+04 0.31930930E+04 0.31930930E+04 0.31959561E+04 + 0.31959561E+04 0.31939910E+04 0.31939910E+04 0.31856299E+04 + 0.31856299E+04 0.31775229E+04 0.31775229E+04 0.31735940E+04 + 0.31735940E+04 0.31705869E+04 0.31705869E+04 0.31683811E+04 + 0.31683811E+04 0.31695400E+04 0.31695400E+04 0.31742229E+04 + 0.30461021E+04 0.30455500E+04 0.31859800E+04 0.31812820E+04 + 0.31812820E+04 0.31838540E+04 0.31838540E+04 0.31831699E+04 + 0.31831699E+04 0.31771521E+04 0.31771521E+04 0.31724529E+04 + 0.31724529E+04 0.31705139E+04 0.31705139E+04 0.31694800E+04 + 0.31694800E+04 0.31696909E+04 0.31696909E+04 0.31711350E+04 + 0.31711350E+04 0.31735459E+04 0.30508750E+04 0.30468870E+04 + 0.31859800E+04 0.31812820E+04 0.31812820E+04 0.31838540E+04 + 0.31838540E+04 0.31831699E+04 0.31831699E+04 0.31771521E+04 + 0.31771521E+04 0.31724529E+04 0.31724529E+04 0.31705139E+04 + 0.31705139E+04 0.31694800E+04 0.31694800E+04 0.31696909E+04 + 0.30796770E+04 0.30762361E+04 0.30762361E+04 0.30746489E+04 + 0.30508750E+04 0.30468870E+04 0.31882070E+04 0.31754641E+04 + 0.31754641E+04 0.31741360E+04 0.31741360E+04 0.31735530E+04 + 0.31735530E+04 0.31711980E+04 0.31711980E+04 0.31688730E+04 + 0.31688730E+04 0.31679109E+04 0.31679109E+04 0.31686941E+04 + 0.31686941E+04 0.31687891E+04 0.30792549E+04 0.30775039E+04 + 0.30775039E+04 0.30752290E+04 0.30502849E+04 0.30472710E+04 + 0.31882070E+04 0.31754641E+04 0.31754641E+04 0.31741360E+04 + 0.31741360E+04 0.31735530E+04 0.31735530E+04 0.31711980E+04 + 0.31711980E+04 0.31688730E+04 0.31688730E+04 0.31679109E+04 + 0.30909370E+04 0.30865930E+04 0.30865930E+04 0.30792549E+04 + 0.30792549E+04 0.30775039E+04 0.30775039E+04 0.30752290E+04 + 0.30502849E+04 0.30472710E+04 0.31883621E+04 0.31766941E+04 + 0.31766941E+04 0.31714590E+04 0.31714590E+04 0.31694990E+04 + 0.31694990E+04 0.31674741E+04 0.31674741E+04 0.31673420E+04 + 0.31673420E+04 0.31664309E+04 0.30924241E+04 0.30886750E+04 + 0.30886750E+04 0.30833689E+04 0.30833689E+04 0.30795891E+04 + 0.30795891E+04 0.30767100E+04 0.30505420E+04 0.30475259E+04 + 0.31883621E+04 0.31766941E+04 0.31766941E+04 0.31714590E+04 + 0.31714590E+04 0.31694990E+04 0.31694990E+04 0.31674741E+04 + 0.30999751E+04 0.30963530E+04 0.30963530E+04 0.30924241E+04 + 0.30924241E+04 0.30886750E+04 0.30886750E+04 0.30833689E+04 + 0.30833689E+04 0.30795891E+04 0.30795891E+04 0.30767100E+04 + 0.30505420E+04 0.30475259E+04 0.31870281E+04 0.31797500E+04 + 0.31797500E+04 0.31735310E+04 0.31735310E+04 0.31712490E+04 + 0.31712490E+04 0.31673560E+04 0.31013091E+04 0.30977141E+04 + 0.30977141E+04 0.30948821E+04 0.30948821E+04 0.30917241E+04 + 0.30917241E+04 0.30858130E+04 0.30858130E+04 0.30805950E+04 + 0.30805950E+04 0.30775830E+04 0.30505950E+04 0.30480161E+04 + 0.31870281E+04 0.31797500E+04 0.31797500E+04 0.31735310E+04 + 0.31106541E+04 0.31067380E+04 0.31067380E+04 0.31013091E+04 + 0.31013091E+04 0.30977141E+04 0.30977141E+04 0.30948821E+04 + 0.30948821E+04 0.30917241E+04 0.30917241E+04 0.30858130E+04 + 0.30858130E+04 0.30805950E+04 0.30805950E+04 0.30775830E+04 + 0.30505950E+04 0.30480161E+04 0.31867271E+04 0.31817251E+04 + 0.31817251E+04 0.31758960E+04 0.31134480E+04 0.31082920E+04 + 0.31082920E+04 0.31028091E+04 0.31028091E+04 0.30986951E+04 + 0.30986951E+04 0.30928911E+04 0.30928911E+04 0.30886479E+04 + 0.30886479E+04 0.30863730E+04 0.30863730E+04 0.30828650E+04 + 0.30828650E+04 0.30788230E+04 0.30511570E+04 0.30484641E+04 + 0.31219409E+04 0.31186980E+04 0.31186980E+04 0.31134480E+04 + 0.31134480E+04 0.31082920E+04 0.31082920E+04 0.31028091E+04 + 0.31028091E+04 0.30986951E+04 0.30986951E+04 0.30928911E+04 + 0.30928911E+04 0.30886479E+04 0.30886479E+04 0.30863730E+04 + 0.30863730E+04 0.30828650E+04 0.30828650E+04 0.30788230E+04 + 0.30788230E+04 0.30759419E+04 0.31237100E+04 0.31211631E+04 + 0.31211631E+04 0.31180891E+04 0.31180891E+04 0.31126909E+04 + 0.31126909E+04 0.31019470E+04 0.31019470E+04 0.30948020E+04 + 0.30948020E+04 0.30902820E+04 0.30902820E+04 0.30891411E+04 + 0.30891411E+04 0.30903391E+04 0.30903391E+04 0.30862639E+04 + 0.30862639E+04 0.30805591E+04 0.30805591E+04 0.30769409E+04 + 0.31862280E+04 0.31870491E+04 0.31870491E+04 0.31894661E+04 + 0.31894661E+04 0.31890049E+04 0.31890049E+04 0.31838049E+04 + 0.31838049E+04 0.31779089E+04 0.31779089E+04 0.31791770E+04 + 0.31791770E+04 0.31845129E+04 0.31845129E+04 0.31858760E+04 + 0.31858760E+04 0.31866780E+04 0.31866780E+04 0.31919099E+04 + 0.31919099E+04 0.31992520E+04 0.31759661E+04 0.31793831E+04 + 0.31793831E+04 0.31835281E+04 0.31835281E+04 0.31831890E+04 + 0.31831890E+04 0.31801470E+04 0.31801470E+04 0.31794250E+04 + 0.31794250E+04 0.31846860E+04 0.31846860E+04 0.31906211E+04 + 0.31906211E+04 0.31910759E+04 0.31910759E+04 0.31943931E+04 + 0.31943931E+04 0.31992371E+04 0.31992371E+04 0.32043611E+04 + 0.31759661E+04 0.31793831E+04 0.31793831E+04 0.31835281E+04 + 0.31835281E+04 0.31831890E+04 0.31831890E+04 0.31801470E+04 + 0.31801470E+04 0.31794250E+04 0.31794250E+04 0.31846860E+04 + 0.31846860E+04 0.31906211E+04 0.31906211E+04 0.31910759E+04 + 0.31910759E+04 0.31943931E+04 0.31943931E+04 0.31992371E+04 + 0.31992371E+04 0.32043611E+04 0.31674500E+04 0.31703521E+04 + 0.31703521E+04 0.31729131E+04 0.31729131E+04 0.31704241E+04 + 0.31704241E+04 0.31708560E+04 0.31708560E+04 0.31752930E+04 + 0.31752930E+04 0.31824199E+04 0.31824199E+04 0.31889451E+04 + 0.31889451E+04 0.31920300E+04 0.31920300E+04 0.31976499E+04 + 0.31976499E+04 0.32027351E+04 0.32027351E+04 0.32069839E+04 + 0.31674500E+04 0.31703521E+04 0.31703521E+04 0.31729131E+04 + 0.31729131E+04 0.31704241E+04 0.31704241E+04 0.31708560E+04 + 0.31708560E+04 0.31752930E+04 0.31752930E+04 0.31824199E+04 + 0.31824199E+04 0.31889451E+04 0.31889451E+04 0.31920300E+04 + 0.31920300E+04 0.31976499E+04 0.31976499E+04 0.32027351E+04 + 0.32027351E+04 0.32069839E+04 0.31592681E+04 0.31535730E+04 + 0.31535730E+04 0.31536211E+04 0.31536211E+04 0.31556589E+04 + 0.31556589E+04 0.31664810E+04 0.31664810E+04 0.31783479E+04 + 0.31783479E+04 0.31859060E+04 0.31859060E+04 0.31889729E+04 + 0.31889729E+04 0.31924880E+04 0.31924880E+04 0.31993589E+04 + 0.31993589E+04 0.32069880E+04 0.32069880E+04 0.32133831E+04 + 0.31592681E+04 0.31535730E+04 0.31535730E+04 0.31536211E+04 + 0.31536211E+04 0.31556589E+04 0.31556589E+04 0.31664810E+04 + 0.31664810E+04 0.31783479E+04 0.31783479E+04 0.31859060E+04 + 0.31859060E+04 0.31889729E+04 0.31889729E+04 0.31924880E+04 + 0.31924880E+04 0.31993589E+04 0.31993589E+04 0.32069880E+04 + 0.32069880E+04 0.32133831E+04 0.31672800E+04 0.31617390E+04 + 0.31617390E+04 0.31628940E+04 0.31628940E+04 0.31632729E+04 + 0.31632729E+04 0.31664451E+04 0.31664451E+04 0.31722810E+04 + 0.31722810E+04 0.31769561E+04 0.31769561E+04 0.31797549E+04 + 0.31797549E+04 0.31866121E+04 0.31866121E+04 0.31976770E+04 + 0.31976770E+04 0.32085681E+04 0.32085681E+04 0.32179009E+04 + 0.31672800E+04 0.31617390E+04 0.31617390E+04 0.31628940E+04 + 0.31628940E+04 0.31632729E+04 0.31632729E+04 0.31664451E+04 + 0.31664451E+04 0.31722810E+04 0.31722810E+04 0.31769561E+04 + 0.31769561E+04 0.31797549E+04 0.31797549E+04 0.31866121E+04 + 0.31866121E+04 0.31976770E+04 0.31976770E+04 0.32085681E+04 + 0.32085681E+04 0.32179009E+04 0.31811160E+04 0.31831340E+04 + 0.31831340E+04 0.31837300E+04 0.31837300E+04 0.31795300E+04 + 0.31795300E+04 0.31719360E+04 0.31719360E+04 0.31687229E+04 + 0.31687229E+04 0.31716399E+04 0.31716399E+04 0.31763870E+04 + 0.31763870E+04 0.31817949E+04 0.31817949E+04 0.31916580E+04 + 0.31916580E+04 0.32039060E+04 0.32039060E+04 0.32159780E+04 + 0.31811160E+04 0.31831340E+04 0.31831340E+04 0.31837300E+04 + 0.31837300E+04 0.31795300E+04 0.31795300E+04 0.31719360E+04 + 0.31719360E+04 0.31687229E+04 0.31687229E+04 0.31716399E+04 + 0.31716399E+04 0.31763870E+04 0.31763870E+04 0.31817949E+04 + 0.31817949E+04 0.31916580E+04 0.31916580E+04 0.32039060E+04 + 0.32039060E+04 0.32159780E+04 0.31800381E+04 0.31884500E+04 + 0.31884500E+04 0.31908589E+04 0.31908589E+04 0.31885701E+04 + 0.31885701E+04 0.31849121E+04 0.31849121E+04 0.31809780E+04 + 0.31809780E+04 0.31795190E+04 0.31795190E+04 0.31772461E+04 + 0.31772461E+04 0.31767759E+04 0.31767759E+04 0.31836370E+04 + 0.31836370E+04 0.31954919E+04 0.31954919E+04 0.32075601E+04 + 0.31800381E+04 0.31884500E+04 0.31884500E+04 0.31908589E+04 + 0.31908589E+04 0.31885701E+04 0.31885701E+04 0.31849121E+04 + 0.31849121E+04 0.31809780E+04 0.31809780E+04 0.31795190E+04 + 0.31795190E+04 0.31772461E+04 0.31772461E+04 0.31767759E+04 + 0.31767759E+04 0.31836370E+04 0.31836370E+04 0.31954919E+04 + 0.31954919E+04 0.32075601E+04 0.31785371E+04 0.31855710E+04 + 0.31855710E+04 0.31901370E+04 0.31901370E+04 0.31890569E+04 + 0.31890569E+04 0.31879399E+04 0.31879399E+04 0.31866699E+04 + 0.31866699E+04 0.31829900E+04 0.31829900E+04 0.31749189E+04 + 0.31749189E+04 0.31717090E+04 0.31717090E+04 0.31758220E+04 + 0.31758220E+04 0.31834290E+04 0.31834290E+04 0.31912661E+04 + 0.31785371E+04 0.31855710E+04 0.31855710E+04 0.31901370E+04 + 0.31901370E+04 0.31890569E+04 0.31890569E+04 0.31879399E+04 + 0.31879399E+04 0.31866699E+04 0.31866699E+04 0.31829900E+04 + 0.31829900E+04 0.31749189E+04 0.31749189E+04 0.31717090E+04 + 0.31717090E+04 0.31758220E+04 0.31758220E+04 0.31834290E+04 + 0.31834290E+04 0.31912661E+04 0.31868069E+04 0.31893501E+04 + 0.31893501E+04 0.31962190E+04 0.31962190E+04 0.31949551E+04 + 0.31949551E+04 0.31895110E+04 0.31895110E+04 0.31859819E+04 + 0.31859819E+04 0.31821201E+04 0.31821201E+04 0.31739241E+04 + 0.31739241E+04 0.31684529E+04 0.31684529E+04 0.31718291E+04 + 0.31718291E+04 0.31766250E+04 0.31766250E+04 0.31812471E+04 + 0.31868069E+04 0.31893501E+04 0.31893501E+04 0.31962190E+04 + 0.31962190E+04 0.31949551E+04 0.31949551E+04 0.31895110E+04 + 0.31895110E+04 0.31859819E+04 0.31859819E+04 0.31821201E+04 + 0.31821201E+04 0.31739241E+04 0.31739241E+04 0.31684529E+04 + 0.31684529E+04 0.31718291E+04 0.31718291E+04 0.31766250E+04 + 0.31766250E+04 0.31812471E+04 0.31965569E+04 0.31965281E+04 + 0.31965281E+04 0.32014729E+04 0.32014729E+04 0.31999529E+04 + 0.31999529E+04 0.31928259E+04 0.31928259E+04 0.31864060E+04 + 0.31864060E+04 0.31811780E+04 0.31811780E+04 0.31731440E+04 + 0.31731440E+04 0.31668821E+04 0.31668821E+04 0.31686660E+04 + 0.31686660E+04 0.31735540E+04 0.31735540E+04 0.31794861E+04 + 0.31965569E+04 0.31965281E+04 0.31965281E+04 0.32014729E+04 + 0.32014729E+04 0.31999529E+04 0.31999529E+04 0.31928259E+04 + 0.31928259E+04 0.31864060E+04 0.31864060E+04 0.31811780E+04 + 0.31811780E+04 0.31731440E+04 0.31731440E+04 0.31668821E+04 + 0.31668821E+04 0.31686660E+04 0.31686660E+04 0.31735540E+04 + 0.31735540E+04 0.31794861E+04 0.31927520E+04 0.31936289E+04 + 0.31936289E+04 0.31964790E+04 0.31964790E+04 0.31945920E+04 + 0.31945920E+04 0.31862710E+04 0.31862710E+04 0.31781050E+04 + 0.31781050E+04 0.31741509E+04 0.31741509E+04 0.31710820E+04 + 0.31710820E+04 0.31686741E+04 0.31686741E+04 0.31697000E+04 + 0.31697000E+04 0.31744600E+04 0.31744600E+04 0.31816919E+04 + 0.31927520E+04 0.31936289E+04 0.31936289E+04 0.31964790E+04 + 0.31964790E+04 0.31945920E+04 0.31945920E+04 0.31862710E+04 + 0.31862710E+04 0.31781050E+04 0.31781050E+04 0.31741509E+04 + 0.31741509E+04 0.31710820E+04 0.31710820E+04 0.31686741E+04 + 0.31686741E+04 0.31697000E+04 0.31697000E+04 0.31744600E+04 + 0.30463650E+04 0.30458721E+04 0.31866230E+04 0.31817971E+04 + 0.31817971E+04 0.31843589E+04 0.31843589E+04 0.31837561E+04 + 0.31837561E+04 0.31777019E+04 0.31777019E+04 0.31728621E+04 + 0.31728621E+04 0.31707971E+04 0.31707971E+04 0.31696521E+04 + 0.31696521E+04 0.31699380E+04 0.31699380E+04 0.31713459E+04 + 0.31713459E+04 0.31737271E+04 0.30511479E+04 0.30471980E+04 + 0.31866230E+04 0.31817971E+04 0.31817971E+04 0.31843589E+04 + 0.31843589E+04 0.31837561E+04 0.31837561E+04 0.31777019E+04 + 0.31777019E+04 0.31728621E+04 0.31728621E+04 0.31707971E+04 + 0.31707971E+04 0.31696521E+04 0.31696521E+04 0.31699380E+04 + 0.30801890E+04 0.30767639E+04 0.30767639E+04 0.30751941E+04 + 0.30511479E+04 0.30471980E+04 0.31889270E+04 0.31760500E+04 + 0.31760500E+04 0.31745950E+04 0.31745950E+04 0.31739109E+04 + 0.31739109E+04 0.31714370E+04 0.31714370E+04 0.31689939E+04 + 0.31689939E+04 0.31681089E+04 0.31681089E+04 0.31688921E+04 + 0.31688921E+04 0.31689771E+04 0.30797310E+04 0.30780249E+04 + 0.30780249E+04 0.30757871E+04 0.30505820E+04 0.30475930E+04 + 0.31889270E+04 0.31760500E+04 0.31760500E+04 0.31745950E+04 + 0.31745950E+04 0.31739109E+04 0.31739109E+04 0.31714370E+04 + 0.31714370E+04 0.31689939E+04 0.31689939E+04 0.31681089E+04 + 0.30915540E+04 0.30871951E+04 0.30871951E+04 0.30797310E+04 + 0.30797310E+04 0.30780249E+04 0.30780249E+04 0.30757871E+04 + 0.30505820E+04 0.30475930E+04 0.31889490E+04 0.31770811E+04 + 0.31770811E+04 0.31716890E+04 0.31716890E+04 0.31697710E+04 + 0.31697710E+04 0.31677180E+04 0.31677180E+04 0.31674871E+04 + 0.31674871E+04 0.31665510E+04 0.30930720E+04 0.30893320E+04 + 0.30893320E+04 0.30839189E+04 0.30839189E+04 0.30801270E+04 + 0.30801270E+04 0.30772661E+04 0.30508560E+04 0.30478701E+04 + 0.31889490E+04 0.31770811E+04 0.31770811E+04 0.31716890E+04 + 0.31716890E+04 0.31697710E+04 0.31697710E+04 0.31677180E+04 + 0.31006699E+04 0.30970459E+04 0.30970459E+04 0.30930720E+04 + 0.30930720E+04 0.30893320E+04 0.30893320E+04 0.30839189E+04 + 0.30839189E+04 0.30801270E+04 0.30801270E+04 0.30772661E+04 + 0.30508560E+04 0.30478701E+04 0.31875061E+04 0.31801440E+04 + 0.31801440E+04 0.31738369E+04 0.31738369E+04 0.31715181E+04 + 0.31715181E+04 0.31676470E+04 0.31020300E+04 0.30984709E+04 + 0.30984709E+04 0.30955620E+04 0.30955620E+04 0.30923601E+04 + 0.30923601E+04 0.30864651E+04 0.30864651E+04 0.30811350E+04 + 0.30811350E+04 0.30781489E+04 0.30509189E+04 0.30483630E+04 + 0.31875061E+04 0.31801440E+04 0.31801440E+04 0.31738369E+04 + 0.31114861E+04 0.31075349E+04 0.31075349E+04 0.31020300E+04 + 0.31020300E+04 0.30984709E+04 0.30984709E+04 0.30955620E+04 + 0.30955620E+04 0.30923601E+04 0.30923601E+04 0.30864651E+04 + 0.30864651E+04 0.30811350E+04 0.30811350E+04 0.30781489E+04 + 0.30509189E+04 0.30483630E+04 0.31871941E+04 0.31821221E+04 + 0.31821221E+04 0.31762710E+04 0.31144280E+04 0.31092080E+04 + 0.31092080E+04 0.31035330E+04 0.31035330E+04 0.30993269E+04 + 0.30993269E+04 0.30935320E+04 0.30935320E+04 0.30893191E+04 + 0.30893191E+04 0.30870359E+04 0.30870359E+04 0.30834480E+04 + 0.30834480E+04 0.30794480E+04 0.30514910E+04 0.30488459E+04 + 0.31232461E+04 0.31199500E+04 0.31199500E+04 0.31144280E+04 + 0.31144280E+04 0.31092080E+04 0.31092080E+04 0.31035330E+04 + 0.31035330E+04 0.30993269E+04 0.30993269E+04 0.30935320E+04 + 0.30935320E+04 0.30893191E+04 0.30893191E+04 0.30870359E+04 + 0.30870359E+04 0.30834480E+04 0.30834480E+04 0.30794480E+04 + 0.30794480E+04 0.30766160E+04 0.31250181E+04 0.31225110E+04 + 0.31225110E+04 0.31192080E+04 0.31192080E+04 0.31134360E+04 + 0.31134360E+04 0.31025449E+04 0.31025449E+04 0.30953950E+04 + 0.30953950E+04 0.30908660E+04 0.30908660E+04 0.30897549E+04 + 0.30897549E+04 0.30909800E+04 0.30909800E+04 0.30869751E+04 + 0.30869751E+04 0.30811980E+04 0.30811980E+04 0.30775750E+04 + 0.31862280E+04 0.31870491E+04 0.31870491E+04 0.31894661E+04 + 0.31894661E+04 0.31890049E+04 0.31890049E+04 0.31838049E+04 + 0.31838049E+04 0.31779089E+04 0.31779089E+04 0.31791770E+04 + 0.31791770E+04 0.31845129E+04 0.31845129E+04 0.31858760E+04 + 0.31858760E+04 0.31866780E+04 0.31866780E+04 0.31919099E+04 + 0.31919099E+04 0.31992520E+04 0.31759661E+04 0.31793831E+04 + 0.31793831E+04 0.31835281E+04 0.31835281E+04 0.31831890E+04 + 0.31831890E+04 0.31801470E+04 0.31801470E+04 0.31794250E+04 + 0.31794250E+04 0.31846860E+04 0.31846860E+04 0.31906211E+04 + 0.31906211E+04 0.31910759E+04 0.31910759E+04 0.31943931E+04 + 0.31943931E+04 0.31992371E+04 0.31992371E+04 0.32043611E+04 + 0.31759661E+04 0.31793831E+04 0.31793831E+04 0.31835281E+04 + 0.31835281E+04 0.31831890E+04 0.31831890E+04 0.31801470E+04 + 0.31801470E+04 0.31794250E+04 0.31794250E+04 0.31846860E+04 + 0.31846860E+04 0.31906211E+04 0.31906211E+04 0.31910759E+04 + 0.31910759E+04 0.31943931E+04 0.31943931E+04 0.31992371E+04 + 0.31992371E+04 0.32043611E+04 0.31674500E+04 0.31703521E+04 + 0.31703521E+04 0.31729131E+04 0.31729131E+04 0.31704241E+04 + 0.31704241E+04 0.31708560E+04 0.31708560E+04 0.31752930E+04 + 0.31752930E+04 0.31824199E+04 0.31824199E+04 0.31889451E+04 + 0.31889451E+04 0.31920300E+04 0.31920300E+04 0.31976499E+04 + 0.31976499E+04 0.32027351E+04 0.32027351E+04 0.32069839E+04 + 0.31674500E+04 0.31703521E+04 0.31703521E+04 0.31729131E+04 + 0.31729131E+04 0.31704241E+04 0.31704241E+04 0.31708560E+04 + 0.31708560E+04 0.31752930E+04 0.31752930E+04 0.31824199E+04 + 0.31824199E+04 0.31889451E+04 0.31889451E+04 0.31920300E+04 + 0.31920300E+04 0.31976499E+04 0.31976499E+04 0.32027351E+04 + 0.32027351E+04 0.32069839E+04 0.31592681E+04 0.31535730E+04 + 0.31535730E+04 0.31536211E+04 0.31536211E+04 0.31556589E+04 + 0.31556589E+04 0.31664810E+04 0.31664810E+04 0.31783479E+04 + 0.31783479E+04 0.31859060E+04 0.31859060E+04 0.31889729E+04 + 0.31889729E+04 0.31924880E+04 0.31924880E+04 0.31993589E+04 + 0.31993589E+04 0.32069880E+04 0.32069880E+04 0.32133831E+04 + 0.31592681E+04 0.31535730E+04 0.31535730E+04 0.31536211E+04 + 0.31536211E+04 0.31556589E+04 0.31556589E+04 0.31664810E+04 + 0.31664810E+04 0.31783479E+04 0.31783479E+04 0.31859060E+04 + 0.31859060E+04 0.31889729E+04 0.31889729E+04 0.31924880E+04 + 0.31924880E+04 0.31993589E+04 0.31993589E+04 0.32069880E+04 + 0.32069880E+04 0.32133831E+04 0.31672800E+04 0.31617390E+04 + 0.31617390E+04 0.31628940E+04 0.31628940E+04 0.31632729E+04 + 0.31632729E+04 0.31664451E+04 0.31664451E+04 0.31722810E+04 + 0.31722810E+04 0.31769561E+04 0.31769561E+04 0.31797549E+04 + 0.31797549E+04 0.31866121E+04 0.31866121E+04 0.31976770E+04 + 0.31976770E+04 0.32085681E+04 0.32085681E+04 0.32179009E+04 + 0.31672800E+04 0.31617390E+04 0.31617390E+04 0.31628940E+04 + 0.31628940E+04 0.31632729E+04 0.31632729E+04 0.31664451E+04 + 0.31664451E+04 0.31722810E+04 0.31722810E+04 0.31769561E+04 + 0.31769561E+04 0.31797549E+04 0.31797549E+04 0.31866121E+04 + 0.31866121E+04 0.31976770E+04 0.31976770E+04 0.32085681E+04 + 0.32085681E+04 0.32179009E+04 0.31811160E+04 0.31831340E+04 + 0.31831340E+04 0.31837300E+04 0.31837300E+04 0.31795300E+04 + 0.31795300E+04 0.31719360E+04 0.31719360E+04 0.31687229E+04 + 0.31687229E+04 0.31716399E+04 0.31716399E+04 0.31763870E+04 + 0.31763870E+04 0.31817949E+04 0.31817949E+04 0.31916580E+04 + 0.31916580E+04 0.32039060E+04 0.32039060E+04 0.32159780E+04 + 0.31811160E+04 0.31831340E+04 0.31831340E+04 0.31837300E+04 + 0.31837300E+04 0.31795300E+04 0.31795300E+04 0.31719360E+04 + 0.31719360E+04 0.31687229E+04 0.31687229E+04 0.31716399E+04 + 0.31716399E+04 0.31763870E+04 0.31763870E+04 0.31817949E+04 + 0.31817949E+04 0.31916580E+04 0.31916580E+04 0.32039060E+04 + 0.32039060E+04 0.32159780E+04 0.31800381E+04 0.31884500E+04 + 0.31884500E+04 0.31908589E+04 0.31908589E+04 0.31885701E+04 + 0.31885701E+04 0.31849121E+04 0.31849121E+04 0.31809780E+04 + 0.31809780E+04 0.31795190E+04 0.31795190E+04 0.31772461E+04 + 0.31772461E+04 0.31767759E+04 0.31767759E+04 0.31836370E+04 + 0.31836370E+04 0.31954919E+04 0.31954919E+04 0.32075601E+04 + 0.31800381E+04 0.31884500E+04 0.31884500E+04 0.31908589E+04 + 0.31908589E+04 0.31885701E+04 0.31885701E+04 0.31849121E+04 + 0.31849121E+04 0.31809780E+04 0.31809780E+04 0.31795190E+04 + 0.31795190E+04 0.31772461E+04 0.31772461E+04 0.31767759E+04 + 0.31767759E+04 0.31836370E+04 0.31836370E+04 0.31954919E+04 + 0.31954919E+04 0.32075601E+04 0.31785371E+04 0.31855710E+04 + 0.31855710E+04 0.31901370E+04 0.31901370E+04 0.31890569E+04 + 0.31890569E+04 0.31879399E+04 0.31879399E+04 0.31866699E+04 + 0.31866699E+04 0.31829900E+04 0.31829900E+04 0.31749189E+04 + 0.31749189E+04 0.31717090E+04 0.31717090E+04 0.31758220E+04 + 0.31758220E+04 0.31834290E+04 0.31834290E+04 0.31912661E+04 + 0.31785371E+04 0.31855710E+04 0.31855710E+04 0.31901370E+04 + 0.31901370E+04 0.31890569E+04 0.31890569E+04 0.31879399E+04 + 0.31879399E+04 0.31866699E+04 0.31866699E+04 0.31829900E+04 + 0.31829900E+04 0.31749189E+04 0.31749189E+04 0.31717090E+04 + 0.31717090E+04 0.31758220E+04 0.31758220E+04 0.31834290E+04 + 0.31834290E+04 0.31912661E+04 0.31868069E+04 0.31893501E+04 + 0.31893501E+04 0.31962190E+04 0.31962190E+04 0.31949551E+04 + 0.31949551E+04 0.31895110E+04 0.31895110E+04 0.31859819E+04 + 0.31859819E+04 0.31821201E+04 0.31821201E+04 0.31739241E+04 + 0.31739241E+04 0.31684529E+04 0.31684529E+04 0.31718291E+04 + 0.31718291E+04 0.31766250E+04 0.31766250E+04 0.31812471E+04 + 0.31868069E+04 0.31893501E+04 0.31893501E+04 0.31962190E+04 + 0.31962190E+04 0.31949551E+04 0.31949551E+04 0.31895110E+04 + 0.31895110E+04 0.31859819E+04 0.31859819E+04 0.31821201E+04 + 0.31821201E+04 0.31739241E+04 0.31739241E+04 0.31684529E+04 + 0.31684529E+04 0.31718291E+04 0.31718291E+04 0.31766250E+04 + 0.31766250E+04 0.31812471E+04 0.31965569E+04 0.31965281E+04 + 0.31965281E+04 0.32014729E+04 0.32014729E+04 0.31999529E+04 + 0.31999529E+04 0.31928259E+04 0.31928259E+04 0.31864060E+04 + 0.31864060E+04 0.31811780E+04 0.31811780E+04 0.31731440E+04 + 0.31731440E+04 0.31668821E+04 0.31668821E+04 0.31686660E+04 + 0.31686660E+04 0.31735540E+04 0.31735540E+04 0.31794861E+04 + 0.31965569E+04 0.31965281E+04 0.31965281E+04 0.32014729E+04 + 0.32014729E+04 0.31999529E+04 0.31999529E+04 0.31928259E+04 + 0.31928259E+04 0.31864060E+04 0.31864060E+04 0.31811780E+04 + 0.31811780E+04 0.31731440E+04 0.31731440E+04 0.31668821E+04 + 0.31668821E+04 0.31686660E+04 0.31686660E+04 0.31735540E+04 + 0.31735540E+04 0.31794861E+04 0.31927520E+04 0.31936289E+04 + 0.31936289E+04 0.31964790E+04 0.31964790E+04 0.31945920E+04 + 0.31945920E+04 0.31862710E+04 0.31862710E+04 0.31781050E+04 + 0.31781050E+04 0.31741509E+04 0.31741509E+04 0.31710820E+04 + 0.31710820E+04 0.31686741E+04 0.31686741E+04 0.31697000E+04 + 0.31697000E+04 0.31744600E+04 0.31744600E+04 0.31816919E+04 + 0.31927520E+04 0.31936289E+04 0.31936289E+04 0.31964790E+04 + 0.31964790E+04 0.31945920E+04 0.31945920E+04 0.31862710E+04 + 0.31862710E+04 0.31781050E+04 0.31781050E+04 0.31741509E+04 + 0.31741509E+04 0.31710820E+04 0.31710820E+04 0.31686741E+04 + 0.31686741E+04 0.31697000E+04 0.31697000E+04 0.31744600E+04 + 0.30463650E+04 0.30458721E+04 0.31866230E+04 0.31817971E+04 + 0.31817971E+04 0.31843589E+04 0.31843589E+04 0.31837561E+04 + 0.31837561E+04 0.31777019E+04 0.31777019E+04 0.31728621E+04 + 0.31728621E+04 0.31707971E+04 0.31707971E+04 0.31696521E+04 + 0.31696521E+04 0.31699380E+04 0.31699380E+04 0.31713459E+04 + 0.31713459E+04 0.31737271E+04 0.30511479E+04 0.30471980E+04 + 0.31866230E+04 0.31817971E+04 0.31817971E+04 0.31843589E+04 + 0.31843589E+04 0.31837561E+04 0.31837561E+04 0.31777019E+04 + 0.31777019E+04 0.31728621E+04 0.31728621E+04 0.31707971E+04 + 0.31707971E+04 0.31696521E+04 0.31696521E+04 0.31699380E+04 + 0.30801890E+04 0.30767639E+04 0.30767639E+04 0.30751941E+04 + 0.30511479E+04 0.30471980E+04 0.31889270E+04 0.31760500E+04 + 0.31760500E+04 0.31745950E+04 0.31745950E+04 0.31739109E+04 + 0.31739109E+04 0.31714370E+04 0.31714370E+04 0.31689939E+04 + 0.31689939E+04 0.31681089E+04 0.31681089E+04 0.31688921E+04 + 0.31688921E+04 0.31689771E+04 0.30797310E+04 0.30780249E+04 + 0.30780249E+04 0.30757871E+04 0.30505820E+04 0.30475930E+04 + 0.31889270E+04 0.31760500E+04 0.31760500E+04 0.31745950E+04 + 0.31745950E+04 0.31739109E+04 0.31739109E+04 0.31714370E+04 + 0.31714370E+04 0.31689939E+04 0.31689939E+04 0.31681089E+04 + 0.30915540E+04 0.30871951E+04 0.30871951E+04 0.30797310E+04 + 0.30797310E+04 0.30780249E+04 0.30780249E+04 0.30757871E+04 + 0.30505820E+04 0.30475930E+04 0.31889490E+04 0.31770811E+04 + 0.31770811E+04 0.31716890E+04 0.31716890E+04 0.31697710E+04 + 0.31697710E+04 0.31677180E+04 0.31677180E+04 0.31674871E+04 + 0.31674871E+04 0.31665510E+04 0.30930720E+04 0.30893320E+04 + 0.30893320E+04 0.30839189E+04 0.30839189E+04 0.30801270E+04 + 0.30801270E+04 0.30772661E+04 0.30508560E+04 0.30478701E+04 + 0.31889490E+04 0.31770811E+04 0.31770811E+04 0.31716890E+04 + 0.31716890E+04 0.31697710E+04 0.31697710E+04 0.31677180E+04 + 0.31006699E+04 0.30970459E+04 0.30970459E+04 0.30930720E+04 + 0.30930720E+04 0.30893320E+04 0.30893320E+04 0.30839189E+04 + 0.30839189E+04 0.30801270E+04 0.30801270E+04 0.30772661E+04 + 0.30508560E+04 0.30478701E+04 0.31875061E+04 0.31801440E+04 + 0.31801440E+04 0.31738369E+04 0.31738369E+04 0.31715181E+04 + 0.31715181E+04 0.31676470E+04 0.31020300E+04 0.30984709E+04 + 0.30984709E+04 0.30955620E+04 0.30955620E+04 0.30923601E+04 + 0.30923601E+04 0.30864651E+04 0.30864651E+04 0.30811350E+04 + 0.30811350E+04 0.30781489E+04 0.30509189E+04 0.30483630E+04 + 0.31875061E+04 0.31801440E+04 0.31801440E+04 0.31738369E+04 + 0.31114861E+04 0.31075349E+04 0.31075349E+04 0.31020300E+04 + 0.31020300E+04 0.30984709E+04 0.30984709E+04 0.30955620E+04 + 0.30955620E+04 0.30923601E+04 0.30923601E+04 0.30864651E+04 + 0.30864651E+04 0.30811350E+04 0.30811350E+04 0.30781489E+04 + 0.30509189E+04 0.30483630E+04 0.31871941E+04 0.31821221E+04 + 0.31821221E+04 0.31762710E+04 0.31144280E+04 0.31092080E+04 + 0.31092080E+04 0.31035330E+04 0.31035330E+04 0.30993269E+04 + 0.30993269E+04 0.30935320E+04 0.30935320E+04 0.30893191E+04 + 0.30893191E+04 0.30870359E+04 0.30870359E+04 0.30834480E+04 + 0.30834480E+04 0.30794480E+04 0.30514910E+04 0.30488459E+04 + 0.31232461E+04 0.31199500E+04 0.31199500E+04 0.31144280E+04 + 0.31144280E+04 0.31092080E+04 0.31092080E+04 0.31035330E+04 + 0.31035330E+04 0.30993269E+04 0.30993269E+04 0.30935320E+04 + 0.30935320E+04 0.30893191E+04 0.30893191E+04 0.30870359E+04 + 0.30870359E+04 0.30834480E+04 0.30834480E+04 0.30794480E+04 + 0.30794480E+04 0.30766160E+04 0.31250181E+04 0.31225110E+04 + 0.31225110E+04 0.31192080E+04 0.31192080E+04 0.31134360E+04 + 0.31134360E+04 0.31025449E+04 0.31025449E+04 0.30953950E+04 + 0.30953950E+04 0.30908660E+04 0.30908660E+04 0.30897549E+04 + 0.30897549E+04 0.30909800E+04 0.30909800E+04 0.30869751E+04 + 0.30869751E+04 0.30811980E+04 0.30811980E+04 0.30775750E+04 + 0.31874221E+04 0.31881450E+04 0.31881450E+04 0.31905891E+04 + 0.31905891E+04 0.31901880E+04 0.31901880E+04 0.31850139E+04 + 0.31850139E+04 0.31790071E+04 0.31790071E+04 0.31801360E+04 + 0.31801360E+04 0.31854700E+04 0.31854700E+04 0.31869141E+04 + 0.31869141E+04 0.31877251E+04 0.31877251E+04 0.31929390E+04 + 0.31929390E+04 0.32002590E+04 0.31771819E+04 0.31804800E+04 + 0.31804800E+04 0.31846741E+04 0.31846741E+04 0.31844131E+04 + 0.31844131E+04 0.31813530E+04 0.31813530E+04 0.31805061E+04 + 0.31805061E+04 0.31856731E+04 0.31856731E+04 0.31916841E+04 + 0.31916841E+04 0.31921890E+04 0.31921890E+04 0.31954700E+04 + 0.31954700E+04 0.32002981E+04 0.32002981E+04 0.32053320E+04 + 0.31771819E+04 0.31804800E+04 0.31804800E+04 0.31846741E+04 + 0.31846741E+04 0.31844131E+04 0.31844131E+04 0.31813530E+04 + 0.31813530E+04 0.31805061E+04 0.31805061E+04 0.31856731E+04 + 0.31856731E+04 0.31916841E+04 0.31916841E+04 0.31921890E+04 + 0.31921890E+04 0.31954700E+04 0.31954700E+04 0.32002981E+04 + 0.32002981E+04 0.32053320E+04 0.31687080E+04 0.31715371E+04 + 0.31715371E+04 0.31741521E+04 0.31741521E+04 0.31716370E+04 + 0.31716370E+04 0.31718870E+04 0.31718870E+04 0.31761770E+04 + 0.31761770E+04 0.31832620E+04 0.31832620E+04 0.31898711E+04 + 0.31898711E+04 0.31930139E+04 0.31930139E+04 0.31986150E+04 + 0.31986150E+04 0.32036741E+04 0.32036741E+04 0.32077720E+04 + 0.31687080E+04 0.31715371E+04 0.31715371E+04 0.31741521E+04 + 0.31741521E+04 0.31716370E+04 0.31716370E+04 0.31718870E+04 + 0.31718870E+04 0.31761770E+04 0.31761770E+04 0.31832620E+04 + 0.31832620E+04 0.31898711E+04 0.31898711E+04 0.31930139E+04 + 0.31930139E+04 0.31986150E+04 0.31986150E+04 0.32036741E+04 + 0.32036741E+04 0.32077720E+04 0.31602141E+04 0.31544600E+04 + 0.31544600E+04 0.31545100E+04 0.31545100E+04 0.31564419E+04 + 0.31564419E+04 0.31671570E+04 0.31671570E+04 0.31790129E+04 + 0.31790129E+04 0.31866531E+04 0.31866531E+04 0.31897820E+04 + 0.31897820E+04 0.31932959E+04 0.31932959E+04 0.32000681E+04 + 0.32000681E+04 0.32076040E+04 0.32076040E+04 0.32139021E+04 + 0.31602141E+04 0.31544600E+04 0.31544600E+04 0.31545100E+04 + 0.31545100E+04 0.31564419E+04 0.31564419E+04 0.31671570E+04 + 0.31671570E+04 0.31790129E+04 0.31790129E+04 0.31866531E+04 + 0.31866531E+04 0.31897820E+04 0.31897820E+04 0.31932959E+04 + 0.31932959E+04 0.32000681E+04 0.32000681E+04 0.32076040E+04 + 0.32076040E+04 0.32139021E+04 0.31678110E+04 0.31622800E+04 + 0.31622800E+04 0.31635330E+04 0.31635330E+04 0.31639331E+04 + 0.31639331E+04 0.31670950E+04 0.31670950E+04 0.31729180E+04 + 0.31729180E+04 0.31775779E+04 0.31775779E+04 0.31803110E+04 + 0.31803110E+04 0.31871389E+04 0.31871389E+04 0.31981680E+04 + 0.31981680E+04 0.32090349E+04 0.32090349E+04 0.32183579E+04 + 0.31678110E+04 0.31622800E+04 0.31622800E+04 0.31635330E+04 + 0.31635330E+04 0.31639331E+04 0.31639331E+04 0.31670950E+04 + 0.31670950E+04 0.31729180E+04 0.31729180E+04 0.31775779E+04 + 0.31775779E+04 0.31803110E+04 0.31803110E+04 0.31871389E+04 + 0.31871389E+04 0.31981680E+04 0.31981680E+04 0.32090349E+04 + 0.32090349E+04 0.32183579E+04 0.31816750E+04 0.31836450E+04 + 0.31836450E+04 0.31842690E+04 0.31842690E+04 0.31801101E+04 + 0.31801101E+04 0.31724910E+04 0.31724910E+04 0.31692019E+04 + 0.31692019E+04 0.31720830E+04 0.31720830E+04 0.31768730E+04 + 0.31768730E+04 0.31822461E+04 0.31822461E+04 0.31920640E+04 + 0.31920640E+04 0.32043201E+04 0.32043201E+04 0.32164089E+04 + 0.31816750E+04 0.31836450E+04 0.31836450E+04 0.31842690E+04 + 0.31842690E+04 0.31801101E+04 0.31801101E+04 0.31724910E+04 + 0.31724910E+04 0.31692019E+04 0.31692019E+04 0.31720830E+04 + 0.31720830E+04 0.31768730E+04 0.31768730E+04 0.31822461E+04 + 0.31822461E+04 0.31920640E+04 0.31920640E+04 0.32043201E+04 + 0.32043201E+04 0.32164089E+04 0.31805010E+04 0.31889131E+04 + 0.31889131E+04 0.31914189E+04 0.31914189E+04 0.31891521E+04 + 0.31891521E+04 0.31854529E+04 0.31854529E+04 0.31814419E+04 + 0.31814419E+04 0.31799839E+04 0.31799839E+04 0.31777200E+04 + 0.31777200E+04 0.31771521E+04 0.31771521E+04 0.31840071E+04 + 0.31840071E+04 0.31959341E+04 0.31959341E+04 0.32080979E+04 + 0.31805010E+04 0.31889131E+04 0.31889131E+04 0.31914189E+04 + 0.31914189E+04 0.31891521E+04 0.31891521E+04 0.31854529E+04 + 0.31854529E+04 0.31814419E+04 0.31814419E+04 0.31799839E+04 + 0.31799839E+04 0.31777200E+04 0.31777200E+04 0.31771521E+04 + 0.31771521E+04 0.31840071E+04 0.31840071E+04 0.31959341E+04 + 0.31959341E+04 0.32080979E+04 0.31789500E+04 0.31860120E+04 + 0.31860120E+04 0.31906489E+04 0.31906489E+04 0.31895859E+04 + 0.31895859E+04 0.31884451E+04 0.31884451E+04 0.31871621E+04 + 0.31871621E+04 0.31835400E+04 0.31835400E+04 0.31754189E+04 + 0.31754189E+04 0.31721270E+04 0.31721270E+04 0.31762061E+04 + 0.31762061E+04 0.31838560E+04 0.31838560E+04 0.31917930E+04 + 0.31789500E+04 0.31860120E+04 0.31860120E+04 0.31906489E+04 + 0.31906489E+04 0.31895859E+04 0.31895859E+04 0.31884451E+04 + 0.31884451E+04 0.31871621E+04 0.31871621E+04 0.31835400E+04 + 0.31835400E+04 0.31754189E+04 0.31754189E+04 0.31721270E+04 + 0.31721270E+04 0.31762061E+04 0.31762061E+04 0.31838560E+04 + 0.31838560E+04 0.31917930E+04 0.31872561E+04 0.31897590E+04 + 0.31897590E+04 0.31966670E+04 0.31966670E+04 0.31954829E+04 + 0.31954829E+04 0.31900149E+04 0.31900149E+04 0.31864709E+04 + 0.31864709E+04 0.31826570E+04 0.31826570E+04 0.31744500E+04 + 0.31744500E+04 0.31688730E+04 0.31688730E+04 0.31722251E+04 + 0.31722251E+04 0.31770139E+04 0.31770139E+04 0.31816211E+04 + 0.31872561E+04 0.31897590E+04 0.31897590E+04 0.31966670E+04 + 0.31966670E+04 0.31954829E+04 0.31954829E+04 0.31900149E+04 + 0.31900149E+04 0.31864709E+04 0.31864709E+04 0.31826570E+04 + 0.31826570E+04 0.31744500E+04 0.31744500E+04 0.31688730E+04 + 0.31688730E+04 0.31722251E+04 0.31722251E+04 0.31770139E+04 + 0.31770139E+04 0.31816211E+04 0.31971289E+04 0.31970010E+04 + 0.31970010E+04 0.32019441E+04 0.32019441E+04 0.32005100E+04 + 0.32005100E+04 0.31933940E+04 0.31933940E+04 0.31869351E+04 + 0.31869351E+04 0.31817129E+04 0.31817129E+04 0.31736541E+04 + 0.31736541E+04 0.31673101E+04 0.31673101E+04 0.31690129E+04 + 0.31690129E+04 0.31738149E+04 0.31738149E+04 0.31796760E+04 + 0.31971289E+04 0.31970010E+04 0.31970010E+04 0.32019441E+04 + 0.32019441E+04 0.32005100E+04 0.32005100E+04 0.31933940E+04 + 0.31933940E+04 0.31869351E+04 0.31869351E+04 0.31817129E+04 + 0.31817129E+04 0.31736541E+04 0.31736541E+04 0.31673101E+04 + 0.31673101E+04 0.31690129E+04 0.31690129E+04 0.31738149E+04 + 0.31738149E+04 0.31796760E+04 0.31933601E+04 0.31941641E+04 + 0.31941641E+04 0.31970010E+04 0.31970010E+04 0.31951931E+04 + 0.31951931E+04 0.31869121E+04 0.31869121E+04 0.31786860E+04 + 0.31786860E+04 0.31747080E+04 0.31747080E+04 0.31715759E+04 + 0.31715759E+04 0.31689661E+04 0.31689661E+04 0.31698601E+04 + 0.31698601E+04 0.31746980E+04 0.31746980E+04 0.31819380E+04 + 0.31933601E+04 0.31941641E+04 0.31941641E+04 0.31970010E+04 + 0.31970010E+04 0.31951931E+04 0.31951931E+04 0.31869121E+04 + 0.31869121E+04 0.31786860E+04 0.31786860E+04 0.31747080E+04 + 0.31747080E+04 0.31715759E+04 0.31715759E+04 0.31689661E+04 + 0.31689661E+04 0.31698601E+04 0.31698601E+04 0.31746980E+04 + 0.30466270E+04 0.30461941E+04 0.31872671E+04 0.31823120E+04 + 0.31823120E+04 0.31848640E+04 0.31848640E+04 0.31843430E+04 + 0.31843430E+04 0.31782520E+04 0.31782520E+04 0.31732710E+04 + 0.31732710E+04 0.31710801E+04 0.31710801E+04 0.31698240E+04 + 0.31698240E+04 0.31701851E+04 0.31701851E+04 0.31715569E+04 + 0.31715569E+04 0.31739080E+04 0.30514199E+04 0.30475090E+04 + 0.31872671E+04 0.31823120E+04 0.31823120E+04 0.31848640E+04 + 0.31848640E+04 0.31843430E+04 0.31843430E+04 0.31782520E+04 + 0.31782520E+04 0.31732710E+04 0.31732710E+04 0.31710801E+04 + 0.31710801E+04 0.31698240E+04 0.31698240E+04 0.31701851E+04 + 0.30807009E+04 0.30772920E+04 0.30772920E+04 0.30757390E+04 + 0.30514199E+04 0.30475090E+04 0.31896470E+04 0.31766350E+04 + 0.31766350E+04 0.31750549E+04 0.31750549E+04 0.31742681E+04 + 0.31742681E+04 0.31716760E+04 0.31716760E+04 0.31691150E+04 + 0.31691150E+04 0.31683069E+04 0.31683069E+04 0.31690901E+04 + 0.31690901E+04 0.31691641E+04 0.30802080E+04 0.30785459E+04 + 0.30785459E+04 0.30763440E+04 0.30508789E+04 0.30479141E+04 + 0.31896470E+04 0.31766350E+04 0.31766350E+04 0.31750549E+04 + 0.31750549E+04 0.31742681E+04 0.31742681E+04 0.31716760E+04 + 0.31716760E+04 0.31691150E+04 0.31691150E+04 0.31683069E+04 + 0.30921721E+04 0.30877971E+04 0.30877971E+04 0.30802080E+04 + 0.30802080E+04 0.30785459E+04 0.30785459E+04 0.30763440E+04 + 0.30508789E+04 0.30479141E+04 0.31895371E+04 0.31774680E+04 + 0.31774680E+04 0.31719189E+04 0.31719189E+04 0.31700439E+04 + 0.31700439E+04 0.31679600E+04 0.31679600E+04 0.31676321E+04 + 0.31676321E+04 0.31666699E+04 0.30937209E+04 0.30899880E+04 + 0.30899880E+04 0.30844700E+04 0.30844700E+04 0.30806650E+04 + 0.30806650E+04 0.30778220E+04 0.30511699E+04 0.30482141E+04 + 0.31895371E+04 0.31774680E+04 0.31774680E+04 0.31719189E+04 + 0.31719189E+04 0.31700439E+04 0.31700439E+04 0.31679600E+04 + 0.31013640E+04 0.30977390E+04 0.30977390E+04 0.30937209E+04 + 0.30937209E+04 0.30899880E+04 0.30899880E+04 0.30844700E+04 + 0.30844700E+04 0.30806650E+04 0.30806650E+04 0.30778220E+04 + 0.30511699E+04 0.30482141E+04 0.31879839E+04 0.31805371E+04 + 0.31805371E+04 0.31741440E+04 0.31741440E+04 0.31717859E+04 + 0.31717859E+04 0.31679390E+04 0.31027500E+04 0.30992280E+04 + 0.30992280E+04 0.30962410E+04 0.30962410E+04 0.30929961E+04 + 0.30929961E+04 0.30871169E+04 0.30871169E+04 0.30816760E+04 + 0.30816760E+04 0.30787151E+04 0.30512429E+04 0.30487090E+04 + 0.31879839E+04 0.31805371E+04 0.31805371E+04 0.31741440E+04 + 0.31123169E+04 0.31083320E+04 0.31083320E+04 0.31027500E+04 + 0.31027500E+04 0.30992280E+04 0.30992280E+04 0.30962410E+04 + 0.30962410E+04 0.30929961E+04 0.30929961E+04 0.30871169E+04 + 0.30871169E+04 0.30816760E+04 0.30816760E+04 0.30787151E+04 + 0.30512429E+04 0.30487090E+04 0.31876609E+04 0.31825181E+04 + 0.31825181E+04 0.31766460E+04 0.31154080E+04 0.31101240E+04 + 0.31101240E+04 0.31042571E+04 0.31042571E+04 0.30999590E+04 + 0.30999590E+04 0.30941731E+04 0.30941731E+04 0.30899890E+04 + 0.30899890E+04 0.30876990E+04 0.30876990E+04 0.30840320E+04 + 0.30840320E+04 0.30800730E+04 0.30518259E+04 0.30492271E+04 + 0.31245520E+04 0.31212019E+04 0.31212019E+04 0.31154080E+04 + 0.31154080E+04 0.31101240E+04 0.31101240E+04 0.31042571E+04 + 0.31042571E+04 0.30999590E+04 0.30999590E+04 0.30941731E+04 + 0.30941731E+04 0.30899890E+04 0.30899890E+04 0.30876990E+04 + 0.30876990E+04 0.30840320E+04 0.30840320E+04 0.30800730E+04 + 0.30800730E+04 0.30772900E+04 0.31263259E+04 0.31238589E+04 + 0.31238589E+04 0.31203269E+04 0.31203269E+04 0.31141809E+04 + 0.31141809E+04 0.31031431E+04 0.31031431E+04 0.30959871E+04 + 0.30959871E+04 0.30914509E+04 0.30914509E+04 0.30903679E+04 + 0.30903679E+04 0.30916201E+04 0.30916201E+04 0.30876851E+04 + 0.30876851E+04 0.30818379E+04 0.30818379E+04 0.30782090E+04 + 0.31874221E+04 0.31881450E+04 0.31881450E+04 0.31905891E+04 + 0.31905891E+04 0.31901880E+04 0.31901880E+04 0.31850139E+04 + 0.31850139E+04 0.31790071E+04 0.31790071E+04 0.31801360E+04 + 0.31801360E+04 0.31854700E+04 0.31854700E+04 0.31869141E+04 + 0.31869141E+04 0.31877251E+04 0.31877251E+04 0.31929390E+04 + 0.31929390E+04 0.32002590E+04 0.31771819E+04 0.31804800E+04 + 0.31804800E+04 0.31846741E+04 0.31846741E+04 0.31844131E+04 + 0.31844131E+04 0.31813530E+04 0.31813530E+04 0.31805061E+04 + 0.31805061E+04 0.31856731E+04 0.31856731E+04 0.31916841E+04 + 0.31916841E+04 0.31921890E+04 0.31921890E+04 0.31954700E+04 + 0.31954700E+04 0.32002981E+04 0.32002981E+04 0.32053320E+04 + 0.31771819E+04 0.31804800E+04 0.31804800E+04 0.31846741E+04 + 0.31846741E+04 0.31844131E+04 0.31844131E+04 0.31813530E+04 + 0.31813530E+04 0.31805061E+04 0.31805061E+04 0.31856731E+04 + 0.31856731E+04 0.31916841E+04 0.31916841E+04 0.31921890E+04 + 0.31921890E+04 0.31954700E+04 0.31954700E+04 0.32002981E+04 + 0.32002981E+04 0.32053320E+04 0.31687080E+04 0.31715371E+04 + 0.31715371E+04 0.31741521E+04 0.31741521E+04 0.31716370E+04 + 0.31716370E+04 0.31718870E+04 0.31718870E+04 0.31761770E+04 + 0.31761770E+04 0.31832620E+04 0.31832620E+04 0.31898711E+04 + 0.31898711E+04 0.31930139E+04 0.31930139E+04 0.31986150E+04 + 0.31986150E+04 0.32036741E+04 0.32036741E+04 0.32077720E+04 + 0.31687080E+04 0.31715371E+04 0.31715371E+04 0.31741521E+04 + 0.31741521E+04 0.31716370E+04 0.31716370E+04 0.31718870E+04 + 0.31718870E+04 0.31761770E+04 0.31761770E+04 0.31832620E+04 + 0.31832620E+04 0.31898711E+04 0.31898711E+04 0.31930139E+04 + 0.31930139E+04 0.31986150E+04 0.31986150E+04 0.32036741E+04 + 0.32036741E+04 0.32077720E+04 0.31602141E+04 0.31544600E+04 + 0.31544600E+04 0.31545100E+04 0.31545100E+04 0.31564419E+04 + 0.31564419E+04 0.31671570E+04 0.31671570E+04 0.31790129E+04 + 0.31790129E+04 0.31866531E+04 0.31866531E+04 0.31897820E+04 + 0.31897820E+04 0.31932959E+04 0.31932959E+04 0.32000681E+04 + 0.32000681E+04 0.32076040E+04 0.32076040E+04 0.32139021E+04 + 0.31602141E+04 0.31544600E+04 0.31544600E+04 0.31545100E+04 + 0.31545100E+04 0.31564419E+04 0.31564419E+04 0.31671570E+04 + 0.31671570E+04 0.31790129E+04 0.31790129E+04 0.31866531E+04 + 0.31866531E+04 0.31897820E+04 0.31897820E+04 0.31932959E+04 + 0.31932959E+04 0.32000681E+04 0.32000681E+04 0.32076040E+04 + 0.32076040E+04 0.32139021E+04 0.31678110E+04 0.31622800E+04 + 0.31622800E+04 0.31635330E+04 0.31635330E+04 0.31639331E+04 + 0.31639331E+04 0.31670950E+04 0.31670950E+04 0.31729180E+04 + 0.31729180E+04 0.31775779E+04 0.31775779E+04 0.31803110E+04 + 0.31803110E+04 0.31871389E+04 0.31871389E+04 0.31981680E+04 + 0.31981680E+04 0.32090349E+04 0.32090349E+04 0.32183579E+04 + 0.31678110E+04 0.31622800E+04 0.31622800E+04 0.31635330E+04 + 0.31635330E+04 0.31639331E+04 0.31639331E+04 0.31670950E+04 + 0.31670950E+04 0.31729180E+04 0.31729180E+04 0.31775779E+04 + 0.31775779E+04 0.31803110E+04 0.31803110E+04 0.31871389E+04 + 0.31871389E+04 0.31981680E+04 0.31981680E+04 0.32090349E+04 + 0.32090349E+04 0.32183579E+04 0.31816750E+04 0.31836450E+04 + 0.31836450E+04 0.31842690E+04 0.31842690E+04 0.31801101E+04 + 0.31801101E+04 0.31724910E+04 0.31724910E+04 0.31692019E+04 + 0.31692019E+04 0.31720830E+04 0.31720830E+04 0.31768730E+04 + 0.31768730E+04 0.31822461E+04 0.31822461E+04 0.31920640E+04 + 0.31920640E+04 0.32043201E+04 0.32043201E+04 0.32164089E+04 + 0.31816750E+04 0.31836450E+04 0.31836450E+04 0.31842690E+04 + 0.31842690E+04 0.31801101E+04 0.31801101E+04 0.31724910E+04 + 0.31724910E+04 0.31692019E+04 0.31692019E+04 0.31720830E+04 + 0.31720830E+04 0.31768730E+04 0.31768730E+04 0.31822461E+04 + 0.31822461E+04 0.31920640E+04 0.31920640E+04 0.32043201E+04 + 0.32043201E+04 0.32164089E+04 0.31805010E+04 0.31889131E+04 + 0.31889131E+04 0.31914189E+04 0.31914189E+04 0.31891521E+04 + 0.31891521E+04 0.31854529E+04 0.31854529E+04 0.31814419E+04 + 0.31814419E+04 0.31799839E+04 0.31799839E+04 0.31777200E+04 + 0.31777200E+04 0.31771521E+04 0.31771521E+04 0.31840071E+04 + 0.31840071E+04 0.31959341E+04 0.31959341E+04 0.32080979E+04 + 0.31805010E+04 0.31889131E+04 0.31889131E+04 0.31914189E+04 + 0.31914189E+04 0.31891521E+04 0.31891521E+04 0.31854529E+04 + 0.31854529E+04 0.31814419E+04 0.31814419E+04 0.31799839E+04 + 0.31799839E+04 0.31777200E+04 0.31777200E+04 0.31771521E+04 + 0.31771521E+04 0.31840071E+04 0.31840071E+04 0.31959341E+04 + 0.31959341E+04 0.32080979E+04 0.31789500E+04 0.31860120E+04 + 0.31860120E+04 0.31906489E+04 0.31906489E+04 0.31895859E+04 + 0.31895859E+04 0.31884451E+04 0.31884451E+04 0.31871621E+04 + 0.31871621E+04 0.31835400E+04 0.31835400E+04 0.31754189E+04 + 0.31754189E+04 0.31721270E+04 0.31721270E+04 0.31762061E+04 + 0.31762061E+04 0.31838560E+04 0.31838560E+04 0.31917930E+04 + 0.31789500E+04 0.31860120E+04 0.31860120E+04 0.31906489E+04 + 0.31906489E+04 0.31895859E+04 0.31895859E+04 0.31884451E+04 + 0.31884451E+04 0.31871621E+04 0.31871621E+04 0.31835400E+04 + 0.31835400E+04 0.31754189E+04 0.31754189E+04 0.31721270E+04 + 0.31721270E+04 0.31762061E+04 0.31762061E+04 0.31838560E+04 + 0.31838560E+04 0.31917930E+04 0.31872561E+04 0.31897590E+04 + 0.31897590E+04 0.31966670E+04 0.31966670E+04 0.31954829E+04 + 0.31954829E+04 0.31900149E+04 0.31900149E+04 0.31864709E+04 + 0.31864709E+04 0.31826570E+04 0.31826570E+04 0.31744500E+04 + 0.31744500E+04 0.31688730E+04 0.31688730E+04 0.31722251E+04 + 0.31722251E+04 0.31770139E+04 0.31770139E+04 0.31816211E+04 + 0.31872561E+04 0.31897590E+04 0.31897590E+04 0.31966670E+04 + 0.31966670E+04 0.31954829E+04 0.31954829E+04 0.31900149E+04 + 0.31900149E+04 0.31864709E+04 0.31864709E+04 0.31826570E+04 + 0.31826570E+04 0.31744500E+04 0.31744500E+04 0.31688730E+04 + 0.31688730E+04 0.31722251E+04 0.31722251E+04 0.31770139E+04 + 0.31770139E+04 0.31816211E+04 0.31971289E+04 0.31970010E+04 + 0.31970010E+04 0.32019441E+04 0.32019441E+04 0.32005100E+04 + 0.32005100E+04 0.31933940E+04 0.31933940E+04 0.31869351E+04 + 0.31869351E+04 0.31817129E+04 0.31817129E+04 0.31736541E+04 + 0.31736541E+04 0.31673101E+04 0.31673101E+04 0.31690129E+04 + 0.31690129E+04 0.31738149E+04 0.31738149E+04 0.31796760E+04 + 0.31971289E+04 0.31970010E+04 0.31970010E+04 0.32019441E+04 + 0.32019441E+04 0.32005100E+04 0.32005100E+04 0.31933940E+04 + 0.31933940E+04 0.31869351E+04 0.31869351E+04 0.31817129E+04 + 0.31817129E+04 0.31736541E+04 0.31736541E+04 0.31673101E+04 + 0.31673101E+04 0.31690129E+04 0.31690129E+04 0.31738149E+04 + 0.31738149E+04 0.31796760E+04 0.31933601E+04 0.31941641E+04 + 0.31941641E+04 0.31970010E+04 0.31970010E+04 0.31951931E+04 + 0.31951931E+04 0.31869121E+04 0.31869121E+04 0.31786860E+04 + 0.31786860E+04 0.31747080E+04 0.31747080E+04 0.31715759E+04 + 0.31715759E+04 0.31689661E+04 0.31689661E+04 0.31698601E+04 + 0.31698601E+04 0.31746980E+04 0.31746980E+04 0.31819380E+04 + 0.31933601E+04 0.31941641E+04 0.31941641E+04 0.31970010E+04 + 0.31970010E+04 0.31951931E+04 0.31951931E+04 0.31869121E+04 + 0.31869121E+04 0.31786860E+04 0.31786860E+04 0.31747080E+04 + 0.31747080E+04 0.31715759E+04 0.31715759E+04 0.31689661E+04 + 0.31689661E+04 0.31698601E+04 0.31698601E+04 0.31746980E+04 + 0.30466270E+04 0.30461941E+04 0.31872671E+04 0.31823120E+04 + 0.31823120E+04 0.31848640E+04 0.31848640E+04 0.31843430E+04 + 0.31843430E+04 0.31782520E+04 0.31782520E+04 0.31732710E+04 + 0.31732710E+04 0.31710801E+04 0.31710801E+04 0.31698240E+04 + 0.31698240E+04 0.31701851E+04 0.31701851E+04 0.31715569E+04 + 0.31715569E+04 0.31739080E+04 0.30514199E+04 0.30475090E+04 + 0.31872671E+04 0.31823120E+04 0.31823120E+04 0.31848640E+04 + 0.31848640E+04 0.31843430E+04 0.31843430E+04 0.31782520E+04 + 0.31782520E+04 0.31732710E+04 0.31732710E+04 0.31710801E+04 + 0.31710801E+04 0.31698240E+04 0.31698240E+04 0.31701851E+04 + 0.30807009E+04 0.30772920E+04 0.30772920E+04 0.30757390E+04 + 0.30514199E+04 0.30475090E+04 0.31896470E+04 0.31766350E+04 + 0.31766350E+04 0.31750549E+04 0.31750549E+04 0.31742681E+04 + 0.31742681E+04 0.31716760E+04 0.31716760E+04 0.31691150E+04 + 0.31691150E+04 0.31683069E+04 0.31683069E+04 0.31690901E+04 + 0.31690901E+04 0.31691641E+04 0.30802080E+04 0.30785459E+04 + 0.30785459E+04 0.30763440E+04 0.30508789E+04 0.30479141E+04 + 0.31896470E+04 0.31766350E+04 0.31766350E+04 0.31750549E+04 + 0.31750549E+04 0.31742681E+04 0.31742681E+04 0.31716760E+04 + 0.31716760E+04 0.31691150E+04 0.31691150E+04 0.31683069E+04 + 0.30921721E+04 0.30877971E+04 0.30877971E+04 0.30802080E+04 + 0.30802080E+04 0.30785459E+04 0.30785459E+04 0.30763440E+04 + 0.30508789E+04 0.30479141E+04 0.31895371E+04 0.31774680E+04 + 0.31774680E+04 0.31719189E+04 0.31719189E+04 0.31700439E+04 + 0.31700439E+04 0.31679600E+04 0.31679600E+04 0.31676321E+04 + 0.31676321E+04 0.31666699E+04 0.30937209E+04 0.30899880E+04 + 0.30899880E+04 0.30844700E+04 0.30844700E+04 0.30806650E+04 + 0.30806650E+04 0.30778220E+04 0.30511699E+04 0.30482141E+04 + 0.31895371E+04 0.31774680E+04 0.31774680E+04 0.31719189E+04 + 0.31719189E+04 0.31700439E+04 0.31700439E+04 0.31679600E+04 + 0.31013640E+04 0.30977390E+04 0.30977390E+04 0.30937209E+04 + 0.30937209E+04 0.30899880E+04 0.30899880E+04 0.30844700E+04 + 0.30844700E+04 0.30806650E+04 0.30806650E+04 0.30778220E+04 + 0.30511699E+04 0.30482141E+04 0.31879839E+04 0.31805371E+04 + 0.31805371E+04 0.31741440E+04 0.31741440E+04 0.31717859E+04 + 0.31717859E+04 0.31679390E+04 0.31027500E+04 0.30992280E+04 + 0.30992280E+04 0.30962410E+04 0.30962410E+04 0.30929961E+04 + 0.30929961E+04 0.30871169E+04 0.30871169E+04 0.30816760E+04 + 0.30816760E+04 0.30787151E+04 0.30512429E+04 0.30487090E+04 + 0.31879839E+04 0.31805371E+04 0.31805371E+04 0.31741440E+04 + 0.31123169E+04 0.31083320E+04 0.31083320E+04 0.31027500E+04 + 0.31027500E+04 0.30992280E+04 0.30992280E+04 0.30962410E+04 + 0.30962410E+04 0.30929961E+04 0.30929961E+04 0.30871169E+04 + 0.30871169E+04 0.30816760E+04 0.30816760E+04 0.30787151E+04 + 0.30512429E+04 0.30487090E+04 0.31876609E+04 0.31825181E+04 + 0.31825181E+04 0.31766460E+04 0.31154080E+04 0.31101240E+04 + 0.31101240E+04 0.31042571E+04 0.31042571E+04 0.30999590E+04 + 0.30999590E+04 0.30941731E+04 0.30941731E+04 0.30899890E+04 + 0.30899890E+04 0.30876990E+04 0.30876990E+04 0.30840320E+04 + 0.30840320E+04 0.30800730E+04 0.30518259E+04 0.30492271E+04 + 0.31245520E+04 0.31212019E+04 0.31212019E+04 0.31154080E+04 + 0.31154080E+04 0.31101240E+04 0.31101240E+04 0.31042571E+04 + 0.31042571E+04 0.30999590E+04 0.30999590E+04 0.30941731E+04 + 0.30941731E+04 0.30899890E+04 0.30899890E+04 0.30876990E+04 + 0.30876990E+04 0.30840320E+04 0.30840320E+04 0.30800730E+04 + 0.30800730E+04 0.30772900E+04 0.31263259E+04 0.31238589E+04 + 0.31238589E+04 0.31203269E+04 0.31203269E+04 0.31141809E+04 + 0.31141809E+04 0.31031431E+04 0.31031431E+04 0.30959871E+04 + 0.30959871E+04 0.30914509E+04 0.30914509E+04 0.30903679E+04 + 0.30903679E+04 0.30916201E+04 0.30916201E+04 0.30876851E+04 + 0.30876851E+04 0.30818379E+04 0.30818379E+04 0.30782090E+04 + 0.31886160E+04 0.31892400E+04 0.31892400E+04 0.31917129E+04 + 0.31917129E+04 0.31913711E+04 0.31913711E+04 0.31862229E+04 + 0.31862229E+04 0.31801040E+04 0.31801040E+04 0.31810950E+04 + 0.31810950E+04 0.31864270E+04 0.31864270E+04 0.31879529E+04 + 0.31879529E+04 0.31887729E+04 0.31887729E+04 0.31939680E+04 + 0.31939680E+04 0.32012671E+04 0.31783970E+04 0.31815769E+04 + 0.31815769E+04 0.31858201E+04 0.31858201E+04 0.31856360E+04 + 0.31856360E+04 0.31825591E+04 0.31825591E+04 0.31815879E+04 + 0.31815879E+04 0.31866599E+04 0.31866599E+04 0.31927471E+04 + 0.31927471E+04 0.31933020E+04 0.31933020E+04 0.31965471E+04 + 0.31965471E+04 0.32013589E+04 0.32013589E+04 0.32063040E+04 + 0.31783970E+04 0.31815769E+04 0.31815769E+04 0.31858201E+04 + 0.31858201E+04 0.31856360E+04 0.31856360E+04 0.31825591E+04 + 0.31825591E+04 0.31815879E+04 0.31815879E+04 0.31866599E+04 + 0.31866599E+04 0.31927471E+04 0.31927471E+04 0.31933020E+04 + 0.31933020E+04 0.31965471E+04 0.31965471E+04 0.32013589E+04 + 0.32013589E+04 0.32063040E+04 0.31699661E+04 0.31727219E+04 + 0.31727219E+04 0.31753911E+04 0.31753911E+04 0.31728511E+04 + 0.31728511E+04 0.31729170E+04 0.31729170E+04 0.31770601E+04 + 0.31770601E+04 0.31841040E+04 0.31841040E+04 0.31907959E+04 + 0.31907959E+04 0.31939980E+04 0.31939980E+04 0.31995801E+04 + 0.31995801E+04 0.32046140E+04 0.32046140E+04 0.32085601E+04 + 0.31699661E+04 0.31727219E+04 0.31727219E+04 0.31753911E+04 + 0.31753911E+04 0.31728511E+04 0.31728511E+04 0.31729170E+04 + 0.31729170E+04 0.31770601E+04 0.31770601E+04 0.31841040E+04 + 0.31841040E+04 0.31907959E+04 0.31907959E+04 0.31939980E+04 + 0.31939980E+04 0.31995801E+04 0.31995801E+04 0.32046140E+04 + 0.32046140E+04 0.32085601E+04 0.31611609E+04 0.31553469E+04 + 0.31553469E+04 0.31553989E+04 0.31553989E+04 0.31572251E+04 + 0.31572251E+04 0.31678340E+04 0.31678340E+04 0.31796790E+04 + 0.31796790E+04 0.31873999E+04 0.31873999E+04 0.31905920E+04 + 0.31905920E+04 0.31941040E+04 0.31941040E+04 0.32007759E+04 + 0.32007759E+04 0.32082190E+04 0.32082190E+04 0.32144199E+04 + 0.31611609E+04 0.31553469E+04 0.31553469E+04 0.31553989E+04 + 0.31553989E+04 0.31572251E+04 0.31572251E+04 0.31678340E+04 + 0.31678340E+04 0.31796790E+04 0.31796790E+04 0.31873999E+04 + 0.31873999E+04 0.31905920E+04 0.31905920E+04 0.31941040E+04 + 0.31941040E+04 0.32007759E+04 0.32007759E+04 0.32082190E+04 + 0.32082190E+04 0.32144199E+04 0.31683411E+04 0.31628201E+04 + 0.31628201E+04 0.31641721E+04 0.31641721E+04 0.31645930E+04 + 0.31645930E+04 0.31677471E+04 0.31677471E+04 0.31735559E+04 + 0.31735559E+04 0.31782009E+04 0.31782009E+04 0.31808660E+04 + 0.31808660E+04 0.31876670E+04 0.31876670E+04 0.31986589E+04 + 0.31986589E+04 0.32095029E+04 0.32095029E+04 0.32188149E+04 + 0.31683411E+04 0.31628201E+04 0.31628201E+04 0.31641721E+04 + 0.31641721E+04 0.31645930E+04 0.31645930E+04 0.31677471E+04 + 0.31677471E+04 0.31735559E+04 0.31735559E+04 0.31782009E+04 + 0.31782009E+04 0.31808660E+04 0.31808660E+04 0.31876670E+04 + 0.31876670E+04 0.31986589E+04 0.31986589E+04 0.32095029E+04 + 0.32095029E+04 0.32188149E+04 0.31822329E+04 0.31841560E+04 + 0.31841560E+04 0.31848081E+04 0.31848081E+04 0.31806909E+04 + 0.31806909E+04 0.31730471E+04 0.31730471E+04 0.31696799E+04 + 0.31696799E+04 0.31725259E+04 0.31725259E+04 0.31773579E+04 + 0.31773579E+04 0.31826980E+04 0.31826980E+04 0.31924690E+04 + 0.31924690E+04 0.32047351E+04 0.32047351E+04 0.32168411E+04 + 0.31822329E+04 0.31841560E+04 0.31841560E+04 0.31848081E+04 + 0.31848081E+04 0.31806909E+04 0.31806909E+04 0.31730471E+04 + 0.31730471E+04 0.31696799E+04 0.31696799E+04 0.31725259E+04 + 0.31725259E+04 0.31773579E+04 0.31773579E+04 0.31826980E+04 + 0.31826980E+04 0.31924690E+04 0.31924690E+04 0.32047351E+04 + 0.32047351E+04 0.32168411E+04 0.31809641E+04 0.31893760E+04 + 0.31893760E+04 0.31919790E+04 0.31919790E+04 0.31897339E+04 + 0.31897339E+04 0.31859939E+04 0.31859939E+04 0.31819060E+04 + 0.31819060E+04 0.31804480E+04 0.31804480E+04 0.31781941E+04 + 0.31781941E+04 0.31775291E+04 0.31775291E+04 0.31843760E+04 + 0.31843760E+04 0.31963760E+04 0.31963760E+04 0.32086370E+04 + 0.31809641E+04 0.31893760E+04 0.31893760E+04 0.31919790E+04 + 0.31919790E+04 0.31897339E+04 0.31897339E+04 0.31859939E+04 + 0.31859939E+04 0.31819060E+04 0.31819060E+04 0.31804480E+04 + 0.31804480E+04 0.31781941E+04 0.31781941E+04 0.31775291E+04 + 0.31775291E+04 0.31843760E+04 0.31843760E+04 0.31963760E+04 + 0.31963760E+04 0.32086370E+04 0.31793640E+04 0.31864529E+04 + 0.31864529E+04 0.31911609E+04 0.31911609E+04 0.31901160E+04 + 0.31901160E+04 0.31889509E+04 0.31889509E+04 0.31876550E+04 + 0.31876550E+04 0.31840911E+04 0.31840911E+04 0.31759189E+04 + 0.31759189E+04 0.31725459E+04 0.31725459E+04 0.31765901E+04 + 0.31765901E+04 0.31842830E+04 0.31842830E+04 0.31923191E+04 + 0.31793640E+04 0.31864529E+04 0.31864529E+04 0.31911609E+04 + 0.31911609E+04 0.31901160E+04 0.31901160E+04 0.31889509E+04 + 0.31889509E+04 0.31876550E+04 0.31876550E+04 0.31840911E+04 + 0.31840911E+04 0.31759189E+04 0.31759189E+04 0.31725459E+04 + 0.31725459E+04 0.31765901E+04 0.31765901E+04 0.31842830E+04 + 0.31842830E+04 0.31923191E+04 0.31877041E+04 0.31901670E+04 + 0.31901670E+04 0.31971150E+04 0.31971150E+04 0.31960120E+04 + 0.31960120E+04 0.31905181E+04 0.31905181E+04 0.31869600E+04 + 0.31869600E+04 0.31831931E+04 0.31831931E+04 0.31749761E+04 + 0.31749761E+04 0.31692920E+04 0.31692920E+04 0.31726221E+04 + 0.31726221E+04 0.31774031E+04 0.31774031E+04 0.31819951E+04 + 0.31877041E+04 0.31901670E+04 0.31901670E+04 0.31971150E+04 + 0.31971150E+04 0.31960120E+04 0.31960120E+04 0.31905181E+04 + 0.31905181E+04 0.31869600E+04 0.31869600E+04 0.31831931E+04 + 0.31831931E+04 0.31749761E+04 0.31749761E+04 0.31692920E+04 + 0.31692920E+04 0.31726221E+04 0.31726221E+04 0.31774031E+04 + 0.31774031E+04 0.31819951E+04 0.31977009E+04 0.31974729E+04 + 0.31974729E+04 0.32024150E+04 0.32024150E+04 0.32010669E+04 + 0.32010669E+04 0.31939609E+04 0.31939609E+04 0.31874629E+04 + 0.31874629E+04 0.31822490E+04 0.31822490E+04 0.31741641E+04 + 0.31741641E+04 0.31677371E+04 0.31677371E+04 0.31693601E+04 + 0.31693601E+04 0.31740759E+04 0.31740759E+04 0.31798650E+04 + 0.31977009E+04 0.31974729E+04 0.31974729E+04 0.32024150E+04 + 0.32024150E+04 0.32010669E+04 0.32010669E+04 0.31939609E+04 + 0.31939609E+04 0.31874629E+04 0.31874629E+04 0.31822490E+04 + 0.31822490E+04 0.31741641E+04 0.31741641E+04 0.31677371E+04 + 0.31677371E+04 0.31693601E+04 0.31693601E+04 0.31740759E+04 + 0.31740759E+04 0.31798650E+04 0.31939680E+04 0.31947000E+04 + 0.31947000E+04 0.31975229E+04 0.31975229E+04 0.31957939E+04 + 0.31957939E+04 0.31875530E+04 0.31875530E+04 0.31792681E+04 + 0.31792681E+04 0.31752649E+04 0.31752649E+04 0.31720710E+04 + 0.31720710E+04 0.31692590E+04 0.31692590E+04 0.31700210E+04 + 0.31700210E+04 0.31749360E+04 0.31749360E+04 0.31821831E+04 + 0.31939680E+04 0.31947000E+04 0.31947000E+04 0.31975229E+04 + 0.31975229E+04 0.31957939E+04 0.31957939E+04 0.31875530E+04 + 0.31875530E+04 0.31792681E+04 0.31792681E+04 0.31752649E+04 + 0.31752649E+04 0.31720710E+04 0.31720710E+04 0.31692590E+04 + 0.31692590E+04 0.31700210E+04 0.31700210E+04 0.31749360E+04 + 0.30468899E+04 0.30465161E+04 0.31879099E+04 0.31828279E+04 + 0.31828279E+04 0.31853689E+04 0.31853689E+04 0.31849299E+04 + 0.31849299E+04 0.31788020E+04 0.31788020E+04 0.31736799E+04 + 0.31736799E+04 0.31713621E+04 0.31713621E+04 0.31699961E+04 + 0.31699961E+04 0.31704331E+04 0.31704331E+04 0.31717681E+04 + 0.31717681E+04 0.31740901E+04 0.30516919E+04 0.30478201E+04 + 0.31879099E+04 0.31828279E+04 0.31828279E+04 0.31853689E+04 + 0.31853689E+04 0.31849299E+04 0.31849299E+04 0.31788020E+04 + 0.31788020E+04 0.31736799E+04 0.31736799E+04 0.31713621E+04 + 0.31713621E+04 0.31699961E+04 0.31699961E+04 0.31704331E+04 + 0.30812129E+04 0.30778210E+04 0.30778210E+04 0.30762830E+04 + 0.30516919E+04 0.30478201E+04 0.31903669E+04 0.31772200E+04 + 0.31772200E+04 0.31755139E+04 0.31755139E+04 0.31746250E+04 + 0.31746250E+04 0.31719141E+04 0.31719141E+04 0.31692351E+04 + 0.31692351E+04 0.31685039E+04 0.31685039E+04 0.31692881E+04 + 0.31692881E+04 0.31693521E+04 0.30806841E+04 0.30790669E+04 + 0.30790669E+04 0.30769009E+04 0.30511770E+04 0.30482351E+04 + 0.31903669E+04 0.31772200E+04 0.31772200E+04 0.31755139E+04 + 0.31755139E+04 0.31746250E+04 0.31746250E+04 0.31719141E+04 + 0.31719141E+04 0.31692351E+04 0.31692351E+04 0.31685039E+04 + 0.30927900E+04 0.30883989E+04 0.30883989E+04 0.30806841E+04 + 0.30806841E+04 0.30790669E+04 0.30790669E+04 0.30769009E+04 + 0.30511770E+04 0.30482351E+04 0.31901240E+04 0.31778550E+04 + 0.31778550E+04 0.31721489E+04 0.31721489E+04 0.31703159E+04 + 0.31703159E+04 0.31682041E+04 0.31682041E+04 0.31677771E+04 + 0.31677771E+04 0.31667900E+04 0.30943689E+04 0.30906440E+04 + 0.30906440E+04 0.30850210E+04 0.30850210E+04 0.30812029E+04 + 0.30812029E+04 0.30783770E+04 0.30514839E+04 0.30485581E+04 + 0.31901240E+04 0.31778550E+04 0.31778550E+04 0.31721489E+04 + 0.31721489E+04 0.31703159E+04 0.31703159E+04 0.31682041E+04 + 0.31020581E+04 0.30984309E+04 0.30984309E+04 0.30943689E+04 + 0.30943689E+04 0.30906440E+04 0.30906440E+04 0.30850210E+04 + 0.30850210E+04 0.30812029E+04 0.30812029E+04 0.30783770E+04 + 0.30514839E+04 0.30485581E+04 0.31884609E+04 0.31809309E+04 + 0.31809309E+04 0.31744500E+04 0.31744500E+04 0.31720549E+04 + 0.31720549E+04 0.31682300E+04 0.31034709E+04 0.30999839E+04 + 0.30999839E+04 0.30969209E+04 0.30969209E+04 0.30936311E+04 + 0.30936311E+04 0.30877690E+04 0.30877690E+04 0.30822161E+04 + 0.30822161E+04 0.30792820E+04 0.30515669E+04 0.30490559E+04 + 0.31884609E+04 0.31809309E+04 0.31809309E+04 0.31744500E+04 + 0.31131479E+04 0.31091289E+04 0.31091289E+04 0.31034709E+04 + 0.31034709E+04 0.30999839E+04 0.30999839E+04 0.30969209E+04 + 0.30969209E+04 0.30936311E+04 0.30936311E+04 0.30877690E+04 + 0.30877690E+04 0.30822161E+04 0.30822161E+04 0.30792820E+04 + 0.30515669E+04 0.30490559E+04 0.31881279E+04 0.31829141E+04 + 0.31829141E+04 0.31770200E+04 0.31163889E+04 0.31110400E+04 + 0.31110400E+04 0.31049810E+04 0.31049810E+04 0.31005920E+04 + 0.31005920E+04 0.30948140E+04 0.30948140E+04 0.30906589E+04 + 0.30906589E+04 0.30883621E+04 0.30883621E+04 0.30846150E+04 + 0.30846150E+04 0.30806990E+04 0.30521599E+04 0.30496089E+04 + 0.31258569E+04 0.31224541E+04 0.31224541E+04 0.31163889E+04 + 0.31163889E+04 0.31110400E+04 0.31110400E+04 0.31049810E+04 + 0.31049810E+04 0.31005920E+04 0.31005920E+04 0.30948140E+04 + 0.30948140E+04 0.30906589E+04 0.30906589E+04 0.30883621E+04 + 0.30883621E+04 0.30846150E+04 0.30846150E+04 0.30806990E+04 + 0.30806990E+04 0.30779629E+04 0.31276350E+04 0.31252070E+04 + 0.31252070E+04 0.31214470E+04 0.31214470E+04 0.31149270E+04 + 0.31149270E+04 0.31037419E+04 0.31037419E+04 0.30965801E+04 + 0.30965801E+04 0.30920349E+04 0.30920349E+04 0.30909810E+04 + 0.30909810E+04 0.30922600E+04 0.30922600E+04 0.30883960E+04 + 0.30883960E+04 0.30824771E+04 0.30824771E+04 0.30788440E+04 + 0.31886160E+04 0.31892400E+04 0.31892400E+04 0.31917129E+04 + 0.31917129E+04 0.31913711E+04 0.31913711E+04 0.31862229E+04 + 0.31862229E+04 0.31801040E+04 0.31801040E+04 0.31810950E+04 + 0.31810950E+04 0.31864270E+04 0.31864270E+04 0.31879529E+04 + 0.31879529E+04 0.31887729E+04 0.31887729E+04 0.31939680E+04 + 0.31939680E+04 0.32012671E+04 0.31783970E+04 0.31815769E+04 + 0.31815769E+04 0.31858201E+04 0.31858201E+04 0.31856360E+04 + 0.31856360E+04 0.31825591E+04 0.31825591E+04 0.31815879E+04 + 0.31815879E+04 0.31866599E+04 0.31866599E+04 0.31927471E+04 + 0.31927471E+04 0.31933020E+04 0.31933020E+04 0.31965471E+04 + 0.31965471E+04 0.32013589E+04 0.32013589E+04 0.32063040E+04 + 0.31783970E+04 0.31815769E+04 0.31815769E+04 0.31858201E+04 + 0.31858201E+04 0.31856360E+04 0.31856360E+04 0.31825591E+04 + 0.31825591E+04 0.31815879E+04 0.31815879E+04 0.31866599E+04 + 0.31866599E+04 0.31927471E+04 0.31927471E+04 0.31933020E+04 + 0.31933020E+04 0.31965471E+04 0.31965471E+04 0.32013589E+04 + 0.32013589E+04 0.32063040E+04 0.31699661E+04 0.31727219E+04 + 0.31727219E+04 0.31753911E+04 0.31753911E+04 0.31728511E+04 + 0.31728511E+04 0.31729170E+04 0.31729170E+04 0.31770601E+04 + 0.31770601E+04 0.31841040E+04 0.31841040E+04 0.31907959E+04 + 0.31907959E+04 0.31939980E+04 0.31939980E+04 0.31995801E+04 + 0.31995801E+04 0.32046140E+04 0.32046140E+04 0.32085601E+04 + 0.31699661E+04 0.31727219E+04 0.31727219E+04 0.31753911E+04 + 0.31753911E+04 0.31728511E+04 0.31728511E+04 0.31729170E+04 + 0.31729170E+04 0.31770601E+04 0.31770601E+04 0.31841040E+04 + 0.31841040E+04 0.31907959E+04 0.31907959E+04 0.31939980E+04 + 0.31939980E+04 0.31995801E+04 0.31995801E+04 0.32046140E+04 + 0.32046140E+04 0.32085601E+04 0.31611609E+04 0.31553469E+04 + 0.31553469E+04 0.31553989E+04 0.31553989E+04 0.31572251E+04 + 0.31572251E+04 0.31678340E+04 0.31678340E+04 0.31796790E+04 + 0.31796790E+04 0.31873999E+04 0.31873999E+04 0.31905920E+04 + 0.31905920E+04 0.31941040E+04 0.31941040E+04 0.32007759E+04 + 0.32007759E+04 0.32082190E+04 0.32082190E+04 0.32144199E+04 + 0.31611609E+04 0.31553469E+04 0.31553469E+04 0.31553989E+04 + 0.31553989E+04 0.31572251E+04 0.31572251E+04 0.31678340E+04 + 0.31678340E+04 0.31796790E+04 0.31796790E+04 0.31873999E+04 + 0.31873999E+04 0.31905920E+04 0.31905920E+04 0.31941040E+04 + 0.31941040E+04 0.32007759E+04 0.32007759E+04 0.32082190E+04 + 0.32082190E+04 0.32144199E+04 0.31683411E+04 0.31628201E+04 + 0.31628201E+04 0.31641721E+04 0.31641721E+04 0.31645930E+04 + 0.31645930E+04 0.31677471E+04 0.31677471E+04 0.31735559E+04 + 0.31735559E+04 0.31782009E+04 0.31782009E+04 0.31808660E+04 + 0.31808660E+04 0.31876670E+04 0.31876670E+04 0.31986589E+04 + 0.31986589E+04 0.32095029E+04 0.32095029E+04 0.32188149E+04 + 0.31683411E+04 0.31628201E+04 0.31628201E+04 0.31641721E+04 + 0.31641721E+04 0.31645930E+04 0.31645930E+04 0.31677471E+04 + 0.31677471E+04 0.31735559E+04 0.31735559E+04 0.31782009E+04 + 0.31782009E+04 0.31808660E+04 0.31808660E+04 0.31876670E+04 + 0.31876670E+04 0.31986589E+04 0.31986589E+04 0.32095029E+04 + 0.32095029E+04 0.32188149E+04 0.31822329E+04 0.31841560E+04 + 0.31841560E+04 0.31848081E+04 0.31848081E+04 0.31806909E+04 + 0.31806909E+04 0.31730471E+04 0.31730471E+04 0.31696799E+04 + 0.31696799E+04 0.31725259E+04 0.31725259E+04 0.31773579E+04 + 0.31773579E+04 0.31826980E+04 0.31826980E+04 0.31924690E+04 + 0.31924690E+04 0.32047351E+04 0.32047351E+04 0.32168411E+04 + 0.31822329E+04 0.31841560E+04 0.31841560E+04 0.31848081E+04 + 0.31848081E+04 0.31806909E+04 0.31806909E+04 0.31730471E+04 + 0.31730471E+04 0.31696799E+04 0.31696799E+04 0.31725259E+04 + 0.31725259E+04 0.31773579E+04 0.31773579E+04 0.31826980E+04 + 0.31826980E+04 0.31924690E+04 0.31924690E+04 0.32047351E+04 + 0.32047351E+04 0.32168411E+04 0.31809641E+04 0.31893760E+04 + 0.31893760E+04 0.31919790E+04 0.31919790E+04 0.31897339E+04 + 0.31897339E+04 0.31859939E+04 0.31859939E+04 0.31819060E+04 + 0.31819060E+04 0.31804480E+04 0.31804480E+04 0.31781941E+04 + 0.31781941E+04 0.31775291E+04 0.31775291E+04 0.31843760E+04 + 0.31843760E+04 0.31963760E+04 0.31963760E+04 0.32086370E+04 + 0.31809641E+04 0.31893760E+04 0.31893760E+04 0.31919790E+04 + 0.31919790E+04 0.31897339E+04 0.31897339E+04 0.31859939E+04 + 0.31859939E+04 0.31819060E+04 0.31819060E+04 0.31804480E+04 + 0.31804480E+04 0.31781941E+04 0.31781941E+04 0.31775291E+04 + 0.31775291E+04 0.31843760E+04 0.31843760E+04 0.31963760E+04 + 0.31963760E+04 0.32086370E+04 0.31793640E+04 0.31864529E+04 + 0.31864529E+04 0.31911609E+04 0.31911609E+04 0.31901160E+04 + 0.31901160E+04 0.31889509E+04 0.31889509E+04 0.31876550E+04 + 0.31876550E+04 0.31840911E+04 0.31840911E+04 0.31759189E+04 + 0.31759189E+04 0.31725459E+04 0.31725459E+04 0.31765901E+04 + 0.31765901E+04 0.31842830E+04 0.31842830E+04 0.31923191E+04 + 0.31793640E+04 0.31864529E+04 0.31864529E+04 0.31911609E+04 + 0.31911609E+04 0.31901160E+04 0.31901160E+04 0.31889509E+04 + 0.31889509E+04 0.31876550E+04 0.31876550E+04 0.31840911E+04 + 0.31840911E+04 0.31759189E+04 0.31759189E+04 0.31725459E+04 + 0.31725459E+04 0.31765901E+04 0.31765901E+04 0.31842830E+04 + 0.31842830E+04 0.31923191E+04 0.31877041E+04 0.31901670E+04 + 0.31901670E+04 0.31971150E+04 0.31971150E+04 0.31960120E+04 + 0.31960120E+04 0.31905181E+04 0.31905181E+04 0.31869600E+04 + 0.31869600E+04 0.31831931E+04 0.31831931E+04 0.31749761E+04 + 0.31749761E+04 0.31692920E+04 0.31692920E+04 0.31726221E+04 + 0.31726221E+04 0.31774031E+04 0.31774031E+04 0.31819951E+04 + 0.31877041E+04 0.31901670E+04 0.31901670E+04 0.31971150E+04 + 0.31971150E+04 0.31960120E+04 0.31960120E+04 0.31905181E+04 + 0.31905181E+04 0.31869600E+04 0.31869600E+04 0.31831931E+04 + 0.31831931E+04 0.31749761E+04 0.31749761E+04 0.31692920E+04 + 0.31692920E+04 0.31726221E+04 0.31726221E+04 0.31774031E+04 + 0.31774031E+04 0.31819951E+04 0.31977009E+04 0.31974729E+04 + 0.31974729E+04 0.32024150E+04 0.32024150E+04 0.32010669E+04 + 0.32010669E+04 0.31939609E+04 0.31939609E+04 0.31874629E+04 + 0.31874629E+04 0.31822490E+04 0.31822490E+04 0.31741641E+04 + 0.31741641E+04 0.31677371E+04 0.31677371E+04 0.31693601E+04 + 0.31693601E+04 0.31740759E+04 0.31740759E+04 0.31798650E+04 + 0.31977009E+04 0.31974729E+04 0.31974729E+04 0.32024150E+04 + 0.32024150E+04 0.32010669E+04 0.32010669E+04 0.31939609E+04 + 0.31939609E+04 0.31874629E+04 0.31874629E+04 0.31822490E+04 + 0.31822490E+04 0.31741641E+04 0.31741641E+04 0.31677371E+04 + 0.31677371E+04 0.31693601E+04 0.31693601E+04 0.31740759E+04 + 0.31740759E+04 0.31798650E+04 0.31939680E+04 0.31947000E+04 + 0.31947000E+04 0.31975229E+04 0.31975229E+04 0.31957939E+04 + 0.31957939E+04 0.31875530E+04 0.31875530E+04 0.31792681E+04 + 0.31792681E+04 0.31752649E+04 0.31752649E+04 0.31720710E+04 + 0.31720710E+04 0.31692590E+04 0.31692590E+04 0.31700210E+04 + 0.31700210E+04 0.31749360E+04 0.31749360E+04 0.31821831E+04 + 0.31939680E+04 0.31947000E+04 0.31947000E+04 0.31975229E+04 + 0.31975229E+04 0.31957939E+04 0.31957939E+04 0.31875530E+04 + 0.31875530E+04 0.31792681E+04 0.31792681E+04 0.31752649E+04 + 0.31752649E+04 0.31720710E+04 0.31720710E+04 0.31692590E+04 + 0.31692590E+04 0.31700210E+04 0.31700210E+04 0.31749360E+04 + 0.30468899E+04 0.30465161E+04 0.31879099E+04 0.31828279E+04 + 0.31828279E+04 0.31853689E+04 0.31853689E+04 0.31849299E+04 + 0.31849299E+04 0.31788020E+04 0.31788020E+04 0.31736799E+04 + 0.31736799E+04 0.31713621E+04 0.31713621E+04 0.31699961E+04 + 0.31699961E+04 0.31704331E+04 0.31704331E+04 0.31717681E+04 + 0.31717681E+04 0.31740901E+04 0.30516919E+04 0.30478201E+04 + 0.31879099E+04 0.31828279E+04 0.31828279E+04 0.31853689E+04 + 0.31853689E+04 0.31849299E+04 0.31849299E+04 0.31788020E+04 + 0.31788020E+04 0.31736799E+04 0.31736799E+04 0.31713621E+04 + 0.31713621E+04 0.31699961E+04 0.31699961E+04 0.31704331E+04 + 0.30812129E+04 0.30778210E+04 0.30778210E+04 0.30762830E+04 + 0.30516919E+04 0.30478201E+04 0.31903669E+04 0.31772200E+04 + 0.31772200E+04 0.31755139E+04 0.31755139E+04 0.31746250E+04 + 0.31746250E+04 0.31719141E+04 0.31719141E+04 0.31692351E+04 + 0.31692351E+04 0.31685039E+04 0.31685039E+04 0.31692881E+04 + 0.31692881E+04 0.31693521E+04 0.30806841E+04 0.30790669E+04 + 0.30790669E+04 0.30769009E+04 0.30511770E+04 0.30482351E+04 + 0.31903669E+04 0.31772200E+04 0.31772200E+04 0.31755139E+04 + 0.31755139E+04 0.31746250E+04 0.31746250E+04 0.31719141E+04 + 0.31719141E+04 0.31692351E+04 0.31692351E+04 0.31685039E+04 + 0.30927900E+04 0.30883989E+04 0.30883989E+04 0.30806841E+04 + 0.30806841E+04 0.30790669E+04 0.30790669E+04 0.30769009E+04 + 0.30511770E+04 0.30482351E+04 0.31901240E+04 0.31778550E+04 + 0.31778550E+04 0.31721489E+04 0.31721489E+04 0.31703159E+04 + 0.31703159E+04 0.31682041E+04 0.31682041E+04 0.31677771E+04 + 0.31677771E+04 0.31667900E+04 0.30943689E+04 0.30906440E+04 + 0.30906440E+04 0.30850210E+04 0.30850210E+04 0.30812029E+04 + 0.30812029E+04 0.30783770E+04 0.30514839E+04 0.30485581E+04 + 0.31901240E+04 0.31778550E+04 0.31778550E+04 0.31721489E+04 + 0.31721489E+04 0.31703159E+04 0.31703159E+04 0.31682041E+04 + 0.31020581E+04 0.30984309E+04 0.30984309E+04 0.30943689E+04 + 0.30943689E+04 0.30906440E+04 0.30906440E+04 0.30850210E+04 + 0.30850210E+04 0.30812029E+04 0.30812029E+04 0.30783770E+04 + 0.30514839E+04 0.30485581E+04 0.31884609E+04 0.31809309E+04 + 0.31809309E+04 0.31744500E+04 0.31744500E+04 0.31720549E+04 + 0.31720549E+04 0.31682300E+04 0.31034709E+04 0.30999839E+04 + 0.30999839E+04 0.30969209E+04 0.30969209E+04 0.30936311E+04 + 0.30936311E+04 0.30877690E+04 0.30877690E+04 0.30822161E+04 + 0.30822161E+04 0.30792820E+04 0.30515669E+04 0.30490559E+04 + 0.31884609E+04 0.31809309E+04 0.31809309E+04 0.31744500E+04 + 0.31131479E+04 0.31091289E+04 0.31091289E+04 0.31034709E+04 + 0.31034709E+04 0.30999839E+04 0.30999839E+04 0.30969209E+04 + 0.30969209E+04 0.30936311E+04 0.30936311E+04 0.30877690E+04 + 0.30877690E+04 0.30822161E+04 0.30822161E+04 0.30792820E+04 + 0.30515669E+04 0.30490559E+04 0.31881279E+04 0.31829141E+04 + 0.31829141E+04 0.31770200E+04 0.31163889E+04 0.31110400E+04 + 0.31110400E+04 0.31049810E+04 0.31049810E+04 0.31005920E+04 + 0.31005920E+04 0.30948140E+04 0.30948140E+04 0.30906589E+04 + 0.30906589E+04 0.30883621E+04 0.30883621E+04 0.30846150E+04 + 0.30846150E+04 0.30806990E+04 0.30521599E+04 0.30496089E+04 + 0.31258569E+04 0.31224541E+04 0.31224541E+04 0.31163889E+04 + 0.31163889E+04 0.31110400E+04 0.31110400E+04 0.31049810E+04 + 0.31049810E+04 0.31005920E+04 0.31005920E+04 0.30948140E+04 + 0.30948140E+04 0.30906589E+04 0.30906589E+04 0.30883621E+04 + 0.30883621E+04 0.30846150E+04 0.30846150E+04 0.30806990E+04 + 0.30806990E+04 0.30779629E+04 0.31276350E+04 0.31252070E+04 + 0.31252070E+04 0.31214470E+04 0.31214470E+04 0.31149270E+04 + 0.31149270E+04 0.31037419E+04 0.31037419E+04 0.30965801E+04 + 0.30965801E+04 0.30920349E+04 0.30920349E+04 0.30909810E+04 + 0.30909810E+04 0.30922600E+04 0.30922600E+04 0.30883960E+04 + 0.30883960E+04 0.30824771E+04 0.30824771E+04 0.30788440E+04 + 0.31904670E+04 0.31909270E+04 0.31909270E+04 0.31934250E+04 + 0.31934250E+04 0.31931760E+04 0.31931760E+04 0.31880901E+04 + 0.31880901E+04 0.31817991E+04 0.31817991E+04 0.31825850E+04 + 0.31825850E+04 0.31878511E+04 0.31878511E+04 0.31894929E+04 + 0.31894929E+04 0.31903540E+04 0.31903540E+04 0.31955210E+04 + 0.31955210E+04 0.32028240E+04 0.31802820E+04 0.31832549E+04 + 0.31832549E+04 0.31875591E+04 0.31875591E+04 0.31875029E+04 + 0.31875029E+04 0.31844199E+04 0.31844199E+04 0.31832610E+04 + 0.31832610E+04 0.31881909E+04 0.31881909E+04 0.31943059E+04 + 0.31943059E+04 0.31950249E+04 0.31950249E+04 0.31982019E+04 + 0.31982019E+04 0.32030071E+04 0.32030071E+04 0.32078169E+04 + 0.31802820E+04 0.31832549E+04 0.31832549E+04 0.31875591E+04 + 0.31875591E+04 0.31875029E+04 0.31875029E+04 0.31844199E+04 + 0.31844199E+04 0.31832610E+04 0.31832610E+04 0.31881909E+04 + 0.31881909E+04 0.31943059E+04 0.31943059E+04 0.31950249E+04 + 0.31950249E+04 0.31982019E+04 0.31982019E+04 0.32030071E+04 + 0.32030071E+04 0.32078169E+04 0.31719109E+04 0.31745220E+04 + 0.31745220E+04 0.31772820E+04 0.31772820E+04 0.31747549E+04 + 0.31747549E+04 0.31745759E+04 0.31745759E+04 0.31784641E+04 + 0.31784641E+04 0.31854141E+04 0.31854141E+04 0.31921731E+04 + 0.31921731E+04 0.31954990E+04 0.31954990E+04 0.32010669E+04 + 0.32010669E+04 0.32061299E+04 0.32061299E+04 0.32098379E+04 + 0.31719109E+04 0.31745220E+04 0.31745220E+04 0.31772820E+04 + 0.31772820E+04 0.31747549E+04 0.31747549E+04 0.31745759E+04 + 0.31745759E+04 0.31784641E+04 0.31784641E+04 0.31854141E+04 + 0.31854141E+04 0.31921731E+04 0.31921731E+04 0.31954990E+04 + 0.31954990E+04 0.32010669E+04 0.32010669E+04 0.32061299E+04 + 0.32061299E+04 0.32098379E+04 0.31627849E+04 0.31568730E+04 + 0.31568730E+04 0.31569390E+04 0.31569390E+04 0.31584810E+04 + 0.31584810E+04 0.31688911E+04 0.31688911E+04 0.31807000E+04 + 0.31807000E+04 0.31885061E+04 0.31885061E+04 0.31918379E+04 + 0.31918379E+04 0.31953811E+04 0.31953811E+04 0.32019250E+04 + 0.32019250E+04 0.32092300E+04 0.32092300E+04 0.32152400E+04 + 0.31627849E+04 0.31568730E+04 0.31568730E+04 0.31569390E+04 + 0.31569390E+04 0.31584810E+04 0.31584810E+04 0.31688911E+04 + 0.31688911E+04 0.31807000E+04 0.31807000E+04 0.31885061E+04 + 0.31885061E+04 0.31918379E+04 0.31918379E+04 0.31953811E+04 + 0.31953811E+04 0.32019250E+04 0.32019250E+04 0.32092300E+04 + 0.32092300E+04 0.32152400E+04 0.31691680E+04 0.31637141E+04 + 0.31637141E+04 0.31651450E+04 0.31651450E+04 0.31656021E+04 + 0.31656021E+04 0.31687520E+04 0.31687520E+04 0.31745669E+04 + 0.31745669E+04 0.31792000E+04 0.31792000E+04 0.31817581E+04 + 0.31817581E+04 0.31884810E+04 0.31884810E+04 0.31994270E+04 + 0.31994270E+04 0.32102310E+04 0.32102310E+04 0.32195181E+04 + 0.31691680E+04 0.31637141E+04 0.31637141E+04 0.31651450E+04 + 0.31651450E+04 0.31656021E+04 0.31656021E+04 0.31687520E+04 + 0.31687520E+04 0.31745669E+04 0.31745669E+04 0.31792000E+04 + 0.31792000E+04 0.31817581E+04 0.31817581E+04 0.31884810E+04 + 0.31884810E+04 0.31994270E+04 0.31994270E+04 0.32102310E+04 + 0.32102310E+04 0.32195181E+04 0.31830710E+04 0.31849409E+04 + 0.31849409E+04 0.31856350E+04 0.31856350E+04 0.31815920E+04 + 0.31815920E+04 0.31739060E+04 0.31739060E+04 0.31704180E+04 + 0.31704180E+04 0.31731919E+04 0.31731919E+04 0.31780859E+04 + 0.31780859E+04 0.31834189E+04 0.31834189E+04 0.31930959E+04 + 0.31930959E+04 0.32053640E+04 0.32053640E+04 0.32174871E+04 + 0.31830710E+04 0.31849409E+04 0.31849409E+04 0.31856350E+04 + 0.31856350E+04 0.31815920E+04 0.31815920E+04 0.31739060E+04 + 0.31739060E+04 0.31704180E+04 0.31704180E+04 0.31731919E+04 + 0.31731919E+04 0.31780859E+04 0.31780859E+04 0.31834189E+04 + 0.31834189E+04 0.31930959E+04 0.31930959E+04 0.32053640E+04 + 0.32053640E+04 0.32174871E+04 0.31817041E+04 0.31900920E+04 + 0.31900920E+04 0.31928230E+04 0.31928230E+04 0.31906260E+04 + 0.31906260E+04 0.31868359E+04 0.31868359E+04 0.31826130E+04 + 0.31826130E+04 0.31811450E+04 0.31811450E+04 0.31789319E+04 + 0.31789319E+04 0.31781541E+04 0.31781541E+04 0.31849221E+04 + 0.31849221E+04 0.31970200E+04 0.31970200E+04 0.32094189E+04 + 0.31817041E+04 0.31900920E+04 0.31900920E+04 0.31928230E+04 + 0.31928230E+04 0.31906260E+04 0.31906260E+04 0.31868359E+04 + 0.31868359E+04 0.31826130E+04 0.31826130E+04 0.31811450E+04 + 0.31811450E+04 0.31789319E+04 0.31789319E+04 0.31781541E+04 + 0.31781541E+04 0.31849221E+04 0.31849221E+04 0.31970200E+04 + 0.31970200E+04 0.32094189E+04 0.31800200E+04 0.31871121E+04 + 0.31871121E+04 0.31919390E+04 0.31919390E+04 0.31909231E+04 + 0.31909231E+04 0.31897300E+04 0.31897300E+04 0.31883979E+04 + 0.31883979E+04 0.31849009E+04 0.31849009E+04 0.31766899E+04 + 0.31766899E+04 0.31732161E+04 0.31732161E+04 0.31771689E+04 + 0.31771689E+04 0.31849141E+04 0.31849141E+04 0.31931050E+04 + 0.31800200E+04 0.31871121E+04 0.31871121E+04 0.31919390E+04 + 0.31919390E+04 0.31909231E+04 0.31909231E+04 0.31897300E+04 + 0.31897300E+04 0.31883979E+04 0.31883979E+04 0.31849009E+04 + 0.31849009E+04 0.31766899E+04 0.31766899E+04 0.31732161E+04 + 0.31732161E+04 0.31771689E+04 0.31771689E+04 0.31849141E+04 + 0.31849141E+04 0.31931050E+04 0.31884580E+04 0.31907800E+04 + 0.31907800E+04 0.31977910E+04 0.31977910E+04 0.31968149E+04 + 0.31968149E+04 0.31912800E+04 0.31912800E+04 0.31876941E+04 + 0.31876941E+04 0.31839780E+04 0.31839780E+04 0.31757859E+04 + 0.31757859E+04 0.31699751E+04 0.31699751E+04 0.31732180E+04 + 0.31732180E+04 0.31779871E+04 0.31779871E+04 0.31825850E+04 + 0.31884580E+04 0.31907800E+04 0.31907800E+04 0.31977910E+04 + 0.31977910E+04 0.31968149E+04 0.31968149E+04 0.31912800E+04 + 0.31912800E+04 0.31876941E+04 0.31876941E+04 0.31839780E+04 + 0.31839780E+04 0.31757859E+04 0.31757859E+04 0.31699751E+04 + 0.31699751E+04 0.31732180E+04 0.31732180E+04 0.31779871E+04 + 0.31779871E+04 0.31825850E+04 0.31986660E+04 0.31981880E+04 + 0.31981880E+04 0.32031230E+04 0.32031230E+04 0.32019009E+04 + 0.32019009E+04 0.31948140E+04 0.31948140E+04 0.31882671E+04 + 0.31882671E+04 0.31830359E+04 0.31830359E+04 0.31749470E+04 + 0.31749470E+04 0.31684250E+04 0.31684250E+04 0.31699819E+04 + 0.31699819E+04 0.31747390E+04 0.31747390E+04 0.31807229E+04 + 0.31986660E+04 0.31981880E+04 0.31981880E+04 0.32031230E+04 + 0.32031230E+04 0.32019009E+04 0.32019009E+04 0.31948140E+04 + 0.31948140E+04 0.31882671E+04 0.31882671E+04 0.31830359E+04 + 0.31830359E+04 0.31749470E+04 0.31749470E+04 0.31684250E+04 + 0.31684250E+04 0.31699819E+04 0.31699819E+04 0.31747390E+04 + 0.31747390E+04 0.31807229E+04 0.31949541E+04 0.31955259E+04 + 0.31955259E+04 0.31983169E+04 0.31983169E+04 0.31966941E+04 + 0.31966941E+04 0.31885061E+04 0.31885061E+04 0.31801479E+04 + 0.31801479E+04 0.31760759E+04 0.31760759E+04 0.31727959E+04 + 0.31727959E+04 0.31699021E+04 0.31699021E+04 0.31706440E+04 + 0.31706440E+04 0.31756741E+04 0.31756741E+04 0.31832080E+04 + 0.31949541E+04 0.31955259E+04 0.31955259E+04 0.31983169E+04 + 0.31983169E+04 0.31966941E+04 0.31966941E+04 0.31885061E+04 + 0.31885061E+04 0.31801479E+04 0.31801479E+04 0.31760759E+04 + 0.31760759E+04 0.31727959E+04 0.31727959E+04 0.31699021E+04 + 0.31699021E+04 0.31706440E+04 0.31706440E+04 0.31756741E+04 + 0.30474241E+04 0.30471340E+04 0.31889170E+04 0.31836609E+04 + 0.31836609E+04 0.31861260E+04 0.31861260E+04 0.31858081E+04 + 0.31858081E+04 0.31797800E+04 0.31797800E+04 0.31745740E+04 + 0.31745740E+04 0.31721650E+04 0.31721650E+04 0.31706760E+04 + 0.31706760E+04 0.31711160E+04 0.31711160E+04 0.31724570E+04 + 0.31724570E+04 0.31747939E+04 0.30522290E+04 0.30484529E+04 + 0.31889170E+04 0.31836609E+04 0.31836609E+04 0.31861260E+04 + 0.31861260E+04 0.31858081E+04 0.31858081E+04 0.31797800E+04 + 0.31797800E+04 0.31745740E+04 0.31745740E+04 0.31721650E+04 + 0.31721650E+04 0.31706760E+04 0.31706760E+04 0.31711160E+04 + 0.30820969E+04 0.30787310E+04 0.30787310E+04 0.30772229E+04 + 0.30522290E+04 0.30484529E+04 0.31914961E+04 0.31781731E+04 + 0.31781731E+04 0.31763640E+04 0.31763640E+04 0.31754680E+04 + 0.31754680E+04 0.31727690E+04 0.31727690E+04 0.31700581E+04 + 0.31700581E+04 0.31692781E+04 0.31692781E+04 0.31699939E+04 + 0.31699939E+04 0.31700920E+04 0.30814971E+04 0.30799661E+04 + 0.30799661E+04 0.30778630E+04 0.30517180E+04 0.30488149E+04 + 0.31914961E+04 0.31781731E+04 0.31781731E+04 0.31763640E+04 + 0.31763640E+04 0.31754680E+04 0.31754680E+04 0.31727690E+04 + 0.31727690E+04 0.31700581E+04 0.31700581E+04 0.31692781E+04 + 0.30937419E+04 0.30893589E+04 0.30893589E+04 0.30814971E+04 + 0.30814971E+04 0.30799661E+04 0.30799661E+04 0.30778630E+04 + 0.30517180E+04 0.30488149E+04 0.31913730E+04 0.31788899E+04 + 0.31788899E+04 0.31730850E+04 0.31730850E+04 0.31711750E+04 + 0.31711750E+04 0.31690339E+04 0.31690339E+04 0.31685779E+04 + 0.31685779E+04 0.31676060E+04 0.30953250E+04 0.30916570E+04 + 0.30916570E+04 0.30860039E+04 0.30860039E+04 0.30821340E+04 + 0.30821340E+04 0.30793301E+04 0.30520210E+04 0.30491289E+04 + 0.31913730E+04 0.31788899E+04 0.31788899E+04 0.31730850E+04 + 0.31730850E+04 0.31711750E+04 0.31711750E+04 0.31690339E+04 + 0.31029990E+04 0.30993840E+04 0.30993840E+04 0.30953250E+04 + 0.30953250E+04 0.30916570E+04 0.30916570E+04 0.30860039E+04 + 0.30860039E+04 0.30821340E+04 0.30821340E+04 0.30793301E+04 + 0.30520210E+04 0.30491289E+04 0.31893540E+04 0.31818469E+04 + 0.31818469E+04 0.31753230E+04 0.31753230E+04 0.31729529E+04 + 0.31729529E+04 0.31691479E+04 0.31044480E+04 0.31010090E+04 + 0.31010090E+04 0.30979031E+04 0.30979031E+04 0.30945779E+04 + 0.30945779E+04 0.30887500E+04 0.30887500E+04 0.30831211E+04 + 0.30831211E+04 0.30802209E+04 0.30521189E+04 0.30496521E+04 + 0.31893540E+04 0.31818469E+04 0.31818469E+04 0.31753230E+04 + 0.31140879E+04 0.31100830E+04 0.31100830E+04 0.31044480E+04 + 0.31044480E+04 0.31010090E+04 0.31010090E+04 0.30979031E+04 + 0.30979031E+04 0.30945779E+04 0.30945779E+04 0.30887500E+04 + 0.30887500E+04 0.30831211E+04 0.30831211E+04 0.30802209E+04 + 0.30521189E+04 0.30496521E+04 0.31889490E+04 0.31837849E+04 + 0.31837849E+04 0.31778921E+04 0.31173330E+04 0.31120750E+04 + 0.31120750E+04 0.31060410E+04 0.31060410E+04 0.31015950E+04 + 0.31015950E+04 0.30957581E+04 0.30957581E+04 0.30916399E+04 + 0.30916399E+04 0.30893479E+04 0.30893479E+04 0.30855229E+04 + 0.30855229E+04 0.30815820E+04 0.30527339E+04 0.30502009E+04 + 0.31266179E+04 0.31232661E+04 0.31232661E+04 0.31173330E+04 + 0.31173330E+04 0.31120750E+04 0.31120750E+04 0.31060410E+04 + 0.31060410E+04 0.31015950E+04 0.31015950E+04 0.30957581E+04 + 0.30957581E+04 0.30916399E+04 0.30916399E+04 0.30893479E+04 + 0.30893479E+04 0.30855229E+04 0.30855229E+04 0.30815820E+04 + 0.30815820E+04 0.30788320E+04 0.31283970E+04 0.31259929E+04 + 0.31259929E+04 0.31224490E+04 0.31224490E+04 0.31160840E+04 + 0.31160840E+04 0.31046841E+04 0.31046841E+04 0.30974709E+04 + 0.30974709E+04 0.30929089E+04 0.30929089E+04 0.30918750E+04 + 0.30918750E+04 0.30932390E+04 0.30932390E+04 0.30892881E+04 + 0.30892881E+04 0.30833010E+04 0.30833010E+04 0.30796560E+04 + 0.31904670E+04 0.31909270E+04 0.31909270E+04 0.31934250E+04 + 0.31934250E+04 0.31931760E+04 0.31931760E+04 0.31880901E+04 + 0.31880901E+04 0.31817991E+04 0.31817991E+04 0.31825850E+04 + 0.31825850E+04 0.31878511E+04 0.31878511E+04 0.31894929E+04 + 0.31894929E+04 0.31903540E+04 0.31903540E+04 0.31955210E+04 + 0.31955210E+04 0.32028240E+04 0.31802820E+04 0.31832549E+04 + 0.31832549E+04 0.31875591E+04 0.31875591E+04 0.31875029E+04 + 0.31875029E+04 0.31844199E+04 0.31844199E+04 0.31832610E+04 + 0.31832610E+04 0.31881909E+04 0.31881909E+04 0.31943059E+04 + 0.31943059E+04 0.31950249E+04 0.31950249E+04 0.31982019E+04 + 0.31982019E+04 0.32030071E+04 0.32030071E+04 0.32078169E+04 + 0.31802820E+04 0.31832549E+04 0.31832549E+04 0.31875591E+04 + 0.31875591E+04 0.31875029E+04 0.31875029E+04 0.31844199E+04 + 0.31844199E+04 0.31832610E+04 0.31832610E+04 0.31881909E+04 + 0.31881909E+04 0.31943059E+04 0.31943059E+04 0.31950249E+04 + 0.31950249E+04 0.31982019E+04 0.31982019E+04 0.32030071E+04 + 0.32030071E+04 0.32078169E+04 0.31719109E+04 0.31745220E+04 + 0.31745220E+04 0.31772820E+04 0.31772820E+04 0.31747549E+04 + 0.31747549E+04 0.31745759E+04 0.31745759E+04 0.31784641E+04 + 0.31784641E+04 0.31854141E+04 0.31854141E+04 0.31921731E+04 + 0.31921731E+04 0.31954990E+04 0.31954990E+04 0.32010669E+04 + 0.32010669E+04 0.32061299E+04 0.32061299E+04 0.32098379E+04 + 0.31719109E+04 0.31745220E+04 0.31745220E+04 0.31772820E+04 + 0.31772820E+04 0.31747549E+04 0.31747549E+04 0.31745759E+04 + 0.31745759E+04 0.31784641E+04 0.31784641E+04 0.31854141E+04 + 0.31854141E+04 0.31921731E+04 0.31921731E+04 0.31954990E+04 + 0.31954990E+04 0.32010669E+04 0.32010669E+04 0.32061299E+04 + 0.32061299E+04 0.32098379E+04 0.31627849E+04 0.31568730E+04 + 0.31568730E+04 0.31569390E+04 0.31569390E+04 0.31584810E+04 + 0.31584810E+04 0.31688911E+04 0.31688911E+04 0.31807000E+04 + 0.31807000E+04 0.31885061E+04 0.31885061E+04 0.31918379E+04 + 0.31918379E+04 0.31953811E+04 0.31953811E+04 0.32019250E+04 + 0.32019250E+04 0.32092300E+04 0.32092300E+04 0.32152400E+04 + 0.31627849E+04 0.31568730E+04 0.31568730E+04 0.31569390E+04 + 0.31569390E+04 0.31584810E+04 0.31584810E+04 0.31688911E+04 + 0.31688911E+04 0.31807000E+04 0.31807000E+04 0.31885061E+04 + 0.31885061E+04 0.31918379E+04 0.31918379E+04 0.31953811E+04 + 0.31953811E+04 0.32019250E+04 0.32019250E+04 0.32092300E+04 + 0.32092300E+04 0.32152400E+04 0.31691680E+04 0.31637141E+04 + 0.31637141E+04 0.31651450E+04 0.31651450E+04 0.31656021E+04 + 0.31656021E+04 0.31687520E+04 0.31687520E+04 0.31745669E+04 + 0.31745669E+04 0.31792000E+04 0.31792000E+04 0.31817581E+04 + 0.31817581E+04 0.31884810E+04 0.31884810E+04 0.31994270E+04 + 0.31994270E+04 0.32102310E+04 0.32102310E+04 0.32195181E+04 + 0.31691680E+04 0.31637141E+04 0.31637141E+04 0.31651450E+04 + 0.31651450E+04 0.31656021E+04 0.31656021E+04 0.31687520E+04 + 0.31687520E+04 0.31745669E+04 0.31745669E+04 0.31792000E+04 + 0.31792000E+04 0.31817581E+04 0.31817581E+04 0.31884810E+04 + 0.31884810E+04 0.31994270E+04 0.31994270E+04 0.32102310E+04 + 0.32102310E+04 0.32195181E+04 0.31830710E+04 0.31849409E+04 + 0.31849409E+04 0.31856350E+04 0.31856350E+04 0.31815920E+04 + 0.31815920E+04 0.31739060E+04 0.31739060E+04 0.31704180E+04 + 0.31704180E+04 0.31731919E+04 0.31731919E+04 0.31780859E+04 + 0.31780859E+04 0.31834189E+04 0.31834189E+04 0.31930959E+04 + 0.31930959E+04 0.32053640E+04 0.32053640E+04 0.32174871E+04 + 0.31830710E+04 0.31849409E+04 0.31849409E+04 0.31856350E+04 + 0.31856350E+04 0.31815920E+04 0.31815920E+04 0.31739060E+04 + 0.31739060E+04 0.31704180E+04 0.31704180E+04 0.31731919E+04 + 0.31731919E+04 0.31780859E+04 0.31780859E+04 0.31834189E+04 + 0.31834189E+04 0.31930959E+04 0.31930959E+04 0.32053640E+04 + 0.32053640E+04 0.32174871E+04 0.31817041E+04 0.31900920E+04 + 0.31900920E+04 0.31928230E+04 0.31928230E+04 0.31906260E+04 + 0.31906260E+04 0.31868359E+04 0.31868359E+04 0.31826130E+04 + 0.31826130E+04 0.31811450E+04 0.31811450E+04 0.31789319E+04 + 0.31789319E+04 0.31781541E+04 0.31781541E+04 0.31849221E+04 + 0.31849221E+04 0.31970200E+04 0.31970200E+04 0.32094189E+04 + 0.31817041E+04 0.31900920E+04 0.31900920E+04 0.31928230E+04 + 0.31928230E+04 0.31906260E+04 0.31906260E+04 0.31868359E+04 + 0.31868359E+04 0.31826130E+04 0.31826130E+04 0.31811450E+04 + 0.31811450E+04 0.31789319E+04 0.31789319E+04 0.31781541E+04 + 0.31781541E+04 0.31849221E+04 0.31849221E+04 0.31970200E+04 + 0.31970200E+04 0.32094189E+04 0.31800200E+04 0.31871121E+04 + 0.31871121E+04 0.31919390E+04 0.31919390E+04 0.31909231E+04 + 0.31909231E+04 0.31897300E+04 0.31897300E+04 0.31883979E+04 + 0.31883979E+04 0.31849009E+04 0.31849009E+04 0.31766899E+04 + 0.31766899E+04 0.31732161E+04 0.31732161E+04 0.31771689E+04 + 0.31771689E+04 0.31849141E+04 0.31849141E+04 0.31931050E+04 + 0.31800200E+04 0.31871121E+04 0.31871121E+04 0.31919390E+04 + 0.31919390E+04 0.31909231E+04 0.31909231E+04 0.31897300E+04 + 0.31897300E+04 0.31883979E+04 0.31883979E+04 0.31849009E+04 + 0.31849009E+04 0.31766899E+04 0.31766899E+04 0.31732161E+04 + 0.31732161E+04 0.31771689E+04 0.31771689E+04 0.31849141E+04 + 0.31849141E+04 0.31931050E+04 0.31884580E+04 0.31907800E+04 + 0.31907800E+04 0.31977910E+04 0.31977910E+04 0.31968149E+04 + 0.31968149E+04 0.31912800E+04 0.31912800E+04 0.31876941E+04 + 0.31876941E+04 0.31839780E+04 0.31839780E+04 0.31757859E+04 + 0.31757859E+04 0.31699751E+04 0.31699751E+04 0.31732180E+04 + 0.31732180E+04 0.31779871E+04 0.31779871E+04 0.31825850E+04 + 0.31884580E+04 0.31907800E+04 0.31907800E+04 0.31977910E+04 + 0.31977910E+04 0.31968149E+04 0.31968149E+04 0.31912800E+04 + 0.31912800E+04 0.31876941E+04 0.31876941E+04 0.31839780E+04 + 0.31839780E+04 0.31757859E+04 0.31757859E+04 0.31699751E+04 + 0.31699751E+04 0.31732180E+04 0.31732180E+04 0.31779871E+04 + 0.31779871E+04 0.31825850E+04 0.31986660E+04 0.31981880E+04 + 0.31981880E+04 0.32031230E+04 0.32031230E+04 0.32019009E+04 + 0.32019009E+04 0.31948140E+04 0.31948140E+04 0.31882671E+04 + 0.31882671E+04 0.31830359E+04 0.31830359E+04 0.31749470E+04 + 0.31749470E+04 0.31684250E+04 0.31684250E+04 0.31699819E+04 + 0.31699819E+04 0.31747390E+04 0.31747390E+04 0.31807229E+04 + 0.31986660E+04 0.31981880E+04 0.31981880E+04 0.32031230E+04 + 0.32031230E+04 0.32019009E+04 0.32019009E+04 0.31948140E+04 + 0.31948140E+04 0.31882671E+04 0.31882671E+04 0.31830359E+04 + 0.31830359E+04 0.31749470E+04 0.31749470E+04 0.31684250E+04 + 0.31684250E+04 0.31699819E+04 0.31699819E+04 0.31747390E+04 + 0.31747390E+04 0.31807229E+04 0.31949541E+04 0.31955259E+04 + 0.31955259E+04 0.31983169E+04 0.31983169E+04 0.31966941E+04 + 0.31966941E+04 0.31885061E+04 0.31885061E+04 0.31801479E+04 + 0.31801479E+04 0.31760759E+04 0.31760759E+04 0.31727959E+04 + 0.31727959E+04 0.31699021E+04 0.31699021E+04 0.31706440E+04 + 0.31706440E+04 0.31756741E+04 0.31756741E+04 0.31832080E+04 + 0.31949541E+04 0.31955259E+04 0.31955259E+04 0.31983169E+04 + 0.31983169E+04 0.31966941E+04 0.31966941E+04 0.31885061E+04 + 0.31885061E+04 0.31801479E+04 0.31801479E+04 0.31760759E+04 + 0.31760759E+04 0.31727959E+04 0.31727959E+04 0.31699021E+04 + 0.31699021E+04 0.31706440E+04 0.31706440E+04 0.31756741E+04 + 0.30474241E+04 0.30471340E+04 0.31889170E+04 0.31836609E+04 + 0.31836609E+04 0.31861260E+04 0.31861260E+04 0.31858081E+04 + 0.31858081E+04 0.31797800E+04 0.31797800E+04 0.31745740E+04 + 0.31745740E+04 0.31721650E+04 0.31721650E+04 0.31706760E+04 + 0.31706760E+04 0.31711160E+04 0.31711160E+04 0.31724570E+04 + 0.31724570E+04 0.31747939E+04 0.30522290E+04 0.30484529E+04 + 0.31889170E+04 0.31836609E+04 0.31836609E+04 0.31861260E+04 + 0.31861260E+04 0.31858081E+04 0.31858081E+04 0.31797800E+04 + 0.31797800E+04 0.31745740E+04 0.31745740E+04 0.31721650E+04 + 0.31721650E+04 0.31706760E+04 0.31706760E+04 0.31711160E+04 + 0.30820969E+04 0.30787310E+04 0.30787310E+04 0.30772229E+04 + 0.30522290E+04 0.30484529E+04 0.31914961E+04 0.31781731E+04 + 0.31781731E+04 0.31763640E+04 0.31763640E+04 0.31754680E+04 + 0.31754680E+04 0.31727690E+04 0.31727690E+04 0.31700581E+04 + 0.31700581E+04 0.31692781E+04 0.31692781E+04 0.31699939E+04 + 0.31699939E+04 0.31700920E+04 0.30814971E+04 0.30799661E+04 + 0.30799661E+04 0.30778630E+04 0.30517180E+04 0.30488149E+04 + 0.31914961E+04 0.31781731E+04 0.31781731E+04 0.31763640E+04 + 0.31763640E+04 0.31754680E+04 0.31754680E+04 0.31727690E+04 + 0.31727690E+04 0.31700581E+04 0.31700581E+04 0.31692781E+04 + 0.30937419E+04 0.30893589E+04 0.30893589E+04 0.30814971E+04 + 0.30814971E+04 0.30799661E+04 0.30799661E+04 0.30778630E+04 + 0.30517180E+04 0.30488149E+04 0.31913730E+04 0.31788899E+04 + 0.31788899E+04 0.31730850E+04 0.31730850E+04 0.31711750E+04 + 0.31711750E+04 0.31690339E+04 0.31690339E+04 0.31685779E+04 + 0.31685779E+04 0.31676060E+04 0.30953250E+04 0.30916570E+04 + 0.30916570E+04 0.30860039E+04 0.30860039E+04 0.30821340E+04 + 0.30821340E+04 0.30793301E+04 0.30520210E+04 0.30491289E+04 + 0.31913730E+04 0.31788899E+04 0.31788899E+04 0.31730850E+04 + 0.31730850E+04 0.31711750E+04 0.31711750E+04 0.31690339E+04 + 0.31029990E+04 0.30993840E+04 0.30993840E+04 0.30953250E+04 + 0.30953250E+04 0.30916570E+04 0.30916570E+04 0.30860039E+04 + 0.30860039E+04 0.30821340E+04 0.30821340E+04 0.30793301E+04 + 0.30520210E+04 0.30491289E+04 0.31893540E+04 0.31818469E+04 + 0.31818469E+04 0.31753230E+04 0.31753230E+04 0.31729529E+04 + 0.31729529E+04 0.31691479E+04 0.31044480E+04 0.31010090E+04 + 0.31010090E+04 0.30979031E+04 0.30979031E+04 0.30945779E+04 + 0.30945779E+04 0.30887500E+04 0.30887500E+04 0.30831211E+04 + 0.30831211E+04 0.30802209E+04 0.30521189E+04 0.30496521E+04 + 0.31893540E+04 0.31818469E+04 0.31818469E+04 0.31753230E+04 + 0.31140879E+04 0.31100830E+04 0.31100830E+04 0.31044480E+04 + 0.31044480E+04 0.31010090E+04 0.31010090E+04 0.30979031E+04 + 0.30979031E+04 0.30945779E+04 0.30945779E+04 0.30887500E+04 + 0.30887500E+04 0.30831211E+04 0.30831211E+04 0.30802209E+04 + 0.30521189E+04 0.30496521E+04 0.31889490E+04 0.31837849E+04 + 0.31837849E+04 0.31778921E+04 0.31173330E+04 0.31120750E+04 + 0.31120750E+04 0.31060410E+04 0.31060410E+04 0.31015950E+04 + 0.31015950E+04 0.30957581E+04 0.30957581E+04 0.30916399E+04 + 0.30916399E+04 0.30893479E+04 0.30893479E+04 0.30855229E+04 + 0.30855229E+04 0.30815820E+04 0.30527339E+04 0.30502009E+04 + 0.31266179E+04 0.31232661E+04 0.31232661E+04 0.31173330E+04 + 0.31173330E+04 0.31120750E+04 0.31120750E+04 0.31060410E+04 + 0.31060410E+04 0.31015950E+04 0.31015950E+04 0.30957581E+04 + 0.30957581E+04 0.30916399E+04 0.30916399E+04 0.30893479E+04 + 0.30893479E+04 0.30855229E+04 0.30855229E+04 0.30815820E+04 + 0.30815820E+04 0.30788320E+04 0.31283970E+04 0.31259929E+04 + 0.31259929E+04 0.31224490E+04 0.31224490E+04 0.31160840E+04 + 0.31160840E+04 0.31046841E+04 0.31046841E+04 0.30974709E+04 + 0.30974709E+04 0.30929089E+04 0.30929089E+04 0.30918750E+04 + 0.30918750E+04 0.30932390E+04 0.30932390E+04 0.30892881E+04 + 0.30892881E+04 0.30833010E+04 0.30833010E+04 0.30796560E+04 + 0.31923181E+04 0.31926140E+04 0.31926140E+04 0.31951370E+04 + 0.31951370E+04 0.31949810E+04 0.31949810E+04 0.31899580E+04 + 0.31899580E+04 0.31834939E+04 0.31834939E+04 0.31840759E+04 + 0.31840759E+04 0.31892739E+04 0.31892739E+04 0.31910330E+04 + 0.31910330E+04 0.31919351E+04 0.31919351E+04 0.31970740E+04 + 0.31970740E+04 0.32043821E+04 0.31821670E+04 0.31849331E+04 + 0.31849331E+04 0.31892991E+04 0.31892991E+04 0.31893711E+04 + 0.31893711E+04 0.31862820E+04 0.31862820E+04 0.31849351E+04 + 0.31849351E+04 0.31897219E+04 0.31897219E+04 0.31958650E+04 + 0.31958650E+04 0.31967480E+04 0.31967480E+04 0.31998569E+04 + 0.31998569E+04 0.32046550E+04 0.32046550E+04 0.32093311E+04 + 0.31821670E+04 0.31849331E+04 0.31849331E+04 0.31892991E+04 + 0.31892991E+04 0.31893711E+04 0.31893711E+04 0.31862820E+04 + 0.31862820E+04 0.31849351E+04 0.31849351E+04 0.31897219E+04 + 0.31897219E+04 0.31958650E+04 0.31958650E+04 0.31967480E+04 + 0.31967480E+04 0.31998569E+04 0.31998569E+04 0.32046550E+04 + 0.32046550E+04 0.32093311E+04 0.31738560E+04 0.31763230E+04 + 0.31763230E+04 0.31791731E+04 0.31791731E+04 0.31766599E+04 + 0.31766599E+04 0.31762351E+04 0.31762351E+04 0.31798689E+04 + 0.31798689E+04 0.31867241E+04 0.31867241E+04 0.31935500E+04 + 0.31935500E+04 0.31970000E+04 0.31970000E+04 0.32025549E+04 + 0.32025549E+04 0.32076460E+04 0.32076460E+04 0.32111160E+04 + 0.31738560E+04 0.31763230E+04 0.31763230E+04 0.31791731E+04 + 0.31791731E+04 0.31766599E+04 0.31766599E+04 0.31762351E+04 + 0.31762351E+04 0.31798689E+04 0.31798689E+04 0.31867241E+04 + 0.31867241E+04 0.31935500E+04 0.31935500E+04 0.31970000E+04 + 0.31970000E+04 0.32025549E+04 0.32025549E+04 0.32076460E+04 + 0.32076460E+04 0.32111160E+04 0.31644099E+04 0.31583979E+04 + 0.31583979E+04 0.31584800E+04 0.31584800E+04 0.31597380E+04 + 0.31597380E+04 0.31699480E+04 0.31699480E+04 0.31817219E+04 + 0.31817219E+04 0.31896121E+04 0.31896121E+04 0.31930850E+04 + 0.31930850E+04 0.31966580E+04 0.31966580E+04 0.32030730E+04 + 0.32030730E+04 0.32102410E+04 0.32102410E+04 0.32160610E+04 + 0.31644099E+04 0.31583979E+04 0.31583979E+04 0.31584800E+04 + 0.31584800E+04 0.31597380E+04 0.31597380E+04 0.31699480E+04 + 0.31699480E+04 0.31817219E+04 0.31817219E+04 0.31896121E+04 + 0.31896121E+04 0.31930850E+04 0.31930850E+04 0.31966580E+04 + 0.31966580E+04 0.32030730E+04 0.32030730E+04 0.32102410E+04 + 0.32102410E+04 0.32160610E+04 0.31699939E+04 0.31646079E+04 + 0.31646079E+04 0.31661179E+04 0.31661179E+04 0.31666111E+04 + 0.31666111E+04 0.31697581E+04 0.31697581E+04 0.31755769E+04 + 0.31755769E+04 0.31802000E+04 0.31802000E+04 0.31826499E+04 + 0.31826499E+04 0.31892949E+04 0.31892949E+04 0.32001951E+04 + 0.32001951E+04 0.32109590E+04 0.32109590E+04 0.32202200E+04 + 0.31699939E+04 0.31646079E+04 0.31646079E+04 0.31661179E+04 + 0.31661179E+04 0.31666111E+04 0.31666111E+04 0.31697581E+04 + 0.31697581E+04 0.31755769E+04 0.31755769E+04 0.31802000E+04 + 0.31802000E+04 0.31826499E+04 0.31826499E+04 0.31892949E+04 + 0.31892949E+04 0.32001951E+04 0.32001951E+04 0.32109590E+04 + 0.32109590E+04 0.32202200E+04 0.31839089E+04 0.31857251E+04 + 0.31857251E+04 0.31864629E+04 0.31864629E+04 0.31824929E+04 + 0.31824929E+04 0.31747661E+04 0.31747661E+04 0.31711560E+04 + 0.31711560E+04 0.31738589E+04 0.31738589E+04 0.31788140E+04 + 0.31788140E+04 0.31841389E+04 0.31841389E+04 0.31937229E+04 + 0.31937229E+04 0.32059929E+04 0.32059929E+04 0.32181331E+04 + 0.31839089E+04 0.31857251E+04 0.31857251E+04 0.31864629E+04 + 0.31864629E+04 0.31824929E+04 0.31824929E+04 0.31747661E+04 + 0.31747661E+04 0.31711560E+04 0.31711560E+04 0.31738589E+04 + 0.31738589E+04 0.31788140E+04 0.31788140E+04 0.31841389E+04 + 0.31841389E+04 0.31937229E+04 0.31937229E+04 0.32059929E+04 + 0.32059929E+04 0.32181331E+04 0.31824431E+04 0.31908069E+04 + 0.31908069E+04 0.31936680E+04 0.31936680E+04 0.31915181E+04 + 0.31915181E+04 0.31876770E+04 0.31876770E+04 0.31833191E+04 + 0.31833191E+04 0.31818430E+04 0.31818430E+04 0.31796689E+04 + 0.31796689E+04 0.31787791E+04 0.31787791E+04 0.31854690E+04 + 0.31854690E+04 0.31976641E+04 0.31976641E+04 0.32102009E+04 + 0.31824431E+04 0.31908069E+04 0.31908069E+04 0.31936680E+04 + 0.31936680E+04 0.31915181E+04 0.31915181E+04 0.31876770E+04 + 0.31876770E+04 0.31833191E+04 0.31833191E+04 0.31818430E+04 + 0.31818430E+04 0.31796689E+04 0.31796689E+04 0.31787791E+04 + 0.31787791E+04 0.31854690E+04 0.31854690E+04 0.31976641E+04 + 0.31976641E+04 0.32102009E+04 0.31806750E+04 0.31877720E+04 + 0.31877720E+04 0.31927170E+04 0.31927170E+04 0.31917290E+04 + 0.31917290E+04 0.31905090E+04 0.31905090E+04 0.31891411E+04 + 0.31891411E+04 0.31857109E+04 0.31857109E+04 0.31774619E+04 + 0.31774619E+04 0.31738860E+04 0.31738860E+04 0.31777471E+04 + 0.31777471E+04 0.31855449E+04 0.31855449E+04 0.31938899E+04 + 0.31806750E+04 0.31877720E+04 0.31877720E+04 0.31927170E+04 + 0.31927170E+04 0.31917290E+04 0.31917290E+04 0.31905090E+04 + 0.31905090E+04 0.31891411E+04 0.31891411E+04 0.31857109E+04 + 0.31857109E+04 0.31774619E+04 0.31774619E+04 0.31738860E+04 + 0.31738860E+04 0.31777471E+04 0.31777471E+04 0.31855449E+04 + 0.31855449E+04 0.31938899E+04 0.31892129E+04 0.31913921E+04 + 0.31913921E+04 0.31984651E+04 0.31984651E+04 0.31976179E+04 + 0.31976179E+04 0.31920420E+04 0.31920420E+04 0.31884270E+04 + 0.31884270E+04 0.31847629E+04 0.31847629E+04 0.31765959E+04 + 0.31765959E+04 0.31706570E+04 0.31706570E+04 0.31738140E+04 + 0.31738140E+04 0.31785710E+04 0.31785710E+04 0.31831750E+04 + 0.31892129E+04 0.31913921E+04 0.31913921E+04 0.31984651E+04 + 0.31984651E+04 0.31976179E+04 0.31976179E+04 0.31920420E+04 + 0.31920420E+04 0.31884270E+04 0.31884270E+04 0.31847629E+04 + 0.31847629E+04 0.31765959E+04 0.31765959E+04 0.31706570E+04 + 0.31706570E+04 0.31738140E+04 0.31738140E+04 0.31785710E+04 + 0.31785710E+04 0.31831750E+04 0.31996299E+04 0.31989009E+04 + 0.31989009E+04 0.32038311E+04 0.32038311E+04 0.32027351E+04 + 0.32027351E+04 0.31956660E+04 0.31956660E+04 0.31890710E+04 + 0.31890710E+04 0.31838240E+04 0.31838240E+04 0.31757290E+04 + 0.31757290E+04 0.31691121E+04 0.31691121E+04 0.31706030E+04 + 0.31706030E+04 0.31754031E+04 0.31754031E+04 0.31815811E+04 + 0.31996299E+04 0.31989009E+04 0.31989009E+04 0.32038311E+04 + 0.32038311E+04 0.32027351E+04 0.32027351E+04 0.31956660E+04 + 0.31956660E+04 0.31890710E+04 0.31890710E+04 0.31838240E+04 + 0.31838240E+04 0.31757290E+04 0.31757290E+04 0.31691121E+04 + 0.31691121E+04 0.31706030E+04 0.31706030E+04 0.31754031E+04 + 0.31754031E+04 0.31815811E+04 0.31959409E+04 0.31963511E+04 + 0.31963511E+04 0.31991111E+04 0.31991111E+04 0.31975940E+04 + 0.31975940E+04 0.31894590E+04 0.31894590E+04 0.31810291E+04 + 0.31810291E+04 0.31768879E+04 0.31768879E+04 0.31735210E+04 + 0.31735210E+04 0.31705459E+04 0.31705459E+04 0.31712671E+04 + 0.31712671E+04 0.31764109E+04 0.31764109E+04 0.31842319E+04 + 0.31959409E+04 0.31963511E+04 0.31963511E+04 0.31991111E+04 + 0.31991111E+04 0.31975940E+04 0.31975940E+04 0.31894590E+04 + 0.31894590E+04 0.31810291E+04 0.31810291E+04 0.31768879E+04 + 0.31768879E+04 0.31735210E+04 0.31735210E+04 0.31705459E+04 + 0.31705459E+04 0.31712671E+04 0.31712671E+04 0.31764109E+04 + 0.30479580E+04 0.30477520E+04 0.31899231E+04 0.31844951E+04 + 0.31844951E+04 0.31868840E+04 0.31868840E+04 0.31866860E+04 + 0.31866860E+04 0.31807581E+04 0.31807581E+04 0.31754680E+04 + 0.31754680E+04 0.31729680E+04 0.31729680E+04 0.31713550E+04 + 0.31713550E+04 0.31717991E+04 0.31717991E+04 0.31731450E+04 + 0.31731450E+04 0.31754980E+04 0.30527661E+04 0.30490859E+04 + 0.31899231E+04 0.31844951E+04 0.31844951E+04 0.31868840E+04 + 0.31868840E+04 0.31866860E+04 0.31866860E+04 0.31807581E+04 + 0.31807581E+04 0.31754680E+04 0.31754680E+04 0.31729680E+04 + 0.31729680E+04 0.31713550E+04 0.31713550E+04 0.31717991E+04 + 0.30829800E+04 0.30796421E+04 0.30796421E+04 0.30781621E+04 + 0.30527661E+04 0.30490859E+04 0.31926250E+04 0.31791270E+04 + 0.31791270E+04 0.31772141E+04 0.31772141E+04 0.31763101E+04 + 0.31763101E+04 0.31736240E+04 0.31736240E+04 0.31708811E+04 + 0.31708811E+04 0.31700520E+04 0.31700520E+04 0.31707009E+04 + 0.31707009E+04 0.31708320E+04 0.30823091E+04 0.30808650E+04 + 0.30808650E+04 0.30788250E+04 0.30522581E+04 0.30493950E+04 + 0.31926250E+04 0.31791270E+04 0.31791270E+04 0.31772141E+04 + 0.31772141E+04 0.31763101E+04 0.31763101E+04 0.31736240E+04 + 0.31736240E+04 0.31708811E+04 0.31708811E+04 0.31700520E+04 + 0.30946951E+04 0.30903191E+04 0.30903191E+04 0.30823091E+04 + 0.30823091E+04 0.30808650E+04 0.30808650E+04 0.30788250E+04 + 0.30522581E+04 0.30493950E+04 0.31926230E+04 0.31799260E+04 + 0.31799260E+04 0.31740220E+04 0.31740220E+04 0.31720330E+04 + 0.31720330E+04 0.31698650E+04 0.31698650E+04 0.31693789E+04 + 0.31693789E+04 0.31684221E+04 0.30962810E+04 0.30926689E+04 + 0.30926689E+04 0.30869880E+04 0.30869880E+04 0.30830640E+04 + 0.30830640E+04 0.30802830E+04 0.30525581E+04 0.30497000E+04 + 0.31926230E+04 0.31799260E+04 0.31799260E+04 0.31740220E+04 + 0.31740220E+04 0.31720330E+04 0.31720330E+04 0.31698650E+04 + 0.31039380E+04 0.31003359E+04 0.31003359E+04 0.30962810E+04 + 0.30962810E+04 0.30926689E+04 0.30926689E+04 0.30869880E+04 + 0.30869880E+04 0.30830640E+04 0.30830640E+04 0.30802830E+04 + 0.30525581E+04 0.30497000E+04 0.31902461E+04 0.31827620E+04 + 0.31827620E+04 0.31761960E+04 0.31761960E+04 0.31738521E+04 + 0.31738521E+04 0.31700659E+04 0.31054260E+04 0.31020339E+04 + 0.31020339E+04 0.30988850E+04 0.30988850E+04 0.30955239E+04 + 0.30955239E+04 0.30897310E+04 0.30897310E+04 0.30840259E+04 + 0.30840259E+04 0.30811589E+04 0.30526709E+04 0.30502480E+04 + 0.31902461E+04 0.31827620E+04 0.31827620E+04 0.31761960E+04 + 0.31150291E+04 0.31110381E+04 0.31110381E+04 0.31054260E+04 + 0.31054260E+04 0.31020339E+04 0.31020339E+04 0.30988850E+04 + 0.30988850E+04 0.30955239E+04 0.30955239E+04 0.30897310E+04 + 0.30897310E+04 0.30840259E+04 0.30840259E+04 0.30811589E+04 + 0.30526709E+04 0.30502480E+04 0.31897710E+04 0.31846560E+04 + 0.31846560E+04 0.31787639E+04 0.31182781E+04 0.31131121E+04 + 0.31131121E+04 0.31071001E+04 0.31071001E+04 0.31025979E+04 + 0.31025979E+04 0.30967009E+04 0.30967009E+04 0.30926201E+04 + 0.30926201E+04 0.30903330E+04 0.30903330E+04 0.30864309E+04 + 0.30864309E+04 0.30824641E+04 0.30533081E+04 0.30507920E+04 + 0.31273789E+04 0.31240769E+04 0.31240769E+04 0.31182781E+04 + 0.31182781E+04 0.31131121E+04 0.31131121E+04 0.31071001E+04 + 0.31071001E+04 0.31025979E+04 0.31025979E+04 0.30967009E+04 + 0.30967009E+04 0.30926201E+04 0.30926201E+04 0.30903330E+04 + 0.30903330E+04 0.30864309E+04 0.30864309E+04 0.30824641E+04 + 0.30824641E+04 0.30797000E+04 0.31291599E+04 0.31267791E+04 + 0.31267791E+04 0.31234519E+04 0.31234519E+04 0.31172410E+04 + 0.31172410E+04 0.31056270E+04 0.31056270E+04 0.30983621E+04 + 0.30983621E+04 0.30937830E+04 0.30937830E+04 0.30927690E+04 + 0.30927690E+04 0.30942170E+04 0.30942170E+04 0.30901790E+04 + 0.30901790E+04 0.30841250E+04 0.30841250E+04 0.30804680E+04 + 0.31923181E+04 0.31926140E+04 0.31926140E+04 0.31951370E+04 + 0.31951370E+04 0.31949810E+04 0.31949810E+04 0.31899580E+04 + 0.31899580E+04 0.31834939E+04 0.31834939E+04 0.31840759E+04 + 0.31840759E+04 0.31892739E+04 0.31892739E+04 0.31910330E+04 + 0.31910330E+04 0.31919351E+04 0.31919351E+04 0.31970740E+04 + 0.31970740E+04 0.32043821E+04 0.31821670E+04 0.31849331E+04 + 0.31849331E+04 0.31892991E+04 0.31892991E+04 0.31893711E+04 + 0.31893711E+04 0.31862820E+04 0.31862820E+04 0.31849351E+04 + 0.31849351E+04 0.31897219E+04 0.31897219E+04 0.31958650E+04 + 0.31958650E+04 0.31967480E+04 0.31967480E+04 0.31998569E+04 + 0.31998569E+04 0.32046550E+04 0.32046550E+04 0.32093311E+04 + 0.31821670E+04 0.31849331E+04 0.31849331E+04 0.31892991E+04 + 0.31892991E+04 0.31893711E+04 0.31893711E+04 0.31862820E+04 + 0.31862820E+04 0.31849351E+04 0.31849351E+04 0.31897219E+04 + 0.31897219E+04 0.31958650E+04 0.31958650E+04 0.31967480E+04 + 0.31967480E+04 0.31998569E+04 0.31998569E+04 0.32046550E+04 + 0.32046550E+04 0.32093311E+04 0.31738560E+04 0.31763230E+04 + 0.31763230E+04 0.31791731E+04 0.31791731E+04 0.31766599E+04 + 0.31766599E+04 0.31762351E+04 0.31762351E+04 0.31798689E+04 + 0.31798689E+04 0.31867241E+04 0.31867241E+04 0.31935500E+04 + 0.31935500E+04 0.31970000E+04 0.31970000E+04 0.32025549E+04 + 0.32025549E+04 0.32076460E+04 0.32076460E+04 0.32111160E+04 + 0.31738560E+04 0.31763230E+04 0.31763230E+04 0.31791731E+04 + 0.31791731E+04 0.31766599E+04 0.31766599E+04 0.31762351E+04 + 0.31762351E+04 0.31798689E+04 0.31798689E+04 0.31867241E+04 + 0.31867241E+04 0.31935500E+04 0.31935500E+04 0.31970000E+04 + 0.31970000E+04 0.32025549E+04 0.32025549E+04 0.32076460E+04 + 0.32076460E+04 0.32111160E+04 0.31644099E+04 0.31583979E+04 + 0.31583979E+04 0.31584800E+04 0.31584800E+04 0.31597380E+04 + 0.31597380E+04 0.31699480E+04 0.31699480E+04 0.31817219E+04 + 0.31817219E+04 0.31896121E+04 0.31896121E+04 0.31930850E+04 + 0.31930850E+04 0.31966580E+04 0.31966580E+04 0.32030730E+04 + 0.32030730E+04 0.32102410E+04 0.32102410E+04 0.32160610E+04 + 0.31644099E+04 0.31583979E+04 0.31583979E+04 0.31584800E+04 + 0.31584800E+04 0.31597380E+04 0.31597380E+04 0.31699480E+04 + 0.31699480E+04 0.31817219E+04 0.31817219E+04 0.31896121E+04 + 0.31896121E+04 0.31930850E+04 0.31930850E+04 0.31966580E+04 + 0.31966580E+04 0.32030730E+04 0.32030730E+04 0.32102410E+04 + 0.32102410E+04 0.32160610E+04 0.31699939E+04 0.31646079E+04 + 0.31646079E+04 0.31661179E+04 0.31661179E+04 0.31666111E+04 + 0.31666111E+04 0.31697581E+04 0.31697581E+04 0.31755769E+04 + 0.31755769E+04 0.31802000E+04 0.31802000E+04 0.31826499E+04 + 0.31826499E+04 0.31892949E+04 0.31892949E+04 0.32001951E+04 + 0.32001951E+04 0.32109590E+04 0.32109590E+04 0.32202200E+04 + 0.31699939E+04 0.31646079E+04 0.31646079E+04 0.31661179E+04 + 0.31661179E+04 0.31666111E+04 0.31666111E+04 0.31697581E+04 + 0.31697581E+04 0.31755769E+04 0.31755769E+04 0.31802000E+04 + 0.31802000E+04 0.31826499E+04 0.31826499E+04 0.31892949E+04 + 0.31892949E+04 0.32001951E+04 0.32001951E+04 0.32109590E+04 + 0.32109590E+04 0.32202200E+04 0.31839089E+04 0.31857251E+04 + 0.31857251E+04 0.31864629E+04 0.31864629E+04 0.31824929E+04 + 0.31824929E+04 0.31747661E+04 0.31747661E+04 0.31711560E+04 + 0.31711560E+04 0.31738589E+04 0.31738589E+04 0.31788140E+04 + 0.31788140E+04 0.31841389E+04 0.31841389E+04 0.31937229E+04 + 0.31937229E+04 0.32059929E+04 0.32059929E+04 0.32181331E+04 + 0.31839089E+04 0.31857251E+04 0.31857251E+04 0.31864629E+04 + 0.31864629E+04 0.31824929E+04 0.31824929E+04 0.31747661E+04 + 0.31747661E+04 0.31711560E+04 0.31711560E+04 0.31738589E+04 + 0.31738589E+04 0.31788140E+04 0.31788140E+04 0.31841389E+04 + 0.31841389E+04 0.31937229E+04 0.31937229E+04 0.32059929E+04 + 0.32059929E+04 0.32181331E+04 0.31824431E+04 0.31908069E+04 + 0.31908069E+04 0.31936680E+04 0.31936680E+04 0.31915181E+04 + 0.31915181E+04 0.31876770E+04 0.31876770E+04 0.31833191E+04 + 0.31833191E+04 0.31818430E+04 0.31818430E+04 0.31796689E+04 + 0.31796689E+04 0.31787791E+04 0.31787791E+04 0.31854690E+04 + 0.31854690E+04 0.31976641E+04 0.31976641E+04 0.32102009E+04 + 0.31824431E+04 0.31908069E+04 0.31908069E+04 0.31936680E+04 + 0.31936680E+04 0.31915181E+04 0.31915181E+04 0.31876770E+04 + 0.31876770E+04 0.31833191E+04 0.31833191E+04 0.31818430E+04 + 0.31818430E+04 0.31796689E+04 0.31796689E+04 0.31787791E+04 + 0.31787791E+04 0.31854690E+04 0.31854690E+04 0.31976641E+04 + 0.31976641E+04 0.32102009E+04 0.31806750E+04 0.31877720E+04 + 0.31877720E+04 0.31927170E+04 0.31927170E+04 0.31917290E+04 + 0.31917290E+04 0.31905090E+04 0.31905090E+04 0.31891411E+04 + 0.31891411E+04 0.31857109E+04 0.31857109E+04 0.31774619E+04 + 0.31774619E+04 0.31738860E+04 0.31738860E+04 0.31777471E+04 + 0.31777471E+04 0.31855449E+04 0.31855449E+04 0.31938899E+04 + 0.31806750E+04 0.31877720E+04 0.31877720E+04 0.31927170E+04 + 0.31927170E+04 0.31917290E+04 0.31917290E+04 0.31905090E+04 + 0.31905090E+04 0.31891411E+04 0.31891411E+04 0.31857109E+04 + 0.31857109E+04 0.31774619E+04 0.31774619E+04 0.31738860E+04 + 0.31738860E+04 0.31777471E+04 0.31777471E+04 0.31855449E+04 + 0.31855449E+04 0.31938899E+04 0.31892129E+04 0.31913921E+04 + 0.31913921E+04 0.31984651E+04 0.31984651E+04 0.31976179E+04 + 0.31976179E+04 0.31920420E+04 0.31920420E+04 0.31884270E+04 + 0.31884270E+04 0.31847629E+04 0.31847629E+04 0.31765959E+04 + 0.31765959E+04 0.31706570E+04 0.31706570E+04 0.31738140E+04 + 0.31738140E+04 0.31785710E+04 0.31785710E+04 0.31831750E+04 + 0.31892129E+04 0.31913921E+04 0.31913921E+04 0.31984651E+04 + 0.31984651E+04 0.31976179E+04 0.31976179E+04 0.31920420E+04 + 0.31920420E+04 0.31884270E+04 0.31884270E+04 0.31847629E+04 + 0.31847629E+04 0.31765959E+04 0.31765959E+04 0.31706570E+04 + 0.31706570E+04 0.31738140E+04 0.31738140E+04 0.31785710E+04 + 0.31785710E+04 0.31831750E+04 0.31996299E+04 0.31989009E+04 + 0.31989009E+04 0.32038311E+04 0.32038311E+04 0.32027351E+04 + 0.32027351E+04 0.31956660E+04 0.31956660E+04 0.31890710E+04 + 0.31890710E+04 0.31838240E+04 0.31838240E+04 0.31757290E+04 + 0.31757290E+04 0.31691121E+04 0.31691121E+04 0.31706030E+04 + 0.31706030E+04 0.31754031E+04 0.31754031E+04 0.31815811E+04 + 0.31996299E+04 0.31989009E+04 0.31989009E+04 0.32038311E+04 + 0.32038311E+04 0.32027351E+04 0.32027351E+04 0.31956660E+04 + 0.31956660E+04 0.31890710E+04 0.31890710E+04 0.31838240E+04 + 0.31838240E+04 0.31757290E+04 0.31757290E+04 0.31691121E+04 + 0.31691121E+04 0.31706030E+04 0.31706030E+04 0.31754031E+04 + 0.31754031E+04 0.31815811E+04 0.31959409E+04 0.31963511E+04 + 0.31963511E+04 0.31991111E+04 0.31991111E+04 0.31975940E+04 + 0.31975940E+04 0.31894590E+04 0.31894590E+04 0.31810291E+04 + 0.31810291E+04 0.31768879E+04 0.31768879E+04 0.31735210E+04 + 0.31735210E+04 0.31705459E+04 0.31705459E+04 0.31712671E+04 + 0.31712671E+04 0.31764109E+04 0.31764109E+04 0.31842319E+04 + 0.31959409E+04 0.31963511E+04 0.31963511E+04 0.31991111E+04 + 0.31991111E+04 0.31975940E+04 0.31975940E+04 0.31894590E+04 + 0.31894590E+04 0.31810291E+04 0.31810291E+04 0.31768879E+04 + 0.31768879E+04 0.31735210E+04 0.31735210E+04 0.31705459E+04 + 0.31705459E+04 0.31712671E+04 0.31712671E+04 0.31764109E+04 + 0.30479580E+04 0.30477520E+04 0.31899231E+04 0.31844951E+04 + 0.31844951E+04 0.31868840E+04 0.31868840E+04 0.31866860E+04 + 0.31866860E+04 0.31807581E+04 0.31807581E+04 0.31754680E+04 + 0.31754680E+04 0.31729680E+04 0.31729680E+04 0.31713550E+04 + 0.31713550E+04 0.31717991E+04 0.31717991E+04 0.31731450E+04 + 0.31731450E+04 0.31754980E+04 0.30527661E+04 0.30490859E+04 + 0.31899231E+04 0.31844951E+04 0.31844951E+04 0.31868840E+04 + 0.31868840E+04 0.31866860E+04 0.31866860E+04 0.31807581E+04 + 0.31807581E+04 0.31754680E+04 0.31754680E+04 0.31729680E+04 + 0.31729680E+04 0.31713550E+04 0.31713550E+04 0.31717991E+04 + 0.30829800E+04 0.30796421E+04 0.30796421E+04 0.30781621E+04 + 0.30527661E+04 0.30490859E+04 0.31926250E+04 0.31791270E+04 + 0.31791270E+04 0.31772141E+04 0.31772141E+04 0.31763101E+04 + 0.31763101E+04 0.31736240E+04 0.31736240E+04 0.31708811E+04 + 0.31708811E+04 0.31700520E+04 0.31700520E+04 0.31707009E+04 + 0.31707009E+04 0.31708320E+04 0.30823091E+04 0.30808650E+04 + 0.30808650E+04 0.30788250E+04 0.30522581E+04 0.30493950E+04 + 0.31926250E+04 0.31791270E+04 0.31791270E+04 0.31772141E+04 + 0.31772141E+04 0.31763101E+04 0.31763101E+04 0.31736240E+04 + 0.31736240E+04 0.31708811E+04 0.31708811E+04 0.31700520E+04 + 0.30946951E+04 0.30903191E+04 0.30903191E+04 0.30823091E+04 + 0.30823091E+04 0.30808650E+04 0.30808650E+04 0.30788250E+04 + 0.30522581E+04 0.30493950E+04 0.31926230E+04 0.31799260E+04 + 0.31799260E+04 0.31740220E+04 0.31740220E+04 0.31720330E+04 + 0.31720330E+04 0.31698650E+04 0.31698650E+04 0.31693789E+04 + 0.31693789E+04 0.31684221E+04 0.30962810E+04 0.30926689E+04 + 0.30926689E+04 0.30869880E+04 0.30869880E+04 0.30830640E+04 + 0.30830640E+04 0.30802830E+04 0.30525581E+04 0.30497000E+04 + 0.31926230E+04 0.31799260E+04 0.31799260E+04 0.31740220E+04 + 0.31740220E+04 0.31720330E+04 0.31720330E+04 0.31698650E+04 + 0.31039380E+04 0.31003359E+04 0.31003359E+04 0.30962810E+04 + 0.30962810E+04 0.30926689E+04 0.30926689E+04 0.30869880E+04 + 0.30869880E+04 0.30830640E+04 0.30830640E+04 0.30802830E+04 + 0.30525581E+04 0.30497000E+04 0.31902461E+04 0.31827620E+04 + 0.31827620E+04 0.31761960E+04 0.31761960E+04 0.31738521E+04 + 0.31738521E+04 0.31700659E+04 0.31054260E+04 0.31020339E+04 + 0.31020339E+04 0.30988850E+04 0.30988850E+04 0.30955239E+04 + 0.30955239E+04 0.30897310E+04 0.30897310E+04 0.30840259E+04 + 0.30840259E+04 0.30811589E+04 0.30526709E+04 0.30502480E+04 + 0.31902461E+04 0.31827620E+04 0.31827620E+04 0.31761960E+04 + 0.31150291E+04 0.31110381E+04 0.31110381E+04 0.31054260E+04 + 0.31054260E+04 0.31020339E+04 0.31020339E+04 0.30988850E+04 + 0.30988850E+04 0.30955239E+04 0.30955239E+04 0.30897310E+04 + 0.30897310E+04 0.30840259E+04 0.30840259E+04 0.30811589E+04 + 0.30526709E+04 0.30502480E+04 0.31897710E+04 0.31846560E+04 + 0.31846560E+04 0.31787639E+04 0.31182781E+04 0.31131121E+04 + 0.31131121E+04 0.31071001E+04 0.31071001E+04 0.31025979E+04 + 0.31025979E+04 0.30967009E+04 0.30967009E+04 0.30926201E+04 + 0.30926201E+04 0.30903330E+04 0.30903330E+04 0.30864309E+04 + 0.30864309E+04 0.30824641E+04 0.30533081E+04 0.30507920E+04 + 0.31273789E+04 0.31240769E+04 0.31240769E+04 0.31182781E+04 + 0.31182781E+04 0.31131121E+04 0.31131121E+04 0.31071001E+04 + 0.31071001E+04 0.31025979E+04 0.31025979E+04 0.30967009E+04 + 0.30967009E+04 0.30926201E+04 0.30926201E+04 0.30903330E+04 + 0.30903330E+04 0.30864309E+04 0.30864309E+04 0.30824641E+04 + 0.30824641E+04 0.30797000E+04 0.31291599E+04 0.31267791E+04 + 0.31267791E+04 0.31234519E+04 0.31234519E+04 0.31172410E+04 + 0.31172410E+04 0.31056270E+04 0.31056270E+04 0.30983621E+04 + 0.30983621E+04 0.30937830E+04 0.30937830E+04 0.30927690E+04 + 0.30927690E+04 0.30942170E+04 0.30942170E+04 0.30901790E+04 + 0.30901790E+04 0.30841250E+04 0.30841250E+04 0.30804680E+04 + 0.31941689E+04 0.31943000E+04 0.31943000E+04 0.31968491E+04 + 0.31968491E+04 0.31967859E+04 0.31967859E+04 0.31918240E+04 + 0.31918240E+04 0.31851890E+04 0.31851890E+04 0.31855659E+04 + 0.31855659E+04 0.31906980E+04 0.31906980E+04 0.31925730E+04 + 0.31925730E+04 0.31935161E+04 0.31935161E+04 0.31986270E+04 + 0.31986270E+04 0.32059399E+04 0.31840510E+04 0.31866111E+04 + 0.31866111E+04 0.31910381E+04 0.31910381E+04 0.31912380E+04 + 0.31912380E+04 0.31881440E+04 0.31881440E+04 0.31866089E+04 + 0.31866089E+04 0.31912529E+04 0.31912529E+04 0.31974231E+04 + 0.31974231E+04 0.31984709E+04 0.31984709E+04 0.32015120E+04 + 0.32015120E+04 0.32063030E+04 0.32063030E+04 0.32108450E+04 + 0.31840510E+04 0.31866111E+04 0.31866111E+04 0.31910381E+04 + 0.31910381E+04 0.31912380E+04 0.31912380E+04 0.31881440E+04 + 0.31881440E+04 0.31866089E+04 0.31866089E+04 0.31912529E+04 + 0.31912529E+04 0.31974231E+04 0.31974231E+04 0.31984709E+04 + 0.31984709E+04 0.32015120E+04 0.32015120E+04 0.32063030E+04 + 0.32063030E+04 0.32108450E+04 0.31758010E+04 0.31781230E+04 + 0.31781230E+04 0.31810640E+04 0.31810640E+04 0.31785640E+04 + 0.31785640E+04 0.31778940E+04 0.31778940E+04 0.31812729E+04 + 0.31812729E+04 0.31880339E+04 0.31880339E+04 0.31949270E+04 + 0.31949270E+04 0.31985020E+04 0.31985020E+04 0.32040420E+04 + 0.32040420E+04 0.32091621E+04 0.32091621E+04 0.32123940E+04 + 0.31758010E+04 0.31781230E+04 0.31781230E+04 0.31810640E+04 + 0.31810640E+04 0.31785640E+04 0.31785640E+04 0.31778940E+04 + 0.31778940E+04 0.31812729E+04 0.31812729E+04 0.31880339E+04 + 0.31880339E+04 0.31949270E+04 0.31949270E+04 0.31985020E+04 + 0.31985020E+04 0.32040420E+04 0.32040420E+04 0.32091621E+04 + 0.32091621E+04 0.32123940E+04 0.31660349E+04 0.31599241E+04 + 0.31599241E+04 0.31600210E+04 0.31600210E+04 0.31609939E+04 + 0.31609939E+04 0.31710049E+04 0.31710049E+04 0.31827429E+04 + 0.31827429E+04 0.31907180E+04 0.31907180E+04 0.31943311E+04 + 0.31943311E+04 0.31979341E+04 0.31979341E+04 0.32042209E+04 + 0.32042209E+04 0.32112520E+04 0.32112520E+04 0.32168811E+04 + 0.31660349E+04 0.31599241E+04 0.31599241E+04 0.31600210E+04 + 0.31600210E+04 0.31609939E+04 0.31609939E+04 0.31710049E+04 + 0.31710049E+04 0.31827429E+04 0.31827429E+04 0.31907180E+04 + 0.31907180E+04 0.31943311E+04 0.31943311E+04 0.31979341E+04 + 0.31979341E+04 0.32042209E+04 0.32042209E+04 0.32112520E+04 + 0.32112520E+04 0.32168811E+04 0.31708210E+04 0.31655020E+04 + 0.31655020E+04 0.31670911E+04 0.31670911E+04 0.31676189E+04 + 0.31676189E+04 0.31707639E+04 0.31707639E+04 0.31765869E+04 + 0.31765869E+04 0.31811990E+04 0.31811990E+04 0.31835410E+04 + 0.31835410E+04 0.31901089E+04 0.31901089E+04 0.32009629E+04 + 0.32009629E+04 0.32116870E+04 0.32116870E+04 0.32209231E+04 + 0.31708210E+04 0.31655020E+04 0.31655020E+04 0.31670911E+04 + 0.31670911E+04 0.31676189E+04 0.31676189E+04 0.31707639E+04 + 0.31707639E+04 0.31765869E+04 0.31765869E+04 0.31811990E+04 + 0.31811990E+04 0.31835410E+04 0.31835410E+04 0.31901089E+04 + 0.31901089E+04 0.32009629E+04 0.32009629E+04 0.32116870E+04 + 0.32116870E+04 0.32209231E+04 0.31847471E+04 0.31865090E+04 + 0.31865090E+04 0.31872910E+04 0.31872910E+04 0.31833940E+04 + 0.31833940E+04 0.31756260E+04 0.31756260E+04 0.31718931E+04 + 0.31718931E+04 0.31745249E+04 0.31745249E+04 0.31795420E+04 + 0.31795420E+04 0.31848601E+04 0.31848601E+04 0.31943501E+04 + 0.31943501E+04 0.32066221E+04 0.32066221E+04 0.32187791E+04 + 0.31847471E+04 0.31865090E+04 0.31865090E+04 0.31872910E+04 + 0.31872910E+04 0.31833940E+04 0.31833940E+04 0.31756260E+04 + 0.31756260E+04 0.31718931E+04 0.31718931E+04 0.31745249E+04 + 0.31745249E+04 0.31795420E+04 0.31795420E+04 0.31848601E+04 + 0.31848601E+04 0.31943501E+04 0.31943501E+04 0.32066221E+04 + 0.32066221E+04 0.32187791E+04 0.31831819E+04 0.31915220E+04 + 0.31915220E+04 0.31945129E+04 0.31945129E+04 0.31924099E+04 + 0.31924099E+04 0.31885190E+04 0.31885190E+04 0.31840249E+04 + 0.31840249E+04 0.31825400E+04 0.31825400E+04 0.31804070E+04 + 0.31804070E+04 0.31794031E+04 0.31794031E+04 0.31860161E+04 + 0.31860161E+04 0.31983081E+04 0.31983081E+04 0.32109829E+04 + 0.31831819E+04 0.31915220E+04 0.31915220E+04 0.31945129E+04 + 0.31945129E+04 0.31924099E+04 0.31924099E+04 0.31885190E+04 + 0.31885190E+04 0.31840249E+04 0.31840249E+04 0.31825400E+04 + 0.31825400E+04 0.31804070E+04 0.31804070E+04 0.31794031E+04 + 0.31794031E+04 0.31860161E+04 0.31860161E+04 0.31983081E+04 + 0.31983081E+04 0.32109829E+04 0.31813311E+04 0.31884309E+04 + 0.31884309E+04 0.31934951E+04 0.31934951E+04 0.31925359E+04 + 0.31925359E+04 0.31912881E+04 0.31912881E+04 0.31898840E+04 + 0.31898840E+04 0.31865220E+04 0.31865220E+04 0.31782329E+04 + 0.31782329E+04 0.31745569E+04 0.31745569E+04 0.31783259E+04 + 0.31783259E+04 0.31861760E+04 0.31861760E+04 0.31946760E+04 + 0.31813311E+04 0.31884309E+04 0.31884309E+04 0.31934951E+04 + 0.31934951E+04 0.31925359E+04 0.31925359E+04 0.31912881E+04 + 0.31912881E+04 0.31898840E+04 0.31898840E+04 0.31865220E+04 + 0.31865220E+04 0.31782329E+04 0.31782329E+04 0.31745569E+04 + 0.31745569E+04 0.31783259E+04 0.31783259E+04 0.31861760E+04 + 0.31861760E+04 0.31946760E+04 0.31899670E+04 0.31920049E+04 + 0.31920049E+04 0.31991399E+04 0.31991399E+04 0.31984221E+04 + 0.31984221E+04 0.31928030E+04 0.31928030E+04 0.31891609E+04 + 0.31891609E+04 0.31855471E+04 0.31855471E+04 0.31774060E+04 + 0.31774060E+04 0.31713391E+04 0.31713391E+04 0.31744099E+04 + 0.31744099E+04 0.31791541E+04 0.31791541E+04 0.31837649E+04 + 0.31899670E+04 0.31920049E+04 0.31920049E+04 0.31991399E+04 + 0.31991399E+04 0.31984221E+04 0.31984221E+04 0.31928030E+04 + 0.31928030E+04 0.31891609E+04 0.31891609E+04 0.31855471E+04 + 0.31855471E+04 0.31774060E+04 0.31774060E+04 0.31713391E+04 + 0.31713391E+04 0.31744099E+04 0.31744099E+04 0.31791541E+04 + 0.31791541E+04 0.31837649E+04 0.32005940E+04 0.31996150E+04 + 0.31996150E+04 0.32045391E+04 0.32045391E+04 0.32035681E+04 + 0.32035681E+04 0.31965181E+04 0.31965181E+04 0.31898750E+04 + 0.31898750E+04 0.31846111E+04 0.31846111E+04 0.31765120E+04 + 0.31765120E+04 0.31697991E+04 0.31697991E+04 0.31712251E+04 + 0.31712251E+04 0.31760659E+04 0.31760659E+04 0.31824390E+04 + 0.32005940E+04 0.31996150E+04 0.31996150E+04 0.32045391E+04 + 0.32045391E+04 0.32035681E+04 0.32035681E+04 0.31965181E+04 + 0.31965181E+04 0.31898750E+04 0.31898750E+04 0.31846111E+04 + 0.31846111E+04 0.31765120E+04 0.31765120E+04 0.31697991E+04 + 0.31697991E+04 0.31712251E+04 0.31712251E+04 0.31760659E+04 + 0.31760659E+04 0.31824390E+04 0.31969270E+04 0.31971770E+04 + 0.31971770E+04 0.31999050E+04 0.31999050E+04 0.31984939E+04 + 0.31984939E+04 0.31904121E+04 0.31904121E+04 0.31819089E+04 + 0.31819089E+04 0.31776990E+04 0.31776990E+04 0.31742461E+04 + 0.31742461E+04 0.31711890E+04 0.31711890E+04 0.31718899E+04 + 0.31718899E+04 0.31771489E+04 0.31771489E+04 0.31852561E+04 + 0.31969270E+04 0.31971770E+04 0.31971770E+04 0.31999050E+04 + 0.31999050E+04 0.31984939E+04 0.31984939E+04 0.31904121E+04 + 0.31904121E+04 0.31819089E+04 0.31819089E+04 0.31776990E+04 + 0.31776990E+04 0.31742461E+04 0.31742461E+04 0.31711890E+04 + 0.31711890E+04 0.31718899E+04 0.31718899E+04 0.31771489E+04 + 0.30484910E+04 0.30483711E+04 0.31909299E+04 0.31853279E+04 + 0.31853279E+04 0.31876411E+04 0.31876411E+04 0.31875630E+04 + 0.31875630E+04 0.31817351E+04 0.31817351E+04 0.31763621E+04 + 0.31763621E+04 0.31737710E+04 0.31737710E+04 0.31720339E+04 + 0.31720339E+04 0.31724829E+04 0.31724829E+04 0.31738330E+04 + 0.31738330E+04 0.31762029E+04 0.30533030E+04 0.30497190E+04 + 0.31909299E+04 0.31853279E+04 0.31853279E+04 0.31876411E+04 + 0.31876411E+04 0.31875630E+04 0.31875630E+04 0.31817351E+04 + 0.31817351E+04 0.31763621E+04 0.31763621E+04 0.31737710E+04 + 0.31737710E+04 0.31720339E+04 0.31720339E+04 0.31724829E+04 + 0.30838640E+04 0.30805530E+04 0.30805530E+04 0.30791021E+04 + 0.30533030E+04 0.30497190E+04 0.31937529E+04 0.31800801E+04 + 0.31800801E+04 0.31780649E+04 0.31780649E+04 0.31771521E+04 + 0.31771521E+04 0.31744790E+04 0.31744790E+04 0.31717041E+04 + 0.31717041E+04 0.31708250E+04 0.31708250E+04 0.31714070E+04 + 0.31714070E+04 0.31715720E+04 0.30831221E+04 0.30817639E+04 + 0.30817639E+04 0.30797871E+04 0.30527991E+04 0.30499751E+04 + 0.31937529E+04 0.31800801E+04 0.31800801E+04 0.31780649E+04 + 0.31780649E+04 0.31771521E+04 0.31771521E+04 0.31744790E+04 + 0.31744790E+04 0.31717041E+04 0.31717041E+04 0.31708250E+04 + 0.30956479E+04 0.30912791E+04 0.30912791E+04 0.30831221E+04 + 0.30831221E+04 0.30817639E+04 0.30817639E+04 0.30797871E+04 + 0.30527991E+04 0.30499751E+04 0.31938721E+04 0.31809609E+04 + 0.31809609E+04 0.31749580E+04 0.31749580E+04 0.31728911E+04 + 0.31728911E+04 0.31706960E+04 0.31706960E+04 0.31701799E+04 + 0.31701799E+04 0.31692371E+04 0.30972380E+04 0.30936809E+04 + 0.30936809E+04 0.30879719E+04 0.30879719E+04 0.30839939E+04 + 0.30839939E+04 0.30812361E+04 0.30530950E+04 0.30502700E+04 + 0.31938721E+04 0.31809609E+04 0.31809609E+04 0.31749580E+04 + 0.31749580E+04 0.31728911E+04 0.31728911E+04 0.31706960E+04 + 0.31048789E+04 0.31012891E+04 0.31012891E+04 0.30972380E+04 + 0.30972380E+04 0.30936809E+04 0.30936809E+04 0.30879719E+04 + 0.30879719E+04 0.30839939E+04 0.30839939E+04 0.30812361E+04 + 0.30530950E+04 0.30502700E+04 0.31911389E+04 0.31836780E+04 + 0.31836780E+04 0.31770681E+04 0.31770681E+04 0.31747500E+04 + 0.31747500E+04 0.31709839E+04 0.31064031E+04 0.31030591E+04 + 0.31030591E+04 0.30998669E+04 0.30998669E+04 0.30964709E+04 + 0.30964709E+04 0.30907119E+04 0.30907119E+04 0.30849309E+04 + 0.30849309E+04 0.30820979E+04 0.30532219E+04 0.30508440E+04 + 0.31911389E+04 0.31836780E+04 0.31836780E+04 0.31770681E+04 + 0.31159690E+04 0.31119919E+04 0.31119919E+04 0.31064031E+04 + 0.31064031E+04 0.31030591E+04 0.31030591E+04 0.30998669E+04 + 0.30998669E+04 0.30964709E+04 0.30964709E+04 0.30907119E+04 + 0.30907119E+04 0.30849309E+04 0.30849309E+04 0.30820979E+04 + 0.30532219E+04 0.30508440E+04 0.31905920E+04 0.31855281E+04 + 0.31855281E+04 0.31796360E+04 0.31192229E+04 0.31141470E+04 + 0.31141470E+04 0.31081589E+04 0.31081589E+04 0.31036011E+04 + 0.31036011E+04 0.30976450E+04 0.30976450E+04 0.30936001E+04 + 0.30936001E+04 0.30913201E+04 0.30913201E+04 0.30873391E+04 + 0.30873391E+04 0.30833469E+04 0.30538811E+04 0.30513840E+04 + 0.31281399E+04 0.31248889E+04 0.31248889E+04 0.31192229E+04 + 0.31192229E+04 0.31141470E+04 0.31141470E+04 0.31081589E+04 + 0.31081589E+04 0.31036011E+04 0.31036011E+04 0.30976450E+04 + 0.30976450E+04 0.30936001E+04 0.30936001E+04 0.30913201E+04 + 0.30913201E+04 0.30873391E+04 0.30873391E+04 0.30833469E+04 + 0.30833469E+04 0.30805681E+04 0.31299231E+04 0.31275640E+04 + 0.31275640E+04 0.31244541E+04 0.31244541E+04 0.31183979E+04 + 0.31183979E+04 0.31065691E+04 0.31065691E+04 0.30992529E+04 + 0.30992529E+04 0.30946580E+04 0.30946580E+04 0.30936631E+04 + 0.30936631E+04 0.30951951E+04 0.30951951E+04 0.30910710E+04 + 0.30910710E+04 0.30849500E+04 0.30849500E+04 0.30812800E+04 + 0.31941689E+04 0.31943000E+04 0.31943000E+04 0.31968491E+04 + 0.31968491E+04 0.31967859E+04 0.31967859E+04 0.31918240E+04 + 0.31918240E+04 0.31851890E+04 0.31851890E+04 0.31855659E+04 + 0.31855659E+04 0.31906980E+04 0.31906980E+04 0.31925730E+04 + 0.31925730E+04 0.31935161E+04 0.31935161E+04 0.31986270E+04 + 0.31986270E+04 0.32059399E+04 0.31840510E+04 0.31866111E+04 + 0.31866111E+04 0.31910381E+04 0.31910381E+04 0.31912380E+04 + 0.31912380E+04 0.31881440E+04 0.31881440E+04 0.31866089E+04 + 0.31866089E+04 0.31912529E+04 0.31912529E+04 0.31974231E+04 + 0.31974231E+04 0.31984709E+04 0.31984709E+04 0.32015120E+04 + 0.32015120E+04 0.32063030E+04 0.32063030E+04 0.32108450E+04 + 0.31840510E+04 0.31866111E+04 0.31866111E+04 0.31910381E+04 + 0.31910381E+04 0.31912380E+04 0.31912380E+04 0.31881440E+04 + 0.31881440E+04 0.31866089E+04 0.31866089E+04 0.31912529E+04 + 0.31912529E+04 0.31974231E+04 0.31974231E+04 0.31984709E+04 + 0.31984709E+04 0.32015120E+04 0.32015120E+04 0.32063030E+04 + 0.32063030E+04 0.32108450E+04 0.31758010E+04 0.31781230E+04 + 0.31781230E+04 0.31810640E+04 0.31810640E+04 0.31785640E+04 + 0.31785640E+04 0.31778940E+04 0.31778940E+04 0.31812729E+04 + 0.31812729E+04 0.31880339E+04 0.31880339E+04 0.31949270E+04 + 0.31949270E+04 0.31985020E+04 0.31985020E+04 0.32040420E+04 + 0.32040420E+04 0.32091621E+04 0.32091621E+04 0.32123940E+04 + 0.31758010E+04 0.31781230E+04 0.31781230E+04 0.31810640E+04 + 0.31810640E+04 0.31785640E+04 0.31785640E+04 0.31778940E+04 + 0.31778940E+04 0.31812729E+04 0.31812729E+04 0.31880339E+04 + 0.31880339E+04 0.31949270E+04 0.31949270E+04 0.31985020E+04 + 0.31985020E+04 0.32040420E+04 0.32040420E+04 0.32091621E+04 + 0.32091621E+04 0.32123940E+04 0.31660349E+04 0.31599241E+04 + 0.31599241E+04 0.31600210E+04 0.31600210E+04 0.31609939E+04 + 0.31609939E+04 0.31710049E+04 0.31710049E+04 0.31827429E+04 + 0.31827429E+04 0.31907180E+04 0.31907180E+04 0.31943311E+04 + 0.31943311E+04 0.31979341E+04 0.31979341E+04 0.32042209E+04 + 0.32042209E+04 0.32112520E+04 0.32112520E+04 0.32168811E+04 + 0.31660349E+04 0.31599241E+04 0.31599241E+04 0.31600210E+04 + 0.31600210E+04 0.31609939E+04 0.31609939E+04 0.31710049E+04 + 0.31710049E+04 0.31827429E+04 0.31827429E+04 0.31907180E+04 + 0.31907180E+04 0.31943311E+04 0.31943311E+04 0.31979341E+04 + 0.31979341E+04 0.32042209E+04 0.32042209E+04 0.32112520E+04 + 0.32112520E+04 0.32168811E+04 0.31708210E+04 0.31655020E+04 + 0.31655020E+04 0.31670911E+04 0.31670911E+04 0.31676189E+04 + 0.31676189E+04 0.31707639E+04 0.31707639E+04 0.31765869E+04 + 0.31765869E+04 0.31811990E+04 0.31811990E+04 0.31835410E+04 + 0.31835410E+04 0.31901089E+04 0.31901089E+04 0.32009629E+04 + 0.32009629E+04 0.32116870E+04 0.32116870E+04 0.32209231E+04 + 0.31708210E+04 0.31655020E+04 0.31655020E+04 0.31670911E+04 + 0.31670911E+04 0.31676189E+04 0.31676189E+04 0.31707639E+04 + 0.31707639E+04 0.31765869E+04 0.31765869E+04 0.31811990E+04 + 0.31811990E+04 0.31835410E+04 0.31835410E+04 0.31901089E+04 + 0.31901089E+04 0.32009629E+04 0.32009629E+04 0.32116870E+04 + 0.32116870E+04 0.32209231E+04 0.31847471E+04 0.31865090E+04 + 0.31865090E+04 0.31872910E+04 0.31872910E+04 0.31833940E+04 + 0.31833940E+04 0.31756260E+04 0.31756260E+04 0.31718931E+04 + 0.31718931E+04 0.31745249E+04 0.31745249E+04 0.31795420E+04 + 0.31795420E+04 0.31848601E+04 0.31848601E+04 0.31943501E+04 + 0.31943501E+04 0.32066221E+04 0.32066221E+04 0.32187791E+04 + 0.31847471E+04 0.31865090E+04 0.31865090E+04 0.31872910E+04 + 0.31872910E+04 0.31833940E+04 0.31833940E+04 0.31756260E+04 + 0.31756260E+04 0.31718931E+04 0.31718931E+04 0.31745249E+04 + 0.31745249E+04 0.31795420E+04 0.31795420E+04 0.31848601E+04 + 0.31848601E+04 0.31943501E+04 0.31943501E+04 0.32066221E+04 + 0.32066221E+04 0.32187791E+04 0.31831819E+04 0.31915220E+04 + 0.31915220E+04 0.31945129E+04 0.31945129E+04 0.31924099E+04 + 0.31924099E+04 0.31885190E+04 0.31885190E+04 0.31840249E+04 + 0.31840249E+04 0.31825400E+04 0.31825400E+04 0.31804070E+04 + 0.31804070E+04 0.31794031E+04 0.31794031E+04 0.31860161E+04 + 0.31860161E+04 0.31983081E+04 0.31983081E+04 0.32109829E+04 + 0.31831819E+04 0.31915220E+04 0.31915220E+04 0.31945129E+04 + 0.31945129E+04 0.31924099E+04 0.31924099E+04 0.31885190E+04 + 0.31885190E+04 0.31840249E+04 0.31840249E+04 0.31825400E+04 + 0.31825400E+04 0.31804070E+04 0.31804070E+04 0.31794031E+04 + 0.31794031E+04 0.31860161E+04 0.31860161E+04 0.31983081E+04 + 0.31983081E+04 0.32109829E+04 0.31813311E+04 0.31884309E+04 + 0.31884309E+04 0.31934951E+04 0.31934951E+04 0.31925359E+04 + 0.31925359E+04 0.31912881E+04 0.31912881E+04 0.31898840E+04 + 0.31898840E+04 0.31865220E+04 0.31865220E+04 0.31782329E+04 + 0.31782329E+04 0.31745569E+04 0.31745569E+04 0.31783259E+04 + 0.31783259E+04 0.31861760E+04 0.31861760E+04 0.31946760E+04 + 0.31813311E+04 0.31884309E+04 0.31884309E+04 0.31934951E+04 + 0.31934951E+04 0.31925359E+04 0.31925359E+04 0.31912881E+04 + 0.31912881E+04 0.31898840E+04 0.31898840E+04 0.31865220E+04 + 0.31865220E+04 0.31782329E+04 0.31782329E+04 0.31745569E+04 + 0.31745569E+04 0.31783259E+04 0.31783259E+04 0.31861760E+04 + 0.31861760E+04 0.31946760E+04 0.31899670E+04 0.31920049E+04 + 0.31920049E+04 0.31991399E+04 0.31991399E+04 0.31984221E+04 + 0.31984221E+04 0.31928030E+04 0.31928030E+04 0.31891609E+04 + 0.31891609E+04 0.31855471E+04 0.31855471E+04 0.31774060E+04 + 0.31774060E+04 0.31713391E+04 0.31713391E+04 0.31744099E+04 + 0.31744099E+04 0.31791541E+04 0.31791541E+04 0.31837649E+04 + 0.31899670E+04 0.31920049E+04 0.31920049E+04 0.31991399E+04 + 0.31991399E+04 0.31984221E+04 0.31984221E+04 0.31928030E+04 + 0.31928030E+04 0.31891609E+04 0.31891609E+04 0.31855471E+04 + 0.31855471E+04 0.31774060E+04 0.31774060E+04 0.31713391E+04 + 0.31713391E+04 0.31744099E+04 0.31744099E+04 0.31791541E+04 + 0.31791541E+04 0.31837649E+04 0.32005940E+04 0.31996150E+04 + 0.31996150E+04 0.32045391E+04 0.32045391E+04 0.32035681E+04 + 0.32035681E+04 0.31965181E+04 0.31965181E+04 0.31898750E+04 + 0.31898750E+04 0.31846111E+04 0.31846111E+04 0.31765120E+04 + 0.31765120E+04 0.31697991E+04 0.31697991E+04 0.31712251E+04 + 0.31712251E+04 0.31760659E+04 0.31760659E+04 0.31824390E+04 + 0.32005940E+04 0.31996150E+04 0.31996150E+04 0.32045391E+04 + 0.32045391E+04 0.32035681E+04 0.32035681E+04 0.31965181E+04 + 0.31965181E+04 0.31898750E+04 0.31898750E+04 0.31846111E+04 + 0.31846111E+04 0.31765120E+04 0.31765120E+04 0.31697991E+04 + 0.31697991E+04 0.31712251E+04 0.31712251E+04 0.31760659E+04 + 0.31760659E+04 0.31824390E+04 0.31969270E+04 0.31971770E+04 + 0.31971770E+04 0.31999050E+04 0.31999050E+04 0.31984939E+04 + 0.31984939E+04 0.31904121E+04 0.31904121E+04 0.31819089E+04 + 0.31819089E+04 0.31776990E+04 0.31776990E+04 0.31742461E+04 + 0.31742461E+04 0.31711890E+04 0.31711890E+04 0.31718899E+04 + 0.31718899E+04 0.31771489E+04 0.31771489E+04 0.31852561E+04 + 0.31969270E+04 0.31971770E+04 0.31971770E+04 0.31999050E+04 + 0.31999050E+04 0.31984939E+04 0.31984939E+04 0.31904121E+04 + 0.31904121E+04 0.31819089E+04 0.31819089E+04 0.31776990E+04 + 0.31776990E+04 0.31742461E+04 0.31742461E+04 0.31711890E+04 + 0.31711890E+04 0.31718899E+04 0.31718899E+04 0.31771489E+04 + 0.30484910E+04 0.30483711E+04 0.31909299E+04 0.31853279E+04 + 0.31853279E+04 0.31876411E+04 0.31876411E+04 0.31875630E+04 + 0.31875630E+04 0.31817351E+04 0.31817351E+04 0.31763621E+04 + 0.31763621E+04 0.31737710E+04 0.31737710E+04 0.31720339E+04 + 0.31720339E+04 0.31724829E+04 0.31724829E+04 0.31738330E+04 + 0.31738330E+04 0.31762029E+04 0.30533030E+04 0.30497190E+04 + 0.31909299E+04 0.31853279E+04 0.31853279E+04 0.31876411E+04 + 0.31876411E+04 0.31875630E+04 0.31875630E+04 0.31817351E+04 + 0.31817351E+04 0.31763621E+04 0.31763621E+04 0.31737710E+04 + 0.31737710E+04 0.31720339E+04 0.31720339E+04 0.31724829E+04 + 0.30838640E+04 0.30805530E+04 0.30805530E+04 0.30791021E+04 + 0.30533030E+04 0.30497190E+04 0.31937529E+04 0.31800801E+04 + 0.31800801E+04 0.31780649E+04 0.31780649E+04 0.31771521E+04 + 0.31771521E+04 0.31744790E+04 0.31744790E+04 0.31717041E+04 + 0.31717041E+04 0.31708250E+04 0.31708250E+04 0.31714070E+04 + 0.31714070E+04 0.31715720E+04 0.30831221E+04 0.30817639E+04 + 0.30817639E+04 0.30797871E+04 0.30527991E+04 0.30499751E+04 + 0.31937529E+04 0.31800801E+04 0.31800801E+04 0.31780649E+04 + 0.31780649E+04 0.31771521E+04 0.31771521E+04 0.31744790E+04 + 0.31744790E+04 0.31717041E+04 0.31717041E+04 0.31708250E+04 + 0.30956479E+04 0.30912791E+04 0.30912791E+04 0.30831221E+04 + 0.30831221E+04 0.30817639E+04 0.30817639E+04 0.30797871E+04 + 0.30527991E+04 0.30499751E+04 0.31938721E+04 0.31809609E+04 + 0.31809609E+04 0.31749580E+04 0.31749580E+04 0.31728911E+04 + 0.31728911E+04 0.31706960E+04 0.31706960E+04 0.31701799E+04 + 0.31701799E+04 0.31692371E+04 0.30972380E+04 0.30936809E+04 + 0.30936809E+04 0.30879719E+04 0.30879719E+04 0.30839939E+04 + 0.30839939E+04 0.30812361E+04 0.30530950E+04 0.30502700E+04 + 0.31938721E+04 0.31809609E+04 0.31809609E+04 0.31749580E+04 + 0.31749580E+04 0.31728911E+04 0.31728911E+04 0.31706960E+04 + 0.31048789E+04 0.31012891E+04 0.31012891E+04 0.30972380E+04 + 0.30972380E+04 0.30936809E+04 0.30936809E+04 0.30879719E+04 + 0.30879719E+04 0.30839939E+04 0.30839939E+04 0.30812361E+04 + 0.30530950E+04 0.30502700E+04 0.31911389E+04 0.31836780E+04 + 0.31836780E+04 0.31770681E+04 0.31770681E+04 0.31747500E+04 + 0.31747500E+04 0.31709839E+04 0.31064031E+04 0.31030591E+04 + 0.31030591E+04 0.30998669E+04 0.30998669E+04 0.30964709E+04 + 0.30964709E+04 0.30907119E+04 0.30907119E+04 0.30849309E+04 + 0.30849309E+04 0.30820979E+04 0.30532219E+04 0.30508440E+04 + 0.31911389E+04 0.31836780E+04 0.31836780E+04 0.31770681E+04 + 0.31159690E+04 0.31119919E+04 0.31119919E+04 0.31064031E+04 + 0.31064031E+04 0.31030591E+04 0.31030591E+04 0.30998669E+04 + 0.30998669E+04 0.30964709E+04 0.30964709E+04 0.30907119E+04 + 0.30907119E+04 0.30849309E+04 0.30849309E+04 0.30820979E+04 + 0.30532219E+04 0.30508440E+04 0.31905920E+04 0.31855281E+04 + 0.31855281E+04 0.31796360E+04 0.31192229E+04 0.31141470E+04 + 0.31141470E+04 0.31081589E+04 0.31081589E+04 0.31036011E+04 + 0.31036011E+04 0.30976450E+04 0.30976450E+04 0.30936001E+04 + 0.30936001E+04 0.30913201E+04 0.30913201E+04 0.30873391E+04 + 0.30873391E+04 0.30833469E+04 0.30538811E+04 0.30513840E+04 + 0.31281399E+04 0.31248889E+04 0.31248889E+04 0.31192229E+04 + 0.31192229E+04 0.31141470E+04 0.31141470E+04 0.31081589E+04 + 0.31081589E+04 0.31036011E+04 0.31036011E+04 0.30976450E+04 + 0.30976450E+04 0.30936001E+04 0.30936001E+04 0.30913201E+04 + 0.30913201E+04 0.30873391E+04 0.30873391E+04 0.30833469E+04 + 0.30833469E+04 0.30805681E+04 0.31299231E+04 0.31275640E+04 + 0.31275640E+04 0.31244541E+04 0.31244541E+04 0.31183979E+04 + 0.31183979E+04 0.31065691E+04 0.31065691E+04 0.30992529E+04 + 0.30992529E+04 0.30946580E+04 0.30946580E+04 0.30936631E+04 + 0.30936631E+04 0.30951951E+04 0.30951951E+04 0.30910710E+04 + 0.30910710E+04 0.30849500E+04 0.30849500E+04 0.30812800E+04 + 0.31960200E+04 0.31959871E+04 0.31959871E+04 0.31985610E+04 + 0.31985610E+04 0.31985920E+04 0.31985920E+04 0.31936909E+04 + 0.31936909E+04 0.31868850E+04 0.31868850E+04 0.31870559E+04 + 0.31870559E+04 0.31921221E+04 0.31921221E+04 0.31941130E+04 + 0.31941130E+04 0.31950969E+04 0.31950969E+04 0.32001799E+04 + 0.32001799E+04 0.32074980E+04 0.31859360E+04 0.31882891E+04 + 0.31882891E+04 0.31927781E+04 0.31927781E+04 0.31931050E+04 + 0.31931050E+04 0.31900061E+04 0.31900061E+04 0.31882830E+04 + 0.31882830E+04 0.31927839E+04 0.31927839E+04 0.31989819E+04 + 0.31989819E+04 0.32001941E+04 0.32001941E+04 0.32031670E+04 + 0.32031670E+04 0.32079509E+04 0.32079509E+04 0.32123579E+04 + 0.31859360E+04 0.31882891E+04 0.31882891E+04 0.31927781E+04 + 0.31927781E+04 0.31931050E+04 0.31931050E+04 0.31900061E+04 + 0.31900061E+04 0.31882830E+04 0.31882830E+04 0.31927839E+04 + 0.31927839E+04 0.31989819E+04 0.31989819E+04 0.32001941E+04 + 0.32001941E+04 0.32031670E+04 0.32031670E+04 0.32079509E+04 + 0.32079509E+04 0.32123579E+04 0.31777461E+04 0.31799231E+04 + 0.31799231E+04 0.31829541E+04 0.31829541E+04 0.31804690E+04 + 0.31804690E+04 0.31795520E+04 0.31795520E+04 0.31826780E+04 + 0.31826780E+04 0.31893440E+04 0.31893440E+04 0.31963040E+04 + 0.31963040E+04 0.32000029E+04 0.32000029E+04 0.32055300E+04 + 0.32055300E+04 0.32106780E+04 0.32106780E+04 0.32136721E+04 + 0.31777461E+04 0.31799231E+04 0.31799231E+04 0.31829541E+04 + 0.31829541E+04 0.31804690E+04 0.31804690E+04 0.31795520E+04 + 0.31795520E+04 0.31826780E+04 0.31826780E+04 0.31893440E+04 + 0.31893440E+04 0.31963040E+04 0.31963040E+04 0.32000029E+04 + 0.32000029E+04 0.32055300E+04 0.32055300E+04 0.32106780E+04 + 0.32106780E+04 0.32136721E+04 0.31676589E+04 0.31614500E+04 + 0.31614500E+04 0.31615620E+04 0.31615620E+04 0.31622510E+04 + 0.31622510E+04 0.31720620E+04 0.31720620E+04 0.31837639E+04 + 0.31837639E+04 0.31918230E+04 0.31918230E+04 0.31955779E+04 + 0.31955779E+04 0.31992109E+04 0.31992109E+04 0.32053689E+04 + 0.32053689E+04 0.32122629E+04 0.32122629E+04 0.32177009E+04 + 0.31676589E+04 0.31614500E+04 0.31614500E+04 0.31615620E+04 + 0.31615620E+04 0.31622510E+04 0.31622510E+04 0.31720620E+04 + 0.31720620E+04 0.31837639E+04 0.31837639E+04 0.31918230E+04 + 0.31918230E+04 0.31955779E+04 0.31955779E+04 0.31992109E+04 + 0.31992109E+04 0.32053689E+04 0.32053689E+04 0.32122629E+04 + 0.32122629E+04 0.32177009E+04 0.31716470E+04 0.31663960E+04 + 0.31663960E+04 0.31680640E+04 0.31680640E+04 0.31686279E+04 + 0.31686279E+04 0.31717700E+04 0.31717700E+04 0.31775969E+04 + 0.31775969E+04 0.31821980E+04 0.31821980E+04 0.31844331E+04 + 0.31844331E+04 0.31909241E+04 0.31909241E+04 0.32017310E+04 + 0.32017310E+04 0.32124150E+04 0.32124150E+04 0.32216250E+04 + 0.31716470E+04 0.31663960E+04 0.31663960E+04 0.31680640E+04 + 0.31680640E+04 0.31686279E+04 0.31686279E+04 0.31717700E+04 + 0.31717700E+04 0.31775969E+04 0.31775969E+04 0.31821980E+04 + 0.31821980E+04 0.31844331E+04 0.31844331E+04 0.31909241E+04 + 0.31909241E+04 0.32017310E+04 0.32017310E+04 0.32124150E+04 + 0.32124150E+04 0.32216250E+04 0.31855840E+04 0.31872939E+04 + 0.31872939E+04 0.31881179E+04 0.31881179E+04 0.31842939E+04 + 0.31842939E+04 0.31764861E+04 0.31764861E+04 0.31726311E+04 + 0.31726311E+04 0.31751919E+04 0.31751919E+04 0.31802690E+04 + 0.31802690E+04 0.31855801E+04 0.31855801E+04 0.31949780E+04 + 0.31949780E+04 0.32072520E+04 0.32072520E+04 0.32194250E+04 + 0.31855840E+04 0.31872939E+04 0.31872939E+04 0.31881179E+04 + 0.31881179E+04 0.31842939E+04 0.31842939E+04 0.31764861E+04 + 0.31764861E+04 0.31726311E+04 0.31726311E+04 0.31751919E+04 + 0.31751919E+04 0.31802690E+04 0.31802690E+04 0.31855801E+04 + 0.31855801E+04 0.31949780E+04 0.31949780E+04 0.32072520E+04 + 0.32072520E+04 0.32194250E+04 0.31839209E+04 0.31922380E+04 + 0.31922380E+04 0.31953579E+04 0.31953579E+04 0.31933020E+04 + 0.31933020E+04 0.31893601E+04 0.31893601E+04 0.31847310E+04 + 0.31847310E+04 0.31832371E+04 0.31832371E+04 0.31811450E+04 + 0.31811450E+04 0.31800281E+04 0.31800281E+04 0.31865620E+04 + 0.31865620E+04 0.31989519E+04 0.31989519E+04 0.32117661E+04 + 0.31839209E+04 0.31922380E+04 0.31922380E+04 0.31953579E+04 + 0.31953579E+04 0.31933020E+04 0.31933020E+04 0.31893601E+04 + 0.31893601E+04 0.31847310E+04 0.31847310E+04 0.31832371E+04 + 0.31832371E+04 0.31811450E+04 0.31811450E+04 0.31800281E+04 + 0.31800281E+04 0.31865620E+04 0.31865620E+04 0.31989519E+04 + 0.31989519E+04 0.32117661E+04 0.31819871E+04 0.31890911E+04 + 0.31890911E+04 0.31942739E+04 0.31942739E+04 0.31933430E+04 + 0.31933430E+04 0.31920669E+04 0.31920669E+04 0.31906270E+04 + 0.31906270E+04 0.31873330E+04 0.31873330E+04 0.31790049E+04 + 0.31790049E+04 0.31752271E+04 0.31752271E+04 0.31789041E+04 + 0.31789041E+04 0.31868069E+04 0.31868069E+04 0.31954609E+04 + 0.31819871E+04 0.31890911E+04 0.31890911E+04 0.31942739E+04 + 0.31942739E+04 0.31933430E+04 0.31933430E+04 0.31920669E+04 + 0.31920669E+04 0.31906270E+04 0.31906270E+04 0.31873330E+04 + 0.31873330E+04 0.31790049E+04 0.31790049E+04 0.31752271E+04 + 0.31752271E+04 0.31789041E+04 0.31789041E+04 0.31868069E+04 + 0.31868069E+04 0.31954609E+04 0.31907209E+04 0.31926169E+04 + 0.31926169E+04 0.31998149E+04 0.31998149E+04 0.31992251E+04 + 0.31992251E+04 0.31935649E+04 0.31935649E+04 0.31898950E+04 + 0.31898950E+04 0.31863320E+04 0.31863320E+04 0.31782161E+04 + 0.31782161E+04 0.31720210E+04 0.31720210E+04 0.31750061E+04 + 0.31750061E+04 0.31797380E+04 0.31797380E+04 0.31843550E+04 + 0.31907209E+04 0.31926169E+04 0.31926169E+04 0.31998149E+04 + 0.31998149E+04 0.31992251E+04 0.31992251E+04 0.31935649E+04 + 0.31935649E+04 0.31898950E+04 0.31898950E+04 0.31863320E+04 + 0.31863320E+04 0.31782161E+04 0.31782161E+04 0.31720210E+04 + 0.31720210E+04 0.31750061E+04 0.31750061E+04 0.31797380E+04 + 0.31797380E+04 0.31843550E+04 0.32015591E+04 0.32003301E+04 + 0.32003301E+04 0.32052471E+04 0.32052471E+04 0.32044021E+04 + 0.32044021E+04 0.31973701E+04 0.31973701E+04 0.31906780E+04 + 0.31906780E+04 0.31853989E+04 0.31853989E+04 0.31772949E+04 + 0.31772949E+04 0.31704861E+04 0.31704861E+04 0.31718459E+04 + 0.31718459E+04 0.31767300E+04 0.31767300E+04 0.31832981E+04 + 0.32015591E+04 0.32003301E+04 0.32003301E+04 0.32052471E+04 + 0.32052471E+04 0.32044021E+04 0.32044021E+04 0.31973701E+04 + 0.31973701E+04 0.31906780E+04 0.31906780E+04 0.31853989E+04 + 0.31853989E+04 0.31772949E+04 0.31772949E+04 0.31704861E+04 + 0.31704861E+04 0.31718459E+04 0.31718459E+04 0.31767300E+04 + 0.31767300E+04 0.31832981E+04 0.31979141E+04 0.31980029E+04 + 0.31980029E+04 0.32006980E+04 0.32006980E+04 0.31993931E+04 + 0.31993931E+04 0.31913650E+04 0.31913650E+04 0.31827900E+04 + 0.31827900E+04 0.31785100E+04 0.31785100E+04 0.31749709E+04 + 0.31749709E+04 0.31718330E+04 0.31718330E+04 0.31725129E+04 + 0.31725129E+04 0.31778870E+04 0.31778870E+04 0.31862810E+04 + 0.31979141E+04 0.31980029E+04 0.31980029E+04 0.32006980E+04 + 0.32006980E+04 0.31993931E+04 0.31993931E+04 0.31913650E+04 + 0.31913650E+04 0.31827900E+04 0.31827900E+04 0.31785100E+04 + 0.31785100E+04 0.31749709E+04 0.31749709E+04 0.31718330E+04 + 0.31718330E+04 0.31725129E+04 0.31725129E+04 0.31778870E+04 + 0.30490249E+04 0.30489890E+04 0.31919370E+04 0.31861621E+04 + 0.31861621E+04 0.31883979E+04 0.31883979E+04 0.31884409E+04 + 0.31884409E+04 0.31827129E+04 0.31827129E+04 0.31772561E+04 + 0.31772561E+04 0.31745740E+04 0.31745740E+04 0.31727141E+04 + 0.31727141E+04 0.31731660E+04 0.31731660E+04 0.31745210E+04 + 0.31745210E+04 0.31769070E+04 0.30538401E+04 0.30503521E+04 + 0.31919370E+04 0.31861621E+04 0.31861621E+04 0.31883979E+04 + 0.31883979E+04 0.31884409E+04 0.31884409E+04 0.31827129E+04 + 0.31827129E+04 0.31772561E+04 0.31772561E+04 0.31745740E+04 + 0.31745740E+04 0.31727141E+04 0.31727141E+04 0.31731660E+04 + 0.30847480E+04 0.30814641E+04 0.30814641E+04 0.30800410E+04 + 0.30538401E+04 0.30503521E+04 0.31948821E+04 0.31810339E+04 + 0.31810339E+04 0.31789150E+04 0.31789150E+04 0.31779939E+04 + 0.31779939E+04 0.31753330E+04 0.31753330E+04 0.31725259E+04 + 0.31725259E+04 0.31715991E+04 0.31715991E+04 0.31721140E+04 + 0.31721140E+04 0.31723120E+04 0.30839351E+04 0.30826631E+04 + 0.30826631E+04 0.30807480E+04 0.30533401E+04 0.30505549E+04 + 0.31948821E+04 0.31810339E+04 0.31810339E+04 0.31789150E+04 + 0.31789150E+04 0.31779939E+04 0.31779939E+04 0.31753330E+04 + 0.31753330E+04 0.31725259E+04 0.31725259E+04 0.31715991E+04 + 0.30966001E+04 0.30922380E+04 0.30922380E+04 0.30839351E+04 + 0.30839351E+04 0.30826631E+04 0.30826631E+04 0.30807480E+04 + 0.30533401E+04 0.30505549E+04 0.31951221E+04 0.31819971E+04 + 0.31819971E+04 0.31758940E+04 0.31758940E+04 0.31737490E+04 + 0.31737490E+04 0.31715271E+04 0.31715271E+04 0.31709810E+04 + 0.31709810E+04 0.31700530E+04 0.30981941E+04 0.30946941E+04 + 0.30946941E+04 0.30889561E+04 0.30889561E+04 0.30849250E+04 + 0.30849250E+04 0.30821890E+04 0.30536321E+04 0.30508411E+04 + 0.31951221E+04 0.31819971E+04 0.31819971E+04 0.31758940E+04 + 0.31758940E+04 0.31737490E+04 0.31737490E+04 0.31715271E+04 + 0.31058191E+04 0.31022410E+04 0.31022410E+04 0.30981941E+04 + 0.30981941E+04 0.30946941E+04 0.30946941E+04 0.30889561E+04 + 0.30889561E+04 0.30849250E+04 0.30849250E+04 0.30821890E+04 + 0.30536321E+04 0.30508411E+04 0.31920310E+04 0.31845940E+04 + 0.31845940E+04 0.31779409E+04 0.31779409E+04 0.31756479E+04 + 0.31756479E+04 0.31719021E+04 0.31073811E+04 0.31040830E+04 + 0.31040830E+04 0.31008491E+04 0.31008491E+04 0.30974170E+04 + 0.30974170E+04 0.30916931E+04 0.30916931E+04 0.30858359E+04 + 0.30858359E+04 0.30830371E+04 0.30537739E+04 0.30514390E+04 + 0.31920310E+04 0.31845940E+04 0.31845940E+04 0.31779409E+04 + 0.31169089E+04 0.31129460E+04 0.31129460E+04 0.31073811E+04 + 0.31073811E+04 0.31040830E+04 0.31040830E+04 0.31008491E+04 + 0.31008491E+04 0.30974170E+04 0.30974170E+04 0.30916931E+04 + 0.30916931E+04 0.30858359E+04 0.30858359E+04 0.30830371E+04 + 0.30537739E+04 0.30514390E+04 0.31914141E+04 0.31863989E+04 + 0.31863989E+04 0.31805081E+04 0.31201670E+04 0.31151841E+04 + 0.31151841E+04 0.31092180E+04 0.31092180E+04 0.31046040E+04 + 0.31046040E+04 0.30985879E+04 0.30985879E+04 0.30945811E+04 + 0.30945811E+04 0.30923059E+04 0.30923059E+04 0.30882471E+04 + 0.30882471E+04 0.30842300E+04 0.30544551E+04 0.30519761E+04 + 0.31289009E+04 0.31257000E+04 0.31257000E+04 0.31201670E+04 + 0.31201670E+04 0.31151841E+04 0.31151841E+04 0.31092180E+04 + 0.31092180E+04 0.31046040E+04 0.31046040E+04 0.30985879E+04 + 0.30985879E+04 0.30945811E+04 0.30945811E+04 0.30923059E+04 + 0.30923059E+04 0.30882471E+04 0.30882471E+04 0.30842300E+04 + 0.30842300E+04 0.30814370E+04 0.31306851E+04 0.31283501E+04 + 0.31283501E+04 0.31254570E+04 0.31254570E+04 0.31195549E+04 + 0.31195549E+04 0.31075120E+04 0.31075120E+04 0.31001450E+04 + 0.31001450E+04 0.30955320E+04 0.30955320E+04 0.30945559E+04 + 0.30945559E+04 0.30961731E+04 0.30961731E+04 0.30919629E+04 + 0.30919629E+04 0.30857739E+04 0.30857739E+04 0.30820920E+04 + 0.31960200E+04 0.31959871E+04 0.31959871E+04 0.31985610E+04 + 0.31985610E+04 0.31985920E+04 0.31985920E+04 0.31936909E+04 + 0.31936909E+04 0.31868850E+04 0.31868850E+04 0.31870559E+04 + 0.31870559E+04 0.31921221E+04 0.31921221E+04 0.31941130E+04 + 0.31941130E+04 0.31950969E+04 0.31950969E+04 0.32001799E+04 + 0.32001799E+04 0.32074980E+04 0.31859360E+04 0.31882891E+04 + 0.31882891E+04 0.31927781E+04 0.31927781E+04 0.31931050E+04 + 0.31931050E+04 0.31900061E+04 0.31900061E+04 0.31882830E+04 + 0.31882830E+04 0.31927839E+04 0.31927839E+04 0.31989819E+04 + 0.31989819E+04 0.32001941E+04 0.32001941E+04 0.32031670E+04 + 0.32031670E+04 0.32079509E+04 0.32079509E+04 0.32123579E+04 + 0.31859360E+04 0.31882891E+04 0.31882891E+04 0.31927781E+04 + 0.31927781E+04 0.31931050E+04 0.31931050E+04 0.31900061E+04 + 0.31900061E+04 0.31882830E+04 0.31882830E+04 0.31927839E+04 + 0.31927839E+04 0.31989819E+04 0.31989819E+04 0.32001941E+04 + 0.32001941E+04 0.32031670E+04 0.32031670E+04 0.32079509E+04 + 0.32079509E+04 0.32123579E+04 0.31777461E+04 0.31799231E+04 + 0.31799231E+04 0.31829541E+04 0.31829541E+04 0.31804690E+04 + 0.31804690E+04 0.31795520E+04 0.31795520E+04 0.31826780E+04 + 0.31826780E+04 0.31893440E+04 0.31893440E+04 0.31963040E+04 + 0.31963040E+04 0.32000029E+04 0.32000029E+04 0.32055300E+04 + 0.32055300E+04 0.32106780E+04 0.32106780E+04 0.32136721E+04 + 0.31777461E+04 0.31799231E+04 0.31799231E+04 0.31829541E+04 + 0.31829541E+04 0.31804690E+04 0.31804690E+04 0.31795520E+04 + 0.31795520E+04 0.31826780E+04 0.31826780E+04 0.31893440E+04 + 0.31893440E+04 0.31963040E+04 0.31963040E+04 0.32000029E+04 + 0.32000029E+04 0.32055300E+04 0.32055300E+04 0.32106780E+04 + 0.32106780E+04 0.32136721E+04 0.31676589E+04 0.31614500E+04 + 0.31614500E+04 0.31615620E+04 0.31615620E+04 0.31622510E+04 + 0.31622510E+04 0.31720620E+04 0.31720620E+04 0.31837639E+04 + 0.31837639E+04 0.31918230E+04 0.31918230E+04 0.31955779E+04 + 0.31955779E+04 0.31992109E+04 0.31992109E+04 0.32053689E+04 + 0.32053689E+04 0.32122629E+04 0.32122629E+04 0.32177009E+04 + 0.31676589E+04 0.31614500E+04 0.31614500E+04 0.31615620E+04 + 0.31615620E+04 0.31622510E+04 0.31622510E+04 0.31720620E+04 + 0.31720620E+04 0.31837639E+04 0.31837639E+04 0.31918230E+04 + 0.31918230E+04 0.31955779E+04 0.31955779E+04 0.31992109E+04 + 0.31992109E+04 0.32053689E+04 0.32053689E+04 0.32122629E+04 + 0.32122629E+04 0.32177009E+04 0.31716470E+04 0.31663960E+04 + 0.31663960E+04 0.31680640E+04 0.31680640E+04 0.31686279E+04 + 0.31686279E+04 0.31717700E+04 0.31717700E+04 0.31775969E+04 + 0.31775969E+04 0.31821980E+04 0.31821980E+04 0.31844331E+04 + 0.31844331E+04 0.31909241E+04 0.31909241E+04 0.32017310E+04 + 0.32017310E+04 0.32124150E+04 0.32124150E+04 0.32216250E+04 + 0.31716470E+04 0.31663960E+04 0.31663960E+04 0.31680640E+04 + 0.31680640E+04 0.31686279E+04 0.31686279E+04 0.31717700E+04 + 0.31717700E+04 0.31775969E+04 0.31775969E+04 0.31821980E+04 + 0.31821980E+04 0.31844331E+04 0.31844331E+04 0.31909241E+04 + 0.31909241E+04 0.32017310E+04 0.32017310E+04 0.32124150E+04 + 0.32124150E+04 0.32216250E+04 0.31855840E+04 0.31872939E+04 + 0.31872939E+04 0.31881179E+04 0.31881179E+04 0.31842939E+04 + 0.31842939E+04 0.31764861E+04 0.31764861E+04 0.31726311E+04 + 0.31726311E+04 0.31751919E+04 0.31751919E+04 0.31802690E+04 + 0.31802690E+04 0.31855801E+04 0.31855801E+04 0.31949780E+04 + 0.31949780E+04 0.32072520E+04 0.32072520E+04 0.32194250E+04 + 0.31855840E+04 0.31872939E+04 0.31872939E+04 0.31881179E+04 + 0.31881179E+04 0.31842939E+04 0.31842939E+04 0.31764861E+04 + 0.31764861E+04 0.31726311E+04 0.31726311E+04 0.31751919E+04 + 0.31751919E+04 0.31802690E+04 0.31802690E+04 0.31855801E+04 + 0.31855801E+04 0.31949780E+04 0.31949780E+04 0.32072520E+04 + 0.32072520E+04 0.32194250E+04 0.31839209E+04 0.31922380E+04 + 0.31922380E+04 0.31953579E+04 0.31953579E+04 0.31933020E+04 + 0.31933020E+04 0.31893601E+04 0.31893601E+04 0.31847310E+04 + 0.31847310E+04 0.31832371E+04 0.31832371E+04 0.31811450E+04 + 0.31811450E+04 0.31800281E+04 0.31800281E+04 0.31865620E+04 + 0.31865620E+04 0.31989519E+04 0.31989519E+04 0.32117661E+04 + 0.31839209E+04 0.31922380E+04 0.31922380E+04 0.31953579E+04 + 0.31953579E+04 0.31933020E+04 0.31933020E+04 0.31893601E+04 + 0.31893601E+04 0.31847310E+04 0.31847310E+04 0.31832371E+04 + 0.31832371E+04 0.31811450E+04 0.31811450E+04 0.31800281E+04 + 0.31800281E+04 0.31865620E+04 0.31865620E+04 0.31989519E+04 + 0.31989519E+04 0.32117661E+04 0.31819871E+04 0.31890911E+04 + 0.31890911E+04 0.31942739E+04 0.31942739E+04 0.31933430E+04 + 0.31933430E+04 0.31920669E+04 0.31920669E+04 0.31906270E+04 + 0.31906270E+04 0.31873330E+04 0.31873330E+04 0.31790049E+04 + 0.31790049E+04 0.31752271E+04 0.31752271E+04 0.31789041E+04 + 0.31789041E+04 0.31868069E+04 0.31868069E+04 0.31954609E+04 + 0.31819871E+04 0.31890911E+04 0.31890911E+04 0.31942739E+04 + 0.31942739E+04 0.31933430E+04 0.31933430E+04 0.31920669E+04 + 0.31920669E+04 0.31906270E+04 0.31906270E+04 0.31873330E+04 + 0.31873330E+04 0.31790049E+04 0.31790049E+04 0.31752271E+04 + 0.31752271E+04 0.31789041E+04 0.31789041E+04 0.31868069E+04 + 0.31868069E+04 0.31954609E+04 0.31907209E+04 0.31926169E+04 + 0.31926169E+04 0.31998149E+04 0.31998149E+04 0.31992251E+04 + 0.31992251E+04 0.31935649E+04 0.31935649E+04 0.31898950E+04 + 0.31898950E+04 0.31863320E+04 0.31863320E+04 0.31782161E+04 + 0.31782161E+04 0.31720210E+04 0.31720210E+04 0.31750061E+04 + 0.31750061E+04 0.31797380E+04 0.31797380E+04 0.31843550E+04 + 0.31907209E+04 0.31926169E+04 0.31926169E+04 0.31998149E+04 + 0.31998149E+04 0.31992251E+04 0.31992251E+04 0.31935649E+04 + 0.31935649E+04 0.31898950E+04 0.31898950E+04 0.31863320E+04 + 0.31863320E+04 0.31782161E+04 0.31782161E+04 0.31720210E+04 + 0.31720210E+04 0.31750061E+04 0.31750061E+04 0.31797380E+04 + 0.31797380E+04 0.31843550E+04 0.32015591E+04 0.32003301E+04 + 0.32003301E+04 0.32052471E+04 0.32052471E+04 0.32044021E+04 + 0.32044021E+04 0.31973701E+04 0.31973701E+04 0.31906780E+04 + 0.31906780E+04 0.31853989E+04 0.31853989E+04 0.31772949E+04 + 0.31772949E+04 0.31704861E+04 0.31704861E+04 0.31718459E+04 + 0.31718459E+04 0.31767300E+04 0.31767300E+04 0.31832981E+04 + 0.32015591E+04 0.32003301E+04 0.32003301E+04 0.32052471E+04 + 0.32052471E+04 0.32044021E+04 0.32044021E+04 0.31973701E+04 + 0.31973701E+04 0.31906780E+04 0.31906780E+04 0.31853989E+04 + 0.31853989E+04 0.31772949E+04 0.31772949E+04 0.31704861E+04 + 0.31704861E+04 0.31718459E+04 0.31718459E+04 0.31767300E+04 + 0.31767300E+04 0.31832981E+04 0.31979141E+04 0.31980029E+04 + 0.31980029E+04 0.32006980E+04 0.32006980E+04 0.31993931E+04 + 0.31993931E+04 0.31913650E+04 0.31913650E+04 0.31827900E+04 + 0.31827900E+04 0.31785100E+04 0.31785100E+04 0.31749709E+04 + 0.31749709E+04 0.31718330E+04 0.31718330E+04 0.31725129E+04 + 0.31725129E+04 0.31778870E+04 0.31778870E+04 0.31862810E+04 + 0.31979141E+04 0.31980029E+04 0.31980029E+04 0.32006980E+04 + 0.32006980E+04 0.31993931E+04 0.31993931E+04 0.31913650E+04 + 0.31913650E+04 0.31827900E+04 0.31827900E+04 0.31785100E+04 + 0.31785100E+04 0.31749709E+04 0.31749709E+04 0.31718330E+04 + 0.31718330E+04 0.31725129E+04 0.31725129E+04 0.31778870E+04 + 0.30490249E+04 0.30489890E+04 0.31919370E+04 0.31861621E+04 + 0.31861621E+04 0.31883979E+04 0.31883979E+04 0.31884409E+04 + 0.31884409E+04 0.31827129E+04 0.31827129E+04 0.31772561E+04 + 0.31772561E+04 0.31745740E+04 0.31745740E+04 0.31727141E+04 + 0.31727141E+04 0.31731660E+04 0.31731660E+04 0.31745210E+04 + 0.31745210E+04 0.31769070E+04 0.30538401E+04 0.30503521E+04 + 0.31919370E+04 0.31861621E+04 0.31861621E+04 0.31883979E+04 + 0.31883979E+04 0.31884409E+04 0.31884409E+04 0.31827129E+04 + 0.31827129E+04 0.31772561E+04 0.31772561E+04 0.31745740E+04 + 0.31745740E+04 0.31727141E+04 0.31727141E+04 0.31731660E+04 + 0.30847480E+04 0.30814641E+04 0.30814641E+04 0.30800410E+04 + 0.30538401E+04 0.30503521E+04 0.31948821E+04 0.31810339E+04 + 0.31810339E+04 0.31789150E+04 0.31789150E+04 0.31779939E+04 + 0.31779939E+04 0.31753330E+04 0.31753330E+04 0.31725259E+04 + 0.31725259E+04 0.31715991E+04 0.31715991E+04 0.31721140E+04 + 0.31721140E+04 0.31723120E+04 0.30839351E+04 0.30826631E+04 + 0.30826631E+04 0.30807480E+04 0.30533401E+04 0.30505549E+04 + 0.31948821E+04 0.31810339E+04 0.31810339E+04 0.31789150E+04 + 0.31789150E+04 0.31779939E+04 0.31779939E+04 0.31753330E+04 + 0.31753330E+04 0.31725259E+04 0.31725259E+04 0.31715991E+04 + 0.30966001E+04 0.30922380E+04 0.30922380E+04 0.30839351E+04 + 0.30839351E+04 0.30826631E+04 0.30826631E+04 0.30807480E+04 + 0.30533401E+04 0.30505549E+04 0.31951221E+04 0.31819971E+04 + 0.31819971E+04 0.31758940E+04 0.31758940E+04 0.31737490E+04 + 0.31737490E+04 0.31715271E+04 0.31715271E+04 0.31709810E+04 + 0.31709810E+04 0.31700530E+04 0.30981941E+04 0.30946941E+04 + 0.30946941E+04 0.30889561E+04 0.30889561E+04 0.30849250E+04 + 0.30849250E+04 0.30821890E+04 0.30536321E+04 0.30508411E+04 + 0.31951221E+04 0.31819971E+04 0.31819971E+04 0.31758940E+04 + 0.31758940E+04 0.31737490E+04 0.31737490E+04 0.31715271E+04 + 0.31058191E+04 0.31022410E+04 0.31022410E+04 0.30981941E+04 + 0.30981941E+04 0.30946941E+04 0.30946941E+04 0.30889561E+04 + 0.30889561E+04 0.30849250E+04 0.30849250E+04 0.30821890E+04 + 0.30536321E+04 0.30508411E+04 0.31920310E+04 0.31845940E+04 + 0.31845940E+04 0.31779409E+04 0.31779409E+04 0.31756479E+04 + 0.31756479E+04 0.31719021E+04 0.31073811E+04 0.31040830E+04 + 0.31040830E+04 0.31008491E+04 0.31008491E+04 0.30974170E+04 + 0.30974170E+04 0.30916931E+04 0.30916931E+04 0.30858359E+04 + 0.30858359E+04 0.30830371E+04 0.30537739E+04 0.30514390E+04 + 0.31920310E+04 0.31845940E+04 0.31845940E+04 0.31779409E+04 + 0.31169089E+04 0.31129460E+04 0.31129460E+04 0.31073811E+04 + 0.31073811E+04 0.31040830E+04 0.31040830E+04 0.31008491E+04 + 0.31008491E+04 0.30974170E+04 0.30974170E+04 0.30916931E+04 + 0.30916931E+04 0.30858359E+04 0.30858359E+04 0.30830371E+04 + 0.30537739E+04 0.30514390E+04 0.31914141E+04 0.31863989E+04 + 0.31863989E+04 0.31805081E+04 0.31201670E+04 0.31151841E+04 + 0.31151841E+04 0.31092180E+04 0.31092180E+04 0.31046040E+04 + 0.31046040E+04 0.30985879E+04 0.30985879E+04 0.30945811E+04 + 0.30945811E+04 0.30923059E+04 0.30923059E+04 0.30882471E+04 + 0.30882471E+04 0.30842300E+04 0.30544551E+04 0.30519761E+04 + 0.31289009E+04 0.31257000E+04 0.31257000E+04 0.31201670E+04 + 0.31201670E+04 0.31151841E+04 0.31151841E+04 0.31092180E+04 + 0.31092180E+04 0.31046040E+04 0.31046040E+04 0.30985879E+04 + 0.30985879E+04 0.30945811E+04 0.30945811E+04 0.30923059E+04 + 0.30923059E+04 0.30882471E+04 0.30882471E+04 0.30842300E+04 + 0.30842300E+04 0.30814370E+04 0.31306851E+04 0.31283501E+04 + 0.31283501E+04 0.31254570E+04 0.31254570E+04 0.31195549E+04 + 0.31195549E+04 0.31075120E+04 0.31075120E+04 0.31001450E+04 + 0.31001450E+04 0.30955320E+04 0.30955320E+04 0.30945559E+04 + 0.30945559E+04 0.30961731E+04 0.30961731E+04 0.30919629E+04 + 0.30919629E+04 0.30857739E+04 0.30857739E+04 0.30820920E+04 + 0.31978711E+04 0.31976741E+04 0.31976741E+04 0.32002729E+04 + 0.32002729E+04 0.32003970E+04 0.32003970E+04 0.31955581E+04 + 0.31955581E+04 0.31885801E+04 0.31885801E+04 0.31885471E+04 + 0.31885471E+04 0.31935459E+04 0.31935459E+04 0.31956531E+04 + 0.31956531E+04 0.31966780E+04 0.31966780E+04 0.32017329E+04 + 0.32017329E+04 0.32090559E+04 0.31878201E+04 0.31899670E+04 + 0.31899670E+04 0.31945181E+04 0.31945181E+04 0.31949729E+04 + 0.31949729E+04 0.31918669E+04 0.31918669E+04 0.31899570E+04 + 0.31899570E+04 0.31943149E+04 0.31943149E+04 0.32005410E+04 + 0.32005410E+04 0.32019170E+04 0.32019170E+04 0.32048220E+04 + 0.32048220E+04 0.32096001E+04 0.32096001E+04 0.32138721E+04 + 0.31878201E+04 0.31899670E+04 0.31899670E+04 0.31945181E+04 + 0.31945181E+04 0.31949729E+04 0.31949729E+04 0.31918669E+04 + 0.31918669E+04 0.31899570E+04 0.31899570E+04 0.31943149E+04 + 0.31943149E+04 0.32005410E+04 0.32005410E+04 0.32019170E+04 + 0.32019170E+04 0.32048220E+04 0.32048220E+04 0.32096001E+04 + 0.32096001E+04 0.32138721E+04 0.31796909E+04 0.31817229E+04 + 0.31817229E+04 0.31848450E+04 0.31848450E+04 0.31823740E+04 + 0.31823740E+04 0.31812109E+04 0.31812109E+04 0.31840830E+04 + 0.31840830E+04 0.31906531E+04 0.31906531E+04 0.31976809E+04 + 0.31976809E+04 0.32015049E+04 0.32015049E+04 0.32070181E+04 + 0.32070181E+04 0.32121941E+04 0.32121941E+04 0.32149500E+04 + 0.31796909E+04 0.31817229E+04 0.31817229E+04 0.31848450E+04 + 0.31848450E+04 0.31823740E+04 0.31823740E+04 0.31812109E+04 + 0.31812109E+04 0.31840830E+04 0.31840830E+04 0.31906531E+04 + 0.31906531E+04 0.31976809E+04 0.31976809E+04 0.32015049E+04 + 0.32015049E+04 0.32070181E+04 0.32070181E+04 0.32121941E+04 + 0.32121941E+04 0.32149500E+04 0.31692839E+04 0.31629751E+04 + 0.31629751E+04 0.31631030E+04 0.31631030E+04 0.31635071E+04 + 0.31635071E+04 0.31731189E+04 0.31731189E+04 0.31847849E+04 + 0.31847849E+04 0.31929290E+04 0.31929290E+04 0.31968240E+04 + 0.31968240E+04 0.32004880E+04 0.32004880E+04 0.32065181E+04 + 0.32065181E+04 0.32132739E+04 0.32132739E+04 0.32185210E+04 + 0.31692839E+04 0.31629751E+04 0.31629751E+04 0.31631030E+04 + 0.31631030E+04 0.31635071E+04 0.31635071E+04 0.31731189E+04 + 0.31731189E+04 0.31847849E+04 0.31847849E+04 0.31929290E+04 + 0.31929290E+04 0.31968240E+04 0.31968240E+04 0.32004880E+04 + 0.32004880E+04 0.32065181E+04 0.32065181E+04 0.32132739E+04 + 0.32132739E+04 0.32185210E+04 0.31724741E+04 0.31672900E+04 + 0.31672900E+04 0.31690371E+04 0.31690371E+04 0.31696370E+04 + 0.31696370E+04 0.31727749E+04 0.31727749E+04 0.31786069E+04 + 0.31786069E+04 0.31831980E+04 0.31831980E+04 0.31853240E+04 + 0.31853240E+04 0.31917380E+04 0.31917380E+04 0.32024990E+04 + 0.32024990E+04 0.32131421E+04 0.32131421E+04 0.32223279E+04 + 0.31724741E+04 0.31672900E+04 0.31672900E+04 0.31690371E+04 + 0.31690371E+04 0.31696370E+04 0.31696370E+04 0.31727749E+04 + 0.31727749E+04 0.31786069E+04 0.31786069E+04 0.31831980E+04 + 0.31831980E+04 0.31853240E+04 0.31853240E+04 0.31917380E+04 + 0.31917380E+04 0.32024990E+04 0.32024990E+04 0.32131421E+04 + 0.32131421E+04 0.32223279E+04 0.31864221E+04 0.31880779E+04 + 0.31880779E+04 0.31889460E+04 0.31889460E+04 0.31851960E+04 + 0.31851960E+04 0.31773450E+04 0.31773450E+04 0.31733679E+04 + 0.31733679E+04 0.31758589E+04 0.31758589E+04 0.31809971E+04 + 0.31809971E+04 0.31863010E+04 0.31863010E+04 0.31956040E+04 + 0.31956040E+04 0.32078811E+04 0.32078811E+04 0.32200710E+04 + 0.31864221E+04 0.31880779E+04 0.31880779E+04 0.31889460E+04 + 0.31889460E+04 0.31851960E+04 0.31851960E+04 0.31773450E+04 + 0.31773450E+04 0.31733679E+04 0.31733679E+04 0.31758589E+04 + 0.31758589E+04 0.31809971E+04 0.31809971E+04 0.31863010E+04 + 0.31863010E+04 0.31956040E+04 0.31956040E+04 0.32078811E+04 + 0.32078811E+04 0.32200710E+04 0.31846609E+04 0.31929529E+04 + 0.31929529E+04 0.31962029E+04 0.31962029E+04 0.31941941E+04 + 0.31941941E+04 0.31902009E+04 0.31902009E+04 0.31854370E+04 + 0.31854370E+04 0.31839341E+04 0.31839341E+04 0.31818821E+04 + 0.31818821E+04 0.31806531E+04 0.31806531E+04 0.31871089E+04 + 0.31871089E+04 0.31995950E+04 0.31995950E+04 0.32125481E+04 + 0.31846609E+04 0.31929529E+04 0.31929529E+04 0.31962029E+04 + 0.31962029E+04 0.31941941E+04 0.31941941E+04 0.31902009E+04 + 0.31902009E+04 0.31854370E+04 0.31854370E+04 0.31839341E+04 + 0.31839341E+04 0.31818821E+04 0.31818821E+04 0.31806531E+04 + 0.31806531E+04 0.31871089E+04 0.31871089E+04 0.31995950E+04 + 0.31995950E+04 0.32125481E+04 0.31826431E+04 0.31897500E+04 + 0.31897500E+04 0.31950520E+04 0.31950520E+04 0.31941489E+04 + 0.31941489E+04 0.31928450E+04 0.31928450E+04 0.31913701E+04 + 0.31913701E+04 0.31881431E+04 0.31881431E+04 0.31797759E+04 + 0.31797759E+04 0.31758970E+04 0.31758970E+04 0.31794829E+04 + 0.31794829E+04 0.31874380E+04 0.31874380E+04 0.31962471E+04 + 0.31826431E+04 0.31897500E+04 0.31897500E+04 0.31950520E+04 + 0.31950520E+04 0.31941489E+04 0.31941489E+04 0.31928450E+04 + 0.31928450E+04 0.31913701E+04 0.31913701E+04 0.31881431E+04 + 0.31881431E+04 0.31797759E+04 0.31797759E+04 0.31758970E+04 + 0.31758970E+04 0.31794829E+04 0.31794829E+04 0.31874380E+04 + 0.31874380E+04 0.31962471E+04 0.31914751E+04 0.31932300E+04 + 0.31932300E+04 0.32004900E+04 0.32004900E+04 0.32000291E+04 + 0.32000291E+04 0.31943269E+04 0.31943269E+04 0.31906279E+04 + 0.31906279E+04 0.31871169E+04 0.31871169E+04 0.31790259E+04 + 0.31790259E+04 0.31727029E+04 0.31727029E+04 0.31756021E+04 + 0.31756021E+04 0.31803220E+04 0.31803220E+04 0.31849451E+04 + 0.31914751E+04 0.31932300E+04 0.31932300E+04 0.32004900E+04 + 0.32004900E+04 0.32000291E+04 0.32000291E+04 0.31943269E+04 + 0.31943269E+04 0.31906279E+04 0.31906279E+04 0.31871169E+04 + 0.31871169E+04 0.31790259E+04 0.31790259E+04 0.31727029E+04 + 0.31727029E+04 0.31756021E+04 0.31756021E+04 0.31803220E+04 + 0.31803220E+04 0.31849451E+04 0.32025229E+04 0.32010430E+04 + 0.32010430E+04 0.32059551E+04 0.32059551E+04 0.32052361E+04 + 0.32052361E+04 0.31982219E+04 0.31982219E+04 0.31914819E+04 + 0.31914819E+04 0.31861870E+04 0.31861870E+04 0.31780779E+04 + 0.31780779E+04 0.31711741E+04 0.31711741E+04 0.31724680E+04 + 0.31724680E+04 0.31773931E+04 0.31773931E+04 0.31841560E+04 + 0.32025229E+04 0.32010430E+04 0.32010430E+04 0.32059551E+04 + 0.32059551E+04 0.32052361E+04 0.32052361E+04 0.31982219E+04 + 0.31982219E+04 0.31914819E+04 0.31914819E+04 0.31861870E+04 + 0.31861870E+04 0.31780779E+04 0.31780779E+04 0.31711741E+04 + 0.31711741E+04 0.31724680E+04 0.31724680E+04 0.31773931E+04 + 0.31773931E+04 0.31841560E+04 0.31988999E+04 0.31988279E+04 + 0.31988279E+04 0.32014919E+04 0.32014919E+04 0.32002930E+04 + 0.32002930E+04 0.31923181E+04 0.31923181E+04 0.31836709E+04 + 0.31836709E+04 0.31793220E+04 0.31793220E+04 0.31756970E+04 + 0.31756970E+04 0.31724771E+04 0.31724771E+04 0.31731360E+04 + 0.31731360E+04 0.31786250E+04 0.31786250E+04 0.31873049E+04 + 0.31988999E+04 0.31988279E+04 0.31988279E+04 0.32014919E+04 + 0.32014919E+04 0.32002930E+04 0.32002930E+04 0.31923181E+04 + 0.31923181E+04 0.31836709E+04 0.31836709E+04 0.31793220E+04 + 0.31793220E+04 0.31756970E+04 0.31756970E+04 0.31724771E+04 + 0.31724771E+04 0.31731360E+04 0.31731360E+04 0.31786250E+04 + 0.30495591E+04 0.30496069E+04 0.31929441E+04 0.31869951E+04 + 0.31869951E+04 0.31891550E+04 0.31891550E+04 0.31893191E+04 + 0.31893191E+04 0.31836899E+04 0.31836899E+04 0.31781499E+04 + 0.31781499E+04 0.31753760E+04 0.31753760E+04 0.31733931E+04 + 0.31733931E+04 0.31738501E+04 0.31738501E+04 0.31752090E+04 + 0.31752090E+04 0.31776121E+04 0.30543770E+04 0.30509839E+04 + 0.31929441E+04 0.31869951E+04 0.31869951E+04 0.31891550E+04 + 0.31891550E+04 0.31893191E+04 0.31893191E+04 0.31836899E+04 + 0.31836899E+04 0.31781499E+04 0.31781499E+04 0.31753760E+04 + 0.31753760E+04 0.31733931E+04 0.31733931E+04 0.31738501E+04 + 0.30856311E+04 0.30823750E+04 0.30823750E+04 0.30809810E+04 + 0.30543770E+04 0.30509839E+04 0.31960110E+04 0.31819871E+04 + 0.31819871E+04 0.31797649E+04 0.31797649E+04 0.31788359E+04 + 0.31788359E+04 0.31761880E+04 0.31761880E+04 0.31733491E+04 + 0.31733491E+04 0.31723730E+04 0.31723730E+04 0.31728201E+04 + 0.31728201E+04 0.31730520E+04 0.30847471E+04 0.30835620E+04 + 0.30835620E+04 0.30817100E+04 0.30538811E+04 0.30511350E+04 + 0.31960110E+04 0.31819871E+04 0.31819871E+04 0.31797649E+04 + 0.31797649E+04 0.31788359E+04 0.31788359E+04 0.31761880E+04 + 0.31761880E+04 0.31733491E+04 0.31733491E+04 0.31723730E+04 + 0.30975530E+04 0.30931980E+04 0.30931980E+04 0.30847471E+04 + 0.30847471E+04 0.30835620E+04 0.30835620E+04 0.30817100E+04 + 0.30538811E+04 0.30511350E+04 0.31963711E+04 0.31830320E+04 + 0.31830320E+04 0.31768311E+04 0.31768311E+04 0.31746069E+04 + 0.31746069E+04 0.31723569E+04 0.31723569E+04 0.31717820E+04 + 0.31717820E+04 0.31708689E+04 0.30991499E+04 0.30957061E+04 + 0.30957061E+04 0.30899399E+04 0.30899399E+04 0.30858550E+04 + 0.30858550E+04 0.30831421E+04 0.30541689E+04 0.30514121E+04 + 0.31963711E+04 0.31830320E+04 0.31830320E+04 0.31768311E+04 + 0.31768311E+04 0.31746069E+04 0.31746069E+04 0.31723569E+04 + 0.31067590E+04 0.31031931E+04 0.31031931E+04 0.30991499E+04 + 0.30991499E+04 0.30957061E+04 0.30957061E+04 0.30899399E+04 + 0.30899399E+04 0.30858550E+04 0.30858550E+04 0.30831421E+04 + 0.30541689E+04 0.30514121E+04 0.31929231E+04 0.31855090E+04 + 0.31855090E+04 0.31788140E+04 0.31788140E+04 0.31765471E+04 + 0.31765471E+04 0.31728201E+04 0.31083579E+04 0.31051079E+04 + 0.31051079E+04 0.31018311E+04 0.31018311E+04 0.30983640E+04 + 0.30983640E+04 0.30926741E+04 0.30926741E+04 0.30867410E+04 + 0.30867410E+04 0.30839751E+04 0.30543259E+04 0.30520349E+04 + 0.31929231E+04 0.31855090E+04 0.31855090E+04 0.31788140E+04 + 0.31178501E+04 0.31138999E+04 0.31138999E+04 0.31083579E+04 + 0.31083579E+04 0.31051079E+04 0.31051079E+04 0.31018311E+04 + 0.31018311E+04 0.30983640E+04 0.30983640E+04 0.30926741E+04 + 0.30926741E+04 0.30867410E+04 0.30867410E+04 0.30839751E+04 + 0.30543259E+04 0.30520349E+04 0.31922351E+04 0.31872710E+04 + 0.31872710E+04 0.31813789E+04 0.31211121E+04 0.31162200E+04 + 0.31162200E+04 0.31102771E+04 0.31102771E+04 0.31056060E+04 + 0.31056060E+04 0.30995320E+04 0.30995320E+04 0.30955610E+04 + 0.30955610E+04 0.30932920E+04 0.30932920E+04 0.30891560E+04 + 0.30891560E+04 0.30851130E+04 0.30550291E+04 0.30525681E+04 + 0.31296621E+04 0.31265120E+04 0.31265120E+04 0.31211121E+04 + 0.31211121E+04 0.31162200E+04 0.31162200E+04 0.31102771E+04 + 0.31102771E+04 0.31056060E+04 0.31056060E+04 0.30995320E+04 + 0.30995320E+04 0.30955610E+04 0.30955610E+04 0.30932920E+04 + 0.30932920E+04 0.30891560E+04 0.30891560E+04 0.30851130E+04 + 0.30851130E+04 0.30823049E+04 0.31314480E+04 0.31291360E+04 + 0.31291360E+04 0.31264590E+04 0.31264590E+04 0.31207119E+04 + 0.31207119E+04 0.31084541E+04 0.31084541E+04 0.31010359E+04 + 0.31010359E+04 0.30964060E+04 0.30964060E+04 0.30954500E+04 + 0.30954500E+04 0.30971509E+04 0.30971509E+04 0.30928550E+04 + 0.30928550E+04 0.30865979E+04 0.30865979E+04 0.30829050E+04 + 0.31978711E+04 0.31976741E+04 0.31976741E+04 0.32002729E+04 + 0.32002729E+04 0.32003970E+04 0.32003970E+04 0.31955581E+04 + 0.31955581E+04 0.31885801E+04 0.31885801E+04 0.31885471E+04 + 0.31885471E+04 0.31935459E+04 0.31935459E+04 0.31956531E+04 + 0.31956531E+04 0.31966780E+04 0.31966780E+04 0.32017329E+04 + 0.32017329E+04 0.32090559E+04 0.31878201E+04 0.31899670E+04 + 0.31899670E+04 0.31945181E+04 0.31945181E+04 0.31949729E+04 + 0.31949729E+04 0.31918669E+04 0.31918669E+04 0.31899570E+04 + 0.31899570E+04 0.31943149E+04 0.31943149E+04 0.32005410E+04 + 0.32005410E+04 0.32019170E+04 0.32019170E+04 0.32048220E+04 + 0.32048220E+04 0.32096001E+04 0.32096001E+04 0.32138721E+04 + 0.31878201E+04 0.31899670E+04 0.31899670E+04 0.31945181E+04 + 0.31945181E+04 0.31949729E+04 0.31949729E+04 0.31918669E+04 + 0.31918669E+04 0.31899570E+04 0.31899570E+04 0.31943149E+04 + 0.31943149E+04 0.32005410E+04 0.32005410E+04 0.32019170E+04 + 0.32019170E+04 0.32048220E+04 0.32048220E+04 0.32096001E+04 + 0.32096001E+04 0.32138721E+04 0.31796909E+04 0.31817229E+04 + 0.31817229E+04 0.31848450E+04 0.31848450E+04 0.31823740E+04 + 0.31823740E+04 0.31812109E+04 0.31812109E+04 0.31840830E+04 + 0.31840830E+04 0.31906531E+04 0.31906531E+04 0.31976809E+04 + 0.31976809E+04 0.32015049E+04 0.32015049E+04 0.32070181E+04 + 0.32070181E+04 0.32121941E+04 0.32121941E+04 0.32149500E+04 + 0.31796909E+04 0.31817229E+04 0.31817229E+04 0.31848450E+04 + 0.31848450E+04 0.31823740E+04 0.31823740E+04 0.31812109E+04 + 0.31812109E+04 0.31840830E+04 0.31840830E+04 0.31906531E+04 + 0.31906531E+04 0.31976809E+04 0.31976809E+04 0.32015049E+04 + 0.32015049E+04 0.32070181E+04 0.32070181E+04 0.32121941E+04 + 0.32121941E+04 0.32149500E+04 0.31692839E+04 0.31629751E+04 + 0.31629751E+04 0.31631030E+04 0.31631030E+04 0.31635071E+04 + 0.31635071E+04 0.31731189E+04 0.31731189E+04 0.31847849E+04 + 0.31847849E+04 0.31929290E+04 0.31929290E+04 0.31968240E+04 + 0.31968240E+04 0.32004880E+04 0.32004880E+04 0.32065181E+04 + 0.32065181E+04 0.32132739E+04 0.32132739E+04 0.32185210E+04 + 0.31692839E+04 0.31629751E+04 0.31629751E+04 0.31631030E+04 + 0.31631030E+04 0.31635071E+04 0.31635071E+04 0.31731189E+04 + 0.31731189E+04 0.31847849E+04 0.31847849E+04 0.31929290E+04 + 0.31929290E+04 0.31968240E+04 0.31968240E+04 0.32004880E+04 + 0.32004880E+04 0.32065181E+04 0.32065181E+04 0.32132739E+04 + 0.32132739E+04 0.32185210E+04 0.31724741E+04 0.31672900E+04 + 0.31672900E+04 0.31690371E+04 0.31690371E+04 0.31696370E+04 + 0.31696370E+04 0.31727749E+04 0.31727749E+04 0.31786069E+04 + 0.31786069E+04 0.31831980E+04 0.31831980E+04 0.31853240E+04 + 0.31853240E+04 0.31917380E+04 0.31917380E+04 0.32024990E+04 + 0.32024990E+04 0.32131421E+04 0.32131421E+04 0.32223279E+04 + 0.31724741E+04 0.31672900E+04 0.31672900E+04 0.31690371E+04 + 0.31690371E+04 0.31696370E+04 0.31696370E+04 0.31727749E+04 + 0.31727749E+04 0.31786069E+04 0.31786069E+04 0.31831980E+04 + 0.31831980E+04 0.31853240E+04 0.31853240E+04 0.31917380E+04 + 0.31917380E+04 0.32024990E+04 0.32024990E+04 0.32131421E+04 + 0.32131421E+04 0.32223279E+04 0.31864221E+04 0.31880779E+04 + 0.31880779E+04 0.31889460E+04 0.31889460E+04 0.31851960E+04 + 0.31851960E+04 0.31773450E+04 0.31773450E+04 0.31733679E+04 + 0.31733679E+04 0.31758589E+04 0.31758589E+04 0.31809971E+04 + 0.31809971E+04 0.31863010E+04 0.31863010E+04 0.31956040E+04 + 0.31956040E+04 0.32078811E+04 0.32078811E+04 0.32200710E+04 + 0.31864221E+04 0.31880779E+04 0.31880779E+04 0.31889460E+04 + 0.31889460E+04 0.31851960E+04 0.31851960E+04 0.31773450E+04 + 0.31773450E+04 0.31733679E+04 0.31733679E+04 0.31758589E+04 + 0.31758589E+04 0.31809971E+04 0.31809971E+04 0.31863010E+04 + 0.31863010E+04 0.31956040E+04 0.31956040E+04 0.32078811E+04 + 0.32078811E+04 0.32200710E+04 0.31846609E+04 0.31929529E+04 + 0.31929529E+04 0.31962029E+04 0.31962029E+04 0.31941941E+04 + 0.31941941E+04 0.31902009E+04 0.31902009E+04 0.31854370E+04 + 0.31854370E+04 0.31839341E+04 0.31839341E+04 0.31818821E+04 + 0.31818821E+04 0.31806531E+04 0.31806531E+04 0.31871089E+04 + 0.31871089E+04 0.31995950E+04 0.31995950E+04 0.32125481E+04 + 0.31846609E+04 0.31929529E+04 0.31929529E+04 0.31962029E+04 + 0.31962029E+04 0.31941941E+04 0.31941941E+04 0.31902009E+04 + 0.31902009E+04 0.31854370E+04 0.31854370E+04 0.31839341E+04 + 0.31839341E+04 0.31818821E+04 0.31818821E+04 0.31806531E+04 + 0.31806531E+04 0.31871089E+04 0.31871089E+04 0.31995950E+04 + 0.31995950E+04 0.32125481E+04 0.31826431E+04 0.31897500E+04 + 0.31897500E+04 0.31950520E+04 0.31950520E+04 0.31941489E+04 + 0.31941489E+04 0.31928450E+04 0.31928450E+04 0.31913701E+04 + 0.31913701E+04 0.31881431E+04 0.31881431E+04 0.31797759E+04 + 0.31797759E+04 0.31758970E+04 0.31758970E+04 0.31794829E+04 + 0.31794829E+04 0.31874380E+04 0.31874380E+04 0.31962471E+04 + 0.31826431E+04 0.31897500E+04 0.31897500E+04 0.31950520E+04 + 0.31950520E+04 0.31941489E+04 0.31941489E+04 0.31928450E+04 + 0.31928450E+04 0.31913701E+04 0.31913701E+04 0.31881431E+04 + 0.31881431E+04 0.31797759E+04 0.31797759E+04 0.31758970E+04 + 0.31758970E+04 0.31794829E+04 0.31794829E+04 0.31874380E+04 + 0.31874380E+04 0.31962471E+04 0.31914751E+04 0.31932300E+04 + 0.31932300E+04 0.32004900E+04 0.32004900E+04 0.32000291E+04 + 0.32000291E+04 0.31943269E+04 0.31943269E+04 0.31906279E+04 + 0.31906279E+04 0.31871169E+04 0.31871169E+04 0.31790259E+04 + 0.31790259E+04 0.31727029E+04 0.31727029E+04 0.31756021E+04 + 0.31756021E+04 0.31803220E+04 0.31803220E+04 0.31849451E+04 + 0.31914751E+04 0.31932300E+04 0.31932300E+04 0.32004900E+04 + 0.32004900E+04 0.32000291E+04 0.32000291E+04 0.31943269E+04 + 0.31943269E+04 0.31906279E+04 0.31906279E+04 0.31871169E+04 + 0.31871169E+04 0.31790259E+04 0.31790259E+04 0.31727029E+04 + 0.31727029E+04 0.31756021E+04 0.31756021E+04 0.31803220E+04 + 0.31803220E+04 0.31849451E+04 0.32025229E+04 0.32010430E+04 + 0.32010430E+04 0.32059551E+04 0.32059551E+04 0.32052361E+04 + 0.32052361E+04 0.31982219E+04 0.31982219E+04 0.31914819E+04 + 0.31914819E+04 0.31861870E+04 0.31861870E+04 0.31780779E+04 + 0.31780779E+04 0.31711741E+04 0.31711741E+04 0.31724680E+04 + 0.31724680E+04 0.31773931E+04 0.31773931E+04 0.31841560E+04 + 0.32025229E+04 0.32010430E+04 0.32010430E+04 0.32059551E+04 + 0.32059551E+04 0.32052361E+04 0.32052361E+04 0.31982219E+04 + 0.31982219E+04 0.31914819E+04 0.31914819E+04 0.31861870E+04 + 0.31861870E+04 0.31780779E+04 0.31780779E+04 0.31711741E+04 + 0.31711741E+04 0.31724680E+04 0.31724680E+04 0.31773931E+04 + 0.31773931E+04 0.31841560E+04 0.31988999E+04 0.31988279E+04 + 0.31988279E+04 0.32014919E+04 0.32014919E+04 0.32002930E+04 + 0.32002930E+04 0.31923181E+04 0.31923181E+04 0.31836709E+04 + 0.31836709E+04 0.31793220E+04 0.31793220E+04 0.31756970E+04 + 0.31756970E+04 0.31724771E+04 0.31724771E+04 0.31731360E+04 + 0.31731360E+04 0.31786250E+04 0.31786250E+04 0.31873049E+04 + 0.31988999E+04 0.31988279E+04 0.31988279E+04 0.32014919E+04 + 0.32014919E+04 0.32002930E+04 0.32002930E+04 0.31923181E+04 + 0.31923181E+04 0.31836709E+04 0.31836709E+04 0.31793220E+04 + 0.31793220E+04 0.31756970E+04 0.31756970E+04 0.31724771E+04 + 0.31724771E+04 0.31731360E+04 0.31731360E+04 0.31786250E+04 + 0.30495591E+04 0.30496069E+04 0.31929441E+04 0.31869951E+04 + 0.31869951E+04 0.31891550E+04 0.31891550E+04 0.31893191E+04 + 0.31893191E+04 0.31836899E+04 0.31836899E+04 0.31781499E+04 + 0.31781499E+04 0.31753760E+04 0.31753760E+04 0.31733931E+04 + 0.31733931E+04 0.31738501E+04 0.31738501E+04 0.31752090E+04 + 0.31752090E+04 0.31776121E+04 0.30543770E+04 0.30509839E+04 + 0.31929441E+04 0.31869951E+04 0.31869951E+04 0.31891550E+04 + 0.31891550E+04 0.31893191E+04 0.31893191E+04 0.31836899E+04 + 0.31836899E+04 0.31781499E+04 0.31781499E+04 0.31753760E+04 + 0.31753760E+04 0.31733931E+04 0.31733931E+04 0.31738501E+04 + 0.30856311E+04 0.30823750E+04 0.30823750E+04 0.30809810E+04 + 0.30543770E+04 0.30509839E+04 0.31960110E+04 0.31819871E+04 + 0.31819871E+04 0.31797649E+04 0.31797649E+04 0.31788359E+04 + 0.31788359E+04 0.31761880E+04 0.31761880E+04 0.31733491E+04 + 0.31733491E+04 0.31723730E+04 0.31723730E+04 0.31728201E+04 + 0.31728201E+04 0.31730520E+04 0.30847471E+04 0.30835620E+04 + 0.30835620E+04 0.30817100E+04 0.30538811E+04 0.30511350E+04 + 0.31960110E+04 0.31819871E+04 0.31819871E+04 0.31797649E+04 + 0.31797649E+04 0.31788359E+04 0.31788359E+04 0.31761880E+04 + 0.31761880E+04 0.31733491E+04 0.31733491E+04 0.31723730E+04 + 0.30975530E+04 0.30931980E+04 0.30931980E+04 0.30847471E+04 + 0.30847471E+04 0.30835620E+04 0.30835620E+04 0.30817100E+04 + 0.30538811E+04 0.30511350E+04 0.31963711E+04 0.31830320E+04 + 0.31830320E+04 0.31768311E+04 0.31768311E+04 0.31746069E+04 + 0.31746069E+04 0.31723569E+04 0.31723569E+04 0.31717820E+04 + 0.31717820E+04 0.31708689E+04 0.30991499E+04 0.30957061E+04 + 0.30957061E+04 0.30899399E+04 0.30899399E+04 0.30858550E+04 + 0.30858550E+04 0.30831421E+04 0.30541689E+04 0.30514121E+04 + 0.31963711E+04 0.31830320E+04 0.31830320E+04 0.31768311E+04 + 0.31768311E+04 0.31746069E+04 0.31746069E+04 0.31723569E+04 + 0.31067590E+04 0.31031931E+04 0.31031931E+04 0.30991499E+04 + 0.30991499E+04 0.30957061E+04 0.30957061E+04 0.30899399E+04 + 0.30899399E+04 0.30858550E+04 0.30858550E+04 0.30831421E+04 + 0.30541689E+04 0.30514121E+04 0.31929231E+04 0.31855090E+04 + 0.31855090E+04 0.31788140E+04 0.31788140E+04 0.31765471E+04 + 0.31765471E+04 0.31728201E+04 0.31083579E+04 0.31051079E+04 + 0.31051079E+04 0.31018311E+04 0.31018311E+04 0.30983640E+04 + 0.30983640E+04 0.30926741E+04 0.30926741E+04 0.30867410E+04 + 0.30867410E+04 0.30839751E+04 0.30543259E+04 0.30520349E+04 + 0.31929231E+04 0.31855090E+04 0.31855090E+04 0.31788140E+04 + 0.31178501E+04 0.31138999E+04 0.31138999E+04 0.31083579E+04 + 0.31083579E+04 0.31051079E+04 0.31051079E+04 0.31018311E+04 + 0.31018311E+04 0.30983640E+04 0.30983640E+04 0.30926741E+04 + 0.30926741E+04 0.30867410E+04 0.30867410E+04 0.30839751E+04 + 0.30543259E+04 0.30520349E+04 0.31922351E+04 0.31872710E+04 + 0.31872710E+04 0.31813789E+04 0.31211121E+04 0.31162200E+04 + 0.31162200E+04 0.31102771E+04 0.31102771E+04 0.31056060E+04 + 0.31056060E+04 0.30995320E+04 0.30995320E+04 0.30955610E+04 + 0.30955610E+04 0.30932920E+04 0.30932920E+04 0.30891560E+04 + 0.30891560E+04 0.30851130E+04 0.30550291E+04 0.30525681E+04 + 0.31296621E+04 0.31265120E+04 0.31265120E+04 0.31211121E+04 + 0.31211121E+04 0.31162200E+04 0.31162200E+04 0.31102771E+04 + 0.31102771E+04 0.31056060E+04 0.31056060E+04 0.30995320E+04 + 0.30995320E+04 0.30955610E+04 0.30955610E+04 0.30932920E+04 + 0.30932920E+04 0.30891560E+04 0.30891560E+04 0.30851130E+04 + 0.30851130E+04 0.30823049E+04 0.31314480E+04 0.31291360E+04 + 0.31291360E+04 0.31264590E+04 0.31264590E+04 0.31207119E+04 + 0.31207119E+04 0.31084541E+04 0.31084541E+04 0.31010359E+04 + 0.31010359E+04 0.30964060E+04 0.30964060E+04 0.30954500E+04 + 0.30954500E+04 0.30971509E+04 0.30971509E+04 0.30928550E+04 + 0.30928550E+04 0.30865979E+04 0.30865979E+04 0.30829050E+04 + 0.31997219E+04 0.31993601E+04 0.31993601E+04 0.32019851E+04 + 0.32019851E+04 0.32022019E+04 0.32022019E+04 0.31974250E+04 + 0.31974250E+04 0.31902749E+04 0.31902749E+04 0.31900371E+04 + 0.31900371E+04 0.31949700E+04 0.31949700E+04 0.31971931E+04 + 0.31971931E+04 0.31982600E+04 0.31982600E+04 0.32032859E+04 + 0.32032859E+04 0.32106130E+04 0.31897051E+04 0.31916450E+04 + 0.31916450E+04 0.31962571E+04 0.31962571E+04 0.31968401E+04 + 0.31968401E+04 0.31937290E+04 0.31937290E+04 0.31916311E+04 + 0.31916311E+04 0.31958459E+04 0.31958459E+04 0.32020991E+04 + 0.32020991E+04 0.32036399E+04 0.32036399E+04 0.32064771E+04 + 0.32064771E+04 0.32112480E+04 0.32112480E+04 0.32153850E+04 + 0.31897051E+04 0.31916450E+04 0.31916450E+04 0.31962571E+04 + 0.31962571E+04 0.31968401E+04 0.31968401E+04 0.31937290E+04 + 0.31937290E+04 0.31916311E+04 0.31916311E+04 0.31958459E+04 + 0.31958459E+04 0.32020991E+04 0.32020991E+04 0.32036399E+04 + 0.32036399E+04 0.32064771E+04 0.32064771E+04 0.32112480E+04 + 0.32112480E+04 0.32153850E+04 0.31816360E+04 0.31835229E+04 + 0.31835229E+04 0.31867361E+04 0.31867361E+04 0.31842781E+04 + 0.31842781E+04 0.31828701E+04 0.31828701E+04 0.31854871E+04 + 0.31854871E+04 0.31919629E+04 0.31919629E+04 0.31990581E+04 + 0.31990581E+04 0.32030061E+04 0.32030061E+04 0.32085049E+04 + 0.32085049E+04 0.32137100E+04 0.32137100E+04 0.32162290E+04 + 0.31816360E+04 0.31835229E+04 0.31835229E+04 0.31867361E+04 + 0.31867361E+04 0.31842781E+04 0.31842781E+04 0.31828701E+04 + 0.31828701E+04 0.31854871E+04 0.31854871E+04 0.31919629E+04 + 0.31919629E+04 0.31990581E+04 0.31990581E+04 0.32030061E+04 + 0.32030061E+04 0.32085049E+04 0.32085049E+04 0.32137100E+04 + 0.32137100E+04 0.32162290E+04 0.31709089E+04 0.31645010E+04 + 0.31645010E+04 0.31646440E+04 0.31646440E+04 0.31647639E+04 + 0.31647639E+04 0.31741760E+04 0.31741760E+04 0.31858059E+04 + 0.31858059E+04 0.31940349E+04 0.31940349E+04 0.31980710E+04 + 0.31980710E+04 0.32017639E+04 0.32017639E+04 0.32076660E+04 + 0.32076660E+04 0.32142849E+04 0.32142849E+04 0.32193420E+04 + 0.31709089E+04 0.31645010E+04 0.31645010E+04 0.31646440E+04 + 0.31646440E+04 0.31647639E+04 0.31647639E+04 0.31741760E+04 + 0.31741760E+04 0.31858059E+04 0.31858059E+04 0.31940349E+04 + 0.31940349E+04 0.31980710E+04 0.31980710E+04 0.32017639E+04 + 0.32017639E+04 0.32076660E+04 0.32076660E+04 0.32142849E+04 + 0.32142849E+04 0.32193420E+04 0.31733000E+04 0.31681841E+04 + 0.31681841E+04 0.31700100E+04 0.31700100E+04 0.31706450E+04 + 0.31706450E+04 0.31737810E+04 0.31737810E+04 0.31796179E+04 + 0.31796179E+04 0.31841970E+04 0.31841970E+04 0.31862161E+04 + 0.31862161E+04 0.31925520E+04 0.31925520E+04 0.32032671E+04 + 0.32032671E+04 0.32138701E+04 0.32138701E+04 0.32230300E+04 + 0.31733000E+04 0.31681841E+04 0.31681841E+04 0.31700100E+04 + 0.31700100E+04 0.31706450E+04 0.31706450E+04 0.31737810E+04 + 0.31737810E+04 0.31796179E+04 0.31796179E+04 0.31841970E+04 + 0.31841970E+04 0.31862161E+04 0.31862161E+04 0.31925520E+04 + 0.31925520E+04 0.32032671E+04 0.32032671E+04 0.32138701E+04 + 0.32138701E+04 0.32230300E+04 0.31872600E+04 0.31888621E+04 + 0.31888621E+04 0.31897729E+04 0.31897729E+04 0.31860959E+04 + 0.31860959E+04 0.31782051E+04 0.31782051E+04 0.31741060E+04 + 0.31741060E+04 0.31765249E+04 0.31765249E+04 0.31817241E+04 + 0.31817241E+04 0.31870210E+04 0.31870210E+04 0.31962310E+04 + 0.31962310E+04 0.32085100E+04 0.32085100E+04 0.32207170E+04 + 0.31872600E+04 0.31888621E+04 0.31888621E+04 0.31897729E+04 + 0.31897729E+04 0.31860959E+04 0.31860959E+04 0.31782051E+04 + 0.31782051E+04 0.31741060E+04 0.31741060E+04 0.31765249E+04 + 0.31765249E+04 0.31817241E+04 0.31817241E+04 0.31870210E+04 + 0.31870210E+04 0.31962310E+04 0.31962310E+04 0.32085100E+04 + 0.32085100E+04 0.32207170E+04 0.31853999E+04 0.31936680E+04 + 0.31936680E+04 0.31970481E+04 0.31970481E+04 0.31950859E+04 + 0.31950859E+04 0.31910430E+04 0.31910430E+04 0.31861440E+04 + 0.31861440E+04 0.31846311E+04 0.31846311E+04 0.31826201E+04 + 0.31826201E+04 0.31812781E+04 0.31812781E+04 0.31876550E+04 + 0.31876550E+04 0.32002390E+04 0.32002390E+04 0.32133301E+04 + 0.31853999E+04 0.31936680E+04 0.31936680E+04 0.31970481E+04 + 0.31970481E+04 0.31950859E+04 0.31950859E+04 0.31910430E+04 + 0.31910430E+04 0.31861440E+04 0.31861440E+04 0.31846311E+04 + 0.31846311E+04 0.31826201E+04 0.31826201E+04 0.31812781E+04 + 0.31812781E+04 0.31876550E+04 0.31876550E+04 0.32002390E+04 + 0.32002390E+04 0.32133301E+04 0.31832981E+04 0.31904099E+04 + 0.31904099E+04 0.31958301E+04 0.31958301E+04 0.31949561E+04 + 0.31949561E+04 0.31936250E+04 0.31936250E+04 0.31921130E+04 + 0.31921130E+04 0.31889529E+04 0.31889529E+04 0.31805481E+04 + 0.31805481E+04 0.31765669E+04 0.31765669E+04 0.31800620E+04 + 0.31800620E+04 0.31880701E+04 0.31880701E+04 0.31970320E+04 + 0.31832981E+04 0.31904099E+04 0.31904099E+04 0.31958301E+04 + 0.31958301E+04 0.31949561E+04 0.31949561E+04 0.31936250E+04 + 0.31936250E+04 0.31921130E+04 0.31921130E+04 0.31889529E+04 + 0.31889529E+04 0.31805481E+04 0.31805481E+04 0.31765669E+04 + 0.31765669E+04 0.31800620E+04 0.31800620E+04 0.31880701E+04 + 0.31880701E+04 0.31970320E+04 0.31922290E+04 0.31938420E+04 + 0.31938420E+04 0.32011650E+04 0.32011650E+04 0.32008320E+04 + 0.32008320E+04 0.31950891E+04 0.31950891E+04 0.31913621E+04 + 0.31913621E+04 0.31879021E+04 0.31879021E+04 0.31798359E+04 + 0.31798359E+04 0.31733860E+04 0.31733860E+04 0.31761980E+04 + 0.31761980E+04 0.31809050E+04 0.31809050E+04 0.31855349E+04 + 0.31922290E+04 0.31938420E+04 0.31938420E+04 0.32011650E+04 + 0.32011650E+04 0.32008320E+04 0.32008320E+04 0.31950891E+04 + 0.31950891E+04 0.31913621E+04 0.31913621E+04 0.31879021E+04 + 0.31879021E+04 0.31798359E+04 0.31798359E+04 0.31733860E+04 + 0.31733860E+04 0.31761980E+04 0.31761980E+04 0.31809050E+04 + 0.31809050E+04 0.31855349E+04 0.32034880E+04 0.32017581E+04 + 0.32017581E+04 0.32066621E+04 0.32066621E+04 0.32060701E+04 + 0.32060701E+04 0.31990740E+04 0.31990740E+04 0.31922859E+04 + 0.31922859E+04 0.31869741E+04 0.31869741E+04 0.31788611E+04 + 0.31788611E+04 0.31718611E+04 0.31718611E+04 0.31730891E+04 + 0.31730891E+04 0.31780569E+04 0.31780569E+04 0.31850139E+04 + 0.32034880E+04 0.32017581E+04 0.32017581E+04 0.32066621E+04 + 0.32066621E+04 0.32060701E+04 0.32060701E+04 0.31990740E+04 + 0.31990740E+04 0.31922859E+04 0.31922859E+04 0.31869741E+04 + 0.31869741E+04 0.31788611E+04 0.31788611E+04 0.31718611E+04 + 0.31718611E+04 0.31730891E+04 0.31730891E+04 0.31780569E+04 + 0.31780569E+04 0.31850139E+04 0.31998870E+04 0.31996541E+04 + 0.31996541E+04 0.32022859E+04 0.32022859E+04 0.32011931E+04 + 0.32011931E+04 0.31932720E+04 0.31932720E+04 0.31845510E+04 + 0.31845510E+04 0.31801331E+04 0.31801331E+04 0.31764221E+04 + 0.31764221E+04 0.31731201E+04 0.31731201E+04 0.31737590E+04 + 0.31737590E+04 0.31793630E+04 0.31793630E+04 0.31883301E+04 + 0.31998870E+04 0.31996541E+04 0.31996541E+04 0.32022859E+04 + 0.32022859E+04 0.32011931E+04 0.32011931E+04 0.31932720E+04 + 0.31932720E+04 0.31845510E+04 0.31845510E+04 0.31801331E+04 + 0.31801331E+04 0.31764221E+04 0.31764221E+04 0.31731201E+04 + 0.31731201E+04 0.31737590E+04 0.31737590E+04 0.31793630E+04 + 0.30500940E+04 0.30502261E+04 0.31939500E+04 0.31878291E+04 + 0.31878291E+04 0.31899121E+04 0.31899121E+04 0.31901970E+04 + 0.31901970E+04 0.31846680E+04 0.31846680E+04 0.31790439E+04 + 0.31790439E+04 0.31761790E+04 0.31761790E+04 0.31740730E+04 + 0.31740730E+04 0.31745330E+04 0.31745330E+04 0.31758970E+04 + 0.31758970E+04 0.31783159E+04 0.30549150E+04 0.30516169E+04 + 0.31939500E+04 0.31878291E+04 0.31878291E+04 0.31899121E+04 + 0.31899121E+04 0.31901970E+04 0.31901970E+04 0.31846680E+04 + 0.31846680E+04 0.31790439E+04 0.31790439E+04 0.31761790E+04 + 0.31761790E+04 0.31740730E+04 0.31740730E+04 0.31745330E+04 + 0.30865149E+04 0.30832849E+04 0.30832849E+04 0.30819199E+04 + 0.30549150E+04 0.30516169E+04 0.31971399E+04 0.31829409E+04 + 0.31829409E+04 0.31806150E+04 0.31806150E+04 0.31796780E+04 + 0.31796780E+04 0.31770430E+04 0.31770430E+04 0.31741721E+04 + 0.31741721E+04 0.31731460E+04 0.31731460E+04 0.31735259E+04 + 0.31735259E+04 0.31737920E+04 0.30855601E+04 0.30844600E+04 + 0.30844600E+04 0.30826721E+04 0.30544221E+04 0.30517151E+04 + 0.31971399E+04 0.31829409E+04 0.31829409E+04 0.31806150E+04 + 0.31806150E+04 0.31796780E+04 0.31796780E+04 0.31770430E+04 + 0.31770430E+04 0.31741721E+04 0.31741721E+04 0.31731460E+04 + 0.30985061E+04 0.30941580E+04 0.30941580E+04 0.30855601E+04 + 0.30855601E+04 0.30844600E+04 0.30844600E+04 0.30826721E+04 + 0.30544221E+04 0.30517151E+04 0.31976201E+04 0.31840669E+04 + 0.31840669E+04 0.31777671E+04 0.31777671E+04 0.31754651E+04 + 0.31754651E+04 0.31731880E+04 0.31731880E+04 0.31725830E+04 + 0.31725830E+04 0.31716851E+04 0.31001060E+04 0.30967190E+04 + 0.30967190E+04 0.30909241E+04 0.30909241E+04 0.30867849E+04 + 0.30867849E+04 0.30840940E+04 0.30547061E+04 0.30519829E+04 + 0.31976201E+04 0.31840669E+04 0.31840669E+04 0.31777671E+04 + 0.31777671E+04 0.31754651E+04 0.31754651E+04 0.31731880E+04 + 0.31076990E+04 0.31041460E+04 0.31041460E+04 0.31001060E+04 + 0.31001060E+04 0.30967190E+04 0.30967190E+04 0.30909241E+04 + 0.30909241E+04 0.30867849E+04 0.30867849E+04 0.30840940E+04 + 0.30547061E+04 0.30519829E+04 0.31938159E+04 0.31864250E+04 + 0.31864250E+04 0.31796870E+04 0.31796870E+04 0.31774460E+04 + 0.31774460E+04 0.31737380E+04 0.31093359E+04 0.31061331E+04 + 0.31061331E+04 0.31028130E+04 0.31028130E+04 0.30993101E+04 + 0.30993101E+04 0.30936550E+04 0.30936550E+04 0.30876460E+04 + 0.30876460E+04 0.30849141E+04 0.30548770E+04 0.30526311E+04 + 0.31938159E+04 0.31864250E+04 0.31864250E+04 0.31796870E+04 + 0.31187900E+04 0.31148540E+04 0.31148540E+04 0.31093359E+04 + 0.31093359E+04 0.31061331E+04 0.31061331E+04 0.31028130E+04 + 0.31028130E+04 0.30993101E+04 0.30993101E+04 0.30936550E+04 + 0.30936550E+04 0.30876460E+04 0.30876460E+04 0.30849141E+04 + 0.30548770E+04 0.30526311E+04 0.31930569E+04 0.31881421E+04 + 0.31881421E+04 0.31822510E+04 0.31220559E+04 0.31172561E+04 + 0.31172561E+04 0.31113369E+04 0.31113369E+04 0.31066089E+04 + 0.31066089E+04 0.31004751E+04 0.31004751E+04 0.30965410E+04 + 0.30965410E+04 0.30942781E+04 0.30942781E+04 0.30900630E+04 + 0.30900630E+04 0.30859951E+04 0.30556030E+04 0.30531589E+04 + 0.31304231E+04 0.31273240E+04 0.31273240E+04 0.31220559E+04 + 0.31220559E+04 0.31172561E+04 0.31172561E+04 0.31113369E+04 + 0.31113369E+04 0.31066089E+04 0.31066089E+04 0.31004751E+04 + 0.31004751E+04 0.30965410E+04 0.30965410E+04 0.30942781E+04 + 0.30942781E+04 0.30900630E+04 0.30900630E+04 0.30859951E+04 + 0.30859951E+04 0.30831731E+04 0.31322109E+04 0.31299221E+04 + 0.31299221E+04 0.31274619E+04 0.31274619E+04 0.31218689E+04 + 0.31218689E+04 0.31093970E+04 0.31093970E+04 0.31019270E+04 + 0.31019270E+04 0.30972810E+04 0.30972810E+04 0.30963440E+04 + 0.30963440E+04 0.30981289E+04 0.30981289E+04 0.30937471E+04 + 0.30937471E+04 0.30874221E+04 0.30874221E+04 0.30837170E+04 + 0.31997219E+04 0.31993601E+04 0.31993601E+04 0.32019851E+04 + 0.32019851E+04 0.32022019E+04 0.32022019E+04 0.31974250E+04 + 0.31974250E+04 0.31902749E+04 0.31902749E+04 0.31900371E+04 + 0.31900371E+04 0.31949700E+04 0.31949700E+04 0.31971931E+04 + 0.31971931E+04 0.31982600E+04 0.31982600E+04 0.32032859E+04 + 0.32032859E+04 0.32106130E+04 0.31897051E+04 0.31916450E+04 + 0.31916450E+04 0.31962571E+04 0.31962571E+04 0.31968401E+04 + 0.31968401E+04 0.31937290E+04 0.31937290E+04 0.31916311E+04 + 0.31916311E+04 0.31958459E+04 0.31958459E+04 0.32020991E+04 + 0.32020991E+04 0.32036399E+04 0.32036399E+04 0.32064771E+04 + 0.32064771E+04 0.32112480E+04 0.32112480E+04 0.32153850E+04 + 0.31897051E+04 0.31916450E+04 0.31916450E+04 0.31962571E+04 + 0.31962571E+04 0.31968401E+04 0.31968401E+04 0.31937290E+04 + 0.31937290E+04 0.31916311E+04 0.31916311E+04 0.31958459E+04 + 0.31958459E+04 0.32020991E+04 0.32020991E+04 0.32036399E+04 + 0.32036399E+04 0.32064771E+04 0.32064771E+04 0.32112480E+04 + 0.32112480E+04 0.32153850E+04 0.31816360E+04 0.31835229E+04 + 0.31835229E+04 0.31867361E+04 0.31867361E+04 0.31842781E+04 + 0.31842781E+04 0.31828701E+04 0.31828701E+04 0.31854871E+04 + 0.31854871E+04 0.31919629E+04 0.31919629E+04 0.31990581E+04 + 0.31990581E+04 0.32030061E+04 0.32030061E+04 0.32085049E+04 + 0.32085049E+04 0.32137100E+04 0.32137100E+04 0.32162290E+04 + 0.31816360E+04 0.31835229E+04 0.31835229E+04 0.31867361E+04 + 0.31867361E+04 0.31842781E+04 0.31842781E+04 0.31828701E+04 + 0.31828701E+04 0.31854871E+04 0.31854871E+04 0.31919629E+04 + 0.31919629E+04 0.31990581E+04 0.31990581E+04 0.32030061E+04 + 0.32030061E+04 0.32085049E+04 0.32085049E+04 0.32137100E+04 + 0.32137100E+04 0.32162290E+04 0.31709089E+04 0.31645010E+04 + 0.31645010E+04 0.31646440E+04 0.31646440E+04 0.31647639E+04 + 0.31647639E+04 0.31741760E+04 0.31741760E+04 0.31858059E+04 + 0.31858059E+04 0.31940349E+04 0.31940349E+04 0.31980710E+04 + 0.31980710E+04 0.32017639E+04 0.32017639E+04 0.32076660E+04 + 0.32076660E+04 0.32142849E+04 0.32142849E+04 0.32193420E+04 + 0.31709089E+04 0.31645010E+04 0.31645010E+04 0.31646440E+04 + 0.31646440E+04 0.31647639E+04 0.31647639E+04 0.31741760E+04 + 0.31741760E+04 0.31858059E+04 0.31858059E+04 0.31940349E+04 + 0.31940349E+04 0.31980710E+04 0.31980710E+04 0.32017639E+04 + 0.32017639E+04 0.32076660E+04 0.32076660E+04 0.32142849E+04 + 0.32142849E+04 0.32193420E+04 0.31733000E+04 0.31681841E+04 + 0.31681841E+04 0.31700100E+04 0.31700100E+04 0.31706450E+04 + 0.31706450E+04 0.31737810E+04 0.31737810E+04 0.31796179E+04 + 0.31796179E+04 0.31841970E+04 0.31841970E+04 0.31862161E+04 + 0.31862161E+04 0.31925520E+04 0.31925520E+04 0.32032671E+04 + 0.32032671E+04 0.32138701E+04 0.32138701E+04 0.32230300E+04 + 0.31733000E+04 0.31681841E+04 0.31681841E+04 0.31700100E+04 + 0.31700100E+04 0.31706450E+04 0.31706450E+04 0.31737810E+04 + 0.31737810E+04 0.31796179E+04 0.31796179E+04 0.31841970E+04 + 0.31841970E+04 0.31862161E+04 0.31862161E+04 0.31925520E+04 + 0.31925520E+04 0.32032671E+04 0.32032671E+04 0.32138701E+04 + 0.32138701E+04 0.32230300E+04 0.31872600E+04 0.31888621E+04 + 0.31888621E+04 0.31897729E+04 0.31897729E+04 0.31860959E+04 + 0.31860959E+04 0.31782051E+04 0.31782051E+04 0.31741060E+04 + 0.31741060E+04 0.31765249E+04 0.31765249E+04 0.31817241E+04 + 0.31817241E+04 0.31870210E+04 0.31870210E+04 0.31962310E+04 + 0.31962310E+04 0.32085100E+04 0.32085100E+04 0.32207170E+04 + 0.31872600E+04 0.31888621E+04 0.31888621E+04 0.31897729E+04 + 0.31897729E+04 0.31860959E+04 0.31860959E+04 0.31782051E+04 + 0.31782051E+04 0.31741060E+04 0.31741060E+04 0.31765249E+04 + 0.31765249E+04 0.31817241E+04 0.31817241E+04 0.31870210E+04 + 0.31870210E+04 0.31962310E+04 0.31962310E+04 0.32085100E+04 + 0.32085100E+04 0.32207170E+04 0.31853999E+04 0.31936680E+04 + 0.31936680E+04 0.31970481E+04 0.31970481E+04 0.31950859E+04 + 0.31950859E+04 0.31910430E+04 0.31910430E+04 0.31861440E+04 + 0.31861440E+04 0.31846311E+04 0.31846311E+04 0.31826201E+04 + 0.31826201E+04 0.31812781E+04 0.31812781E+04 0.31876550E+04 + 0.31876550E+04 0.32002390E+04 0.32002390E+04 0.32133301E+04 + 0.31853999E+04 0.31936680E+04 0.31936680E+04 0.31970481E+04 + 0.31970481E+04 0.31950859E+04 0.31950859E+04 0.31910430E+04 + 0.31910430E+04 0.31861440E+04 0.31861440E+04 0.31846311E+04 + 0.31846311E+04 0.31826201E+04 0.31826201E+04 0.31812781E+04 + 0.31812781E+04 0.31876550E+04 0.31876550E+04 0.32002390E+04 + 0.32002390E+04 0.32133301E+04 0.31832981E+04 0.31904099E+04 + 0.31904099E+04 0.31958301E+04 0.31958301E+04 0.31949561E+04 + 0.31949561E+04 0.31936250E+04 0.31936250E+04 0.31921130E+04 + 0.31921130E+04 0.31889529E+04 0.31889529E+04 0.31805481E+04 + 0.31805481E+04 0.31765669E+04 0.31765669E+04 0.31800620E+04 + 0.31800620E+04 0.31880701E+04 0.31880701E+04 0.31970320E+04 + 0.31832981E+04 0.31904099E+04 0.31904099E+04 0.31958301E+04 + 0.31958301E+04 0.31949561E+04 0.31949561E+04 0.31936250E+04 + 0.31936250E+04 0.31921130E+04 0.31921130E+04 0.31889529E+04 + 0.31889529E+04 0.31805481E+04 0.31805481E+04 0.31765669E+04 + 0.31765669E+04 0.31800620E+04 0.31800620E+04 0.31880701E+04 + 0.31880701E+04 0.31970320E+04 0.31922290E+04 0.31938420E+04 + 0.31938420E+04 0.32011650E+04 0.32011650E+04 0.32008320E+04 + 0.32008320E+04 0.31950891E+04 0.31950891E+04 0.31913621E+04 + 0.31913621E+04 0.31879021E+04 0.31879021E+04 0.31798359E+04 + 0.31798359E+04 0.31733860E+04 0.31733860E+04 0.31761980E+04 + 0.31761980E+04 0.31809050E+04 0.31809050E+04 0.31855349E+04 + 0.31922290E+04 0.31938420E+04 0.31938420E+04 0.32011650E+04 + 0.32011650E+04 0.32008320E+04 0.32008320E+04 0.31950891E+04 + 0.31950891E+04 0.31913621E+04 0.31913621E+04 0.31879021E+04 + 0.31879021E+04 0.31798359E+04 0.31798359E+04 0.31733860E+04 + 0.31733860E+04 0.31761980E+04 0.31761980E+04 0.31809050E+04 + 0.31809050E+04 0.31855349E+04 0.32034880E+04 0.32017581E+04 + 0.32017581E+04 0.32066621E+04 0.32066621E+04 0.32060701E+04 + 0.32060701E+04 0.31990740E+04 0.31990740E+04 0.31922859E+04 + 0.31922859E+04 0.31869741E+04 0.31869741E+04 0.31788611E+04 + 0.31788611E+04 0.31718611E+04 0.31718611E+04 0.31730891E+04 + 0.31730891E+04 0.31780569E+04 0.31780569E+04 0.31850139E+04 + 0.32034880E+04 0.32017581E+04 0.32017581E+04 0.32066621E+04 + 0.32066621E+04 0.32060701E+04 0.32060701E+04 0.31990740E+04 + 0.31990740E+04 0.31922859E+04 0.31922859E+04 0.31869741E+04 + 0.31869741E+04 0.31788611E+04 0.31788611E+04 0.31718611E+04 + 0.31718611E+04 0.31730891E+04 0.31730891E+04 0.31780569E+04 + 0.31780569E+04 0.31850139E+04 0.31998870E+04 0.31996541E+04 + 0.31996541E+04 0.32022859E+04 0.32022859E+04 0.32011931E+04 + 0.32011931E+04 0.31932720E+04 0.31932720E+04 0.31845510E+04 + 0.31845510E+04 0.31801331E+04 0.31801331E+04 0.31764221E+04 + 0.31764221E+04 0.31731201E+04 0.31731201E+04 0.31737590E+04 + 0.31737590E+04 0.31793630E+04 0.31793630E+04 0.31883301E+04 + 0.31998870E+04 0.31996541E+04 0.31996541E+04 0.32022859E+04 + 0.32022859E+04 0.32011931E+04 0.32011931E+04 0.31932720E+04 + 0.31932720E+04 0.31845510E+04 0.31845510E+04 0.31801331E+04 + 0.31801331E+04 0.31764221E+04 0.31764221E+04 0.31731201E+04 + 0.31731201E+04 0.31737590E+04 0.31737590E+04 0.31793630E+04 + 0.30500940E+04 0.30502261E+04 0.31939500E+04 0.31878291E+04 + 0.31878291E+04 0.31899121E+04 0.31899121E+04 0.31901970E+04 + 0.31901970E+04 0.31846680E+04 0.31846680E+04 0.31790439E+04 + 0.31790439E+04 0.31761790E+04 0.31761790E+04 0.31740730E+04 + 0.31740730E+04 0.31745330E+04 0.31745330E+04 0.31758970E+04 + 0.31758970E+04 0.31783159E+04 0.30549150E+04 0.30516169E+04 + 0.31939500E+04 0.31878291E+04 0.31878291E+04 0.31899121E+04 + 0.31899121E+04 0.31901970E+04 0.31901970E+04 0.31846680E+04 + 0.31846680E+04 0.31790439E+04 0.31790439E+04 0.31761790E+04 + 0.31761790E+04 0.31740730E+04 0.31740730E+04 0.31745330E+04 + 0.30865149E+04 0.30832849E+04 0.30832849E+04 0.30819199E+04 + 0.30549150E+04 0.30516169E+04 0.31971399E+04 0.31829409E+04 + 0.31829409E+04 0.31806150E+04 0.31806150E+04 0.31796780E+04 + 0.31796780E+04 0.31770430E+04 0.31770430E+04 0.31741721E+04 + 0.31741721E+04 0.31731460E+04 0.31731460E+04 0.31735259E+04 + 0.31735259E+04 0.31737920E+04 0.30855601E+04 0.30844600E+04 + 0.30844600E+04 0.30826721E+04 0.30544221E+04 0.30517151E+04 + 0.31971399E+04 0.31829409E+04 0.31829409E+04 0.31806150E+04 + 0.31806150E+04 0.31796780E+04 0.31796780E+04 0.31770430E+04 + 0.31770430E+04 0.31741721E+04 0.31741721E+04 0.31731460E+04 + 0.30985061E+04 0.30941580E+04 0.30941580E+04 0.30855601E+04 + 0.30855601E+04 0.30844600E+04 0.30844600E+04 0.30826721E+04 + 0.30544221E+04 0.30517151E+04 0.31976201E+04 0.31840669E+04 + 0.31840669E+04 0.31777671E+04 0.31777671E+04 0.31754651E+04 + 0.31754651E+04 0.31731880E+04 0.31731880E+04 0.31725830E+04 + 0.31725830E+04 0.31716851E+04 0.31001060E+04 0.30967190E+04 + 0.30967190E+04 0.30909241E+04 0.30909241E+04 0.30867849E+04 + 0.30867849E+04 0.30840940E+04 0.30547061E+04 0.30519829E+04 + 0.31976201E+04 0.31840669E+04 0.31840669E+04 0.31777671E+04 + 0.31777671E+04 0.31754651E+04 0.31754651E+04 0.31731880E+04 + 0.31076990E+04 0.31041460E+04 0.31041460E+04 0.31001060E+04 + 0.31001060E+04 0.30967190E+04 0.30967190E+04 0.30909241E+04 + 0.30909241E+04 0.30867849E+04 0.30867849E+04 0.30840940E+04 + 0.30547061E+04 0.30519829E+04 0.31938159E+04 0.31864250E+04 + 0.31864250E+04 0.31796870E+04 0.31796870E+04 0.31774460E+04 + 0.31774460E+04 0.31737380E+04 0.31093359E+04 0.31061331E+04 + 0.31061331E+04 0.31028130E+04 0.31028130E+04 0.30993101E+04 + 0.30993101E+04 0.30936550E+04 0.30936550E+04 0.30876460E+04 + 0.30876460E+04 0.30849141E+04 0.30548770E+04 0.30526311E+04 + 0.31938159E+04 0.31864250E+04 0.31864250E+04 0.31796870E+04 + 0.31187900E+04 0.31148540E+04 0.31148540E+04 0.31093359E+04 + 0.31093359E+04 0.31061331E+04 0.31061331E+04 0.31028130E+04 + 0.31028130E+04 0.30993101E+04 0.30993101E+04 0.30936550E+04 + 0.30936550E+04 0.30876460E+04 0.30876460E+04 0.30849141E+04 + 0.30548770E+04 0.30526311E+04 0.31930569E+04 0.31881421E+04 + 0.31881421E+04 0.31822510E+04 0.31220559E+04 0.31172561E+04 + 0.31172561E+04 0.31113369E+04 0.31113369E+04 0.31066089E+04 + 0.31066089E+04 0.31004751E+04 0.31004751E+04 0.30965410E+04 + 0.30965410E+04 0.30942781E+04 0.30942781E+04 0.30900630E+04 + 0.30900630E+04 0.30859951E+04 0.30556030E+04 0.30531589E+04 + 0.31304231E+04 0.31273240E+04 0.31273240E+04 0.31220559E+04 + 0.31220559E+04 0.31172561E+04 0.31172561E+04 0.31113369E+04 + 0.31113369E+04 0.31066089E+04 0.31066089E+04 0.31004751E+04 + 0.31004751E+04 0.30965410E+04 0.30965410E+04 0.30942781E+04 + 0.30942781E+04 0.30900630E+04 0.30900630E+04 0.30859951E+04 + 0.30859951E+04 0.30831731E+04 0.31322109E+04 0.31299221E+04 + 0.31299221E+04 0.31274619E+04 0.31274619E+04 0.31218689E+04 + 0.31218689E+04 0.31093970E+04 0.31093970E+04 0.31019270E+04 + 0.31019270E+04 0.30972810E+04 0.30972810E+04 0.30963440E+04 + 0.30963440E+04 0.30981289E+04 0.30981289E+04 0.30937471E+04 + 0.30937471E+04 0.30874221E+04 0.30874221E+04 0.30837170E+04 + 0.32015730E+04 0.32010471E+04 0.32010471E+04 0.32036970E+04 + 0.32036970E+04 0.32040071E+04 0.32040071E+04 0.31992920E+04 + 0.31992920E+04 0.31919700E+04 0.31919700E+04 0.31915271E+04 + 0.31915271E+04 0.31963940E+04 0.31963940E+04 0.31987329E+04 + 0.31987329E+04 0.31998411E+04 0.31998411E+04 0.32048391E+04 + 0.32048391E+04 0.32121709E+04 0.31915891E+04 0.31933230E+04 + 0.31933230E+04 0.31979971E+04 0.31979971E+04 0.31987070E+04 + 0.31987070E+04 0.31955911E+04 0.31955911E+04 0.31933040E+04 + 0.31933040E+04 0.31973770E+04 0.31973770E+04 0.32036580E+04 + 0.32036580E+04 0.32053630E+04 0.32053630E+04 0.32081321E+04 + 0.32081321E+04 0.32128960E+04 0.32128960E+04 0.32168989E+04 + 0.31915891E+04 0.31933230E+04 0.31933230E+04 0.31979971E+04 + 0.31979971E+04 0.31987070E+04 0.31987070E+04 0.31955911E+04 + 0.31955911E+04 0.31933040E+04 0.31933040E+04 0.31973770E+04 + 0.31973770E+04 0.32036580E+04 0.32036580E+04 0.32053630E+04 + 0.32053630E+04 0.32081321E+04 0.32081321E+04 0.32128960E+04 + 0.32128960E+04 0.32168989E+04 0.31835811E+04 0.31853230E+04 + 0.31853230E+04 0.31886270E+04 0.31886270E+04 0.31861831E+04 + 0.31861831E+04 0.31845281E+04 0.31845281E+04 0.31868921E+04 + 0.31868921E+04 0.31932729E+04 0.31932729E+04 0.32004351E+04 + 0.32004351E+04 0.32045071E+04 0.32045071E+04 0.32099929E+04 + 0.32099929E+04 0.32152261E+04 0.32152261E+04 0.32175071E+04 + 0.31835811E+04 0.31853230E+04 0.31853230E+04 0.31886270E+04 + 0.31886270E+04 0.31861831E+04 0.31861831E+04 0.31845281E+04 + 0.31845281E+04 0.31868921E+04 0.31868921E+04 0.31932729E+04 + 0.31932729E+04 0.32004351E+04 0.32004351E+04 0.32045071E+04 + 0.32045071E+04 0.32099929E+04 0.32099929E+04 0.32152261E+04 + 0.32152261E+04 0.32175071E+04 0.31725339E+04 0.31660271E+04 + 0.31660271E+04 0.31661841E+04 0.31661841E+04 0.31660200E+04 + 0.31660200E+04 0.31752329E+04 0.31752329E+04 0.31868279E+04 + 0.31868279E+04 0.31951411E+04 0.31951411E+04 0.31993169E+04 + 0.31993169E+04 0.32030410E+04 0.32030410E+04 0.32088140E+04 + 0.32088140E+04 0.32152959E+04 0.32152959E+04 0.32201621E+04 + 0.31725339E+04 0.31660271E+04 0.31660271E+04 0.31661841E+04 + 0.31661841E+04 0.31660200E+04 0.31660200E+04 0.31752329E+04 + 0.31752329E+04 0.31868279E+04 0.31868279E+04 0.31951411E+04 + 0.31951411E+04 0.31993169E+04 0.31993169E+04 0.32030410E+04 + 0.32030410E+04 0.32088140E+04 0.32088140E+04 0.32152959E+04 + 0.32152959E+04 0.32201621E+04 0.31741270E+04 0.31690779E+04 + 0.31690779E+04 0.31709829E+04 0.31709829E+04 0.31716541E+04 + 0.31716541E+04 0.31747871E+04 0.31747871E+04 0.31806279E+04 + 0.31806279E+04 0.31851970E+04 0.31851970E+04 0.31871069E+04 + 0.31871069E+04 0.31933660E+04 0.31933660E+04 0.32040349E+04 + 0.32040349E+04 0.32145979E+04 0.32145979E+04 0.32237329E+04 + 0.31741270E+04 0.31690779E+04 0.31690779E+04 0.31709829E+04 + 0.31709829E+04 0.31716541E+04 0.31716541E+04 0.31747871E+04 + 0.31747871E+04 0.31806279E+04 0.31806279E+04 0.31851970E+04 + 0.31851970E+04 0.31871069E+04 0.31871069E+04 0.31933660E+04 + 0.31933660E+04 0.32040349E+04 0.32040349E+04 0.32145979E+04 + 0.32145979E+04 0.32237329E+04 0.31880979E+04 0.31896470E+04 + 0.31896470E+04 0.31906011E+04 0.31906011E+04 0.31869971E+04 + 0.31869971E+04 0.31790640E+04 0.31790640E+04 0.31748440E+04 + 0.31748440E+04 0.31771919E+04 0.31771919E+04 0.31824519E+04 + 0.31824519E+04 0.31877419E+04 0.31877419E+04 0.31968579E+04 + 0.31968579E+04 0.32091389E+04 0.32091389E+04 0.32213630E+04 + 0.31880979E+04 0.31896470E+04 0.31896470E+04 0.31906011E+04 + 0.31906011E+04 0.31869971E+04 0.31869971E+04 0.31790640E+04 + 0.31790640E+04 0.31748440E+04 0.31748440E+04 0.31771919E+04 + 0.31771919E+04 0.31824519E+04 0.31824519E+04 0.31877419E+04 + 0.31877419E+04 0.31968579E+04 0.31968579E+04 0.32091389E+04 + 0.32091389E+04 0.32213630E+04 0.31861389E+04 0.31943840E+04 + 0.31943840E+04 0.31978931E+04 0.31978931E+04 0.31959790E+04 + 0.31959790E+04 0.31918840E+04 0.31918840E+04 0.31868501E+04 + 0.31868501E+04 0.31853279E+04 0.31853279E+04 0.31833569E+04 + 0.31833569E+04 0.31819021E+04 0.31819021E+04 0.31882019E+04 + 0.31882019E+04 0.32008831E+04 0.32008831E+04 0.32141121E+04 + 0.31861389E+04 0.31943840E+04 0.31943840E+04 0.31978931E+04 + 0.31978931E+04 0.31959790E+04 0.31959790E+04 0.31918840E+04 + 0.31918840E+04 0.31868501E+04 0.31868501E+04 0.31853279E+04 + 0.31853279E+04 0.31833569E+04 0.31833569E+04 0.31819021E+04 + 0.31819021E+04 0.31882019E+04 0.31882019E+04 0.32008831E+04 + 0.32008831E+04 0.32141121E+04 0.31839541E+04 0.31910691E+04 + 0.31910691E+04 0.31966079E+04 0.31966079E+04 0.31957620E+04 + 0.31957620E+04 0.31944041E+04 0.31944041E+04 0.31928560E+04 + 0.31928560E+04 0.31897639E+04 0.31897639E+04 0.31813191E+04 + 0.31813191E+04 0.31772380E+04 0.31772380E+04 0.31806399E+04 + 0.31806399E+04 0.31887009E+04 0.31887009E+04 0.31978181E+04 + 0.31839541E+04 0.31910691E+04 0.31910691E+04 0.31966079E+04 + 0.31966079E+04 0.31957620E+04 0.31957620E+04 0.31944041E+04 + 0.31944041E+04 0.31928560E+04 0.31928560E+04 0.31897639E+04 + 0.31897639E+04 0.31813191E+04 0.31813191E+04 0.31772380E+04 + 0.31772380E+04 0.31806399E+04 0.31806399E+04 0.31887009E+04 + 0.31887009E+04 0.31978181E+04 0.31929829E+04 0.31944551E+04 + 0.31944551E+04 0.32018401E+04 0.32018401E+04 0.32016350E+04 + 0.32016350E+04 0.31958511E+04 0.31958511E+04 0.31920959E+04 + 0.31920959E+04 0.31886870E+04 0.31886870E+04 0.31806460E+04 + 0.31806460E+04 0.31740681E+04 0.31740681E+04 0.31767939E+04 + 0.31767939E+04 0.31814890E+04 0.31814890E+04 0.31861250E+04 + 0.31929829E+04 0.31944551E+04 0.31944551E+04 0.32018401E+04 + 0.32018401E+04 0.32016350E+04 0.32016350E+04 0.31958511E+04 + 0.31958511E+04 0.31920959E+04 0.31920959E+04 0.31886870E+04 + 0.31886870E+04 0.31806460E+04 0.31806460E+04 0.31740681E+04 + 0.31740681E+04 0.31767939E+04 0.31767939E+04 0.31814890E+04 + 0.31814890E+04 0.31861250E+04 0.32044519E+04 0.32024719E+04 + 0.32024719E+04 0.32073701E+04 0.32073701E+04 0.32069041E+04 + 0.32069041E+04 0.31999260E+04 0.31999260E+04 0.31930901E+04 + 0.31930901E+04 0.31877610E+04 0.31877610E+04 0.31796440E+04 + 0.31796440E+04 0.31725481E+04 0.31725481E+04 0.31737109E+04 + 0.31737109E+04 0.31787200E+04 0.31787200E+04 0.31858721E+04 + 0.32044519E+04 0.32024719E+04 0.32024719E+04 0.32073701E+04 + 0.32073701E+04 0.32069041E+04 0.32069041E+04 0.31999260E+04 + 0.31999260E+04 0.31930901E+04 0.31930901E+04 0.31877610E+04 + 0.31877610E+04 0.31796440E+04 0.31796440E+04 0.31725481E+04 + 0.31725481E+04 0.31737109E+04 0.31737109E+04 0.31787200E+04 + 0.31787200E+04 0.31858721E+04 0.32008740E+04 0.32004800E+04 + 0.32004800E+04 0.32030801E+04 0.32030801E+04 0.32020930E+04 + 0.32020930E+04 0.31942251E+04 0.31942251E+04 0.31854319E+04 + 0.31854319E+04 0.31809451E+04 0.31809451E+04 0.31771470E+04 + 0.31771470E+04 0.31737639E+04 0.31737639E+04 0.31743821E+04 + 0.31743821E+04 0.31801001E+04 0.31801001E+04 0.31893540E+04 + 0.32008740E+04 0.32004800E+04 0.32004800E+04 0.32030801E+04 + 0.32030801E+04 0.32020930E+04 0.32020930E+04 0.31942251E+04 + 0.31942251E+04 0.31854319E+04 0.31854319E+04 0.31809451E+04 + 0.31809451E+04 0.31771470E+04 0.31771470E+04 0.31737639E+04 + 0.31737639E+04 0.31743821E+04 0.31743821E+04 0.31801001E+04 + 0.30506270E+04 0.30508440E+04 0.31949570E+04 0.31886631E+04 + 0.31886631E+04 0.31906689E+04 0.31906689E+04 0.31910740E+04 + 0.31910740E+04 0.31856450E+04 0.31856450E+04 0.31799380E+04 + 0.31799380E+04 0.31769819E+04 0.31769819E+04 0.31747520E+04 + 0.31747520E+04 0.31752161E+04 0.31752161E+04 0.31765850E+04 + 0.31765850E+04 0.31790200E+04 0.30554519E+04 0.30522500E+04 + 0.31949570E+04 0.31886631E+04 0.31886631E+04 0.31906689E+04 + 0.31906689E+04 0.31910740E+04 0.31910740E+04 0.31856450E+04 + 0.31856450E+04 0.31799380E+04 0.31799380E+04 0.31769819E+04 + 0.31769819E+04 0.31747520E+04 0.31747520E+04 0.31752161E+04 + 0.30873979E+04 0.30841960E+04 0.30841960E+04 0.30828601E+04 + 0.30554519E+04 0.30522500E+04 0.31982690E+04 0.31838940E+04 + 0.31838940E+04 0.31814661E+04 0.31814661E+04 0.31805210E+04 + 0.31805210E+04 0.31778979E+04 0.31778979E+04 0.31749939E+04 + 0.31749939E+04 0.31739199E+04 0.31739199E+04 0.31742329E+04 + 0.31742329E+04 0.31745320E+04 0.30863721E+04 0.30853589E+04 + 0.30853589E+04 0.30836331E+04 0.30549629E+04 0.30522949E+04 + 0.31982690E+04 0.31838940E+04 0.31838940E+04 0.31814661E+04 + 0.31814661E+04 0.31805210E+04 0.31805210E+04 0.31778979E+04 + 0.31778979E+04 0.31749939E+04 0.31749939E+04 0.31739199E+04 + 0.30994580E+04 0.30951179E+04 0.30951179E+04 0.30863721E+04 + 0.30863721E+04 0.30853589E+04 0.30853589E+04 0.30836331E+04 + 0.30549629E+04 0.30522949E+04 0.31988701E+04 0.31851030E+04 + 0.31851030E+04 0.31787029E+04 0.31787029E+04 0.31763230E+04 + 0.31763230E+04 0.31740190E+04 0.31740190E+04 0.31733840E+04 + 0.31733840E+04 0.31725000E+04 0.31010620E+04 0.30977310E+04 + 0.30977310E+04 0.30919080E+04 0.30919080E+04 0.30877151E+04 + 0.30877151E+04 0.30850471E+04 0.30552429E+04 0.30525530E+04 + 0.31988701E+04 0.31851030E+04 0.31851030E+04 0.31787029E+04 + 0.31787029E+04 0.31763230E+04 0.31763230E+04 0.31740190E+04 + 0.31086389E+04 0.31050979E+04 0.31050979E+04 0.31010620E+04 + 0.31010620E+04 0.30977310E+04 0.30977310E+04 0.30919080E+04 + 0.30919080E+04 0.30877151E+04 0.30877151E+04 0.30850471E+04 + 0.30552429E+04 0.30525530E+04 0.31947080E+04 0.31873411E+04 + 0.31873411E+04 0.31805601E+04 0.31805601E+04 0.31783440E+04 + 0.31783440E+04 0.31746550E+04 0.31103130E+04 0.31071570E+04 + 0.31071570E+04 0.31037949E+04 0.31037949E+04 0.31002571E+04 + 0.31002571E+04 0.30946360E+04 0.30946360E+04 0.30885520E+04 + 0.30885520E+04 0.30858530E+04 0.30554290E+04 0.30532271E+04 + 0.31947080E+04 0.31873411E+04 0.31873411E+04 0.31805601E+04 + 0.31197300E+04 0.31158091E+04 0.31158091E+04 0.31103130E+04 + 0.31103130E+04 0.31071570E+04 0.31071570E+04 0.31037949E+04 + 0.31037949E+04 0.31002571E+04 0.31002571E+04 0.30946360E+04 + 0.30946360E+04 0.30885520E+04 0.30885520E+04 0.30858530E+04 + 0.30554290E+04 0.30532271E+04 0.31938779E+04 0.31890139E+04 + 0.31890139E+04 0.31831230E+04 0.31230010E+04 0.31182920E+04 + 0.31182920E+04 0.31123960E+04 0.31123960E+04 0.31076121E+04 + 0.31076121E+04 0.31014189E+04 0.31014189E+04 0.30975210E+04 + 0.30975210E+04 0.30952629E+04 0.30952629E+04 0.30909709E+04 + 0.30909709E+04 0.30868779E+04 0.30561770E+04 0.30537510E+04 + 0.31311841E+04 0.31281350E+04 0.31281350E+04 0.31230010E+04 + 0.31230010E+04 0.31182920E+04 0.31182920E+04 0.31123960E+04 + 0.31123960E+04 0.31076121E+04 0.31076121E+04 0.31014189E+04 + 0.31014189E+04 0.30975210E+04 0.30975210E+04 0.30952629E+04 + 0.30952629E+04 0.30909709E+04 0.30909709E+04 0.30868779E+04 + 0.30868779E+04 0.30840420E+04 0.31329741E+04 0.31307080E+04 + 0.31307080E+04 0.31284641E+04 0.31284641E+04 0.31230259E+04 + 0.31230259E+04 0.31103391E+04 0.31103391E+04 0.31028181E+04 + 0.31028181E+04 0.30981550E+04 0.30981550E+04 0.30972371E+04 + 0.30972371E+04 0.30991079E+04 0.30991079E+04 0.30946389E+04 + 0.30946389E+04 0.30882461E+04 0.30882461E+04 0.30845291E+04 + 0.32015730E+04 0.32010471E+04 0.32010471E+04 0.32036970E+04 + 0.32036970E+04 0.32040071E+04 0.32040071E+04 0.31992920E+04 + 0.31992920E+04 0.31919700E+04 0.31919700E+04 0.31915271E+04 + 0.31915271E+04 0.31963940E+04 0.31963940E+04 0.31987329E+04 + 0.31987329E+04 0.31998411E+04 0.31998411E+04 0.32048391E+04 + 0.32048391E+04 0.32121709E+04 0.31915891E+04 0.31933230E+04 + 0.31933230E+04 0.31979971E+04 0.31979971E+04 0.31987070E+04 + 0.31987070E+04 0.31955911E+04 0.31955911E+04 0.31933040E+04 + 0.31933040E+04 0.31973770E+04 0.31973770E+04 0.32036580E+04 + 0.32036580E+04 0.32053630E+04 0.32053630E+04 0.32081321E+04 + 0.32081321E+04 0.32128960E+04 0.32128960E+04 0.32168989E+04 + 0.31915891E+04 0.31933230E+04 0.31933230E+04 0.31979971E+04 + 0.31979971E+04 0.31987070E+04 0.31987070E+04 0.31955911E+04 + 0.31955911E+04 0.31933040E+04 0.31933040E+04 0.31973770E+04 + 0.31973770E+04 0.32036580E+04 0.32036580E+04 0.32053630E+04 + 0.32053630E+04 0.32081321E+04 0.32081321E+04 0.32128960E+04 + 0.32128960E+04 0.32168989E+04 0.31835811E+04 0.31853230E+04 + 0.31853230E+04 0.31886270E+04 0.31886270E+04 0.31861831E+04 + 0.31861831E+04 0.31845281E+04 0.31845281E+04 0.31868921E+04 + 0.31868921E+04 0.31932729E+04 0.31932729E+04 0.32004351E+04 + 0.32004351E+04 0.32045071E+04 0.32045071E+04 0.32099929E+04 + 0.32099929E+04 0.32152261E+04 0.32152261E+04 0.32175071E+04 + 0.31835811E+04 0.31853230E+04 0.31853230E+04 0.31886270E+04 + 0.31886270E+04 0.31861831E+04 0.31861831E+04 0.31845281E+04 + 0.31845281E+04 0.31868921E+04 0.31868921E+04 0.31932729E+04 + 0.31932729E+04 0.32004351E+04 0.32004351E+04 0.32045071E+04 + 0.32045071E+04 0.32099929E+04 0.32099929E+04 0.32152261E+04 + 0.32152261E+04 0.32175071E+04 0.31725339E+04 0.31660271E+04 + 0.31660271E+04 0.31661841E+04 0.31661841E+04 0.31660200E+04 + 0.31660200E+04 0.31752329E+04 0.31752329E+04 0.31868279E+04 + 0.31868279E+04 0.31951411E+04 0.31951411E+04 0.31993169E+04 + 0.31993169E+04 0.32030410E+04 0.32030410E+04 0.32088140E+04 + 0.32088140E+04 0.32152959E+04 0.32152959E+04 0.32201621E+04 + 0.31725339E+04 0.31660271E+04 0.31660271E+04 0.31661841E+04 + 0.31661841E+04 0.31660200E+04 0.31660200E+04 0.31752329E+04 + 0.31752329E+04 0.31868279E+04 0.31868279E+04 0.31951411E+04 + 0.31951411E+04 0.31993169E+04 0.31993169E+04 0.32030410E+04 + 0.32030410E+04 0.32088140E+04 0.32088140E+04 0.32152959E+04 + 0.32152959E+04 0.32201621E+04 0.31741270E+04 0.31690779E+04 + 0.31690779E+04 0.31709829E+04 0.31709829E+04 0.31716541E+04 + 0.31716541E+04 0.31747871E+04 0.31747871E+04 0.31806279E+04 + 0.31806279E+04 0.31851970E+04 0.31851970E+04 0.31871069E+04 + 0.31871069E+04 0.31933660E+04 0.31933660E+04 0.32040349E+04 + 0.32040349E+04 0.32145979E+04 0.32145979E+04 0.32237329E+04 + 0.31741270E+04 0.31690779E+04 0.31690779E+04 0.31709829E+04 + 0.31709829E+04 0.31716541E+04 0.31716541E+04 0.31747871E+04 + 0.31747871E+04 0.31806279E+04 0.31806279E+04 0.31851970E+04 + 0.31851970E+04 0.31871069E+04 0.31871069E+04 0.31933660E+04 + 0.31933660E+04 0.32040349E+04 0.32040349E+04 0.32145979E+04 + 0.32145979E+04 0.32237329E+04 0.31880979E+04 0.31896470E+04 + 0.31896470E+04 0.31906011E+04 0.31906011E+04 0.31869971E+04 + 0.31869971E+04 0.31790640E+04 0.31790640E+04 0.31748440E+04 + 0.31748440E+04 0.31771919E+04 0.31771919E+04 0.31824519E+04 + 0.31824519E+04 0.31877419E+04 0.31877419E+04 0.31968579E+04 + 0.31968579E+04 0.32091389E+04 0.32091389E+04 0.32213630E+04 + 0.31880979E+04 0.31896470E+04 0.31896470E+04 0.31906011E+04 + 0.31906011E+04 0.31869971E+04 0.31869971E+04 0.31790640E+04 + 0.31790640E+04 0.31748440E+04 0.31748440E+04 0.31771919E+04 + 0.31771919E+04 0.31824519E+04 0.31824519E+04 0.31877419E+04 + 0.31877419E+04 0.31968579E+04 0.31968579E+04 0.32091389E+04 + 0.32091389E+04 0.32213630E+04 0.31861389E+04 0.31943840E+04 + 0.31943840E+04 0.31978931E+04 0.31978931E+04 0.31959790E+04 + 0.31959790E+04 0.31918840E+04 0.31918840E+04 0.31868501E+04 + 0.31868501E+04 0.31853279E+04 0.31853279E+04 0.31833569E+04 + 0.31833569E+04 0.31819021E+04 0.31819021E+04 0.31882019E+04 + 0.31882019E+04 0.32008831E+04 0.32008831E+04 0.32141121E+04 + 0.31861389E+04 0.31943840E+04 0.31943840E+04 0.31978931E+04 + 0.31978931E+04 0.31959790E+04 0.31959790E+04 0.31918840E+04 + 0.31918840E+04 0.31868501E+04 0.31868501E+04 0.31853279E+04 + 0.31853279E+04 0.31833569E+04 0.31833569E+04 0.31819021E+04 + 0.31819021E+04 0.31882019E+04 0.31882019E+04 0.32008831E+04 + 0.32008831E+04 0.32141121E+04 0.31839541E+04 0.31910691E+04 + 0.31910691E+04 0.31966079E+04 0.31966079E+04 0.31957620E+04 + 0.31957620E+04 0.31944041E+04 0.31944041E+04 0.31928560E+04 + 0.31928560E+04 0.31897639E+04 0.31897639E+04 0.31813191E+04 + 0.31813191E+04 0.31772380E+04 0.31772380E+04 0.31806399E+04 + 0.31806399E+04 0.31887009E+04 0.31887009E+04 0.31978181E+04 + 0.31839541E+04 0.31910691E+04 0.31910691E+04 0.31966079E+04 + 0.31966079E+04 0.31957620E+04 0.31957620E+04 0.31944041E+04 + 0.31944041E+04 0.31928560E+04 0.31928560E+04 0.31897639E+04 + 0.31897639E+04 0.31813191E+04 0.31813191E+04 0.31772380E+04 + 0.31772380E+04 0.31806399E+04 0.31806399E+04 0.31887009E+04 + 0.31887009E+04 0.31978181E+04 0.31929829E+04 0.31944551E+04 + 0.31944551E+04 0.32018401E+04 0.32018401E+04 0.32016350E+04 + 0.32016350E+04 0.31958511E+04 0.31958511E+04 0.31920959E+04 + 0.31920959E+04 0.31886870E+04 0.31886870E+04 0.31806460E+04 + 0.31806460E+04 0.31740681E+04 0.31740681E+04 0.31767939E+04 + 0.31767939E+04 0.31814890E+04 0.31814890E+04 0.31861250E+04 + 0.31929829E+04 0.31944551E+04 0.31944551E+04 0.32018401E+04 + 0.32018401E+04 0.32016350E+04 0.32016350E+04 0.31958511E+04 + 0.31958511E+04 0.31920959E+04 0.31920959E+04 0.31886870E+04 + 0.31886870E+04 0.31806460E+04 0.31806460E+04 0.31740681E+04 + 0.31740681E+04 0.31767939E+04 0.31767939E+04 0.31814890E+04 + 0.31814890E+04 0.31861250E+04 0.32044519E+04 0.32024719E+04 + 0.32024719E+04 0.32073701E+04 0.32073701E+04 0.32069041E+04 + 0.32069041E+04 0.31999260E+04 0.31999260E+04 0.31930901E+04 + 0.31930901E+04 0.31877610E+04 0.31877610E+04 0.31796440E+04 + 0.31796440E+04 0.31725481E+04 0.31725481E+04 0.31737109E+04 + 0.31737109E+04 0.31787200E+04 0.31787200E+04 0.31858721E+04 + 0.32044519E+04 0.32024719E+04 0.32024719E+04 0.32073701E+04 + 0.32073701E+04 0.32069041E+04 0.32069041E+04 0.31999260E+04 + 0.31999260E+04 0.31930901E+04 0.31930901E+04 0.31877610E+04 + 0.31877610E+04 0.31796440E+04 0.31796440E+04 0.31725481E+04 + 0.31725481E+04 0.31737109E+04 0.31737109E+04 0.31787200E+04 + 0.31787200E+04 0.31858721E+04 0.32008740E+04 0.32004800E+04 + 0.32004800E+04 0.32030801E+04 0.32030801E+04 0.32020930E+04 + 0.32020930E+04 0.31942251E+04 0.31942251E+04 0.31854319E+04 + 0.31854319E+04 0.31809451E+04 0.31809451E+04 0.31771470E+04 + 0.31771470E+04 0.31737639E+04 0.31737639E+04 0.31743821E+04 + 0.31743821E+04 0.31801001E+04 0.31801001E+04 0.31893540E+04 + 0.32008740E+04 0.32004800E+04 0.32004800E+04 0.32030801E+04 + 0.32030801E+04 0.32020930E+04 0.32020930E+04 0.31942251E+04 + 0.31942251E+04 0.31854319E+04 0.31854319E+04 0.31809451E+04 + 0.31809451E+04 0.31771470E+04 0.31771470E+04 0.31737639E+04 + 0.31737639E+04 0.31743821E+04 0.31743821E+04 0.31801001E+04 + 0.30506270E+04 0.30508440E+04 0.31949570E+04 0.31886631E+04 + 0.31886631E+04 0.31906689E+04 0.31906689E+04 0.31910740E+04 + 0.31910740E+04 0.31856450E+04 0.31856450E+04 0.31799380E+04 + 0.31799380E+04 0.31769819E+04 0.31769819E+04 0.31747520E+04 + 0.31747520E+04 0.31752161E+04 0.31752161E+04 0.31765850E+04 + 0.31765850E+04 0.31790200E+04 0.30554519E+04 0.30522500E+04 + 0.31949570E+04 0.31886631E+04 0.31886631E+04 0.31906689E+04 + 0.31906689E+04 0.31910740E+04 0.31910740E+04 0.31856450E+04 + 0.31856450E+04 0.31799380E+04 0.31799380E+04 0.31769819E+04 + 0.31769819E+04 0.31747520E+04 0.31747520E+04 0.31752161E+04 + 0.30873979E+04 0.30841960E+04 0.30841960E+04 0.30828601E+04 + 0.30554519E+04 0.30522500E+04 0.31982690E+04 0.31838940E+04 + 0.31838940E+04 0.31814661E+04 0.31814661E+04 0.31805210E+04 + 0.31805210E+04 0.31778979E+04 0.31778979E+04 0.31749939E+04 + 0.31749939E+04 0.31739199E+04 0.31739199E+04 0.31742329E+04 + 0.31742329E+04 0.31745320E+04 0.30863721E+04 0.30853589E+04 + 0.30853589E+04 0.30836331E+04 0.30549629E+04 0.30522949E+04 + 0.31982690E+04 0.31838940E+04 0.31838940E+04 0.31814661E+04 + 0.31814661E+04 0.31805210E+04 0.31805210E+04 0.31778979E+04 + 0.31778979E+04 0.31749939E+04 0.31749939E+04 0.31739199E+04 + 0.30994580E+04 0.30951179E+04 0.30951179E+04 0.30863721E+04 + 0.30863721E+04 0.30853589E+04 0.30853589E+04 0.30836331E+04 + 0.30549629E+04 0.30522949E+04 0.31988701E+04 0.31851030E+04 + 0.31851030E+04 0.31787029E+04 0.31787029E+04 0.31763230E+04 + 0.31763230E+04 0.31740190E+04 0.31740190E+04 0.31733840E+04 + 0.31733840E+04 0.31725000E+04 0.31010620E+04 0.30977310E+04 + 0.30977310E+04 0.30919080E+04 0.30919080E+04 0.30877151E+04 + 0.30877151E+04 0.30850471E+04 0.30552429E+04 0.30525530E+04 + 0.31988701E+04 0.31851030E+04 0.31851030E+04 0.31787029E+04 + 0.31787029E+04 0.31763230E+04 0.31763230E+04 0.31740190E+04 + 0.31086389E+04 0.31050979E+04 0.31050979E+04 0.31010620E+04 + 0.31010620E+04 0.30977310E+04 0.30977310E+04 0.30919080E+04 + 0.30919080E+04 0.30877151E+04 0.30877151E+04 0.30850471E+04 + 0.30552429E+04 0.30525530E+04 0.31947080E+04 0.31873411E+04 + 0.31873411E+04 0.31805601E+04 0.31805601E+04 0.31783440E+04 + 0.31783440E+04 0.31746550E+04 0.31103130E+04 0.31071570E+04 + 0.31071570E+04 0.31037949E+04 0.31037949E+04 0.31002571E+04 + 0.31002571E+04 0.30946360E+04 0.30946360E+04 0.30885520E+04 + 0.30885520E+04 0.30858530E+04 0.30554290E+04 0.30532271E+04 + 0.31947080E+04 0.31873411E+04 0.31873411E+04 0.31805601E+04 + 0.31197300E+04 0.31158091E+04 0.31158091E+04 0.31103130E+04 + 0.31103130E+04 0.31071570E+04 0.31071570E+04 0.31037949E+04 + 0.31037949E+04 0.31002571E+04 0.31002571E+04 0.30946360E+04 + 0.30946360E+04 0.30885520E+04 0.30885520E+04 0.30858530E+04 + 0.30554290E+04 0.30532271E+04 0.31938779E+04 0.31890139E+04 + 0.31890139E+04 0.31831230E+04 0.31230010E+04 0.31182920E+04 + 0.31182920E+04 0.31123960E+04 0.31123960E+04 0.31076121E+04 + 0.31076121E+04 0.31014189E+04 0.31014189E+04 0.30975210E+04 + 0.30975210E+04 0.30952629E+04 0.30952629E+04 0.30909709E+04 + 0.30909709E+04 0.30868779E+04 0.30561770E+04 0.30537510E+04 + 0.31311841E+04 0.31281350E+04 0.31281350E+04 0.31230010E+04 + 0.31230010E+04 0.31182920E+04 0.31182920E+04 0.31123960E+04 + 0.31123960E+04 0.31076121E+04 0.31076121E+04 0.31014189E+04 + 0.31014189E+04 0.30975210E+04 0.30975210E+04 0.30952629E+04 + 0.30952629E+04 0.30909709E+04 0.30909709E+04 0.30868779E+04 + 0.30868779E+04 0.30840420E+04 0.31329741E+04 0.31307080E+04 + 0.31307080E+04 0.31284641E+04 0.31284641E+04 0.31230259E+04 + 0.31230259E+04 0.31103391E+04 0.31103391E+04 0.31028181E+04 + 0.31028181E+04 0.30981550E+04 0.30981550E+04 0.30972371E+04 + 0.30972371E+04 0.30991079E+04 0.30991079E+04 0.30946389E+04 + 0.30946389E+04 0.30882461E+04 0.30882461E+04 0.30845291E+04 + 0.32034241E+04 0.32027339E+04 0.32027339E+04 0.32054089E+04 + 0.32054089E+04 0.32058120E+04 0.32058120E+04 0.32011589E+04 + 0.32011589E+04 0.31936650E+04 0.31936650E+04 0.31930181E+04 + 0.31930181E+04 0.31978181E+04 0.31978181E+04 0.32002729E+04 + 0.32002729E+04 0.32014221E+04 0.32014221E+04 0.32063921E+04 + 0.32063921E+04 0.32137290E+04 0.31934741E+04 0.31950010E+04 + 0.31950010E+04 0.31997361E+04 0.31997361E+04 0.32005740E+04 + 0.32005740E+04 0.31974519E+04 0.31974519E+04 0.31949780E+04 + 0.31949780E+04 0.31989080E+04 0.31989080E+04 0.32052170E+04 + 0.32052170E+04 0.32070859E+04 0.32070859E+04 0.32097871E+04 + 0.32097871E+04 0.32145439E+04 0.32145439E+04 0.32184121E+04 + 0.31934741E+04 0.31950010E+04 0.31950010E+04 0.31997361E+04 + 0.31997361E+04 0.32005740E+04 0.32005740E+04 0.31974519E+04 + 0.31974519E+04 0.31949780E+04 0.31949780E+04 0.31989080E+04 + 0.31989080E+04 0.32052170E+04 0.32052170E+04 0.32070859E+04 + 0.32070859E+04 0.32097871E+04 0.32097871E+04 0.32145439E+04 + 0.32145439E+04 0.32184121E+04 0.31855249E+04 0.31871230E+04 + 0.31871230E+04 0.31905181E+04 0.31905181E+04 0.31880869E+04 + 0.31880869E+04 0.31861870E+04 0.31861870E+04 0.31882959E+04 + 0.31882959E+04 0.31945830E+04 0.31945830E+04 0.32018120E+04 + 0.32018120E+04 0.32060090E+04 0.32060090E+04 0.32114800E+04 + 0.32114800E+04 0.32167419E+04 0.32167419E+04 0.32187849E+04 + 0.31855249E+04 0.31871230E+04 0.31871230E+04 0.31905181E+04 + 0.31905181E+04 0.31880869E+04 0.31880869E+04 0.31861870E+04 + 0.31861870E+04 0.31882959E+04 0.31882959E+04 0.31945830E+04 + 0.31945830E+04 0.32018120E+04 0.32018120E+04 0.32060090E+04 + 0.32060090E+04 0.32114800E+04 0.32114800E+04 0.32167419E+04 + 0.32167419E+04 0.32187849E+04 0.31741580E+04 0.31675520E+04 + 0.31675520E+04 0.31677251E+04 0.31677251E+04 0.31672771E+04 + 0.31672771E+04 0.31762900E+04 0.31762900E+04 0.31878491E+04 + 0.31878491E+04 0.31962471E+04 0.31962471E+04 0.32005640E+04 + 0.32005640E+04 0.32043169E+04 0.32043169E+04 0.32099619E+04 + 0.32099619E+04 0.32163069E+04 0.32163069E+04 0.32209819E+04 + 0.31741580E+04 0.31675520E+04 0.31675520E+04 0.31677251E+04 + 0.31677251E+04 0.31672771E+04 0.31672771E+04 0.31762900E+04 + 0.31762900E+04 0.31878491E+04 0.31878491E+04 0.31962471E+04 + 0.31962471E+04 0.32005640E+04 0.32005640E+04 0.32043169E+04 + 0.32043169E+04 0.32099619E+04 0.32099619E+04 0.32163069E+04 + 0.32163069E+04 0.32209819E+04 0.31749541E+04 0.31699719E+04 + 0.31699719E+04 0.31719561E+04 0.31719561E+04 0.31726631E+04 + 0.31726631E+04 0.31757930E+04 0.31757930E+04 0.31816379E+04 + 0.31816379E+04 0.31861960E+04 0.31861960E+04 0.31879990E+04 + 0.31879990E+04 0.31941809E+04 0.31941809E+04 0.32048030E+04 + 0.32048030E+04 0.32153259E+04 0.32153259E+04 0.32244351E+04 + 0.31749541E+04 0.31699719E+04 0.31699719E+04 0.31719561E+04 + 0.31719561E+04 0.31726631E+04 0.31726631E+04 0.31757930E+04 + 0.31757930E+04 0.31816379E+04 0.31816379E+04 0.31861960E+04 + 0.31861960E+04 0.31879990E+04 0.31879990E+04 0.31941809E+04 + 0.31941809E+04 0.32048030E+04 0.32048030E+04 0.32153259E+04 + 0.32153259E+04 0.32244351E+04 0.31889360E+04 0.31904309E+04 + 0.31904309E+04 0.31914290E+04 0.31914290E+04 0.31878979E+04 + 0.31878979E+04 0.31799241E+04 0.31799241E+04 0.31755820E+04 + 0.31755820E+04 0.31778579E+04 0.31778579E+04 0.31831799E+04 + 0.31831799E+04 0.31884629E+04 0.31884629E+04 0.31974851E+04 + 0.31974851E+04 0.32097690E+04 0.32097690E+04 0.32220090E+04 + 0.31889360E+04 0.31904309E+04 0.31904309E+04 0.31914290E+04 + 0.31914290E+04 0.31878979E+04 0.31878979E+04 0.31799241E+04 + 0.31799241E+04 0.31755820E+04 0.31755820E+04 0.31778579E+04 + 0.31778579E+04 0.31831799E+04 0.31831799E+04 0.31884629E+04 + 0.31884629E+04 0.31974851E+04 0.31974851E+04 0.32097690E+04 + 0.32097690E+04 0.32220090E+04 0.31868789E+04 0.31950991E+04 + 0.31950991E+04 0.31987380E+04 0.31987380E+04 0.31968711E+04 + 0.31968711E+04 0.31927261E+04 0.31927261E+04 0.31875559E+04 + 0.31875559E+04 0.31860249E+04 0.31860249E+04 0.31840950E+04 + 0.31840950E+04 0.31825271E+04 0.31825271E+04 0.31887480E+04 + 0.31887480E+04 0.32015271E+04 0.32015271E+04 0.32148940E+04 + 0.31868789E+04 0.31950991E+04 0.31950991E+04 0.31987380E+04 + 0.31987380E+04 0.31968711E+04 0.31968711E+04 0.31927261E+04 + 0.31927261E+04 0.31875559E+04 0.31875559E+04 0.31860249E+04 + 0.31860249E+04 0.31840950E+04 0.31840950E+04 0.31825271E+04 + 0.31825271E+04 0.31887480E+04 0.31887480E+04 0.32015271E+04 + 0.32015271E+04 0.32148940E+04 0.31846101E+04 0.31917290E+04 + 0.31917290E+04 0.31973860E+04 0.31973860E+04 0.31965691E+04 + 0.31965691E+04 0.31951819E+04 0.31951819E+04 0.31935991E+04 + 0.31935991E+04 0.31905740E+04 0.31905740E+04 0.31820911E+04 + 0.31820911E+04 0.31779080E+04 0.31779080E+04 0.31812190E+04 + 0.31812190E+04 0.31893320E+04 0.31893320E+04 0.31986030E+04 + 0.31846101E+04 0.31917290E+04 0.31917290E+04 0.31973860E+04 + 0.31973860E+04 0.31965691E+04 0.31965691E+04 0.31951819E+04 + 0.31951819E+04 0.31935991E+04 0.31935991E+04 0.31905740E+04 + 0.31905740E+04 0.31820911E+04 0.31820911E+04 0.31779080E+04 + 0.31779080E+04 0.31812190E+04 0.31812190E+04 0.31893320E+04 + 0.31893320E+04 0.31986030E+04 0.31937380E+04 0.31950669E+04 + 0.31950669E+04 0.32025149E+04 0.32025149E+04 0.32024390E+04 + 0.32024390E+04 0.31966130E+04 0.31966130E+04 0.31928291E+04 + 0.31928291E+04 0.31894709E+04 0.31894709E+04 0.31814561E+04 + 0.31814561E+04 0.31747500E+04 0.31747500E+04 0.31773899E+04 + 0.31773899E+04 0.31820730E+04 0.31820730E+04 0.31867151E+04 + 0.31937380E+04 0.31950669E+04 0.31950669E+04 0.32025149E+04 + 0.32025149E+04 0.32024390E+04 0.32024390E+04 0.31966130E+04 + 0.31966130E+04 0.31928291E+04 0.31928291E+04 0.31894709E+04 + 0.31894709E+04 0.31814561E+04 0.31814561E+04 0.31747500E+04 + 0.31747500E+04 0.31773899E+04 0.31773899E+04 0.31820730E+04 + 0.31820730E+04 0.31867151E+04 0.32054170E+04 0.32031860E+04 + 0.32031860E+04 0.32080779E+04 0.32080779E+04 0.32077380E+04 + 0.32077380E+04 0.32007781E+04 0.32007781E+04 0.31938931E+04 + 0.31938931E+04 0.31885491E+04 0.31885491E+04 0.31804270E+04 + 0.31804270E+04 0.31732351E+04 0.31732351E+04 0.31743330E+04 + 0.31743330E+04 0.31793840E+04 0.31793840E+04 0.31867300E+04 + 0.32054170E+04 0.32031860E+04 0.32031860E+04 0.32080779E+04 + 0.32080779E+04 0.32077380E+04 0.32077380E+04 0.32007781E+04 + 0.32007781E+04 0.31938931E+04 0.31938931E+04 0.31885491E+04 + 0.31885491E+04 0.31804270E+04 0.31804270E+04 0.31732351E+04 + 0.31732351E+04 0.31743330E+04 0.31743330E+04 0.31793840E+04 + 0.31793840E+04 0.31867300E+04 0.32018601E+04 0.32013049E+04 + 0.32013049E+04 0.32038740E+04 0.32038740E+04 0.32029919E+04 + 0.32029919E+04 0.31951780E+04 0.31951780E+04 0.31863120E+04 + 0.31863120E+04 0.31817561E+04 0.31817561E+04 0.31778721E+04 + 0.31778721E+04 0.31744070E+04 0.31744070E+04 0.31750049E+04 + 0.31750049E+04 0.31808379E+04 0.31808379E+04 0.31903779E+04 + 0.32018601E+04 0.32013049E+04 0.32013049E+04 0.32038740E+04 + 0.32038740E+04 0.32029919E+04 0.32029919E+04 0.31951780E+04 + 0.31951780E+04 0.31863120E+04 0.31863120E+04 0.31817561E+04 + 0.31817561E+04 0.31778721E+04 0.31778721E+04 0.31744070E+04 + 0.31744070E+04 0.31750049E+04 0.31750049E+04 0.31808379E+04 + 0.30511609E+04 0.30514619E+04 0.31959641E+04 0.31894961E+04 + 0.31894961E+04 0.31914270E+04 0.31914270E+04 0.31919519E+04 + 0.31919519E+04 0.31866230E+04 0.31866230E+04 0.31808330E+04 + 0.31808330E+04 0.31777849E+04 0.31777849E+04 0.31754309E+04 + 0.31754309E+04 0.31758999E+04 0.31758999E+04 0.31772729E+04 + 0.31772729E+04 0.31797251E+04 0.30559890E+04 0.30528831E+04 + 0.31959641E+04 0.31894961E+04 0.31894961E+04 0.31914270E+04 + 0.31914270E+04 0.31919519E+04 0.31919519E+04 0.31866230E+04 + 0.31866230E+04 0.31808330E+04 0.31808330E+04 0.31777849E+04 + 0.31777849E+04 0.31754309E+04 0.31754309E+04 0.31758999E+04 + 0.30882820E+04 0.30851069E+04 0.30851069E+04 0.30837991E+04 + 0.30559890E+04 0.30528831E+04 0.31993970E+04 0.31848479E+04 + 0.31848479E+04 0.31823159E+04 0.31823159E+04 0.31813630E+04 + 0.31813630E+04 0.31787529E+04 0.31787529E+04 0.31758169E+04 + 0.31758169E+04 0.31746931E+04 0.31746931E+04 0.31749390E+04 + 0.31749390E+04 0.31752720E+04 0.30871851E+04 0.30862581E+04 + 0.30862581E+04 0.30845950E+04 0.30555029E+04 0.30528750E+04 + 0.31993970E+04 0.31848479E+04 0.31848479E+04 0.31823159E+04 + 0.31823159E+04 0.31813630E+04 0.31813630E+04 0.31787529E+04 + 0.31787529E+04 0.31758169E+04 0.31758169E+04 0.31746931E+04 + 0.31004109E+04 0.30960779E+04 0.30960779E+04 0.30871851E+04 + 0.30871851E+04 0.30862581E+04 0.30862581E+04 0.30845950E+04 + 0.30555029E+04 0.30528750E+04 0.32001189E+04 0.31861379E+04 + 0.31861379E+04 0.31796399E+04 0.31796399E+04 0.31771809E+04 + 0.31771809E+04 0.31748501E+04 0.31748501E+04 0.31741851E+04 + 0.31741851E+04 0.31733159E+04 0.31020181E+04 0.30987429E+04 + 0.30987429E+04 0.30928921E+04 0.30928921E+04 0.30886460E+04 + 0.30886460E+04 0.30860000E+04 0.30557800E+04 0.30531240E+04 + 0.32001189E+04 0.31861379E+04 0.31861379E+04 0.31796399E+04 + 0.31796399E+04 0.31771809E+04 0.31771809E+04 0.31748501E+04 + 0.31095791E+04 0.31060500E+04 0.31060500E+04 0.31020181E+04 + 0.31020181E+04 0.30987429E+04 0.30987429E+04 0.30928921E+04 + 0.30928921E+04 0.30886460E+04 0.30886460E+04 0.30860000E+04 + 0.30557800E+04 0.30531240E+04 0.31956011E+04 0.31882561E+04 + 0.31882561E+04 0.31814331E+04 0.31814331E+04 0.31792419E+04 + 0.31792419E+04 0.31755730E+04 0.31112910E+04 0.31081819E+04 + 0.31081819E+04 0.31047771E+04 0.31047771E+04 0.31012029E+04 + 0.31012029E+04 0.30956169E+04 0.30956169E+04 0.30894570E+04 + 0.30894570E+04 0.30867920E+04 0.30559810E+04 0.30538220E+04 + 0.31956011E+04 0.31882561E+04 0.31882561E+04 0.31814331E+04 + 0.31206709E+04 0.31167629E+04 0.31167629E+04 0.31112910E+04 + 0.31112910E+04 0.31081819E+04 0.31081819E+04 0.31047771E+04 + 0.31047771E+04 0.31012029E+04 0.31012029E+04 0.30956169E+04 + 0.30956169E+04 0.30894570E+04 0.30894570E+04 0.30867920E+04 + 0.30559810E+04 0.30538220E+04 0.31946990E+04 0.31898850E+04 + 0.31898850E+04 0.31839951E+04 0.31239460E+04 0.31193279E+04 + 0.31193279E+04 0.31134551E+04 0.31134551E+04 0.31086150E+04 + 0.31086150E+04 0.31023621E+04 0.31023621E+04 0.30985010E+04 + 0.30985010E+04 0.30962500E+04 0.30962500E+04 0.30918789E+04 + 0.30918789E+04 0.30877610E+04 0.30567510E+04 0.30543430E+04 + 0.31319451E+04 0.31289470E+04 0.31289470E+04 0.31239460E+04 + 0.31239460E+04 0.31193279E+04 0.31193279E+04 0.31134551E+04 + 0.31134551E+04 0.31086150E+04 0.31086150E+04 0.31023621E+04 + 0.31023621E+04 0.30985010E+04 0.30985010E+04 0.30962500E+04 + 0.30962500E+04 0.30918789E+04 0.30918789E+04 0.30877610E+04 + 0.30877610E+04 0.30849099E+04 0.31337361E+04 0.31314939E+04 + 0.31314939E+04 0.31294670E+04 0.31294670E+04 0.31241831E+04 + 0.31241831E+04 0.31112820E+04 0.31112820E+04 0.31037100E+04 + 0.31037100E+04 0.30990291E+04 0.30990291E+04 0.30981311E+04 + 0.30981311E+04 0.31000859E+04 0.31000859E+04 0.30955300E+04 + 0.30955300E+04 0.30890710E+04 0.30890710E+04 0.30853411E+04 + 0.32034241E+04 0.32027339E+04 0.32027339E+04 0.32054089E+04 + 0.32054089E+04 0.32058120E+04 0.32058120E+04 0.32011589E+04 + 0.32011589E+04 0.31936650E+04 0.31936650E+04 0.31930181E+04 + 0.31930181E+04 0.31978181E+04 0.31978181E+04 0.32002729E+04 + 0.32002729E+04 0.32014221E+04 0.32014221E+04 0.32063921E+04 + 0.32063921E+04 0.32137290E+04 0.31934741E+04 0.31950010E+04 + 0.31950010E+04 0.31997361E+04 0.31997361E+04 0.32005740E+04 + 0.32005740E+04 0.31974519E+04 0.31974519E+04 0.31949780E+04 + 0.31949780E+04 0.31989080E+04 0.31989080E+04 0.32052170E+04 + 0.32052170E+04 0.32070859E+04 0.32070859E+04 0.32097871E+04 + 0.32097871E+04 0.32145439E+04 0.32145439E+04 0.32184121E+04 + 0.31934741E+04 0.31950010E+04 0.31950010E+04 0.31997361E+04 + 0.31997361E+04 0.32005740E+04 0.32005740E+04 0.31974519E+04 + 0.31974519E+04 0.31949780E+04 0.31949780E+04 0.31989080E+04 + 0.31989080E+04 0.32052170E+04 0.32052170E+04 0.32070859E+04 + 0.32070859E+04 0.32097871E+04 0.32097871E+04 0.32145439E+04 + 0.32145439E+04 0.32184121E+04 0.31855249E+04 0.31871230E+04 + 0.31871230E+04 0.31905181E+04 0.31905181E+04 0.31880869E+04 + 0.31880869E+04 0.31861870E+04 0.31861870E+04 0.31882959E+04 + 0.31882959E+04 0.31945830E+04 0.31945830E+04 0.32018120E+04 + 0.32018120E+04 0.32060090E+04 0.32060090E+04 0.32114800E+04 + 0.32114800E+04 0.32167419E+04 0.32167419E+04 0.32187849E+04 + 0.31855249E+04 0.31871230E+04 0.31871230E+04 0.31905181E+04 + 0.31905181E+04 0.31880869E+04 0.31880869E+04 0.31861870E+04 + 0.31861870E+04 0.31882959E+04 0.31882959E+04 0.31945830E+04 + 0.31945830E+04 0.32018120E+04 0.32018120E+04 0.32060090E+04 + 0.32060090E+04 0.32114800E+04 0.32114800E+04 0.32167419E+04 + 0.32167419E+04 0.32187849E+04 0.31741580E+04 0.31675520E+04 + 0.31675520E+04 0.31677251E+04 0.31677251E+04 0.31672771E+04 + 0.31672771E+04 0.31762900E+04 0.31762900E+04 0.31878491E+04 + 0.31878491E+04 0.31962471E+04 0.31962471E+04 0.32005640E+04 + 0.32005640E+04 0.32043169E+04 0.32043169E+04 0.32099619E+04 + 0.32099619E+04 0.32163069E+04 0.32163069E+04 0.32209819E+04 + 0.31741580E+04 0.31675520E+04 0.31675520E+04 0.31677251E+04 + 0.31677251E+04 0.31672771E+04 0.31672771E+04 0.31762900E+04 + 0.31762900E+04 0.31878491E+04 0.31878491E+04 0.31962471E+04 + 0.31962471E+04 0.32005640E+04 0.32005640E+04 0.32043169E+04 + 0.32043169E+04 0.32099619E+04 0.32099619E+04 0.32163069E+04 + 0.32163069E+04 0.32209819E+04 0.31749541E+04 0.31699719E+04 + 0.31699719E+04 0.31719561E+04 0.31719561E+04 0.31726631E+04 + 0.31726631E+04 0.31757930E+04 0.31757930E+04 0.31816379E+04 + 0.31816379E+04 0.31861960E+04 0.31861960E+04 0.31879990E+04 + 0.31879990E+04 0.31941809E+04 0.31941809E+04 0.32048030E+04 + 0.32048030E+04 0.32153259E+04 0.32153259E+04 0.32244351E+04 + 0.31749541E+04 0.31699719E+04 0.31699719E+04 0.31719561E+04 + 0.31719561E+04 0.31726631E+04 0.31726631E+04 0.31757930E+04 + 0.31757930E+04 0.31816379E+04 0.31816379E+04 0.31861960E+04 + 0.31861960E+04 0.31879990E+04 0.31879990E+04 0.31941809E+04 + 0.31941809E+04 0.32048030E+04 0.32048030E+04 0.32153259E+04 + 0.32153259E+04 0.32244351E+04 0.31889360E+04 0.31904309E+04 + 0.31904309E+04 0.31914290E+04 0.31914290E+04 0.31878979E+04 + 0.31878979E+04 0.31799241E+04 0.31799241E+04 0.31755820E+04 + 0.31755820E+04 0.31778579E+04 0.31778579E+04 0.31831799E+04 + 0.31831799E+04 0.31884629E+04 0.31884629E+04 0.31974851E+04 + 0.31974851E+04 0.32097690E+04 0.32097690E+04 0.32220090E+04 + 0.31889360E+04 0.31904309E+04 0.31904309E+04 0.31914290E+04 + 0.31914290E+04 0.31878979E+04 0.31878979E+04 0.31799241E+04 + 0.31799241E+04 0.31755820E+04 0.31755820E+04 0.31778579E+04 + 0.31778579E+04 0.31831799E+04 0.31831799E+04 0.31884629E+04 + 0.31884629E+04 0.31974851E+04 0.31974851E+04 0.32097690E+04 + 0.32097690E+04 0.32220090E+04 0.31868789E+04 0.31950991E+04 + 0.31950991E+04 0.31987380E+04 0.31987380E+04 0.31968711E+04 + 0.31968711E+04 0.31927261E+04 0.31927261E+04 0.31875559E+04 + 0.31875559E+04 0.31860249E+04 0.31860249E+04 0.31840950E+04 + 0.31840950E+04 0.31825271E+04 0.31825271E+04 0.31887480E+04 + 0.31887480E+04 0.32015271E+04 0.32015271E+04 0.32148940E+04 + 0.31868789E+04 0.31950991E+04 0.31950991E+04 0.31987380E+04 + 0.31987380E+04 0.31968711E+04 0.31968711E+04 0.31927261E+04 + 0.31927261E+04 0.31875559E+04 0.31875559E+04 0.31860249E+04 + 0.31860249E+04 0.31840950E+04 0.31840950E+04 0.31825271E+04 + 0.31825271E+04 0.31887480E+04 0.31887480E+04 0.32015271E+04 + 0.32015271E+04 0.32148940E+04 0.31846101E+04 0.31917290E+04 + 0.31917290E+04 0.31973860E+04 0.31973860E+04 0.31965691E+04 + 0.31965691E+04 0.31951819E+04 0.31951819E+04 0.31935991E+04 + 0.31935991E+04 0.31905740E+04 0.31905740E+04 0.31820911E+04 + 0.31820911E+04 0.31779080E+04 0.31779080E+04 0.31812190E+04 + 0.31812190E+04 0.31893320E+04 0.31893320E+04 0.31986030E+04 + 0.31846101E+04 0.31917290E+04 0.31917290E+04 0.31973860E+04 + 0.31973860E+04 0.31965691E+04 0.31965691E+04 0.31951819E+04 + 0.31951819E+04 0.31935991E+04 0.31935991E+04 0.31905740E+04 + 0.31905740E+04 0.31820911E+04 0.31820911E+04 0.31779080E+04 + 0.31779080E+04 0.31812190E+04 0.31812190E+04 0.31893320E+04 + 0.31893320E+04 0.31986030E+04 0.31937380E+04 0.31950669E+04 + 0.31950669E+04 0.32025149E+04 0.32025149E+04 0.32024390E+04 + 0.32024390E+04 0.31966130E+04 0.31966130E+04 0.31928291E+04 + 0.31928291E+04 0.31894709E+04 0.31894709E+04 0.31814561E+04 + 0.31814561E+04 0.31747500E+04 0.31747500E+04 0.31773899E+04 + 0.31773899E+04 0.31820730E+04 0.31820730E+04 0.31867151E+04 + 0.31937380E+04 0.31950669E+04 0.31950669E+04 0.32025149E+04 + 0.32025149E+04 0.32024390E+04 0.32024390E+04 0.31966130E+04 + 0.31966130E+04 0.31928291E+04 0.31928291E+04 0.31894709E+04 + 0.31894709E+04 0.31814561E+04 0.31814561E+04 0.31747500E+04 + 0.31747500E+04 0.31773899E+04 0.31773899E+04 0.31820730E+04 + 0.31820730E+04 0.31867151E+04 0.32054170E+04 0.32031860E+04 + 0.32031860E+04 0.32080779E+04 0.32080779E+04 0.32077380E+04 + 0.32077380E+04 0.32007781E+04 0.32007781E+04 0.31938931E+04 + 0.31938931E+04 0.31885491E+04 0.31885491E+04 0.31804270E+04 + 0.31804270E+04 0.31732351E+04 0.31732351E+04 0.31743330E+04 + 0.31743330E+04 0.31793840E+04 0.31793840E+04 0.31867300E+04 + 0.32054170E+04 0.32031860E+04 0.32031860E+04 0.32080779E+04 + 0.32080779E+04 0.32077380E+04 0.32077380E+04 0.32007781E+04 + 0.32007781E+04 0.31938931E+04 0.31938931E+04 0.31885491E+04 + 0.31885491E+04 0.31804270E+04 0.31804270E+04 0.31732351E+04 + 0.31732351E+04 0.31743330E+04 0.31743330E+04 0.31793840E+04 + 0.31793840E+04 0.31867300E+04 0.32018601E+04 0.32013049E+04 + 0.32013049E+04 0.32038740E+04 0.32038740E+04 0.32029919E+04 + 0.32029919E+04 0.31951780E+04 0.31951780E+04 0.31863120E+04 + 0.31863120E+04 0.31817561E+04 0.31817561E+04 0.31778721E+04 + 0.31778721E+04 0.31744070E+04 0.31744070E+04 0.31750049E+04 + 0.31750049E+04 0.31808379E+04 0.31808379E+04 0.31903779E+04 + 0.32018601E+04 0.32013049E+04 0.32013049E+04 0.32038740E+04 + 0.32038740E+04 0.32029919E+04 0.32029919E+04 0.31951780E+04 + 0.31951780E+04 0.31863120E+04 0.31863120E+04 0.31817561E+04 + 0.31817561E+04 0.31778721E+04 0.31778721E+04 0.31744070E+04 + 0.31744070E+04 0.31750049E+04 0.31750049E+04 0.31808379E+04 + 0.30511609E+04 0.30514619E+04 0.31959641E+04 0.31894961E+04 + 0.31894961E+04 0.31914270E+04 0.31914270E+04 0.31919519E+04 + 0.31919519E+04 0.31866230E+04 0.31866230E+04 0.31808330E+04 + 0.31808330E+04 0.31777849E+04 0.31777849E+04 0.31754309E+04 + 0.31754309E+04 0.31758999E+04 0.31758999E+04 0.31772729E+04 + 0.31772729E+04 0.31797251E+04 0.30559890E+04 0.30528831E+04 + 0.31959641E+04 0.31894961E+04 0.31894961E+04 0.31914270E+04 + 0.31914270E+04 0.31919519E+04 0.31919519E+04 0.31866230E+04 + 0.31866230E+04 0.31808330E+04 0.31808330E+04 0.31777849E+04 + 0.31777849E+04 0.31754309E+04 0.31754309E+04 0.31758999E+04 + 0.30882820E+04 0.30851069E+04 0.30851069E+04 0.30837991E+04 + 0.30559890E+04 0.30528831E+04 0.31993970E+04 0.31848479E+04 + 0.31848479E+04 0.31823159E+04 0.31823159E+04 0.31813630E+04 + 0.31813630E+04 0.31787529E+04 0.31787529E+04 0.31758169E+04 + 0.31758169E+04 0.31746931E+04 0.31746931E+04 0.31749390E+04 + 0.31749390E+04 0.31752720E+04 0.30871851E+04 0.30862581E+04 + 0.30862581E+04 0.30845950E+04 0.30555029E+04 0.30528750E+04 + 0.31993970E+04 0.31848479E+04 0.31848479E+04 0.31823159E+04 + 0.31823159E+04 0.31813630E+04 0.31813630E+04 0.31787529E+04 + 0.31787529E+04 0.31758169E+04 0.31758169E+04 0.31746931E+04 + 0.31004109E+04 0.30960779E+04 0.30960779E+04 0.30871851E+04 + 0.30871851E+04 0.30862581E+04 0.30862581E+04 0.30845950E+04 + 0.30555029E+04 0.30528750E+04 0.32001189E+04 0.31861379E+04 + 0.31861379E+04 0.31796399E+04 0.31796399E+04 0.31771809E+04 + 0.31771809E+04 0.31748501E+04 0.31748501E+04 0.31741851E+04 + 0.31741851E+04 0.31733159E+04 0.31020181E+04 0.30987429E+04 + 0.30987429E+04 0.30928921E+04 0.30928921E+04 0.30886460E+04 + 0.30886460E+04 0.30860000E+04 0.30557800E+04 0.30531240E+04 + 0.32001189E+04 0.31861379E+04 0.31861379E+04 0.31796399E+04 + 0.31796399E+04 0.31771809E+04 0.31771809E+04 0.31748501E+04 + 0.31095791E+04 0.31060500E+04 0.31060500E+04 0.31020181E+04 + 0.31020181E+04 0.30987429E+04 0.30987429E+04 0.30928921E+04 + 0.30928921E+04 0.30886460E+04 0.30886460E+04 0.30860000E+04 + 0.30557800E+04 0.30531240E+04 0.31956011E+04 0.31882561E+04 + 0.31882561E+04 0.31814331E+04 0.31814331E+04 0.31792419E+04 + 0.31792419E+04 0.31755730E+04 0.31112910E+04 0.31081819E+04 + 0.31081819E+04 0.31047771E+04 0.31047771E+04 0.31012029E+04 + 0.31012029E+04 0.30956169E+04 0.30956169E+04 0.30894570E+04 + 0.30894570E+04 0.30867920E+04 0.30559810E+04 0.30538220E+04 + 0.31956011E+04 0.31882561E+04 0.31882561E+04 0.31814331E+04 + 0.31206709E+04 0.31167629E+04 0.31167629E+04 0.31112910E+04 + 0.31112910E+04 0.31081819E+04 0.31081819E+04 0.31047771E+04 + 0.31047771E+04 0.31012029E+04 0.31012029E+04 0.30956169E+04 + 0.30956169E+04 0.30894570E+04 0.30894570E+04 0.30867920E+04 + 0.30559810E+04 0.30538220E+04 0.31946990E+04 0.31898850E+04 + 0.31898850E+04 0.31839951E+04 0.31239460E+04 0.31193279E+04 + 0.31193279E+04 0.31134551E+04 0.31134551E+04 0.31086150E+04 + 0.31086150E+04 0.31023621E+04 0.31023621E+04 0.30985010E+04 + 0.30985010E+04 0.30962500E+04 0.30962500E+04 0.30918789E+04 + 0.30918789E+04 0.30877610E+04 0.30567510E+04 0.30543430E+04 + 0.31319451E+04 0.31289470E+04 0.31289470E+04 0.31239460E+04 + 0.31239460E+04 0.31193279E+04 0.31193279E+04 0.31134551E+04 + 0.31134551E+04 0.31086150E+04 0.31086150E+04 0.31023621E+04 + 0.31023621E+04 0.30985010E+04 0.30985010E+04 0.30962500E+04 + 0.30962500E+04 0.30918789E+04 0.30918789E+04 0.30877610E+04 + 0.30877610E+04 0.30849099E+04 0.31337361E+04 0.31314939E+04 + 0.31314939E+04 0.31294670E+04 0.31294670E+04 0.31241831E+04 + 0.31241831E+04 0.31112820E+04 0.31112820E+04 0.31037100E+04 + 0.31037100E+04 0.30990291E+04 0.30990291E+04 0.30981311E+04 + 0.30981311E+04 0.31000859E+04 0.31000859E+04 0.30955300E+04 + 0.30955300E+04 0.30890710E+04 0.30890710E+04 0.30853411E+04 + 0.32052749E+04 0.32044199E+04 0.32044199E+04 0.32071211E+04 + 0.32071211E+04 0.32076179E+04 0.32076179E+04 0.32030259E+04 + 0.32030259E+04 0.31953601E+04 0.31953601E+04 0.31945081E+04 + 0.31945081E+04 0.31992419E+04 0.31992419E+04 0.32018130E+04 + 0.32018130E+04 0.32030029E+04 0.32030029E+04 0.32079451E+04 + 0.32079451E+04 0.32152871E+04 0.31953589E+04 0.31966790E+04 + 0.31966790E+04 0.32014761E+04 0.32014761E+04 0.32024419E+04 + 0.32024419E+04 0.31993140E+04 0.31993140E+04 0.31966521E+04 + 0.31966521E+04 0.32004390E+04 0.32004390E+04 0.32067759E+04 + 0.32067759E+04 0.32088091E+04 0.32088091E+04 0.32114419E+04 + 0.32114419E+04 0.32161919E+04 0.32161919E+04 0.32199260E+04 + 0.31953589E+04 0.31966790E+04 0.31966790E+04 0.32014761E+04 + 0.32014761E+04 0.32024419E+04 0.32024419E+04 0.31993140E+04 + 0.31993140E+04 0.31966521E+04 0.31966521E+04 0.32004390E+04 + 0.32004390E+04 0.32067759E+04 0.32067759E+04 0.32088091E+04 + 0.32088091E+04 0.32114419E+04 0.32114419E+04 0.32161919E+04 + 0.32161919E+04 0.32199260E+04 0.31874700E+04 0.31889241E+04 + 0.31889241E+04 0.31924080E+04 0.31924080E+04 0.31899919E+04 + 0.31899919E+04 0.31878459E+04 0.31878459E+04 0.31897009E+04 + 0.31897009E+04 0.31958931E+04 0.31958931E+04 0.32031890E+04 + 0.32031890E+04 0.32075100E+04 0.32075100E+04 0.32129680E+04 + 0.32129680E+04 0.32182581E+04 0.32182581E+04 0.32200630E+04 + 0.31874700E+04 0.31889241E+04 0.31889241E+04 0.31924080E+04 + 0.31924080E+04 0.31899919E+04 0.31899919E+04 0.31878459E+04 + 0.31878459E+04 0.31897009E+04 0.31897009E+04 0.31958931E+04 + 0.31958931E+04 0.32031890E+04 0.32031890E+04 0.32075100E+04 + 0.32075100E+04 0.32129680E+04 0.32129680E+04 0.32182581E+04 + 0.32182581E+04 0.32200630E+04 0.31757830E+04 0.31690779E+04 + 0.31690779E+04 0.31692661E+04 0.31692661E+04 0.31685330E+04 + 0.31685330E+04 0.31773469E+04 0.31773469E+04 0.31888701E+04 + 0.31888701E+04 0.31973530E+04 0.31973530E+04 0.32018110E+04 + 0.32018110E+04 0.32055940E+04 0.32055940E+04 0.32111101E+04 + 0.32111101E+04 0.32173181E+04 0.32173181E+04 0.32218020E+04 + 0.31757830E+04 0.31690779E+04 0.31690779E+04 0.31692661E+04 + 0.31692661E+04 0.31685330E+04 0.31685330E+04 0.31773469E+04 + 0.31773469E+04 0.31888701E+04 0.31888701E+04 0.31973530E+04 + 0.31973530E+04 0.32018110E+04 0.32018110E+04 0.32055940E+04 + 0.32055940E+04 0.32111101E+04 0.32111101E+04 0.32173181E+04 + 0.32173181E+04 0.32218020E+04 0.31757800E+04 0.31708660E+04 + 0.31708660E+04 0.31729280E+04 0.31729280E+04 0.31736709E+04 + 0.31736709E+04 0.31767991E+04 0.31767991E+04 0.31826479E+04 + 0.31826479E+04 0.31871960E+04 0.31871960E+04 0.31888911E+04 + 0.31888911E+04 0.31949951E+04 0.31949951E+04 0.32055710E+04 + 0.32055710E+04 0.32160540E+04 0.32160540E+04 0.32251370E+04 + 0.31757800E+04 0.31708660E+04 0.31708660E+04 0.31729280E+04 + 0.31729280E+04 0.31736709E+04 0.31736709E+04 0.31767991E+04 + 0.31767991E+04 0.31826479E+04 0.31826479E+04 0.31871960E+04 + 0.31871960E+04 0.31888911E+04 0.31888911E+04 0.31949951E+04 + 0.31949951E+04 0.32055710E+04 0.32055710E+04 0.32160540E+04 + 0.32160540E+04 0.32251370E+04 0.31897739E+04 0.31912151E+04 + 0.31912151E+04 0.31922561E+04 0.31922561E+04 0.31887991E+04 + 0.31887991E+04 0.31807839E+04 0.31807839E+04 0.31763191E+04 + 0.31763191E+04 0.31785249E+04 0.31785249E+04 0.31839070E+04 + 0.31839070E+04 0.31891831E+04 0.31891831E+04 0.31981121E+04 + 0.31981121E+04 0.32103979E+04 0.32103979E+04 0.32226560E+04 + 0.31897739E+04 0.31912151E+04 0.31912151E+04 0.31922561E+04 + 0.31922561E+04 0.31887991E+04 0.31887991E+04 0.31807839E+04 + 0.31807839E+04 0.31763191E+04 0.31763191E+04 0.31785249E+04 + 0.31785249E+04 0.31839070E+04 0.31839070E+04 0.31891831E+04 + 0.31891831E+04 0.31981121E+04 0.31981121E+04 0.32103979E+04 + 0.32103979E+04 0.32226560E+04 0.31876179E+04 0.31958140E+04 + 0.31958140E+04 0.31995830E+04 0.31995830E+04 0.31977629E+04 + 0.31977629E+04 0.31935669E+04 0.31935669E+04 0.31882620E+04 + 0.31882620E+04 0.31867219E+04 0.31867219E+04 0.31848320E+04 + 0.31848320E+04 0.31831521E+04 0.31831521E+04 0.31892949E+04 + 0.31892949E+04 0.32021709E+04 0.32021709E+04 0.32156760E+04 + 0.31876179E+04 0.31958140E+04 0.31958140E+04 0.31995830E+04 + 0.31995830E+04 0.31977629E+04 0.31977629E+04 0.31935669E+04 + 0.31935669E+04 0.31882620E+04 0.31882620E+04 0.31867219E+04 + 0.31867219E+04 0.31848320E+04 0.31848320E+04 0.31831521E+04 + 0.31831521E+04 0.31892949E+04 0.31892949E+04 0.32021709E+04 + 0.32021709E+04 0.32156760E+04 0.31852649E+04 0.31923879E+04 + 0.31923879E+04 0.31981641E+04 0.31981641E+04 0.31973760E+04 + 0.31973760E+04 0.31959609E+04 0.31959609E+04 0.31943420E+04 + 0.31943420E+04 0.31913850E+04 0.31913850E+04 0.31828621E+04 + 0.31828621E+04 0.31785779E+04 0.31785779E+04 0.31817971E+04 + 0.31817971E+04 0.31899629E+04 0.31899629E+04 0.31993889E+04 + 0.31852649E+04 0.31923879E+04 0.31923879E+04 0.31981641E+04 + 0.31981641E+04 0.31973760E+04 0.31973760E+04 0.31959609E+04 + 0.31959609E+04 0.31943420E+04 0.31943420E+04 0.31913850E+04 + 0.31913850E+04 0.31828621E+04 0.31828621E+04 0.31785779E+04 + 0.31785779E+04 0.31817971E+04 0.31817971E+04 0.31899629E+04 + 0.31899629E+04 0.31993889E+04 0.31944919E+04 0.31956799E+04 + 0.31956799E+04 0.32031890E+04 0.32031890E+04 0.32032419E+04 + 0.32032419E+04 0.31973740E+04 0.31973740E+04 0.31935630E+04 + 0.31935630E+04 0.31902561E+04 0.31902561E+04 0.31822661E+04 + 0.31822661E+04 0.31754319E+04 0.31754319E+04 0.31779861E+04 + 0.31779861E+04 0.31826560E+04 0.31826560E+04 0.31873049E+04 + 0.31944919E+04 0.31956799E+04 0.31956799E+04 0.32031890E+04 + 0.32031890E+04 0.32032419E+04 0.32032419E+04 0.31973740E+04 + 0.31973740E+04 0.31935630E+04 0.31935630E+04 0.31902561E+04 + 0.31902561E+04 0.31822661E+04 0.31822661E+04 0.31754319E+04 + 0.31754319E+04 0.31779861E+04 0.31779861E+04 0.31826560E+04 + 0.31826560E+04 0.31873049E+04 0.32063811E+04 0.32038999E+04 + 0.32038999E+04 0.32087859E+04 0.32087859E+04 0.32085720E+04 + 0.32085720E+04 0.32016299E+04 0.32016299E+04 0.31946970E+04 + 0.31946970E+04 0.31893369E+04 0.31893369E+04 0.31812100E+04 + 0.31812100E+04 0.31739231E+04 0.31739231E+04 0.31749541E+04 + 0.31749541E+04 0.31800481E+04 0.31800481E+04 0.31875891E+04 + 0.32063811E+04 0.32038999E+04 0.32038999E+04 0.32087859E+04 + 0.32087859E+04 0.32085720E+04 0.32085720E+04 0.32016299E+04 + 0.32016299E+04 0.31946970E+04 0.31946970E+04 0.31893369E+04 + 0.31893369E+04 0.31812100E+04 0.31812100E+04 0.31739231E+04 + 0.31739231E+04 0.31749541E+04 0.31749541E+04 0.31800481E+04 + 0.31800481E+04 0.31875891E+04 0.32028469E+04 0.32021311E+04 + 0.32021311E+04 0.32046670E+04 0.32046670E+04 0.32038921E+04 + 0.32038921E+04 0.31961311E+04 0.31961311E+04 0.31871931E+04 + 0.31871931E+04 0.31825669E+04 0.31825669E+04 0.31785969E+04 + 0.31785969E+04 0.31750510E+04 0.31750510E+04 0.31756279E+04 + 0.31756279E+04 0.31815759E+04 0.31815759E+04 0.31914031E+04 + 0.32028469E+04 0.32021311E+04 0.32021311E+04 0.32046670E+04 + 0.32046670E+04 0.32038921E+04 0.32038921E+04 0.31961311E+04 + 0.31961311E+04 0.31871931E+04 0.31871931E+04 0.31825669E+04 + 0.31825669E+04 0.31785969E+04 0.31785969E+04 0.31750510E+04 + 0.31750510E+04 0.31756279E+04 0.31756279E+04 0.31815759E+04 + 0.30516951E+04 0.30520811E+04 0.31969709E+04 0.31903301E+04 + 0.31903301E+04 0.31921841E+04 0.31921841E+04 0.31928301E+04 + 0.31928301E+04 0.31876001E+04 0.31876001E+04 0.31817271E+04 + 0.31817271E+04 0.31785879E+04 0.31785879E+04 0.31761101E+04 + 0.31761101E+04 0.31765830E+04 0.31765830E+04 0.31779609E+04 + 0.31779609E+04 0.31804290E+04 0.30565259E+04 0.30535161E+04 + 0.31969709E+04 0.31903301E+04 0.31903301E+04 0.31921841E+04 + 0.31921841E+04 0.31928301E+04 0.31928301E+04 0.31876001E+04 + 0.31876001E+04 0.31817271E+04 0.31817271E+04 0.31785879E+04 + 0.31785879E+04 0.31761101E+04 0.31761101E+04 0.31765830E+04 + 0.30891660E+04 0.30860181E+04 0.30860181E+04 0.30847390E+04 + 0.30565259E+04 0.30535161E+04 0.32005259E+04 0.31858010E+04 + 0.31858010E+04 0.31831660E+04 0.31831660E+04 0.31822051E+04 + 0.31822051E+04 0.31796079E+04 0.31796079E+04 0.31766399E+04 + 0.31766399E+04 0.31754670E+04 0.31754670E+04 0.31756450E+04 + 0.31756450E+04 0.31760120E+04 0.30879971E+04 0.30871570E+04 + 0.30871570E+04 0.30855569E+04 0.30560439E+04 0.30534561E+04 + 0.32005259E+04 0.31858010E+04 0.31858010E+04 0.31831660E+04 + 0.31831660E+04 0.31822051E+04 0.31822051E+04 0.31796079E+04 + 0.31796079E+04 0.31766399E+04 0.31766399E+04 0.31754670E+04 + 0.31013640E+04 0.30970371E+04 0.30970371E+04 0.30879971E+04 + 0.30879971E+04 0.30871570E+04 0.30871570E+04 0.30855569E+04 + 0.30560439E+04 0.30534561E+04 0.32013689E+04 0.31871731E+04 + 0.31871731E+04 0.31805759E+04 0.31805759E+04 0.31780400E+04 + 0.31780400E+04 0.31756799E+04 0.31756799E+04 0.31749871E+04 + 0.31749871E+04 0.31741321E+04 0.31029741E+04 0.30997561E+04 + 0.30997561E+04 0.30938760E+04 0.30938760E+04 0.30895759E+04 + 0.30895759E+04 0.30869529E+04 0.30563169E+04 0.30536951E+04 + 0.32013689E+04 0.31871731E+04 0.31871731E+04 0.31805759E+04 + 0.31805759E+04 0.31780400E+04 0.31780400E+04 0.31756799E+04 + 0.31105190E+04 0.31070020E+04 0.31070020E+04 0.31029741E+04 + 0.31029741E+04 0.30997561E+04 0.30997561E+04 0.30938760E+04 + 0.30938760E+04 0.30895759E+04 0.30895759E+04 0.30869529E+04 + 0.30563169E+04 0.30536951E+04 0.31964929E+04 0.31891721E+04 + 0.31891721E+04 0.31823059E+04 0.31823059E+04 0.31801411E+04 + 0.31801411E+04 0.31764910E+04 0.31122681E+04 0.31092070E+04 + 0.31092070E+04 0.31057590E+04 0.31057590E+04 0.31021499E+04 + 0.31021499E+04 0.30965991E+04 0.30965991E+04 0.30903621E+04 + 0.30903621E+04 0.30877300E+04 0.30565330E+04 0.30544180E+04 + 0.31964929E+04 0.31891721E+04 0.31891721E+04 0.31823059E+04 + 0.31216111E+04 0.31177170E+04 0.31177170E+04 0.31122681E+04 + 0.31122681E+04 0.31092070E+04 0.31092070E+04 0.31057590E+04 + 0.31057590E+04 0.31021499E+04 0.31021499E+04 0.30965991E+04 + 0.30965991E+04 0.30903621E+04 0.30903621E+04 0.30877300E+04 + 0.30565330E+04 0.30544180E+04 0.31955210E+04 0.31907571E+04 + 0.31907571E+04 0.31848669E+04 0.31248899E+04 0.31203640E+04 + 0.31203640E+04 0.31145139E+04 0.31145139E+04 0.31096179E+04 + 0.31096179E+04 0.31033059E+04 0.31033059E+04 0.30994819E+04 + 0.30994819E+04 0.30972351E+04 0.30972351E+04 0.30927871E+04 + 0.30927871E+04 0.30886440E+04 0.30573240E+04 0.30549351E+04 + 0.31327061E+04 0.31297581E+04 0.31297581E+04 0.31248899E+04 + 0.31248899E+04 0.31203640E+04 0.31203640E+04 0.31145139E+04 + 0.31145139E+04 0.31096179E+04 0.31096179E+04 0.31033059E+04 + 0.31033059E+04 0.30994819E+04 0.30994819E+04 0.30972351E+04 + 0.30972351E+04 0.30927871E+04 0.30927871E+04 0.30886440E+04 + 0.30886440E+04 0.30857781E+04 0.31344990E+04 0.31322800E+04 + 0.31322800E+04 0.31304690E+04 0.31304690E+04 0.31253391E+04 + 0.31253391E+04 0.31122241E+04 0.31122241E+04 0.31046011E+04 + 0.31046011E+04 0.30999041E+04 0.30999041E+04 0.30990239E+04 + 0.30990239E+04 0.31010640E+04 0.31010640E+04 0.30964221E+04 + 0.30964221E+04 0.30898950E+04 0.30898950E+04 0.30861531E+04 + 0.32052749E+04 0.32044199E+04 0.32044199E+04 0.32071211E+04 + 0.32071211E+04 0.32076179E+04 0.32076179E+04 0.32030259E+04 + 0.32030259E+04 0.31953601E+04 0.31953601E+04 0.31945081E+04 + 0.31945081E+04 0.31992419E+04 0.31992419E+04 0.32018130E+04 + 0.32018130E+04 0.32030029E+04 0.32030029E+04 0.32079451E+04 + 0.32079451E+04 0.32152871E+04 0.31953589E+04 0.31966790E+04 + 0.31966790E+04 0.32014761E+04 0.32014761E+04 0.32024419E+04 + 0.32024419E+04 0.31993140E+04 0.31993140E+04 0.31966521E+04 + 0.31966521E+04 0.32004390E+04 0.32004390E+04 0.32067759E+04 + 0.32067759E+04 0.32088091E+04 0.32088091E+04 0.32114419E+04 + 0.32114419E+04 0.32161919E+04 0.32161919E+04 0.32199260E+04 + 0.31953589E+04 0.31966790E+04 0.31966790E+04 0.32014761E+04 + 0.32014761E+04 0.32024419E+04 0.32024419E+04 0.31993140E+04 + 0.31993140E+04 0.31966521E+04 0.31966521E+04 0.32004390E+04 + 0.32004390E+04 0.32067759E+04 0.32067759E+04 0.32088091E+04 + 0.32088091E+04 0.32114419E+04 0.32114419E+04 0.32161919E+04 + 0.32161919E+04 0.32199260E+04 0.31874700E+04 0.31889241E+04 + 0.31889241E+04 0.31924080E+04 0.31924080E+04 0.31899919E+04 + 0.31899919E+04 0.31878459E+04 0.31878459E+04 0.31897009E+04 + 0.31897009E+04 0.31958931E+04 0.31958931E+04 0.32031890E+04 + 0.32031890E+04 0.32075100E+04 0.32075100E+04 0.32129680E+04 + 0.32129680E+04 0.32182581E+04 0.32182581E+04 0.32200630E+04 + 0.31874700E+04 0.31889241E+04 0.31889241E+04 0.31924080E+04 + 0.31924080E+04 0.31899919E+04 0.31899919E+04 0.31878459E+04 + 0.31878459E+04 0.31897009E+04 0.31897009E+04 0.31958931E+04 + 0.31958931E+04 0.32031890E+04 0.32031890E+04 0.32075100E+04 + 0.32075100E+04 0.32129680E+04 0.32129680E+04 0.32182581E+04 + 0.32182581E+04 0.32200630E+04 0.31757830E+04 0.31690779E+04 + 0.31690779E+04 0.31692661E+04 0.31692661E+04 0.31685330E+04 + 0.31685330E+04 0.31773469E+04 0.31773469E+04 0.31888701E+04 + 0.31888701E+04 0.31973530E+04 0.31973530E+04 0.32018110E+04 + 0.32018110E+04 0.32055940E+04 0.32055940E+04 0.32111101E+04 + 0.32111101E+04 0.32173181E+04 0.32173181E+04 0.32218020E+04 + 0.31757830E+04 0.31690779E+04 0.31690779E+04 0.31692661E+04 + 0.31692661E+04 0.31685330E+04 0.31685330E+04 0.31773469E+04 + 0.31773469E+04 0.31888701E+04 0.31888701E+04 0.31973530E+04 + 0.31973530E+04 0.32018110E+04 0.32018110E+04 0.32055940E+04 + 0.32055940E+04 0.32111101E+04 0.32111101E+04 0.32173181E+04 + 0.32173181E+04 0.32218020E+04 0.31757800E+04 0.31708660E+04 + 0.31708660E+04 0.31729280E+04 0.31729280E+04 0.31736709E+04 + 0.31736709E+04 0.31767991E+04 0.31767991E+04 0.31826479E+04 + 0.31826479E+04 0.31871960E+04 0.31871960E+04 0.31888911E+04 + 0.31888911E+04 0.31949951E+04 0.31949951E+04 0.32055710E+04 + 0.32055710E+04 0.32160540E+04 0.32160540E+04 0.32251370E+04 + 0.31757800E+04 0.31708660E+04 0.31708660E+04 0.31729280E+04 + 0.31729280E+04 0.31736709E+04 0.31736709E+04 0.31767991E+04 + 0.31767991E+04 0.31826479E+04 0.31826479E+04 0.31871960E+04 + 0.31871960E+04 0.31888911E+04 0.31888911E+04 0.31949951E+04 + 0.31949951E+04 0.32055710E+04 0.32055710E+04 0.32160540E+04 + 0.32160540E+04 0.32251370E+04 0.31897739E+04 0.31912151E+04 + 0.31912151E+04 0.31922561E+04 0.31922561E+04 0.31887991E+04 + 0.31887991E+04 0.31807839E+04 0.31807839E+04 0.31763191E+04 + 0.31763191E+04 0.31785249E+04 0.31785249E+04 0.31839070E+04 + 0.31839070E+04 0.31891831E+04 0.31891831E+04 0.31981121E+04 + 0.31981121E+04 0.32103979E+04 0.32103979E+04 0.32226560E+04 + 0.31897739E+04 0.31912151E+04 0.31912151E+04 0.31922561E+04 + 0.31922561E+04 0.31887991E+04 0.31887991E+04 0.31807839E+04 + 0.31807839E+04 0.31763191E+04 0.31763191E+04 0.31785249E+04 + 0.31785249E+04 0.31839070E+04 0.31839070E+04 0.31891831E+04 + 0.31891831E+04 0.31981121E+04 0.31981121E+04 0.32103979E+04 + 0.32103979E+04 0.32226560E+04 0.31876179E+04 0.31958140E+04 + 0.31958140E+04 0.31995830E+04 0.31995830E+04 0.31977629E+04 + 0.31977629E+04 0.31935669E+04 0.31935669E+04 0.31882620E+04 + 0.31882620E+04 0.31867219E+04 0.31867219E+04 0.31848320E+04 + 0.31848320E+04 0.31831521E+04 0.31831521E+04 0.31892949E+04 + 0.31892949E+04 0.32021709E+04 0.32021709E+04 0.32156760E+04 + 0.31876179E+04 0.31958140E+04 0.31958140E+04 0.31995830E+04 + 0.31995830E+04 0.31977629E+04 0.31977629E+04 0.31935669E+04 + 0.31935669E+04 0.31882620E+04 0.31882620E+04 0.31867219E+04 + 0.31867219E+04 0.31848320E+04 0.31848320E+04 0.31831521E+04 + 0.31831521E+04 0.31892949E+04 0.31892949E+04 0.32021709E+04 + 0.32021709E+04 0.32156760E+04 0.31852649E+04 0.31923879E+04 + 0.31923879E+04 0.31981641E+04 0.31981641E+04 0.31973760E+04 + 0.31973760E+04 0.31959609E+04 0.31959609E+04 0.31943420E+04 + 0.31943420E+04 0.31913850E+04 0.31913850E+04 0.31828621E+04 + 0.31828621E+04 0.31785779E+04 0.31785779E+04 0.31817971E+04 + 0.31817971E+04 0.31899629E+04 0.31899629E+04 0.31993889E+04 + 0.31852649E+04 0.31923879E+04 0.31923879E+04 0.31981641E+04 + 0.31981641E+04 0.31973760E+04 0.31973760E+04 0.31959609E+04 + 0.31959609E+04 0.31943420E+04 0.31943420E+04 0.31913850E+04 + 0.31913850E+04 0.31828621E+04 0.31828621E+04 0.31785779E+04 + 0.31785779E+04 0.31817971E+04 0.31817971E+04 0.31899629E+04 + 0.31899629E+04 0.31993889E+04 0.31944919E+04 0.31956799E+04 + 0.31956799E+04 0.32031890E+04 0.32031890E+04 0.32032419E+04 + 0.32032419E+04 0.31973740E+04 0.31973740E+04 0.31935630E+04 + 0.31935630E+04 0.31902561E+04 0.31902561E+04 0.31822661E+04 + 0.31822661E+04 0.31754319E+04 0.31754319E+04 0.31779861E+04 + 0.31779861E+04 0.31826560E+04 0.31826560E+04 0.31873049E+04 + 0.31944919E+04 0.31956799E+04 0.31956799E+04 0.32031890E+04 + 0.32031890E+04 0.32032419E+04 0.32032419E+04 0.31973740E+04 + 0.31973740E+04 0.31935630E+04 0.31935630E+04 0.31902561E+04 + 0.31902561E+04 0.31822661E+04 0.31822661E+04 0.31754319E+04 + 0.31754319E+04 0.31779861E+04 0.31779861E+04 0.31826560E+04 + 0.31826560E+04 0.31873049E+04 0.32063811E+04 0.32038999E+04 + 0.32038999E+04 0.32087859E+04 0.32087859E+04 0.32085720E+04 + 0.32085720E+04 0.32016299E+04 0.32016299E+04 0.31946970E+04 + 0.31946970E+04 0.31893369E+04 0.31893369E+04 0.31812100E+04 + 0.31812100E+04 0.31739231E+04 0.31739231E+04 0.31749541E+04 + 0.31749541E+04 0.31800481E+04 0.31800481E+04 0.31875891E+04 + 0.32063811E+04 0.32038999E+04 0.32038999E+04 0.32087859E+04 + 0.32087859E+04 0.32085720E+04 0.32085720E+04 0.32016299E+04 + 0.32016299E+04 0.31946970E+04 0.31946970E+04 0.31893369E+04 + 0.31893369E+04 0.31812100E+04 0.31812100E+04 0.31739231E+04 + 0.31739231E+04 0.31749541E+04 0.31749541E+04 0.31800481E+04 + 0.31800481E+04 0.31875891E+04 0.32028469E+04 0.32021311E+04 + 0.32021311E+04 0.32046670E+04 0.32046670E+04 0.32038921E+04 + 0.32038921E+04 0.31961311E+04 0.31961311E+04 0.31871931E+04 + 0.31871931E+04 0.31825669E+04 0.31825669E+04 0.31785969E+04 + 0.31785969E+04 0.31750510E+04 0.31750510E+04 0.31756279E+04 + 0.31756279E+04 0.31815759E+04 0.31815759E+04 0.31914031E+04 + 0.32028469E+04 0.32021311E+04 0.32021311E+04 0.32046670E+04 + 0.32046670E+04 0.32038921E+04 0.32038921E+04 0.31961311E+04 + 0.31961311E+04 0.31871931E+04 0.31871931E+04 0.31825669E+04 + 0.31825669E+04 0.31785969E+04 0.31785969E+04 0.31750510E+04 + 0.31750510E+04 0.31756279E+04 0.31756279E+04 0.31815759E+04 + 0.30516951E+04 0.30520811E+04 0.31969709E+04 0.31903301E+04 + 0.31903301E+04 0.31921841E+04 0.31921841E+04 0.31928301E+04 + 0.31928301E+04 0.31876001E+04 0.31876001E+04 0.31817271E+04 + 0.31817271E+04 0.31785879E+04 0.31785879E+04 0.31761101E+04 + 0.31761101E+04 0.31765830E+04 0.31765830E+04 0.31779609E+04 + 0.31779609E+04 0.31804290E+04 0.30565259E+04 0.30535161E+04 + 0.31969709E+04 0.31903301E+04 0.31903301E+04 0.31921841E+04 + 0.31921841E+04 0.31928301E+04 0.31928301E+04 0.31876001E+04 + 0.31876001E+04 0.31817271E+04 0.31817271E+04 0.31785879E+04 + 0.31785879E+04 0.31761101E+04 0.31761101E+04 0.31765830E+04 + 0.30891660E+04 0.30860181E+04 0.30860181E+04 0.30847390E+04 + 0.30565259E+04 0.30535161E+04 0.32005259E+04 0.31858010E+04 + 0.31858010E+04 0.31831660E+04 0.31831660E+04 0.31822051E+04 + 0.31822051E+04 0.31796079E+04 0.31796079E+04 0.31766399E+04 + 0.31766399E+04 0.31754670E+04 0.31754670E+04 0.31756450E+04 + 0.31756450E+04 0.31760120E+04 0.30879971E+04 0.30871570E+04 + 0.30871570E+04 0.30855569E+04 0.30560439E+04 0.30534561E+04 + 0.32005259E+04 0.31858010E+04 0.31858010E+04 0.31831660E+04 + 0.31831660E+04 0.31822051E+04 0.31822051E+04 0.31796079E+04 + 0.31796079E+04 0.31766399E+04 0.31766399E+04 0.31754670E+04 + 0.31013640E+04 0.30970371E+04 0.30970371E+04 0.30879971E+04 + 0.30879971E+04 0.30871570E+04 0.30871570E+04 0.30855569E+04 + 0.30560439E+04 0.30534561E+04 0.32013689E+04 0.31871731E+04 + 0.31871731E+04 0.31805759E+04 0.31805759E+04 0.31780400E+04 + 0.31780400E+04 0.31756799E+04 0.31756799E+04 0.31749871E+04 + 0.31749871E+04 0.31741321E+04 0.31029741E+04 0.30997561E+04 + 0.30997561E+04 0.30938760E+04 0.30938760E+04 0.30895759E+04 + 0.30895759E+04 0.30869529E+04 0.30563169E+04 0.30536951E+04 + 0.32013689E+04 0.31871731E+04 0.31871731E+04 0.31805759E+04 + 0.31805759E+04 0.31780400E+04 0.31780400E+04 0.31756799E+04 + 0.31105190E+04 0.31070020E+04 0.31070020E+04 0.31029741E+04 + 0.31029741E+04 0.30997561E+04 0.30997561E+04 0.30938760E+04 + 0.30938760E+04 0.30895759E+04 0.30895759E+04 0.30869529E+04 + 0.30563169E+04 0.30536951E+04 0.31964929E+04 0.31891721E+04 + 0.31891721E+04 0.31823059E+04 0.31823059E+04 0.31801411E+04 + 0.31801411E+04 0.31764910E+04 0.31122681E+04 0.31092070E+04 + 0.31092070E+04 0.31057590E+04 0.31057590E+04 0.31021499E+04 + 0.31021499E+04 0.30965991E+04 0.30965991E+04 0.30903621E+04 + 0.30903621E+04 0.30877300E+04 0.30565330E+04 0.30544180E+04 + 0.31964929E+04 0.31891721E+04 0.31891721E+04 0.31823059E+04 + 0.31216111E+04 0.31177170E+04 0.31177170E+04 0.31122681E+04 + 0.31122681E+04 0.31092070E+04 0.31092070E+04 0.31057590E+04 + 0.31057590E+04 0.31021499E+04 0.31021499E+04 0.30965991E+04 + 0.30965991E+04 0.30903621E+04 0.30903621E+04 0.30877300E+04 + 0.30565330E+04 0.30544180E+04 0.31955210E+04 0.31907571E+04 + 0.31907571E+04 0.31848669E+04 0.31248899E+04 0.31203640E+04 + 0.31203640E+04 0.31145139E+04 0.31145139E+04 0.31096179E+04 + 0.31096179E+04 0.31033059E+04 0.31033059E+04 0.30994819E+04 + 0.30994819E+04 0.30972351E+04 0.30972351E+04 0.30927871E+04 + 0.30927871E+04 0.30886440E+04 0.30573240E+04 0.30549351E+04 + 0.31327061E+04 0.31297581E+04 0.31297581E+04 0.31248899E+04 + 0.31248899E+04 0.31203640E+04 0.31203640E+04 0.31145139E+04 + 0.31145139E+04 0.31096179E+04 0.31096179E+04 0.31033059E+04 + 0.31033059E+04 0.30994819E+04 0.30994819E+04 0.30972351E+04 + 0.30972351E+04 0.30927871E+04 0.30927871E+04 0.30886440E+04 + 0.30886440E+04 0.30857781E+04 0.31344990E+04 0.31322800E+04 + 0.31322800E+04 0.31304690E+04 0.31304690E+04 0.31253391E+04 + 0.31253391E+04 0.31122241E+04 0.31122241E+04 0.31046011E+04 + 0.31046011E+04 0.30999041E+04 0.30999041E+04 0.30990239E+04 + 0.30990239E+04 0.31010640E+04 0.31010640E+04 0.30964221E+04 + 0.30964221E+04 0.30898950E+04 0.30898950E+04 0.30861531E+04 + 0.32071260E+04 0.32061069E+04 0.32061069E+04 0.32088330E+04 + 0.32088330E+04 0.32094231E+04 0.32094231E+04 0.32048931E+04 + 0.32048931E+04 0.31970549E+04 0.31970549E+04 0.31959980E+04 + 0.31959980E+04 0.32006660E+04 0.32006660E+04 0.32033540E+04 + 0.32033540E+04 0.32045840E+04 0.32045840E+04 0.32094980E+04 + 0.32094980E+04 0.32168440E+04 0.31972429E+04 0.31983569E+04 + 0.31983569E+04 0.32032151E+04 0.32032151E+04 0.32043091E+04 + 0.32043091E+04 0.32011760E+04 0.32011760E+04 0.31983259E+04 + 0.31983259E+04 0.32019709E+04 0.32019709E+04 0.32083340E+04 + 0.32083340E+04 0.32105320E+04 0.32105320E+04 0.32130969E+04 + 0.32130969E+04 0.32178401E+04 0.32178401E+04 0.32214390E+04 + 0.31972429E+04 0.31983569E+04 0.31983569E+04 0.32032151E+04 + 0.32032151E+04 0.32043091E+04 0.32043091E+04 0.32011760E+04 + 0.32011760E+04 0.31983259E+04 0.31983259E+04 0.32019709E+04 + 0.32019709E+04 0.32083340E+04 0.32083340E+04 0.32105320E+04 + 0.32105320E+04 0.32130969E+04 0.32130969E+04 0.32178401E+04 + 0.32178401E+04 0.32214390E+04 0.31894150E+04 0.31907241E+04 + 0.31907241E+04 0.31942991E+04 0.31942991E+04 0.31918960E+04 + 0.31918960E+04 0.31895039E+04 0.31895039E+04 0.31911050E+04 + 0.31911050E+04 0.31972029E+04 0.31972029E+04 0.32045659E+04 + 0.32045659E+04 0.32090110E+04 0.32090110E+04 0.32144561E+04 + 0.32144561E+04 0.32197739E+04 0.32197739E+04 0.32213411E+04 + 0.31894150E+04 0.31907241E+04 0.31907241E+04 0.31942991E+04 + 0.31942991E+04 0.31918960E+04 0.31918960E+04 0.31895039E+04 + 0.31895039E+04 0.31911050E+04 0.31911050E+04 0.31972029E+04 + 0.31972029E+04 0.32045659E+04 0.32045659E+04 0.32090110E+04 + 0.32090110E+04 0.32144561E+04 0.32144561E+04 0.32197739E+04 + 0.32197739E+04 0.32213411E+04 0.31774080E+04 0.31706040E+04 + 0.31706040E+04 0.31708069E+04 0.31708069E+04 0.31697900E+04 + 0.31697900E+04 0.31784050E+04 0.31784050E+04 0.31898911E+04 + 0.31898911E+04 0.31984590E+04 0.31984590E+04 0.32030569E+04 + 0.32030569E+04 0.32068711E+04 0.32068711E+04 0.32122590E+04 + 0.32122590E+04 0.32183279E+04 0.32183279E+04 0.32226230E+04 + 0.31774080E+04 0.31706040E+04 0.31706040E+04 0.31708069E+04 + 0.31708069E+04 0.31697900E+04 0.31697900E+04 0.31784050E+04 + 0.31784050E+04 0.31898911E+04 0.31898911E+04 0.31984590E+04 + 0.31984590E+04 0.32030569E+04 0.32030569E+04 0.32068711E+04 + 0.32068711E+04 0.32122590E+04 0.32122590E+04 0.32183279E+04 + 0.32183279E+04 0.32226230E+04 0.31766069E+04 0.31717600E+04 + 0.31717600E+04 0.31739009E+04 0.31739009E+04 0.31746799E+04 + 0.31746799E+04 0.31778040E+04 0.31778040E+04 0.31836580E+04 + 0.31836580E+04 0.31881951E+04 0.31881951E+04 0.31897820E+04 + 0.31897820E+04 0.31958091E+04 0.31958091E+04 0.32063391E+04 + 0.32063391E+04 0.32167820E+04 0.32167820E+04 0.32258401E+04 + 0.31766069E+04 0.31717600E+04 0.31717600E+04 0.31739009E+04 + 0.31739009E+04 0.31746799E+04 0.31746799E+04 0.31778040E+04 + 0.31778040E+04 0.31836580E+04 0.31836580E+04 0.31881951E+04 + 0.31881951E+04 0.31897820E+04 0.31897820E+04 0.31958091E+04 + 0.31958091E+04 0.32063391E+04 0.32063391E+04 0.32167820E+04 + 0.32167820E+04 0.32258401E+04 0.31906121E+04 0.31920000E+04 + 0.31920000E+04 0.31930840E+04 0.31930840E+04 0.31897000E+04 + 0.31897000E+04 0.31816440E+04 0.31816440E+04 0.31770569E+04 + 0.31770569E+04 0.31791919E+04 0.31791919E+04 0.31846350E+04 + 0.31846350E+04 0.31899041E+04 0.31899041E+04 0.31987400E+04 + 0.31987400E+04 0.32110271E+04 0.32110271E+04 0.32233020E+04 + 0.31906121E+04 0.31920000E+04 0.31920000E+04 0.31930840E+04 + 0.31930840E+04 0.31897000E+04 0.31897000E+04 0.31816440E+04 + 0.31816440E+04 0.31770569E+04 0.31770569E+04 0.31791919E+04 + 0.31791919E+04 0.31846350E+04 0.31846350E+04 0.31899041E+04 + 0.31899041E+04 0.31987400E+04 0.31987400E+04 0.32110271E+04 + 0.32110271E+04 0.32233020E+04 0.31883569E+04 0.31965300E+04 + 0.31965300E+04 0.32004280E+04 0.32004280E+04 0.31986550E+04 + 0.31986550E+04 0.31944080E+04 0.31944080E+04 0.31889680E+04 + 0.31889680E+04 0.31874189E+04 0.31874189E+04 0.31855701E+04 + 0.31855701E+04 0.31837771E+04 0.31837771E+04 0.31898411E+04 + 0.31898411E+04 0.32028149E+04 0.32028149E+04 0.32164580E+04 + 0.31883569E+04 0.31965300E+04 0.31965300E+04 0.32004280E+04 + 0.32004280E+04 0.31986550E+04 0.31986550E+04 0.31944080E+04 + 0.31944080E+04 0.31889680E+04 0.31889680E+04 0.31874189E+04 + 0.31874189E+04 0.31855701E+04 0.31855701E+04 0.31837771E+04 + 0.31837771E+04 0.31898411E+04 0.31898411E+04 0.32028149E+04 + 0.32028149E+04 0.32164580E+04 0.31859209E+04 0.31930481E+04 + 0.31930481E+04 0.31989419E+04 0.31989419E+04 0.31981819E+04 + 0.31981819E+04 0.31967400E+04 0.31967400E+04 0.31950850E+04 + 0.31950850E+04 0.31921960E+04 0.31921960E+04 0.31836340E+04 + 0.31836340E+04 0.31792490E+04 0.31792490E+04 0.31823750E+04 + 0.31823750E+04 0.31905940E+04 0.31905940E+04 0.32001741E+04 + 0.31859209E+04 0.31930481E+04 0.31930481E+04 0.31989419E+04 + 0.31989419E+04 0.31981819E+04 0.31981819E+04 0.31967400E+04 + 0.31967400E+04 0.31950850E+04 0.31950850E+04 0.31921960E+04 + 0.31921960E+04 0.31836340E+04 0.31836340E+04 0.31792490E+04 + 0.31792490E+04 0.31823750E+04 0.31823750E+04 0.31905940E+04 + 0.31905940E+04 0.32001741E+04 0.31952461E+04 0.31962930E+04 + 0.31962930E+04 0.32038650E+04 0.32038650E+04 0.32040459E+04 + 0.32040459E+04 0.31981360E+04 0.31981360E+04 0.31942971E+04 + 0.31942971E+04 0.31910410E+04 0.31910410E+04 0.31830759E+04 + 0.31830759E+04 0.31761150E+04 0.31761150E+04 0.31785820E+04 + 0.31785820E+04 0.31832400E+04 0.31832400E+04 0.31878950E+04 + 0.31952461E+04 0.31962930E+04 0.31962930E+04 0.32038650E+04 + 0.32038650E+04 0.32040459E+04 0.32040459E+04 0.31981360E+04 + 0.31981360E+04 0.31942971E+04 0.31942971E+04 0.31910410E+04 + 0.31910410E+04 0.31830759E+04 0.31830759E+04 0.31761150E+04 + 0.31761150E+04 0.31785820E+04 0.31785820E+04 0.31832400E+04 + 0.31832400E+04 0.31878950E+04 0.32073450E+04 0.32046140E+04 + 0.32046140E+04 0.32094939E+04 0.32094939E+04 0.32094060E+04 + 0.32094060E+04 0.32024819E+04 0.32024819E+04 0.31955010E+04 + 0.31955010E+04 0.31901240E+04 0.31901240E+04 0.31819929E+04 + 0.31819929E+04 0.31746101E+04 0.31746101E+04 0.31755750E+04 + 0.31755750E+04 0.31807109E+04 0.31807109E+04 0.31884470E+04 + 0.32073450E+04 0.32046140E+04 0.32046140E+04 0.32094939E+04 + 0.32094939E+04 0.32094060E+04 0.32094060E+04 0.32024819E+04 + 0.32024819E+04 0.31955010E+04 0.31955010E+04 0.31901240E+04 + 0.31901240E+04 0.31819929E+04 0.31819929E+04 0.31746101E+04 + 0.31746101E+04 0.31755750E+04 0.31755750E+04 0.31807109E+04 + 0.31807109E+04 0.31884470E+04 0.32038330E+04 0.32029570E+04 + 0.32029570E+04 0.32054609E+04 0.32054609E+04 0.32047920E+04 + 0.32047920E+04 0.31970840E+04 0.31970840E+04 0.31880740E+04 + 0.31880740E+04 0.31833789E+04 0.31833789E+04 0.31793220E+04 + 0.31793220E+04 0.31756951E+04 0.31756951E+04 0.31762510E+04 + 0.31762510E+04 0.31823140E+04 0.31823140E+04 0.31924270E+04 + 0.32038330E+04 0.32029570E+04 0.32029570E+04 0.32054609E+04 + 0.32054609E+04 0.32047920E+04 0.32047920E+04 0.31970840E+04 + 0.31970840E+04 0.31880740E+04 0.31880740E+04 0.31833789E+04 + 0.31833789E+04 0.31793220E+04 0.31793220E+04 0.31756951E+04 + 0.31756951E+04 0.31762510E+04 0.31762510E+04 0.31823140E+04 + 0.30522290E+04 0.30526990E+04 0.31979780E+04 0.31911631E+04 + 0.31911631E+04 0.31929409E+04 0.31929409E+04 0.31937080E+04 + 0.31937080E+04 0.31885779E+04 0.31885779E+04 0.31826211E+04 + 0.31826211E+04 0.31793911E+04 0.31793911E+04 0.31767900E+04 + 0.31767900E+04 0.31772671E+04 0.31772671E+04 0.31786489E+04 + 0.31786489E+04 0.31811331E+04 0.30570630E+04 0.30541479E+04 + 0.31979780E+04 0.31911631E+04 0.31911631E+04 0.31929409E+04 + 0.31929409E+04 0.31937080E+04 0.31937080E+04 0.31885779E+04 + 0.31885779E+04 0.31826211E+04 0.31826211E+04 0.31793911E+04 + 0.31793911E+04 0.31767900E+04 0.31767900E+04 0.31772671E+04 + 0.30900491E+04 0.30869290E+04 0.30869290E+04 0.30856780E+04 + 0.30570630E+04 0.30541479E+04 0.32016550E+04 0.31867539E+04 + 0.31867539E+04 0.31840161E+04 0.31840161E+04 0.31830471E+04 + 0.31830471E+04 0.31804629E+04 0.31804629E+04 0.31774629E+04 + 0.31774629E+04 0.31762410E+04 0.31762410E+04 0.31763521E+04 + 0.31763521E+04 0.31767529E+04 0.30888101E+04 0.30880559E+04 + 0.30880559E+04 0.30865190E+04 0.30565850E+04 0.30540359E+04 + 0.32016550E+04 0.31867539E+04 0.31867539E+04 0.31840161E+04 + 0.31840161E+04 0.31830471E+04 0.31830471E+04 0.31804629E+04 + 0.31804629E+04 0.31774629E+04 0.31774629E+04 0.31762410E+04 + 0.31023169E+04 0.30979971E+04 0.30979971E+04 0.30888101E+04 + 0.30888101E+04 0.30880559E+04 0.30880559E+04 0.30865190E+04 + 0.30565850E+04 0.30540359E+04 0.32026179E+04 0.31882080E+04 + 0.31882080E+04 0.31815120E+04 0.31815120E+04 0.31788979E+04 + 0.31788979E+04 0.31765110E+04 0.31765110E+04 0.31757881E+04 + 0.31757881E+04 0.31749480E+04 0.31039299E+04 0.31007681E+04 + 0.31007681E+04 0.30948601E+04 0.30948601E+04 0.30905061E+04 + 0.30905061E+04 0.30879060E+04 0.30568540E+04 0.30542661E+04 + 0.32026179E+04 0.31882080E+04 0.31882080E+04 0.31815120E+04 + 0.31815120E+04 0.31788979E+04 0.31788979E+04 0.31765110E+04 + 0.31114590E+04 0.31079551E+04 0.31079551E+04 0.31039299E+04 + 0.31039299E+04 0.31007681E+04 0.31007681E+04 0.30948601E+04 + 0.30948601E+04 0.30905061E+04 0.30905061E+04 0.30879060E+04 + 0.30568540E+04 0.30542661E+04 0.31973850E+04 0.31900879E+04 + 0.31900879E+04 0.31831790E+04 0.31831790E+04 0.31810391E+04 + 0.31810391E+04 0.31774089E+04 0.31132461E+04 0.31102319E+04 + 0.31102319E+04 0.31067400E+04 0.31067400E+04 0.31030959E+04 + 0.31030959E+04 0.30975801E+04 0.30975801E+04 0.30912671E+04 + 0.30912671E+04 0.30886689E+04 0.30570840E+04 0.30550139E+04 + 0.31973850E+04 0.31900879E+04 0.31900879E+04 0.31831790E+04 + 0.31225520E+04 0.31186709E+04 0.31186709E+04 0.31132461E+04 + 0.31132461E+04 0.31102319E+04 0.31102319E+04 0.31067400E+04 + 0.31067400E+04 0.31030959E+04 0.31030959E+04 0.30975801E+04 + 0.30975801E+04 0.30912671E+04 0.30912671E+04 0.30886689E+04 + 0.30570840E+04 0.30550139E+04 0.31963420E+04 0.31916279E+04 + 0.31916279E+04 0.31857390E+04 0.31258350E+04 0.31213999E+04 + 0.31213999E+04 0.31155740E+04 0.31155740E+04 0.31106211E+04 + 0.31106211E+04 0.31042490E+04 0.31042490E+04 0.31004619E+04 + 0.31004619E+04 0.30982209E+04 0.30982209E+04 0.30936951E+04 + 0.30936951E+04 0.30895271E+04 0.30578979E+04 0.30555271E+04 + 0.31334670E+04 0.31305701E+04 0.31305701E+04 0.31258350E+04 + 0.31258350E+04 0.31213999E+04 0.31213999E+04 0.31155740E+04 + 0.31155740E+04 0.31106211E+04 0.31106211E+04 0.31042490E+04 + 0.31042490E+04 0.31004619E+04 0.31004619E+04 0.30982209E+04 + 0.30982209E+04 0.30936951E+04 0.30936951E+04 0.30895271E+04 + 0.30895271E+04 0.30866470E+04 0.31352620E+04 0.31330649E+04 + 0.31330649E+04 0.31314719E+04 0.31314719E+04 0.31264961E+04 + 0.31264961E+04 0.31131670E+04 0.31131670E+04 0.31054919E+04 + 0.31054919E+04 0.31007781E+04 0.31007781E+04 0.30999180E+04 + 0.30999180E+04 0.31020420E+04 0.31020420E+04 0.30973140E+04 + 0.30973140E+04 0.30907190E+04 0.30907190E+04 0.30869651E+04 + 0.32071260E+04 0.32061069E+04 0.32061069E+04 0.32088330E+04 + 0.32088330E+04 0.32094231E+04 0.32094231E+04 0.32048931E+04 + 0.32048931E+04 0.31970549E+04 0.31970549E+04 0.31959980E+04 + 0.31959980E+04 0.32006660E+04 0.32006660E+04 0.32033540E+04 + 0.32033540E+04 0.32045840E+04 0.32045840E+04 0.32094980E+04 + 0.32094980E+04 0.32168440E+04 0.31972429E+04 0.31983569E+04 + 0.31983569E+04 0.32032151E+04 0.32032151E+04 0.32043091E+04 + 0.32043091E+04 0.32011760E+04 0.32011760E+04 0.31983259E+04 + 0.31983259E+04 0.32019709E+04 0.32019709E+04 0.32083340E+04 + 0.32083340E+04 0.32105320E+04 0.32105320E+04 0.32130969E+04 + 0.32130969E+04 0.32178401E+04 0.32178401E+04 0.32214390E+04 + 0.31972429E+04 0.31983569E+04 0.31983569E+04 0.32032151E+04 + 0.32032151E+04 0.32043091E+04 0.32043091E+04 0.32011760E+04 + 0.32011760E+04 0.31983259E+04 0.31983259E+04 0.32019709E+04 + 0.32019709E+04 0.32083340E+04 0.32083340E+04 0.32105320E+04 + 0.32105320E+04 0.32130969E+04 0.32130969E+04 0.32178401E+04 + 0.32178401E+04 0.32214390E+04 0.31894150E+04 0.31907241E+04 + 0.31907241E+04 0.31942991E+04 0.31942991E+04 0.31918960E+04 + 0.31918960E+04 0.31895039E+04 0.31895039E+04 0.31911050E+04 + 0.31911050E+04 0.31972029E+04 0.31972029E+04 0.32045659E+04 + 0.32045659E+04 0.32090110E+04 0.32090110E+04 0.32144561E+04 + 0.32144561E+04 0.32197739E+04 0.32197739E+04 0.32213411E+04 + 0.31894150E+04 0.31907241E+04 0.31907241E+04 0.31942991E+04 + 0.31942991E+04 0.31918960E+04 0.31918960E+04 0.31895039E+04 + 0.31895039E+04 0.31911050E+04 0.31911050E+04 0.31972029E+04 + 0.31972029E+04 0.32045659E+04 0.32045659E+04 0.32090110E+04 + 0.32090110E+04 0.32144561E+04 0.32144561E+04 0.32197739E+04 + 0.32197739E+04 0.32213411E+04 0.31774080E+04 0.31706040E+04 + 0.31706040E+04 0.31708069E+04 0.31708069E+04 0.31697900E+04 + 0.31697900E+04 0.31784050E+04 0.31784050E+04 0.31898911E+04 + 0.31898911E+04 0.31984590E+04 0.31984590E+04 0.32030569E+04 + 0.32030569E+04 0.32068711E+04 0.32068711E+04 0.32122590E+04 + 0.32122590E+04 0.32183279E+04 0.32183279E+04 0.32226230E+04 + 0.31774080E+04 0.31706040E+04 0.31706040E+04 0.31708069E+04 + 0.31708069E+04 0.31697900E+04 0.31697900E+04 0.31784050E+04 + 0.31784050E+04 0.31898911E+04 0.31898911E+04 0.31984590E+04 + 0.31984590E+04 0.32030569E+04 0.32030569E+04 0.32068711E+04 + 0.32068711E+04 0.32122590E+04 0.32122590E+04 0.32183279E+04 + 0.32183279E+04 0.32226230E+04 0.31766069E+04 0.31717600E+04 + 0.31717600E+04 0.31739009E+04 0.31739009E+04 0.31746799E+04 + 0.31746799E+04 0.31778040E+04 0.31778040E+04 0.31836580E+04 + 0.31836580E+04 0.31881951E+04 0.31881951E+04 0.31897820E+04 + 0.31897820E+04 0.31958091E+04 0.31958091E+04 0.32063391E+04 + 0.32063391E+04 0.32167820E+04 0.32167820E+04 0.32258401E+04 + 0.31766069E+04 0.31717600E+04 0.31717600E+04 0.31739009E+04 + 0.31739009E+04 0.31746799E+04 0.31746799E+04 0.31778040E+04 + 0.31778040E+04 0.31836580E+04 0.31836580E+04 0.31881951E+04 + 0.31881951E+04 0.31897820E+04 0.31897820E+04 0.31958091E+04 + 0.31958091E+04 0.32063391E+04 0.32063391E+04 0.32167820E+04 + 0.32167820E+04 0.32258401E+04 0.31906121E+04 0.31920000E+04 + 0.31920000E+04 0.31930840E+04 0.31930840E+04 0.31897000E+04 + 0.31897000E+04 0.31816440E+04 0.31816440E+04 0.31770569E+04 + 0.31770569E+04 0.31791919E+04 0.31791919E+04 0.31846350E+04 + 0.31846350E+04 0.31899041E+04 0.31899041E+04 0.31987400E+04 + 0.31987400E+04 0.32110271E+04 0.32110271E+04 0.32233020E+04 + 0.31906121E+04 0.31920000E+04 0.31920000E+04 0.31930840E+04 + 0.31930840E+04 0.31897000E+04 0.31897000E+04 0.31816440E+04 + 0.31816440E+04 0.31770569E+04 0.31770569E+04 0.31791919E+04 + 0.31791919E+04 0.31846350E+04 0.31846350E+04 0.31899041E+04 + 0.31899041E+04 0.31987400E+04 0.31987400E+04 0.32110271E+04 + 0.32110271E+04 0.32233020E+04 0.31883569E+04 0.31965300E+04 + 0.31965300E+04 0.32004280E+04 0.32004280E+04 0.31986550E+04 + 0.31986550E+04 0.31944080E+04 0.31944080E+04 0.31889680E+04 + 0.31889680E+04 0.31874189E+04 0.31874189E+04 0.31855701E+04 + 0.31855701E+04 0.31837771E+04 0.31837771E+04 0.31898411E+04 + 0.31898411E+04 0.32028149E+04 0.32028149E+04 0.32164580E+04 + 0.31883569E+04 0.31965300E+04 0.31965300E+04 0.32004280E+04 + 0.32004280E+04 0.31986550E+04 0.31986550E+04 0.31944080E+04 + 0.31944080E+04 0.31889680E+04 0.31889680E+04 0.31874189E+04 + 0.31874189E+04 0.31855701E+04 0.31855701E+04 0.31837771E+04 + 0.31837771E+04 0.31898411E+04 0.31898411E+04 0.32028149E+04 + 0.32028149E+04 0.32164580E+04 0.31859209E+04 0.31930481E+04 + 0.31930481E+04 0.31989419E+04 0.31989419E+04 0.31981819E+04 + 0.31981819E+04 0.31967400E+04 0.31967400E+04 0.31950850E+04 + 0.31950850E+04 0.31921960E+04 0.31921960E+04 0.31836340E+04 + 0.31836340E+04 0.31792490E+04 0.31792490E+04 0.31823750E+04 + 0.31823750E+04 0.31905940E+04 0.31905940E+04 0.32001741E+04 + 0.31859209E+04 0.31930481E+04 0.31930481E+04 0.31989419E+04 + 0.31989419E+04 0.31981819E+04 0.31981819E+04 0.31967400E+04 + 0.31967400E+04 0.31950850E+04 0.31950850E+04 0.31921960E+04 + 0.31921960E+04 0.31836340E+04 0.31836340E+04 0.31792490E+04 + 0.31792490E+04 0.31823750E+04 0.31823750E+04 0.31905940E+04 + 0.31905940E+04 0.32001741E+04 0.31952461E+04 0.31962930E+04 + 0.31962930E+04 0.32038650E+04 0.32038650E+04 0.32040459E+04 + 0.32040459E+04 0.31981360E+04 0.31981360E+04 0.31942971E+04 + 0.31942971E+04 0.31910410E+04 0.31910410E+04 0.31830759E+04 + 0.31830759E+04 0.31761150E+04 0.31761150E+04 0.31785820E+04 + 0.31785820E+04 0.31832400E+04 0.31832400E+04 0.31878950E+04 + 0.31952461E+04 0.31962930E+04 0.31962930E+04 0.32038650E+04 + 0.32038650E+04 0.32040459E+04 0.32040459E+04 0.31981360E+04 + 0.31981360E+04 0.31942971E+04 0.31942971E+04 0.31910410E+04 + 0.31910410E+04 0.31830759E+04 0.31830759E+04 0.31761150E+04 + 0.31761150E+04 0.31785820E+04 0.31785820E+04 0.31832400E+04 + 0.31832400E+04 0.31878950E+04 0.32073450E+04 0.32046140E+04 + 0.32046140E+04 0.32094939E+04 0.32094939E+04 0.32094060E+04 + 0.32094060E+04 0.32024819E+04 0.32024819E+04 0.31955010E+04 + 0.31955010E+04 0.31901240E+04 0.31901240E+04 0.31819929E+04 + 0.31819929E+04 0.31746101E+04 0.31746101E+04 0.31755750E+04 + 0.31755750E+04 0.31807109E+04 0.31807109E+04 0.31884470E+04 + 0.32073450E+04 0.32046140E+04 0.32046140E+04 0.32094939E+04 + 0.32094939E+04 0.32094060E+04 0.32094060E+04 0.32024819E+04 + 0.32024819E+04 0.31955010E+04 0.31955010E+04 0.31901240E+04 + 0.31901240E+04 0.31819929E+04 0.31819929E+04 0.31746101E+04 + 0.31746101E+04 0.31755750E+04 0.31755750E+04 0.31807109E+04 + 0.31807109E+04 0.31884470E+04 0.32038330E+04 0.32029570E+04 + 0.32029570E+04 0.32054609E+04 0.32054609E+04 0.32047920E+04 + 0.32047920E+04 0.31970840E+04 0.31970840E+04 0.31880740E+04 + 0.31880740E+04 0.31833789E+04 0.31833789E+04 0.31793220E+04 + 0.31793220E+04 0.31756951E+04 0.31756951E+04 0.31762510E+04 + 0.31762510E+04 0.31823140E+04 0.31823140E+04 0.31924270E+04 + 0.32038330E+04 0.32029570E+04 0.32029570E+04 0.32054609E+04 + 0.32054609E+04 0.32047920E+04 0.32047920E+04 0.31970840E+04 + 0.31970840E+04 0.31880740E+04 0.31880740E+04 0.31833789E+04 + 0.31833789E+04 0.31793220E+04 0.31793220E+04 0.31756951E+04 + 0.31756951E+04 0.31762510E+04 0.31762510E+04 0.31823140E+04 + 0.30522290E+04 0.30526990E+04 0.31979780E+04 0.31911631E+04 + 0.31911631E+04 0.31929409E+04 0.31929409E+04 0.31937080E+04 + 0.31937080E+04 0.31885779E+04 0.31885779E+04 0.31826211E+04 + 0.31826211E+04 0.31793911E+04 0.31793911E+04 0.31767900E+04 + 0.31767900E+04 0.31772671E+04 0.31772671E+04 0.31786489E+04 + 0.31786489E+04 0.31811331E+04 0.30570630E+04 0.30541479E+04 + 0.31979780E+04 0.31911631E+04 0.31911631E+04 0.31929409E+04 + 0.31929409E+04 0.31937080E+04 0.31937080E+04 0.31885779E+04 + 0.31885779E+04 0.31826211E+04 0.31826211E+04 0.31793911E+04 + 0.31793911E+04 0.31767900E+04 0.31767900E+04 0.31772671E+04 + 0.30900491E+04 0.30869290E+04 0.30869290E+04 0.30856780E+04 + 0.30570630E+04 0.30541479E+04 0.32016550E+04 0.31867539E+04 + 0.31867539E+04 0.31840161E+04 0.31840161E+04 0.31830471E+04 + 0.31830471E+04 0.31804629E+04 0.31804629E+04 0.31774629E+04 + 0.31774629E+04 0.31762410E+04 0.31762410E+04 0.31763521E+04 + 0.31763521E+04 0.31767529E+04 0.30888101E+04 0.30880559E+04 + 0.30880559E+04 0.30865190E+04 0.30565850E+04 0.30540359E+04 + 0.32016550E+04 0.31867539E+04 0.31867539E+04 0.31840161E+04 + 0.31840161E+04 0.31830471E+04 0.31830471E+04 0.31804629E+04 + 0.31804629E+04 0.31774629E+04 0.31774629E+04 0.31762410E+04 + 0.31023169E+04 0.30979971E+04 0.30979971E+04 0.30888101E+04 + 0.30888101E+04 0.30880559E+04 0.30880559E+04 0.30865190E+04 + 0.30565850E+04 0.30540359E+04 0.32026179E+04 0.31882080E+04 + 0.31882080E+04 0.31815120E+04 0.31815120E+04 0.31788979E+04 + 0.31788979E+04 0.31765110E+04 0.31765110E+04 0.31757881E+04 + 0.31757881E+04 0.31749480E+04 0.31039299E+04 0.31007681E+04 + 0.31007681E+04 0.30948601E+04 0.30948601E+04 0.30905061E+04 + 0.30905061E+04 0.30879060E+04 0.30568540E+04 0.30542661E+04 + 0.32026179E+04 0.31882080E+04 0.31882080E+04 0.31815120E+04 + 0.31815120E+04 0.31788979E+04 0.31788979E+04 0.31765110E+04 + 0.31114590E+04 0.31079551E+04 0.31079551E+04 0.31039299E+04 + 0.31039299E+04 0.31007681E+04 0.31007681E+04 0.30948601E+04 + 0.30948601E+04 0.30905061E+04 0.30905061E+04 0.30879060E+04 + 0.30568540E+04 0.30542661E+04 0.31973850E+04 0.31900879E+04 + 0.31900879E+04 0.31831790E+04 0.31831790E+04 0.31810391E+04 + 0.31810391E+04 0.31774089E+04 0.31132461E+04 0.31102319E+04 + 0.31102319E+04 0.31067400E+04 0.31067400E+04 0.31030959E+04 + 0.31030959E+04 0.30975801E+04 0.30975801E+04 0.30912671E+04 + 0.30912671E+04 0.30886689E+04 0.30570840E+04 0.30550139E+04 + 0.31973850E+04 0.31900879E+04 0.31900879E+04 0.31831790E+04 + 0.31225520E+04 0.31186709E+04 0.31186709E+04 0.31132461E+04 + 0.31132461E+04 0.31102319E+04 0.31102319E+04 0.31067400E+04 + 0.31067400E+04 0.31030959E+04 0.31030959E+04 0.30975801E+04 + 0.30975801E+04 0.30912671E+04 0.30912671E+04 0.30886689E+04 + 0.30570840E+04 0.30550139E+04 0.31963420E+04 0.31916279E+04 + 0.31916279E+04 0.31857390E+04 0.31258350E+04 0.31213999E+04 + 0.31213999E+04 0.31155740E+04 0.31155740E+04 0.31106211E+04 + 0.31106211E+04 0.31042490E+04 0.31042490E+04 0.31004619E+04 + 0.31004619E+04 0.30982209E+04 0.30982209E+04 0.30936951E+04 + 0.30936951E+04 0.30895271E+04 0.30578979E+04 0.30555271E+04 + 0.31334670E+04 0.31305701E+04 0.31305701E+04 0.31258350E+04 + 0.31258350E+04 0.31213999E+04 0.31213999E+04 0.31155740E+04 + 0.31155740E+04 0.31106211E+04 0.31106211E+04 0.31042490E+04 + 0.31042490E+04 0.31004619E+04 0.31004619E+04 0.30982209E+04 + 0.30982209E+04 0.30936951E+04 0.30936951E+04 0.30895271E+04 + 0.30895271E+04 0.30866470E+04 0.31352620E+04 0.31330649E+04 + 0.31330649E+04 0.31314719E+04 0.31314719E+04 0.31264961E+04 + 0.31264961E+04 0.31131670E+04 0.31131670E+04 0.31054919E+04 + 0.31054919E+04 0.31007781E+04 0.31007781E+04 0.30999180E+04 + 0.30999180E+04 0.31020420E+04 0.31020420E+04 0.30973140E+04 + 0.30973140E+04 0.30907190E+04 0.30907190E+04 0.30869651E+04 + 0.32082461E+04 0.32071230E+04 0.32071230E+04 0.32098540E+04 + 0.32098540E+04 0.32104900E+04 0.32104900E+04 0.32060061E+04 + 0.32060061E+04 0.31981169E+04 0.31981169E+04 0.31969341E+04 + 0.31969341E+04 0.32015120E+04 0.32015120E+04 0.32042539E+04 + 0.32042539E+04 0.32055081E+04 0.32055081E+04 0.32104180E+04 + 0.32104180E+04 0.32177991E+04 0.31983960E+04 0.31993689E+04 + 0.31993689E+04 0.32042561E+04 0.32042561E+04 0.32054290E+04 + 0.32054290E+04 0.32023140E+04 0.32023140E+04 0.31993960E+04 + 0.31993960E+04 0.32029209E+04 0.32029209E+04 0.32092791E+04 + 0.32092791E+04 0.32115801E+04 0.32115801E+04 0.32141150E+04 + 0.32141150E+04 0.32188711E+04 0.32188711E+04 0.32223950E+04 + 0.31983960E+04 0.31993689E+04 0.31993689E+04 0.32042561E+04 + 0.32042561E+04 0.32054290E+04 0.32054290E+04 0.32023140E+04 + 0.32023140E+04 0.31993960E+04 0.31993960E+04 0.32029209E+04 + 0.32029209E+04 0.32092791E+04 0.32092791E+04 0.32115801E+04 + 0.32115801E+04 0.32141150E+04 0.32141150E+04 0.32188711E+04 + 0.32188711E+04 0.32223950E+04 0.31906021E+04 0.31918110E+04 + 0.31918110E+04 0.31954451E+04 0.31954451E+04 0.31930920E+04 + 0.31930920E+04 0.31905850E+04 0.31905850E+04 0.31920310E+04 + 0.31920310E+04 0.31980359E+04 0.31980359E+04 0.32054170E+04 + 0.32054170E+04 0.32099351E+04 0.32099351E+04 0.32153831E+04 + 0.32153831E+04 0.32207781E+04 0.32207781E+04 0.32222119E+04 + 0.31906021E+04 0.31918110E+04 0.31918110E+04 0.31954451E+04 + 0.31954451E+04 0.31930920E+04 0.31930920E+04 0.31905850E+04 + 0.31905850E+04 0.31920310E+04 0.31920310E+04 0.31980359E+04 + 0.31980359E+04 0.32054170E+04 0.32054170E+04 0.32099351E+04 + 0.32099351E+04 0.32153831E+04 0.32153831E+04 0.32207781E+04 + 0.32207781E+04 0.32222119E+04 0.31785300E+04 0.31716211E+04 + 0.31716211E+04 0.31718350E+04 0.31718350E+04 0.31706211E+04 + 0.31706211E+04 0.31790820E+04 0.31790820E+04 0.31905229E+04 + 0.31905229E+04 0.31991321E+04 0.31991321E+04 0.32038340E+04 + 0.32038340E+04 0.32077009E+04 0.32077009E+04 0.32130349E+04 + 0.32130349E+04 0.32190320E+04 0.32190320E+04 0.32231880E+04 + 0.31785300E+04 0.31716211E+04 0.31716211E+04 0.31718350E+04 + 0.31718350E+04 0.31706211E+04 0.31706211E+04 0.31790820E+04 + 0.31790820E+04 0.31905229E+04 0.31905229E+04 0.31991321E+04 + 0.31991321E+04 0.32038340E+04 0.32038340E+04 0.32077009E+04 + 0.32077009E+04 0.32130349E+04 0.32130349E+04 0.32190320E+04 + 0.32190320E+04 0.32231880E+04 0.31771580E+04 0.31723049E+04 + 0.31723049E+04 0.31745071E+04 0.31745071E+04 0.31753110E+04 + 0.31753110E+04 0.31784419E+04 0.31784419E+04 0.31843210E+04 + 0.31843210E+04 0.31888459E+04 0.31888459E+04 0.31903940E+04 + 0.31903940E+04 0.31963340E+04 0.31963340E+04 0.32068450E+04 + 0.32068450E+04 0.32172620E+04 0.32172620E+04 0.32263020E+04 + 0.31771580E+04 0.31723049E+04 0.31723049E+04 0.31745071E+04 + 0.31745071E+04 0.31753110E+04 0.31753110E+04 0.31784419E+04 + 0.31784419E+04 0.31843210E+04 0.31843210E+04 0.31888459E+04 + 0.31888459E+04 0.31903940E+04 0.31903940E+04 0.31963340E+04 + 0.31963340E+04 0.32068450E+04 0.32068450E+04 0.32172620E+04 + 0.32172620E+04 0.32263020E+04 0.31911340E+04 0.31924919E+04 + 0.31924919E+04 0.31936089E+04 0.31936089E+04 0.31902820E+04 + 0.31902820E+04 0.31821990E+04 0.31821990E+04 0.31775339E+04 + 0.31775339E+04 0.31796201E+04 0.31796201E+04 0.31850901E+04 + 0.31850901E+04 0.31903811E+04 0.31903811E+04 0.31991550E+04 + 0.31991550E+04 0.32114390E+04 0.32114390E+04 0.32237271E+04 + 0.31911340E+04 0.31924919E+04 0.31924919E+04 0.31936089E+04 + 0.31936089E+04 0.31902820E+04 0.31902820E+04 0.31821990E+04 + 0.31821990E+04 0.31775339E+04 0.31775339E+04 0.31796201E+04 + 0.31796201E+04 0.31850901E+04 0.31850901E+04 0.31903811E+04 + 0.31903811E+04 0.31991550E+04 0.31991550E+04 0.32114390E+04 + 0.32114390E+04 0.32237271E+04 0.31888459E+04 0.31969910E+04 + 0.31969910E+04 0.32009590E+04 0.32009590E+04 0.31992300E+04 + 0.31992300E+04 0.31949609E+04 0.31949609E+04 0.31894370E+04 + 0.31894370E+04 0.31878630E+04 0.31878630E+04 0.31860569E+04 + 0.31860569E+04 0.31842061E+04 0.31842061E+04 0.31901909E+04 + 0.31901909E+04 0.32032229E+04 0.32032229E+04 0.32169661E+04 + 0.31888459E+04 0.31969910E+04 0.31969910E+04 0.32009590E+04 + 0.32009590E+04 0.31992300E+04 0.31992300E+04 0.31949609E+04 + 0.31949609E+04 0.31894370E+04 0.31894370E+04 0.31878630E+04 + 0.31878630E+04 0.31860569E+04 0.31860569E+04 0.31842061E+04 + 0.31842061E+04 0.31901909E+04 0.31901909E+04 0.32032229E+04 + 0.32032229E+04 0.32169661E+04 0.31863889E+04 0.31934600E+04 + 0.31934600E+04 0.31994409E+04 0.31994409E+04 0.31987041E+04 + 0.31987041E+04 0.31972529E+04 0.31972529E+04 0.31955691E+04 + 0.31955691E+04 0.31927109E+04 0.31927109E+04 0.31841589E+04 + 0.31841589E+04 0.31797000E+04 0.31797000E+04 0.31827620E+04 + 0.31827620E+04 0.31910090E+04 0.31910090E+04 0.32007070E+04 + 0.31863889E+04 0.31934600E+04 0.31934600E+04 0.31994409E+04 + 0.31994409E+04 0.31987041E+04 0.31987041E+04 0.31972529E+04 + 0.31972529E+04 0.31955691E+04 0.31955691E+04 0.31927109E+04 + 0.31927109E+04 0.31841589E+04 0.31841589E+04 0.31797000E+04 + 0.31797000E+04 0.31827620E+04 0.31827620E+04 0.31910090E+04 + 0.31910090E+04 0.32007070E+04 0.31957549E+04 0.31966799E+04 + 0.31966799E+04 0.32042971E+04 0.32042971E+04 0.32045659E+04 + 0.32045659E+04 0.31986411E+04 0.31986411E+04 0.31947781E+04 + 0.31947781E+04 0.31915449E+04 0.31915449E+04 0.31836289E+04 + 0.31836289E+04 0.31765920E+04 0.31765920E+04 0.31789890E+04 + 0.31789890E+04 0.31836531E+04 0.31836531E+04 0.31882839E+04 + 0.31957549E+04 0.31966799E+04 0.31966799E+04 0.32042971E+04 + 0.32042971E+04 0.32045659E+04 0.32045659E+04 0.31986411E+04 + 0.31986411E+04 0.31947781E+04 0.31947781E+04 0.31915449E+04 + 0.31915449E+04 0.31836289E+04 0.31836289E+04 0.31765920E+04 + 0.31765920E+04 0.31789890E+04 0.31789890E+04 0.31836531E+04 + 0.31836531E+04 0.31882839E+04 0.32079561E+04 0.32050730E+04 + 0.32050730E+04 0.32099500E+04 0.32099500E+04 0.32099250E+04 + 0.32099250E+04 0.32030410E+04 0.32030410E+04 0.31960459E+04 + 0.31960459E+04 0.31906411E+04 0.31906411E+04 0.31825381E+04 + 0.31825381E+04 0.31751060E+04 0.31751060E+04 0.31761101E+04 + 0.31761101E+04 0.31813430E+04 0.31813430E+04 0.31891760E+04 + 0.32079561E+04 0.32050730E+04 0.32050730E+04 0.32099500E+04 + 0.32099500E+04 0.32099250E+04 0.32099250E+04 0.32030410E+04 + 0.32030410E+04 0.31960459E+04 0.31960459E+04 0.31906411E+04 + 0.31906411E+04 0.31825381E+04 0.31825381E+04 0.31751060E+04 + 0.31751060E+04 0.31761101E+04 0.31761101E+04 0.31813430E+04 + 0.31813430E+04 0.31891760E+04 0.32045029E+04 0.32035071E+04 + 0.32035071E+04 0.32059871E+04 0.32059871E+04 0.32053760E+04 + 0.32053760E+04 0.31977070E+04 0.31977070E+04 0.31887190E+04 + 0.31887190E+04 0.31839890E+04 0.31839890E+04 0.31800601E+04 + 0.31800601E+04 0.31765950E+04 0.31765950E+04 0.31772720E+04 + 0.31772720E+04 0.31831860E+04 0.31831860E+04 0.31932681E+04 + 0.32045029E+04 0.32035071E+04 0.32035071E+04 0.32059871E+04 + 0.32059871E+04 0.32053760E+04 0.32053760E+04 0.31977070E+04 + 0.31977070E+04 0.31887190E+04 0.31887190E+04 0.31839890E+04 + 0.31839890E+04 0.31800601E+04 0.31800601E+04 0.31765950E+04 + 0.31765950E+04 0.31772720E+04 0.31772720E+04 0.31831860E+04 + 0.30525339E+04 0.30530691E+04 0.31986819E+04 0.31917229E+04 + 0.31917229E+04 0.31934380E+04 0.31934380E+04 0.31943159E+04 + 0.31943159E+04 0.31893030E+04 0.31893030E+04 0.31834780E+04 + 0.31834780E+04 0.31803521E+04 0.31803521E+04 0.31779089E+04 + 0.31779089E+04 0.31782920E+04 0.31782920E+04 0.31797351E+04 + 0.31797351E+04 0.31822881E+04 0.30573730E+04 0.30545090E+04 + 0.31986819E+04 0.31917229E+04 0.31917229E+04 0.31934380E+04 + 0.31934380E+04 0.31943159E+04 0.31943159E+04 0.31893030E+04 + 0.31893030E+04 0.31834780E+04 0.31834780E+04 0.31803521E+04 + 0.31803521E+04 0.31779089E+04 0.31779089E+04 0.31782920E+04 + 0.30908069E+04 0.30877090E+04 0.30877090E+04 0.30864839E+04 + 0.30573730E+04 0.30545090E+04 0.32024519E+04 0.31873870E+04 + 0.31873870E+04 0.31846279E+04 0.31846279E+04 0.31838030E+04 + 0.31838030E+04 0.31814031E+04 0.31814031E+04 0.31785720E+04 + 0.31785720E+04 0.31772500E+04 0.31772500E+04 0.31774280E+04 + 0.31774280E+04 0.31779719E+04 0.30894771E+04 0.30888269E+04 + 0.30888269E+04 0.30873479E+04 0.30569141E+04 0.30543831E+04 + 0.32024519E+04 0.31873870E+04 0.31873870E+04 0.31846279E+04 + 0.31846279E+04 0.31838030E+04 0.31838030E+04 0.31814031E+04 + 0.31814031E+04 0.31785720E+04 0.31785720E+04 0.31772500E+04 + 0.31030039E+04 0.30987090E+04 0.30987090E+04 0.30894771E+04 + 0.30894771E+04 0.30888269E+04 0.30888269E+04 0.30873479E+04 + 0.30569141E+04 0.30543831E+04 0.32034861E+04 0.31890249E+04 + 0.31890249E+04 0.31823589E+04 0.31823589E+04 0.31796970E+04 + 0.31796970E+04 0.31773730E+04 0.31773730E+04 0.31768159E+04 + 0.31768159E+04 0.31760471E+04 0.31045979E+04 0.31014980E+04 + 0.31014980E+04 0.30956570E+04 0.30956570E+04 0.30913240E+04 + 0.30913240E+04 0.30887529E+04 0.30572070E+04 0.30546479E+04 + 0.32034861E+04 0.31890249E+04 0.31890249E+04 0.31823589E+04 + 0.31823589E+04 0.31796970E+04 0.31796970E+04 0.31773730E+04 + 0.31120859E+04 0.31085911E+04 0.31085911E+04 0.31045979E+04 + 0.31045979E+04 0.31014980E+04 0.31014980E+04 0.30956570E+04 + 0.30956570E+04 0.30913240E+04 0.30913240E+04 0.30887529E+04 + 0.30572070E+04 0.30546479E+04 0.31982900E+04 0.31909089E+04 + 0.31909089E+04 0.31839580E+04 0.31839580E+04 0.31818689E+04 + 0.31818689E+04 0.31782629E+04 0.31138979E+04 0.31109150E+04 + 0.31109150E+04 0.31074031E+04 0.31074031E+04 0.31037759E+04 + 0.31037759E+04 0.30982959E+04 0.30982959E+04 0.30921221E+04 + 0.30921221E+04 0.30895229E+04 0.30574629E+04 0.30554260E+04 + 0.31982900E+04 0.31909089E+04 0.31909089E+04 0.31839580E+04 + 0.31231980E+04 0.31193201E+04 0.31193201E+04 0.31138979E+04 + 0.31138979E+04 0.31109150E+04 0.31109150E+04 0.31074031E+04 + 0.31074031E+04 0.31037759E+04 0.31037759E+04 0.30982959E+04 + 0.30982959E+04 0.30921221E+04 0.30921221E+04 0.30895229E+04 + 0.30574629E+04 0.30554260E+04 0.31970840E+04 0.31924331E+04 + 0.31924331E+04 0.31865200E+04 0.31264990E+04 0.31221130E+04 + 0.31221130E+04 0.31162671E+04 0.31162671E+04 0.31112881E+04 + 0.31112881E+04 0.31049031E+04 0.31049031E+04 0.31011460E+04 + 0.31011460E+04 0.30989360E+04 0.30989360E+04 0.30944880E+04 + 0.30944880E+04 0.30903669E+04 0.30582949E+04 0.30559590E+04 + 0.31341919E+04 0.31312781E+04 0.31312781E+04 0.31264990E+04 + 0.31264990E+04 0.31221130E+04 0.31221130E+04 0.31162671E+04 + 0.31162671E+04 0.31112881E+04 0.31112881E+04 0.31049031E+04 + 0.31049031E+04 0.31011460E+04 0.31011460E+04 0.30989360E+04 + 0.30989360E+04 0.30944880E+04 0.30944880E+04 0.30903669E+04 + 0.30903669E+04 0.30875420E+04 0.31359880E+04 0.31338140E+04 + 0.31338140E+04 0.31321460E+04 0.31321460E+04 0.31271250E+04 + 0.31271250E+04 0.31138330E+04 0.31138330E+04 0.31061130E+04 + 0.31061130E+04 0.31013921E+04 0.31013921E+04 0.31005320E+04 + 0.31005320E+04 0.31027661E+04 0.31027661E+04 0.30980869E+04 + 0.30980869E+04 0.30915691E+04 0.30915691E+04 0.30878440E+04 + 0.32082461E+04 0.32071230E+04 0.32071230E+04 0.32098540E+04 + 0.32098540E+04 0.32104900E+04 0.32104900E+04 0.32060061E+04 + 0.32060061E+04 0.31981169E+04 0.31981169E+04 0.31969341E+04 + 0.31969341E+04 0.32015120E+04 0.32015120E+04 0.32042539E+04 + 0.32042539E+04 0.32055081E+04 0.32055081E+04 0.32104180E+04 + 0.32104180E+04 0.32177991E+04 0.31983960E+04 0.31993689E+04 + 0.31993689E+04 0.32042561E+04 0.32042561E+04 0.32054290E+04 + 0.32054290E+04 0.32023140E+04 0.32023140E+04 0.31993960E+04 + 0.31993960E+04 0.32029209E+04 0.32029209E+04 0.32092791E+04 + 0.32092791E+04 0.32115801E+04 0.32115801E+04 0.32141150E+04 + 0.32141150E+04 0.32188711E+04 0.32188711E+04 0.32223950E+04 + 0.31983960E+04 0.31993689E+04 0.31993689E+04 0.32042561E+04 + 0.32042561E+04 0.32054290E+04 0.32054290E+04 0.32023140E+04 + 0.32023140E+04 0.31993960E+04 0.31993960E+04 0.32029209E+04 + 0.32029209E+04 0.32092791E+04 0.32092791E+04 0.32115801E+04 + 0.32115801E+04 0.32141150E+04 0.32141150E+04 0.32188711E+04 + 0.32188711E+04 0.32223950E+04 0.31906021E+04 0.31918110E+04 + 0.31918110E+04 0.31954451E+04 0.31954451E+04 0.31930920E+04 + 0.31930920E+04 0.31905850E+04 0.31905850E+04 0.31920310E+04 + 0.31920310E+04 0.31980359E+04 0.31980359E+04 0.32054170E+04 + 0.32054170E+04 0.32099351E+04 0.32099351E+04 0.32153831E+04 + 0.32153831E+04 0.32207781E+04 0.32207781E+04 0.32222119E+04 + 0.31906021E+04 0.31918110E+04 0.31918110E+04 0.31954451E+04 + 0.31954451E+04 0.31930920E+04 0.31930920E+04 0.31905850E+04 + 0.31905850E+04 0.31920310E+04 0.31920310E+04 0.31980359E+04 + 0.31980359E+04 0.32054170E+04 0.32054170E+04 0.32099351E+04 + 0.32099351E+04 0.32153831E+04 0.32153831E+04 0.32207781E+04 + 0.32207781E+04 0.32222119E+04 0.31785300E+04 0.31716211E+04 + 0.31716211E+04 0.31718350E+04 0.31718350E+04 0.31706211E+04 + 0.31706211E+04 0.31790820E+04 0.31790820E+04 0.31905229E+04 + 0.31905229E+04 0.31991321E+04 0.31991321E+04 0.32038340E+04 + 0.32038340E+04 0.32077009E+04 0.32077009E+04 0.32130349E+04 + 0.32130349E+04 0.32190320E+04 0.32190320E+04 0.32231880E+04 + 0.31785300E+04 0.31716211E+04 0.31716211E+04 0.31718350E+04 + 0.31718350E+04 0.31706211E+04 0.31706211E+04 0.31790820E+04 + 0.31790820E+04 0.31905229E+04 0.31905229E+04 0.31991321E+04 + 0.31991321E+04 0.32038340E+04 0.32038340E+04 0.32077009E+04 + 0.32077009E+04 0.32130349E+04 0.32130349E+04 0.32190320E+04 + 0.32190320E+04 0.32231880E+04 0.31771580E+04 0.31723049E+04 + 0.31723049E+04 0.31745071E+04 0.31745071E+04 0.31753110E+04 + 0.31753110E+04 0.31784419E+04 0.31784419E+04 0.31843210E+04 + 0.31843210E+04 0.31888459E+04 0.31888459E+04 0.31903940E+04 + 0.31903940E+04 0.31963340E+04 0.31963340E+04 0.32068450E+04 + 0.32068450E+04 0.32172620E+04 0.32172620E+04 0.32263020E+04 + 0.31771580E+04 0.31723049E+04 0.31723049E+04 0.31745071E+04 + 0.31745071E+04 0.31753110E+04 0.31753110E+04 0.31784419E+04 + 0.31784419E+04 0.31843210E+04 0.31843210E+04 0.31888459E+04 + 0.31888459E+04 0.31903940E+04 0.31903940E+04 0.31963340E+04 + 0.31963340E+04 0.32068450E+04 0.32068450E+04 0.32172620E+04 + 0.32172620E+04 0.32263020E+04 0.31911340E+04 0.31924919E+04 + 0.31924919E+04 0.31936089E+04 0.31936089E+04 0.31902820E+04 + 0.31902820E+04 0.31821990E+04 0.31821990E+04 0.31775339E+04 + 0.31775339E+04 0.31796201E+04 0.31796201E+04 0.31850901E+04 + 0.31850901E+04 0.31903811E+04 0.31903811E+04 0.31991550E+04 + 0.31991550E+04 0.32114390E+04 0.32114390E+04 0.32237271E+04 + 0.31911340E+04 0.31924919E+04 0.31924919E+04 0.31936089E+04 + 0.31936089E+04 0.31902820E+04 0.31902820E+04 0.31821990E+04 + 0.31821990E+04 0.31775339E+04 0.31775339E+04 0.31796201E+04 + 0.31796201E+04 0.31850901E+04 0.31850901E+04 0.31903811E+04 + 0.31903811E+04 0.31991550E+04 0.31991550E+04 0.32114390E+04 + 0.32114390E+04 0.32237271E+04 0.31888459E+04 0.31969910E+04 + 0.31969910E+04 0.32009590E+04 0.32009590E+04 0.31992300E+04 + 0.31992300E+04 0.31949609E+04 0.31949609E+04 0.31894370E+04 + 0.31894370E+04 0.31878630E+04 0.31878630E+04 0.31860569E+04 + 0.31860569E+04 0.31842061E+04 0.31842061E+04 0.31901909E+04 + 0.31901909E+04 0.32032229E+04 0.32032229E+04 0.32169661E+04 + 0.31888459E+04 0.31969910E+04 0.31969910E+04 0.32009590E+04 + 0.32009590E+04 0.31992300E+04 0.31992300E+04 0.31949609E+04 + 0.31949609E+04 0.31894370E+04 0.31894370E+04 0.31878630E+04 + 0.31878630E+04 0.31860569E+04 0.31860569E+04 0.31842061E+04 + 0.31842061E+04 0.31901909E+04 0.31901909E+04 0.32032229E+04 + 0.32032229E+04 0.32169661E+04 0.31863889E+04 0.31934600E+04 + 0.31934600E+04 0.31994409E+04 0.31994409E+04 0.31987041E+04 + 0.31987041E+04 0.31972529E+04 0.31972529E+04 0.31955691E+04 + 0.31955691E+04 0.31927109E+04 0.31927109E+04 0.31841589E+04 + 0.31841589E+04 0.31797000E+04 0.31797000E+04 0.31827620E+04 + 0.31827620E+04 0.31910090E+04 0.31910090E+04 0.32007070E+04 + 0.31863889E+04 0.31934600E+04 0.31934600E+04 0.31994409E+04 + 0.31994409E+04 0.31987041E+04 0.31987041E+04 0.31972529E+04 + 0.31972529E+04 0.31955691E+04 0.31955691E+04 0.31927109E+04 + 0.31927109E+04 0.31841589E+04 0.31841589E+04 0.31797000E+04 + 0.31797000E+04 0.31827620E+04 0.31827620E+04 0.31910090E+04 + 0.31910090E+04 0.32007070E+04 0.31957549E+04 0.31966799E+04 + 0.31966799E+04 0.32042971E+04 0.32042971E+04 0.32045659E+04 + 0.32045659E+04 0.31986411E+04 0.31986411E+04 0.31947781E+04 + 0.31947781E+04 0.31915449E+04 0.31915449E+04 0.31836289E+04 + 0.31836289E+04 0.31765920E+04 0.31765920E+04 0.31789890E+04 + 0.31789890E+04 0.31836531E+04 0.31836531E+04 0.31882839E+04 + 0.31957549E+04 0.31966799E+04 0.31966799E+04 0.32042971E+04 + 0.32042971E+04 0.32045659E+04 0.32045659E+04 0.31986411E+04 + 0.31986411E+04 0.31947781E+04 0.31947781E+04 0.31915449E+04 + 0.31915449E+04 0.31836289E+04 0.31836289E+04 0.31765920E+04 + 0.31765920E+04 0.31789890E+04 0.31789890E+04 0.31836531E+04 + 0.31836531E+04 0.31882839E+04 0.32079561E+04 0.32050730E+04 + 0.32050730E+04 0.32099500E+04 0.32099500E+04 0.32099250E+04 + 0.32099250E+04 0.32030410E+04 0.32030410E+04 0.31960459E+04 + 0.31960459E+04 0.31906411E+04 0.31906411E+04 0.31825381E+04 + 0.31825381E+04 0.31751060E+04 0.31751060E+04 0.31761101E+04 + 0.31761101E+04 0.31813430E+04 0.31813430E+04 0.31891760E+04 + 0.32079561E+04 0.32050730E+04 0.32050730E+04 0.32099500E+04 + 0.32099500E+04 0.32099250E+04 0.32099250E+04 0.32030410E+04 + 0.32030410E+04 0.31960459E+04 0.31960459E+04 0.31906411E+04 + 0.31906411E+04 0.31825381E+04 0.31825381E+04 0.31751060E+04 + 0.31751060E+04 0.31761101E+04 0.31761101E+04 0.31813430E+04 + 0.31813430E+04 0.31891760E+04 0.32045029E+04 0.32035071E+04 + 0.32035071E+04 0.32059871E+04 0.32059871E+04 0.32053760E+04 + 0.32053760E+04 0.31977070E+04 0.31977070E+04 0.31887190E+04 + 0.31887190E+04 0.31839890E+04 0.31839890E+04 0.31800601E+04 + 0.31800601E+04 0.31765950E+04 0.31765950E+04 0.31772720E+04 + 0.31772720E+04 0.31831860E+04 0.31831860E+04 0.31932681E+04 + 0.32045029E+04 0.32035071E+04 0.32035071E+04 0.32059871E+04 + 0.32059871E+04 0.32053760E+04 0.32053760E+04 0.31977070E+04 + 0.31977070E+04 0.31887190E+04 0.31887190E+04 0.31839890E+04 + 0.31839890E+04 0.31800601E+04 0.31800601E+04 0.31765950E+04 + 0.31765950E+04 0.31772720E+04 0.31772720E+04 0.31831860E+04 + 0.30525339E+04 0.30530691E+04 0.31986819E+04 0.31917229E+04 + 0.31917229E+04 0.31934380E+04 0.31934380E+04 0.31943159E+04 + 0.31943159E+04 0.31893030E+04 0.31893030E+04 0.31834780E+04 + 0.31834780E+04 0.31803521E+04 0.31803521E+04 0.31779089E+04 + 0.31779089E+04 0.31782920E+04 0.31782920E+04 0.31797351E+04 + 0.31797351E+04 0.31822881E+04 0.30573730E+04 0.30545090E+04 + 0.31986819E+04 0.31917229E+04 0.31917229E+04 0.31934380E+04 + 0.31934380E+04 0.31943159E+04 0.31943159E+04 0.31893030E+04 + 0.31893030E+04 0.31834780E+04 0.31834780E+04 0.31803521E+04 + 0.31803521E+04 0.31779089E+04 0.31779089E+04 0.31782920E+04 + 0.30908069E+04 0.30877090E+04 0.30877090E+04 0.30864839E+04 + 0.30573730E+04 0.30545090E+04 0.32024519E+04 0.31873870E+04 + 0.31873870E+04 0.31846279E+04 0.31846279E+04 0.31838030E+04 + 0.31838030E+04 0.31814031E+04 0.31814031E+04 0.31785720E+04 + 0.31785720E+04 0.31772500E+04 0.31772500E+04 0.31774280E+04 + 0.31774280E+04 0.31779719E+04 0.30894771E+04 0.30888269E+04 + 0.30888269E+04 0.30873479E+04 0.30569141E+04 0.30543831E+04 + 0.32024519E+04 0.31873870E+04 0.31873870E+04 0.31846279E+04 + 0.31846279E+04 0.31838030E+04 0.31838030E+04 0.31814031E+04 + 0.31814031E+04 0.31785720E+04 0.31785720E+04 0.31772500E+04 + 0.31030039E+04 0.30987090E+04 0.30987090E+04 0.30894771E+04 + 0.30894771E+04 0.30888269E+04 0.30888269E+04 0.30873479E+04 + 0.30569141E+04 0.30543831E+04 0.32034861E+04 0.31890249E+04 + 0.31890249E+04 0.31823589E+04 0.31823589E+04 0.31796970E+04 + 0.31796970E+04 0.31773730E+04 0.31773730E+04 0.31768159E+04 + 0.31768159E+04 0.31760471E+04 0.31045979E+04 0.31014980E+04 + 0.31014980E+04 0.30956570E+04 0.30956570E+04 0.30913240E+04 + 0.30913240E+04 0.30887529E+04 0.30572070E+04 0.30546479E+04 + 0.32034861E+04 0.31890249E+04 0.31890249E+04 0.31823589E+04 + 0.31823589E+04 0.31796970E+04 0.31796970E+04 0.31773730E+04 + 0.31120859E+04 0.31085911E+04 0.31085911E+04 0.31045979E+04 + 0.31045979E+04 0.31014980E+04 0.31014980E+04 0.30956570E+04 + 0.30956570E+04 0.30913240E+04 0.30913240E+04 0.30887529E+04 + 0.30572070E+04 0.30546479E+04 0.31982900E+04 0.31909089E+04 + 0.31909089E+04 0.31839580E+04 0.31839580E+04 0.31818689E+04 + 0.31818689E+04 0.31782629E+04 0.31138979E+04 0.31109150E+04 + 0.31109150E+04 0.31074031E+04 0.31074031E+04 0.31037759E+04 + 0.31037759E+04 0.30982959E+04 0.30982959E+04 0.30921221E+04 + 0.30921221E+04 0.30895229E+04 0.30574629E+04 0.30554260E+04 + 0.31982900E+04 0.31909089E+04 0.31909089E+04 0.31839580E+04 + 0.31231980E+04 0.31193201E+04 0.31193201E+04 0.31138979E+04 + 0.31138979E+04 0.31109150E+04 0.31109150E+04 0.31074031E+04 + 0.31074031E+04 0.31037759E+04 0.31037759E+04 0.30982959E+04 + 0.30982959E+04 0.30921221E+04 0.30921221E+04 0.30895229E+04 + 0.30574629E+04 0.30554260E+04 0.31970840E+04 0.31924331E+04 + 0.31924331E+04 0.31865200E+04 0.31264990E+04 0.31221130E+04 + 0.31221130E+04 0.31162671E+04 0.31162671E+04 0.31112881E+04 + 0.31112881E+04 0.31049031E+04 0.31049031E+04 0.31011460E+04 + 0.31011460E+04 0.30989360E+04 0.30989360E+04 0.30944880E+04 + 0.30944880E+04 0.30903669E+04 0.30582949E+04 0.30559590E+04 + 0.31341919E+04 0.31312781E+04 0.31312781E+04 0.31264990E+04 + 0.31264990E+04 0.31221130E+04 0.31221130E+04 0.31162671E+04 + 0.31162671E+04 0.31112881E+04 0.31112881E+04 0.31049031E+04 + 0.31049031E+04 0.31011460E+04 0.31011460E+04 0.30989360E+04 + 0.30989360E+04 0.30944880E+04 0.30944880E+04 0.30903669E+04 + 0.30903669E+04 0.30875420E+04 0.31359880E+04 0.31338140E+04 + 0.31338140E+04 0.31321460E+04 0.31321460E+04 0.31271250E+04 + 0.31271250E+04 0.31138330E+04 0.31138330E+04 0.31061130E+04 + 0.31061130E+04 0.31013921E+04 0.31013921E+04 0.31005320E+04 + 0.31005320E+04 0.31027661E+04 0.31027661E+04 0.30980869E+04 + 0.30980869E+04 0.30915691E+04 0.30915691E+04 0.30878440E+04 + 0.32093660E+04 0.32081399E+04 0.32081399E+04 0.32108750E+04 + 0.32108750E+04 0.32115581E+04 0.32115581E+04 0.32071189E+04 + 0.32071189E+04 0.31991790E+04 0.31991790E+04 0.31978689E+04 + 0.31978689E+04 0.32023601E+04 0.32023601E+04 0.32051541E+04 + 0.32051541E+04 0.32064319E+04 0.32064319E+04 0.32113369E+04 + 0.32113369E+04 0.32187529E+04 0.31995481E+04 0.32003799E+04 + 0.32003799E+04 0.32052971E+04 0.32052971E+04 0.32065491E+04 + 0.32065491E+04 0.32034529E+04 0.32034529E+04 0.32004661E+04 + 0.32004661E+04 0.32038721E+04 0.32038721E+04 0.32102241E+04 + 0.32102241E+04 0.32126279E+04 0.32126279E+04 0.32151331E+04 + 0.32151331E+04 0.32199009E+04 0.32199009E+04 0.32233511E+04 + 0.31995481E+04 0.32003799E+04 0.32003799E+04 0.32052971E+04 + 0.32052971E+04 0.32065491E+04 0.32065491E+04 0.32034529E+04 + 0.32034529E+04 0.32004661E+04 0.32004661E+04 0.32038721E+04 + 0.32038721E+04 0.32102241E+04 0.32102241E+04 0.32126279E+04 + 0.32126279E+04 0.32151331E+04 0.32151331E+04 0.32199009E+04 + 0.32199009E+04 0.32233511E+04 0.31917891E+04 0.31928979E+04 + 0.31928979E+04 0.31965911E+04 0.31965911E+04 0.31942881E+04 + 0.31942881E+04 0.31916660E+04 0.31916660E+04 0.31929570E+04 + 0.31929570E+04 0.31988679E+04 0.31988679E+04 0.32062681E+04 + 0.32062681E+04 0.32108589E+04 0.32108589E+04 0.32163110E+04 + 0.32163110E+04 0.32217820E+04 0.32217820E+04 0.32230830E+04 + 0.31917891E+04 0.31928979E+04 0.31928979E+04 0.31965911E+04 + 0.31965911E+04 0.31942881E+04 0.31942881E+04 0.31916660E+04 + 0.31916660E+04 0.31929570E+04 0.31929570E+04 0.31988679E+04 + 0.31988679E+04 0.32062681E+04 0.32062681E+04 0.32108589E+04 + 0.32108589E+04 0.32163110E+04 0.32163110E+04 0.32217820E+04 + 0.32217820E+04 0.32230830E+04 0.31796531E+04 0.31726379E+04 + 0.31726379E+04 0.31728630E+04 0.31728630E+04 0.31714519E+04 + 0.31714519E+04 0.31797600E+04 0.31797600E+04 0.31911541E+04 + 0.31911541E+04 0.31998040E+04 0.31998040E+04 0.32046121E+04 + 0.32046121E+04 0.32085310E+04 0.32085310E+04 0.32138120E+04 + 0.32138120E+04 0.32197361E+04 0.32197361E+04 0.32237539E+04 + 0.31796531E+04 0.31726379E+04 0.31726379E+04 0.31728630E+04 + 0.31728630E+04 0.31714519E+04 0.31714519E+04 0.31797600E+04 + 0.31797600E+04 0.31911541E+04 0.31911541E+04 0.31998040E+04 + 0.31998040E+04 0.32046121E+04 0.32046121E+04 0.32085310E+04 + 0.32085310E+04 0.32138120E+04 0.32138120E+04 0.32197361E+04 + 0.32197361E+04 0.32237539E+04 0.31777100E+04 0.31728511E+04 + 0.31728511E+04 0.31751130E+04 0.31751130E+04 0.31759409E+04 + 0.31759409E+04 0.31790801E+04 0.31790801E+04 0.31849829E+04 + 0.31849829E+04 0.31894971E+04 0.31894971E+04 0.31910061E+04 + 0.31910061E+04 0.31968589E+04 0.31968589E+04 0.32073511E+04 + 0.32073511E+04 0.32177410E+04 0.32177410E+04 0.32267639E+04 + 0.31777100E+04 0.31728511E+04 0.31728511E+04 0.31751130E+04 + 0.31751130E+04 0.31759409E+04 0.31759409E+04 0.31790801E+04 + 0.31790801E+04 0.31849829E+04 0.31849829E+04 0.31894971E+04 + 0.31894971E+04 0.31910061E+04 0.31910061E+04 0.31968589E+04 + 0.31968589E+04 0.32073511E+04 0.32073511E+04 0.32177410E+04 + 0.32177410E+04 0.32267639E+04 0.31916560E+04 0.31929851E+04 + 0.31929851E+04 0.31941340E+04 0.31941340E+04 0.31908650E+04 + 0.31908650E+04 0.31827549E+04 0.31827549E+04 0.31780120E+04 + 0.31780120E+04 0.31800481E+04 0.31800481E+04 0.31855439E+04 + 0.31855439E+04 0.31908589E+04 0.31908589E+04 0.31995710E+04 + 0.31995710E+04 0.32118511E+04 0.32118511E+04 0.32241531E+04 + 0.31916560E+04 0.31929851E+04 0.31929851E+04 0.31941340E+04 + 0.31941340E+04 0.31908650E+04 0.31908650E+04 0.31827549E+04 + 0.31827549E+04 0.31780120E+04 0.31780120E+04 0.31800481E+04 + 0.31800481E+04 0.31855439E+04 0.31855439E+04 0.31908589E+04 + 0.31908589E+04 0.31995710E+04 0.31995710E+04 0.32118511E+04 + 0.32118511E+04 0.32241531E+04 0.31893350E+04 0.31974519E+04 + 0.31974519E+04 0.32014910E+04 0.32014910E+04 0.31998049E+04 + 0.31998049E+04 0.31955129E+04 0.31955129E+04 0.31899060E+04 + 0.31899060E+04 0.31883069E+04 0.31883069E+04 0.31865430E+04 + 0.31865430E+04 0.31846350E+04 0.31846350E+04 0.31905410E+04 + 0.31905410E+04 0.32036311E+04 0.32036311E+04 0.32174741E+04 + 0.31893350E+04 0.31974519E+04 0.31974519E+04 0.32014910E+04 + 0.32014910E+04 0.31998049E+04 0.31998049E+04 0.31955129E+04 + 0.31955129E+04 0.31899060E+04 0.31899060E+04 0.31883069E+04 + 0.31883069E+04 0.31865430E+04 0.31865430E+04 0.31846350E+04 + 0.31846350E+04 0.31905410E+04 0.31905410E+04 0.32036311E+04 + 0.32036311E+04 0.32174741E+04 0.31868569E+04 0.31938730E+04 + 0.31938730E+04 0.31999390E+04 0.31999390E+04 0.31992251E+04 + 0.31992251E+04 0.31977661E+04 0.31977661E+04 0.31960540E+04 + 0.31960540E+04 0.31932261E+04 0.31932261E+04 0.31846841E+04 + 0.31846841E+04 0.31801509E+04 0.31801509E+04 0.31831479E+04 + 0.31831479E+04 0.31914241E+04 0.31914241E+04 0.32012390E+04 + 0.31868569E+04 0.31938730E+04 0.31938730E+04 0.31999390E+04 + 0.31999390E+04 0.31992251E+04 0.31992251E+04 0.31977661E+04 + 0.31977661E+04 0.31960540E+04 0.31960540E+04 0.31932261E+04 + 0.31932261E+04 0.31846841E+04 0.31846841E+04 0.31801509E+04 + 0.31801509E+04 0.31831479E+04 0.31831479E+04 0.31914241E+04 + 0.31914241E+04 0.32012390E+04 0.31962649E+04 0.31970681E+04 + 0.31970681E+04 0.32047290E+04 0.32047290E+04 0.32050859E+04 + 0.32050859E+04 0.31991460E+04 0.31991460E+04 0.31952600E+04 + 0.31952600E+04 0.31920500E+04 0.31920500E+04 0.31841809E+04 + 0.31841809E+04 0.31770691E+04 0.31770691E+04 0.31793960E+04 + 0.31793960E+04 0.31840649E+04 0.31840649E+04 0.31886741E+04 + 0.31962649E+04 0.31970681E+04 0.31970681E+04 0.32047290E+04 + 0.32047290E+04 0.32050859E+04 0.32050859E+04 0.31991460E+04 + 0.31991460E+04 0.31952600E+04 0.31952600E+04 0.31920500E+04 + 0.31920500E+04 0.31841809E+04 0.31841809E+04 0.31770691E+04 + 0.31770691E+04 0.31793960E+04 0.31793960E+04 0.31840649E+04 + 0.31840649E+04 0.31886741E+04 0.32085669E+04 0.32055330E+04 + 0.32055330E+04 0.32104060E+04 0.32104060E+04 0.32104451E+04 + 0.32104451E+04 0.32035991E+04 0.32035991E+04 0.31965920E+04 + 0.31965920E+04 0.31911589E+04 0.31911589E+04 0.31830830E+04 + 0.31830830E+04 0.31756030E+04 0.31756030E+04 0.31766450E+04 + 0.31766450E+04 0.31819741E+04 0.31819741E+04 0.31899060E+04 + 0.32085669E+04 0.32055330E+04 0.32055330E+04 0.32104060E+04 + 0.32104060E+04 0.32104451E+04 0.32104451E+04 0.32035991E+04 + 0.32035991E+04 0.31965920E+04 0.31965920E+04 0.31911589E+04 + 0.31911589E+04 0.31830830E+04 0.31830830E+04 0.31756030E+04 + 0.31756030E+04 0.31766450E+04 0.31766450E+04 0.31819741E+04 + 0.31819741E+04 0.31899060E+04 0.32051721E+04 0.32040581E+04 + 0.32040581E+04 0.32065110E+04 0.32065110E+04 0.32059600E+04 + 0.32059600E+04 0.31983291E+04 0.31983291E+04 0.31893630E+04 + 0.31893630E+04 0.31846001E+04 0.31846001E+04 0.31807981E+04 + 0.31807981E+04 0.31774971E+04 0.31774971E+04 0.31782920E+04 + 0.31782920E+04 0.31840591E+04 0.31840591E+04 0.31941101E+04 + 0.32051721E+04 0.32040581E+04 0.32040581E+04 0.32065110E+04 + 0.32065110E+04 0.32059600E+04 0.32059600E+04 0.31983291E+04 + 0.31983291E+04 0.31893630E+04 0.31893630E+04 0.31846001E+04 + 0.31846001E+04 0.31807981E+04 0.31807981E+04 0.31774971E+04 + 0.31774971E+04 0.31782920E+04 0.31782920E+04 0.31840591E+04 + 0.30528379E+04 0.30534390E+04 0.31993870E+04 0.31922839E+04 + 0.31922839E+04 0.31939341E+04 0.31939341E+04 0.31949241E+04 + 0.31949241E+04 0.31900281E+04 0.31900281E+04 0.31843340E+04 + 0.31843340E+04 0.31813120E+04 0.31813120E+04 0.31790281E+04 + 0.31790281E+04 0.31793181E+04 0.31793181E+04 0.31808210E+04 + 0.31808210E+04 0.31834419E+04 0.30576831E+04 0.30548701E+04 + 0.31993870E+04 0.31922839E+04 0.31922839E+04 0.31939341E+04 + 0.31939341E+04 0.31949241E+04 0.31949241E+04 0.31900281E+04 + 0.31900281E+04 0.31843340E+04 0.31843340E+04 0.31813120E+04 + 0.31813120E+04 0.31790281E+04 0.31790281E+04 0.31793181E+04 + 0.30915640E+04 0.30884900E+04 0.30884900E+04 0.30872891E+04 + 0.30576831E+04 0.30548701E+04 0.32032490E+04 0.31880200E+04 + 0.31880200E+04 0.31852400E+04 0.31852400E+04 0.31845591E+04 + 0.31845591E+04 0.31823440E+04 0.31823440E+04 0.31796799E+04 + 0.31796799E+04 0.31782600E+04 0.31782600E+04 0.31785049E+04 + 0.31785049E+04 0.31791909E+04 0.30901450E+04 0.30895969E+04 + 0.30895969E+04 0.30881770E+04 0.30572429E+04 0.30547300E+04 + 0.32032490E+04 0.31880200E+04 0.31880200E+04 0.31852400E+04 + 0.31852400E+04 0.31845591E+04 0.31845591E+04 0.31823440E+04 + 0.31823440E+04 0.31796799E+04 0.31796799E+04 0.31782600E+04 + 0.31036909E+04 0.30994221E+04 0.30994221E+04 0.30901450E+04 + 0.30901450E+04 0.30895969E+04 0.30895969E+04 0.30881770E+04 + 0.30572429E+04 0.30547300E+04 0.32043540E+04 0.31898411E+04 + 0.31898411E+04 0.31832051E+04 0.31832051E+04 0.31804951E+04 + 0.31804951E+04 0.31782361E+04 0.31782361E+04 0.31778440E+04 + 0.31778440E+04 0.31771460E+04 0.31052661E+04 0.31022280E+04 + 0.31022280E+04 0.30964541E+04 0.30964541E+04 0.30921411E+04 + 0.30921411E+04 0.30896001E+04 0.30575591E+04 0.30550300E+04 + 0.32043540E+04 0.31898411E+04 0.31898411E+04 0.31832051E+04 + 0.31832051E+04 0.31804951E+04 0.31804951E+04 0.31782361E+04 + 0.31127119E+04 0.31092280E+04 0.31092280E+04 0.31052661E+04 + 0.31052661E+04 0.31022280E+04 0.31022280E+04 0.30964541E+04 + 0.30964541E+04 0.30921411E+04 0.30921411E+04 0.30896001E+04 + 0.30575591E+04 0.30550300E+04 0.31991941E+04 0.31917300E+04 + 0.31917300E+04 0.31847371E+04 0.31847371E+04 0.31826990E+04 + 0.31826990E+04 0.31791179E+04 0.31145500E+04 0.31115979E+04 + 0.31115979E+04 0.31080659E+04 0.31080659E+04 0.31044561E+04 + 0.31044561E+04 0.30990129E+04 0.30990129E+04 0.30929780E+04 + 0.30929780E+04 0.30903770E+04 0.30578411E+04 0.30558369E+04 + 0.31991941E+04 0.31917300E+04 0.31917300E+04 0.31847371E+04 + 0.31238450E+04 0.31199690E+04 0.31199690E+04 0.31145500E+04 + 0.31145500E+04 0.31115979E+04 0.31115979E+04 0.31080659E+04 + 0.31080659E+04 0.31044561E+04 0.31044561E+04 0.30990129E+04 + 0.30990129E+04 0.30929780E+04 0.30929780E+04 0.30903770E+04 + 0.30578411E+04 0.30558369E+04 0.31978269E+04 0.31932380E+04 + 0.31932380E+04 0.31873020E+04 0.31271631E+04 0.31228250E+04 + 0.31228250E+04 0.31169609E+04 0.31169609E+04 0.31119551E+04 + 0.31119551E+04 0.31055569E+04 0.31055569E+04 0.31018301E+04 + 0.31018301E+04 0.30996509E+04 0.30996509E+04 0.30952800E+04 + 0.30952800E+04 0.30912070E+04 0.30586909E+04 0.30563921E+04 + 0.31349170E+04 0.31319851E+04 0.31319851E+04 0.31271631E+04 + 0.31271631E+04 0.31228250E+04 0.31228250E+04 0.31169609E+04 + 0.31169609E+04 0.31119551E+04 0.31119551E+04 0.31055569E+04 + 0.31055569E+04 0.31018301E+04 0.31018301E+04 0.30996509E+04 + 0.30996509E+04 0.30952800E+04 0.30952800E+04 0.30912070E+04 + 0.30912070E+04 0.30884380E+04 0.31367151E+04 0.31345630E+04 + 0.31345630E+04 0.31328201E+04 0.31328201E+04 0.31277539E+04 + 0.31277539E+04 0.31145000E+04 0.31145000E+04 0.31067329E+04 + 0.31067329E+04 0.31020049E+04 0.31020049E+04 0.31011460E+04 + 0.31011460E+04 0.31034910E+04 0.31034910E+04 0.30988611E+04 + 0.30988611E+04 0.30924189E+04 0.30924189E+04 0.30887229E+04 + 0.32093660E+04 0.32081399E+04 0.32081399E+04 0.32108750E+04 + 0.32108750E+04 0.32115581E+04 0.32115581E+04 0.32071189E+04 + 0.32071189E+04 0.31991790E+04 0.31991790E+04 0.31978689E+04 + 0.31978689E+04 0.32023601E+04 0.32023601E+04 0.32051541E+04 + 0.32051541E+04 0.32064319E+04 0.32064319E+04 0.32113369E+04 + 0.32113369E+04 0.32187529E+04 0.31995481E+04 0.32003799E+04 + 0.32003799E+04 0.32052971E+04 0.32052971E+04 0.32065491E+04 + 0.32065491E+04 0.32034529E+04 0.32034529E+04 0.32004661E+04 + 0.32004661E+04 0.32038721E+04 0.32038721E+04 0.32102241E+04 + 0.32102241E+04 0.32126279E+04 0.32126279E+04 0.32151331E+04 + 0.32151331E+04 0.32199009E+04 0.32199009E+04 0.32233511E+04 + 0.31995481E+04 0.32003799E+04 0.32003799E+04 0.32052971E+04 + 0.32052971E+04 0.32065491E+04 0.32065491E+04 0.32034529E+04 + 0.32034529E+04 0.32004661E+04 0.32004661E+04 0.32038721E+04 + 0.32038721E+04 0.32102241E+04 0.32102241E+04 0.32126279E+04 + 0.32126279E+04 0.32151331E+04 0.32151331E+04 0.32199009E+04 + 0.32199009E+04 0.32233511E+04 0.31917891E+04 0.31928979E+04 + 0.31928979E+04 0.31965911E+04 0.31965911E+04 0.31942881E+04 + 0.31942881E+04 0.31916660E+04 0.31916660E+04 0.31929570E+04 + 0.31929570E+04 0.31988679E+04 0.31988679E+04 0.32062681E+04 + 0.32062681E+04 0.32108589E+04 0.32108589E+04 0.32163110E+04 + 0.32163110E+04 0.32217820E+04 0.32217820E+04 0.32230830E+04 + 0.31917891E+04 0.31928979E+04 0.31928979E+04 0.31965911E+04 + 0.31965911E+04 0.31942881E+04 0.31942881E+04 0.31916660E+04 + 0.31916660E+04 0.31929570E+04 0.31929570E+04 0.31988679E+04 + 0.31988679E+04 0.32062681E+04 0.32062681E+04 0.32108589E+04 + 0.32108589E+04 0.32163110E+04 0.32163110E+04 0.32217820E+04 + 0.32217820E+04 0.32230830E+04 0.31796531E+04 0.31726379E+04 + 0.31726379E+04 0.31728630E+04 0.31728630E+04 0.31714519E+04 + 0.31714519E+04 0.31797600E+04 0.31797600E+04 0.31911541E+04 + 0.31911541E+04 0.31998040E+04 0.31998040E+04 0.32046121E+04 + 0.32046121E+04 0.32085310E+04 0.32085310E+04 0.32138120E+04 + 0.32138120E+04 0.32197361E+04 0.32197361E+04 0.32237539E+04 + 0.31796531E+04 0.31726379E+04 0.31726379E+04 0.31728630E+04 + 0.31728630E+04 0.31714519E+04 0.31714519E+04 0.31797600E+04 + 0.31797600E+04 0.31911541E+04 0.31911541E+04 0.31998040E+04 + 0.31998040E+04 0.32046121E+04 0.32046121E+04 0.32085310E+04 + 0.32085310E+04 0.32138120E+04 0.32138120E+04 0.32197361E+04 + 0.32197361E+04 0.32237539E+04 0.31777100E+04 0.31728511E+04 + 0.31728511E+04 0.31751130E+04 0.31751130E+04 0.31759409E+04 + 0.31759409E+04 0.31790801E+04 0.31790801E+04 0.31849829E+04 + 0.31849829E+04 0.31894971E+04 0.31894971E+04 0.31910061E+04 + 0.31910061E+04 0.31968589E+04 0.31968589E+04 0.32073511E+04 + 0.32073511E+04 0.32177410E+04 0.32177410E+04 0.32267639E+04 + 0.31777100E+04 0.31728511E+04 0.31728511E+04 0.31751130E+04 + 0.31751130E+04 0.31759409E+04 0.31759409E+04 0.31790801E+04 + 0.31790801E+04 0.31849829E+04 0.31849829E+04 0.31894971E+04 + 0.31894971E+04 0.31910061E+04 0.31910061E+04 0.31968589E+04 + 0.31968589E+04 0.32073511E+04 0.32073511E+04 0.32177410E+04 + 0.32177410E+04 0.32267639E+04 0.31916560E+04 0.31929851E+04 + 0.31929851E+04 0.31941340E+04 0.31941340E+04 0.31908650E+04 + 0.31908650E+04 0.31827549E+04 0.31827549E+04 0.31780120E+04 + 0.31780120E+04 0.31800481E+04 0.31800481E+04 0.31855439E+04 + 0.31855439E+04 0.31908589E+04 0.31908589E+04 0.31995710E+04 + 0.31995710E+04 0.32118511E+04 0.32118511E+04 0.32241531E+04 + 0.31916560E+04 0.31929851E+04 0.31929851E+04 0.31941340E+04 + 0.31941340E+04 0.31908650E+04 0.31908650E+04 0.31827549E+04 + 0.31827549E+04 0.31780120E+04 0.31780120E+04 0.31800481E+04 + 0.31800481E+04 0.31855439E+04 0.31855439E+04 0.31908589E+04 + 0.31908589E+04 0.31995710E+04 0.31995710E+04 0.32118511E+04 + 0.32118511E+04 0.32241531E+04 0.31893350E+04 0.31974519E+04 + 0.31974519E+04 0.32014910E+04 0.32014910E+04 0.31998049E+04 + 0.31998049E+04 0.31955129E+04 0.31955129E+04 0.31899060E+04 + 0.31899060E+04 0.31883069E+04 0.31883069E+04 0.31865430E+04 + 0.31865430E+04 0.31846350E+04 0.31846350E+04 0.31905410E+04 + 0.31905410E+04 0.32036311E+04 0.32036311E+04 0.32174741E+04 + 0.31893350E+04 0.31974519E+04 0.31974519E+04 0.32014910E+04 + 0.32014910E+04 0.31998049E+04 0.31998049E+04 0.31955129E+04 + 0.31955129E+04 0.31899060E+04 0.31899060E+04 0.31883069E+04 + 0.31883069E+04 0.31865430E+04 0.31865430E+04 0.31846350E+04 + 0.31846350E+04 0.31905410E+04 0.31905410E+04 0.32036311E+04 + 0.32036311E+04 0.32174741E+04 0.31868569E+04 0.31938730E+04 + 0.31938730E+04 0.31999390E+04 0.31999390E+04 0.31992251E+04 + 0.31992251E+04 0.31977661E+04 0.31977661E+04 0.31960540E+04 + 0.31960540E+04 0.31932261E+04 0.31932261E+04 0.31846841E+04 + 0.31846841E+04 0.31801509E+04 0.31801509E+04 0.31831479E+04 + 0.31831479E+04 0.31914241E+04 0.31914241E+04 0.32012390E+04 + 0.31868569E+04 0.31938730E+04 0.31938730E+04 0.31999390E+04 + 0.31999390E+04 0.31992251E+04 0.31992251E+04 0.31977661E+04 + 0.31977661E+04 0.31960540E+04 0.31960540E+04 0.31932261E+04 + 0.31932261E+04 0.31846841E+04 0.31846841E+04 0.31801509E+04 + 0.31801509E+04 0.31831479E+04 0.31831479E+04 0.31914241E+04 + 0.31914241E+04 0.32012390E+04 0.31962649E+04 0.31970681E+04 + 0.31970681E+04 0.32047290E+04 0.32047290E+04 0.32050859E+04 + 0.32050859E+04 0.31991460E+04 0.31991460E+04 0.31952600E+04 + 0.31952600E+04 0.31920500E+04 0.31920500E+04 0.31841809E+04 + 0.31841809E+04 0.31770691E+04 0.31770691E+04 0.31793960E+04 + 0.31793960E+04 0.31840649E+04 0.31840649E+04 0.31886741E+04 + 0.31962649E+04 0.31970681E+04 0.31970681E+04 0.32047290E+04 + 0.32047290E+04 0.32050859E+04 0.32050859E+04 0.31991460E+04 + 0.31991460E+04 0.31952600E+04 0.31952600E+04 0.31920500E+04 + 0.31920500E+04 0.31841809E+04 0.31841809E+04 0.31770691E+04 + 0.31770691E+04 0.31793960E+04 0.31793960E+04 0.31840649E+04 + 0.31840649E+04 0.31886741E+04 0.32085669E+04 0.32055330E+04 + 0.32055330E+04 0.32104060E+04 0.32104060E+04 0.32104451E+04 + 0.32104451E+04 0.32035991E+04 0.32035991E+04 0.31965920E+04 + 0.31965920E+04 0.31911589E+04 0.31911589E+04 0.31830830E+04 + 0.31830830E+04 0.31756030E+04 0.31756030E+04 0.31766450E+04 + 0.31766450E+04 0.31819741E+04 0.31819741E+04 0.31899060E+04 + 0.32085669E+04 0.32055330E+04 0.32055330E+04 0.32104060E+04 + 0.32104060E+04 0.32104451E+04 0.32104451E+04 0.32035991E+04 + 0.32035991E+04 0.31965920E+04 0.31965920E+04 0.31911589E+04 + 0.31911589E+04 0.31830830E+04 0.31830830E+04 0.31756030E+04 + 0.31756030E+04 0.31766450E+04 0.31766450E+04 0.31819741E+04 + 0.31819741E+04 0.31899060E+04 0.32051721E+04 0.32040581E+04 + 0.32040581E+04 0.32065110E+04 0.32065110E+04 0.32059600E+04 + 0.32059600E+04 0.31983291E+04 0.31983291E+04 0.31893630E+04 + 0.31893630E+04 0.31846001E+04 0.31846001E+04 0.31807981E+04 + 0.31807981E+04 0.31774971E+04 0.31774971E+04 0.31782920E+04 + 0.31782920E+04 0.31840591E+04 0.31840591E+04 0.31941101E+04 + 0.32051721E+04 0.32040581E+04 0.32040581E+04 0.32065110E+04 + 0.32065110E+04 0.32059600E+04 0.32059600E+04 0.31983291E+04 + 0.31983291E+04 0.31893630E+04 0.31893630E+04 0.31846001E+04 + 0.31846001E+04 0.31807981E+04 0.31807981E+04 0.31774971E+04 + 0.31774971E+04 0.31782920E+04 0.31782920E+04 0.31840591E+04 + 0.30528379E+04 0.30534390E+04 0.31993870E+04 0.31922839E+04 + 0.31922839E+04 0.31939341E+04 0.31939341E+04 0.31949241E+04 + 0.31949241E+04 0.31900281E+04 0.31900281E+04 0.31843340E+04 + 0.31843340E+04 0.31813120E+04 0.31813120E+04 0.31790281E+04 + 0.31790281E+04 0.31793181E+04 0.31793181E+04 0.31808210E+04 + 0.31808210E+04 0.31834419E+04 0.30576831E+04 0.30548701E+04 + 0.31993870E+04 0.31922839E+04 0.31922839E+04 0.31939341E+04 + 0.31939341E+04 0.31949241E+04 0.31949241E+04 0.31900281E+04 + 0.31900281E+04 0.31843340E+04 0.31843340E+04 0.31813120E+04 + 0.31813120E+04 0.31790281E+04 0.31790281E+04 0.31793181E+04 + 0.30915640E+04 0.30884900E+04 0.30884900E+04 0.30872891E+04 + 0.30576831E+04 0.30548701E+04 0.32032490E+04 0.31880200E+04 + 0.31880200E+04 0.31852400E+04 0.31852400E+04 0.31845591E+04 + 0.31845591E+04 0.31823440E+04 0.31823440E+04 0.31796799E+04 + 0.31796799E+04 0.31782600E+04 0.31782600E+04 0.31785049E+04 + 0.31785049E+04 0.31791909E+04 0.30901450E+04 0.30895969E+04 + 0.30895969E+04 0.30881770E+04 0.30572429E+04 0.30547300E+04 + 0.32032490E+04 0.31880200E+04 0.31880200E+04 0.31852400E+04 + 0.31852400E+04 0.31845591E+04 0.31845591E+04 0.31823440E+04 + 0.31823440E+04 0.31796799E+04 0.31796799E+04 0.31782600E+04 + 0.31036909E+04 0.30994221E+04 0.30994221E+04 0.30901450E+04 + 0.30901450E+04 0.30895969E+04 0.30895969E+04 0.30881770E+04 + 0.30572429E+04 0.30547300E+04 0.32043540E+04 0.31898411E+04 + 0.31898411E+04 0.31832051E+04 0.31832051E+04 0.31804951E+04 + 0.31804951E+04 0.31782361E+04 0.31782361E+04 0.31778440E+04 + 0.31778440E+04 0.31771460E+04 0.31052661E+04 0.31022280E+04 + 0.31022280E+04 0.30964541E+04 0.30964541E+04 0.30921411E+04 + 0.30921411E+04 0.30896001E+04 0.30575591E+04 0.30550300E+04 + 0.32043540E+04 0.31898411E+04 0.31898411E+04 0.31832051E+04 + 0.31832051E+04 0.31804951E+04 0.31804951E+04 0.31782361E+04 + 0.31127119E+04 0.31092280E+04 0.31092280E+04 0.31052661E+04 + 0.31052661E+04 0.31022280E+04 0.31022280E+04 0.30964541E+04 + 0.30964541E+04 0.30921411E+04 0.30921411E+04 0.30896001E+04 + 0.30575591E+04 0.30550300E+04 0.31991941E+04 0.31917300E+04 + 0.31917300E+04 0.31847371E+04 0.31847371E+04 0.31826990E+04 + 0.31826990E+04 0.31791179E+04 0.31145500E+04 0.31115979E+04 + 0.31115979E+04 0.31080659E+04 0.31080659E+04 0.31044561E+04 + 0.31044561E+04 0.30990129E+04 0.30990129E+04 0.30929780E+04 + 0.30929780E+04 0.30903770E+04 0.30578411E+04 0.30558369E+04 + 0.31991941E+04 0.31917300E+04 0.31917300E+04 0.31847371E+04 + 0.31238450E+04 0.31199690E+04 0.31199690E+04 0.31145500E+04 + 0.31145500E+04 0.31115979E+04 0.31115979E+04 0.31080659E+04 + 0.31080659E+04 0.31044561E+04 0.31044561E+04 0.30990129E+04 + 0.30990129E+04 0.30929780E+04 0.30929780E+04 0.30903770E+04 + 0.30578411E+04 0.30558369E+04 0.31978269E+04 0.31932380E+04 + 0.31932380E+04 0.31873020E+04 0.31271631E+04 0.31228250E+04 + 0.31228250E+04 0.31169609E+04 0.31169609E+04 0.31119551E+04 + 0.31119551E+04 0.31055569E+04 0.31055569E+04 0.31018301E+04 + 0.31018301E+04 0.30996509E+04 0.30996509E+04 0.30952800E+04 + 0.30952800E+04 0.30912070E+04 0.30586909E+04 0.30563921E+04 + 0.31349170E+04 0.31319851E+04 0.31319851E+04 0.31271631E+04 + 0.31271631E+04 0.31228250E+04 0.31228250E+04 0.31169609E+04 + 0.31169609E+04 0.31119551E+04 0.31119551E+04 0.31055569E+04 + 0.31055569E+04 0.31018301E+04 0.31018301E+04 0.30996509E+04 + 0.30996509E+04 0.30952800E+04 0.30952800E+04 0.30912070E+04 + 0.30912070E+04 0.30884380E+04 0.31367151E+04 0.31345630E+04 + 0.31345630E+04 0.31328201E+04 0.31328201E+04 0.31277539E+04 + 0.31277539E+04 0.31145000E+04 0.31145000E+04 0.31067329E+04 + 0.31067329E+04 0.31020049E+04 0.31020049E+04 0.31011460E+04 + 0.31011460E+04 0.31034910E+04 0.31034910E+04 0.30988611E+04 + 0.30988611E+04 0.30924189E+04 0.30924189E+04 0.30887229E+04 + 0.32104871E+04 0.32091560E+04 0.32091560E+04 0.32118950E+04 + 0.32118950E+04 0.32126260E+04 0.32126260E+04 0.32082310E+04 + 0.32082310E+04 0.32002419E+04 0.32002419E+04 0.31988040E+04 + 0.31988040E+04 0.32032070E+04 0.32032070E+04 0.32060540E+04 + 0.32060540E+04 0.32073550E+04 0.32073550E+04 0.32122571E+04 + 0.32122571E+04 0.32197080E+04 0.32007009E+04 0.32013921E+04 + 0.32013921E+04 0.32063379E+04 0.32063379E+04 0.32076680E+04 + 0.32076680E+04 0.32045911E+04 0.32045911E+04 0.32015349E+04 + 0.32015349E+04 0.32048220E+04 0.32048220E+04 0.32111680E+04 + 0.32111680E+04 0.32136760E+04 0.32136760E+04 0.32161499E+04 + 0.32161499E+04 0.32209309E+04 0.32209309E+04 0.32243059E+04 + 0.32007009E+04 0.32013921E+04 0.32013921E+04 0.32063379E+04 + 0.32063379E+04 0.32076680E+04 0.32076680E+04 0.32045911E+04 + 0.32045911E+04 0.32015349E+04 0.32015349E+04 0.32048220E+04 + 0.32048220E+04 0.32111680E+04 0.32111680E+04 0.32136760E+04 + 0.32136760E+04 0.32161499E+04 0.32161499E+04 0.32209309E+04 + 0.32209309E+04 0.32243059E+04 0.31929761E+04 0.31939861E+04 + 0.31939861E+04 0.31977380E+04 0.31977380E+04 0.31954839E+04 + 0.31954839E+04 0.31927471E+04 0.31927471E+04 0.31938831E+04 + 0.31938831E+04 0.31997009E+04 0.31997009E+04 0.32071201E+04 + 0.32071201E+04 0.32117820E+04 0.32117820E+04 0.32172390E+04 + 0.32172390E+04 0.32227849E+04 0.32227849E+04 0.32239551E+04 + 0.31929761E+04 0.31939861E+04 0.31939861E+04 0.31977380E+04 + 0.31977380E+04 0.31954839E+04 0.31954839E+04 0.31927471E+04 + 0.31927471E+04 0.31938831E+04 0.31938831E+04 0.31997009E+04 + 0.31997009E+04 0.32071201E+04 0.32071201E+04 0.32117820E+04 + 0.32117820E+04 0.32172390E+04 0.32172390E+04 0.32227849E+04 + 0.32227849E+04 0.32239551E+04 0.31807749E+04 0.31736550E+04 + 0.31736550E+04 0.31738899E+04 0.31738899E+04 0.31722830E+04 + 0.31722830E+04 0.31804370E+04 0.31804370E+04 0.31917849E+04 + 0.31917849E+04 0.32004771E+04 0.32004771E+04 0.32053889E+04 + 0.32053889E+04 0.32093611E+04 0.32093611E+04 0.32145891E+04 + 0.32145891E+04 0.32204399E+04 0.32204399E+04 0.32243201E+04 + 0.31807749E+04 0.31736550E+04 0.31736550E+04 0.31738899E+04 + 0.31738899E+04 0.31722830E+04 0.31722830E+04 0.31804370E+04 + 0.31804370E+04 0.31917849E+04 0.31917849E+04 0.32004771E+04 + 0.32004771E+04 0.32053889E+04 0.32053889E+04 0.32093611E+04 + 0.32093611E+04 0.32145891E+04 0.32145891E+04 0.32204399E+04 + 0.32204399E+04 0.32243201E+04 0.31782620E+04 0.31733960E+04 + 0.31733960E+04 0.31757190E+04 0.31757190E+04 0.31765710E+04 + 0.31765710E+04 0.31797180E+04 0.31797180E+04 0.31856460E+04 + 0.31856460E+04 0.31901479E+04 0.31901479E+04 0.31916179E+04 + 0.31916179E+04 0.31973840E+04 0.31973840E+04 0.32078569E+04 + 0.32078569E+04 0.32182209E+04 0.32182209E+04 0.32272261E+04 + 0.31782620E+04 0.31733960E+04 0.31733960E+04 0.31757190E+04 + 0.31757190E+04 0.31765710E+04 0.31765710E+04 0.31797180E+04 + 0.31797180E+04 0.31856460E+04 0.31856460E+04 0.31901479E+04 + 0.31901479E+04 0.31916179E+04 0.31916179E+04 0.31973840E+04 + 0.31973840E+04 0.32078569E+04 0.32078569E+04 0.32182209E+04 + 0.32182209E+04 0.32272261E+04 0.31921790E+04 0.31934780E+04 + 0.31934780E+04 0.31946589E+04 0.31946589E+04 0.31914480E+04 + 0.31914480E+04 0.31833110E+04 0.31833110E+04 0.31784900E+04 + 0.31784900E+04 0.31804761E+04 0.31804761E+04 0.31859980E+04 + 0.31859980E+04 0.31913359E+04 0.31913359E+04 0.31999871E+04 + 0.31999871E+04 0.32122629E+04 0.32122629E+04 0.32245791E+04 + 0.31921790E+04 0.31934780E+04 0.31934780E+04 0.31946589E+04 + 0.31946589E+04 0.31914480E+04 0.31914480E+04 0.31833110E+04 + 0.31833110E+04 0.31784900E+04 0.31784900E+04 0.31804761E+04 + 0.31804761E+04 0.31859980E+04 0.31859980E+04 0.31913359E+04 + 0.31913359E+04 0.31999871E+04 0.31999871E+04 0.32122629E+04 + 0.32122629E+04 0.32245791E+04 0.31898240E+04 0.31979131E+04 + 0.31979131E+04 0.32020229E+04 0.32020229E+04 0.32003811E+04 + 0.32003811E+04 0.31960649E+04 0.31960649E+04 0.31903750E+04 + 0.31903750E+04 0.31887500E+04 0.31887500E+04 0.31870310E+04 + 0.31870310E+04 0.31850640E+04 0.31850640E+04 0.31908911E+04 + 0.31908911E+04 0.32040400E+04 0.32040400E+04 0.32179829E+04 + 0.31898240E+04 0.31979131E+04 0.31979131E+04 0.32020229E+04 + 0.32020229E+04 0.32003811E+04 0.32003811E+04 0.31960649E+04 + 0.31960649E+04 0.31903750E+04 0.31903750E+04 0.31887500E+04 + 0.31887500E+04 0.31870310E+04 0.31870310E+04 0.31850640E+04 + 0.31850640E+04 0.31908911E+04 0.31908911E+04 0.32040400E+04 + 0.32040400E+04 0.32179829E+04 0.31873240E+04 0.31942859E+04 + 0.31942859E+04 0.32004370E+04 0.32004370E+04 0.31997461E+04 + 0.31997461E+04 0.31982791E+04 0.31982791E+04 0.31965391E+04 + 0.31965391E+04 0.31937410E+04 0.31937410E+04 0.31852090E+04 + 0.31852090E+04 0.31806021E+04 0.31806021E+04 0.31835339E+04 + 0.31835339E+04 0.31918391E+04 0.31918391E+04 0.32017710E+04 + 0.31873240E+04 0.31942859E+04 0.31942859E+04 0.32004370E+04 + 0.32004370E+04 0.31997461E+04 0.31997461E+04 0.31982791E+04 + 0.31982791E+04 0.31965391E+04 0.31965391E+04 0.31937410E+04 + 0.31937410E+04 0.31852090E+04 0.31852090E+04 0.31806021E+04 + 0.31806021E+04 0.31835339E+04 0.31835339E+04 0.31918391E+04 + 0.31918391E+04 0.32017710E+04 0.31967749E+04 0.31974561E+04 + 0.31974561E+04 0.32051621E+04 0.32051621E+04 0.32056060E+04 + 0.32056060E+04 0.31996499E+04 0.31996499E+04 0.31957410E+04 + 0.31957410E+04 0.31925540E+04 0.31925540E+04 0.31847339E+04 + 0.31847339E+04 0.31775471E+04 0.31775471E+04 0.31798030E+04 + 0.31798030E+04 0.31844780E+04 0.31844780E+04 0.31890630E+04 + 0.31967749E+04 0.31974561E+04 0.31974561E+04 0.32051621E+04 + 0.32051621E+04 0.32056060E+04 0.32056060E+04 0.31996499E+04 + 0.31996499E+04 0.31957410E+04 0.31957410E+04 0.31925540E+04 + 0.31925540E+04 0.31847339E+04 0.31847339E+04 0.31775471E+04 + 0.31775471E+04 0.31798030E+04 0.31798030E+04 0.31844780E+04 + 0.31844780E+04 0.31890630E+04 0.32091770E+04 0.32059919E+04 + 0.32059919E+04 0.32108630E+04 0.32108630E+04 0.32109651E+04 + 0.32109651E+04 0.32041570E+04 0.32041570E+04 0.31971379E+04 + 0.31971379E+04 0.31916760E+04 0.31916760E+04 0.31836279E+04 + 0.31836279E+04 0.31760991E+04 0.31760991E+04 0.31771790E+04 + 0.31771790E+04 0.31826050E+04 0.31826050E+04 0.31906350E+04 + 0.32091770E+04 0.32059919E+04 0.32059919E+04 0.32108630E+04 + 0.32108630E+04 0.32109651E+04 0.32109651E+04 0.32041570E+04 + 0.32041570E+04 0.31971379E+04 0.31971379E+04 0.31916760E+04 + 0.31916760E+04 0.31836279E+04 0.31836279E+04 0.31760991E+04 + 0.31760991E+04 0.31771790E+04 0.31771790E+04 0.31826050E+04 + 0.31826050E+04 0.31906350E+04 0.32058411E+04 0.32046079E+04 + 0.32046079E+04 0.32070371E+04 0.32070371E+04 0.32065449E+04 + 0.32065449E+04 0.31989519E+04 0.31989519E+04 0.31900081E+04 + 0.31900081E+04 0.31852100E+04 0.31852100E+04 0.31815349E+04 + 0.31815349E+04 0.31783970E+04 0.31783970E+04 0.31793130E+04 + 0.31793130E+04 0.31849309E+04 0.31849309E+04 0.31949509E+04 + 0.32058411E+04 0.32046079E+04 0.32046079E+04 0.32070371E+04 + 0.32070371E+04 0.32065449E+04 0.32065449E+04 0.31989519E+04 + 0.31989519E+04 0.31900081E+04 0.31900081E+04 0.31852100E+04 + 0.31852100E+04 0.31815349E+04 0.31815349E+04 0.31783970E+04 + 0.31783970E+04 0.31793130E+04 0.31793130E+04 0.31849309E+04 + 0.30531431E+04 0.30538091E+04 0.32000911E+04 0.31928440E+04 + 0.31928440E+04 0.31944309E+04 0.31944309E+04 0.31955320E+04 + 0.31955320E+04 0.31907529E+04 0.31907529E+04 0.31851909E+04 + 0.31851909E+04 0.31822729E+04 0.31822729E+04 0.31801470E+04 + 0.31801470E+04 0.31803440E+04 0.31803440E+04 0.31819070E+04 + 0.31819070E+04 0.31845959E+04 0.30579929E+04 0.30552300E+04 + 0.32000911E+04 0.31928440E+04 0.31928440E+04 0.31944309E+04 + 0.31944309E+04 0.31955320E+04 0.31955320E+04 0.31907529E+04 + 0.31907529E+04 0.31851909E+04 0.31851909E+04 0.31822729E+04 + 0.31822729E+04 0.31801470E+04 0.31801470E+04 0.31803440E+04 + 0.30923220E+04 0.30892710E+04 0.30892710E+04 0.30880940E+04 + 0.30579929E+04 0.30552300E+04 0.32040459E+04 0.31886521E+04 + 0.31886521E+04 0.31858521E+04 0.31858521E+04 0.31853140E+04 + 0.31853140E+04 0.31832839E+04 0.31832839E+04 0.31807891E+04 + 0.31807891E+04 0.31792690E+04 0.31792690E+04 0.31795811E+04 + 0.31795811E+04 0.31804099E+04 0.30908120E+04 0.30903679E+04 + 0.30903679E+04 0.30890071E+04 0.30575720E+04 0.30550769E+04 + 0.32040459E+04 0.31886521E+04 0.31886521E+04 0.31858521E+04 + 0.31858521E+04 0.31853140E+04 0.31853140E+04 0.31832839E+04 + 0.31832839E+04 0.31807891E+04 0.31807891E+04 0.31792690E+04 + 0.31043779E+04 0.31001340E+04 0.31001340E+04 0.30908120E+04 + 0.30908120E+04 0.30903679E+04 0.30903679E+04 0.30890071E+04 + 0.30575720E+04 0.30550769E+04 0.32052209E+04 0.31906580E+04 + 0.31906580E+04 0.31840520E+04 0.31840520E+04 0.31812939E+04 + 0.31812939E+04 0.31790979E+04 0.31790979E+04 0.31788730E+04 + 0.31788730E+04 0.31782461E+04 0.31059341E+04 0.31029580E+04 + 0.31029580E+04 0.30972500E+04 0.30972500E+04 0.30929580E+04 + 0.30929580E+04 0.30904470E+04 0.30579121E+04 0.30554121E+04 + 0.32052209E+04 0.31906580E+04 0.31906580E+04 0.31840520E+04 + 0.31840520E+04 0.31812939E+04 0.31812939E+04 0.31790979E+04 + 0.31133391E+04 0.31098650E+04 0.31098650E+04 0.31059341E+04 + 0.31059341E+04 0.31029580E+04 0.31029580E+04 0.30972500E+04 + 0.30972500E+04 0.30929580E+04 0.30929580E+04 0.30904470E+04 + 0.30579121E+04 0.30554121E+04 0.32000979E+04 0.31925510E+04 + 0.31925510E+04 0.31855149E+04 0.31855149E+04 0.31835300E+04 + 0.31835300E+04 0.31799719E+04 0.31152009E+04 0.31122810E+04 + 0.31122810E+04 0.31087280E+04 0.31087280E+04 0.31051360E+04 + 0.31051360E+04 0.30997290E+04 0.30997290E+04 0.30938330E+04 + 0.30938330E+04 0.30912310E+04 0.30582190E+04 0.30562490E+04 + 0.32000979E+04 0.31925510E+04 0.31925510E+04 0.31855149E+04 + 0.31244919E+04 0.31206179E+04 0.31206179E+04 0.31152009E+04 + 0.31152009E+04 0.31122810E+04 0.31122810E+04 0.31087280E+04 + 0.31087280E+04 0.31051360E+04 0.31051360E+04 0.30997290E+04 + 0.30997290E+04 0.30938330E+04 0.30938330E+04 0.30912310E+04 + 0.30582190E+04 0.30562490E+04 0.31985691E+04 0.31940430E+04 + 0.31940430E+04 0.31880840E+04 0.31278269E+04 0.31235381E+04 + 0.31235381E+04 0.31176550E+04 0.31176550E+04 0.31126211E+04 + 0.31126211E+04 0.31062100E+04 0.31062100E+04 0.31025139E+04 + 0.31025139E+04 0.31003660E+04 0.31003660E+04 0.30960720E+04 + 0.30960720E+04 0.30920471E+04 0.30590879E+04 0.30568250E+04 + 0.31356431E+04 0.31326931E+04 0.31326931E+04 0.31278269E+04 + 0.31278269E+04 0.31235381E+04 0.31235381E+04 0.31176550E+04 + 0.31176550E+04 0.31126211E+04 0.31126211E+04 0.31062100E+04 + 0.31062100E+04 0.31025139E+04 0.31025139E+04 0.31003660E+04 + 0.31003660E+04 0.30960720E+04 0.30960720E+04 0.30920471E+04 + 0.30920471E+04 0.30893330E+04 0.31374419E+04 0.31353120E+04 + 0.31353120E+04 0.31334951E+04 0.31334951E+04 0.31283821E+04 + 0.31283821E+04 0.31151670E+04 0.31151670E+04 0.31073530E+04 + 0.31073530E+04 0.31026189E+04 0.31026189E+04 0.31017600E+04 + 0.31017600E+04 0.31042151E+04 0.31042151E+04 0.30996350E+04 + 0.30996350E+04 0.30932690E+04 0.30932690E+04 0.30896021E+04 + 0.32104871E+04 0.32091560E+04 0.32091560E+04 0.32118950E+04 + 0.32118950E+04 0.32126260E+04 0.32126260E+04 0.32082310E+04 + 0.32082310E+04 0.32002419E+04 0.32002419E+04 0.31988040E+04 + 0.31988040E+04 0.32032070E+04 0.32032070E+04 0.32060540E+04 + 0.32060540E+04 0.32073550E+04 0.32073550E+04 0.32122571E+04 + 0.32122571E+04 0.32197080E+04 0.32007009E+04 0.32013921E+04 + 0.32013921E+04 0.32063379E+04 0.32063379E+04 0.32076680E+04 + 0.32076680E+04 0.32045911E+04 0.32045911E+04 0.32015349E+04 + 0.32015349E+04 0.32048220E+04 0.32048220E+04 0.32111680E+04 + 0.32111680E+04 0.32136760E+04 0.32136760E+04 0.32161499E+04 + 0.32161499E+04 0.32209309E+04 0.32209309E+04 0.32243059E+04 + 0.32007009E+04 0.32013921E+04 0.32013921E+04 0.32063379E+04 + 0.32063379E+04 0.32076680E+04 0.32076680E+04 0.32045911E+04 + 0.32045911E+04 0.32015349E+04 0.32015349E+04 0.32048220E+04 + 0.32048220E+04 0.32111680E+04 0.32111680E+04 0.32136760E+04 + 0.32136760E+04 0.32161499E+04 0.32161499E+04 0.32209309E+04 + 0.32209309E+04 0.32243059E+04 0.31929761E+04 0.31939861E+04 + 0.31939861E+04 0.31977380E+04 0.31977380E+04 0.31954839E+04 + 0.31954839E+04 0.31927471E+04 0.31927471E+04 0.31938831E+04 + 0.31938831E+04 0.31997009E+04 0.31997009E+04 0.32071201E+04 + 0.32071201E+04 0.32117820E+04 0.32117820E+04 0.32172390E+04 + 0.32172390E+04 0.32227849E+04 0.32227849E+04 0.32239551E+04 + 0.31929761E+04 0.31939861E+04 0.31939861E+04 0.31977380E+04 + 0.31977380E+04 0.31954839E+04 0.31954839E+04 0.31927471E+04 + 0.31927471E+04 0.31938831E+04 0.31938831E+04 0.31997009E+04 + 0.31997009E+04 0.32071201E+04 0.32071201E+04 0.32117820E+04 + 0.32117820E+04 0.32172390E+04 0.32172390E+04 0.32227849E+04 + 0.32227849E+04 0.32239551E+04 0.31807749E+04 0.31736550E+04 + 0.31736550E+04 0.31738899E+04 0.31738899E+04 0.31722830E+04 + 0.31722830E+04 0.31804370E+04 0.31804370E+04 0.31917849E+04 + 0.31917849E+04 0.32004771E+04 0.32004771E+04 0.32053889E+04 + 0.32053889E+04 0.32093611E+04 0.32093611E+04 0.32145891E+04 + 0.32145891E+04 0.32204399E+04 0.32204399E+04 0.32243201E+04 + 0.31807749E+04 0.31736550E+04 0.31736550E+04 0.31738899E+04 + 0.31738899E+04 0.31722830E+04 0.31722830E+04 0.31804370E+04 + 0.31804370E+04 0.31917849E+04 0.31917849E+04 0.32004771E+04 + 0.32004771E+04 0.32053889E+04 0.32053889E+04 0.32093611E+04 + 0.32093611E+04 0.32145891E+04 0.32145891E+04 0.32204399E+04 + 0.32204399E+04 0.32243201E+04 0.31782620E+04 0.31733960E+04 + 0.31733960E+04 0.31757190E+04 0.31757190E+04 0.31765710E+04 + 0.31765710E+04 0.31797180E+04 0.31797180E+04 0.31856460E+04 + 0.31856460E+04 0.31901479E+04 0.31901479E+04 0.31916179E+04 + 0.31916179E+04 0.31973840E+04 0.31973840E+04 0.32078569E+04 + 0.32078569E+04 0.32182209E+04 0.32182209E+04 0.32272261E+04 + 0.31782620E+04 0.31733960E+04 0.31733960E+04 0.31757190E+04 + 0.31757190E+04 0.31765710E+04 0.31765710E+04 0.31797180E+04 + 0.31797180E+04 0.31856460E+04 0.31856460E+04 0.31901479E+04 + 0.31901479E+04 0.31916179E+04 0.31916179E+04 0.31973840E+04 + 0.31973840E+04 0.32078569E+04 0.32078569E+04 0.32182209E+04 + 0.32182209E+04 0.32272261E+04 0.31921790E+04 0.31934780E+04 + 0.31934780E+04 0.31946589E+04 0.31946589E+04 0.31914480E+04 + 0.31914480E+04 0.31833110E+04 0.31833110E+04 0.31784900E+04 + 0.31784900E+04 0.31804761E+04 0.31804761E+04 0.31859980E+04 + 0.31859980E+04 0.31913359E+04 0.31913359E+04 0.31999871E+04 + 0.31999871E+04 0.32122629E+04 0.32122629E+04 0.32245791E+04 + 0.31921790E+04 0.31934780E+04 0.31934780E+04 0.31946589E+04 + 0.31946589E+04 0.31914480E+04 0.31914480E+04 0.31833110E+04 + 0.31833110E+04 0.31784900E+04 0.31784900E+04 0.31804761E+04 + 0.31804761E+04 0.31859980E+04 0.31859980E+04 0.31913359E+04 + 0.31913359E+04 0.31999871E+04 0.31999871E+04 0.32122629E+04 + 0.32122629E+04 0.32245791E+04 0.31898240E+04 0.31979131E+04 + 0.31979131E+04 0.32020229E+04 0.32020229E+04 0.32003811E+04 + 0.32003811E+04 0.31960649E+04 0.31960649E+04 0.31903750E+04 + 0.31903750E+04 0.31887500E+04 0.31887500E+04 0.31870310E+04 + 0.31870310E+04 0.31850640E+04 0.31850640E+04 0.31908911E+04 + 0.31908911E+04 0.32040400E+04 0.32040400E+04 0.32179829E+04 + 0.31898240E+04 0.31979131E+04 0.31979131E+04 0.32020229E+04 + 0.32020229E+04 0.32003811E+04 0.32003811E+04 0.31960649E+04 + 0.31960649E+04 0.31903750E+04 0.31903750E+04 0.31887500E+04 + 0.31887500E+04 0.31870310E+04 0.31870310E+04 0.31850640E+04 + 0.31850640E+04 0.31908911E+04 0.31908911E+04 0.32040400E+04 + 0.32040400E+04 0.32179829E+04 0.31873240E+04 0.31942859E+04 + 0.31942859E+04 0.32004370E+04 0.32004370E+04 0.31997461E+04 + 0.31997461E+04 0.31982791E+04 0.31982791E+04 0.31965391E+04 + 0.31965391E+04 0.31937410E+04 0.31937410E+04 0.31852090E+04 + 0.31852090E+04 0.31806021E+04 0.31806021E+04 0.31835339E+04 + 0.31835339E+04 0.31918391E+04 0.31918391E+04 0.32017710E+04 + 0.31873240E+04 0.31942859E+04 0.31942859E+04 0.32004370E+04 + 0.32004370E+04 0.31997461E+04 0.31997461E+04 0.31982791E+04 + 0.31982791E+04 0.31965391E+04 0.31965391E+04 0.31937410E+04 + 0.31937410E+04 0.31852090E+04 0.31852090E+04 0.31806021E+04 + 0.31806021E+04 0.31835339E+04 0.31835339E+04 0.31918391E+04 + 0.31918391E+04 0.32017710E+04 0.31967749E+04 0.31974561E+04 + 0.31974561E+04 0.32051621E+04 0.32051621E+04 0.32056060E+04 + 0.32056060E+04 0.31996499E+04 0.31996499E+04 0.31957410E+04 + 0.31957410E+04 0.31925540E+04 0.31925540E+04 0.31847339E+04 + 0.31847339E+04 0.31775471E+04 0.31775471E+04 0.31798030E+04 + 0.31798030E+04 0.31844780E+04 0.31844780E+04 0.31890630E+04 + 0.31967749E+04 0.31974561E+04 0.31974561E+04 0.32051621E+04 + 0.32051621E+04 0.32056060E+04 0.32056060E+04 0.31996499E+04 + 0.31996499E+04 0.31957410E+04 0.31957410E+04 0.31925540E+04 + 0.31925540E+04 0.31847339E+04 0.31847339E+04 0.31775471E+04 + 0.31775471E+04 0.31798030E+04 0.31798030E+04 0.31844780E+04 + 0.31844780E+04 0.31890630E+04 0.32091770E+04 0.32059919E+04 + 0.32059919E+04 0.32108630E+04 0.32108630E+04 0.32109651E+04 + 0.32109651E+04 0.32041570E+04 0.32041570E+04 0.31971379E+04 + 0.31971379E+04 0.31916760E+04 0.31916760E+04 0.31836279E+04 + 0.31836279E+04 0.31760991E+04 0.31760991E+04 0.31771790E+04 + 0.31771790E+04 0.31826050E+04 0.31826050E+04 0.31906350E+04 + 0.32091770E+04 0.32059919E+04 0.32059919E+04 0.32108630E+04 + 0.32108630E+04 0.32109651E+04 0.32109651E+04 0.32041570E+04 + 0.32041570E+04 0.31971379E+04 0.31971379E+04 0.31916760E+04 + 0.31916760E+04 0.31836279E+04 0.31836279E+04 0.31760991E+04 + 0.31760991E+04 0.31771790E+04 0.31771790E+04 0.31826050E+04 + 0.31826050E+04 0.31906350E+04 0.32058411E+04 0.32046079E+04 + 0.32046079E+04 0.32070371E+04 0.32070371E+04 0.32065449E+04 + 0.32065449E+04 0.31989519E+04 0.31989519E+04 0.31900081E+04 + 0.31900081E+04 0.31852100E+04 0.31852100E+04 0.31815349E+04 + 0.31815349E+04 0.31783970E+04 0.31783970E+04 0.31793130E+04 + 0.31793130E+04 0.31849309E+04 0.31849309E+04 0.31949509E+04 + 0.32058411E+04 0.32046079E+04 0.32046079E+04 0.32070371E+04 + 0.32070371E+04 0.32065449E+04 0.32065449E+04 0.31989519E+04 + 0.31989519E+04 0.31900081E+04 0.31900081E+04 0.31852100E+04 + 0.31852100E+04 0.31815349E+04 0.31815349E+04 0.31783970E+04 + 0.31783970E+04 0.31793130E+04 0.31793130E+04 0.31849309E+04 + 0.30531431E+04 0.30538091E+04 0.32000911E+04 0.31928440E+04 + 0.31928440E+04 0.31944309E+04 0.31944309E+04 0.31955320E+04 + 0.31955320E+04 0.31907529E+04 0.31907529E+04 0.31851909E+04 + 0.31851909E+04 0.31822729E+04 0.31822729E+04 0.31801470E+04 + 0.31801470E+04 0.31803440E+04 0.31803440E+04 0.31819070E+04 + 0.31819070E+04 0.31845959E+04 0.30579929E+04 0.30552300E+04 + 0.32000911E+04 0.31928440E+04 0.31928440E+04 0.31944309E+04 + 0.31944309E+04 0.31955320E+04 0.31955320E+04 0.31907529E+04 + 0.31907529E+04 0.31851909E+04 0.31851909E+04 0.31822729E+04 + 0.31822729E+04 0.31801470E+04 0.31801470E+04 0.31803440E+04 + 0.30923220E+04 0.30892710E+04 0.30892710E+04 0.30880940E+04 + 0.30579929E+04 0.30552300E+04 0.32040459E+04 0.31886521E+04 + 0.31886521E+04 0.31858521E+04 0.31858521E+04 0.31853140E+04 + 0.31853140E+04 0.31832839E+04 0.31832839E+04 0.31807891E+04 + 0.31807891E+04 0.31792690E+04 0.31792690E+04 0.31795811E+04 + 0.31795811E+04 0.31804099E+04 0.30908120E+04 0.30903679E+04 + 0.30903679E+04 0.30890071E+04 0.30575720E+04 0.30550769E+04 + 0.32040459E+04 0.31886521E+04 0.31886521E+04 0.31858521E+04 + 0.31858521E+04 0.31853140E+04 0.31853140E+04 0.31832839E+04 + 0.31832839E+04 0.31807891E+04 0.31807891E+04 0.31792690E+04 + 0.31043779E+04 0.31001340E+04 0.31001340E+04 0.30908120E+04 + 0.30908120E+04 0.30903679E+04 0.30903679E+04 0.30890071E+04 + 0.30575720E+04 0.30550769E+04 0.32052209E+04 0.31906580E+04 + 0.31906580E+04 0.31840520E+04 0.31840520E+04 0.31812939E+04 + 0.31812939E+04 0.31790979E+04 0.31790979E+04 0.31788730E+04 + 0.31788730E+04 0.31782461E+04 0.31059341E+04 0.31029580E+04 + 0.31029580E+04 0.30972500E+04 0.30972500E+04 0.30929580E+04 + 0.30929580E+04 0.30904470E+04 0.30579121E+04 0.30554121E+04 + 0.32052209E+04 0.31906580E+04 0.31906580E+04 0.31840520E+04 + 0.31840520E+04 0.31812939E+04 0.31812939E+04 0.31790979E+04 + 0.31133391E+04 0.31098650E+04 0.31098650E+04 0.31059341E+04 + 0.31059341E+04 0.31029580E+04 0.31029580E+04 0.30972500E+04 + 0.30972500E+04 0.30929580E+04 0.30929580E+04 0.30904470E+04 + 0.30579121E+04 0.30554121E+04 0.32000979E+04 0.31925510E+04 + 0.31925510E+04 0.31855149E+04 0.31855149E+04 0.31835300E+04 + 0.31835300E+04 0.31799719E+04 0.31152009E+04 0.31122810E+04 + 0.31122810E+04 0.31087280E+04 0.31087280E+04 0.31051360E+04 + 0.31051360E+04 0.30997290E+04 0.30997290E+04 0.30938330E+04 + 0.30938330E+04 0.30912310E+04 0.30582190E+04 0.30562490E+04 + 0.32000979E+04 0.31925510E+04 0.31925510E+04 0.31855149E+04 + 0.31244919E+04 0.31206179E+04 0.31206179E+04 0.31152009E+04 + 0.31152009E+04 0.31122810E+04 0.31122810E+04 0.31087280E+04 + 0.31087280E+04 0.31051360E+04 0.31051360E+04 0.30997290E+04 + 0.30997290E+04 0.30938330E+04 0.30938330E+04 0.30912310E+04 + 0.30582190E+04 0.30562490E+04 0.31985691E+04 0.31940430E+04 + 0.31940430E+04 0.31880840E+04 0.31278269E+04 0.31235381E+04 + 0.31235381E+04 0.31176550E+04 0.31176550E+04 0.31126211E+04 + 0.31126211E+04 0.31062100E+04 0.31062100E+04 0.31025139E+04 + 0.31025139E+04 0.31003660E+04 0.31003660E+04 0.30960720E+04 + 0.30960720E+04 0.30920471E+04 0.30590879E+04 0.30568250E+04 + 0.31356431E+04 0.31326931E+04 0.31326931E+04 0.31278269E+04 + 0.31278269E+04 0.31235381E+04 0.31235381E+04 0.31176550E+04 + 0.31176550E+04 0.31126211E+04 0.31126211E+04 0.31062100E+04 + 0.31062100E+04 0.31025139E+04 0.31025139E+04 0.31003660E+04 + 0.31003660E+04 0.30960720E+04 0.30960720E+04 0.30920471E+04 + 0.30920471E+04 0.30893330E+04 0.31374419E+04 0.31353120E+04 + 0.31353120E+04 0.31334951E+04 0.31334951E+04 0.31283821E+04 + 0.31283821E+04 0.31151670E+04 0.31151670E+04 0.31073530E+04 + 0.31073530E+04 0.31026189E+04 0.31026189E+04 0.31017600E+04 + 0.31017600E+04 0.31042151E+04 0.31042151E+04 0.30996350E+04 + 0.30996350E+04 0.30932690E+04 0.30932690E+04 0.30896021E+04 + 0.32116069E+04 0.32101721E+04 0.32101721E+04 0.32129160E+04 + 0.32129160E+04 0.32136941E+04 0.32136941E+04 0.32093440E+04 + 0.32093440E+04 0.32013040E+04 0.32013040E+04 0.31997390E+04 + 0.31997390E+04 0.32040530E+04 0.32040530E+04 0.32069551E+04 + 0.32069551E+04 0.32082791E+04 0.32082791E+04 0.32131760E+04 + 0.32131760E+04 0.32206621E+04 0.32018530E+04 0.32024031E+04 + 0.32024031E+04 0.32073789E+04 0.32073789E+04 0.32087881E+04 + 0.32087881E+04 0.32057290E+04 0.32057290E+04 0.32026050E+04 + 0.32026050E+04 0.32057729E+04 0.32057729E+04 0.32121130E+04 + 0.32121130E+04 0.32147229E+04 0.32147229E+04 0.32171680E+04 + 0.32171680E+04 0.32219609E+04 0.32219609E+04 0.32252620E+04 + 0.32018530E+04 0.32024031E+04 0.32024031E+04 0.32073789E+04 + 0.32073789E+04 0.32087881E+04 0.32087881E+04 0.32057290E+04 + 0.32057290E+04 0.32026050E+04 0.32026050E+04 0.32057729E+04 + 0.32057729E+04 0.32121130E+04 0.32121130E+04 0.32147229E+04 + 0.32147229E+04 0.32171680E+04 0.32171680E+04 0.32219609E+04 + 0.32219609E+04 0.32252620E+04 0.31941631E+04 0.31950730E+04 + 0.31950730E+04 0.31988840E+04 0.31988840E+04 0.31966799E+04 + 0.31966799E+04 0.31938279E+04 0.31938279E+04 0.31948081E+04 + 0.31948081E+04 0.32005339E+04 0.32005339E+04 0.32079709E+04 + 0.32079709E+04 0.32127061E+04 0.32127061E+04 0.32181670E+04 + 0.32181670E+04 0.32237891E+04 0.32237891E+04 0.32248259E+04 + 0.31941631E+04 0.31950730E+04 0.31950730E+04 0.31988840E+04 + 0.31988840E+04 0.31966799E+04 0.31966799E+04 0.31938279E+04 + 0.31938279E+04 0.31948081E+04 0.31948081E+04 0.32005339E+04 + 0.32005339E+04 0.32079709E+04 0.32079709E+04 0.32127061E+04 + 0.32127061E+04 0.32181670E+04 0.32181670E+04 0.32237891E+04 + 0.32237891E+04 0.32248259E+04 0.31818970E+04 0.31746721E+04 + 0.31746721E+04 0.31749180E+04 0.31749180E+04 0.31731150E+04 + 0.31731150E+04 0.31811150E+04 0.31811150E+04 0.31924170E+04 + 0.31924170E+04 0.32011499E+04 0.32011499E+04 0.32061660E+04 + 0.32061660E+04 0.32101919E+04 0.32101919E+04 0.32153660E+04 + 0.32153660E+04 0.32211440E+04 0.32211440E+04 0.32248860E+04 + 0.31818970E+04 0.31746721E+04 0.31746721E+04 0.31749180E+04 + 0.31749180E+04 0.31731150E+04 0.31731150E+04 0.31811150E+04 + 0.31811150E+04 0.31924170E+04 0.31924170E+04 0.32011499E+04 + 0.32011499E+04 0.32061660E+04 0.32061660E+04 0.32101919E+04 + 0.32101919E+04 0.32153660E+04 0.32153660E+04 0.32211440E+04 + 0.32211440E+04 0.32248860E+04 0.31788140E+04 0.31739409E+04 + 0.31739409E+04 0.31763250E+04 0.31763250E+04 0.31772009E+04 + 0.31772009E+04 0.31803560E+04 0.31803560E+04 0.31863081E+04 + 0.31863081E+04 0.31907991E+04 0.31907991E+04 0.31922300E+04 + 0.31922300E+04 0.31979089E+04 0.31979089E+04 0.32083630E+04 + 0.32083630E+04 0.32187009E+04 0.32187009E+04 0.32276880E+04 + 0.31788140E+04 0.31739409E+04 0.31739409E+04 0.31763250E+04 + 0.31763250E+04 0.31772009E+04 0.31772009E+04 0.31803560E+04 + 0.31803560E+04 0.31863081E+04 0.31863081E+04 0.31907991E+04 + 0.31907991E+04 0.31922300E+04 0.31922300E+04 0.31979089E+04 + 0.31979089E+04 0.32083630E+04 0.32083630E+04 0.32187009E+04 + 0.32187009E+04 0.32276880E+04 0.31927009E+04 0.31939700E+04 + 0.31939700E+04 0.31951841E+04 0.31951841E+04 0.31920300E+04 + 0.31920300E+04 0.31838669E+04 0.31838669E+04 0.31789680E+04 + 0.31789680E+04 0.31809050E+04 0.31809050E+04 0.31864529E+04 + 0.31864529E+04 0.31918140E+04 0.31918140E+04 0.32004021E+04 + 0.32004021E+04 0.32126750E+04 0.32126750E+04 0.32250049E+04 + 0.31927009E+04 0.31939700E+04 0.31939700E+04 0.31951841E+04 + 0.31951841E+04 0.31920300E+04 0.31920300E+04 0.31838669E+04 + 0.31838669E+04 0.31789680E+04 0.31789680E+04 0.31809050E+04 + 0.31809050E+04 0.31864529E+04 0.31864529E+04 0.31918140E+04 + 0.31918140E+04 0.32004021E+04 0.32004021E+04 0.32126750E+04 + 0.32126750E+04 0.32250049E+04 0.31903130E+04 0.31983740E+04 + 0.31983740E+04 0.32025540E+04 0.32025540E+04 0.32009561E+04 + 0.32009561E+04 0.31966179E+04 0.31966179E+04 0.31908430E+04 + 0.31908430E+04 0.31891941E+04 0.31891941E+04 0.31875171E+04 + 0.31875171E+04 0.31854929E+04 0.31854929E+04 0.31912400E+04 + 0.31912400E+04 0.32044480E+04 0.32044480E+04 0.32184910E+04 + 0.31903130E+04 0.31983740E+04 0.31983740E+04 0.32025540E+04 + 0.32025540E+04 0.32009561E+04 0.32009561E+04 0.31966179E+04 + 0.31966179E+04 0.31908430E+04 0.31908430E+04 0.31891941E+04 + 0.31891941E+04 0.31875171E+04 0.31875171E+04 0.31854929E+04 + 0.31854929E+04 0.31912400E+04 0.31912400E+04 0.32044480E+04 + 0.32044480E+04 0.32184910E+04 0.31877920E+04 0.31946980E+04 + 0.31946980E+04 0.32009351E+04 0.32009351E+04 0.32002671E+04 + 0.32002671E+04 0.31987920E+04 0.31987920E+04 0.31970229E+04 + 0.31970229E+04 0.31942561E+04 0.31942561E+04 0.31857339E+04 + 0.31857339E+04 0.31810540E+04 0.31810540E+04 0.31839199E+04 + 0.31839199E+04 0.31922539E+04 0.31922539E+04 0.32023040E+04 + 0.31877920E+04 0.31946980E+04 0.31946980E+04 0.32009351E+04 + 0.32009351E+04 0.32002671E+04 0.32002671E+04 0.31987920E+04 + 0.31987920E+04 0.31970229E+04 0.31970229E+04 0.31942561E+04 + 0.31942561E+04 0.31857339E+04 0.31857339E+04 0.31810540E+04 + 0.31810540E+04 0.31839199E+04 0.31839199E+04 0.31922539E+04 + 0.31922539E+04 0.32023040E+04 0.31972839E+04 0.31978430E+04 + 0.31978430E+04 0.32055940E+04 0.32055940E+04 0.32061260E+04 + 0.32061260E+04 0.32001550E+04 0.32001550E+04 0.31962229E+04 + 0.31962229E+04 0.31930591E+04 0.31930591E+04 0.31852871E+04 + 0.31852871E+04 0.31780239E+04 0.31780239E+04 0.31802109E+04 + 0.31802109E+04 0.31848911E+04 0.31848911E+04 0.31894519E+04 + 0.31972839E+04 0.31978430E+04 0.31978430E+04 0.32055940E+04 + 0.32055940E+04 0.32061260E+04 0.32061260E+04 0.32001550E+04 + 0.32001550E+04 0.31962229E+04 0.31962229E+04 0.31930591E+04 + 0.31930591E+04 0.31852871E+04 0.31852871E+04 0.31780239E+04 + 0.31780239E+04 0.31802109E+04 0.31802109E+04 0.31848911E+04 + 0.31848911E+04 0.31894519E+04 0.32097881E+04 0.32064519E+04 + 0.32064519E+04 0.32113191E+04 0.32113191E+04 0.32114851E+04 + 0.32114851E+04 0.32047151E+04 0.32047151E+04 0.31976831E+04 + 0.31976831E+04 0.31921931E+04 0.31921931E+04 0.31841731E+04 + 0.31841731E+04 0.31765950E+04 0.31765950E+04 0.31777141E+04 + 0.31777141E+04 0.31832371E+04 0.31832371E+04 0.31913640E+04 + 0.32097881E+04 0.32064519E+04 0.32064519E+04 0.32113191E+04 + 0.32113191E+04 0.32114851E+04 0.32114851E+04 0.32047151E+04 + 0.32047151E+04 0.31976831E+04 0.31976831E+04 0.31921931E+04 + 0.31921931E+04 0.31841731E+04 0.31841731E+04 0.31765950E+04 + 0.31765950E+04 0.31777141E+04 0.31777141E+04 0.31832371E+04 + 0.31832371E+04 0.31913640E+04 0.32065100E+04 0.32051580E+04 + 0.32051580E+04 0.32075620E+04 0.32075620E+04 0.32071289E+04 + 0.32071289E+04 0.31995740E+04 0.31995740E+04 0.31906531E+04 + 0.31906531E+04 0.31858210E+04 0.31858210E+04 0.31822729E+04 + 0.31822729E+04 0.31792981E+04 0.31792981E+04 0.31803340E+04 + 0.31803340E+04 0.31858030E+04 0.31858030E+04 0.31957920E+04 + 0.32065100E+04 0.32051580E+04 0.32051580E+04 0.32075620E+04 + 0.32075620E+04 0.32071289E+04 0.32071289E+04 0.31995740E+04 + 0.31995740E+04 0.31906531E+04 0.31906531E+04 0.31858210E+04 + 0.31858210E+04 0.31822729E+04 0.31822729E+04 0.31792981E+04 + 0.31792981E+04 0.31803340E+04 0.31803340E+04 0.31858030E+04 + 0.30534470E+04 0.30541790E+04 0.32007959E+04 0.31934041E+04 + 0.31934041E+04 0.31949270E+04 0.31949270E+04 0.31961399E+04 + 0.31961399E+04 0.31914780E+04 0.31914780E+04 0.31860481E+04 + 0.31860481E+04 0.31832339E+04 0.31832339E+04 0.31812661E+04 + 0.31812661E+04 0.31813701E+04 0.31813701E+04 0.31829929E+04 + 0.31829929E+04 0.31857500E+04 0.30583020E+04 0.30555911E+04 + 0.32007959E+04 0.31934041E+04 0.31934041E+04 0.31949270E+04 + 0.31949270E+04 0.31961399E+04 0.31961399E+04 0.31914780E+04 + 0.31914780E+04 0.31860481E+04 0.31860481E+04 0.31832339E+04 + 0.31832339E+04 0.31812661E+04 0.31812661E+04 0.31813701E+04 + 0.30930791E+04 0.30900520E+04 0.30900520E+04 0.30888999E+04 + 0.30583020E+04 0.30555911E+04 0.32048440E+04 0.31892849E+04 + 0.31892849E+04 0.31864641E+04 0.31864641E+04 0.31860701E+04 + 0.31860701E+04 0.31842251E+04 0.31842251E+04 0.31818979E+04 + 0.31818979E+04 0.31802791E+04 0.31802791E+04 0.31806580E+04 + 0.31806580E+04 0.31816299E+04 0.30914790E+04 0.30911379E+04 + 0.30911379E+04 0.30898359E+04 0.30579009E+04 0.30554241E+04 + 0.32048440E+04 0.31892849E+04 0.31892849E+04 0.31864641E+04 + 0.31864641E+04 0.31860701E+04 0.31860701E+04 0.31842251E+04 + 0.31842251E+04 0.31818979E+04 0.31818979E+04 0.31802791E+04 + 0.31050649E+04 0.31008459E+04 0.31008459E+04 0.30914790E+04 + 0.30914790E+04 0.30911379E+04 0.30911379E+04 0.30898359E+04 + 0.30579009E+04 0.30554241E+04 0.32060891E+04 0.31914741E+04 + 0.31914741E+04 0.31848979E+04 0.31848979E+04 0.31820930E+04 + 0.31820930E+04 0.31799600E+04 0.31799600E+04 0.31799021E+04 + 0.31799021E+04 0.31793459E+04 0.31066021E+04 0.31036880E+04 + 0.31036880E+04 0.30980481E+04 0.30980481E+04 0.30937759E+04 + 0.30937759E+04 0.30912939E+04 0.30582639E+04 0.30557939E+04 + 0.32060891E+04 0.31914741E+04 0.31914741E+04 0.31848979E+04 + 0.31848979E+04 0.31820930E+04 0.31820930E+04 0.31799600E+04 + 0.31139661E+04 0.31105010E+04 0.31105010E+04 0.31066021E+04 + 0.31066021E+04 0.31036880E+04 0.31036880E+04 0.30980481E+04 + 0.30980481E+04 0.30937759E+04 0.30937759E+04 0.30912939E+04 + 0.30582639E+04 0.30557939E+04 0.32010029E+04 0.31933721E+04 + 0.31933721E+04 0.31862939E+04 0.31862939E+04 0.31843601E+04 + 0.31843601E+04 0.31808259E+04 0.31158530E+04 0.31129641E+04 + 0.31129641E+04 0.31093911E+04 0.31093911E+04 0.31058149E+04 + 0.31058149E+04 0.31004460E+04 0.31004460E+04 0.30946890E+04 + 0.30946890E+04 0.30920850E+04 0.30585969E+04 0.30566599E+04 + 0.32010029E+04 0.31933721E+04 0.31933721E+04 0.31862939E+04 + 0.31251389E+04 0.31212661E+04 0.31212661E+04 0.31158530E+04 + 0.31158530E+04 0.31129641E+04 0.31129641E+04 0.31093911E+04 + 0.31093911E+04 0.31058149E+04 0.31058149E+04 0.31004460E+04 + 0.31004460E+04 0.30946890E+04 0.30946890E+04 0.30920850E+04 + 0.30585969E+04 0.30566599E+04 0.31993110E+04 0.31948479E+04 + 0.31948479E+04 0.31888650E+04 0.31284910E+04 0.31242500E+04 + 0.31242500E+04 0.31183479E+04 0.31183479E+04 0.31132881E+04 + 0.31132881E+04 0.31068640E+04 0.31068640E+04 0.31031980E+04 + 0.31031980E+04 0.31010811E+04 0.31010811E+04 0.30968650E+04 + 0.30968650E+04 0.30928870E+04 0.30594851E+04 0.30572581E+04 + 0.31363679E+04 0.31334009E+04 0.31334009E+04 0.31284910E+04 + 0.31284910E+04 0.31242500E+04 0.31242500E+04 0.31183479E+04 + 0.31183479E+04 0.31132881E+04 0.31132881E+04 0.31068640E+04 + 0.31068640E+04 0.31031980E+04 0.31031980E+04 0.31010811E+04 + 0.31010811E+04 0.30968650E+04 0.30968650E+04 0.30928870E+04 + 0.30928870E+04 0.30902290E+04 0.31381689E+04 0.31360610E+04 + 0.31360610E+04 0.31341689E+04 0.31341689E+04 0.31290110E+04 + 0.31290110E+04 0.31158330E+04 0.31158330E+04 0.31079729E+04 + 0.31079729E+04 0.31032329E+04 0.31032329E+04 0.31023740E+04 + 0.31023740E+04 0.31049390E+04 0.31049390E+04 0.31004080E+04 + 0.31004080E+04 0.30941189E+04 0.30941189E+04 0.30904810E+04 + 0.32116069E+04 0.32101721E+04 0.32101721E+04 0.32129160E+04 + 0.32129160E+04 0.32136941E+04 0.32136941E+04 0.32093440E+04 + 0.32093440E+04 0.32013040E+04 0.32013040E+04 0.31997390E+04 + 0.31997390E+04 0.32040530E+04 0.32040530E+04 0.32069551E+04 + 0.32069551E+04 0.32082791E+04 0.32082791E+04 0.32131760E+04 + 0.32131760E+04 0.32206621E+04 0.32018530E+04 0.32024031E+04 + 0.32024031E+04 0.32073789E+04 0.32073789E+04 0.32087881E+04 + 0.32087881E+04 0.32057290E+04 0.32057290E+04 0.32026050E+04 + 0.32026050E+04 0.32057729E+04 0.32057729E+04 0.32121130E+04 + 0.32121130E+04 0.32147229E+04 0.32147229E+04 0.32171680E+04 + 0.32171680E+04 0.32219609E+04 0.32219609E+04 0.32252620E+04 + 0.32018530E+04 0.32024031E+04 0.32024031E+04 0.32073789E+04 + 0.32073789E+04 0.32087881E+04 0.32087881E+04 0.32057290E+04 + 0.32057290E+04 0.32026050E+04 0.32026050E+04 0.32057729E+04 + 0.32057729E+04 0.32121130E+04 0.32121130E+04 0.32147229E+04 + 0.32147229E+04 0.32171680E+04 0.32171680E+04 0.32219609E+04 + 0.32219609E+04 0.32252620E+04 0.31941631E+04 0.31950730E+04 + 0.31950730E+04 0.31988840E+04 0.31988840E+04 0.31966799E+04 + 0.31966799E+04 0.31938279E+04 0.31938279E+04 0.31948081E+04 + 0.31948081E+04 0.32005339E+04 0.32005339E+04 0.32079709E+04 + 0.32079709E+04 0.32127061E+04 0.32127061E+04 0.32181670E+04 + 0.32181670E+04 0.32237891E+04 0.32237891E+04 0.32248259E+04 + 0.31941631E+04 0.31950730E+04 0.31950730E+04 0.31988840E+04 + 0.31988840E+04 0.31966799E+04 0.31966799E+04 0.31938279E+04 + 0.31938279E+04 0.31948081E+04 0.31948081E+04 0.32005339E+04 + 0.32005339E+04 0.32079709E+04 0.32079709E+04 0.32127061E+04 + 0.32127061E+04 0.32181670E+04 0.32181670E+04 0.32237891E+04 + 0.32237891E+04 0.32248259E+04 0.31818970E+04 0.31746721E+04 + 0.31746721E+04 0.31749180E+04 0.31749180E+04 0.31731150E+04 + 0.31731150E+04 0.31811150E+04 0.31811150E+04 0.31924170E+04 + 0.31924170E+04 0.32011499E+04 0.32011499E+04 0.32061660E+04 + 0.32061660E+04 0.32101919E+04 0.32101919E+04 0.32153660E+04 + 0.32153660E+04 0.32211440E+04 0.32211440E+04 0.32248860E+04 + 0.31818970E+04 0.31746721E+04 0.31746721E+04 0.31749180E+04 + 0.31749180E+04 0.31731150E+04 0.31731150E+04 0.31811150E+04 + 0.31811150E+04 0.31924170E+04 0.31924170E+04 0.32011499E+04 + 0.32011499E+04 0.32061660E+04 0.32061660E+04 0.32101919E+04 + 0.32101919E+04 0.32153660E+04 0.32153660E+04 0.32211440E+04 + 0.32211440E+04 0.32248860E+04 0.31788140E+04 0.31739409E+04 + 0.31739409E+04 0.31763250E+04 0.31763250E+04 0.31772009E+04 + 0.31772009E+04 0.31803560E+04 0.31803560E+04 0.31863081E+04 + 0.31863081E+04 0.31907991E+04 0.31907991E+04 0.31922300E+04 + 0.31922300E+04 0.31979089E+04 0.31979089E+04 0.32083630E+04 + 0.32083630E+04 0.32187009E+04 0.32187009E+04 0.32276880E+04 + 0.31788140E+04 0.31739409E+04 0.31739409E+04 0.31763250E+04 + 0.31763250E+04 0.31772009E+04 0.31772009E+04 0.31803560E+04 + 0.31803560E+04 0.31863081E+04 0.31863081E+04 0.31907991E+04 + 0.31907991E+04 0.31922300E+04 0.31922300E+04 0.31979089E+04 + 0.31979089E+04 0.32083630E+04 0.32083630E+04 0.32187009E+04 + 0.32187009E+04 0.32276880E+04 0.31927009E+04 0.31939700E+04 + 0.31939700E+04 0.31951841E+04 0.31951841E+04 0.31920300E+04 + 0.31920300E+04 0.31838669E+04 0.31838669E+04 0.31789680E+04 + 0.31789680E+04 0.31809050E+04 0.31809050E+04 0.31864529E+04 + 0.31864529E+04 0.31918140E+04 0.31918140E+04 0.32004021E+04 + 0.32004021E+04 0.32126750E+04 0.32126750E+04 0.32250049E+04 + 0.31927009E+04 0.31939700E+04 0.31939700E+04 0.31951841E+04 + 0.31951841E+04 0.31920300E+04 0.31920300E+04 0.31838669E+04 + 0.31838669E+04 0.31789680E+04 0.31789680E+04 0.31809050E+04 + 0.31809050E+04 0.31864529E+04 0.31864529E+04 0.31918140E+04 + 0.31918140E+04 0.32004021E+04 0.32004021E+04 0.32126750E+04 + 0.32126750E+04 0.32250049E+04 0.31903130E+04 0.31983740E+04 + 0.31983740E+04 0.32025540E+04 0.32025540E+04 0.32009561E+04 + 0.32009561E+04 0.31966179E+04 0.31966179E+04 0.31908430E+04 + 0.31908430E+04 0.31891941E+04 0.31891941E+04 0.31875171E+04 + 0.31875171E+04 0.31854929E+04 0.31854929E+04 0.31912400E+04 + 0.31912400E+04 0.32044480E+04 0.32044480E+04 0.32184910E+04 + 0.31903130E+04 0.31983740E+04 0.31983740E+04 0.32025540E+04 + 0.32025540E+04 0.32009561E+04 0.32009561E+04 0.31966179E+04 + 0.31966179E+04 0.31908430E+04 0.31908430E+04 0.31891941E+04 + 0.31891941E+04 0.31875171E+04 0.31875171E+04 0.31854929E+04 + 0.31854929E+04 0.31912400E+04 0.31912400E+04 0.32044480E+04 + 0.32044480E+04 0.32184910E+04 0.31877920E+04 0.31946980E+04 + 0.31946980E+04 0.32009351E+04 0.32009351E+04 0.32002671E+04 + 0.32002671E+04 0.31987920E+04 0.31987920E+04 0.31970229E+04 + 0.31970229E+04 0.31942561E+04 0.31942561E+04 0.31857339E+04 + 0.31857339E+04 0.31810540E+04 0.31810540E+04 0.31839199E+04 + 0.31839199E+04 0.31922539E+04 0.31922539E+04 0.32023040E+04 + 0.31877920E+04 0.31946980E+04 0.31946980E+04 0.32009351E+04 + 0.32009351E+04 0.32002671E+04 0.32002671E+04 0.31987920E+04 + 0.31987920E+04 0.31970229E+04 0.31970229E+04 0.31942561E+04 + 0.31942561E+04 0.31857339E+04 0.31857339E+04 0.31810540E+04 + 0.31810540E+04 0.31839199E+04 0.31839199E+04 0.31922539E+04 + 0.31922539E+04 0.32023040E+04 0.31972839E+04 0.31978430E+04 + 0.31978430E+04 0.32055940E+04 0.32055940E+04 0.32061260E+04 + 0.32061260E+04 0.32001550E+04 0.32001550E+04 0.31962229E+04 + 0.31962229E+04 0.31930591E+04 0.31930591E+04 0.31852871E+04 + 0.31852871E+04 0.31780239E+04 0.31780239E+04 0.31802109E+04 + 0.31802109E+04 0.31848911E+04 0.31848911E+04 0.31894519E+04 + 0.31972839E+04 0.31978430E+04 0.31978430E+04 0.32055940E+04 + 0.32055940E+04 0.32061260E+04 0.32061260E+04 0.32001550E+04 + 0.32001550E+04 0.31962229E+04 0.31962229E+04 0.31930591E+04 + 0.31930591E+04 0.31852871E+04 0.31852871E+04 0.31780239E+04 + 0.31780239E+04 0.31802109E+04 0.31802109E+04 0.31848911E+04 + 0.31848911E+04 0.31894519E+04 0.32097881E+04 0.32064519E+04 + 0.32064519E+04 0.32113191E+04 0.32113191E+04 0.32114851E+04 + 0.32114851E+04 0.32047151E+04 0.32047151E+04 0.31976831E+04 + 0.31976831E+04 0.31921931E+04 0.31921931E+04 0.31841731E+04 + 0.31841731E+04 0.31765950E+04 0.31765950E+04 0.31777141E+04 + 0.31777141E+04 0.31832371E+04 0.31832371E+04 0.31913640E+04 + 0.32097881E+04 0.32064519E+04 0.32064519E+04 0.32113191E+04 + 0.32113191E+04 0.32114851E+04 0.32114851E+04 0.32047151E+04 + 0.32047151E+04 0.31976831E+04 0.31976831E+04 0.31921931E+04 + 0.31921931E+04 0.31841731E+04 0.31841731E+04 0.31765950E+04 + 0.31765950E+04 0.31777141E+04 0.31777141E+04 0.31832371E+04 + 0.31832371E+04 0.31913640E+04 0.32065100E+04 0.32051580E+04 + 0.32051580E+04 0.32075620E+04 0.32075620E+04 0.32071289E+04 + 0.32071289E+04 0.31995740E+04 0.31995740E+04 0.31906531E+04 + 0.31906531E+04 0.31858210E+04 0.31858210E+04 0.31822729E+04 + 0.31822729E+04 0.31792981E+04 0.31792981E+04 0.31803340E+04 + 0.31803340E+04 0.31858030E+04 0.31858030E+04 0.31957920E+04 + 0.32065100E+04 0.32051580E+04 0.32051580E+04 0.32075620E+04 + 0.32075620E+04 0.32071289E+04 0.32071289E+04 0.31995740E+04 + 0.31995740E+04 0.31906531E+04 0.31906531E+04 0.31858210E+04 + 0.31858210E+04 0.31822729E+04 0.31822729E+04 0.31792981E+04 + 0.31792981E+04 0.31803340E+04 0.31803340E+04 0.31858030E+04 + 0.30534470E+04 0.30541790E+04 0.32007959E+04 0.31934041E+04 + 0.31934041E+04 0.31949270E+04 0.31949270E+04 0.31961399E+04 + 0.31961399E+04 0.31914780E+04 0.31914780E+04 0.31860481E+04 + 0.31860481E+04 0.31832339E+04 0.31832339E+04 0.31812661E+04 + 0.31812661E+04 0.31813701E+04 0.31813701E+04 0.31829929E+04 + 0.31829929E+04 0.31857500E+04 0.30583020E+04 0.30555911E+04 + 0.32007959E+04 0.31934041E+04 0.31934041E+04 0.31949270E+04 + 0.31949270E+04 0.31961399E+04 0.31961399E+04 0.31914780E+04 + 0.31914780E+04 0.31860481E+04 0.31860481E+04 0.31832339E+04 + 0.31832339E+04 0.31812661E+04 0.31812661E+04 0.31813701E+04 + 0.30930791E+04 0.30900520E+04 0.30900520E+04 0.30888999E+04 + 0.30583020E+04 0.30555911E+04 0.32048440E+04 0.31892849E+04 + 0.31892849E+04 0.31864641E+04 0.31864641E+04 0.31860701E+04 + 0.31860701E+04 0.31842251E+04 0.31842251E+04 0.31818979E+04 + 0.31818979E+04 0.31802791E+04 0.31802791E+04 0.31806580E+04 + 0.31806580E+04 0.31816299E+04 0.30914790E+04 0.30911379E+04 + 0.30911379E+04 0.30898359E+04 0.30579009E+04 0.30554241E+04 + 0.32048440E+04 0.31892849E+04 0.31892849E+04 0.31864641E+04 + 0.31864641E+04 0.31860701E+04 0.31860701E+04 0.31842251E+04 + 0.31842251E+04 0.31818979E+04 0.31818979E+04 0.31802791E+04 + 0.31050649E+04 0.31008459E+04 0.31008459E+04 0.30914790E+04 + 0.30914790E+04 0.30911379E+04 0.30911379E+04 0.30898359E+04 + 0.30579009E+04 0.30554241E+04 0.32060891E+04 0.31914741E+04 + 0.31914741E+04 0.31848979E+04 0.31848979E+04 0.31820930E+04 + 0.31820930E+04 0.31799600E+04 0.31799600E+04 0.31799021E+04 + 0.31799021E+04 0.31793459E+04 0.31066021E+04 0.31036880E+04 + 0.31036880E+04 0.30980481E+04 0.30980481E+04 0.30937759E+04 + 0.30937759E+04 0.30912939E+04 0.30582639E+04 0.30557939E+04 + 0.32060891E+04 0.31914741E+04 0.31914741E+04 0.31848979E+04 + 0.31848979E+04 0.31820930E+04 0.31820930E+04 0.31799600E+04 + 0.31139661E+04 0.31105010E+04 0.31105010E+04 0.31066021E+04 + 0.31066021E+04 0.31036880E+04 0.31036880E+04 0.30980481E+04 + 0.30980481E+04 0.30937759E+04 0.30937759E+04 0.30912939E+04 + 0.30582639E+04 0.30557939E+04 0.32010029E+04 0.31933721E+04 + 0.31933721E+04 0.31862939E+04 0.31862939E+04 0.31843601E+04 + 0.31843601E+04 0.31808259E+04 0.31158530E+04 0.31129641E+04 + 0.31129641E+04 0.31093911E+04 0.31093911E+04 0.31058149E+04 + 0.31058149E+04 0.31004460E+04 0.31004460E+04 0.30946890E+04 + 0.30946890E+04 0.30920850E+04 0.30585969E+04 0.30566599E+04 + 0.32010029E+04 0.31933721E+04 0.31933721E+04 0.31862939E+04 + 0.31251389E+04 0.31212661E+04 0.31212661E+04 0.31158530E+04 + 0.31158530E+04 0.31129641E+04 0.31129641E+04 0.31093911E+04 + 0.31093911E+04 0.31058149E+04 0.31058149E+04 0.31004460E+04 + 0.31004460E+04 0.30946890E+04 0.30946890E+04 0.30920850E+04 + 0.30585969E+04 0.30566599E+04 0.31993110E+04 0.31948479E+04 + 0.31948479E+04 0.31888650E+04 0.31284910E+04 0.31242500E+04 + 0.31242500E+04 0.31183479E+04 0.31183479E+04 0.31132881E+04 + 0.31132881E+04 0.31068640E+04 0.31068640E+04 0.31031980E+04 + 0.31031980E+04 0.31010811E+04 0.31010811E+04 0.30968650E+04 + 0.30968650E+04 0.30928870E+04 0.30594851E+04 0.30572581E+04 + 0.31363679E+04 0.31334009E+04 0.31334009E+04 0.31284910E+04 + 0.31284910E+04 0.31242500E+04 0.31242500E+04 0.31183479E+04 + 0.31183479E+04 0.31132881E+04 0.31132881E+04 0.31068640E+04 + 0.31068640E+04 0.31031980E+04 0.31031980E+04 0.31010811E+04 + 0.31010811E+04 0.30968650E+04 0.30968650E+04 0.30928870E+04 + 0.30928870E+04 0.30902290E+04 0.31381689E+04 0.31360610E+04 + 0.31360610E+04 0.31341689E+04 0.31341689E+04 0.31290110E+04 + 0.31290110E+04 0.31158330E+04 0.31158330E+04 0.31079729E+04 + 0.31079729E+04 0.31032329E+04 0.31032329E+04 0.31023740E+04 + 0.31023740E+04 0.31049390E+04 0.31049390E+04 0.31004080E+04 + 0.31004080E+04 0.30941189E+04 0.30941189E+04 0.30904810E+04 + 0.32127280E+04 0.32111890E+04 0.32111890E+04 0.32139370E+04 + 0.32139370E+04 0.32147610E+04 0.32147610E+04 0.32104570E+04 + 0.32104570E+04 0.32023669E+04 0.32023669E+04 0.32006741E+04 + 0.32006741E+04 0.32048999E+04 0.32048999E+04 0.32078550E+04 + 0.32078550E+04 0.32092029E+04 0.32092029E+04 0.32140959E+04 + 0.32140959E+04 0.32216169E+04 0.32030061E+04 0.32034150E+04 + 0.32034150E+04 0.32084199E+04 0.32084199E+04 0.32099080E+04 + 0.32099080E+04 0.32068679E+04 0.32068679E+04 0.32036750E+04 + 0.32036750E+04 0.32067229E+04 0.32067229E+04 0.32130569E+04 + 0.32130569E+04 0.32157710E+04 0.32157710E+04 0.32181860E+04 + 0.32181860E+04 0.32229919E+04 0.32229919E+04 0.32262180E+04 + 0.32030061E+04 0.32034150E+04 0.32034150E+04 0.32084199E+04 + 0.32084199E+04 0.32099080E+04 0.32099080E+04 0.32068679E+04 + 0.32068679E+04 0.32036750E+04 0.32036750E+04 0.32067229E+04 + 0.32067229E+04 0.32130569E+04 0.32130569E+04 0.32157710E+04 + 0.32157710E+04 0.32181860E+04 0.32181860E+04 0.32229919E+04 + 0.32229919E+04 0.32262180E+04 0.31953501E+04 0.31961609E+04 + 0.31961609E+04 0.32000300E+04 0.32000300E+04 0.31978760E+04 + 0.31978760E+04 0.31949089E+04 0.31949089E+04 0.31957339E+04 + 0.31957339E+04 0.32013669E+04 0.32013669E+04 0.32088230E+04 + 0.32088230E+04 0.32136289E+04 0.32136289E+04 0.32190940E+04 + 0.32190940E+04 0.32247930E+04 0.32247930E+04 0.32256970E+04 + 0.31953501E+04 0.31961609E+04 0.31961609E+04 0.32000300E+04 + 0.32000300E+04 0.31978760E+04 0.31978760E+04 0.31949089E+04 + 0.31949089E+04 0.31957339E+04 0.31957339E+04 0.32013669E+04 + 0.32013669E+04 0.32088230E+04 0.32088230E+04 0.32136289E+04 + 0.32136289E+04 0.32190940E+04 0.32190940E+04 0.32247930E+04 + 0.32247930E+04 0.32256970E+04 0.31830200E+04 0.31756890E+04 + 0.31756890E+04 0.31759460E+04 0.31759460E+04 0.31739460E+04 + 0.31739460E+04 0.31817920E+04 0.31817920E+04 0.31930481E+04 + 0.31930481E+04 0.32018230E+04 0.32018230E+04 0.32069431E+04 + 0.32069431E+04 0.32110220E+04 0.32110220E+04 0.32161431E+04 + 0.32161431E+04 0.32218479E+04 0.32218479E+04 0.32254519E+04 + 0.31830200E+04 0.31756890E+04 0.31756890E+04 0.31759460E+04 + 0.31759460E+04 0.31739460E+04 0.31739460E+04 0.31817920E+04 + 0.31817920E+04 0.31930481E+04 0.31930481E+04 0.32018230E+04 + 0.32018230E+04 0.32069431E+04 0.32069431E+04 0.32110220E+04 + 0.32110220E+04 0.32161431E+04 0.32161431E+04 0.32218479E+04 + 0.32218479E+04 0.32254519E+04 0.31793660E+04 0.31744861E+04 + 0.31744861E+04 0.31769309E+04 0.31769309E+04 0.31778320E+04 + 0.31778320E+04 0.31809939E+04 0.31809939E+04 0.31869700E+04 + 0.31869700E+04 0.31914500E+04 0.31914500E+04 0.31928420E+04 + 0.31928420E+04 0.31984341E+04 0.31984341E+04 0.32088689E+04 + 0.32088689E+04 0.32191799E+04 0.32191799E+04 0.32281499E+04 + 0.31793660E+04 0.31744861E+04 0.31744861E+04 0.31769309E+04 + 0.31769309E+04 0.31778320E+04 0.31778320E+04 0.31809939E+04 + 0.31809939E+04 0.31869700E+04 0.31869700E+04 0.31914500E+04 + 0.31914500E+04 0.31928420E+04 0.31928420E+04 0.31984341E+04 + 0.31984341E+04 0.32088689E+04 0.32088689E+04 0.32191799E+04 + 0.32191799E+04 0.32281499E+04 0.31932241E+04 0.31944629E+04 + 0.31944629E+04 0.31957090E+04 0.31957090E+04 0.31926130E+04 + 0.31926130E+04 0.31844231E+04 0.31844231E+04 0.31794451E+04 + 0.31794451E+04 0.31813330E+04 0.31813330E+04 0.31869070E+04 + 0.31869070E+04 0.31922910E+04 0.31922910E+04 0.32008181E+04 + 0.32008181E+04 0.32130869E+04 0.32130869E+04 0.32254299E+04 + 0.31932241E+04 0.31944629E+04 0.31944629E+04 0.31957090E+04 + 0.31957090E+04 0.31926130E+04 0.31926130E+04 0.31844231E+04 + 0.31844231E+04 0.31794451E+04 0.31794451E+04 0.31813330E+04 + 0.31813330E+04 0.31869070E+04 0.31869070E+04 0.31922910E+04 + 0.31922910E+04 0.32008181E+04 0.32008181E+04 0.32130869E+04 + 0.32130869E+04 0.32254299E+04 0.31908020E+04 0.31988350E+04 + 0.31988350E+04 0.32030859E+04 0.32030859E+04 0.32015310E+04 + 0.32015310E+04 0.31971699E+04 0.31971699E+04 0.31913120E+04 + 0.31913120E+04 0.31896370E+04 0.31896370E+04 0.31880039E+04 + 0.31880039E+04 0.31859221E+04 0.31859221E+04 0.31915901E+04 + 0.31915901E+04 0.32048560E+04 0.32048560E+04 0.32189990E+04 + 0.31908020E+04 0.31988350E+04 0.31988350E+04 0.32030859E+04 + 0.32030859E+04 0.32015310E+04 0.32015310E+04 0.31971699E+04 + 0.31971699E+04 0.31913120E+04 0.31913120E+04 0.31896370E+04 + 0.31896370E+04 0.31880039E+04 0.31880039E+04 0.31859221E+04 + 0.31859221E+04 0.31915901E+04 0.31915901E+04 0.32048560E+04 + 0.32048560E+04 0.32189990E+04 0.31882600E+04 0.31951111E+04 + 0.31951111E+04 0.32014331E+04 0.32014331E+04 0.32007881E+04 + 0.32007881E+04 0.31993049E+04 0.31993049E+04 0.31975081E+04 + 0.31975081E+04 0.31947720E+04 0.31947720E+04 0.31862590E+04 + 0.31862590E+04 0.31815049E+04 0.31815049E+04 0.31843069E+04 + 0.31843069E+04 0.31926680E+04 0.31926680E+04 0.32028359E+04 + 0.31882600E+04 0.31951111E+04 0.31951111E+04 0.32014331E+04 + 0.32014331E+04 0.32007881E+04 0.32007881E+04 0.31993049E+04 + 0.31993049E+04 0.31975081E+04 0.31975081E+04 0.31947720E+04 + 0.31947720E+04 0.31862590E+04 0.31862590E+04 0.31815049E+04 + 0.31815049E+04 0.31843069E+04 0.31843069E+04 0.31926680E+04 + 0.31926680E+04 0.32028359E+04 0.31977939E+04 0.31982310E+04 + 0.31982310E+04 0.32060259E+04 0.32060259E+04 0.32066460E+04 + 0.32066460E+04 0.32006599E+04 0.32006599E+04 0.31967041E+04 + 0.31967041E+04 0.31935630E+04 0.31935630E+04 0.31858401E+04 + 0.31858401E+04 0.31785020E+04 0.31785020E+04 0.31806179E+04 + 0.31806179E+04 0.31853040E+04 0.31853040E+04 0.31898420E+04 + 0.31977939E+04 0.31982310E+04 0.31982310E+04 0.32060259E+04 + 0.32060259E+04 0.32066460E+04 0.32066460E+04 0.32006599E+04 + 0.32006599E+04 0.31967041E+04 0.31967041E+04 0.31935630E+04 + 0.31935630E+04 0.31858401E+04 0.31858401E+04 0.31785020E+04 + 0.31785020E+04 0.31806179E+04 0.31806179E+04 0.31853040E+04 + 0.31853040E+04 0.31898420E+04 0.32103979E+04 0.32069109E+04 + 0.32069109E+04 0.32117749E+04 0.32117749E+04 0.32120049E+04 + 0.32120049E+04 0.32052729E+04 0.32052729E+04 0.31982290E+04 + 0.31982290E+04 0.31927100E+04 0.31927100E+04 0.31847180E+04 + 0.31847180E+04 0.31770911E+04 0.31770911E+04 0.31782480E+04 + 0.31782480E+04 0.31838679E+04 0.31838679E+04 0.31920940E+04 + 0.32103979E+04 0.32069109E+04 0.32069109E+04 0.32117749E+04 + 0.32117749E+04 0.32120049E+04 0.32120049E+04 0.32052729E+04 + 0.32052729E+04 0.31982290E+04 0.31982290E+04 0.31927100E+04 + 0.31927100E+04 0.31847180E+04 0.31847180E+04 0.31770911E+04 + 0.31770911E+04 0.31782480E+04 0.31782480E+04 0.31838679E+04 + 0.31838679E+04 0.31920940E+04 0.32071799E+04 0.32057090E+04 + 0.32057090E+04 0.32080869E+04 0.32080869E+04 0.32077141E+04 + 0.32077141E+04 0.32001970E+04 0.32001970E+04 0.31912981E+04 + 0.31912981E+04 0.31864309E+04 0.31864309E+04 0.31830100E+04 + 0.31830100E+04 0.31801990E+04 0.31801990E+04 0.31813550E+04 + 0.31813550E+04 0.31866760E+04 0.31866760E+04 0.31966340E+04 + 0.32071799E+04 0.32057090E+04 0.32057090E+04 0.32080869E+04 + 0.32080869E+04 0.32077141E+04 0.32077141E+04 0.32001970E+04 + 0.32001970E+04 0.31912981E+04 0.31912981E+04 0.31864309E+04 + 0.31864309E+04 0.31830100E+04 0.31830100E+04 0.31801990E+04 + 0.31801990E+04 0.31813550E+04 0.31813550E+04 0.31866760E+04 + 0.30537510E+04 0.30545491E+04 0.32015000E+04 0.31939651E+04 + 0.31939651E+04 0.31954241E+04 0.31954241E+04 0.31967480E+04 + 0.31967480E+04 0.31922029E+04 0.31922029E+04 0.31869050E+04 + 0.31869050E+04 0.31841951E+04 0.31841951E+04 0.31823850E+04 + 0.31823850E+04 0.31823960E+04 0.31823960E+04 0.31840791E+04 + 0.31840791E+04 0.31869041E+04 0.30586121E+04 0.30559519E+04 + 0.32015000E+04 0.31939651E+04 0.31939651E+04 0.31954241E+04 + 0.31954241E+04 0.31967480E+04 0.31967480E+04 0.31922029E+04 + 0.31922029E+04 0.31869050E+04 0.31869050E+04 0.31841951E+04 + 0.31841951E+04 0.31823850E+04 0.31823850E+04 0.31823960E+04 + 0.30938359E+04 0.30908330E+04 0.30908330E+04 0.30897051E+04 + 0.30586121E+04 0.30559519E+04 0.32056411E+04 0.31899170E+04 + 0.31899170E+04 0.31870759E+04 0.31870759E+04 0.31868259E+04 + 0.31868259E+04 0.31851660E+04 0.31851660E+04 0.31830071E+04 + 0.31830071E+04 0.31812881E+04 0.31812881E+04 0.31817339E+04 + 0.31817339E+04 0.31828491E+04 0.30921470E+04 0.30919089E+04 + 0.30919089E+04 0.30906660E+04 0.30582300E+04 0.30557710E+04 + 0.32056411E+04 0.31899170E+04 0.31899170E+04 0.31870759E+04 + 0.31870759E+04 0.31868259E+04 0.31868259E+04 0.31851660E+04 + 0.31851660E+04 0.31830071E+04 0.31830071E+04 0.31812881E+04 + 0.31057520E+04 0.31015591E+04 0.31015591E+04 0.30921470E+04 + 0.30921470E+04 0.30919089E+04 0.30919089E+04 0.30906660E+04 + 0.30582300E+04 0.30557710E+04 0.32069561E+04 0.31922910E+04 + 0.31922910E+04 0.31857451E+04 0.31857451E+04 0.31828911E+04 + 0.31828911E+04 0.31808220E+04 0.31808220E+04 0.31809299E+04 + 0.31809299E+04 0.31804451E+04 0.31072700E+04 0.31044180E+04 + 0.31044180E+04 0.30988440E+04 0.30988440E+04 0.30945930E+04 + 0.30945930E+04 0.30921411E+04 0.30586169E+04 0.30561760E+04 + 0.32069561E+04 0.31922910E+04 0.31922910E+04 0.31857451E+04 + 0.31857451E+04 0.31828911E+04 0.31828911E+04 0.31808220E+04 + 0.31145920E+04 0.31111379E+04 0.31111379E+04 0.31072700E+04 + 0.31072700E+04 0.31044180E+04 0.31044180E+04 0.30988440E+04 + 0.30988440E+04 0.30945930E+04 0.30945930E+04 0.30921411E+04 + 0.30586169E+04 0.30561760E+04 0.32019070E+04 0.31941931E+04 + 0.31941931E+04 0.31870730E+04 0.31870730E+04 0.31851899E+04 + 0.31851899E+04 0.31816809E+04 0.31165049E+04 0.31136460E+04 + 0.31136460E+04 0.31100530E+04 0.31100530E+04 0.31064951E+04 + 0.31064951E+04 0.31011631E+04 0.31011631E+04 0.30955449E+04 + 0.30955449E+04 0.30929390E+04 0.30589761E+04 0.30570720E+04 + 0.32019070E+04 0.31941931E+04 0.31941931E+04 0.31870730E+04 + 0.31257859E+04 0.31219150E+04 0.31219150E+04 0.31165049E+04 + 0.31165049E+04 0.31136460E+04 0.31136460E+04 0.31100530E+04 + 0.31100530E+04 0.31064951E+04 0.31064951E+04 0.31011631E+04 + 0.31011631E+04 0.30955449E+04 0.30955449E+04 0.30929390E+04 + 0.30589761E+04 0.30570720E+04 0.32000530E+04 0.31956541E+04 + 0.31956541E+04 0.31896470E+04 0.31291560E+04 0.31249629E+04 + 0.31249629E+04 0.31190420E+04 0.31190420E+04 0.31139551E+04 + 0.31139551E+04 0.31075181E+04 0.31075181E+04 0.31038831E+04 + 0.31038831E+04 0.31017949E+04 0.31017949E+04 0.30976570E+04 + 0.30976570E+04 0.30937271E+04 0.30598811E+04 0.30576909E+04 + 0.31370930E+04 0.31341089E+04 0.31341089E+04 0.31291560E+04 + 0.31291560E+04 0.31249629E+04 0.31249629E+04 0.31190420E+04 + 0.31190420E+04 0.31139551E+04 0.31139551E+04 0.31075181E+04 + 0.31075181E+04 0.31038831E+04 0.31038831E+04 0.31017949E+04 + 0.31017949E+04 0.30976570E+04 0.30976570E+04 0.30937271E+04 + 0.30937271E+04 0.30911250E+04 0.31388950E+04 0.31368091E+04 + 0.31368091E+04 0.31348430E+04 0.31348430E+04 0.31296399E+04 + 0.31296399E+04 0.31165000E+04 0.31165000E+04 0.31085940E+04 + 0.31085940E+04 0.31038469E+04 0.31038469E+04 0.31029880E+04 + 0.31029880E+04 0.31056631E+04 0.31056631E+04 0.31011809E+04 + 0.31011809E+04 0.30949690E+04 0.30949690E+04 0.30913601E+04 + 0.32127280E+04 0.32111890E+04 0.32111890E+04 0.32139370E+04 + 0.32139370E+04 0.32147610E+04 0.32147610E+04 0.32104570E+04 + 0.32104570E+04 0.32023669E+04 0.32023669E+04 0.32006741E+04 + 0.32006741E+04 0.32048999E+04 0.32048999E+04 0.32078550E+04 + 0.32078550E+04 0.32092029E+04 0.32092029E+04 0.32140959E+04 + 0.32140959E+04 0.32216169E+04 0.32030061E+04 0.32034150E+04 + 0.32034150E+04 0.32084199E+04 0.32084199E+04 0.32099080E+04 + 0.32099080E+04 0.32068679E+04 0.32068679E+04 0.32036750E+04 + 0.32036750E+04 0.32067229E+04 0.32067229E+04 0.32130569E+04 + 0.32130569E+04 0.32157710E+04 0.32157710E+04 0.32181860E+04 + 0.32181860E+04 0.32229919E+04 0.32229919E+04 0.32262180E+04 + 0.32030061E+04 0.32034150E+04 0.32034150E+04 0.32084199E+04 + 0.32084199E+04 0.32099080E+04 0.32099080E+04 0.32068679E+04 + 0.32068679E+04 0.32036750E+04 0.32036750E+04 0.32067229E+04 + 0.32067229E+04 0.32130569E+04 0.32130569E+04 0.32157710E+04 + 0.32157710E+04 0.32181860E+04 0.32181860E+04 0.32229919E+04 + 0.32229919E+04 0.32262180E+04 0.31953501E+04 0.31961609E+04 + 0.31961609E+04 0.32000300E+04 0.32000300E+04 0.31978760E+04 + 0.31978760E+04 0.31949089E+04 0.31949089E+04 0.31957339E+04 + 0.31957339E+04 0.32013669E+04 0.32013669E+04 0.32088230E+04 + 0.32088230E+04 0.32136289E+04 0.32136289E+04 0.32190940E+04 + 0.32190940E+04 0.32247930E+04 0.32247930E+04 0.32256970E+04 + 0.31953501E+04 0.31961609E+04 0.31961609E+04 0.32000300E+04 + 0.32000300E+04 0.31978760E+04 0.31978760E+04 0.31949089E+04 + 0.31949089E+04 0.31957339E+04 0.31957339E+04 0.32013669E+04 + 0.32013669E+04 0.32088230E+04 0.32088230E+04 0.32136289E+04 + 0.32136289E+04 0.32190940E+04 0.32190940E+04 0.32247930E+04 + 0.32247930E+04 0.32256970E+04 0.31830200E+04 0.31756890E+04 + 0.31756890E+04 0.31759460E+04 0.31759460E+04 0.31739460E+04 + 0.31739460E+04 0.31817920E+04 0.31817920E+04 0.31930481E+04 + 0.31930481E+04 0.32018230E+04 0.32018230E+04 0.32069431E+04 + 0.32069431E+04 0.32110220E+04 0.32110220E+04 0.32161431E+04 + 0.32161431E+04 0.32218479E+04 0.32218479E+04 0.32254519E+04 + 0.31830200E+04 0.31756890E+04 0.31756890E+04 0.31759460E+04 + 0.31759460E+04 0.31739460E+04 0.31739460E+04 0.31817920E+04 + 0.31817920E+04 0.31930481E+04 0.31930481E+04 0.32018230E+04 + 0.32018230E+04 0.32069431E+04 0.32069431E+04 0.32110220E+04 + 0.32110220E+04 0.32161431E+04 0.32161431E+04 0.32218479E+04 + 0.32218479E+04 0.32254519E+04 0.31793660E+04 0.31744861E+04 + 0.31744861E+04 0.31769309E+04 0.31769309E+04 0.31778320E+04 + 0.31778320E+04 0.31809939E+04 0.31809939E+04 0.31869700E+04 + 0.31869700E+04 0.31914500E+04 0.31914500E+04 0.31928420E+04 + 0.31928420E+04 0.31984341E+04 0.31984341E+04 0.32088689E+04 + 0.32088689E+04 0.32191799E+04 0.32191799E+04 0.32281499E+04 + 0.31793660E+04 0.31744861E+04 0.31744861E+04 0.31769309E+04 + 0.31769309E+04 0.31778320E+04 0.31778320E+04 0.31809939E+04 + 0.31809939E+04 0.31869700E+04 0.31869700E+04 0.31914500E+04 + 0.31914500E+04 0.31928420E+04 0.31928420E+04 0.31984341E+04 + 0.31984341E+04 0.32088689E+04 0.32088689E+04 0.32191799E+04 + 0.32191799E+04 0.32281499E+04 0.31932241E+04 0.31944629E+04 + 0.31944629E+04 0.31957090E+04 0.31957090E+04 0.31926130E+04 + 0.31926130E+04 0.31844231E+04 0.31844231E+04 0.31794451E+04 + 0.31794451E+04 0.31813330E+04 0.31813330E+04 0.31869070E+04 + 0.31869070E+04 0.31922910E+04 0.31922910E+04 0.32008181E+04 + 0.32008181E+04 0.32130869E+04 0.32130869E+04 0.32254299E+04 + 0.31932241E+04 0.31944629E+04 0.31944629E+04 0.31957090E+04 + 0.31957090E+04 0.31926130E+04 0.31926130E+04 0.31844231E+04 + 0.31844231E+04 0.31794451E+04 0.31794451E+04 0.31813330E+04 + 0.31813330E+04 0.31869070E+04 0.31869070E+04 0.31922910E+04 + 0.31922910E+04 0.32008181E+04 0.32008181E+04 0.32130869E+04 + 0.32130869E+04 0.32254299E+04 0.31908020E+04 0.31988350E+04 + 0.31988350E+04 0.32030859E+04 0.32030859E+04 0.32015310E+04 + 0.32015310E+04 0.31971699E+04 0.31971699E+04 0.31913120E+04 + 0.31913120E+04 0.31896370E+04 0.31896370E+04 0.31880039E+04 + 0.31880039E+04 0.31859221E+04 0.31859221E+04 0.31915901E+04 + 0.31915901E+04 0.32048560E+04 0.32048560E+04 0.32189990E+04 + 0.31908020E+04 0.31988350E+04 0.31988350E+04 0.32030859E+04 + 0.32030859E+04 0.32015310E+04 0.32015310E+04 0.31971699E+04 + 0.31971699E+04 0.31913120E+04 0.31913120E+04 0.31896370E+04 + 0.31896370E+04 0.31880039E+04 0.31880039E+04 0.31859221E+04 + 0.31859221E+04 0.31915901E+04 0.31915901E+04 0.32048560E+04 + 0.32048560E+04 0.32189990E+04 0.31882600E+04 0.31951111E+04 + 0.31951111E+04 0.32014331E+04 0.32014331E+04 0.32007881E+04 + 0.32007881E+04 0.31993049E+04 0.31993049E+04 0.31975081E+04 + 0.31975081E+04 0.31947720E+04 0.31947720E+04 0.31862590E+04 + 0.31862590E+04 0.31815049E+04 0.31815049E+04 0.31843069E+04 + 0.31843069E+04 0.31926680E+04 0.31926680E+04 0.32028359E+04 + 0.31882600E+04 0.31951111E+04 0.31951111E+04 0.32014331E+04 + 0.32014331E+04 0.32007881E+04 0.32007881E+04 0.31993049E+04 + 0.31993049E+04 0.31975081E+04 0.31975081E+04 0.31947720E+04 + 0.31947720E+04 0.31862590E+04 0.31862590E+04 0.31815049E+04 + 0.31815049E+04 0.31843069E+04 0.31843069E+04 0.31926680E+04 + 0.31926680E+04 0.32028359E+04 0.31977939E+04 0.31982310E+04 + 0.31982310E+04 0.32060259E+04 0.32060259E+04 0.32066460E+04 + 0.32066460E+04 0.32006599E+04 0.32006599E+04 0.31967041E+04 + 0.31967041E+04 0.31935630E+04 0.31935630E+04 0.31858401E+04 + 0.31858401E+04 0.31785020E+04 0.31785020E+04 0.31806179E+04 + 0.31806179E+04 0.31853040E+04 0.31853040E+04 0.31898420E+04 + 0.31977939E+04 0.31982310E+04 0.31982310E+04 0.32060259E+04 + 0.32060259E+04 0.32066460E+04 0.32066460E+04 0.32006599E+04 + 0.32006599E+04 0.31967041E+04 0.31967041E+04 0.31935630E+04 + 0.31935630E+04 0.31858401E+04 0.31858401E+04 0.31785020E+04 + 0.31785020E+04 0.31806179E+04 0.31806179E+04 0.31853040E+04 + 0.31853040E+04 0.31898420E+04 0.32103979E+04 0.32069109E+04 + 0.32069109E+04 0.32117749E+04 0.32117749E+04 0.32120049E+04 + 0.32120049E+04 0.32052729E+04 0.32052729E+04 0.31982290E+04 + 0.31982290E+04 0.31927100E+04 0.31927100E+04 0.31847180E+04 + 0.31847180E+04 0.31770911E+04 0.31770911E+04 0.31782480E+04 + 0.31782480E+04 0.31838679E+04 0.31838679E+04 0.31920940E+04 + 0.32103979E+04 0.32069109E+04 0.32069109E+04 0.32117749E+04 + 0.32117749E+04 0.32120049E+04 0.32120049E+04 0.32052729E+04 + 0.32052729E+04 0.31982290E+04 0.31982290E+04 0.31927100E+04 + 0.31927100E+04 0.31847180E+04 0.31847180E+04 0.31770911E+04 + 0.31770911E+04 0.31782480E+04 0.31782480E+04 0.31838679E+04 + 0.31838679E+04 0.31920940E+04 0.32071799E+04 0.32057090E+04 + 0.32057090E+04 0.32080869E+04 0.32080869E+04 0.32077141E+04 + 0.32077141E+04 0.32001970E+04 0.32001970E+04 0.31912981E+04 + 0.31912981E+04 0.31864309E+04 0.31864309E+04 0.31830100E+04 + 0.31830100E+04 0.31801990E+04 0.31801990E+04 0.31813550E+04 + 0.31813550E+04 0.31866760E+04 0.31866760E+04 0.31966340E+04 + 0.32071799E+04 0.32057090E+04 0.32057090E+04 0.32080869E+04 + 0.32080869E+04 0.32077141E+04 0.32077141E+04 0.32001970E+04 + 0.32001970E+04 0.31912981E+04 0.31912981E+04 0.31864309E+04 + 0.31864309E+04 0.31830100E+04 0.31830100E+04 0.31801990E+04 + 0.31801990E+04 0.31813550E+04 0.31813550E+04 0.31866760E+04 + 0.30537510E+04 0.30545491E+04 0.32015000E+04 0.31939651E+04 + 0.31939651E+04 0.31954241E+04 0.31954241E+04 0.31967480E+04 + 0.31967480E+04 0.31922029E+04 0.31922029E+04 0.31869050E+04 + 0.31869050E+04 0.31841951E+04 0.31841951E+04 0.31823850E+04 + 0.31823850E+04 0.31823960E+04 0.31823960E+04 0.31840791E+04 + 0.31840791E+04 0.31869041E+04 0.30586121E+04 0.30559519E+04 + 0.32015000E+04 0.31939651E+04 0.31939651E+04 0.31954241E+04 + 0.31954241E+04 0.31967480E+04 0.31967480E+04 0.31922029E+04 + 0.31922029E+04 0.31869050E+04 0.31869050E+04 0.31841951E+04 + 0.31841951E+04 0.31823850E+04 0.31823850E+04 0.31823960E+04 + 0.30938359E+04 0.30908330E+04 0.30908330E+04 0.30897051E+04 + 0.30586121E+04 0.30559519E+04 0.32056411E+04 0.31899170E+04 + 0.31899170E+04 0.31870759E+04 0.31870759E+04 0.31868259E+04 + 0.31868259E+04 0.31851660E+04 0.31851660E+04 0.31830071E+04 + 0.31830071E+04 0.31812881E+04 0.31812881E+04 0.31817339E+04 + 0.31817339E+04 0.31828491E+04 0.30921470E+04 0.30919089E+04 + 0.30919089E+04 0.30906660E+04 0.30582300E+04 0.30557710E+04 + 0.32056411E+04 0.31899170E+04 0.31899170E+04 0.31870759E+04 + 0.31870759E+04 0.31868259E+04 0.31868259E+04 0.31851660E+04 + 0.31851660E+04 0.31830071E+04 0.31830071E+04 0.31812881E+04 + 0.31057520E+04 0.31015591E+04 0.31015591E+04 0.30921470E+04 + 0.30921470E+04 0.30919089E+04 0.30919089E+04 0.30906660E+04 + 0.30582300E+04 0.30557710E+04 0.32069561E+04 0.31922910E+04 + 0.31922910E+04 0.31857451E+04 0.31857451E+04 0.31828911E+04 + 0.31828911E+04 0.31808220E+04 0.31808220E+04 0.31809299E+04 + 0.31809299E+04 0.31804451E+04 0.31072700E+04 0.31044180E+04 + 0.31044180E+04 0.30988440E+04 0.30988440E+04 0.30945930E+04 + 0.30945930E+04 0.30921411E+04 0.30586169E+04 0.30561760E+04 + 0.32069561E+04 0.31922910E+04 0.31922910E+04 0.31857451E+04 + 0.31857451E+04 0.31828911E+04 0.31828911E+04 0.31808220E+04 + 0.31145920E+04 0.31111379E+04 0.31111379E+04 0.31072700E+04 + 0.31072700E+04 0.31044180E+04 0.31044180E+04 0.30988440E+04 + 0.30988440E+04 0.30945930E+04 0.30945930E+04 0.30921411E+04 + 0.30586169E+04 0.30561760E+04 0.32019070E+04 0.31941931E+04 + 0.31941931E+04 0.31870730E+04 0.31870730E+04 0.31851899E+04 + 0.31851899E+04 0.31816809E+04 0.31165049E+04 0.31136460E+04 + 0.31136460E+04 0.31100530E+04 0.31100530E+04 0.31064951E+04 + 0.31064951E+04 0.31011631E+04 0.31011631E+04 0.30955449E+04 + 0.30955449E+04 0.30929390E+04 0.30589761E+04 0.30570720E+04 + 0.32019070E+04 0.31941931E+04 0.31941931E+04 0.31870730E+04 + 0.31257859E+04 0.31219150E+04 0.31219150E+04 0.31165049E+04 + 0.31165049E+04 0.31136460E+04 0.31136460E+04 0.31100530E+04 + 0.31100530E+04 0.31064951E+04 0.31064951E+04 0.31011631E+04 + 0.31011631E+04 0.30955449E+04 0.30955449E+04 0.30929390E+04 + 0.30589761E+04 0.30570720E+04 0.32000530E+04 0.31956541E+04 + 0.31956541E+04 0.31896470E+04 0.31291560E+04 0.31249629E+04 + 0.31249629E+04 0.31190420E+04 0.31190420E+04 0.31139551E+04 + 0.31139551E+04 0.31075181E+04 0.31075181E+04 0.31038831E+04 + 0.31038831E+04 0.31017949E+04 0.31017949E+04 0.30976570E+04 + 0.30976570E+04 0.30937271E+04 0.30598811E+04 0.30576909E+04 + 0.31370930E+04 0.31341089E+04 0.31341089E+04 0.31291560E+04 + 0.31291560E+04 0.31249629E+04 0.31249629E+04 0.31190420E+04 + 0.31190420E+04 0.31139551E+04 0.31139551E+04 0.31075181E+04 + 0.31075181E+04 0.31038831E+04 0.31038831E+04 0.31017949E+04 + 0.31017949E+04 0.30976570E+04 0.30976570E+04 0.30937271E+04 + 0.30937271E+04 0.30911250E+04 0.31388950E+04 0.31368091E+04 + 0.31368091E+04 0.31348430E+04 0.31348430E+04 0.31296399E+04 + 0.31296399E+04 0.31165000E+04 0.31165000E+04 0.31085940E+04 + 0.31085940E+04 0.31038469E+04 0.31038469E+04 0.31029880E+04 + 0.31029880E+04 0.31056631E+04 0.31056631E+04 0.31011809E+04 + 0.31011809E+04 0.30949690E+04 0.30949690E+04 0.30913601E+04 + 0.32138479E+04 0.32122051E+04 0.32122051E+04 0.32149580E+04 + 0.32149580E+04 0.32158291E+04 0.32158291E+04 0.32115701E+04 + 0.32115701E+04 0.32034290E+04 0.32034290E+04 0.32016089E+04 + 0.32016089E+04 0.32057480E+04 0.32057480E+04 0.32087549E+04 + 0.32087549E+04 0.32101270E+04 0.32101270E+04 0.32150149E+04 + 0.32150149E+04 0.32225710E+04 0.32041580E+04 0.32044260E+04 + 0.32044260E+04 0.32094619E+04 0.32094619E+04 0.32110271E+04 + 0.32110271E+04 0.32080061E+04 0.32080061E+04 0.32047451E+04 + 0.32047451E+04 0.32076741E+04 0.32076741E+04 0.32140020E+04 + 0.32140020E+04 0.32168191E+04 0.32168191E+04 0.32192041E+04 + 0.32192041E+04 0.32240220E+04 0.32240220E+04 0.32271731E+04 + 0.32041580E+04 0.32044260E+04 0.32044260E+04 0.32094619E+04 + 0.32094619E+04 0.32110271E+04 0.32110271E+04 0.32080061E+04 + 0.32080061E+04 0.32047451E+04 0.32047451E+04 0.32076741E+04 + 0.32076741E+04 0.32140020E+04 0.32140020E+04 0.32168191E+04 + 0.32168191E+04 0.32192041E+04 0.32192041E+04 0.32240220E+04 + 0.32240220E+04 0.32271731E+04 0.31965371E+04 0.31972480E+04 + 0.31972480E+04 0.32011760E+04 0.32011760E+04 0.31990730E+04 + 0.31990730E+04 0.31959900E+04 0.31959900E+04 0.31966599E+04 + 0.31966599E+04 0.32021990E+04 0.32021990E+04 0.32096741E+04 + 0.32096741E+04 0.32145520E+04 0.32145520E+04 0.32200220E+04 + 0.32200220E+04 0.32257959E+04 0.32257959E+04 0.32265681E+04 + 0.31965371E+04 0.31972480E+04 0.31972480E+04 0.32011760E+04 + 0.32011760E+04 0.31990730E+04 0.31990730E+04 0.31959900E+04 + 0.31959900E+04 0.31966599E+04 0.31966599E+04 0.32021990E+04 + 0.32021990E+04 0.32096741E+04 0.32096741E+04 0.32145520E+04 + 0.32145520E+04 0.32200220E+04 0.32200220E+04 0.32257959E+04 + 0.32257959E+04 0.32265681E+04 0.31841421E+04 0.31767061E+04 + 0.31767061E+04 0.31769741E+04 0.31769741E+04 0.31747781E+04 + 0.31747781E+04 0.31824690E+04 0.31824690E+04 0.31936799E+04 + 0.31936799E+04 0.32024951E+04 0.32024951E+04 0.32077209E+04 + 0.32077209E+04 0.32118521E+04 0.32118521E+04 0.32169199E+04 + 0.32169199E+04 0.32225520E+04 0.32225520E+04 0.32260181E+04 + 0.31841421E+04 0.31767061E+04 0.31767061E+04 0.31769741E+04 + 0.31769741E+04 0.31747781E+04 0.31747781E+04 0.31824690E+04 + 0.31824690E+04 0.31936799E+04 0.31936799E+04 0.32024951E+04 + 0.32024951E+04 0.32077209E+04 0.32077209E+04 0.32118521E+04 + 0.32118521E+04 0.32169199E+04 0.32169199E+04 0.32225520E+04 + 0.32225520E+04 0.32260181E+04 0.31799180E+04 0.31750320E+04 + 0.31750320E+04 0.31775371E+04 0.31775371E+04 0.31784619E+04 + 0.31784619E+04 0.31816321E+04 0.31816321E+04 0.31876331E+04 + 0.31876331E+04 0.31921011E+04 0.31921011E+04 0.31934541E+04 + 0.31934541E+04 0.31989590E+04 0.31989590E+04 0.32093750E+04 + 0.32093750E+04 0.32196599E+04 0.32196599E+04 0.32286121E+04 + 0.31799180E+04 0.31750320E+04 0.31750320E+04 0.31775371E+04 + 0.31775371E+04 0.31784619E+04 0.31784619E+04 0.31816321E+04 + 0.31816321E+04 0.31876331E+04 0.31876331E+04 0.31921011E+04 + 0.31921011E+04 0.31934541E+04 0.31934541E+04 0.31989590E+04 + 0.31989590E+04 0.32093750E+04 0.32093750E+04 0.32196599E+04 + 0.32196599E+04 0.32286121E+04 0.31937461E+04 0.31949551E+04 + 0.31949551E+04 0.31962339E+04 0.31962339E+04 0.31931951E+04 + 0.31931951E+04 0.31849790E+04 0.31849790E+04 0.31799231E+04 + 0.31799231E+04 0.31817610E+04 0.31817610E+04 0.31873611E+04 + 0.31873611E+04 0.31927690E+04 0.31927690E+04 0.32012339E+04 + 0.32012339E+04 0.32134990E+04 0.32134990E+04 0.32258560E+04 + 0.31937461E+04 0.31949551E+04 0.31949551E+04 0.31962339E+04 + 0.31962339E+04 0.31931951E+04 0.31931951E+04 0.31849790E+04 + 0.31849790E+04 0.31799231E+04 0.31799231E+04 0.31817610E+04 + 0.31817610E+04 0.31873611E+04 0.31873611E+04 0.31927690E+04 + 0.31927690E+04 0.32012339E+04 0.32012339E+04 0.32134990E+04 + 0.32134990E+04 0.32258560E+04 0.31912910E+04 0.31992971E+04 + 0.31992971E+04 0.32036179E+04 0.32036179E+04 0.32021060E+04 + 0.32021060E+04 0.31977219E+04 0.31977219E+04 0.31917810E+04 + 0.31917810E+04 0.31900811E+04 0.31900811E+04 0.31884910E+04 + 0.31884910E+04 0.31863511E+04 0.31863511E+04 0.31919399E+04 + 0.31919399E+04 0.32052649E+04 0.32052649E+04 0.32195071E+04 + 0.31912910E+04 0.31992971E+04 0.31992971E+04 0.32036179E+04 + 0.32036179E+04 0.32021060E+04 0.32021060E+04 0.31977219E+04 + 0.31977219E+04 0.31917810E+04 0.31917810E+04 0.31900811E+04 + 0.31900811E+04 0.31884910E+04 0.31884910E+04 0.31863511E+04 + 0.31863511E+04 0.31919399E+04 0.31919399E+04 0.32052649E+04 + 0.32052649E+04 0.32195071E+04 0.31887280E+04 0.31955239E+04 + 0.31955239E+04 0.32019309E+04 0.32019309E+04 0.32013091E+04 + 0.32013091E+04 0.31998181E+04 0.31998181E+04 0.31979929E+04 + 0.31979929E+04 0.31952871E+04 0.31952871E+04 0.31867839E+04 + 0.31867839E+04 0.31819561E+04 0.31819561E+04 0.31846931E+04 + 0.31846931E+04 0.31930830E+04 0.31930830E+04 0.32033679E+04 + 0.31887280E+04 0.31955239E+04 0.31955239E+04 0.32019309E+04 + 0.32019309E+04 0.32013091E+04 0.32013091E+04 0.31998181E+04 + 0.31998181E+04 0.31979929E+04 0.31979929E+04 0.31952871E+04 + 0.31952871E+04 0.31867839E+04 0.31867839E+04 0.31819561E+04 + 0.31819561E+04 0.31846931E+04 0.31846931E+04 0.31930830E+04 + 0.31930830E+04 0.32033679E+04 0.31983040E+04 0.31986189E+04 + 0.31986189E+04 0.32064590E+04 0.32064590E+04 0.32071670E+04 + 0.32071670E+04 0.32011641E+04 0.32011641E+04 0.31971860E+04 + 0.31971860E+04 0.31940681E+04 0.31940681E+04 0.31863931E+04 + 0.31863931E+04 0.31789790E+04 0.31789790E+04 0.31810249E+04 + 0.31810249E+04 0.31857161E+04 0.31857161E+04 0.31902310E+04 + 0.31983040E+04 0.31986189E+04 0.31986189E+04 0.32064590E+04 + 0.32064590E+04 0.32071670E+04 0.32071670E+04 0.32011641E+04 + 0.32011641E+04 0.31971860E+04 0.31971860E+04 0.31940681E+04 + 0.31940681E+04 0.31863931E+04 0.31863931E+04 0.31789790E+04 + 0.31789790E+04 0.31810249E+04 0.31810249E+04 0.31857161E+04 + 0.31857161E+04 0.31902310E+04 0.32110090E+04 0.32073711E+04 + 0.32073711E+04 0.32122310E+04 0.32122310E+04 0.32125249E+04 + 0.32125249E+04 0.32058311E+04 0.32058311E+04 0.31987739E+04 + 0.31987739E+04 0.31932280E+04 0.31932280E+04 0.31852629E+04 + 0.31852629E+04 0.31775879E+04 0.31775879E+04 0.31787830E+04 + 0.31787830E+04 0.31845000E+04 0.31845000E+04 0.31928230E+04 + 0.32110090E+04 0.32073711E+04 0.32073711E+04 0.32122310E+04 + 0.32122310E+04 0.32125249E+04 0.32125249E+04 0.32058311E+04 + 0.32058311E+04 0.31987739E+04 0.31987739E+04 0.31932280E+04 + 0.31932280E+04 0.31852629E+04 0.31852629E+04 0.31775879E+04 + 0.31775879E+04 0.31787830E+04 0.31787830E+04 0.31845000E+04 + 0.31845000E+04 0.31928230E+04 0.32078491E+04 0.32062590E+04 + 0.32062590E+04 0.32086121E+04 0.32086121E+04 0.32082981E+04 + 0.32082981E+04 0.32008191E+04 0.32008191E+04 0.31919419E+04 + 0.31919419E+04 0.31870420E+04 0.31870420E+04 0.31837480E+04 + 0.31837480E+04 0.31811001E+04 0.31811001E+04 0.31823760E+04 + 0.31823760E+04 0.31875481E+04 0.31875481E+04 0.31974751E+04 + 0.32078491E+04 0.32062590E+04 0.32062590E+04 0.32086121E+04 + 0.32086121E+04 0.32082981E+04 0.32082981E+04 0.32008191E+04 + 0.32008191E+04 0.31919419E+04 0.31919419E+04 0.31870420E+04 + 0.31870420E+04 0.31837480E+04 0.31837480E+04 0.31811001E+04 + 0.31811001E+04 0.31823760E+04 0.31823760E+04 0.31875481E+04 + 0.30540559E+04 0.30549180E+04 0.32022051E+04 0.31945249E+04 + 0.31945249E+04 0.31959209E+04 0.31959209E+04 0.31973550E+04 + 0.31973550E+04 0.31929270E+04 0.31929270E+04 0.31877620E+04 + 0.31877620E+04 0.31851560E+04 0.31851560E+04 0.31835049E+04 + 0.31835049E+04 0.31834209E+04 0.31834209E+04 0.31851650E+04 + 0.31851650E+04 0.31880581E+04 0.30589221E+04 0.30563130E+04 + 0.32022051E+04 0.31945249E+04 0.31945249E+04 0.31959209E+04 + 0.31959209E+04 0.31973550E+04 0.31973550E+04 0.31929270E+04 + 0.31929270E+04 0.31877620E+04 0.31877620E+04 0.31851560E+04 + 0.31851560E+04 0.31835049E+04 0.31835049E+04 0.31834209E+04 + 0.30945940E+04 0.30916140E+04 0.30916140E+04 0.30905100E+04 + 0.30589221E+04 0.30563130E+04 0.32064380E+04 0.31905500E+04 + 0.31905500E+04 0.31876880E+04 0.31876880E+04 0.31875820E+04 + 0.31875820E+04 0.31861060E+04 0.31861060E+04 0.31841160E+04 + 0.31841160E+04 0.31822971E+04 0.31822971E+04 0.31828110E+04 + 0.31828110E+04 0.31840681E+04 0.30928140E+04 0.30926790E+04 + 0.30926790E+04 0.30914951E+04 0.30585591E+04 0.30561179E+04 + 0.32064380E+04 0.31905500E+04 0.31905500E+04 0.31876880E+04 + 0.31876880E+04 0.31875820E+04 0.31875820E+04 0.31861060E+04 + 0.31861060E+04 0.31841160E+04 0.31841160E+04 0.31822971E+04 + 0.31064380E+04 0.31022710E+04 0.31022710E+04 0.30928140E+04 + 0.30928140E+04 0.30926790E+04 0.30926790E+04 0.30914951E+04 + 0.30585591E+04 0.30561179E+04 0.32078240E+04 0.31931069E+04 + 0.31931069E+04 0.31865920E+04 0.31865920E+04 0.31836899E+04 + 0.31836899E+04 0.31816851E+04 0.31816851E+04 0.31819590E+04 + 0.31819590E+04 0.31815449E+04 0.31079380E+04 0.31051479E+04 + 0.31051479E+04 0.30996411E+04 0.30996411E+04 0.30954109E+04 + 0.30954109E+04 0.30929880E+04 0.30589690E+04 0.30565581E+04 + 0.32078240E+04 0.31931069E+04 0.31931069E+04 0.31865920E+04 + 0.31865920E+04 0.31836899E+04 0.31836899E+04 0.31816851E+04 + 0.31152190E+04 0.31117739E+04 0.31117739E+04 0.31079380E+04 + 0.31079380E+04 0.31051479E+04 0.31051479E+04 0.30996411E+04 + 0.30996411E+04 0.30954109E+04 0.30954109E+04 0.30929880E+04 + 0.30589690E+04 0.30565581E+04 0.32028110E+04 0.31950139E+04 + 0.31950139E+04 0.31878521E+04 0.31878521E+04 0.31860200E+04 + 0.31860200E+04 0.31825349E+04 0.31171570E+04 0.31143301E+04 + 0.31143301E+04 0.31107161E+04 0.31107161E+04 0.31071750E+04 + 0.31071750E+04 0.31018799E+04 0.31018799E+04 0.30963999E+04 + 0.30963999E+04 0.30937930E+04 0.30593540E+04 0.30574839E+04 + 0.32028110E+04 0.31950139E+04 0.31950139E+04 0.31878521E+04 + 0.31264331E+04 0.31225640E+04 0.31225640E+04 0.31171570E+04 + 0.31171570E+04 0.31143301E+04 0.31143301E+04 0.31107161E+04 + 0.31107161E+04 0.31071750E+04 0.31071750E+04 0.31018799E+04 + 0.31018799E+04 0.30963999E+04 0.30963999E+04 0.30937930E+04 + 0.30593540E+04 0.30574839E+04 0.32007959E+04 0.31964580E+04 + 0.31964580E+04 0.31904290E+04 0.31298201E+04 0.31256760E+04 + 0.31256760E+04 0.31197361E+04 0.31197361E+04 0.31146221E+04 + 0.31146221E+04 0.31081721E+04 0.31081721E+04 0.31045669E+04 + 0.31045669E+04 0.31025100E+04 0.31025100E+04 0.30984490E+04 + 0.30984490E+04 0.30945669E+04 0.30602781E+04 0.30581230E+04 + 0.31378181E+04 0.31348159E+04 0.31348159E+04 0.31298201E+04 + 0.31298201E+04 0.31256760E+04 0.31256760E+04 0.31197361E+04 + 0.31197361E+04 0.31146221E+04 0.31146221E+04 0.31081721E+04 + 0.31081721E+04 0.31045669E+04 0.31045669E+04 0.31025100E+04 + 0.31025100E+04 0.30984490E+04 0.30984490E+04 0.30945669E+04 + 0.30945669E+04 0.30920200E+04 0.31396221E+04 0.31375581E+04 + 0.31375581E+04 0.31355181E+04 0.31355181E+04 0.31302681E+04 + 0.31302681E+04 0.31171670E+04 0.31171670E+04 0.31092141E+04 + 0.31092141E+04 0.31044600E+04 0.31044600E+04 0.31036021E+04 + 0.31036021E+04 0.31063870E+04 0.31063870E+04 0.31019551E+04 + 0.31019551E+04 0.30958191E+04 0.30958191E+04 0.30922390E+04 + 0.32138479E+04 0.32122051E+04 0.32122051E+04 0.32149580E+04 + 0.32149580E+04 0.32158291E+04 0.32158291E+04 0.32115701E+04 + 0.32115701E+04 0.32034290E+04 0.32034290E+04 0.32016089E+04 + 0.32016089E+04 0.32057480E+04 0.32057480E+04 0.32087549E+04 + 0.32087549E+04 0.32101270E+04 0.32101270E+04 0.32150149E+04 + 0.32150149E+04 0.32225710E+04 0.32041580E+04 0.32044260E+04 + 0.32044260E+04 0.32094619E+04 0.32094619E+04 0.32110271E+04 + 0.32110271E+04 0.32080061E+04 0.32080061E+04 0.32047451E+04 + 0.32047451E+04 0.32076741E+04 0.32076741E+04 0.32140020E+04 + 0.32140020E+04 0.32168191E+04 0.32168191E+04 0.32192041E+04 + 0.32192041E+04 0.32240220E+04 0.32240220E+04 0.32271731E+04 + 0.32041580E+04 0.32044260E+04 0.32044260E+04 0.32094619E+04 + 0.32094619E+04 0.32110271E+04 0.32110271E+04 0.32080061E+04 + 0.32080061E+04 0.32047451E+04 0.32047451E+04 0.32076741E+04 + 0.32076741E+04 0.32140020E+04 0.32140020E+04 0.32168191E+04 + 0.32168191E+04 0.32192041E+04 0.32192041E+04 0.32240220E+04 + 0.32240220E+04 0.32271731E+04 0.31965371E+04 0.31972480E+04 + 0.31972480E+04 0.32011760E+04 0.32011760E+04 0.31990730E+04 + 0.31990730E+04 0.31959900E+04 0.31959900E+04 0.31966599E+04 + 0.31966599E+04 0.32021990E+04 0.32021990E+04 0.32096741E+04 + 0.32096741E+04 0.32145520E+04 0.32145520E+04 0.32200220E+04 + 0.32200220E+04 0.32257959E+04 0.32257959E+04 0.32265681E+04 + 0.31965371E+04 0.31972480E+04 0.31972480E+04 0.32011760E+04 + 0.32011760E+04 0.31990730E+04 0.31990730E+04 0.31959900E+04 + 0.31959900E+04 0.31966599E+04 0.31966599E+04 0.32021990E+04 + 0.32021990E+04 0.32096741E+04 0.32096741E+04 0.32145520E+04 + 0.32145520E+04 0.32200220E+04 0.32200220E+04 0.32257959E+04 + 0.32257959E+04 0.32265681E+04 0.31841421E+04 0.31767061E+04 + 0.31767061E+04 0.31769741E+04 0.31769741E+04 0.31747781E+04 + 0.31747781E+04 0.31824690E+04 0.31824690E+04 0.31936799E+04 + 0.31936799E+04 0.32024951E+04 0.32024951E+04 0.32077209E+04 + 0.32077209E+04 0.32118521E+04 0.32118521E+04 0.32169199E+04 + 0.32169199E+04 0.32225520E+04 0.32225520E+04 0.32260181E+04 + 0.31841421E+04 0.31767061E+04 0.31767061E+04 0.31769741E+04 + 0.31769741E+04 0.31747781E+04 0.31747781E+04 0.31824690E+04 + 0.31824690E+04 0.31936799E+04 0.31936799E+04 0.32024951E+04 + 0.32024951E+04 0.32077209E+04 0.32077209E+04 0.32118521E+04 + 0.32118521E+04 0.32169199E+04 0.32169199E+04 0.32225520E+04 + 0.32225520E+04 0.32260181E+04 0.31799180E+04 0.31750320E+04 + 0.31750320E+04 0.31775371E+04 0.31775371E+04 0.31784619E+04 + 0.31784619E+04 0.31816321E+04 0.31816321E+04 0.31876331E+04 + 0.31876331E+04 0.31921011E+04 0.31921011E+04 0.31934541E+04 + 0.31934541E+04 0.31989590E+04 0.31989590E+04 0.32093750E+04 + 0.32093750E+04 0.32196599E+04 0.32196599E+04 0.32286121E+04 + 0.31799180E+04 0.31750320E+04 0.31750320E+04 0.31775371E+04 + 0.31775371E+04 0.31784619E+04 0.31784619E+04 0.31816321E+04 + 0.31816321E+04 0.31876331E+04 0.31876331E+04 0.31921011E+04 + 0.31921011E+04 0.31934541E+04 0.31934541E+04 0.31989590E+04 + 0.31989590E+04 0.32093750E+04 0.32093750E+04 0.32196599E+04 + 0.32196599E+04 0.32286121E+04 0.31937461E+04 0.31949551E+04 + 0.31949551E+04 0.31962339E+04 0.31962339E+04 0.31931951E+04 + 0.31931951E+04 0.31849790E+04 0.31849790E+04 0.31799231E+04 + 0.31799231E+04 0.31817610E+04 0.31817610E+04 0.31873611E+04 + 0.31873611E+04 0.31927690E+04 0.31927690E+04 0.32012339E+04 + 0.32012339E+04 0.32134990E+04 0.32134990E+04 0.32258560E+04 + 0.31937461E+04 0.31949551E+04 0.31949551E+04 0.31962339E+04 + 0.31962339E+04 0.31931951E+04 0.31931951E+04 0.31849790E+04 + 0.31849790E+04 0.31799231E+04 0.31799231E+04 0.31817610E+04 + 0.31817610E+04 0.31873611E+04 0.31873611E+04 0.31927690E+04 + 0.31927690E+04 0.32012339E+04 0.32012339E+04 0.32134990E+04 + 0.32134990E+04 0.32258560E+04 0.31912910E+04 0.31992971E+04 + 0.31992971E+04 0.32036179E+04 0.32036179E+04 0.32021060E+04 + 0.32021060E+04 0.31977219E+04 0.31977219E+04 0.31917810E+04 + 0.31917810E+04 0.31900811E+04 0.31900811E+04 0.31884910E+04 + 0.31884910E+04 0.31863511E+04 0.31863511E+04 0.31919399E+04 + 0.31919399E+04 0.32052649E+04 0.32052649E+04 0.32195071E+04 + 0.31912910E+04 0.31992971E+04 0.31992971E+04 0.32036179E+04 + 0.32036179E+04 0.32021060E+04 0.32021060E+04 0.31977219E+04 + 0.31977219E+04 0.31917810E+04 0.31917810E+04 0.31900811E+04 + 0.31900811E+04 0.31884910E+04 0.31884910E+04 0.31863511E+04 + 0.31863511E+04 0.31919399E+04 0.31919399E+04 0.32052649E+04 + 0.32052649E+04 0.32195071E+04 0.31887280E+04 0.31955239E+04 + 0.31955239E+04 0.32019309E+04 0.32019309E+04 0.32013091E+04 + 0.32013091E+04 0.31998181E+04 0.31998181E+04 0.31979929E+04 + 0.31979929E+04 0.31952871E+04 0.31952871E+04 0.31867839E+04 + 0.31867839E+04 0.31819561E+04 0.31819561E+04 0.31846931E+04 + 0.31846931E+04 0.31930830E+04 0.31930830E+04 0.32033679E+04 + 0.31887280E+04 0.31955239E+04 0.31955239E+04 0.32019309E+04 + 0.32019309E+04 0.32013091E+04 0.32013091E+04 0.31998181E+04 + 0.31998181E+04 0.31979929E+04 0.31979929E+04 0.31952871E+04 + 0.31952871E+04 0.31867839E+04 0.31867839E+04 0.31819561E+04 + 0.31819561E+04 0.31846931E+04 0.31846931E+04 0.31930830E+04 + 0.31930830E+04 0.32033679E+04 0.31983040E+04 0.31986189E+04 + 0.31986189E+04 0.32064590E+04 0.32064590E+04 0.32071670E+04 + 0.32071670E+04 0.32011641E+04 0.32011641E+04 0.31971860E+04 + 0.31971860E+04 0.31940681E+04 0.31940681E+04 0.31863931E+04 + 0.31863931E+04 0.31789790E+04 0.31789790E+04 0.31810249E+04 + 0.31810249E+04 0.31857161E+04 0.31857161E+04 0.31902310E+04 + 0.31983040E+04 0.31986189E+04 0.31986189E+04 0.32064590E+04 + 0.32064590E+04 0.32071670E+04 0.32071670E+04 0.32011641E+04 + 0.32011641E+04 0.31971860E+04 0.31971860E+04 0.31940681E+04 + 0.31940681E+04 0.31863931E+04 0.31863931E+04 0.31789790E+04 + 0.31789790E+04 0.31810249E+04 0.31810249E+04 0.31857161E+04 + 0.31857161E+04 0.31902310E+04 0.32110090E+04 0.32073711E+04 + 0.32073711E+04 0.32122310E+04 0.32122310E+04 0.32125249E+04 + 0.32125249E+04 0.32058311E+04 0.32058311E+04 0.31987739E+04 + 0.31987739E+04 0.31932280E+04 0.31932280E+04 0.31852629E+04 + 0.31852629E+04 0.31775879E+04 0.31775879E+04 0.31787830E+04 + 0.31787830E+04 0.31845000E+04 0.31845000E+04 0.31928230E+04 + 0.32110090E+04 0.32073711E+04 0.32073711E+04 0.32122310E+04 + 0.32122310E+04 0.32125249E+04 0.32125249E+04 0.32058311E+04 + 0.32058311E+04 0.31987739E+04 0.31987739E+04 0.31932280E+04 + 0.31932280E+04 0.31852629E+04 0.31852629E+04 0.31775879E+04 + 0.31775879E+04 0.31787830E+04 0.31787830E+04 0.31845000E+04 + 0.31845000E+04 0.31928230E+04 0.32078491E+04 0.32062590E+04 + 0.32062590E+04 0.32086121E+04 0.32086121E+04 0.32082981E+04 + 0.32082981E+04 0.32008191E+04 0.32008191E+04 0.31919419E+04 + 0.31919419E+04 0.31870420E+04 0.31870420E+04 0.31837480E+04 + 0.31837480E+04 0.31811001E+04 0.31811001E+04 0.31823760E+04 + 0.31823760E+04 0.31875481E+04 0.31875481E+04 0.31974751E+04 + 0.32078491E+04 0.32062590E+04 0.32062590E+04 0.32086121E+04 + 0.32086121E+04 0.32082981E+04 0.32082981E+04 0.32008191E+04 + 0.32008191E+04 0.31919419E+04 0.31919419E+04 0.31870420E+04 + 0.31870420E+04 0.31837480E+04 0.31837480E+04 0.31811001E+04 + 0.31811001E+04 0.31823760E+04 0.31823760E+04 0.31875481E+04 + 0.30540559E+04 0.30549180E+04 0.32022051E+04 0.31945249E+04 + 0.31945249E+04 0.31959209E+04 0.31959209E+04 0.31973550E+04 + 0.31973550E+04 0.31929270E+04 0.31929270E+04 0.31877620E+04 + 0.31877620E+04 0.31851560E+04 0.31851560E+04 0.31835049E+04 + 0.31835049E+04 0.31834209E+04 0.31834209E+04 0.31851650E+04 + 0.31851650E+04 0.31880581E+04 0.30589221E+04 0.30563130E+04 + 0.32022051E+04 0.31945249E+04 0.31945249E+04 0.31959209E+04 + 0.31959209E+04 0.31973550E+04 0.31973550E+04 0.31929270E+04 + 0.31929270E+04 0.31877620E+04 0.31877620E+04 0.31851560E+04 + 0.31851560E+04 0.31835049E+04 0.31835049E+04 0.31834209E+04 + 0.30945940E+04 0.30916140E+04 0.30916140E+04 0.30905100E+04 + 0.30589221E+04 0.30563130E+04 0.32064380E+04 0.31905500E+04 + 0.31905500E+04 0.31876880E+04 0.31876880E+04 0.31875820E+04 + 0.31875820E+04 0.31861060E+04 0.31861060E+04 0.31841160E+04 + 0.31841160E+04 0.31822971E+04 0.31822971E+04 0.31828110E+04 + 0.31828110E+04 0.31840681E+04 0.30928140E+04 0.30926790E+04 + 0.30926790E+04 0.30914951E+04 0.30585591E+04 0.30561179E+04 + 0.32064380E+04 0.31905500E+04 0.31905500E+04 0.31876880E+04 + 0.31876880E+04 0.31875820E+04 0.31875820E+04 0.31861060E+04 + 0.31861060E+04 0.31841160E+04 0.31841160E+04 0.31822971E+04 + 0.31064380E+04 0.31022710E+04 0.31022710E+04 0.30928140E+04 + 0.30928140E+04 0.30926790E+04 0.30926790E+04 0.30914951E+04 + 0.30585591E+04 0.30561179E+04 0.32078240E+04 0.31931069E+04 + 0.31931069E+04 0.31865920E+04 0.31865920E+04 0.31836899E+04 + 0.31836899E+04 0.31816851E+04 0.31816851E+04 0.31819590E+04 + 0.31819590E+04 0.31815449E+04 0.31079380E+04 0.31051479E+04 + 0.31051479E+04 0.30996411E+04 0.30996411E+04 0.30954109E+04 + 0.30954109E+04 0.30929880E+04 0.30589690E+04 0.30565581E+04 + 0.32078240E+04 0.31931069E+04 0.31931069E+04 0.31865920E+04 + 0.31865920E+04 0.31836899E+04 0.31836899E+04 0.31816851E+04 + 0.31152190E+04 0.31117739E+04 0.31117739E+04 0.31079380E+04 + 0.31079380E+04 0.31051479E+04 0.31051479E+04 0.30996411E+04 + 0.30996411E+04 0.30954109E+04 0.30954109E+04 0.30929880E+04 + 0.30589690E+04 0.30565581E+04 0.32028110E+04 0.31950139E+04 + 0.31950139E+04 0.31878521E+04 0.31878521E+04 0.31860200E+04 + 0.31860200E+04 0.31825349E+04 0.31171570E+04 0.31143301E+04 + 0.31143301E+04 0.31107161E+04 0.31107161E+04 0.31071750E+04 + 0.31071750E+04 0.31018799E+04 0.31018799E+04 0.30963999E+04 + 0.30963999E+04 0.30937930E+04 0.30593540E+04 0.30574839E+04 + 0.32028110E+04 0.31950139E+04 0.31950139E+04 0.31878521E+04 + 0.31264331E+04 0.31225640E+04 0.31225640E+04 0.31171570E+04 + 0.31171570E+04 0.31143301E+04 0.31143301E+04 0.31107161E+04 + 0.31107161E+04 0.31071750E+04 0.31071750E+04 0.31018799E+04 + 0.31018799E+04 0.30963999E+04 0.30963999E+04 0.30937930E+04 + 0.30593540E+04 0.30574839E+04 0.32007959E+04 0.31964580E+04 + 0.31964580E+04 0.31904290E+04 0.31298201E+04 0.31256760E+04 + 0.31256760E+04 0.31197361E+04 0.31197361E+04 0.31146221E+04 + 0.31146221E+04 0.31081721E+04 0.31081721E+04 0.31045669E+04 + 0.31045669E+04 0.31025100E+04 0.31025100E+04 0.30984490E+04 + 0.30984490E+04 0.30945669E+04 0.30602781E+04 0.30581230E+04 + 0.31378181E+04 0.31348159E+04 0.31348159E+04 0.31298201E+04 + 0.31298201E+04 0.31256760E+04 0.31256760E+04 0.31197361E+04 + 0.31197361E+04 0.31146221E+04 0.31146221E+04 0.31081721E+04 + 0.31081721E+04 0.31045669E+04 0.31045669E+04 0.31025100E+04 + 0.31025100E+04 0.30984490E+04 0.30984490E+04 0.30945669E+04 + 0.30945669E+04 0.30920200E+04 0.31396221E+04 0.31375581E+04 + 0.31375581E+04 0.31355181E+04 0.31355181E+04 0.31302681E+04 + 0.31302681E+04 0.31171670E+04 0.31171670E+04 0.31092141E+04 + 0.31092141E+04 0.31044600E+04 0.31044600E+04 0.31036021E+04 + 0.31036021E+04 0.31063870E+04 0.31063870E+04 0.31019551E+04 + 0.31019551E+04 0.30958191E+04 0.30958191E+04 0.30922390E+04 + 0.32149680E+04 0.32132219E+04 0.32132219E+04 0.32159790E+04 + 0.32159790E+04 0.32168960E+04 0.32168960E+04 0.32126819E+04 + 0.32126819E+04 0.32044910E+04 0.32044910E+04 0.32025439E+04 + 0.32025439E+04 0.32065940E+04 0.32065940E+04 0.32096560E+04 + 0.32096560E+04 0.32110510E+04 0.32110510E+04 0.32159351E+04 + 0.32159351E+04 0.32235259E+04 0.32053110E+04 0.32054380E+04 + 0.32054380E+04 0.32105029E+04 0.32105029E+04 0.32121470E+04 + 0.32121470E+04 0.32091450E+04 0.32091450E+04 0.32058149E+04 + 0.32058149E+04 0.32086240E+04 0.32086240E+04 0.32149470E+04 + 0.32149470E+04 0.32178660E+04 0.32178660E+04 0.32202219E+04 + 0.32202219E+04 0.32250520E+04 0.32250520E+04 0.32281289E+04 + 0.32053110E+04 0.32054380E+04 0.32054380E+04 0.32105029E+04 + 0.32105029E+04 0.32121470E+04 0.32121470E+04 0.32091450E+04 + 0.32091450E+04 0.32058149E+04 0.32058149E+04 0.32086240E+04 + 0.32086240E+04 0.32149470E+04 0.32149470E+04 0.32178660E+04 + 0.32178660E+04 0.32202219E+04 0.32202219E+04 0.32250520E+04 + 0.32250520E+04 0.32281289E+04 0.31977241E+04 0.31983350E+04 + 0.31983350E+04 0.32023220E+04 0.32023220E+04 0.32002690E+04 + 0.32002690E+04 0.31970710E+04 0.31970710E+04 0.31975859E+04 + 0.31975859E+04 0.32030320E+04 0.32030320E+04 0.32105249E+04 + 0.32105249E+04 0.32154761E+04 0.32154761E+04 0.32209500E+04 + 0.32209500E+04 0.32268000E+04 0.32268000E+04 0.32274390E+04 + 0.31977241E+04 0.31983350E+04 0.31983350E+04 0.32023220E+04 + 0.32023220E+04 0.32002690E+04 0.32002690E+04 0.31970710E+04 + 0.31970710E+04 0.31975859E+04 0.31975859E+04 0.32030320E+04 + 0.32030320E+04 0.32105249E+04 0.32105249E+04 0.32154761E+04 + 0.32154761E+04 0.32209500E+04 0.32209500E+04 0.32268000E+04 + 0.32268000E+04 0.32274390E+04 0.31852639E+04 0.31777229E+04 + 0.31777229E+04 0.31780020E+04 0.31780020E+04 0.31756089E+04 + 0.31756089E+04 0.31831470E+04 0.31831470E+04 0.31943110E+04 + 0.31943110E+04 0.32031680E+04 0.32031680E+04 0.32084980E+04 + 0.32084980E+04 0.32126819E+04 0.32126819E+04 0.32176970E+04 + 0.32176970E+04 0.32232549E+04 0.32232549E+04 0.32265840E+04 + 0.31852639E+04 0.31777229E+04 0.31777229E+04 0.31780020E+04 + 0.31780020E+04 0.31756089E+04 0.31756089E+04 0.31831470E+04 + 0.31831470E+04 0.31943110E+04 0.31943110E+04 0.32031680E+04 + 0.32031680E+04 0.32084980E+04 0.32084980E+04 0.32126819E+04 + 0.32126819E+04 0.32176970E+04 0.32176970E+04 0.32232549E+04 + 0.32232549E+04 0.32265840E+04 0.31804700E+04 0.31755769E+04 + 0.31755769E+04 0.31781431E+04 0.31781431E+04 0.31790920E+04 + 0.31790920E+04 0.31822700E+04 0.31822700E+04 0.31882949E+04 + 0.31882949E+04 0.31927520E+04 0.31927520E+04 0.31940659E+04 + 0.31940659E+04 0.31994839E+04 0.31994839E+04 0.32098811E+04 + 0.32098811E+04 0.32201399E+04 0.32201399E+04 0.32290740E+04 + 0.31804700E+04 0.31755769E+04 0.31755769E+04 0.31781431E+04 + 0.31781431E+04 0.31790920E+04 0.31790920E+04 0.31822700E+04 + 0.31822700E+04 0.31882949E+04 0.31882949E+04 0.31927520E+04 + 0.31927520E+04 0.31940659E+04 0.31940659E+04 0.31994839E+04 + 0.31994839E+04 0.32098811E+04 0.32098811E+04 0.32201399E+04 + 0.32201399E+04 0.32290740E+04 0.31942690E+04 0.31954480E+04 + 0.31954480E+04 0.31967590E+04 0.31967590E+04 0.31937771E+04 + 0.31937771E+04 0.31855349E+04 0.31855349E+04 0.31804009E+04 + 0.31804009E+04 0.31821890E+04 0.31821890E+04 0.31878159E+04 + 0.31878159E+04 0.31932461E+04 0.31932461E+04 0.32016499E+04 + 0.32016499E+04 0.32139099E+04 0.32139099E+04 0.32262820E+04 + 0.31942690E+04 0.31954480E+04 0.31954480E+04 0.31967590E+04 + 0.31967590E+04 0.31937771E+04 0.31937771E+04 0.31855349E+04 + 0.31855349E+04 0.31804009E+04 0.31804009E+04 0.31821890E+04 + 0.31821890E+04 0.31878159E+04 0.31878159E+04 0.31932461E+04 + 0.31932461E+04 0.32016499E+04 0.32016499E+04 0.32139099E+04 + 0.32139099E+04 0.32262820E+04 0.31917791E+04 0.31997581E+04 + 0.31997581E+04 0.32041499E+04 0.32041499E+04 0.32026819E+04 + 0.32026819E+04 0.31982749E+04 0.31982749E+04 0.31922500E+04 + 0.31922500E+04 0.31905249E+04 0.31905249E+04 0.31889780E+04 + 0.31889780E+04 0.31867791E+04 0.31867791E+04 0.31922900E+04 + 0.31922900E+04 0.32056731E+04 0.32056731E+04 0.32200161E+04 + 0.31917791E+04 0.31997581E+04 0.31997581E+04 0.32041499E+04 + 0.32041499E+04 0.32026819E+04 0.32026819E+04 0.31982749E+04 + 0.31982749E+04 0.31922500E+04 0.31922500E+04 0.31905249E+04 + 0.31905249E+04 0.31889780E+04 0.31889780E+04 0.31867791E+04 + 0.31867791E+04 0.31922900E+04 0.31922900E+04 0.32056731E+04 + 0.32056731E+04 0.32200161E+04 0.31891951E+04 0.31959360E+04 + 0.31959360E+04 0.32024290E+04 0.32024290E+04 0.32018301E+04 + 0.32018301E+04 0.32003311E+04 0.32003311E+04 0.31984780E+04 + 0.31984780E+04 0.31958020E+04 0.31958020E+04 0.31873101E+04 + 0.31873101E+04 0.31824080E+04 0.31824080E+04 0.31850791E+04 + 0.31850791E+04 0.31934980E+04 0.31934980E+04 0.32039009E+04 + 0.31891951E+04 0.31959360E+04 0.31959360E+04 0.32024290E+04 + 0.32024290E+04 0.32018301E+04 0.32018301E+04 0.32003311E+04 + 0.32003311E+04 0.31984780E+04 0.31984780E+04 0.31958020E+04 + 0.31958020E+04 0.31873101E+04 0.31873101E+04 0.31824080E+04 + 0.31824080E+04 0.31850791E+04 0.31850791E+04 0.31934980E+04 + 0.31934980E+04 0.32039009E+04 0.31988130E+04 0.31990061E+04 + 0.31990061E+04 0.32068911E+04 0.32068911E+04 0.32076870E+04 + 0.32076870E+04 0.32016689E+04 0.32016689E+04 0.31976670E+04 + 0.31976670E+04 0.31945720E+04 0.31945720E+04 0.31869451E+04 + 0.31869451E+04 0.31794561E+04 0.31794561E+04 0.31814319E+04 + 0.31814319E+04 0.31861289E+04 0.31861289E+04 0.31906211E+04 + 0.31988130E+04 0.31990061E+04 0.31990061E+04 0.32068911E+04 + 0.32068911E+04 0.32076870E+04 0.32076870E+04 0.32016689E+04 + 0.32016689E+04 0.31976670E+04 0.31976670E+04 0.31945720E+04 + 0.31945720E+04 0.31869451E+04 0.31869451E+04 0.31794561E+04 + 0.31794561E+04 0.31814319E+04 0.31814319E+04 0.31861289E+04 + 0.31861289E+04 0.31906211E+04 0.32116201E+04 0.32078301E+04 + 0.32078301E+04 0.32126880E+04 0.32126880E+04 0.32130449E+04 + 0.32130449E+04 0.32063889E+04 0.32063889E+04 0.31993201E+04 + 0.31993201E+04 0.31937451E+04 0.31937451E+04 0.31858081E+04 + 0.31858081E+04 0.31780840E+04 0.31780840E+04 0.31793169E+04 + 0.31793169E+04 0.31851311E+04 0.31851311E+04 0.31935520E+04 + 0.32116201E+04 0.32078301E+04 0.32078301E+04 0.32126880E+04 + 0.32126880E+04 0.32130449E+04 0.32130449E+04 0.32063889E+04 + 0.32063889E+04 0.31993201E+04 0.31993201E+04 0.31937451E+04 + 0.31937451E+04 0.31858081E+04 0.31858081E+04 0.31780840E+04 + 0.31780840E+04 0.31793169E+04 0.31793169E+04 0.31851311E+04 + 0.31851311E+04 0.31935520E+04 0.32085181E+04 0.32068091E+04 + 0.32068091E+04 0.32091370E+04 0.32091370E+04 0.32088831E+04 + 0.32088831E+04 0.32014419E+04 0.32014419E+04 0.31925869E+04 + 0.31925869E+04 0.31876521E+04 0.31876521E+04 0.31844861E+04 + 0.31844861E+04 0.31820010E+04 0.31820010E+04 0.31833970E+04 + 0.31833970E+04 0.31884199E+04 0.31884199E+04 0.31983169E+04 + 0.32085181E+04 0.32068091E+04 0.32068091E+04 0.32091370E+04 + 0.32091370E+04 0.32088831E+04 0.32088831E+04 0.32014419E+04 + 0.32014419E+04 0.31925869E+04 0.31925869E+04 0.31876521E+04 + 0.31876521E+04 0.31844861E+04 0.31844861E+04 0.31820010E+04 + 0.31820010E+04 0.31833970E+04 0.31833970E+04 0.31884199E+04 + 0.30543601E+04 0.30552881E+04 0.32029099E+04 0.31950850E+04 + 0.31950850E+04 0.31964170E+04 0.31964170E+04 0.31979629E+04 + 0.31979629E+04 0.31936531E+04 0.31936531E+04 0.31886189E+04 + 0.31886189E+04 0.31861169E+04 0.31861169E+04 0.31846240E+04 + 0.31846240E+04 0.31844470E+04 0.31844470E+04 0.31862510E+04 + 0.31862510E+04 0.31892119E+04 0.30592319E+04 0.30566741E+04 + 0.32029099E+04 0.31950850E+04 0.31950850E+04 0.31964170E+04 + 0.31964170E+04 0.31979629E+04 0.31979629E+04 0.31936531E+04 + 0.31936531E+04 0.31886189E+04 0.31886189E+04 0.31861169E+04 + 0.31861169E+04 0.31846240E+04 0.31846240E+04 0.31844470E+04 + 0.30953511E+04 0.30923950E+04 0.30923950E+04 0.30913159E+04 + 0.30592319E+04 0.30566741E+04 0.32072351E+04 0.31911819E+04 + 0.31911819E+04 0.31883000E+04 0.31883000E+04 0.31883379E+04 + 0.31883379E+04 0.31870471E+04 0.31870471E+04 0.31852251E+04 + 0.31852251E+04 0.31833069E+04 0.31833069E+04 0.31838870E+04 + 0.31838870E+04 0.31852881E+04 0.30934810E+04 0.30934500E+04 + 0.30934500E+04 0.30923250E+04 0.30588879E+04 0.30564651E+04 + 0.32072351E+04 0.31911819E+04 0.31911819E+04 0.31883000E+04 + 0.31883000E+04 0.31883379E+04 0.31883379E+04 0.31870471E+04 + 0.31870471E+04 0.31852251E+04 0.31852251E+04 0.31833069E+04 + 0.31071250E+04 0.31029829E+04 0.31029829E+04 0.30934810E+04 + 0.30934810E+04 0.30934500E+04 0.30934500E+04 0.30923250E+04 + 0.30588879E+04 0.30564651E+04 0.32086919E+04 0.31939241E+04 + 0.31939241E+04 0.31874380E+04 0.31874380E+04 0.31844890E+04 + 0.31844890E+04 0.31825471E+04 0.31825471E+04 0.31829871E+04 + 0.31829871E+04 0.31826440E+04 0.31086060E+04 0.31058779E+04 + 0.31058779E+04 0.31004380E+04 0.31004380E+04 0.30962280E+04 + 0.30962280E+04 0.30938350E+04 0.30593220E+04 0.30569399E+04 + 0.32086919E+04 0.31939241E+04 0.31939241E+04 0.31874380E+04 + 0.31874380E+04 0.31844890E+04 0.31844890E+04 0.31825471E+04 + 0.31158450E+04 0.31124109E+04 0.31124109E+04 0.31086060E+04 + 0.31086060E+04 0.31058779E+04 0.31058779E+04 0.31004380E+04 + 0.31004380E+04 0.30962280E+04 0.30962280E+04 0.30938350E+04 + 0.30593220E+04 0.30569399E+04 0.32037161E+04 0.31958350E+04 + 0.31958350E+04 0.31886311E+04 0.31886311E+04 0.31868501E+04 + 0.31868501E+04 0.31833889E+04 0.31178091E+04 0.31150120E+04 + 0.31150120E+04 0.31113789E+04 0.31113789E+04 0.31078550E+04 + 0.31078550E+04 0.31025959E+04 0.31025959E+04 0.30972561E+04 + 0.30972561E+04 0.30946470E+04 0.30597319E+04 0.30578960E+04 + 0.32037161E+04 0.31958350E+04 0.31958350E+04 0.31886311E+04 + 0.31270801E+04 0.31232119E+04 0.31232119E+04 0.31178091E+04 + 0.31178091E+04 0.31150120E+04 0.31150120E+04 0.31113789E+04 + 0.31113789E+04 0.31078550E+04 0.31078550E+04 0.31025959E+04 + 0.31025959E+04 0.30972561E+04 0.30972561E+04 0.30946470E+04 + 0.30597319E+04 0.30578960E+04 0.32015381E+04 0.31972629E+04 + 0.31972629E+04 0.31912109E+04 0.31304839E+04 0.31263879E+04 + 0.31263879E+04 0.31204290E+04 0.31204290E+04 0.31152891E+04 + 0.31152891E+04 0.31088250E+04 0.31088250E+04 0.31052510E+04 + 0.31052510E+04 0.31032251E+04 0.31032251E+04 0.30992410E+04 + 0.30992410E+04 0.30954070E+04 0.30606741E+04 0.30585559E+04 + 0.31385430E+04 0.31355239E+04 0.31355239E+04 0.31304839E+04 + 0.31304839E+04 0.31263879E+04 0.31263879E+04 0.31204290E+04 + 0.31204290E+04 0.31152891E+04 0.31152891E+04 0.31088250E+04 + 0.31088250E+04 0.31052510E+04 0.31052510E+04 0.31032251E+04 + 0.31032251E+04 0.30992410E+04 0.30992410E+04 0.30954070E+04 + 0.30954070E+04 0.30929160E+04 0.31403491E+04 0.31383069E+04 + 0.31383069E+04 0.31361919E+04 0.31361919E+04 0.31308970E+04 + 0.31308970E+04 0.31178330E+04 0.31178330E+04 0.31098340E+04 + 0.31098340E+04 0.31050740E+04 0.31050740E+04 0.31042161E+04 + 0.31042161E+04 0.31071121E+04 0.31071121E+04 0.31027280E+04 + 0.31027280E+04 0.30966689E+04 0.30966689E+04 0.30931169E+04 + 0.32149680E+04 0.32132219E+04 0.32132219E+04 0.32159790E+04 + 0.32159790E+04 0.32168960E+04 0.32168960E+04 0.32126819E+04 + 0.32126819E+04 0.32044910E+04 0.32044910E+04 0.32025439E+04 + 0.32025439E+04 0.32065940E+04 0.32065940E+04 0.32096560E+04 + 0.32096560E+04 0.32110510E+04 0.32110510E+04 0.32159351E+04 + 0.32159351E+04 0.32235259E+04 0.32053110E+04 0.32054380E+04 + 0.32054380E+04 0.32105029E+04 0.32105029E+04 0.32121470E+04 + 0.32121470E+04 0.32091450E+04 0.32091450E+04 0.32058149E+04 + 0.32058149E+04 0.32086240E+04 0.32086240E+04 0.32149470E+04 + 0.32149470E+04 0.32178660E+04 0.32178660E+04 0.32202219E+04 + 0.32202219E+04 0.32250520E+04 0.32250520E+04 0.32281289E+04 + 0.32053110E+04 0.32054380E+04 0.32054380E+04 0.32105029E+04 + 0.32105029E+04 0.32121470E+04 0.32121470E+04 0.32091450E+04 + 0.32091450E+04 0.32058149E+04 0.32058149E+04 0.32086240E+04 + 0.32086240E+04 0.32149470E+04 0.32149470E+04 0.32178660E+04 + 0.32178660E+04 0.32202219E+04 0.32202219E+04 0.32250520E+04 + 0.32250520E+04 0.32281289E+04 0.31977241E+04 0.31983350E+04 + 0.31983350E+04 0.32023220E+04 0.32023220E+04 0.32002690E+04 + 0.32002690E+04 0.31970710E+04 0.31970710E+04 0.31975859E+04 + 0.31975859E+04 0.32030320E+04 0.32030320E+04 0.32105249E+04 + 0.32105249E+04 0.32154761E+04 0.32154761E+04 0.32209500E+04 + 0.32209500E+04 0.32268000E+04 0.32268000E+04 0.32274390E+04 + 0.31977241E+04 0.31983350E+04 0.31983350E+04 0.32023220E+04 + 0.32023220E+04 0.32002690E+04 0.32002690E+04 0.31970710E+04 + 0.31970710E+04 0.31975859E+04 0.31975859E+04 0.32030320E+04 + 0.32030320E+04 0.32105249E+04 0.32105249E+04 0.32154761E+04 + 0.32154761E+04 0.32209500E+04 0.32209500E+04 0.32268000E+04 + 0.32268000E+04 0.32274390E+04 0.31852639E+04 0.31777229E+04 + 0.31777229E+04 0.31780020E+04 0.31780020E+04 0.31756089E+04 + 0.31756089E+04 0.31831470E+04 0.31831470E+04 0.31943110E+04 + 0.31943110E+04 0.32031680E+04 0.32031680E+04 0.32084980E+04 + 0.32084980E+04 0.32126819E+04 0.32126819E+04 0.32176970E+04 + 0.32176970E+04 0.32232549E+04 0.32232549E+04 0.32265840E+04 + 0.31852639E+04 0.31777229E+04 0.31777229E+04 0.31780020E+04 + 0.31780020E+04 0.31756089E+04 0.31756089E+04 0.31831470E+04 + 0.31831470E+04 0.31943110E+04 0.31943110E+04 0.32031680E+04 + 0.32031680E+04 0.32084980E+04 0.32084980E+04 0.32126819E+04 + 0.32126819E+04 0.32176970E+04 0.32176970E+04 0.32232549E+04 + 0.32232549E+04 0.32265840E+04 0.31804700E+04 0.31755769E+04 + 0.31755769E+04 0.31781431E+04 0.31781431E+04 0.31790920E+04 + 0.31790920E+04 0.31822700E+04 0.31822700E+04 0.31882949E+04 + 0.31882949E+04 0.31927520E+04 0.31927520E+04 0.31940659E+04 + 0.31940659E+04 0.31994839E+04 0.31994839E+04 0.32098811E+04 + 0.32098811E+04 0.32201399E+04 0.32201399E+04 0.32290740E+04 + 0.31804700E+04 0.31755769E+04 0.31755769E+04 0.31781431E+04 + 0.31781431E+04 0.31790920E+04 0.31790920E+04 0.31822700E+04 + 0.31822700E+04 0.31882949E+04 0.31882949E+04 0.31927520E+04 + 0.31927520E+04 0.31940659E+04 0.31940659E+04 0.31994839E+04 + 0.31994839E+04 0.32098811E+04 0.32098811E+04 0.32201399E+04 + 0.32201399E+04 0.32290740E+04 0.31942690E+04 0.31954480E+04 + 0.31954480E+04 0.31967590E+04 0.31967590E+04 0.31937771E+04 + 0.31937771E+04 0.31855349E+04 0.31855349E+04 0.31804009E+04 + 0.31804009E+04 0.31821890E+04 0.31821890E+04 0.31878159E+04 + 0.31878159E+04 0.31932461E+04 0.31932461E+04 0.32016499E+04 + 0.32016499E+04 0.32139099E+04 0.32139099E+04 0.32262820E+04 + 0.31942690E+04 0.31954480E+04 0.31954480E+04 0.31967590E+04 + 0.31967590E+04 0.31937771E+04 0.31937771E+04 0.31855349E+04 + 0.31855349E+04 0.31804009E+04 0.31804009E+04 0.31821890E+04 + 0.31821890E+04 0.31878159E+04 0.31878159E+04 0.31932461E+04 + 0.31932461E+04 0.32016499E+04 0.32016499E+04 0.32139099E+04 + 0.32139099E+04 0.32262820E+04 0.31917791E+04 0.31997581E+04 + 0.31997581E+04 0.32041499E+04 0.32041499E+04 0.32026819E+04 + 0.32026819E+04 0.31982749E+04 0.31982749E+04 0.31922500E+04 + 0.31922500E+04 0.31905249E+04 0.31905249E+04 0.31889780E+04 + 0.31889780E+04 0.31867791E+04 0.31867791E+04 0.31922900E+04 + 0.31922900E+04 0.32056731E+04 0.32056731E+04 0.32200161E+04 + 0.31917791E+04 0.31997581E+04 0.31997581E+04 0.32041499E+04 + 0.32041499E+04 0.32026819E+04 0.32026819E+04 0.31982749E+04 + 0.31982749E+04 0.31922500E+04 0.31922500E+04 0.31905249E+04 + 0.31905249E+04 0.31889780E+04 0.31889780E+04 0.31867791E+04 + 0.31867791E+04 0.31922900E+04 0.31922900E+04 0.32056731E+04 + 0.32056731E+04 0.32200161E+04 0.31891951E+04 0.31959360E+04 + 0.31959360E+04 0.32024290E+04 0.32024290E+04 0.32018301E+04 + 0.32018301E+04 0.32003311E+04 0.32003311E+04 0.31984780E+04 + 0.31984780E+04 0.31958020E+04 0.31958020E+04 0.31873101E+04 + 0.31873101E+04 0.31824080E+04 0.31824080E+04 0.31850791E+04 + 0.31850791E+04 0.31934980E+04 0.31934980E+04 0.32039009E+04 + 0.31891951E+04 0.31959360E+04 0.31959360E+04 0.32024290E+04 + 0.32024290E+04 0.32018301E+04 0.32018301E+04 0.32003311E+04 + 0.32003311E+04 0.31984780E+04 0.31984780E+04 0.31958020E+04 + 0.31958020E+04 0.31873101E+04 0.31873101E+04 0.31824080E+04 + 0.31824080E+04 0.31850791E+04 0.31850791E+04 0.31934980E+04 + 0.31934980E+04 0.32039009E+04 0.31988130E+04 0.31990061E+04 + 0.31990061E+04 0.32068911E+04 0.32068911E+04 0.32076870E+04 + 0.32076870E+04 0.32016689E+04 0.32016689E+04 0.31976670E+04 + 0.31976670E+04 0.31945720E+04 0.31945720E+04 0.31869451E+04 + 0.31869451E+04 0.31794561E+04 0.31794561E+04 0.31814319E+04 + 0.31814319E+04 0.31861289E+04 0.31861289E+04 0.31906211E+04 + 0.31988130E+04 0.31990061E+04 0.31990061E+04 0.32068911E+04 + 0.32068911E+04 0.32076870E+04 0.32076870E+04 0.32016689E+04 + 0.32016689E+04 0.31976670E+04 0.31976670E+04 0.31945720E+04 + 0.31945720E+04 0.31869451E+04 0.31869451E+04 0.31794561E+04 + 0.31794561E+04 0.31814319E+04 0.31814319E+04 0.31861289E+04 + 0.31861289E+04 0.31906211E+04 0.32116201E+04 0.32078301E+04 + 0.32078301E+04 0.32126880E+04 0.32126880E+04 0.32130449E+04 + 0.32130449E+04 0.32063889E+04 0.32063889E+04 0.31993201E+04 + 0.31993201E+04 0.31937451E+04 0.31937451E+04 0.31858081E+04 + 0.31858081E+04 0.31780840E+04 0.31780840E+04 0.31793169E+04 + 0.31793169E+04 0.31851311E+04 0.31851311E+04 0.31935520E+04 + 0.32116201E+04 0.32078301E+04 0.32078301E+04 0.32126880E+04 + 0.32126880E+04 0.32130449E+04 0.32130449E+04 0.32063889E+04 + 0.32063889E+04 0.31993201E+04 0.31993201E+04 0.31937451E+04 + 0.31937451E+04 0.31858081E+04 0.31858081E+04 0.31780840E+04 + 0.31780840E+04 0.31793169E+04 0.31793169E+04 0.31851311E+04 + 0.31851311E+04 0.31935520E+04 0.32085181E+04 0.32068091E+04 + 0.32068091E+04 0.32091370E+04 0.32091370E+04 0.32088831E+04 + 0.32088831E+04 0.32014419E+04 0.32014419E+04 0.31925869E+04 + 0.31925869E+04 0.31876521E+04 0.31876521E+04 0.31844861E+04 + 0.31844861E+04 0.31820010E+04 0.31820010E+04 0.31833970E+04 + 0.31833970E+04 0.31884199E+04 0.31884199E+04 0.31983169E+04 + 0.32085181E+04 0.32068091E+04 0.32068091E+04 0.32091370E+04 + 0.32091370E+04 0.32088831E+04 0.32088831E+04 0.32014419E+04 + 0.32014419E+04 0.31925869E+04 0.31925869E+04 0.31876521E+04 + 0.31876521E+04 0.31844861E+04 0.31844861E+04 0.31820010E+04 + 0.31820010E+04 0.31833970E+04 0.31833970E+04 0.31884199E+04 + 0.30543601E+04 0.30552881E+04 0.32029099E+04 0.31950850E+04 + 0.31950850E+04 0.31964170E+04 0.31964170E+04 0.31979629E+04 + 0.31979629E+04 0.31936531E+04 0.31936531E+04 0.31886189E+04 + 0.31886189E+04 0.31861169E+04 0.31861169E+04 0.31846240E+04 + 0.31846240E+04 0.31844470E+04 0.31844470E+04 0.31862510E+04 + 0.31862510E+04 0.31892119E+04 0.30592319E+04 0.30566741E+04 + 0.32029099E+04 0.31950850E+04 0.31950850E+04 0.31964170E+04 + 0.31964170E+04 0.31979629E+04 0.31979629E+04 0.31936531E+04 + 0.31936531E+04 0.31886189E+04 0.31886189E+04 0.31861169E+04 + 0.31861169E+04 0.31846240E+04 0.31846240E+04 0.31844470E+04 + 0.30953511E+04 0.30923950E+04 0.30923950E+04 0.30913159E+04 + 0.30592319E+04 0.30566741E+04 0.32072351E+04 0.31911819E+04 + 0.31911819E+04 0.31883000E+04 0.31883000E+04 0.31883379E+04 + 0.31883379E+04 0.31870471E+04 0.31870471E+04 0.31852251E+04 + 0.31852251E+04 0.31833069E+04 0.31833069E+04 0.31838870E+04 + 0.31838870E+04 0.31852881E+04 0.30934810E+04 0.30934500E+04 + 0.30934500E+04 0.30923250E+04 0.30588879E+04 0.30564651E+04 + 0.32072351E+04 0.31911819E+04 0.31911819E+04 0.31883000E+04 + 0.31883000E+04 0.31883379E+04 0.31883379E+04 0.31870471E+04 + 0.31870471E+04 0.31852251E+04 0.31852251E+04 0.31833069E+04 + 0.31071250E+04 0.31029829E+04 0.31029829E+04 0.30934810E+04 + 0.30934810E+04 0.30934500E+04 0.30934500E+04 0.30923250E+04 + 0.30588879E+04 0.30564651E+04 0.32086919E+04 0.31939241E+04 + 0.31939241E+04 0.31874380E+04 0.31874380E+04 0.31844890E+04 + 0.31844890E+04 0.31825471E+04 0.31825471E+04 0.31829871E+04 + 0.31829871E+04 0.31826440E+04 0.31086060E+04 0.31058779E+04 + 0.31058779E+04 0.31004380E+04 0.31004380E+04 0.30962280E+04 + 0.30962280E+04 0.30938350E+04 0.30593220E+04 0.30569399E+04 + 0.32086919E+04 0.31939241E+04 0.31939241E+04 0.31874380E+04 + 0.31874380E+04 0.31844890E+04 0.31844890E+04 0.31825471E+04 + 0.31158450E+04 0.31124109E+04 0.31124109E+04 0.31086060E+04 + 0.31086060E+04 0.31058779E+04 0.31058779E+04 0.31004380E+04 + 0.31004380E+04 0.30962280E+04 0.30962280E+04 0.30938350E+04 + 0.30593220E+04 0.30569399E+04 0.32037161E+04 0.31958350E+04 + 0.31958350E+04 0.31886311E+04 0.31886311E+04 0.31868501E+04 + 0.31868501E+04 0.31833889E+04 0.31178091E+04 0.31150120E+04 + 0.31150120E+04 0.31113789E+04 0.31113789E+04 0.31078550E+04 + 0.31078550E+04 0.31025959E+04 0.31025959E+04 0.30972561E+04 + 0.30972561E+04 0.30946470E+04 0.30597319E+04 0.30578960E+04 + 0.32037161E+04 0.31958350E+04 0.31958350E+04 0.31886311E+04 + 0.31270801E+04 0.31232119E+04 0.31232119E+04 0.31178091E+04 + 0.31178091E+04 0.31150120E+04 0.31150120E+04 0.31113789E+04 + 0.31113789E+04 0.31078550E+04 0.31078550E+04 0.31025959E+04 + 0.31025959E+04 0.30972561E+04 0.30972561E+04 0.30946470E+04 + 0.30597319E+04 0.30578960E+04 0.32015381E+04 0.31972629E+04 + 0.31972629E+04 0.31912109E+04 0.31304839E+04 0.31263879E+04 + 0.31263879E+04 0.31204290E+04 0.31204290E+04 0.31152891E+04 + 0.31152891E+04 0.31088250E+04 0.31088250E+04 0.31052510E+04 + 0.31052510E+04 0.31032251E+04 0.31032251E+04 0.30992410E+04 + 0.30992410E+04 0.30954070E+04 0.30606741E+04 0.30585559E+04 + 0.31385430E+04 0.31355239E+04 0.31355239E+04 0.31304839E+04 + 0.31304839E+04 0.31263879E+04 0.31263879E+04 0.31204290E+04 + 0.31204290E+04 0.31152891E+04 0.31152891E+04 0.31088250E+04 + 0.31088250E+04 0.31052510E+04 0.31052510E+04 0.31032251E+04 + 0.31032251E+04 0.30992410E+04 0.30992410E+04 0.30954070E+04 + 0.30954070E+04 0.30929160E+04 0.31403491E+04 0.31383069E+04 + 0.31383069E+04 0.31361919E+04 0.31361919E+04 0.31308970E+04 + 0.31308970E+04 0.31178330E+04 0.31178330E+04 0.31098340E+04 + 0.31098340E+04 0.31050740E+04 0.31050740E+04 0.31042161E+04 + 0.31042161E+04 0.31071121E+04 0.31071121E+04 0.31027280E+04 + 0.31027280E+04 0.30966689E+04 0.30966689E+04 0.30931169E+04 + 0.32160891E+04 0.32142380E+04 0.32142380E+04 0.32170000E+04 + 0.32170000E+04 0.32179641E+04 0.32179641E+04 0.32137949E+04 + 0.32137949E+04 0.32055540E+04 0.32055540E+04 0.32034800E+04 + 0.32034800E+04 0.32074409E+04 0.32074409E+04 0.32105559E+04 + 0.32105559E+04 0.32119741E+04 0.32119741E+04 0.32168540E+04 + 0.32168540E+04 0.32244800E+04 0.32064629E+04 0.32064490E+04 + 0.32064490E+04 0.32115439E+04 0.32115439E+04 0.32132671E+04 + 0.32132671E+04 0.32102830E+04 0.32102830E+04 0.32068850E+04 + 0.32068850E+04 0.32095750E+04 0.32095750E+04 0.32158911E+04 + 0.32158911E+04 0.32189141E+04 0.32189141E+04 0.32212400E+04 + 0.32212400E+04 0.32260820E+04 0.32260820E+04 0.32290840E+04 + 0.32064629E+04 0.32064490E+04 0.32064490E+04 0.32115439E+04 + 0.32115439E+04 0.32132671E+04 0.32132671E+04 0.32102830E+04 + 0.32102830E+04 0.32068850E+04 0.32068850E+04 0.32095750E+04 + 0.32095750E+04 0.32158911E+04 0.32158911E+04 0.32189141E+04 + 0.32189141E+04 0.32212400E+04 0.32212400E+04 0.32260820E+04 + 0.32260820E+04 0.32290840E+04 0.31989109E+04 0.31994231E+04 + 0.31994231E+04 0.32034680E+04 0.32034680E+04 0.32014651E+04 + 0.32014651E+04 0.31981521E+04 0.31981521E+04 0.31985110E+04 + 0.31985110E+04 0.32038650E+04 0.32038650E+04 0.32113770E+04 + 0.32113770E+04 0.32163999E+04 0.32163999E+04 0.32218779E+04 + 0.32218779E+04 0.32278040E+04 0.32278040E+04 0.32283110E+04 + 0.31989109E+04 0.31994231E+04 0.31994231E+04 0.32034680E+04 + 0.32034680E+04 0.32014651E+04 0.32014651E+04 0.31981521E+04 + 0.31981521E+04 0.31985110E+04 0.31985110E+04 0.32038650E+04 + 0.32038650E+04 0.32113770E+04 0.32113770E+04 0.32163999E+04 + 0.32163999E+04 0.32218779E+04 0.32218779E+04 0.32278040E+04 + 0.32278040E+04 0.32283110E+04 0.31863860E+04 0.31787400E+04 + 0.31787400E+04 0.31790300E+04 0.31790300E+04 0.31764399E+04 + 0.31764399E+04 0.31838240E+04 0.31838240E+04 0.31949431E+04 + 0.31949431E+04 0.32038411E+04 0.32038411E+04 0.32092749E+04 + 0.32092749E+04 0.32135129E+04 0.32135129E+04 0.32184729E+04 + 0.32184729E+04 0.32239590E+04 0.32239590E+04 0.32271499E+04 + 0.31863860E+04 0.31787400E+04 0.31787400E+04 0.31790300E+04 + 0.31790300E+04 0.31764399E+04 0.31764399E+04 0.31838240E+04 + 0.31838240E+04 0.31949431E+04 0.31949431E+04 0.32038411E+04 + 0.32038411E+04 0.32092749E+04 0.32092749E+04 0.32135129E+04 + 0.32135129E+04 0.32184729E+04 0.32184729E+04 0.32239590E+04 + 0.32239590E+04 0.32271499E+04 0.31810210E+04 0.31761221E+04 + 0.31761221E+04 0.31787490E+04 0.31787490E+04 0.31797219E+04 + 0.31797219E+04 0.31829070E+04 0.31829070E+04 0.31889580E+04 + 0.31889580E+04 0.31934031E+04 0.31934031E+04 0.31946780E+04 + 0.31946780E+04 0.32000100E+04 0.32000100E+04 0.32103860E+04 + 0.32103860E+04 0.32206189E+04 0.32206189E+04 0.32295359E+04 + 0.31810210E+04 0.31761221E+04 0.31761221E+04 0.31787490E+04 + 0.31787490E+04 0.31797219E+04 0.31797219E+04 0.31829070E+04 + 0.31829070E+04 0.31889580E+04 0.31889580E+04 0.31934031E+04 + 0.31934031E+04 0.31946780E+04 0.31946780E+04 0.32000100E+04 + 0.32000100E+04 0.32103860E+04 0.32103860E+04 0.32206189E+04 + 0.32206189E+04 0.32295359E+04 0.31947910E+04 0.31959409E+04 + 0.31959409E+04 0.31972839E+04 0.31972839E+04 0.31943601E+04 + 0.31943601E+04 0.31860911E+04 0.31860911E+04 0.31808779E+04 + 0.31808779E+04 0.31826169E+04 0.31826169E+04 0.31882700E+04 + 0.31882700E+04 0.31937241E+04 0.31937241E+04 0.32020649E+04 + 0.32020649E+04 0.32143220E+04 0.32143220E+04 0.32267080E+04 + 0.31947910E+04 0.31959409E+04 0.31959409E+04 0.31972839E+04 + 0.31972839E+04 0.31943601E+04 0.31943601E+04 0.31860911E+04 + 0.31860911E+04 0.31808779E+04 0.31808779E+04 0.31826169E+04 + 0.31826169E+04 0.31882700E+04 0.31882700E+04 0.31937241E+04 + 0.31937241E+04 0.32020649E+04 0.32020649E+04 0.32143220E+04 + 0.32143220E+04 0.32267080E+04 0.31922681E+04 0.32002190E+04 + 0.32002190E+04 0.32046809E+04 0.32046809E+04 0.32032571E+04 + 0.32032571E+04 0.31988269E+04 0.31988269E+04 0.31927180E+04 + 0.31927180E+04 0.31909680E+04 0.31909680E+04 0.31894651E+04 + 0.31894651E+04 0.31872080E+04 0.31872080E+04 0.31926389E+04 + 0.31926389E+04 0.32060811E+04 0.32060811E+04 0.32205239E+04 + 0.31922681E+04 0.32002190E+04 0.32002190E+04 0.32046809E+04 + 0.32046809E+04 0.32032571E+04 0.32032571E+04 0.31988269E+04 + 0.31988269E+04 0.31927180E+04 0.31927180E+04 0.31909680E+04 + 0.31909680E+04 0.31894651E+04 0.31894651E+04 0.31872080E+04 + 0.31872080E+04 0.31926389E+04 0.31926389E+04 0.32060811E+04 + 0.32060811E+04 0.32205239E+04 0.31896631E+04 0.31963491E+04 + 0.31963491E+04 0.32029270E+04 0.32029270E+04 0.32023511E+04 + 0.32023511E+04 0.32008440E+04 0.32008440E+04 0.31989619E+04 + 0.31989619E+04 0.31963169E+04 0.31963169E+04 0.31878350E+04 + 0.31878350E+04 0.31828589E+04 0.31828589E+04 0.31854651E+04 + 0.31854651E+04 0.31939131E+04 0.31939131E+04 0.32044331E+04 + 0.31896631E+04 0.31963491E+04 0.31963491E+04 0.32029270E+04 + 0.32029270E+04 0.32023511E+04 0.32023511E+04 0.32008440E+04 + 0.32008440E+04 0.31989619E+04 0.31989619E+04 0.31963169E+04 + 0.31963169E+04 0.31878350E+04 0.31878350E+04 0.31828589E+04 + 0.31828589E+04 0.31854651E+04 0.31854651E+04 0.31939131E+04 + 0.31939131E+04 0.32044331E+04 0.31993230E+04 0.31993940E+04 + 0.31993940E+04 0.32073230E+04 0.32073230E+04 0.32082070E+04 + 0.32082070E+04 0.32021741E+04 0.32021741E+04 0.31981489E+04 + 0.31981489E+04 0.31950759E+04 0.31950759E+04 0.31874980E+04 + 0.31874980E+04 0.31799341E+04 0.31799341E+04 0.31818391E+04 + 0.31818391E+04 0.31865420E+04 0.31865420E+04 0.31910100E+04 + 0.31993230E+04 0.31993940E+04 0.31993940E+04 0.32073230E+04 + 0.32073230E+04 0.32082070E+04 0.32082070E+04 0.32021741E+04 + 0.32021741E+04 0.31981489E+04 0.31981489E+04 0.31950759E+04 + 0.31950759E+04 0.31874980E+04 0.31874980E+04 0.31799341E+04 + 0.31799341E+04 0.31818391E+04 0.31818391E+04 0.31865420E+04 + 0.31865420E+04 0.31910100E+04 0.32122300E+04 0.32082900E+04 + 0.32082900E+04 0.32131440E+04 0.32131440E+04 0.32135649E+04 + 0.32135649E+04 0.32069470E+04 0.32069470E+04 0.31998660E+04 + 0.31998660E+04 0.31942620E+04 0.31942620E+04 0.31863530E+04 + 0.31863530E+04 0.31785801E+04 0.31785801E+04 0.31798521E+04 + 0.31798521E+04 0.31857620E+04 0.31857620E+04 0.31942820E+04 + 0.32122300E+04 0.32082900E+04 0.32082900E+04 0.32131440E+04 + 0.32131440E+04 0.32135649E+04 0.32135649E+04 0.32069470E+04 + 0.32069470E+04 0.31998660E+04 0.31998660E+04 0.31942620E+04 + 0.31942620E+04 0.31863530E+04 0.31863530E+04 0.31785801E+04 + 0.31785801E+04 0.31798521E+04 0.31798521E+04 0.31857620E+04 + 0.31857620E+04 0.31942820E+04 0.32091870E+04 0.32073601E+04 + 0.32073601E+04 0.32096621E+04 0.32096621E+04 0.32094680E+04 + 0.32094680E+04 0.32020640E+04 0.32020640E+04 0.31932319E+04 + 0.31932319E+04 0.31882620E+04 0.31882620E+04 0.31852241E+04 + 0.31852241E+04 0.31829021E+04 0.31829021E+04 0.31844180E+04 + 0.31844180E+04 0.31892930E+04 0.31892930E+04 0.31991580E+04 + 0.32091870E+04 0.32073601E+04 0.32073601E+04 0.32096621E+04 + 0.32096621E+04 0.32094680E+04 0.32094680E+04 0.32020640E+04 + 0.32020640E+04 0.31932319E+04 0.31932319E+04 0.31882620E+04 + 0.31882620E+04 0.31852241E+04 0.31852241E+04 0.31829021E+04 + 0.31829021E+04 0.31844180E+04 0.31844180E+04 0.31892930E+04 + 0.30546650E+04 0.30556580E+04 0.32036140E+04 0.31956450E+04 + 0.31956450E+04 0.31969141E+04 0.31969141E+04 0.31985710E+04 + 0.31985710E+04 0.31943770E+04 0.31943770E+04 0.31894761E+04 + 0.31894761E+04 0.31870769E+04 0.31870769E+04 0.31857429E+04 + 0.31857429E+04 0.31854729E+04 0.31854729E+04 0.31873369E+04 + 0.31873369E+04 0.31903660E+04 0.30595420E+04 0.30570339E+04 + 0.32036140E+04 0.31956450E+04 0.31956450E+04 0.31969141E+04 + 0.31969141E+04 0.31985710E+04 0.31985710E+04 0.31943770E+04 + 0.31943770E+04 0.31894761E+04 0.31894761E+04 0.31870769E+04 + 0.31870769E+04 0.31857429E+04 0.31857429E+04 0.31854729E+04 + 0.30961089E+04 0.30931750E+04 0.30931750E+04 0.30921211E+04 + 0.30595420E+04 0.30570339E+04 0.32080320E+04 0.31918149E+04 + 0.31918149E+04 0.31889121E+04 0.31889121E+04 0.31890940E+04 + 0.31890940E+04 0.31879880E+04 0.31879880E+04 0.31863340E+04 + 0.31863340E+04 0.31843159E+04 0.31843159E+04 0.31849641E+04 + 0.31849641E+04 0.31865071E+04 0.30941489E+04 0.30942209E+04 + 0.30942209E+04 0.30931550E+04 0.30592170E+04 0.30568120E+04 + 0.32080320E+04 0.31918149E+04 0.31918149E+04 0.31889121E+04 + 0.31889121E+04 0.31890940E+04 0.31890940E+04 0.31879880E+04 + 0.31879880E+04 0.31863340E+04 0.31863340E+04 0.31843159E+04 + 0.31078120E+04 0.31036960E+04 0.31036960E+04 0.30941489E+04 + 0.30941489E+04 0.30942209E+04 0.30942209E+04 0.30931550E+04 + 0.30592170E+04 0.30568120E+04 0.32095591E+04 0.31947400E+04 + 0.31947400E+04 0.31882849E+04 0.31882849E+04 0.31852881E+04 + 0.31852881E+04 0.31834089E+04 0.31834089E+04 0.31840161E+04 + 0.31840161E+04 0.31837439E+04 0.31092739E+04 0.31066079E+04 + 0.31066079E+04 0.31012351E+04 0.31012351E+04 0.30970449E+04 + 0.30970449E+04 0.30946819E+04 0.30596750E+04 0.30573220E+04 + 0.32095591E+04 0.31947400E+04 0.31947400E+04 0.31882849E+04 + 0.31882849E+04 0.31852881E+04 0.31852881E+04 0.31834089E+04 + 0.31164719E+04 0.31130481E+04 0.31130481E+04 0.31092739E+04 + 0.31092739E+04 0.31066079E+04 0.31066079E+04 0.31012351E+04 + 0.31012351E+04 0.30970449E+04 0.30970449E+04 0.30946819E+04 + 0.30596750E+04 0.30573220E+04 0.32046201E+04 0.31966560E+04 + 0.31966560E+04 0.31894089E+04 0.31894089E+04 0.31876799E+04 + 0.31876799E+04 0.31842439E+04 0.31184600E+04 0.31156960E+04 + 0.31156960E+04 0.31120410E+04 0.31120410E+04 0.31085349E+04 + 0.31085349E+04 0.31033130E+04 0.31033130E+04 0.30981121E+04 + 0.30981121E+04 0.30955010E+04 0.30601101E+04 0.30583069E+04 + 0.32046201E+04 0.31966560E+04 0.31966560E+04 0.31894089E+04 + 0.31277261E+04 0.31238611E+04 0.31238611E+04 0.31184600E+04 + 0.31184600E+04 0.31156960E+04 0.31156960E+04 0.31120410E+04 + 0.31120410E+04 0.31085349E+04 0.31085349E+04 0.31033130E+04 + 0.31033130E+04 0.30981121E+04 0.30981121E+04 0.30955010E+04 + 0.30601101E+04 0.30583069E+04 0.32022800E+04 0.31980691E+04 + 0.31980691E+04 0.31919919E+04 0.31311479E+04 0.31271011E+04 + 0.31271011E+04 0.31211230E+04 0.31211230E+04 0.31159561E+04 + 0.31159561E+04 0.31094790E+04 0.31094790E+04 0.31059351E+04 + 0.31059351E+04 0.31039399E+04 0.31039399E+04 0.31000330E+04 + 0.31000330E+04 0.30962471E+04 0.30610710E+04 0.30589890E+04 + 0.31392681E+04 0.31362319E+04 0.31362319E+04 0.31311479E+04 + 0.31311479E+04 0.31271011E+04 0.31271011E+04 0.31211230E+04 + 0.31211230E+04 0.31159561E+04 0.31159561E+04 0.31094790E+04 + 0.31094790E+04 0.31059351E+04 0.31059351E+04 0.31039399E+04 + 0.31039399E+04 0.31000330E+04 0.31000330E+04 0.30962471E+04 + 0.30962471E+04 0.30938120E+04 0.31410750E+04 0.31390559E+04 + 0.31390559E+04 0.31368660E+04 0.31368660E+04 0.31315259E+04 + 0.31315259E+04 0.31185000E+04 0.31185000E+04 0.31104541E+04 + 0.31104541E+04 0.31056880E+04 0.31056880E+04 0.31048301E+04 + 0.31048301E+04 0.31078359E+04 0.31078359E+04 0.31035020E+04 + 0.31035020E+04 0.30975190E+04 0.30975190E+04 0.30939961E+04 + 0.32160891E+04 0.32142380E+04 0.32142380E+04 0.32170000E+04 + 0.32170000E+04 0.32179641E+04 0.32179641E+04 0.32137949E+04 + 0.32137949E+04 0.32055540E+04 0.32055540E+04 0.32034800E+04 + 0.32034800E+04 0.32074409E+04 0.32074409E+04 0.32105559E+04 + 0.32105559E+04 0.32119741E+04 0.32119741E+04 0.32168540E+04 + 0.32168540E+04 0.32244800E+04 0.32064629E+04 0.32064490E+04 + 0.32064490E+04 0.32115439E+04 0.32115439E+04 0.32132671E+04 + 0.32132671E+04 0.32102830E+04 0.32102830E+04 0.32068850E+04 + 0.32068850E+04 0.32095750E+04 0.32095750E+04 0.32158911E+04 + 0.32158911E+04 0.32189141E+04 0.32189141E+04 0.32212400E+04 + 0.32212400E+04 0.32260820E+04 0.32260820E+04 0.32290840E+04 + 0.32064629E+04 0.32064490E+04 0.32064490E+04 0.32115439E+04 + 0.32115439E+04 0.32132671E+04 0.32132671E+04 0.32102830E+04 + 0.32102830E+04 0.32068850E+04 0.32068850E+04 0.32095750E+04 + 0.32095750E+04 0.32158911E+04 0.32158911E+04 0.32189141E+04 + 0.32189141E+04 0.32212400E+04 0.32212400E+04 0.32260820E+04 + 0.32260820E+04 0.32290840E+04 0.31989109E+04 0.31994231E+04 + 0.31994231E+04 0.32034680E+04 0.32034680E+04 0.32014651E+04 + 0.32014651E+04 0.31981521E+04 0.31981521E+04 0.31985110E+04 + 0.31985110E+04 0.32038650E+04 0.32038650E+04 0.32113770E+04 + 0.32113770E+04 0.32163999E+04 0.32163999E+04 0.32218779E+04 + 0.32218779E+04 0.32278040E+04 0.32278040E+04 0.32283110E+04 + 0.31989109E+04 0.31994231E+04 0.31994231E+04 0.32034680E+04 + 0.32034680E+04 0.32014651E+04 0.32014651E+04 0.31981521E+04 + 0.31981521E+04 0.31985110E+04 0.31985110E+04 0.32038650E+04 + 0.32038650E+04 0.32113770E+04 0.32113770E+04 0.32163999E+04 + 0.32163999E+04 0.32218779E+04 0.32218779E+04 0.32278040E+04 + 0.32278040E+04 0.32283110E+04 0.31863860E+04 0.31787400E+04 + 0.31787400E+04 0.31790300E+04 0.31790300E+04 0.31764399E+04 + 0.31764399E+04 0.31838240E+04 0.31838240E+04 0.31949431E+04 + 0.31949431E+04 0.32038411E+04 0.32038411E+04 0.32092749E+04 + 0.32092749E+04 0.32135129E+04 0.32135129E+04 0.32184729E+04 + 0.32184729E+04 0.32239590E+04 0.32239590E+04 0.32271499E+04 + 0.31863860E+04 0.31787400E+04 0.31787400E+04 0.31790300E+04 + 0.31790300E+04 0.31764399E+04 0.31764399E+04 0.31838240E+04 + 0.31838240E+04 0.31949431E+04 0.31949431E+04 0.32038411E+04 + 0.32038411E+04 0.32092749E+04 0.32092749E+04 0.32135129E+04 + 0.32135129E+04 0.32184729E+04 0.32184729E+04 0.32239590E+04 + 0.32239590E+04 0.32271499E+04 0.31810210E+04 0.31761221E+04 + 0.31761221E+04 0.31787490E+04 0.31787490E+04 0.31797219E+04 + 0.31797219E+04 0.31829070E+04 0.31829070E+04 0.31889580E+04 + 0.31889580E+04 0.31934031E+04 0.31934031E+04 0.31946780E+04 + 0.31946780E+04 0.32000100E+04 0.32000100E+04 0.32103860E+04 + 0.32103860E+04 0.32206189E+04 0.32206189E+04 0.32295359E+04 + 0.31810210E+04 0.31761221E+04 0.31761221E+04 0.31787490E+04 + 0.31787490E+04 0.31797219E+04 0.31797219E+04 0.31829070E+04 + 0.31829070E+04 0.31889580E+04 0.31889580E+04 0.31934031E+04 + 0.31934031E+04 0.31946780E+04 0.31946780E+04 0.32000100E+04 + 0.32000100E+04 0.32103860E+04 0.32103860E+04 0.32206189E+04 + 0.32206189E+04 0.32295359E+04 0.31947910E+04 0.31959409E+04 + 0.31959409E+04 0.31972839E+04 0.31972839E+04 0.31943601E+04 + 0.31943601E+04 0.31860911E+04 0.31860911E+04 0.31808779E+04 + 0.31808779E+04 0.31826169E+04 0.31826169E+04 0.31882700E+04 + 0.31882700E+04 0.31937241E+04 0.31937241E+04 0.32020649E+04 + 0.32020649E+04 0.32143220E+04 0.32143220E+04 0.32267080E+04 + 0.31947910E+04 0.31959409E+04 0.31959409E+04 0.31972839E+04 + 0.31972839E+04 0.31943601E+04 0.31943601E+04 0.31860911E+04 + 0.31860911E+04 0.31808779E+04 0.31808779E+04 0.31826169E+04 + 0.31826169E+04 0.31882700E+04 0.31882700E+04 0.31937241E+04 + 0.31937241E+04 0.32020649E+04 0.32020649E+04 0.32143220E+04 + 0.32143220E+04 0.32267080E+04 0.31922681E+04 0.32002190E+04 + 0.32002190E+04 0.32046809E+04 0.32046809E+04 0.32032571E+04 + 0.32032571E+04 0.31988269E+04 0.31988269E+04 0.31927180E+04 + 0.31927180E+04 0.31909680E+04 0.31909680E+04 0.31894651E+04 + 0.31894651E+04 0.31872080E+04 0.31872080E+04 0.31926389E+04 + 0.31926389E+04 0.32060811E+04 0.32060811E+04 0.32205239E+04 + 0.31922681E+04 0.32002190E+04 0.32002190E+04 0.32046809E+04 + 0.32046809E+04 0.32032571E+04 0.32032571E+04 0.31988269E+04 + 0.31988269E+04 0.31927180E+04 0.31927180E+04 0.31909680E+04 + 0.31909680E+04 0.31894651E+04 0.31894651E+04 0.31872080E+04 + 0.31872080E+04 0.31926389E+04 0.31926389E+04 0.32060811E+04 + 0.32060811E+04 0.32205239E+04 0.31896631E+04 0.31963491E+04 + 0.31963491E+04 0.32029270E+04 0.32029270E+04 0.32023511E+04 + 0.32023511E+04 0.32008440E+04 0.32008440E+04 0.31989619E+04 + 0.31989619E+04 0.31963169E+04 0.31963169E+04 0.31878350E+04 + 0.31878350E+04 0.31828589E+04 0.31828589E+04 0.31854651E+04 + 0.31854651E+04 0.31939131E+04 0.31939131E+04 0.32044331E+04 + 0.31896631E+04 0.31963491E+04 0.31963491E+04 0.32029270E+04 + 0.32029270E+04 0.32023511E+04 0.32023511E+04 0.32008440E+04 + 0.32008440E+04 0.31989619E+04 0.31989619E+04 0.31963169E+04 + 0.31963169E+04 0.31878350E+04 0.31878350E+04 0.31828589E+04 + 0.31828589E+04 0.31854651E+04 0.31854651E+04 0.31939131E+04 + 0.31939131E+04 0.32044331E+04 0.31993230E+04 0.31993940E+04 + 0.31993940E+04 0.32073230E+04 0.32073230E+04 0.32082070E+04 + 0.32082070E+04 0.32021741E+04 0.32021741E+04 0.31981489E+04 + 0.31981489E+04 0.31950759E+04 0.31950759E+04 0.31874980E+04 + 0.31874980E+04 0.31799341E+04 0.31799341E+04 0.31818391E+04 + 0.31818391E+04 0.31865420E+04 0.31865420E+04 0.31910100E+04 + 0.31993230E+04 0.31993940E+04 0.31993940E+04 0.32073230E+04 + 0.32073230E+04 0.32082070E+04 0.32082070E+04 0.32021741E+04 + 0.32021741E+04 0.31981489E+04 0.31981489E+04 0.31950759E+04 + 0.31950759E+04 0.31874980E+04 0.31874980E+04 0.31799341E+04 + 0.31799341E+04 0.31818391E+04 0.31818391E+04 0.31865420E+04 + 0.31865420E+04 0.31910100E+04 0.32122300E+04 0.32082900E+04 + 0.32082900E+04 0.32131440E+04 0.32131440E+04 0.32135649E+04 + 0.32135649E+04 0.32069470E+04 0.32069470E+04 0.31998660E+04 + 0.31998660E+04 0.31942620E+04 0.31942620E+04 0.31863530E+04 + 0.31863530E+04 0.31785801E+04 0.31785801E+04 0.31798521E+04 + 0.31798521E+04 0.31857620E+04 0.31857620E+04 0.31942820E+04 + 0.32122300E+04 0.32082900E+04 0.32082900E+04 0.32131440E+04 + 0.32131440E+04 0.32135649E+04 0.32135649E+04 0.32069470E+04 + 0.32069470E+04 0.31998660E+04 0.31998660E+04 0.31942620E+04 + 0.31942620E+04 0.31863530E+04 0.31863530E+04 0.31785801E+04 + 0.31785801E+04 0.31798521E+04 0.31798521E+04 0.31857620E+04 + 0.31857620E+04 0.31942820E+04 0.32091870E+04 0.32073601E+04 + 0.32073601E+04 0.32096621E+04 0.32096621E+04 0.32094680E+04 + 0.32094680E+04 0.32020640E+04 0.32020640E+04 0.31932319E+04 + 0.31932319E+04 0.31882620E+04 0.31882620E+04 0.31852241E+04 + 0.31852241E+04 0.31829021E+04 0.31829021E+04 0.31844180E+04 + 0.31844180E+04 0.31892930E+04 0.31892930E+04 0.31991580E+04 + 0.32091870E+04 0.32073601E+04 0.32073601E+04 0.32096621E+04 + 0.32096621E+04 0.32094680E+04 0.32094680E+04 0.32020640E+04 + 0.32020640E+04 0.31932319E+04 0.31932319E+04 0.31882620E+04 + 0.31882620E+04 0.31852241E+04 0.31852241E+04 0.31829021E+04 + 0.31829021E+04 0.31844180E+04 0.31844180E+04 0.31892930E+04 + 0.30546650E+04 0.30556580E+04 0.32036140E+04 0.31956450E+04 + 0.31956450E+04 0.31969141E+04 0.31969141E+04 0.31985710E+04 + 0.31985710E+04 0.31943770E+04 0.31943770E+04 0.31894761E+04 + 0.31894761E+04 0.31870769E+04 0.31870769E+04 0.31857429E+04 + 0.31857429E+04 0.31854729E+04 0.31854729E+04 0.31873369E+04 + 0.31873369E+04 0.31903660E+04 0.30595420E+04 0.30570339E+04 + 0.32036140E+04 0.31956450E+04 0.31956450E+04 0.31969141E+04 + 0.31969141E+04 0.31985710E+04 0.31985710E+04 0.31943770E+04 + 0.31943770E+04 0.31894761E+04 0.31894761E+04 0.31870769E+04 + 0.31870769E+04 0.31857429E+04 0.31857429E+04 0.31854729E+04 + 0.30961089E+04 0.30931750E+04 0.30931750E+04 0.30921211E+04 + 0.30595420E+04 0.30570339E+04 0.32080320E+04 0.31918149E+04 + 0.31918149E+04 0.31889121E+04 0.31889121E+04 0.31890940E+04 + 0.31890940E+04 0.31879880E+04 0.31879880E+04 0.31863340E+04 + 0.31863340E+04 0.31843159E+04 0.31843159E+04 0.31849641E+04 + 0.31849641E+04 0.31865071E+04 0.30941489E+04 0.30942209E+04 + 0.30942209E+04 0.30931550E+04 0.30592170E+04 0.30568120E+04 + 0.32080320E+04 0.31918149E+04 0.31918149E+04 0.31889121E+04 + 0.31889121E+04 0.31890940E+04 0.31890940E+04 0.31879880E+04 + 0.31879880E+04 0.31863340E+04 0.31863340E+04 0.31843159E+04 + 0.31078120E+04 0.31036960E+04 0.31036960E+04 0.30941489E+04 + 0.30941489E+04 0.30942209E+04 0.30942209E+04 0.30931550E+04 + 0.30592170E+04 0.30568120E+04 0.32095591E+04 0.31947400E+04 + 0.31947400E+04 0.31882849E+04 0.31882849E+04 0.31852881E+04 + 0.31852881E+04 0.31834089E+04 0.31834089E+04 0.31840161E+04 + 0.31840161E+04 0.31837439E+04 0.31092739E+04 0.31066079E+04 + 0.31066079E+04 0.31012351E+04 0.31012351E+04 0.30970449E+04 + 0.30970449E+04 0.30946819E+04 0.30596750E+04 0.30573220E+04 + 0.32095591E+04 0.31947400E+04 0.31947400E+04 0.31882849E+04 + 0.31882849E+04 0.31852881E+04 0.31852881E+04 0.31834089E+04 + 0.31164719E+04 0.31130481E+04 0.31130481E+04 0.31092739E+04 + 0.31092739E+04 0.31066079E+04 0.31066079E+04 0.31012351E+04 + 0.31012351E+04 0.30970449E+04 0.30970449E+04 0.30946819E+04 + 0.30596750E+04 0.30573220E+04 0.32046201E+04 0.31966560E+04 + 0.31966560E+04 0.31894089E+04 0.31894089E+04 0.31876799E+04 + 0.31876799E+04 0.31842439E+04 0.31184600E+04 0.31156960E+04 + 0.31156960E+04 0.31120410E+04 0.31120410E+04 0.31085349E+04 + 0.31085349E+04 0.31033130E+04 0.31033130E+04 0.30981121E+04 + 0.30981121E+04 0.30955010E+04 0.30601101E+04 0.30583069E+04 + 0.32046201E+04 0.31966560E+04 0.31966560E+04 0.31894089E+04 + 0.31277261E+04 0.31238611E+04 0.31238611E+04 0.31184600E+04 + 0.31184600E+04 0.31156960E+04 0.31156960E+04 0.31120410E+04 + 0.31120410E+04 0.31085349E+04 0.31085349E+04 0.31033130E+04 + 0.31033130E+04 0.30981121E+04 0.30981121E+04 0.30955010E+04 + 0.30601101E+04 0.30583069E+04 0.32022800E+04 0.31980691E+04 + 0.31980691E+04 0.31919919E+04 0.31311479E+04 0.31271011E+04 + 0.31271011E+04 0.31211230E+04 0.31211230E+04 0.31159561E+04 + 0.31159561E+04 0.31094790E+04 0.31094790E+04 0.31059351E+04 + 0.31059351E+04 0.31039399E+04 0.31039399E+04 0.31000330E+04 + 0.31000330E+04 0.30962471E+04 0.30610710E+04 0.30589890E+04 + 0.31392681E+04 0.31362319E+04 0.31362319E+04 0.31311479E+04 + 0.31311479E+04 0.31271011E+04 0.31271011E+04 0.31211230E+04 + 0.31211230E+04 0.31159561E+04 0.31159561E+04 0.31094790E+04 + 0.31094790E+04 0.31059351E+04 0.31059351E+04 0.31039399E+04 + 0.31039399E+04 0.31000330E+04 0.31000330E+04 0.30962471E+04 + 0.30962471E+04 0.30938120E+04 0.31410750E+04 0.31390559E+04 + 0.31390559E+04 0.31368660E+04 0.31368660E+04 0.31315259E+04 + 0.31315259E+04 0.31185000E+04 0.31185000E+04 0.31104541E+04 + 0.31104541E+04 0.31056880E+04 0.31056880E+04 0.31048301E+04 + 0.31048301E+04 0.31078359E+04 0.31078359E+04 0.31035020E+04 + 0.31035020E+04 0.30975190E+04 0.30975190E+04 0.30939961E+04 + 0.32172090E+04 0.32152539E+04 0.32152539E+04 0.32180200E+04 + 0.32180200E+04 0.32190320E+04 0.32190320E+04 0.32149080E+04 + 0.32149080E+04 0.32066160E+04 0.32066160E+04 0.32044150E+04 + 0.32044150E+04 0.32082891E+04 0.32082891E+04 0.32114561E+04 + 0.32114561E+04 0.32128979E+04 0.32128979E+04 0.32177739E+04 + 0.32177739E+04 0.32254351E+04 0.32076160E+04 0.32074600E+04 + 0.32074600E+04 0.32125850E+04 0.32125850E+04 0.32143860E+04 + 0.32143860E+04 0.32114209E+04 0.32114209E+04 0.32079541E+04 + 0.32079541E+04 0.32105249E+04 0.32105249E+04 0.32168359E+04 + 0.32168359E+04 0.32199619E+04 0.32199619E+04 0.32222581E+04 + 0.32222581E+04 0.32271130E+04 0.32271130E+04 0.32300400E+04 + 0.32076160E+04 0.32074600E+04 0.32074600E+04 0.32125850E+04 + 0.32125850E+04 0.32143860E+04 0.32143860E+04 0.32114209E+04 + 0.32114209E+04 0.32079541E+04 0.32079541E+04 0.32105249E+04 + 0.32105249E+04 0.32168359E+04 0.32168359E+04 0.32199619E+04 + 0.32199619E+04 0.32222581E+04 0.32222581E+04 0.32271130E+04 + 0.32271130E+04 0.32300400E+04 0.32000979E+04 0.32005100E+04 + 0.32005100E+04 0.32046140E+04 0.32046140E+04 0.32026609E+04 + 0.32026609E+04 0.31992329E+04 0.31992329E+04 0.31994370E+04 + 0.31994370E+04 0.32046980E+04 0.32046980E+04 0.32122280E+04 + 0.32122280E+04 0.32173230E+04 0.32173230E+04 0.32228059E+04 + 0.32228059E+04 0.32288069E+04 0.32288069E+04 0.32291819E+04 + 0.32000979E+04 0.32005100E+04 0.32005100E+04 0.32046140E+04 + 0.32046140E+04 0.32026609E+04 0.32026609E+04 0.31992329E+04 + 0.31992329E+04 0.31994370E+04 0.31994370E+04 0.32046980E+04 + 0.32046980E+04 0.32122280E+04 0.32122280E+04 0.32173230E+04 + 0.32173230E+04 0.32228059E+04 0.32228059E+04 0.32288069E+04 + 0.32288069E+04 0.32291819E+04 0.31875090E+04 0.31797571E+04 + 0.31797571E+04 0.31800581E+04 0.31800581E+04 0.31772710E+04 + 0.31772710E+04 0.31845020E+04 0.31845020E+04 0.31955740E+04 + 0.31955740E+04 0.32045129E+04 0.32045129E+04 0.32100520E+04 + 0.32100520E+04 0.32143430E+04 0.32143430E+04 0.32192500E+04 + 0.32192500E+04 0.32246631E+04 0.32246631E+04 0.32277151E+04 + 0.31875090E+04 0.31797571E+04 0.31797571E+04 0.31800581E+04 + 0.31800581E+04 0.31772710E+04 0.31772710E+04 0.31845020E+04 + 0.31845020E+04 0.31955740E+04 0.31955740E+04 0.32045129E+04 + 0.32045129E+04 0.32100520E+04 0.32100520E+04 0.32143430E+04 + 0.32143430E+04 0.32192500E+04 0.32192500E+04 0.32246631E+04 + 0.32246631E+04 0.32277151E+04 0.31815730E+04 0.31766670E+04 + 0.31766670E+04 0.31793540E+04 0.31793540E+04 0.31803530E+04 + 0.31803530E+04 0.31835449E+04 0.31835449E+04 0.31896201E+04 + 0.31896201E+04 0.31940540E+04 0.31940540E+04 0.31952900E+04 + 0.31952900E+04 0.32005339E+04 0.32005339E+04 0.32108931E+04 + 0.32108931E+04 0.32210991E+04 0.32210991E+04 0.32299980E+04 + 0.31815730E+04 0.31766670E+04 0.31766670E+04 0.31793540E+04 + 0.31793540E+04 0.31803530E+04 0.31803530E+04 0.31835449E+04 + 0.31835449E+04 0.31896201E+04 0.31896201E+04 0.31940540E+04 + 0.31940540E+04 0.31952900E+04 0.31952900E+04 0.32005339E+04 + 0.32005339E+04 0.32108931E+04 0.32108931E+04 0.32210991E+04 + 0.32210991E+04 0.32299980E+04 0.31953140E+04 0.31964331E+04 + 0.31964331E+04 0.31978091E+04 0.31978091E+04 0.31949419E+04 + 0.31949419E+04 0.31866470E+04 0.31866470E+04 0.31813560E+04 + 0.31813560E+04 0.31830459E+04 0.31830459E+04 0.31887251E+04 + 0.31887251E+04 0.31942009E+04 0.31942009E+04 0.32024810E+04 + 0.32024810E+04 0.32147339E+04 0.32147339E+04 0.32271340E+04 + 0.31953140E+04 0.31964331E+04 0.31964331E+04 0.31978091E+04 + 0.31978091E+04 0.31949419E+04 0.31949419E+04 0.31866470E+04 + 0.31866470E+04 0.31813560E+04 0.31813560E+04 0.31830459E+04 + 0.31830459E+04 0.31887251E+04 0.31887251E+04 0.31942009E+04 + 0.31942009E+04 0.32024810E+04 0.32024810E+04 0.32147339E+04 + 0.32147339E+04 0.32271340E+04 0.31927571E+04 0.32006799E+04 + 0.32006799E+04 0.32052129E+04 0.32052129E+04 0.32038320E+04 + 0.32038320E+04 0.31993789E+04 0.31993789E+04 0.31931870E+04 + 0.31931870E+04 0.31914121E+04 0.31914121E+04 0.31899519E+04 + 0.31899519E+04 0.31876370E+04 0.31876370E+04 0.31929890E+04 + 0.31929890E+04 0.32064900E+04 0.32064900E+04 0.32210320E+04 + 0.31927571E+04 0.32006799E+04 0.32006799E+04 0.32052129E+04 + 0.32052129E+04 0.32038320E+04 0.32038320E+04 0.31993789E+04 + 0.31993789E+04 0.31931870E+04 0.31931870E+04 0.31914121E+04 + 0.31914121E+04 0.31899519E+04 0.31899519E+04 0.31876370E+04 + 0.31876370E+04 0.31929890E+04 0.31929890E+04 0.32064900E+04 + 0.32064900E+04 0.32210320E+04 0.31901311E+04 0.31967610E+04 + 0.31967610E+04 0.32034250E+04 0.32034250E+04 0.32028730E+04 + 0.32028730E+04 0.32013569E+04 0.32013569E+04 0.31994470E+04 + 0.31994470E+04 0.31968330E+04 0.31968330E+04 0.31883601E+04 + 0.31883601E+04 0.31833101E+04 0.31833101E+04 0.31858521E+04 + 0.31858521E+04 0.31943279E+04 0.31943279E+04 0.32049651E+04 + 0.31901311E+04 0.31967610E+04 0.31967610E+04 0.32034250E+04 + 0.32034250E+04 0.32028730E+04 0.32028730E+04 0.32013569E+04 + 0.32013569E+04 0.31994470E+04 0.31994470E+04 0.31968330E+04 + 0.31968330E+04 0.31883601E+04 0.31883601E+04 0.31833101E+04 + 0.31833101E+04 0.31858521E+04 0.31858521E+04 0.31943279E+04 + 0.31943279E+04 0.32049651E+04 0.31998330E+04 0.31997820E+04 + 0.31997820E+04 0.32077561E+04 0.32077561E+04 0.32087271E+04 + 0.32087271E+04 0.32026780E+04 0.32026780E+04 0.31986299E+04 + 0.31986299E+04 0.31955811E+04 0.31955811E+04 0.31880510E+04 + 0.31880510E+04 0.31804109E+04 0.31804109E+04 0.31822471E+04 + 0.31822471E+04 0.31869551E+04 0.31869551E+04 0.31913989E+04 + 0.31998330E+04 0.31997820E+04 0.31997820E+04 0.32077561E+04 + 0.32077561E+04 0.32087271E+04 0.32087271E+04 0.32026780E+04 + 0.32026780E+04 0.31986299E+04 0.31986299E+04 0.31955811E+04 + 0.31955811E+04 0.31880510E+04 0.31880510E+04 0.31804109E+04 + 0.31804109E+04 0.31822471E+04 0.31822471E+04 0.31869551E+04 + 0.31869551E+04 0.31913989E+04 0.32128411E+04 0.32087500E+04 + 0.32087500E+04 0.32136001E+04 0.32136001E+04 0.32140850E+04 + 0.32140850E+04 0.32075049E+04 0.32075049E+04 0.32004109E+04 + 0.32004109E+04 0.31947800E+04 0.31947800E+04 0.31868979E+04 + 0.31868979E+04 0.31790769E+04 0.31790769E+04 0.31803860E+04 + 0.31803860E+04 0.31863940E+04 0.31863940E+04 0.31950110E+04 + 0.32128411E+04 0.32087500E+04 0.32087500E+04 0.32136001E+04 + 0.32136001E+04 0.32140850E+04 0.32140850E+04 0.32075049E+04 + 0.32075049E+04 0.32004109E+04 0.32004109E+04 0.31947800E+04 + 0.31947800E+04 0.31868979E+04 0.31868979E+04 0.31790769E+04 + 0.31790769E+04 0.31803860E+04 0.31803860E+04 0.31863940E+04 + 0.31863940E+04 0.31950110E+04 0.32098560E+04 0.32079099E+04 + 0.32079099E+04 0.32101870E+04 0.32101870E+04 0.32100520E+04 + 0.32100520E+04 0.32026870E+04 0.32026870E+04 0.31938760E+04 + 0.31938760E+04 0.31888730E+04 0.31888730E+04 0.31859609E+04 + 0.31859609E+04 0.31838030E+04 0.31838030E+04 0.31854380E+04 + 0.31854380E+04 0.31901650E+04 0.31901650E+04 0.32000000E+04 + 0.32098560E+04 0.32079099E+04 0.32079099E+04 0.32101870E+04 + 0.32101870E+04 0.32100520E+04 0.32100520E+04 0.32026870E+04 + 0.32026870E+04 0.31938760E+04 0.31938760E+04 0.31888730E+04 + 0.31888730E+04 0.31859609E+04 0.31859609E+04 0.31838030E+04 + 0.31838030E+04 0.31854380E+04 0.31854380E+04 0.31901650E+04 + 0.30549690E+04 0.30560281E+04 0.32043191E+04 0.31962061E+04 + 0.31962061E+04 0.31974109E+04 0.31974109E+04 0.31991790E+04 + 0.31991790E+04 0.31951030E+04 0.31951030E+04 0.31903330E+04 + 0.31903330E+04 0.31880381E+04 0.31880381E+04 0.31868621E+04 + 0.31868621E+04 0.31864990E+04 0.31864990E+04 0.31884231E+04 + 0.31884231E+04 0.31915200E+04 0.30598521E+04 0.30573950E+04 + 0.32043191E+04 0.31962061E+04 0.31962061E+04 0.31974109E+04 + 0.31974109E+04 0.31991790E+04 0.31991790E+04 0.31951030E+04 + 0.31951030E+04 0.31903330E+04 0.31903330E+04 0.31880381E+04 + 0.31880381E+04 0.31868621E+04 0.31868621E+04 0.31864990E+04 + 0.30968660E+04 0.30939561E+04 0.30939561E+04 0.30929270E+04 + 0.30598521E+04 0.30573950E+04 0.32088291E+04 0.31924470E+04 + 0.31924470E+04 0.31895239E+04 0.31895239E+04 0.31898491E+04 + 0.31898491E+04 0.31889280E+04 0.31889280E+04 0.31874431E+04 + 0.31874431E+04 0.31853259E+04 0.31853259E+04 0.31860400E+04 + 0.31860400E+04 0.31877261E+04 0.30948159E+04 0.30949910E+04 + 0.30949910E+04 0.30939839E+04 0.30595459E+04 0.30571589E+04 + 0.32088291E+04 0.31924470E+04 0.31924470E+04 0.31895239E+04 + 0.31895239E+04 0.31898491E+04 0.31898491E+04 0.31889280E+04 + 0.31889280E+04 0.31874431E+04 0.31874431E+04 0.31853259E+04 + 0.31085000E+04 0.31044080E+04 0.31044080E+04 0.30948159E+04 + 0.30948159E+04 0.30949910E+04 0.30949910E+04 0.30939839E+04 + 0.30595459E+04 0.30571589E+04 0.32104270E+04 0.31955559E+04 + 0.31955559E+04 0.31891311E+04 0.31891311E+04 0.31860859E+04 + 0.31860859E+04 0.31842710E+04 0.31842710E+04 0.31850439E+04 + 0.31850439E+04 0.31848430E+04 0.31099419E+04 0.31073379E+04 + 0.31073379E+04 0.31020320E+04 0.31020320E+04 0.30978630E+04 + 0.30978630E+04 0.30955291E+04 0.30600271E+04 0.30577041E+04 + 0.32104270E+04 0.31955559E+04 0.31955559E+04 0.31891311E+04 + 0.31891311E+04 0.31860859E+04 0.31860859E+04 0.31842710E+04 + 0.31170979E+04 0.31136841E+04 0.31136841E+04 0.31099419E+04 + 0.31099419E+04 0.31073379E+04 0.31073379E+04 0.31020320E+04 + 0.31020320E+04 0.30978630E+04 0.30978630E+04 0.30955291E+04 + 0.30600271E+04 0.30577041E+04 0.32055239E+04 0.31974771E+04 + 0.31974771E+04 0.31901880E+04 0.31901880E+04 0.31885100E+04 + 0.31885100E+04 0.31850979E+04 0.31191121E+04 0.31163779E+04 + 0.31163779E+04 0.31127041E+04 0.31127041E+04 0.31092141E+04 + 0.31092141E+04 0.31040300E+04 0.31040300E+04 0.30989670E+04 + 0.30989670E+04 0.30963550E+04 0.30604890E+04 0.30587190E+04 + 0.32055239E+04 0.31974771E+04 0.31974771E+04 0.31901880E+04 + 0.31283730E+04 0.31245100E+04 0.31245100E+04 0.31191121E+04 + 0.31191121E+04 0.31163779E+04 0.31163779E+04 0.31127041E+04 + 0.31127041E+04 0.31092141E+04 0.31092141E+04 0.31040300E+04 + 0.31040300E+04 0.30989670E+04 0.30989670E+04 0.30963550E+04 + 0.30604890E+04 0.30587190E+04 0.32030220E+04 0.31988740E+04 + 0.31988740E+04 0.31927739E+04 0.31318120E+04 0.31278140E+04 + 0.31278140E+04 0.31218169E+04 0.31218169E+04 0.31166230E+04 + 0.31166230E+04 0.31101331E+04 0.31101331E+04 0.31066189E+04 + 0.31066189E+04 0.31046541E+04 0.31046541E+04 0.31008259E+04 + 0.31008259E+04 0.30970869E+04 0.30614670E+04 0.30594221E+04 + 0.31399929E+04 0.31369390E+04 0.31369390E+04 0.31318120E+04 + 0.31318120E+04 0.31278140E+04 0.31278140E+04 0.31218169E+04 + 0.31218169E+04 0.31166230E+04 0.31166230E+04 0.31101331E+04 + 0.31101331E+04 0.31066189E+04 0.31066189E+04 0.31046541E+04 + 0.31046541E+04 0.31008259E+04 0.31008259E+04 0.30970869E+04 + 0.30970869E+04 0.30947070E+04 0.31418020E+04 0.31398049E+04 + 0.31398049E+04 0.31375410E+04 0.31375410E+04 0.31321541E+04 + 0.31321541E+04 0.31191670E+04 0.31191670E+04 0.31110750E+04 + 0.31110750E+04 0.31063020E+04 0.31063020E+04 0.31054441E+04 + 0.31054441E+04 0.31085601E+04 0.31085601E+04 0.31042749E+04 + 0.31042749E+04 0.30983689E+04 0.30983689E+04 0.30948750E+04 + 0.32172090E+04 0.32152539E+04 0.32152539E+04 0.32180200E+04 + 0.32180200E+04 0.32190320E+04 0.32190320E+04 0.32149080E+04 + 0.32149080E+04 0.32066160E+04 0.32066160E+04 0.32044150E+04 + 0.32044150E+04 0.32082891E+04 0.32082891E+04 0.32114561E+04 + 0.32114561E+04 0.32128979E+04 0.32128979E+04 0.32177739E+04 + 0.32177739E+04 0.32254351E+04 0.32076160E+04 0.32074600E+04 + 0.32074600E+04 0.32125850E+04 0.32125850E+04 0.32143860E+04 + 0.32143860E+04 0.32114209E+04 0.32114209E+04 0.32079541E+04 + 0.32079541E+04 0.32105249E+04 0.32105249E+04 0.32168359E+04 + 0.32168359E+04 0.32199619E+04 0.32199619E+04 0.32222581E+04 + 0.32222581E+04 0.32271130E+04 0.32271130E+04 0.32300400E+04 + 0.32076160E+04 0.32074600E+04 0.32074600E+04 0.32125850E+04 + 0.32125850E+04 0.32143860E+04 0.32143860E+04 0.32114209E+04 + 0.32114209E+04 0.32079541E+04 0.32079541E+04 0.32105249E+04 + 0.32105249E+04 0.32168359E+04 0.32168359E+04 0.32199619E+04 + 0.32199619E+04 0.32222581E+04 0.32222581E+04 0.32271130E+04 + 0.32271130E+04 0.32300400E+04 0.32000979E+04 0.32005100E+04 + 0.32005100E+04 0.32046140E+04 0.32046140E+04 0.32026609E+04 + 0.32026609E+04 0.31992329E+04 0.31992329E+04 0.31994370E+04 + 0.31994370E+04 0.32046980E+04 0.32046980E+04 0.32122280E+04 + 0.32122280E+04 0.32173230E+04 0.32173230E+04 0.32228059E+04 + 0.32228059E+04 0.32288069E+04 0.32288069E+04 0.32291819E+04 + 0.32000979E+04 0.32005100E+04 0.32005100E+04 0.32046140E+04 + 0.32046140E+04 0.32026609E+04 0.32026609E+04 0.31992329E+04 + 0.31992329E+04 0.31994370E+04 0.31994370E+04 0.32046980E+04 + 0.32046980E+04 0.32122280E+04 0.32122280E+04 0.32173230E+04 + 0.32173230E+04 0.32228059E+04 0.32228059E+04 0.32288069E+04 + 0.32288069E+04 0.32291819E+04 0.31875090E+04 0.31797571E+04 + 0.31797571E+04 0.31800581E+04 0.31800581E+04 0.31772710E+04 + 0.31772710E+04 0.31845020E+04 0.31845020E+04 0.31955740E+04 + 0.31955740E+04 0.32045129E+04 0.32045129E+04 0.32100520E+04 + 0.32100520E+04 0.32143430E+04 0.32143430E+04 0.32192500E+04 + 0.32192500E+04 0.32246631E+04 0.32246631E+04 0.32277151E+04 + 0.31875090E+04 0.31797571E+04 0.31797571E+04 0.31800581E+04 + 0.31800581E+04 0.31772710E+04 0.31772710E+04 0.31845020E+04 + 0.31845020E+04 0.31955740E+04 0.31955740E+04 0.32045129E+04 + 0.32045129E+04 0.32100520E+04 0.32100520E+04 0.32143430E+04 + 0.32143430E+04 0.32192500E+04 0.32192500E+04 0.32246631E+04 + 0.32246631E+04 0.32277151E+04 0.31815730E+04 0.31766670E+04 + 0.31766670E+04 0.31793540E+04 0.31793540E+04 0.31803530E+04 + 0.31803530E+04 0.31835449E+04 0.31835449E+04 0.31896201E+04 + 0.31896201E+04 0.31940540E+04 0.31940540E+04 0.31952900E+04 + 0.31952900E+04 0.32005339E+04 0.32005339E+04 0.32108931E+04 + 0.32108931E+04 0.32210991E+04 0.32210991E+04 0.32299980E+04 + 0.31815730E+04 0.31766670E+04 0.31766670E+04 0.31793540E+04 + 0.31793540E+04 0.31803530E+04 0.31803530E+04 0.31835449E+04 + 0.31835449E+04 0.31896201E+04 0.31896201E+04 0.31940540E+04 + 0.31940540E+04 0.31952900E+04 0.31952900E+04 0.32005339E+04 + 0.32005339E+04 0.32108931E+04 0.32108931E+04 0.32210991E+04 + 0.32210991E+04 0.32299980E+04 0.31953140E+04 0.31964331E+04 + 0.31964331E+04 0.31978091E+04 0.31978091E+04 0.31949419E+04 + 0.31949419E+04 0.31866470E+04 0.31866470E+04 0.31813560E+04 + 0.31813560E+04 0.31830459E+04 0.31830459E+04 0.31887251E+04 + 0.31887251E+04 0.31942009E+04 0.31942009E+04 0.32024810E+04 + 0.32024810E+04 0.32147339E+04 0.32147339E+04 0.32271340E+04 + 0.31953140E+04 0.31964331E+04 0.31964331E+04 0.31978091E+04 + 0.31978091E+04 0.31949419E+04 0.31949419E+04 0.31866470E+04 + 0.31866470E+04 0.31813560E+04 0.31813560E+04 0.31830459E+04 + 0.31830459E+04 0.31887251E+04 0.31887251E+04 0.31942009E+04 + 0.31942009E+04 0.32024810E+04 0.32024810E+04 0.32147339E+04 + 0.32147339E+04 0.32271340E+04 0.31927571E+04 0.32006799E+04 + 0.32006799E+04 0.32052129E+04 0.32052129E+04 0.32038320E+04 + 0.32038320E+04 0.31993789E+04 0.31993789E+04 0.31931870E+04 + 0.31931870E+04 0.31914121E+04 0.31914121E+04 0.31899519E+04 + 0.31899519E+04 0.31876370E+04 0.31876370E+04 0.31929890E+04 + 0.31929890E+04 0.32064900E+04 0.32064900E+04 0.32210320E+04 + 0.31927571E+04 0.32006799E+04 0.32006799E+04 0.32052129E+04 + 0.32052129E+04 0.32038320E+04 0.32038320E+04 0.31993789E+04 + 0.31993789E+04 0.31931870E+04 0.31931870E+04 0.31914121E+04 + 0.31914121E+04 0.31899519E+04 0.31899519E+04 0.31876370E+04 + 0.31876370E+04 0.31929890E+04 0.31929890E+04 0.32064900E+04 + 0.32064900E+04 0.32210320E+04 0.31901311E+04 0.31967610E+04 + 0.31967610E+04 0.32034250E+04 0.32034250E+04 0.32028730E+04 + 0.32028730E+04 0.32013569E+04 0.32013569E+04 0.31994470E+04 + 0.31994470E+04 0.31968330E+04 0.31968330E+04 0.31883601E+04 + 0.31883601E+04 0.31833101E+04 0.31833101E+04 0.31858521E+04 + 0.31858521E+04 0.31943279E+04 0.31943279E+04 0.32049651E+04 + 0.31901311E+04 0.31967610E+04 0.31967610E+04 0.32034250E+04 + 0.32034250E+04 0.32028730E+04 0.32028730E+04 0.32013569E+04 + 0.32013569E+04 0.31994470E+04 0.31994470E+04 0.31968330E+04 + 0.31968330E+04 0.31883601E+04 0.31883601E+04 0.31833101E+04 + 0.31833101E+04 0.31858521E+04 0.31858521E+04 0.31943279E+04 + 0.31943279E+04 0.32049651E+04 0.31998330E+04 0.31997820E+04 + 0.31997820E+04 0.32077561E+04 0.32077561E+04 0.32087271E+04 + 0.32087271E+04 0.32026780E+04 0.32026780E+04 0.31986299E+04 + 0.31986299E+04 0.31955811E+04 0.31955811E+04 0.31880510E+04 + 0.31880510E+04 0.31804109E+04 0.31804109E+04 0.31822471E+04 + 0.31822471E+04 0.31869551E+04 0.31869551E+04 0.31913989E+04 + 0.31998330E+04 0.31997820E+04 0.31997820E+04 0.32077561E+04 + 0.32077561E+04 0.32087271E+04 0.32087271E+04 0.32026780E+04 + 0.32026780E+04 0.31986299E+04 0.31986299E+04 0.31955811E+04 + 0.31955811E+04 0.31880510E+04 0.31880510E+04 0.31804109E+04 + 0.31804109E+04 0.31822471E+04 0.31822471E+04 0.31869551E+04 + 0.31869551E+04 0.31913989E+04 0.32128411E+04 0.32087500E+04 + 0.32087500E+04 0.32136001E+04 0.32136001E+04 0.32140850E+04 + 0.32140850E+04 0.32075049E+04 0.32075049E+04 0.32004109E+04 + 0.32004109E+04 0.31947800E+04 0.31947800E+04 0.31868979E+04 + 0.31868979E+04 0.31790769E+04 0.31790769E+04 0.31803860E+04 + 0.31803860E+04 0.31863940E+04 0.31863940E+04 0.31950110E+04 + 0.32128411E+04 0.32087500E+04 0.32087500E+04 0.32136001E+04 + 0.32136001E+04 0.32140850E+04 0.32140850E+04 0.32075049E+04 + 0.32075049E+04 0.32004109E+04 0.32004109E+04 0.31947800E+04 + 0.31947800E+04 0.31868979E+04 0.31868979E+04 0.31790769E+04 + 0.31790769E+04 0.31803860E+04 0.31803860E+04 0.31863940E+04 + 0.31863940E+04 0.31950110E+04 0.32098560E+04 0.32079099E+04 + 0.32079099E+04 0.32101870E+04 0.32101870E+04 0.32100520E+04 + 0.32100520E+04 0.32026870E+04 0.32026870E+04 0.31938760E+04 + 0.31938760E+04 0.31888730E+04 0.31888730E+04 0.31859609E+04 + 0.31859609E+04 0.31838030E+04 0.31838030E+04 0.31854380E+04 + 0.31854380E+04 0.31901650E+04 0.31901650E+04 0.32000000E+04 + 0.32098560E+04 0.32079099E+04 0.32079099E+04 0.32101870E+04 + 0.32101870E+04 0.32100520E+04 0.32100520E+04 0.32026870E+04 + 0.32026870E+04 0.31938760E+04 0.31938760E+04 0.31888730E+04 + 0.31888730E+04 0.31859609E+04 0.31859609E+04 0.31838030E+04 + 0.31838030E+04 0.31854380E+04 0.31854380E+04 0.31901650E+04 + 0.30549690E+04 0.30560281E+04 0.32043191E+04 0.31962061E+04 + 0.31962061E+04 0.31974109E+04 0.31974109E+04 0.31991790E+04 + 0.31991790E+04 0.31951030E+04 0.31951030E+04 0.31903330E+04 + 0.31903330E+04 0.31880381E+04 0.31880381E+04 0.31868621E+04 + 0.31868621E+04 0.31864990E+04 0.31864990E+04 0.31884231E+04 + 0.31884231E+04 0.31915200E+04 0.30598521E+04 0.30573950E+04 + 0.32043191E+04 0.31962061E+04 0.31962061E+04 0.31974109E+04 + 0.31974109E+04 0.31991790E+04 0.31991790E+04 0.31951030E+04 + 0.31951030E+04 0.31903330E+04 0.31903330E+04 0.31880381E+04 + 0.31880381E+04 0.31868621E+04 0.31868621E+04 0.31864990E+04 + 0.30968660E+04 0.30939561E+04 0.30939561E+04 0.30929270E+04 + 0.30598521E+04 0.30573950E+04 0.32088291E+04 0.31924470E+04 + 0.31924470E+04 0.31895239E+04 0.31895239E+04 0.31898491E+04 + 0.31898491E+04 0.31889280E+04 0.31889280E+04 0.31874431E+04 + 0.31874431E+04 0.31853259E+04 0.31853259E+04 0.31860400E+04 + 0.31860400E+04 0.31877261E+04 0.30948159E+04 0.30949910E+04 + 0.30949910E+04 0.30939839E+04 0.30595459E+04 0.30571589E+04 + 0.32088291E+04 0.31924470E+04 0.31924470E+04 0.31895239E+04 + 0.31895239E+04 0.31898491E+04 0.31898491E+04 0.31889280E+04 + 0.31889280E+04 0.31874431E+04 0.31874431E+04 0.31853259E+04 + 0.31085000E+04 0.31044080E+04 0.31044080E+04 0.30948159E+04 + 0.30948159E+04 0.30949910E+04 0.30949910E+04 0.30939839E+04 + 0.30595459E+04 0.30571589E+04 0.32104270E+04 0.31955559E+04 + 0.31955559E+04 0.31891311E+04 0.31891311E+04 0.31860859E+04 + 0.31860859E+04 0.31842710E+04 0.31842710E+04 0.31850439E+04 + 0.31850439E+04 0.31848430E+04 0.31099419E+04 0.31073379E+04 + 0.31073379E+04 0.31020320E+04 0.31020320E+04 0.30978630E+04 + 0.30978630E+04 0.30955291E+04 0.30600271E+04 0.30577041E+04 + 0.32104270E+04 0.31955559E+04 0.31955559E+04 0.31891311E+04 + 0.31891311E+04 0.31860859E+04 0.31860859E+04 0.31842710E+04 + 0.31170979E+04 0.31136841E+04 0.31136841E+04 0.31099419E+04 + 0.31099419E+04 0.31073379E+04 0.31073379E+04 0.31020320E+04 + 0.31020320E+04 0.30978630E+04 0.30978630E+04 0.30955291E+04 + 0.30600271E+04 0.30577041E+04 0.32055239E+04 0.31974771E+04 + 0.31974771E+04 0.31901880E+04 0.31901880E+04 0.31885100E+04 + 0.31885100E+04 0.31850979E+04 0.31191121E+04 0.31163779E+04 + 0.31163779E+04 0.31127041E+04 0.31127041E+04 0.31092141E+04 + 0.31092141E+04 0.31040300E+04 0.31040300E+04 0.30989670E+04 + 0.30989670E+04 0.30963550E+04 0.30604890E+04 0.30587190E+04 + 0.32055239E+04 0.31974771E+04 0.31974771E+04 0.31901880E+04 + 0.31283730E+04 0.31245100E+04 0.31245100E+04 0.31191121E+04 + 0.31191121E+04 0.31163779E+04 0.31163779E+04 0.31127041E+04 + 0.31127041E+04 0.31092141E+04 0.31092141E+04 0.31040300E+04 + 0.31040300E+04 0.30989670E+04 0.30989670E+04 0.30963550E+04 + 0.30604890E+04 0.30587190E+04 0.32030220E+04 0.31988740E+04 + 0.31988740E+04 0.31927739E+04 0.31318120E+04 0.31278140E+04 + 0.31278140E+04 0.31218169E+04 0.31218169E+04 0.31166230E+04 + 0.31166230E+04 0.31101331E+04 0.31101331E+04 0.31066189E+04 + 0.31066189E+04 0.31046541E+04 0.31046541E+04 0.31008259E+04 + 0.31008259E+04 0.30970869E+04 0.30614670E+04 0.30594221E+04 + 0.31399929E+04 0.31369390E+04 0.31369390E+04 0.31318120E+04 + 0.31318120E+04 0.31278140E+04 0.31278140E+04 0.31218169E+04 + 0.31218169E+04 0.31166230E+04 0.31166230E+04 0.31101331E+04 + 0.31101331E+04 0.31066189E+04 0.31066189E+04 0.31046541E+04 + 0.31046541E+04 0.31008259E+04 0.31008259E+04 0.30970869E+04 + 0.30970869E+04 0.30947070E+04 0.31418020E+04 0.31398049E+04 + 0.31398049E+04 0.31375410E+04 0.31375410E+04 0.31321541E+04 + 0.31321541E+04 0.31191670E+04 0.31191670E+04 0.31110750E+04 + 0.31110750E+04 0.31063020E+04 0.31063020E+04 0.31054441E+04 + 0.31054441E+04 0.31085601E+04 0.31085601E+04 0.31042749E+04 + 0.31042749E+04 0.30983689E+04 0.30983689E+04 0.30948750E+04 + 0.32183291E+04 0.32162710E+04 0.32162710E+04 0.32190410E+04 + 0.32190410E+04 0.32201001E+04 0.32201001E+04 0.32160210E+04 + 0.32160210E+04 0.32076780E+04 0.32076780E+04 0.32053501E+04 + 0.32053501E+04 0.32091350E+04 0.32091350E+04 0.32123569E+04 + 0.32123569E+04 0.32138220E+04 0.32138220E+04 0.32186931E+04 + 0.32186931E+04 0.32263889E+04 0.32087681E+04 0.32084719E+04 + 0.32084719E+04 0.32136260E+04 0.32136260E+04 0.32155061E+04 + 0.32155061E+04 0.32125601E+04 0.32125601E+04 0.32090239E+04 + 0.32090239E+04 0.32114761E+04 0.32114761E+04 0.32177800E+04 + 0.32177800E+04 0.32210100E+04 0.32210100E+04 0.32232759E+04 + 0.32232759E+04 0.32281431E+04 0.32281431E+04 0.32309961E+04 + 0.32087681E+04 0.32084719E+04 0.32084719E+04 0.32136260E+04 + 0.32136260E+04 0.32155061E+04 0.32155061E+04 0.32125601E+04 + 0.32125601E+04 0.32090239E+04 0.32090239E+04 0.32114761E+04 + 0.32114761E+04 0.32177800E+04 0.32177800E+04 0.32210100E+04 + 0.32210100E+04 0.32232759E+04 0.32232759E+04 0.32281431E+04 + 0.32281431E+04 0.32309961E+04 0.32012849E+04 0.32015969E+04 + 0.32015969E+04 0.32057600E+04 0.32057600E+04 0.32038569E+04 + 0.32038569E+04 0.32003140E+04 0.32003140E+04 0.32003630E+04 + 0.32003630E+04 0.32055300E+04 0.32055300E+04 0.32130791E+04 + 0.32130791E+04 0.32182471E+04 0.32182471E+04 0.32237339E+04 + 0.32237339E+04 0.32298110E+04 0.32298110E+04 0.32300530E+04 + 0.32012849E+04 0.32015969E+04 0.32015969E+04 0.32057600E+04 + 0.32057600E+04 0.32038569E+04 0.32038569E+04 0.32003140E+04 + 0.32003140E+04 0.32003630E+04 0.32003630E+04 0.32055300E+04 + 0.32055300E+04 0.32130791E+04 0.32130791E+04 0.32182471E+04 + 0.32182471E+04 0.32237339E+04 0.32237339E+04 0.32298110E+04 + 0.32298110E+04 0.32300530E+04 0.31886311E+04 0.31807739E+04 + 0.31807739E+04 0.31810859E+04 0.31810859E+04 0.31781030E+04 + 0.31781030E+04 0.31851799E+04 0.31851799E+04 0.31962061E+04 + 0.31962061E+04 0.32051860E+04 0.32051860E+04 0.32108301E+04 + 0.32108301E+04 0.32151731E+04 0.32151731E+04 0.32200271E+04 + 0.32200271E+04 0.32253669E+04 0.32253669E+04 0.32282810E+04 + 0.31886311E+04 0.31807739E+04 0.31807739E+04 0.31810859E+04 + 0.31810859E+04 0.31781030E+04 0.31781030E+04 0.31851799E+04 + 0.31851799E+04 0.31962061E+04 0.31962061E+04 0.32051860E+04 + 0.32051860E+04 0.32108301E+04 0.32108301E+04 0.32151731E+04 + 0.32151731E+04 0.32200271E+04 0.32200271E+04 0.32253669E+04 + 0.32253669E+04 0.32282810E+04 0.31821250E+04 0.31772129E+04 + 0.31772129E+04 0.31799600E+04 0.31799600E+04 0.31809829E+04 + 0.31809829E+04 0.31841831E+04 0.31841831E+04 0.31902820E+04 + 0.31902820E+04 0.31947051E+04 0.31947051E+04 0.31959021E+04 + 0.31959021E+04 0.32010601E+04 0.32010601E+04 0.32113979E+04 + 0.32113979E+04 0.32215791E+04 0.32215791E+04 0.32304600E+04 + 0.31821250E+04 0.31772129E+04 0.31772129E+04 0.31799600E+04 + 0.31799600E+04 0.31809829E+04 0.31809829E+04 0.31841831E+04 + 0.31841831E+04 0.31902820E+04 0.31902820E+04 0.31947051E+04 + 0.31947051E+04 0.31959021E+04 0.31959021E+04 0.32010601E+04 + 0.32010601E+04 0.32113979E+04 0.32113979E+04 0.32215791E+04 + 0.32215791E+04 0.32304600E+04 0.31958359E+04 0.31969260E+04 + 0.31969260E+04 0.31983330E+04 0.31983330E+04 0.31955249E+04 + 0.31955249E+04 0.31872029E+04 0.31872029E+04 0.31818340E+04 + 0.31818340E+04 0.31834741E+04 0.31834741E+04 0.31891790E+04 + 0.31891790E+04 0.31946790E+04 0.31946790E+04 0.32028970E+04 + 0.32028970E+04 0.32151460E+04 0.32151460E+04 0.32275601E+04 + 0.31958359E+04 0.31969260E+04 0.31969260E+04 0.31983330E+04 + 0.31983330E+04 0.31955249E+04 0.31955249E+04 0.31872029E+04 + 0.31872029E+04 0.31818340E+04 0.31818340E+04 0.31834741E+04 + 0.31834741E+04 0.31891790E+04 0.31891790E+04 0.31946790E+04 + 0.31946790E+04 0.32028970E+04 0.32028970E+04 0.32151460E+04 + 0.32151460E+04 0.32275601E+04 0.31932461E+04 0.32011411E+04 + 0.32011411E+04 0.32057451E+04 0.32057451E+04 0.32044070E+04 + 0.32044070E+04 0.31999319E+04 0.31999319E+04 0.31936560E+04 + 0.31936560E+04 0.31918550E+04 0.31918550E+04 0.31904390E+04 + 0.31904390E+04 0.31880659E+04 0.31880659E+04 0.31933391E+04 + 0.31933391E+04 0.32068979E+04 0.32068979E+04 0.32215410E+04 + 0.31932461E+04 0.32011411E+04 0.32011411E+04 0.32057451E+04 + 0.32057451E+04 0.32044070E+04 0.32044070E+04 0.31999319E+04 + 0.31999319E+04 0.31936560E+04 0.31936560E+04 0.31918550E+04 + 0.31918550E+04 0.31904390E+04 0.31904390E+04 0.31880659E+04 + 0.31880659E+04 0.31933391E+04 0.31933391E+04 0.32068979E+04 + 0.32068979E+04 0.32215410E+04 0.31905979E+04 0.31971741E+04 + 0.31971741E+04 0.32039231E+04 0.32039231E+04 0.32033940E+04 + 0.32033940E+04 0.32018701E+04 0.32018701E+04 0.31999319E+04 + 0.31999319E+04 0.31973479E+04 0.31973479E+04 0.31888850E+04 + 0.31888850E+04 0.31837620E+04 0.31837620E+04 0.31862380E+04 + 0.31862380E+04 0.31947429E+04 0.31947429E+04 0.32054980E+04 + 0.31905979E+04 0.31971741E+04 0.31971741E+04 0.32039231E+04 + 0.32039231E+04 0.32033940E+04 0.32033940E+04 0.32018701E+04 + 0.32018701E+04 0.31999319E+04 0.31999319E+04 0.31973479E+04 + 0.31973479E+04 0.31888850E+04 0.31888850E+04 0.31837620E+04 + 0.31837620E+04 0.31862380E+04 0.31862380E+04 0.31947429E+04 + 0.31947429E+04 0.32054980E+04 0.32003420E+04 0.32001689E+04 + 0.32001689E+04 0.32081880E+04 0.32081880E+04 0.32092480E+04 + 0.32092480E+04 0.32031831E+04 0.32031831E+04 0.31991121E+04 + 0.31991121E+04 0.31960850E+04 0.31960850E+04 0.31886040E+04 + 0.31886040E+04 0.31808889E+04 0.31808889E+04 0.31826541E+04 + 0.31826541E+04 0.31873669E+04 0.31873669E+04 0.31917891E+04 + 0.32003420E+04 0.32001689E+04 0.32001689E+04 0.32081880E+04 + 0.32081880E+04 0.32092480E+04 0.32092480E+04 0.32031831E+04 + 0.32031831E+04 0.31991121E+04 0.31991121E+04 0.31960850E+04 + 0.31960850E+04 0.31886040E+04 0.31886040E+04 0.31808889E+04 + 0.31808889E+04 0.31826541E+04 0.31826541E+04 0.31873669E+04 + 0.31873669E+04 0.31917891E+04 0.32134519E+04 0.32092090E+04 + 0.32092090E+04 0.32140559E+04 0.32140559E+04 0.32146040E+04 + 0.32146040E+04 0.32080630E+04 0.32080630E+04 0.32009570E+04 + 0.32009570E+04 0.31952971E+04 0.31952971E+04 0.31874431E+04 + 0.31874431E+04 0.31795730E+04 0.31795730E+04 0.31809209E+04 + 0.31809209E+04 0.31870249E+04 0.31870249E+04 0.31957410E+04 + 0.32134519E+04 0.32092090E+04 0.32092090E+04 0.32140559E+04 + 0.32140559E+04 0.32146040E+04 0.32146040E+04 0.32080630E+04 + 0.32080630E+04 0.32009570E+04 0.32009570E+04 0.31952971E+04 + 0.31952971E+04 0.31874431E+04 0.31874431E+04 0.31795730E+04 + 0.31795730E+04 0.31809209E+04 0.31809209E+04 0.31870249E+04 + 0.31870249E+04 0.31957410E+04 0.32105259E+04 0.32084600E+04 + 0.32084600E+04 0.32107119E+04 0.32107119E+04 0.32106360E+04 + 0.32106360E+04 0.32033091E+04 0.32033091E+04 0.31945210E+04 + 0.31945210E+04 0.31894829E+04 0.31894829E+04 0.31866990E+04 + 0.31866990E+04 0.31847041E+04 0.31847041E+04 0.31864590E+04 + 0.31864590E+04 0.31910381E+04 0.31910381E+04 0.32008411E+04 + 0.32105259E+04 0.32084600E+04 0.32084600E+04 0.32107119E+04 + 0.32107119E+04 0.32106360E+04 0.32106360E+04 0.32033091E+04 + 0.32033091E+04 0.31945210E+04 0.31945210E+04 0.31894829E+04 + 0.31894829E+04 0.31866990E+04 0.31866990E+04 0.31847041E+04 + 0.31847041E+04 0.31864590E+04 0.31864590E+04 0.31910381E+04 + 0.30552729E+04 0.30563979E+04 0.32050229E+04 0.31967661E+04 + 0.31967661E+04 0.31979070E+04 0.31979070E+04 0.31997871E+04 + 0.31997871E+04 0.31958269E+04 0.31958269E+04 0.31911899E+04 + 0.31911899E+04 0.31889990E+04 0.31889990E+04 0.31879810E+04 + 0.31879810E+04 0.31875239E+04 0.31875239E+04 0.31895090E+04 + 0.31895090E+04 0.31926750E+04 0.30601621E+04 0.30577561E+04 + 0.32050229E+04 0.31967661E+04 0.31967661E+04 0.31979070E+04 + 0.31979070E+04 0.31997871E+04 0.31997871E+04 0.31958269E+04 + 0.31958269E+04 0.31911899E+04 0.31911899E+04 0.31889990E+04 + 0.31889990E+04 0.31879810E+04 0.31879810E+04 0.31875239E+04 + 0.30976240E+04 0.30947371E+04 0.30947371E+04 0.30937319E+04 + 0.30601621E+04 0.30577561E+04 0.32096270E+04 0.31930801E+04 + 0.31930801E+04 0.31901360E+04 0.31901360E+04 0.31906050E+04 + 0.31906050E+04 0.31898689E+04 0.31898689E+04 0.31885520E+04 + 0.31885520E+04 0.31863350E+04 0.31863350E+04 0.31871169E+04 + 0.31871169E+04 0.31889451E+04 0.30954839E+04 0.30957620E+04 + 0.30957620E+04 0.30948130E+04 0.30598750E+04 0.30575071E+04 + 0.32096270E+04 0.31930801E+04 0.31930801E+04 0.31901360E+04 + 0.31901360E+04 0.31906050E+04 0.31906050E+04 0.31898689E+04 + 0.31898689E+04 0.31885520E+04 0.31885520E+04 0.31863350E+04 + 0.31091860E+04 0.31051201E+04 0.31051201E+04 0.30954839E+04 + 0.30954839E+04 0.30957620E+04 0.30957620E+04 0.30948130E+04 + 0.30598750E+04 0.30575071E+04 0.32112949E+04 0.31963730E+04 + 0.31963730E+04 0.31899780E+04 0.31899780E+04 0.31868850E+04 + 0.31868850E+04 0.31851340E+04 0.31851340E+04 0.31860730E+04 + 0.31860730E+04 0.31859431E+04 0.31106101E+04 0.31080681E+04 + 0.31080681E+04 0.31028291E+04 0.31028291E+04 0.30986799E+04 + 0.30986799E+04 0.30963760E+04 0.30603799E+04 0.30580859E+04 + 0.32112949E+04 0.31963730E+04 0.31963730E+04 0.31899780E+04 + 0.31899780E+04 0.31868850E+04 0.31868850E+04 0.31851340E+04 + 0.31177251E+04 0.31143210E+04 0.31143210E+04 0.31106101E+04 + 0.31106101E+04 0.31080681E+04 0.31080681E+04 0.31028291E+04 + 0.31028291E+04 0.30986799E+04 0.30986799E+04 0.30963760E+04 + 0.30603799E+04 0.30580859E+04 0.32064280E+04 0.31982981E+04 + 0.31982981E+04 0.31909670E+04 0.31909670E+04 0.31893401E+04 + 0.31893401E+04 0.31859519E+04 0.31197639E+04 0.31170620E+04 + 0.31170620E+04 0.31133660E+04 0.31133660E+04 0.31098940E+04 + 0.31098940E+04 0.31047461E+04 0.31047461E+04 0.30998230E+04 + 0.30998230E+04 0.30972090E+04 0.30608669E+04 0.30591311E+04 + 0.32064280E+04 0.31982981E+04 0.31982981E+04 0.31909670E+04 + 0.31290200E+04 0.31251589E+04 0.31251589E+04 0.31197639E+04 + 0.31197639E+04 0.31170620E+04 0.31170620E+04 0.31133660E+04 + 0.31133660E+04 0.31098940E+04 0.31098940E+04 0.31047461E+04 + 0.31047461E+04 0.30998230E+04 0.30998230E+04 0.30972090E+04 + 0.30608669E+04 0.30591311E+04 0.32037639E+04 0.31996790E+04 + 0.31996790E+04 0.31935559E+04 0.31324771E+04 0.31285259E+04 + 0.31285259E+04 0.31225100E+04 0.31225100E+04 0.31172900E+04 + 0.31172900E+04 0.31107871E+04 0.31107871E+04 0.31073030E+04 + 0.31073030E+04 0.31053689E+04 0.31053689E+04 0.31016179E+04 + 0.31016179E+04 0.30979270E+04 0.30618640E+04 0.30598540E+04 + 0.31407190E+04 0.31376470E+04 0.31376470E+04 0.31324771E+04 + 0.31324771E+04 0.31285259E+04 0.31285259E+04 0.31225100E+04 + 0.31225100E+04 0.31172900E+04 0.31172900E+04 0.31107871E+04 + 0.31107871E+04 0.31073030E+04 0.31073030E+04 0.31053689E+04 + 0.31053689E+04 0.31016179E+04 0.31016179E+04 0.30979270E+04 + 0.30979270E+04 0.30956030E+04 0.31425291E+04 0.31405530E+04 + 0.31405530E+04 0.31382151E+04 0.31382151E+04 0.31327830E+04 + 0.31327830E+04 0.31198330E+04 0.31198330E+04 0.31116951E+04 + 0.31116951E+04 0.31069160E+04 0.31069160E+04 0.31060581E+04 + 0.31060581E+04 0.31092839E+04 0.31092839E+04 0.31050491E+04 + 0.31050491E+04 0.30992190E+04 0.30992190E+04 0.30957539E+04 + 0.32183291E+04 0.32162710E+04 0.32162710E+04 0.32190410E+04 + 0.32190410E+04 0.32201001E+04 0.32201001E+04 0.32160210E+04 + 0.32160210E+04 0.32076780E+04 0.32076780E+04 0.32053501E+04 + 0.32053501E+04 0.32091350E+04 0.32091350E+04 0.32123569E+04 + 0.32123569E+04 0.32138220E+04 0.32138220E+04 0.32186931E+04 + 0.32186931E+04 0.32263889E+04 0.32087681E+04 0.32084719E+04 + 0.32084719E+04 0.32136260E+04 0.32136260E+04 0.32155061E+04 + 0.32155061E+04 0.32125601E+04 0.32125601E+04 0.32090239E+04 + 0.32090239E+04 0.32114761E+04 0.32114761E+04 0.32177800E+04 + 0.32177800E+04 0.32210100E+04 0.32210100E+04 0.32232759E+04 + 0.32232759E+04 0.32281431E+04 0.32281431E+04 0.32309961E+04 + 0.32087681E+04 0.32084719E+04 0.32084719E+04 0.32136260E+04 + 0.32136260E+04 0.32155061E+04 0.32155061E+04 0.32125601E+04 + 0.32125601E+04 0.32090239E+04 0.32090239E+04 0.32114761E+04 + 0.32114761E+04 0.32177800E+04 0.32177800E+04 0.32210100E+04 + 0.32210100E+04 0.32232759E+04 0.32232759E+04 0.32281431E+04 + 0.32281431E+04 0.32309961E+04 0.32012849E+04 0.32015969E+04 + 0.32015969E+04 0.32057600E+04 0.32057600E+04 0.32038569E+04 + 0.32038569E+04 0.32003140E+04 0.32003140E+04 0.32003630E+04 + 0.32003630E+04 0.32055300E+04 0.32055300E+04 0.32130791E+04 + 0.32130791E+04 0.32182471E+04 0.32182471E+04 0.32237339E+04 + 0.32237339E+04 0.32298110E+04 0.32298110E+04 0.32300530E+04 + 0.32012849E+04 0.32015969E+04 0.32015969E+04 0.32057600E+04 + 0.32057600E+04 0.32038569E+04 0.32038569E+04 0.32003140E+04 + 0.32003140E+04 0.32003630E+04 0.32003630E+04 0.32055300E+04 + 0.32055300E+04 0.32130791E+04 0.32130791E+04 0.32182471E+04 + 0.32182471E+04 0.32237339E+04 0.32237339E+04 0.32298110E+04 + 0.32298110E+04 0.32300530E+04 0.31886311E+04 0.31807739E+04 + 0.31807739E+04 0.31810859E+04 0.31810859E+04 0.31781030E+04 + 0.31781030E+04 0.31851799E+04 0.31851799E+04 0.31962061E+04 + 0.31962061E+04 0.32051860E+04 0.32051860E+04 0.32108301E+04 + 0.32108301E+04 0.32151731E+04 0.32151731E+04 0.32200271E+04 + 0.32200271E+04 0.32253669E+04 0.32253669E+04 0.32282810E+04 + 0.31886311E+04 0.31807739E+04 0.31807739E+04 0.31810859E+04 + 0.31810859E+04 0.31781030E+04 0.31781030E+04 0.31851799E+04 + 0.31851799E+04 0.31962061E+04 0.31962061E+04 0.32051860E+04 + 0.32051860E+04 0.32108301E+04 0.32108301E+04 0.32151731E+04 + 0.32151731E+04 0.32200271E+04 0.32200271E+04 0.32253669E+04 + 0.32253669E+04 0.32282810E+04 0.31821250E+04 0.31772129E+04 + 0.31772129E+04 0.31799600E+04 0.31799600E+04 0.31809829E+04 + 0.31809829E+04 0.31841831E+04 0.31841831E+04 0.31902820E+04 + 0.31902820E+04 0.31947051E+04 0.31947051E+04 0.31959021E+04 + 0.31959021E+04 0.32010601E+04 0.32010601E+04 0.32113979E+04 + 0.32113979E+04 0.32215791E+04 0.32215791E+04 0.32304600E+04 + 0.31821250E+04 0.31772129E+04 0.31772129E+04 0.31799600E+04 + 0.31799600E+04 0.31809829E+04 0.31809829E+04 0.31841831E+04 + 0.31841831E+04 0.31902820E+04 0.31902820E+04 0.31947051E+04 + 0.31947051E+04 0.31959021E+04 0.31959021E+04 0.32010601E+04 + 0.32010601E+04 0.32113979E+04 0.32113979E+04 0.32215791E+04 + 0.32215791E+04 0.32304600E+04 0.31958359E+04 0.31969260E+04 + 0.31969260E+04 0.31983330E+04 0.31983330E+04 0.31955249E+04 + 0.31955249E+04 0.31872029E+04 0.31872029E+04 0.31818340E+04 + 0.31818340E+04 0.31834741E+04 0.31834741E+04 0.31891790E+04 + 0.31891790E+04 0.31946790E+04 0.31946790E+04 0.32028970E+04 + 0.32028970E+04 0.32151460E+04 0.32151460E+04 0.32275601E+04 + 0.31958359E+04 0.31969260E+04 0.31969260E+04 0.31983330E+04 + 0.31983330E+04 0.31955249E+04 0.31955249E+04 0.31872029E+04 + 0.31872029E+04 0.31818340E+04 0.31818340E+04 0.31834741E+04 + 0.31834741E+04 0.31891790E+04 0.31891790E+04 0.31946790E+04 + 0.31946790E+04 0.32028970E+04 0.32028970E+04 0.32151460E+04 + 0.32151460E+04 0.32275601E+04 0.31932461E+04 0.32011411E+04 + 0.32011411E+04 0.32057451E+04 0.32057451E+04 0.32044070E+04 + 0.32044070E+04 0.31999319E+04 0.31999319E+04 0.31936560E+04 + 0.31936560E+04 0.31918550E+04 0.31918550E+04 0.31904390E+04 + 0.31904390E+04 0.31880659E+04 0.31880659E+04 0.31933391E+04 + 0.31933391E+04 0.32068979E+04 0.32068979E+04 0.32215410E+04 + 0.31932461E+04 0.32011411E+04 0.32011411E+04 0.32057451E+04 + 0.32057451E+04 0.32044070E+04 0.32044070E+04 0.31999319E+04 + 0.31999319E+04 0.31936560E+04 0.31936560E+04 0.31918550E+04 + 0.31918550E+04 0.31904390E+04 0.31904390E+04 0.31880659E+04 + 0.31880659E+04 0.31933391E+04 0.31933391E+04 0.32068979E+04 + 0.32068979E+04 0.32215410E+04 0.31905979E+04 0.31971741E+04 + 0.31971741E+04 0.32039231E+04 0.32039231E+04 0.32033940E+04 + 0.32033940E+04 0.32018701E+04 0.32018701E+04 0.31999319E+04 + 0.31999319E+04 0.31973479E+04 0.31973479E+04 0.31888850E+04 + 0.31888850E+04 0.31837620E+04 0.31837620E+04 0.31862380E+04 + 0.31862380E+04 0.31947429E+04 0.31947429E+04 0.32054980E+04 + 0.31905979E+04 0.31971741E+04 0.31971741E+04 0.32039231E+04 + 0.32039231E+04 0.32033940E+04 0.32033940E+04 0.32018701E+04 + 0.32018701E+04 0.31999319E+04 0.31999319E+04 0.31973479E+04 + 0.31973479E+04 0.31888850E+04 0.31888850E+04 0.31837620E+04 + 0.31837620E+04 0.31862380E+04 0.31862380E+04 0.31947429E+04 + 0.31947429E+04 0.32054980E+04 0.32003420E+04 0.32001689E+04 + 0.32001689E+04 0.32081880E+04 0.32081880E+04 0.32092480E+04 + 0.32092480E+04 0.32031831E+04 0.32031831E+04 0.31991121E+04 + 0.31991121E+04 0.31960850E+04 0.31960850E+04 0.31886040E+04 + 0.31886040E+04 0.31808889E+04 0.31808889E+04 0.31826541E+04 + 0.31826541E+04 0.31873669E+04 0.31873669E+04 0.31917891E+04 + 0.32003420E+04 0.32001689E+04 0.32001689E+04 0.32081880E+04 + 0.32081880E+04 0.32092480E+04 0.32092480E+04 0.32031831E+04 + 0.32031831E+04 0.31991121E+04 0.31991121E+04 0.31960850E+04 + 0.31960850E+04 0.31886040E+04 0.31886040E+04 0.31808889E+04 + 0.31808889E+04 0.31826541E+04 0.31826541E+04 0.31873669E+04 + 0.31873669E+04 0.31917891E+04 0.32134519E+04 0.32092090E+04 + 0.32092090E+04 0.32140559E+04 0.32140559E+04 0.32146040E+04 + 0.32146040E+04 0.32080630E+04 0.32080630E+04 0.32009570E+04 + 0.32009570E+04 0.31952971E+04 0.31952971E+04 0.31874431E+04 + 0.31874431E+04 0.31795730E+04 0.31795730E+04 0.31809209E+04 + 0.31809209E+04 0.31870249E+04 0.31870249E+04 0.31957410E+04 + 0.32134519E+04 0.32092090E+04 0.32092090E+04 0.32140559E+04 + 0.32140559E+04 0.32146040E+04 0.32146040E+04 0.32080630E+04 + 0.32080630E+04 0.32009570E+04 0.32009570E+04 0.31952971E+04 + 0.31952971E+04 0.31874431E+04 0.31874431E+04 0.31795730E+04 + 0.31795730E+04 0.31809209E+04 0.31809209E+04 0.31870249E+04 + 0.31870249E+04 0.31957410E+04 0.32105259E+04 0.32084600E+04 + 0.32084600E+04 0.32107119E+04 0.32107119E+04 0.32106360E+04 + 0.32106360E+04 0.32033091E+04 0.32033091E+04 0.31945210E+04 + 0.31945210E+04 0.31894829E+04 0.31894829E+04 0.31866990E+04 + 0.31866990E+04 0.31847041E+04 0.31847041E+04 0.31864590E+04 + 0.31864590E+04 0.31910381E+04 0.31910381E+04 0.32008411E+04 + 0.32105259E+04 0.32084600E+04 0.32084600E+04 0.32107119E+04 + 0.32107119E+04 0.32106360E+04 0.32106360E+04 0.32033091E+04 + 0.32033091E+04 0.31945210E+04 0.31945210E+04 0.31894829E+04 + 0.31894829E+04 0.31866990E+04 0.31866990E+04 0.31847041E+04 + 0.31847041E+04 0.31864590E+04 0.31864590E+04 0.31910381E+04 + 0.30552729E+04 0.30563979E+04 0.32050229E+04 0.31967661E+04 + 0.31967661E+04 0.31979070E+04 0.31979070E+04 0.31997871E+04 + 0.31997871E+04 0.31958269E+04 0.31958269E+04 0.31911899E+04 + 0.31911899E+04 0.31889990E+04 0.31889990E+04 0.31879810E+04 + 0.31879810E+04 0.31875239E+04 0.31875239E+04 0.31895090E+04 + 0.31895090E+04 0.31926750E+04 0.30601621E+04 0.30577561E+04 + 0.32050229E+04 0.31967661E+04 0.31967661E+04 0.31979070E+04 + 0.31979070E+04 0.31997871E+04 0.31997871E+04 0.31958269E+04 + 0.31958269E+04 0.31911899E+04 0.31911899E+04 0.31889990E+04 + 0.31889990E+04 0.31879810E+04 0.31879810E+04 0.31875239E+04 + 0.30976240E+04 0.30947371E+04 0.30947371E+04 0.30937319E+04 + 0.30601621E+04 0.30577561E+04 0.32096270E+04 0.31930801E+04 + 0.31930801E+04 0.31901360E+04 0.31901360E+04 0.31906050E+04 + 0.31906050E+04 0.31898689E+04 0.31898689E+04 0.31885520E+04 + 0.31885520E+04 0.31863350E+04 0.31863350E+04 0.31871169E+04 + 0.31871169E+04 0.31889451E+04 0.30954839E+04 0.30957620E+04 + 0.30957620E+04 0.30948130E+04 0.30598750E+04 0.30575071E+04 + 0.32096270E+04 0.31930801E+04 0.31930801E+04 0.31901360E+04 + 0.31901360E+04 0.31906050E+04 0.31906050E+04 0.31898689E+04 + 0.31898689E+04 0.31885520E+04 0.31885520E+04 0.31863350E+04 + 0.31091860E+04 0.31051201E+04 0.31051201E+04 0.30954839E+04 + 0.30954839E+04 0.30957620E+04 0.30957620E+04 0.30948130E+04 + 0.30598750E+04 0.30575071E+04 0.32112949E+04 0.31963730E+04 + 0.31963730E+04 0.31899780E+04 0.31899780E+04 0.31868850E+04 + 0.31868850E+04 0.31851340E+04 0.31851340E+04 0.31860730E+04 + 0.31860730E+04 0.31859431E+04 0.31106101E+04 0.31080681E+04 + 0.31080681E+04 0.31028291E+04 0.31028291E+04 0.30986799E+04 + 0.30986799E+04 0.30963760E+04 0.30603799E+04 0.30580859E+04 + 0.32112949E+04 0.31963730E+04 0.31963730E+04 0.31899780E+04 + 0.31899780E+04 0.31868850E+04 0.31868850E+04 0.31851340E+04 + 0.31177251E+04 0.31143210E+04 0.31143210E+04 0.31106101E+04 + 0.31106101E+04 0.31080681E+04 0.31080681E+04 0.31028291E+04 + 0.31028291E+04 0.30986799E+04 0.30986799E+04 0.30963760E+04 + 0.30603799E+04 0.30580859E+04 0.32064280E+04 0.31982981E+04 + 0.31982981E+04 0.31909670E+04 0.31909670E+04 0.31893401E+04 + 0.31893401E+04 0.31859519E+04 0.31197639E+04 0.31170620E+04 + 0.31170620E+04 0.31133660E+04 0.31133660E+04 0.31098940E+04 + 0.31098940E+04 0.31047461E+04 0.31047461E+04 0.30998230E+04 + 0.30998230E+04 0.30972090E+04 0.30608669E+04 0.30591311E+04 + 0.32064280E+04 0.31982981E+04 0.31982981E+04 0.31909670E+04 + 0.31290200E+04 0.31251589E+04 0.31251589E+04 0.31197639E+04 + 0.31197639E+04 0.31170620E+04 0.31170620E+04 0.31133660E+04 + 0.31133660E+04 0.31098940E+04 0.31098940E+04 0.31047461E+04 + 0.31047461E+04 0.30998230E+04 0.30998230E+04 0.30972090E+04 + 0.30608669E+04 0.30591311E+04 0.32037639E+04 0.31996790E+04 + 0.31996790E+04 0.31935559E+04 0.31324771E+04 0.31285259E+04 + 0.31285259E+04 0.31225100E+04 0.31225100E+04 0.31172900E+04 + 0.31172900E+04 0.31107871E+04 0.31107871E+04 0.31073030E+04 + 0.31073030E+04 0.31053689E+04 0.31053689E+04 0.31016179E+04 + 0.31016179E+04 0.30979270E+04 0.30618640E+04 0.30598540E+04 + 0.31407190E+04 0.31376470E+04 0.31376470E+04 0.31324771E+04 + 0.31324771E+04 0.31285259E+04 0.31285259E+04 0.31225100E+04 + 0.31225100E+04 0.31172900E+04 0.31172900E+04 0.31107871E+04 + 0.31107871E+04 0.31073030E+04 0.31073030E+04 0.31053689E+04 + 0.31053689E+04 0.31016179E+04 0.31016179E+04 0.30979270E+04 + 0.30979270E+04 0.30956030E+04 0.31425291E+04 0.31405530E+04 + 0.31405530E+04 0.31382151E+04 0.31382151E+04 0.31327830E+04 + 0.31327830E+04 0.31198330E+04 0.31198330E+04 0.31116951E+04 + 0.31116951E+04 0.31069160E+04 0.31069160E+04 0.31060581E+04 + 0.31060581E+04 0.31092839E+04 0.31092839E+04 0.31050491E+04 + 0.31050491E+04 0.30992190E+04 0.30992190E+04 0.30957539E+04 + 0.32195830E+04 0.32174089E+04 0.32174089E+04 0.32201721E+04 + 0.32201721E+04 0.32212710E+04 0.32212710E+04 0.32172620E+04 + 0.32172620E+04 0.32088889E+04 0.32088889E+04 0.32064131E+04 + 0.32064131E+04 0.32100901E+04 0.32100901E+04 0.32133521E+04 + 0.32133521E+04 0.32148430E+04 0.32148430E+04 0.32197200E+04 + 0.32197200E+04 0.32274709E+04 0.32100420E+04 0.32095750E+04 + 0.32095750E+04 0.32147451E+04 0.32147451E+04 0.32167051E+04 + 0.32167051E+04 0.32138101E+04 0.32138101E+04 0.32102100E+04 + 0.32102100E+04 0.32125291E+04 0.32125291E+04 0.32188149E+04 + 0.32188149E+04 0.32221580E+04 0.32221580E+04 0.32244050E+04 + 0.32244050E+04 0.32292810E+04 0.32292810E+04 0.32321030E+04 + 0.32100420E+04 0.32095750E+04 0.32095750E+04 0.32147451E+04 + 0.32147451E+04 0.32167051E+04 0.32167051E+04 0.32138101E+04 + 0.32138101E+04 0.32102100E+04 0.32102100E+04 0.32125291E+04 + 0.32125291E+04 0.32188149E+04 0.32188149E+04 0.32221580E+04 + 0.32221580E+04 0.32244050E+04 0.32244050E+04 0.32292810E+04 + 0.32292810E+04 0.32321030E+04 0.32025669E+04 0.32027581E+04 + 0.32027581E+04 0.32069629E+04 0.32069629E+04 0.32051479E+04 + 0.32051479E+04 0.32015471E+04 0.32015471E+04 0.32014209E+04 + 0.32014209E+04 0.32064460E+04 0.32064460E+04 0.32139961E+04 + 0.32139961E+04 0.32192310E+04 0.32192310E+04 0.32247319E+04 + 0.32247319E+04 0.32308660E+04 0.32308660E+04 0.32310891E+04 + 0.32025669E+04 0.32027581E+04 0.32027581E+04 0.32069629E+04 + 0.32069629E+04 0.32051479E+04 0.32051479E+04 0.32015471E+04 + 0.32015471E+04 0.32014209E+04 0.32014209E+04 0.32064460E+04 + 0.32064460E+04 0.32139961E+04 0.32139961E+04 0.32192310E+04 + 0.32192310E+04 0.32247319E+04 0.32247319E+04 0.32308660E+04 + 0.32308660E+04 0.32310891E+04 0.31898821E+04 0.31818879E+04 + 0.31818879E+04 0.31822419E+04 0.31822419E+04 0.31790300E+04 + 0.31790300E+04 0.31859170E+04 0.31859170E+04 0.31968750E+04 + 0.31968750E+04 0.32058840E+04 0.32058840E+04 0.32116340E+04 + 0.32116340E+04 0.32160610E+04 0.32160610E+04 0.32208860E+04 + 0.32208860E+04 0.32261389E+04 0.32261389E+04 0.32289199E+04 + 0.31898821E+04 0.31818879E+04 0.31818879E+04 0.31822419E+04 + 0.31822419E+04 0.31790300E+04 0.31790300E+04 0.31859170E+04 + 0.31859170E+04 0.31968750E+04 0.31968750E+04 0.32058840E+04 + 0.32058840E+04 0.32116340E+04 0.32116340E+04 0.32160610E+04 + 0.32160610E+04 0.32208860E+04 0.32208860E+04 0.32261389E+04 + 0.32261389E+04 0.32289199E+04 0.31827241E+04 0.31777700E+04 + 0.31777700E+04 0.31805879E+04 0.31805879E+04 0.31816311E+04 + 0.31816311E+04 0.31848430E+04 0.31848430E+04 0.31909670E+04 + 0.31909670E+04 0.31953989E+04 0.31953989E+04 0.31965559E+04 + 0.31965559E+04 0.32015979E+04 0.32015979E+04 0.32119231E+04 + 0.32119231E+04 0.32220720E+04 0.32220720E+04 0.32309319E+04 + 0.31827241E+04 0.31777700E+04 0.31777700E+04 0.31805879E+04 + 0.31805879E+04 0.31816311E+04 0.31816311E+04 0.31848430E+04 + 0.31848430E+04 0.31909670E+04 0.31909670E+04 0.31953989E+04 + 0.31953989E+04 0.31965559E+04 0.31965559E+04 0.32015979E+04 + 0.32015979E+04 0.32119231E+04 0.32119231E+04 0.32220720E+04 + 0.32220720E+04 0.32309319E+04 0.31963701E+04 0.31974280E+04 + 0.31974280E+04 0.31988711E+04 0.31988711E+04 0.31961230E+04 + 0.31961230E+04 0.31877720E+04 0.31877720E+04 0.31823269E+04 + 0.31823269E+04 0.31839141E+04 0.31839141E+04 0.31896211E+04 + 0.31896211E+04 0.31951570E+04 0.31951570E+04 0.32033140E+04 + 0.32033140E+04 0.32155520E+04 0.32155520E+04 0.32279780E+04 + 0.31963701E+04 0.31974280E+04 0.31974280E+04 0.31988711E+04 + 0.31988711E+04 0.31961230E+04 0.31961230E+04 0.31877720E+04 + 0.31877720E+04 0.31823269E+04 0.31823269E+04 0.31839141E+04 + 0.31839141E+04 0.31896211E+04 0.31896211E+04 0.31951570E+04 + 0.31951570E+04 0.32033140E+04 0.32033140E+04 0.32155520E+04 + 0.32155520E+04 0.32279780E+04 0.31937549E+04 0.32016140E+04 + 0.32016140E+04 0.32062739E+04 0.32062739E+04 0.32049771E+04 + 0.32049771E+04 0.32004790E+04 0.32004790E+04 0.31941340E+04 + 0.31941340E+04 0.31922859E+04 0.31922859E+04 0.31909141E+04 + 0.31909141E+04 0.31884929E+04 0.31884929E+04 0.31936660E+04 + 0.31936660E+04 0.32072739E+04 0.32072739E+04 0.32220161E+04 + 0.31937549E+04 0.32016140E+04 0.32016140E+04 0.32062739E+04 + 0.32062739E+04 0.32049771E+04 0.32049771E+04 0.32004790E+04 + 0.32004790E+04 0.31941340E+04 0.31941340E+04 0.31922859E+04 + 0.31922859E+04 0.31909141E+04 0.31909141E+04 0.31884929E+04 + 0.31884929E+04 0.31936660E+04 0.31936660E+04 0.32072739E+04 + 0.32072739E+04 0.32220161E+04 0.31910591E+04 0.31975769E+04 + 0.31975769E+04 0.32044131E+04 0.32044131E+04 0.32039060E+04 + 0.32039060E+04 0.32023721E+04 0.32023721E+04 0.32004050E+04 + 0.32004050E+04 0.31978420E+04 0.31978420E+04 0.31893870E+04 + 0.31893870E+04 0.31841870E+04 0.31841870E+04 0.31865969E+04 + 0.31865969E+04 0.31951189E+04 0.31951189E+04 0.32059851E+04 + 0.31910591E+04 0.31975769E+04 0.31975769E+04 0.32044131E+04 + 0.32044131E+04 0.32039060E+04 0.32039060E+04 0.32023721E+04 + 0.32023721E+04 0.32004050E+04 0.32004050E+04 0.31978420E+04 + 0.31978420E+04 0.31893870E+04 0.31893870E+04 0.31841870E+04 + 0.31841870E+04 0.31865969E+04 0.31865969E+04 0.31951189E+04 + 0.31951189E+04 0.32059851E+04 0.32008311E+04 0.32005430E+04 + 0.32005430E+04 0.32086060E+04 0.32086060E+04 0.32097241E+04 + 0.32097241E+04 0.32036750E+04 0.32036750E+04 0.31995681E+04 + 0.31995681E+04 0.31965569E+04 0.31965569E+04 0.31891260E+04 + 0.31891260E+04 0.31813359E+04 0.31813359E+04 0.31830291E+04 + 0.31830291E+04 0.31877410E+04 0.31877410E+04 0.31921421E+04 + 0.32008311E+04 0.32005430E+04 0.32005430E+04 0.32086060E+04 + 0.32086060E+04 0.32097241E+04 0.32097241E+04 0.32036750E+04 + 0.32036750E+04 0.31995681E+04 0.31995681E+04 0.31965569E+04 + 0.31965569E+04 0.31891260E+04 0.31891260E+04 0.31813359E+04 + 0.31813359E+04 0.31830291E+04 0.31830291E+04 0.31877410E+04 + 0.31877410E+04 0.31921421E+04 0.32140359E+04 0.32096499E+04 + 0.32096499E+04 0.32144810E+04 0.32144810E+04 0.32150869E+04 + 0.32150869E+04 0.32085830E+04 0.32085830E+04 0.32014719E+04 + 0.32014719E+04 0.31957739E+04 0.31957739E+04 0.31879541E+04 + 0.31879541E+04 0.31799800E+04 0.31799800E+04 0.31812820E+04 + 0.31812820E+04 0.31873750E+04 0.31873750E+04 0.31961060E+04 + 0.32140359E+04 0.32096499E+04 0.32096499E+04 0.32144810E+04 + 0.32144810E+04 0.32150869E+04 0.32150869E+04 0.32085830E+04 + 0.32085830E+04 0.32014719E+04 0.32014719E+04 0.31957739E+04 + 0.31957739E+04 0.31879541E+04 0.31879541E+04 0.31799800E+04 + 0.31799800E+04 0.31812820E+04 0.31812820E+04 0.31873750E+04 + 0.31873750E+04 0.31961060E+04 0.32111780E+04 0.32089939E+04 + 0.32089939E+04 0.32112141E+04 0.32112141E+04 0.32111541E+04 + 0.32111541E+04 0.32038811E+04 0.32038811E+04 0.31950601E+04 + 0.31950601E+04 0.31899629E+04 0.31899629E+04 0.31871350E+04 + 0.31871350E+04 0.31850850E+04 0.31850850E+04 0.31868091E+04 + 0.31868091E+04 0.31914250E+04 0.31914250E+04 0.32012661E+04 + 0.32111780E+04 0.32089939E+04 0.32089939E+04 0.32112141E+04 + 0.32112141E+04 0.32111541E+04 0.32111541E+04 0.32038811E+04 + 0.32038811E+04 0.31950601E+04 0.31950601E+04 0.31899629E+04 + 0.31899629E+04 0.31871350E+04 0.31871350E+04 0.31850850E+04 + 0.31850850E+04 0.31868091E+04 0.31868091E+04 0.31914250E+04 + 0.30555359E+04 0.30567129E+04 0.32056880E+04 0.31972991E+04 + 0.31972991E+04 0.31983701E+04 0.31983701E+04 0.32003149E+04 + 0.32003149E+04 0.31963921E+04 0.31963921E+04 0.31917300E+04 + 0.31917300E+04 0.31894519E+04 0.31894519E+04 0.31883630E+04 + 0.31883630E+04 0.31879180E+04 0.31879180E+04 0.31899009E+04 + 0.31899009E+04 0.31930701E+04 0.30604309E+04 0.30580659E+04 + 0.32056880E+04 0.31972991E+04 0.31972991E+04 0.31983701E+04 + 0.31983701E+04 0.32003149E+04 0.32003149E+04 0.31963921E+04 + 0.31963921E+04 0.31917300E+04 0.31917300E+04 0.31894519E+04 + 0.31894519E+04 0.31883630E+04 0.31883630E+04 0.31879180E+04 + 0.30981770E+04 0.30953081E+04 0.30953081E+04 0.30943210E+04 + 0.30604309E+04 0.30580659E+04 0.32103831E+04 0.31936670E+04 + 0.31936670E+04 0.31906770E+04 0.31906770E+04 0.31911389E+04 + 0.31911389E+04 0.31903760E+04 0.31903760E+04 0.31890271E+04 + 0.31890271E+04 0.31867800E+04 0.31867800E+04 0.31875139E+04 + 0.31875139E+04 0.31893621E+04 0.30959771E+04 0.30963250E+04 + 0.30963250E+04 0.30954189E+04 0.30601599E+04 0.30578159E+04 + 0.32103831E+04 0.31936670E+04 0.31936670E+04 0.31906770E+04 + 0.31906770E+04 0.31911389E+04 0.31911389E+04 0.31903760E+04 + 0.31903760E+04 0.31890271E+04 0.31890271E+04 0.31867800E+04 + 0.31097161E+04 0.31056631E+04 0.31056631E+04 0.30959771E+04 + 0.30959771E+04 0.30963250E+04 0.30963250E+04 0.30954189E+04 + 0.30601599E+04 0.30578159E+04 0.32119810E+04 0.31970071E+04 + 0.31970071E+04 0.31906011E+04 0.31906011E+04 0.31874380E+04 + 0.31874380E+04 0.31856479E+04 0.31856479E+04 0.31865391E+04 + 0.31865391E+04 0.31864141E+04 0.31111421E+04 0.31086311E+04 + 0.31086311E+04 0.31034170E+04 0.31034170E+04 0.30992739E+04 + 0.30992739E+04 0.30969910E+04 0.30606741E+04 0.30584041E+04 + 0.32119810E+04 0.31970071E+04 0.31970071E+04 0.31906011E+04 + 0.31906011E+04 0.31874380E+04 0.31874380E+04 0.31856479E+04 + 0.31182170E+04 0.31148279E+04 0.31148279E+04 0.31111421E+04 + 0.31111421E+04 0.31086311E+04 0.31086311E+04 0.31034170E+04 + 0.31034170E+04 0.30992739E+04 0.30992739E+04 0.30969910E+04 + 0.30606741E+04 0.30584041E+04 0.32068630E+04 0.31988159E+04 + 0.31988159E+04 0.31915020E+04 0.31915020E+04 0.31899241E+04 + 0.31899241E+04 0.31865439E+04 0.31202800E+04 0.31175979E+04 + 0.31175979E+04 0.31139150E+04 0.31139150E+04 0.31104751E+04 + 0.31104751E+04 0.31053379E+04 0.31053379E+04 0.31004380E+04 + 0.31004380E+04 0.30978359E+04 0.30611680E+04 0.30594541E+04 + 0.32068630E+04 0.31988159E+04 0.31988159E+04 0.31915020E+04 + 0.31294910E+04 0.31256450E+04 0.31256450E+04 0.31202800E+04 + 0.31202800E+04 0.31175979E+04 0.31175979E+04 0.31139150E+04 + 0.31139150E+04 0.31104751E+04 0.31104751E+04 0.31053379E+04 + 0.31053379E+04 0.31004380E+04 0.31004380E+04 0.30978359E+04 + 0.30611680E+04 0.30594541E+04 0.32042361E+04 0.32001560E+04 + 0.32001560E+04 0.31940491E+04 0.31329490E+04 0.31290449E+04 + 0.31290449E+04 0.31230779E+04 0.31230779E+04 0.31178640E+04 + 0.31178640E+04 0.31113459E+04 0.31113459E+04 0.31078811E+04 + 0.31078811E+04 0.31059790E+04 0.31059790E+04 0.31022300E+04 + 0.31022300E+04 0.30985520E+04 0.30621750E+04 0.30601990E+04 + 0.31411279E+04 0.31380730E+04 0.31380730E+04 0.31329490E+04 + 0.31329490E+04 0.31290449E+04 0.31290449E+04 0.31230779E+04 + 0.31230779E+04 0.31178640E+04 0.31178640E+04 0.31113459E+04 + 0.31113459E+04 0.31078811E+04 0.31078811E+04 0.31059790E+04 + 0.31059790E+04 0.31022300E+04 0.31022300E+04 0.30985520E+04 + 0.30985520E+04 0.30962539E+04 0.31429390E+04 0.31409761E+04 + 0.31409761E+04 0.31387070E+04 0.31387070E+04 0.31333340E+04 + 0.31333340E+04 0.31204241E+04 0.31204241E+04 0.31122329E+04 + 0.31122329E+04 0.31074431E+04 0.31074431E+04 0.31065691E+04 + 0.31065691E+04 0.31098779E+04 0.31098779E+04 0.31056609E+04 + 0.31056609E+04 0.30998379E+04 0.30998379E+04 0.30963811E+04 + 0.32195830E+04 0.32174089E+04 0.32174089E+04 0.32201721E+04 + 0.32201721E+04 0.32212710E+04 0.32212710E+04 0.32172620E+04 + 0.32172620E+04 0.32088889E+04 0.32088889E+04 0.32064131E+04 + 0.32064131E+04 0.32100901E+04 0.32100901E+04 0.32133521E+04 + 0.32133521E+04 0.32148430E+04 0.32148430E+04 0.32197200E+04 + 0.32197200E+04 0.32274709E+04 0.32100420E+04 0.32095750E+04 + 0.32095750E+04 0.32147451E+04 0.32147451E+04 0.32167051E+04 + 0.32167051E+04 0.32138101E+04 0.32138101E+04 0.32102100E+04 + 0.32102100E+04 0.32125291E+04 0.32125291E+04 0.32188149E+04 + 0.32188149E+04 0.32221580E+04 0.32221580E+04 0.32244050E+04 + 0.32244050E+04 0.32292810E+04 0.32292810E+04 0.32321030E+04 + 0.32100420E+04 0.32095750E+04 0.32095750E+04 0.32147451E+04 + 0.32147451E+04 0.32167051E+04 0.32167051E+04 0.32138101E+04 + 0.32138101E+04 0.32102100E+04 0.32102100E+04 0.32125291E+04 + 0.32125291E+04 0.32188149E+04 0.32188149E+04 0.32221580E+04 + 0.32221580E+04 0.32244050E+04 0.32244050E+04 0.32292810E+04 + 0.32292810E+04 0.32321030E+04 0.32025669E+04 0.32027581E+04 + 0.32027581E+04 0.32069629E+04 0.32069629E+04 0.32051479E+04 + 0.32051479E+04 0.32015471E+04 0.32015471E+04 0.32014209E+04 + 0.32014209E+04 0.32064460E+04 0.32064460E+04 0.32139961E+04 + 0.32139961E+04 0.32192310E+04 0.32192310E+04 0.32247319E+04 + 0.32247319E+04 0.32308660E+04 0.32308660E+04 0.32310891E+04 + 0.32025669E+04 0.32027581E+04 0.32027581E+04 0.32069629E+04 + 0.32069629E+04 0.32051479E+04 0.32051479E+04 0.32015471E+04 + 0.32015471E+04 0.32014209E+04 0.32014209E+04 0.32064460E+04 + 0.32064460E+04 0.32139961E+04 0.32139961E+04 0.32192310E+04 + 0.32192310E+04 0.32247319E+04 0.32247319E+04 0.32308660E+04 + 0.32308660E+04 0.32310891E+04 0.31898821E+04 0.31818879E+04 + 0.31818879E+04 0.31822419E+04 0.31822419E+04 0.31790300E+04 + 0.31790300E+04 0.31859170E+04 0.31859170E+04 0.31968750E+04 + 0.31968750E+04 0.32058840E+04 0.32058840E+04 0.32116340E+04 + 0.32116340E+04 0.32160610E+04 0.32160610E+04 0.32208860E+04 + 0.32208860E+04 0.32261389E+04 0.32261389E+04 0.32289199E+04 + 0.31898821E+04 0.31818879E+04 0.31818879E+04 0.31822419E+04 + 0.31822419E+04 0.31790300E+04 0.31790300E+04 0.31859170E+04 + 0.31859170E+04 0.31968750E+04 0.31968750E+04 0.32058840E+04 + 0.32058840E+04 0.32116340E+04 0.32116340E+04 0.32160610E+04 + 0.32160610E+04 0.32208860E+04 0.32208860E+04 0.32261389E+04 + 0.32261389E+04 0.32289199E+04 0.31827241E+04 0.31777700E+04 + 0.31777700E+04 0.31805879E+04 0.31805879E+04 0.31816311E+04 + 0.31816311E+04 0.31848430E+04 0.31848430E+04 0.31909670E+04 + 0.31909670E+04 0.31953989E+04 0.31953989E+04 0.31965559E+04 + 0.31965559E+04 0.32015979E+04 0.32015979E+04 0.32119231E+04 + 0.32119231E+04 0.32220720E+04 0.32220720E+04 0.32309319E+04 + 0.31827241E+04 0.31777700E+04 0.31777700E+04 0.31805879E+04 + 0.31805879E+04 0.31816311E+04 0.31816311E+04 0.31848430E+04 + 0.31848430E+04 0.31909670E+04 0.31909670E+04 0.31953989E+04 + 0.31953989E+04 0.31965559E+04 0.31965559E+04 0.32015979E+04 + 0.32015979E+04 0.32119231E+04 0.32119231E+04 0.32220720E+04 + 0.32220720E+04 0.32309319E+04 0.31963701E+04 0.31974280E+04 + 0.31974280E+04 0.31988711E+04 0.31988711E+04 0.31961230E+04 + 0.31961230E+04 0.31877720E+04 0.31877720E+04 0.31823269E+04 + 0.31823269E+04 0.31839141E+04 0.31839141E+04 0.31896211E+04 + 0.31896211E+04 0.31951570E+04 0.31951570E+04 0.32033140E+04 + 0.32033140E+04 0.32155520E+04 0.32155520E+04 0.32279780E+04 + 0.31963701E+04 0.31974280E+04 0.31974280E+04 0.31988711E+04 + 0.31988711E+04 0.31961230E+04 0.31961230E+04 0.31877720E+04 + 0.31877720E+04 0.31823269E+04 0.31823269E+04 0.31839141E+04 + 0.31839141E+04 0.31896211E+04 0.31896211E+04 0.31951570E+04 + 0.31951570E+04 0.32033140E+04 0.32033140E+04 0.32155520E+04 + 0.32155520E+04 0.32279780E+04 0.31937549E+04 0.32016140E+04 + 0.32016140E+04 0.32062739E+04 0.32062739E+04 0.32049771E+04 + 0.32049771E+04 0.32004790E+04 0.32004790E+04 0.31941340E+04 + 0.31941340E+04 0.31922859E+04 0.31922859E+04 0.31909141E+04 + 0.31909141E+04 0.31884929E+04 0.31884929E+04 0.31936660E+04 + 0.31936660E+04 0.32072739E+04 0.32072739E+04 0.32220161E+04 + 0.31937549E+04 0.32016140E+04 0.32016140E+04 0.32062739E+04 + 0.32062739E+04 0.32049771E+04 0.32049771E+04 0.32004790E+04 + 0.32004790E+04 0.31941340E+04 0.31941340E+04 0.31922859E+04 + 0.31922859E+04 0.31909141E+04 0.31909141E+04 0.31884929E+04 + 0.31884929E+04 0.31936660E+04 0.31936660E+04 0.32072739E+04 + 0.32072739E+04 0.32220161E+04 0.31910591E+04 0.31975769E+04 + 0.31975769E+04 0.32044131E+04 0.32044131E+04 0.32039060E+04 + 0.32039060E+04 0.32023721E+04 0.32023721E+04 0.32004050E+04 + 0.32004050E+04 0.31978420E+04 0.31978420E+04 0.31893870E+04 + 0.31893870E+04 0.31841870E+04 0.31841870E+04 0.31865969E+04 + 0.31865969E+04 0.31951189E+04 0.31951189E+04 0.32059851E+04 + 0.31910591E+04 0.31975769E+04 0.31975769E+04 0.32044131E+04 + 0.32044131E+04 0.32039060E+04 0.32039060E+04 0.32023721E+04 + 0.32023721E+04 0.32004050E+04 0.32004050E+04 0.31978420E+04 + 0.31978420E+04 0.31893870E+04 0.31893870E+04 0.31841870E+04 + 0.31841870E+04 0.31865969E+04 0.31865969E+04 0.31951189E+04 + 0.31951189E+04 0.32059851E+04 0.32008311E+04 0.32005430E+04 + 0.32005430E+04 0.32086060E+04 0.32086060E+04 0.32097241E+04 + 0.32097241E+04 0.32036750E+04 0.32036750E+04 0.31995681E+04 + 0.31995681E+04 0.31965569E+04 0.31965569E+04 0.31891260E+04 + 0.31891260E+04 0.31813359E+04 0.31813359E+04 0.31830291E+04 + 0.31830291E+04 0.31877410E+04 0.31877410E+04 0.31921421E+04 + 0.32008311E+04 0.32005430E+04 0.32005430E+04 0.32086060E+04 + 0.32086060E+04 0.32097241E+04 0.32097241E+04 0.32036750E+04 + 0.32036750E+04 0.31995681E+04 0.31995681E+04 0.31965569E+04 + 0.31965569E+04 0.31891260E+04 0.31891260E+04 0.31813359E+04 + 0.31813359E+04 0.31830291E+04 0.31830291E+04 0.31877410E+04 + 0.31877410E+04 0.31921421E+04 0.32140359E+04 0.32096499E+04 + 0.32096499E+04 0.32144810E+04 0.32144810E+04 0.32150869E+04 + 0.32150869E+04 0.32085830E+04 0.32085830E+04 0.32014719E+04 + 0.32014719E+04 0.31957739E+04 0.31957739E+04 0.31879541E+04 + 0.31879541E+04 0.31799800E+04 0.31799800E+04 0.31812820E+04 + 0.31812820E+04 0.31873750E+04 0.31873750E+04 0.31961060E+04 + 0.32140359E+04 0.32096499E+04 0.32096499E+04 0.32144810E+04 + 0.32144810E+04 0.32150869E+04 0.32150869E+04 0.32085830E+04 + 0.32085830E+04 0.32014719E+04 0.32014719E+04 0.31957739E+04 + 0.31957739E+04 0.31879541E+04 0.31879541E+04 0.31799800E+04 + 0.31799800E+04 0.31812820E+04 0.31812820E+04 0.31873750E+04 + 0.31873750E+04 0.31961060E+04 0.32111780E+04 0.32089939E+04 + 0.32089939E+04 0.32112141E+04 0.32112141E+04 0.32111541E+04 + 0.32111541E+04 0.32038811E+04 0.32038811E+04 0.31950601E+04 + 0.31950601E+04 0.31899629E+04 0.31899629E+04 0.31871350E+04 + 0.31871350E+04 0.31850850E+04 0.31850850E+04 0.31868091E+04 + 0.31868091E+04 0.31914250E+04 0.31914250E+04 0.32012661E+04 + 0.32111780E+04 0.32089939E+04 0.32089939E+04 0.32112141E+04 + 0.32112141E+04 0.32111541E+04 0.32111541E+04 0.32038811E+04 + 0.32038811E+04 0.31950601E+04 0.31950601E+04 0.31899629E+04 + 0.31899629E+04 0.31871350E+04 0.31871350E+04 0.31850850E+04 + 0.31850850E+04 0.31868091E+04 0.31868091E+04 0.31914250E+04 + 0.30555359E+04 0.30567129E+04 0.32056880E+04 0.31972991E+04 + 0.31972991E+04 0.31983701E+04 0.31983701E+04 0.32003149E+04 + 0.32003149E+04 0.31963921E+04 0.31963921E+04 0.31917300E+04 + 0.31917300E+04 0.31894519E+04 0.31894519E+04 0.31883630E+04 + 0.31883630E+04 0.31879180E+04 0.31879180E+04 0.31899009E+04 + 0.31899009E+04 0.31930701E+04 0.30604309E+04 0.30580659E+04 + 0.32056880E+04 0.31972991E+04 0.31972991E+04 0.31983701E+04 + 0.31983701E+04 0.32003149E+04 0.32003149E+04 0.31963921E+04 + 0.31963921E+04 0.31917300E+04 0.31917300E+04 0.31894519E+04 + 0.31894519E+04 0.31883630E+04 0.31883630E+04 0.31879180E+04 + 0.30981770E+04 0.30953081E+04 0.30953081E+04 0.30943210E+04 + 0.30604309E+04 0.30580659E+04 0.32103831E+04 0.31936670E+04 + 0.31936670E+04 0.31906770E+04 0.31906770E+04 0.31911389E+04 + 0.31911389E+04 0.31903760E+04 0.31903760E+04 0.31890271E+04 + 0.31890271E+04 0.31867800E+04 0.31867800E+04 0.31875139E+04 + 0.31875139E+04 0.31893621E+04 0.30959771E+04 0.30963250E+04 + 0.30963250E+04 0.30954189E+04 0.30601599E+04 0.30578159E+04 + 0.32103831E+04 0.31936670E+04 0.31936670E+04 0.31906770E+04 + 0.31906770E+04 0.31911389E+04 0.31911389E+04 0.31903760E+04 + 0.31903760E+04 0.31890271E+04 0.31890271E+04 0.31867800E+04 + 0.31097161E+04 0.31056631E+04 0.31056631E+04 0.30959771E+04 + 0.30959771E+04 0.30963250E+04 0.30963250E+04 0.30954189E+04 + 0.30601599E+04 0.30578159E+04 0.32119810E+04 0.31970071E+04 + 0.31970071E+04 0.31906011E+04 0.31906011E+04 0.31874380E+04 + 0.31874380E+04 0.31856479E+04 0.31856479E+04 0.31865391E+04 + 0.31865391E+04 0.31864141E+04 0.31111421E+04 0.31086311E+04 + 0.31086311E+04 0.31034170E+04 0.31034170E+04 0.30992739E+04 + 0.30992739E+04 0.30969910E+04 0.30606741E+04 0.30584041E+04 + 0.32119810E+04 0.31970071E+04 0.31970071E+04 0.31906011E+04 + 0.31906011E+04 0.31874380E+04 0.31874380E+04 0.31856479E+04 + 0.31182170E+04 0.31148279E+04 0.31148279E+04 0.31111421E+04 + 0.31111421E+04 0.31086311E+04 0.31086311E+04 0.31034170E+04 + 0.31034170E+04 0.30992739E+04 0.30992739E+04 0.30969910E+04 + 0.30606741E+04 0.30584041E+04 0.32068630E+04 0.31988159E+04 + 0.31988159E+04 0.31915020E+04 0.31915020E+04 0.31899241E+04 + 0.31899241E+04 0.31865439E+04 0.31202800E+04 0.31175979E+04 + 0.31175979E+04 0.31139150E+04 0.31139150E+04 0.31104751E+04 + 0.31104751E+04 0.31053379E+04 0.31053379E+04 0.31004380E+04 + 0.31004380E+04 0.30978359E+04 0.30611680E+04 0.30594541E+04 + 0.32068630E+04 0.31988159E+04 0.31988159E+04 0.31915020E+04 + 0.31294910E+04 0.31256450E+04 0.31256450E+04 0.31202800E+04 + 0.31202800E+04 0.31175979E+04 0.31175979E+04 0.31139150E+04 + 0.31139150E+04 0.31104751E+04 0.31104751E+04 0.31053379E+04 + 0.31053379E+04 0.31004380E+04 0.31004380E+04 0.30978359E+04 + 0.30611680E+04 0.30594541E+04 0.32042361E+04 0.32001560E+04 + 0.32001560E+04 0.31940491E+04 0.31329490E+04 0.31290449E+04 + 0.31290449E+04 0.31230779E+04 0.31230779E+04 0.31178640E+04 + 0.31178640E+04 0.31113459E+04 0.31113459E+04 0.31078811E+04 + 0.31078811E+04 0.31059790E+04 0.31059790E+04 0.31022300E+04 + 0.31022300E+04 0.30985520E+04 0.30621750E+04 0.30601990E+04 + 0.31411279E+04 0.31380730E+04 0.31380730E+04 0.31329490E+04 + 0.31329490E+04 0.31290449E+04 0.31290449E+04 0.31230779E+04 + 0.31230779E+04 0.31178640E+04 0.31178640E+04 0.31113459E+04 + 0.31113459E+04 0.31078811E+04 0.31078811E+04 0.31059790E+04 + 0.31059790E+04 0.31022300E+04 0.31022300E+04 0.30985520E+04 + 0.30985520E+04 0.30962539E+04 0.31429390E+04 0.31409761E+04 + 0.31409761E+04 0.31387070E+04 0.31387070E+04 0.31333340E+04 + 0.31333340E+04 0.31204241E+04 0.31204241E+04 0.31122329E+04 + 0.31122329E+04 0.31074431E+04 0.31074431E+04 0.31065691E+04 + 0.31065691E+04 0.31098779E+04 0.31098779E+04 0.31056609E+04 + 0.31056609E+04 0.30998379E+04 0.30998379E+04 0.30963811E+04 + 0.32208379E+04 0.32185471E+04 0.32185471E+04 0.32213030E+04 + 0.32213030E+04 0.32224419E+04 0.32224419E+04 0.32185039E+04 + 0.32185039E+04 0.32100991E+04 0.32100991E+04 0.32074761E+04 + 0.32074761E+04 0.32110449E+04 0.32110449E+04 0.32143479E+04 + 0.32143479E+04 0.32158630E+04 0.32158630E+04 0.32207471E+04 + 0.32207471E+04 0.32285530E+04 0.32113149E+04 0.32106780E+04 + 0.32106780E+04 0.32158640E+04 0.32158640E+04 0.32179041E+04 + 0.32179041E+04 0.32150601E+04 0.32150601E+04 0.32113950E+04 + 0.32113950E+04 0.32135820E+04 0.32135820E+04 0.32198491E+04 + 0.32198491E+04 0.32233059E+04 0.32233059E+04 0.32255339E+04 + 0.32255339E+04 0.32304189E+04 0.32304189E+04 0.32332100E+04 + 0.32113149E+04 0.32106780E+04 0.32106780E+04 0.32158640E+04 + 0.32158640E+04 0.32179041E+04 0.32179041E+04 0.32150601E+04 + 0.32150601E+04 0.32113950E+04 0.32113950E+04 0.32135820E+04 + 0.32135820E+04 0.32198491E+04 0.32198491E+04 0.32233059E+04 + 0.32233059E+04 0.32255339E+04 0.32255339E+04 0.32304189E+04 + 0.32304189E+04 0.32332100E+04 0.32038491E+04 0.32039189E+04 + 0.32039189E+04 0.32081660E+04 0.32081660E+04 0.32064399E+04 + 0.32064399E+04 0.32027800E+04 0.32027800E+04 0.32024790E+04 + 0.32024790E+04 0.32073621E+04 0.32073621E+04 0.32149121E+04 + 0.32149121E+04 0.32202161E+04 0.32202161E+04 0.32257310E+04 + 0.32257310E+04 0.32319199E+04 0.32319199E+04 0.32321250E+04 + 0.32038491E+04 0.32039189E+04 0.32039189E+04 0.32081660E+04 + 0.32081660E+04 0.32064399E+04 0.32064399E+04 0.32027800E+04 + 0.32027800E+04 0.32024790E+04 0.32024790E+04 0.32073621E+04 + 0.32073621E+04 0.32149121E+04 0.32149121E+04 0.32202161E+04 + 0.32202161E+04 0.32257310E+04 0.32257310E+04 0.32319199E+04 + 0.32319199E+04 0.32321250E+04 0.31911331E+04 0.31830010E+04 + 0.31830010E+04 0.31833979E+04 0.31833979E+04 0.31799570E+04 + 0.31799570E+04 0.31866550E+04 0.31866550E+04 0.31975430E+04 + 0.31975430E+04 0.32065811E+04 0.32065811E+04 0.32124390E+04 + 0.32124390E+04 0.32169480E+04 0.32169480E+04 0.32217451E+04 + 0.32217451E+04 0.32269109E+04 0.32269109E+04 0.32295591E+04 + 0.31911331E+04 0.31830010E+04 0.31830010E+04 0.31833979E+04 + 0.31833979E+04 0.31799570E+04 0.31799570E+04 0.31866550E+04 + 0.31866550E+04 0.31975430E+04 0.31975430E+04 0.32065811E+04 + 0.32065811E+04 0.32124390E+04 0.32124390E+04 0.32169480E+04 + 0.32169480E+04 0.32217451E+04 0.32217451E+04 0.32269109E+04 + 0.32269109E+04 0.32295591E+04 0.31833240E+04 0.31783259E+04 + 0.31783259E+04 0.31812151E+04 0.31812151E+04 0.31822791E+04 + 0.31822791E+04 0.31855029E+04 0.31855029E+04 0.31916521E+04 + 0.31916521E+04 0.31960930E+04 0.31960930E+04 0.31972100E+04 + 0.31972100E+04 0.32021360E+04 0.32021360E+04 0.32124470E+04 + 0.32124470E+04 0.32225640E+04 0.32225640E+04 0.32314031E+04 + 0.31833240E+04 0.31783259E+04 0.31783259E+04 0.31812151E+04 + 0.31812151E+04 0.31822791E+04 0.31822791E+04 0.31855029E+04 + 0.31855029E+04 0.31916521E+04 0.31916521E+04 0.31960930E+04 + 0.31960930E+04 0.31972100E+04 0.31972100E+04 0.32021360E+04 + 0.32021360E+04 0.32124470E+04 0.32124470E+04 0.32225640E+04 + 0.32225640E+04 0.32314031E+04 0.31969041E+04 0.31979290E+04 + 0.31979290E+04 0.31994080E+04 0.31994080E+04 0.31967200E+04 + 0.31967200E+04 0.31883420E+04 0.31883420E+04 0.31828210E+04 + 0.31828210E+04 0.31843530E+04 0.31843530E+04 0.31900630E+04 + 0.31900630E+04 0.31956360E+04 0.31956360E+04 0.32037310E+04 + 0.32037310E+04 0.32159590E+04 0.32159590E+04 0.32283960E+04 + 0.31969041E+04 0.31979290E+04 0.31979290E+04 0.31994080E+04 + 0.31994080E+04 0.31967200E+04 0.31967200E+04 0.31883420E+04 + 0.31883420E+04 0.31828210E+04 0.31828210E+04 0.31843530E+04 + 0.31843530E+04 0.31900630E+04 0.31900630E+04 0.31956360E+04 + 0.31956360E+04 0.32037310E+04 0.32037310E+04 0.32159590E+04 + 0.32159590E+04 0.32283960E+04 0.31942629E+04 0.32020859E+04 + 0.32020859E+04 0.32068040E+04 0.32068040E+04 0.32055471E+04 + 0.32055471E+04 0.32010271E+04 0.32010271E+04 0.31946121E+04 + 0.31946121E+04 0.31927170E+04 0.31927170E+04 0.31913889E+04 + 0.31913889E+04 0.31889199E+04 0.31889199E+04 0.31939929E+04 + 0.31939929E+04 0.32076499E+04 0.32076499E+04 0.32224910E+04 + 0.31942629E+04 0.32020859E+04 0.32020859E+04 0.32068040E+04 + 0.32068040E+04 0.32055471E+04 0.32055471E+04 0.32010271E+04 + 0.32010271E+04 0.31946121E+04 0.31946121E+04 0.31927170E+04 + 0.31927170E+04 0.31913889E+04 0.31913889E+04 0.31889199E+04 + 0.31889199E+04 0.31939929E+04 0.31939929E+04 0.32076499E+04 + 0.32076499E+04 0.32224910E+04 0.31915200E+04 0.31979790E+04 + 0.31979790E+04 0.32049031E+04 0.32049031E+04 0.32044180E+04 + 0.32044180E+04 0.32028740E+04 0.32028740E+04 0.32008770E+04 + 0.32008770E+04 0.31983350E+04 0.31983350E+04 0.31898899E+04 + 0.31898899E+04 0.31846121E+04 0.31846121E+04 0.31869570E+04 + 0.31869570E+04 0.31954951E+04 0.31954951E+04 0.32064719E+04 + 0.31915200E+04 0.31979790E+04 0.31979790E+04 0.32049031E+04 + 0.32049031E+04 0.32044180E+04 0.32044180E+04 0.32028740E+04 + 0.32028740E+04 0.32008770E+04 0.32008770E+04 0.31983350E+04 + 0.31983350E+04 0.31898899E+04 0.31898899E+04 0.31846121E+04 + 0.31846121E+04 0.31869570E+04 0.31869570E+04 0.31954951E+04 + 0.31954951E+04 0.32064719E+04 0.32013191E+04 0.32009170E+04 + 0.32009170E+04 0.32090229E+04 0.32090229E+04 0.32102009E+04 + 0.32102009E+04 0.32041660E+04 0.32041660E+04 0.32000249E+04 + 0.32000249E+04 0.31970291E+04 0.31970291E+04 0.31896479E+04 + 0.31896479E+04 0.31817830E+04 0.31817830E+04 0.31834041E+04 + 0.31834041E+04 0.31881140E+04 0.31881140E+04 0.31924951E+04 + 0.32013191E+04 0.32009170E+04 0.32009170E+04 0.32090229E+04 + 0.32090229E+04 0.32102009E+04 0.32102009E+04 0.32041660E+04 + 0.32041660E+04 0.32000249E+04 0.32000249E+04 0.31970291E+04 + 0.31970291E+04 0.31896479E+04 0.31896479E+04 0.31817830E+04 + 0.31817830E+04 0.31834041E+04 0.31834041E+04 0.31881140E+04 + 0.31881140E+04 0.31924951E+04 0.32146201E+04 0.32100911E+04 + 0.32100911E+04 0.32149060E+04 0.32149060E+04 0.32155691E+04 + 0.32155691E+04 0.32091040E+04 0.32091040E+04 0.32019880E+04 + 0.32019880E+04 0.31962520E+04 0.31962520E+04 0.31884641E+04 + 0.31884641E+04 0.31803870E+04 0.31803870E+04 0.31816431E+04 + 0.31816431E+04 0.31877241E+04 0.31877241E+04 0.31964719E+04 + 0.32146201E+04 0.32100911E+04 0.32100911E+04 0.32149060E+04 + 0.32149060E+04 0.32155691E+04 0.32155691E+04 0.32091040E+04 + 0.32091040E+04 0.32019880E+04 0.32019880E+04 0.31962520E+04 + 0.31962520E+04 0.31884641E+04 0.31884641E+04 0.31803870E+04 + 0.31803870E+04 0.31816431E+04 0.31816431E+04 0.31877241E+04 + 0.31877241E+04 0.31964719E+04 0.32118301E+04 0.32095281E+04 + 0.32095281E+04 0.32117151E+04 0.32117151E+04 0.32116709E+04 + 0.32116709E+04 0.32044519E+04 0.32044519E+04 0.31956001E+04 + 0.31956001E+04 0.31904419E+04 0.31904419E+04 0.31875720E+04 + 0.31875720E+04 0.31854661E+04 0.31854661E+04 0.31871589E+04 + 0.31871589E+04 0.31918120E+04 0.31918120E+04 0.32016909E+04 + 0.32118301E+04 0.32095281E+04 0.32095281E+04 0.32117151E+04 + 0.32117151E+04 0.32116709E+04 0.32116709E+04 0.32044519E+04 + 0.32044519E+04 0.31956001E+04 0.31956001E+04 0.31904419E+04 + 0.31904419E+04 0.31875720E+04 0.31875720E+04 0.31854661E+04 + 0.31854661E+04 0.31871589E+04 0.31871589E+04 0.31918120E+04 + 0.30557981E+04 0.30570291E+04 0.32063530E+04 0.31978320E+04 + 0.31978320E+04 0.31988320E+04 0.31988320E+04 0.32008440E+04 + 0.32008440E+04 0.31969561E+04 0.31969561E+04 0.31922700E+04 + 0.31922700E+04 0.31899041E+04 0.31899041E+04 0.31887451E+04 + 0.31887451E+04 0.31883110E+04 0.31883110E+04 0.31902920E+04 + 0.31902920E+04 0.31934661E+04 0.30607000E+04 0.30583770E+04 + 0.32063530E+04 0.31978320E+04 0.31978320E+04 0.31988320E+04 + 0.31988320E+04 0.32008440E+04 0.32008440E+04 0.31969561E+04 + 0.31969561E+04 0.31922700E+04 0.31922700E+04 0.31899041E+04 + 0.31899041E+04 0.31887451E+04 0.31887451E+04 0.31883110E+04 + 0.30987310E+04 0.30958789E+04 0.30958789E+04 0.30949099E+04 + 0.30607000E+04 0.30583770E+04 0.32111389E+04 0.31942529E+04 + 0.31942529E+04 0.31912190E+04 0.31912190E+04 0.31916731E+04 + 0.31916731E+04 0.31908840E+04 0.31908840E+04 0.31895020E+04 + 0.31895020E+04 0.31872241E+04 0.31872241E+04 0.31879121E+04 + 0.31879121E+04 0.31897781E+04 0.30964700E+04 0.30968889E+04 + 0.30968889E+04 0.30960249E+04 0.30604460E+04 0.30581260E+04 + 0.32111389E+04 0.31942529E+04 0.31942529E+04 0.31912190E+04 + 0.31912190E+04 0.31916731E+04 0.31916731E+04 0.31908840E+04 + 0.31908840E+04 0.31895020E+04 0.31895020E+04 0.31872241E+04 + 0.31102461E+04 0.31062070E+04 0.31062070E+04 0.30964700E+04 + 0.30964700E+04 0.30968889E+04 0.30968889E+04 0.30960249E+04 + 0.30604460E+04 0.30581260E+04 0.32126670E+04 0.31976411E+04 + 0.31976411E+04 0.31912241E+04 0.31912241E+04 0.31879910E+04 + 0.31879910E+04 0.31861621E+04 0.31861621E+04 0.31870049E+04 + 0.31870049E+04 0.31868850E+04 0.31116750E+04 0.31091941E+04 + 0.31091941E+04 0.31040039E+04 0.31040039E+04 0.30998689E+04 + 0.30998689E+04 0.30976060E+04 0.30609680E+04 0.30587219E+04 + 0.32126670E+04 0.31976411E+04 0.31976411E+04 0.31912241E+04 + 0.31912241E+04 0.31879910E+04 0.31879910E+04 0.31861621E+04 + 0.31187100E+04 0.31153340E+04 0.31153340E+04 0.31116750E+04 + 0.31116750E+04 0.31091941E+04 0.31091941E+04 0.31040039E+04 + 0.31040039E+04 0.30998689E+04 0.30998689E+04 0.30976060E+04 + 0.30609680E+04 0.30587219E+04 0.32072981E+04 0.31993330E+04 + 0.31993330E+04 0.31920381E+04 0.31920381E+04 0.31905081E+04 + 0.31905081E+04 0.31871350E+04 0.31207971E+04 0.31181350E+04 + 0.31181350E+04 0.31144629E+04 0.31144629E+04 0.31110559E+04 + 0.31110559E+04 0.31059299E+04 0.31059299E+04 0.31010530E+04 + 0.31010530E+04 0.30984629E+04 0.30614690E+04 0.30597771E+04 + 0.32072981E+04 0.31993330E+04 0.31993330E+04 0.31920381E+04 + 0.31299619E+04 0.31261299E+04 0.31261299E+04 0.31207971E+04 + 0.31207971E+04 0.31181350E+04 0.31181350E+04 0.31144629E+04 + 0.31144629E+04 0.31110559E+04 0.31110559E+04 0.31059299E+04 + 0.31059299E+04 0.31010530E+04 0.31010530E+04 0.30984629E+04 + 0.30614690E+04 0.30597771E+04 0.32047080E+04 0.32006331E+04 + 0.32006331E+04 0.31945420E+04 0.31334221E+04 0.31295640E+04 + 0.31295640E+04 0.31236450E+04 0.31236450E+04 0.31184390E+04 + 0.31184390E+04 0.31119050E+04 0.31119050E+04 0.31084590E+04 + 0.31084590E+04 0.31065901E+04 0.31065901E+04 0.31028420E+04 + 0.31028420E+04 0.30991780E+04 0.30624861E+04 0.30605430E+04 + 0.31415381E+04 0.31384990E+04 0.31384990E+04 0.31334221E+04 + 0.31334221E+04 0.31295640E+04 0.31295640E+04 0.31236450E+04 + 0.31236450E+04 0.31184390E+04 0.31184390E+04 0.31119050E+04 + 0.31119050E+04 0.31084590E+04 0.31084590E+04 0.31065901E+04 + 0.31065901E+04 0.31028420E+04 0.31028420E+04 0.30991780E+04 + 0.30991780E+04 0.30969060E+04 0.31433501E+04 0.31413989E+04 + 0.31413989E+04 0.31391990E+04 0.31391990E+04 0.31338860E+04 + 0.31338860E+04 0.31210149E+04 0.31210149E+04 0.31127710E+04 + 0.31127710E+04 0.31079700E+04 0.31079700E+04 0.31070801E+04 + 0.31070801E+04 0.31104719E+04 0.31104719E+04 0.31062729E+04 + 0.31062729E+04 0.31004570E+04 0.31004570E+04 0.30970081E+04 + 0.32208379E+04 0.32185471E+04 0.32185471E+04 0.32213030E+04 + 0.32213030E+04 0.32224419E+04 0.32224419E+04 0.32185039E+04 + 0.32185039E+04 0.32100991E+04 0.32100991E+04 0.32074761E+04 + 0.32074761E+04 0.32110449E+04 0.32110449E+04 0.32143479E+04 + 0.32143479E+04 0.32158630E+04 0.32158630E+04 0.32207471E+04 + 0.32207471E+04 0.32285530E+04 0.32113149E+04 0.32106780E+04 + 0.32106780E+04 0.32158640E+04 0.32158640E+04 0.32179041E+04 + 0.32179041E+04 0.32150601E+04 0.32150601E+04 0.32113950E+04 + 0.32113950E+04 0.32135820E+04 0.32135820E+04 0.32198491E+04 + 0.32198491E+04 0.32233059E+04 0.32233059E+04 0.32255339E+04 + 0.32255339E+04 0.32304189E+04 0.32304189E+04 0.32332100E+04 + 0.32113149E+04 0.32106780E+04 0.32106780E+04 0.32158640E+04 + 0.32158640E+04 0.32179041E+04 0.32179041E+04 0.32150601E+04 + 0.32150601E+04 0.32113950E+04 0.32113950E+04 0.32135820E+04 + 0.32135820E+04 0.32198491E+04 0.32198491E+04 0.32233059E+04 + 0.32233059E+04 0.32255339E+04 0.32255339E+04 0.32304189E+04 + 0.32304189E+04 0.32332100E+04 0.32038491E+04 0.32039189E+04 + 0.32039189E+04 0.32081660E+04 0.32081660E+04 0.32064399E+04 + 0.32064399E+04 0.32027800E+04 0.32027800E+04 0.32024790E+04 + 0.32024790E+04 0.32073621E+04 0.32073621E+04 0.32149121E+04 + 0.32149121E+04 0.32202161E+04 0.32202161E+04 0.32257310E+04 + 0.32257310E+04 0.32319199E+04 0.32319199E+04 0.32321250E+04 + 0.32038491E+04 0.32039189E+04 0.32039189E+04 0.32081660E+04 + 0.32081660E+04 0.32064399E+04 0.32064399E+04 0.32027800E+04 + 0.32027800E+04 0.32024790E+04 0.32024790E+04 0.32073621E+04 + 0.32073621E+04 0.32149121E+04 0.32149121E+04 0.32202161E+04 + 0.32202161E+04 0.32257310E+04 0.32257310E+04 0.32319199E+04 + 0.32319199E+04 0.32321250E+04 0.31911331E+04 0.31830010E+04 + 0.31830010E+04 0.31833979E+04 0.31833979E+04 0.31799570E+04 + 0.31799570E+04 0.31866550E+04 0.31866550E+04 0.31975430E+04 + 0.31975430E+04 0.32065811E+04 0.32065811E+04 0.32124390E+04 + 0.32124390E+04 0.32169480E+04 0.32169480E+04 0.32217451E+04 + 0.32217451E+04 0.32269109E+04 0.32269109E+04 0.32295591E+04 + 0.31911331E+04 0.31830010E+04 0.31830010E+04 0.31833979E+04 + 0.31833979E+04 0.31799570E+04 0.31799570E+04 0.31866550E+04 + 0.31866550E+04 0.31975430E+04 0.31975430E+04 0.32065811E+04 + 0.32065811E+04 0.32124390E+04 0.32124390E+04 0.32169480E+04 + 0.32169480E+04 0.32217451E+04 0.32217451E+04 0.32269109E+04 + 0.32269109E+04 0.32295591E+04 0.31833240E+04 0.31783259E+04 + 0.31783259E+04 0.31812151E+04 0.31812151E+04 0.31822791E+04 + 0.31822791E+04 0.31855029E+04 0.31855029E+04 0.31916521E+04 + 0.31916521E+04 0.31960930E+04 0.31960930E+04 0.31972100E+04 + 0.31972100E+04 0.32021360E+04 0.32021360E+04 0.32124470E+04 + 0.32124470E+04 0.32225640E+04 0.32225640E+04 0.32314031E+04 + 0.31833240E+04 0.31783259E+04 0.31783259E+04 0.31812151E+04 + 0.31812151E+04 0.31822791E+04 0.31822791E+04 0.31855029E+04 + 0.31855029E+04 0.31916521E+04 0.31916521E+04 0.31960930E+04 + 0.31960930E+04 0.31972100E+04 0.31972100E+04 0.32021360E+04 + 0.32021360E+04 0.32124470E+04 0.32124470E+04 0.32225640E+04 + 0.32225640E+04 0.32314031E+04 0.31969041E+04 0.31979290E+04 + 0.31979290E+04 0.31994080E+04 0.31994080E+04 0.31967200E+04 + 0.31967200E+04 0.31883420E+04 0.31883420E+04 0.31828210E+04 + 0.31828210E+04 0.31843530E+04 0.31843530E+04 0.31900630E+04 + 0.31900630E+04 0.31956360E+04 0.31956360E+04 0.32037310E+04 + 0.32037310E+04 0.32159590E+04 0.32159590E+04 0.32283960E+04 + 0.31969041E+04 0.31979290E+04 0.31979290E+04 0.31994080E+04 + 0.31994080E+04 0.31967200E+04 0.31967200E+04 0.31883420E+04 + 0.31883420E+04 0.31828210E+04 0.31828210E+04 0.31843530E+04 + 0.31843530E+04 0.31900630E+04 0.31900630E+04 0.31956360E+04 + 0.31956360E+04 0.32037310E+04 0.32037310E+04 0.32159590E+04 + 0.32159590E+04 0.32283960E+04 0.31942629E+04 0.32020859E+04 + 0.32020859E+04 0.32068040E+04 0.32068040E+04 0.32055471E+04 + 0.32055471E+04 0.32010271E+04 0.32010271E+04 0.31946121E+04 + 0.31946121E+04 0.31927170E+04 0.31927170E+04 0.31913889E+04 + 0.31913889E+04 0.31889199E+04 0.31889199E+04 0.31939929E+04 + 0.31939929E+04 0.32076499E+04 0.32076499E+04 0.32224910E+04 + 0.31942629E+04 0.32020859E+04 0.32020859E+04 0.32068040E+04 + 0.32068040E+04 0.32055471E+04 0.32055471E+04 0.32010271E+04 + 0.32010271E+04 0.31946121E+04 0.31946121E+04 0.31927170E+04 + 0.31927170E+04 0.31913889E+04 0.31913889E+04 0.31889199E+04 + 0.31889199E+04 0.31939929E+04 0.31939929E+04 0.32076499E+04 + 0.32076499E+04 0.32224910E+04 0.31915200E+04 0.31979790E+04 + 0.31979790E+04 0.32049031E+04 0.32049031E+04 0.32044180E+04 + 0.32044180E+04 0.32028740E+04 0.32028740E+04 0.32008770E+04 + 0.32008770E+04 0.31983350E+04 0.31983350E+04 0.31898899E+04 + 0.31898899E+04 0.31846121E+04 0.31846121E+04 0.31869570E+04 + 0.31869570E+04 0.31954951E+04 0.31954951E+04 0.32064719E+04 + 0.31915200E+04 0.31979790E+04 0.31979790E+04 0.32049031E+04 + 0.32049031E+04 0.32044180E+04 0.32044180E+04 0.32028740E+04 + 0.32028740E+04 0.32008770E+04 0.32008770E+04 0.31983350E+04 + 0.31983350E+04 0.31898899E+04 0.31898899E+04 0.31846121E+04 + 0.31846121E+04 0.31869570E+04 0.31869570E+04 0.31954951E+04 + 0.31954951E+04 0.32064719E+04 0.32013191E+04 0.32009170E+04 + 0.32009170E+04 0.32090229E+04 0.32090229E+04 0.32102009E+04 + 0.32102009E+04 0.32041660E+04 0.32041660E+04 0.32000249E+04 + 0.32000249E+04 0.31970291E+04 0.31970291E+04 0.31896479E+04 + 0.31896479E+04 0.31817830E+04 0.31817830E+04 0.31834041E+04 + 0.31834041E+04 0.31881140E+04 0.31881140E+04 0.31924951E+04 + 0.32013191E+04 0.32009170E+04 0.32009170E+04 0.32090229E+04 + 0.32090229E+04 0.32102009E+04 0.32102009E+04 0.32041660E+04 + 0.32041660E+04 0.32000249E+04 0.32000249E+04 0.31970291E+04 + 0.31970291E+04 0.31896479E+04 0.31896479E+04 0.31817830E+04 + 0.31817830E+04 0.31834041E+04 0.31834041E+04 0.31881140E+04 + 0.31881140E+04 0.31924951E+04 0.32146201E+04 0.32100911E+04 + 0.32100911E+04 0.32149060E+04 0.32149060E+04 0.32155691E+04 + 0.32155691E+04 0.32091040E+04 0.32091040E+04 0.32019880E+04 + 0.32019880E+04 0.31962520E+04 0.31962520E+04 0.31884641E+04 + 0.31884641E+04 0.31803870E+04 0.31803870E+04 0.31816431E+04 + 0.31816431E+04 0.31877241E+04 0.31877241E+04 0.31964719E+04 + 0.32146201E+04 0.32100911E+04 0.32100911E+04 0.32149060E+04 + 0.32149060E+04 0.32155691E+04 0.32155691E+04 0.32091040E+04 + 0.32091040E+04 0.32019880E+04 0.32019880E+04 0.31962520E+04 + 0.31962520E+04 0.31884641E+04 0.31884641E+04 0.31803870E+04 + 0.31803870E+04 0.31816431E+04 0.31816431E+04 0.31877241E+04 + 0.31877241E+04 0.31964719E+04 0.32118301E+04 0.32095281E+04 + 0.32095281E+04 0.32117151E+04 0.32117151E+04 0.32116709E+04 + 0.32116709E+04 0.32044519E+04 0.32044519E+04 0.31956001E+04 + 0.31956001E+04 0.31904419E+04 0.31904419E+04 0.31875720E+04 + 0.31875720E+04 0.31854661E+04 0.31854661E+04 0.31871589E+04 + 0.31871589E+04 0.31918120E+04 0.31918120E+04 0.32016909E+04 + 0.32118301E+04 0.32095281E+04 0.32095281E+04 0.32117151E+04 + 0.32117151E+04 0.32116709E+04 0.32116709E+04 0.32044519E+04 + 0.32044519E+04 0.31956001E+04 0.31956001E+04 0.31904419E+04 + 0.31904419E+04 0.31875720E+04 0.31875720E+04 0.31854661E+04 + 0.31854661E+04 0.31871589E+04 0.31871589E+04 0.31918120E+04 + 0.30557981E+04 0.30570291E+04 0.32063530E+04 0.31978320E+04 + 0.31978320E+04 0.31988320E+04 0.31988320E+04 0.32008440E+04 + 0.32008440E+04 0.31969561E+04 0.31969561E+04 0.31922700E+04 + 0.31922700E+04 0.31899041E+04 0.31899041E+04 0.31887451E+04 + 0.31887451E+04 0.31883110E+04 0.31883110E+04 0.31902920E+04 + 0.31902920E+04 0.31934661E+04 0.30607000E+04 0.30583770E+04 + 0.32063530E+04 0.31978320E+04 0.31978320E+04 0.31988320E+04 + 0.31988320E+04 0.32008440E+04 0.32008440E+04 0.31969561E+04 + 0.31969561E+04 0.31922700E+04 0.31922700E+04 0.31899041E+04 + 0.31899041E+04 0.31887451E+04 0.31887451E+04 0.31883110E+04 + 0.30987310E+04 0.30958789E+04 0.30958789E+04 0.30949099E+04 + 0.30607000E+04 0.30583770E+04 0.32111389E+04 0.31942529E+04 + 0.31942529E+04 0.31912190E+04 0.31912190E+04 0.31916731E+04 + 0.31916731E+04 0.31908840E+04 0.31908840E+04 0.31895020E+04 + 0.31895020E+04 0.31872241E+04 0.31872241E+04 0.31879121E+04 + 0.31879121E+04 0.31897781E+04 0.30964700E+04 0.30968889E+04 + 0.30968889E+04 0.30960249E+04 0.30604460E+04 0.30581260E+04 + 0.32111389E+04 0.31942529E+04 0.31942529E+04 0.31912190E+04 + 0.31912190E+04 0.31916731E+04 0.31916731E+04 0.31908840E+04 + 0.31908840E+04 0.31895020E+04 0.31895020E+04 0.31872241E+04 + 0.31102461E+04 0.31062070E+04 0.31062070E+04 0.30964700E+04 + 0.30964700E+04 0.30968889E+04 0.30968889E+04 0.30960249E+04 + 0.30604460E+04 0.30581260E+04 0.32126670E+04 0.31976411E+04 + 0.31976411E+04 0.31912241E+04 0.31912241E+04 0.31879910E+04 + 0.31879910E+04 0.31861621E+04 0.31861621E+04 0.31870049E+04 + 0.31870049E+04 0.31868850E+04 0.31116750E+04 0.31091941E+04 + 0.31091941E+04 0.31040039E+04 0.31040039E+04 0.30998689E+04 + 0.30998689E+04 0.30976060E+04 0.30609680E+04 0.30587219E+04 + 0.32126670E+04 0.31976411E+04 0.31976411E+04 0.31912241E+04 + 0.31912241E+04 0.31879910E+04 0.31879910E+04 0.31861621E+04 + 0.31187100E+04 0.31153340E+04 0.31153340E+04 0.31116750E+04 + 0.31116750E+04 0.31091941E+04 0.31091941E+04 0.31040039E+04 + 0.31040039E+04 0.30998689E+04 0.30998689E+04 0.30976060E+04 + 0.30609680E+04 0.30587219E+04 0.32072981E+04 0.31993330E+04 + 0.31993330E+04 0.31920381E+04 0.31920381E+04 0.31905081E+04 + 0.31905081E+04 0.31871350E+04 0.31207971E+04 0.31181350E+04 + 0.31181350E+04 0.31144629E+04 0.31144629E+04 0.31110559E+04 + 0.31110559E+04 0.31059299E+04 0.31059299E+04 0.31010530E+04 + 0.31010530E+04 0.30984629E+04 0.30614690E+04 0.30597771E+04 + 0.32072981E+04 0.31993330E+04 0.31993330E+04 0.31920381E+04 + 0.31299619E+04 0.31261299E+04 0.31261299E+04 0.31207971E+04 + 0.31207971E+04 0.31181350E+04 0.31181350E+04 0.31144629E+04 + 0.31144629E+04 0.31110559E+04 0.31110559E+04 0.31059299E+04 + 0.31059299E+04 0.31010530E+04 0.31010530E+04 0.30984629E+04 + 0.30614690E+04 0.30597771E+04 0.32047080E+04 0.32006331E+04 + 0.32006331E+04 0.31945420E+04 0.31334221E+04 0.31295640E+04 + 0.31295640E+04 0.31236450E+04 0.31236450E+04 0.31184390E+04 + 0.31184390E+04 0.31119050E+04 0.31119050E+04 0.31084590E+04 + 0.31084590E+04 0.31065901E+04 0.31065901E+04 0.31028420E+04 + 0.31028420E+04 0.30991780E+04 0.30624861E+04 0.30605430E+04 + 0.31415381E+04 0.31384990E+04 0.31384990E+04 0.31334221E+04 + 0.31334221E+04 0.31295640E+04 0.31295640E+04 0.31236450E+04 + 0.31236450E+04 0.31184390E+04 0.31184390E+04 0.31119050E+04 + 0.31119050E+04 0.31084590E+04 0.31084590E+04 0.31065901E+04 + 0.31065901E+04 0.31028420E+04 0.31028420E+04 0.30991780E+04 + 0.30991780E+04 0.30969060E+04 0.31433501E+04 0.31413989E+04 + 0.31413989E+04 0.31391990E+04 0.31391990E+04 0.31338860E+04 + 0.31338860E+04 0.31210149E+04 0.31210149E+04 0.31127710E+04 + 0.31127710E+04 0.31079700E+04 0.31079700E+04 0.31070801E+04 + 0.31070801E+04 0.31104719E+04 0.31104719E+04 0.31062729E+04 + 0.31062729E+04 0.31004570E+04 0.31004570E+04 0.30970081E+04 + 0.32220920E+04 0.32196851E+04 0.32196851E+04 0.32224341E+04 + 0.32224341E+04 0.32236130E+04 0.32236130E+04 0.32197461E+04 + 0.32197461E+04 0.32113091E+04 0.32113091E+04 0.32085391E+04 + 0.32085391E+04 0.32120000E+04 0.32120000E+04 0.32153440E+04 + 0.32153440E+04 0.32168831E+04 0.32168831E+04 0.32217739E+04 + 0.32217739E+04 0.32296340E+04 0.32125891E+04 0.32117820E+04 + 0.32117820E+04 0.32169839E+04 0.32169839E+04 0.32191021E+04 + 0.32191021E+04 0.32163110E+04 0.32163110E+04 0.32125811E+04 + 0.32125811E+04 0.32146350E+04 0.32146350E+04 0.32208831E+04 + 0.32208831E+04 0.32244551E+04 0.32244551E+04 0.32266641E+04 + 0.32266641E+04 0.32315569E+04 0.32315569E+04 0.32343181E+04 + 0.32125891E+04 0.32117820E+04 0.32117820E+04 0.32169839E+04 + 0.32169839E+04 0.32191021E+04 0.32191021E+04 0.32163110E+04 + 0.32163110E+04 0.32125811E+04 0.32125811E+04 0.32146350E+04 + 0.32146350E+04 0.32208831E+04 0.32208831E+04 0.32244551E+04 + 0.32244551E+04 0.32266641E+04 0.32266641E+04 0.32315569E+04 + 0.32315569E+04 0.32343181E+04 0.32051299E+04 0.32050791E+04 + 0.32050791E+04 0.32093689E+04 0.32093689E+04 0.32077310E+04 + 0.32077310E+04 0.32040120E+04 0.32040120E+04 0.32035359E+04 + 0.32035359E+04 0.32082781E+04 0.32082781E+04 0.32158279E+04 + 0.32158279E+04 0.32212009E+04 0.32212009E+04 0.32267300E+04 + 0.32267300E+04 0.32329751E+04 0.32329751E+04 0.32331599E+04 + 0.32051299E+04 0.32050791E+04 0.32050791E+04 0.32093689E+04 + 0.32093689E+04 0.32077310E+04 0.32077310E+04 0.32040120E+04 + 0.32040120E+04 0.32035359E+04 0.32035359E+04 0.32082781E+04 + 0.32082781E+04 0.32158279E+04 0.32158279E+04 0.32212009E+04 + 0.32212009E+04 0.32267300E+04 0.32267300E+04 0.32329751E+04 + 0.32329751E+04 0.32331599E+04 0.31923850E+04 0.31841150E+04 + 0.31841150E+04 0.31845540E+04 0.31845540E+04 0.31808840E+04 + 0.31808840E+04 0.31873931E+04 0.31873931E+04 0.31982119E+04 + 0.31982119E+04 0.32072791E+04 0.32072791E+04 0.32132439E+04 + 0.32132439E+04 0.32178359E+04 0.32178359E+04 0.32226050E+04 + 0.32226050E+04 0.32276831E+04 0.32276831E+04 0.32301980E+04 + 0.31923850E+04 0.31841150E+04 0.31841150E+04 0.31845540E+04 + 0.31845540E+04 0.31808840E+04 0.31808840E+04 0.31873931E+04 + 0.31873931E+04 0.31982119E+04 0.31982119E+04 0.32072791E+04 + 0.32072791E+04 0.32132439E+04 0.32132439E+04 0.32178359E+04 + 0.32178359E+04 0.32226050E+04 0.32226050E+04 0.32276831E+04 + 0.32276831E+04 0.32301980E+04 0.31839231E+04 0.31788831E+04 + 0.31788831E+04 0.31818430E+04 0.31818430E+04 0.31829270E+04 + 0.31829270E+04 0.31861631E+04 0.31861631E+04 0.31923359E+04 + 0.31923359E+04 0.31967871E+04 0.31967871E+04 0.31978640E+04 + 0.31978640E+04 0.32026750E+04 0.32026750E+04 0.32129709E+04 + 0.32129709E+04 0.32230569E+04 0.32230569E+04 0.32318750E+04 + 0.31839231E+04 0.31788831E+04 0.31788831E+04 0.31818430E+04 + 0.31818430E+04 0.31829270E+04 0.31829270E+04 0.31861631E+04 + 0.31861631E+04 0.31923359E+04 0.31923359E+04 0.31967871E+04 + 0.31967871E+04 0.31978640E+04 0.31978640E+04 0.32026750E+04 + 0.32026750E+04 0.32129709E+04 0.32129709E+04 0.32230569E+04 + 0.32230569E+04 0.32318750E+04 0.31974370E+04 0.31984309E+04 + 0.31984309E+04 0.31999451E+04 0.31999451E+04 0.31973181E+04 + 0.31973181E+04 0.31889109E+04 0.31889109E+04 0.31833149E+04 + 0.31833149E+04 0.31847920E+04 0.31847920E+04 0.31905061E+04 + 0.31905061E+04 0.31961140E+04 0.31961140E+04 0.32041479E+04 + 0.32041479E+04 0.32163650E+04 0.32163650E+04 0.32288130E+04 + 0.31974370E+04 0.31984309E+04 0.31984309E+04 0.31999451E+04 + 0.31999451E+04 0.31973181E+04 0.31973181E+04 0.31889109E+04 + 0.31889109E+04 0.31833149E+04 0.31833149E+04 0.31847920E+04 + 0.31847920E+04 0.31905061E+04 0.31905061E+04 0.31961140E+04 + 0.31961140E+04 0.32041479E+04 0.32041479E+04 0.32163650E+04 + 0.32163650E+04 0.32288130E+04 0.31947720E+04 0.32025581E+04 + 0.32025581E+04 0.32073340E+04 0.32073340E+04 0.32061160E+04 + 0.32061160E+04 0.32015740E+04 0.32015740E+04 0.31950911E+04 + 0.31950911E+04 0.31931479E+04 0.31931479E+04 0.31918640E+04 + 0.31918640E+04 0.31893479E+04 0.31893479E+04 0.31943210E+04 + 0.31943210E+04 0.32080271E+04 0.32080271E+04 0.32229670E+04 + 0.31947720E+04 0.32025581E+04 0.32025581E+04 0.32073340E+04 + 0.32073340E+04 0.32061160E+04 0.32061160E+04 0.32015740E+04 + 0.32015740E+04 0.31950911E+04 0.31950911E+04 0.31931479E+04 + 0.31931479E+04 0.31918640E+04 0.31918640E+04 0.31893479E+04 + 0.31893479E+04 0.31943210E+04 0.31943210E+04 0.32080271E+04 + 0.32080271E+04 0.32229670E+04 0.31919800E+04 0.31983821E+04 + 0.31983821E+04 0.32053931E+04 0.32053931E+04 0.32049309E+04 + 0.32049309E+04 0.32033760E+04 0.32033760E+04 0.32013501E+04 + 0.32013501E+04 0.31988291E+04 0.31988291E+04 0.31903931E+04 + 0.31903931E+04 0.31850359E+04 0.31850359E+04 0.31873169E+04 + 0.31873169E+04 0.31958711E+04 0.31958711E+04 0.32069590E+04 + 0.31919800E+04 0.31983821E+04 0.31983821E+04 0.32053931E+04 + 0.32053931E+04 0.32049309E+04 0.32049309E+04 0.32033760E+04 + 0.32033760E+04 0.32013501E+04 0.32013501E+04 0.31988291E+04 + 0.31988291E+04 0.31903931E+04 0.31903931E+04 0.31850359E+04 + 0.31850359E+04 0.31873169E+04 0.31873169E+04 0.31958711E+04 + 0.31958711E+04 0.32069590E+04 0.32018069E+04 0.32012910E+04 + 0.32012910E+04 0.32094409E+04 0.32094409E+04 0.32106780E+04 + 0.32106780E+04 0.32046570E+04 0.32046570E+04 0.32004810E+04 + 0.32004810E+04 0.31975000E+04 0.31975000E+04 0.31901699E+04 + 0.31901699E+04 0.31822310E+04 0.31822310E+04 0.31837791E+04 + 0.31837791E+04 0.31884880E+04 0.31884880E+04 0.31928479E+04 + 0.32018069E+04 0.32012910E+04 0.32012910E+04 0.32094409E+04 + 0.32094409E+04 0.32106780E+04 0.32106780E+04 0.32046570E+04 + 0.32046570E+04 0.32004810E+04 0.32004810E+04 0.31975000E+04 + 0.31975000E+04 0.31901699E+04 0.31901699E+04 0.31822310E+04 + 0.31822310E+04 0.31837791E+04 0.31837791E+04 0.31884880E+04 + 0.31884880E+04 0.31928479E+04 0.32152051E+04 0.32105310E+04 + 0.32105310E+04 0.32153320E+04 0.32153320E+04 0.32160510E+04 + 0.32160510E+04 0.32096250E+04 0.32096250E+04 0.32025029E+04 + 0.32025029E+04 0.31967290E+04 0.31967290E+04 0.31889751E+04 + 0.31889751E+04 0.31807930E+04 0.31807930E+04 0.31820029E+04 + 0.31820029E+04 0.31880730E+04 0.31880730E+04 0.31968379E+04 + 0.32152051E+04 0.32105310E+04 0.32105310E+04 0.32153320E+04 + 0.32153320E+04 0.32160510E+04 0.32160510E+04 0.32096250E+04 + 0.32096250E+04 0.32025029E+04 0.32025029E+04 0.31967290E+04 + 0.31967290E+04 0.31889751E+04 0.31889751E+04 0.31807930E+04 + 0.31807930E+04 0.31820029E+04 0.31820029E+04 0.31880730E+04 + 0.31880730E+04 0.31968379E+04 0.32124810E+04 0.32100620E+04 + 0.32100620E+04 0.32122161E+04 0.32122161E+04 0.32121880E+04 + 0.32121880E+04 0.32050239E+04 0.32050239E+04 0.31961389E+04 + 0.31961389E+04 0.31909209E+04 0.31909209E+04 0.31880081E+04 + 0.31880081E+04 0.31858469E+04 0.31858469E+04 0.31875090E+04 + 0.31875090E+04 0.31921980E+04 0.31921980E+04 0.32021160E+04 + 0.32124810E+04 0.32100620E+04 0.32100620E+04 0.32122161E+04 + 0.32122161E+04 0.32121880E+04 0.32121880E+04 0.32050239E+04 + 0.32050239E+04 0.31961389E+04 0.31961389E+04 0.31909209E+04 + 0.31909209E+04 0.31880081E+04 0.31880081E+04 0.31858469E+04 + 0.31858469E+04 0.31875090E+04 0.31875090E+04 0.31921980E+04 + 0.30560601E+04 0.30573440E+04 0.32070181E+04 0.31983650E+04 + 0.31983650E+04 0.31992939E+04 0.31992939E+04 0.32013721E+04 + 0.32013721E+04 0.31975210E+04 0.31975210E+04 0.31928091E+04 + 0.31928091E+04 0.31903569E+04 0.31903569E+04 0.31891270E+04 + 0.31891270E+04 0.31887041E+04 0.31887041E+04 0.31906841E+04 + 0.31906841E+04 0.31938621E+04 0.30609690E+04 0.30586880E+04 + 0.32070181E+04 0.31983650E+04 0.31983650E+04 0.31992939E+04 + 0.31992939E+04 0.32013721E+04 0.32013721E+04 0.31975210E+04 + 0.31975210E+04 0.31928091E+04 0.31928091E+04 0.31903569E+04 + 0.31903569E+04 0.31891270E+04 0.31891270E+04 0.31887041E+04 + 0.30992849E+04 0.30964490E+04 0.30964490E+04 0.30954990E+04 + 0.30609690E+04 0.30586880E+04 0.32118950E+04 0.31948401E+04 + 0.31948401E+04 0.31917600E+04 0.31917600E+04 0.31922070E+04 + 0.31922070E+04 0.31913911E+04 0.31913911E+04 0.31899780E+04 + 0.31899780E+04 0.31876689E+04 0.31876689E+04 0.31883091E+04 + 0.31883091E+04 0.31901941E+04 0.30969629E+04 0.30974519E+04 + 0.30974519E+04 0.30966299E+04 0.30607319E+04 0.30584360E+04 + 0.32118950E+04 0.31948401E+04 0.31948401E+04 0.31917600E+04 + 0.31917600E+04 0.31922070E+04 0.31922070E+04 0.31913911E+04 + 0.31913911E+04 0.31899780E+04 0.31899780E+04 0.31876689E+04 + 0.31107759E+04 0.31067500E+04 0.31067500E+04 0.30969629E+04 + 0.30969629E+04 0.30974519E+04 0.30974519E+04 0.30966299E+04 + 0.30607319E+04 0.30584360E+04 0.32133530E+04 0.31982749E+04 + 0.31982749E+04 0.31918459E+04 0.31918459E+04 0.31885439E+04 + 0.31885439E+04 0.31866770E+04 0.31866770E+04 0.31874709E+04 + 0.31874709E+04 0.31873560E+04 0.31122080E+04 0.31097571E+04 + 0.31097571E+04 0.31045920E+04 0.31045920E+04 0.31004629E+04 + 0.31004629E+04 0.30982209E+04 0.30612610E+04 0.30590400E+04 + 0.32133530E+04 0.31982749E+04 0.31982749E+04 0.31918459E+04 + 0.31918459E+04 0.31885439E+04 0.31885439E+04 0.31866770E+04 + 0.31192019E+04 0.31158411E+04 0.31158411E+04 0.31122080E+04 + 0.31122080E+04 0.31097571E+04 0.31097571E+04 0.31045920E+04 + 0.31045920E+04 0.31004629E+04 0.31004629E+04 0.30982209E+04 + 0.30612610E+04 0.30590400E+04 0.32077329E+04 0.31998511E+04 + 0.31998511E+04 0.31925730E+04 0.31925730E+04 0.31910920E+04 + 0.31910920E+04 0.31877271E+04 0.31213130E+04 0.31186721E+04 + 0.31186721E+04 0.31150110E+04 0.31150110E+04 0.31116360E+04 + 0.31116360E+04 0.31065210E+04 0.31065210E+04 0.31016680E+04 + 0.31016680E+04 0.30990891E+04 0.30617710E+04 0.30601001E+04 + 0.32077329E+04 0.31998511E+04 0.31998511E+04 0.31925730E+04 + 0.31304319E+04 0.31266160E+04 0.31266160E+04 0.31213130E+04 + 0.31213130E+04 0.31186721E+04 0.31186721E+04 0.31150110E+04 + 0.31150110E+04 0.31116360E+04 0.31116360E+04 0.31065210E+04 + 0.31065210E+04 0.31016680E+04 0.31016680E+04 0.30990891E+04 + 0.30617710E+04 0.30601001E+04 0.32051799E+04 0.32011101E+04 + 0.32011101E+04 0.31950349E+04 0.31338940E+04 0.31300830E+04 + 0.31300830E+04 0.31242119E+04 0.31242119E+04 0.31190129E+04 + 0.31190129E+04 0.31124629E+04 0.31124629E+04 0.31090371E+04 + 0.31090371E+04 0.31072000E+04 0.31072000E+04 0.31034529E+04 + 0.31034529E+04 0.30998030E+04 0.30627971E+04 0.30608870E+04 + 0.31419470E+04 0.31389241E+04 0.31389241E+04 0.31338940E+04 + 0.31338940E+04 0.31300830E+04 0.31300830E+04 0.31242119E+04 + 0.31242119E+04 0.31190129E+04 0.31190129E+04 0.31124629E+04 + 0.31124629E+04 0.31090371E+04 0.31090371E+04 0.31072000E+04 + 0.31072000E+04 0.31034529E+04 0.31034529E+04 0.30998030E+04 + 0.30998030E+04 0.30975581E+04 0.31437600E+04 0.31418220E+04 + 0.31418220E+04 0.31396909E+04 0.31396909E+04 0.31344370E+04 + 0.31344370E+04 0.31216050E+04 0.31216050E+04 0.31133091E+04 + 0.31133091E+04 0.31084971E+04 0.31084971E+04 0.31075901E+04 + 0.31075901E+04 0.31110649E+04 0.31110649E+04 0.31068850E+04 + 0.31068850E+04 0.31010750E+04 0.31010750E+04 0.30976350E+04 + 0.32220920E+04 0.32196851E+04 0.32196851E+04 0.32224341E+04 + 0.32224341E+04 0.32236130E+04 0.32236130E+04 0.32197461E+04 + 0.32197461E+04 0.32113091E+04 0.32113091E+04 0.32085391E+04 + 0.32085391E+04 0.32120000E+04 0.32120000E+04 0.32153440E+04 + 0.32153440E+04 0.32168831E+04 0.32168831E+04 0.32217739E+04 + 0.32217739E+04 0.32296340E+04 0.32125891E+04 0.32117820E+04 + 0.32117820E+04 0.32169839E+04 0.32169839E+04 0.32191021E+04 + 0.32191021E+04 0.32163110E+04 0.32163110E+04 0.32125811E+04 + 0.32125811E+04 0.32146350E+04 0.32146350E+04 0.32208831E+04 + 0.32208831E+04 0.32244551E+04 0.32244551E+04 0.32266641E+04 + 0.32266641E+04 0.32315569E+04 0.32315569E+04 0.32343181E+04 + 0.32125891E+04 0.32117820E+04 0.32117820E+04 0.32169839E+04 + 0.32169839E+04 0.32191021E+04 0.32191021E+04 0.32163110E+04 + 0.32163110E+04 0.32125811E+04 0.32125811E+04 0.32146350E+04 + 0.32146350E+04 0.32208831E+04 0.32208831E+04 0.32244551E+04 + 0.32244551E+04 0.32266641E+04 0.32266641E+04 0.32315569E+04 + 0.32315569E+04 0.32343181E+04 0.32051299E+04 0.32050791E+04 + 0.32050791E+04 0.32093689E+04 0.32093689E+04 0.32077310E+04 + 0.32077310E+04 0.32040120E+04 0.32040120E+04 0.32035359E+04 + 0.32035359E+04 0.32082781E+04 0.32082781E+04 0.32158279E+04 + 0.32158279E+04 0.32212009E+04 0.32212009E+04 0.32267300E+04 + 0.32267300E+04 0.32329751E+04 0.32329751E+04 0.32331599E+04 + 0.32051299E+04 0.32050791E+04 0.32050791E+04 0.32093689E+04 + 0.32093689E+04 0.32077310E+04 0.32077310E+04 0.32040120E+04 + 0.32040120E+04 0.32035359E+04 0.32035359E+04 0.32082781E+04 + 0.32082781E+04 0.32158279E+04 0.32158279E+04 0.32212009E+04 + 0.32212009E+04 0.32267300E+04 0.32267300E+04 0.32329751E+04 + 0.32329751E+04 0.32331599E+04 0.31923850E+04 0.31841150E+04 + 0.31841150E+04 0.31845540E+04 0.31845540E+04 0.31808840E+04 + 0.31808840E+04 0.31873931E+04 0.31873931E+04 0.31982119E+04 + 0.31982119E+04 0.32072791E+04 0.32072791E+04 0.32132439E+04 + 0.32132439E+04 0.32178359E+04 0.32178359E+04 0.32226050E+04 + 0.32226050E+04 0.32276831E+04 0.32276831E+04 0.32301980E+04 + 0.31923850E+04 0.31841150E+04 0.31841150E+04 0.31845540E+04 + 0.31845540E+04 0.31808840E+04 0.31808840E+04 0.31873931E+04 + 0.31873931E+04 0.31982119E+04 0.31982119E+04 0.32072791E+04 + 0.32072791E+04 0.32132439E+04 0.32132439E+04 0.32178359E+04 + 0.32178359E+04 0.32226050E+04 0.32226050E+04 0.32276831E+04 + 0.32276831E+04 0.32301980E+04 0.31839231E+04 0.31788831E+04 + 0.31788831E+04 0.31818430E+04 0.31818430E+04 0.31829270E+04 + 0.31829270E+04 0.31861631E+04 0.31861631E+04 0.31923359E+04 + 0.31923359E+04 0.31967871E+04 0.31967871E+04 0.31978640E+04 + 0.31978640E+04 0.32026750E+04 0.32026750E+04 0.32129709E+04 + 0.32129709E+04 0.32230569E+04 0.32230569E+04 0.32318750E+04 + 0.31839231E+04 0.31788831E+04 0.31788831E+04 0.31818430E+04 + 0.31818430E+04 0.31829270E+04 0.31829270E+04 0.31861631E+04 + 0.31861631E+04 0.31923359E+04 0.31923359E+04 0.31967871E+04 + 0.31967871E+04 0.31978640E+04 0.31978640E+04 0.32026750E+04 + 0.32026750E+04 0.32129709E+04 0.32129709E+04 0.32230569E+04 + 0.32230569E+04 0.32318750E+04 0.31974370E+04 0.31984309E+04 + 0.31984309E+04 0.31999451E+04 0.31999451E+04 0.31973181E+04 + 0.31973181E+04 0.31889109E+04 0.31889109E+04 0.31833149E+04 + 0.31833149E+04 0.31847920E+04 0.31847920E+04 0.31905061E+04 + 0.31905061E+04 0.31961140E+04 0.31961140E+04 0.32041479E+04 + 0.32041479E+04 0.32163650E+04 0.32163650E+04 0.32288130E+04 + 0.31974370E+04 0.31984309E+04 0.31984309E+04 0.31999451E+04 + 0.31999451E+04 0.31973181E+04 0.31973181E+04 0.31889109E+04 + 0.31889109E+04 0.31833149E+04 0.31833149E+04 0.31847920E+04 + 0.31847920E+04 0.31905061E+04 0.31905061E+04 0.31961140E+04 + 0.31961140E+04 0.32041479E+04 0.32041479E+04 0.32163650E+04 + 0.32163650E+04 0.32288130E+04 0.31947720E+04 0.32025581E+04 + 0.32025581E+04 0.32073340E+04 0.32073340E+04 0.32061160E+04 + 0.32061160E+04 0.32015740E+04 0.32015740E+04 0.31950911E+04 + 0.31950911E+04 0.31931479E+04 0.31931479E+04 0.31918640E+04 + 0.31918640E+04 0.31893479E+04 0.31893479E+04 0.31943210E+04 + 0.31943210E+04 0.32080271E+04 0.32080271E+04 0.32229670E+04 + 0.31947720E+04 0.32025581E+04 0.32025581E+04 0.32073340E+04 + 0.32073340E+04 0.32061160E+04 0.32061160E+04 0.32015740E+04 + 0.32015740E+04 0.31950911E+04 0.31950911E+04 0.31931479E+04 + 0.31931479E+04 0.31918640E+04 0.31918640E+04 0.31893479E+04 + 0.31893479E+04 0.31943210E+04 0.31943210E+04 0.32080271E+04 + 0.32080271E+04 0.32229670E+04 0.31919800E+04 0.31983821E+04 + 0.31983821E+04 0.32053931E+04 0.32053931E+04 0.32049309E+04 + 0.32049309E+04 0.32033760E+04 0.32033760E+04 0.32013501E+04 + 0.32013501E+04 0.31988291E+04 0.31988291E+04 0.31903931E+04 + 0.31903931E+04 0.31850359E+04 0.31850359E+04 0.31873169E+04 + 0.31873169E+04 0.31958711E+04 0.31958711E+04 0.32069590E+04 + 0.31919800E+04 0.31983821E+04 0.31983821E+04 0.32053931E+04 + 0.32053931E+04 0.32049309E+04 0.32049309E+04 0.32033760E+04 + 0.32033760E+04 0.32013501E+04 0.32013501E+04 0.31988291E+04 + 0.31988291E+04 0.31903931E+04 0.31903931E+04 0.31850359E+04 + 0.31850359E+04 0.31873169E+04 0.31873169E+04 0.31958711E+04 + 0.31958711E+04 0.32069590E+04 0.32018069E+04 0.32012910E+04 + 0.32012910E+04 0.32094409E+04 0.32094409E+04 0.32106780E+04 + 0.32106780E+04 0.32046570E+04 0.32046570E+04 0.32004810E+04 + 0.32004810E+04 0.31975000E+04 0.31975000E+04 0.31901699E+04 + 0.31901699E+04 0.31822310E+04 0.31822310E+04 0.31837791E+04 + 0.31837791E+04 0.31884880E+04 0.31884880E+04 0.31928479E+04 + 0.32018069E+04 0.32012910E+04 0.32012910E+04 0.32094409E+04 + 0.32094409E+04 0.32106780E+04 0.32106780E+04 0.32046570E+04 + 0.32046570E+04 0.32004810E+04 0.32004810E+04 0.31975000E+04 + 0.31975000E+04 0.31901699E+04 0.31901699E+04 0.31822310E+04 + 0.31822310E+04 0.31837791E+04 0.31837791E+04 0.31884880E+04 + 0.31884880E+04 0.31928479E+04 0.32152051E+04 0.32105310E+04 + 0.32105310E+04 0.32153320E+04 0.32153320E+04 0.32160510E+04 + 0.32160510E+04 0.32096250E+04 0.32096250E+04 0.32025029E+04 + 0.32025029E+04 0.31967290E+04 0.31967290E+04 0.31889751E+04 + 0.31889751E+04 0.31807930E+04 0.31807930E+04 0.31820029E+04 + 0.31820029E+04 0.31880730E+04 0.31880730E+04 0.31968379E+04 + 0.32152051E+04 0.32105310E+04 0.32105310E+04 0.32153320E+04 + 0.32153320E+04 0.32160510E+04 0.32160510E+04 0.32096250E+04 + 0.32096250E+04 0.32025029E+04 0.32025029E+04 0.31967290E+04 + 0.31967290E+04 0.31889751E+04 0.31889751E+04 0.31807930E+04 + 0.31807930E+04 0.31820029E+04 0.31820029E+04 0.31880730E+04 + 0.31880730E+04 0.31968379E+04 0.32124810E+04 0.32100620E+04 + 0.32100620E+04 0.32122161E+04 0.32122161E+04 0.32121880E+04 + 0.32121880E+04 0.32050239E+04 0.32050239E+04 0.31961389E+04 + 0.31961389E+04 0.31909209E+04 0.31909209E+04 0.31880081E+04 + 0.31880081E+04 0.31858469E+04 0.31858469E+04 0.31875090E+04 + 0.31875090E+04 0.31921980E+04 0.31921980E+04 0.32021160E+04 + 0.32124810E+04 0.32100620E+04 0.32100620E+04 0.32122161E+04 + 0.32122161E+04 0.32121880E+04 0.32121880E+04 0.32050239E+04 + 0.32050239E+04 0.31961389E+04 0.31961389E+04 0.31909209E+04 + 0.31909209E+04 0.31880081E+04 0.31880081E+04 0.31858469E+04 + 0.31858469E+04 0.31875090E+04 0.31875090E+04 0.31921980E+04 + 0.30560601E+04 0.30573440E+04 0.32070181E+04 0.31983650E+04 + 0.31983650E+04 0.31992939E+04 0.31992939E+04 0.32013721E+04 + 0.32013721E+04 0.31975210E+04 0.31975210E+04 0.31928091E+04 + 0.31928091E+04 0.31903569E+04 0.31903569E+04 0.31891270E+04 + 0.31891270E+04 0.31887041E+04 0.31887041E+04 0.31906841E+04 + 0.31906841E+04 0.31938621E+04 0.30609690E+04 0.30586880E+04 + 0.32070181E+04 0.31983650E+04 0.31983650E+04 0.31992939E+04 + 0.31992939E+04 0.32013721E+04 0.32013721E+04 0.31975210E+04 + 0.31975210E+04 0.31928091E+04 0.31928091E+04 0.31903569E+04 + 0.31903569E+04 0.31891270E+04 0.31891270E+04 0.31887041E+04 + 0.30992849E+04 0.30964490E+04 0.30964490E+04 0.30954990E+04 + 0.30609690E+04 0.30586880E+04 0.32118950E+04 0.31948401E+04 + 0.31948401E+04 0.31917600E+04 0.31917600E+04 0.31922070E+04 + 0.31922070E+04 0.31913911E+04 0.31913911E+04 0.31899780E+04 + 0.31899780E+04 0.31876689E+04 0.31876689E+04 0.31883091E+04 + 0.31883091E+04 0.31901941E+04 0.30969629E+04 0.30974519E+04 + 0.30974519E+04 0.30966299E+04 0.30607319E+04 0.30584360E+04 + 0.32118950E+04 0.31948401E+04 0.31948401E+04 0.31917600E+04 + 0.31917600E+04 0.31922070E+04 0.31922070E+04 0.31913911E+04 + 0.31913911E+04 0.31899780E+04 0.31899780E+04 0.31876689E+04 + 0.31107759E+04 0.31067500E+04 0.31067500E+04 0.30969629E+04 + 0.30969629E+04 0.30974519E+04 0.30974519E+04 0.30966299E+04 + 0.30607319E+04 0.30584360E+04 0.32133530E+04 0.31982749E+04 + 0.31982749E+04 0.31918459E+04 0.31918459E+04 0.31885439E+04 + 0.31885439E+04 0.31866770E+04 0.31866770E+04 0.31874709E+04 + 0.31874709E+04 0.31873560E+04 0.31122080E+04 0.31097571E+04 + 0.31097571E+04 0.31045920E+04 0.31045920E+04 0.31004629E+04 + 0.31004629E+04 0.30982209E+04 0.30612610E+04 0.30590400E+04 + 0.32133530E+04 0.31982749E+04 0.31982749E+04 0.31918459E+04 + 0.31918459E+04 0.31885439E+04 0.31885439E+04 0.31866770E+04 + 0.31192019E+04 0.31158411E+04 0.31158411E+04 0.31122080E+04 + 0.31122080E+04 0.31097571E+04 0.31097571E+04 0.31045920E+04 + 0.31045920E+04 0.31004629E+04 0.31004629E+04 0.30982209E+04 + 0.30612610E+04 0.30590400E+04 0.32077329E+04 0.31998511E+04 + 0.31998511E+04 0.31925730E+04 0.31925730E+04 0.31910920E+04 + 0.31910920E+04 0.31877271E+04 0.31213130E+04 0.31186721E+04 + 0.31186721E+04 0.31150110E+04 0.31150110E+04 0.31116360E+04 + 0.31116360E+04 0.31065210E+04 0.31065210E+04 0.31016680E+04 + 0.31016680E+04 0.30990891E+04 0.30617710E+04 0.30601001E+04 + 0.32077329E+04 0.31998511E+04 0.31998511E+04 0.31925730E+04 + 0.31304319E+04 0.31266160E+04 0.31266160E+04 0.31213130E+04 + 0.31213130E+04 0.31186721E+04 0.31186721E+04 0.31150110E+04 + 0.31150110E+04 0.31116360E+04 0.31116360E+04 0.31065210E+04 + 0.31065210E+04 0.31016680E+04 0.31016680E+04 0.30990891E+04 + 0.30617710E+04 0.30601001E+04 0.32051799E+04 0.32011101E+04 + 0.32011101E+04 0.31950349E+04 0.31338940E+04 0.31300830E+04 + 0.31300830E+04 0.31242119E+04 0.31242119E+04 0.31190129E+04 + 0.31190129E+04 0.31124629E+04 0.31124629E+04 0.31090371E+04 + 0.31090371E+04 0.31072000E+04 0.31072000E+04 0.31034529E+04 + 0.31034529E+04 0.30998030E+04 0.30627971E+04 0.30608870E+04 + 0.31419470E+04 0.31389241E+04 0.31389241E+04 0.31338940E+04 + 0.31338940E+04 0.31300830E+04 0.31300830E+04 0.31242119E+04 + 0.31242119E+04 0.31190129E+04 0.31190129E+04 0.31124629E+04 + 0.31124629E+04 0.31090371E+04 0.31090371E+04 0.31072000E+04 + 0.31072000E+04 0.31034529E+04 0.31034529E+04 0.30998030E+04 + 0.30998030E+04 0.30975581E+04 0.31437600E+04 0.31418220E+04 + 0.31418220E+04 0.31396909E+04 0.31396909E+04 0.31344370E+04 + 0.31344370E+04 0.31216050E+04 0.31216050E+04 0.31133091E+04 + 0.31133091E+04 0.31084971E+04 0.31084971E+04 0.31075901E+04 + 0.31075901E+04 0.31110649E+04 0.31110649E+04 0.31068850E+04 + 0.31068850E+04 0.31010750E+04 0.31010750E+04 0.30976350E+04 + 0.32233459E+04 0.32208220E+04 0.32208220E+04 0.32235640E+04 + 0.32235640E+04 0.32247839E+04 0.32247839E+04 0.32209880E+04 + 0.32209880E+04 0.32125200E+04 0.32125200E+04 0.32096021E+04 + 0.32096021E+04 0.32129541E+04 0.32129541E+04 0.32163401E+04 + 0.32163401E+04 0.32179041E+04 0.32179041E+04 0.32228010E+04 + 0.32228010E+04 0.32307161E+04 0.32138621E+04 0.32128850E+04 + 0.32128850E+04 0.32181030E+04 0.32181030E+04 0.32203010E+04 + 0.32203010E+04 0.32175610E+04 0.32175610E+04 0.32137661E+04 + 0.32137661E+04 0.32156880E+04 0.32156880E+04 0.32219180E+04 + 0.32219180E+04 0.32256030E+04 0.32256030E+04 0.32277930E+04 + 0.32277930E+04 0.32326951E+04 0.32326951E+04 0.32354250E+04 + 0.32138621E+04 0.32128850E+04 0.32128850E+04 0.32181030E+04 + 0.32181030E+04 0.32203010E+04 0.32203010E+04 0.32175610E+04 + 0.32175610E+04 0.32137661E+04 0.32137661E+04 0.32156880E+04 + 0.32156880E+04 0.32219180E+04 0.32219180E+04 0.32256030E+04 + 0.32256030E+04 0.32277930E+04 0.32277930E+04 0.32326951E+04 + 0.32326951E+04 0.32354250E+04 0.32064121E+04 0.32062400E+04 + 0.32062400E+04 0.32105720E+04 0.32105720E+04 0.32090229E+04 + 0.32090229E+04 0.32052451E+04 0.32052451E+04 0.32045940E+04 + 0.32045940E+04 0.32091931E+04 0.32091931E+04 0.32167439E+04 + 0.32167439E+04 0.32221851E+04 0.32221851E+04 0.32277290E+04 + 0.32277290E+04 0.32340291E+04 0.32340291E+04 0.32341960E+04 + 0.32064121E+04 0.32062400E+04 0.32062400E+04 0.32105720E+04 + 0.32105720E+04 0.32090229E+04 0.32090229E+04 0.32052451E+04 + 0.32052451E+04 0.32045940E+04 0.32045940E+04 0.32091931E+04 + 0.32091931E+04 0.32167439E+04 0.32167439E+04 0.32221851E+04 + 0.32221851E+04 0.32277290E+04 0.32277290E+04 0.32340291E+04 + 0.32340291E+04 0.32341960E+04 0.31936350E+04 0.31852280E+04 + 0.31852280E+04 0.31857100E+04 0.31857100E+04 0.31818110E+04 + 0.31818110E+04 0.31881311E+04 0.31881311E+04 0.31988811E+04 + 0.31988811E+04 0.32079771E+04 0.32079771E+04 0.32140481E+04 + 0.32140481E+04 0.32187229E+04 0.32187229E+04 0.32234641E+04 + 0.32234641E+04 0.32284551E+04 0.32284551E+04 0.32308369E+04 + 0.31936350E+04 0.31852280E+04 0.31852280E+04 0.31857100E+04 + 0.31857100E+04 0.31818110E+04 0.31818110E+04 0.31881311E+04 + 0.31881311E+04 0.31988811E+04 0.31988811E+04 0.32079771E+04 + 0.32079771E+04 0.32140481E+04 0.32140481E+04 0.32187229E+04 + 0.32187229E+04 0.32234641E+04 0.32234641E+04 0.32284551E+04 + 0.32284551E+04 0.32308369E+04 0.31845220E+04 0.31794399E+04 + 0.31794399E+04 0.31824700E+04 0.31824700E+04 0.31835740E+04 + 0.31835740E+04 0.31868230E+04 0.31868230E+04 0.31930210E+04 + 0.31930210E+04 0.31974810E+04 0.31974810E+04 0.31985181E+04 + 0.31985181E+04 0.32032141E+04 0.32032141E+04 0.32134961E+04 + 0.32134961E+04 0.32235500E+04 0.32235500E+04 0.32323459E+04 + 0.31845220E+04 0.31794399E+04 0.31794399E+04 0.31824700E+04 + 0.31824700E+04 0.31835740E+04 0.31835740E+04 0.31868230E+04 + 0.31868230E+04 0.31930210E+04 0.31930210E+04 0.31974810E+04 + 0.31974810E+04 0.31985181E+04 0.31985181E+04 0.32032141E+04 + 0.32032141E+04 0.32134961E+04 0.32134961E+04 0.32235500E+04 + 0.32235500E+04 0.32323459E+04 0.31979709E+04 0.31989331E+04 + 0.31989331E+04 0.32004819E+04 0.32004819E+04 0.31979150E+04 + 0.31979150E+04 0.31894800E+04 0.31894800E+04 0.31838091E+04 + 0.31838091E+04 0.31852319E+04 0.31852319E+04 0.31909480E+04 + 0.31909480E+04 0.31965930E+04 0.31965930E+04 0.32045649E+04 + 0.32045649E+04 0.32167720E+04 0.32167720E+04 0.32292310E+04 + 0.31979709E+04 0.31989331E+04 0.31989331E+04 0.32004819E+04 + 0.32004819E+04 0.31979150E+04 0.31979150E+04 0.31894800E+04 + 0.31894800E+04 0.31838091E+04 0.31838091E+04 0.31852319E+04 + 0.31852319E+04 0.31909480E+04 0.31909480E+04 0.31965930E+04 + 0.31965930E+04 0.32045649E+04 0.32045649E+04 0.32167720E+04 + 0.32167720E+04 0.32292310E+04 0.31952800E+04 0.32030300E+04 + 0.32030300E+04 0.32078640E+04 0.32078640E+04 0.32066860E+04 + 0.32066860E+04 0.32021221E+04 0.32021221E+04 0.31955691E+04 + 0.31955691E+04 0.31935791E+04 0.31935791E+04 0.31923391E+04 + 0.31923391E+04 0.31897749E+04 0.31897749E+04 0.31946479E+04 + 0.31946479E+04 0.32084031E+04 0.32084031E+04 0.32234419E+04 + 0.31952800E+04 0.32030300E+04 0.32030300E+04 0.32078640E+04 + 0.32078640E+04 0.32066860E+04 0.32066860E+04 0.32021221E+04 + 0.32021221E+04 0.31955691E+04 0.31955691E+04 0.31935791E+04 + 0.31935791E+04 0.31923391E+04 0.31923391E+04 0.31897749E+04 + 0.31897749E+04 0.31946479E+04 0.31946479E+04 0.32084031E+04 + 0.32084031E+04 0.32234419E+04 0.31924399E+04 0.31987849E+04 + 0.31987849E+04 0.32058831E+04 0.32058831E+04 0.32054431E+04 + 0.32054431E+04 0.32038779E+04 0.32038779E+04 0.32018230E+04 + 0.32018230E+04 0.31993230E+04 0.31993230E+04 0.31908950E+04 + 0.31908950E+04 0.31854609E+04 0.31854609E+04 0.31876770E+04 + 0.31876770E+04 0.31962471E+04 0.31962471E+04 0.32074460E+04 + 0.31924399E+04 0.31987849E+04 0.31987849E+04 0.32058831E+04 + 0.32058831E+04 0.32054431E+04 0.32054431E+04 0.32038779E+04 + 0.32038779E+04 0.32018230E+04 0.32018230E+04 0.31993230E+04 + 0.31993230E+04 0.31908950E+04 0.31908950E+04 0.31854609E+04 + 0.31854609E+04 0.31876770E+04 0.31876770E+04 0.31962471E+04 + 0.31962471E+04 0.32074460E+04 0.32022949E+04 0.32016650E+04 + 0.32016650E+04 0.32098579E+04 0.32098579E+04 0.32111550E+04 + 0.32111550E+04 0.32051479E+04 0.32051479E+04 0.32009370E+04 + 0.32009370E+04 0.31979719E+04 0.31979719E+04 0.31906919E+04 + 0.31906919E+04 0.31826780E+04 0.31826780E+04 0.31841550E+04 + 0.31841550E+04 0.31888611E+04 0.31888611E+04 0.31932009E+04 + 0.32022949E+04 0.32016650E+04 0.32016650E+04 0.32098579E+04 + 0.32098579E+04 0.32111550E+04 0.32111550E+04 0.32051479E+04 + 0.32051479E+04 0.32009370E+04 0.32009370E+04 0.31979719E+04 + 0.31979719E+04 0.31906919E+04 0.31906919E+04 0.31826780E+04 + 0.31826780E+04 0.31841550E+04 0.31841550E+04 0.31888611E+04 + 0.31888611E+04 0.31932009E+04 0.32157891E+04 0.32109719E+04 + 0.32109719E+04 0.32157561E+04 0.32157561E+04 0.32165330E+04 + 0.32165330E+04 0.32101450E+04 0.32101450E+04 0.32030181E+04 + 0.32030181E+04 0.31972070E+04 0.31972070E+04 0.31894861E+04 + 0.31894861E+04 0.31812000E+04 0.31812000E+04 0.31823640E+04 + 0.31823640E+04 0.31884231E+04 0.31884231E+04 0.31972041E+04 + 0.32157891E+04 0.32109719E+04 0.32109719E+04 0.32157561E+04 + 0.32157561E+04 0.32165330E+04 0.32165330E+04 0.32101450E+04 + 0.32101450E+04 0.32030181E+04 0.32030181E+04 0.31972070E+04 + 0.31972070E+04 0.31894861E+04 0.31894861E+04 0.31812000E+04 + 0.31812000E+04 0.31823640E+04 0.31823640E+04 0.31884231E+04 + 0.31884231E+04 0.31972041E+04 0.32131340E+04 0.32105950E+04 + 0.32105950E+04 0.32127170E+04 0.32127170E+04 0.32127051E+04 + 0.32127051E+04 0.32055950E+04 0.32055950E+04 0.31966780E+04 + 0.31966780E+04 0.31913999E+04 0.31913999E+04 0.31884441E+04 + 0.31884441E+04 0.31862280E+04 0.31862280E+04 0.31878589E+04 + 0.31878589E+04 0.31925850E+04 0.31925850E+04 0.32025410E+04 + 0.32131340E+04 0.32105950E+04 0.32105950E+04 0.32127170E+04 + 0.32127170E+04 0.32127051E+04 0.32127051E+04 0.32055950E+04 + 0.32055950E+04 0.31966780E+04 0.31966780E+04 0.31913999E+04 + 0.31913999E+04 0.31884441E+04 0.31884441E+04 0.31862280E+04 + 0.31862280E+04 0.31878589E+04 0.31878589E+04 0.31925850E+04 + 0.30563220E+04 0.30576589E+04 0.32076831E+04 0.31988979E+04 + 0.31988979E+04 0.31997561E+04 0.31997561E+04 0.32018999E+04 + 0.32018999E+04 0.31980850E+04 0.31980850E+04 0.31933491E+04 + 0.31933491E+04 0.31908101E+04 0.31908101E+04 0.31895090E+04 + 0.31895090E+04 0.31890969E+04 0.31890969E+04 0.31910759E+04 + 0.31910759E+04 0.31942571E+04 0.30612390E+04 0.30589980E+04 + 0.32076831E+04 0.31988979E+04 0.31988979E+04 0.31997561E+04 + 0.31997561E+04 0.32018999E+04 0.32018999E+04 0.31980850E+04 + 0.31980850E+04 0.31933491E+04 0.31933491E+04 0.31908101E+04 + 0.31908101E+04 0.31895090E+04 0.31895090E+04 0.31890969E+04 + 0.30998391E+04 0.30970200E+04 0.30970200E+04 0.30960869E+04 + 0.30612390E+04 0.30589980E+04 0.32126499E+04 0.31954270E+04 + 0.31954270E+04 0.31923010E+04 0.31923010E+04 0.31927410E+04 + 0.31927410E+04 0.31918989E+04 0.31918989E+04 0.31904529E+04 + 0.31904529E+04 0.31881130E+04 0.31881130E+04 0.31887070E+04 + 0.31887070E+04 0.31906101E+04 0.30974561E+04 0.30980149E+04 + 0.30980149E+04 0.30972361E+04 0.30610181E+04 0.30587461E+04 + 0.32126499E+04 0.31954270E+04 0.31954270E+04 0.31923010E+04 + 0.31923010E+04 0.31927410E+04 0.31927410E+04 0.31918989E+04 + 0.31918989E+04 0.31904529E+04 0.31904529E+04 0.31881130E+04 + 0.31113059E+04 0.31072930E+04 0.31072930E+04 0.30974561E+04 + 0.30974561E+04 0.30980149E+04 0.30980149E+04 0.30972361E+04 + 0.30610181E+04 0.30587461E+04 0.32140391E+04 0.31989089E+04 + 0.31989089E+04 0.31924690E+04 0.31924690E+04 0.31890969E+04 + 0.31890969E+04 0.31871909E+04 0.31871909E+04 0.31879370E+04 + 0.31879370E+04 0.31878269E+04 0.31127400E+04 0.31103201E+04 + 0.31103201E+04 0.31051790E+04 0.31051790E+04 0.31010581E+04 + 0.31010581E+04 0.30988350E+04 0.30615549E+04 0.30593569E+04 + 0.32140391E+04 0.31989089E+04 0.31989089E+04 0.31924690E+04 + 0.31924690E+04 0.31890969E+04 0.31890969E+04 0.31871909E+04 + 0.31196951E+04 0.31163479E+04 0.31163479E+04 0.31127400E+04 + 0.31127400E+04 0.31103201E+04 0.31103201E+04 0.31051790E+04 + 0.31051790E+04 0.31010581E+04 0.31010581E+04 0.30988350E+04 + 0.30615549E+04 0.30593569E+04 0.32081670E+04 0.32003689E+04 + 0.32003689E+04 0.31931079E+04 0.31931079E+04 0.31916760E+04 + 0.31916760E+04 0.31883181E+04 0.31218291E+04 0.31192080E+04 + 0.31192080E+04 0.31155591E+04 0.31155591E+04 0.31122170E+04 + 0.31122170E+04 0.31071130E+04 0.31071130E+04 0.31022830E+04 + 0.31022830E+04 0.30997161E+04 0.30620720E+04 0.30604231E+04 + 0.32081670E+04 0.32003689E+04 0.32003689E+04 0.31931079E+04 + 0.31309031E+04 0.31271021E+04 0.31271021E+04 0.31218291E+04 + 0.31218291E+04 0.31192080E+04 0.31192080E+04 0.31155591E+04 + 0.31155591E+04 0.31122170E+04 0.31122170E+04 0.31071130E+04 + 0.31071130E+04 0.31022830E+04 0.31022830E+04 0.30997161E+04 + 0.30620720E+04 0.30604231E+04 0.32056521E+04 0.32015869E+04 + 0.32015869E+04 0.31955281E+04 0.31343669E+04 0.31306011E+04 + 0.31306011E+04 0.31247800E+04 0.31247800E+04 0.31195879E+04 + 0.31195879E+04 0.31130220E+04 0.31130220E+04 0.31096150E+04 + 0.31096150E+04 0.31078110E+04 0.31078110E+04 0.31040649E+04 + 0.31040649E+04 0.31004290E+04 0.30631089E+04 0.30612319E+04 + 0.31423560E+04 0.31393501E+04 0.31393501E+04 0.31343669E+04 + 0.31343669E+04 0.31306011E+04 0.31306011E+04 0.31247800E+04 + 0.31247800E+04 0.31195879E+04 0.31195879E+04 0.31130220E+04 + 0.31130220E+04 0.31096150E+04 0.31096150E+04 0.31078110E+04 + 0.31078110E+04 0.31040649E+04 0.31040649E+04 0.31004290E+04 + 0.31004290E+04 0.30982100E+04 0.31441699E+04 0.31422451E+04 + 0.31422451E+04 0.31401841E+04 0.31401841E+04 0.31349890E+04 + 0.31349890E+04 0.31221960E+04 0.31221960E+04 0.31138469E+04 + 0.31138469E+04 0.31090239E+04 0.31090239E+04 0.31081011E+04 + 0.31081011E+04 0.31116589E+04 0.31116589E+04 0.31074971E+04 + 0.31074971E+04 0.31016941E+04 0.31016941E+04 0.30982620E+04 + 0.32233459E+04 0.32208220E+04 0.32208220E+04 0.32235640E+04 + 0.32235640E+04 0.32247839E+04 0.32247839E+04 0.32209880E+04 + 0.32209880E+04 0.32125200E+04 0.32125200E+04 0.32096021E+04 + 0.32096021E+04 0.32129541E+04 0.32129541E+04 0.32163401E+04 + 0.32163401E+04 0.32179041E+04 0.32179041E+04 0.32228010E+04 + 0.32228010E+04 0.32307161E+04 0.32138621E+04 0.32128850E+04 + 0.32128850E+04 0.32181030E+04 0.32181030E+04 0.32203010E+04 + 0.32203010E+04 0.32175610E+04 0.32175610E+04 0.32137661E+04 + 0.32137661E+04 0.32156880E+04 0.32156880E+04 0.32219180E+04 + 0.32219180E+04 0.32256030E+04 0.32256030E+04 0.32277930E+04 + 0.32277930E+04 0.32326951E+04 0.32326951E+04 0.32354250E+04 + 0.32138621E+04 0.32128850E+04 0.32128850E+04 0.32181030E+04 + 0.32181030E+04 0.32203010E+04 0.32203010E+04 0.32175610E+04 + 0.32175610E+04 0.32137661E+04 0.32137661E+04 0.32156880E+04 + 0.32156880E+04 0.32219180E+04 0.32219180E+04 0.32256030E+04 + 0.32256030E+04 0.32277930E+04 0.32277930E+04 0.32326951E+04 + 0.32326951E+04 0.32354250E+04 0.32064121E+04 0.32062400E+04 + 0.32062400E+04 0.32105720E+04 0.32105720E+04 0.32090229E+04 + 0.32090229E+04 0.32052451E+04 0.32052451E+04 0.32045940E+04 + 0.32045940E+04 0.32091931E+04 0.32091931E+04 0.32167439E+04 + 0.32167439E+04 0.32221851E+04 0.32221851E+04 0.32277290E+04 + 0.32277290E+04 0.32340291E+04 0.32340291E+04 0.32341960E+04 + 0.32064121E+04 0.32062400E+04 0.32062400E+04 0.32105720E+04 + 0.32105720E+04 0.32090229E+04 0.32090229E+04 0.32052451E+04 + 0.32052451E+04 0.32045940E+04 0.32045940E+04 0.32091931E+04 + 0.32091931E+04 0.32167439E+04 0.32167439E+04 0.32221851E+04 + 0.32221851E+04 0.32277290E+04 0.32277290E+04 0.32340291E+04 + 0.32340291E+04 0.32341960E+04 0.31936350E+04 0.31852280E+04 + 0.31852280E+04 0.31857100E+04 0.31857100E+04 0.31818110E+04 + 0.31818110E+04 0.31881311E+04 0.31881311E+04 0.31988811E+04 + 0.31988811E+04 0.32079771E+04 0.32079771E+04 0.32140481E+04 + 0.32140481E+04 0.32187229E+04 0.32187229E+04 0.32234641E+04 + 0.32234641E+04 0.32284551E+04 0.32284551E+04 0.32308369E+04 + 0.31936350E+04 0.31852280E+04 0.31852280E+04 0.31857100E+04 + 0.31857100E+04 0.31818110E+04 0.31818110E+04 0.31881311E+04 + 0.31881311E+04 0.31988811E+04 0.31988811E+04 0.32079771E+04 + 0.32079771E+04 0.32140481E+04 0.32140481E+04 0.32187229E+04 + 0.32187229E+04 0.32234641E+04 0.32234641E+04 0.32284551E+04 + 0.32284551E+04 0.32308369E+04 0.31845220E+04 0.31794399E+04 + 0.31794399E+04 0.31824700E+04 0.31824700E+04 0.31835740E+04 + 0.31835740E+04 0.31868230E+04 0.31868230E+04 0.31930210E+04 + 0.31930210E+04 0.31974810E+04 0.31974810E+04 0.31985181E+04 + 0.31985181E+04 0.32032141E+04 0.32032141E+04 0.32134961E+04 + 0.32134961E+04 0.32235500E+04 0.32235500E+04 0.32323459E+04 + 0.31845220E+04 0.31794399E+04 0.31794399E+04 0.31824700E+04 + 0.31824700E+04 0.31835740E+04 0.31835740E+04 0.31868230E+04 + 0.31868230E+04 0.31930210E+04 0.31930210E+04 0.31974810E+04 + 0.31974810E+04 0.31985181E+04 0.31985181E+04 0.32032141E+04 + 0.32032141E+04 0.32134961E+04 0.32134961E+04 0.32235500E+04 + 0.32235500E+04 0.32323459E+04 0.31979709E+04 0.31989331E+04 + 0.31989331E+04 0.32004819E+04 0.32004819E+04 0.31979150E+04 + 0.31979150E+04 0.31894800E+04 0.31894800E+04 0.31838091E+04 + 0.31838091E+04 0.31852319E+04 0.31852319E+04 0.31909480E+04 + 0.31909480E+04 0.31965930E+04 0.31965930E+04 0.32045649E+04 + 0.32045649E+04 0.32167720E+04 0.32167720E+04 0.32292310E+04 + 0.31979709E+04 0.31989331E+04 0.31989331E+04 0.32004819E+04 + 0.32004819E+04 0.31979150E+04 0.31979150E+04 0.31894800E+04 + 0.31894800E+04 0.31838091E+04 0.31838091E+04 0.31852319E+04 + 0.31852319E+04 0.31909480E+04 0.31909480E+04 0.31965930E+04 + 0.31965930E+04 0.32045649E+04 0.32045649E+04 0.32167720E+04 + 0.32167720E+04 0.32292310E+04 0.31952800E+04 0.32030300E+04 + 0.32030300E+04 0.32078640E+04 0.32078640E+04 0.32066860E+04 + 0.32066860E+04 0.32021221E+04 0.32021221E+04 0.31955691E+04 + 0.31955691E+04 0.31935791E+04 0.31935791E+04 0.31923391E+04 + 0.31923391E+04 0.31897749E+04 0.31897749E+04 0.31946479E+04 + 0.31946479E+04 0.32084031E+04 0.32084031E+04 0.32234419E+04 + 0.31952800E+04 0.32030300E+04 0.32030300E+04 0.32078640E+04 + 0.32078640E+04 0.32066860E+04 0.32066860E+04 0.32021221E+04 + 0.32021221E+04 0.31955691E+04 0.31955691E+04 0.31935791E+04 + 0.31935791E+04 0.31923391E+04 0.31923391E+04 0.31897749E+04 + 0.31897749E+04 0.31946479E+04 0.31946479E+04 0.32084031E+04 + 0.32084031E+04 0.32234419E+04 0.31924399E+04 0.31987849E+04 + 0.31987849E+04 0.32058831E+04 0.32058831E+04 0.32054431E+04 + 0.32054431E+04 0.32038779E+04 0.32038779E+04 0.32018230E+04 + 0.32018230E+04 0.31993230E+04 0.31993230E+04 0.31908950E+04 + 0.31908950E+04 0.31854609E+04 0.31854609E+04 0.31876770E+04 + 0.31876770E+04 0.31962471E+04 0.31962471E+04 0.32074460E+04 + 0.31924399E+04 0.31987849E+04 0.31987849E+04 0.32058831E+04 + 0.32058831E+04 0.32054431E+04 0.32054431E+04 0.32038779E+04 + 0.32038779E+04 0.32018230E+04 0.32018230E+04 0.31993230E+04 + 0.31993230E+04 0.31908950E+04 0.31908950E+04 0.31854609E+04 + 0.31854609E+04 0.31876770E+04 0.31876770E+04 0.31962471E+04 + 0.31962471E+04 0.32074460E+04 0.32022949E+04 0.32016650E+04 + 0.32016650E+04 0.32098579E+04 0.32098579E+04 0.32111550E+04 + 0.32111550E+04 0.32051479E+04 0.32051479E+04 0.32009370E+04 + 0.32009370E+04 0.31979719E+04 0.31979719E+04 0.31906919E+04 + 0.31906919E+04 0.31826780E+04 0.31826780E+04 0.31841550E+04 + 0.31841550E+04 0.31888611E+04 0.31888611E+04 0.31932009E+04 + 0.32022949E+04 0.32016650E+04 0.32016650E+04 0.32098579E+04 + 0.32098579E+04 0.32111550E+04 0.32111550E+04 0.32051479E+04 + 0.32051479E+04 0.32009370E+04 0.32009370E+04 0.31979719E+04 + 0.31979719E+04 0.31906919E+04 0.31906919E+04 0.31826780E+04 + 0.31826780E+04 0.31841550E+04 0.31841550E+04 0.31888611E+04 + 0.31888611E+04 0.31932009E+04 0.32157891E+04 0.32109719E+04 + 0.32109719E+04 0.32157561E+04 0.32157561E+04 0.32165330E+04 + 0.32165330E+04 0.32101450E+04 0.32101450E+04 0.32030181E+04 + 0.32030181E+04 0.31972070E+04 0.31972070E+04 0.31894861E+04 + 0.31894861E+04 0.31812000E+04 0.31812000E+04 0.31823640E+04 + 0.31823640E+04 0.31884231E+04 0.31884231E+04 0.31972041E+04 + 0.32157891E+04 0.32109719E+04 0.32109719E+04 0.32157561E+04 + 0.32157561E+04 0.32165330E+04 0.32165330E+04 0.32101450E+04 + 0.32101450E+04 0.32030181E+04 0.32030181E+04 0.31972070E+04 + 0.31972070E+04 0.31894861E+04 0.31894861E+04 0.31812000E+04 + 0.31812000E+04 0.31823640E+04 0.31823640E+04 0.31884231E+04 + 0.31884231E+04 0.31972041E+04 0.32131340E+04 0.32105950E+04 + 0.32105950E+04 0.32127170E+04 0.32127170E+04 0.32127051E+04 + 0.32127051E+04 0.32055950E+04 0.32055950E+04 0.31966780E+04 + 0.31966780E+04 0.31913999E+04 0.31913999E+04 0.31884441E+04 + 0.31884441E+04 0.31862280E+04 0.31862280E+04 0.31878589E+04 + 0.31878589E+04 0.31925850E+04 0.31925850E+04 0.32025410E+04 + 0.32131340E+04 0.32105950E+04 0.32105950E+04 0.32127170E+04 + 0.32127170E+04 0.32127051E+04 0.32127051E+04 0.32055950E+04 + 0.32055950E+04 0.31966780E+04 0.31966780E+04 0.31913999E+04 + 0.31913999E+04 0.31884441E+04 0.31884441E+04 0.31862280E+04 + 0.31862280E+04 0.31878589E+04 0.31878589E+04 0.31925850E+04 + 0.30563220E+04 0.30576589E+04 0.32076831E+04 0.31988979E+04 + 0.31988979E+04 0.31997561E+04 0.31997561E+04 0.32018999E+04 + 0.32018999E+04 0.31980850E+04 0.31980850E+04 0.31933491E+04 + 0.31933491E+04 0.31908101E+04 0.31908101E+04 0.31895090E+04 + 0.31895090E+04 0.31890969E+04 0.31890969E+04 0.31910759E+04 + 0.31910759E+04 0.31942571E+04 0.30612390E+04 0.30589980E+04 + 0.32076831E+04 0.31988979E+04 0.31988979E+04 0.31997561E+04 + 0.31997561E+04 0.32018999E+04 0.32018999E+04 0.31980850E+04 + 0.31980850E+04 0.31933491E+04 0.31933491E+04 0.31908101E+04 + 0.31908101E+04 0.31895090E+04 0.31895090E+04 0.31890969E+04 + 0.30998391E+04 0.30970200E+04 0.30970200E+04 0.30960869E+04 + 0.30612390E+04 0.30589980E+04 0.32126499E+04 0.31954270E+04 + 0.31954270E+04 0.31923010E+04 0.31923010E+04 0.31927410E+04 + 0.31927410E+04 0.31918989E+04 0.31918989E+04 0.31904529E+04 + 0.31904529E+04 0.31881130E+04 0.31881130E+04 0.31887070E+04 + 0.31887070E+04 0.31906101E+04 0.30974561E+04 0.30980149E+04 + 0.30980149E+04 0.30972361E+04 0.30610181E+04 0.30587461E+04 + 0.32126499E+04 0.31954270E+04 0.31954270E+04 0.31923010E+04 + 0.31923010E+04 0.31927410E+04 0.31927410E+04 0.31918989E+04 + 0.31918989E+04 0.31904529E+04 0.31904529E+04 0.31881130E+04 + 0.31113059E+04 0.31072930E+04 0.31072930E+04 0.30974561E+04 + 0.30974561E+04 0.30980149E+04 0.30980149E+04 0.30972361E+04 + 0.30610181E+04 0.30587461E+04 0.32140391E+04 0.31989089E+04 + 0.31989089E+04 0.31924690E+04 0.31924690E+04 0.31890969E+04 + 0.31890969E+04 0.31871909E+04 0.31871909E+04 0.31879370E+04 + 0.31879370E+04 0.31878269E+04 0.31127400E+04 0.31103201E+04 + 0.31103201E+04 0.31051790E+04 0.31051790E+04 0.31010581E+04 + 0.31010581E+04 0.30988350E+04 0.30615549E+04 0.30593569E+04 + 0.32140391E+04 0.31989089E+04 0.31989089E+04 0.31924690E+04 + 0.31924690E+04 0.31890969E+04 0.31890969E+04 0.31871909E+04 + 0.31196951E+04 0.31163479E+04 0.31163479E+04 0.31127400E+04 + 0.31127400E+04 0.31103201E+04 0.31103201E+04 0.31051790E+04 + 0.31051790E+04 0.31010581E+04 0.31010581E+04 0.30988350E+04 + 0.30615549E+04 0.30593569E+04 0.32081670E+04 0.32003689E+04 + 0.32003689E+04 0.31931079E+04 0.31931079E+04 0.31916760E+04 + 0.31916760E+04 0.31883181E+04 0.31218291E+04 0.31192080E+04 + 0.31192080E+04 0.31155591E+04 0.31155591E+04 0.31122170E+04 + 0.31122170E+04 0.31071130E+04 0.31071130E+04 0.31022830E+04 + 0.31022830E+04 0.30997161E+04 0.30620720E+04 0.30604231E+04 + 0.32081670E+04 0.32003689E+04 0.32003689E+04 0.31931079E+04 + 0.31309031E+04 0.31271021E+04 0.31271021E+04 0.31218291E+04 + 0.31218291E+04 0.31192080E+04 0.31192080E+04 0.31155591E+04 + 0.31155591E+04 0.31122170E+04 0.31122170E+04 0.31071130E+04 + 0.31071130E+04 0.31022830E+04 0.31022830E+04 0.30997161E+04 + 0.30620720E+04 0.30604231E+04 0.32056521E+04 0.32015869E+04 + 0.32015869E+04 0.31955281E+04 0.31343669E+04 0.31306011E+04 + 0.31306011E+04 0.31247800E+04 0.31247800E+04 0.31195879E+04 + 0.31195879E+04 0.31130220E+04 0.31130220E+04 0.31096150E+04 + 0.31096150E+04 0.31078110E+04 0.31078110E+04 0.31040649E+04 + 0.31040649E+04 0.31004290E+04 0.30631089E+04 0.30612319E+04 + 0.31423560E+04 0.31393501E+04 0.31393501E+04 0.31343669E+04 + 0.31343669E+04 0.31306011E+04 0.31306011E+04 0.31247800E+04 + 0.31247800E+04 0.31195879E+04 0.31195879E+04 0.31130220E+04 + 0.31130220E+04 0.31096150E+04 0.31096150E+04 0.31078110E+04 + 0.31078110E+04 0.31040649E+04 0.31040649E+04 0.31004290E+04 + 0.31004290E+04 0.30982100E+04 0.31441699E+04 0.31422451E+04 + 0.31422451E+04 0.31401841E+04 0.31401841E+04 0.31349890E+04 + 0.31349890E+04 0.31221960E+04 0.31221960E+04 0.31138469E+04 + 0.31138469E+04 0.31090239E+04 0.31090239E+04 0.31081011E+04 + 0.31081011E+04 0.31116589E+04 0.31116589E+04 0.31074971E+04 + 0.31074971E+04 0.31016941E+04 0.31016941E+04 0.30982620E+04 + 0.32246011E+04 0.32219600E+04 0.32219600E+04 0.32246951E+04 + 0.32246951E+04 0.32259551E+04 0.32259551E+04 0.32222300E+04 + 0.32222300E+04 0.32137300E+04 0.32137300E+04 0.32106650E+04 + 0.32106650E+04 0.32139089E+04 0.32139089E+04 0.32173350E+04 + 0.32173350E+04 0.32189241E+04 0.32189241E+04 0.32238279E+04 + 0.32238279E+04 0.32317981E+04 0.32151350E+04 0.32139880E+04 + 0.32139880E+04 0.32192219E+04 0.32192219E+04 0.32215000E+04 + 0.32215000E+04 0.32188110E+04 0.32188110E+04 0.32149519E+04 + 0.32149519E+04 0.32167400E+04 0.32167400E+04 0.32229519E+04 + 0.32229519E+04 0.32267510E+04 0.32267510E+04 0.32289221E+04 + 0.32289221E+04 0.32338330E+04 0.32338330E+04 0.32365320E+04 + 0.32151350E+04 0.32139880E+04 0.32139880E+04 0.32192219E+04 + 0.32192219E+04 0.32215000E+04 0.32215000E+04 0.32188110E+04 + 0.32188110E+04 0.32149519E+04 0.32149519E+04 0.32167400E+04 + 0.32167400E+04 0.32229519E+04 0.32229519E+04 0.32267510E+04 + 0.32267510E+04 0.32289221E+04 0.32289221E+04 0.32338330E+04 + 0.32338330E+04 0.32365320E+04 0.32076941E+04 0.32074009E+04 + 0.32074009E+04 0.32117749E+04 0.32117749E+04 0.32103140E+04 + 0.32103140E+04 0.32064790E+04 0.32064790E+04 0.32056521E+04 + 0.32056521E+04 0.32101089E+04 0.32101089E+04 0.32176599E+04 + 0.32176599E+04 0.32231699E+04 0.32231699E+04 0.32287280E+04 + 0.32287280E+04 0.32350840E+04 0.32350840E+04 0.32352319E+04 + 0.32076941E+04 0.32074009E+04 0.32074009E+04 0.32117749E+04 + 0.32117749E+04 0.32103140E+04 0.32103140E+04 0.32064790E+04 + 0.32064790E+04 0.32056521E+04 0.32056521E+04 0.32101089E+04 + 0.32101089E+04 0.32176599E+04 0.32176599E+04 0.32231699E+04 + 0.32231699E+04 0.32287280E+04 0.32287280E+04 0.32350840E+04 + 0.32350840E+04 0.32352319E+04 0.31948870E+04 0.31863420E+04 + 0.31863420E+04 0.31868660E+04 0.31868660E+04 0.31827380E+04 + 0.31827380E+04 0.31888679E+04 0.31888679E+04 0.31995500E+04 + 0.31995500E+04 0.32086741E+04 0.32086741E+04 0.32148530E+04 + 0.32148530E+04 0.32196111E+04 0.32196111E+04 0.32243230E+04 + 0.32243230E+04 0.32292271E+04 0.32292271E+04 0.32314761E+04 + 0.31948870E+04 0.31863420E+04 0.31863420E+04 0.31868660E+04 + 0.31868660E+04 0.31827380E+04 0.31827380E+04 0.31888679E+04 + 0.31888679E+04 0.31995500E+04 0.31995500E+04 0.32086741E+04 + 0.32086741E+04 0.32148530E+04 0.32148530E+04 0.32196111E+04 + 0.32196111E+04 0.32243230E+04 0.32243230E+04 0.32292271E+04 + 0.32292271E+04 0.32314761E+04 0.31851211E+04 0.31799961E+04 + 0.31799961E+04 0.31830969E+04 0.31830969E+04 0.31842219E+04 + 0.31842219E+04 0.31874829E+04 0.31874829E+04 0.31937061E+04 + 0.31937061E+04 0.31981750E+04 0.31981750E+04 0.31991721E+04 + 0.31991721E+04 0.32037520E+04 0.32037520E+04 0.32140200E+04 + 0.32140200E+04 0.32240430E+04 0.32240430E+04 0.32328181E+04 + 0.31851211E+04 0.31799961E+04 0.31799961E+04 0.31830969E+04 + 0.31830969E+04 0.31842219E+04 0.31842219E+04 0.31874829E+04 + 0.31874829E+04 0.31937061E+04 0.31937061E+04 0.31981750E+04 + 0.31981750E+04 0.31991721E+04 0.31991721E+04 0.32037520E+04 + 0.32037520E+04 0.32140200E+04 0.32140200E+04 0.32240430E+04 + 0.32240430E+04 0.32328181E+04 0.31985049E+04 0.31994351E+04 + 0.31994351E+04 0.32010200E+04 0.32010200E+04 0.31985129E+04 + 0.31985129E+04 0.31900500E+04 0.31900500E+04 0.31843020E+04 + 0.31843020E+04 0.31856721E+04 0.31856721E+04 0.31913911E+04 + 0.31913911E+04 0.31970710E+04 0.31970710E+04 0.32049819E+04 + 0.32049819E+04 0.32171780E+04 0.32171780E+04 0.32296489E+04 + 0.31985049E+04 0.31994351E+04 0.31994351E+04 0.32010200E+04 + 0.32010200E+04 0.31985129E+04 0.31985129E+04 0.31900500E+04 + 0.31900500E+04 0.31843020E+04 0.31843020E+04 0.31856721E+04 + 0.31856721E+04 0.31913911E+04 0.31913911E+04 0.31970710E+04 + 0.31970710E+04 0.32049819E+04 0.32049819E+04 0.32171780E+04 + 0.32171780E+04 0.32296489E+04 0.31957891E+04 0.32035020E+04 + 0.32035020E+04 0.32083931E+04 0.32083931E+04 0.32072561E+04 + 0.32072561E+04 0.32026689E+04 0.32026689E+04 0.31960471E+04 + 0.31960471E+04 0.31940100E+04 0.31940100E+04 0.31928140E+04 + 0.31928140E+04 0.31902019E+04 0.31902019E+04 0.31949751E+04 + 0.31949751E+04 0.32087791E+04 0.32087791E+04 0.32239180E+04 + 0.31957891E+04 0.32035020E+04 0.32035020E+04 0.32083931E+04 + 0.32083931E+04 0.32072561E+04 0.32072561E+04 0.32026689E+04 + 0.32026689E+04 0.31960471E+04 0.31960471E+04 0.31940100E+04 + 0.31940100E+04 0.31928140E+04 0.31928140E+04 0.31902019E+04 + 0.31902019E+04 0.31949751E+04 0.31949751E+04 0.32087791E+04 + 0.32087791E+04 0.32239180E+04 0.31929009E+04 0.31991870E+04 + 0.31991870E+04 0.32063730E+04 0.32063730E+04 0.32059561E+04 + 0.32059561E+04 0.32043799E+04 0.32043799E+04 0.32022959E+04 + 0.32022959E+04 0.31998159E+04 0.31998159E+04 0.31913970E+04 + 0.31913970E+04 0.31858860E+04 0.31858860E+04 0.31880371E+04 + 0.31880371E+04 0.31966230E+04 0.31966230E+04 0.32079341E+04 + 0.31929009E+04 0.31991870E+04 0.31991870E+04 0.32063730E+04 + 0.32063730E+04 0.32059561E+04 0.32059561E+04 0.32043799E+04 + 0.32043799E+04 0.32022959E+04 0.32022959E+04 0.31998159E+04 + 0.31998159E+04 0.31913970E+04 0.31913970E+04 0.31858860E+04 + 0.31858860E+04 0.31880371E+04 0.31880371E+04 0.31966230E+04 + 0.31966230E+04 0.32079341E+04 0.32027839E+04 0.32020381E+04 + 0.32020381E+04 0.32102759E+04 0.32102759E+04 0.32116321E+04 + 0.32116321E+04 0.32056389E+04 0.32056389E+04 0.32013940E+04 + 0.32013940E+04 0.31984441E+04 0.31984441E+04 0.31912141E+04 + 0.31912141E+04 0.31831250E+04 0.31831250E+04 0.31845300E+04 + 0.31845300E+04 0.31892351E+04 0.31892351E+04 0.31935540E+04 + 0.32027839E+04 0.32020381E+04 0.32020381E+04 0.32102759E+04 + 0.32102759E+04 0.32116321E+04 0.32116321E+04 0.32056389E+04 + 0.32056389E+04 0.32013940E+04 0.32013940E+04 0.31984441E+04 + 0.31984441E+04 0.31912141E+04 0.31912141E+04 0.31831250E+04 + 0.31831250E+04 0.31845300E+04 0.31845300E+04 0.31892351E+04 + 0.31892351E+04 0.31935540E+04 0.32163730E+04 0.32114131E+04 + 0.32114131E+04 0.32161809E+04 0.32161809E+04 0.32170149E+04 + 0.32170149E+04 0.32106660E+04 0.32106660E+04 0.32035330E+04 + 0.32035330E+04 0.31976841E+04 0.31976841E+04 0.31899971E+04 + 0.31899971E+04 0.31816069E+04 0.31816069E+04 0.31827251E+04 + 0.31827251E+04 0.31887729E+04 0.31887729E+04 0.31975701E+04 + 0.32163730E+04 0.32114131E+04 0.32114131E+04 0.32161809E+04 + 0.32161809E+04 0.32170149E+04 0.32170149E+04 0.32106660E+04 + 0.32106660E+04 0.32035330E+04 0.32035330E+04 0.31976841E+04 + 0.31976841E+04 0.31899971E+04 0.31899971E+04 0.31816069E+04 + 0.31816069E+04 0.31827251E+04 0.31827251E+04 0.31887729E+04 + 0.31887729E+04 0.31975701E+04 0.32137849E+04 0.32111289E+04 + 0.32111289E+04 0.32132190E+04 0.32132190E+04 0.32132219E+04 + 0.32132219E+04 0.32061670E+04 0.32061670E+04 0.31972170E+04 + 0.31972170E+04 0.31918789E+04 0.31918789E+04 0.31888799E+04 + 0.31888799E+04 0.31866089E+04 0.31866089E+04 0.31882090E+04 + 0.31882090E+04 0.31929719E+04 0.31929719E+04 0.32029661E+04 + 0.32137849E+04 0.32111289E+04 0.32111289E+04 0.32132190E+04 + 0.32132190E+04 0.32132219E+04 0.32132219E+04 0.32061670E+04 + 0.32061670E+04 0.31972170E+04 0.31972170E+04 0.31918789E+04 + 0.31918789E+04 0.31888799E+04 0.31888799E+04 0.31866089E+04 + 0.31866089E+04 0.31882090E+04 0.31882090E+04 0.31929719E+04 + 0.30565840E+04 0.30579741E+04 0.32083479E+04 0.31994309E+04 + 0.31994309E+04 0.32002180E+04 0.32002180E+04 0.32024290E+04 + 0.32024290E+04 0.31986499E+04 0.31986499E+04 0.31938889E+04 + 0.31938889E+04 0.31912620E+04 0.31912620E+04 0.31898911E+04 + 0.31898911E+04 0.31894900E+04 0.31894900E+04 0.31914680E+04 + 0.31914680E+04 0.31946531E+04 0.30615081E+04 0.30593091E+04 + 0.32083479E+04 0.31994309E+04 0.31994309E+04 0.32002180E+04 + 0.32002180E+04 0.32024290E+04 0.32024290E+04 0.31986499E+04 + 0.31986499E+04 0.31938889E+04 0.31938889E+04 0.31912620E+04 + 0.31912620E+04 0.31898911E+04 0.31898911E+04 0.31894900E+04 + 0.31003931E+04 0.30975911E+04 0.30975911E+04 0.30966760E+04 + 0.30615081E+04 0.30593091E+04 0.32134060E+04 0.31960139E+04 + 0.31960139E+04 0.31928420E+04 0.31928420E+04 0.31932749E+04 + 0.31932749E+04 0.31924060E+04 0.31924060E+04 0.31909280E+04 + 0.31909280E+04 0.31885581E+04 0.31885581E+04 0.31891040E+04 + 0.31891040E+04 0.31910259E+04 0.30979490E+04 0.30985791E+04 + 0.30985791E+04 0.30978420E+04 0.30613030E+04 0.30590549E+04 + 0.32134060E+04 0.31960139E+04 0.31960139E+04 0.31928420E+04 + 0.31928420E+04 0.31932749E+04 0.31932749E+04 0.31924060E+04 + 0.31924060E+04 0.31909280E+04 0.31909280E+04 0.31885581E+04 + 0.31118359E+04 0.31078359E+04 0.31078359E+04 0.30979490E+04 + 0.30979490E+04 0.30985791E+04 0.30985791E+04 0.30978420E+04 + 0.30613030E+04 0.30590549E+04 0.32147251E+04 0.31995430E+04 + 0.31995430E+04 0.31930920E+04 0.31930920E+04 0.31896499E+04 + 0.31896499E+04 0.31877051E+04 0.31877051E+04 0.31884031E+04 + 0.31884031E+04 0.31882991E+04 0.31132729E+04 0.31108840E+04 + 0.31108840E+04 0.31057671E+04 0.31057671E+04 0.31016521E+04 + 0.31016521E+04 0.30994500E+04 0.30618491E+04 0.30596750E+04 + 0.32147251E+04 0.31995430E+04 0.31995430E+04 0.31930920E+04 + 0.31930920E+04 0.31896499E+04 0.31896499E+04 0.31877051E+04 + 0.31201870E+04 0.31168540E+04 0.31168540E+04 0.31132729E+04 + 0.31132729E+04 0.31108840E+04 0.31108840E+04 0.31057671E+04 + 0.31057671E+04 0.31016521E+04 0.31016521E+04 0.30994500E+04 + 0.30618491E+04 0.30596750E+04 0.32086021E+04 0.32008870E+04 + 0.32008870E+04 0.31936440E+04 0.31936440E+04 0.31922600E+04 + 0.31922600E+04 0.31889099E+04 0.31223450E+04 0.31197451E+04 + 0.31197451E+04 0.31161069E+04 0.31161069E+04 0.31127981E+04 + 0.31127981E+04 0.31077051E+04 0.31077051E+04 0.31028979E+04 + 0.31028979E+04 0.31003420E+04 0.30623730E+04 0.30607461E+04 + 0.32086021E+04 0.32008870E+04 0.32008870E+04 0.31936440E+04 + 0.31313740E+04 0.31275879E+04 0.31275879E+04 0.31223450E+04 + 0.31223450E+04 0.31197451E+04 0.31197451E+04 0.31161069E+04 + 0.31161069E+04 0.31127981E+04 0.31127981E+04 0.31077051E+04 + 0.31077051E+04 0.31028979E+04 0.31028979E+04 0.31003420E+04 + 0.30623730E+04 0.30607461E+04 0.32061240E+04 0.32020640E+04 + 0.32020640E+04 0.31960210E+04 0.31348391E+04 0.31311201E+04 + 0.31311201E+04 0.31253469E+04 0.31253469E+04 0.31201621E+04 + 0.31201621E+04 0.31135811E+04 0.31135811E+04 0.31101931E+04 + 0.31101931E+04 0.31084209E+04 0.31084209E+04 0.31046770E+04 + 0.31046770E+04 0.31010540E+04 0.30634199E+04 0.30615759E+04 + 0.31427661E+04 0.31397749E+04 0.31397749E+04 0.31348391E+04 + 0.31348391E+04 0.31311201E+04 0.31311201E+04 0.31253469E+04 + 0.31253469E+04 0.31201621E+04 0.31201621E+04 0.31135811E+04 + 0.31135811E+04 0.31101931E+04 0.31101931E+04 0.31084209E+04 + 0.31084209E+04 0.31046770E+04 0.31046770E+04 0.31010540E+04 + 0.31010540E+04 0.30988621E+04 0.31445811E+04 0.31426670E+04 + 0.31426670E+04 0.31406760E+04 0.31406760E+04 0.31355400E+04 + 0.31355400E+04 0.31227871E+04 0.31227871E+04 0.31143850E+04 + 0.31143850E+04 0.31095510E+04 0.31095510E+04 0.31086121E+04 + 0.31086121E+04 0.31122520E+04 0.31122520E+04 0.31081089E+04 + 0.31081089E+04 0.31023120E+04 0.31023120E+04 0.30988889E+04 +/ + +ACTNUM + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 0 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 0 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 0 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 0 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 0 + 0 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 0 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 0 1 1 1 + 1 0 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 0 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 0 1 1 1 1 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 0 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 0 0 0 0 0 1 + 1 1 1 1 0 1 + 0 0 1 1 1 1 + 0 1 1 1 1 1 + 1 1 1 1 0 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 0 1 1 0 0 0 + 0 1 1 1 1 1 + 0 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 0 1 0 + 1 0 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 0 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 0 1 1 1 1 1 + 0 1 1 1 1 1 + 0 0 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 0 1 0 0 0 + 0 0 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 0 0 0 + 1 1 1 0 1 1 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 0 0 1 1 1 0 + 0 0 0 1 1 1 + 1 0 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 0 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 0 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 0 0 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 1 1 + 1 0 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 0 0 + 0 0 0 0 0 0 + 1 1 0 0 1 0 + 0 0 0 0 0 0 + 0 0 0 1 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 0 1 1 1 1 1 + 0 0 1 1 1 1 + 0 1 1 1 1 1 + 1 1 1 1 1 1 + 1 0 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 0 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 0 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 0 1 1 1 1 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 0 1 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 0 1 1 1 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 0 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 1 0 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 1 0 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 0 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 0 1 1 + 0 0 1 1 0 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 0 1 1 1 + 0 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 0 1 1 + 0 0 0 0 0 0 + 1 1 0 1 1 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 0 1 1 0 1 + 1 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 1 1 1 1 0 + 0 0 0 1 1 1 + 1 0 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 0 1 + 1 1 1 1 1 0 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 0 1 + 1 1 0 1 1 1 + 1 0 1 1 1 1 + 1 0 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 0 1 1 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 0 1 1 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 0 1 1 1 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 0 1 0 0 0 0 + 0 0 1 1 1 1 + 0 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 0 1 1 + 1 1 0 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 1 + 0 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 0 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 0 1 1 + 1 1 1 1 1 1 + 0 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 0 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 0 0 + 1 0 1 1 1 0 + 0 0 0 1 1 1 + 1 1 1 1 0 0 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 1 0 0 0 + 0 0 0 0 0 1 + 1 1 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 1 0 + 0 0 0 0 0 0 + 0 1 1 1 0 0 + 0 0 0 0 1 1 + 1 1 1 0 0 0 + 0 1 1 1 1 1 + 1 1 0 0 1 1 + 1 1 0 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 0 0 0 0 0 0 + 1 0 0 0 0 0 + 0 0 0 1 1 1 + 0 0 0 0 + 0 0 1 1 1 1 + 1 0 0 0 0 1 + 1 1 1 1 1 1 + 0 0 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 1 1 1 + 1 1 1 0 +/ + diff --git a/ApplicationLibCode/UnitTests/opm-summary-Test.cpp b/ApplicationLibCode/UnitTests/opm-summary-Test.cpp new file mode 100644 index 0000000000..c65b554a67 --- /dev/null +++ b/ApplicationLibCode/UnitTests/opm-summary-Test.cpp @@ -0,0 +1,45 @@ +#include "gtest/gtest.h" + +#include "RiaTestDataDirectory.h" +#include "RifOpmCommonSummary.h" + +#include "opm/io/eclipse/ESmry.hpp" +#include "opm/io/eclipse/ExtESmry.hpp" + +static const QString H5_TEST_DATA_DIRECTORY = QString( "%1/h5-file/" ).arg( TEST_DATA_DIR ); + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +TEST( OpmSummaryTests, ReadOpmSummaryDataListContent ) +{ + std::vector esmryKeywords; + { + QString filePath = H5_TEST_DATA_DIRECTORY + "NORNE_ATW2013_RFTPLT_V2.SMSPEC"; + + Opm::EclIO::ESmry eSmry( filePath.toStdString() ); + + esmryKeywords = eSmry.keywordList(); + eSmry.make_esmry_file(); + } + + std::vector extEsmryKeywords; + { + QString filePath = H5_TEST_DATA_DIRECTORY + "NORNE_ATW2013_RFTPLT_V2.ESMRY"; + + Opm::EclIO::ExtESmry extEsmry( filePath.toStdString() ); + + extEsmryKeywords = extEsmry.keywordList(); + } + + EXPECT_EQ( esmryKeywords.size(), extEsmryKeywords.size() ); + for ( size_t i = 0; i < esmryKeywords.size(); i++ ) + { + auto s1 = esmryKeywords[i]; + auto s2 = extEsmryKeywords[i]; + EXPECT_STREQ( s1.c_str(), s2.c_str() ); + + RifEclipseSummaryAddress eclAdr = RifEclipseSummaryAddress::fromEclipseTextAddressParseErrorTokens( s1 ); + EXPECT_TRUE( eclAdr.isValid() ); + } +} diff --git a/ApplicationLibCode/UserInterface/AnalysisPlots/CMakeLists_files.cmake b/ApplicationLibCode/UserInterface/AnalysisPlots/CMakeLists_files.cmake index 9202b054c5..0d37cd3736 100644 --- a/ApplicationLibCode/UserInterface/AnalysisPlots/CMakeLists_files.cmake +++ b/ApplicationLibCode/UserInterface/AnalysisPlots/CMakeLists_files.cmake @@ -1,26 +1,21 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RiuGroupedBarChartBuilder.h - +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiuGroupedBarChartBuilder.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RiuGroupedBarChartBuilder.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiuGroupedBarChartBuilder.cpp ) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} -) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND QT_MOC_HEADERS +list(APPEND QT_MOC_HEADERS) -) +list(APPEND QT_UI_FILES) -list(APPEND QT_UI_FILES +source_group( + "UserInterface/AnalysisPlots" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - -source_group( "UserInterface/AnalysisPlots" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/UserInterface/CMakeLists_files.cmake b/ApplicationLibCode/UserInterface/CMakeLists_files.cmake index a198767add..344f285a01 100644 --- a/ApplicationLibCode/UserInterface/CMakeLists_files.cmake +++ b/ApplicationLibCode/UserInterface/CMakeLists_files.cmake @@ -1,271 +1,260 @@ - -set (SOURCE_GROUP_HEADER_FILES -${CMAKE_CURRENT_LIST_DIR}/RiuCadNavigation.h -${CMAKE_CURRENT_LIST_DIR}/RiuCursors.h -${CMAKE_CURRENT_LIST_DIR}/RiuDragDrop.h -${CMAKE_CURRENT_LIST_DIR}/RiuFemResultTextBuilder.h -${CMAKE_CURRENT_LIST_DIR}/RiuGeoQuestNavigation.h -${CMAKE_CURRENT_LIST_DIR}/RiuInterfaceToViewWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtSymbol.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurve.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurveDefines.h -${CMAKE_CURRENT_LIST_DIR}/RiuRimQwtPlotCurve.h -${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.h -${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.h -${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.h -${CMAKE_CURRENT_LIST_DIR}/RiuProjectPropertyView.h -${CMAKE_CURRENT_LIST_DIR}/RiuPropertyViewTabWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotUpdater.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtLinearScaleEngine.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtCurvePointTracker.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotZoomer.h -${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.h -${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.h -${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotUpdater.h -${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuResultTextBuilder.h -${CMAKE_CURRENT_LIST_DIR}/RiuRmsNavigation.h -${CMAKE_CURRENT_LIST_DIR}/RiuSelectionChangedHandler.h -${CMAKE_CURRENT_LIST_DIR}/Riu3dSelectionManager.h -${CMAKE_CURRENT_LIST_DIR}/RiuSimpleHistogramWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.h -${CMAKE_CURRENT_LIST_DIR}/RiuTimeStepChangedHandler.h -${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuToolTipMenu.h -${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.h -${CMAKE_CURRENT_LIST_DIR}/RiuViewer.h -${CMAKE_CURRENT_LIST_DIR}/RiuViewerToViewInterface.h -${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.h -${CMAKE_CURRENT_LIST_DIR}/RiuCellAndNncPickEventHandler.h -${CMAKE_CURRENT_LIST_DIR}/RiuPickItemInfo.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.h -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.h -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.h -${CMAKE_CURRENT_LIST_DIR}/RiuPlotAnnotationTool.h -${CMAKE_CURRENT_LIST_DIR}/RiuGeoMechXfTensorResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RiuFemTimeHistoryResultAccessor.h -${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuPlotObjectPicker.h -${CMAKE_CURRENT_LIST_DIR}/RiuContextMenuLauncher.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryCurveDefinitionKeywords.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionUi.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionDialog.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionWidgetCreator.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQuantityNameInfoProvider.h -${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.h -${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.h -${CMAKE_CURRENT_LIST_DIR}/RiuGridStatisticsHistogramWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.h -${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotItemGroup.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.h -${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementViewEventFilter.h -${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.h -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuComparisonViewMover.h -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuFileDialogTools.h -${CMAKE_CURRENT_LIST_DIR}/RiuGuiTheme.h -${CMAKE_CURRENT_LIST_DIR}/RiuQssSyntaxHighlighter.h +set(SOURCE_GROUP_HEADER_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiuCadNavigation.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCursors.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDragDrop.h + ${CMAKE_CURRENT_LIST_DIR}/RiuFemResultTextBuilder.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGeoQuestNavigation.h + ${CMAKE_CURRENT_LIST_DIR}/RiuInterfaceToViewWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtSymbol.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurveDefines.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRimQwtPlotCurve.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.h + ${CMAKE_CURRENT_LIST_DIR}/RiuProjectPropertyView.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPropertyViewTabWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotUpdater.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtLinearScaleEngine.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtCurvePointTracker.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotZoomer.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotUpdater.h + ${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuResultTextBuilder.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRmsNavigation.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSelectionChangedHandler.h + ${CMAKE_CURRENT_LIST_DIR}/Riu3dSelectionManager.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSimpleHistogramWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTimeStepChangedHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuToolTipMenu.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RiuViewer.h + ${CMAKE_CURRENT_LIST_DIR}/RiuViewerToViewInterface.h + ${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCellAndNncPickEventHandler.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPickItemInfo.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotAnnotationTool.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGeoMechXfTensorResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RiuFemTimeHistoryResultAccessor.h + ${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotObjectPicker.h + ${CMAKE_CURRENT_LIST_DIR}/RiuContextMenuLauncher.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryCurveDefinitionKeywords.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionUi.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionWidgetCreator.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQuantityNameInfoProvider.h + ${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGridStatisticsHistogramWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.h + ${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotItemGroup.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMeasurementViewEventFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuComparisonViewMover.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuFileDialogTools.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGuiTheme.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQssSyntaxHighlighter.h ) -set (SOURCE_GROUP_SOURCE_FILES -${CMAKE_CURRENT_LIST_DIR}/RiuCadNavigation.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuCursors.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuDragDrop.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuFemResultTextBuilder.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuGeoQuestNavigation.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuInterfaceToViewWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtSymbol.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurveDefines.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuRimQwtPlotCurve.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuProjectPropertyView.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPropertyViewTabWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotUpdater.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtLinearScaleEngine.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtCurvePointTracker.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotUpdater.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuResultTextBuilder.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuRmsNavigation.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSelectionChangedHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/Riu3dSelectionManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSimpleHistogramWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTimeStepChangedHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuToolTipMenu.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuViewer.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuCellAndNncPickEventHandler.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPickItemInfo.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPlotAnnotationTool.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuGeoMechXfTensorResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuFemTimeHistoryResultAccessor.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPlotObjectPicker.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuContextMenuLauncher.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionUi.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionDialog.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionWidgetCreator.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQuantityNameInfoProvider.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuGridStatisticsHistogramWidget.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.cpp -${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotItemGroup.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuComparisonViewMover.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuFileDialogTools.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuGuiTheme.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuQssSyntaxHighlighter.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTextEditWithCompletion.cpp -${CMAKE_CURRENT_LIST_DIR}/RiuTextContentFrame.cpp +set(SOURCE_GROUP_SOURCE_FILES + ${CMAKE_CURRENT_LIST_DIR}/RiuCadNavigation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuCursors.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuDragDrop.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuFemResultTextBuilder.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuGeoQuestNavigation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuInterfaceToViewWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtSymbol.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotCurveDefines.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuRimQwtPlotCurve.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuProjectPropertyView.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPropertyViewTabWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotUpdater.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtLinearScaleEngine.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtCurvePointTracker.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotUpdater.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuResultTextBuilder.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuRmsNavigation.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSelectionChangedHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/Riu3dSelectionManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSimpleHistogramWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTimeStepChangedHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuToolTipMenu.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuViewer.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuCellAndNncPickEventHandler.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPickItemInfo.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotAnnotationTool.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuGeoMechXfTensorResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuFemTimeHistoryResultAccessor.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotObjectPicker.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuContextMenuLauncher.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionUi.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionDialog.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryVectorSelectionWidgetCreator.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQuantityNameInfoProvider.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuGridStatisticsHistogramWidget.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindowTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/Riu3DMainWindowTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuDockWidgetTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotItemGroup.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuWellPathComponentPlotItem.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiMaximizeWindowGuard.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuComparisonViewMover.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuFileDialogTools.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuGuiTheme.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuQssSyntaxHighlighter.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTextEditWithCompletion.cpp + ${CMAKE_CURRENT_LIST_DIR}/RiuTextContentFrame.cpp ) - if(Qt5Charts_FOUND) - list(APPEND CODE_HEADER_FILES - ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.h) + list(APPEND CODE_HEADER_FILES ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.h) - list(APPEND CODE_SOURCE_FILES - ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.cpp) + list(APPEND CODE_SOURCE_FILES ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.cpp) -# list(APPEND QT_MOC_HEADERS -# ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.h) + # list(APPEND QT_MOC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/RiuQtChartView.h) endif() +list(APPEND CODE_HEADER_FILES ${SOURCE_GROUP_HEADER_FILES}) +list(APPEND CODE_SOURCE_FILES ${SOURCE_GROUP_SOURCE_FILES}) -list(APPEND CODE_HEADER_FILES -${SOURCE_GROUP_HEADER_FILES} -) - -list(APPEND CODE_SOURCE_FILES -${SOURCE_GROUP_SOURCE_FILES} +list( + APPEND + QT_MOC_HEADERS + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.h + ${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.h + ${CMAKE_CURRENT_LIST_DIR}/RiuViewer.h + ${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.h + ${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.h + ${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.h + ${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.h + ${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.h + ${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.h + ${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.h + ${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTextEditWithCompletion.h + ${CMAKE_CURRENT_LIST_DIR}/RiuTextContentFrame.h ) +list(APPEND QT_UI_FILES) -list(APPEND QT_MOC_HEADERS -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindowBase.h -${CMAKE_CURRENT_LIST_DIR}/RiuMainWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuPlotMainWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuMdiArea.h -${CMAKE_CURRENT_LIST_DIR}/RiuMdiSubWindow.h -${CMAKE_CURRENT_LIST_DIR}/RiuPvtPlotPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuRelativePermeabilityPlotPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuResultInfoPanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuResultQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuTextDialog.h -${CMAKE_CURRENT_LIST_DIR}/RiuViewer.h -${CMAKE_CURRENT_LIST_DIR}/RiuProcessMonitor.h -${CMAKE_CURRENT_LIST_DIR}/RiuViewerCommands.h -${CMAKE_CURRENT_LIST_DIR}/RiuTreeViewEventFilter.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellLogTrack.h -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotPage.h -${CMAKE_CURRENT_LIST_DIR}/RiuMultiPlotBook.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotLegend.h -${CMAKE_CURRENT_LIST_DIR}/RiuRecentFileActionProvider.h -${CMAKE_CURRENT_LIST_DIR}/RiuDockedQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuGridCrossQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuSummaryQwtPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuTofAccumulatedPhaseFractionsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtScalePicker.h -${CMAKE_CURRENT_LIST_DIR}/RiuQwtPlotWheelZoomer.h -${CMAKE_CURRENT_LIST_DIR}/RiuWidgetDragger.h -${CMAKE_CURRENT_LIST_DIR}/RiuEditPerforationCollectionWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuAdvancedSnapshotExportWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuWellAllocationPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuFlowCharacteristicsPlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuNightchartsWidget.h -${CMAKE_CURRENT_LIST_DIR}/RiuMessagePanel.h -${CMAKE_CURRENT_LIST_DIR}/RiuExpressionContextMenuManager.h -${CMAKE_CURRENT_LIST_DIR}/RiuCalculationsContextMenuManager.h -${CMAKE_CURRENT_LIST_DIR}/RiuMohrsCirclePlot.h -${CMAKE_CURRENT_LIST_DIR}/RiuDraggableOverlayFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractOverlayContentFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuAbstractLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuCategoryLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuScalarMapperLegendFrame.h -${CMAKE_CURRENT_LIST_DIR}/RiuTextEditWithCompletion.h -${CMAKE_CURRENT_LIST_DIR}/RiuTextContentFrame.h -) - -list(APPEND QT_UI_FILES +source_group( + "UserInterface" + FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} + ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) - - - - - -source_group( "UserInterface" FILES ${SOURCE_GROUP_HEADER_FILES} ${SOURCE_GROUP_SOURCE_FILES} ${CMAKE_CURRENT_LIST_DIR}/CMakeLists_files.cmake ) diff --git a/ApplicationLibCode/UserInterface/Riu3dSelectionManager.cpp b/ApplicationLibCode/UserInterface/Riu3dSelectionManager.cpp index 55789e50d7..6f19f93986 100644 --- a/ApplicationLibCode/UserInterface/Riu3dSelectionManager.cpp +++ b/ApplicationLibCode/UserInterface/Riu3dSelectionManager.cpp @@ -283,6 +283,14 @@ RiuWellPathSelectionItem::RiuWellPathSelectionItem( const RivWellPathSourceInfo* m_wellpath = wellPathSourceInfo->wellPath(); } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +RiuWellPathSelectionItem* RiuWellPathSelectionItem::wellPathSelectionItem() +{ + return Riu3dSelectionManager::instance()->objectByType( Riu3dSelectionManager::RUI_TEMPORARY ); +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/ApplicationLibCode/UserInterface/Riu3dSelectionManager.h b/ApplicationLibCode/UserInterface/Riu3dSelectionManager.h index ab3a0b0768..96dfc44fc9 100644 --- a/ApplicationLibCode/UserInterface/Riu3dSelectionManager.h +++ b/ApplicationLibCode/UserInterface/Riu3dSelectionManager.h @@ -84,6 +84,12 @@ class Riu3dSelectionManager bool isEmpty( int role = RUI_APPLICATION_GLOBAL ) const; + template + T* objectByType( int role ) const + { + return dynamic_cast( selectedItem( role ) ); + } + private: Riu3dSelectionManager(); ~Riu3dSelectionManager(); @@ -243,6 +249,8 @@ class RiuWellPathSelectionItem : public RiuSelectionItem RiuSelectionType type() const override { return WELLPATH_SELECTION_OBJECT; } + static RiuWellPathSelectionItem* wellPathSelectionItem(); + public: RimWellPath* m_wellpath; cvf::Vec3d m_pipeCenterlineIntersectionInDomainCoords; diff --git a/ApplicationLibCode/UserInterface/RiuGeoMechXfTensorResultAccessor.cpp b/ApplicationLibCode/UserInterface/RiuGeoMechXfTensorResultAccessor.cpp index 8b5876a413..1cf7c0965b 100644 --- a/ApplicationLibCode/UserInterface/RiuGeoMechXfTensorResultAccessor.cpp +++ b/ApplicationLibCode/UserInterface/RiuGeoMechXfTensorResultAccessor.cpp @@ -18,7 +18,7 @@ #include "RiuGeoMechXfTensorResultAccessor.h" #include "RigFemPartResultsCollection.h" -#include "RivHexGridIntersectionTools.h" +#include "RivIntersectionVertexWeights.h" #include "cvfAssert.h" #include "cvfGeometryTools.h" diff --git a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp index e226cf3ce8..6fff52198d 100644 --- a/ApplicationLibCode/UserInterface/RiuMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuMainWindow.cpp @@ -23,6 +23,7 @@ #include "RiaBaseDefs.h" #include "RiaGuiApplication.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaRegressionTest.h" #include "RiaRegressionTestRunner.h" @@ -685,7 +686,7 @@ void RiuMainWindow::createToolBars() toolbar->addAction( polyMeasureAction ); } - if ( RiaPreferences::current()->showTestToolbar() ) + if ( RiaPreferencesSystem::current()->showTestToolbar() ) { QToolBar* toolbar = addToolBar( tr( "Test" ) ); toolbar->setObjectName( toolbar->windowTitle() ); @@ -717,7 +718,7 @@ void RiuMainWindow::createDockPanels() m_projectTreeView = new caf::PdmUiTreeView( this ); m_projectTreeView->enableSelectionManagerUpdating( true ); - m_projectTreeView->enableAppendOfClassNameToUiItemText( RiaPreferences::current()->appendClassNameToUiText() ); + m_projectTreeView->enableAppendOfClassNameToUiItemText( RiaPreferencesSystem::current()->appendClassNameToUiText() ); dockWidget->setWidget( m_projectTreeView ); diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp index 9c11683875..0aedbfb7b7 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.cpp @@ -50,7 +50,8 @@ void RiuPlotAnnotationTool::attachNamedRegions( QwtPlot* int shadingAlphaByte, bool showNames /*= true */, TrackSpan trackSpan /*= FULL_WIDTH*/, - const std::vector& brushStyles /* = {}*/ ) + const std::vector& brushStyles /* = {}*/, + int fontSize ) { if ( names.size() != yPositions.size() ) return; m_plot = plot; @@ -120,14 +121,26 @@ void RiuPlotAnnotationTool::attachNamedRegions( QwtPlot* textColor = lineColor; } Qt::Alignment horizontalAlignment = trackTextAlignment( trackSpan ); - RiuPlotAnnotationTool::horizontalDashedLine( line, name, yPositions[i].first, lineColor, textColor, horizontalAlignment ); + RiuPlotAnnotationTool::horizontalDashedLine( line, + name, + yPositions[i].first, + lineColor, + textColor, + horizontalAlignment, + fontSize ); line->attach( m_plot ); m_horizontalMarkers.push_back( std::move( line ) ); if ( ( i != names.size() - 1 ) && cvf::Math::abs( yPositions[i].second - yPositions[i + 1].first ) > delta ) { QwtPlotMarker* bottomLine( new QwtPlotMarker() ); - RiuPlotAnnotationTool::horizontalDashedLine( bottomLine, QString(), yPositions[i].second, lineColor, textColor ); + RiuPlotAnnotationTool::horizontalDashedLine( bottomLine, + QString(), + yPositions[i].second, + lineColor, + textColor, + Qt::AlignRight, + fontSize ); bottomLine->attach( m_plot ); m_horizontalMarkers.push_back( std::move( bottomLine ) ); @@ -283,7 +296,8 @@ void RiuPlotAnnotationTool::horizontalDashedLine( QwtPlotMarker* line, double yValue, const QColor& color /*= QColor(0, 0, 100) */, const QColor& textColor /*= QColor(0, 0, 100) */, - Qt::Alignment horizontalAlignment /*= Qt::AlignRight */ ) + Qt::Alignment horizontalAlignment /*= Qt::AlignRight */, + int fontSize ) { QPen curvePen; curvePen.setStyle( Qt::DashLine ); @@ -295,6 +309,7 @@ void RiuPlotAnnotationTool::horizontalDashedLine( QwtPlotMarker* line, line->setYValue( yValue ); QwtText label( name ); label.setColor( textColor ); + if ( fontSize > 0 ) label.setFont( QFont( label.font().key(), fontSize ) ); line->setLabel( label ); line->setLabelAlignment( horizontalAlignment | Qt::AlignBottom ); } diff --git a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h index 7f6bd47a81..c6477db97e 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h +++ b/ApplicationLibCode/UserInterface/RiuPlotAnnotationTool.h @@ -74,7 +74,8 @@ class RiuPlotAnnotationTool int shadingAlphaByte, bool showNames = true, TrackSpan trackSpan = TrackSpan::FULL_WIDTH, - const std::vector& brushStyles = {} ); + const std::vector& brushStyles = {}, + int fontSize = 0 ); void attachWellPicks( QwtPlot* plot, const std::vector& names, const std::vector& yPositions ); void attachAnnotationLine( QwtPlot* plot, @@ -112,7 +113,8 @@ class RiuPlotAnnotationTool double yValue, const QColor& color = QColor( 0, 0, 100 ), const QColor& textColor = QColor( 0, 0, 100 ), - Qt::Alignment horizontalAlignment = Qt::AlignRight ); + Qt::Alignment horizontalAlignment = Qt::AlignRight, + int fontSize = 0 ); void verticalLine( QwtPlotMarker* line, const QString& name, diff --git a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp index 5cac679f64..b489e32637 100644 --- a/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp +++ b/ApplicationLibCode/UserInterface/RiuPlotMainWindow.cpp @@ -22,6 +22,7 @@ #include "RiaBaseDefs.h" #include "RiaGuiApplication.h" #include "RiaPreferences.h" +#include "RiaPreferencesSystem.h" #include "RiaRegressionTestRunner.h" #include "RiaSummaryTools.h" @@ -278,6 +279,7 @@ void RiuPlotMainWindow::createMenus() importWellMenu->addAction( cmdFeatureMgr->action( "RicWellPathsImportSsihubFeature" ) ); importWellMenu->addAction( cmdFeatureMgr->action( "RicWellLogsImportFileFeature" ) ); importWellMenu->addAction( cmdFeatureMgr->action( "RicWellPathFormationsImportFileFeature" ) ); + importWellMenu->addAction( cmdFeatureMgr->action( "RicImportEnsembleWellLogsFeature" ) ); importMenu->addSeparator(); importMenu->addAction( cmdFeatureMgr->action( "RicImportObservedDataInMenuFeature" ) ); @@ -449,7 +451,7 @@ void RiuPlotMainWindow::createDockPanels() m_projectTreeView = new caf::PdmUiTreeView( this ); m_projectTreeView->enableSelectionManagerUpdating( true ); - m_projectTreeView->enableAppendOfClassNameToUiItemText( RiaPreferences::current()->appendClassNameToUiText() ); + m_projectTreeView->enableAppendOfClassNameToUiItemText( RiaPreferencesSystem::current()->appendClassNameToUiText() ); dockWidget->setWidget( m_projectTreeView ); diff --git a/ApplicationLibCode/UserInterface/RiuPvtPlotUpdater.cpp b/ApplicationLibCode/UserInterface/RiuPvtPlotUpdater.cpp index 1557b86399..d9e459e484 100644 --- a/ApplicationLibCode/UserInterface/RiuPvtPlotUpdater.cpp +++ b/ApplicationLibCode/UserInterface/RiuPvtPlotUpdater.cpp @@ -17,25 +17,18 @@ ///////////////////////////////////////////////////////////////////////////////// #include "RiuPvtPlotUpdater.h" -#include "Riu3dSelectionManager.h" -#include "RiuPvtPlotPanel.h" -#include "RiuRelativePermeabilityPlotUpdater.h" -#include "RigActiveCellInfo.h" -#include "RigCaseCellResultsData.h" #include "RigEclipseCaseData.h" -#include "RigGridBase.h" #include "RigResultAccessor.h" #include "RigResultAccessorFactory.h" -#include "Rim2dIntersectionView.h" #include "Rim3dView.h" -#include "RimEclipseCellColors.h" #include "RimEclipseResultCase.h" -#include "RimEclipseView.h" -#include "RimExtrudedCurveIntersection.h" +#include "RimEclipseResultDefinition.h" -//#include "cvfTrace.h" +#include "Riu3dSelectionManager.h" +#include "RiuPvtPlotPanel.h" +#include "RiuRelativePermeabilityPlotUpdater.h" #include diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp index 683caf4597..f9c0590276 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.cpp @@ -25,7 +25,7 @@ //-------------------------------------------------------------------------------------------------- RiuSummaryQuantityNameInfoProvider* RiuSummaryQuantityNameInfoProvider::instance() { - static RiuSummaryQuantityNameInfoProvider* singleton = new RiuSummaryQuantityNameInfoProvider; + static auto* singleton = new RiuSummaryQuantityNameInfoProvider; return singleton; } @@ -52,7 +52,8 @@ RiuSummaryQuantityNameInfoProvider::RiuSummaryQuantityInfo { return it->second; } - else if ( quantity.size() > 1 && quantity[1] == 'U' ) + + if ( quantity.size() > 1 && quantity[1] == 'U' ) { // User defined vector name // The summary type is given by the first letter, and U defines user-defined @@ -62,7 +63,7 @@ RiuSummaryQuantityNameInfoProvider::RiuSummaryQuantityInfo return RiuSummaryQuantityInfo(); } - else if ( quantity.size() > 5 ) + if ( quantity.size() > 5 ) { // Check for custom vector naming @@ -112,12 +113,12 @@ RiuSummaryQuantityNameInfoProvider::RiuSummaryQuantityNameInfoProvider() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::map +std::unordered_map RiuSummaryQuantityNameInfoProvider::createInfoForEclipseKeywords() { using A = RifEclipseSummaryAddress; - std::map info; + std::unordered_map info; info.insert( { "FOPR", { A::SUMMARY_FIELD, "Oil Production Rate" } } ); info.insert( { "FOPRA", { A::SUMMARY_FIELD, "Oil Production Rate above GOC" } } ); @@ -2149,18 +2150,18 @@ std::map +std::unordered_map RiuSummaryQuantityNameInfoProvider::createInfoFor6xKeywords() { using A = RifEclipseSummaryAddress; - std::map info; + std::unordered_map info; int nporo = 6; for ( int iporo = 0; iporo < nporo; ++iporo ) { - std::string suffix( "" ); - std::string descadd( "" ); + std::string suffix; + std::string descadd; if ( iporo == 1 ) { suffix = "F"; diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.h b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.h index 1b143b2a8a..bec9031bf0 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.h +++ b/ApplicationLibCode/UserInterface/RiuSummaryQuantityNameInfoProvider.h @@ -20,8 +20,8 @@ #include "RifEclipseSummaryAddress.h" -#include #include +#include //-------------------------------------------------------------------------------------------------- /// @@ -57,9 +57,9 @@ class RiuSummaryQuantityNameInfoProvider RiuSummaryQuantityInfo quantityInfo( const std::string& quantity ) const; - static std::map createInfoForEclipseKeywords(); - static std::map createInfoFor6xKeywords(); + static std::unordered_map createInfoForEclipseKeywords(); + static std::unordered_map createInfoFor6xKeywords(); private: - std::map m_summaryToDescMap; + std::unordered_map m_summaryToDescMap; }; diff --git a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp index 1736a39996..2036c1f7ac 100644 --- a/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp +++ b/ApplicationLibCode/UserInterface/RiuSummaryQwtPlot.cpp @@ -318,12 +318,12 @@ void RiuSummaryQwtPlot::contextMenuEvent( QContextMenuEvent* event ) { menuBuilder.subMenuStart( "Cross Plots", *caf::IconProvider( ":/CorrelationCrossPlot16x16.png" ).icon() ); - std::vector> ensembleParameters = + std::vector> ensembleParameters = ensemble->parameterCorrelations( clickedEnsembleCurveSet->summaryAddress(), timeStep ); std::sort( ensembleParameters.begin(), ensembleParameters.end(), - []( const std::pair& lhs, - const std::pair& rhs ) { + []( const std::pair& lhs, + const std::pair& rhs ) { return std::fabs( lhs.second ) > std::fabs( rhs.second ); } ); diff --git a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp index 8ae429129a..b6634ca133 100644 --- a/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp +++ b/ApplicationLibCode/UserInterface/RiuViewerCommands.cpp @@ -67,6 +67,7 @@ #include "RimSurfaceInView.h" #include "RimTextAnnotation.h" #include "RimViewController.h" +#include "RimWellIASettingsCollection.h" #include "RimWellPath.h" #include "Riu3dSelectionManager.h" @@ -429,15 +430,14 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) RimEclipseView* eclipseView = dynamic_cast( mainOrComparisonView ); if ( eclipseView ) { - // Hide faults command + // fault commands const RigFault* fault = eclipseView->mainGrid()->findFaultFromCellIndexAndCellFace( m_currentCellIndex, m_currentFaceIndex ); if ( fault ) { menuBuilder.addSeparator(); - QString faultName = fault->name(); - + QString faultName = fault->name(); QVariantList hideFaultList; qulonglong currentCellIndex = m_currentCellIndex; hideFaultList.push_back( currentCellIndex ); @@ -446,6 +446,22 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder.addCmdFeatureWithUserData( "RicEclipseHideFaultFeature", QString( "Hide " ) + faultName, hideFaultList ); + + if ( eclipseView->faultCollection() && eclipseView->faultCollection()->faultRAEnabled() ) + { + menuBuilder.subMenuStart( "Reactivation Assessment" ); + menuBuilder.addCmdFeatureWithUserData( "RicRunBasicFaultReactAssessment3dFeature", + "Run Basic Processing", + QVariant( fault->name() ) ); + if ( eclipseView->faultCollection()->faultRAAdvancedEnabled() ) + { + menuBuilder.addCmdFeatureWithUserData( "RicRunAdvFaultReactAssessment3dFeature", + "Run Advanced Processing", + QVariant( fault->name() ) ); + } + menuBuilder.subMenuEnd(); + menuBuilder.addSeparator(); + } } } @@ -523,6 +539,13 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder.subMenuEnd(); menuBuilder.addSeparator(); + + if ( wellPath->wellIASettingsCollection()->isEnabled() ) + { + menuBuilder << "RicNewWellIntegrityAnalysisFeature"; + menuBuilder.addSeparator(); + } + menuBuilder.subMenuStart( "Create Completions", QIcon( ":/FishBoneGroup16x16.png" ) ); menuBuilder << "RicNewPerforationIntervalAtMeasuredDepthFeature"; @@ -538,6 +561,7 @@ void RiuViewerCommands::displayContextMenu( QMouseEvent* event ) menuBuilder.addSeparator(); menuBuilder << "RicNewWellPathLateralAtDepthFeature"; menuBuilder << "RicNewWellPathIntersectionFeature"; + menuBuilder << "RicLinkWellPathFeature"; } const RivSimWellPipeSourceInfo* eclipseWellSourceInfo = @@ -1053,6 +1077,7 @@ void RiuViewerCommands::findCellAndGridIndex( Rim3dView* m { CVF_ASSERT( cellIndex && gridIndex ); RimEclipseCase* eclipseCase = nullptr; + RimGeoMechCase* geomechCase = dynamic_cast( mainOrComparisonView->ownerCase() ); if ( sepInterResDef ) { @@ -1072,6 +1097,13 @@ void RiuViewerCommands::findCellAndGridIndex( Rim3dView* m *cellIndex = cell.gridLocalCellIndex(); *gridIndex = cell.hostGrid()->gridIndex(); } + else if ( geomechCase ) + { + RigFemPartCollection* parts = geomechCase->geoMechData()->femParts(); + auto [partId, elementIdx] = parts->partIdAndElementIndex( globalCellIndex ); + *cellIndex = elementIdx; + *gridIndex = (size_t)partId; + } else { *cellIndex = globalCellIndex; diff --git a/CMakeLists.txt b/CMakeLists.txt index 8dc65dfe10..475c1a9071 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,8 @@ if(UNIX) option( RESINSIGHT_PREFER_LEGACY_OPENGL "Link with Legacy OpenGL libraries. This may be necessary in some virtualization environments" - ON) + ON + ) if(RESINSIGHT_PREFER_LEGACY_OPENGL) set(OpenGL_GL_PREFERENCE LEGACY) endif() @@ -24,14 +25,16 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON) set(BUILD_SHARED_LIBS OFF - CACHE BOOL "ERT: Build shared libraries") + CACHE BOOL "ERT: Build shared libraries" +) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") option(RESINSIGHT_BUNDLE_TESTMODELS "Copy TestModels into the installation" OFF) option(VCPKG_AUTO_INSTALL - "Automatically download build pre-requisites with VCPKG" OFF) + "Automatically download build pre-requisites with VCPKG" OFF +) if(VCPKG_AUTO_INSTALL) include(AutoVcpkg) set(AUTO_VCPKG_ROOT "${CMAKE_SOURCE_DIR}/ThirdParty/vcpkg") @@ -73,7 +76,8 @@ if(RESINSIGHT_USE_OPENMP) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -DUSE_OPENMP") set(CMAKE_EXE_LINKER_FLAGS - "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}") + "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}" + ) else() message(STATUS "Disabling OpenMP support") endif() @@ -112,9 +116,11 @@ if(RESINSIGHT_ENABLE_GRPC) option( RESINSIGHT_GRPC_DOWNLOAD_PYTHON_MODULE "Download the gRPC python modules to enable generation of Python interface" - ON) + ON + ) option(RESINSIGHT_GRPC_BUNDLE_PYTHON_MODULE - "Bundle the gRPC python modules into the install folder" OFF) + "Bundle the gRPC python modules into the install folder" OFF + ) add_definitions(-DENABLE_GRPC) endif() @@ -124,7 +130,8 @@ endif() # CMAKE_UNITY_BUILD was introduced in CMake 3.16.2 option(RESINSIGHT_ENABLE_UNITY_BUILD - "Experimental speedup of compilation using CMake Unity Build" OFF) + "Experimental speedup of compilation using CMake Unity Build" OFF +) mark_as_advanced(FORCE RESINSIGHT_ENABLE_UNITY_BUILD) if(RESINSIGHT_ENABLE_UNITY_BUILD) set(CAF_ENABLE_UNITY_BUILD true) @@ -145,15 +152,18 @@ if(NOT MSVC) # libraries and includes set(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT "" - CACHE PATH "Path to installed ERT libraries") + CACHE PATH "Path to installed ERT libraries" + ) set(RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT "" - CACHE PATH "Path to installed ERT includes") + CACHE PATH "Path to installed ERT includes" + ) endif() if(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT OR RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT) if(NOT (RESINSIGHT_ERT_EXTERNAL_LIB_ROOT - AND RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT)) + AND RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT) + ) message( FATAL_ERROR "Both RESINSIGHT_ERT_EXTERNAL_LIB_ROOT and RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT must be defined" @@ -162,7 +172,8 @@ if(RESINSIGHT_ERT_EXTERNAL_LIB_ROOT OR RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT) message( FATAL_ERROR - "TODO: Building using and external system installed ERT is broken.") + "TODO: Building using and external system installed ERT is broken." + ) list(APPEND ERT_INCLUDE_DIRS ${RESINSIGHT_ERT_EXTERNAL_INCLUDE_ROOT}) @@ -174,10 +185,12 @@ else() # directly set(INSTALL_ERT OFF - CACHE BOOL "ERT: Install library") + CACHE BOOL "ERT: Install library" + ) set(ERT_USE_OPENMP ${OPENMP_FOUND} - CACHE BOOL "ERT: Compile using OpenMP") + CACHE BOOL "ERT: Compile using OpenMP" + ) # Remember original state set(ORIGINAL_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS}) @@ -189,7 +202,8 @@ else() else() set(RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT "" - CACHE STRING "Path to ERT CMakeList.txt (source path)") + CACHE STRING "Path to ERT CMakeList.txt (source path)" + ) # Force dynamic linking on other platforms Copy of libraries into install # folder of ResInsight is done a bit further down in this file @@ -197,8 +211,9 @@ else() endif() if(RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT) - add_subdirectory(${RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT} - ${CMAKE_BINARY_DIR}/ThirdParty/Ert) + add_subdirectory( + ${RESINSIGHT_ERT_EXTERNAL_SOURCE_ROOT} ${CMAKE_BINARY_DIR}/ThirdParty/Ert + ) else() add_subdirectory(ThirdParty/Ert) endif() @@ -215,7 +230,8 @@ else() set_target_properties( ecl PROPERTIES COMPILE_FLAGS - "-Wno-deprecated -Wno-deprecated-declarations -Wno-clobbered") + "-Wno-deprecated -Wno-deprecated-declarations -Wno-clobbered" + ) endif() list(APPEND THIRD_PARTY_LIBRARIES ecl) @@ -252,7 +268,8 @@ if(GIT_FOUND AND EXISTS "${PROJECT_SOURCE_DIR}/.git") COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive -- ${SUBDIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - RESULT_VARIABLE GIT_SUBMOD_RESULT) + RESULT_VARIABLE GIT_SUBMOD_RESULT + ) if(NOT GIT_SUBMOD_RESULT EQUAL "0") message( FATAL_ERROR @@ -283,7 +300,8 @@ if(buildcache_program) if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/Zi") message(STATUS "Clearing pdb setting") string(REGEX REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG - "${CMAKE_CXX_FLAGS_DEBUG}") + "${CMAKE_CXX_FLAGS_DEBUG}" + ) endif() set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /Z7") @@ -298,13 +316,15 @@ endif() if(MSVC) set(RESINSIGHT_HDF5_DIR "" - CACHE PATH "Windows Only: Optional path to HDF5 libraries on Windows") + CACHE PATH "Windows Only: Optional path to HDF5 libraries on Windows" + ) endif() if(MSVC) if(NOT ${RESINSIGHT_HDF5_DIR} EQUAL "") list(APPEND EXTERNAL_LINK_LIBRARIES ${RESINSIGHT_HDF5_DIR}/lib/hdf5.lib - ${RESINSIGHT_HDF5_DIR}/lib/hdf5_cpp.lib) + ${RESINSIGHT_HDF5_DIR}/lib/hdf5_cpp.lib + ) set(RESINSIGHT_FOUND_HDF5 1) message(STATUS "Using HDF5 from : ${RESINSIGHT_HDF5_DIR}") @@ -340,6 +360,7 @@ endif() # MSVC if(VCPKG_AUTO_INSTALL) vcpkg_install(boost-filesystem) vcpkg_install(boost-spirit) + include(${CMAKE_TOOLCHAIN_FILE}) endif() add_subdirectory(ThirdParty/custom-opm-flowdiagnostics) @@ -348,7 +369,8 @@ add_subdirectory(ThirdParty/custom-opm-common) add_subdirectory(ThirdParty/custom-opm-common/custom-opm-parser-tests) list(APPEND OPM_LIBRARIES custom-opm-flowdiagnostics custom-opm-flowdiag-app - custom-opm-common) + custom-opm-common +) set_property(TARGET ${OPM_LIBRARIES} PROPERTY FOLDER "Thirdparty/OPM") @@ -372,7 +394,8 @@ find_package( Script ScriptTools Widgets - OPTIONAL_COMPONENTS Charts) + OPTIONAL_COMPONENTS Charts +) if(Qt5Charts_FOUND) message(STATUS "QtCharts found: ${Qt5Charts_LIBRARIES}") add_definitions(-DUSE_QTCHARTS) @@ -445,7 +468,8 @@ if(CMAKE_COMPILER_IS_GNUCC) __sync_fetch_and_add(&a, 1); __sync_sub_and_fetch(&a, 1); __sync_fetch_and_sub(&a, 1); }" - HAVE_GCC_SYNC_FUNCTIONS) + HAVE_GCC_SYNC_FUNCTIONS + ) endif() if(HAVE_GCC_SYNC_FUNCTIONS) @@ -473,7 +497,8 @@ list( LibViewing LibRender LibGeometry - LibCore) + LibCore +) set_property(TARGET ${VIZ_FWK_LIBRARIES} PROPERTY FOLDER "VizFwk") @@ -519,7 +544,8 @@ list( cafTensor CommonCode cafVizExtensions - cafPdmScripting) + cafPdmScripting +) set_property(TARGET ${APP_FWK_LIBRARIES} PROPERTY FOLDER "AppFwk") @@ -529,11 +555,13 @@ mark_as_advanced(FORCE RESINSIGHT_INCLUDE_APPFWK_TESTS) if(RESINSIGHT_INCLUDE_APPFWK_TESTS) # Unit Tests add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests) - set_property(TARGET cafProjectDataModel_UnitTests PROPERTY FOLDER - "AppFwkTests") + set_property( + TARGET cafProjectDataModel_UnitTests PROPERTY FOLDER "AppFwkTests" + ) add_subdirectory( - Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests) + Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests + ) set_property(TARGET cafPdmCore_UnitTests PROPERTY FOLDER "AppFwkTests") add_subdirectory(Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests) @@ -559,7 +587,8 @@ set(RESINSIGHT_INSTALL_FOLDER ".") # override system install prefix if private installation chosen option(RESINSIGHT_PRIVATE_INSTALL "Linux only: Install the libecl shared libraries along the executable" - ON) + ON +) mark_as_advanced(FORCE RESINSIGHT_PRIVATE_INSTALL) if(RESINSIGHT_PRIVATE_INSTALL) @@ -576,7 +605,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) ${CMAKE_BINARY_DIR}/ThirdParty/Ert/${CMAKE_INSTALL_LIBDIR}/libecl.so.2.4 ) install(FILES ${ERT_SHARED_LIB_FILES} - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() if(APPLE) @@ -587,7 +617,8 @@ if(RESINSIGHT_PRIVATE_INSTALL) ) install( FILES ${ERT_SHARED_LIB_FILES} - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/ResInsight.app/Contents/MacOS) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER}/ResInsight.app/Contents/MacOS + ) endif() endif(RESINSIGHT_PRIVATE_INSTALL) @@ -601,7 +632,8 @@ if(RESINSIGHT_HDF5_BUNDLE_LIBRARIES) if(${POS_IN_STRING} GREATER -1) file(GLOB FILE_AND_SYMLINKS ${FILE_TO_COPY}*) install(FILES ${FILE_AND_SYMLINKS} - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() endforeach() endif() @@ -609,7 +641,8 @@ endif(RESINSIGHT_HDF5_BUNDLE_LIBRARIES) if(RESINSIGHT_BUNDLE_TESTMODELS) install(DIRECTORY ${CMAKE_SOURCE_DIR}/TestModels - DESTINATION ${RESINSIGHT_INSTALL_FOLDER}) + DESTINATION ${RESINSIGHT_INSTALL_FOLDER} + ) endif() # ############################################################################## @@ -627,14 +660,16 @@ if(OCTAVE_MKOCTFILE) add_subdirectory(OctavePlugin) else(OCTAVE_MKOCTFILE) message( - STATUS "Could not find OCTAVE_MKOCTFILE, skipping OctavePlugin library") + STATUS "Could not find OCTAVE_MKOCTFILE, skipping OctavePlugin library" + ) endif(OCTAVE_MKOCTFILE) # ############################################################################## # Code documentation using Doxygen # ############################################################################## option(RESINSIGHT_BUILD_DOCUMENTATION - "Use Doxygen to create the HTML based API documentation" OFF) + "Use Doxygen to create the HTML based API documentation" OFF +) if(RESINSIGHT_BUILD_DOCUMENTATION) find_package(Doxygen) if(NOT DOXYGEN_FOUND) @@ -649,7 +684,8 @@ if(RESINSIGHT_BUILD_DOCUMENTATION) add_custom_target( Docs COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_BINARY_DIR}/Doxyfile - SOURCES ${PROJECT_BINARY_DIR}/Doxyfile) + SOURCES ${PROJECT_BINARY_DIR}/Doxyfile + ) # IF you do NOT want the documentation to be generated EVERY time you build # the project then leave out the 'ALL' keyword from the above command. endif(RESINSIGHT_BUILD_DOCUMENTATION) diff --git a/Fwk/AppFwk/CMakeLists.txt b/Fwk/AppFwk/CMakeLists.txt index 5d34e9995e..f5bb62baf2 100644 --- a/Fwk/AppFwk/CMakeLists.txt +++ b/Fwk/AppFwk/CMakeLists.txt @@ -20,13 +20,15 @@ if(CEE_USE_QT5) find_package( Qt5 COMPONENTS - REQUIRED Core Gui OpenGL Widgets) + REQUIRED Core Gui OpenGL Widgets + ) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::OpenGL Qt5::Widgets) else() find_package( Qt4 COMPONENTS QtCore QtGui QtMain QtOpenGl - REQUIRED) + REQUIRED + ) include(${QT_USE_FILE}) endif(CEE_USE_QT5) @@ -70,5 +72,7 @@ add_subdirectory(cafPdmScripting/cafPdmScripting_UnitTests) # folders set_property(GLOBAL PROPERTY USE_FOLDERS ON) -set_property(TARGET cafPdmCore cafPdmCore_UnitTests cafPdmXml - cafPdmXml_UnitTests cafPdmUiCore PROPERTY FOLDER "PdmCore") +set_property( + TARGET cafPdmCore cafPdmCore_UnitTests cafPdmXml cafPdmXml_UnitTests + cafPdmUiCore PROPERTY FOLDER "PdmCore" +) diff --git a/Fwk/AppFwk/CommonCode/CMakeLists.txt b/Fwk/AppFwk/CommonCode/CMakeLists.txt index 44d6642db6..265d2f508f 100644 --- a/Fwk/AppFwk/CommonCode/CMakeLists.txt +++ b/Fwk/AppFwk/CommonCode/CMakeLists.txt @@ -19,7 +19,8 @@ set(MOC_HEADER_FILES cafMessagePanel.h) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets OpenGL) + REQUIRED Core Gui Widgets OpenGL +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -50,7 +51,8 @@ add_library( cvfStructGridScalarDataAccess.h cafVecIjk.cpp cafVecIjk.h - ${MOC_SOURCE_FILES}) + ${MOC_SOURCE_FILES} +) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -62,11 +64,13 @@ target_link_libraries( LibRender LibGuiQt cafPdmCore - ${QT_LIBRARIES}) + ${QT_LIBRARIES} +) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp index 2ebdea4b78..08d947dbb6 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp +++ b/Fwk/AppFwk/CommonCode/cvfStructGrid.cpp @@ -153,6 +153,48 @@ void StructGridInterface::cellFaceVertexIndices( FaceType face, cvf::ubyte verte } } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +std::pair StructGridInterface::edgeVertexIndices( FaceType face1, FaceType face2 ) +{ + // Return the two shared vertex indices between two faces + // The ordering is identical to the ordering in StructGridInterface::cellFaceVertexIndices + + // Ensure face1 has the largest enum value + if ( face2 > face1 ) std::swap( face1, face2 ); + + if ( face1 == NEG_K ) + { + if ( face2 == NEG_I ) return { 0, 3 }; + if ( face2 == POS_I ) return { 2, 1 }; + if ( face2 == NEG_J ) return { 1, 0 }; + if ( face2 == POS_J ) return { 3, 2 }; + } + + if ( face1 == POS_K ) + { + if ( face2 == NEG_I ) return { 7, 4 }; + if ( face2 == POS_I ) return { 5, 6 }; + if ( face2 == NEG_J ) return { 4, 5 }; + if ( face2 == POS_J ) return { 6, 7 }; + } + + if ( face1 == NEG_J ) + { + if ( face2 == NEG_I ) return { 4, 0 }; + if ( face2 == POS_I ) return { 1, 5 }; + } + + if ( face1 == POS_J ) + { + if ( face2 == NEG_I ) return { 3, 7 }; + if ( face2 == POS_I ) return { 6, 2 }; + } + + return {}; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/CommonCode/cvfStructGrid.h b/Fwk/AppFwk/CommonCode/cvfStructGrid.h index f662b35b33..afd21a189b 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGrid.h +++ b/Fwk/AppFwk/CommonCode/cvfStructGrid.h @@ -120,6 +120,9 @@ class StructGridInterface : public Object static GridAxisType gridAxisFromFace( FaceType face ); + static std::pair edgeVertexIndices( cvf::StructGridInterface::FaceType face1, + cvf::StructGridInterface::FaceType face2 ); + private: mutable double m_characteristicCellSizeI; mutable double m_characteristicCellSizeJ; diff --git a/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.cpp b/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.cpp index 1aa7c68ef4..062de40632 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.cpp +++ b/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.cpp @@ -324,12 +324,12 @@ ref StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( cons CVF_ASSERT( numVertices % 4 == 0 ); ref indices = new UIntArray; - indices->resize( numQuads * 8 ); + indices->resize( (size_t)numQuads * 8 ); #pragma omp parallel for for ( int i = 0; i < numQuads; i++ ) { - int idx = 8 * i; + size_t idx = (size_t)i * 8; indices->set( idx + 0, i * 4 + 0 ); indices->set( idx + 1, i * 4 + 1 ); indices->set( idx + 2, i * 4 + 1 ); diff --git a/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.h b/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.h index 6dcb3e22c6..b5cb0ccc78 100644 --- a/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.h +++ b/Fwk/AppFwk/CommonCode/cvfStructGridGeometryGenerator.h @@ -200,10 +200,10 @@ class StructGridGeometryGenerator : public Object static ref createMeshDrawableFromSingleCell( const StructGridInterface* grid, size_t cellIndex, const cvf::Vec3d& displayModelOffset ); + static ref lineIndicesFromQuadVertexArray( const Vec3fArray* vertexArray ); private: - static ref lineIndicesFromQuadVertexArray( const Vec3fArray* vertexArray ); - bool isCellFaceVisible( size_t i, size_t j, size_t k, StructGridInterface::FaceType face ) const; + bool isCellFaceVisible( size_t i, size_t j, size_t k, StructGridInterface::FaceType face ) const; void computeArrays(); diff --git a/Fwk/AppFwk/cafAnimControl/CMakeLists.txt b/Fwk/AppFwk/cafAnimControl/CMakeLists.txt index c40f7d2674..a312c2a722 100644 --- a/Fwk/AppFwk/cafAnimControl/CMakeLists.txt +++ b/Fwk/AppFwk/cafAnimControl/CMakeLists.txt @@ -10,12 +10,14 @@ endif() # Qt set(MOC_HEADER_FILES cafFrameAnimationControl.h cafAnimationToolBar.h - cafPopupMenuButton.h) + cafPopupMenuButton.h +) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -28,12 +30,14 @@ qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) set(QRC_FILES ${QRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/Resources/cafAnimControl.qrc - PARENT_SCOPE) + PARENT_SCOPE +) set(PROJECT_FILES cafFrameAnimationControl.h cafFrameAnimationControl.cpp cafAnimationToolBar.h cafAnimationToolBar.cpp cafPopupMenuButton.h - cafPopupMenuButton.cpp) + cafPopupMenuButton.cpp +) add_library(${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES}) diff --git a/Fwk/AppFwk/cafCommand/CMakeLists.txt b/Fwk/AppFwk/cafCommand/CMakeLists.txt index 585383a037..5c881804b4 100644 --- a/Fwk/AppFwk/cafCommand/CMakeLists.txt +++ b/Fwk/AppFwk/cafCommand/CMakeLists.txt @@ -15,7 +15,8 @@ set(MOC_HEADER_FILES cafCmdFeature.h cafCmdFeatureManager.h) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -36,7 +37,8 @@ set(PROJECT_FILES cafCmdFeatureManager.cpp cafCmdFeatureManager.h cafCmdFeatureMenuBuilder.cpp - cafCmdFeatureMenuBuilder.h) + cafCmdFeatureMenuBuilder.h +) add_library(${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES}) @@ -45,8 +47,9 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${PROJECT_NAME} cafProjectDataModel ${QT_LIBRARIES}) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafCommandFeatures/CMakeLists.txt b/Fwk/AppFwk/cafCommandFeatures/CMakeLists.txt index 6ee3f46924..824774da4e 100644 --- a/Fwk/AppFwk/cafCommandFeatures/CMakeLists.txt +++ b/Fwk/AppFwk/cafCommandFeatures/CMakeLists.txt @@ -15,7 +15,8 @@ set(MOC_HEADER_FILES) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -42,7 +43,8 @@ set(PROJECT_FILES ToggleCommands/cafToggleItemsOnFeature.cpp ToggleCommands/cafToggleItemsOnFeature.h ToggleCommands/cafToggleItemsOnOthersOffFeature.cpp - ToggleCommands/cafToggleItemsOnOthersOffFeature.h) + ToggleCommands/cafToggleItemsOnOthersOffFeature.h +) # NOTE! Resources in this subfolder appends to the variable QRC_FILES in parent # scope CMakeList.txt in the application folder (parent scope) must use the @@ -53,7 +55,8 @@ set(PROJECT_FILES set(QRC_FILES ${QRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/Resources/cafCommandFeatures.qrc - PARENT_SCOPE) + PARENT_SCOPE +) # NOTE! Adding the library as a cmake "OBJECT" library to make sure the linker # is not pruning the seemingly unused features, and to make sure that the static @@ -88,8 +91,9 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY POSITION_INDEPENDENT_CODE ON) # ${PROJECT_NAME} cafCommand cafUserInterface ${QT_LIBRARIES} ) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafHexInterpolator/cafHexInterpolator_UnitTest/CMakeLists.txt b/Fwk/AppFwk/cafHexInterpolator/cafHexInterpolator_UnitTest/CMakeLists.txt index 964f60567a..ecba3ce456 100644 --- a/Fwk/AppFwk/cafHexInterpolator/cafHexInterpolator_UnitTest/CMakeLists.txt +++ b/Fwk/AppFwk/cafHexInterpolator/cafHexInterpolator_UnitTest/CMakeLists.txt @@ -19,7 +19,8 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} # required for gtest-all.cpp ) set(PROJECT_FILES cafHexInterpolatorBasicTest.cpp - cafHexInterpolator_UnitTests_main.cpp) + cafHexInterpolator_UnitTests_main.cpp +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES} gtest/gtest-all.cpp) diff --git a/Fwk/AppFwk/cafPdmCvf/CMakeLists.txt b/Fwk/AppFwk/cafPdmCvf/CMakeLists.txt index 54eb75a7f2..8b6ba0d3c3 100644 --- a/Fwk/AppFwk/cafPdmCvf/CMakeLists.txt +++ b/Fwk/AppFwk/cafPdmCvf/CMakeLists.txt @@ -12,7 +12,8 @@ endif() find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -44,11 +45,13 @@ add_library( cafPdmMat3d/cafPdmXmlMat3d.h cafPdmMat3d/cafPdmFieldCvfMat3d.h ${MOC_HEADER_FILES} - ${MOC_SOURCE_FILES}) + ${MOC_SOURCE_FILES} +) target_include_directories( ${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_SOURCE_DIR}/cafPdmMat3d) + ${CMAKE_CURRENT_SOURCE_DIR}/cafPdmMat3d +) target_link_libraries(${PROJECT_NAME} cafUserInterface LibCore ${QT_LIBRARIES}) diff --git a/Fwk/AppFwk/cafPdmCvf/cafPdmCvf_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafPdmCvf/cafPdmCvf_UnitTests/CMakeLists.txt index ca3f96c242..5de8dc5906 100644 --- a/Fwk/AppFwk/cafPdmCvf/cafPdmCvf_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafPdmCvf/cafPdmCvf_UnitTests/CMakeLists.txt @@ -7,7 +7,8 @@ else() find_package( Qt4 COMPONENTS QtCore - REQUIRED) + REQUIRED + ) include(${QT_USE_FILE}) endif(Qt5Core_FOUND) @@ -15,11 +16,13 @@ project(cafPdmCvf_UnitTests) include_directories( ${CMAKE_CURRENT_SOURCE_DIR} ${cafPdmCore_SOURCE_DIR} ${cafPdmXml_SOURCE_DIR} - ${cafPdmCvf_SOURCE_DIR} ${LibCore_SOURCE_DIR}) + ${cafPdmCvf_SOURCE_DIR} ${LibCore_SOURCE_DIR} +) set(PROJECT_FILES cafPdmCvf_UnitTests.cpp gtest/gtest-all.cpp cafPdmCoreVec3dTest.cpp - cafPdmCoreColor3fTest.cpp cafPdmCoreMat4dTest.cpp) + cafPdmCoreColor3fTest.cpp cafPdmCoreMat4dTest.cpp +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES}) @@ -30,8 +33,9 @@ endif() source_group("" FILES ${PROJECT_FILES}) -target_link_libraries(${PROJECT_NAME} cafPdmCore cafPdmXml LibCore cafPdmCvf - ${QT_LIBRARIES}) +target_link_libraries( + ${PROJECT_NAME} cafPdmCore cafPdmXml LibCore cafPdmCvf ${QT_LIBRARIES} +) # Copy Qt Dlls if(Qt5Core_FOUND) @@ -40,7 +44,8 @@ if(Qt5Core_FOUND) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) # Copy Qt Dlls else() @@ -52,12 +57,14 @@ else() # Debug execute_process( COMMAND cmake -E copy_if_different ${QT_BINARY_DIR}/${qtlib}d4.dll - ${CMAKE_BINARY_DIR}/Debug/${qtlib}d4.dll) + ${CMAKE_BINARY_DIR}/Debug/${qtlib}d4.dll + ) # Release execute_process( COMMAND cmake -E copy_if_different ${QT_BINARY_DIR}/${qtlib}4.dll - ${CMAKE_BINARY_DIR}/Release/${qtlib}4.dll) + ${CMAKE_BINARY_DIR}/Release/${qtlib}4.dll + ) endforeach(qtlib) endif(MSVC) endif(Qt5Core_FOUND) diff --git a/Fwk/AppFwk/cafPdmScripting/CMakeLists.txt b/Fwk/AppFwk/cafPdmScripting/CMakeLists.txt index 392acc23fa..1b546e73c8 100644 --- a/Fwk/AppFwk/cafPdmScripting/CMakeLists.txt +++ b/Fwk/AppFwk/cafPdmScripting/CMakeLists.txt @@ -31,7 +31,8 @@ set(PROJECT_FILES cafPdmMarkdownGenerator.h cafPdmMarkdownGenerator.cpp cafPdmMarkdownBuilder.h - cafPdmMarkdownBuilder.cpp) + cafPdmMarkdownBuilder.cpp +) set(CAF_LIBS cafProjectDataModel) @@ -42,7 +43,8 @@ if(CAF_CVF_SCRIPTING) cafPdmFieldScriptingCapabilityCvfColor3.h cafPdmFieldScriptingCapabilityCvfColor3.cpp cafPdmFieldScriptingCapabilityCvfVec3d.h - cafPdmFieldScriptingCapabilityCvfVec3d.cpp) + cafPdmFieldScriptingCapabilityCvfVec3d.cpp + ) list(APPEND CAF_LIBS cafPdmCvf) endif() diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.cpp b/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.cpp index 9d3a61c354..72a2e1190b 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.cpp +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.cpp @@ -38,6 +38,8 @@ #include "cafPdmFieldHandle.h" #include "cafPdmPythonGenerator.h" +#include + using namespace caf; //-------------------------------------------------------------------------------------------------- @@ -96,3 +98,11 @@ QString PdmAbstractFieldScriptingCapability::helpString( const QString& existing if ( !existingTooltip.isEmpty() ) return existingTooltip + "\n\n" + helpString; return helpString; } + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QStringList PdmAbstractFieldScriptingCapability::enumScriptTexts() const +{ + return QStringList(); +} diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.h b/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.h index 0207c460cd..1c0d412025 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.h +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmAbstractFieldScriptingCapability.h @@ -39,6 +39,7 @@ #include class QTextStream; +class QStringList; namespace caf { @@ -68,6 +69,8 @@ class PdmAbstractFieldScriptingCapability : public PdmFieldCapability static QString helpString( const QString& existingTooltip, const QString& keyword ); + virtual QStringList enumScriptTexts() const; + protected: PdmFieldHandle* m_owner; QString m_scriptFieldName; diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapability.h b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapability.h index ade1911a70..b26a197be2 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapability.h +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmFieldScriptingCapability.h @@ -39,6 +39,7 @@ #include "cafPdmAbstractFieldScriptingCapability.h" #include "cafPdmChildArrayField.h" #include "cafPdmChildField.h" +#include "cafPdmField.h" #include "cafPdmPtrArrayField.h" #include "cafPdmPtrField.h" #include "cafPdmScriptIOMessages.h" @@ -185,9 +186,8 @@ struct PdmFieldScriptingCapabilityIOHandler> { // Unexpected enum value // Error message - errorMessageContainer->addError( "Argument must be valid enum value. " + - errorMessageContainer->currentArgument + "\" argument of the command: \"" + - errorMessageContainer->currentCommand + "\"" ); + errorMessageContainer->addError( "Failed to set enum text value \"" + accumulatedFieldValue + + "\" for the command: \"" + errorMessageContainer->currentCommand + "\"" ); } } @@ -631,6 +631,59 @@ class PdmFieldScriptingCapability> : public PdmAbs PdmChildArrayField* m_field; }; +template +class PdmFieldScriptingCapability>> : public PdmAbstractFieldScriptingCapability +{ +public: + PdmFieldScriptingCapability( PdmField>* field, const QString& fieldName, bool giveOwnership ) + : PdmAbstractFieldScriptingCapability( field, fieldName, giveOwnership ) + { + m_field = field; + } + + void writeToField( QTextStream& inputStream, + PdmObjectFactory* objectFactory, + PdmScriptIOMessages* errorMessageContainer, + bool stringsAreQuoted = true, + caf::PdmObjectHandle* existingObjectsRoot = nullptr ) override + { + if ( this->isIOWriteable() ) + { + AppEnum value; + + PdmFieldScriptingCapabilityIOHandler>::writeToField( value, + inputStream, + errorMessageContainer, + stringsAreQuoted ); + m_field->setValue( value ); + } + } + + void readFromField( QTextStream& outputStream, bool quoteStrings = true, bool quoteNonBuiltins = false ) const override + { + PdmFieldScriptingCapabilityIOHandler>::readFromField( m_field->value(), + outputStream, + quoteStrings, + quoteNonBuiltins ); + } + + QStringList enumScriptTexts() const override + { + QStringList enumTexts; + + for ( size_t i = 0; i < caf::AppEnum::size(); i++ ) + { + auto enumText = caf::AppEnum::text( caf::AppEnum::fromIndex( i ) ); + enumTexts.push_back( enumText ); + } + + return enumTexts; + } + +private: + PdmField>* m_field; +}; + template void AddScriptingCapabilityToField( FieldType* field, const QString& fieldName ) { diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.cpp b/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.cpp index c0af5ac044..20bc993e6b 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.cpp +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.cpp @@ -99,5 +99,13 @@ QString PdmObjectScriptingCapabilityRegister::scriptClassComment( const QString& //-------------------------------------------------------------------------------------------------- bool PdmObjectScriptingCapabilityRegister::isScriptable( const caf::PdmObject* object ) { - return s_classKeywordToScriptClassName.find( object->classKeyword() ) != s_classKeywordToScriptClassName.end(); + return isScriptable( object->classKeyword() ); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool PdmObjectScriptingCapabilityRegister::isScriptable( const QString& classKeyword ) +{ + return s_classKeywordToScriptClassName.find( classKeyword ) != s_classKeywordToScriptClassName.end(); } diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.h b/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.h index 5ed5915a3e..6177bee7f2 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.h +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmObjectScriptingCapabilityRegister.h @@ -57,6 +57,7 @@ class PdmObjectScriptingCapabilityRegister static QString scriptClassComment( const QString& classKeyword ); static bool isScriptable( const caf::PdmObject* object ); + static bool isScriptable( const QString& classKeyword ); private: static std::map s_classKeywordToScriptClassName; diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp index 8c581ff8e9..ed8ff99fff 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.cpp @@ -182,22 +182,26 @@ QString caf::PdmPythonGenerator::generate( PdmObjectFactory* factory, std::vecto } else { - QString valueString; - - // Always make sure the default value for a ptrField is empty string - if ( !field->hasPtrReferencedObjects() ) - { - QTextStream valueStream( &valueString ); - scriptability->readFromField( valueStream, true, true ); - } - if ( valueString.isEmpty() ) valueString = QString( "\"\"" ); - valueString = pythonifyDataValue( valueString ); + QString valueString = getDefaultValue( field ); QString fieldCode = QString( " self.%1 = %2\n" ).arg( snake_field_name ).arg( valueString ); - QString fullComment = - QString( "%1 (%2): %3\n" ).arg( snake_field_name ).arg( dataType ).arg( comment ); + QString fullComment; + { + QString commentAndEnum = comment; + + QStringList enumTexts = scriptability->enumScriptTexts(); + if ( !enumTexts.empty() ) + { + // Replace the comment text with enum values + // The space is limited for the generation of documentation + commentAndEnum = "One of [" + enumTexts.join( ", " ) + "]"; + } + + fullComment = + QString( "%1 (%2): %3\n" ).arg( snake_field_name ).arg( dataType ).arg( commentAndEnum ); + } classAttributesGenerated[field->ownerClass()][snake_field_name].first = fieldCode; classAttributesGenerated[field->ownerClass()][snake_field_name].second = fullComment; @@ -264,16 +268,20 @@ QString caf::PdmPythonGenerator::generate( PdmObjectFactory* factory, std::vecto QStringList argumentComments; outputArgumentStrings.push_back( QString( "\"%1\"" ).arg( methodName ) ); - QString returnComment = method->defaultResult()->xmlCapability()->classKeyword(); + QString returnComment; + if ( method->defaultResult() ) returnComment = method->defaultResult()->xmlCapability()->classKeyword(); for ( auto field : arguments ) { - bool isList = field->xmlCapability()->isVectorField(); - QString defaultValue = isList ? "[]" : "None"; - auto scriptability = field->capability(); - auto argumentName = camelToSnakeCase( scriptability->scriptFieldName() ); - auto dataType = dataTypeString( field, false ); + auto scriptability = field->capability(); + auto argumentName = camelToSnakeCase( scriptability->scriptFieldName() ); + auto dataType = dataTypeString( field, false ); + + bool isList = field->xmlCapability()->isVectorField(); if ( isList ) dataType = "List of " + dataType; + + QString defaultValue = getDefaultValue( field ); + inputArgumentStrings.push_back( QString( "%1=%2" ).arg( argumentName ).arg( defaultValue ) ); outputArgumentStrings.push_back( QString( "%1=%1" ).arg( argumentName ) ); argumentComments.push_back( @@ -406,6 +414,39 @@ QString caf::PdmPythonGenerator::generate( PdmObjectFactory* factory, std::vecto return generatedCode; } +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +QString PdmPythonGenerator::getDefaultValue( PdmFieldHandle* field ) +{ + QString defaultValue = "None"; + + bool isList = field->xmlCapability()->isVectorField(); + if ( isList ) + { + defaultValue = "[]"; + } + else + { + QString valueString; + + // Always make sure the default value for a ptrField is empty string + if ( !field->hasPtrReferencedObjects() ) + { + auto scriptability = field->template capability(); + + QTextStream valueStream( &valueString ); + scriptability->readFromField( valueStream, true, true ); + } + if ( valueString.isEmpty() ) valueString = QString( "\"\"" ); + valueString = pythonifyDataValue( valueString ); + + defaultValue = valueString; + } + + return defaultValue; +} + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.h b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.h index f4068e84a8..640057c0bb 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.h +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmPythonGenerator.h @@ -54,6 +54,9 @@ class PdmPythonGenerator : public PdmCodeGenerator static QString dataTypeString( const PdmFieldHandle* field, bool useStrForUnknownDataTypes ); static QString pythonifyDataValue( const QString& dataValue ); + +private: + static QString getDefaultValue( PdmFieldHandle* field ); }; } // namespace caf diff --git a/Fwk/AppFwk/cafPdmScripting/cafPdmScripting_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafPdmScripting/cafPdmScripting_UnitTests/CMakeLists.txt index b3988c5442..946793e218 100644 --- a/Fwk/AppFwk/cafPdmScripting/cafPdmScripting_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafPdmScripting/cafPdmScripting_UnitTests/CMakeLists.txt @@ -5,7 +5,8 @@ project(cafPdmScripting_UnitTests) find_package( Qt5 COMPONENTS - REQUIRED Core Xml Gui) + REQUIRED Core Xml Gui +) set(QT_LIBRARIES Qt5::Core Qt5::Xml Qt5::Gui) if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.11)) @@ -22,11 +23,14 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} # required for gtest-all.cpp ) # add the executable -add_executable(${PROJECT_NAME} cafPdmScripting_UnitTests.cpp - gtest/gtest-all.cpp cafPdmScriptingBasicTest.cpp) +add_executable( + ${PROJECT_NAME} cafPdmScripting_UnitTests.cpp gtest/gtest-all.cpp + cafPdmScriptingBasicTest.cpp +) -target_link_libraries(${PROJECT_NAME} cafPdmScripting ${QT_LIBRARIES} - ${THREAD_LIBRARY}) +target_link_libraries( + ${PROJECT_NAME} cafPdmScripting ${QT_LIBRARIES} ${THREAD_LIBRARY} +) source_group("" FILES ${PROJECT_FILES}) @@ -37,6 +41,7 @@ if(Qt5Core_FOUND) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) endif(Qt5Core_FOUND) diff --git a/Fwk/AppFwk/cafProjectDataModel/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/CMakeLists.txt index b27df67334..ea2fa22cac 100644 --- a/Fwk/AppFwk/cafProjectDataModel/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/CMakeLists.txt @@ -12,7 +12,8 @@ endif() find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) set(PROJECT_FILES @@ -23,7 +24,8 @@ set(PROJECT_FILES cafPdmObjectGroup.cpp cafPdmObjectGroup.h cafPdmObject.cpp - cafPdmObject.h) + cafPdmObject.h +) add_library(${PROJECT_NAME} ${PROJECT_FILES}) @@ -32,8 +34,9 @@ target_link_libraries(${PROJECT_NAME} cafPdmUiCore cafPdmXml ${QT_LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/CMakeLists.txt index 181085144b..9637b34f47 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/CMakeLists.txt @@ -11,7 +11,8 @@ endif() find_package( Qt5 COMPONENTS - REQUIRED Core) + REQUIRED Core +) set(QT_LIBRARIES Qt5::Core) set(PROJECT_FILES @@ -58,7 +59,8 @@ set(PROJECT_FILES cafAsyncObjectDeleter.h cafAsyncObjectDeleter.inl cafAsyncWorkerManager.h - cafAsyncWorkerManager.cpp) + cafAsyncWorkerManager.cpp +) add_library(${PROJECT_NAME} ${PROJECT_FILES}) @@ -67,8 +69,9 @@ target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(${PROJECT_NAME} ${QT_LIBRARIES}) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.h index af69fc4402..0fcff65404 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafAppEnum.h @@ -36,9 +36,12 @@ #pragma once +#include "cafAssert.h" + #include #include #include + #include namespace caf @@ -155,9 +158,9 @@ class AppEnum /// method. It may also set a default value using \m setDefault //================================================================================================== static void setUp(); - static void addItem( T enumVal, const QString& text, const QString& uiText ) + static void addItem( T enumVal, const QString& text, const QString& uiText, const QStringList& aliases = {} ) { - EnumMapper::instance()->addItem( enumVal, text, uiText ); + EnumMapper::instance()->addItem( enumVal, text, uiText, aliases ); } static void setDefault( T defaultEnumValue ) { EnumMapper::instance()->setDefault( defaultEnumValue ); } @@ -174,27 +177,40 @@ class AppEnum class EnumMapper { private: - struct Triplet + class EnumData { - Triplet( T enumVal, const QString& text, QString uiText ) + public: + EnumData( T enumVal, const QString& text, const QString& uiText, const QStringList& aliases ) : m_enumVal( enumVal ) , m_text( text ) , m_uiText( uiText ) + , m_aliases( aliases ) { } - T m_enumVal; - QString m_text; - QString m_uiText; + bool isMatching( const QString& text ) const { return ( text == m_text || m_aliases.contains( text ) ); } + + T m_enumVal; + QString m_text; + QString m_uiText; + QStringList m_aliases; }; public: - void addItem( T enumVal, const QString& text, QString uiText ) + void addItem( T enumVal, const QString& text, QString uiText, const QStringList& aliases ) { - // Make sure the text is trimmed, as this text is streamed to XML and will be trimmed when read back from - // XML text - // https://github.com/OPM/ResInsight/issues/7829 - instance()->m_mapping.push_back( Triplet( enumVal, text.trimmed(), uiText ) ); + // Make sure the alias text is unique for enum + for ( const auto& alias : aliases ) + { + for ( const auto& enumData : instance()->m_mapping ) + { + CAF_ASSERT( !enumData.isMatching( alias ) ); + } + } + + // Make sure the text is trimmed, as this text is streamed to XML and will be trimmed when read back + // from XML text https://github.com/OPM/ResInsight/issues/7829 + instance()->m_mapping.push_back( EnumData( enumVal, text.trimmed(), uiText, aliases ) ); } static EnumMapper* instance() @@ -244,12 +260,14 @@ class AppEnum bool enumVal( T& value, const QString& text ) const { value = defaultValue(); - size_t idx; - for ( idx = 0; idx < m_mapping.size(); ++idx ) + + QString trimmedText = text.trimmed(); + + for ( size_t idx = 0; idx < m_mapping.size(); ++idx ) { // Make sure the text parsed from a text stream is trimmed // https://github.com/OPM/ResInsight/issues/7829 - if ( text.trimmed() == m_mapping[idx].m_text ) + if ( m_mapping[idx].isMatching( trimmedText ) ) { value = m_mapping[idx].m_enumVal; return true; @@ -320,9 +338,9 @@ class AppEnum friend class AppEnum; - std::vector m_mapping; - T m_defaultValue; - bool m_defaultValueIsSet; + std::vector m_mapping; + T m_defaultValue; + bool m_defaultValueIsSet; }; }; diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests/CMakeLists.txt index e09ce30274..14743e48c4 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmCore/cafPdmCore_UnitTests/CMakeLists.txt @@ -6,7 +6,8 @@ project(cafPdmCore_UnitTests) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Widgets Qt5::Gui) if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.11)) @@ -34,7 +35,8 @@ set(PROJECT_FILES Parent.cpp Parent.h TestObj.cpp - TestObj.h) + TestObj.h +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES}) @@ -45,8 +47,9 @@ if(Qt5Core_FOUND) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) endif() -target_link_libraries(${PROJECT_NAME} cafPdmCore ${QT_LIBRARIES} - ${THREAD_LIBRARY}) +target_link_libraries( + ${PROJECT_NAME} cafPdmCore ${QT_LIBRARIES} ${THREAD_LIBRARY} +) # Copy Qt Dlls foreach(qtlib ${QT_LIBRARIES}) @@ -54,5 +57,6 @@ foreach(qtlib ${QT_LIBRARIES}) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt index 1532753d3a..678fb2e06b 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/CMakeLists.txt @@ -10,13 +10,15 @@ endif() # These headers need to go through Qt's MOC compiler set(MOC_HEADER_FILES cafPdmUiEditorHandle.h cafPdmUiFieldEditorHandle.h - cafPdmUiSelection3dEditorVisualizer.h cafQShortenedLabel.h) + cafPdmUiSelection3dEditorVisualizer.h cafQShortenedLabel.h +) # Qt find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -69,7 +71,8 @@ set(PROJECT_FILES cafIconProvider.cpp cafIconProvider.h cafFontTools.cpp - cafFontTools.h) + cafFontTools.h +) # NOTE! Resources in this subfolder appends to the variable QRC_FILES in parent # scope CMakeList.txt in the application folder (parent scope) must use the @@ -80,7 +83,8 @@ set(PROJECT_FILES set(QRC_FILES ${QRC_FILES} ${CMAKE_CURRENT_SOURCE_DIR}/Resources/caf.qrc - PARENT_SCOPE) + PARENT_SCOPE +) add_library(${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES}) @@ -89,8 +93,9 @@ target_link_libraries(${PROJECT_NAME} cafPdmCore ${QT_LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.cpp index 0a6d617402..2f0b719b17 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.cpp @@ -45,6 +45,7 @@ #include "cafSelectionManager.h" #include +#include namespace caf { @@ -82,13 +83,12 @@ void PdmUiCommandSystemProxy::setUiValueToField( PdmUiFieldHandle* uiFieldHandle if ( uiFieldHandle && uiFieldHandle->fieldHandle() ) { // Handle editing multiple objects when several objects are selected - PdmFieldHandle* editorField = uiFieldHandle->fieldHandle(); - const std::type_info& fieldOwnerTypeId = typeid( *editorField->ownerObject() ); + PdmFieldHandle* editorField = uiFieldHandle->fieldHandle(); std::vector fieldsToUpdate; fieldsToUpdate.push_back( editorField ); - std::vector otherSelectedFields = fieldsFromSelection( fieldOwnerTypeId, editorField->keyword() ); + std::vector otherSelectedFields = fieldsFromSelection( editorField ); // If current edited field is part of the selection, update all fields in selection if ( std::find( otherSelectedFields.begin(), otherSelectedFields.end(), editorField ) != otherSelectedFields.end() ) @@ -144,32 +144,76 @@ void PdmUiCommandSystemProxy::populateMenuWithDefaultCommands( const QString& ui //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -std::vector PdmUiCommandSystemProxy::fieldsFromSelection( const std::type_info& fieldOwnerTypeId, - const QString& fieldKeyword ) +std::vector PdmUiCommandSystemProxy::fieldsFromSelection( PdmFieldHandle* editorField ) { - std::vector items; - std::vector additionalFieldsToUpdate; + if ( !editorField ) return {}; + if ( !editorField->ownerObject() ) return {}; + + std::vector items; - int selectionLevel = 0; - SelectionManager::instance()->selectedItems( items, selectionLevel ); + // Find all selected items at one level starting from the largest level. This is required to be able to modify + // multiple rows in the table editor. Items in the table editor use by default SelectionManager::FIRST_LEVEL + for ( int candidateSelectionLevel = SelectionManager::SECOND_LEVEL; + candidateSelectionLevel != SelectionManager::UNDEFINED; + candidateSelectionLevel-- ) + { + SelectionManager::instance()->selectedItems( items, candidateSelectionLevel ); + if ( !items.empty() ) break; + } + + if ( items.size() < 2 ) return {}; + + const auto fieldKeyword = editorField->keyword(); + const auto& fieldOwnerTypeId = typeid( *editorField->ownerObject() ); + std::vector additionalFieldsToUpdate; for ( auto& item : items ) { - PdmObjectHandle* objectHandle = dynamic_cast( item ); - if ( objectHandle && typeid( *objectHandle ) == fieldOwnerTypeId ) + auto* objectHandle = dynamic_cast( item ); + if ( objectHandle ) { - // An object is selected, find field with same keyword as the current field being edited - PdmFieldHandle* fieldHandle = objectHandle->findField( fieldKeyword ); - if ( fieldHandle ) + if ( typeid( *objectHandle ) == fieldOwnerTypeId ) { - additionalFieldsToUpdate.push_back( fieldHandle ); + // An object of same type is selected, find field with same keyword as the current field being edited + + PdmFieldHandle* fieldHandle = objectHandle->findField( fieldKeyword ); + if ( fieldHandle ) + { + additionalFieldsToUpdate.push_back( fieldHandle ); + } + } + else + { + // Search one level in the project tree for fields in child objects + // Searching in deeper levels is currently not supported, and is considered difficult to match correctly + // and robust + // + // Check for identical owner class to guard for matching field names in multiple child objects of a + // different type + const auto editorFieldOwnerClass = editorField->ownerClass(); + + std::vector childFields; + objectHandle->fields( childFields ); + for ( auto field : childFields ) + { + std::vector childObjects; + field->childObjects( &childObjects ); + for ( auto childObj : childObjects ) + { + auto childFieldHandle = childObj->findField( fieldKeyword ); + if ( childFieldHandle && childFieldHandle->ownerClass() == editorFieldOwnerClass ) + { + additionalFieldsToUpdate.push_back( childFieldHandle ); + } + } + } } } else { // Todo Remove when dust has settled. Selection manager is not supposed to select single fields // A field is selected, check if keywords are identical - PdmUiFieldHandle* itemFieldHandle = dynamic_cast( item ); + auto* itemFieldHandle = dynamic_cast( item ); if ( itemFieldHandle ) { PdmFieldHandle* field = itemFieldHandle->fieldHandle(); diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.h index 6164165e48..0afff4431b 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiCommandSystemProxy.h @@ -36,7 +36,6 @@ #pragma once -#include #include class QVariant; @@ -63,8 +62,7 @@ class PdmUiCommandSystemProxy void populateMenuWithDefaultCommands( const QString& uiConfigName, QMenu* menu ); private: - static std::vector fieldsFromSelection( const std::type_info& fieldOwnerTypeId, - const QString& fieldKeyword ); + static std::vector fieldsFromSelection( PdmFieldHandle* editorField ); private: PdmUiCommandSystemInterface* m_commandInterface; diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp index ad38057bda..9d2484e330 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.cpp @@ -56,6 +56,7 @@ PdmUiItemInfo::PdmUiItemInfo( const QString& uiName, , m_extraDebugText( extraDebugText ) , m_editorTypeName( "" ) , m_isHidden( false ) + , m_isTreeHidden( false ) , m_isTreeChildrenHidden( false ) , m_isReadOnly( false ) , m_labelAlignment( LEFT ) @@ -78,6 +79,7 @@ PdmUiItemInfo::PdmUiItemInfo( const QString& uiName, , m_extraDebugText( extraDebugText ) , m_editorTypeName( "" ) , m_isHidden( false ) + , m_isTreeHidden( false ) , m_isTreeChildrenHidden( false ) , m_isReadOnly( false ) , m_labelAlignment( LEFT ) @@ -409,17 +411,23 @@ void PdmUiItem::setUiHidden( bool isHidden, const QString& uiConfigName /*= ""*/ //-------------------------------------------------------------------------------------------------- bool PdmUiItem::isUiTreeHidden( const QString& uiConfigName ) const { - // TODO: Must be separated from uiHidden when childField object embedding is implemented + const PdmUiItemInfo* conInfo = configInfo( uiConfigName ); + const PdmUiItemInfo* defInfo = defaultInfo(); + const PdmUiItemInfo* sttInfo = m_staticItemInfo; - return isUiHidden( uiConfigName ); + if ( conInfo && !( conInfo->m_isTreeHidden == -1 ) ) return conInfo->m_isTreeHidden; + if ( defInfo && !( defInfo->m_isTreeHidden == -1 ) ) return defInfo->m_isTreeHidden; + if ( sttInfo && !( sttInfo->m_isTreeHidden == -1 ) ) return sttInfo->m_isTreeHidden; + + return false; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -void PdmUiItem::setUiTreeHidden( bool isHidden, const QString& uiConfigName /*= ""*/ ) +void PdmUiItem::setUiTreeHidden( bool isTreeHidden, const QString& uiConfigName /*= ""*/ ) { - m_configItemInfos[uiConfigName].m_isHidden = isHidden; + m_configItemInfos[uiConfigName].m_isTreeHidden = isTreeHidden; } //-------------------------------------------------------------------------------------------------- diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h index e8c6b063b3..9c67228696 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiItem.h @@ -66,6 +66,7 @@ class PdmUiItemInfo PdmUiItemInfo() : m_editorTypeName( "" ) , m_isHidden( -1 ) + , m_isTreeHidden( -1 ) , m_isTreeChildrenHidden( -1 ) , m_isReadOnly( -1 ) , m_labelAlignment( LEFT ) @@ -99,6 +100,7 @@ class PdmUiItemInfo QString m_editorTypeName; ///< Use this exact type of editor to edit this UiItem QString m_3dEditorTypeName; ///< If set, use this editor type to edit this UiItem in 3D int m_isHidden; ///< UiItem should be hidden. -1 means not set + int m_isTreeHidden; ///< UiItem should be hidden in tree. -1 means not set int m_isTreeChildrenHidden; ///< Children of UiItem should be hidden. -1 means not set int m_isReadOnly; ///< UiItem should be insensitive, or read only. -1 means not set. LabelPosType m_labelAlignment; @@ -267,7 +269,7 @@ class PdmUiItem void setUiHidden( bool isHidden, const QString& uiConfigName = "" ); bool isUiTreeHidden( const QString& uiConfigName = "" ) const; - void setUiTreeHidden( bool isHidden, const QString& uiConfigName = "" ); + void setUiTreeHidden( bool isTreeHidden, const QString& uiConfigName = "" ); bool isUiTreeChildrenHidden( const QString& uiConfigName = "" ) const; void setUiTreeChildrenHidden( bool isTreeChildrenHidden, const QString& uiConfigName = "" ); diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp index 4a4b9f0fef..b420bd1b66 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiObjectHandle.cpp @@ -94,7 +94,7 @@ PdmUiTreeOrdering* PdmUiObjectHandle::uiTreeOrdering( const QString& uiConfigNam PdmUiTreeOrdering* uiTreeOrdering = new PdmUiTreeOrdering( nullptr, m_owner ); - expandUiTree( uiTreeOrdering, uiConfigName ); + if ( !m_owner->uiCapability()->isUiTreeHidden() ) expandUiTree( uiTreeOrdering, uiConfigName ); return uiTreeOrdering; } @@ -120,7 +120,8 @@ void PdmUiObjectHandle::addDefaultUiTreeChildren( PdmUiTreeOrdering* uiTreeOrder { if ( fields[fIdx]->hasChildObjects() && !uiTreeOrdering->containsField( fields[fIdx] ) ) { - if ( fields[fIdx]->uiCapability()->isUiHidden() && !fields[fIdx]->uiCapability()->isUiTreeChildrenHidden() ) + if ( fields[fIdx]->uiCapability()->isUiTreeHidden() && + !fields[fIdx]->uiCapability()->isUiTreeChildrenHidden() ) { std::vector children; fields[fIdx]->childObjects( &children ); @@ -128,7 +129,8 @@ void PdmUiObjectHandle::addDefaultUiTreeChildren( PdmUiTreeOrdering* uiTreeOrder std::set objectsAddedByApplication; for ( int i = 0; i < uiTreeOrdering->childCount(); i++ ) { - if ( uiTreeOrdering->child( i )->isRepresentingObject() ) + if ( uiTreeOrdering->child( i )->isRepresentingObject() && + !uiTreeOrdering->child( i )->object()->uiCapability()->isUiTreeHidden() ) { objectsAddedByApplication.insert( uiTreeOrdering->child( i )->object() ); } @@ -146,14 +148,14 @@ void PdmUiObjectHandle::addDefaultUiTreeChildren( PdmUiTreeOrdering* uiTreeOrder break; } - if ( !isAlreadyAdded ) + if ( !isAlreadyAdded && !children[cIdx]->uiCapability()->isUiTreeHidden() ) { uiTreeOrdering->add( children[cIdx] ); } } } } - else if ( !fields[fIdx]->uiCapability()->isUiHidden() ) + else if ( !fields[fIdx]->uiCapability()->isUiTreeHidden() ) { uiTreeOrdering->add( fields[fIdx] ); } @@ -177,7 +179,7 @@ void PdmUiObjectHandle::expandUiTree( PdmUiTreeOrdering* root, const QString& ui for ( int cIdx = 0; cIdx < root->childCount(); ++cIdx ) { PdmUiTreeOrdering* child = root->child( cIdx ); - if ( child->isValid() && !child->ignoreSubTree() ) + if ( child->isValid() && !child->ignoreSubTree() && !child->activeItem()->isUiTreeHidden( uiConfigName ) ) { expandUiTree( child, uiConfigName ); } @@ -187,20 +189,21 @@ void PdmUiObjectHandle::expandUiTree( PdmUiTreeOrdering* root, const QString& ui { if ( !root->ignoreSubTree() ) { - if ( root->isRepresentingField() && !root->field()->uiCapability()->isUiTreeChildrenHidden( uiConfigName ) ) + if ( root->isRepresentingField() && !root->field()->uiCapability()->isUiTreeHidden( uiConfigName ) && + !root->field()->uiCapability()->isUiTreeChildrenHidden( uiConfigName ) ) { std::vector fieldsChildObjects; root->field()->childObjects( &fieldsChildObjects ); for ( size_t cIdx = 0; cIdx < fieldsChildObjects.size(); ++cIdx ) { PdmObjectHandle* childObject = fieldsChildObjects[cIdx]; - if ( childObject ) + if ( childObject && !childObject->uiCapability()->isUiTreeHidden() ) { root->appendChild( uiObj( childObject )->uiTreeOrdering( uiConfigName ) ); } } } - else if ( root->isRepresentingObject() && + else if ( root->isRepresentingObject() && !root->object()->uiCapability()->isUiTreeHidden( uiConfigName ) && !root->object()->uiCapability()->isUiTreeChildrenHidden( uiConfigName ) ) { uiObj( root->object() )->defineUiTreeOrdering( *root, uiConfigName ); diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp index 865bc371df..bb9ab1ec3b 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiTreeOrdering.cpp @@ -63,7 +63,7 @@ void PdmUiTreeOrdering::add( PdmFieldHandle* field, QString uiConfigName ) for ( PdmObjectHandle* objHandle : children ) { - this->add( objHandle ); + if ( !objHandle->uiCapability()->isUiTreeHidden() ) this->add( objHandle ); } } } diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/CMakeLists.txt index 00994bc0a8..d05661cac8 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/CMakeLists.txt @@ -12,7 +12,8 @@ endif() find_package( Qt5 COMPONENTS - REQUIRED Core Xml) + REQUIRED Core Xml +) set(QT_LIBRARIES Qt5::Core Qt5::Xml) include_directories(..) @@ -38,7 +39,8 @@ set(PROJECT_FILES cafPdmObjectFactory.h cafPdmSettings.h cafPdmSettings.cpp - cafPdmXmlStringValidation.h) + cafPdmXmlStringValidation.h +) add_library(${PROJECT_NAME} ${PROJECT_FILES}) @@ -47,8 +49,9 @@ target_link_libraries(${PROJECT_NAME} cafPdmCore ${QT_LIBRARIES}) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt index 5f5d4740e3..b1aca842c3 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt @@ -5,7 +5,8 @@ project(cafPdmXml_UnitTests) find_package( Qt5 COMPONENTS - REQUIRED Core Xml) + REQUIRED Core Xml +) set(QT_LIBRARIES Qt5::Core Qt5::Xml) if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.11)) @@ -25,14 +26,16 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} # required for gtest-all.cpp add_executable( ${PROJECT_NAME} cafPdmXml_UnitTests.cpp gtest/gtest-all.cpp cafPdmXmlBasicTest.cpp - cafPdmAdvancedTemplateTest.cpp cafPdmXmlNumberTest.cpp cafPdmPtrArrayTest.cpp) + cafPdmAdvancedTemplateTest.cpp cafPdmXmlNumberTest.cpp cafPdmPtrArrayTest.cpp +) if(Qt5Core_FOUND) set(QT_LIBRARIES Qt5::Core Qt5::Xml) endif() -target_link_libraries(${PROJECT_NAME} cafPdmXml ${QT_LIBRARIES} - ${THREAD_LIBRARY}) +target_link_libraries( + ${PROJECT_NAME} cafPdmXml ${QT_LIBRARIES} ${THREAD_LIBRARY} +) source_group("" FILES ${PROJECT_FILES}) @@ -43,6 +46,7 @@ if(Qt5Core_FOUND) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) endif(Qt5Core_FOUND) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlBasicTest.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlBasicTest.cpp index 106c3261d9..97734d3c42 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlBasicTest.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlBasicTest.cpp @@ -13,6 +13,7 @@ #include "cafPdmXmlObjectHandle.h" #include "cafPdmXmlObjectHandleMacros.h" +#include #include class DemoPdmObject : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandle @@ -39,6 +40,8 @@ class DemoPdmObject : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandl m_proxyEnumField.registerSetMethod( this, &DemoPdmObject::setEnumMember ); m_proxyEnumField.registerGetMethod( this, &DemoPdmObject::enumMember ); m_enumMember = T1; + + CAF_PDM_XML_InitField( &m_appEnumField, "NativeAppEnum" ); } ~DemoPdmObject() {} @@ -47,6 +50,7 @@ class DemoPdmObject : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandl caf::PdmProxyValueField m_proxyDoubleField; caf::PdmProxyValueField> m_proxyEnumField; + caf::PdmDataValueField> m_appEnumField; private: void setDoubleMember( const double& d ) @@ -75,8 +79,12 @@ template <> void AppEnum::setUp() { addItem( DemoPdmObject::T1, "T1", "An A letter" ); - addItem( DemoPdmObject::T2, "T2", "A B letter" ); + addItem( DemoPdmObject::T2, "T2", "A B letter", QStringList( { "T2_a", "T2_b" } ) ); addItem( DemoPdmObject::T3, "T3", "A B letter" ); + + // Use the following line to test the CAF_ASSERT that should trigger when equal alias texts are defined + // addItem( DemoPdmObject::T3, "T3", "A B letter", QStringList( { "T2_a", "T2_b" } ) ); + setDefault( DemoPdmObject::T1 ); } @@ -437,3 +445,34 @@ TEST( BaseTest, TestDataType ) delete s1; } #endif + +TEST( BaseTest, AppEnumAlias ) +{ + { + auto* obj2 = new DemoPdmObject; + EXPECT_TRUE( obj2->m_appEnumField() == DemoPdmObject::TestEnumType::T1 ); + + QString xmlText = "" + "0" + "T2" + "T2_a" + ""; + + obj2->readObjectFromXmlString( xmlText, caf::PdmDefaultObjectFactory::instance() ); + EXPECT_TRUE( obj2->m_appEnumField() == DemoPdmObject::TestEnumType::T2 ); + } + + { + auto* obj2 = new DemoPdmObject; + EXPECT_TRUE( obj2->m_appEnumField() == DemoPdmObject::TestEnumType::T1 ); + + QString xmlText = "" + "0" + "T2" + "T2_b" + ""; + + obj2->readObjectFromXmlString( xmlText, caf::PdmDefaultObjectFactory::instance() ); + EXPECT_TRUE( obj2->m_appEnumField() == DemoPdmObject::TestEnumType::T2 ); + } +} diff --git a/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/CMakeLists.txt index 18d0536556..ef58eb40b1 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafProjectDataModel_UnitTests/CMakeLists.txt @@ -6,7 +6,8 @@ project(cafProjectDataModel_UnitTests) find_package( Qt5 COMPONENTS - REQUIRED Core Xml Gui) + REQUIRED Core Xml Gui +) set(QT_LIBRARIES Qt5::Core Qt5::Xml Qt5::Gui) if(MSVC AND (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 19.11)) @@ -23,13 +24,15 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} # required for gtest-all.cpp ) set(PROJECT_FILES cafPdmBasicTest.cpp cafProjectDataModel_UnitTests.cpp - Child.cpp Parent.cpp TestObj.cpp) + Child.cpp Parent.cpp TestObj.cpp +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES} gtest/gtest-all.cpp) -target_link_libraries(${PROJECT_NAME} cafProjectDataModel ${QT_LIBRARIES} - ${THREAD_LIBRARY}) +target_link_libraries( + ${PROJECT_NAME} cafProjectDataModel ${QT_LIBRARIES} ${THREAD_LIBRARY} +) source_group("" FILES ${PROJECT_FILES}) @@ -39,5 +42,6 @@ foreach(qtlib ${QT_LIBRARIES}) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) diff --git a/Fwk/AppFwk/cafTests/cafTestApplication/CMakeLists.txt b/Fwk/AppFwk/cafTests/cafTestApplication/CMakeLists.txt index 4e2184e049..88102d6e33 100644 --- a/Fwk/AppFwk/cafTests/cafTestApplication/CMakeLists.txt +++ b/Fwk/AppFwk/cafTests/cafTestApplication/CMakeLists.txt @@ -9,7 +9,8 @@ find_package(OpenGL) # Qt MOC set(MOC_HEADER_FILES MainWindow.h WidgetLayoutTest.h CustomObjectEditor.h - MenuItemProducer.h) + MenuItemProducer.h +) # Resource file set(QRC_FILES ${QRC_FILES} textedit.qrc) @@ -17,7 +18,8 @@ set(QRC_FILES ${QRC_FILES} textedit.qrc) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets OpenGL) + REQUIRED Core Gui Widgets OpenGL +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) qt5_add_resources(QRC_FILES_CPP ${QRC_FILES}) @@ -42,7 +44,8 @@ set(PROJECT_FILES MenuItemProducer.cpp MenuItemProducer.h TamComboBox.h - TamComboBox.cpp) + TamComboBox.cpp +) # add the executable add_executable( @@ -71,8 +74,10 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") list(APPEND EXTERNAL_LINK_LIBRARIES rt pthread) endif() -target_link_libraries(${PROJECT_NAME} ${TAP_LINK_LIBRARIES} ${QT_LIBRARIES} - ${EXTERNAL_LINK_LIBRARIES}) +target_link_libraries( + ${PROJECT_NAME} ${TAP_LINK_LIBRARIES} ${QT_LIBRARIES} + ${EXTERNAL_LINK_LIBRARIES} +) source_group("" FILES ${PROJECT_FILES}) @@ -81,5 +86,6 @@ foreach(qtlib ${QT_LIBRARIES}) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) diff --git a/Fwk/AppFwk/cafTests/cafTestCvfApplication/CMakeLists.txt b/Fwk/AppFwk/cafTests/cafTestCvfApplication/CMakeLists.txt index 8f951a7e4c..dc8227f54f 100644 --- a/Fwk/AppFwk/cafTests/cafTestCvfApplication/CMakeLists.txt +++ b/Fwk/AppFwk/cafTests/cafTestCvfApplication/CMakeLists.txt @@ -11,7 +11,8 @@ set(QRC_FILES textedit.qrc) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets OpenGL) + REQUIRED Core Gui Widgets OpenGL +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) qt5_add_resources(QRC_FILES_CPP ${QRC_FILES}) @@ -25,22 +26,27 @@ include_directories( ${LibRender_SOURCE_DIR} ${LibViewing_SOURCE_DIR} ${cafProjectDataModel_SOURCE_DIR} - ${cafUserInterface_SOURCE_DIR}) + ${cafUserInterface_SOURCE_DIR} +) if(USE_COMMAND_FRAMEWORK) include_directories(${cafCommand_SOURCE_DIR}) add_definitions(-DTAP_USE_COMMAND_FRAMEWORK) endif(USE_COMMAND_FRAMEWORK) -include_directories(${cafPdmCore_SOURCE_DIR} ${cafPdmUiCore_SOURCE_DIR} - ${cafPdmXml_SOURCE_DIR} ${cafPdmCvf_SOURCE_DIR}) +include_directories( + ${cafPdmCore_SOURCE_DIR} ${cafPdmUiCore_SOURCE_DIR} ${cafPdmXml_SOURCE_DIR} + ${cafPdmCvf_SOURCE_DIR} +) set(PROJECT_FILES Main.cpp MainWindow.cpp WidgetLayoutTest.cpp - TapCvfSpecialization.cpp TapProject.cpp) + TapCvfSpecialization.cpp TapProject.cpp +) # add the executable -add_executable(${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES} - ${QRC_FILES_CPP}) +add_executable( + ${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES} ${QRC_FILES_CPP} +) set(TAP_LINK_LIBRARIES cafUserInterface cafPdmXml cafPdmCvf ${QT_LIBRARIES}) @@ -57,5 +63,6 @@ foreach(qtlib ${QT_LIBRARIES}) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) diff --git a/Fwk/AppFwk/cafUserInterface/CMakeLists.txt b/Fwk/AppFwk/cafUserInterface/CMakeLists.txt index bd36958fcc..15d71efcd3 100644 --- a/Fwk/AppFwk/cafUserInterface/CMakeLists.txt +++ b/Fwk/AppFwk/cafUserInterface/CMakeLists.txt @@ -52,12 +52,14 @@ set(MOC_HEADER_FILES cafPdmUniqueIdValidator.h cafPdmDoubleStringValidator.h cafPdmUiPickableLineEditor.h - cafPdmUiLabelEditor.h) + cafPdmUiLabelEditor.h +) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -162,14 +164,17 @@ set(PROJECT_FILES cafStyleSheetTools.h cafStyleSheetTools.cpp cafPdmUiTabbedPropertyViewDialog.h - cafPdmUiTabbedPropertyViewDialog.cpp) + cafPdmUiTabbedPropertyViewDialog.cpp +) -add_library(${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES} - ${QRC_FILES_CPP}) +add_library( + ${PROJECT_NAME} ${PROJECT_FILES} ${MOC_SOURCE_FILES} ${QRC_FILES_CPP} +) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) diff --git a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp index a314c61de9..a8135988fa 100644 --- a/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafPdmUiTableViewEditor.cpp @@ -46,9 +46,11 @@ #include "cafSelectionManager.h" #include +#include #include #include #include +#include #include #include #include @@ -411,7 +413,27 @@ bool PdmUiTableViewEditor::eventFilter( QObject* obj, QEvent* event ) { this->updateSelectionManagerFromTableSelection(); } - // standard event processing + + auto keyEvent = dynamic_cast( event ); + if ( keyEvent && keyEvent->matches( QKeySequence::Copy ) ) + { + QString text; + + for ( const QItemSelectionRange& range : m_tableView->selectionModel()->selection() ) + { + for ( auto i = range.top(); i <= range.bottom(); ++i ) + { + QStringList rowContents; + for ( auto j = range.left(); j <= range.right(); ++j ) + rowContents << m_tableView->model()->index( i, j ).data().toString(); + text += rowContents.join( "\t" ); + text += "\n"; + } + } + + QApplication::clipboard()->setText( text ); + } + return QObject::eventFilter( obj, event ); } diff --git a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp index f74b6d7035..a7f42a8623 100644 --- a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp +++ b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.cpp @@ -485,7 +485,7 @@ void ProgressInfoStatic::start( size_t maxProgressValue, const QString& title, b dialog->setCancelButton( nullptr ); if ( delayShowingProgress ) { - dialog->setMinimumDuration( 1000 ); + dialog->setMinimumDuration( 2000 ); } else { diff --git a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.h b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.h index 99e17b78a4..321716f450 100644 --- a/Fwk/AppFwk/cafUserInterface/cafProgressInfo.h +++ b/Fwk/AppFwk/cafUserInterface/cafProgressInfo.h @@ -57,7 +57,7 @@ class ProgressTask class ProgressInfo { public: - ProgressInfo( size_t maxProgressValue, const QString& title, bool delayShowingProgress = false ); + ProgressInfo( size_t maxProgressValue, const QString& title, bool delayShowingProgress = true ); ~ProgressInfo(); void setProgressDescription( const QString& description ); diff --git a/Fwk/AppFwk/cafUserInterface/cafUserInterface_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafUserInterface/cafUserInterface_UnitTests/CMakeLists.txt index 2c1fcccbab..e29067d251 100644 --- a/Fwk/AppFwk/cafUserInterface/cafUserInterface_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafUserInterface/cafUserInterface_UnitTests/CMakeLists.txt @@ -9,28 +9,32 @@ if(CEE_USE_QT5) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets) + REQUIRED Core Gui Widgets + ) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets) else() find_package( Qt4 COMPONENTS QtCore QtGui QtMain - REQUIRED) + REQUIRED + ) include(${QT_USE_FILE}) endif(CEE_USE_QT5) include_directories(${CMAKE_CURRENT_SOURCE_DIR}) set(PROJECT_FILES cafUserInterface_UnitTests.cpp cafPdmUiTreeViewModelTest.cpp - cafPdmUiTreeSelectionQModelTest.cpp gtest/gtest-all.cpp) + cafPdmUiTreeSelectionQModelTest.cpp gtest/gtest-all.cpp +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES}) source_group("" FILES ${PROJECT_FILES}) -target_link_libraries(${PROJECT_NAME} cafUserInterface ${QT_LIBRARIES} - ${THREAD_LIBRARY}) +target_link_libraries( + ${PROJECT_NAME} cafUserInterface ${QT_LIBRARIES} ${THREAD_LIBRARY} +) # Copy Qt Dlls if(Qt5Core_FOUND) @@ -39,7 +43,8 @@ if(Qt5Core_FOUND) TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $ - $) + $ + ) endforeach(qtlib) # Copy Qt Dlls else() @@ -51,12 +56,14 @@ else() # Debug execute_process( COMMAND cmake -E copy_if_different ${QT_BINARY_DIR}/${qtlib}d4.dll - ${CMAKE_BINARY_DIR}/Debug/${qtlib}d4.dll) + ${CMAKE_BINARY_DIR}/Debug/${qtlib}d4.dll + ) # Release execute_process( COMMAND cmake -E copy_if_different ${QT_BINARY_DIR}/${qtlib}4.dll - ${CMAKE_BINARY_DIR}/Release/${qtlib}4.dll) + ${CMAKE_BINARY_DIR}/Release/${qtlib}4.dll + ) endforeach(qtlib) endif(MSVC) endif(Qt5Core_FOUND) diff --git a/Fwk/AppFwk/cafViewer/CMakeLists.txt b/Fwk/AppFwk/cafViewer/CMakeLists.txt index 441ca54b1d..6d14359ce3 100644 --- a/Fwk/AppFwk/cafViewer/CMakeLists.txt +++ b/Fwk/AppFwk/cafViewer/CMakeLists.txt @@ -16,7 +16,8 @@ set(MOC_HEADER_FILES cafViewer.h) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets OpenGL) + REQUIRED Core Gui Widgets OpenGL +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -37,7 +38,8 @@ add_library( cafOpenGLWidget.h cafViewer.cpp cafViewer.h - ${MOC_SOURCE_FILES}) + ${MOC_SOURCE_FILES} +) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -49,11 +51,13 @@ target_link_libraries( LibRender LibGuiQt cafAnimControl - ${QT_LIBRARIES}) + ${QT_LIBRARIES} +) if(MSVC) - set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS - "/W4 /wd4100 /wd4127") + set_target_properties( + ${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/W4 /wd4100 /wd4127" + ) endif() source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafVizExtensions/CMakeLists.txt b/Fwk/AppFwk/cafVizExtensions/CMakeLists.txt index e1930b6de5..509082cd05 100644 --- a/Fwk/AppFwk/cafVizExtensions/CMakeLists.txt +++ b/Fwk/AppFwk/cafVizExtensions/CMakeLists.txt @@ -15,7 +15,8 @@ find_package(OpenGL) find_package( Qt5 COMPONENTS - REQUIRED Core Gui Widgets OpenGL) + REQUIRED Core Gui Widgets OpenGL +) set(QT_LIBRARIES Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) qt5_wrap_cpp(MOC_SOURCE_FILES ${MOC_HEADER_FILES}) @@ -49,7 +50,8 @@ add_library( TranspWB_PartlyTranspPartsFrag.glsl TranspWB_TransparentPartsFrag.glsl cafHexGridIntersectionTools/cafHexGridIntersectionTools.h - cafHexGridIntersectionTools/cafHexGridIntersectionTools.cpp) + cafHexGridIntersectionTools/cafHexGridIntersectionTools.cpp +) target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) @@ -61,6 +63,7 @@ target_link_libraries( LibRender LibGuiQt CommonCode - ${QT_LIBRARIES}) + ${QT_LIBRARIES} +) source_group("" FILES ${PROJECT_FILES}) diff --git a/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.cpp b/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.cpp index c0734c9b21..329afc22de 100644 --- a/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.cpp +++ b/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.cpp @@ -5,6 +5,7 @@ #include "cvfDrawableGeo.h" #include "cvfGeometryBuilderFaceList.h" #include "cvfPrimitiveSetIndexedUInt.h" +#include "cvfStructGridGeometryGenerator.h" using namespace cvf; @@ -59,8 +60,9 @@ cvf::ref BoxManipulatorGeometryGenerator::createBoundingBoxMes cvf::ref geo = new cvf::DrawableGeo; geo->setVertexArray( m_vertices.p() ); - cvf::ref indices = lineIndicesFromQuadVertexArray( m_vertices.p() ); - cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); + cvf::ref indices = cvf::StructGridGeometryGenerator::lineIndicesFromQuadVertexArray( m_vertices.p() ); + + cvf::ref prim = new cvf::PrimitiveSetIndexedUInt( cvf::PT_LINES ); prim->setIndices( indices.p() ); geo->addPrimitiveSet( prim.p() ); @@ -88,35 +90,4 @@ void BoxManipulatorGeometryGenerator::calculateArrays() // TODO: Rotate generated vertices } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -cvf::ref BoxManipulatorGeometryGenerator::lineIndicesFromQuadVertexArray( const cvf::Vec3fArray* vertexArray ) -{ - CVF_ASSERT( vertexArray ); - - size_t numVertices = vertexArray->size(); - int numQuads = static_cast( numVertices / 4 ); - CVF_ASSERT( numVertices % 4 == 0 ); - - cvf::ref indices = new cvf::UIntArray; - indices->resize( numQuads * 8 ); - -#pragma omp parallel for - for ( int i = 0; i < numQuads; i++ ) - { - int idx = 8 * i; - indices->set( idx + 0, i * 4 + 0 ); - indices->set( idx + 1, i * 4 + 1 ); - indices->set( idx + 2, i * 4 + 1 ); - indices->set( idx + 3, i * 4 + 2 ); - indices->set( idx + 4, i * 4 + 2 ); - indices->set( idx + 5, i * 4 + 3 ); - indices->set( idx + 6, i * 4 + 3 ); - indices->set( idx + 7, i * 4 + 0 ); - } - - return indices; -} - } // namespace caf diff --git a/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.h b/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.h index ae1f0f5a66..53bd363ef0 100644 --- a/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.h +++ b/Fwk/AppFwk/cafVizExtensions/cafBoxManipulatorGeometryGenerator.h @@ -32,8 +32,6 @@ class BoxManipulatorGeometryGenerator : public cvf::Object private: void calculateArrays(); - static cvf::ref lineIndicesFromQuadVertexArray( const cvf::Vec3fArray* vertexArray ); - private: cvf::Vec3d m_origin; cvf::Vec3d m_size; diff --git a/Fwk/AppFwk/cafVizExtensions/cafHexGridIntersectionTools/cafHexGridIntersectionTools_UnitTest/CMakeLists.txt b/Fwk/AppFwk/cafVizExtensions/cafHexGridIntersectionTools/cafHexGridIntersectionTools_UnitTest/CMakeLists.txt index d8dede727a..4838dcce1d 100644 --- a/Fwk/AppFwk/cafVizExtensions/cafHexGridIntersectionTools/cafHexGridIntersectionTools_UnitTest/CMakeLists.txt +++ b/Fwk/AppFwk/cafVizExtensions/cafHexGridIntersectionTools/cafHexGridIntersectionTools_UnitTest/CMakeLists.txt @@ -21,7 +21,8 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR} # required for gtest-all.cpp set(PROJECT_FILES cafHexGridIntersectionToolsBasicTests.cpp cafHexGridIntersectionTools_UnitTests_main.cpp - ../cafHexGridIntersectionTools.cpp ../cafHexGridIntersectionTools.h) + ../cafHexGridIntersectionTools.cpp ../cafHexGridIntersectionTools.h +) # add the executable add_executable(${PROJECT_NAME} ${PROJECT_FILES} gtest/gtest-all.cpp) diff --git a/Fwk/AppFwk/cafVizExtensions/cafOverlayScaleLegend.cpp b/Fwk/AppFwk/cafVizExtensions/cafOverlayScaleLegend.cpp index ad75624d39..0aa86b39c6 100644 --- a/Fwk/AppFwk/cafVizExtensions/cafOverlayScaleLegend.cpp +++ b/Fwk/AppFwk/cafVizExtensions/cafOverlayScaleLegend.cpp @@ -731,6 +731,9 @@ void OverlayScaleLegend::updateFromCamera( const Camera* camera ) windowMaxInDomain = m_dispalyCoordsTransform->transformToDomainCoord( windowMaxInDomain ); } + // For extreme zoom factors we might end up with both variables as zero. Return to avoid divide by zero. + if ( windowMaxInDomain == windowOrigoInDomain ) return; + Vec3d windowOrigoPoint; Vec3d windowMaxPoint; camera->project( windowOrigoInDomain, &windowOrigoPoint ); diff --git a/GrpcInterface/GrpcProtos/App.proto b/GrpcInterface/GrpcProtos/App.proto index 2778ec5550..8bf88cbc5b 100644 --- a/GrpcInterface/GrpcProtos/App.proto +++ b/GrpcInterface/GrpcProtos/App.proto @@ -3,11 +3,13 @@ syntax = "proto3"; package rips; import "Definitions.proto"; +import "PdmObject.proto"; service App { rpc GetVersion(Empty) returns (Version) {} rpc Exit(Empty) returns (Empty) {} rpc GetRuntimeInfo(Empty) returns (RuntimeInfo) {} + rpc GetPdmObject(Empty) returns (PdmObject) {} } message Version { diff --git a/GrpcInterface/GrpcProtos/Commands.proto b/GrpcInterface/GrpcProtos/Commands.proto index 746a912d26..604d927fed 100644 --- a/GrpcInterface/GrpcProtos/Commands.proto +++ b/GrpcInterface/GrpcProtos/Commands.proto @@ -21,6 +21,7 @@ service Commands message FilePathRequest { string path = 1; + bool gridOnly = 2; } message ReplaceCaseRequest diff --git a/GrpcInterface/Python/doc/README_DOCUMENTATION.txt b/GrpcInterface/Python/doc/README_DOCUMENTATION.txt index 85832119f1..e6bde98b7a 100644 --- a/GrpcInterface/Python/doc/README_DOCUMENTATION.txt +++ b/GrpcInterface/Python/doc/README_DOCUMENTATION.txt @@ -1,7 +1,3 @@ -You need sphinx to update the documentation. - -pip install sphinx sphinx-markdown-builder - -To update run "make markdown" to update to reflect changes to the python code. -The generated files are located in build/markdown +The documentation is moved to +https://github.com/OPM/ResInsight-UserDocumentation/tree/master/docs \ No newline at end of file diff --git a/GrpcInterface/Python/doc/make.bat b/GrpcInterface/Python/doc/make.bat deleted file mode 100644 index 9534b01813..0000000000 --- a/GrpcInterface/Python/doc/make.bat +++ /dev/null @@ -1,35 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/GrpcInterface/Python/doc/make_and_copy.bat b/GrpcInterface/Python/doc/make_and_copy.bat deleted file mode 100644 index 665d65bedc..0000000000 --- a/GrpcInterface/Python/doc/make_and_copy.bat +++ /dev/null @@ -1,39 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=source -set BUILDDIR=build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd - -REM Copy files to deployment folder using second parameter -REM Example "d:\gitroot\ResInsight-UserDocumentation\content\scripting" -xcopy /Y build\markdown %2 \ No newline at end of file diff --git a/GrpcInterface/Python/doc/source/PythonExamples.rst b/GrpcInterface/Python/doc/source/PythonExamples.rst deleted file mode 100644 index b23e5735df..0000000000 --- a/GrpcInterface/Python/doc/source/PythonExamples.rst +++ /dev/null @@ -1,134 +0,0 @@ -+++ -title = "Python Examples" -published = true -weight = 40 -+++ - -![]({{< relref "" >}}images/scripting/python-logo-master-v3-TM.png) - -This pages is created based on the content in the **PythonExamples** folder located inside the **rips** module, made available online for convenience. - - -AllCases --------- -.. literalinclude:: ../../rips/PythonExamples/all_cases.py - -AllSimulationWells ------------------- -.. literalinclude:: ../../rips/PythonExamples/all_simulation_wells.py - -AllWells --------- -.. literalinclude:: ../../rips/PythonExamples/all_wells.py - -AlterWbsPlot ------------- -.. literalinclude:: ../../rips/PythonExamples/alter_wbs_plot.py - -CaseGridGroup -------------- -.. literalinclude:: ../../rips/PythonExamples/case_grid_group.py - -CaseInfoStreamingExample ------------------------- -.. literalinclude:: ../../rips/PythonExamples/case_info_streaming_example.py - -CellResultData --------------- -.. literalinclude:: ../../rips/PythonExamples/cell_result_data.py - -CommandExample --------------- -.. literalinclude:: ../../rips/PythonExamples/command_example.py - -Create WBS Plot ---------------- -.. literalinclude:: ../../rips/PythonExamples/create_wbs_plot.py - -ErrorHandling -------------- -.. literalinclude:: ../../rips/PythonExamples/error_handling.py - -ExportContourMaps ------------------ -.. literalinclude:: ../../rips/PythonExamples/export_contour_maps.py - -ExportPlots ------------ -.. literalinclude:: ../../rips/PythonExamples/export_plots.py - -ExportSnapshots ---------------- -.. literalinclude:: ../../rips/PythonExamples/export_snapshots.py - -GridInformation ---------------- -.. literalinclude:: ../../rips/PythonExamples/grid_information.py - -Import Well Paths ------------------ -.. literalinclude:: ../../rips/PythonExamples/import_well_paths_and_logs.py - -InputPropTestAsync ------------------- -.. literalinclude:: ../../rips/PythonExamples/input_prop_test_async.py - -InputPropTestSync ------------------ -.. literalinclude:: ../../rips/PythonExamples/input_prop_test_sync.py - -InstanceExample ---------------- -.. literalinclude:: ../../rips/PythonExamples/instance_example.py - -LaunchWithCommandLineOptions ----------------------------- -.. literalinclude:: ../../rips/PythonExamples/launch_with_commandline_options.py - -Launch Using Command Line Options ---------------------------------- -.. literalinclude:: ../../rips/PythonExamples/launch_with_commandline_options.py - -NewSummaryPlot --------------- -.. literalinclude:: ../../rips/PythonExamples/new_summary_plot.py - -SelectedCases -------------- -.. literalinclude:: ../../rips/PythonExamples/selected_cases.py - -SelectedCells -------------- -.. literalinclude:: ../../rips/PythonExamples/selected_cells.py - -SetCellResult -------------- -.. literalinclude:: ../../rips/PythonExamples/set_cell_result.py - -SetFlowDiagnosticsResult ------------------------- -.. literalinclude:: ../../rips/PythonExamples/set_flow_diagnostics_result.py - -SetGridProperties ------------------ -.. literalinclude:: ../../rips/PythonExamples/set_grid_properties.py - -SoilAverageAsync ----------------- -.. literalinclude:: ../../rips/PythonExamples/soil_average_async.py - -SoilAverageSync ---------------- -.. literalinclude:: ../../rips/PythonExamples/soil_average_sync.py - -SoilPorvAsync -------------- -.. literalinclude:: ../../rips/PythonExamples/soil_porv_async.py - -SoilPorvSync ------------- -.. literalinclude:: ../../rips/PythonExamples/soil_porv_sync.py - -ViewExample ------------ -.. literalinclude:: ../../rips/PythonExamples/view_example.py diff --git a/GrpcInterface/Python/doc/source/PythonRips.rst b/GrpcInterface/Python/doc/source/PythonRips.rst deleted file mode 100644 index 9dda44cfd8..0000000000 --- a/GrpcInterface/Python/doc/source/PythonRips.rst +++ /dev/null @@ -1,9 +0,0 @@ -+++ -title = "Python API - rips" -published = true -weight = 42 -+++ - -![]({{< relref "" >}}images/scripting/python-logo-master-v3-TM.png) - -.. include:: rips.rst \ No newline at end of file diff --git a/GrpcInterface/Python/doc/source/conf.py b/GrpcInterface/Python/doc/source/conf.py deleted file mode 100644 index f819fda314..0000000000 --- a/GrpcInterface/Python/doc/source/conf.py +++ /dev/null @@ -1,64 +0,0 @@ -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# http://www.sphinx-doc.org/en/master/config - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys - -sys.path.insert(0, os.path.abspath("../../")) - - -# -- Project information ----------------------------------------------------- - -project = "rips" -copyright = "2019, Ceetron Solutions AS" -author = "Ceetron Solutions AS" - -# The full version, including alpha/beta/rc tags -release = "2019.04.01" - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = ["sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx_markdown_builder"] - -master_doc = "PythonRips" - -napoleon_google_docstring = True - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["build/*", "rips.rst"] - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = "alabaster" - -smartquotes = False - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["_static"] - - -# -- Extension configuration ------------------------------------------------- diff --git a/GrpcInterface/Python/doc/source/rips.rst b/GrpcInterface/Python/doc/source/rips.rst deleted file mode 100644 index ea068c7c53..0000000000 --- a/GrpcInterface/Python/doc/source/rips.rst +++ /dev/null @@ -1,113 +0,0 @@ -Instance Module -=============== - -.. autoclass:: rips.instance.Instance - :members: - -Example -------- - -.. literalinclude:: ../../rips/PythonExamples/instance_example.py - :language: python - :lines: 5- - :emphasize-lines: 3 - -Case Module -=========== -.. autoclass:: rips.case.Case - :members: - -Example -------- - -.. literalinclude:: ../../rips/PythonExamples/all_cases.py - :language: python - :lines: 5- - :emphasize-lines: 5 - -Contour Map Module -================== - -.. autoclass:: rips.contour_map.EclipseContourMap - :members: - -.. autoclass:: rips.contour_map.GeoMechContourMap - :members: - -Grid Module -=========== - -.. autoclass:: rips.grid.Grid - :members: - -Example -------- -.. code-block:: python - - case = rips_instance.project.loadCase(path=casePath) - print (case.gridCount()) - if case.gridCount() > 0: - grid = case.grid(index=0) - dimensions = grid.dimensions() - print(dimensions.i) - print(dimensions.j) - print(dimensions.k) - -GridCaseGroup Module -==================== - -.. autoclass:: rips.gridcasegroup.GridCaseGroup - :members: - - -Plot Module -============== - -.. autoclass:: rips.project.Plot - :members: - -Project Module -============== - -.. autoclass:: rips.project.Project - :members: - - -Simulation Well Module -====================== - -.. autoclass:: rips.simulation_well.SimulationWell - :members: - -View Module -=========== - -.. autoclass:: rips.view.View - :members: - -Well Log Plot Module -==================== - -.. autoclass:: rips.well_log_plot.WellLogPlot - :members: - -Synchronous Example -------------------- -Read two properties, multiply them together and push the results back to ResInsight in a naïve way, by reading PORO into a list, then reading PERMX into a list, then multiplying them both in a resulting list and finally transferring back the list. - -This is slow and inefficient, but works. - -.. literalinclude:: ../../rips/PythonExamples/input_prop_test_async.py - :language: python - :lines: 5- - -Asynchronous Example --------------------- -Read two properties at the same time chunk by chunk, multiply each chunk together and start transferring the result back to ResInsight as soon as the chunk is finished. - -This is far more efficient. - -.. literalinclude:: ../../rips/PythonExamples/input_prop_test_sync.py - :language: python - :lines: 5- - diff --git a/GrpcInterface/Python/rips/PythonExamples/create_and_export_stim_plan_model.py b/GrpcInterface/Python/rips/PythonExamples/create_and_export_stim_plan_model.py index cca0409be5..a5eb1327d9 100644 --- a/GrpcInterface/Python/rips/PythonExamples/create_and_export_stim_plan_model.py +++ b/GrpcInterface/Python/rips/PythonExamples/create_and_export_stim_plan_model.py @@ -28,7 +28,7 @@ # Create stim plan model template fmt_collection = project.descendants(rips.StimPlanModelTemplateCollection)[0] -stim_plan_model_template = fmt_collection.new_stim_plan_model_template( +stim_plan_model_template = fmt_collection.append_stim_plan_model_template( eclipse_case=case, time_step=time_step, elastic_properties_file_path=elastic_properties_file_path, @@ -84,7 +84,7 @@ for measured_depth in measured_depths: # Create stim plan model at a give measured depth - stim_plan_model = stim_plan_model_collection.new_stim_plan_model( + stim_plan_model = stim_plan_model_collection.append_stim_plan_model( well_path=well_path, measured_depth=measured_depth, stim_plan_model_template=stim_plan_model_template, @@ -107,7 +107,7 @@ stim_plan_model_plot_collection = project.descendants( rips.StimPlanModelPlotCollection )[0] - stim_plan_model_plot = stim_plan_model_plot_collection.new_stim_plan_model_plot( + stim_plan_model_plot = stim_plan_model_plot_collection.append_stim_plan_model_plot( stim_plan_model=stim_plan_model ) diff --git a/GrpcInterface/Python/rips/PythonExamples/export_snapshots.py b/GrpcInterface/Python/rips/PythonExamples/export_snapshots.py index 1acb77ef18..8d12013312 100644 --- a/GrpcInterface/Python/rips/PythonExamples/export_snapshots.py +++ b/GrpcInterface/Python/rips/PythonExamples/export_snapshots.py @@ -36,11 +36,10 @@ print("Number of time_steps: " + str(len(time_steps))) for view in case.views(): - if view.is_eclipse_view(): - for property in property_list: - view.apply_cell_result( - result_type="DYNAMIC_NATIVE", result_variable=property - ) + for property in property_list: + view.apply_cell_result( + result_type="DYNAMIC_NATIVE", result_variable=property + ) for time_step in range(0, len(time_steps), 10): view.set_time_step(time_step=time_step) view.export_snapshot() diff --git a/GrpcInterface/Python/rips/PythonExamples/export_well_path_completions.py b/GrpcInterface/Python/rips/PythonExamples/export_well_path_completions.py new file mode 100644 index 0000000000..e9586ea0a1 --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/export_well_path_completions.py @@ -0,0 +1,23 @@ +############################################################################ +# This script will export completions for a well path for all cases in the project +# +############################################################################ + +import os +import rips + +# Load instance +resinsight = rips.Instance.find() +cases = resinsight.project.cases() + +for case in cases: + print("Case name: ", case.name) + print("Case id: ", case.id) + + case.export_well_path_completions( + time_step=0, + well_path_names=["Well-1"], + file_split="UNIFIED_FILE", + include_perforations=True, + custom_file_name="d:/scratch/well_path_export/myfile.myext", + ) diff --git a/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_of_well_logs.py b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_of_well_logs.py new file mode 100644 index 0000000000..8004099e63 --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_of_well_logs.py @@ -0,0 +1,87 @@ +# Load ResInsight Processing Server Client Library +import rips +import tempfile +from os.path import expanduser +from pathlib import Path + +# Connect to ResInsight instance +resinsight = rips.Instance.find() + + +home_dir = expanduser("~") + + +properties = [ + ("STATIC_NATIVE", "INDEX_K", 0), + ("STATIC_NATIVE", "PORO", 0), + ("STATIC_NATIVE", "PERMX", 0), + ("DYNAMIC_NATIVE", "PRESSURE", 0), +] + +export_folder = tempfile.mkdtemp() + +directory_path = "resprojects/webviz-subsurface-testdata/reek_history_match/" + + +case_file_paths = [] +num_realizations = 9 +num_iterations = 4 + + +for realization in range(0, num_realizations): + for iteration in range(0, num_iterations): + realization_dir = "realization-" + str(realization) + iteration_dir = "iter-" + str(iteration) + egrid_name = "eclipse/model/5_R001_REEK-" + str(realization) + ".EGRID" + path = Path( + home_dir, directory_path, realization_dir, iteration_dir, egrid_name + ) + case_file_paths.append(path) + +for path in case_file_paths: + # Load a case + path_name = path.as_posix() + grid_only = True + case = resinsight.project.load_case(path_name, grid_only) + + # Load some wells + well_paths = resinsight.project.import_well_paths( + well_path_files=[ + Path(home_dir, directory_path, "wellpaths", "Well-1.dev").as_posix(), + Path(home_dir, directory_path, "wellpaths", "Well-2.dev").as_posix(), + ] + ) + + if resinsight.project.has_warnings(): + for warning in resinsight.project.warnings(): + print(warning) + + well_log_plot_collection = resinsight.project.descendants( + rips.WellLogPlotCollection + )[0] + + for well_path in well_paths: + print( + "Generating las file for well: " + well_path.name + " in case: " + path_name + ) + + well_log_plot = well_log_plot_collection.new_well_log_plot(case, well_path) + + # Create a track for each property + for (prop_type, prop_name, time_step) in properties: + track = well_log_plot.new_well_log_track( + "Track: " + prop_name, case, well_path + ) + + c = track.add_extraction_curve( + case, well_path, prop_type, prop_name, time_step + ) + + parent_path = path.parent + export_folder_path = Path(parent_path, "lasexport") + export_folder_path.mkdir(parents=True, exist_ok=True) + + export_folder = export_folder_path.as_posix() + well_log_plot.export_data_as_las(export_folder=export_folder) + + resinsight.project.close() diff --git a/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface.py b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface.py new file mode 100644 index 0000000000..e301aca8df --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface.py @@ -0,0 +1,63 @@ +# Load ResInsight Processing Server Client Library +import rips +import tempfile +from os.path import expanduser +from pathlib import Path + +# Connect to ResInsight instance +resinsight = rips.Instance.find() + + +home_dir = expanduser("~") + +export_folder = tempfile.mkdtemp() + +directory_path = "resprojects/webviz-subsurface-testdata/reek_history_match/" +# directory_path = "e:/gitroot/webviz-subsurface-testdata/reek_history_match" + + +case_file_paths = [] +num_realizations = 9 +num_iterations = 4 + + +for realization in range(0, num_realizations): + for iteration in range(0, num_iterations): + realization_dir = "realization-" + str(realization) + iteration_dir = "iter-" + str(iteration) + egrid_name = "eclipse/model/5_R001_REEK-" + str(realization) + ".EGRID" + path = Path( + home_dir, directory_path, realization_dir, iteration_dir, egrid_name + ) + case_file_paths.append(path) + +k_indexes = [4, 10] + +for path in case_file_paths: + # Load a case + path_name = path.as_posix() + case = resinsight.project.load_case(path_name) + + if resinsight.project.has_warnings(): + for warning in resinsight.project.warnings(): + print(warning) + + surface_collection = resinsight.project.descendants(rips.SurfaceCollection)[0] + + for k_index in k_indexes: + print("Generating surface K layer " + str(k_index) + " for case " + path_name) + + surface = surface_collection.new_surface(case, k_index) + print("Surface: ", surface) + + parent_path = path.parent + export_folder_path = Path(parent_path, "surfaceexport") + export_folder_path.mkdir(parents=True, exist_ok=True) + + export_file = Path(export_folder_path, "surf_" + str(k_index) + ".ts") + print("Exporting to " + export_file.as_posix()) + surface.export_to_file(export_file.as_posix()) + + # Close project to avoid aggregated memory usage + # Can be replaced when case.close() is implemented + resinsight.project.close() diff --git a/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface_optimized.py b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface_optimized.py new file mode 100644 index 0000000000..388221786d --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/generate_ensemble_surface_optimized.py @@ -0,0 +1,41 @@ +# Load ResInsight Processing Server Client Library +import rips +import tempfile +from os.path import expanduser +from pathlib import Path + +# Connect to ResInsight instance +resinsight = rips.Instance.find() + + +home_dir = expanduser("~") + +export_folder = tempfile.mkdtemp() + +directory_path = "resprojects/webviz-subsurface-testdata/reek_history_match/" +# directory_path = "e:/gitroot/webviz-subsurface-testdata/reek_history_match" + + +case_file_paths = [] +num_realizations = 9 +num_iterations = 4 + + +for realization in range(0, num_realizations): + for iteration in range(0, num_iterations): + realization_dir = "realization-" + str(realization) + iteration_dir = "iter-" + str(iteration) + egrid_name = "eclipse/model/5_R001_REEK-" + str(realization) + ".EGRID" + path = Path( + home_dir, directory_path, realization_dir, iteration_dir, egrid_name + ) + case_file_paths.append(path) + +k_indexes = [4, 10] + +command_router = resinsight.command_router + +for path in case_file_paths: + path_name = path.as_posix() + + command_router.extract_surfaces(path_name, k_indexes) diff --git a/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py b/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py new file mode 100644 index 0000000000..cc3b33c12f --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/import_fractures_on_well.py @@ -0,0 +1,47 @@ +# Load ResInsight Processing Server Client Library +import rips +import tempfile +from os.path import expanduser +from pathlib import Path + +# Connect to ResInsight instance +resinsight = rips.Instance.find() +project = resinsight.project + +# Look for input files in the home directory of the user +home_dir = expanduser("~") +stim_plan_file_path = (Path(home_dir) / "contour.xml").as_posix() +print("StimPlan contour file path:", stim_plan_file_path) + +# Find a case +cases = resinsight.project.cases() +case = cases[0] + +# Create stim plan template +fmt_collection = project.descendants(rips.FractureTemplateCollection)[0] +fracture_template = fmt_collection.append_fracture_template( + file_path=stim_plan_file_path +) + +well_name = "B-2 H" + +# Find a well +well_path = project.well_path_by_name(well_name) +print("well path:", well_path.name) + +# Place fracture at given depths +measured_depths = [3200.0, 3400.0, 3600.0] +for measured_depth in measured_depths: + + print("Placing fracture at {} depth (MD)".format(measured_depth)) + # Create stim plan at a give measured depth + fracture = well_path.add_fracture( + measured_depth=measured_depth, + stim_plan_fracture_template=fracture_template, + ) + +# Update the orientation of the fracture +# Call update() to propagate changes from the Python object back to ResInsight +fracture_template.orientation = "Azimuth" +fracture_template.azimuth_angle = 60.0 +fracture_template.update() diff --git a/GrpcInterface/Python/rips/PythonExamples/load_case.py b/GrpcInterface/Python/rips/PythonExamples/load_case.py index 7652992898..002a601e84 100644 --- a/GrpcInterface/Python/rips/PythonExamples/load_case.py +++ b/GrpcInterface/Python/rips/PythonExamples/load_case.py @@ -17,6 +17,7 @@ test_models_path, "TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID" ) case = resinsight.project.load_case(path_name) +case.create_view() # Print out lots of information from the case object print("Case id: " + str(case.id)) diff --git a/GrpcInterface/Python/rips/PythonExamples/modeled_well_path.py b/GrpcInterface/Python/rips/PythonExamples/modeled_well_path.py index 757bf34001..134a34f81c 100644 --- a/GrpcInterface/Python/rips/PythonExamples/modeled_well_path.py +++ b/GrpcInterface/Python/rips/PythonExamples/modeled_well_path.py @@ -3,15 +3,32 @@ # Connect to ResInsight instance resinsight = rips.Instance.find() -# Example code -print("ResInsight version: " + resinsight.version_string()) - -modeled_well_paths = resinsight.project.descendants(rips.ModeledWellPath) - -for wellpath in modeled_well_paths: - geometry = wellpath.well_path_geometry() - geometry.print_object_info() - reference_point = geometry.reference_point - reference_point[0] += 100 - geometry.update() - geometry.print_object_info() + +# Create a modeled well path and add well path targets +# The coordinates are based on the Norne case + +well_path_coll = resinsight.project.descendants(rips.WellPathCollection)[0] +well_path = well_path_coll.add_new_object(rips.ModeledWellPath) +well_path.name = "Test Well-1" +well_path.update() + +geometry = well_path.well_path_geometry() + +reference_point = geometry.reference_point +reference_point[0] = 457196 +reference_point[1] = 7322270 +reference_point[2] = 2742 +geometry.update() # Commit updates back to ResInsight + +# Create the first well target at the reference point +coord = [0, 0, 0] +geometry.append_well_target(coord) + +# Append new well targets relative the the reference point +coord = [454.28, 250, -10] +target = geometry.append_well_target(coord) + +coord = [1054.28, 250, -50] +target = geometry.append_well_target(coord) + +well_path.append_perforation_interval(3300, 3350, 0.2, 0.76) diff --git a/GrpcInterface/Python/rips/PythonExamples/modeled_well_path_lateral.py b/GrpcInterface/Python/rips/PythonExamples/modeled_well_path_lateral.py new file mode 100644 index 0000000000..3200a2156c --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/modeled_well_path_lateral.py @@ -0,0 +1,59 @@ +# Load ResInsight Processing Server Client Library +import rips +import time + +# Connect to ResInsight instance +resinsight = rips.Instance.find() + +# Create a modeled well path and add well path targets +# The coordinates are based on the Norne case +# Add a lateral to the main well path + +well_path_coll = resinsight.project.descendants(rips.WellPathCollection)[0] +well_path = well_path_coll.add_new_object(rips.ModeledWellPath) +well_path.name = "Test Well-1" +well_path.update() + +geometry = well_path.well_path_geometry() + +reference_point = geometry.reference_point +reference_point[0] = 457196 +reference_point[1] = 7322270 +reference_point[2] = 2742 +geometry.update() # Commit updates back to ResInsight + +# Create the first well target at the reference point +coord = [0, 0, 0] +geometry.append_well_target(coord) + +# Append new well targets relative the the reference point +coord = [454.28, 250, -10] +target = geometry.append_well_target(coord) + +coord = [1054.28, 250, -50] +target = geometry.append_well_target(coord) + +# Create a lateral at specified location on parent well +measured_depth = 3600 +lateral = well_path.append_lateral(measured_depth) +geometry = lateral.well_path_geometry() + +coord = [770, 280, 50] +target = geometry.append_well_target(coord) + +coord = [1054.28, -100, 50] +target = geometry.append_well_target(coord) + +coord = [2054.28, -100, 45] +target = geometry.append_well_target(coord) + + +# Wait 2 second +print("Wait 2 seconds ...") +time.sleep(2) +print("Move reference point of parent well") + +geometry = well_path.well_path_geometry() +reference_point = geometry.reference_point +reference_point[2] += 50 +geometry.update() # Commit updates back to ResInsight diff --git a/GrpcInterface/Python/rips/PythonExamples/save_project.py b/GrpcInterface/Python/rips/PythonExamples/save_project.py new file mode 100644 index 0000000000..68f1ee3fa8 --- /dev/null +++ b/GrpcInterface/Python/rips/PythonExamples/save_project.py @@ -0,0 +1,25 @@ +# Access to environment variables and path tools +import os + +# Load ResInsight Processing Server Client Library +import rips + +# Connect to ResInsight instance +resinsight = rips.Instance.find() + +# This requires the TestModels to be installed with ResInsight (RESINSIGHT_BUNDLE_TESTMODELS): +resinsight_exe_path = os.environ.get("RESINSIGHT_EXECUTABLE") + +# Get the TestModels path from the executable path +resinsight_install_path = os.path.dirname(resinsight_exe_path) +test_models_path = os.path.join(resinsight_install_path, "TestModels") +path_name = os.path.join( + test_models_path, "TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID" +) +case = resinsight.project.load_case(path_name) + +# Save the project to file +home_dir = os.path.expanduser("~") +project_path = home_dir + "/new-project.rsp" +print("Saving project to: ", project_path) +resinsight.project.save(project_path) diff --git a/GrpcInterface/Python/rips/example_input_files/elastic-property-scaling.csv b/GrpcInterface/Python/rips/example_input_files/elastic-property-scaling.csv new file mode 100644 index 0000000000..133cf51018 --- /dev/null +++ b/GrpcInterface/Python/rips/example_input_files/elastic-property-scaling.csv @@ -0,0 +1,3 @@ +formation;facies;property;scale +Tilje;Calcite;YOUNGS_MODULUS;2.1 +Garn;Calcite;YOUNGS_MODULUS;4.1 diff --git a/GrpcInterface/Python/rips/instance.py b/GrpcInterface/Python/rips/instance.py index cc6fe76e18..c598530213 100644 --- a/GrpcInterface/Python/rips/instance.py +++ b/GrpcInterface/Python/rips/instance.py @@ -23,6 +23,7 @@ from .project import Project from .retry_policy import ExponentialBackoffRetryPolicy from .grpc_retry_interceptor import RetryOnRpcErrorClientInterceptor +from .generated.generated_classes import CommandRouter class Instance: @@ -202,12 +203,17 @@ def __init__(self, port=50051, launched=False): intercepted_channel = grpc.intercept_channel(self.channel, *interceptors) - # Recreate ommand stubs with the retry policy + # Recreate command stubs with the retry policy self.commands = Commands_pb2_grpc.CommandsStub(intercepted_channel) # Service packages self.project = Project.create(intercepted_channel) + # Command Router object used as entry point for independent processing functions + self.command_router = CommandRouter( + self.app.GetPdmObject(Empty()), intercepted_channel + ) + path = os.getcwd() self.set_start_dir(path=path) diff --git a/GrpcInterface/Python/rips/project.py b/GrpcInterface/Python/rips/project.py index 054b0e24bc..408d2f066b 100644 --- a/GrpcInterface/Python/rips/project.py +++ b/GrpcInterface/Python/rips/project.py @@ -62,7 +62,7 @@ def close(self): @add_method(Project) -def load_case(self, path): +def load_case(self, path, grid_only=False): """Load a new grid case from the given file path Arguments: @@ -71,7 +71,7 @@ def load_case(self, path): :class:`rips.generated.generated_classes.Case` """ command_reply = self._execute_command( - loadCase=Commands_pb2.FilePathRequest(path=path) + loadCase=Commands_pb2.FilePathRequest(path=path, gridOnly=grid_only) ) return self.case(command_reply.loadCaseResult.id) diff --git a/GrpcInterface/Python/rips/tests/test_properties.py b/GrpcInterface/Python/rips/tests/test_properties.py index 4fb8647a9f..18224dd10a 100644 --- a/GrpcInterface/Python/rips/tests/test_properties.py +++ b/GrpcInterface/Python/rips/tests/test_properties.py @@ -101,7 +101,8 @@ def test_10k_PoroPermX(rips_instance, initialize_test): def test_exportPropertyInView(rips_instance, initialize_test): case_path = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID" - rips_instance.project.load_case(case_path) + case = rips_instance.project.load_case(case_path) + case.create_view() with tempfile.TemporaryDirectory(prefix="rips") as tmpdirname: print("Temporary folder: ", tmpdirname) rips_instance.set_export_folder(export_type="PROPERTIES", path=tmpdirname) diff --git a/GrpcInterface/Python/rips/tests/test_simulation_wells.py b/GrpcInterface/Python/rips/tests/test_simulation_wells.py index 6ff8d65ba3..798d6e78c1 100644 --- a/GrpcInterface/Python/rips/tests/test_simulation_wells.py +++ b/GrpcInterface/Python/rips/tests/test_simulation_wells.py @@ -10,6 +10,7 @@ def test_10k(rips_instance, initialize_test): case_path = dataroot.PATH + "/TEST10K_FLT_LGR_NNC/TEST10K_FLT_LGR_NNC.EGRID" case = rips_instance.project.load_case(path=case_path) + case.create_view() assert len(case.grids()) == 2 cell_count_info = case.cell_count() diff --git a/GrpcInterface/Python/rips/tests/test_summary_cases.py b/GrpcInterface/Python/rips/tests/test_summary_cases.py index b80bf7d641..f83ba55b05 100644 --- a/GrpcInterface/Python/rips/tests/test_summary_cases.py +++ b/GrpcInterface/Python/rips/tests/test_summary_cases.py @@ -37,9 +37,9 @@ def test_summary_data(rips_instance, initialize_test): assert summary_case.id == 1 addresses = summary_case.available_addresses() - # Summary reader type is controlled from Preferences. libecl reports 343 vectors, opm_common reports 361. + # Summary reader type is controlled from Preferences. libecl reports 343 vectors, opm_common (ESMRY) reports 310. # As this configuration can be different, allow both variants - assert len(addresses.values) == 343 or len(addresses.values) == 361 + assert len(addresses.values) == 343 or len(addresses.values) == 310 summary_data = summary_case.summary_vector_values("FOPT") assert len(summary_data.values) == 60 diff --git a/GrpcInterface/Python/rips/tests/test_surfaces.py b/GrpcInterface/Python/rips/tests/test_surfaces.py new file mode 100644 index 0000000000..96930cd599 --- /dev/null +++ b/GrpcInterface/Python/rips/tests/test_surfaces.py @@ -0,0 +1,34 @@ +import sys +import os +import tempfile +from pathlib import Path +import pytest + +sys.path.insert(1, os.path.join(sys.path[0], "../../")) +import rips + +import dataroot + + +@pytest.mark.skipif( + sys.platform.startswith("linux"), + reason="Brugge is currently exceptionally slow on Linux", +) +def test_create_and_export_surface(rips_instance, initialize_test): + case_path = dataroot.PATH + "/Case_with_10_timesteps/Real0/BRUGGE_0000.EGRID" + case = rips_instance.project.load_case(path=case_path) + assert len(case.grids()) == 1 + + surface_collection = rips_instance.project.descendants(rips.SurfaceCollection)[0] + + surface = surface_collection.new_surface(case, 5) + assert surface + + with tempfile.TemporaryDirectory(prefix="rips") as tmpdirname: + path = Path(tmpdirname, "mysurface.ts") + print("Temporary folder: ", path.as_posix()) + + fname = surface.export_to_file(path.as_posix()) + assert len(fname.values) == 1 + + assert path.exists() diff --git a/GrpcInterface/Python/rips/tests/test_wells_path_completions.py b/GrpcInterface/Python/rips/tests/test_wells_path_completions.py index e2ecf8b32b..3b8a95adbb 100644 --- a/GrpcInterface/Python/rips/tests/test_wells_path_completions.py +++ b/GrpcInterface/Python/rips/tests/test_wells_path_completions.py @@ -14,7 +14,6 @@ def test_10k(rips_instance, initialize_test): project = rips_instance.project.open(path=project_path) export_folder = tempfile.gettempdir() - # export_folder = "e:/temp/msj" rips_instance.set_export_folder(export_type="COMPLETIONS", path=export_folder) @@ -23,5 +22,4 @@ def test_10k(rips_instance, initialize_test): time_step=1, well_path_names=["Well-1"], file_split="UNIFIED_FILE", - custom_file_name="msj.jadda", ) diff --git a/GrpcInterface/RiaGrpcAppService.cpp b/GrpcInterface/RiaGrpcAppService.cpp index 17556b510e..5774e52e8e 100644 --- a/GrpcInterface/RiaGrpcAppService.cpp +++ b/GrpcInterface/RiaGrpcAppService.cpp @@ -22,6 +22,8 @@ #include "RiaGrpcServer.h" #include "RiaVersionInfo.h" +#include "ProjectDataModelCommands/CommandRouter/RimCommandRouter.h" + #include //-------------------------------------------------------------------------------------------------- @@ -51,7 +53,7 @@ grpc::Status RiaGrpcAppService::GetRuntimeInfo( grpc::ServerContext* context, const rips::Empty* request, rips::RuntimeInfo* reply ) { rips::ApplicationTypeEnum appType = rips::CONSOLE_APPLICATION; - if ( dynamic_cast(RiaApplication::instance())) + if ( dynamic_cast( RiaApplication::instance() ) ) { appType = rips::GUI_APPLICATION; } @@ -70,7 +72,24 @@ std::vector RiaGrpcAppService::createCallbacks() new RiaGrpcUnaryCallback( this, &Self::Exit, &Self::RequestExit ), new RiaGrpcUnaryCallback( this, &Self::GetRuntimeInfo, - &Self::RequestGetRuntimeInfo ) }; + &Self::RequestGetRuntimeInfo ), + new RiaGrpcUnaryCallback( this, + &Self::GetPdmObject, + &Self::RequestGetPdmObject ) }; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +grpc::Status + RiaGrpcAppService::GetPdmObject( grpc::ServerContext* context, const rips::Empty* request, rips::PdmObject* reply ) +{ + auto* commandRouter = RiaApplication::instance()->commandRouter(); + if ( commandRouter ) + { + copyPdmObjectFromCafToRips( commandRouter, reply ); + } + return grpc::Status::OK; } static bool RiaGrpcAppInfoService_init = diff --git a/GrpcInterface/RiaGrpcAppService.h b/GrpcInterface/RiaGrpcAppService.h index 286064fd07..54e5cefce3 100644 --- a/GrpcInterface/RiaGrpcAppService.h +++ b/GrpcInterface/RiaGrpcAppService.h @@ -46,4 +46,5 @@ class RiaGrpcAppService : public rips::App::AsyncService, public RiaGrpcServiceI grpc::Status Exit( grpc::ServerContext* context, const rips::Empty* request, rips::Empty* reply ) override; grpc::Status GetRuntimeInfo( grpc::ServerContext* context, const rips::Empty* request, rips::RuntimeInfo* reply ) override; std::vector createCallbacks() override; + grpc::Status GetPdmObject( grpc::ServerContext* context, const rips::Empty* request, rips::PdmObject* reply ) override; }; diff --git a/GrpcInterface/RiaGrpcPdmObjectService.cpp b/GrpcInterface/RiaGrpcPdmObjectService.cpp index c52af25c3d..2be5c99584 100644 --- a/GrpcInterface/RiaGrpcPdmObjectService.cpp +++ b/GrpcInterface/RiaGrpcPdmObjectService.cpp @@ -17,7 +17,10 @@ ////////////////////////////////////////////////////////////////////////////////// #include "RiaGrpcPdmObjectService.h" +#include "RiaApplication.h" #include "RiaGrpcCallbacks.h" + +#include "ProjectDataModelCommands/CommandRouter/RimCommandRouter.h" #include "Rim3dView.h" #include "RimEclipseResultDefinition.h" #include "RimProject.h" @@ -613,11 +616,13 @@ caf::PdmObject* RiaGrpcPdmObjectService::findCafObjectFromRipsObject( const rips caf::PdmObject* RiaGrpcPdmObjectService::findCafObjectFromScriptNameAndAddress( const QString& scriptClassName, uint64_t address ) { + QString classKeyword = caf::PdmObjectScriptingCapabilityRegister::classKeywordFromScriptClassName( scriptClassName ); + + if ( classKeyword == RimCommandRouter::classKeywordStatic() ) return RiaApplication::instance()->commandRouter(); + RimProject* project = RimProject::current(); std::vector objectsOfCurrentClass; - QString classKeyword = caf::PdmObjectScriptingCapabilityRegister::classKeywordFromScriptClassName( scriptClassName ); - project->descendantsIncludingThisFromClassKeyword( classKeyword, objectsOfCurrentClass ); caf::PdmObject* matchingObject = nullptr; diff --git a/GrpcInterface/RiaGrpcServiceInterface.cpp b/GrpcInterface/RiaGrpcServiceInterface.cpp index a91366ee57..896b66821d 100644 --- a/GrpcInterface/RiaGrpcServiceInterface.cpp +++ b/GrpcInterface/RiaGrpcServiceInterface.cpp @@ -15,7 +15,9 @@ // for more details. // ////////////////////////////////////////////////////////////////////////////////// + #include "RiaGrpcServiceInterface.h" +#include "RiaLogging.h" #include "RimCase.h" #include "RimProject.h" @@ -31,10 +33,12 @@ #include "cafPdmScriptIOMessages.h" #include "cafPdmXmlFieldHandle.h" +#include #include -#include +#include #include + //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- @@ -71,15 +75,39 @@ void RiaGrpcServiceInterface::copyPdmObjectFromCafToRips( const caf::PdmObjectHa CAF_ASSERT( source && destination && source->xmlCapability() ); QString classKeyword = source->xmlCapability()->classKeyword(); - QString scriptName = caf::PdmObjectScriptingCapabilityRegister::scriptClassNameFromClassKeyword( classKeyword ); - destination->set_class_keyword( scriptName.toStdString() ); + + QString scriptClassName; + + // Find first scriptable object in inheritance stack + { + auto pdmObject = dynamic_cast( source ); + auto classKeywordStack = pdmObject->classInheritanceStack(); + + // Reverse to get leaf node first + classKeywordStack.reverse(); + + for ( const auto& candidateClassKeyword : classKeywordStack ) + { + if ( caf::PdmObjectScriptingCapabilityRegister::isScriptable( candidateClassKeyword ) ) + { + scriptClassName = + caf::PdmObjectScriptingCapabilityRegister::scriptClassNameFromClassKeyword( candidateClassKeyword ); + + break; + } + } + + // Fallback to source object class name + if ( scriptClassName.isEmpty() ) scriptClassName = classKeyword; + } + + destination->set_class_keyword( scriptClassName.toStdString() ); destination->set_address( reinterpret_cast( source ) ); bool visible = true; if ( source->uiCapability() && source->uiCapability()->objectToggleField() ) { - const caf::PdmField* boolField = - dynamic_cast*>( source->uiCapability()->objectToggleField() ); + const auto* boolField = dynamic_cast*>( source->uiCapability()->objectToggleField() ); if ( boolField ) { visible = boolField->value(); @@ -122,8 +150,7 @@ void RiaGrpcServiceInterface::copyPdmObjectFromRipsToCaf( const rips::PdmObject* if ( destination->uiCapability() && destination->uiCapability()->objectToggleField() ) { - caf::PdmField* boolField = - dynamic_cast*>( destination->uiCapability()->objectToggleField() ); + auto* boolField = dynamic_cast*>( destination->uiCapability()->objectToggleField() ); if ( boolField ) { QVariant oldValue = boolField->toQVariant(); @@ -137,6 +164,18 @@ void RiaGrpcServiceInterface::copyPdmObjectFromRipsToCaf( const rips::PdmObject* destination->fields( fields ); auto parametersMap = source->parameters(); + + bool printContent = false; // Flag to control debug output to debugger + if ( printContent ) + { + for ( const auto& p : parametersMap ) + { + qDebug() << QString::fromStdString( p.first ) << " : " << QString::fromStdString( p.second ); + } + } + + caf::PdmScriptIOMessages messages; + for ( auto field : fields ) { auto scriptability = field->template capability(); @@ -152,32 +191,39 @@ void RiaGrpcServiceInterface::copyPdmObjectFromRipsToCaf( const rips::PdmObject* QString value = QString::fromStdString( parametersMap[keyword.toStdString()] ); QVariant oldValue, newValue; - if ( assignFieldValue( value, field, &oldValue, &newValue ) ) + messages.currentCommand = "Assign value to field " + keyword; + messages.currentArgument = value; + if ( assignFieldValue( value, field, &oldValue, &newValue, &messages ) ) { destination->uiCapability()->fieldChangedByUi( field, oldValue, newValue ); } } } + + for ( const auto message : messages.m_messages ) + { + RiaLogging::error( message.second ); + } } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -bool RiaGrpcServiceInterface::assignFieldValue( const QString& stringValue, - caf::PdmFieldHandle* field, - QVariant* oldValue, - QVariant* newValue ) +bool RiaGrpcServiceInterface::assignFieldValue( const QString& stringValue, + caf::PdmFieldHandle* field, + QVariant* oldValue, + QVariant* newValue, + caf::PdmScriptIOMessages* messages ) { CAF_ASSERT( oldValue && newValue ); auto scriptability = field->template capability(); if ( field && scriptability != nullptr ) { - caf::PdmValueField* valueField = dynamic_cast( field ); - QTextStream stream( stringValue.toLatin1() ); - caf::PdmScriptIOMessages messages; + auto* valueField = dynamic_cast( field ); + QTextStream stream( stringValue.toLatin1() ); if ( valueField ) *oldValue = valueField->toQVariant(); - scriptability->writeToField( stream, nullptr, &messages, false, RimProject::current() ); + scriptability->writeToField( stream, nullptr, messages, false, RimProject::current() ); if ( valueField ) *newValue = valueField->toQVariant(); return true; } diff --git a/GrpcInterface/RiaGrpcServiceInterface.h b/GrpcInterface/RiaGrpcServiceInterface.h index 997cb0f304..465733f86c 100644 --- a/GrpcInterface/RiaGrpcServiceInterface.h +++ b/GrpcInterface/RiaGrpcServiceInterface.h @@ -31,6 +31,7 @@ class PdmChildFieldHandle; class PdmFieldHandle; class PdmObject; class PdmObjectHandle; +class PdmScriptIOMessages; } // namespace caf namespace rips @@ -57,8 +58,11 @@ class RiaGrpcServiceInterface static void copyPdmObjectFromCafToRips( const caf::PdmObjectHandle* source, rips::PdmObject* destination ); static void copyPdmObjectFromRipsToCaf( const rips::PdmObject* source, caf::PdmObjectHandle* destination ); - static bool - assignFieldValue( const QString& stringValue, caf::PdmFieldHandle* field, QVariant* oldValue, QVariant* newValue ); + static bool assignFieldValue( const QString& stringValue, + caf::PdmFieldHandle* field, + QVariant* oldValue, + QVariant* newValue, + caf::PdmScriptIOMessages* messages ); static caf::PdmObjectHandle* emplaceChildField( caf::PdmObject* parent, const QString& fieldKeyword, const QString& keywordForClassToCreate ); diff --git a/ResInsightVersion.cmake b/ResInsightVersion.cmake index 88af727845..969919b124 100644 --- a/ResInsightVersion.cmake +++ b/ResInsightVersion.cmake @@ -1,17 +1,17 @@ set(RESINSIGHT_MAJOR_VERSION 2021) -set(RESINSIGHT_MINOR_VERSION 06) -set(RESINSIGHT_PATCH_VERSION 1) +set(RESINSIGHT_MINOR_VERSION 10) +set(RESINSIGHT_PATCH_VERSION 0) # Opional text with no restrictions -# set(RESINSIGHT_VERSION_TEXT "-dev") -set(RESINSIGHT_VERSION_TEXT "-RC_01") +#set(RESINSIGHT_VERSION_TEXT "-dev") +#set(RESINSIGHT_VERSION_TEXT "-RC_02") # Optional text # Must be unique and increasing within one combination of major/minor/patch version # The uniqueness of this text is independent of RESINSIGHT_VERSION_TEXT # Format of text must be ".xx" -# set(RESINSIGHT_DEV_VERSION ".11") +#set(RESINSIGHT_DEV_VERSION ".02") # https://github.com/CRAVA/crava/tree/master/libs/nrlib set(NRLIB_GITHUB_SHA "ba35d4359882f1c6f5e9dc30eb95fe52af50fd6f") diff --git a/ThirdParty/Ert/lib/ecl/ecl_grid.cpp b/ThirdParty/Ert/lib/ecl/ecl_grid.cpp index 6c5140dc12..c458846a9a 100644 --- a/ThirdParty/Ert/lib/ecl/ecl_grid.cpp +++ b/ThirdParty/Ert/lib/ecl/ecl_grid.cpp @@ -6369,8 +6369,9 @@ static bool ecl_grid_init_coord_section__( const ecl_grid_type * grid , int i, i const int top_index = ecl_grid_get_top_valid_index( grid , i , j ); const int bottom_index = ecl_grid_get_bottom_valid_index( grid , i , j ); - if (top_index == -1) - util_exit("% : no cell with a valid geometry description found in (i,j) = %d,%d - then what? \n",__func__ , i,j); + // util_exit("% : no cell with a valid geometry description found in (i,j) = %d,%d - then what? \n",__func__ , i,j); + // https://github.com/OPM/ResInsight/issues/7944 + if (top_index == -1) return false; { point_type top_point; diff --git a/ThirdParty/custom-opm-common/CMakeLists.txt b/ThirdParty/custom-opm-common/CMakeLists.txt index c97e496d2e..c1e0e3d2a9 100644 --- a/ThirdParty/custom-opm-common/CMakeLists.txt +++ b/ThirdParty/custom-opm-common/CMakeLists.txt @@ -16,7 +16,7 @@ endif() if(MSVC) add_definitions( "/wd4996 /wd4244 /wd4267" ) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP /permissive-") endif(MSVC) project (custom-opm-common) @@ -30,6 +30,9 @@ include_directories( generated-opm-common/include ) + add_definitions(-DFMT_HEADER_ONLY) + include_directories(SYSTEM ../fmtlib/include) + # Set defines to include requred files set(ENABLE_ECL_INPUT true) #set(ENABLE_ECL_OUTPUT true) @@ -79,6 +82,7 @@ add_library(${PROJECT_NAME} opm-common/src/opm/io/eclipse/EclUtil.cpp opm-common/src/opm/io/eclipse/EGrid.cpp opm-common/src/opm/io/eclipse/ESmry.cpp + opm-common/src/opm/io/eclipse/ExtESmry.cpp opm-common/src/opm/io/eclipse/EInit.cpp # Required for use of static function RstConnection::inverse_peaceman diff --git a/ThirdParty/custom-opm-common/opm-common/opm/common/utility/FileSystem.hpp b/ThirdParty/custom-opm-common/opm-common/opm/common/utility/FileSystem.hpp index 7e3285d555..2d05dfa4ae 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/common/utility/FileSystem.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/common/utility/FileSystem.hpp @@ -19,7 +19,8 @@ #ifndef OPM_FILESYSTEM_HPP #define OPM_FILESYSTEM_HPP -#if !defined(_WIN32) && (__cplusplus < 201703L || (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))) +#if !defined(_WIN32) && (__cplusplus < 201703L || \ + (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))) #include #else #include @@ -30,10 +31,14 @@ namespace Opm { -#if !defined(_WIN32) && (__cplusplus < 201703L || (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))) +#if !defined(_WIN32) && (__cplusplus < 201703L || \ + (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))) namespace filesystem = std::experimental::filesystem; + filesystem::path proximate(const filesystem::path& p, + const filesystem::path& base = filesystem::current_path()); #else namespace filesystem = std::filesystem; + using filesystem::proximate; #endif // A poor man's filesystem::unique_path diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EGrid.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EGrid.hpp index 856cd4baa1..6614120cfd 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EGrid.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EGrid.hpp @@ -48,6 +48,9 @@ class EGrid : public EclFile void getCellCorners(int globindex, std::array& X, std::array& Y, std::array& Z); void getCellCorners(const std::array& ijk, std::array& X, std::array& Y, std::array& Z); + std::vector> getXYZ_layer(int layer, bool bottom=false); + std::vector> getXYZ_layer(int layer, const std::array& box, bool bottom=false); + int activeCells() const { return nactive; } int totalNumberOfCells() const { return nijk[0] * nijk[1] * nijk[2]; } @@ -64,11 +67,17 @@ class EGrid : public EclFile const std::vector& list_of_lgrs() const { return lgr_names; } + const std::vector& get_mapaxes() const { return m_mapaxes; } + const std::string& get_mapunits() const { return m_mapunits; } + private: Opm::filesystem::path inputFileName, initFileName; std::string m_grid_name; bool m_radial; + std::vector m_mapaxes; + std::string m_mapunits; + std::array nijk; std::array host_nijk; @@ -93,6 +102,12 @@ class EGrid : public EclFile int actnum_array_index; int nnc1_array_index; int nnc2_array_index; + + std::vector get_zcorn_from_disk(int layer, bool bottom); + + void getCellCorners(const std::array& ijk, const std::vector& zcorn_layer, + std::array& X, std::array& Y, std::array& Z); + }; }} // namespace Opm::EclIO diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EInit.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EInit.hpp index 82b4afddcc..67fc2b04d3 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EInit.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EInit.hpp @@ -51,35 +51,7 @@ class EInit : public EclFile protected: template - const std::vector& ImplgetInitData(const std::string& name, const std::string& grid_name = "global") - { - int arr_ind = get_array_index(name, grid_name); - - if constexpr (std::is_same_v) - return getImpl(arr_ind, INTE, inte_array, "integer"); - - if constexpr (std::is_same_v) - return getImpl(arr_ind, REAL, real_array, "float"); - - if constexpr (std::is_same_v) - return getImpl(arr_ind, DOUB, doub_array, "double"); - - if constexpr (std::is_same_v) - return getImpl(arr_ind, LOGI, logi_array, "bool"); - - if constexpr (std::is_same_v) - { - if (array_type[arr_ind] == Opm::EclIO::CHAR) - return getImpl(arr_ind, array_type[arr_ind], char_array, "char"); - - if (array_type[arr_ind] == Opm::EclIO::C0NN) - return getImpl(arr_ind, array_type[arr_ind], char_array, "c0nn"); - - OPM_THROW(std::runtime_error, "Array not of type CHAR or C0nn"); - } - - OPM_THROW(std::runtime_error, "type not supported"); - } + const std::vector& ImplgetInitData(const std::string& name, const std::string& grid_name = "global"); private: std::array global_nijk; diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ERst.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ERst.hpp index cd29598843..c66d63b01c 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ERst.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ERst.hpp @@ -53,9 +53,6 @@ class ERst : public EclFile template const std::vector& getRestartData(const std::string& name, int reportStepNumber, int occurrence); - template - const std::vector& getRestartData(const std::string& name, int reportStepNumber, const std::string& lgr_name); - template const std::vector& getRestartData(int index, int reportStepNumber) { @@ -64,16 +61,10 @@ class ERst : public EclFile } template - const std::vector& getRestartData(int index, int reportStepNumber, const std::string& lgr_name) - { - auto indRange = this->getIndexRange(reportStepNumber); - - if ((std::get<0>(indRange) + index) > std::get<1>(indRange)) - OPM_THROW(std::invalid_argument, "getRestartData, index out of range"); + const std::vector& getRestartData(const std::string& name, int reportStepNumber, const std::string& lgr_name); - int start_ind = get_start_index_lgrname(reportStepNumber, lgr_name); - return this->get(index + start_ind); - } + template + const std::vector& getRestartData(int index, int reportStepNumber, const std::string& lgr_name); int occurrence_count(const std::string& name, int reportStepNumber) const; size_t numberOfReportSteps() const { return seqnum.size(); }; diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ESmry.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ESmry.hpp index 8105fda488..9f1b1a3d31 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ESmry.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ESmry.hpp @@ -35,15 +35,16 @@ namespace Opm { namespace EclIO { using ArrSourceEntry = std::tuple; using TimeStepEntry = std::tuple; +using RstEntry = std::tuple; class ESmry { public: // input is smspec (or fsmspec file) - explicit ESmry(const std::string& filename, bool loadBaseRunData=false, bool uselodsmry=false); + explicit ESmry(const std::string& filename, bool loadBaseRunData=false); - int numberOfVectors() const { return nVect; } + int numberOfVectors() const { return static_cast(nVect); } bool hasKey(const std::string& key) const; @@ -58,10 +59,7 @@ class ESmry void LoadData(const std::vector& vectList) const; void LoadData() const; - bool make_lodsmry_file(); - - // Added based on requirements from ResInsight - void use_lodsmry_file(bool enable); + bool make_esmry_file(); time_point startdate() const { return startdat; } @@ -77,16 +75,19 @@ class ESmry const std::string& get_unit(const SummaryNode& node) const; void write_rsm(std::ostream&) const; - void write_rsm_file(std::optional = std::nullopt) const; + void write_rsm_file(std::optional = std::nullopt) const; + + bool all_steps_available(); void ijk_from_global_index(int glob, int &i, int &j, int &k) const; + private: - bool useLodsmryFile; // Added by ResInsight use - Opm::filesystem::path inputFileName, lodFileName; + filesystem::path inputFileName; + RstEntry restart_info; + int nI, nJ, nK, nSpecFiles; - bool fromSingleRun, lodEnabeled; - uint64_t lod_offset, lod_arr_size; + bool fromSingleRun; size_t nVect, nTstep; std::vector formattedFiles; @@ -94,6 +95,7 @@ class ESmry mutable std::vector> vectorData; mutable std::vector vectorLoaded; std::vector timeStepList; + std::vector miniStepList; std::vector> arrayPos; std::vector keyword; std::map keyword_index; @@ -102,6 +104,7 @@ class ESmry std::vector> keywordListSpecFile; std::vector seqIndex; + std::vector mini_steps; std::vector summaryNodes; @@ -109,15 +112,15 @@ class ESmry time_point startdat; - std::vector checkForMultipleResultFiles(const Opm::filesystem::path& rootN, bool formatted) const; + std::vector checkForMultipleResultFiles(const filesystem::path& rootN, bool formatted) const; void getRstString(const std::vector& restartArray, - Opm::filesystem::path& pathRst, - Opm::filesystem::path& rootN) const; + filesystem::path& pathRst, + filesystem::path& rootN) const; - void updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN) const; + void updatePathAndRootName(filesystem::path& dir, filesystem::path& rootN) const; - std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num, const std::string& lgr, int lgri, int lgrj, int lgrk) const; + std::string makeKeyString(const std::string& keyword, const std::string& wgname, int num) const; std::string unpackNumber(const SummaryNode&) const; std::string lookupKey(const SummaryNode&) const; @@ -140,8 +143,9 @@ class ESmry std::vector> getListOfArrays(std::string filename, bool formatted); std::vector makeKeywPosVector(int speInd) const; std::string read_string_from_disk(std::fstream& fileH, uint64_t size) const; - void inspect_lodsmry(); - void Load_from_lodsmry(const std::vector& keywIndVect) const; + + void read_ministeps_from_disk(); + int read_ministep_formatted(std::fstream& fileH); }; }} // namespace Opm::EclIO diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclFile.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclFile.hpp index 18eb6bb0c5..38af36a3e0 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclFile.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclFile.hpp @@ -19,11 +19,10 @@ #ifndef OPM_IO_ECLFILE_HPP #define OPM_IO_ECLFILE_HPP -#include - #include #include +#include #include #include #include @@ -97,19 +96,7 @@ class EclFile template const std::vector& getImpl(int arrIndex, eclArrType type, const std::unordered_map>& array, - const std::string& typeStr) - { - if (array_type[arrIndex] != type) { - std::string message = "Array with index " + std::to_string(arrIndex) + " is not of type " + typeStr; - OPM_THROW(std::runtime_error, message); - } - - if (!arrayLoaded[arrIndex]) { - loadData(arrIndex); - } - - return array.at(arrIndex); - } + const std::string& typeStr); std::streampos seekPosition(const std::vector::size_type arrIndex) const; diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclUtil.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclUtil.hpp index 081409fad6..c9cab8ef3c 100644 --- a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclUtil.hpp +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/EclUtil.hpp @@ -20,7 +20,6 @@ #define OPM_IO_ECLUTIL_HPP #include -#include #include #include @@ -38,9 +37,6 @@ namespace Opm { namespace EclIO { bool isFormatted(const std::string& filename); bool is_number(const std::string& numstr); - bool isEqualCaseInsensitive(const std::string& string1, const std::string& string2); - Opm::filesystem::path findFileCaseInsensitive(const Opm::filesystem::path& folder, const std::string& filename); - std::tuple block_size_data_binary(eclArrType arrType); std::tuple block_size_data_formatted(eclArrType arrType); diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ExtESmry.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ExtESmry.hpp new file mode 100644 index 0000000000..3d93e9e7e7 --- /dev/null +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/ExtESmry.hpp @@ -0,0 +1,106 @@ +/* + Copyright 2019 Equinor ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ + +#ifndef OPM_IO_ExtESmry_HPP +#define OPM_IO_ExtESmry_HPP + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +namespace Opm { namespace EclIO { + +using ArrSourceEntry = std::tuple; +using TimeStepEntry = std::tuple; +using RstEntry = std::tuple; + +// start, rstart + rstnum, keycheck, units, rstep, tstep +using LodsmryHeadType = std::tuple, std::vector, + std::vector, std::vector>; + +class ExtESmry +{ +public: + + // input is esmry, only binary supported. + explicit ExtESmry(const std::string& filename, bool loadBaseRunData=false); + + const std::vector& get(const std::string& name); + std::vector get_at_rstep(const std::string& name); + std::string& get_unit(const std::string& name); + + void loadData(); + void loadData(const std::vector& stringVect); + + time_point startdate() const { return m_startdat; } + + bool hasKey(const std::string& key) const; + + size_t numberOfTimeSteps() const { return m_nTstep; } + size_t numberOfVectors() const { return m_nVect; } + + const std::vector& keywordList() const { return m_keyword;} + std::vector keywordList(const std::string& pattern) const; + + std::vector dates(); + + bool all_steps_available(); + + +private: + filesystem::path m_inputFileName; + std::vector m_lodsmry_files; + + bool m_loadBaseRun; + std::vector> m_keyword_index; + std::vector> m_tstep_range; + std::vector m_keyword; + std::vector m_rstep; + std::vector m_tstep; + std::vector> m_rstep_v; + std::vector> m_tstep_v; + std::vector> m_vectorData; + std::vector m_vectorLoaded; + std::unordered_map kwunits; + + size_t m_nVect; + std::vector m_nTstep_v; + size_t m_nTstep; + std::vector m_seqIndex; + + std::vector m_lod_offset; + std::vector m_lod_arr_size; + + time_point m_startdat; + + uint64_t open_esmry(Opm::filesystem::path& inputFileName, LodsmryHeadType& lodsmry_head); + + void updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN); +}; + +}} // namespace Opm::EclIO + + +#endif // OPM_IO_ExtESmry_HPP diff --git a/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/RestartFileView.hpp b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/RestartFileView.hpp new file mode 100644 index 0000000000..7d39d27cea --- /dev/null +++ b/ThirdParty/custom-opm-common/opm-common/opm/io/eclipse/RestartFileView.hpp @@ -0,0 +1,70 @@ +/* + Copyright 2021 Equinor ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . +*/ + +#ifndef OPM_RESTART_FILE_VIEW_HPP +#define OPM_RESTART_FILE_VIEW_HPP + +#include +#include +#include + +namespace Opm { namespace EclIO { + class ERst; +}} // Opm::EclIO + +namespace Opm { namespace EclIO { + +class RestartFileView +{ +public: + explicit RestartFileView(std::shared_ptr restart_file, + const int report_step); + + ~RestartFileView(); + + RestartFileView(const RestartFileView& rhs) = delete; + RestartFileView(RestartFileView&& rhs); + + RestartFileView& operator=(const RestartFileView& rhs) = delete; + RestartFileView& operator=(RestartFileView&& rhs); + + std::size_t simStep() const; + int reportStep() const; + + int occurrenceCount(const std::string& vector) const; + + template + bool hasKeyword(const std::string& vector) const; + + template + const std::vector& + getKeyword(const std::string& vector, const int occurrence = 0) const; + + const std::vector& intehead() const; + const std::vector& logihead() const; + const std::vector& doubhead() const; + +private: + class Implementation; + std::unique_ptr pImpl_; +}; + +}} // Opm::RestartIO + +#endif // OPM_RESTART_FILE_VIEW_HPP diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/common/utility/FileSystem.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/common/utility/FileSystem.cpp index d2c85cd503..a9f6076875 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/common/utility/FileSystem.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/common/utility/FileSystem.cpp @@ -47,4 +47,134 @@ std::string unique_path(const std::string& input) return ret; } +#if !defined(_WIN32) && (__cplusplus < 201703L || \ + (defined(__GNUC__) && __GNUC__ < 8 && !defined(__clang__))) + +// The following code has been extracted from libstdc++, +// and slightly modified for use here. +// License is replicated here for attribution. + +// Copyright (C) 2014-2021 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// Under Section 7 of GPL version 3, you are granted additional +// permissions described in the GCC Runtime Library Exception, version +// 3.1, as published by the Free Software Foundation. + +// You should have received a copy of the GNU General Public License and +// a copy of the GCC Runtime Library Exception along with this program; +// see the files COPYING3 and COPYING.RUNTIME respectively. If not, see +// . + +namespace { + +bool is_dot(Opm::filesystem::path::value_type c) { return c == '.'; } + +bool is_dot(const Opm::filesystem::path& path) +{ + const auto& filename = path.native(); + return filename.size() == 1 && is_dot(filename[0]); +} + +bool is_dotdot(const Opm::filesystem::path& path) +{ + const auto& filename = path.native(); + return filename.size() == 2 && is_dot(filename[0]) && is_dot(filename[1]); +} + +Opm::filesystem::path lexically_relative(const Opm::filesystem::path& p, + const Opm::filesystem::path& base) +{ + Opm::filesystem::path ret; + if (p.root_name() != base.root_name()) + return ret; + + if (p.is_absolute() != base.is_absolute()) + return ret; + if (!p.has_root_directory() && base.has_root_directory()) + return ret; + auto [a, b] = std::mismatch(p.begin(), p.end(), base.begin(), base.end()); + if (a == p.end() && b == base.end()) + ret = "."; + else + { + int n = 0; + for (; b != base.end(); ++b) + { + const Opm::filesystem::path& p2 = *b; + if (is_dotdot(p2)) + --n; + else if (!p2.empty() && !is_dot(p2)) + ++n; + } + if (n == 0 && (a == p.end() || a->empty())) + ret = "."; + else if (n >= 0) + { + const Opm::filesystem::path dotdot(".."); + while (n--) + ret /= dotdot; + for (; a != p.end(); ++a) + ret /= *a; + } + } + return ret; +} + +Opm::filesystem::path +lexically_proximate(const Opm::filesystem::path& p, const Opm::filesystem::path& base) +{ + Opm::filesystem::path rel = lexically_relative(p, base); + return rel.empty() ? p : rel; +} + +Opm::filesystem::path +weakly_canonical(const Opm::filesystem::path& p) +{ + Opm::filesystem::path result; + if (exists(status(p))) + return canonical(p); + + Opm::filesystem::path tmp; + auto iter = p.begin(), end = p.end(); + // find leading elements of p that exist: + while (iter != end) + { + tmp = result / *iter; + if (exists(status(tmp))) + swap(result, tmp); + else + break; + ++iter; + } + // canonicalize: + if (!result.empty()) + result = canonical(result); + // append the non-existing elements: + while (iter != end) + result /= *iter++; + + return result; +} + +} + + +filesystem::path proximate(const filesystem::path& p, const filesystem::path& base) +{ + return lexically_proximate(weakly_canonical(p), weakly_canonical(base)); +} + +#endif + } diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EGrid.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EGrid.cpp index 44d4b5c1ed..79b8fe6fba 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EGrid.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EGrid.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #define _USE_MATH_DEFINES #include @@ -77,6 +78,14 @@ EGrid::EGrid(const std::string &filename, std::string grid_name) : lgrname = lgr_names[nnchead[1] - 1]; } + if (array_name[n] == "MAPUNITS"){ + auto mapunits = this->get(n); + m_mapunits = mapunits[0]; + } + + if (array_name[n] == "MAPAXES") + m_mapaxes = this->get(n); + if (lgrname == grid_name) { if (array_name[n] == "GRIDHEAD") { auto gridhead = get(n); @@ -356,4 +365,217 @@ void EGrid::getCellCorners(int globindex, std::array& X, return getCellCorners(ijk_from_global_index(globindex),X,Y,Z); } + +std::vector> EGrid::getXYZ_layer(int layer, const std::array& box, bool bottom) +{ + // layer is layer index, zero based. The box array is i and j range (i1,i2,j1,j2), also zero based + + if ((layer < 0) || (layer > (nijk[2] -1))){ + std::string message = "invalid layer index " + std::to_string(layer) + ". Valied range [0, "; + message = message + std::to_string(nijk[2] -1) + "]"; + throw std::invalid_argument(message); + } + + if ((box[0] < 0) || (box[0]+1 > nijk[0]) || (box[1] < 0) || (box[1]+1 > nijk[0]) || + (box[2] < 0) || (box[2]+1 > nijk[1]) || (box[3] < 0) || (box[3]+1 > nijk[1]) || + (box[0] > box[1]) || (box[2] > box[3])){ + + throw std::invalid_argument("invalid box input, i1,i2,j1 or j2 out of valied range "); + } + + int nodes_pr_surf = nijk[0]*nijk[1]*4; + int zcorn_offset = nodes_pr_surf * layer * 2; + + if (bottom) + zcorn_offset += nodes_pr_surf; + + std::vector layer_zcorn; + layer_zcorn.reserve(nodes_pr_surf); + + std::vector> xyz_vector; + + if (coord_array.size() == 0) + coord_array = getImpl(coord_array_index, REAL, real_array, "float"); + + if (zcorn_array.size() > 0){ + for (size_t n = 0; n < static_cast(nodes_pr_surf); n++) + layer_zcorn.push_back(zcorn_array[zcorn_offset + n]); + + } else { + layer_zcorn = get_zcorn_from_disk(layer, bottom); + } + + std::array X; + std::array Y; + std::array Z; + + std::array ijk; + ijk[2]=0; + + for (int j = box[2]; j < (box[3] + 1); j++) { + for (int i = box[0]; i < (box[1] + 1); i++) { + + ijk[0]=i; + ijk[1]=j; + + this->getCellCorners(ijk, layer_zcorn, X, Y, Z ); + + for (size_t n = 0; n < 4; n++){ + std::array xyz; + xyz[0] = X[n]; + xyz[1] = Y[n]; + xyz[2] = Z[n]; + + xyz_vector.push_back(xyz); + } + } + } + + return xyz_vector; +} + + +std::vector> EGrid::getXYZ_layer(int layer, bool bottom) +{ + std::array box = {0, nijk[0] -1 , 0, nijk[1] -1 }; + return this->getXYZ_layer(layer, box, bottom); +} + + +std::vector EGrid::get_zcorn_from_disk(int layer, bool bottom) +{ + if (formatted) + throw std::invalid_argument("partial loading of zcorn arrays not possible when using formatted input"); + + std::vector zcorn_layer; + std::fstream fileH; + + int nodes_pr_surf = nijk[0]*nijk[1]*4; + int zcorn_offset = nodes_pr_surf * layer * 2; + + if (bottom) + zcorn_offset+=nodes_pr_surf; + + fileH.open(inputFileName, std::ios::in | std::ios::binary); + + if (!fileH) + throw std::runtime_error("Can not open EGrid file" + this->inputFilename); + + std::string arrName(8,' '); + eclArrType arrType; + int64_t num; + int sizeOfElement; + + uint64_t zcorn_pos = 0; + + while (!isEOF(&fileH)) { + + readBinaryHeader(fileH,arrName,num, arrType, sizeOfElement); + + if (arrName == "ZCORN "){ + zcorn_pos = fileH.tellg(); + break; + } + + uint64_t sizeOfNextArray = sizeOnDiskBinary(num, arrType, sizeOfElement); + fileH.seekg(static_cast(sizeOfNextArray), std::ios_base::cur); + } + + int elements_pr_block = Opm::EclIO::MaxBlockSizeReal / Opm::EclIO::sizeOfReal; + int num_blocks_start = zcorn_offset / elements_pr_block; + + // adding size of zcorn real data before to ignored + uint64_t start_pos = zcorn_pos + Opm::EclIO::sizeOfReal * zcorn_offset; + + // adding size of blocks (head and tail flags) + start_pos = start_pos + (1 + num_blocks_start * 2) * Opm::EclIO::sizeOfInte; + + fileH.seekg(start_pos, std::ios_base::beg); + + uint64_t zcorn_to = zcorn_offset + nodes_pr_surf; + + int i1 = zcorn_offset / 1000 + 1; + uint64_t elemets = static_cast(i1 * elements_pr_block - zcorn_offset); + + uint64_t next_block = elemets < zcorn_to ? elemets : zcorn_to - zcorn_offset + 1 ; + + uint64_t p1 = zcorn_offset; + + while (p1 < zcorn_to){ + + std::vector buf(next_block); + fileH.read(reinterpret_cast(buf.data()), buf.size()*sizeof(float)); + + for (size_t n = 0; n < next_block; n++) + zcorn_layer.push_back(Opm::EclIO::flipEndianFloat(buf[n])); + + p1 = p1 + next_block; + + if (p1 < zcorn_to) { + int dtail; + fileH.read(reinterpret_cast(&dtail), sizeof(dtail)); + fileH.read(reinterpret_cast(&dtail), sizeof(dtail)); + dtail = Opm::EclIO::flipEndianInt(dtail); + + next_block = static_cast(dtail) / static_cast(Opm::EclIO::sizeOfReal); + + if ((p1 + next_block) > zcorn_to) + next_block = zcorn_to - p1; + } + } + + fileH.close(); + + return zcorn_layer; +} + + +void EGrid::getCellCorners(const std::array& ijk, const std::vector& zcorn_layer, + std::array& X, std::array& Y, std::array& Z) +{ + std::vector zind; + std::vector pind; + + // calculate indices for grid pillars in COORD arrray + pind.push_back(ijk[1]*(nijk[0]+1)*6 + ijk[0]*6); + pind.push_back(pind[0] + 6); + pind.push_back(pind[0] + (nijk[0]+1)*6); + pind.push_back(pind[2] + 6); + + // get depths from zcorn array in ZCORN array + zind.push_back(ijk[2]*nijk[0]*nijk[1]*8 + ijk[1]*nijk[0]*4 + ijk[0]*2); + zind.push_back(zind[0] + 1); + zind.push_back(zind[0] + nijk[0]*2); + zind.push_back(zind[2] + 1); + + for (int n = 0; n< 4; n++) + Z[n] = zcorn_layer[zind[n]]; + + for (int n = 0; n < 4; n++) { + double xt; + double yt; + double xb; + double yb; + + double zt = coord_array[pind[n] + 2]; + double zb = coord_array[pind[n] + 5]; + + xt = coord_array[pind[n]]; + yt = coord_array[pind[n] + 1]; + xb = coord_array[pind[n] + 3]; + yb = coord_array[pind[n] + 4]; + + if (zt == zb) { + X[n] = xt; + Y[n] = yt; + } else { + X[n] = xt + (xb-xt) / (zt-zb) * (zt - Z[n]); + Y[n] = yt+(yb-yt)/(zt-zb)*(zt-Z[n]); + } + + } +} + + + }} // namespace Opm::ecl diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EInit.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EInit.cpp index 5754109454..d2af9f3868 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EInit.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EInit.cpp @@ -157,5 +157,40 @@ std::vector EInit::list_arrays() const return array_list; } +template +const std::vector& EInit::ImplgetInitData(const std::string& name, const std::string& grid_name) +{ + int arr_ind = get_array_index(name, grid_name); + + if constexpr (std::is_same_v) + return getImpl(arr_ind, INTE, inte_array, "integer"); + + if constexpr (std::is_same_v) + return getImpl(arr_ind, REAL, real_array, "float"); + + if constexpr (std::is_same_v) + return getImpl(arr_ind, DOUB, doub_array, "double"); + + if constexpr (std::is_same_v) + return getImpl(arr_ind, LOGI, logi_array, "bool"); + + if constexpr (std::is_same_v) + { + if (array_type[arr_ind] == Opm::EclIO::CHAR) + return getImpl(arr_ind, array_type[arr_ind], char_array, "char"); + + if (array_type[arr_ind] == Opm::EclIO::C0NN) + return getImpl(arr_ind, array_type[arr_ind], char_array, "c0nn"); + + OPM_THROW(std::runtime_error, "Array not of type CHAR or C0nn"); + } + + OPM_THROW(std::runtime_error, "type not supported"); +} + +template const std::vector& EInit::ImplgetInitData(const std::string& name, const std::string& grid_name); +template const std::vector& EInit::ImplgetInitData(const std::string& name, const std::string& grid_name); +template const std::vector& EInit::ImplgetInitData(const std::string& name, const std::string& grid_name); +template const std::vector& EInit::ImplgetInitData(const std::string& name, const std::string& grid_name); }} // namespace Opm::EclIO diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ERst.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ERst.cpp index b4964bb920..268a3f7a45 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ERst.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ERst.cpp @@ -18,6 +18,8 @@ #include +#include + #include #include #include @@ -407,5 +409,22 @@ const std::vector& ERst::getRestartData(const std::str return getImpl(ind, CHAR, char_array, "char"); } +template +const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name) +{ + auto indRange = this->getIndexRange(reportStepNumber); + + if ((std::get<0>(indRange) + index) > std::get<1>(indRange)) + OPM_THROW(std::invalid_argument, "getRestartData, index out of range"); + + int start_ind = get_start_index_lgrname(reportStepNumber, lgr_name); + return this->get(index + start_ind); +} + +template const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name); +template const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name); +template const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name); +template const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name); +template const std::vector& ERst::getRestartData(int index, int reportStepNumber, const std::string& lgr_name); }} // namespace Opm::ecl diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ESmry.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ESmry.cpp index 64322fb207..feb71521b6 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ESmry.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ESmry.cpp @@ -17,21 +17,28 @@ */ #include + +#include #include #include #include #include #include -#include #include #include +#include +#include +#include #include +#include #include #include #include #include #include +#include + #ifdef _WIN32 #include "cross-platform/windows/Substitutes.hpp" @@ -39,29 +46,26 @@ #include #endif -#include -#include -#include - -#include +#include /* - KEYWORDS WGNAMES NUMS | PARAM index Corresponding ERT key - ------------------------------------------------+-------------------------------------------------- - WGOR OP_1 0 | 0 WGOR:OP_1 - FOPT +-+-+-+- 0 | 1 FOPT - WWCT OP_1 0 | 2 WWCT:OP_1 - WIR OP_1 0 | 3 WIR:OP_1 - WGOR WI_1 0 | 4 WWCT:OP_1 - WWCT W1_1 0 | 5 WWCT:WI_1 - BPR +-+-+- 12675 | 6 BPR:12675, BPR:i,j,k - RPR +-+-+- 1 | 7 RPR:1 - FOPT +-+-+- 0 | 8 FOPT - GGPR NORTH 0 | 9 GGPR:NORTH - COPR OP_1 5628 | 10 COPR:OP_1:56286, COPR:OP_1:i,j,k - RXF +-+-+- 32768*R1(R2 + 10) | 11 RXF:2-3 - SOFX OP_1 12675 | 12 SOFX:OP_1:12675, SOFX:OP_1:i,j,jk + KEYWORDS WGNAMES NUMS | PARAM index Corresponding ERT key + ---------------------------------------------------+-------------------------------------------------- + WGOR OP_1 0 | 0 WGOR:OP_1 + FOPT :+:+:+:+ 0 | 1 FOPT + WWCT OP_1 0 | 2 WWCT:OP_1 + WIR OP_1 0 | 3 WIR:OP_1 + WGOR WI_1 0 | 4 WWCT:OP_1 + WWCT W1_1 0 | 5 WWCT:WI_1 + BPR :+:+:+:+ 12675 | 6 BPR:12675, BPR:i,j,k + RPR :+:+:+:+ 1 | 7 RPR:1 + FOPT :+:+:+:+ 0 | 8 FOPT + GGPR NORTH 0 | 9 GGPR:NORTH + COPR OP_1 5628 | 10 COPR:OP_1:56286, COPR:OP_1:i,j,k + RXF :+:+:+:+ R1 + 32768*(R2 + 10) | 11 RXF:2-3 + SOFX OP_1 12675 | 12 SOFX:OP_1:12675, SOFX:OP_1:i,j,jk + AAQX :+:+:+:+ 12 | 13 AAQX:12 */ @@ -94,10 +98,9 @@ Opm::time_point make_date(const std::vector& datetime) { namespace Opm { namespace EclIO { -ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry ) : +ESmry::ESmry(const std::string &filename, bool loadBaseRunData) : inputFileName { filename }, - summaryNodes { }, - useLodsmryFile(uselodsmry) + summaryNodes { } { fromSingleRun = !loadBaseRunData; @@ -109,37 +112,12 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry if (inputFileName.extension()=="") inputFileName+=".SMSPEC"; - if (!isEqualCaseInsensitive(inputFileName.extension().string(), ".SMSPEC") && - !isEqualCaseInsensitive(inputFileName.extension().string(), ".FSMSPEC")) + if ((inputFileName.extension()!=".SMSPEC") && (inputFileName.extension()!=".FSMSPEC")) throw std::invalid_argument("Input file should have extension .SMSPEC or .FSMSPEC"); - { - auto candidatePath = findFileCaseInsensitive(inputFileName.parent_path(), inputFileName.filename().string()); - if (!Opm::filesystem::exists(candidatePath)) - throw std::invalid_argument("Not able to find summary SMSPEC file"); - - inputFileName = candidatePath; - } - - const bool formatted = isEqualCaseInsensitive(inputFileName.extension().string(), ".SMSPEC") ? false : true; + const bool formatted = inputFileName.extension()==".SMSPEC" ? false : true; formattedFiles.push_back(formatted); - if (formatted) - lodFileName = rootName += ".FLODSMRY"; - else - lodFileName = rootName += ".LODSMRY"; - - { - auto candidatePath = findFileCaseInsensitive(lodFileName.parent_path(), lodFileName.filename().string()); - if (Opm::filesystem::exists(candidatePath)) lodFileName = candidatePath; - } - - - if ((!loadBaseRunData) && (Opm::filesystem::exists(lodFileName))) - lodEnabeled = true; - else - lodEnabeled = false; - Opm::filesystem::path path = Opm::filesystem::current_path(); updatePathAndRootName(path, rootName); @@ -147,14 +125,6 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry Opm::filesystem::path smspec_file = path / rootName; smspec_file += inputFileName.extension(); - { - auto candidatePath = findFileCaseInsensitive(smspec_file.parent_path(), smspec_file.filename().string()); - if (!Opm::filesystem::exists(candidatePath)) - throw std::invalid_argument("Not able to find summary SMSPEC file"); - - smspec_file = candidatePath; - } - Opm::filesystem::path rstRootN; Opm::filesystem::path pathRstFile = path; @@ -172,7 +142,7 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry // Read data from the summary into local data members. { - smspecList.emplace_back(EclFile(smspec_file.string())); + smspecList.emplace_back(smspec_file.string()); auto arrays = smspecList.back().getList(); std::vector vectIndices; @@ -228,10 +198,10 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry if (i < numly.size()) lgrj = numly[i]; if (i < numlz.size()) lgrk = numlz[i]; - const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], lgrName, lgri, lgrj, lgrk); + const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i]); combindKeyList.push_back(keyString); - if (keyString.length() > 0) { + if (! keyString.empty()) { summaryNodes.push_back({ keywords[i], SummaryNode::category_from_keyword(keywords[i], segmentExceptions), @@ -240,7 +210,7 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry nums[i], lgrName, lgri, - lgrj, + lgrj, lgrk, i, "" @@ -254,6 +224,27 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry keywordListSpecFile.push_back(combindKeyList); getRstString(restartArray, pathRstFile, rstRootN); + if ((rstRootN.string() != "") && (loadBaseRunData)){ + + if (! Opm::filesystem::exists(pathRstFile)) + OPM_THROW(std::runtime_error, "path to restart file not found, '" + pathRstFile.string() + "'"); + + auto abs_rst_file = Opm::filesystem::canonical(pathRstFile) / rstRootN; + Opm::filesystem::path rel_path; + + if (inputFileName.parent_path().string().empty()) + rel_path = Opm::proximate(abs_rst_file); + else + rel_path = Opm::proximate(abs_rst_file, inputFileName.parent_path()); + + if (abs_rst_file.string().size() < rel_path.string().size()) + restart_info = std::make_tuple(abs_rst_file.string(), dimens[5]); + else + restart_info = std::make_tuple(rel_path.string(), dimens[5]); + } + else + restart_info = std::make_tuple("", 0); + smryArray.push_back({smspec_file.string(), dimens[5]}); } @@ -265,29 +256,12 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry Opm::filesystem::path rstFile = pathRstFile / rstRootN; rstFile += ".SMSPEC"; - { - auto candidatePath = findFileCaseInsensitive(rstFile.parent_path(), rstFile.filename().string()); - if (!Opm::filesystem::exists(candidatePath)) - throw std::invalid_argument("Not able to find summary restart file"); - - rstFile = candidatePath; - } - bool baseRunFmt = false; // if unformatted file not exists, check for formatted file if (!Opm::filesystem::exists(rstFile)){ rstFile = pathRstFile / rstRootN; rstFile += ".FSMSPEC"; - - { - auto candidatePath = findFileCaseInsensitive(rstFile.parent_path(), rstFile.filename().string()); - if (!Opm::filesystem::exists(candidatePath)) - throw std::invalid_argument("Not able to find summary restart file"); - - rstFile = candidatePath; - } - baseRunFmt = true; } @@ -331,7 +305,7 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry this->startdat = make_date(smspecList.back().get("STARTDAT")); for (size_t i = 0; i < keywords.size(); i++) { - + std::string lgrName; int lgri = -1; int lgrj = -1; @@ -342,10 +316,10 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry if (i < numly.size()) lgrj = numly[i]; if (i < numlz.size()) lgrk = numlz[i]; - const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i], lgrName, lgri, lgrj, lgrk); + const std::string keyString = makeKeyString(keywords[i], wgnames[i], nums[i]); combindKeyList.push_back(keyString); - if (keyString.length() > 0) { + if (! keyString.empty()) { summaryNodes.push_back({ keywords[i], SummaryNode::category_from_keyword(keywords[i], segmentExceptions), @@ -409,29 +383,8 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry const std::vector nums = smspecList[specInd].get("NUMS"); - std::vector lgrs; - std::vector numlx; - std::vector numly; - std::vector numlz; - - if (smspecList[specInd].hasKey("LGRS")) lgrs = smspecList[specInd].get("LGRS"); - if (smspecList[specInd].hasKey("NUMLX")) numlx = smspecList[specInd].get("NUMLX"); - if (smspecList[specInd].hasKey("NUMLY")) numly = smspecList[specInd].get("NUMLY"); - if (smspecList[specInd].hasKey("NUMLZ")) numlz = smspecList[specInd].get("NUMLZ"); - - for (size_t i=0; i < keywords.size(); i++) { - std::string lgrName; - int lgri = -1; - int lgrj = -1; - int lgrk = -1; - - if (i < lgrs.size()) lgrName = lgrs[i]; - if (i < numlx.size()) lgri = numlx[i]; - if (i < numly.size()) lgrj = numly[i]; - if (i < numlz.size()) lgrk = numlz[i]; - - const std::string keyw = makeKeyString(keywords[i], wgnames[i], nums[i], lgrName, lgri, lgrj, lgrk); + const std::string keyw = makeKeyString(keywords[i], wgnames[i], nums[i]); if (keywList.find(keyw) != keywList.end()) arrayPos[specInd][keyIndex[keyw]]=i; @@ -460,288 +413,209 @@ ESmry::ESmry(const std::string &filename, bool loadBaseRunData , bool uselodsmry vectorLoaded.push_back(false); } - if (useLodsmryFile && lodEnabeled) - { - // inspecting formatted or binary lod file. lodsmry possible only if - // loadBaseRunData=false - inspect_lodsmry(); + int dataFileIndex = -1; - } else { + while (specInd >= 0) { - // inspecting time step data, unified summary or multiple summary files both formatted or binary. - // this also include base run data if loadBaseRunData=true and restart runs exists. + int reportStepNumber = fromReportStepNumber; - int dataFileIndex = -1; + if (specInd > 0) { + auto rstFrom = smryArray[specInd-1]; + toReportStepNumber = std::get<1>(rstFrom); + } else { + toReportStepNumber = std::numeric_limits::max(); + } - while (specInd >= 0) { + Opm::filesystem::path smspecFile(std::get<0>(smryArray[specInd])); + rootName = smspecFile.parent_path() / smspecFile.stem(); - int reportStepNumber = fromReportStepNumber; + // check if multiple or unified result files should be used + // to import data, no information in smspec file regarding this + // if both unified and non-unified files exists, will use most recent based on + // time stamp - if (specInd > 0) { - auto rstFrom = smryArray[specInd-1]; - toReportStepNumber = std::get<1>(rstFrom); - } else { - toReportStepNumber = std::numeric_limits::max(); - } + Opm::filesystem::path unsmryFile = rootName; - Opm::filesystem::path smspecFile(std::get<0>(smryArray[specInd])); - rootName = smspecFile.parent_path() / smspecFile.stem(); + unsmryFile += formattedFiles[specInd] ? ".FUNSMRY" : ".UNSMRY"; + const bool use_unified = Opm::filesystem::exists(unsmryFile.string()); - // check if multiple or unified result files should be used - // to import data, no information in smspec file regarding this - // if both unified and non-unified files exists, will use most recent based on - // time stamp + const std::vector multFileList = checkForMultipleResultFiles(rootName, formattedFiles[specInd]); - Opm::filesystem::path unsmryFile = rootName; + std::vector resultsFileList; - unsmryFile += formattedFiles[specInd] ? ".FUNSMRY" : ".UNSMRY"; - { - auto candidatePath = findFileCaseInsensitive(unsmryFile.parent_path(), unsmryFile.filename().string()); - if (!Opm::filesystem::exists(candidatePath)) - throw std::invalid_argument("Not able to find summary SMSPEC file"); + if ((!use_unified) && (multFileList.size()==0)) { + throw std::runtime_error("neigther unified or non-unified result files found"); + } else if ((use_unified) && (multFileList.size()>0)) { + auto time_multiple = Opm::filesystem::last_write_time(multFileList.back()); + auto time_unified = Opm::filesystem::last_write_time(unsmryFile); - unsmryFile = candidatePath; + if (time_multiple > time_unified) { + resultsFileList=multFileList; + } else { + resultsFileList.push_back(unsmryFile.string()); } - const bool use_unified = Opm::filesystem::exists(unsmryFile.string()); - - const std::vector multFileList = checkForMultipleResultFiles(rootName, formattedFiles[specInd]); - - std::vector resultsFileList; + } else if (use_unified) { + resultsFileList.push_back(unsmryFile.string()); + } else { + resultsFileList=multFileList; + } - if ((!use_unified) && (multFileList.size()==0)) { - throw std::runtime_error("neigther unified or non-unified result files found"); - } else if ((use_unified) && (multFileList.size()>0)) { - auto time_multiple = Opm::filesystem::last_write_time(multFileList.back()); - auto time_unified = Opm::filesystem::last_write_time(unsmryFile); + std::vector arraySourceList; - if (time_multiple > time_unified) { - resultsFileList=multFileList; - } else { - resultsFileList.push_back(unsmryFile.string()); - } + for (std::string fileName : resultsFileList) + { + std::vector> arrayList; + arrayList = this->getListOfArrays(fileName, formattedFiles[specInd]); - } else if (use_unified) { - resultsFileList.push_back(unsmryFile.string()); - } else { - resultsFileList=multFileList; + for (size_t n = 0; n < arrayList.size(); n++) { + ArrSourceEntry t1 = std::make_tuple(std::get<0>(arrayList[n]), fileName, n, std::get<1>(arrayList[n])); + arraySourceList.push_back(t1); } + } - std::vector arraySourceList; - - for (std::string fileName : resultsFileList) - { - std::vector> arrayList; - arrayList = this->getListOfArrays(fileName, formattedFiles[specInd]); - - for (size_t n = 0; n < arrayList.size(); n++) { - ArrSourceEntry t1 = std::make_tuple(std::get<0>(arrayList[n]), fileName, n, std::get<1>(arrayList[n])); - arraySourceList.push_back(t1); - } - } + // loop through arrays and for each ministep, store data file, location of params table + // + // 2 or 3 arrays pr time step. + // If timestep is a report step: MINISTEP, PARAMS and SEQHDR + // else : MINISTEP and PARAMS - // loop through arrays and for each ministep, store data file, location of params table - // - // 2 or 3 arrays pr time step. - // If timestep is a report step: MINISTEP, PARAMS and SEQHDR - // else : MINISTEP and PARAMS + size_t i = std::get<0>(arraySourceList[0]) == "SEQHDR" ? 1 : 0 ; - size_t i = std::get<0>(arraySourceList[0]) == "SEQHDR" ? 1 : 0 ; + while (i < arraySourceList.size()) { - while (i < arraySourceList.size()) { + if (std::get<0>(arraySourceList[i]) != "MINISTEP") { + std::string message="Reading summary file, expecting keyword MINISTEP, found '" + std::get<0>(arraySourceList[i]) + "'"; + throw std::invalid_argument(message); + } - if (std::get<0>(arraySourceList[i]) != "MINISTEP") { - std::string message="Reading summary file, expecting keyword MINISTEP, found '" + std::get<0>(arraySourceList[i]) + "'"; - throw std::invalid_argument(message); - } + if (std::get<0>(arraySourceList[i+1]) != "PARAMS") { + std::string message="Reading summary file, expecting keyword PARAMS, found '" + std::get<0>(arraySourceList[i]) + "'"; + throw std::invalid_argument(message); + } - if (std::get<0>(arraySourceList[i+1]) != "PARAMS") { - std::string message="Reading summary file, expecting keyword PARAMS, found '" + std::get<0>(arraySourceList[i]) + "'"; - throw std::invalid_argument(message); - } + i++; - i++; + if (std::find(dataFileList.begin(), dataFileList.end(), std::get<1>(arraySourceList[i])) == dataFileList.end()) + { + dataFileList.push_back(std::get<1>(arraySourceList[i])); + dataFileIndex++; + } - if (std::find(dataFileList.begin(), dataFileList.end(), std::get<1>(arraySourceList[i])) == dataFileList.end()) - { - dataFileList.push_back(std::get<1>(arraySourceList[i])); - dataFileIndex++; - } + TimeStepEntry mst1 = std::make_tuple(specInd, dataFileIndex, std::get<3>(arraySourceList[i-1])); + miniStepList.push_back(mst1); - TimeStepEntry t1 = std::make_tuple(specInd, dataFileIndex, std::get<3>(arraySourceList[i])); - timeStepList.push_back(t1); + TimeStepEntry t1 = std::make_tuple(specInd, dataFileIndex, std::get<3>(arraySourceList[i])); + timeStepList.push_back(t1); - i++; + i++; - if (i < arraySourceList.size()) { - if (std::get<0>(arraySourceList[i]) == "SEQHDR") { - i++; - reportStepNumber++; - seqIndex.push_back(step); - } - } else { + if (i < arraySourceList.size()) { + if (std::get<0>(arraySourceList[i]) == "SEQHDR") { + i++; reportStepNumber++; seqIndex.push_back(step); } + } else { + reportStepNumber++; + seqIndex.push_back(step); + } - if (reportStepNumber >= toReportStepNumber) { - i = arraySourceList.size(); - } - - step++; + if (reportStepNumber >= toReportStepNumber) { + i = arraySourceList.size(); } - fromReportStepNumber = toReportStepNumber; + step++; + } - specInd--; + fromReportStepNumber = toReportStepNumber; - nTstep = timeStepList.size(); - } + specInd--; + + nTstep = timeStepList.size(); } } -void ESmry::inspect_lodsmry() +void ESmry::read_ministeps_from_disk() { - std::string arrName; - int64_t arr_size; - Opm::EclIO::eclArrType arrType; - int sizeOfElement; + auto specInd = std::get<0>(miniStepList[0]); + auto dataFileIndex = std::get<1>(miniStepList[0]); + uint64_t stepFilePos; std::fstream fileH; - if (formattedFiles[0]) { - fileH.open(lodFileName, std::ios::in); - Opm::EclIO::readFormattedHeader(fileH, arrName, arr_size, arrType, sizeOfElement); - } else { - fileH.open(lodFileName, std::ios::in | std::ios::binary); - Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); - } + if (formattedFiles[specInd]) + fileH.open(dataFileList[dataFileIndex], std::ios::in); + else + fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); - if ((arrName != "KEYCHECK") or (arrType != Opm::EclIO::CHAR)) - OPM_THROW(std::invalid_argument, "reading keycheck, invalid lod file"); + int ministep_value; - std::vector keycheck; + for (size_t n = 0; n < miniStepList.size(); n++) { - if (formattedFiles[0]) { - uint64_t size = Opm::EclIO::sizeOnDiskFormatted(arr_size, Opm::EclIO::CHAR, sizeOfChar) + 1; - std::string fileStr = read_string_from_disk(fileH, size); + if (dataFileIndex != std::get<1>(miniStepList[n])) { + fileH.close(); + specInd = std::get<0>(miniStepList[n]); + dataFileIndex = std::get<1>(miniStepList[n]); - keycheck = Opm::EclIO::readFormattedCharArray(fileStr, arr_size, 0, sizeOfChar); - } else { - keycheck = Opm::EclIO::readBinaryCharArray(fileH, arr_size); - } + if (formattedFiles[specInd]) + fileH.open(dataFileList[dataFileIndex], std::ios::in ); + else + fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); + } - if ((arr_size / nVect != 3) or (arr_size % nVect != 0)) - OPM_THROW(std::invalid_argument, "reading keycheck, invalid lod file"); + stepFilePos = std::get<2>(miniStepList[n]); - for (size_t n = 0; n < nVect; n++) { - size_t ind = n*3; - std::string test_str = keycheck[ind] + keycheck[ind+1] + keycheck[ind+2]; + fileH.seekg (stepFilePos , fileH.beg); - if (keyword[n].size() > 24) { - if (keyword[n].substr(0,24) != test_str) { - OPM_THROW(std::invalid_argument, "keycheck not maching keyword array"); - } + if (formattedFiles[specInd]) { + ministep_value = read_ministep_formatted(fileH); } else { - if (keyword[n] != test_str) { - OPM_THROW(std::invalid_argument, "keycheck not maching keyword array"); - } + std::function f = Opm::EclIO::flipEndianInt; + auto ministep_vect = readBinaryArray(fileH, 1, Opm::EclIO::INTE, f, sizeOfInte); + ministep_value = ministep_vect[0]; } - } - - if (formattedFiles[0]) - Opm::EclIO::readFormattedHeader(fileH, arrName, arr_size, arrType, sizeOfElement); - else - Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); - if ((arrName != "RSTEP ") or (arrType != Opm::EclIO::LOGI)) - OPM_THROW(std::invalid_argument, "reading rstep, invalid lod file"); - - std::vector rstep; - - if (formattedFiles[0]) { - uint64_t size = Opm::EclIO::sizeOnDiskFormatted(arr_size, Opm::EclIO::LOGI, sizeOfLogi) + 1; - std::string fileStr = read_string_from_disk(fileH, size); - - rstep = Opm::EclIO::readFormattedLogiArray(fileStr, arr_size, 0); - } else { - rstep = readBinaryLogiArray(fileH, arr_size); + mini_steps.push_back(ministep_value); } - for (size_t m = 0; m < rstep.size(); m++) - if (rstep[m]) - seqIndex.push_back(m); - - lod_offset = static_cast(fileH.tellg()); - nTstep = rstep.size(); - - if (formattedFiles[0]) - lod_arr_size = sizeOnDiskFormatted(nTstep, Opm::EclIO::REAL, sizeOfReal); - else - lod_arr_size = sizeOnDiskBinary(nTstep, Opm::EclIO::REAL, sizeOfReal); - fileH.close(); } -std::string ESmry::read_string_from_disk(std::fstream& fileH, uint64_t size) const +bool ESmry::all_steps_available() { - char* buffer; - buffer = new char [size]; - fileH.read (buffer, size); - std::string fileStr = std::string(buffer, size); - delete[] buffer; + if (mini_steps.size() == 0) + this->read_ministeps_from_disk(); + + for (size_t n = 1; n < mini_steps.size(); n++) + if ((mini_steps[n] - mini_steps[n-1]) > 1) + return false; - return fileStr; + return true; } -void ESmry::Load_from_lodsmry(const std::vector& keywIndVect) const +int ESmry::read_ministep_formatted(std::fstream& fileH) { - std::fstream fileH; - - if (formattedFiles[0]) - fileH.open(lodFileName, std::ios::in); - else - fileH.open(lodFileName, std::ios::in | std::ios::binary); - - for (auto ind : keywIndVect) { - std::string arrName; - int64_t size; - Opm::EclIO::eclArrType arrType; - int sizeOfElement; + const std::size_t size = sizeOnDiskFormatted(1, Opm::EclIO::INTE, 4)+1; + auto buffer = std::vector(size); + fileH.read (buffer.data(), size); - uint64_t pos = lod_offset + lod_arr_size*static_cast(ind); + const auto fileStr = std::string(buffer.data(), size); - if (formattedFiles[0]) - pos = pos + static_cast(ind * 31); // adding size of formatted headers - else - pos = pos + static_cast(ind * 24); // adding size of binary headers + const auto ministep_vect = readFormattedInteArray(fileStr, 1, 0); - fileH.seekg (pos, fileH.beg); - - if (formattedFiles[0]) - readFormattedHeader(fileH, arrName, size, arrType, sizeOfElement); - else - readBinaryHeader(fileH, arrName, size, arrType, sizeOfElement); - - arrName = Opm::EclIO::trimr(arrName); - - std::string checkName = "V" + std::to_string(ind); + return ministep_vect[0]; +} - if (arrName != checkName) - OPM_THROW(std::invalid_argument, "lodsmry, wrong header expecting " + checkName + " found " + arrName); - if (formattedFiles[0]) { - uint64_t size_buffer = lod_arr_size + 1; - std::string fileStr = read_string_from_disk(fileH, size_buffer); - vectorData[ind] = Opm::EclIO::readFormattedRealArray(fileStr, nTstep, 0); - } else { - vectorData[ind] = readBinaryRealArray(fileH, size); - } - } +std::string ESmry::read_string_from_disk(std::fstream& fileH, uint64_t size) const +{ + std::vector buffer(size); + fileH.read (buffer.data(), size); - fileH.close(); + return { buffer.data(), size }; } @@ -752,7 +626,7 @@ void ESmry::LoadData(const std::vector& vectList) const std::vector keywIndVect; keywIndVect.reserve(nvect); - for (auto key : vectList){ + for (auto key : vectList) { if (!hasKey(key)) OPM_THROW(std::invalid_argument, "error loading key " + key ); @@ -763,122 +637,105 @@ void ESmry::LoadData(const std::vector& vectList) const for (auto ind : keywIndVect) vectorData[ind].reserve(nTstep); - if (useLodsmryFile && lodEnabeled) - { - Load_from_lodsmry(keywIndVect); + std::fstream fileH; - } else { + auto specInd = std::get<0>(timeStepList[0]); + auto dataFileIndex = std::get<1>(timeStepList[0]); + std::uint64_t blockSize_f; - std::fstream fileH; + { + const int rest = MaxBlockSizeReal % numColumnsReal; + const int nLinesBlock = MaxBlockSizeReal / numColumnsReal + (rest > 0); - auto specInd = std::get<0>(timeStepList[0]); - auto dataFileIndex = std::get<1>(timeStepList[0]); - uint64_t stepFilePos = std::get<2>(timeStepList[0]); - uint64_t blockSize_f; + blockSize_f= static_cast(MaxNumBlockReal * numColumnsReal * columnWidthReal + nLinesBlock); + } - { - int nLinesBlock = MaxBlockSizeReal / numColumnsReal; - int rest = MaxBlockSizeReal % numColumnsReal; + if (formattedFiles[specInd]) + fileH.open(dataFileList[dataFileIndex], std::ios::in); + else + fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); - if (rest > 0) - nLinesBlock++; + for (const auto& ministep : timeStepList) { + if (dataFileIndex != std::get<1>(ministep)) { + fileH.close(); + specInd = std::get<0>(ministep); + dataFileIndex = std::get<1>(ministep); - blockSize_f= static_cast(MaxNumBlockReal * numColumnsReal * columnWidthReal + nLinesBlock); + if (formattedFiles[specInd]) + fileH.open(dataFileList[dataFileIndex], std::ios::in ); + else + fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); } - if (formattedFiles[specInd]) - fileH.open(dataFileList[dataFileIndex], std::ios::in); - else - fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); - - for (auto ministep : timeStepList) { + const auto stepFilePos = std::get<2>(ministep);; - if (dataFileIndex != std::get<1>(ministep)) { - fileH.close(); - specInd = std::get<0>(ministep); - dataFileIndex = std::get<1>(ministep); - - if (formattedFiles[specInd]) - fileH.open(dataFileList[dataFileIndex], std::ios::in ); - else - fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); + for (auto ind : keywIndVect) { + auto it = arrayPos[specInd].find(ind); + if (it == arrayPos[specInd].end()) { + // undefined vector in current summary file. Typically when loading + // base restart run and including base run data. Vectors can be added to restart runs + vectorData[ind].push_back(std::nanf("")); } + else { + int paramPos = it->second; - stepFilePos = std::get<2>(ministep);; - - for (auto ind : keywIndVect) { - - auto it = arrayPos[specInd].find(ind); - - if (it == arrayPos[specInd].end()) { - // undefined vector in current summary file. Typically when loading - // base restart run and including base run data. Vectors can be added to restart runs - vectorData[ind].push_back(nanf("")); - } else { - int paramPos = it->second; - - if (formattedFiles[specInd]) { - uint64_t elementPos = 0; - int nBlocks = paramPos / MaxBlockSizeReal; - int sizeOfLastBlock = paramPos % MaxBlockSizeReal; - - if (nBlocks > 0) - elementPos = static_cast(nBlocks * blockSize_f); - - int nLines = sizeOfLastBlock / numColumnsReal; - elementPos = stepFilePos + elementPos + static_cast(sizeOfLastBlock * columnWidthReal + nLines); - - fileH.seekg (elementPos, fileH.beg); + if (formattedFiles[specInd]) { + std::uint64_t elementPos = 0; + int nBlocks = paramPos / MaxBlockSizeReal; + int sizeOfLastBlock = paramPos % MaxBlockSizeReal; - char* buffer; - size_t size = columnWidthReal; - buffer = new char [size]; - fileH.read (buffer, size); - double dtmpv = std::stod(std::string(buffer, size)); - vectorData[ind].push_back(static_cast(dtmpv)); + if (nBlocks > 0) + elementPos = static_cast(nBlocks * blockSize_f); - delete[] buffer; + int nLines = sizeOfLastBlock / numColumnsReal; + elementPos = stepFilePos + elementPos + static_cast(sizeOfLastBlock*columnWidthReal + nLines); - } else { + fileH.seekg (elementPos, fileH.beg); - uint64_t nFullBlocks = static_cast(paramPos/(MaxBlockSizeReal / sizeOfReal)); - uint64_t elementPos = ((2 * nFullBlocks) + 1)*static_cast(sizeOfInte); - elementPos += static_cast(paramPos)* static_cast(sizeOfReal) + stepFilePos; + const std::size_t size = columnWidthReal; + std::vector buffer(size); + fileH.read (buffer.data(), size); + vectorData[ind].push_back(std::strtof(buffer.data(), nullptr)); + } + else { + const std::uint64_t nFullBlocks = static_cast(paramPos/(MaxBlockSizeReal / sizeOfReal)); + std::uint64_t elementPos = ((2 * nFullBlocks) + 1) * static_cast(sizeOfInte); + elementPos += static_cast(paramPos) * static_cast(sizeOfReal) + stepFilePos; - fileH.seekg (elementPos, fileH.beg); + fileH.seekg (elementPos, fileH.beg); - float value; - fileH.read(reinterpret_cast(&value), sizeOfReal); + float value; + fileH.read(reinterpret_cast(&value), sizeOfReal); - vectorData[ind].push_back(Opm::EclIO::flipEndianFloat(value)); - } + vectorData[ind].push_back(Opm::EclIO::flipEndianFloat(value)); } } } - - fileH.close(); } - for (auto ind : keywIndVect) + fileH.close(); + + for (const auto& ind : keywIndVect) vectorLoaded[ind] = true; } -std::vector ESmry::makeKeywPosVector(int specInd) const { - - std::vector keywpos; - keywpos.reserve(nParamsSpecFile[specInd]); +std::vector ESmry::makeKeywPosVector(int specInd) const +{ + std::vector keywpos(nParamsSpecFile[specInd], -1); - for (int n = 0; n < nParamsSpecFile[specInd]; n++){ - std::string tmpstr = keywordListSpecFile[specInd][n]; - auto it = keyword_index.find(tmpstr); + auto has_index = [&keywpos](const int ix) + { + return std::find(keywpos.begin(), keywpos.end(), ix) != keywpos.end(); + }; + + const auto& kwList = keywordListSpecFile[specInd]; + for (int n = 0; n < nParamsSpecFile[specInd]; ++n) { + auto it = keyword_index.find(kwList[n]); + if ((it == keyword_index.end()) || has_index(it->second)) { + continue; + } - if (it == keyword_index.end()) - keywpos.push_back(-1); - else - if (std::find(keywpos.begin(), keywpos.end(), it->second) != keywpos.end()) - keywpos.push_back(-1); - else - keywpos.push_back(it->second); + keywpos[n] = it->second; } return keywpos; @@ -886,116 +743,103 @@ std::vector ESmry::makeKeywPosVector(int specInd) const { void ESmry::LoadData() const { - if (useLodsmryFile && lodEnabeled) { - - this ->LoadData(keyword); - - } else { - std::fstream fileH; - - auto specInd = std::get<0>(timeStepList[0]); - auto dataFileIndex = std::get<1>(timeStepList[0]); - uint64_t stepFilePos = std::get<2>(timeStepList[0]); - - std::vector keywpos = makeKeywPosVector(specInd); + std::fstream fileH; - if (formattedFiles[specInd]) - fileH.open(dataFileList[dataFileIndex], std::ios::in); - else - fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); + auto specInd = std::get<0>(timeStepList[0]); + auto dataFileIndex = std::get<1>(timeStepList[0]); - for (auto ministep : timeStepList) { + std::vector keywpos = makeKeywPosVector(specInd); - if (dataFileIndex != std::get<1>(ministep)) { - fileH.close(); + auto openMode = formattedFiles[specInd] + ? std::ios::in + : std::ios::in | std::ios::binary; - if (specInd != std::get<0>(ministep)) { - specInd = std::get<0>(ministep); - keywpos = makeKeywPosVector(specInd); - } + fileH.open(dataFileList[dataFileIndex], openMode); - dataFileIndex = std::get<1>(ministep); + for (const auto& ministep : timeStepList) { + if (dataFileIndex != std::get<1>(ministep)) { + fileH.close(); - if (formattedFiles[specInd]) - fileH.open(dataFileList[dataFileIndex], std::ios::in ); - else - fileH.open(dataFileList[dataFileIndex], std::ios::in | std::ios::binary); + if (specInd != std::get<0>(ministep)) { + specInd = std::get<0>(ministep); + keywpos = makeKeywPosVector(specInd); } - stepFilePos = std::get<2>(ministep); - int maxNumberOfElements = MaxBlockSizeReal / sizeOfReal; - fileH.seekg (stepFilePos, fileH.beg); - - if (formattedFiles[specInd]) { + dataFileIndex = std::get<1>(ministep); - char* buffer; - size_t size = sizeOnDiskFormatted(nParamsSpecFile[specInd], Opm::EclIO::REAL, sizeOfReal) + 1; - buffer = new char [size]; - fileH.read (buffer, size); + openMode = formattedFiles[specInd] + ? std::ios::in + : std::ios::in | std::ios::binary; - std::string fileStr = std::string(buffer, size); - size_t p = 0; - int64_t p1= 0; + fileH.open(dataFileList[dataFileIndex], openMode); + } - for (int i=0; i< nParamsSpecFile[specInd]; i++) { - p1 = fileStr.find_first_not_of(' ',p1); - int64_t p2 = fileStr.find_first_of(' ', p1); + const auto stepFilePos = std::get<2>(ministep); + const auto maxNumberOfElements = MaxBlockSizeReal / sizeOfReal; + fileH.seekg (stepFilePos, fileH.beg); - if ((keywpos[p] > -1) && (!vectorLoaded[keywpos[p]])) { - double dtmpv = std::stod(fileStr.substr(p1, p2-p1)); - vectorData[keywpos[p]].push_back(static_cast(dtmpv)); - } + if (formattedFiles[specInd]) { + const std::size_t size = sizeOnDiskFormatted(nParamsSpecFile[specInd], Opm::EclIO::REAL, sizeOfReal) + 1; + std::vector buffer(size); + fileH.read (buffer.data(), size); - p1 = fileStr.find_first_not_of(' ',p2); - p++; - } + const auto fileStr = std::string_view(buffer.data(), size); + std::size_t p = 0; + std::int64_t p1= 0; - delete[] buffer; + for (int i=0; i< nParamsSpecFile[specInd]; ++i, ++p) { + p1 = fileStr.find_first_not_of(' ',p1); + const std::int64_t p2 = fileStr.find_first_of(' ', p1); - } else { - int64_t rest = static_cast(nParamsSpecFile[specInd]); - size_t p = 0; + if ((keywpos[p] > -1) && !vectorLoaded[keywpos[p]]) { + const auto dtmpv = std::strtof(fileStr.substr(p1, p2-p1).data(), nullptr); + vectorData[keywpos[p]].push_back(dtmpv); + } - while (rest > 0) { - int dhead; - fileH.read(reinterpret_cast(&dhead), sizeof(dhead)); - dhead = Opm::EclIO::flipEndianInt(dhead); - int num = dhead / sizeOfInte; + p1 = fileStr.find_first_not_of(' ',p2); + } + } + else { + std::int64_t rest = static_cast(nParamsSpecFile[specInd]); + std::size_t p = 0; - if ((num > maxNumberOfElements) || (num < 0)) - OPM_THROW(std::runtime_error, "??Error reading binary data, inconsistent header data or incorrect number of elements"); + while (rest > 0) { + int dhead; + fileH.read(reinterpret_cast(&dhead), sizeof(dhead)); + dhead = Opm::EclIO::flipEndianInt(dhead); - for (int i = 0; i < num; i++) { - float value; - fileH.read(reinterpret_cast(&value), sizeOfReal); + const int num = dhead / sizeOfInte; + if ((num > maxNumberOfElements) || (num < 0)) + OPM_THROW(std::runtime_error, "??Error reading binary data, inconsistent header data or incorrect number of elements"); - if ((keywpos[p] > -1) && (!vectorLoaded[keywpos[p]])) - vectorData[keywpos[p]].push_back(Opm::EclIO::flipEndianFloat(value)); + for (int i = 0; i < num; ++i, ++p) { + float value; + fileH.read(reinterpret_cast(&value), sizeOfReal); - p++; - } + if ((keywpos[p] > -1) && !vectorLoaded[keywpos[p]]) + vectorData[keywpos[p]].push_back(Opm::EclIO::flipEndianFloat(value)); + } - rest -= num; + rest -= num; - if (( num < maxNumberOfElements && rest != 0) || - (num == maxNumberOfElements && rest < 0)) { - std::string message = "Error reading binary data, incorrect number of elements"; - OPM_THROW(std::runtime_error, message); - } + if (( num < maxNumberOfElements && rest != 0) || + (num == maxNumberOfElements && rest < 0)) + { + std::string message = "Error reading binary data, incorrect number of elements"; + OPM_THROW(std::runtime_error, message); + } - int dtail; - fileH.read(reinterpret_cast(&dtail), sizeof(dtail)); - dtail = Opm::EclIO::flipEndianInt(dtail); + int dtail; + fileH.read(reinterpret_cast(&dtail), sizeof(dtail)); + dtail = Opm::EclIO::flipEndianInt(dtail); - if (dhead != dtail) - OPM_THROW(std::runtime_error, "Error reading binary data, tail not matching header."); - } + if (dhead != dtail) + OPM_THROW(std::runtime_error, "Error reading binary data, tail not matching header."); } } - - for (size_t n=0; n < nVect; n++) - vectorLoaded[n] = true; } + + std::fill_n(vectorLoaded.begin(), nVect, true); } @@ -1103,23 +947,23 @@ ESmry::getListOfArrays(std::string filename, bool formatted) return resultVect; } -bool ESmry::make_lodsmry_file() +bool ESmry::make_esmry_file() { // check that loadBaseRunData is not set, this function only works for single smspec files // function will not replace existing lodsmry files (since this is already loaded by this class) // if lodsmry file exist, this function will return false and do nothing. if (!fromSingleRun) - OPM_THROW(std::invalid_argument, "creating lodsmry file only possible when loadBaseRunData=false"); + OPM_THROW(std::invalid_argument, "creating esmry file only possible when loadBaseRunData=false"); + + if (mini_steps.size() == 0) + this->read_ministeps_from_disk(); Opm::filesystem::path path = inputFileName.parent_path(); Opm::filesystem::path rootName = inputFileName.stem(); Opm::filesystem::path smryDataFile; - if (formattedFiles[0]) - smryDataFile = path / rootName += ".FLODSMRY"; - else - smryDataFile = path / rootName += ".LODSMRY"; + smryDataFile = path / rootName += ".ESMRY"; if (Opm::EclIO::fileExists(smryDataFile.string())) { @@ -1127,56 +971,46 @@ bool ESmry::make_lodsmry_file() } else { - std::vector keycheck; - keycheck.reserve(keyword.size()); + std::vector is_rstep; + is_rstep.reserve(timeStepList.size()); - std::string str1; - std::string str2; - std::string str3; + for (size_t i = 0; i < timeStepList.size(); i++) + if(std::find(seqIndex.begin(), seqIndex.end(), i) != seqIndex.end()) + is_rstep.push_back(1); + else + is_rstep.push_back(0); - for (auto key : keyword){ + this->LoadData(); - str2=""; - str3=""; + { + Opm::TimeStampUTC ts( std::chrono::system_clock::to_time_t( startdat )); - if (key.size() > 24) - str1 = key.substr(0,24); - else - str1 = key; + std::vector start_date_vect = {ts.day(), ts.month(), ts.year(), ts.hour(), + ts.minutes(), ts.seconds(), 0 }; - if (str1.size() > 8){ - str2 = str1.substr(8); - str1 = str1.substr(0,8); - } + std::vector units; + units.reserve(keyword.size()); - if (str2.size() > 8){ - str3 = str2.substr(8); - str2 = str2.substr(0,8); - } + for (auto key : keyword) + units.push_back(kwunits.at(key)); - keycheck.push_back(str1); - keycheck.push_back(str2); - keycheck.push_back(str3); - } + Opm::EclIO::EclOutput outFile(smryDataFile.string(), false, std::ios::out); - std::vector is_rstep; - is_rstep.reserve(timeStepList.size()); + outFile.write("START", start_date_vect); - for (size_t i = 0; i < timeStepList.size(); i++) - if(std::find(seqIndex.begin(), seqIndex.end(), i) != seqIndex.end()) - is_rstep.push_back(true); - else - is_rstep.push_back(false); + if (std::get<0>(restart_info) != ""){ + auto rst_file = std::get<0>(restart_info); + outFile.write("RESTART", {rst_file}); + outFile.write("RSTNUM", {std::get<1>(restart_info)}); + } - this->LoadData(); - - { - Opm::EclIO::EclOutput outFile(smryDataFile.string(), formattedFiles[0], std::ios::out); - outFile.write("KEYCHECK", keycheck); - outFile.write("RSTEP", is_rstep); + outFile.write("KEYCHECK", keyword); + outFile.write("UNITS", units); + outFile.write("RSTEP", is_rstep); + outFile.write("TSTEP", mini_steps); for (size_t n = 0; n < vectorData.size(); n++ ) { - std::string vect_name="V" + std::to_string(n); + const std::string vect_name = fmt::format("V{}", n); outFile.write(vect_name, vectorData[n]); } } @@ -1186,13 +1020,6 @@ bool ESmry::make_lodsmry_file() } -//-------------------------------------------------------------------------------------------------- -/// -//-------------------------------------------------------------------------------------------------- -void ESmry::use_lodsmry_file(bool enable) -{ - useLodsmryFile = enable; -} std::vector ESmry::checkForMultipleResultFiles(const Opm::filesystem::path& rootN, bool formatted) const { @@ -1248,115 +1075,135 @@ bool ESmry::hasKey(const std::string &key) const } -void ESmry::ijk_from_global_index(int glob,int &i,int &j,int &k) const +void ESmry::ijk_from_global_index(int glob, int &i, int &j, int &k) const { - const int tmpGlob = glob - 1; - - k = 1 + tmpGlob / (nI * nJ); - const int rest = tmpGlob % (nI * nJ); + glob -= 1; - j = 1 + rest / nI; - i = 1 + rest % nI; + i = 1 + (glob % this->nI); glob /= this->nI; + j = 1 + (glob % this->nJ); + k = 1 + (glob / this->nJ); } -std::string ESmry::makeKeyString(const std::string& keywordArg, const std::string& wgname, int num, const std::string& lgr, int lgri, int lgrj, int lgrk) const +std::string ESmry::makeKeyString(const std::string& keywordArg, const std::string& wgname, int num) const { - std::string keyStr; - const std::vector segmExcep= {"STEPTYPE", "SEPARATE", "SUMTHIN"}; + const auto no_wgname = std::string_view(":+:+:+:+"); - if (keywordArg.substr(0, 1) == "A") { - keyStr = keywordArg + ":" + std::to_string(num); - } else if (keywordArg.substr(0, 1) == "B") { - int _i,_j,_k; - ijk_from_global_index(num, _i, _j, _k); + const auto first = keywordArg[0]; - keyStr = keywordArg + ":" + std::to_string(_i) + "," + std::to_string(_j) + "," + std::to_string(_k); + if (first == 'A') { + if (num <= 0) { + return ""; + } - } else if (keywordArg.substr(0, 1) == "C") { - if (num > 0) { - int _i,_j,_k; - ijk_from_global_index(num, _i, _j, _k); - keyStr = keywordArg + ":" + wgname+ ":" + std::to_string(_i) + "," + std::to_string(_j) + "," + std::to_string(_k); + return fmt::format("{}:{}", keywordArg, num); + } + + if (first == 'B') { + if (num <= 0) { + return ""; } - } else if (keywordArg.substr(0, 1) == "G") { - if ( wgname != ":+:+:+:+") { - keyStr = keywordArg + ":" + wgname; + + int _i, _j, _k; + ijk_from_global_index(num, _i, _j, _k); + + return fmt::format("{}:{},{},{}", keywordArg, _i, _j, _k); + } + + if (first == 'C') { + if (num <= 0) { + return ""; } - } else if (keywordArg.substr(0, 1) == "R" && keywordArg.substr(2, 1) == "F") { - // NUMS = R1 + 32768*(R2 + 10) - int r2 = 0; - int y = 32768 * (r2 + 10) - num; - - while (y <0 ) { - r2++; - y = 32768 * (r2 + 10) - num; + + int _i, _j, _k; + ijk_from_global_index(num, _i, _j, _k); + + return fmt::format("{}:{}:{},{},{}", keywordArg, wgname, _i, _j, _k); + } + + if (first == 'G') { + if (wgname == no_wgname) { + return ""; } - r2--; - const int r1 = num - 32768 * (r2 + 10); + return fmt::format("{}:{}", keywordArg, wgname); + } - keyStr = keywordArg + ":" + std::to_string(r1) + "-" + std::to_string(r2); - } else if (keywordArg.substr(0, 1) == "R") { - keyStr = keywordArg + ":" + std::to_string(num); - } else if (keywordArg.substr(0, 1) == "S") { - auto it = std::find(segmExcep.begin(), segmExcep.end(), keywordArg); - if (it != segmExcep.end()) { - keyStr = keywordArg; - } else { - keyStr = keywordArg + ":" + wgname + ":" + std::to_string(num); + if (first == 'R') { + if (num <= 0) { + return ""; } - } else if (keywordArg.substr(0,1) == "W") { - if (wgname != ":+:+:+:+") { - keyStr = keywordArg + ":" + wgname; + + std::string str34 = keywordArg.substr(2, 2); + std::string str45 = keywordArg.substr(3, 2); + + if (keywordArg == "RORFR") // exception, standard region summary keyword + return fmt::format("{}:{}", keywordArg, num); + + if ((str34 == "FR") || (str34 == "FT") || (str45 == "FR") || (str45 == "FT")) { + + // NUMS = R1 + 32768*(R2 + 10) + const auto r1 = num % (1UL << 15); + const auto r2 = (num / (1UL << 15)) - 10; + + return fmt::format("{}:{}-{}", keywordArg, r1, r2); } - } else { - keyStr = keywordArg; + + return fmt::format("{}:{}", keywordArg, num); } - if (keywordArg.size() > 1) { - std::string firstTwoLetters = keywordArg.substr(0, 2); + if (first == 'S') { + const std::vector segmExcep= {"STEPTYPE", "SEPARATE", "SUMTHIN"}; - if (firstTwoLetters == "LW") - { - if (wgname != ":+:+:+:+") { - keyStr = SummaryNode::create_key_lgr_well(keywordArg, wgname, lgr); - } + auto it = std::find(segmExcep.begin(), segmExcep.end(), keywordArg); + if (it != segmExcep.end()) { + return keywordArg; } - if (firstTwoLetters == "LC") - { - if (wgname != ":+:+:+:+") { - keyStr = SummaryNode::create_key_lgr_completion(keywordArg, wgname, lgr, lgri, lgrj, lgrk); - } + + if (wgname == no_wgname) { + return ""; } - if (firstTwoLetters == "LB") - { - keyStr = SummaryNode::create_key_lgr_block(keywordArg, lgr, lgri, lgrj, lgrk); + + if (num <= 0) { + return ""; + } + + return fmt::format("{}:{}:{}", keywordArg, wgname, num); + } + + if (first == 'W') { + if (wgname == no_wgname) { + return ""; } + + return fmt::format("{}:{}", keywordArg, wgname); } - return keyStr; + return keywordArg; } -std::string ESmry::unpackNumber(const SummaryNode& node) const { +std::string ESmry::unpackNumber(const SummaryNode& node) const +{ if (node.category == SummaryNode::Category::Block || node.category == SummaryNode::Category::Connection) { int _i,_j,_k; ijk_from_global_index(node.number, _i, _j, _k); - return std::to_string(_i) + "," + std::to_string(_j) + "," + std::to_string(_k); - } else if (node.category == SummaryNode::Category::Region && node.keyword[2] == 'F') { + return fmt::format("{},{},{}", _i, _j, _k); + } + else if (node.category == SummaryNode::Category::Region && node.keyword[2] == 'F') { const auto r1 = node.number % (1 << 15); const auto r2 = (node.number / (1 << 15)) - 10; - return std::to_string(r1) + "-" + std::to_string(r2); - } else { - return std::to_string(node.number); + return fmt::format("{}-{}", r1, r2); + } + else { + return fmt::format("{}", node.number); } } std::string ESmry::lookupKey(const SummaryNode& node) const { - return node.unique_key(std::bind( &ESmry::unpackNumber, this, std::placeholders::_1 )); + return node.unique_key([this](const auto& num) { return this->unpackNumber(num); }); } const std::vector& ESmry::get(const SummaryNode& node) const { @@ -1450,4 +1297,4 @@ std::vector ESmry::dates_at_rstep() const { const auto& full_vector = this->dates(); return this->rstep_vector(full_vector); } -}} // namespace Opm::ecl +}} // namespace Opm::EclIO diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclFile.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclFile.cpp index f1280e2bb6..795b8cad78 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclFile.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclFile.cpp @@ -20,7 +20,7 @@ #include #include -//#include +#include #include #include #include @@ -48,8 +48,7 @@ void EclFile::load(bool preload) { } if (!fileH) - //throw std::runtime_error(fmt::format("Can not open EclFile: {}", this->inputFilename)); - throw std::runtime_error("Can not open EclFile: {}"); + throw std::runtime_error(fmt::format("Can not open EclFile: {}", this->inputFilename)); int n = 0; while (!isEOF(&fileH)) { @@ -110,7 +109,7 @@ EclFile::EclFile(const std::string& filename, bool preload) : inputFilename(filename) { if (!fileExists(filename)) - throw std::runtime_error("Can not open EclFile: {}"); + throw std::runtime_error(fmt::format("Can not open EclFile: {}", filename)); formatted = isFormatted(filename); this->load(preload); @@ -225,16 +224,13 @@ void EclFile::loadData(const std::string& name) inFile.seekg(ifStreamPos[arrIndex]); - char* buffer; size_t size = sizeOnDiskFormatted(array_size[arrIndex], array_type[arrIndex], array_element_size[arrIndex])+1; - buffer = new char [size]; - inFile.read (buffer, size); + std::vector buffer(size); + inFile.read (buffer.data(), size); - std::string fileStr = std::string(buffer, size); + std::string fileStr = std::string(buffer.data(), size); loadFormattedArray(fileStr, arrIndex, 0); - - delete[] buffer; } } @@ -270,16 +266,13 @@ void EclFile::loadData(const std::vector& arrIndex) inFile.seekg(ifStreamPos[ind]); - char* buffer; size_t size = sizeOnDiskFormatted(array_size[ind], array_type[ind], array_element_size[ind])+1; - buffer = new char [size]; - inFile.read (buffer, size); + std::vector buffer(size); + inFile.read (buffer.data(), size); - std::string fileStr = std::string(buffer, size); + std::string fileStr = std::string(buffer.data(), size); loadFormattedArray(fileStr, ind, 0); - - delete[] buffer; } } else { @@ -308,17 +301,14 @@ void EclFile::loadData(int arrIndex) inFile.seekg(ifStreamPos[arrIndex]); - char* buffer; size_t size = sizeOnDiskFormatted(array_size[arrIndex], array_type[arrIndex], array_element_size[arrIndex])+1; - buffer = new char [size]; - inFile.read (buffer, size); + std::vector buffer(size); + inFile.read (buffer.data(), size); - std::string fileStr = std::string(buffer, size); + std::string fileStr = std::string(buffer.data(), size); loadFormattedArray(fileStr, arrIndex, 0); - delete[] buffer; - } else { std::fstream fileH; @@ -422,17 +412,15 @@ std::vector EclFile::get_fmt_real_raw_str_values(int arrIndex) cons inFile.seekg(ifStreamPos[arrIndex]); - char* buffer; size_t size = sizeOnDiskFormatted(array_size[arrIndex], array_type[arrIndex], array_element_size[arrIndex])+1; - buffer = new char [size]; - inFile.read (buffer, size); + std::vector buffer(size); + inFile.read (buffer.data(), size); - std::string fileStr = std::string(buffer, size); + std::string fileStr = std::string(buffer.data(), size); std::vector real_vect_str; real_vect_str = readFormattedRealRawStrings(fileStr, array_size[arrIndex], 0); - delete buffer; return real_vect_str; } @@ -632,6 +620,24 @@ const std::vector& EclFile::get(const std::string &nam } +template +const std::vector& EclFile::getImpl(int arrIndex, eclArrType type, + const std::unordered_map>& array, + const std::string& typeStr) +{ + if (array_type[arrIndex] != type) { + std::string message = "Array with index " + std::to_string(arrIndex) + " is not of type " + typeStr; + OPM_THROW(std::runtime_error, message); + } + + if (!arrayLoaded[arrIndex]) { + loadData(arrIndex); + } + + return array.at(arrIndex); +} + + std::size_t EclFile::size() const { return this->array_name.size(); } diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclOutput.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclOutput.cpp index 4be9ee6b0d..24b3b8c710 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclOutput.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclOutput.cpp @@ -102,7 +102,7 @@ void EclOutput::write(const std::string& name, const std::vector& d }); if (it->size() > static_cast(element_size)) - OPM_THROW(std::runtime_error, "specified element size for type C0NN less than maximum string length in ouput data"); + OPM_THROW(std::runtime_error, "specified element size for type C0NN less than maximum string length in output data"); } if (isFormatted) @@ -222,14 +222,9 @@ void EclOutput::writeBinaryHeader(const std::string&arrName, int64_t size, eclAr template void EclOutput::writeBinaryArray(const std::vector& data) { - int num, rval; - int64_t rest; + int num; + int64_t rest, offset; int dhead; - float value_f; - double value_d; - int intVal; - - int64_t n = 0; int64_t size = data.size(); eclArrType arrType = MESS; @@ -257,6 +252,9 @@ void EclOutput::writeBinaryArray(const std::vector& data) int logi_true_val = ix_standard ? true_value_ix : true_value_ecl; rest = size * static_cast(sizeOfElement); + + offset = 0; + while (rest > 0) { if (rest > maxBlockSize) { rest -= maxBlockSize; @@ -270,27 +268,56 @@ void EclOutput::writeBinaryArray(const std::vector& data) ofileH.write(reinterpret_cast(&dhead), sizeof(dhead)); - for (int i = 0; i < num; i++) { - if (arrType == INTE) { - rval = flipEndianInt(data[n]); - ofileH.write(reinterpret_cast(&rval), sizeof(rval)); - } else if (arrType == REAL) { - value_f = flipEndianFloat(data[n]); - ofileH.write(reinterpret_cast(&value_f), sizeof(value_f)); - } else if (arrType == DOUB) { - value_d = flipEndianDouble(data[n]); - ofileH.write(reinterpret_cast(&value_d), sizeof(value_d)); - } else if (arrType == LOGI) { - intVal = data[n] ? logi_true_val : false_value; - ofileH.write(reinterpret_cast(&intVal), sizeOfElement); - } else { - std::cerr << "type not supported in write binaryarray\n"; - std::exit(EXIT_FAILURE); - } + if (arrType == INTE) { - n++; + std::vector flipped_data; + flipped_data.resize(num, 0); + + for (int m = 0; m < num; m++) + flipped_data[m] = flipEndianInt(data[m + offset]); + + ofileH.write((char*)(flipped_data.data()), flipped_data.size() * sizeof(int)) ; + + } else if (arrType == REAL) { + + std::vector flipped_data; + flipped_data.resize(num, 0); + + for (int m = 0; m < num; m++) + flipped_data[m] = flipEndianFloat(data[m + offset]); + + ofileH.write((char*)(flipped_data.data()), flipped_data.size() * sizeof(float)) ; + + } else if (arrType == DOUB) { + + std::vector flipped_data; + flipped_data.resize(num, 0); + + for (int m = 0; m < num; m++) + flipped_data[m] = flipEndianDouble(data[m + offset]); + + ofileH.write((char*)(flipped_data.data()), flipped_data.size() * sizeof(double)) ; + + } else if (arrType == LOGI) { + + std::vector logi_data; + logi_data.resize(num, 0); + + for (int m = 0; m < num; m++) + if (data[m + offset]) + logi_data[m] = logi_true_val; + else + logi_data[m] = false_value; + + ofileH.write((char*)(logi_data.data()), logi_data.size() * sizeof(int)) ; + + } else { + + std::cerr << "type not supported in write binaryarray\n"; + std::exit(EXIT_FAILURE); } + offset += num; ofileH.write(reinterpret_cast(&dhead), sizeof(dhead)); } } diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclUtil.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclUtil.cpp index 4b8d567125..2a53c94cc1 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclUtil.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/EclUtil.cpp @@ -83,28 +83,6 @@ bool Opm::EclIO::is_number(const std::string& numstr) } -bool Opm::EclIO::isEqualCaseInsensitive(const std::string& string1, const std::string& string2) -{ - std::string string1LowerCase(string1); - std::string string2LowerCase(string2); - - std::transform(string1.begin(), string1.end(), string1LowerCase.begin(), ::tolower); - std::transform(string2.begin(), string2.end(), string2LowerCase.begin(), ::tolower); - - return string1LowerCase == string2LowerCase; -} - -Opm::filesystem::path Opm::EclIO::findFileCaseInsensitive(const Opm::filesystem::path& folder, const std::string& filename) -{ - for (auto& p : Opm::filesystem::directory_iterator(folder)) { - std::string candidate = p.path().filename().string(); - - if (isEqualCaseInsensitive(filename, candidate)) return p.path(); - } - - return { }; -} - bool Opm::EclIO::isFormatted(const std::string& filename) { const auto p = filename.find_last_of("."); @@ -443,9 +421,9 @@ std::vector Opm::EclIO::readBinaryArray(std::fstream& fileH, const int64_t si std::get<0>(sizeData) = elementSize; } - int sizeOfElement = std::get<0>(sizeData); - int maxBlockSize = std::get<1>(sizeData); - int maxNumberOfElements = maxBlockSize / sizeOfElement; + const int sizeOfElement = std::get<0>(sizeData); + const int maxBlockSize = std::get<1>(sizeData); + const int maxNumberOfElements = maxBlockSize / sizeOfElement; arr.reserve(size); @@ -455,22 +433,25 @@ std::vector Opm::EclIO::readBinaryArray(std::fstream& fileH, const int64_t si int dhead; fileH.read(reinterpret_cast(&dhead), sizeof(dhead)); dhead = Opm::EclIO::flipEndianInt(dhead); - int num = dhead / sizeOfElement; + const int num = dhead / sizeOfElement; if ((num > maxNumberOfElements) || (num < 0)) { OPM_THROW(std::runtime_error, "Error reading binary data, inconsistent header data or incorrect number of elements"); } - for (int i = 0; i < num; i++) { - T2 value; - - if constexpr (std::is_same_v) { + if constexpr (std::is_same_v) { + for (int i = 0; i < num; i++) { + T2 value; value.resize(sizeOfElement) ; fileH.read(&value[0], sizeOfElement); - } else - fileH.read(reinterpret_cast(&value), sizeOfElement); + arr.push_back(flip(value)); + } + } else { + std::vector buf(num); + fileH.read(reinterpret_cast(buf.data()), buf.size()*sizeof(T2)); - arr.push_back(flip(value)); + for (const auto& value : buf) + arr.push_back(flip(value)); } rest -= num; diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ExtESmry.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ExtESmry.cpp new file mode 100644 index 0000000000..7cc1238292 --- /dev/null +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/io/eclipse/ExtESmry.cpp @@ -0,0 +1,478 @@ +/* + Copyright 2019 Equinor ASA. + + This file is part of the Open Porous Media project (OPM). + + OPM is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OPM is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with OPM. If not, see . + */ + +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#include "cross-platform/windows/Substitutes.hpp" +#else +#include +#endif + +#include +#include +#include +#include +#include + +namespace { + +Opm::time_point make_date(const std::vector& datetime) { + auto day = datetime[0]; + auto month = datetime[1]; + auto year = datetime[2]; + auto hour = 0; + auto minute = 0; + auto second = 0; + + if (datetime.size() == 6) { + hour = datetime[3]; + minute = datetime[4]; + auto total_usec = datetime[5]; + second = total_usec / 1000000; + } + + + const auto ts = Opm::TimeStampUTC{ Opm::TimeStampUTC::YMD{ year, month, day}}.hour(hour).minutes(minute).seconds(second); + return Opm::TimeService::from_time_t( Opm::asTimeT(ts) ); +} + + +} + + +/* + + KEYWORDS WGNAMES NUMS | PARAM index Corresponding ERT key + ------------------------------------------------+-------------------------------------------------- + WGOR OP_1 0 | 0 WGOR:OP_1 + FOPT +-+-+-+- 0 | 1 FOPT + WWCT OP_1 0 | 2 WWCT:OP_1 + WIR OP_1 0 | 3 WIR:OP_1 + WGOR WI_1 0 | 4 WWCT:OP_1 + WWCT W1_1 0 | 5 WWCT:WI_1 + BPR +-+-+- 12675 | 6 BPR:12675, BPR:i,j,k + RPR +-+-+- 1 | 7 RPR:1 + FOPT +-+-+- 0 | 8 FOPT + GGPR NORTH 0 | 9 GGPR:NORTH + COPR OP_1 5628 | 10 COPR:OP_1:56286, COPR:OP_1:i,j,k + RXF +-+-+- 32768*R1(R2 + 10) | 11 RXF:2-3 + SOFX OP_1 12675 | 12 SOFX:OP_1:12675, SOFX:OP_1:i,j,jk + +*/ + + +namespace Opm { namespace EclIO { + +ExtESmry::ExtESmry(const std::string &filename, bool loadBaseRunData) : + m_inputFileName { filename }, + m_loadBaseRun(loadBaseRunData) +{ + if (m_inputFileName.extension()=="") + m_inputFileName+=".ESMRY"; + + if (m_inputFileName.extension()!=".ESMRY") + throw std::invalid_argument("Input file should have extension .ESMRY"); + + m_lodsmry_files.push_back(m_inputFileName); + + Opm::filesystem::path rootName = m_inputFileName.parent_path() / m_inputFileName.stem(); + Opm::filesystem::path path = Opm::filesystem::current_path(); + + Opm::filesystem::path rstRootN; + + updatePathAndRootName(path, rootName); + + LodsmryHeadType lodsmry_head; + + auto lod_offset = open_esmry(m_inputFileName, lodsmry_head); + + m_startdat = std::get<0>(lodsmry_head); + + m_lod_offset.push_back(lod_offset); + + std::map key_index; + + auto keyword = std::get<2>(lodsmry_head); + auto units = std::get<3>(lodsmry_head); + + for (size_t n = 0; n < keyword.size(); n++){ + key_index[keyword[n]] = n; + m_keyword.push_back(keyword[n]); + } + + m_keyword_index.push_back(key_index); + + for (size_t n = 0; n < m_keyword.size(); n++) + kwunits[m_keyword[n]] = units[n]; + + RstEntry rst_entry = std::get<1>(lodsmry_head); + + m_rstep_v.push_back(std::get<4>(lodsmry_head)); + m_tstep_v.push_back(std::get<5>(lodsmry_head)); + + m_nTstep_v.push_back(m_tstep_v.back().size()); + + auto lod_arr_size = sizeOnDiskBinary(m_nTstep_v.back(), Opm::EclIO::REAL, sizeOfReal); + + m_lod_arr_size.push_back(lod_arr_size); + + m_tstep_range.push_back(std::make_tuple(0, m_tstep_v.back().size() - 1)); + + if ((loadBaseRunData) && (!std::get<0>(rst_entry).empty())) { + + auto restart = std::get<0>(rst_entry); + auto rstNum = std::get<1>(rst_entry); + + int sim_ind = 0; + while (!restart.empty()){ + sim_ind++; + + rstRootN = Opm::filesystem::path(restart); + + updatePathAndRootName(path, rstRootN); + + Opm::filesystem::path rstLodSmryFile = path / rstRootN; + rstLodSmryFile += ".ESMRY"; + + m_lodsmry_files.push_back(rstLodSmryFile); + + lod_offset = open_esmry(rstLodSmryFile, lodsmry_head); + + m_lod_offset.push_back(lod_offset); + + m_rstep_v.push_back(std::get<4>(lodsmry_head)); + m_tstep_v.push_back(std::get<5>(lodsmry_head)); + + m_nTstep_v.push_back(m_tstep_v.back().size()); + + lod_arr_size = sizeOnDiskBinary(m_nTstep_v.back(), Opm::EclIO::REAL, sizeOfReal); + m_lod_arr_size.push_back(lod_arr_size); + + int cidx = 0; + + auto it = std::find_if(m_rstep_v[sim_ind].begin(), m_rstep_v[sim_ind].end(), + [&cidx, &rstNum](const int & val) + { + if (val == 1) + ++cidx; + + return cidx == rstNum; + }); + + size_t ind = std::distance(m_rstep_v[sim_ind].begin(), it); + + m_tstep_range.push_back(std::make_tuple(0, ind)); + + key_index.clear(); + keyword = std::get<2>(lodsmry_head); + + for (size_t n = 0; n < keyword.size(); n++) + key_index[keyword[n]] = n; + + m_keyword_index.push_back(key_index); + + rst_entry = std::get<1>(lodsmry_head); + restart = std::get<0>(rst_entry); + rstNum = std::get<1>(rst_entry); + } + } + + m_nVect = m_keyword.size(); + + m_vectorData.resize(m_nVect, {}); + m_vectorLoaded.resize(m_nVect, false); + + int ind = static_cast(m_tstep_range.size()) - 1 ; + + while (ind > -1) { + int to_ind = std::get<1>(m_tstep_range[ind]); + m_rstep.insert(m_rstep.end(), m_rstep_v[ind].begin(), m_rstep_v[ind].begin() + to_ind + 1); + m_tstep.insert(m_tstep.end(), m_tstep_v[ind].begin(), m_tstep_v[ind].begin() + to_ind + 1); + ind--; + } + + m_nTstep = m_rstep.size(); + + for (size_t m = 0; m < m_rstep.size(); m++) + if (m_rstep[m] == 1) + m_seqIndex.push_back(m); +} + + +std::vector ExtESmry::get_at_rstep(const std::string& name) +{ + auto full_vect = this->get(name); + + std::vector rs_vect; + rs_vect.reserve(m_seqIndex.size()); + + for (auto r : m_seqIndex) + rs_vect.push_back(full_vect[r]); + + return rs_vect; +} + +std::string& ExtESmry::get_unit(const std::string& name) +{ + if ( m_keyword_index[0].find(name) == m_keyword_index[0].end() ) + throw std::invalid_argument("summary key '" + name + "' not found"); + + return kwunits.at(name); +} + +bool ExtESmry::all_steps_available() +{ + for (size_t n = 1; n < m_tstep.size(); n++) + if ((m_tstep[n] - m_tstep[n-1]) > 1) + return false; + + return true; +} + +uint64_t ExtESmry::open_esmry(Opm::filesystem::path& inputFileName, LodsmryHeadType& lodsmry_head) +{ + std::fstream fileH; + + fileH.open(inputFileName, std::ios::in | std::ios::binary); + + if (!fileH) + throw std::runtime_error("Can not open file "); + + + std::string arrName; + int64_t arr_size; + Opm::EclIO::eclArrType arrType; + int sizeOfElement; + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + + if ((arrName != "START ") or (arrType != Opm::EclIO::INTE)) + OPM_THROW(std::invalid_argument, "reading start, invalid lod file"); + + auto start_vect = Opm::EclIO::readBinaryInteArray(fileH, arr_size); + + auto startdat = make_date(start_vect); + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + + Opm::EclIO::RstEntry rst_entry = std::make_tuple("", 0); + + if (arrName == "RESTART "){ + + if (m_loadBaseRun) { + + std::vector rstfile = Opm::EclIO::readBinaryC0nnArray(fileH, arr_size, sizeOfElement); + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + std::vector rst_num = Opm::EclIO::readBinaryInteArray(fileH, arr_size); + + rst_entry = std::make_tuple(rstfile[0], rst_num[0]); + + } else { + uint64_t numIgnore = sizeOnDiskBinary(arr_size, arrType, sizeOfElement); + numIgnore = numIgnore + 24 + sizeOnDiskBinary(1, Opm::EclIO::INTE, Opm::EclIO::sizeOfInte); + fileH.seekg(static_cast(numIgnore), std::ios_base::cur); + } + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + } + + if (arrName != "KEYCHECK") + OPM_THROW(std::invalid_argument, "!!reading keycheck, invalid lod file"); + + std::vector keywords; + + keywords = Opm::EclIO::readBinaryC0nnArray(fileH, arr_size, sizeOfElement); + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + + if (arrName != "UNITS ") + OPM_THROW(std::invalid_argument, "reading UNITS, invalid lod file"); + + auto units = Opm::EclIO::readBinaryC0nnArray(fileH, arr_size, sizeOfElement); + + if (keywords.size() != units.size()) + throw std::runtime_error("invalied LODSMRY file, size of units not equal size of keywords"); + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + + if ((arrName != "RSTEP ") or (arrType != Opm::EclIO::INTE)) + OPM_THROW(std::invalid_argument, "reading RSTEP, invalid lod file"); + + auto rstep = Opm::EclIO::readBinaryInteArray(fileH, arr_size); + + Opm::EclIO::readBinaryHeader(fileH, arrName, arr_size, arrType, sizeOfElement); + + if ((arrName != "TSTEP ") or (arrType != Opm::EclIO::INTE)) + OPM_THROW(std::invalid_argument, "reading TSTEP, invalid lod file"); + + auto tstep = Opm::EclIO::readBinaryInteArray(fileH, arr_size); + + lodsmry_head = std::make_tuple(startdat, rst_entry, keywords, units, rstep, tstep); + + uint64_t lodsmry_offset = static_cast(fileH.tellg()); + + fileH.close(); + + return lodsmry_offset; +} + + +void ExtESmry::updatePathAndRootName(Opm::filesystem::path& dir, Opm::filesystem::path& rootN) { + + if (rootN.parent_path().is_absolute()){ + dir = rootN.parent_path(); + } else { + dir = dir / rootN.parent_path(); + } + + rootN = rootN.stem(); +} + + +void ExtESmry::loadData(const std::vector& stringVect) +{ + std::vector keyIndexVect; + + for (const auto& key: stringVect) + keyIndexVect.push_back(m_keyword_index[0].at(key)); + + std::fstream fileH; + + int ind = static_cast(m_tstep_range.size()) - 1 ; + + while (ind > -1) { + + int to_ind = std::get<1>(m_tstep_range[ind]); + + fileH.open(m_lodsmry_files[ind], std::ios::in | std::ios::binary); + + if (!fileH) + throw std::runtime_error("Can not open file lodFile"); + + for (size_t n = 0 ; n < stringVect.size(); n++) { + + std::string key = stringVect[n]; + + std::string arrName; + Opm::EclIO::eclArrType arrType; + + if ( m_keyword_index[ind].find(key) == m_keyword_index[ind].end() ) { + + for (int m = 0; m < to_ind + 1; m++) + m_vectorData[keyIndexVect[n]].push_back(0.0); + + } else { + + int key_ind = m_keyword_index[ind].at(key); + + uint64_t pos = m_lod_offset[ind] + m_lod_arr_size[ind]*static_cast(key_ind); + pos = pos + static_cast(key_ind * 24); // adding size of binary headers + + fileH.seekg (pos, fileH.beg); + + int64_t size; + int sizeOfElement; + readBinaryHeader(fileH, arrName, size, arrType, sizeOfElement); + + arrName = Opm::EclIO::trimr(arrName); + + std::string checkName = "V" + std::to_string(key_ind); + + if (arrName != checkName) + OPM_THROW(std::invalid_argument, "lodsmry, wrong header expecting " + checkName + " found " + arrName); + + auto smry_data = readBinaryRealArray(fileH, size); + + m_vectorData[keyIndexVect[n]].insert(m_vectorData[keyIndexVect[n]].end(), smry_data.begin(), smry_data.begin() + to_ind + 1); + } + } + + fileH.close(); + ind--; + } + + for (auto kind : keyIndexVect) + m_vectorLoaded[kind] = true; +} + +void ExtESmry::loadData() +{ + this->loadData(m_keyword); +} + +const std::vector& ExtESmry::get(const std::string& name) +{ + if ( m_keyword_index[0].find(name) == m_keyword_index[0].end() ) + throw std::invalid_argument("summary key '" + name + "' not found"); + + int index = m_keyword_index[0].at(name); + + if (!m_vectorLoaded[index]){ + loadData({name}); + } + + return m_vectorData[index]; +} + +std::vector ExtESmry::dates() { + double time_unit = 24 * 3600; + std::vector d; + + for (const auto& t : this->get("TIME")) + d.push_back( this->m_startdat + std::chrono::duration_cast( std::chrono::duration( t * time_unit))); + + return d; +} + +std::vector ExtESmry::keywordList(const std::string& pattern) const +{ + std::vector list; + + for (const auto& key : m_keyword) + if (fnmatch( pattern.c_str(), key.c_str(), 0 ) == 0 ) + list.push_back(key); + + return list; +} + +bool ExtESmry::hasKey(const std::string &key) const +{ + return std::find(m_keyword.begin(), m_keyword.end(), key) != m_keyword.end(); +} + + + +}} // namespace Opm::ecl + diff --git a/ThirdParty/custom-opm-common/opm-common/src/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp b/ThirdParty/custom-opm-common/opm-common/src/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp index d1053e5f52..17f6d8a8d1 100644 --- a/ThirdParty/custom-opm-common/opm-common/src/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp +++ b/ThirdParty/custom-opm-common/opm-common/src/opm/parser/eclipse/EclipseState/Grid/EclipseGrid.cpp @@ -28,6 +28,7 @@ #include #include +#include #include #include diff --git a/ThirdParty/fast_float b/ThirdParty/fast_float new file mode 160000 index 0000000000..052975dd5f --- /dev/null +++ b/ThirdParty/fast_float @@ -0,0 +1 @@ +Subproject commit 052975dd5f8166d0f9e4a215fa75a349d5985b91 diff --git a/ThirdParty/fmtlib/LICENSE.rst b/ThirdParty/fmtlib/LICENSE.rst new file mode 100644 index 0000000000..f0ec3db4d2 --- /dev/null +++ b/ThirdParty/fmtlib/LICENSE.rst @@ -0,0 +1,27 @@ +Copyright (c) 2012 - present, Victor Zverovich + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +--- Optional exception to the license --- + +As an exception, if, as a result of your compiling your source code, portions +of this Software are embedded into a machine-executable object form of such +source code, you may redistribute such embedded portions in such object form +without including the above copyright and permission notices. diff --git a/ThirdParty/fmtlib/README.opm b/ThirdParty/fmtlib/README.opm new file mode 100644 index 0000000000..ee971f32c9 --- /dev/null +++ b/ThirdParty/fmtlib/README.opm @@ -0,0 +1,12 @@ +The include/ directory is a copy of the include directory from version 7.0.3 of +the fmtlib distribution. The fmtlib can be found at https://github.com/fmtlib/fmt + +The fmtlib code embedded here should be compiled in header only mode, to ensure +that the symbol FMT_HEADER_ONLY must be defined before the the fmt/format.h +header is included: + + #define FMT_HEADER_ONLY + #include + + .... + auto msg = fmt::format("Hello {}", "world"); \ No newline at end of file diff --git a/ThirdParty/fmtlib/include/fmt/chrono.h b/ThirdParty/fmtlib/include/fmt/chrono.h new file mode 100644 index 0000000000..e70b8053a6 --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/chrono.h @@ -0,0 +1,1123 @@ +// Formatting library for C++ - chrono support +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CHRONO_H_ +#define FMT_CHRONO_H_ + +#include +#include +#include +#include + +#include "format.h" +#include "locale.h" + +FMT_BEGIN_NAMESPACE + +// Enable safe chrono durations, unless explicitly disabled. +#ifndef FMT_SAFE_DURATION_CAST +# define FMT_SAFE_DURATION_CAST 1 +#endif +#if FMT_SAFE_DURATION_CAST + +// For conversion between std::chrono::durations without undefined +// behaviour or erroneous results. +// This is a stripped down version of duration_cast, for inclusion in fmt. +// See https://github.com/pauldreik/safe_duration_cast +// +// Copyright Paul Dreik 2019 +namespace safe_duration_cast { + +template ::value && + std::numeric_limits::is_signed == + std::numeric_limits::is_signed)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + using F = std::numeric_limits; + using T = std::numeric_limits; + static_assert(F::is_integer, "From must be integral"); + static_assert(T::is_integer, "To must be integral"); + + // A and B are both signed, or both unsigned. + if (F::digits <= T::digits) { + // From fits in To without any problem. + } else { + // From does not always fit in To, resort to a dynamic check. + if (from < (T::min)() || from > (T::max)()) { + // outside range. + ec = 1; + return {}; + } + } + return static_cast(from); +} + +/** + * converts From to To, without loss. If the dynamic value of from + * can't be converted to To without loss, ec is set. + */ +template ::value && + std::numeric_limits::is_signed != + std::numeric_limits::is_signed)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + using F = std::numeric_limits; + using T = std::numeric_limits; + static_assert(F::is_integer, "From must be integral"); + static_assert(T::is_integer, "To must be integral"); + + if (F::is_signed && !T::is_signed) { + // From may be negative, not allowed! + if (fmt::detail::is_negative(from)) { + ec = 1; + return {}; + } + + // From is positive. Can it always fit in To? + if (F::digits <= T::digits) { + // yes, From always fits in To. + } else { + // from may not fit in To, we have to do a dynamic check + if (from > static_cast((T::max)())) { + ec = 1; + return {}; + } + } + } + + if (!F::is_signed && T::is_signed) { + // can from be held in To? + if (F::digits < T::digits) { + // yes, From always fits in To. + } else { + // from may not fit in To, we have to do a dynamic check + if (from > static_cast((T::max)())) { + // outside range. + ec = 1; + return {}; + } + } + } + + // reaching here means all is ok for lossless conversion. + return static_cast(from); + +} // function + +template ::value)> +FMT_CONSTEXPR To lossless_integral_conversion(const From from, int& ec) { + ec = 0; + return from; +} // function + +// clang-format off +/** + * converts From to To if possible, otherwise ec is set. + * + * input | output + * ---------------------------------|--------------- + * NaN | NaN + * Inf | Inf + * normal, fits in output | converted (possibly lossy) + * normal, does not fit in output | ec is set + * subnormal | best effort + * -Inf | -Inf + */ +// clang-format on +template ::value)> +FMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) { + ec = 0; + using T = std::numeric_limits; + static_assert(std::is_floating_point::value, "From must be floating"); + static_assert(std::is_floating_point::value, "To must be floating"); + + // catch the only happy case + if (std::isfinite(from)) { + if (from >= T::lowest() && from <= (T::max)()) { + return static_cast(from); + } + // not within range. + ec = 1; + return {}; + } + + // nan and inf will be preserved + return static_cast(from); +} // function + +template ::value)> +FMT_CONSTEXPR To safe_float_conversion(const From from, int& ec) { + ec = 0; + static_assert(std::is_floating_point::value, "From must be floating"); + return from; +} + +/** + * safe duration cast between integral durations + */ +template ::value), + FMT_ENABLE_IF(std::is_integral::value)> +To safe_duration_cast(std::chrono::duration from, + int& ec) { + using From = std::chrono::duration; + ec = 0; + // the basic idea is that we need to convert from count() in the from type + // to count() in the To type, by multiplying it with this: + struct Factor + : std::ratio_divide {}; + + static_assert(Factor::num > 0, "num must be positive"); + static_assert(Factor::den > 0, "den must be positive"); + + // the conversion is like this: multiply from.count() with Factor::num + // /Factor::den and convert it to To::rep, all this without + // overflow/underflow. let's start by finding a suitable type that can hold + // both To, From and Factor::num + using IntermediateRep = + typename std::common_type::type; + + // safe conversion to IntermediateRep + IntermediateRep count = + lossless_integral_conversion(from.count(), ec); + if (ec) { + return {}; + } + // multiply with Factor::num without overflow or underflow + if (Factor::num != 1) { + const auto max1 = detail::max_value() / Factor::num; + if (count > max1) { + ec = 1; + return {}; + } + const auto min1 = + (std::numeric_limits::min)() / Factor::num; + if (count < min1) { + ec = 1; + return {}; + } + count *= Factor::num; + } + + // this can't go wrong, right? den>0 is checked earlier. + if (Factor::den != 1) { + count /= Factor::den; + } + // convert to the to type, safely + using ToRep = typename To::rep; + const ToRep tocount = lossless_integral_conversion(count, ec); + if (ec) { + return {}; + } + return To{tocount}; +} + +/** + * safe duration_cast between floating point durations + */ +template ::value), + FMT_ENABLE_IF(std::is_floating_point::value)> +To safe_duration_cast(std::chrono::duration from, + int& ec) { + using From = std::chrono::duration; + ec = 0; + if (std::isnan(from.count())) { + // nan in, gives nan out. easy. + return To{std::numeric_limits::quiet_NaN()}; + } + // maybe we should also check if from is denormal, and decide what to do about + // it. + + // +-inf should be preserved. + if (std::isinf(from.count())) { + return To{from.count()}; + } + + // the basic idea is that we need to convert from count() in the from type + // to count() in the To type, by multiplying it with this: + struct Factor + : std::ratio_divide {}; + + static_assert(Factor::num > 0, "num must be positive"); + static_assert(Factor::den > 0, "den must be positive"); + + // the conversion is like this: multiply from.count() with Factor::num + // /Factor::den and convert it to To::rep, all this without + // overflow/underflow. let's start by finding a suitable type that can hold + // both To, From and Factor::num + using IntermediateRep = + typename std::common_type::type; + + // force conversion of From::rep -> IntermediateRep to be safe, + // even if it will never happen be narrowing in this context. + IntermediateRep count = + safe_float_conversion(from.count(), ec); + if (ec) { + return {}; + } + + // multiply with Factor::num without overflow or underflow + if (Factor::num != 1) { + constexpr auto max1 = detail::max_value() / + static_cast(Factor::num); + if (count > max1) { + ec = 1; + return {}; + } + constexpr auto min1 = std::numeric_limits::lowest() / + static_cast(Factor::num); + if (count < min1) { + ec = 1; + return {}; + } + count *= static_cast(Factor::num); + } + + // this can't go wrong, right? den>0 is checked earlier. + if (Factor::den != 1) { + using common_t = typename std::common_type::type; + count /= static_cast(Factor::den); + } + + // convert to the to type, safely + using ToRep = typename To::rep; + + const ToRep tocount = safe_float_conversion(count, ec); + if (ec) { + return {}; + } + return To{tocount}; +} +} // namespace safe_duration_cast +#endif + +// Prevents expansion of a preceding token as a function-style macro. +// Usage: f FMT_NOMACRO() +#define FMT_NOMACRO + +namespace detail { +inline null<> localtime_r FMT_NOMACRO(...) { return null<>(); } +inline null<> localtime_s(...) { return null<>(); } +inline null<> gmtime_r(...) { return null<>(); } +inline null<> gmtime_s(...) { return null<>(); } +} // namespace detail + +// Thread-safe replacement for std::localtime +inline std::tm localtime(std::time_t time) { + struct dispatcher { + std::time_t time_; + std::tm tm_; + + dispatcher(std::time_t t) : time_(t) {} + + bool run() { + using namespace fmt::detail; + return handle(localtime_r(&time_, &tm_)); + } + + bool handle(std::tm* tm) { return tm != nullptr; } + + bool handle(detail::null<>) { + using namespace fmt::detail; + return fallback(localtime_s(&tm_, &time_)); + } + + bool fallback(int res) { return res == 0; } + +#if !FMT_MSC_VER + bool fallback(detail::null<>) { + using namespace fmt::detail; + std::tm* tm = std::localtime(&time_); + if (tm) tm_ = *tm; + return tm != nullptr; + } +#endif + }; + dispatcher lt(time); + // Too big time values may be unsupported. + if (!lt.run()) FMT_THROW(format_error("time_t value out of range")); + return lt.tm_; +} + +// Thread-safe replacement for std::gmtime +inline std::tm gmtime(std::time_t time) { + struct dispatcher { + std::time_t time_; + std::tm tm_; + + dispatcher(std::time_t t) : time_(t) {} + + bool run() { + using namespace fmt::detail; + return handle(gmtime_r(&time_, &tm_)); + } + + bool handle(std::tm* tm) { return tm != nullptr; } + + bool handle(detail::null<>) { + using namespace fmt::detail; + return fallback(gmtime_s(&tm_, &time_)); + } + + bool fallback(int res) { return res == 0; } + +#if !FMT_MSC_VER + bool fallback(detail::null<>) { + std::tm* tm = std::gmtime(&time_); + if (tm) tm_ = *tm; + return tm != nullptr; + } +#endif + }; + dispatcher gt(time); + // Too big time values may be unsupported. + if (!gt.run()) FMT_THROW(format_error("time_t value out of range")); + return gt.tm_; +} + +namespace detail { +inline size_t strftime(char* str, size_t count, const char* format, + const std::tm* time) { + return std::strftime(str, count, format, time); +} + +inline size_t strftime(wchar_t* str, size_t count, const wchar_t* format, + const std::tm* time) { + return std::wcsftime(str, count, format, time); +} +} // namespace detail + +template struct formatter { + template + auto parse(ParseContext& ctx) -> decltype(ctx.begin()) { + auto it = ctx.begin(); + if (it != ctx.end() && *it == ':') ++it; + auto end = it; + while (end != ctx.end() && *end != '}') ++end; + tm_format.reserve(detail::to_unsigned(end - it + 1)); + tm_format.append(it, end); + tm_format.push_back('\0'); + return end; + } + + template + auto format(const std::tm& tm, FormatContext& ctx) -> decltype(ctx.out()) { + basic_memory_buffer buf; + size_t start = buf.size(); + for (;;) { + size_t size = buf.capacity() - start; + size_t count = detail::strftime(&buf[start], size, &tm_format[0], &tm); + if (count != 0) { + buf.resize(start + count); + break; + } + if (size >= tm_format.size() * 256) { + // If the buffer is 256 times larger than the format string, assume + // that `strftime` gives an empty result. There doesn't seem to be a + // better way to distinguish the two cases: + // https://github.com/fmtlib/fmt/issues/367 + break; + } + const size_t MIN_GROWTH = 10; + buf.reserve(buf.capacity() + (size > MIN_GROWTH ? size : MIN_GROWTH)); + } + return std::copy(buf.begin(), buf.end(), ctx.out()); + } + + basic_memory_buffer tm_format; +}; + +namespace detail { +template FMT_CONSTEXPR const char* get_units() { + return nullptr; +} +template <> FMT_CONSTEXPR const char* get_units() { return "as"; } +template <> FMT_CONSTEXPR const char* get_units() { return "fs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ps"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ns"; } +template <> FMT_CONSTEXPR const char* get_units() { return "µs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ms"; } +template <> FMT_CONSTEXPR const char* get_units() { return "cs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ds"; } +template <> FMT_CONSTEXPR const char* get_units>() { return "s"; } +template <> FMT_CONSTEXPR const char* get_units() { return "das"; } +template <> FMT_CONSTEXPR const char* get_units() { return "hs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "ks"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ms"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Gs"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ts"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Ps"; } +template <> FMT_CONSTEXPR const char* get_units() { return "Es"; } +template <> FMT_CONSTEXPR const char* get_units>() { + return "m"; +} +template <> FMT_CONSTEXPR const char* get_units>() { + return "h"; +} + +enum class numeric_system { + standard, + // Alternative numeric system, e.g. 十二 instead of 12 in ja_JP locale. + alternative +}; + +// Parses a put_time-like format string and invokes handler actions. +template +FMT_CONSTEXPR const Char* parse_chrono_format(const Char* begin, + const Char* end, + Handler&& handler) { + auto ptr = begin; + while (ptr != end) { + auto c = *ptr; + if (c == '}') break; + if (c != '%') { + ++ptr; + continue; + } + if (begin != ptr) handler.on_text(begin, ptr); + ++ptr; // consume '%' + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case '%': + handler.on_text(ptr - 1, ptr); + break; + case 'n': { + const Char newline[] = {'\n'}; + handler.on_text(newline, newline + 1); + break; + } + case 't': { + const Char tab[] = {'\t'}; + handler.on_text(tab, tab + 1); + break; + } + // Day of the week: + case 'a': + handler.on_abbr_weekday(); + break; + case 'A': + handler.on_full_weekday(); + break; + case 'w': + handler.on_dec0_weekday(numeric_system::standard); + break; + case 'u': + handler.on_dec1_weekday(numeric_system::standard); + break; + // Month: + case 'b': + handler.on_abbr_month(); + break; + case 'B': + handler.on_full_month(); + break; + // Hour, minute, second: + case 'H': + handler.on_24_hour(numeric_system::standard); + break; + case 'I': + handler.on_12_hour(numeric_system::standard); + break; + case 'M': + handler.on_minute(numeric_system::standard); + break; + case 'S': + handler.on_second(numeric_system::standard); + break; + // Other: + case 'c': + handler.on_datetime(numeric_system::standard); + break; + case 'x': + handler.on_loc_date(numeric_system::standard); + break; + case 'X': + handler.on_loc_time(numeric_system::standard); + break; + case 'D': + handler.on_us_date(); + break; + case 'F': + handler.on_iso_date(); + break; + case 'r': + handler.on_12_hour_time(); + break; + case 'R': + handler.on_24_hour_time(); + break; + case 'T': + handler.on_iso_time(); + break; + case 'p': + handler.on_am_pm(); + break; + case 'Q': + handler.on_duration_value(); + break; + case 'q': + handler.on_duration_unit(); + break; + case 'z': + handler.on_utc_offset(); + break; + case 'Z': + handler.on_tz_name(); + break; + // Alternative representation: + case 'E': { + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case 'c': + handler.on_datetime(numeric_system::alternative); + break; + case 'x': + handler.on_loc_date(numeric_system::alternative); + break; + case 'X': + handler.on_loc_time(numeric_system::alternative); + break; + default: + FMT_THROW(format_error("invalid format")); + } + break; + } + case 'O': + if (ptr == end) FMT_THROW(format_error("invalid format")); + c = *ptr++; + switch (c) { + case 'w': + handler.on_dec0_weekday(numeric_system::alternative); + break; + case 'u': + handler.on_dec1_weekday(numeric_system::alternative); + break; + case 'H': + handler.on_24_hour(numeric_system::alternative); + break; + case 'I': + handler.on_12_hour(numeric_system::alternative); + break; + case 'M': + handler.on_minute(numeric_system::alternative); + break; + case 'S': + handler.on_second(numeric_system::alternative); + break; + default: + FMT_THROW(format_error("invalid format")); + } + break; + default: + FMT_THROW(format_error("invalid format")); + } + begin = ptr; + } + if (begin != ptr) handler.on_text(begin, ptr); + return ptr; +} + +struct chrono_format_checker { + FMT_NORETURN void report_no_date() { FMT_THROW(format_error("no date")); } + + template void on_text(const Char*, const Char*) {} + FMT_NORETURN void on_abbr_weekday() { report_no_date(); } + FMT_NORETURN void on_full_weekday() { report_no_date(); } + FMT_NORETURN void on_dec0_weekday(numeric_system) { report_no_date(); } + FMT_NORETURN void on_dec1_weekday(numeric_system) { report_no_date(); } + FMT_NORETURN void on_abbr_month() { report_no_date(); } + FMT_NORETURN void on_full_month() { report_no_date(); } + void on_24_hour(numeric_system) {} + void on_12_hour(numeric_system) {} + void on_minute(numeric_system) {} + void on_second(numeric_system) {} + FMT_NORETURN void on_datetime(numeric_system) { report_no_date(); } + FMT_NORETURN void on_loc_date(numeric_system) { report_no_date(); } + FMT_NORETURN void on_loc_time(numeric_system) { report_no_date(); } + FMT_NORETURN void on_us_date() { report_no_date(); } + FMT_NORETURN void on_iso_date() { report_no_date(); } + void on_12_hour_time() {} + void on_24_hour_time() {} + void on_iso_time() {} + void on_am_pm() {} + void on_duration_value() {} + void on_duration_unit() {} + FMT_NORETURN void on_utc_offset() { report_no_date(); } + FMT_NORETURN void on_tz_name() { report_no_date(); } +}; + +template ::value)> +inline bool isnan(T) { + return false; +} +template ::value)> +inline bool isnan(T value) { + return std::isnan(value); +} + +template ::value)> +inline bool isfinite(T) { + return true; +} +template ::value)> +inline bool isfinite(T value) { + return std::isfinite(value); +} + +// Converts value to int and checks that it's in the range [0, upper). +template ::value)> +inline int to_nonnegative_int(T value, int upper) { + FMT_ASSERT(value >= 0 && value <= upper, "invalid value"); + (void)upper; + return static_cast(value); +} +template ::value)> +inline int to_nonnegative_int(T value, int upper) { + FMT_ASSERT( + std::isnan(value) || (value >= 0 && value <= static_cast(upper)), + "invalid value"); + (void)upper; + return static_cast(value); +} + +template ::value)> +inline T mod(T x, int y) { + return x % static_cast(y); +} +template ::value)> +inline T mod(T x, int y) { + return std::fmod(x, static_cast(y)); +} + +// If T is an integral type, maps T to its unsigned counterpart, otherwise +// leaves it unchanged (unlike std::make_unsigned). +template ::value> +struct make_unsigned_or_unchanged { + using type = T; +}; + +template struct make_unsigned_or_unchanged { + using type = typename std::make_unsigned::type; +}; + +#if FMT_SAFE_DURATION_CAST +// throwing version of safe_duration_cast +template +To fmt_safe_duration_cast(std::chrono::duration from) { + int ec; + To to = safe_duration_cast::safe_duration_cast(from, ec); + if (ec) FMT_THROW(format_error("cannot format duration")); + return to; +} +#endif + +template ::value)> +inline std::chrono::duration get_milliseconds( + std::chrono::duration d) { + // this may overflow and/or the result may not fit in the + // target type. +#if FMT_SAFE_DURATION_CAST + using CommonSecondsType = + typename std::common_type::type; + const auto d_as_common = fmt_safe_duration_cast(d); + const auto d_as_whole_seconds = + fmt_safe_duration_cast(d_as_common); + // this conversion should be nonproblematic + const auto diff = d_as_common - d_as_whole_seconds; + const auto ms = + fmt_safe_duration_cast>(diff); + return ms; +#else + auto s = std::chrono::duration_cast(d); + return std::chrono::duration_cast(d - s); +#endif +} + +template ::value)> +inline std::chrono::duration get_milliseconds( + std::chrono::duration d) { + using common_type = typename std::common_type::type; + auto ms = mod(d.count() * static_cast(Period::num) / + static_cast(Period::den) * 1000, + 1000); + return std::chrono::duration(static_cast(ms)); +} + +template +OutputIt format_duration_value(OutputIt out, Rep val, int precision) { + const Char pr_f[] = {'{', ':', '.', '{', '}', 'f', '}', 0}; + if (precision >= 0) return format_to(out, pr_f, val, precision); + const Char fp_f[] = {'{', ':', 'g', '}', 0}; + const Char format[] = {'{', '}', 0}; + return format_to(out, std::is_floating_point::value ? fp_f : format, + val); +} +template +OutputIt copy_unit(string_view unit, OutputIt out, Char) { + return std::copy(unit.begin(), unit.end(), out); +} + +template +OutputIt copy_unit(string_view unit, OutputIt out, wchar_t) { + // This works when wchar_t is UTF-32 because units only contain characters + // that have the same representation in UTF-16 and UTF-32. + utf8_to_utf16 u(unit); + return std::copy(u.c_str(), u.c_str() + u.size(), out); +} + +template +OutputIt format_duration_unit(OutputIt out) { + if (const char* unit = get_units()) + return copy_unit(string_view(unit), out, Char()); + const Char num_f[] = {'[', '{', '}', ']', 's', 0}; + if (const_check(Period::den == 1)) return format_to(out, num_f, Period::num); + const Char num_def_f[] = {'[', '{', '}', '/', '{', '}', ']', 's', 0}; + return format_to(out, num_def_f, Period::num, Period::den); +} + +template +struct chrono_formatter { + FormatContext& context; + OutputIt out; + int precision; + // rep is unsigned to avoid overflow. + using rep = + conditional_t::value && sizeof(Rep) < sizeof(int), + unsigned, typename make_unsigned_or_unchanged::type>; + rep val; + using seconds = std::chrono::duration; + seconds s; + using milliseconds = std::chrono::duration; + bool negative; + + using char_type = typename FormatContext::char_type; + + explicit chrono_formatter(FormatContext& ctx, OutputIt o, + std::chrono::duration d) + : context(ctx), + out(o), + val(static_cast(d.count())), + negative(false) { + if (d.count() < 0) { + val = 0 - val; + negative = true; + } + + // this may overflow and/or the result may not fit in the + // target type. +#if FMT_SAFE_DURATION_CAST + // might need checked conversion (rep!=Rep) + auto tmpval = std::chrono::duration(val); + s = fmt_safe_duration_cast(tmpval); +#else + s = std::chrono::duration_cast( + std::chrono::duration(val)); +#endif + } + + // returns true if nan or inf, writes to out. + bool handle_nan_inf() { + if (isfinite(val)) { + return false; + } + if (isnan(val)) { + write_nan(); + return true; + } + // must be +-inf + if (val > 0) { + write_pinf(); + } else { + write_ninf(); + } + return true; + } + + Rep hour() const { return static_cast(mod((s.count() / 3600), 24)); } + + Rep hour12() const { + Rep hour = static_cast(mod((s.count() / 3600), 12)); + return hour <= 0 ? 12 : hour; + } + + Rep minute() const { return static_cast(mod((s.count() / 60), 60)); } + Rep second() const { return static_cast(mod(s.count(), 60)); } + + std::tm time() const { + auto time = std::tm(); + time.tm_hour = to_nonnegative_int(hour(), 24); + time.tm_min = to_nonnegative_int(minute(), 60); + time.tm_sec = to_nonnegative_int(second(), 60); + return time; + } + + void write_sign() { + if (negative) { + *out++ = '-'; + negative = false; + } + } + + void write(Rep value, int width) { + write_sign(); + if (isnan(value)) return write_nan(); + uint32_or_64_or_128_t n = + to_unsigned(to_nonnegative_int(value, max_value())); + int num_digits = detail::count_digits(n); + if (width > num_digits) out = std::fill_n(out, width - num_digits, '0'); + out = format_decimal(out, n, num_digits).end; + } + + void write_nan() { std::copy_n("nan", 3, out); } + void write_pinf() { std::copy_n("inf", 3, out); } + void write_ninf() { std::copy_n("-inf", 4, out); } + + void format_localized(const tm& time, char format, char modifier = 0) { + if (isnan(val)) return write_nan(); + auto locale = context.locale().template get(); + auto& facet = std::use_facet>(locale); + std::basic_ostringstream os; + os.imbue(locale); + facet.put(os, os, ' ', &time, format, modifier); + auto str = os.str(); + std::copy(str.begin(), str.end(), out); + } + + void on_text(const char_type* begin, const char_type* end) { + std::copy(begin, end, out); + } + + // These are not implemented because durations don't have date information. + void on_abbr_weekday() {} + void on_full_weekday() {} + void on_dec0_weekday(numeric_system) {} + void on_dec1_weekday(numeric_system) {} + void on_abbr_month() {} + void on_full_month() {} + void on_datetime(numeric_system) {} + void on_loc_date(numeric_system) {} + void on_loc_time(numeric_system) {} + void on_us_date() {} + void on_iso_date() {} + void on_utc_offset() {} + void on_tz_name() {} + + void on_24_hour(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(hour(), 2); + auto time = tm(); + time.tm_hour = to_nonnegative_int(hour(), 24); + format_localized(time, 'H', 'O'); + } + + void on_12_hour(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(hour12(), 2); + auto time = tm(); + time.tm_hour = to_nonnegative_int(hour12(), 12); + format_localized(time, 'I', 'O'); + } + + void on_minute(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) return write(minute(), 2); + auto time = tm(); + time.tm_min = to_nonnegative_int(minute(), 60); + format_localized(time, 'M', 'O'); + } + + void on_second(numeric_system ns) { + if (handle_nan_inf()) return; + + if (ns == numeric_system::standard) { + write(second(), 2); +#if FMT_SAFE_DURATION_CAST + // convert rep->Rep + using duration_rep = std::chrono::duration; + using duration_Rep = std::chrono::duration; + auto tmpval = fmt_safe_duration_cast(duration_rep{val}); +#else + auto tmpval = std::chrono::duration(val); +#endif + auto ms = get_milliseconds(tmpval); + if (ms != std::chrono::milliseconds(0)) { + *out++ = '.'; + write(ms.count(), 3); + } + return; + } + auto time = tm(); + time.tm_sec = to_nonnegative_int(second(), 60); + format_localized(time, 'S', 'O'); + } + + void on_12_hour_time() { + if (handle_nan_inf()) return; + format_localized(time(), 'r'); + } + + void on_24_hour_time() { + if (handle_nan_inf()) { + *out++ = ':'; + handle_nan_inf(); + return; + } + + write(hour(), 2); + *out++ = ':'; + write(minute(), 2); + } + + void on_iso_time() { + on_24_hour_time(); + *out++ = ':'; + if (handle_nan_inf()) return; + write(second(), 2); + } + + void on_am_pm() { + if (handle_nan_inf()) return; + format_localized(time(), 'p'); + } + + void on_duration_value() { + if (handle_nan_inf()) return; + write_sign(); + out = format_duration_value(out, val, precision); + } + + void on_duration_unit() { + out = format_duration_unit(out); + } +}; +} // namespace detail + +template +struct formatter, Char> { + private: + basic_format_specs specs; + int precision; + using arg_ref_type = detail::arg_ref; + arg_ref_type width_ref; + arg_ref_type precision_ref; + mutable basic_string_view format_str; + using duration = std::chrono::duration; + + struct spec_handler { + formatter& f; + basic_format_parse_context& context; + basic_string_view format_str; + + template FMT_CONSTEXPR arg_ref_type make_arg_ref(Id arg_id) { + context.check_arg_id(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR arg_ref_type make_arg_ref(basic_string_view arg_id) { + context.check_arg_id(arg_id); + return arg_ref_type(arg_id); + } + + FMT_CONSTEXPR arg_ref_type make_arg_ref(detail::auto_id) { + return arg_ref_type(context.next_arg_id()); + } + + void on_error(const char* msg) { FMT_THROW(format_error(msg)); } + void on_fill(basic_string_view fill) { f.specs.fill = fill; } + void on_align(align_t align) { f.specs.align = align; } + void on_width(int width) { f.specs.width = width; } + void on_precision(int _precision) { f.precision = _precision; } + void end_precision() {} + + template void on_dynamic_width(Id arg_id) { + f.width_ref = make_arg_ref(arg_id); + } + + template void on_dynamic_precision(Id arg_id) { + f.precision_ref = make_arg_ref(arg_id); + } + }; + + using iterator = typename basic_format_parse_context::iterator; + struct parse_range { + iterator begin; + iterator end; + }; + + FMT_CONSTEXPR parse_range do_parse(basic_format_parse_context& ctx) { + auto begin = ctx.begin(), end = ctx.end(); + if (begin == end || *begin == '}') return {begin, begin}; + spec_handler handler{*this, ctx, format_str}; + begin = detail::parse_align(begin, end, handler); + if (begin == end) return {begin, begin}; + begin = detail::parse_width(begin, end, handler); + if (begin == end) return {begin, begin}; + if (*begin == '.') { + if (std::is_floating_point::value) + begin = detail::parse_precision(begin, end, handler); + else + handler.on_error("precision not allowed for this argument type"); + } + end = parse_chrono_format(begin, end, detail::chrono_format_checker()); + return {begin, end}; + } + + public: + formatter() : precision(-1) {} + + FMT_CONSTEXPR auto parse(basic_format_parse_context& ctx) + -> decltype(ctx.begin()) { + auto range = do_parse(ctx); + format_str = basic_string_view( + &*range.begin, detail::to_unsigned(range.end - range.begin)); + return range.end; + } + + template + auto format(const duration& d, FormatContext& ctx) -> decltype(ctx.out()) { + auto begin = format_str.begin(), end = format_str.end(); + // As a possible future optimization, we could avoid extra copying if width + // is not specified. + basic_memory_buffer buf; + auto out = std::back_inserter(buf); + detail::handle_dynamic_spec(specs.width, width_ref, + ctx); + detail::handle_dynamic_spec(precision, + precision_ref, ctx); + if (begin == end || *begin == '}') { + out = detail::format_duration_value(out, d.count(), precision); + detail::format_duration_unit(out); + } else { + detail::chrono_formatter f( + ctx, out, d); + f.precision = precision; + parse_chrono_format(begin, end, f); + } + return detail::write( + ctx.out(), basic_string_view(buf.data(), buf.size()), specs); + } +}; + +FMT_END_NAMESPACE + +#endif // FMT_CHRONO_H_ diff --git a/ThirdParty/fmtlib/include/fmt/color.h b/ThirdParty/fmtlib/include/fmt/color.h new file mode 100644 index 0000000000..b65f892afc --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/color.h @@ -0,0 +1,566 @@ +// Formatting library for C++ - color support +// +// Copyright (c) 2018 - present, Victor Zverovich and fmt contributors +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_COLOR_H_ +#define FMT_COLOR_H_ + +#include "format.h" + +FMT_BEGIN_NAMESPACE + +enum class color : uint32_t { + alice_blue = 0xF0F8FF, // rgb(240,248,255) + antique_white = 0xFAEBD7, // rgb(250,235,215) + aqua = 0x00FFFF, // rgb(0,255,255) + aquamarine = 0x7FFFD4, // rgb(127,255,212) + azure = 0xF0FFFF, // rgb(240,255,255) + beige = 0xF5F5DC, // rgb(245,245,220) + bisque = 0xFFE4C4, // rgb(255,228,196) + black = 0x000000, // rgb(0,0,0) + blanched_almond = 0xFFEBCD, // rgb(255,235,205) + blue = 0x0000FF, // rgb(0,0,255) + blue_violet = 0x8A2BE2, // rgb(138,43,226) + brown = 0xA52A2A, // rgb(165,42,42) + burly_wood = 0xDEB887, // rgb(222,184,135) + cadet_blue = 0x5F9EA0, // rgb(95,158,160) + chartreuse = 0x7FFF00, // rgb(127,255,0) + chocolate = 0xD2691E, // rgb(210,105,30) + coral = 0xFF7F50, // rgb(255,127,80) + cornflower_blue = 0x6495ED, // rgb(100,149,237) + cornsilk = 0xFFF8DC, // rgb(255,248,220) + crimson = 0xDC143C, // rgb(220,20,60) + cyan = 0x00FFFF, // rgb(0,255,255) + dark_blue = 0x00008B, // rgb(0,0,139) + dark_cyan = 0x008B8B, // rgb(0,139,139) + dark_golden_rod = 0xB8860B, // rgb(184,134,11) + dark_gray = 0xA9A9A9, // rgb(169,169,169) + dark_green = 0x006400, // rgb(0,100,0) + dark_khaki = 0xBDB76B, // rgb(189,183,107) + dark_magenta = 0x8B008B, // rgb(139,0,139) + dark_olive_green = 0x556B2F, // rgb(85,107,47) + dark_orange = 0xFF8C00, // rgb(255,140,0) + dark_orchid = 0x9932CC, // rgb(153,50,204) + dark_red = 0x8B0000, // rgb(139,0,0) + dark_salmon = 0xE9967A, // rgb(233,150,122) + dark_sea_green = 0x8FBC8F, // rgb(143,188,143) + dark_slate_blue = 0x483D8B, // rgb(72,61,139) + dark_slate_gray = 0x2F4F4F, // rgb(47,79,79) + dark_turquoise = 0x00CED1, // rgb(0,206,209) + dark_violet = 0x9400D3, // rgb(148,0,211) + deep_pink = 0xFF1493, // rgb(255,20,147) + deep_sky_blue = 0x00BFFF, // rgb(0,191,255) + dim_gray = 0x696969, // rgb(105,105,105) + dodger_blue = 0x1E90FF, // rgb(30,144,255) + fire_brick = 0xB22222, // rgb(178,34,34) + floral_white = 0xFFFAF0, // rgb(255,250,240) + forest_green = 0x228B22, // rgb(34,139,34) + fuchsia = 0xFF00FF, // rgb(255,0,255) + gainsboro = 0xDCDCDC, // rgb(220,220,220) + ghost_white = 0xF8F8FF, // rgb(248,248,255) + gold = 0xFFD700, // rgb(255,215,0) + golden_rod = 0xDAA520, // rgb(218,165,32) + gray = 0x808080, // rgb(128,128,128) + green = 0x008000, // rgb(0,128,0) + green_yellow = 0xADFF2F, // rgb(173,255,47) + honey_dew = 0xF0FFF0, // rgb(240,255,240) + hot_pink = 0xFF69B4, // rgb(255,105,180) + indian_red = 0xCD5C5C, // rgb(205,92,92) + indigo = 0x4B0082, // rgb(75,0,130) + ivory = 0xFFFFF0, // rgb(255,255,240) + khaki = 0xF0E68C, // rgb(240,230,140) + lavender = 0xE6E6FA, // rgb(230,230,250) + lavender_blush = 0xFFF0F5, // rgb(255,240,245) + lawn_green = 0x7CFC00, // rgb(124,252,0) + lemon_chiffon = 0xFFFACD, // rgb(255,250,205) + light_blue = 0xADD8E6, // rgb(173,216,230) + light_coral = 0xF08080, // rgb(240,128,128) + light_cyan = 0xE0FFFF, // rgb(224,255,255) + light_golden_rod_yellow = 0xFAFAD2, // rgb(250,250,210) + light_gray = 0xD3D3D3, // rgb(211,211,211) + light_green = 0x90EE90, // rgb(144,238,144) + light_pink = 0xFFB6C1, // rgb(255,182,193) + light_salmon = 0xFFA07A, // rgb(255,160,122) + light_sea_green = 0x20B2AA, // rgb(32,178,170) + light_sky_blue = 0x87CEFA, // rgb(135,206,250) + light_slate_gray = 0x778899, // rgb(119,136,153) + light_steel_blue = 0xB0C4DE, // rgb(176,196,222) + light_yellow = 0xFFFFE0, // rgb(255,255,224) + lime = 0x00FF00, // rgb(0,255,0) + lime_green = 0x32CD32, // rgb(50,205,50) + linen = 0xFAF0E6, // rgb(250,240,230) + magenta = 0xFF00FF, // rgb(255,0,255) + maroon = 0x800000, // rgb(128,0,0) + medium_aquamarine = 0x66CDAA, // rgb(102,205,170) + medium_blue = 0x0000CD, // rgb(0,0,205) + medium_orchid = 0xBA55D3, // rgb(186,85,211) + medium_purple = 0x9370DB, // rgb(147,112,219) + medium_sea_green = 0x3CB371, // rgb(60,179,113) + medium_slate_blue = 0x7B68EE, // rgb(123,104,238) + medium_spring_green = 0x00FA9A, // rgb(0,250,154) + medium_turquoise = 0x48D1CC, // rgb(72,209,204) + medium_violet_red = 0xC71585, // rgb(199,21,133) + midnight_blue = 0x191970, // rgb(25,25,112) + mint_cream = 0xF5FFFA, // rgb(245,255,250) + misty_rose = 0xFFE4E1, // rgb(255,228,225) + moccasin = 0xFFE4B5, // rgb(255,228,181) + navajo_white = 0xFFDEAD, // rgb(255,222,173) + navy = 0x000080, // rgb(0,0,128) + old_lace = 0xFDF5E6, // rgb(253,245,230) + olive = 0x808000, // rgb(128,128,0) + olive_drab = 0x6B8E23, // rgb(107,142,35) + orange = 0xFFA500, // rgb(255,165,0) + orange_red = 0xFF4500, // rgb(255,69,0) + orchid = 0xDA70D6, // rgb(218,112,214) + pale_golden_rod = 0xEEE8AA, // rgb(238,232,170) + pale_green = 0x98FB98, // rgb(152,251,152) + pale_turquoise = 0xAFEEEE, // rgb(175,238,238) + pale_violet_red = 0xDB7093, // rgb(219,112,147) + papaya_whip = 0xFFEFD5, // rgb(255,239,213) + peach_puff = 0xFFDAB9, // rgb(255,218,185) + peru = 0xCD853F, // rgb(205,133,63) + pink = 0xFFC0CB, // rgb(255,192,203) + plum = 0xDDA0DD, // rgb(221,160,221) + powder_blue = 0xB0E0E6, // rgb(176,224,230) + purple = 0x800080, // rgb(128,0,128) + rebecca_purple = 0x663399, // rgb(102,51,153) + red = 0xFF0000, // rgb(255,0,0) + rosy_brown = 0xBC8F8F, // rgb(188,143,143) + royal_blue = 0x4169E1, // rgb(65,105,225) + saddle_brown = 0x8B4513, // rgb(139,69,19) + salmon = 0xFA8072, // rgb(250,128,114) + sandy_brown = 0xF4A460, // rgb(244,164,96) + sea_green = 0x2E8B57, // rgb(46,139,87) + sea_shell = 0xFFF5EE, // rgb(255,245,238) + sienna = 0xA0522D, // rgb(160,82,45) + silver = 0xC0C0C0, // rgb(192,192,192) + sky_blue = 0x87CEEB, // rgb(135,206,235) + slate_blue = 0x6A5ACD, // rgb(106,90,205) + slate_gray = 0x708090, // rgb(112,128,144) + snow = 0xFFFAFA, // rgb(255,250,250) + spring_green = 0x00FF7F, // rgb(0,255,127) + steel_blue = 0x4682B4, // rgb(70,130,180) + tan = 0xD2B48C, // rgb(210,180,140) + teal = 0x008080, // rgb(0,128,128) + thistle = 0xD8BFD8, // rgb(216,191,216) + tomato = 0xFF6347, // rgb(255,99,71) + turquoise = 0x40E0D0, // rgb(64,224,208) + violet = 0xEE82EE, // rgb(238,130,238) + wheat = 0xF5DEB3, // rgb(245,222,179) + white = 0xFFFFFF, // rgb(255,255,255) + white_smoke = 0xF5F5F5, // rgb(245,245,245) + yellow = 0xFFFF00, // rgb(255,255,0) + yellow_green = 0x9ACD32 // rgb(154,205,50) +}; // enum class color + +enum class terminal_color : uint8_t { + black = 30, + red, + green, + yellow, + blue, + magenta, + cyan, + white, + bright_black = 90, + bright_red, + bright_green, + bright_yellow, + bright_blue, + bright_magenta, + bright_cyan, + bright_white +}; + +enum class emphasis : uint8_t { + bold = 1, + italic = 1 << 1, + underline = 1 << 2, + strikethrough = 1 << 3 +}; + +// rgb is a struct for red, green and blue colors. +// Using the name "rgb" makes some editors show the color in a tooltip. +struct rgb { + FMT_CONSTEXPR rgb() : r(0), g(0), b(0) {} + FMT_CONSTEXPR rgb(uint8_t r_, uint8_t g_, uint8_t b_) : r(r_), g(g_), b(b_) {} + FMT_CONSTEXPR rgb(uint32_t hex) + : r((hex >> 16) & 0xFF), g((hex >> 8) & 0xFF), b(hex & 0xFF) {} + FMT_CONSTEXPR rgb(color hex) + : r((uint32_t(hex) >> 16) & 0xFF), + g((uint32_t(hex) >> 8) & 0xFF), + b(uint32_t(hex) & 0xFF) {} + uint8_t r; + uint8_t g; + uint8_t b; +}; + +namespace detail { + +// color is a struct of either a rgb color or a terminal color. +struct color_type { + FMT_CONSTEXPR color_type() FMT_NOEXCEPT : is_rgb(), value{} {} + FMT_CONSTEXPR color_type(color rgb_color) FMT_NOEXCEPT : is_rgb(true), + value{} { + value.rgb_color = static_cast(rgb_color); + } + FMT_CONSTEXPR color_type(rgb rgb_color) FMT_NOEXCEPT : is_rgb(true), value{} { + value.rgb_color = (static_cast(rgb_color.r) << 16) | + (static_cast(rgb_color.g) << 8) | rgb_color.b; + } + FMT_CONSTEXPR color_type(terminal_color term_color) FMT_NOEXCEPT : is_rgb(), + value{} { + value.term_color = static_cast(term_color); + } + bool is_rgb; + union color_union { + uint8_t term_color; + uint32_t rgb_color; + } value; +}; +} // namespace detail + +// Experimental text formatting support. +class text_style { + public: + FMT_CONSTEXPR text_style(emphasis em = emphasis()) FMT_NOEXCEPT + : set_foreground_color(), + set_background_color(), + ems(em) {} + + FMT_CONSTEXPR text_style& operator|=(const text_style& rhs) { + if (!set_foreground_color) { + set_foreground_color = rhs.set_foreground_color; + foreground_color = rhs.foreground_color; + } else if (rhs.set_foreground_color) { + if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + foreground_color.value.rgb_color |= rhs.foreground_color.value.rgb_color; + } + + if (!set_background_color) { + set_background_color = rhs.set_background_color; + background_color = rhs.background_color; + } else if (rhs.set_background_color) { + if (!background_color.is_rgb || !rhs.background_color.is_rgb) + FMT_THROW(format_error("can't OR a terminal color")); + background_color.value.rgb_color |= rhs.background_color.value.rgb_color; + } + + ems = static_cast(static_cast(ems) | + static_cast(rhs.ems)); + return *this; + } + + friend FMT_CONSTEXPR text_style operator|(text_style lhs, + const text_style& rhs) { + return lhs |= rhs; + } + + FMT_CONSTEXPR text_style& operator&=(const text_style& rhs) { + if (!set_foreground_color) { + set_foreground_color = rhs.set_foreground_color; + foreground_color = rhs.foreground_color; + } else if (rhs.set_foreground_color) { + if (!foreground_color.is_rgb || !rhs.foreground_color.is_rgb) + FMT_THROW(format_error("can't AND a terminal color")); + foreground_color.value.rgb_color &= rhs.foreground_color.value.rgb_color; + } + + if (!set_background_color) { + set_background_color = rhs.set_background_color; + background_color = rhs.background_color; + } else if (rhs.set_background_color) { + if (!background_color.is_rgb || !rhs.background_color.is_rgb) + FMT_THROW(format_error("can't AND a terminal color")); + background_color.value.rgb_color &= rhs.background_color.value.rgb_color; + } + + ems = static_cast(static_cast(ems) & + static_cast(rhs.ems)); + return *this; + } + + friend FMT_CONSTEXPR text_style operator&(text_style lhs, + const text_style& rhs) { + return lhs &= rhs; + } + + FMT_CONSTEXPR bool has_foreground() const FMT_NOEXCEPT { + return set_foreground_color; + } + FMT_CONSTEXPR bool has_background() const FMT_NOEXCEPT { + return set_background_color; + } + FMT_CONSTEXPR bool has_emphasis() const FMT_NOEXCEPT { + return static_cast(ems) != 0; + } + FMT_CONSTEXPR detail::color_type get_foreground() const FMT_NOEXCEPT { + FMT_ASSERT(has_foreground(), "no foreground specified for this style"); + return foreground_color; + } + FMT_CONSTEXPR detail::color_type get_background() const FMT_NOEXCEPT { + FMT_ASSERT(has_background(), "no background specified for this style"); + return background_color; + } + FMT_CONSTEXPR emphasis get_emphasis() const FMT_NOEXCEPT { + FMT_ASSERT(has_emphasis(), "no emphasis specified for this style"); + return ems; + } + + private: + FMT_CONSTEXPR text_style(bool is_foreground, + detail::color_type text_color) FMT_NOEXCEPT + : set_foreground_color(), + set_background_color(), + ems() { + if (is_foreground) { + foreground_color = text_color; + set_foreground_color = true; + } else { + background_color = text_color; + set_background_color = true; + } + } + + friend FMT_CONSTEXPR_DECL text_style fg(detail::color_type foreground) + FMT_NOEXCEPT; + friend FMT_CONSTEXPR_DECL text_style bg(detail::color_type background) + FMT_NOEXCEPT; + + detail::color_type foreground_color; + detail::color_type background_color; + bool set_foreground_color; + bool set_background_color; + emphasis ems; +}; + +FMT_CONSTEXPR text_style fg(detail::color_type foreground) FMT_NOEXCEPT { + return text_style(/*is_foreground=*/true, foreground); +} + +FMT_CONSTEXPR text_style bg(detail::color_type background) FMT_NOEXCEPT { + return text_style(/*is_foreground=*/false, background); +} + +FMT_CONSTEXPR text_style operator|(emphasis lhs, emphasis rhs) FMT_NOEXCEPT { + return text_style(lhs) | rhs; +} + +namespace detail { + +template struct ansi_color_escape { + FMT_CONSTEXPR ansi_color_escape(detail::color_type text_color, + const char* esc) FMT_NOEXCEPT { + // If we have a terminal color, we need to output another escape code + // sequence. + if (!text_color.is_rgb) { + bool is_background = esc == detail::data::background_color; + uint32_t value = text_color.value.term_color; + // Background ASCII codes are the same as the foreground ones but with + // 10 more. + if (is_background) value += 10u; + + size_t index = 0; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + + if (value >= 100u) { + buffer[index++] = static_cast('1'); + value %= 100u; + } + buffer[index++] = static_cast('0' + value / 10u); + buffer[index++] = static_cast('0' + value % 10u); + + buffer[index++] = static_cast('m'); + buffer[index++] = static_cast('\0'); + return; + } + + for (int i = 0; i < 7; i++) { + buffer[i] = static_cast(esc[i]); + } + rgb color(text_color.value.rgb_color); + to_esc(color.r, buffer + 7, ';'); + to_esc(color.g, buffer + 11, ';'); + to_esc(color.b, buffer + 15, 'm'); + buffer[19] = static_cast(0); + } + FMT_CONSTEXPR ansi_color_escape(emphasis em) FMT_NOEXCEPT { + uint8_t em_codes[4] = {}; + uint8_t em_bits = static_cast(em); + if (em_bits & static_cast(emphasis::bold)) em_codes[0] = 1; + if (em_bits & static_cast(emphasis::italic)) em_codes[1] = 3; + if (em_bits & static_cast(emphasis::underline)) em_codes[2] = 4; + if (em_bits & static_cast(emphasis::strikethrough)) + em_codes[3] = 9; + + size_t index = 0; + for (int i = 0; i < 4; ++i) { + if (!em_codes[i]) continue; + buffer[index++] = static_cast('\x1b'); + buffer[index++] = static_cast('['); + buffer[index++] = static_cast('0' + em_codes[i]); + buffer[index++] = static_cast('m'); + } + buffer[index++] = static_cast(0); + } + FMT_CONSTEXPR operator const Char*() const FMT_NOEXCEPT { return buffer; } + + FMT_CONSTEXPR const Char* begin() const FMT_NOEXCEPT { return buffer; } + FMT_CONSTEXPR const Char* end() const FMT_NOEXCEPT { + return buffer + std::char_traits::length(buffer); + } + + private: + Char buffer[7u + 3u * 4u + 1u]; + + static FMT_CONSTEXPR void to_esc(uint8_t c, Char* out, + char delimiter) FMT_NOEXCEPT { + out[0] = static_cast('0' + c / 100); + out[1] = static_cast('0' + c / 10 % 10); + out[2] = static_cast('0' + c % 10); + out[3] = static_cast(delimiter); + } +}; + +template +FMT_CONSTEXPR ansi_color_escape make_foreground_color( + detail::color_type foreground) FMT_NOEXCEPT { + return ansi_color_escape(foreground, detail::data::foreground_color); +} + +template +FMT_CONSTEXPR ansi_color_escape make_background_color( + detail::color_type background) FMT_NOEXCEPT { + return ansi_color_escape(background, detail::data::background_color); +} + +template +FMT_CONSTEXPR ansi_color_escape make_emphasis(emphasis em) FMT_NOEXCEPT { + return ansi_color_escape(em); +} + +template +inline void fputs(const Char* chars, FILE* stream) FMT_NOEXCEPT { + std::fputs(chars, stream); +} + +template <> +inline void fputs(const wchar_t* chars, FILE* stream) FMT_NOEXCEPT { + std::fputws(chars, stream); +} + +template inline void reset_color(FILE* stream) FMT_NOEXCEPT { + fputs(detail::data::reset_color, stream); +} + +template <> inline void reset_color(FILE* stream) FMT_NOEXCEPT { + fputs(detail::data::wreset_color, stream); +} + +template +inline void reset_color(basic_memory_buffer& buffer) FMT_NOEXCEPT { + const char* begin = data::reset_color; + const char* end = begin + sizeof(data::reset_color) - 1; + buffer.append(begin, end); +} + +template +void vformat_to(basic_memory_buffer& buf, const text_style& ts, + basic_string_view format_str, + basic_format_args> args) { + bool has_style = false; + if (ts.has_emphasis()) { + has_style = true; + auto emphasis = detail::make_emphasis(ts.get_emphasis()); + buf.append(emphasis.begin(), emphasis.end()); + } + if (ts.has_foreground()) { + has_style = true; + auto foreground = detail::make_foreground_color(ts.get_foreground()); + buf.append(foreground.begin(), foreground.end()); + } + if (ts.has_background()) { + has_style = true; + auto background = detail::make_background_color(ts.get_background()); + buf.append(background.begin(), background.end()); + } + detail::vformat_to(buf, format_str, args); + if (has_style) detail::reset_color(buf); +} +} // namespace detail + +template > +void vprint(std::FILE* f, const text_style& ts, const S& format, + basic_format_args> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, to_string_view(format), args); + buf.push_back(Char(0)); + detail::fputs(buf.data(), f); +} + +/** + Formats a string and prints it to the specified file stream using ANSI + escape sequences to specify text formatting. + Example: + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + */ +template ::value)> +void print(std::FILE* f, const text_style& ts, const S& format_str, + const Args&... args) { + detail::check_format_string(format_str); + using context = buffer_context>; + format_arg_store as{args...}; + vprint(f, ts, format_str, basic_format_args(as)); +} + +/** + Formats a string and prints it to stdout using ANSI escape sequences to + specify text formatting. + Example: + fmt::print(fmt::emphasis::bold | fg(fmt::color::red), + "Elapsed time: {0:.2f} seconds", 1.23); + */ +template ::value)> +void print(const text_style& ts, const S& format_str, const Args&... args) { + return print(stdout, ts, format_str, args...); +} + +template > +inline std::basic_string vformat( + const text_style& ts, const S& format_str, + basic_format_args>> args) { + basic_memory_buffer buf; + detail::vformat_to(buf, ts, to_string_view(format_str), args); + return fmt::to_string(buf); +} + +/** + \rst + Formats arguments and returns the result as a string using ANSI + escape sequences to specify text formatting. + + **Example**:: + + #include + std::string message = fmt::format(fmt::emphasis::bold | fg(fmt::color::red), + "The answer is {}", 42); + \endrst +*/ +template > +inline std::basic_string format(const text_style& ts, const S& format_str, + const Args&... args) { + return vformat(ts, to_string_view(format_str), + detail::make_args_checked(format_str, args...)); +} + +FMT_END_NAMESPACE + +#endif // FMT_COLOR_H_ diff --git a/ThirdParty/fmtlib/include/fmt/compile.h b/ThirdParty/fmtlib/include/fmt/compile.h new file mode 100644 index 0000000000..d7e6449ebb --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/compile.h @@ -0,0 +1,665 @@ +// Formatting library for C++ - experimental format string compilation +// +// Copyright (c) 2012 - present, Victor Zverovich and fmt contributors +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_COMPILE_H_ +#define FMT_COMPILE_H_ + +#include + +#include "format.h" + +FMT_BEGIN_NAMESPACE +namespace detail { + +// A compile-time string which is compiled into fast formatting code. +class compiled_string {}; + +template +struct is_compiled_string : std::is_base_of {}; + +/** + \rst + Converts a string literal *s* into a format string that will be parsed at + compile time and converted into efficient formatting code. Requires C++17 + ``constexpr if`` compiler support. + + **Example**:: + + // Converts 42 into std::string using the most efficient method and no + // runtime format string processing. + std::string s = fmt::format(FMT_COMPILE("{}"), 42); + \endrst + */ +#define FMT_COMPILE(s) FMT_STRING_IMPL(s, fmt::detail::compiled_string) + +template +const T& first(const T& value, const Tail&...) { + return value; +} + +// Part of a compiled format string. It can be either literal text or a +// replacement field. +template struct format_part { + enum class kind { arg_index, arg_name, text, replacement }; + + struct replacement { + arg_ref arg_id; + dynamic_format_specs specs; + }; + + kind part_kind; + union value { + int arg_index; + basic_string_view str; + replacement repl; + + FMT_CONSTEXPR value(int index = 0) : arg_index(index) {} + FMT_CONSTEXPR value(basic_string_view s) : str(s) {} + FMT_CONSTEXPR value(replacement r) : repl(r) {} + } val; + // Position past the end of the argument id. + const Char* arg_id_end = nullptr; + + FMT_CONSTEXPR format_part(kind k = kind::arg_index, value v = {}) + : part_kind(k), val(v) {} + + static FMT_CONSTEXPR format_part make_arg_index(int index) { + return format_part(kind::arg_index, index); + } + static FMT_CONSTEXPR format_part make_arg_name(basic_string_view name) { + return format_part(kind::arg_name, name); + } + static FMT_CONSTEXPR format_part make_text(basic_string_view text) { + return format_part(kind::text, text); + } + static FMT_CONSTEXPR format_part make_replacement(replacement repl) { + return format_part(kind::replacement, repl); + } +}; + +template struct part_counter { + unsigned num_parts = 0; + + FMT_CONSTEXPR void on_text(const Char* begin, const Char* end) { + if (begin != end) ++num_parts; + } + + FMT_CONSTEXPR int on_arg_id() { return ++num_parts, 0; } + FMT_CONSTEXPR int on_arg_id(int) { return ++num_parts, 0; } + FMT_CONSTEXPR int on_arg_id(basic_string_view) { + return ++num_parts, 0; + } + + FMT_CONSTEXPR void on_replacement_field(int, const Char*) {} + + FMT_CONSTEXPR const Char* on_format_specs(int, const Char* begin, + const Char* end) { + // Find the matching brace. + unsigned brace_counter = 0; + for (; begin != end; ++begin) { + if (*begin == '{') { + ++brace_counter; + } else if (*begin == '}') { + if (brace_counter == 0u) break; + --brace_counter; + } + } + return begin; + } + + FMT_CONSTEXPR void on_error(const char*) {} +}; + +// Counts the number of parts in a format string. +template +FMT_CONSTEXPR unsigned count_parts(basic_string_view format_str) { + part_counter counter; + parse_format_string(format_str, counter); + return counter.num_parts; +} + +template +class format_string_compiler : public error_handler { + private: + using part = format_part; + + PartHandler handler_; + part part_; + basic_string_view format_str_; + basic_format_parse_context parse_context_; + + public: + FMT_CONSTEXPR format_string_compiler(basic_string_view format_str, + PartHandler handler) + : handler_(handler), + format_str_(format_str), + parse_context_(format_str) {} + + FMT_CONSTEXPR void on_text(const Char* begin, const Char* end) { + if (begin != end) + handler_(part::make_text({begin, to_unsigned(end - begin)})); + } + + FMT_CONSTEXPR int on_arg_id() { + part_ = part::make_arg_index(parse_context_.next_arg_id()); + return 0; + } + + FMT_CONSTEXPR int on_arg_id(int id) { + parse_context_.check_arg_id(id); + part_ = part::make_arg_index(id); + return 0; + } + + FMT_CONSTEXPR int on_arg_id(basic_string_view id) { + part_ = part::make_arg_name(id); + return 0; + } + + FMT_CONSTEXPR void on_replacement_field(int, const Char* ptr) { + part_.arg_id_end = ptr; + handler_(part_); + } + + FMT_CONSTEXPR const Char* on_format_specs(int, const Char* begin, + const Char* end) { + auto repl = typename part::replacement(); + dynamic_specs_handler> handler( + repl.specs, parse_context_); + auto it = parse_format_specs(begin, end, handler); + if (*it != '}') on_error("missing '}' in format string"); + repl.arg_id = part_.part_kind == part::kind::arg_index + ? arg_ref(part_.val.arg_index) + : arg_ref(part_.val.str); + auto part = part::make_replacement(repl); + part.arg_id_end = begin; + handler_(part); + return it; + } +}; + +// Compiles a format string and invokes handler(part) for each parsed part. +template +FMT_CONSTEXPR void compile_format_string(basic_string_view format_str, + PartHandler handler) { + parse_format_string( + format_str, + format_string_compiler(format_str, handler)); +} + +template +void format_arg( + basic_format_parse_context& parse_ctx, + Context& ctx, Id arg_id) { + ctx.advance_to(visit_format_arg( + arg_formatter(ctx, &parse_ctx), + ctx.arg(arg_id))); +} + +// vformat_to is defined in a subnamespace to prevent ADL. +namespace cf { +template +auto vformat_to(OutputIt out, CompiledFormat& cf, + basic_format_args args) -> typename Context::iterator { + using char_type = typename Context::char_type; + basic_format_parse_context parse_ctx( + to_string_view(cf.format_str_)); + Context ctx(out, args); + + const auto& parts = cf.parts(); + for (auto part_it = std::begin(parts); part_it != std::end(parts); + ++part_it) { + const auto& part = *part_it; + const auto& value = part.val; + + using format_part_t = format_part; + switch (part.part_kind) { + case format_part_t::kind::text: { + const auto text = value.str; + auto output = ctx.out(); + auto&& it = reserve(output, text.size()); + it = std::copy_n(text.begin(), text.size(), it); + ctx.advance_to(output); + break; + } + + case format_part_t::kind::arg_index: + advance_to(parse_ctx, part.arg_id_end); + detail::format_arg(parse_ctx, ctx, value.arg_index); + break; + + case format_part_t::kind::arg_name: + advance_to(parse_ctx, part.arg_id_end); + detail::format_arg(parse_ctx, ctx, value.str); + break; + + case format_part_t::kind::replacement: { + const auto& arg_id_value = value.repl.arg_id.val; + const auto arg = value.repl.arg_id.kind == arg_id_kind::index + ? ctx.arg(arg_id_value.index) + : ctx.arg(arg_id_value.name); + + auto specs = value.repl.specs; + + handle_dynamic_spec(specs.width, specs.width_ref, ctx); + handle_dynamic_spec(specs.precision, + specs.precision_ref, ctx); + + error_handler h; + numeric_specs_checker checker(h, arg.type()); + if (specs.align == align::numeric) checker.require_numeric_argument(); + if (specs.sign != sign::none) checker.check_sign(); + if (specs.alt) checker.require_numeric_argument(); + if (specs.precision >= 0) checker.check_precision(); + + advance_to(parse_ctx, part.arg_id_end); + ctx.advance_to( + visit_format_arg(arg_formatter( + ctx, nullptr, &specs), + arg)); + break; + } + } + } + return ctx.out(); +} +} // namespace cf + +struct basic_compiled_format {}; + +template +struct compiled_format_base : basic_compiled_format { + using char_type = char_t; + using parts_container = std::vector>; + + parts_container compiled_parts; + + explicit compiled_format_base(basic_string_view format_str) { + compile_format_string(format_str, + [this](const format_part& part) { + compiled_parts.push_back(part); + }); + } + + const parts_container& parts() const { return compiled_parts; } +}; + +template struct format_part_array { + format_part data[N] = {}; + FMT_CONSTEXPR format_part_array() = default; +}; + +template +FMT_CONSTEXPR format_part_array compile_to_parts( + basic_string_view format_str) { + format_part_array parts; + unsigned counter = 0; + // This is not a lambda for compatibility with older compilers. + struct { + format_part* parts; + unsigned* counter; + FMT_CONSTEXPR void operator()(const format_part& part) { + parts[(*counter)++] = part; + } + } collector{parts.data, &counter}; + compile_format_string(format_str, collector); + if (counter < N) { + parts.data[counter] = + format_part::make_text(basic_string_view()); + } + return parts; +} + +template constexpr const T& constexpr_max(const T& a, const T& b) { + return (a < b) ? b : a; +} + +template +struct compiled_format_base::value>> + : basic_compiled_format { + using char_type = char_t; + + FMT_CONSTEXPR explicit compiled_format_base(basic_string_view) {} + +// Workaround for old compilers. Format string compilation will not be +// performed there anyway. +#if FMT_USE_CONSTEXPR + static FMT_CONSTEXPR_DECL const unsigned num_format_parts = + constexpr_max(count_parts(to_string_view(S())), 1u); +#else + static const unsigned num_format_parts = 1; +#endif + + using parts_container = format_part[num_format_parts]; + + const parts_container& parts() const { + static FMT_CONSTEXPR_DECL const auto compiled_parts = + compile_to_parts( + detail::to_string_view(S())); + return compiled_parts.data; + } +}; + +template +class compiled_format : private compiled_format_base { + public: + using typename compiled_format_base::char_type; + + private: + basic_string_view format_str_; + + template + friend auto cf::vformat_to(OutputIt out, CompiledFormat& cf, + basic_format_args args) -> + typename Context::iterator; + + public: + compiled_format() = delete; + explicit constexpr compiled_format(basic_string_view format_str) + : compiled_format_base(format_str), format_str_(format_str) {} +}; + +#ifdef __cpp_if_constexpr +template struct type_list {}; + +// Returns a reference to the argument at index N from [first, rest...]. +template +constexpr const auto& get(const T& first, const Args&... rest) { + static_assert(N < 1 + sizeof...(Args), "index is out of bounds"); + if constexpr (N == 0) + return first; + else + return get(rest...); +} + +template struct get_type_impl; + +template struct get_type_impl> { + using type = remove_cvref_t(std::declval()...))>; +}; + +template +using get_type = typename get_type_impl::type; + +template struct is_compiled_format : std::false_type {}; + +template struct text { + basic_string_view data; + using char_type = Char; + + template + OutputIt format(OutputIt out, const Args&...) const { + return write(out, data); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template +constexpr text make_text(basic_string_view s, size_t pos, + size_t size) { + return {{&s[pos], size}}; +} + +// A replacement field that refers to argument N. +template struct field { + using char_type = Char; + + template + OutputIt format(OutputIt out, const Args&... args) const { + // This ensures that the argument type is convertile to `const T&`. + const T& arg = get(args...); + return write(out, arg); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +// A replacement field that refers to argument N and has format specifiers. +template struct spec_field { + using char_type = Char; + mutable formatter fmt; + + template + OutputIt format(OutputIt out, const Args&... args) const { + // This ensures that the argument type is convertile to `const T&`. + const T& arg = get(args...); + basic_format_context ctx(out, {}); + return fmt.format(arg, ctx); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template struct concat { + L lhs; + R rhs; + using char_type = typename L::char_type; + + template + OutputIt format(OutputIt out, const Args&... args) const { + out = lhs.format(out, args...); + return rhs.format(out, args...); + } +}; + +template +struct is_compiled_format> : std::true_type {}; + +template +constexpr concat make_concat(L lhs, R rhs) { + return {lhs, rhs}; +} + +struct unknown_format {}; + +template +constexpr size_t parse_text(basic_string_view str, size_t pos) { + for (size_t size = str.size(); pos != size; ++pos) { + if (str[pos] == '{' || str[pos] == '}') break; + } + return pos; +} + +template +constexpr auto compile_format_string(S format_str); + +template +constexpr auto parse_tail(T head, S format_str) { + if constexpr (POS != + basic_string_view(format_str).size()) { + constexpr auto tail = compile_format_string(format_str); + if constexpr (std::is_same, + unknown_format>()) + return tail; + else + return make_concat(head, tail); + } else { + return head; + } +} + +template struct parse_specs_result { + formatter fmt; + size_t end; +}; + +template +constexpr parse_specs_result parse_specs(basic_string_view str, + size_t pos) { + str.remove_prefix(pos); + auto ctx = basic_format_parse_context(str); + auto f = formatter(); + auto end = f.parse(ctx); + return {f, pos + (end - str.data()) + 1}; +} + +// Compiles a non-empty format string and returns the compiled representation +// or unknown_format() on unrecognized input. +template +constexpr auto compile_format_string(S format_str) { + using char_type = typename S::char_type; + constexpr basic_string_view str = format_str; + if constexpr (str[POS] == '{') { + if (POS + 1 == str.size()) + throw format_error("unmatched '{' in format string"); + if constexpr (str[POS + 1] == '{') { + return parse_tail(make_text(str, POS, 1), format_str); + } else if constexpr (str[POS + 1] == '}') { + using type = get_type; + return parse_tail(field(), + format_str); + } else if constexpr (str[POS + 1] == ':') { + using type = get_type; + constexpr auto result = parse_specs(str, POS + 2); + return parse_tail( + spec_field{result.fmt}, format_str); + } else { + return unknown_format(); + } + } else if constexpr (str[POS] == '}') { + if (POS + 1 == str.size()) + throw format_error("unmatched '}' in format string"); + return parse_tail(make_text(str, POS, 1), format_str); + } else { + constexpr auto end = parse_text(str, POS + 1); + return parse_tail(make_text(str, POS, end - POS), + format_str); + } +} + +template ::value || + detail::is_compiled_string::value)> +constexpr auto compile(S format_str) { + constexpr basic_string_view str = format_str; + if constexpr (str.size() == 0) { + return detail::make_text(str, 0, 0); + } else { + constexpr auto result = + detail::compile_format_string, 0, 0>( + format_str); + if constexpr (std::is_same, + detail::unknown_format>()) { + return detail::compiled_format(to_string_view(format_str)); + } else { + return result; + } + } +} +#else +template ::value)> +constexpr auto compile(S format_str) -> detail::compiled_format { + return detail::compiled_format(to_string_view(format_str)); +} +#endif // __cpp_if_constexpr + +// Compiles the format string which must be a string literal. +template +auto compile(const Char (&format_str)[N]) + -> detail::compiled_format { + return detail::compiled_format( + basic_string_view(format_str, N - 1)); +} +} // namespace detail + +// DEPRECATED! use FMT_COMPILE instead. +template +FMT_DEPRECATED auto compile(const Args&... args) + -> decltype(detail::compile(args...)) { + return detail::compile(args...); +} + +#if FMT_USE_CONSTEXPR +# ifdef __cpp_if_constexpr + +template ::value)> +FMT_INLINE std::basic_string format(const CompiledFormat& cf, + const Args&... args) { + basic_memory_buffer buffer; + detail::buffer& base = buffer; + cf.format(std::back_inserter(base), args...); + return to_string(buffer); +} + +template ::value)> +OutputIt format_to(OutputIt out, const CompiledFormat& cf, + const Args&... args) { + return cf.format(out, args...); +} +# endif // __cpp_if_constexpr +#endif // FMT_USE_CONSTEXPR + +template ::value)> +std::basic_string format(const CompiledFormat& cf, const Args&... args) { + basic_memory_buffer buffer; + using context = buffer_context; + detail::buffer& base = buffer; + detail::cf::vformat_to(std::back_inserter(base), cf, + make_format_args(args...)); + return to_string(buffer); +} + +template ::value)> +FMT_INLINE std::basic_string format(const S&, + Args&&... args) { + constexpr basic_string_view str = S(); + if (str.size() == 2 && str[0] == '{' && str[1] == '}') + return fmt::to_string(detail::first(args...)); + constexpr auto compiled = detail::compile(S()); + return format(compiled, std::forward(args)...); +} + +template ::value)> +OutputIt format_to(OutputIt out, const CompiledFormat& cf, + const Args&... args) { + using char_type = typename CompiledFormat::char_type; + using context = format_context_t; + return detail::cf::vformat_to(out, cf, + make_format_args(args...)); +} + +template ::value)> +OutputIt format_to(OutputIt out, const S&, const Args&... args) { + constexpr auto compiled = detail::compile(S()); + return format_to(out, compiled, args...); +} + +template < + typename OutputIt, typename CompiledFormat, typename... Args, + FMT_ENABLE_IF(detail::is_output_iterator::value&& std::is_base_of< + detail::basic_compiled_format, CompiledFormat>::value)> +format_to_n_result format_to_n(OutputIt out, size_t n, + const CompiledFormat& cf, + const Args&... args) { + auto it = + format_to(detail::truncating_iterator(out, n), cf, args...); + return {it.base(), it.count()}; +} + +template +size_t formatted_size(const CompiledFormat& cf, const Args&... args) { + return format_to(detail::counting_iterator(), cf, args...).count(); +} + +FMT_END_NAMESPACE + +#endif // FMT_COMPILE_H_ diff --git a/ThirdParty/fmtlib/include/fmt/core.h b/ThirdParty/fmtlib/include/fmt/core.h new file mode 100644 index 0000000000..37799a3a0c --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/core.h @@ -0,0 +1,1882 @@ +// Formatting library for C++ - the core API +// +// Copyright (c) 2012 - present, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_CORE_H_ +#define FMT_CORE_H_ + +#include // std::FILE +#include +#include +#include +#include +#include +#include +#include + +// The fmt library version in the form major * 10000 + minor * 100 + patch. +#define FMT_VERSION 70003 + +#ifdef __clang__ +# define FMT_CLANG_VERSION (__clang_major__ * 100 + __clang_minor__) +#else +# define FMT_CLANG_VERSION 0 +#endif + +#if defined(__GNUC__) && !defined(__clang__) +# define FMT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) +#else +# define FMT_GCC_VERSION 0 +#endif + +#if defined(__INTEL_COMPILER) +# define FMT_ICC_VERSION __INTEL_COMPILER +#else +# define FMT_ICC_VERSION 0 +#endif + +#if __cplusplus >= 201103L || defined(__GXX_EXPERIMENTAL_CXX0X__) +# define FMT_HAS_GXX_CXX11 FMT_GCC_VERSION +#else +# define FMT_HAS_GXX_CXX11 0 +#endif + +#ifdef __NVCC__ +# define FMT_NVCC __NVCC__ +#else +# define FMT_NVCC 0 +#endif + +#ifdef _MSC_VER +# define FMT_MSC_VER _MSC_VER +# define FMT_SUPPRESS_MSC_WARNING(n) __pragma(warning(suppress : n)) +#else +# define FMT_MSC_VER 0 +# define FMT_SUPPRESS_MSC_WARNING(n) +#endif +#ifdef __has_feature +# define FMT_HAS_FEATURE(x) __has_feature(x) +#else +# define FMT_HAS_FEATURE(x) 0 +#endif + +#if defined(__has_include) && !defined(__INTELLISENSE__) && \ + !(FMT_ICC_VERSION && FMT_ICC_VERSION < 1600) +# define FMT_HAS_INCLUDE(x) __has_include(x) +#else +# define FMT_HAS_INCLUDE(x) 0 +#endif + +#ifdef __has_cpp_attribute +# define FMT_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +# define FMT_HAS_CPP_ATTRIBUTE(x) 0 +#endif + +#define FMT_HAS_CPP14_ATTRIBUTE(attribute) \ + (__cplusplus >= 201402L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +#define FMT_HAS_CPP17_ATTRIBUTE(attribute) \ + (__cplusplus >= 201703L && FMT_HAS_CPP_ATTRIBUTE(attribute)) + +// Check if relaxed C++14 constexpr is supported. +// GCC doesn't allow throw in constexpr until version 6 (bug 67371). +#ifndef FMT_USE_CONSTEXPR +# define FMT_USE_CONSTEXPR \ + (FMT_HAS_FEATURE(cxx_relaxed_constexpr) || FMT_MSC_VER >= 1910 || \ + (FMT_GCC_VERSION >= 600 && __cplusplus >= 201402L)) && \ + !FMT_NVCC && !FMT_ICC_VERSION +#endif +#if FMT_USE_CONSTEXPR +# define FMT_CONSTEXPR constexpr +# define FMT_CONSTEXPR_DECL constexpr +#else +# define FMT_CONSTEXPR inline +# define FMT_CONSTEXPR_DECL +#endif + +#ifndef FMT_OVERRIDE +# if FMT_HAS_FEATURE(cxx_override) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 +# define FMT_OVERRIDE override +# else +# define FMT_OVERRIDE +# endif +#endif + +// Check if exceptions are disabled. +#ifndef FMT_EXCEPTIONS +# if (defined(__GNUC__) && !defined(__EXCEPTIONS)) || \ + FMT_MSC_VER && !_HAS_EXCEPTIONS +# define FMT_EXCEPTIONS 0 +# else +# define FMT_EXCEPTIONS 1 +# endif +#endif + +// Define FMT_USE_NOEXCEPT to make fmt use noexcept (C++11 feature). +#ifndef FMT_USE_NOEXCEPT +# define FMT_USE_NOEXCEPT 0 +#endif + +#if FMT_USE_NOEXCEPT || FMT_HAS_FEATURE(cxx_noexcept) || \ + (FMT_GCC_VERSION >= 408 && FMT_HAS_GXX_CXX11) || FMT_MSC_VER >= 1900 +# define FMT_DETECTED_NOEXCEPT noexcept +# define FMT_HAS_CXX11_NOEXCEPT 1 +#else +# define FMT_DETECTED_NOEXCEPT throw() +# define FMT_HAS_CXX11_NOEXCEPT 0 +#endif + +#ifndef FMT_NOEXCEPT +# if FMT_EXCEPTIONS || FMT_HAS_CXX11_NOEXCEPT +# define FMT_NOEXCEPT FMT_DETECTED_NOEXCEPT +# else +# define FMT_NOEXCEPT +# endif +#endif + +// [[noreturn]] is disabled on MSVC and NVCC because of bogus unreachable code +// warnings. +#if FMT_EXCEPTIONS && FMT_HAS_CPP_ATTRIBUTE(noreturn) && !FMT_MSC_VER && \ + !FMT_NVCC +# define FMT_NORETURN [[noreturn]] +#else +# define FMT_NORETURN +#endif + +#ifndef FMT_DEPRECATED +# if FMT_HAS_CPP14_ATTRIBUTE(deprecated) || FMT_MSC_VER >= 1900 +# define FMT_DEPRECATED [[deprecated]] +# else +# if defined(__GNUC__) || defined(__clang__) +# define FMT_DEPRECATED __attribute__((deprecated)) +# elif FMT_MSC_VER +# define FMT_DEPRECATED __declspec(deprecated) +# else +# define FMT_DEPRECATED /* deprecated */ +# endif +# endif +#endif + +// Workaround broken [[deprecated]] in the Intel, PGI and NVCC compilers. +#if FMT_ICC_VERSION || defined(__PGI) || FMT_NVCC +# define FMT_DEPRECATED_ALIAS +#else +# define FMT_DEPRECATED_ALIAS FMT_DEPRECATED +#endif + +#ifndef FMT_INLINE +# if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_INLINE inline __attribute__((always_inline)) +# else +# define FMT_INLINE inline +# endif +#endif + +#ifndef FMT_BEGIN_NAMESPACE +# if FMT_HAS_FEATURE(cxx_inline_namespaces) || FMT_GCC_VERSION >= 404 || \ + FMT_MSC_VER >= 1900 +# define FMT_INLINE_NAMESPACE inline namespace +# define FMT_END_NAMESPACE \ + } \ + } +# else +# define FMT_INLINE_NAMESPACE namespace +# define FMT_END_NAMESPACE \ + } \ + using namespace v7; \ + } +# endif +# define FMT_BEGIN_NAMESPACE \ + namespace fmt { \ + FMT_INLINE_NAMESPACE v7 { +#endif + +#if !defined(FMT_HEADER_ONLY) && defined(_WIN32) +# define FMT_CLASS_API FMT_SUPPRESS_MSC_WARNING(4275) +# ifdef FMT_EXPORT +# define FMT_API __declspec(dllexport) +# define FMT_EXTERN_TEMPLATE_API FMT_API +# define FMT_EXPORTED +# elif defined(FMT_SHARED) +# define FMT_API __declspec(dllimport) +# define FMT_EXTERN_TEMPLATE_API FMT_API +# endif +#else +# define FMT_CLASS_API +#endif +#ifndef FMT_API +# define FMT_API +#endif +#ifndef FMT_EXTERN_TEMPLATE_API +# define FMT_EXTERN_TEMPLATE_API +#endif +#ifndef FMT_INSTANTIATION_DEF_API +# define FMT_INSTANTIATION_DEF_API FMT_API +#endif + +#ifndef FMT_HEADER_ONLY +# define FMT_EXTERN extern +#else +# define FMT_EXTERN +#endif + +// libc++ supports string_view in pre-c++17. +#if (FMT_HAS_INCLUDE() && \ + (__cplusplus > 201402L || defined(_LIBCPP_VERSION))) || \ + (defined(_MSVC_LANG) && _MSVC_LANG > 201402L && _MSC_VER >= 1910) +# include +# define FMT_USE_STRING_VIEW +#elif FMT_HAS_INCLUDE("experimental/string_view") && __cplusplus >= 201402L +# include +# define FMT_USE_EXPERIMENTAL_STRING_VIEW +#endif + +#ifndef FMT_UNICODE +# define FMT_UNICODE !FMT_MSC_VER +#endif +#if FMT_UNICODE && FMT_MSC_VER +# pragma execution_character_set("utf-8") +#endif + +FMT_BEGIN_NAMESPACE + +// Implementations of enable_if_t and other metafunctions for older systems. +template +using enable_if_t = typename std::enable_if::type; +template +using conditional_t = typename std::conditional::type; +template using bool_constant = std::integral_constant; +template +using remove_reference_t = typename std::remove_reference::type; +template +using remove_const_t = typename std::remove_const::type; +template +using remove_cvref_t = typename std::remove_cv>::type; +template struct type_identity { using type = T; }; +template using type_identity_t = typename type_identity::type; + +struct monostate {}; + +// An enable_if helper to be used in template parameters which results in much +// shorter symbols: https://godbolt.org/z/sWw4vP. Extra parentheses are needed +// to workaround a bug in MSVC 2019 (see #1140 and #1186). +#define FMT_ENABLE_IF(...) enable_if_t<(__VA_ARGS__), int> = 0 + +namespace detail { + +// A helper function to suppress bogus "conditional expression is constant" +// warnings. +template constexpr T const_check(T value) { return value; } + +FMT_NORETURN FMT_API void assert_fail(const char* file, int line, + const char* message); + +#ifndef FMT_ASSERT +# ifdef NDEBUG +// FMT_ASSERT is not empty to avoid -Werror=empty-body. +# define FMT_ASSERT(condition, message) ((void)0) +# else +# define FMT_ASSERT(condition, message) \ + ((condition) /* void() fails with -Winvalid-constexpr on clang 4.0.1 */ \ + ? (void)0 \ + : ::fmt::detail::assert_fail(__FILE__, __LINE__, (message))) +# endif +#endif + +#if defined(FMT_USE_STRING_VIEW) +template using std_string_view = std::basic_string_view; +#elif defined(FMT_USE_EXPERIMENTAL_STRING_VIEW) +template +using std_string_view = std::experimental::basic_string_view; +#else +template struct std_string_view {}; +#endif + +#ifdef FMT_USE_INT128 +// Do nothing. +#elif defined(__SIZEOF_INT128__) && !FMT_NVCC && !(FMT_CLANG_VERSION && FMT_MSC_VER) +# define FMT_USE_INT128 1 +using int128_t = __int128_t; +using uint128_t = __uint128_t; +#else +# define FMT_USE_INT128 0 +#endif +#if !FMT_USE_INT128 +struct int128_t {}; +struct uint128_t {}; +#endif + +// Casts a nonnegative integer to unsigned. +template +FMT_CONSTEXPR typename std::make_unsigned::type to_unsigned(Int value) { + FMT_ASSERT(value >= 0, "negative value"); + return static_cast::type>(value); +} + +FMT_SUPPRESS_MSC_WARNING(4566) constexpr unsigned char micro[] = "\u00B5"; + +template constexpr bool is_unicode() { + return FMT_UNICODE || sizeof(Char) != 1 || + (sizeof(micro) == 3 && micro[0] == 0xC2 && micro[1] == 0xB5); +} + +#ifdef __cpp_char8_t +using char8_type = char8_t; +#else +enum char8_type : unsigned char {}; +#endif +} // namespace detail + +#ifdef FMT_USE_INTERNAL +namespace internal = detail; // DEPRECATED +#endif + +/** + An implementation of ``std::basic_string_view`` for pre-C++17. It provides a + subset of the API. ``fmt::basic_string_view`` is used for format strings even + if ``std::string_view`` is available to prevent issues when a library is + compiled with a different ``-std`` option than the client code (which is not + recommended). + */ +template class basic_string_view { + private: + const Char* data_; + size_t size_; + + public: + using value_type = Char; + using iterator = const Char*; + + constexpr basic_string_view() FMT_NOEXCEPT : data_(nullptr), size_(0) {} + + /** Constructs a string reference object from a C string and a size. */ + constexpr basic_string_view(const Char* s, size_t count) FMT_NOEXCEPT + : data_(s), + size_(count) {} + + /** + \rst + Constructs a string reference object from a C string computing + the size with ``std::char_traits::length``. + \endrst + */ +#if __cplusplus >= 201703L // C++17's char_traits::length() is constexpr. + FMT_CONSTEXPR +#endif + basic_string_view(const Char* s) + : data_(s), size_(std::char_traits::length(s)) {} + + /** Constructs a string reference from a ``std::basic_string`` object. */ + template + FMT_CONSTEXPR basic_string_view( + const std::basic_string& s) FMT_NOEXCEPT + : data_(s.data()), + size_(s.size()) {} + + template >::value)> + FMT_CONSTEXPR basic_string_view(S s) FMT_NOEXCEPT : data_(s.data()), + size_(s.size()) {} + + /** Returns a pointer to the string data. */ + constexpr const Char* data() const { return data_; } + + /** Returns the string size. */ + constexpr size_t size() const { return size_; } + + constexpr iterator begin() const { return data_; } + constexpr iterator end() const { return data_ + size_; } + + constexpr const Char& operator[](size_t pos) const { return data_[pos]; } + + FMT_CONSTEXPR void remove_prefix(size_t n) { + data_ += n; + size_ -= n; + } + + // Lexicographically compare this string reference to other. + int compare(basic_string_view other) const { + size_t str_size = size_ < other.size_ ? size_ : other.size_; + int result = std::char_traits::compare(data_, other.data_, str_size); + if (result == 0) + result = size_ == other.size_ ? 0 : (size_ < other.size_ ? -1 : 1); + return result; + } + + friend bool operator==(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) == 0; + } + friend bool operator!=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) != 0; + } + friend bool operator<(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) < 0; + } + friend bool operator<=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) <= 0; + } + friend bool operator>(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) > 0; + } + friend bool operator>=(basic_string_view lhs, basic_string_view rhs) { + return lhs.compare(rhs) >= 0; + } +}; + +using string_view = basic_string_view; +using wstring_view = basic_string_view; + +/** Specifies if ``T`` is a character type. Can be specialized by users. */ +template struct is_char : std::false_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; +template <> struct is_char : std::true_type {}; + +/** + \rst + Returns a string view of `s`. In order to add custom string type support to + {fmt} provide an overload of `to_string_view` for it in the same namespace as + the type for the argument-dependent lookup to work. + + **Example**:: + + namespace my_ns { + inline string_view to_string_view(const my_string& s) { + return {s.data(), s.length()}; + } + } + std::string message = fmt::format(my_string("The answer is {}"), 42); + \endrst + */ +template ::value)> +inline basic_string_view to_string_view(const Char* s) { + return s; +} + +template +inline basic_string_view to_string_view( + const std::basic_string& s) { + return s; +} + +template +inline basic_string_view to_string_view(basic_string_view s) { + return s; +} + +template >::value)> +inline basic_string_view to_string_view(detail::std_string_view s) { + return s; +} + +// A base class for compile-time strings. It is defined in the fmt namespace to +// make formatting functions visible via ADL, e.g. format(FMT_STRING("{}"), 42). +struct compile_string {}; + +template +struct is_compile_string : std::is_base_of {}; + +template ::value)> +constexpr basic_string_view to_string_view(const S& s) { + return s; +} + +namespace detail { +void to_string_view(...); +using fmt::v7::to_string_view; + +// Specifies whether S is a string type convertible to fmt::basic_string_view. +// It should be a constexpr function but MSVC 2017 fails to compile it in +// enable_if and MSVC 2015 fails to compile it as an alias template. +template +struct is_string : std::is_class()))> { +}; + +template struct char_t_impl {}; +template struct char_t_impl::value>> { + using result = decltype(to_string_view(std::declval())); + using type = typename result::value_type; +}; + +struct error_handler { + constexpr error_handler() = default; + constexpr error_handler(const error_handler&) = default; + + // This function is intentionally not constexpr to give a compile-time error. + FMT_NORETURN FMT_API void on_error(const char* message); +}; +} // namespace detail + +/** String's character type. */ +template using char_t = typename detail::char_t_impl::type; + +/** + \rst + Parsing context consisting of a format string range being parsed and an + argument counter for automatic indexing. + + You can use one of the following type aliases for common character types: + + +-----------------------+-------------------------------------+ + | Type | Definition | + +=======================+=====================================+ + | format_parse_context | basic_format_parse_context | + +-----------------------+-------------------------------------+ + | wformat_parse_context | basic_format_parse_context | + +-----------------------+-------------------------------------+ + \endrst + */ +template +class basic_format_parse_context : private ErrorHandler { + private: + basic_string_view format_str_; + int next_arg_id_; + + public: + using char_type = Char; + using iterator = typename basic_string_view::iterator; + + explicit constexpr basic_format_parse_context( + basic_string_view format_str, ErrorHandler eh = {}) + : ErrorHandler(eh), format_str_(format_str), next_arg_id_(0) {} + + /** + Returns an iterator to the beginning of the format string range being + parsed. + */ + constexpr iterator begin() const FMT_NOEXCEPT { return format_str_.begin(); } + + /** + Returns an iterator past the end of the format string range being parsed. + */ + constexpr iterator end() const FMT_NOEXCEPT { return format_str_.end(); } + + /** Advances the begin iterator to ``it``. */ + FMT_CONSTEXPR void advance_to(iterator it) { + format_str_.remove_prefix(detail::to_unsigned(it - begin())); + } + + /** + Reports an error if using the manual argument indexing; otherwise returns + the next argument index and switches to the automatic indexing. + */ + FMT_CONSTEXPR int next_arg_id() { + // Don't check if the argument id is valid to avoid overhead and because it + // will be checked during formatting anyway. + if (next_arg_id_ >= 0) return next_arg_id_++; + on_error("cannot switch from manual to automatic argument indexing"); + return 0; + } + + /** + Reports an error if using the automatic argument indexing; otherwise + switches to the manual indexing. + */ + FMT_CONSTEXPR void check_arg_id(int) { + if (next_arg_id_ > 0) + on_error("cannot switch from automatic to manual argument indexing"); + else + next_arg_id_ = -1; + } + + FMT_CONSTEXPR void check_arg_id(basic_string_view) {} + + FMT_CONSTEXPR void on_error(const char* message) { + ErrorHandler::on_error(message); + } + + constexpr ErrorHandler error_handler() const { return *this; } +}; + +using format_parse_context = basic_format_parse_context; +using wformat_parse_context = basic_format_parse_context; + +template class basic_format_arg; +template class basic_format_args; +template class dynamic_format_arg_store; + +// A formatter for objects of type T. +template +struct formatter { + // A deleted default constructor indicates a disabled formatter. + formatter() = delete; +}; + +// Specifies if T has an enabled formatter specialization. A type can be +// formattable even if it doesn't have a formatter e.g. via a conversion. +template +using has_formatter = + std::is_constructible>; + +namespace detail { + +/** + \rst + A contiguous memory buffer with an optional growing ability. It is an internal + class and shouldn't be used directly, only via `~fmt::basic_memory_buffer`. + \endrst + */ +template class buffer { + private: + T* ptr_; + size_t size_; + size_t capacity_; + + protected: + // Don't initialize ptr_ since it is not accessed to save a few cycles. + FMT_SUPPRESS_MSC_WARNING(26495) + buffer(size_t sz) FMT_NOEXCEPT : size_(sz), capacity_(sz) {} + + buffer(T* p = nullptr, size_t sz = 0, size_t cap = 0) FMT_NOEXCEPT + : ptr_(p), + size_(sz), + capacity_(cap) {} + + /** Sets the buffer data and capacity. */ + void set(T* buf_data, size_t buf_capacity) FMT_NOEXCEPT { + ptr_ = buf_data; + capacity_ = buf_capacity; + } + + /** Increases the buffer capacity to hold at least *capacity* elements. */ + virtual void grow(size_t capacity) = 0; + + public: + using value_type = T; + using const_reference = const T&; + + buffer(const buffer&) = delete; + void operator=(const buffer&) = delete; + virtual ~buffer() = default; + + T* begin() FMT_NOEXCEPT { return ptr_; } + T* end() FMT_NOEXCEPT { return ptr_ + size_; } + + const T* begin() const FMT_NOEXCEPT { return ptr_; } + const T* end() const FMT_NOEXCEPT { return ptr_ + size_; } + + /** Returns the size of this buffer. */ + size_t size() const FMT_NOEXCEPT { return size_; } + + /** Returns the capacity of this buffer. */ + size_t capacity() const FMT_NOEXCEPT { return capacity_; } + + /** Returns a pointer to the buffer data. */ + T* data() FMT_NOEXCEPT { return ptr_; } + + /** Returns a pointer to the buffer data. */ + const T* data() const FMT_NOEXCEPT { return ptr_; } + + /** + Resizes the buffer. If T is a POD type new elements may not be initialized. + */ + void resize(size_t new_size) { + reserve(new_size); + size_ = new_size; + } + + /** Clears this buffer. */ + void clear() { size_ = 0; } + + /** Reserves space to store at least *capacity* elements. */ + void reserve(size_t new_capacity) { + if (new_capacity > capacity_) grow(new_capacity); + } + + void push_back(const T& value) { + reserve(size_ + 1); + ptr_[size_++] = value; + } + + /** Appends data to the end of the buffer. */ + template void append(const U* begin, const U* end); + + template T& operator[](I index) { return ptr_[index]; } + template const T& operator[](I index) const { + return ptr_[index]; + } +}; + +// A container-backed buffer. +template +class container_buffer : public buffer { + private: + Container& container_; + + protected: + void grow(size_t capacity) FMT_OVERRIDE { + container_.resize(capacity); + this->set(&container_[0], capacity); + } + + public: + explicit container_buffer(Container& c) + : buffer(c.size()), container_(c) {} +}; + +// Extracts a reference to the container from back_insert_iterator. +template +inline Container& get_container(std::back_insert_iterator it) { + using bi_iterator = std::back_insert_iterator; + struct accessor : bi_iterator { + accessor(bi_iterator iter) : bi_iterator(iter) {} + using bi_iterator::container; + }; + return *accessor(it).container; +} + +template +struct fallback_formatter { + fallback_formatter() = delete; +}; + +// Specifies if T has an enabled fallback_formatter specialization. +template +using has_fallback_formatter = + std::is_constructible>; + +struct view {}; + +template struct named_arg : view { + const Char* name; + const T& value; + named_arg(const Char* n, const T& v) : name(n), value(v) {} +}; + +template struct named_arg_info { + const Char* name; + int id; +}; + +template +struct arg_data { + // args_[0].named_args points to named_args_ to avoid bloating format_args. + T args_[1 + (NUM_ARGS != 0 ? NUM_ARGS : 1)]; + named_arg_info named_args_[NUM_NAMED_ARGS]; + + template + arg_data(const U&... init) : args_{T(named_args_, NUM_NAMED_ARGS), init...} {} + arg_data(const arg_data& other) = delete; + const T* args() const { return args_ + 1; } + named_arg_info* named_args() { return named_args_; } +}; + +template +struct arg_data { + T args_[NUM_ARGS != 0 ? NUM_ARGS : 1]; + + template + FMT_INLINE arg_data(const U&... init) : args_{init...} {} + FMT_INLINE const T* args() const { return args_; } + FMT_INLINE std::nullptr_t named_args() { return nullptr; } +}; + +template +inline void init_named_args(named_arg_info*, int, int) {} + +template +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const T&, const Tail&... args) { + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +void init_named_args(named_arg_info* named_args, int arg_count, + int named_arg_count, const named_arg& arg, + const Tail&... args) { + named_args[named_arg_count++] = {arg.name, arg_count}; + init_named_args(named_args, arg_count + 1, named_arg_count, args...); +} + +template +FMT_INLINE void init_named_args(std::nullptr_t, int, int, const Args&...) {} + +template struct is_named_arg : std::false_type {}; + +template +struct is_named_arg> : std::true_type {}; + +template constexpr size_t count() { return B ? 1 : 0; } +template constexpr size_t count() { + return (B1 ? 1 : 0) + count(); +} + +template constexpr size_t count_named_args() { + return count::value...>(); +} + +enum class type { + none_type, + // Integer types should go first, + int_type, + uint_type, + long_long_type, + ulong_long_type, + int128_type, + uint128_type, + bool_type, + char_type, + last_integer_type = char_type, + // followed by floating-point types. + float_type, + double_type, + long_double_type, + last_numeric_type = long_double_type, + cstring_type, + string_type, + pointer_type, + custom_type +}; + +// Maps core type T to the corresponding type enum constant. +template +struct type_constant : std::integral_constant {}; + +#define FMT_TYPE_CONSTANT(Type, constant) \ + template \ + struct type_constant \ + : std::integral_constant {} + +FMT_TYPE_CONSTANT(int, int_type); +FMT_TYPE_CONSTANT(unsigned, uint_type); +FMT_TYPE_CONSTANT(long long, long_long_type); +FMT_TYPE_CONSTANT(unsigned long long, ulong_long_type); +FMT_TYPE_CONSTANT(int128_t, int128_type); +FMT_TYPE_CONSTANT(uint128_t, uint128_type); +FMT_TYPE_CONSTANT(bool, bool_type); +FMT_TYPE_CONSTANT(Char, char_type); +FMT_TYPE_CONSTANT(float, float_type); +FMT_TYPE_CONSTANT(double, double_type); +FMT_TYPE_CONSTANT(long double, long_double_type); +FMT_TYPE_CONSTANT(const Char*, cstring_type); +FMT_TYPE_CONSTANT(basic_string_view, string_type); +FMT_TYPE_CONSTANT(const void*, pointer_type); + +constexpr bool is_integral_type(type t) { + return t > type::none_type && t <= type::last_integer_type; +} + +constexpr bool is_arithmetic_type(type t) { + return t > type::none_type && t <= type::last_numeric_type; +} + +template struct string_value { + const Char* data; + size_t size; +}; + +template struct named_arg_value { + const named_arg_info* data; + size_t size; +}; + +template struct custom_value { + using parse_context = typename Context::parse_context_type; + const void* value; + void (*format)(const void* arg, parse_context& parse_ctx, Context& ctx); +}; + +// A formatting argument value. +template class value { + public: + using char_type = typename Context::char_type; + + union { + int int_value; + unsigned uint_value; + long long long_long_value; + unsigned long long ulong_long_value; + int128_t int128_value; + uint128_t uint128_value; + bool bool_value; + char_type char_value; + float float_value; + double double_value; + long double long_double_value; + const void* pointer; + string_value string; + custom_value custom; + named_arg_value named_args; + }; + + constexpr FMT_INLINE value(int val = 0) : int_value(val) {} + constexpr FMT_INLINE value(unsigned val) : uint_value(val) {} + FMT_INLINE value(long long val) : long_long_value(val) {} + FMT_INLINE value(unsigned long long val) : ulong_long_value(val) {} + FMT_INLINE value(int128_t val) : int128_value(val) {} + FMT_INLINE value(uint128_t val) : uint128_value(val) {} + FMT_INLINE value(float val) : float_value(val) {} + FMT_INLINE value(double val) : double_value(val) {} + FMT_INLINE value(long double val) : long_double_value(val) {} + FMT_INLINE value(bool val) : bool_value(val) {} + FMT_INLINE value(char_type val) : char_value(val) {} + FMT_INLINE value(const char_type* val) { string.data = val; } + FMT_INLINE value(basic_string_view val) { + string.data = val.data(); + string.size = val.size(); + } + FMT_INLINE value(const void* val) : pointer(val) {} + FMT_INLINE value(const named_arg_info* args, size_t size) + : named_args{args, size} {} + + template FMT_INLINE value(const T& val) { + custom.value = &val; + // Get the formatter type through the context to allow different contexts + // have different extension points, e.g. `formatter` for `format` and + // `printf_formatter` for `printf`. + custom.format = format_custom_arg< + T, conditional_t::value, + typename Context::template formatter_type, + fallback_formatter>>; + } + + private: + // Formats an argument of a custom type, such as a user-defined class. + template + static void format_custom_arg(const void* arg, + typename Context::parse_context_type& parse_ctx, + Context& ctx) { + Formatter f; + parse_ctx.advance_to(f.parse(parse_ctx)); + ctx.advance_to(f.format(*static_cast(arg), ctx)); + } +}; + +template +FMT_CONSTEXPR basic_format_arg make_arg(const T& value); + +// To minimize the number of types we need to deal with, long is translated +// either to int or to long long depending on its size. +enum { long_short = sizeof(long) == sizeof(int) }; +using long_type = conditional_t; +using ulong_type = conditional_t; + +// Maps formatting arguments to core types. +template struct arg_mapper { + using char_type = typename Context::char_type; + + FMT_CONSTEXPR int map(signed char val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned char val) { return val; } + FMT_CONSTEXPR int map(short val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned short val) { return val; } + FMT_CONSTEXPR int map(int val) { return val; } + FMT_CONSTEXPR unsigned map(unsigned val) { return val; } + FMT_CONSTEXPR long_type map(long val) { return val; } + FMT_CONSTEXPR ulong_type map(unsigned long val) { return val; } + FMT_CONSTEXPR long long map(long long val) { return val; } + FMT_CONSTEXPR unsigned long long map(unsigned long long val) { return val; } + FMT_CONSTEXPR int128_t map(int128_t val) { return val; } + FMT_CONSTEXPR uint128_t map(uint128_t val) { return val; } + FMT_CONSTEXPR bool map(bool val) { return val; } + + template ::value)> + FMT_CONSTEXPR char_type map(T val) { + static_assert( + std::is_same::value || std::is_same::value, + "mixing character types is disallowed"); + return val; + } + + FMT_CONSTEXPR float map(float val) { return val; } + FMT_CONSTEXPR double map(double val) { return val; } + FMT_CONSTEXPR long double map(long double val) { return val; } + + FMT_CONSTEXPR const char_type* map(char_type* val) { return val; } + FMT_CONSTEXPR const char_type* map(const char_type* val) { return val; } + template ::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + static_assert(std::is_same>::value, + "mixing character types is disallowed"); + return to_string_view(val); + } + template , T>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + return basic_string_view(val); + } + template < + typename T, + FMT_ENABLE_IF( + std::is_constructible, T>::value && + !std::is_constructible, T>::value && + !is_string::value && !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR basic_string_view map(const T& val) { + return std_string_view(val); + } + FMT_CONSTEXPR const char* map(const signed char* val) { + static_assert(std::is_same::value, "invalid string type"); + return reinterpret_cast(val); + } + FMT_CONSTEXPR const char* map(const unsigned char* val) { + static_assert(std::is_same::value, "invalid string type"); + return reinterpret_cast(val); + } + FMT_CONSTEXPR const char* map(signed char* val) { + const auto* const_val = val; + return map(const_val); + } + FMT_CONSTEXPR const char* map(unsigned char* val) { + const auto* const_val = val; + return map(const_val); + } + + FMT_CONSTEXPR const void* map(void* val) { return val; } + FMT_CONSTEXPR const void* map(const void* val) { return val; } + FMT_CONSTEXPR const void* map(std::nullptr_t val) { return val; } + template FMT_CONSTEXPR int map(const T*) { + // Formatting of arbitrary pointers is disallowed. If you want to output + // a pointer cast it to "void *" or "const void *". In particular, this + // forbids formatting of "[const] volatile char *" which is printed as bool + // by iostreams. + static_assert(!sizeof(T), "formatting of non-void pointers is disallowed"); + return 0; + } + + template ::value && + !has_formatter::value && + !has_fallback_formatter::value)> + FMT_CONSTEXPR auto map(const T& val) + -> decltype(std::declval().map( + static_cast::type>(val))) { + return map(static_cast::type>(val)); + } + template ::value && !is_char::value && + (has_formatter::value || + has_fallback_formatter::value))> + FMT_CONSTEXPR const T& map(const T& val) { + return val; + } + + template + FMT_CONSTEXPR auto map(const named_arg& val) + -> decltype(std::declval().map(val.value)) { + return map(val.value); + } + + int map(...) { + constexpr bool formattable = sizeof(Context) == 0; + static_assert( + formattable, + "Cannot format argument. To make type T formattable provide a " + "formatter specialization: " + "https://fmt.dev/latest/api.html#formatting-user-defined-types"); + return 0; + } +}; + +// A type constant after applying arg_mapper. +template +using mapped_type_constant = + type_constant().map(std::declval())), + typename Context::char_type>; + +enum { packed_arg_bits = 4 }; +// Maximum number of arguments with packed types. +enum { max_packed_args = 62 / packed_arg_bits }; +enum : unsigned long long { is_unpacked_bit = 1ULL << 63 }; +enum : unsigned long long { has_named_args_bit = 1ULL << 62 }; +} // namespace detail + +// A formatting argument. It is a trivially copyable/constructible type to +// allow storage in basic_memory_buffer. +template class basic_format_arg { + private: + detail::value value_; + detail::type type_; + + template + friend FMT_CONSTEXPR basic_format_arg detail::make_arg( + const T& value); + + template + friend FMT_CONSTEXPR auto visit_format_arg(Visitor&& vis, + const basic_format_arg& arg) + -> decltype(vis(0)); + + friend class basic_format_args; + friend class dynamic_format_arg_store; + + using char_type = typename Context::char_type; + + template + friend struct detail::arg_data; + + basic_format_arg(const detail::named_arg_info* args, size_t size) + : value_(args, size) {} + + public: + class handle { + public: + explicit handle(detail::custom_value custom) : custom_(custom) {} + + void format(typename Context::parse_context_type& parse_ctx, + Context& ctx) const { + custom_.format(custom_.value, parse_ctx, ctx); + } + + private: + detail::custom_value custom_; + }; + + constexpr basic_format_arg() : type_(detail::type::none_type) {} + + constexpr explicit operator bool() const FMT_NOEXCEPT { + return type_ != detail::type::none_type; + } + + detail::type type() const { return type_; } + + bool is_integral() const { return detail::is_integral_type(type_); } + bool is_arithmetic() const { return detail::is_arithmetic_type(type_); } +}; + +/** + \rst + Visits an argument dispatching to the appropriate visit method based on + the argument type. For example, if the argument type is ``double`` then + ``vis(value)`` will be called with the value of type ``double``. + \endrst + */ +template +FMT_CONSTEXPR_DECL FMT_INLINE auto visit_format_arg( + Visitor&& vis, const basic_format_arg& arg) -> decltype(vis(0)) { + using char_type = typename Context::char_type; + switch (arg.type_) { + case detail::type::none_type: + break; + case detail::type::int_type: + return vis(arg.value_.int_value); + case detail::type::uint_type: + return vis(arg.value_.uint_value); + case detail::type::long_long_type: + return vis(arg.value_.long_long_value); + case detail::type::ulong_long_type: + return vis(arg.value_.ulong_long_value); +#if FMT_USE_INT128 + case detail::type::int128_type: + return vis(arg.value_.int128_value); + case detail::type::uint128_type: + return vis(arg.value_.uint128_value); +#else + case detail::type::int128_type: + case detail::type::uint128_type: + break; +#endif + case detail::type::bool_type: + return vis(arg.value_.bool_value); + case detail::type::char_type: + return vis(arg.value_.char_value); + case detail::type::float_type: + return vis(arg.value_.float_value); + case detail::type::double_type: + return vis(arg.value_.double_value); + case detail::type::long_double_type: + return vis(arg.value_.long_double_value); + case detail::type::cstring_type: + return vis(arg.value_.string.data); + case detail::type::string_type: + return vis(basic_string_view(arg.value_.string.data, + arg.value_.string.size)); + case detail::type::pointer_type: + return vis(arg.value_.pointer); + case detail::type::custom_type: + return vis(typename basic_format_arg::handle(arg.value_.custom)); + } + return vis(monostate()); +} + +// Checks whether T is a container with contiguous storage. +template struct is_contiguous : std::false_type {}; +template +struct is_contiguous> : std::true_type {}; +template +struct is_contiguous> : std::true_type {}; + +namespace detail { + +template +struct is_back_insert_iterator : std::false_type {}; +template +struct is_back_insert_iterator> + : std::true_type {}; + +template +struct is_contiguous_back_insert_iterator : std::false_type {}; +template +struct is_contiguous_back_insert_iterator> + : is_contiguous {}; + +// A type-erased reference to an std::locale to avoid heavy include. +class locale_ref { + private: + const void* locale_; // A type-erased pointer to std::locale. + + public: + locale_ref() : locale_(nullptr) {} + template explicit locale_ref(const Locale& loc); + + explicit operator bool() const FMT_NOEXCEPT { return locale_ != nullptr; } + + template Locale get() const; +}; + +template constexpr unsigned long long encode_types() { return 0; } + +template +constexpr unsigned long long encode_types() { + return static_cast(mapped_type_constant::value) | + (encode_types() << packed_arg_bits); +} + +template +FMT_CONSTEXPR basic_format_arg make_arg(const T& value) { + basic_format_arg arg; + arg.type_ = mapped_type_constant::value; + arg.value_ = arg_mapper().map(value); + return arg; +} + +// The type template parameter is there to avoid an ODR violation when using +// a fallback formatter in one translation unit and an implicit conversion in +// another (not recommended). +template +inline value make_arg(const T& val) { + return arg_mapper().map(val); +} + +template +inline basic_format_arg make_arg(const T& value) { + return make_arg(value); +} + +template struct is_reference_wrapper : std::false_type {}; +template +struct is_reference_wrapper> : std::true_type {}; + +template const T& unwrap(const T& v) { return v; } +template const T& unwrap(const std::reference_wrapper& v) { + return static_cast(v); +} + +class dynamic_arg_list { + // Workaround for clang's -Wweak-vtables. Unlike for regular classes, for + // templates it doesn't complain about inability to deduce single translation + // unit for placing vtable. So storage_node_base is made a fake template. + template struct node { + virtual ~node() = default; + std::unique_ptr> next; + }; + + template struct typed_node : node<> { + T value; + + template + FMT_CONSTEXPR typed_node(const Arg& arg) : value(arg) {} + + template + FMT_CONSTEXPR typed_node(const basic_string_view& arg) + : value(arg.data(), arg.size()) {} + }; + + std::unique_ptr> head_; + + public: + template const T& push(const Arg& arg) { + auto new_node = std::unique_ptr>(new typed_node(arg)); + auto& value = new_node->value; + new_node->next = std::move(head_); + head_ = std::move(new_node); + return value; + } +}; +} // namespace detail + +// Formatting context. +template class basic_format_context { + public: + /** The character type for the output. */ + using char_type = Char; + + private: + OutputIt out_; + basic_format_args args_; + detail::locale_ref loc_; + + public: + using iterator = OutputIt; + using format_arg = basic_format_arg; + using parse_context_type = basic_format_parse_context; + template using formatter_type = formatter; + + basic_format_context(const basic_format_context&) = delete; + void operator=(const basic_format_context&) = delete; + /** + Constructs a ``basic_format_context`` object. References to the arguments are + stored in the object so make sure they have appropriate lifetimes. + */ + basic_format_context(OutputIt out, + basic_format_args ctx_args, + detail::locale_ref loc = detail::locale_ref()) + : out_(out), args_(ctx_args), loc_(loc) {} + + format_arg arg(int id) const { return args_.get(id); } + format_arg arg(basic_string_view name) { return args_.get(name); } + int arg_id(basic_string_view name) { return args_.get_id(name); } + const basic_format_args& args() const { return args_; } + + detail::error_handler error_handler() { return {}; } + void on_error(const char* message) { error_handler().on_error(message); } + + // Returns an iterator to the beginning of the output range. + iterator out() { return out_; } + + // Advances the begin iterator to ``it``. + void advance_to(iterator it) { + if (!detail::is_back_insert_iterator()) out_ = it; + } + + detail::locale_ref locale() { return loc_; } +}; + +template +using buffer_context = + basic_format_context>, Char>; +using format_context = buffer_context; +using wformat_context = buffer_context; + +// Workaround a bug in gcc: https://stackoverflow.com/q/62767544/471164. +#define FMT_BUFFER_CONTEXT(Char) \ + basic_format_context>, Char> + +/** + \rst + An array of references to arguments. It can be implicitly converted into + `~fmt::basic_format_args` for passing into type-erased formatting functions + such as `~fmt::vformat`. + \endrst + */ +template +class format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + static const size_t num_args = sizeof...(Args); + static const size_t num_named_args = detail::count_named_args(); + static const bool is_packed = num_args <= detail::max_packed_args; + + using value_type = conditional_t, + basic_format_arg>; + + detail::arg_data + data_; + + friend class basic_format_args; + + static constexpr unsigned long long desc = + (is_packed ? detail::encode_types() + : detail::is_unpacked_bit | num_args) | + (num_named_args != 0 + ? static_cast(detail::has_named_args_bit) + : 0); + + public: + format_arg_store(const Args&... args) + : +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + basic_format_args(*this), +#endif + data_{detail::make_arg< + is_packed, Context, + detail::mapped_type_constant::value>(args)...} { + detail::init_named_args(data_.named_args(), 0, 0, args...); + } +}; + +/** + \rst + Constructs an `~fmt::format_arg_store` object that contains references to + arguments and can be implicitly converted to `~fmt::format_args`. `Context` + can be omitted in which case it defaults to `~fmt::context`. + See `~fmt::arg` for lifetime considerations. + \endrst + */ +template +inline format_arg_store make_format_args( + const Args&... args) { + return {args...}; +} + +/** + \rst + Returns a named argument to be used in a formatting function. It should only + be used in a call to a formatting function. + + **Example**:: + + fmt::print("Elapsed time: {s:.2f} seconds", fmt::arg("s", 1.23)); + \endrst + */ +template +inline detail::named_arg arg(const Char* name, const T& arg) { + static_assert(!detail::is_named_arg(), "nested named arguments"); + return {name, arg}; +} + +/** + \rst + A dynamic version of `fmt::format_arg_store`. + It's equipped with a storage to potentially temporary objects which lifetimes + could be shorter than the format arguments object. + + It can be implicitly converted into `~fmt::basic_format_args` for passing + into type-erased formatting functions such as `~fmt::vformat`. + \endrst + */ +template +class dynamic_format_arg_store +#if FMT_GCC_VERSION && FMT_GCC_VERSION < 409 + // Workaround a GCC template argument substitution bug. + : public basic_format_args +#endif +{ + private: + using char_type = typename Context::char_type; + + template struct need_copy { + static constexpr detail::type mapped_type = + detail::mapped_type_constant::value; + + enum { + value = !(detail::is_reference_wrapper::value || + std::is_same>::value || + std::is_same>::value || + (mapped_type != detail::type::cstring_type && + mapped_type != detail::type::string_type && + mapped_type != detail::type::custom_type)) + }; + }; + + template + using stored_type = conditional_t::value, + std::basic_string, T>; + + // Storage of basic_format_arg must be contiguous. + std::vector> data_; + std::vector> named_info_; + + // Storage of arguments not fitting into basic_format_arg must grow + // without relocation because items in data_ refer to it. + detail::dynamic_arg_list dynamic_args_; + + friend class basic_format_args; + + unsigned long long get_types() const { + return detail::is_unpacked_bit | data_.size() | + (named_info_.empty() + ? 0ULL + : static_cast(detail::has_named_args_bit)); + } + + const basic_format_arg* data() const { + return named_info_.empty() ? data_.data() : data_.data() + 1; + } + + template void emplace_arg(const T& arg) { + data_.emplace_back(detail::make_arg(arg)); + } + + template + void emplace_arg(const detail::named_arg& arg) { + if (named_info_.empty()) { + constexpr const detail::named_arg_info* zero_ptr{nullptr}; + data_.insert(data_.begin(), {zero_ptr, 0}); + } + data_.emplace_back(detail::make_arg(detail::unwrap(arg.value))); + auto pop_one = [](std::vector>* data) { + data->pop_back(); + }; + std::unique_ptr>, decltype(pop_one)> + guard{&data_, pop_one}; + named_info_.push_back({arg.name, static_cast(data_.size() - 2u)}); + data_[0].value_.named_args = {named_info_.data(), named_info_.size()}; + guard.release(); + } + + public: + /** + \rst + Adds an argument into the dynamic store for later passing to a formatting + function. + + Note that custom types and string types (but not string views) are copied + into the store dynamically allocating memory if necessary. + + **Example**:: + + fmt::dynamic_format_arg_store store; + store.push_back(42); + store.push_back("abc"); + store.push_back(1.5f); + std::string result = fmt::vformat("{} and {} and {}", store); + \endrst + */ + template void push_back(const T& arg) { + if (detail::const_check(need_copy::value)) + emplace_arg(dynamic_args_.push>(arg)); + else + emplace_arg(detail::unwrap(arg)); + } + + /** + \rst + Adds a reference to the argument into the dynamic store for later passing to + a formatting function. Supports named arguments wrapped in + ``std::reference_wrapper`` via ``std::ref()``/``std::cref()``. + + **Example**:: + + fmt::dynamic_format_arg_store store; + char str[] = "1234567890"; + store.push_back(std::cref(str)); + int a1_val{42}; + auto a1 = fmt::arg("a1_", a1_val); + store.push_back(std::cref(a1)); + + // Changing str affects the output but only for string and custom types. + str[0] = 'X'; + + std::string result = fmt::vformat("{} and {a1_}"); + assert(result == "X234567890 and 42"); + \endrst + */ + template void push_back(std::reference_wrapper arg) { + static_assert( + detail::is_named_arg::type>::value || + need_copy::value, + "objects of built-in types and string views are always copied"); + emplace_arg(arg.get()); + } + + /** + Adds named argument into the dynamic store for later passing to a formatting + function. ``std::reference_wrapper`` is supported to avoid copying of the + argument. + */ + template + void push_back(const detail::named_arg& arg) { + const char_type* arg_name = + dynamic_args_.push>(arg.name).c_str(); + if (detail::const_check(need_copy::value)) { + emplace_arg( + fmt::arg(arg_name, dynamic_args_.push>(arg.value))); + } else { + emplace_arg(fmt::arg(arg_name, arg.value)); + } + } + + /** Erase all elements from the store */ + void clear() { + data_.clear(); + named_info_.clear(); + dynamic_args_ = detail::dynamic_arg_list(); + } + + /** + \rst + Reserves space to store at least *new_cap* arguments including + *new_cap_named* named arguments. + \endrst + */ + void reserve(size_t new_cap, size_t new_cap_named) { + FMT_ASSERT(new_cap >= new_cap_named, + "Set of arguments includes set of named arguments"); + data_.reserve(new_cap); + named_info_.reserve(new_cap_named); + } +}; + +/** + \rst + A view of a collection of formatting arguments. To avoid lifetime issues it + should only be used as a parameter type in type-erased functions such as + ``vformat``:: + + void vlog(string_view format_str, format_args args); // OK + format_args args = make_format_args(42); // Error: dangling reference + \endrst + */ +template class basic_format_args { + public: + using size_type = int; + using format_arg = basic_format_arg; + + private: + // A descriptor that contains information about formatting arguments. + // If the number of arguments is less or equal to max_packed_args then + // argument types are passed in the descriptor. This reduces binary code size + // per formatting function call. + unsigned long long desc_; + union { + // If is_packed() returns true then argument values are stored in values_; + // otherwise they are stored in args_. This is done to improve cache + // locality and reduce compiled code size since storing larger objects + // may require more code (at least on x86-64) even if the same amount of + // data is actually copied to stack. It saves ~10% on the bloat test. + const detail::value* values_; + const format_arg* args_; + }; + + bool is_packed() const { return (desc_ & detail::is_unpacked_bit) == 0; } + bool has_named_args() const { + return (desc_ & detail::has_named_args_bit) != 0; + } + + detail::type type(int index) const { + int shift = index * detail::packed_arg_bits; + unsigned int mask = (1 << detail::packed_arg_bits) - 1; + return static_cast((desc_ >> shift) & mask); + } + + basic_format_args(unsigned long long desc, + const detail::value* values) + : desc_(desc), values_(values) {} + basic_format_args(unsigned long long desc, const format_arg* args) + : desc_(desc), args_(args) {} + + public: + basic_format_args() : desc_(0) {} + + /** + \rst + Constructs a `basic_format_args` object from `~fmt::format_arg_store`. + \endrst + */ + template + FMT_INLINE basic_format_args(const format_arg_store& store) + : basic_format_args(store.desc, store.data_.args()) {} + + /** + \rst + Constructs a `basic_format_args` object from + `~fmt::dynamic_format_arg_store`. + \endrst + */ + FMT_INLINE basic_format_args(const dynamic_format_arg_store& store) + : basic_format_args(store.get_types(), store.data()) {} + + /** + \rst + Constructs a `basic_format_args` object from a dynamic set of arguments. + \endrst + */ + basic_format_args(const format_arg* args, int count) + : basic_format_args(detail::is_unpacked_bit | detail::to_unsigned(count), + args) {} + + /** Returns the argument with the specified id. */ + format_arg get(int id) const { + format_arg arg; + if (!is_packed()) { + if (id < max_size()) arg = args_[id]; + return arg; + } + if (id >= detail::max_packed_args) return arg; + arg.type_ = type(id); + if (arg.type_ == detail::type::none_type) return arg; + arg.value_ = values_[id]; + return arg; + } + + template format_arg get(basic_string_view name) const { + int id = get_id(name); + return id >= 0 ? get(id) : format_arg(); + } + + template int get_id(basic_string_view name) const { + if (!has_named_args()) return -1; + const auto& named_args = + (is_packed() ? values_[-1] : args_[-1].value_).named_args; + for (size_t i = 0; i < named_args.size; ++i) { + if (named_args.data[i].name == name) return named_args.data[i].id; + } + return -1; + } + + int max_size() const { + unsigned long long max_packed = detail::max_packed_args; + return static_cast(is_packed() ? max_packed + : desc_ & ~detail::is_unpacked_bit); + } +}; + +/** An alias to ``basic_format_args``. */ +// It is a separate type rather than an alias to make symbols readable. +struct format_args : basic_format_args { + template + FMT_INLINE format_args(const Args&... args) : basic_format_args(args...) {} +}; +struct wformat_args : basic_format_args { + using basic_format_args::basic_format_args; +}; + +namespace detail { + +// Reports a compile-time error if S is not a valid format string. +template ::value)> +FMT_INLINE void check_format_string(const S&) { +#ifdef FMT_ENFORCE_COMPILE_STRING + static_assert(is_compile_string::value, + "FMT_ENFORCE_COMPILE_STRING requires all format strings to use " + "FMT_STRING."); +#endif +} +template ::value)> +void check_format_string(S); + +template > +inline format_arg_store, remove_reference_t...> +make_args_checked(const S& format_str, + const remove_reference_t&... args) { + static_assert(count<(std::is_base_of>::value && + std::is_reference::value)...>() == 0, + "passing views as lvalues is disallowed"); + check_format_string(format_str); + return {args...}; +} + +template ::value)> +std::basic_string vformat( + basic_string_view format_str, + basic_format_args>> args); + +FMT_API std::string vformat(string_view format_str, format_args args); + +template +typename FMT_BUFFER_CONTEXT(Char)::iterator vformat_to( + buffer& buf, basic_string_view format_str, + basic_format_args)> args); + +template ::value)> +inline void vprint_mojibake(std::FILE*, basic_string_view, const Args&) {} + +FMT_API void vprint_mojibake(std::FILE*, string_view, format_args); +#ifndef _WIN32 +inline void vprint_mojibake(std::FILE*, string_view, format_args) {} +#endif +} // namespace detail + +/** Formats a string and writes the output to ``out``. */ +// GCC 8 and earlier cannot handle std::back_insert_iterator with +// vformat_to(...) overload, so SFINAE on iterator type instead. +template < + typename OutputIt, typename S, typename Char = char_t, + FMT_ENABLE_IF(detail::is_contiguous_back_insert_iterator::value)> +OutputIt vformat_to( + OutputIt out, const S& format_str, + basic_format_args>> args) { + auto& c = detail::get_container(out); + detail::container_buffer> buf(c); + detail::vformat_to(buf, to_string_view(format_str), args); + return out; +} + +template ::value&& detail::is_string::value)> +inline std::back_insert_iterator format_to( + std::back_insert_iterator out, const S& format_str, + Args&&... args) { + return vformat_to(out, to_string_view(format_str), + detail::make_args_checked(format_str, args...)); +} + +template > +FMT_INLINE std::basic_string vformat( + const S& format_str, + basic_format_args>> args) { + return detail::vformat(to_string_view(format_str), args); +} + +/** + \rst + Formats arguments and returns the result as a string. + + **Example**:: + + #include + std::string message = fmt::format("The answer is {}", 42); + \endrst +*/ +// Pass char_t as a default template parameter instead of using +// std::basic_string> to reduce the symbol size. +template > +FMT_INLINE std::basic_string format(const S& format_str, Args&&... args) { + const auto& vargs = detail::make_args_checked(format_str, args...); + return detail::vformat(to_string_view(format_str), vargs); +} + +FMT_API void vprint(string_view, format_args); +FMT_API void vprint(std::FILE*, string_view, format_args); + +/** + \rst + Formats ``args`` according to specifications in ``format_str`` and writes the + output to the file ``f``. Strings are assumed to be Unicode-encoded unless the + ``FMT_UNICODE`` macro is set to 0. + + **Example**:: + + fmt::print(stderr, "Don't {}!", "panic"); + \endrst + */ +template > +inline void print(std::FILE* f, const S& format_str, Args&&... args) { + const auto& vargs = detail::make_args_checked(format_str, args...); + return detail::is_unicode() + ? vprint(f, to_string_view(format_str), vargs) + : detail::vprint_mojibake(f, to_string_view(format_str), vargs); +} + +/** + \rst + Formats ``args`` according to specifications in ``format_str`` and writes + the output to ``stdout``. Strings are assumed to be Unicode-encoded unless + the ``FMT_UNICODE`` macro is set to 0. + + **Example**:: + + fmt::print("Elapsed time: {0:.2f} seconds", 1.23); + \endrst + */ +template > +inline void print(const S& format_str, Args&&... args) { + const auto& vargs = detail::make_args_checked(format_str, args...); + return detail::is_unicode() + ? vprint(to_string_view(format_str), vargs) + : detail::vprint_mojibake(stdout, to_string_view(format_str), + vargs); +} +FMT_END_NAMESPACE + +#endif // FMT_CORE_H_ diff --git a/ThirdParty/fmtlib/include/fmt/format-inl.h b/ThirdParty/fmtlib/include/fmt/format-inl.h new file mode 100644 index 0000000000..d8c9c8a5ee --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/format-inl.h @@ -0,0 +1,1453 @@ +// Formatting library for C++ - implementation +// +// Copyright (c) 2012 - 2016, Victor Zverovich +// All rights reserved. +// +// For the license information refer to format.h. + +#ifndef FMT_FORMAT_INL_H_ +#define FMT_FORMAT_INL_H_ + +#include +#include +#include +#include +#include +#include // for std::memmove +#include +#include + +#include "format.h" +#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) +# include +#endif + +#ifdef _WIN32 +# if !defined(NOMINMAX) && !defined(WIN32_LEAN_AND_MEAN) +# define NOMINMAX +# define WIN32_LEAN_AND_MEAN +# include +# undef WIN32_LEAN_AND_MEAN +# undef NOMINMAX +# else +# include +# endif +# include +#endif + +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable : 4702) // unreachable code +#endif + +// Dummy implementations of strerror_r and strerror_s called if corresponding +// system functions are not available. +inline fmt::detail::null<> strerror_r(int, char*, ...) { return {}; } +inline fmt::detail::null<> strerror_s(char*, size_t, ...) { return {}; } + +FMT_BEGIN_NAMESPACE +namespace detail { + +FMT_FUNC void assert_fail(const char* file, int line, const char* message) { + // Use unchecked std::fprintf to avoid triggering another assertion when + // writing to stderr fails + std::fprintf(stderr, "%s:%d: assertion failed: %s", file, line, message); + // Chosen instead of std::abort to satisfy Clang in CUDA mode during device + // code pass. + std::terminate(); +} + +#ifndef _MSC_VER +# define FMT_SNPRINTF snprintf +#else // _MSC_VER +inline int fmt_snprintf(char* buffer, size_t size, const char* format, ...) { + va_list args; + va_start(args, format); + int result = vsnprintf_s(buffer, size, _TRUNCATE, format, args); + va_end(args); + return result; +} +# define FMT_SNPRINTF fmt_snprintf +#endif // _MSC_VER + +// A portable thread-safe version of strerror. +// Sets buffer to point to a string describing the error code. +// This can be either a pointer to a string stored in buffer, +// or a pointer to some static immutable string. +// Returns one of the following values: +// 0 - success +// ERANGE - buffer is not large enough to store the error message +// other - failure +// Buffer should be at least of size 1. +FMT_FUNC int safe_strerror(int error_code, char*& buffer, + size_t buffer_size) FMT_NOEXCEPT { + FMT_ASSERT(buffer != nullptr && buffer_size != 0, "invalid buffer"); + + class dispatcher { + private: + int error_code_; + char*& buffer_; + size_t buffer_size_; + + // A noop assignment operator to avoid bogus warnings. + void operator=(const dispatcher&) {} + + // Handle the result of XSI-compliant version of strerror_r. + int handle(int result) { + // glibc versions before 2.13 return result in errno. + return result == -1 ? errno : result; + } + + // Handle the result of GNU-specific version of strerror_r. + FMT_MAYBE_UNUSED + int handle(char* message) { + // If the buffer is full then the message is probably truncated. + if (message == buffer_ && strlen(buffer_) == buffer_size_ - 1) + return ERANGE; + buffer_ = message; + return 0; + } + + // Handle the case when strerror_r is not available. + FMT_MAYBE_UNUSED + int handle(detail::null<>) { + return fallback(strerror_s(buffer_, buffer_size_, error_code_)); + } + + // Fallback to strerror_s when strerror_r is not available. + FMT_MAYBE_UNUSED + int fallback(int result) { + // If the buffer is full then the message is probably truncated. + return result == 0 && strlen(buffer_) == buffer_size_ - 1 ? ERANGE + : result; + } + +#if !FMT_MSC_VER + // Fallback to strerror if strerror_r and strerror_s are not available. + int fallback(detail::null<>) { + errno = 0; + buffer_ = strerror(error_code_); + return errno; + } +#endif + + public: + dispatcher(int err_code, char*& buf, size_t buf_size) + : error_code_(err_code), buffer_(buf), buffer_size_(buf_size) {} + + int run() { return handle(strerror_r(error_code_, buffer_, buffer_size_)); } + }; + return dispatcher(error_code, buffer, buffer_size).run(); +} + +FMT_FUNC void format_error_code(detail::buffer& out, int error_code, + string_view message) FMT_NOEXCEPT { + // Report error code making sure that the output fits into + // inline_buffer_size to avoid dynamic memory allocation and potential + // bad_alloc. + out.resize(0); + static const char SEP[] = ": "; + static const char ERROR_STR[] = "error "; + // Subtract 2 to account for terminating null characters in SEP and ERROR_STR. + size_t error_code_size = sizeof(SEP) + sizeof(ERROR_STR) - 2; + auto abs_value = static_cast>(error_code); + if (detail::is_negative(error_code)) { + abs_value = 0 - abs_value; + ++error_code_size; + } + error_code_size += detail::to_unsigned(detail::count_digits(abs_value)); + auto it = std::back_inserter(out); + if (message.size() <= inline_buffer_size - error_code_size) + format_to(it, "{}{}", message, SEP); + format_to(it, "{}{}", ERROR_STR, error_code); + assert(out.size() <= inline_buffer_size); +} + +FMT_FUNC void report_error(format_func func, int error_code, + string_view message) FMT_NOEXCEPT { + memory_buffer full_message; + func(full_message, error_code, message); + // Don't use fwrite_fully because the latter may throw. + (void)std::fwrite(full_message.data(), full_message.size(), 1, stderr); + std::fputc('\n', stderr); +} + +// A wrapper around fwrite that throws on error. +FMT_FUNC void fwrite_fully(const void* ptr, size_t size, size_t count, + FILE* stream) { + size_t written = std::fwrite(ptr, size, count, stream); + if (written < count) FMT_THROW(system_error(errno, "cannot write to file")); +} +} // namespace detail + +#if !defined(FMT_STATIC_THOUSANDS_SEPARATOR) +namespace detail { + +template +locale_ref::locale_ref(const Locale& loc) : locale_(&loc) { + static_assert(std::is_same::value, ""); +} + +template Locale locale_ref::get() const { + static_assert(std::is_same::value, ""); + return locale_ ? *static_cast(locale_) : std::locale(); +} + +template FMT_FUNC std::string grouping_impl(locale_ref loc) { + return std::use_facet>(loc.get()).grouping(); +} +template FMT_FUNC Char thousands_sep_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .thousands_sep(); +} +template FMT_FUNC Char decimal_point_impl(locale_ref loc) { + return std::use_facet>(loc.get()) + .decimal_point(); +} +} // namespace detail +#else +template +FMT_FUNC std::string detail::grouping_impl(locale_ref) { + return "\03"; +} +template FMT_FUNC Char detail::thousands_sep_impl(locale_ref) { + return FMT_STATIC_THOUSANDS_SEPARATOR; +} +template FMT_FUNC Char detail::decimal_point_impl(locale_ref) { + return '.'; +} +#endif + +FMT_API FMT_FUNC format_error::~format_error() FMT_NOEXCEPT = default; +FMT_API FMT_FUNC system_error::~system_error() FMT_NOEXCEPT = default; + +FMT_FUNC void system_error::init(int err_code, string_view format_str, + format_args args) { + error_code_ = err_code; + memory_buffer buffer; + format_system_error(buffer, err_code, vformat(format_str, args)); + std::runtime_error& base = *this; + base = std::runtime_error(to_string(buffer)); +} + +namespace detail { + +template <> FMT_FUNC int count_digits<4>(detail::fallback_uintptr n) { + // fallback_uintptr is always stored in little endian. + int i = static_cast(sizeof(void*)) - 1; + while (i > 0 && n.value[i] == 0) --i; + auto char_digits = std::numeric_limits::digits / 4; + return i >= 0 ? i * char_digits + count_digits<4, unsigned>(n.value[i]) : 1; +} + +template +const typename basic_data::digit_pair basic_data::digits[] = { + {'0', '0'}, {'0', '1'}, {'0', '2'}, {'0', '3'}, {'0', '4'}, + {'0', '5'}, {'0', '6'}, {'0', '7'}, {'0', '8'}, {'0', '9'}, + {'1', '0'}, {'1', '1'}, {'1', '2'}, {'1', '3'}, {'1', '4'}, + {'1', '5'}, {'1', '6'}, {'1', '7'}, {'1', '8'}, {'1', '9'}, + {'2', '0'}, {'2', '1'}, {'2', '2'}, {'2', '3'}, {'2', '4'}, + {'2', '5'}, {'2', '6'}, {'2', '7'}, {'2', '8'}, {'2', '9'}, + {'3', '0'}, {'3', '1'}, {'3', '2'}, {'3', '3'}, {'3', '4'}, + {'3', '5'}, {'3', '6'}, {'3', '7'}, {'3', '8'}, {'3', '9'}, + {'4', '0'}, {'4', '1'}, {'4', '2'}, {'4', '3'}, {'4', '4'}, + {'4', '5'}, {'4', '6'}, {'4', '7'}, {'4', '8'}, {'4', '9'}, + {'5', '0'}, {'5', '1'}, {'5', '2'}, {'5', '3'}, {'5', '4'}, + {'5', '5'}, {'5', '6'}, {'5', '7'}, {'5', '8'}, {'5', '9'}, + {'6', '0'}, {'6', '1'}, {'6', '2'}, {'6', '3'}, {'6', '4'}, + {'6', '5'}, {'6', '6'}, {'6', '7'}, {'6', '8'}, {'6', '9'}, + {'7', '0'}, {'7', '1'}, {'7', '2'}, {'7', '3'}, {'7', '4'}, + {'7', '5'}, {'7', '6'}, {'7', '7'}, {'7', '8'}, {'7', '9'}, + {'8', '0'}, {'8', '1'}, {'8', '2'}, {'8', '3'}, {'8', '4'}, + {'8', '5'}, {'8', '6'}, {'8', '7'}, {'8', '8'}, {'8', '9'}, + {'9', '0'}, {'9', '1'}, {'9', '2'}, {'9', '3'}, {'9', '4'}, + {'9', '5'}, {'9', '6'}, {'9', '7'}, {'9', '8'}, {'9', '9'}}; + +template +const char basic_data::hex_digits[] = "0123456789abcdef"; + +#define FMT_POWERS_OF_10(factor) \ + factor * 10, (factor)*100, (factor)*1000, (factor)*10000, (factor)*100000, \ + (factor)*1000000, (factor)*10000000, (factor)*100000000, \ + (factor)*1000000000 + +template +const uint64_t basic_data::powers_of_10_64[] = { + 1, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +template +const uint32_t basic_data::zero_or_powers_of_10_32[] = {0, + FMT_POWERS_OF_10(1)}; + +template +const uint64_t basic_data::zero_or_powers_of_10_64[] = { + 0, FMT_POWERS_OF_10(1), FMT_POWERS_OF_10(1000000000ULL), + 10000000000000000000ULL}; + +// Normalized 64-bit significands of pow(10, k), for k = -348, -340, ..., 340. +// These are generated by support/compute-powers.py. +template +const uint64_t basic_data::pow10_significands[] = { + 0xfa8fd5a0081c0288, 0xbaaee17fa23ebf76, 0x8b16fb203055ac76, + 0xcf42894a5dce35ea, 0x9a6bb0aa55653b2d, 0xe61acf033d1a45df, + 0xab70fe17c79ac6ca, 0xff77b1fcbebcdc4f, 0xbe5691ef416bd60c, + 0x8dd01fad907ffc3c, 0xd3515c2831559a83, 0x9d71ac8fada6c9b5, + 0xea9c227723ee8bcb, 0xaecc49914078536d, 0x823c12795db6ce57, + 0xc21094364dfb5637, 0x9096ea6f3848984f, 0xd77485cb25823ac7, + 0xa086cfcd97bf97f4, 0xef340a98172aace5, 0xb23867fb2a35b28e, + 0x84c8d4dfd2c63f3b, 0xc5dd44271ad3cdba, 0x936b9fcebb25c996, + 0xdbac6c247d62a584, 0xa3ab66580d5fdaf6, 0xf3e2f893dec3f126, + 0xb5b5ada8aaff80b8, 0x87625f056c7c4a8b, 0xc9bcff6034c13053, + 0x964e858c91ba2655, 0xdff9772470297ebd, 0xa6dfbd9fb8e5b88f, + 0xf8a95fcf88747d94, 0xb94470938fa89bcf, 0x8a08f0f8bf0f156b, + 0xcdb02555653131b6, 0x993fe2c6d07b7fac, 0xe45c10c42a2b3b06, + 0xaa242499697392d3, 0xfd87b5f28300ca0e, 0xbce5086492111aeb, + 0x8cbccc096f5088cc, 0xd1b71758e219652c, 0x9c40000000000000, + 0xe8d4a51000000000, 0xad78ebc5ac620000, 0x813f3978f8940984, + 0xc097ce7bc90715b3, 0x8f7e32ce7bea5c70, 0xd5d238a4abe98068, + 0x9f4f2726179a2245, 0xed63a231d4c4fb27, 0xb0de65388cc8ada8, + 0x83c7088e1aab65db, 0xc45d1df942711d9a, 0x924d692ca61be758, + 0xda01ee641a708dea, 0xa26da3999aef774a, 0xf209787bb47d6b85, + 0xb454e4a179dd1877, 0x865b86925b9bc5c2, 0xc83553c5c8965d3d, + 0x952ab45cfa97a0b3, 0xde469fbd99a05fe3, 0xa59bc234db398c25, + 0xf6c69a72a3989f5c, 0xb7dcbf5354e9bece, 0x88fcf317f22241e2, + 0xcc20ce9bd35c78a5, 0x98165af37b2153df, 0xe2a0b5dc971f303a, + 0xa8d9d1535ce3b396, 0xfb9b7cd9a4a7443c, 0xbb764c4ca7a44410, + 0x8bab8eefb6409c1a, 0xd01fef10a657842c, 0x9b10a4e5e9913129, + 0xe7109bfba19c0c9d, 0xac2820d9623bf429, 0x80444b5e7aa7cf85, + 0xbf21e44003acdd2d, 0x8e679c2f5e44ff8f, 0xd433179d9c8cb841, + 0x9e19db92b4e31ba9, 0xeb96bf6ebadf77d9, 0xaf87023b9bf0ee6b, +}; + +// Binary exponents of pow(10, k), for k = -348, -340, ..., 340, corresponding +// to significands above. +template +const int16_t basic_data::pow10_exponents[] = { + -1220, -1193, -1166, -1140, -1113, -1087, -1060, -1034, -1007, -980, -954, + -927, -901, -874, -847, -821, -794, -768, -741, -715, -688, -661, + -635, -608, -582, -555, -529, -502, -475, -449, -422, -396, -369, + -343, -316, -289, -263, -236, -210, -183, -157, -130, -103, -77, + -50, -24, 3, 30, 56, 83, 109, 136, 162, 189, 216, + 242, 269, 295, 322, 348, 375, 402, 428, 455, 481, 508, + 534, 561, 588, 614, 641, 667, 694, 720, 747, 774, 800, + 827, 853, 880, 907, 933, 960, 986, 1013, 1039, 1066}; + +template +const char basic_data::foreground_color[] = "\x1b[38;2;"; +template +const char basic_data::background_color[] = "\x1b[48;2;"; +template const char basic_data::reset_color[] = "\x1b[0m"; +template const wchar_t basic_data::wreset_color[] = L"\x1b[0m"; +template const char basic_data::signs[] = {0, '-', '+', ' '}; +template +const char basic_data::left_padding_shifts[] = {31, 31, 0, 1, 0}; +template +const char basic_data::right_padding_shifts[] = {0, 31, 0, 1, 0}; + +template struct bits { + static FMT_CONSTEXPR_DECL const int value = + static_cast(sizeof(T) * std::numeric_limits::digits); +}; + +class fp; +template fp normalize(fp value); + +// Lower (upper) boundary is a value half way between a floating-point value +// and its predecessor (successor). Boundaries have the same exponent as the +// value so only significands are stored. +struct boundaries { + uint64_t lower; + uint64_t upper; +}; + +// A handmade floating-point number f * pow(2, e). +class fp { + private: + using significand_type = uint64_t; + + public: + significand_type f; + int e; + + // All sizes are in bits. + // Subtract 1 to account for an implicit most significant bit in the + // normalized form. + static FMT_CONSTEXPR_DECL const int double_significand_size = + std::numeric_limits::digits - 1; + static FMT_CONSTEXPR_DECL const uint64_t implicit_bit = + 1ULL << double_significand_size; + static FMT_CONSTEXPR_DECL const int significand_size = + bits::value; + + fp() : f(0), e(0) {} + fp(uint64_t f_val, int e_val) : f(f_val), e(e_val) {} + + // Constructs fp from an IEEE754 double. It is a template to prevent compile + // errors on platforms where double is not IEEE754. + template explicit fp(Double d) { assign(d); } + + // Assigns d to this and return true iff predecessor is closer than successor. + template + bool assign(Double d) { + // Assume double is in the format [sign][exponent][significand]. + using limits = std::numeric_limits; + const int exponent_size = + bits::value - double_significand_size - 1; // -1 for sign + const uint64_t significand_mask = implicit_bit - 1; + const uint64_t exponent_mask = (~0ULL >> 1) & ~significand_mask; + const int exponent_bias = (1 << exponent_size) - limits::max_exponent - 1; + auto u = bit_cast(d); + f = u & significand_mask; + int biased_e = + static_cast((u & exponent_mask) >> double_significand_size); + // Predecessor is closer if d is a normalized power of 2 (f == 0) other than + // the smallest normalized number (biased_e > 1). + bool is_predecessor_closer = f == 0 && biased_e > 1; + if (biased_e != 0) + f += implicit_bit; + else + biased_e = 1; // Subnormals use biased exponent 1 (min exponent). + e = biased_e - exponent_bias - double_significand_size; + return is_predecessor_closer; + } + + template + bool assign(Double) { + *this = fp(); + return false; + } + + // Assigns d to this together with computing lower and upper boundaries, + // where a boundary is a value half way between the number and its predecessor + // (lower) or successor (upper). The upper boundary is normalized and lower + // has the same exponent but may be not normalized. + template boundaries assign_with_boundaries(Double d) { + bool is_lower_closer = assign(d); + fp lower = + is_lower_closer ? fp((f << 2) - 1, e - 2) : fp((f << 1) - 1, e - 1); + // 1 in normalize accounts for the exponent shift above. + fp upper = normalize<1>(fp((f << 1) + 1, e - 1)); + lower.f <<= lower.e - upper.e; + return boundaries{lower.f, upper.f}; + } + + template boundaries assign_float_with_boundaries(Double d) { + assign(d); + constexpr int min_normal_e = std::numeric_limits::min_exponent - + std::numeric_limits::digits; + significand_type half_ulp = 1 << (std::numeric_limits::digits - + std::numeric_limits::digits - 1); + if (min_normal_e > e) half_ulp <<= min_normal_e - e; + fp upper = normalize<0>(fp(f + half_ulp, e)); + fp lower = fp( + f - (half_ulp >> ((f == implicit_bit && e > min_normal_e) ? 1 : 0)), e); + lower.f <<= lower.e - upper.e; + return boundaries{lower.f, upper.f}; + } +}; + +// Normalizes the value converted from double and multiplied by (1 << SHIFT). +template fp normalize(fp value) { + // Handle subnormals. + const auto shifted_implicit_bit = fp::implicit_bit << SHIFT; + while ((value.f & shifted_implicit_bit) == 0) { + value.f <<= 1; + --value.e; + } + // Subtract 1 to account for hidden bit. + const auto offset = + fp::significand_size - fp::double_significand_size - SHIFT - 1; + value.f <<= offset; + value.e -= offset; + return value; +} + +inline bool operator==(fp x, fp y) { return x.f == y.f && x.e == y.e; } + +// Computes lhs * rhs / pow(2, 64) rounded to nearest with half-up tie breaking. +inline uint64_t multiply(uint64_t lhs, uint64_t rhs) { +#if FMT_USE_INT128 + auto product = static_cast<__uint128_t>(lhs) * rhs; + auto f = static_cast(product >> 64); + return (static_cast(product) & (1ULL << 63)) != 0 ? f + 1 : f; +#else + // Multiply 32-bit parts of significands. + uint64_t mask = (1ULL << 32) - 1; + uint64_t a = lhs >> 32, b = lhs & mask; + uint64_t c = rhs >> 32, d = rhs & mask; + uint64_t ac = a * c, bc = b * c, ad = a * d, bd = b * d; + // Compute mid 64-bit of result and round. + uint64_t mid = (bd >> 32) + (ad & mask) + (bc & mask) + (1U << 31); + return ac + (ad >> 32) + (bc >> 32) + (mid >> 32); +#endif +} + +inline fp operator*(fp x, fp y) { return {multiply(x.f, y.f), x.e + y.e + 64}; } + +// Returns a cached power of 10 `c_k = c_k.f * pow(2, c_k.e)` such that its +// (binary) exponent satisfies `min_exponent <= c_k.e <= min_exponent + 28`. +inline fp get_cached_power(int min_exponent, int& pow10_exponent) { + const int64_t one_over_log2_10 = 0x4d104d42; // round(pow(2, 32) / log2(10)) + int index = static_cast( + ((min_exponent + fp::significand_size - 1) * one_over_log2_10 + + ((int64_t(1) << 32) - 1)) // ceil + >> 32 // arithmetic shift + ); + // Decimal exponent of the first (smallest) cached power of 10. + const int first_dec_exp = -348; + // Difference between 2 consecutive decimal exponents in cached powers of 10. + const int dec_exp_step = 8; + index = (index - first_dec_exp - 1) / dec_exp_step + 1; + pow10_exponent = first_dec_exp + index * dec_exp_step; + return {data::pow10_significands[index], data::pow10_exponents[index]}; +} + +// A simple accumulator to hold the sums of terms in bigint::square if uint128_t +// is not available. +struct accumulator { + uint64_t lower; + uint64_t upper; + + accumulator() : lower(0), upper(0) {} + explicit operator uint32_t() const { return static_cast(lower); } + + void operator+=(uint64_t n) { + lower += n; + if (lower < n) ++upper; + } + void operator>>=(int shift) { + assert(shift == 32); + (void)shift; + lower = (upper << 32) | (lower >> 32); + upper >>= 32; + } +}; + +class bigint { + private: + // A bigint is stored as an array of bigits (big digits), with bigit at index + // 0 being the least significant one. + using bigit = uint32_t; + using double_bigit = uint64_t; + enum { bigits_capacity = 32 }; + basic_memory_buffer bigits_; + int exp_; + + bigit operator[](int index) const { return bigits_[to_unsigned(index)]; } + bigit& operator[](int index) { return bigits_[to_unsigned(index)]; } + + static FMT_CONSTEXPR_DECL const int bigit_bits = bits::value; + + friend struct formatter; + + void subtract_bigits(int index, bigit other, bigit& borrow) { + auto result = static_cast((*this)[index]) - other - borrow; + (*this)[index] = static_cast(result); + borrow = static_cast(result >> (bigit_bits * 2 - 1)); + } + + void remove_leading_zeros() { + int num_bigits = static_cast(bigits_.size()) - 1; + while (num_bigits > 0 && (*this)[num_bigits] == 0) --num_bigits; + bigits_.resize(to_unsigned(num_bigits + 1)); + } + + // Computes *this -= other assuming aligned bigints and *this >= other. + void subtract_aligned(const bigint& other) { + FMT_ASSERT(other.exp_ >= exp_, "unaligned bigints"); + FMT_ASSERT(compare(*this, other) >= 0, ""); + bigit borrow = 0; + int i = other.exp_ - exp_; + for (size_t j = 0, n = other.bigits_.size(); j != n; ++i, ++j) { + subtract_bigits(i, other.bigits_[j], borrow); + } + while (borrow > 0) subtract_bigits(i, 0, borrow); + remove_leading_zeros(); + } + + void multiply(uint32_t value) { + const double_bigit wide_value = value; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * wide_value + carry; + bigits_[i] = static_cast(result); + carry = static_cast(result >> bigit_bits); + } + if (carry != 0) bigits_.push_back(carry); + } + + void multiply(uint64_t value) { + const bigit mask = ~bigit(0); + const double_bigit lower = value & mask; + const double_bigit upper = value >> bigit_bits; + double_bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + double_bigit result = bigits_[i] * lower + (carry & mask); + carry = + bigits_[i] * upper + (result >> bigit_bits) + (carry >> bigit_bits); + bigits_[i] = static_cast(result); + } + while (carry != 0) { + bigits_.push_back(carry & mask); + carry >>= bigit_bits; + } + } + + public: + bigint() : exp_(0) {} + explicit bigint(uint64_t n) { assign(n); } + ~bigint() { assert(bigits_.capacity() <= bigits_capacity); } + + bigint(const bigint&) = delete; + void operator=(const bigint&) = delete; + + void assign(const bigint& other) { + auto size = other.bigits_.size(); + bigits_.resize(size); + auto data = other.bigits_.data(); + std::copy(data, data + size, make_checked(bigits_.data(), size)); + exp_ = other.exp_; + } + + void assign(uint64_t n) { + size_t num_bigits = 0; + do { + bigits_[num_bigits++] = n & ~bigit(0); + n >>= bigit_bits; + } while (n != 0); + bigits_.resize(num_bigits); + exp_ = 0; + } + + int num_bigits() const { return static_cast(bigits_.size()) + exp_; } + + FMT_NOINLINE bigint& operator<<=(int shift) { + assert(shift >= 0); + exp_ += shift / bigit_bits; + shift %= bigit_bits; + if (shift == 0) return *this; + bigit carry = 0; + for (size_t i = 0, n = bigits_.size(); i < n; ++i) { + bigit c = bigits_[i] >> (bigit_bits - shift); + bigits_[i] = (bigits_[i] << shift) + carry; + carry = c; + } + if (carry != 0) bigits_.push_back(carry); + return *this; + } + + template bigint& operator*=(Int value) { + FMT_ASSERT(value > 0, ""); + multiply(uint32_or_64_or_128_t(value)); + return *this; + } + + friend int compare(const bigint& lhs, const bigint& rhs) { + int num_lhs_bigits = lhs.num_bigits(), num_rhs_bigits = rhs.num_bigits(); + if (num_lhs_bigits != num_rhs_bigits) + return num_lhs_bigits > num_rhs_bigits ? 1 : -1; + int i = static_cast(lhs.bigits_.size()) - 1; + int j = static_cast(rhs.bigits_.size()) - 1; + int end = i - j; + if (end < 0) end = 0; + for (; i >= end; --i, --j) { + bigit lhs_bigit = lhs[i], rhs_bigit = rhs[j]; + if (lhs_bigit != rhs_bigit) return lhs_bigit > rhs_bigit ? 1 : -1; + } + if (i != j) return i > j ? 1 : -1; + return 0; + } + + // Returns compare(lhs1 + lhs2, rhs). + friend int add_compare(const bigint& lhs1, const bigint& lhs2, + const bigint& rhs) { + int max_lhs_bigits = (std::max)(lhs1.num_bigits(), lhs2.num_bigits()); + int num_rhs_bigits = rhs.num_bigits(); + if (max_lhs_bigits + 1 < num_rhs_bigits) return -1; + if (max_lhs_bigits > num_rhs_bigits) return 1; + auto get_bigit = [](const bigint& n, int i) -> bigit { + return i >= n.exp_ && i < n.num_bigits() ? n[i - n.exp_] : 0; + }; + double_bigit borrow = 0; + int min_exp = (std::min)((std::min)(lhs1.exp_, lhs2.exp_), rhs.exp_); + for (int i = num_rhs_bigits - 1; i >= min_exp; --i) { + double_bigit sum = + static_cast(get_bigit(lhs1, i)) + get_bigit(lhs2, i); + bigit rhs_bigit = get_bigit(rhs, i); + if (sum > rhs_bigit + borrow) return 1; + borrow = rhs_bigit + borrow - sum; + if (borrow > 1) return -1; + borrow <<= bigit_bits; + } + return borrow != 0 ? -1 : 0; + } + + // Assigns pow(10, exp) to this bigint. + void assign_pow10(int exp) { + assert(exp >= 0); + if (exp == 0) return assign(1); + // Find the top bit. + int bitmask = 1; + while (exp >= bitmask) bitmask <<= 1; + bitmask >>= 1; + // pow(10, exp) = pow(5, exp) * pow(2, exp). First compute pow(5, exp) by + // repeated squaring and multiplication. + assign(5); + bitmask >>= 1; + while (bitmask != 0) { + square(); + if ((exp & bitmask) != 0) *this *= 5; + bitmask >>= 1; + } + *this <<= exp; // Multiply by pow(2, exp) by shifting. + } + + void square() { + basic_memory_buffer n(std::move(bigits_)); + int num_bigits = static_cast(bigits_.size()); + int num_result_bigits = 2 * num_bigits; + bigits_.resize(to_unsigned(num_result_bigits)); + using accumulator_t = conditional_t; + auto sum = accumulator_t(); + for (int bigit_index = 0; bigit_index < num_bigits; ++bigit_index) { + // Compute bigit at position bigit_index of the result by adding + // cross-product terms n[i] * n[j] such that i + j == bigit_index. + for (int i = 0, j = bigit_index; j >= 0; ++i, --j) { + // Most terms are multiplied twice which can be optimized in the future. + sum += static_cast(n[i]) * n[j]; + } + (*this)[bigit_index] = static_cast(sum); + sum >>= bits::value; // Compute the carry. + } + // Do the same for the top half. + for (int bigit_index = num_bigits; bigit_index < num_result_bigits; + ++bigit_index) { + for (int j = num_bigits - 1, i = bigit_index - j; i < num_bigits;) + sum += static_cast(n[i++]) * n[j--]; + (*this)[bigit_index] = static_cast(sum); + sum >>= bits::value; + } + --num_result_bigits; + remove_leading_zeros(); + exp_ *= 2; + } + + // Divides this bignum by divisor, assigning the remainder to this and + // returning the quotient. + int divmod_assign(const bigint& divisor) { + FMT_ASSERT(this != &divisor, ""); + if (compare(*this, divisor) < 0) return 0; + int num_bigits = static_cast(bigits_.size()); + FMT_ASSERT(divisor.bigits_[divisor.bigits_.size() - 1u] != 0, ""); + int exp_difference = exp_ - divisor.exp_; + if (exp_difference > 0) { + // Align bigints by adding trailing zeros to simplify subtraction. + bigits_.resize(to_unsigned(num_bigits + exp_difference)); + for (int i = num_bigits - 1, j = i + exp_difference; i >= 0; --i, --j) + bigits_[j] = bigits_[i]; + std::uninitialized_fill_n(bigits_.data(), exp_difference, 0); + exp_ -= exp_difference; + } + int quotient = 0; + do { + subtract_aligned(divisor); + ++quotient; + } while (compare(*this, divisor) >= 0); + return quotient; + } +}; + +enum class round_direction { unknown, up, down }; + +// Given the divisor (normally a power of 10), the remainder = v % divisor for +// some number v and the error, returns whether v should be rounded up, down, or +// whether the rounding direction can't be determined due to error. +// error should be less than divisor / 2. +inline round_direction get_round_direction(uint64_t divisor, uint64_t remainder, + uint64_t error) { + FMT_ASSERT(remainder < divisor, ""); // divisor - remainder won't overflow. + FMT_ASSERT(error < divisor, ""); // divisor - error won't overflow. + FMT_ASSERT(error < divisor - error, ""); // error * 2 won't overflow. + // Round down if (remainder + error) * 2 <= divisor. + if (remainder <= divisor - remainder && error * 2 <= divisor - remainder * 2) + return round_direction::down; + // Round up if (remainder - error) * 2 >= divisor. + if (remainder >= error && + remainder - error >= divisor - (remainder - error)) { + return round_direction::up; + } + return round_direction::unknown; +} + +namespace digits { +enum result { + more, // Generate more digits. + done, // Done generating digits. + error // Digit generation cancelled due to an error. +}; +} + +// A version of count_digits optimized for grisu_gen_digits. +inline int grisu_count_digits(uint32_t n) { + if (n < 10) return 1; + if (n < 100) return 2; + if (n < 1000) return 3; + if (n < 10000) return 4; + if (n < 100000) return 5; + if (n < 1000000) return 6; + if (n < 10000000) return 7; + if (n < 100000000) return 8; + if (n < 1000000000) return 9; + return 10; +} + +// Generates output using the Grisu digit-gen algorithm. +// error: the size of the region (lower, upper) outside of which numbers +// definitely do not round to value (Delta in Grisu3). +template +FMT_ALWAYS_INLINE digits::result grisu_gen_digits(fp value, uint64_t error, + int& exp, Handler& handler) { + const fp one(1ULL << -value.e, value.e); + // The integral part of scaled value (p1 in Grisu) = value / one. It cannot be + // zero because it contains a product of two 64-bit numbers with MSB set (due + // to normalization) - 1, shifted right by at most 60 bits. + auto integral = static_cast(value.f >> -one.e); + FMT_ASSERT(integral != 0, ""); + FMT_ASSERT(integral == value.f >> -one.e, ""); + // The fractional part of scaled value (p2 in Grisu) c = value % one. + uint64_t fractional = value.f & (one.f - 1); + exp = grisu_count_digits(integral); // kappa in Grisu. + // Divide by 10 to prevent overflow. + auto result = handler.on_start(data::powers_of_10_64[exp - 1] << -one.e, + value.f / 10, error * 10, exp); + if (result != digits::more) return result; + // Generate digits for the integral part. This can produce up to 10 digits. + do { + uint32_t digit = 0; + auto divmod_integral = [&](uint32_t divisor) { + digit = integral / divisor; + integral %= divisor; + }; + // This optimization by Milo Yip reduces the number of integer divisions by + // one per iteration. + switch (exp) { + case 10: + divmod_integral(1000000000); + break; + case 9: + divmod_integral(100000000); + break; + case 8: + divmod_integral(10000000); + break; + case 7: + divmod_integral(1000000); + break; + case 6: + divmod_integral(100000); + break; + case 5: + divmod_integral(10000); + break; + case 4: + divmod_integral(1000); + break; + case 3: + divmod_integral(100); + break; + case 2: + divmod_integral(10); + break; + case 1: + digit = integral; + integral = 0; + break; + default: + FMT_ASSERT(false, "invalid number of digits"); + } + --exp; + uint64_t remainder = + (static_cast(integral) << -one.e) + fractional; + result = handler.on_digit(static_cast('0' + digit), + data::powers_of_10_64[exp] << -one.e, remainder, + error, exp, true); + if (result != digits::more) return result; + } while (exp > 0); + // Generate digits for the fractional part. + for (;;) { + fractional *= 10; + error *= 10; + char digit = + static_cast('0' + static_cast(fractional >> -one.e)); + fractional &= one.f - 1; + --exp; + result = handler.on_digit(digit, one.f, fractional, error, exp, false); + if (result != digits::more) return result; + } +} + +// The fixed precision digit handler. +struct fixed_handler { + char* buf; + int size; + int precision; + int exp10; + bool fixed; + + digits::result on_start(uint64_t divisor, uint64_t remainder, uint64_t error, + int& exp) { + // Non-fixed formats require at least one digit and no precision adjustment. + if (!fixed) return digits::more; + // Adjust fixed precision by exponent because it is relative to decimal + // point. + precision += exp + exp10; + // Check if precision is satisfied just by leading zeros, e.g. + // format("{:.2f}", 0.001) gives "0.00" without generating any digits. + if (precision > 0) return digits::more; + if (precision < 0) return digits::done; + auto dir = get_round_direction(divisor, remainder, error); + if (dir == round_direction::unknown) return digits::error; + buf[size++] = dir == round_direction::up ? '1' : '0'; + return digits::done; + } + + digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder, + uint64_t error, int, bool integral) { + FMT_ASSERT(remainder < divisor, ""); + buf[size++] = digit; + if (size < precision) return digits::more; + if (!integral) { + // Check if error * 2 < divisor with overflow prevention. + // The check is not needed for the integral part because error = 1 + // and divisor > (1 << 32) there. + if (error >= divisor || error >= divisor - error) return digits::error; + } else { + FMT_ASSERT(error == 1 && divisor > 2, ""); + } + auto dir = get_round_direction(divisor, remainder, error); + if (dir != round_direction::up) + return dir == round_direction::down ? digits::done : digits::error; + ++buf[size - 1]; + for (int i = size - 1; i > 0 && buf[i] > '9'; --i) { + buf[i] = '0'; + ++buf[i - 1]; + } + if (buf[0] > '9') { + buf[0] = '1'; + buf[size++] = '0'; + } + return digits::done; + } +}; + +// The shortest representation digit handler. +struct grisu_shortest_handler { + char* buf; + int size; + // Distance between scaled value and upper bound (wp_W in Grisu3). + uint64_t diff; + + digits::result on_start(uint64_t, uint64_t, uint64_t, int&) { + return digits::more; + } + + // Decrement the generated number approaching value from above. + void round(uint64_t d, uint64_t divisor, uint64_t& remainder, + uint64_t error) { + while ( + remainder < d && error - remainder >= divisor && + (remainder + divisor < d || d - remainder >= remainder + divisor - d)) { + --buf[size - 1]; + remainder += divisor; + } + } + + // Implements Grisu's round_weed. + digits::result on_digit(char digit, uint64_t divisor, uint64_t remainder, + uint64_t error, int exp, bool integral) { + buf[size++] = digit; + if (remainder >= error) return digits::more; + uint64_t unit = integral ? 1 : data::powers_of_10_64[-exp]; + uint64_t up = (diff - 1) * unit; // wp_Wup + round(up, divisor, remainder, error); + uint64_t down = (diff + 1) * unit; // wp_Wdown + if (remainder < down && error - remainder >= divisor && + (remainder + divisor < down || + down - remainder > remainder + divisor - down)) { + return digits::error; + } + return 2 * unit <= remainder && remainder <= error - 4 * unit + ? digits::done + : digits::error; + } +}; + +// Formats value using a variation of the Fixed-Precision Positive +// Floating-Point Printout ((FPP)^2) algorithm by Steele & White: +// https://fmt.dev/p372-steele.pdf. +template +void fallback_format(Double d, buffer& buf, int& exp10) { + bigint numerator; // 2 * R in (FPP)^2. + bigint denominator; // 2 * S in (FPP)^2. + // lower and upper are differences between value and corresponding boundaries. + bigint lower; // (M^- in (FPP)^2). + bigint upper_store; // upper's value if different from lower. + bigint* upper = nullptr; // (M^+ in (FPP)^2). + fp value; + // Shift numerator and denominator by an extra bit or two (if lower boundary + // is closer) to make lower and upper integers. This eliminates multiplication + // by 2 during later computations. + // TODO: handle float + int shift = value.assign(d) ? 2 : 1; + uint64_t significand = value.f << shift; + if (value.e >= 0) { + numerator.assign(significand); + numerator <<= value.e; + lower.assign(1); + lower <<= value.e; + if (shift != 1) { + upper_store.assign(1); + upper_store <<= value.e + 1; + upper = &upper_store; + } + denominator.assign_pow10(exp10); + denominator <<= 1; + } else if (exp10 < 0) { + numerator.assign_pow10(-exp10); + lower.assign(numerator); + if (shift != 1) { + upper_store.assign(numerator); + upper_store <<= 1; + upper = &upper_store; + } + numerator *= significand; + denominator.assign(1); + denominator <<= shift - value.e; + } else { + numerator.assign(significand); + denominator.assign_pow10(exp10); + denominator <<= shift - value.e; + lower.assign(1); + if (shift != 1) { + upper_store.assign(1ULL << 1); + upper = &upper_store; + } + } + if (!upper) upper = &lower; + // Invariant: value == (numerator / denominator) * pow(10, exp10). + bool even = (value.f & 1) == 0; + int num_digits = 0; + char* data = buf.data(); + for (;;) { + int digit = numerator.divmod_assign(denominator); + bool low = compare(numerator, lower) - even < 0; // numerator <[=] lower. + // numerator + upper >[=] pow10: + bool high = add_compare(numerator, *upper, denominator) + even > 0; + data[num_digits++] = static_cast('0' + digit); + if (low || high) { + if (!low) { + ++data[num_digits - 1]; + } else if (high) { + int result = add_compare(numerator, numerator, denominator); + // Round half to even. + if (result > 0 || (result == 0 && (digit % 2) != 0)) + ++data[num_digits - 1]; + } + buf.resize(to_unsigned(num_digits)); + exp10 -= num_digits - 1; + return; + } + numerator *= 10; + lower *= 10; + if (upper != &lower) *upper *= 10; + } +} + +// Formats value using the Grisu algorithm +// (https://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf) +// if T is a IEEE754 binary32 or binary64 and snprintf otherwise. +template +int format_float(T value, int precision, float_specs specs, buffer& buf) { + static_assert(!std::is_same::value, ""); + FMT_ASSERT(value >= 0, "value is negative"); + + const bool fixed = specs.format == float_format::fixed; + if (value <= 0) { // <= instead of == to silence a warning. + if (precision <= 0 || !fixed) { + buf.push_back('0'); + return 0; + } + buf.resize(to_unsigned(precision)); + std::uninitialized_fill_n(buf.data(), precision, '0'); + return -precision; + } + + if (!specs.use_grisu) return snprintf_float(value, precision, specs, buf); + + int exp = 0; + const int min_exp = -60; // alpha in Grisu. + int cached_exp10 = 0; // K in Grisu. + if (precision < 0) { + fp fp_value; + auto boundaries = specs.binary32 + ? fp_value.assign_float_with_boundaries(value) + : fp_value.assign_with_boundaries(value); + fp_value = normalize(fp_value); + // Find a cached power of 10 such that multiplying value by it will bring + // the exponent in the range [min_exp, -32]. + const fp cached_pow = get_cached_power( + min_exp - (fp_value.e + fp::significand_size), cached_exp10); + // Multiply value and boundaries by the cached power of 10. + fp_value = fp_value * cached_pow; + boundaries.lower = multiply(boundaries.lower, cached_pow.f); + boundaries.upper = multiply(boundaries.upper, cached_pow.f); + assert(min_exp <= fp_value.e && fp_value.e <= -32); + --boundaries.lower; // \tilde{M}^- - 1 ulp -> M^-_{\downarrow}. + ++boundaries.upper; // \tilde{M}^+ + 1 ulp -> M^+_{\uparrow}. + // Numbers outside of (lower, upper) definitely do not round to value. + grisu_shortest_handler handler{buf.data(), 0, + boundaries.upper - fp_value.f}; + auto result = + grisu_gen_digits(fp(boundaries.upper, fp_value.e), + boundaries.upper - boundaries.lower, exp, handler); + if (result == digits::error) { + exp += handler.size - cached_exp10 - 1; + fallback_format(value, buf, exp); + return exp; + } + buf.resize(to_unsigned(handler.size)); + } else { + if (precision > 17) return snprintf_float(value, precision, specs, buf); + fp normalized = normalize(fp(value)); + const auto cached_pow = get_cached_power( + min_exp - (normalized.e + fp::significand_size), cached_exp10); + normalized = normalized * cached_pow; + fixed_handler handler{buf.data(), 0, precision, -cached_exp10, fixed}; + if (grisu_gen_digits(normalized, 1, exp, handler) == digits::error) + return snprintf_float(value, precision, specs, buf); + int num_digits = handler.size; + if (!fixed) { + // Remove trailing zeros. + while (num_digits > 0 && buf[num_digits - 1] == '0') { + --num_digits; + ++exp; + } + } + buf.resize(to_unsigned(num_digits)); + } + return exp - cached_exp10; +} + +template +int snprintf_float(T value, int precision, float_specs specs, + buffer& buf) { + // Buffer capacity must be non-zero, otherwise MSVC's vsnprintf_s will fail. + FMT_ASSERT(buf.capacity() > buf.size(), "empty buffer"); + static_assert(!std::is_same::value, ""); + + // Subtract 1 to account for the difference in precision since we use %e for + // both general and exponent format. + if (specs.format == float_format::general || + specs.format == float_format::exp) + precision = (precision >= 0 ? precision : 6) - 1; + + // Build the format string. + enum { max_format_size = 7 }; // The longest format is "%#.*Le". + char format[max_format_size]; + char* format_ptr = format; + *format_ptr++ = '%'; + if (specs.showpoint && specs.format == float_format::hex) *format_ptr++ = '#'; + if (precision >= 0) { + *format_ptr++ = '.'; + *format_ptr++ = '*'; + } + if (std::is_same()) *format_ptr++ = 'L'; + *format_ptr++ = specs.format != float_format::hex + ? (specs.format == float_format::fixed ? 'f' : 'e') + : (specs.upper ? 'A' : 'a'); + *format_ptr = '\0'; + + // Format using snprintf. + auto offset = buf.size(); + for (;;) { + auto begin = buf.data() + offset; + auto capacity = buf.capacity() - offset; +#ifdef FMT_FUZZ + if (precision > 100000) + throw std::runtime_error( + "fuzz mode - avoid large allocation inside snprintf"); +#endif + // Suppress the warning about a nonliteral format string. + // Cannot use auto because of a bug in MinGW (#1532). + int (*snprintf_ptr)(char*, size_t, const char*, ...) = FMT_SNPRINTF; + int result = precision >= 0 + ? snprintf_ptr(begin, capacity, format, precision, value) + : snprintf_ptr(begin, capacity, format, value); + if (result < 0) { + buf.reserve(buf.capacity() + 1); // The buffer will grow exponentially. + continue; + } + auto size = to_unsigned(result); + // Size equal to capacity means that the last character was truncated. + if (size >= capacity) { + buf.reserve(size + offset + 1); // Add 1 for the terminating '\0'. + continue; + } + auto is_digit = [](char c) { return c >= '0' && c <= '9'; }; + if (specs.format == float_format::fixed) { + if (precision == 0) { + buf.resize(size); + return 0; + } + // Find and remove the decimal point. + auto end = begin + size, p = end; + do { + --p; + } while (is_digit(*p)); + int fraction_size = static_cast(end - p - 1); + std::memmove(p, p + 1, to_unsigned(fraction_size)); + buf.resize(size - 1); + return -fraction_size; + } + if (specs.format == float_format::hex) { + buf.resize(size + offset); + return 0; + } + // Find and parse the exponent. + auto end = begin + size, exp_pos = end; + do { + --exp_pos; + } while (*exp_pos != 'e'); + char sign = exp_pos[1]; + assert(sign == '+' || sign == '-'); + int exp = 0; + auto p = exp_pos + 2; // Skip 'e' and sign. + do { + assert(is_digit(*p)); + exp = exp * 10 + (*p++ - '0'); + } while (p != end); + if (sign == '-') exp = -exp; + int fraction_size = 0; + if (exp_pos != begin + 1) { + // Remove trailing zeros. + auto fraction_end = exp_pos - 1; + while (*fraction_end == '0') --fraction_end; + // Move the fractional part left to get rid of the decimal point. + fraction_size = static_cast(fraction_end - begin - 1); + std::memmove(begin + 1, begin + 2, to_unsigned(fraction_size)); + } + buf.resize(to_unsigned(fraction_size) + offset + 1); + return exp - fraction_size; + } +} + +// A public domain branchless UTF-8 decoder by Christopher Wellons: +// https://github.com/skeeto/branchless-utf8 +/* Decode the next character, c, from buf, reporting errors in e. + * + * Since this is a branchless decoder, four bytes will be read from the + * buffer regardless of the actual length of the next character. This + * means the buffer _must_ have at least three bytes of zero padding + * following the end of the data stream. + * + * Errors are reported in e, which will be non-zero if the parsed + * character was somehow invalid: invalid byte sequence, non-canonical + * encoding, or a surrogate half. + * + * The function returns a pointer to the next character. When an error + * occurs, this pointer will be a guess that depends on the particular + * error, but it will always advance at least one byte. + */ +FMT_FUNC const char* utf8_decode(const char* buf, uint32_t* c, int* e) { + static const char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 2, 2, 3, 3, 4, 0}; + static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07}; + static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536}; + static const int shiftc[] = {0, 18, 12, 6, 0}; + static const int shifte[] = {0, 6, 4, 2, 0}; + + auto s = reinterpret_cast(buf); + int len = lengths[s[0] >> 3]; + + // Compute the pointer to the next character early so that the next + // iteration can start working on the next character. Neither Clang + // nor GCC figure out this reordering on their own. + const char* next = buf + len + !len; + + // Assume a four-byte character and load four bytes. Unused bits are + // shifted out. + *c = uint32_t(s[0] & masks[len]) << 18; + *c |= uint32_t(s[1] & 0x3f) << 12; + *c |= uint32_t(s[2] & 0x3f) << 6; + *c |= uint32_t(s[3] & 0x3f) << 0; + *c >>= shiftc[len]; + + // Accumulate the various error conditions. + *e = (*c < mins[len]) << 6; // non-canonical encoding + *e |= ((*c >> 11) == 0x1b) << 7; // surrogate half? + *e |= (*c > 0x10FFFF) << 8; // out of range? + *e |= (s[1] & 0xc0) >> 2; + *e |= (s[2] & 0xc0) >> 4; + *e |= (s[3]) >> 6; + *e ^= 0x2a; // top two bits of each tail byte correct? + *e >>= shifte[len]; + + return next; +} +} // namespace detail + +template <> struct formatter { + format_parse_context::iterator parse(format_parse_context& ctx) { + return ctx.begin(); + } + + format_context::iterator format(const detail::bigint& n, + format_context& ctx) { + auto out = ctx.out(); + bool first = true; + for (auto i = n.bigits_.size(); i > 0; --i) { + auto value = n.bigits_[i - 1u]; + if (first) { + out = format_to(out, "{:x}", value); + first = false; + continue; + } + out = format_to(out, "{:08x}", value); + } + if (n.exp_ > 0) + out = format_to(out, "p{}", n.exp_ * detail::bigint::bigit_bits); + return out; + } +}; + +FMT_FUNC detail::utf8_to_utf16::utf8_to_utf16(string_view s) { + auto transcode = [this](const char* p) { + auto cp = uint32_t(); + auto error = 0; + p = utf8_decode(p, &cp, &error); + if (error != 0) FMT_THROW(std::runtime_error("invalid utf8")); + if (cp <= 0xFFFF) { + buffer_.push_back(static_cast(cp)); + } else { + cp -= 0x10000; + buffer_.push_back(static_cast(0xD800 + (cp >> 10))); + buffer_.push_back(static_cast(0xDC00 + (cp & 0x3FF))); + } + return p; + }; + auto p = s.data(); + const size_t block_size = 4; // utf8_decode always reads blocks of 4 chars. + if (s.size() >= block_size) { + for (auto end = p + s.size() - block_size + 1; p < end;) p = transcode(p); + } + if (auto num_chars_left = s.data() + s.size() - p) { + char buf[2 * block_size - 1] = {}; + memcpy(buf, p, to_unsigned(num_chars_left)); + p = buf; + do { + p = transcode(p); + } while (p - buf < num_chars_left); + } + buffer_.push_back(0); +} + +FMT_FUNC void format_system_error(detail::buffer& out, int error_code, + string_view message) FMT_NOEXCEPT { + FMT_TRY { + memory_buffer buf; + buf.resize(inline_buffer_size); + for (;;) { + char* system_message = &buf[0]; + int result = + detail::safe_strerror(error_code, system_message, buf.size()); + if (result == 0) { + format_to(std::back_inserter(out), "{}: {}", message, system_message); + return; + } + if (result != ERANGE) + break; // Can't get error message, report error code instead. + buf.resize(buf.size() * 2); + } + } + FMT_CATCH(...) {} + format_error_code(out, error_code, message); +} + +FMT_FUNC void detail::error_handler::on_error(const char* message) { + FMT_THROW(format_error(message)); +} + +FMT_FUNC void report_system_error(int error_code, + fmt::string_view message) FMT_NOEXCEPT { + report_error(format_system_error, error_code, message); +} + +struct stringifier { + template FMT_INLINE std::string operator()(T value) const { + return to_string(value); + } + std::string operator()(basic_format_arg::handle h) const { + memory_buffer buf; + detail::buffer& base = buf; + format_parse_context parse_ctx({}); + format_context format_ctx(std::back_inserter(base), {}, {}); + h.format(parse_ctx, format_ctx); + return to_string(buf); + } +}; + +FMT_FUNC std::string detail::vformat(string_view format_str, format_args args) { + if (format_str.size() == 2 && equal2(format_str.data(), "{}")) { + auto arg = args.get(0); + if (!arg) error_handler().on_error("argument not found"); + return visit_format_arg(stringifier(), arg); + } + memory_buffer buffer; + detail::vformat_to(buffer, format_str, args); + return to_string(buffer); +} + +FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); +#ifdef _WIN32 + auto fd = _fileno(f); + if (_isatty(fd)) { + detail::utf8_to_utf16 u16(string_view(buffer.data(), buffer.size())); + auto written = DWORD(); + if (!WriteConsoleW(reinterpret_cast(_get_osfhandle(fd)), + u16.c_str(), static_cast(u16.size()), &written, + nullptr)) { + FMT_THROW(format_error("failed to write to console")); + } + return; + } +#endif + detail::fwrite_fully(buffer.data(), 1, buffer.size(), f); +} + +#ifdef _WIN32 +// Print assuming legacy (non-Unicode) encoding. +FMT_FUNC void detail::vprint_mojibake(std::FILE* f, string_view format_str, + format_args args) { + memory_buffer buffer; + detail::vformat_to(buffer, format_str, + basic_format_args>(args)); + fwrite_fully(buffer.data(), 1, buffer.size(), f); +} +#endif + +FMT_FUNC void vprint(string_view format_str, format_args args) { + vprint(stdout, format_str, args); +} + +FMT_END_NAMESPACE + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +#endif // FMT_FORMAT_INL_H_ diff --git a/ThirdParty/fmtlib/include/fmt/format.h b/ThirdParty/fmtlib/include/fmt/format.h new file mode 100644 index 0000000000..17509b7b45 --- /dev/null +++ b/ThirdParty/fmtlib/include/fmt/format.h @@ -0,0 +1,3729 @@ +/* + Formatting library for C++ + + Copyright (c) 2012 - present, Victor Zverovich + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + --- Optional exception to the license --- + + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into a machine-executable object form of such + source code, you may redistribute such embedded portions in such object form + without including the above copyright and permission notices. + */ + +#ifndef FMT_FORMAT_H_ +#define FMT_FORMAT_H_ + +#include +#include +#include +#include +#include +#include +#include + +#include "core.h" + +#ifdef __INTEL_COMPILER +# define FMT_ICC_VERSION __INTEL_COMPILER +#elif defined(__ICL) +# define FMT_ICC_VERSION __ICL +#else +# define FMT_ICC_VERSION 0 +#endif + +#ifdef __NVCC__ +# define FMT_CUDA_VERSION (__CUDACC_VER_MAJOR__ * 100 + __CUDACC_VER_MINOR__) +#else +# define FMT_CUDA_VERSION 0 +#endif + +#ifdef __has_builtin +# define FMT_HAS_BUILTIN(x) __has_builtin(x) +#else +# define FMT_HAS_BUILTIN(x) 0 +#endif + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_NOINLINE __attribute__((noinline)) +#else +# define FMT_NOINLINE +#endif + +#if __cplusplus == 201103L || __cplusplus == 201402L +# if defined(__clang__) +# define FMT_FALLTHROUGH [[clang::fallthrough]] +# elif FMT_GCC_VERSION >= 700 && !defined(__PGI) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 520) +# define FMT_FALLTHROUGH [[gnu::fallthrough]] +# else +# define FMT_FALLTHROUGH +# endif +#elif FMT_HAS_CPP17_ATTRIBUTE(fallthrough) || \ + (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define FMT_FALLTHROUGH [[fallthrough]] +#else +# define FMT_FALLTHROUGH +#endif + +#ifndef FMT_MAYBE_UNUSED +# if FMT_HAS_CPP17_ATTRIBUTE(maybe_unused) +# define FMT_MAYBE_UNUSED [[maybe_unused]] +# else +# define FMT_MAYBE_UNUSED +# endif +#endif + +#ifndef FMT_THROW +# if FMT_EXCEPTIONS +# if FMT_MSC_VER || FMT_NVCC +FMT_BEGIN_NAMESPACE +namespace detail { +template inline void do_throw(const Exception& x) { + // Silence unreachable code warnings in MSVC and NVCC because these + // are nearly impossible to fix in a generic code. + volatile bool b = true; + if (b) throw x; +} +} // namespace detail +FMT_END_NAMESPACE +# define FMT_THROW(x) detail::do_throw(x) +# else +# define FMT_THROW(x) throw x +# endif +# else +# define FMT_THROW(x) \ + do { \ + static_cast(sizeof(x)); \ + FMT_ASSERT(false, ""); \ + } while (false) +# endif +#endif + +#if FMT_EXCEPTIONS +# define FMT_TRY try +# define FMT_CATCH(x) catch (x) +#else +# define FMT_TRY if (true) +# define FMT_CATCH(x) if (false) +#endif + +#ifndef FMT_USE_USER_DEFINED_LITERALS +// EDG based compilers (Intel, NVIDIA, Elbrus, etc), GCC and MSVC support UDLs. +# if (FMT_HAS_FEATURE(cxx_user_literals) || FMT_GCC_VERSION >= 407 || \ + FMT_MSC_VER >= 1900) && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= /* UDL feature */ 480) +# define FMT_USE_USER_DEFINED_LITERALS 1 +# else +# define FMT_USE_USER_DEFINED_LITERALS 0 +# endif +#endif + +#ifndef FMT_USE_UDL_TEMPLATE +// EDG frontend based compilers (icc, nvcc, etc) and GCC < 6.4 do not properly +// support UDL templates and GCC >= 9 warns about them. +# if FMT_USE_USER_DEFINED_LITERALS && \ + (!defined(__EDG_VERSION__) || __EDG_VERSION__ >= 501) && \ + ((FMT_GCC_VERSION >= 604 && __cplusplus >= 201402L) || \ + FMT_CLANG_VERSION >= 304) +# define FMT_USE_UDL_TEMPLATE 1 +# else +# define FMT_USE_UDL_TEMPLATE 0 +# endif +#endif + +#ifndef FMT_USE_FLOAT +# define FMT_USE_FLOAT 1 +#endif + +#ifndef FMT_USE_DOUBLE +# define FMT_USE_DOUBLE 1 +#endif + +#ifndef FMT_USE_LONG_DOUBLE +# define FMT_USE_LONG_DOUBLE 1 +#endif + +// __builtin_clz is broken in clang with Microsoft CodeGen: +// https://github.com/fmtlib/fmt/issues/519 +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clz)) && !FMT_MSC_VER +# define FMT_BUILTIN_CLZ(n) __builtin_clz(n) +#endif +#if (FMT_GCC_VERSION || FMT_HAS_BUILTIN(__builtin_clzll)) && !FMT_MSC_VER +# define FMT_BUILTIN_CLZLL(n) __builtin_clzll(n) +#endif + +// Some compilers masquerade as both MSVC and GCC-likes or otherwise support +// __builtin_clz and __builtin_clzll, so only define FMT_BUILTIN_CLZ using the +// MSVC intrinsics if the clz and clzll builtins are not available. +#if FMT_MSC_VER && !defined(FMT_BUILTIN_CLZLL) && !defined(_MANAGED) +# include // _BitScanReverse, _BitScanReverse64 + +FMT_BEGIN_NAMESPACE +namespace detail { +// Avoid Clang with Microsoft CodeGen's -Wunknown-pragmas warning. +# ifndef __clang__ +# pragma intrinsic(_BitScanReverse) +# endif +inline uint32_t clz(uint32_t x) { + unsigned long r = 0; + _BitScanReverse(&r, x); + + FMT_ASSERT(x != 0, ""); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. + FMT_SUPPRESS_MSC_WARNING(6102) + return 31 - r; +} +# define FMT_BUILTIN_CLZ(n) detail::clz(n) + +# if defined(_WIN64) && !defined(__clang__) +# pragma intrinsic(_BitScanReverse64) +# endif + +inline uint32_t clzll(uint64_t x) { + unsigned long r = 0; +# ifdef _WIN64 + _BitScanReverse64(&r, x); +# else + // Scan the high 32 bits. + if (_BitScanReverse(&r, static_cast(x >> 32))) return 63 - (r + 32); + + // Scan the low 32 bits. + _BitScanReverse(&r, static_cast(x)); +# endif + + FMT_ASSERT(x != 0, ""); + // Static analysis complains about using uninitialized data + // "r", but the only way that can happen is if "x" is 0, + // which the callers guarantee to not happen. + FMT_SUPPRESS_MSC_WARNING(6102) + return 63 - r; +} +# define FMT_BUILTIN_CLZLL(n) detail::clzll(n) +} // namespace detail +FMT_END_NAMESPACE +#endif + +// Enable the deprecated numeric alignment. +#ifndef FMT_DEPRECATED_NUMERIC_ALIGN +# define FMT_DEPRECATED_NUMERIC_ALIGN 0 +#endif + +FMT_BEGIN_NAMESPACE +namespace detail { + +// An equivalent of `*reinterpret_cast(&source)` that doesn't have +// undefined behavior (e.g. due to type aliasing). +// Example: uint64_t d = bit_cast(2.718); +template +inline Dest bit_cast(const Source& source) { + static_assert(sizeof(Dest) == sizeof(Source), "size mismatch"); + Dest dest; + std::memcpy(&dest, &source, sizeof(dest)); + return dest; +} + +inline bool is_big_endian() { + const auto u = 1u; + struct bytes { + char data[sizeof(u)]; + }; + return bit_cast(u).data[0] == 0; +} + +// A fallback implementation of uintptr_t for systems that lack it. +struct fallback_uintptr { + unsigned char value[sizeof(void*)]; + + fallback_uintptr() = default; + explicit fallback_uintptr(const void* p) { + *this = bit_cast(p); + if (is_big_endian()) { + for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j) + std::swap(value[i], value[j]); + } + } +}; +#ifdef UINTPTR_MAX +using uintptr_t = ::uintptr_t; +inline uintptr_t to_uintptr(const void* p) { return bit_cast(p); } +#else +using uintptr_t = fallback_uintptr; +inline fallback_uintptr to_uintptr(const void* p) { + return fallback_uintptr(p); +} +#endif + +// Returns the largest possible value for type T. Same as +// std::numeric_limits::max() but shorter and not affected by the max macro. +template constexpr T max_value() { + return (std::numeric_limits::max)(); +} +template constexpr int num_bits() { + return std::numeric_limits::digits; +} +// std::numeric_limits::digits may return 0 for 128-bit ints. +template <> constexpr int num_bits() { return 128; } +template <> constexpr int num_bits() { return 128; } +template <> constexpr int num_bits() { + return static_cast(sizeof(void*) * + std::numeric_limits::digits); +} + +FMT_INLINE void assume(bool condition) { + (void)condition; +#if FMT_HAS_BUILTIN(__builtin_assume) + __builtin_assume(condition); +#endif +} + +// A workaround for gcc 4.8 to make void_t work in a SFINAE context. +template struct void_t_impl { using type = void; }; + +template +using void_t = typename detail::void_t_impl::type; + +// An approximation of iterator_t for pre-C++20 systems. +template +using iterator_t = decltype(std::begin(std::declval())); +template using sentinel_t = decltype(std::end(std::declval())); + +// Detect the iterator category of *any* given type in a SFINAE-friendly way. +// Unfortunately, older implementations of std::iterator_traits are not safe +// for use in a SFINAE-context. +template +struct iterator_category : std::false_type {}; + +template struct iterator_category { + using type = std::random_access_iterator_tag; +}; + +template +struct iterator_category> { + using type = typename It::iterator_category; +}; + +// Detect if *any* given type models the OutputIterator concept. +template class is_output_iterator { + // Check for mutability because all iterator categories derived from + // std::input_iterator_tag *may* also meet the requirements of an + // OutputIterator, thereby falling into the category of 'mutable iterators' + // [iterator.requirements.general] clause 4. The compiler reveals this + // property only at the point of *actually dereferencing* the iterator! + template + static decltype(*(std::declval())) test(std::input_iterator_tag); + template static char& test(std::output_iterator_tag); + template static const char& test(...); + + using type = decltype(test(typename iterator_category::type{})); + + public: + enum { value = !std::is_const>::value }; +}; + +// A workaround for std::string not having mutable data() until C++17. +template inline Char* get_data(std::basic_string& s) { + return &s[0]; +} +template +inline typename Container::value_type* get_data(Container& c) { + return c.data(); +} + +#if defined(_SECURE_SCL) && _SECURE_SCL +// Make a checked iterator to avoid MSVC warnings. +template using checked_ptr = stdext::checked_array_iterator; +template checked_ptr make_checked(T* p, size_t size) { + return {p, size}; +} +#else +template using checked_ptr = T*; +template inline T* make_checked(T* p, size_t) { return p; } +#endif + +template ::value)> +#if FMT_CLANG_VERSION +__attribute__((no_sanitize("undefined"))) +#endif +inline checked_ptr +reserve(std::back_insert_iterator it, size_t n) { + Container& c = get_container(it); + size_t size = c.size(); + c.resize(size + n); + return make_checked(get_data(c) + size, n); +} + +template inline Iterator& reserve(Iterator& it, size_t) { + return it; +} + +template ::value)> +inline std::back_insert_iterator base_iterator( + std::back_insert_iterator& it, + checked_ptr) { + return it; +} + +template +inline Iterator base_iterator(Iterator, Iterator it) { + return it; +} + +// An output iterator that counts the number of objects written to it and +// discards them. +class counting_iterator { + private: + size_t count_; + + public: + using iterator_category = std::output_iterator_tag; + using difference_type = std::ptrdiff_t; + using pointer = void; + using reference = void; + using _Unchecked_type = counting_iterator; // Mark iterator as checked. + + struct value_type { + template void operator=(const T&) {} + }; + + counting_iterator() : count_(0) {} + + size_t count() const { return count_; } + + counting_iterator& operator++() { + ++count_; + return *this; + } + + counting_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + value_type operator*() const { return {}; } +}; + +template class truncating_iterator_base { + protected: + OutputIt out_; + size_t limit_; + size_t count_; + + truncating_iterator_base(OutputIt out, size_t limit) + : out_(out), limit_(limit), count_(0) {} + + public: + using iterator_category = std::output_iterator_tag; + using value_type = typename std::iterator_traits::value_type; + using difference_type = void; + using pointer = void; + using reference = void; + using _Unchecked_type = + truncating_iterator_base; // Mark iterator as checked. + + OutputIt base() const { return out_; } + size_t count() const { return count_; } +}; + +// An output iterator that truncates the output and counts the number of objects +// written to it. +template ::value_type>::type> +class truncating_iterator; + +template +class truncating_iterator + : public truncating_iterator_base { + mutable typename truncating_iterator_base::value_type blackhole_; + + public: + using value_type = typename truncating_iterator_base::value_type; + + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + truncating_iterator& operator++() { + if (this->count_++ < this->limit_) ++this->out_; + return *this; + } + + truncating_iterator operator++(int) { + auto it = *this; + ++*this; + return it; + } + + value_type& operator*() const { + return this->count_ < this->limit_ ? *this->out_ : blackhole_; + } +}; + +template +class truncating_iterator + : public truncating_iterator_base { + public: + truncating_iterator(OutputIt out, size_t limit) + : truncating_iterator_base(out, limit) {} + + template truncating_iterator& operator=(T val) { + if (this->count_++ < this->limit_) *this->out_++ = val; + return *this; + } + + truncating_iterator& operator++() { return *this; } + truncating_iterator& operator++(int) { return *this; } + truncating_iterator& operator*() { return *this; } +}; + +template +inline size_t count_code_points(basic_string_view s) { + return s.size(); +} + +// Counts the number of code points in a UTF-8 string. +inline size_t count_code_points(basic_string_view s) { + const char* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80) ++num_code_points; + } + return num_code_points; +} + +inline size_t count_code_points(basic_string_view s) { + return count_code_points(basic_string_view( + reinterpret_cast(s.data()), s.size())); +} + +template +inline size_t code_point_index(basic_string_view s, size_t n) { + size_t size = s.size(); + return n < size ? n : size; +} + +// Calculates the index of the nth code point in a UTF-8 string. +inline size_t code_point_index(basic_string_view s, size_t n) { + const char8_type* data = s.data(); + size_t num_code_points = 0; + for (size_t i = 0, size = s.size(); i != size; ++i) { + if ((data[i] & 0xc0) != 0x80 && ++num_code_points > n) { + return i; + } + } + return s.size(); +} + +template +using needs_conversion = bool_constant< + std::is_same::value_type, + char>::value && + std::is_same::value>; + +template ::value)> +OutputIt copy_str(InputIt begin, InputIt end, OutputIt it) { + return std::copy(begin, end, it); +} + +template ::value)> +OutputIt copy_str(InputIt begin, InputIt end, OutputIt it) { + return std::transform(begin, end, it, + [](char c) { return static_cast(c); }); +} + +#ifndef FMT_USE_GRISU +# define FMT_USE_GRISU 1 +#endif + +template constexpr bool use_grisu() { + return FMT_USE_GRISU && std::numeric_limits::is_iec559 && + sizeof(T) <= sizeof(double); +} + +template +template +void buffer::append(const U* begin, const U* end) { + size_t new_size = size_ + to_unsigned(end - begin); + reserve(new_size); + std::uninitialized_copy(begin, end, + make_checked(ptr_ + size_, capacity_ - size_)); + size_ = new_size; +} +} // namespace detail + +// The number of characters to store in the basic_memory_buffer object itself +// to avoid dynamic memory allocation. +enum { inline_buffer_size = 500 }; + +/** + \rst + A dynamically growing memory buffer for trivially copyable/constructible types + with the first ``SIZE`` elements stored in the object itself. + + You can use one of the following type aliases for common character types: + + +----------------+------------------------------+ + | Type | Definition | + +================+==============================+ + | memory_buffer | basic_memory_buffer | + +----------------+------------------------------+ + | wmemory_buffer | basic_memory_buffer | + +----------------+------------------------------+ + + **Example**:: + + fmt::memory_buffer out; + format_to(out, "The answer is {}.", 42); + + This will append the following output to the ``out`` object: + + .. code-block:: none + + The answer is 42. + + The output can be converted to an ``std::string`` with ``to_string(out)``. + \endrst + */ +template > +class basic_memory_buffer : public detail::buffer { + private: + T store_[SIZE]; + + // Don't inherit from Allocator avoid generating type_info for it. + Allocator alloc_; + + // Deallocate memory allocated by the buffer. + void deallocate() { + T* data = this->data(); + if (data != store_) alloc_.deallocate(data, this->capacity()); + } + + protected: + void grow(size_t size) FMT_OVERRIDE; + + public: + using value_type = T; + using const_reference = const T&; + + explicit basic_memory_buffer(const Allocator& alloc = Allocator()) + : alloc_(alloc) { + this->set(store_, SIZE); + } + ~basic_memory_buffer() FMT_OVERRIDE { deallocate(); } + + private: + // Move data from other to this buffer. + void move(basic_memory_buffer& other) { + alloc_ = std::move(other.alloc_); + T* data = other.data(); + size_t size = other.size(), capacity = other.capacity(); + if (data == other.store_) { + this->set(store_, capacity); + std::uninitialized_copy(other.store_, other.store_ + size, + detail::make_checked(store_, capacity)); + } else { + this->set(data, capacity); + // Set pointer to the inline array so that delete is not called + // when deallocating. + other.set(other.store_, 0); + } + this->resize(size); + } + + public: + /** + \rst + Constructs a :class:`fmt::basic_memory_buffer` object moving the content + of the other object to it. + \endrst + */ + basic_memory_buffer(basic_memory_buffer&& other) FMT_NOEXCEPT { move(other); } + + /** + \rst + Moves the content of the other ``basic_memory_buffer`` object to this one. + \endrst + */ + basic_memory_buffer& operator=(basic_memory_buffer&& other) FMT_NOEXCEPT { + FMT_ASSERT(this != &other, ""); + deallocate(); + move(other); + return *this; + } + + // Returns a copy of the allocator associated with this buffer. + Allocator get_allocator() const { return alloc_; } +}; + +template +void basic_memory_buffer::grow(size_t size) { +#ifdef FMT_FUZZ + if (size > 5000) throw std::runtime_error("fuzz mode - won't grow that much"); +#endif + size_t old_capacity = this->capacity(); + size_t new_capacity = old_capacity + old_capacity / 2; + if (size > new_capacity) new_capacity = size; + T* old_data = this->data(); + T* new_data = + std::allocator_traits::allocate(alloc_, new_capacity); + // The following code doesn't throw, so the raw pointer above doesn't leak. + std::uninitialized_copy(old_data, old_data + this->size(), + detail::make_checked(new_data, new_capacity)); + this->set(new_data, new_capacity); + // deallocate must not throw according to the standard, but even if it does, + // the buffer already uses the new storage and will deallocate it in + // destructor. + if (old_data != store_) alloc_.deallocate(old_data, old_capacity); +} + +using memory_buffer = basic_memory_buffer; +using wmemory_buffer = basic_memory_buffer; + +template +struct is_contiguous> : std::true_type { +}; + +/** A formatting error such as invalid format string. */ +FMT_CLASS_API +class FMT_API format_error : public std::runtime_error { + public: + explicit format_error(const char* message) : std::runtime_error(message) {} + explicit format_error(const std::string& message) + : std::runtime_error(message) {} + format_error(const format_error&) = default; + format_error& operator=(const format_error&) = default; + format_error(format_error&&) = default; + format_error& operator=(format_error&&) = default; + ~format_error() FMT_NOEXCEPT FMT_OVERRIDE; +}; + +namespace detail { + +template +using is_signed = + std::integral_constant::is_signed || + std::is_same::value>; + +// Returns true if value is negative, false otherwise. +// Same as `value < 0` but doesn't produce warnings if T is an unsigned type. +template ::value)> +FMT_CONSTEXPR bool is_negative(T value) { + return value < 0; +} +template ::value)> +FMT_CONSTEXPR bool is_negative(T) { + return false; +} + +template ::value)> +FMT_CONSTEXPR bool is_supported_floating_point(T) { + return (std::is_same::value && FMT_USE_FLOAT) || + (std::is_same::value && FMT_USE_DOUBLE) || + (std::is_same::value && FMT_USE_LONG_DOUBLE); +} + +// Smallest of uint32_t, uint64_t, uint128_t that is large enough to +// represent all values of T. +template +using uint32_or_64_or_128_t = + conditional_t() <= 32, uint32_t, + conditional_t() <= 64, uint64_t, uint128_t>>; + +// Static data is placed in this class template for the header-only config. +template struct FMT_EXTERN_TEMPLATE_API basic_data { + static const uint64_t powers_of_10_64[]; + static const uint32_t zero_or_powers_of_10_32[]; + static const uint64_t zero_or_powers_of_10_64[]; + static const uint64_t pow10_significands[]; + static const int16_t pow10_exponents[]; + // GCC generates slightly better code for pairs than chars. + using digit_pair = char[2]; + static const digit_pair digits[]; + static const char hex_digits[]; + static const char foreground_color[]; + static const char background_color[]; + static const char reset_color[5]; + static const wchar_t wreset_color[5]; + static const char signs[]; + static const char left_padding_shifts[5]; + static const char right_padding_shifts[5]; +}; + +#ifndef FMT_EXPORTED +FMT_EXTERN template struct basic_data; +#endif + +// This is a struct rather than an alias to avoid shadowing warnings in gcc. +struct data : basic_data<> {}; + +#ifdef FMT_BUILTIN_CLZLL +// Returns the number of decimal digits in n. Leading zeros are not counted +// except for n == 0 in which case count_digits returns 1. +inline int count_digits(uint64_t n) { + // Based on http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + // and the benchmark https://github.com/localvoid/cxx-benchmark-count-digits. + int t = (64 - FMT_BUILTIN_CLZLL(n | 1)) * 1233 >> 12; + return t - (n < data::zero_or_powers_of_10_64[t]) + 1; +} +#else +// Fallback version of count_digits used when __builtin_clz is not available. +inline int count_digits(uint64_t n) { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000u; + count += 4; + } +} +#endif + +#if FMT_USE_INT128 +inline int count_digits(uint128_t n) { + int count = 1; + for (;;) { + // Integer division is slow so do it for a group of four digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + if (n < 10) return count; + if (n < 100) return count + 1; + if (n < 1000) return count + 2; + if (n < 10000) return count + 3; + n /= 10000U; + count += 4; + } +} +#endif + +// Counts the number of digits in n. BITS = log2(radix). +template inline int count_digits(UInt n) { + int num_digits = 0; + do { + ++num_digits; + } while ((n >>= BITS) != 0); + return num_digits; +} + +template <> int count_digits<4>(detail::fallback_uintptr n); + +#if FMT_GCC_VERSION || FMT_CLANG_VERSION +# define FMT_ALWAYS_INLINE inline __attribute__((always_inline)) +#else +# define FMT_ALWAYS_INLINE +#endif + +#ifdef FMT_BUILTIN_CLZ +// Optional version of count_digits for better performance on 32-bit platforms. +inline int count_digits(uint32_t n) { + int t = (32 - FMT_BUILTIN_CLZ(n | 1)) * 1233 >> 12; + return t - (n < data::zero_or_powers_of_10_32[t]) + 1; +} +#endif + +template constexpr int digits10() FMT_NOEXCEPT { + return std::numeric_limits::digits10; +} +template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } +template <> constexpr int digits10() FMT_NOEXCEPT { return 38; } + +template FMT_API std::string grouping_impl(locale_ref loc); +template inline std::string grouping(locale_ref loc) { + return grouping_impl(loc); +} +template <> inline std::string grouping(locale_ref loc) { + return grouping_impl(loc); +} + +template FMT_API Char thousands_sep_impl(locale_ref loc); +template inline Char thousands_sep(locale_ref loc) { + return Char(thousands_sep_impl(loc)); +} +template <> inline wchar_t thousands_sep(locale_ref loc) { + return thousands_sep_impl(loc); +} + +template FMT_API Char decimal_point_impl(locale_ref loc); +template inline Char decimal_point(locale_ref loc) { + return Char(decimal_point_impl(loc)); +} +template <> inline wchar_t decimal_point(locale_ref loc) { + return decimal_point_impl(loc); +} + +// Compares two characters for equality. +template bool equal2(const Char* lhs, const char* rhs) { + return lhs[0] == rhs[0] && lhs[1] == rhs[1]; +} +inline bool equal2(const char* lhs, const char* rhs) { + return memcmp(lhs, rhs, 2) == 0; +} + +// Copies two characters from src to dst. +template void copy2(Char* dst, const char* src) { + *dst++ = static_cast(*src++); + *dst = static_cast(*src); +} +inline void copy2(char* dst, const char* src) { memcpy(dst, src, 2); } + +template struct format_decimal_result { + Iterator begin; + Iterator end; +}; + +// Formats a decimal unsigned integer value writing into out pointing to a +// buffer of specified size. The caller must ensure that the buffer is large +// enough. +template +inline format_decimal_result format_decimal(Char* out, UInt value, + int size) { + FMT_ASSERT(size >= count_digits(value), "invalid digit count"); + out += size; + Char* end = out; + while (value >= 100) { + // Integer division is slow so do it for a group of two digits instead + // of for every digit. The idea comes from the talk by Alexandrescu + // "Three Optimization Tips for C++". See speed-test for a comparison. + out -= 2; + copy2(out, data::digits[value % 100]); + value /= 100; + } + if (value < 10) { + *--out = static_cast('0' + value); + return {out, end}; + } + out -= 2; + copy2(out, data::digits[value]); + return {out, end}; +} + +template >::value)> +inline format_decimal_result format_decimal(Iterator out, UInt value, + int num_digits) { + // Buffer should be large enough to hold all digits (<= digits10 + 1). + enum { max_size = digits10() + 1 }; + Char buffer[2 * max_size]; + auto end = format_decimal(buffer, value, num_digits).end; + return {out, detail::copy_str(buffer, end, out)}; +} + +template +inline Char* format_uint(Char* buffer, UInt value, int num_digits, + bool upper = false) { + buffer += num_digits; + Char* end = buffer; + do { + const char* digits = upper ? "0123456789ABCDEF" : data::hex_digits; + unsigned digit = (value & ((1 << BASE_BITS) - 1)); + *--buffer = static_cast(BASE_BITS < 4 ? static_cast('0' + digit) + : digits[digit]); + } while ((value >>= BASE_BITS) != 0); + return end; +} + +template +Char* format_uint(Char* buffer, detail::fallback_uintptr n, int num_digits, + bool = false) { + auto char_digits = std::numeric_limits::digits / 4; + int start = (num_digits + char_digits - 1) / char_digits - 1; + if (int start_digits = num_digits % char_digits) { + unsigned value = n.value[start--]; + buffer = format_uint(buffer, value, start_digits); + } + for (; start >= 0; --start) { + unsigned value = n.value[start]; + buffer += char_digits; + auto p = buffer; + for (int i = 0; i < char_digits; ++i) { + unsigned digit = (value & ((1 << BASE_BITS) - 1)); + *--p = static_cast(data::hex_digits[digit]); + value >>= BASE_BITS; + } + } + return buffer; +} + +template +inline It format_uint(It out, UInt value, int num_digits, bool upper = false) { + // Buffer should be large enough to hold all digits (digits / BASE_BITS + 1). + char buffer[num_bits() / BASE_BITS + 1]; + format_uint(buffer, value, num_digits, upper); + return detail::copy_str(buffer, buffer + num_digits, out); +} + +// A converter from UTF-8 to UTF-16. +class utf8_to_utf16 { + private: + wmemory_buffer buffer_; + + public: + FMT_API explicit utf8_to_utf16(string_view s); + operator wstring_view() const { return {&buffer_[0], size()}; } + size_t size() const { return buffer_.size() - 1; } + const wchar_t* c_str() const { return &buffer_[0]; } + std::wstring str() const { return {&buffer_[0], size()}; } +}; + +template struct null {}; + +// Workaround an array initialization issue in gcc 4.8. +template struct fill_t { + private: + enum { max_size = 4 }; + Char data_[max_size]; + unsigned char size_; + + public: + FMT_CONSTEXPR void operator=(basic_string_view s) { + auto size = s.size(); + if (size > max_size) { + FMT_THROW(format_error("invalid fill")); + return; + } + for (size_t i = 0; i < size; ++i) data_[i] = s[i]; + size_ = static_cast(size); + } + + size_t size() const { return size_; } + const Char* data() const { return data_; } + + FMT_CONSTEXPR Char& operator[](size_t index) { return data_[index]; } + FMT_CONSTEXPR const Char& operator[](size_t index) const { + return data_[index]; + } + + static FMT_CONSTEXPR fill_t make() { + auto fill = fill_t(); + fill[0] = Char(' '); + fill.size_ = 1; + return fill; + } +}; +} // namespace detail + +// We cannot use enum classes as bit fields because of a gcc bug +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414. +namespace align { +enum type { none, left, right, center, numeric }; +} +using align_t = align::type; + +namespace sign { +enum type { none, minus, plus, space }; +} +using sign_t = sign::type; + +// Format specifiers for built-in and string types. +template struct basic_format_specs { + int width; + int precision; + char type; + align_t align : 4; + sign_t sign : 3; + bool alt : 1; // Alternate form ('#'). + detail::fill_t fill; + + constexpr basic_format_specs() + : width(0), + precision(-1), + type(0), + align(align::none), + sign(sign::none), + alt(false), + fill(detail::fill_t::make()) {} +}; + +using format_specs = basic_format_specs; + +namespace detail { + +// A floating-point presentation format. +enum class float_format : unsigned char { + general, // General: exponent notation or fixed point based on magnitude. + exp, // Exponent notation with the default precision of 6, e.g. 1.2e-3. + fixed, // Fixed point with the default precision of 6, e.g. 0.0012. + hex +}; + +struct float_specs { + int precision; + float_format format : 8; + sign_t sign : 8; + bool upper : 1; + bool locale : 1; + bool binary32 : 1; + bool use_grisu : 1; + bool showpoint : 1; +}; + +// Writes the exponent exp in the form "[+-]d{2,3}" to buffer. +template It write_exponent(int exp, It it) { + FMT_ASSERT(-10000 < exp && exp < 10000, "exponent out of range"); + if (exp < 0) { + *it++ = static_cast('-'); + exp = -exp; + } else { + *it++ = static_cast('+'); + } + if (exp >= 100) { + const char* top = data::digits[exp / 100]; + if (exp >= 1000) *it++ = static_cast(top[0]); + *it++ = static_cast(top[1]); + exp %= 100; + } + const char* d = data::digits[exp]; + *it++ = static_cast(d[0]); + *it++ = static_cast(d[1]); + return it; +} + +template class float_writer { + private: + // The number is given as v = digits_ * pow(10, exp_). + const char* digits_; + int num_digits_; + int exp_; + size_t size_; + float_specs specs_; + Char decimal_point_; + + template It prettify(It it) const { + // pow(10, full_exp - 1) <= v <= pow(10, full_exp). + int full_exp = num_digits_ + exp_; + if (specs_.format == float_format::exp) { + // Insert a decimal point after the first digit and add an exponent. + *it++ = static_cast(*digits_); + int num_zeros = specs_.precision - num_digits_; + if (num_digits_ > 1 || specs_.showpoint) *it++ = decimal_point_; + it = copy_str(digits_ + 1, digits_ + num_digits_, it); + if (num_zeros > 0 && specs_.showpoint) + it = std::fill_n(it, num_zeros, static_cast('0')); + *it++ = static_cast(specs_.upper ? 'E' : 'e'); + return write_exponent(full_exp - 1, it); + } + if (num_digits_ <= full_exp) { + // 1234e7 -> 12340000000[.0+] + it = copy_str(digits_, digits_ + num_digits_, it); + it = std::fill_n(it, full_exp - num_digits_, static_cast('0')); + if (specs_.showpoint || specs_.precision < 0) { + *it++ = decimal_point_; + int num_zeros = specs_.precision - full_exp; + if (num_zeros <= 0) { + if (specs_.format != float_format::fixed) + *it++ = static_cast('0'); + return it; + } +#ifdef FMT_FUZZ + if (num_zeros > 5000) + throw std::runtime_error("fuzz mode - avoiding excessive cpu use"); +#endif + it = std::fill_n(it, num_zeros, static_cast('0')); + } + } else if (full_exp > 0) { + // 1234e-2 -> 12.34[0+] + it = copy_str(digits_, digits_ + full_exp, it); + if (!specs_.showpoint) { + // Remove trailing zeros. + int num_digits = num_digits_; + while (num_digits > full_exp && digits_[num_digits - 1] == '0') + --num_digits; + if (num_digits != full_exp) *it++ = decimal_point_; + return copy_str(digits_ + full_exp, digits_ + num_digits, it); + } + *it++ = decimal_point_; + it = copy_str(digits_ + full_exp, digits_ + num_digits_, it); + if (specs_.precision > num_digits_) { + // Add trailing zeros. + int num_zeros = specs_.precision - num_digits_; + it = std::fill_n(it, num_zeros, static_cast('0')); + } + } else { + // 1234e-6 -> 0.001234 + *it++ = static_cast('0'); + int num_zeros = -full_exp; + int num_digits = num_digits_; + if (num_digits == 0 && specs_.precision >= 0 && + specs_.precision < num_zeros) { + num_zeros = specs_.precision; + } + // Remove trailing zeros. + if (!specs_.showpoint) + while (num_digits > 0 && digits_[num_digits - 1] == '0') --num_digits; + if (num_zeros != 0 || num_digits != 0 || specs_.showpoint) { + *it++ = decimal_point_; + it = std::fill_n(it, num_zeros, static_cast('0')); + it = copy_str(digits_, digits_ + num_digits, it); + } + } + return it; + } + + public: + float_writer(const char* digits, int num_digits, int exp, float_specs specs, + Char decimal_point) + : digits_(digits), + num_digits_(num_digits), + exp_(exp), + specs_(specs), + decimal_point_(decimal_point) { + int full_exp = num_digits + exp - 1; + int precision = specs.precision > 0 ? specs.precision : 16; + if (specs_.format == float_format::general && + !(full_exp >= -4 && full_exp < precision)) { + specs_.format = float_format::exp; + } + size_ = prettify(counting_iterator()).count(); + size_ += specs.sign ? 1 : 0; + } + + size_t size() const { return size_; } + + template It operator()(It it) const { + if (specs_.sign) *it++ = static_cast(data::signs[specs_.sign]); + return prettify(it); + } +}; + +template +int format_float(T value, int precision, float_specs specs, buffer& buf); + +// Formats a floating-point number with snprintf. +template +int snprintf_float(T value, int precision, float_specs specs, + buffer& buf); + +template T promote_float(T value) { return value; } +inline double promote_float(float value) { return static_cast(value); } + +template +FMT_CONSTEXPR void handle_int_type_spec(char spec, Handler&& handler) { + switch (spec) { + case 0: + case 'd': + handler.on_dec(); + break; + case 'x': + case 'X': + handler.on_hex(); + break; + case 'b': + case 'B': + handler.on_bin(); + break; + case 'o': + handler.on_oct(); + break; +#ifdef FMT_DEPRECATED_N_SPECIFIER + case 'n': +#endif + case 'L': + handler.on_num(); + break; + case 'c': + handler.on_chr(); + break; + default: + handler.on_error(); + } +} + +template +FMT_CONSTEXPR float_specs parse_float_type_spec( + const basic_format_specs& specs, ErrorHandler&& eh = {}) { + auto result = float_specs(); + result.showpoint = specs.alt; + switch (specs.type) { + case 0: + result.format = float_format::general; + result.showpoint |= specs.precision > 0; + break; + case 'G': + result.upper = true; + FMT_FALLTHROUGH; + case 'g': + result.format = float_format::general; + break; + case 'E': + result.upper = true; + FMT_FALLTHROUGH; + case 'e': + result.format = float_format::exp; + result.showpoint |= specs.precision != 0; + break; + case 'F': + result.upper = true; + FMT_FALLTHROUGH; + case 'f': + result.format = float_format::fixed; + result.showpoint |= specs.precision != 0; + break; + case 'A': + result.upper = true; + FMT_FALLTHROUGH; + case 'a': + result.format = float_format::hex; + break; +#ifdef FMT_DEPRECATED_N_SPECIFIER + case 'n': +#endif + case 'L': + result.locale = true; + break; + default: + eh.on_error("invalid type specifier"); + break; + } + return result; +} + +template +FMT_CONSTEXPR void handle_char_specs(const basic_format_specs* specs, + Handler&& handler) { + if (!specs) return handler.on_char(); + if (specs->type && specs->type != 'c') return handler.on_int(); + if (specs->align == align::numeric || specs->sign != sign::none || specs->alt) + handler.on_error("invalid format specifier for char"); + handler.on_char(); +} + +template +FMT_CONSTEXPR void handle_cstring_type_spec(Char spec, Handler&& handler) { + if (spec == 0 || spec == 's') + handler.on_string(); + else if (spec == 'p') + handler.on_pointer(); + else + handler.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_string_type_spec(Char spec, ErrorHandler&& eh) { + if (spec != 0 && spec != 's') eh.on_error("invalid type specifier"); +} + +template +FMT_CONSTEXPR void check_pointer_type_spec(Char spec, ErrorHandler&& eh) { + if (spec != 0 && spec != 'p') eh.on_error("invalid type specifier"); +} + +template class int_type_checker : private ErrorHandler { + public: + FMT_CONSTEXPR explicit int_type_checker(ErrorHandler eh) : ErrorHandler(eh) {} + + FMT_CONSTEXPR void on_dec() {} + FMT_CONSTEXPR void on_hex() {} + FMT_CONSTEXPR void on_bin() {} + FMT_CONSTEXPR void on_oct() {} + FMT_CONSTEXPR void on_num() {} + FMT_CONSTEXPR void on_chr() {} + + FMT_CONSTEXPR void on_error() { + ErrorHandler::on_error("invalid type specifier"); + } +}; + +template +class char_specs_checker : public ErrorHandler { + private: + char type_; + + public: + FMT_CONSTEXPR char_specs_checker(char type, ErrorHandler eh) + : ErrorHandler(eh), type_(type) {} + + FMT_CONSTEXPR void on_int() { + handle_int_type_spec(type_, int_type_checker(*this)); + } + FMT_CONSTEXPR void on_char() {} +}; + +template +class cstring_type_checker : public ErrorHandler { + public: + FMT_CONSTEXPR explicit cstring_type_checker(ErrorHandler eh) + : ErrorHandler(eh) {} + + FMT_CONSTEXPR void on_string() {} + FMT_CONSTEXPR void on_pointer() {} +}; + +template +FMT_NOINLINE OutputIt fill(OutputIt it, size_t n, const fill_t& fill) { + auto fill_size = fill.size(); + if (fill_size == 1) return std::fill_n(it, n, fill[0]); + for (size_t i = 0; i < n; ++i) it = std::copy_n(fill.data(), fill_size, it); + return it; +} + +// Writes the output of f, padded according to format specifications in specs. +// size: output size in code units. +// width: output display width in (terminal) column positions. +template +inline OutputIt write_padded(OutputIt out, + const basic_format_specs& specs, size_t size, + size_t width, const F& f) { + static_assert(align == align::left || align == align::right, ""); + unsigned spec_width = to_unsigned(specs.width); + size_t padding = spec_width > width ? spec_width - width : 0; + auto* shifts = align == align::left ? data::left_padding_shifts + : data::right_padding_shifts; + size_t left_padding = padding >> shifts[specs.align]; + auto it = reserve(out, size + padding * specs.fill.size()); + it = fill(it, left_padding, specs.fill); + it = f(it); + it = fill(it, padding - left_padding, specs.fill); + return base_iterator(out, it); +} + +template +inline OutputIt write_padded(OutputIt out, + const basic_format_specs& specs, size_t size, + const F& f) { + return write_padded(out, specs, size, size, f); +} + +template +OutputIt write_bytes(OutputIt out, string_view bytes, + const basic_format_specs& specs) { + using iterator = remove_reference_t; + return write_padded(out, specs, bytes.size(), [bytes](iterator it) { + const char* data = bytes.data(); + return copy_str(data, data + bytes.size(), it); + }); +} + +// Data for write_int that doesn't depend on output iterator type. It is used to +// avoid template code bloat. +template struct write_int_data { + size_t size; + size_t padding; + + write_int_data(int num_digits, string_view prefix, + const basic_format_specs& specs) + : size(prefix.size() + to_unsigned(num_digits)), padding(0) { + if (specs.align == align::numeric) { + auto width = to_unsigned(specs.width); + if (width > size) { + padding = width - size; + size = width; + } + } else if (specs.precision > num_digits) { + size = prefix.size() + to_unsigned(specs.precision); + padding = to_unsigned(specs.precision - num_digits); + } + } +}; + +// Writes an integer in the format +// +// where are written by f(it). +template +OutputIt write_int(OutputIt out, int num_digits, string_view prefix, + const basic_format_specs& specs, F f) { + auto data = write_int_data(num_digits, prefix, specs); + using iterator = remove_reference_t; + return write_padded(out, specs, data.size, [=](iterator it) { + if (prefix.size() != 0) + it = copy_str(prefix.begin(), prefix.end(), it); + it = std::fill_n(it, data.padding, static_cast('0')); + return f(it); + }); +} + +template +OutputIt write(OutputIt out, basic_string_view s, + const basic_format_specs& specs) { + auto data = s.data(); + auto size = s.size(); + if (specs.precision >= 0 && to_unsigned(specs.precision) < size) + size = code_point_index(s, to_unsigned(specs.precision)); + auto width = specs.width != 0 + ? count_code_points(basic_string_view(data, size)) + : 0; + using iterator = remove_reference_t; + return write_padded(out, specs, size, width, [=](iterator it) { + return copy_str(data, data + size, it); + }); +} + +// The handle_int_type_spec handler that writes an integer. +template struct int_writer { + OutputIt out; + locale_ref locale; + const basic_format_specs& specs; + UInt abs_value; + char prefix[4]; + unsigned prefix_size; + + using iterator = + remove_reference_t(), 0))>; + + string_view get_prefix() const { return string_view(prefix, prefix_size); } + + template + int_writer(OutputIt output, locale_ref loc, Int value, + const basic_format_specs& s) + : out(output), + locale(loc), + specs(s), + abs_value(static_cast(value)), + prefix_size(0) { + static_assert(std::is_same, UInt>::value, ""); + if (is_negative(value)) { + prefix[0] = '-'; + ++prefix_size; + abs_value = 0 - abs_value; + } else if (specs.sign != sign::none && specs.sign != sign::minus) { + prefix[0] = specs.sign == sign::plus ? '+' : ' '; + ++prefix_size; + } + } + + void on_dec() { + auto num_digits = count_digits(abs_value); + out = write_int( + out, num_digits, get_prefix(), specs, [this, num_digits](iterator it) { + return format_decimal(it, abs_value, num_digits).end; + }); + } + + void on_hex() { + if (specs.alt) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = specs.type; + } + int num_digits = count_digits<4>(abs_value); + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<4, Char>(it, abs_value, num_digits, + specs.type != 'x'); + }); + } + + void on_bin() { + if (specs.alt) { + prefix[prefix_size++] = '0'; + prefix[prefix_size++] = static_cast(specs.type); + } + int num_digits = count_digits<1>(abs_value); + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<1, Char>(it, abs_value, num_digits); + }); + } + + void on_oct() { + int num_digits = count_digits<3>(abs_value); + if (specs.alt && specs.precision <= num_digits && abs_value != 0) { + // Octal prefix '0' is counted as a digit, so only add it if precision + // is not greater than the number of digits. + prefix[prefix_size++] = '0'; + } + out = write_int(out, num_digits, get_prefix(), specs, + [this, num_digits](iterator it) { + return format_uint<3, Char>(it, abs_value, num_digits); + }); + } + + enum { sep_size = 1 }; + + void on_num() { + std::string groups = grouping(locale); + if (groups.empty()) return on_dec(); + auto sep = thousands_sep(locale); + if (!sep) return on_dec(); + int num_digits = count_digits(abs_value); + int size = num_digits, n = num_digits; + std::string::const_iterator group = groups.cbegin(); + while (group != groups.cend() && n > *group && *group > 0 && + *group != max_value()) { + size += sep_size; + n -= *group; + ++group; + } + if (group == groups.cend()) size += sep_size * ((n - 1) / groups.back()); + char digits[40]; + format_decimal(digits, abs_value, num_digits); + basic_memory_buffer buffer; + size += prefix_size; + buffer.resize(size); + basic_string_view s(&sep, sep_size); + // Index of a decimal digit with the least significant digit having index 0. + int digit_index = 0; + group = groups.cbegin(); + auto p = buffer.data() + size; + for (int i = num_digits - 1; i >= 0; --i) { + *--p = static_cast(digits[i]); + if (*group <= 0 || ++digit_index % *group != 0 || + *group == max_value()) + continue; + if (group + 1 != groups.cend()) { + digit_index = 0; + ++group; + } + p -= s.size(); + std::uninitialized_copy(s.data(), s.data() + s.size(), + make_checked(p, s.size())); + } + if (prefix_size != 0) p[-1] = static_cast('-'); + using iterator = remove_reference_t; + auto data = buffer.data(); + out = write_padded(out, specs, size, size, [=](iterator it) { + return copy_str(data, data + size, it); + }); + } + + void on_chr() { *out++ = static_cast(abs_value); } + + FMT_NORETURN void on_error() { + FMT_THROW(format_error("invalid type specifier")); + } +}; + +template +OutputIt write_nonfinite(OutputIt out, bool isinf, + const basic_format_specs& specs, + const float_specs& fspecs) { + auto str = + isinf ? (fspecs.upper ? "INF" : "inf") : (fspecs.upper ? "NAN" : "nan"); + constexpr size_t str_size = 3; + auto sign = fspecs.sign; + auto size = str_size + (sign ? 1 : 0); + using iterator = remove_reference_t; + return write_padded(out, specs, size, [=](iterator it) { + if (sign) *it++ = static_cast(data::signs[sign]); + return copy_str(str, str + str_size, it); + }); +} + +template ::value)> +OutputIt write(OutputIt out, T value, basic_format_specs specs, + locale_ref loc = {}) { + if (const_check(!is_supported_floating_point(value))) return out; + float_specs fspecs = parse_float_type_spec(specs); + fspecs.sign = specs.sign; + if (std::signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } else if (fspecs.sign == sign::minus) { + fspecs.sign = sign::none; + } + + if (!std::isfinite(value)) + return write_nonfinite(out, std::isinf(value), specs, fspecs); + + if (specs.align == align::numeric && fspecs.sign) { + auto it = reserve(out, 1); + *it++ = static_cast(data::signs[fspecs.sign]); + out = base_iterator(out, it); + fspecs.sign = sign::none; + if (specs.width != 0) --specs.width; + } + + memory_buffer buffer; + if (fspecs.format == float_format::hex) { + if (fspecs.sign) buffer.push_back(data::signs[fspecs.sign]); + snprintf_float(promote_float(value), specs.precision, fspecs, buffer); + return write_bytes(out, {buffer.data(), buffer.size()}, specs); + } + int precision = specs.precision >= 0 || !specs.type ? specs.precision : 6; + if (fspecs.format == float_format::exp) { + if (precision == max_value()) + FMT_THROW(format_error("number is too big")); + else + ++precision; + } + if (const_check(std::is_same())) fspecs.binary32 = true; + fspecs.use_grisu = use_grisu(); + int exp = format_float(promote_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + Char point = + fspecs.locale ? decimal_point(loc) : static_cast('.'); + float_writer w(buffer.data(), static_cast(buffer.size()), exp, + fspecs, point); + return write_padded(out, specs, w.size(), w); +} + +template ::value)> +OutputIt write(OutputIt out, T value) { + if (const_check(!is_supported_floating_point(value))) return out; + auto fspecs = float_specs(); + if (std::signbit(value)) { // value < 0 is false for NaN so use signbit. + fspecs.sign = sign::minus; + value = -value; + } + + auto specs = basic_format_specs(); + if (!std::isfinite(value)) + return write_nonfinite(out, std::isinf(value), specs, fspecs); + + memory_buffer buffer; + int precision = -1; + if (const_check(std::is_same())) fspecs.binary32 = true; + fspecs.use_grisu = use_grisu(); + int exp = format_float(promote_float(value), precision, fspecs, buffer); + fspecs.precision = precision; + float_writer w(buffer.data(), static_cast(buffer.size()), exp, + fspecs, static_cast('.')); + return base_iterator(out, w(reserve(out, w.size()))); +} + +template +OutputIt write_char(OutputIt out, Char value, + const basic_format_specs& specs) { + using iterator = remove_reference_t; + return write_padded(out, specs, 1, [=](iterator it) { + *it++ = value; + return it; + }); +} + +template +OutputIt write_ptr(OutputIt out, UIntPtr value, + const basic_format_specs* specs) { + int num_digits = count_digits<4>(value); + auto size = to_unsigned(num_digits) + size_t(2); + using iterator = remove_reference_t; + auto write = [=](iterator it) { + *it++ = static_cast('0'); + *it++ = static_cast('x'); + return format_uint<4, Char>(it, value, num_digits); + }; + return specs ? write_padded(out, *specs, size, write) + : base_iterator(out, write(reserve(out, size))); +} + +template struct is_integral : std::is_integral {}; +template <> struct is_integral : std::true_type {}; +template <> struct is_integral : std::true_type {}; + +template +OutputIt write(OutputIt out, monostate) { + FMT_ASSERT(false, ""); + return out; +} + +template ::value)> +OutputIt write(OutputIt out, string_view value) { + auto it = reserve(out, value.size()); + it = copy_str(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, basic_string_view value) { + auto it = reserve(out, value.size()); + it = std::copy(value.begin(), value.end(), it); + return base_iterator(out, it); +} + +template ::value && + !std::is_same::value && + !std::is_same::value)> +OutputIt write(OutputIt out, T value) { + auto abs_value = static_cast>(value); + bool negative = is_negative(value); + // Don't do -abs_value since it trips unsigned-integer-overflow sanitizer. + if (negative) abs_value = ~abs_value + 1; + int num_digits = count_digits(abs_value); + auto it = reserve(out, (negative ? 1 : 0) + static_cast(num_digits)); + if (negative) *it++ = static_cast('-'); + it = format_decimal(it, abs_value, num_digits).end; + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, bool value) { + return write(out, string_view(value ? "true" : "false")); +} + +template +OutputIt write(OutputIt out, Char value) { + auto it = reserve(out, 1); + *it++ = value; + return base_iterator(out, it); +} + +template +OutputIt write(OutputIt out, const Char* value) { + if (!value) { + FMT_THROW(format_error("string pointer is null")); + } else { + auto length = std::char_traits::length(value); + out = write(out, basic_string_view(value, length)); + } + return out; +} + +template +OutputIt write(OutputIt out, const void* value) { + return write_ptr(out, to_uintptr(value), nullptr); +} + +template +auto write(OutputIt out, const T& value) -> typename std::enable_if< + mapped_type_constant>::value == + type::custom_type, + OutputIt>::type { + basic_format_context ctx(out, {}, {}); + return formatter().format(value, ctx); +} + +// An argument visitor that formats the argument and writes it via the output +// iterator. It's a class and not a generic lambda for compatibility with C++11. +template struct default_arg_formatter { + using context = basic_format_context; + + OutputIt out; + basic_format_args args; + locale_ref loc; + + template OutputIt operator()(T value) { + return write(out, value); + } + + OutputIt operator()(typename basic_format_arg::handle handle) { + basic_format_parse_context parse_ctx({}); + basic_format_context format_ctx(out, args, loc); + handle.format(parse_ctx, format_ctx); + return format_ctx.out(); + } +}; + +template +class arg_formatter_base { + public: + using iterator = OutputIt; + using char_type = Char; + using format_specs = basic_format_specs; + + private: + iterator out_; + locale_ref locale_; + format_specs* specs_; + + // Attempts to reserve space for n extra characters in the output range. + // Returns a pointer to the reserved range or a reference to out_. + auto reserve(size_t n) -> decltype(detail::reserve(out_, n)) { + return detail::reserve(out_, n); + } + + using reserve_iterator = remove_reference_t(), 0))>; + + template void write_int(T value, const format_specs& spec) { + using uint_type = uint32_or_64_or_128_t; + int_writer w(out_, locale_, value, spec); + handle_int_type_spec(spec.type, w); + out_ = w.out; + } + + void write(char value) { + auto&& it = reserve(1); + *it++ = value; + } + + template ::value)> + void write(Ch value) { + out_ = detail::write(out_, value); + } + + void write(string_view value) { + auto&& it = reserve(value.size()); + it = copy_str(value.begin(), value.end(), it); + } + void write(wstring_view value) { + static_assert(std::is_same::value, ""); + auto&& it = reserve(value.size()); + it = std::copy(value.begin(), value.end(), it); + } + + template + void write(const Ch* s, size_t size, const format_specs& specs) { + auto width = specs.width != 0 + ? count_code_points(basic_string_view(s, size)) + : 0; + out_ = write_padded(out_, specs, size, width, [=](reserve_iterator it) { + return copy_str(s, s + size, it); + }); + } + + template + void write(basic_string_view s, const format_specs& specs = {}) { + out_ = detail::write(out_, s, specs); + } + + void write_pointer(const void* p) { + out_ = write_ptr(out_, to_uintptr(p), specs_); + } + + struct char_spec_handler : ErrorHandler { + arg_formatter_base& formatter; + Char value; + + char_spec_handler(arg_formatter_base& f, Char val) + : formatter(f), value(val) {} + + void on_int() { + // char is only formatted as int if there are specs. + formatter.write_int(static_cast(value), *formatter.specs_); + } + void on_char() { + if (formatter.specs_) + formatter.out_ = write_char(formatter.out_, value, *formatter.specs_); + else + formatter.write(value); + } + }; + + struct cstring_spec_handler : error_handler { + arg_formatter_base& formatter; + const Char* value; + + cstring_spec_handler(arg_formatter_base& f, const Char* val) + : formatter(f), value(val) {} + + void on_string() { formatter.write(value); } + void on_pointer() { formatter.write_pointer(value); } + }; + + protected: + iterator out() { return out_; } + format_specs* specs() { return specs_; } + + void write(bool value) { + if (specs_) + write(string_view(value ? "true" : "false"), *specs_); + else + out_ = detail::write(out_, value); + } + + void write(const Char* value) { + if (!value) { + FMT_THROW(format_error("string pointer is null")); + } else { + auto length = std::char_traits::length(value); + basic_string_view sv(value, length); + specs_ ? write(sv, *specs_) : write(sv); + } + } + + public: + arg_formatter_base(OutputIt out, format_specs* s, locale_ref loc) + : out_(out), locale_(loc), specs_(s) {} + + iterator operator()(monostate) { + FMT_ASSERT(false, "invalid argument type"); + return out_; + } + + template ::value)> + FMT_INLINE iterator operator()(T value) { + if (specs_) + write_int(value, *specs_); + else + out_ = detail::write(out_, value); + return out_; + } + + iterator operator()(Char value) { + handle_char_specs(specs_, + char_spec_handler(*this, static_cast(value))); + return out_; + } + + iterator operator()(bool value) { + if (specs_ && specs_->type) return (*this)(value ? 1 : 0); + write(value != 0); + return out_; + } + + template ::value)> + iterator operator()(T value) { + auto specs = specs_ ? *specs_ : format_specs(); + if (const_check(is_supported_floating_point(value))) + out_ = detail::write(out_, value, specs, locale_); + else + FMT_ASSERT(false, "unsupported float argument type"); + return out_; + } + + iterator operator()(const Char* value) { + if (!specs_) return write(value), out_; + handle_cstring_type_spec(specs_->type, cstring_spec_handler(*this, value)); + return out_; + } + + iterator operator()(basic_string_view value) { + if (specs_) { + check_string_type_spec(specs_->type, error_handler()); + write(value, *specs_); + } else { + write(value); + } + return out_; + } + + iterator operator()(const void* value) { + if (specs_) check_pointer_type_spec(specs_->type, error_handler()); + write_pointer(value); + return out_; + } +}; + +template FMT_CONSTEXPR bool is_name_start(Char c) { + return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z') || '_' == c; +} + +// Parses the range [begin, end) as an unsigned integer. This function assumes +// that the range is non-empty and the first character is a digit. +template +FMT_CONSTEXPR int parse_nonnegative_int(const Char*& begin, const Char* end, + ErrorHandler&& eh) { + FMT_ASSERT(begin != end && '0' <= *begin && *begin <= '9', ""); + unsigned value = 0; + // Convert to unsigned to prevent a warning. + constexpr unsigned max_int = max_value(); + unsigned big = max_int / 10; + do { + // Check for overflow. + if (value > big) { + value = max_int + 1; + break; + } + value = value * 10 + unsigned(*begin - '0'); + ++begin; + } while (begin != end && '0' <= *begin && *begin <= '9'); + if (value > max_int) eh.on_error("number is too big"); + return static_cast(value); +} + +template class custom_formatter { + private: + using char_type = typename Context::char_type; + + basic_format_parse_context& parse_ctx_; + Context& ctx_; + + public: + explicit custom_formatter(basic_format_parse_context& parse_ctx, + Context& ctx) + : parse_ctx_(parse_ctx), ctx_(ctx) {} + + bool operator()(typename basic_format_arg::handle h) const { + h.format(parse_ctx_, ctx_); + return true; + } + + template bool operator()(T) const { return false; } +}; + +template +using is_integer = + bool_constant::value && !std::is_same::value && + !std::is_same::value && + !std::is_same::value>; + +template class width_checker { + public: + explicit FMT_CONSTEXPR width_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T value) { + if (is_negative(value)) handler_.on_error("negative width"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T) { + handler_.on_error("width is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +template class precision_checker { + public: + explicit FMT_CONSTEXPR precision_checker(ErrorHandler& eh) : handler_(eh) {} + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T value) { + if (is_negative(value)) handler_.on_error("negative precision"); + return static_cast(value); + } + + template ::value)> + FMT_CONSTEXPR unsigned long long operator()(T) { + handler_.on_error("precision is not integer"); + return 0; + } + + private: + ErrorHandler& handler_; +}; + +// A format specifier handler that sets fields in basic_format_specs. +template class specs_setter { + public: + explicit FMT_CONSTEXPR specs_setter(basic_format_specs& specs) + : specs_(specs) {} + + FMT_CONSTEXPR specs_setter(const specs_setter& other) + : specs_(other.specs_) {} + + FMT_CONSTEXPR void on_align(align_t align) { specs_.align = align; } + FMT_CONSTEXPR void on_fill(basic_string_view fill) { + specs_.fill = fill; + } + FMT_CONSTEXPR void on_plus() { specs_.sign = sign::plus; } + FMT_CONSTEXPR void on_minus() { specs_.sign = sign::minus; } + FMT_CONSTEXPR void on_space() { specs_.sign = sign::space; } + FMT_CONSTEXPR void on_hash() { specs_.alt = true; } + + FMT_CONSTEXPR void on_zero() { + specs_.align = align::numeric; + specs_.fill[0] = Char('0'); + } + + FMT_CONSTEXPR void on_width(int width) { specs_.width = width; } + FMT_CONSTEXPR void on_precision(int precision) { + specs_.precision = precision; + } + FMT_CONSTEXPR void end_precision() {} + + FMT_CONSTEXPR void on_type(Char type) { + specs_.type = static_cast(type); + } + + protected: + basic_format_specs& specs_; +}; + +template class numeric_specs_checker { + public: + FMT_CONSTEXPR numeric_specs_checker(ErrorHandler& eh, detail::type arg_type) + : error_handler_(eh), arg_type_(arg_type) {} + + FMT_CONSTEXPR void require_numeric_argument() { + if (!is_arithmetic_type(arg_type_)) + error_handler_.on_error("format specifier requires numeric argument"); + } + + FMT_CONSTEXPR void check_sign() { + require_numeric_argument(); + if (is_integral_type(arg_type_) && arg_type_ != type::int_type && + arg_type_ != type::long_long_type && arg_type_ != type::char_type) { + error_handler_.on_error("format specifier requires signed argument"); + } + } + + FMT_CONSTEXPR void check_precision() { + if (is_integral_type(arg_type_) || arg_type_ == type::pointer_type) + error_handler_.on_error("precision not allowed for this argument type"); + } + + private: + ErrorHandler& error_handler_; + detail::type arg_type_; +}; + +// A format specifier handler that checks if specifiers are consistent with the +// argument type. +template class specs_checker : public Handler { + private: + numeric_specs_checker checker_; + + // Suppress an MSVC warning about using this in initializer list. + FMT_CONSTEXPR Handler& error_handler() { return *this; } + + public: + FMT_CONSTEXPR specs_checker(const Handler& handler, detail::type arg_type) + : Handler(handler), checker_(error_handler(), arg_type) {} + + FMT_CONSTEXPR specs_checker(const specs_checker& other) + : Handler(other), checker_(error_handler(), other.arg_type_) {} + + FMT_CONSTEXPR void on_align(align_t align) { + if (align == align::numeric) checker_.require_numeric_argument(); + Handler::on_align(align); + } + + FMT_CONSTEXPR void on_plus() { + checker_.check_sign(); + Handler::on_plus(); + } + + FMT_CONSTEXPR void on_minus() { + checker_.check_sign(); + Handler::on_minus(); + } + + FMT_CONSTEXPR void on_space() { + checker_.check_sign(); + Handler::on_space(); + } + + FMT_CONSTEXPR void on_hash() { + checker_.require_numeric_argument(); + Handler::on_hash(); + } + + FMT_CONSTEXPR void on_zero() { + checker_.require_numeric_argument(); + Handler::on_zero(); + } + + FMT_CONSTEXPR void end_precision() { checker_.check_precision(); } +}; + +template