diff --git a/.azure.yml b/.azure.yml index 26ee8d29813..1cb696b8f7e 100644 --- a/.azure.yml +++ b/.azure.yml @@ -5,7 +5,7 @@ jobs: - job: "Quinoa" - timeoutInMinutes: 180 + timeoutInMinutes: 240 pool: vmImage: 'Ubuntu 16.04' variables: @@ -69,6 +69,7 @@ jobs: DISTRO: 'debian-clang-smp' SMP: 'on' doc: + COMPILER: 'gnu' DOC: true DISTRO: 'debian-doc' steps: diff --git a/README.md b/README.md index f77e642ed6b..4287bf18676 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ -_Adaptive computational fluid dynamics_ - https://quinoacomputing.github.io +_Adaptive computational fluid dynamics_ - https://quinoacomputing.org Quinoa is a set of computational tools that enables research and numerical analysis in fluid dynamics. Using the [Charm++](http://charmplusplus.org) @@ -18,21 +18,6 @@ problems with a production-quality code that is extensible and maintainable, using hardware resources efficiently, even for problems with _a priori_ unknown, heterogeneous, and dynamic load distribution. -## Directory layout - - quinoa - ├── cmake/ - CMake code, shared between github.com/quinoacomputing/quinoa-tpl and src/ - ├── doc/ - Documentation, rendered at quinoacomputing.org - ├── external/ - External packages, pulled in as submodules from github.com/quinoacomputing/quinoa-tpl - ├── src/ - Compilable sources, see quinoacomputing.org/files.html - ├── tests/ - Unit-, and regression tests - ├── tools/ - Development utilities and docker files - ├── LICENSE - Copyright and license - └── README.md - This file, rendered at github.com/quinoacomputing/quinoa - -## More info - For more details on philosophy, documentation, software design, journal papers, -license, and contributing see the -[documentation](https://quinoacomputing.github.io). +license, and contributing see the [documentation](https://quinoacomputing.org). diff --git a/cmake/BuildType.cmake b/cmake/BuildType.cmake index 56aa1eb8feb..6ea979cd45c 100644 --- a/cmake/BuildType.cmake +++ b/cmake/BuildType.cmake @@ -10,8 +10,8 @@ ################################################################################ if(NOT CMAKE_BUILD_TYPE) - message(STATUS "CMAKE_BUILD_TYPE not specified, setting to 'Debug'") - set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type. Possible values: DEBUG | RELEASE | RELWITHDEBINFO | MINSIZEREL" FORCE) + message(STATUS "CMAKE_BUILD_TYPE not specified, setting to 'Release'") + set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type. Possible values: DEBUG | RELEASE | RELWITHDEBINFO | MINSIZEREL" FORCE) # Set the possible values of build type for cmake-gui set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") else() diff --git a/cmake/CodeCoverage.cmake b/cmake/CodeCoverage.cmake index 4e23eb65618..43e49785fc2 100644 --- a/cmake/CodeCoverage.cmake +++ b/cmake/CodeCoverage.cmake @@ -47,8 +47,8 @@ FUNCTION(SETUP_TARGET_FOR_COVERAGE suite path targetname testrunner) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - IF(NOT LCOV) - MESSAGE(FATAL_ERROR "lcov not found! Aborting...") + IF(NOT FASTCOV) + MESSAGE(FATAL_ERROR "fastcov not found! Aborting...") ENDIF() IF(NOT GENHTML) @@ -68,18 +68,12 @@ FUNCTION(SETUP_TARGET_FOR_COVERAGE suite path targetname testrunner) # Setup code coverage target ADD_CUSTOM_TARGET(${targetname} - # Cleanup lcov - COMMAND ${LCOV} --gcov-tool ${GCOV} --directory . --zerocounters - # Capture initial state yielding zero coverage baseline - COMMAND ${LCOV} --gcov-tool ${GCOV} --capture --initial --directory . --output-file ${OUTPUT}.base.info + # Zero coverage counters + COMMAND ${FASTCOV} --zerocounters # Run test suite COMMAND ${testrunner} ${ARG_TESTRUNNER_ARGS} - # Capture lcov counters - COMMAND ${LCOV} --gcov-tool ${GCOV} --capture --rc lcov_branch_coverage=1 --directory . --output-file ${OUTPUT}.test.info - # Combine trace files - COMMAND ${LCOV} --gcov-tool ${GCOV} --rc lcov_branch_coverage=1 --add-tracefile ${OUTPUT}.base.info --add-tracefile ${OUTPUT}.test.info --output-file ${OUTPUT}.total.info - # Filter out unwanted files - COMMAND ${LCOV} --gcov-tool ${GCOV} --rc lcov_branch_coverage=1 --remove ${OUTPUT}.total.info "*/tests/*" "*/c++/*" "*/include/*" "*/boost/*" "*/charm/*" "*.decl.h" "*.def.h" "*/STDIN" "*/openmpi/*" "*/pstreams/*" "*/Random123/*" "*/pegtl/*" "*/tut/*" "*/highwayhash/*" "*/moduleinit*" --output-file ${OUTPUT}.filtered.info + # Process gcov output for genhtml + COMMAND ${FASTCOV} --branch-coverage --exceptional-branch-coverage --lcov -o ${OUTPUT}.info --exclude tests/ c++/ include/ boost/ charm/ decl.h def.h openmpi pstreams Random123 pegtl tut/ highwayhash/ moduleinit # Copy over report customization files for genhtml COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../doc/quinoa.gcov.css @@ -88,13 +82,13 @@ FUNCTION(SETUP_TARGET_FOR_COVERAGE suite path targetname testrunner) ${CMAKE_SOURCE_DIR}/../doc/quinoa.lcov.prolog ${CMAKE_BINARY_DIR} # Generate HTML report - COMMAND ${GENHTML} --legend --branch-coverage --demangle-cpp --css-file quinoa.gcov.css --ignore-errors source --html-prolog quinoa.lcov.prolog --title "${GIT_SHA1}" -o ${OUTPUT} ${OUTPUT}.filtered.info + COMMAND ${GENHTML} --legend --rc genhtml_branch_coverage=1 --demangle-cpp --css-file quinoa.gcov.css --ignore-errors source --html-prolog quinoa.lcov.prolog --title "${GIT_SHA1}" -o ${OUTPUT} ${OUTPUT}.info # Customize page headers in generated html to own COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/LCOV - code coverage report/Quinoa ${suite} test code coverage report/g" {} + COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/Test:<\\/td>/Commit:<\\/td>/g" {} + COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/Quinoa_v\\\(.*\\\)-\\\(.*\\\)-g\\\(.*\\\)<\\/td>/Quinoa_v\\1-\\2-g\\3<\\/a><\\/td>/g" {} + # Cleanup intermediate data - COMMAND ${CMAKE_COMMAND} -E remove ${OUTPUT}.base.info ${OUTPUT}.test.info ${OUTPUT}.total.info ${OUTPUT}.filtered.info + COMMAND ${CMAKE_COMMAND} -E remove ${OUTPUT}.info # Set work directory for target WORKING_DIRECTORY ${CMAKE_BINARY_DIR} # Echo what is being done @@ -153,8 +147,8 @@ FUNCTION(SETUP_TARGET_FOR_ALL_COVERAGE suite path targetname unittestrunner cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) - IF(NOT LCOV) - MESSAGE(FATAL_ERROR "lcov not found! Aborting...") + IF(NOT FASTCOV) + MESSAGE(FATAL_ERROR "fastcov not found! Aborting...") ENDIF() IF(NOT GENHTML) @@ -171,19 +165,13 @@ FUNCTION(SETUP_TARGET_FOR_ALL_COVERAGE suite path targetname unittestrunner # Setup code coverage target ADD_CUSTOM_TARGET(${targetname} - # Cleanup lcov - COMMAND ${LCOV} --gcov-tool ${GCOV} --directory . --zerocounters - # Capture initial state yielding zero coverage baseline - COMMAND ${LCOV} --gcov-tool ${GCOV} --capture --initial --directory . --output-file ${OUTPUT}.base.info + # Zero coverage counters + COMMAND ${FASTCOV} --zerocounters # Run all test suites COMMAND ${unittestrunner} ${unittestrunner_ncpus_arg} ${PROCESSOR_COUNT} Main/${UNITTEST_EXECUTABLE} -v - COMMAND ${CMAKE_CTEST_COMMAND} -j${PROCESSOR_COUNT} - # Capture lcov counters - COMMAND ${LCOV} --gcov-tool ${GCOV} --capture --rc lcov_branch_coverage=1 --directory . --output-file ${OUTPUT}.test.info - # Combine trace files - COMMAND ${LCOV} --gcov-tool ${GCOV} --rc lcov_branch_coverage=1 --add-tracefile ${OUTPUT}.base.info --add-tracefile ${OUTPUT}.test.info --output-file ${OUTPUT}.total.info - # Filter out unwanted files - COMMAND ${LCOV} --gcov-tool ${GCOV} --rc lcov_branch_coverage=1 --remove ${OUTPUT}.total.info "*/tests/*" "*/c++/*" "*/include/*" "*/boost/*" "*/charm/*" "*.decl.h" "*.def.h" "*/STDIN" "*/openmpi/*" "*/pstreams/*" "*/Random123/*" "*/pegtl/*" "*/tut/*" "*/highwayhash/*" "*/moduleinit*" --output-file ${OUTPUT}.filtered.info + COMMAND ${CMAKE_CTEST_COMMAND} -j${PROCESSOR_COUNT} -LE insane + # Process gcov output for genhtml + COMMAND ${FASTCOV} --branch-coverage --exceptional-branch-coverage --lcov -o ${OUTPUT}.info --exclude tests/ c++/ include/ boost/ charm/ decl.h def.h openmpi pstreams Random123 pegtl tut/ highwayhash/ moduleinit # Copy over report customization files for genhtml COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/../doc/quinoa.gcov.css @@ -192,13 +180,13 @@ FUNCTION(SETUP_TARGET_FOR_ALL_COVERAGE suite path targetname unittestrunner ${CMAKE_SOURCE_DIR}/../doc/quinoa.lcov.prolog ${CMAKE_BINARY_DIR} # Generate HTML report - COMMAND ${GENHTML} --legend --branch-coverage --demangle-cpp --css-file quinoa.gcov.css --ignore-errors source --html-prolog quinoa.lcov.prolog --title "${GIT_SHA1}" -o ${OUTPUT} ${OUTPUT}.filtered.info + COMMAND ${GENHTML} --legend --rc genhtml_branch_coverage=1 --demangle-cpp --css-file quinoa.gcov.css --ignore-errors source --html-prolog quinoa.lcov.prolog --title "${GIT_SHA1}" -o ${OUTPUT} ${OUTPUT}.info # Customize page headers in generated html to own COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/LCOV - code coverage report/Quinoa ${suite} test code coverage report/g" {} + COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/Test:<\\/td>/Commit:<\\/td>/g" {} + COMMAND find ${OUTPUT} -type f -exec ${SED} -i "s/Quinoa_v\\\(.*\\\)-\\\(.*\\\)-g\\\(.*\\\)<\\/td>/Quinoa_v\\1-\\2-g\\3<\\/a><\\/td>/g" {} + # Cleanup intermediate data - COMMAND ${CMAKE_COMMAND} -E remove ${OUTPUT}.base.info ${OUTPUT}.test.info ${OUTPUT}.total.info ${OUTPUT}.filtered.info + COMMAND ${CMAKE_COMMAND} -E remove ${OUTPUT}.info # Set work directory for target WORKING_DIRECTORY ${CMAKE_BINARY_DIR} # Echo what is being done diff --git a/cmake/DetectCodeCoverage.cmake b/cmake/DetectCodeCoverage.cmake index d7a19a4f65b..475fccc324d 100644 --- a/cmake/DetectCodeCoverage.cmake +++ b/cmake/DetectCodeCoverage.cmake @@ -11,27 +11,21 @@ # Attempt to find tools required for code coverage analysis -if( CMAKE_CXX_COMPILER_ID MATCHES "Clang" ) - find_program( GCOV ${CMAKE_CURRENT_SOURCE_DIR}/../script/llvm-gcov.sh ) -elseif( CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) - find_program( GCOV gcov ) -endif() - -find_program( LCOV lcov ) +find_program( GCOV gcov ) +find_program( FASTCOV fastcov.py ) find_program( GENHTML genhtml ) find_program( SED sed ) # Code coverage analysis only supported if all prerequisites found and the user -# has requested it via the cmake variable COVERAGE=on.. +# has requested it via the cmake variable COVERAGE=on. if ( COVERAGE AND GCOV AND - LCOV AND + FASTCOV AND GENHTML AND SED AND - ( CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR - CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) ) + CMAKE_CXX_COMPILER_ID STREQUAL "GNU" ) - message(STATUS "Code coverage analysis enabled: All prerequisites found: COVERAGE:${COVERAGE}, compiler:${CMAKE_CXX_COMPILER_ID}, gcov:${GCOV}, lcov:${LCOV}, genhtml:${GENHTML}, sed:${SED}") + message(STATUS "Code coverage analysis enabled with compiler:${CMAKE_CXX_COMPILER_ID}, gcov:${GCOV}, fastcov:${FASTCOV}, genhtml:${GENHTML}, sed:${SED}") # Enable code coverage analysis. SET(CODE_COVERAGE ON) @@ -44,6 +38,6 @@ if ( COVERAGE AND else() - message(STATUS "Code coverage analysis disabled. Not all prerequisites found: COVERAGE:${COVERAGE}, compiler:${CMAKE_CXX_COMPILER_ID}, gcov:${GCOV}, lcov:${LCOV}, genhtml:${GENHTML}, sed:${SED}") + message(STATUS "Code coverage analysis disabled. Not all prerequisites found: COVERAGE (must be true):${COVERAGE}, compiler (must be GNU):${CMAKE_CXX_COMPILER_ID}, and the following must be found: gcov:${GCOV}, fastcov:${FASTCOV}, genhtml:${GENHTML}, sed:${SED}") endif() diff --git a/cmake/FindHighwayHash.cmake b/cmake/FindHighwayHash.cmake index 9d6b8293038..ef33841014b 100644 --- a/cmake/FindHighwayHash.cmake +++ b/cmake/FindHighwayHash.cmake @@ -28,10 +28,9 @@ if(HIGHWAYHASH_INCLUDE_DIRS) set (HIGHWAYHASH_FIND_QUIETLY TRUE) endif() -find_path(HIGHWAYHASH_INCLUDE_DIR NAMES sip_hash.h +find_path(HIGHWAYHASH_INCLUDE_DIR NAMES highwayhash/sip_hash.h HINTS ${HIGHWAYHASH_ROOT} - $ENV{HIGHWAYHASH_ROOT} - PATH_SUFFIXES include highwayhash) + $ENV{HIGHWAYHASH_ROOT}) set(HIGHWAYHASH_INCLUDE_DIRS ${HIGHWAYHASH_INCLUDE_DIR}) diff --git a/cmake/FindLibCXX.cmake b/cmake/FindLibCXX.cmake index eeea9673479..fc1129f3660 100644 --- a/cmake/FindLibCXX.cmake +++ b/cmake/FindLibCXX.cmake @@ -37,22 +37,30 @@ find_path(LIBCXX_INCLUDE_DIR NAMES cxxabi.h HINTS ${LIBCXX_ROOT}/include $ENV{LIBCXX_ROOT}/include/c++/v1) if(BUILD_SHARED_LIBS) - find_library(LIBCXX_LIBRARIES NAMES c++ HINTS ${LIBCXX_ROOT}/lib - $ENV{LIBCXX_ROOT}/lib) - find_library(LIBCXXABI_LIBRARIES NAMES c++abi HINTS ${LIBCXX_ROOT}/lib - $ENV{LIBCXX_ROOT}/lib) + find_library(LIBCXX_LIBRARY NAMES c++ HINTS ${LIBCXX_ROOT}/lib + $ENV{LIBCXX_ROOT}/lib) + find_library(LIBCXXABI_LIBRARY NAMES c++abi HINTS ${LIBCXX_ROOT}/lib + $ENV{LIBCXX_ROOT}/lib) else() - find_library(LIBCXX_LIBRARIES NAMES libc++.a HINTS ${LIBCXX_ROOT}/lib - $ENV{LIBCXX_ROOT}/lib) + find_library(LIBCXX_LIBRARY NAMES libc++.a HINTS ${LIBCXX_ROOT}/lib + $ENV{LIBCXX_ROOT}/lib) if(ARCH MATCHES "ppc64") - set(LIBCXXABI_LIBRARIES " ") + set(LIBCXXABI_LIBRARY "") else() - find_library(LIBCXXABI_LIBRARIES NAMES libc++abi.a HINTS ${LIBCXX_ROOT}/lib - $ENV{LIBCXX_ROOT}/lib) + find_library(LIBCXXABI_LIBRARY NAMES libc++abi.a HINTS ${LIBCXX_ROOT}/lib + $ENV{LIBCXX_ROOT}/lib) endif() endif() -set(LIBCXX_INCLUDE_DIRS ${LIBCXX_INCLUDE_DIR}) +if(LIBCXX_INCLUDE_DIR AND LIBCXX_LIBRARY AND LIBCXXABI_LIBRARY) + set(LIBCXX_INCLUDE_DIRS ${LIBCXX_INCLUDE_DIR}) + set(LIBCXX_LIBRARIES ${LIBCXX_LIBRARY}) + set(LIBCXXABI_LIBRARIES ${LIBCXXABI_LIBRARY}) +else() + set(LIBCXX_INCLUDE_DIRS "") + set(LIBCXX_LIBRARIES "") + set(LIBCXXABI_LIBRARIES "") +endif() # Handle the QUIETLY and REQUIRED arguments and set LIBCXX_FOUND to TRUE if # all listed variables are TRUE. diff --git a/cmake/FindMCSS.cmake b/cmake/FindMCSS.cmake index 38e3d15ecb7..f9ea6dd9a45 100644 --- a/cmake/FindMCSS.cmake +++ b/cmake/FindMCSS.cmake @@ -24,9 +24,6 @@ if(MCSS_DOX2HTML5 AND PYTHONINTERP_FOUND AND PYGMENTS_FOUND AND JINJA2_FOUND AND set (MCSS_FIND_QUIETLY TRUE) endif() -# Find Python 3 and prerequisites for m.css -find_package(PythonInterp 3.6) - if (PYTHONINTERP_FOUND) execute_process( COMMAND ${PYTHON_EXECUTABLE} -c "import pygments" diff --git a/cmake/FindNetCDF.cmake b/cmake/FindNetCDF.cmake index a385bf74d9f..407bbdd6fdc 100644 --- a/cmake/FindNetCDF.cmake +++ b/cmake/FindNetCDF.cmake @@ -47,6 +47,7 @@ find_path (NETCDF_INCLUDES netcdf_par.h ${NETCDF_DIR} $ENV{NETCDF_DIR} ${CMAKE_INSTALL_PREFIX} + /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/netcdf/mpi PATH_SUFFIXES include) if(NOT BUILD_SHARED_LIBS) @@ -55,6 +56,7 @@ if(NOT BUILD_SHARED_LIBS) ${NETCDF_DIR} $ENV{NETCDF_DIR} ${CMAKE_INSTALL_PREFIX} + /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/netcdf/mpi PATH_SUFFIXES lib lib64) else() find_library (NETCDF_LIBRARIES_C NAMES netcdf @@ -62,6 +64,7 @@ else() ${NETCDF_DIR} $ENV{NETCDF_DIR} ${CMAKE_INSTALL_PREFIX} + /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/netcdf/mpi PATH_SUFFIXES lib lib64) endif() mark_as_advanced(NETCDF_LIBRARIES_C) diff --git a/cmake/FindPEGTL.cmake b/cmake/FindPEGTL.cmake index f2b376725c9..f3c169eb189 100644 --- a/cmake/FindPEGTL.cmake +++ b/cmake/FindPEGTL.cmake @@ -23,21 +23,21 @@ # find_package(PEGTL) # include_directories(${PEGTL_INCLUDE_DIRS}) -function(_PEGTL_GET_VERSION _OUT_major _OUT_minor _OUT_micro _metisversion_hdr) - file(STRINGS ${_metisversion_hdr} _contents REGEX "#define TAOCPP_PEGTL_VERSION_[A-Z]+[ \t]+") +function(_PEGTL_GET_VERSION _OUT_major _OUT_minor _OUT_micro _version_hdr) + file(STRINGS ${_version_hdr} _contents REGEX "#define TAO.*_PEGTL_VERSION_[A-Z]+[ \t]+") if(_contents) - string(REGEX REPLACE ".*#define TAOCPP_PEGTL_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" ${_OUT_major} "${_contents}") - string(REGEX REPLACE ".*#define TAOCPP_PEGTL_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" ${_OUT_minor} "${_contents}") - string(REGEX REPLACE ".*#define TAOCPP_PEGTL_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" ${_OUT_micro} "${_contents}") + string(REGEX REPLACE ".*#define TAO.*_PEGTL_VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" ${_OUT_major} "${_contents}") + string(REGEX REPLACE ".*#define TAO.*_PEGTL_VERSION_MINOR[ \t]+([0-9]+).*" "\\1" ${_OUT_minor} "${_contents}") + string(REGEX REPLACE ".*#define TAO.*_PEGTL_VERSION_PATCH[ \t]+([0-9]+).*" "\\1" ${_OUT_micro} "${_contents}") if(NOT ${_OUT_major} MATCHES "[0-9]+") - message(FATAL_ERROR "Version parsing failed for TAOCPP_PEGTL_VERSION_MAJOR!") + message(FATAL_ERROR "Version parsing failed for TAO.*_PEGTL_VERSION_MAJOR!") endif() if(NOT ${_OUT_minor} MATCHES "[0-9]+") - message(FATAL_ERROR "Version parsing failed for TAOCPP_PEGTL_VERSION_MINOR!") + message(FATAL_ERROR "Version parsing failed for TAO.*_PEGTL_VERSION_MINOR!") endif() if(NOT ${_OUT_micro} MATCHES "[0-9]+") - message(FATAL_ERROR "Version parsing failed for TAOCPP_PEGTL_VERSION_PATCH!") + message(FATAL_ERROR "Version parsing failed for TAO.*_PEGTL_VERSION_PATCH!") endif() set(${_OUT_major} ${${_OUT_major}} PARENT_SCOPE) @@ -45,7 +45,7 @@ function(_PEGTL_GET_VERSION _OUT_major _OUT_minor _OUT_micro _metisversion_hdr) set(${_OUT_micro} ${${_OUT_micro}} PARENT_SCOPE) else() - message(FATAL_ERROR "Include file ${_metisversion_hdr} does not exist") + message(FATAL_ERROR "Include file ${_version_hdr} does not exist") endif() endfunction() diff --git a/cmake/FindRandom123.cmake b/cmake/FindRandom123.cmake index d9b858cd244..5dfd99810c1 100644 --- a/cmake/FindRandom123.cmake +++ b/cmake/FindRandom123.cmake @@ -29,20 +29,17 @@ if(RANDOM123_INCLUDE_DIRS) set (RANDOM123_FIND_QUIETLY TRUE) endif() -find_path(RANDOM123_INCLUDE_PHILOX NAMES philox.h - HINTS ${RANDOM123_ROOT}/include - $ENV{RANDOM123_ROOT} - PATH_SUFFIXES Random123) - -find_path(RANDOM123_INCLUDE_THREEFRY NAMES threefry.h - HINTS ${RANDOM123_ROOT}/include - $ENV{RANDOM123_ROOT} - PATH_SUFFIXES Random123) - -find_path(RANDOM123_INCLUDE_UNIFORM NAMES uniform.hpp - HINTS ${RANDOM123_ROOT}/include - $ENV{RANDOM123_ROOT} - PATH_SUFFIXES Random123) +find_path(RANDOM123_INCLUDE_PHILOX NAMES Random123/philox.h + HINTS ${RANDOM123_ROOT} + $ENV{RANDOM123_ROOT}) + +find_path(RANDOM123_INCLUDE_THREEFRY NAMES Random123/threefry.h + HINTS ${RANDOM123_ROOT} + $ENV{RANDOM123_ROOT}) + +find_path(RANDOM123_INCLUDE_UNIFORM NAMES Random123/uniform.hpp + HINTS ${RANDOM123_ROOT} + $ENV{RANDOM123_ROOT}) set(RANDOM123_INCLUDE_DIRS ${RANDOM123_INCLUDE_PHILOX} ${RANDOM123_INCLUDE_THREEFRY} diff --git a/cmake/TPLs.cmake b/cmake/TPLs.cmake index 2210f3a393d..fee340c3a57 100644 --- a/cmake/TPLs.cmake +++ b/cmake/TPLs.cmake @@ -25,7 +25,12 @@ set(CHARM_ROOT ${TPL_DIR}/charm) find_package(Charm) #### MKL (optional) -find_package(MKL) +if (NOT MATHLIB) # set default + set(MATHLIB mkl) +endif() +if (MATHLIB STREQUAL mkl OR MATHLIB STREQUAL MKL) + find_package(MKL) +endif() if(MKL_FOUND) set(HAS_MKL true) # will become compiler define in Main/QuinoaConfig.h endif() @@ -69,15 +74,12 @@ if(RNGSSE2_FOUND) endif() ### HDF5/NetCDF (NetCDF only for static link) +set(HDF5_PREFER_PARALLEL true) if(NOT BUILD_SHARED_LIBS) - set(HDF5_PREFER_PARALLEL true) set(HDF5_USE_STATIC_LIBRARIES true) - find_package(HDF5 COMPONENTS C HL) - find_package(NetCDF) -else() - set(HDF5_PREFER_PARALLEL true) - find_package(HDF5 COMPONENTS C HL) endif() +find_package(HDF5 COMPONENTS C HL) +find_package(NetCDF) if (NOT HDF5_FOUND) set(HDF5_INCLUDE_DIRS "") @@ -180,22 +182,22 @@ endfunction(PrintMissing) # Enable individual executables based on required TPLs found if (CHARM_FOUND AND PUGIXML_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND - HDF5_FOUND AND BRIGAND_FOUND AND TUT_FOUND AND PEGTL_FOUND AND Boost_FOUND - AND HIGHWAYHASH_FOUND AND RANDOM123_FOUND AND - (MKL_FOUND OR LAPACKE_FOUND) AND ENABLE_TESTS) + HDF5_FOUND AND BRIGAND_FOUND AND TUT_FOUND AND PEGTL_FOUND AND Boost_FOUND AND + HIGHWAYHASH_FOUND AND RANDOM123_FOUND AND (MKL_FOUND OR LAPACKE_FOUND) + AND ENABLE_TESTS) set(ENABLE_UNITTEST "true") set(UNITTEST_EXECUTABLE unittest) else() if (NOT ENABLE_TESTS) message(STATUS "Target 'unittest' will NOT be configured, tests disabled.") else() - PrintMissing(unittest "CHARM_FOUND;PUGIXML_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;HDF5_FOUND;BRIGAND_FOUND;TUT_FOUND;PEGTL_FOUND;Boost_FOUND;MKL_FOUND;LAPACKE_FOUND") + PrintMissing(unittest "CHARM_FOUND;PUGIXML_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;HDF5_FOUND;BRIGAND_FOUND;TUT_FOUND;PEGTL_FOUND;Boost_FOUND;HIGHWAYHASH_FOUND;RANDOM123_FOUND;MKL_FOUND;LAPACKE_FOUND") endif() endif() if (CHARM_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND Zoltan2_FOUND AND HDF5_FOUND AND BRIGAND_FOUND AND PEGTL_FOUND AND - (MKL_FOUND OR LAPACKE_FOUND) AND Boost_FOUND) + (MKL_FOUND OR LAPACKE_FOUND) AND Boost_FOUND AND HIGHWAYHASH_FOUND) set(ENABLE_INCITER "true") set(INCITER_EXECUTABLE inciter) else() @@ -218,16 +220,16 @@ if (CHARM_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND PEGTL_FOUND AND set(ENABLE_MESHCONV "true") set(MESHCONV_EXECUTABLE meshconv) else() - PrintMissing(meshconv "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;PEGTL_FOUND;PUGIXML_FOUND;HDF5_FOUND;Boost_FOUND;BRIGAND_FOUND") + PrintMissing(meshconv "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;PEGTL_FOUND;PUGIXML_FOUND;HDF5_FOUND;Boost_FOUND;BRIGAND_FOUND;HIGHWAYHASH_FOUND") endif() if (CHARM_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND PEGTL_FOUND AND BRIGAND_FOUND AND HDF5_FOUND AND RANDOM123_FOUND AND Boost_FOUND AND - (MKL_FOUND OR LAPACKE_FOUND)) + (MKL_FOUND OR LAPACKE_FOUND) AND HIGHWAYHASH_FOUND) set(ENABLE_WALKER "true") set(WALKER_EXECUTABLE walker) else() - PrintMissing(walker "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;PEGTL_FOUND;BRIGAND_FOUND;HDF5_FOUND;RANDOM123_FOUND;Boost_FOUND;MKL_FOUND;LAPACKE_FOUND") + PrintMissing(walker "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;PEGTL_FOUND;BRIGAND_FOUND;HDF5_FOUND;RANDOM123_FOUND;Boost_FOUND;MKL_FOUND;LAPACKE_FOUND;HIGHWAYHASH_FOUND") endif() if (CHARM_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND ROOT_FOUND @@ -236,5 +238,5 @@ if (CHARM_FOUND AND SEACASExodus_FOUND AND EXODIFF_FOUND AND ROOT_FOUND set(ENABLE_FILECONV "true") set(FILECONV_EXECUTABLE fileconv) else() - PrintMissing(fileconv "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;ROOT_FOUND;PEGTL_FOUND;PUGIXML_FOUND;HDF5_FOUND;Boost_FOUND") + PrintMissing(fileconv "CHARM_FOUND;SEACASExodus_FOUND;EXODIFF_FOUND;ROOT_FOUND;PEGTL_FOUND;PUGIXML_FOUND;HDF5_FOUND;Boost_FOUND;BRIGAND_FOUND;HIGHWAYHASH_FOUND") endif() diff --git a/cmake/add_regression_test.cmake b/cmake/add_regression_test.cmake index 8c7496d2af0..83d1f65d76c 100644 --- a/cmake/add_regression_test.cmake +++ b/cmake/add_regression_test.cmake @@ -9,6 +9,18 @@ # ################################################################################ +function(softlink target link_name) + + set(LN_COMMAND "ln -sf ${target} ${link_name}") + + exec_program(${LN_COMMAND} OUTPUT_VARIABLE ln_output RETURN_VALUE ln_retval) + + if ("${ln_retval}" GREATER 0) + message(FATAL_ERROR "Problem creating symbolic link from \"${target}\" to \"${link_name}\":\n${ln_output}") + endif() + +endfunction() + # ############################################################################## # Function used to add a regression test to the ctest test suite # add_regression_test( @@ -19,11 +31,11 @@ # [TEXT_DIFF_PROG txtdiff] # [TEXT_BASELINE stat1.std stat2.std ...] # [TEXT_RESULT stat1.txt stat2.txt ...] -# [TEXT_DIFF_PROG_CONF ndiff.cfg] +# [TEXT_DIFF_PROG_CONF ndiff1.cfg ndiff2.cfg ...] # [BIN_DIFF_PROG bindiff] # [BIN_BASELINE stat1.std stat2.std ...] # [BIN_RESULT stat1.bin stat2.bin ...] -# [BIN_DIFF_PROG_CONF exodiff.cfg] +# [BIN_DIFF_PROG_CONF exodiff1.cfg exodiff2.cfg ...] # [FILECONV_PROG fileconv] # [FILECONV_INPUT arg1 arg2 ...] # [FILECONV_RESULT out.0.exo out.1.exo ...] @@ -61,6 +73,8 @@ # LABELS label1 label2 ... - Optional labels associated with the test. # Default: "${executable}". # +# CHECKPOINT test - Optional test with a checkpoint the test should restart from +# # TEXT_DIFF_PROG txtdiff - Diff program used for textual diffs. Default: # numdiff. # @@ -72,8 +86,8 @@ # be tested. If empty, no textual diff is performed. Default: "". Note that the # number of baseline filenames must equal the number of result files. # -# TEXT_DIFF_PROG_CONF ndiff.cfg - Textual diff program configuration file. -# Default: "". +# TEXT_DIFF_PROG_CONF ndiff1.cfg ndiff2.cfg ... - Textual diff program +# configuration file. Default: "". # # TEXT_DIFF_PROG_ARGS arg1 arg2 ... - Textual diff program arguments. # Default: "". @@ -114,12 +128,13 @@ # ############################################################################## function(ADD_REGRESSION_TEST test_name executable) - set(oneValueArgs NUMPES PPN TEXT_DIFF_PROG BIN_DIFF_PROG TEXT_DIFF_PROG_CONF - FILECONV_PROG POSTPROCESS_PROG POSTPROCESS_PROG_OUTPUT) + set(oneValueArgs NUMPES PPN TEXT_DIFF_PROG BIN_DIFF_PROG + FILECONV_PROG POSTPROCESS_PROG POSTPROCESS_PROG_OUTPUT + CHECKPOINT) set(multiValueArgs INPUTFILES ARGS TEXT_BASELINE TEXT_RESULT BIN_BASELINE BIN_RESULT LABELS POSTPROCESS_PROG_ARGS BIN_DIFF_PROG_ARGS - TEXT_DIFF_PROG_ARGS BIN_DIFF_PROG_CONF FILECONV_RESULT - FILECONV_INPUT) + TEXT_DIFF_PROG_ARGS TEXT_DIFF_PROG_CONF BIN_DIFF_PROG_CONF + FILECONV_RESULT FILECONV_INPUT) cmake_parse_arguments(ARG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) @@ -213,9 +228,12 @@ function(ADD_REGRESSION_TEST test_name executable) if (CHARM_SMP) set(test_name "${test_name}_ppn${PPN}") endif() - #message("${test_name}: req:${REQUESTED_NUMPES}, nod:${NUMNODES}, ppn:${PPN}, hw:${HARDWARE_NUMPES}") + # Set and create test run directory + set(workdir ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) + file(MAKE_DIRECTORY ${workdir}) + # Tell cmake/ctest how many PEs (processors) the test will use list(APPEND test_properties PROCESSORS ${HARDWARE_NUMPES}) @@ -225,7 +243,7 @@ function(ADD_REGRESSION_TEST test_name executable) list(APPEND TEST_LABELS ${ARG_LABELS}) endif() # prepare test labels to pass as cmake script arguments - set(ARG_LABELS LABELS ${TEST_LABELS}) + set(ARG_LABELS ${TEST_LABELS}) string(REPLACE ";" " " ARG_LABELS "${ARG_LABELS}") # Set textual diff tool @@ -256,11 +274,7 @@ function(ADD_REGRESSION_TEST test_name executable) string(CONCAT msg "${msg}, args: '${ARGUMENTS}'") endif() - # Set and create test run directory - set(workdir ${CMAKE_CURRENT_BINARY_DIR}/${test_name}) - file(MAKE_DIRECTORY ${workdir}) - - # Create list of files required to softlink to build directory + # Create list of files required to soft-link to build directory set(reqfiles) foreach(file IN LISTS ARG_TEXT_DIFF_PROG_CONF ARG_INPUTFILES ARG_TEXT_BASELINE ARG_BIN_BASELINE ARG_BIN_DIFF_PROG_CONF) list(APPEND reqfiles "${CMAKE_CURRENT_SOURCE_DIR}/${file}") @@ -268,13 +282,39 @@ function(ADD_REGRESSION_TEST test_name executable) # Softlink files required to build directory foreach(target ${reqfiles}) - set(LN_COMMAND "ln -sf ${target} ${workdir}") - exec_program(${LN_COMMAND} OUTPUT_VARIABLE ln_output RETURN_VALUE ln_retval) - if("${ln_retval}" GREATER 0) - message(FATAL_ERROR "Problem creating symlink from \"${target}\" to \"${workdir}\":\n${ln_output}") - endif() + softlink( "${target}" "${workdir}" ) endforeach() + # Configure optional checkpoint test as a dependent test + if (ARG_CHECKPOINT) + + # Prefix executable and append REQUESTED_NUMPES to dependent test name + set(checkpoint "${executable}:${ARG_CHECKPOINT}_pe${REQUESTED_NUMPES}") + # In SMP mode, also append ppn to checkpoint test name + if (CHARM_SMP) + set(checkpoint "${checkpoint}_ppn${PPN}") + endif() + + # Softlink checkpoint directory + softlink( "${CMAKE_CURRENT_BINARY_DIR}/${checkpoint}/restart" + "${workdir}" ) + + # Softlink results from checkpoint test + foreach(result IN LISTS ARG_BIN_RESULT) + softlink( "${CMAKE_CURRENT_BINARY_DIR}/${checkpoint}/${result}" + "${workdir}" ) + endforeach() + foreach(result IN LISTS ARG_TEXT_RESULT) + softlink( "${CMAKE_CURRENT_BINARY_DIR}/${checkpoint}/${result}" + "${workdir}" ) + endforeach() + foreach(result IN LISTS ARG_FILECONV_RESULT) + softlink( "${CMAKE_CURRENT_BINARY_DIR}/${checkpoint}/${result}" + "${workdir}" ) + endforeach() + + endif() + # Do sainity check on and prepare to pass as cmake script arguments the # filenames of text baseline(s) and text result(s) if(ARG_TEXT_BASELINE OR ARG_TEXT_RESULT) @@ -307,56 +347,46 @@ function(ADD_REGRESSION_TEST test_name executable) string(REPLACE ";" " " ARG_BIN_RESULT "${ARG_BIN_RESULT}") endif() + # Convert lists to space-separated strings for passing as arguments to test + # runner cmake script below if(ARG_POSTPROCESS_PROG_ARGS) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_POSTPROCESS_PROG_ARGS "${ARG_POSTPROCESS_PROG_ARGS}") endif() if(ARG_TEXT_DIFF_PROG_ARGS) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_TEXT_DIFF_PROG_ARGS "${ARG_TEXT_DIFF_PROG_ARGS}") endif() # Make exodiff quiet (errors and warnings will still come to output) list(APPEND ARG_BIN_DIFF_PROG_ARGS "-q") if(ARG_BIN_DIFF_PROG_ARGS) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_BIN_DIFF_PROG_ARGS "${ARG_BIN_DIFF_PROG_ARGS}") endif() if(ARG_FILECONV_INPUT) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_FILECONV_INPUT "${ARG_FILECONV_INPUT}") endif() # Do sainity check on and prepare to pass as cmake script arguments the # filenames of the file converter result(s) if(ARG_FILECONV_RESULT) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_FILECONV_RESULT "${ARG_FILECONV_RESULT}") endif() if(ARG_BIN_DIFF_PROG_CONF) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " ARG_BIN_DIFF_PROG_CONF "${ARG_BIN_DIFF_PROG_CONF}") endif() + if(ARG_TEXT_DIFF_PROG_CONF) + string(REPLACE ";" " " ARG_TEXT_DIFF_PROG_CONF "${ARG_TEXT_DIFF_PROG_CONF}") + endif() + if(RUNNER_ARGS) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " RUNNER_ARGS "${RUNNER_ARGS}") endif() if(POSTFIX_RUNNER_ARGS) - # Convert list to space-separated string for passing as arguments to test - # runner cmake script below string(REPLACE ";" " " POSTFIX_RUNNER_ARGS "${POSTFIX_RUNNER_ARGS}") endif() @@ -364,6 +394,8 @@ function(ADD_REGRESSION_TEST test_name executable) add_test(NAME ${test_name} COMMAND ${CMAKE_COMMAND} -DTEST_NAME=${test_name} + -DUSE_VALGRIND=${USE_VALGRIND} + -DVALGRIND=${VALGRIND} -DWORKDIR=${workdir} -DRUNNER_REQUIRED=${RUNNER_REQUIRED} -DRUNNER=${RUNNER} @@ -377,6 +409,7 @@ function(ADD_REGRESSION_TEST test_name executable) -DNUMNODES=${NUMNODES} -DPPN=${PPN} -DHARDWARE_NUMPES=${HARDWARE_NUMPES} + -DCHECKPOINT=${checkpoint} -DTEXT_DIFF_PROG=${TEXT_DIFF_PROG} -DTEXT_DIFF_PROG_ARGS=${ARG_TEXT_DIFF_PROG_ARGS} -DTEXT_DIFF_PROG_CONF=${ARG_TEXT_DIFF_PROG_CONF} @@ -422,12 +455,16 @@ function(ADD_REGRESSION_TEST test_name executable) if (ARG_TEXT_BASELINE) list(APPEND fail_regexp ".*${test_name}.*FAIL") endif() - # add pass regular expression for exodiff output if needed + # add fail regular expression for exodiff output if needed if (ARG_BIN_BASELINE) list(APPEND fail_regexp "Binary diff failed" "has not been matched to any" "exodiff: ERROR") endif() + # add fail regular expression if running with valgrind + if (ENABLE_VALGRIND) + list(APPEND fail_regexp "ERROR SUMMARY: [1-9][0-9]* errors") + endif() # add fail regular expression to detect cmake error during test run list(APPEND fail_regexp "CMake Error") @@ -437,7 +474,8 @@ function(ADD_REGRESSION_TEST test_name executable) # the regular expressions specified. set_tests_properties(${test_name} PROPERTIES ${test_properties} PASS_REGULAR_EXPRESSION "${pass_regexp}" - FAIL_REGULAR_EXPRESSION "${fail_regexp}") + FAIL_REGULAR_EXPRESSION "${fail_regexp}" + DEPENDS "${checkpoint}") # Set labels cmake test property. The LABELS built-in cmake property is not # passed as part of test_properties above in set_test_properties as diff --git a/cmake/exodiff_cstdint.patch b/cmake/exodiff_cstdint.patch new file mode 100644 index 00000000000..dba69f25858 --- /dev/null +++ b/cmake/exodiff_cstdint.patch @@ -0,0 +1,12 @@ +diff --git a/packages/seacas/applications/exodiff/iqsort.C b/packages/seacas/applications/exodiff/iqsort.C +index 4bf90ecb70..350a8049f9 100644 +--- a/packages/seacas/applications/exodiff/iqsort.C ++++ b/packages/seacas/applications/exodiff/iqsort.C +@@ -31,6 +31,7 @@ + // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // + #include "iqsort.h" ++#include + + namespace { + template void swap_(INT v[], size_t i, size_t j); diff --git a/cmake/hdf5_remove_get_time.patch b/cmake/hdf5_remove_get_time.patch new file mode 100644 index 00000000000..6512927b4a6 --- /dev/null +++ b/cmake/hdf5_remove_get_time.patch @@ -0,0 +1,33 @@ +diff --git a/tools/lib/io_timer.c b/tools/lib/io_timer.c +index b8d44de..9590e70 100644 +--- a/tools/lib/io_timer.c ++++ b/tools/lib/io_timer.c +@@ -211,6 +211,7 @@ set_time(io_time_t *pt, timer_type t, int start_stop) + return pt; + } + ++#if 0 + /* + * Function: get_time + * Purpose: Get the time from a ``io_time_t'' object. +@@ -224,7 +225,6 @@ get_time(io_time_t *pt, timer_type t) + return pt->total_time[t]; + } + +-#if 0 + /* standalone is not working yet. Need fix later. -AKC- */ + #ifdef STANDALONE + #include "pio_standalone.c" +diff --git a/tools/lib/io_timer.h b/tools/lib/io_timer.h +index 4ce0733..5165619 100644 +--- a/tools/lib/io_timer.h ++++ b/tools/lib/io_timer.h +@@ -75,7 +75,7 @@ extern "C" { + H5TOOLS_DLL io_time_t *io_time_new(clock_type t); + H5TOOLS_DLL void io_time_destroy(io_time_t *pt); + H5TOOLS_DLL io_time_t *set_time(io_time_t *pt, timer_type t, int start_stop); +-H5TOOLS_DLL double get_time(io_time_t *pt, timer_type t); ++// H5TOOLS_DLL double get_time(io_time_t *pt, timer_type t); + #ifdef __cplusplus + } + #endif /* __cplusplus */ diff --git a/cmake/test_runner.cmake b/cmake/test_runner.cmake index 2b4b6a3b34a..0e3dd39dc64 100644 --- a/cmake/test_runner.cmake +++ b/cmake/test_runner.cmake @@ -21,6 +21,7 @@ string(REPLACE " " ";" BIN_BASELINE "${BIN_BASELINE}") string(REPLACE " " ";" BIN_RESULT "${BIN_RESULT}") string(REPLACE " " ";" BIN_DIFF_PROG_CONF "${BIN_DIFF_PROG_CONF}") string(REPLACE " " ";" BIN_DIFF_PROG_ARGS "${BIN_DIFF_PROG_ARGS}") +string(REPLACE " " ";" TEXT_DIFF_PROG_CONF "${TEXT_DIFF_PROG_CONF}") # Covert string to list of postprocess program arguments string(REPLACE " " ";" POSTPROCESS_PROG_ARGS "${POSTPROCESS_PROG_ARGS}") # Covert string to list of test labels @@ -36,6 +37,8 @@ string(REPLACE " " ";" POSTFIX_RUNNER_ARGS "${POSTFIX_RUNNER_ARGS}") message("Test runner configuration:") message(" TEST_NAME (name of test) : ${TEST_NAME}") message(" WORKDIR (test run directory) : ${WORKDIR}") +message(" USE_VALGRIND (true if we use valgrind) : ${USE_VALGRIND}") +message(" VALGRIND (valgrind executable) : ${VALGRIND}") message(" RUNNER_REQUIRED (true if an executable runner is required) : ${RUNNER_REQUIRED}") message(" RUNNER (used to run parallel and serial jobs inside cmake) : ${RUNNER}") message(" RUNNER_NCPUS_ARG (used to specify the number of CPUs) : ${RUNNER_NCPUS_ARG}") @@ -49,13 +52,14 @@ message(" NUMPES (number of processing elements requested for test) : ${NUMPE message(" NUMNODES (number of logical nodes, in Charm++'s SMP mode) : ${NUMNODES}") message(" PPN (number of PEs per logical node, in Charm++'s SMP mode) : ${PPN}") message(" HARDWARE_NUMPES (number of PEs used in hardware for test) : ${HARDWARE_NUMPES}") +message(" CHECKPOINT (test whose checkpoint to restart from) : ${CHECKPOINT}") message(" POSTPROCESS_PROG (executable to run after test) : ${POSTPROCESS_PROG}") message(" POSTPROCESS_PROG_ARGS (postprocess program arguments) : ${POSTPROCESS_PROG_ARGS}") message(" POSTPROCESS_PROG_OUTPUT (postprocess program output file) : ${POSTPROCESS_PROG_OUTPUT}") message(" TEXT_DIFF_PROG (diff tool used for text diffs) : ${TEXT_DIFF_PROG}") message(" TEXT_DIFF_PROG_ARGS (text diff tool arguments) : ${TEXT_DIFF_PROG_ARGS}") -message(" TEXT_DIFF_PROG_CONF (text diff tool configuration file) : ${TEXT_DIFF_PROG_CONF}") +message(" TEXT_DIFF_PROG_CONF (text diff tool configuration file(s)) : ${TEXT_DIFF_PROG_CONF}") message(" TEXT_BASELINE (text output known good solution file(s)) : ${TEXT_BASELINE}") message(" TEXT_RESULT (text output file(s) diffed with good solution) : ${TEXT_RESULT}") @@ -70,7 +74,8 @@ message(" FILE_CONV_INPUT (File conv tool input file(s)) : ${FILEC message(" FILECONV_RESULT (File conv tool output file(s)) : ${FILECONV_RESULT}") # Remove previous test output (if any) -if(TEXT_RESULT OR BIN_RESULT OR FILECONV_RESULT OR FILECONV_INPUT) +if ( NOT CHECKPOINT AND + (TEXT_RESULT OR BIN_RESULT OR FILECONV_RESULT OR FILECONV_INPUT) ) message("\nRemoving existing result(s) (if any): ${TEXT_RESULT} ${BIN_RESULT} ${FILECONV_RESULT} ${FILECONV_INPUT}\n") file(REMOVE ${TEXT_RESULT} ${BIN_RESULT} ${FILECONV_RESULT} ${FILECONV_INPUT}) endif() @@ -80,6 +85,10 @@ if (PPN) set(PPN "+ppn;${PPN}") endif() +if (USE_VALGRIND) + set(valgrind_memcheck "valgrind --tool=memcheck") +endif() + # Configure test run command if (CHARM_SMP) @@ -92,11 +101,13 @@ if (CHARM_SMP) endif() set(test_command ${RUNNER} ${RUNNER_NCPUS_ARG} ${NPE} ${RUNNER_ARGS} + ${valgrind_memcheck} ${TEST_EXECUTABLE} ${TEST_EXECUTABLE_ARGS} ${PPN} ${POSTFIX_RUNNER_ARGS}) else() set(test_command ${RUNNER} ${RUNNER_NCPUS_ARG} ${NUMPES} ${RUNNER_ARGS} + ${valgrind_memcheck} ${TEST_EXECUTABLE} ${TEST_EXECUTABLE_ARGS} ${POSTFIX_RUNNER_ARGS}) @@ -161,7 +172,8 @@ else() # Test command ran successfully, attempt to do diffs # postprocessing, or # - both TEXT_BASELINE and TEXT_RESULT have been specified and doing # postprocessing (and postprocessing program has been found) - if( (TEXT_BASELINE AND TEXT_RESULT AND NOT POSTPROCESS_PROG_OUTPUT) OR (TEXT_BASELINE AND TEXT_RESULT AND POSTPROCESS_PROG) ) + if( (TEXT_BASELINE AND TEXT_RESULT AND NOT POSTPROCESS_PROG_OUTPUT) OR + (TEXT_BASELINE AND TEXT_RESULT AND POSTPROCESS_PROG) ) # Make sure the number of result and baseline files are equal list(LENGTH TEXT_BASELINE nbaseline) @@ -171,17 +183,32 @@ else() # Test command ran successfully, attempt to do diffs "Number of baselines and number of results must be equal.") endif() + # If there is only one text diff program conf, use that for all, if multiple, + # use one of each + list(LENGTH TEXT_DIFF_PROG_CONF nconf) + if (NOT nconf EQUAL nresult AND NOT nconf EQUAL 1) + message(FATAL_ERROR "Number of text-diff-prog conf files (${nconf}) should either be 1 or it must equal the number of results (${nresult}).") + endif() + # Do textual diff(s) multiple times diffing matching baseline and result math(EXPR b "0") foreach(baseline IN LISTS TEXT_BASELINE) + list(GET TEXT_RESULT ${b} result) if (RUNNER_REQUIRED) set(runner_prefix ${RUNNER} ${RUNNER_NCPUS_ARG} 1 ${RUNNER_ARGS}) endif() + + if (nconf EQUAL 1) + list(GET TEXT_DIFF_PROG_CONF 0 conf) + else() + list(GET TEXT_DIFF_PROG_CONF ${b} conf) + endif() + set(text_diff_command ${runner_prefix} ${TEXT_DIFF_PROG} ${TEXT_DIFF_PROG_ARGS} -b -t ${TEST_NAME} - ${baseline} ${result} ${TEXT_DIFF_PROG_CONF}) + ${baseline} ${result} ${conf}) string(REPLACE ";" " " text_diff_command_string "${text_diff_command}") message("\nRunning text diff command: '${text_diff_command_string}'\n") execute_process(COMMAND ${text_diff_command} RESULT_VARIABLE ERROR) @@ -190,6 +217,7 @@ else() # Test command ran successfully, attempt to do diffs message(FATAL_ERROR "Textual diff failed to run: '${text_diff_command_string}' returned error code: ${ERROR}") endif(ERROR) math(EXPR b "${b}+1") + endforeach(baseline) endif() @@ -233,13 +261,25 @@ else() # Test command ran successfully, attempt to do diffs # mode (i.e., equivalent to ppn=1 in SMP mode), but run in SMP mode, may # yield the same partitions and the same results but with different file # numbers (ranks), due to the partitioner labeling the partitions - # differently. In that case we need to search a matching result for all + # differently (running on a different number of PEs compared to non-SMP + # mode). In that case we need to search a matching result among all # baselines in the list of results generated by the test. Thus the loop # below is a nested double loop, to traverse the Cartesian product of the # lists of baselines and results. Note that the Cartesian product is only # needed in SMP mode. In non-SMP mode, only the baseline-result pairs are # diffed with the same file number, i.e., in lock-step. + # While the outer loop is a 'foreach', the inner loop is a 'while'. The + # outer loop simple visits every baseline. However, the inner loop only + # visits those results for which a match has not yet been found. Those + # results that have been matched, collected in 'matched_ids', are taken off + # the list of results that are checked in the next iteration. This speeds + # up the search of matching baselines to less and less results as more + # matches are found. Also, iteration over the results is started from + # result id = baseline id, assuming the best case scenario, which is always + # true in non-SMP mode, only false for a few results in SMP mode. This + # further speeds up the search. + # A baseline file is passed if a matching result is found among the results # with any file number. Finding a matching result this way for all # baselines, however, is only a necessary condition for passing the entire @@ -253,6 +293,7 @@ else() # Test command ran successfully, attempt to do diffs # filenames, independent of the order. set(matched_results) + set(matched_ids) set(b "-1") foreach(baseline ${BIN_BASELINE}) math(EXPR b "0${b}+1") @@ -266,13 +307,27 @@ else() # Test command ran successfully, attempt to do diffs set(pass FALSE) set(matching_result) set(baseline_error) - set(r "-1") - foreach(result ${BIN_RESULT}) - math(EXPR r "0${r}+1") + set(r "${b}-1") # start result id = baseline id (assume best case) + set(unmatched "0") + while(NOT pass) + + # Increment result id (that is diffed with this baseline). If result id + # overflows, start over. Only consider those result ids for which we do + # not have a match yet. + set(m "0") + while(NOT ${m} EQUAL -1) + math(EXPR r "0${r}+1") + if (r EQUAL nresult) + set(r "0") + endif() + list(FIND matched_ids ${r} m) + endwhile() + + list(GET BIN_RESULT ${r} result) if (NOT CHARM_SMP AND NOT b EQUAL r) #message("Charm++ in non-SMP mode: not diffing baseline ${b} with result ${r}") - continue() + break() endif() #message("Diffing baseline ${b} (${baseline}) with result ${r} (${result})") @@ -296,17 +351,20 @@ else() # Test command ran successfully, attempt to do diffs set(pass TRUE) set(matching_result ${result}) list(APPEND matched_results ${result}) - endif() - - # Save return value from binary diff command if any - if(ERROR) + list(APPEND matched_ids ${r}) + else() + math(EXPR unmatched "0${unmatched}+1") + if (${unmatched} EQUAL ${nresult}) + break() # tried all without a match, get out, test failed + endif() + # Save return value from binary diff command if any set(baseline_error "${bin_diff_command_string}, error: ${ERROR}") if (ERROR_OUTPUT) set(baseline_error "${baseline_error}, output: ${BINDIFF_OUTPUT}, error output: ${ERROR_OUTPUT}") endif() endif() - endforeach(result) + endwhile() # Echo pass message if test passed, echo output, error, and error output # if failed. diff --git a/doc/images/README.md b/doc/images/README.md new file mode 100644 index 00000000000..d837709fbf6 --- /dev/null +++ b/doc/images/README.md @@ -0,0 +1,57 @@ +# How to generate logos + + ,::,` `. + .;;;'';;;: ;;# + ;;;@+ +;;; ;;;;;, ;;;;. ;;;;;, ;;;; ;;;; `;;;;;;: ;;; + :;;@` :;;' .;;;@, ,;@, ,;;;@: .;;;' .;+;. ;;;@#:';;; ;;;;' + ;;;# ;;;: ;;;' ;: ;;;' ;;;;; ;# ;;;@ ;;; ;+;;' + .;;+ ;;;# ;;;' ;: ;;;' ;#;;;` ;# ;;@ `;;+ .;#;;;. + ;;;# :;;' ;;;' ;: ;;;' ;# ;;; ;# ;;;@ ;;; ;# ;;;+ + ;;;# .;;; ;;;' ;: ;;;' ;# ,;;; ;# ;;;# ;;;: ;@ ;;; + ;;;# .;;' ;;;' ;: ;;;' ;# ;;;; ;# ;;;' ;;;+ ;', ;;;@ + ;;;+ ,;;+ ;;;' ;: ;;;' ;# ;;;' ;# ;;;' ;;;' ;':::;;;; + `;;; ;;;@ ;;;' ;: ;;;' ;# ;;;';# ;;;@ ;;;:,;+++++;;;' + ;;;; ;;;@ ;;;# .;. ;;;' ;# ;;;;# `;;+ ;;# ;# ;;;' + .;;; :;;@ ,;;+ ;+ ;;;' ;# ;;;# ;;; ;;;@ ;@ ;;;. + ';;; ;;;@, ;;;;``.;;@ ;;;' ;+ .;;# ;;; :;;@ ;;; ;;;+ + :;;;;;;;+@` ';;;;;'@ ;;;;;, ;;;; ;;+ +;;;;;;#@ ;;;;. .;;;;;; + .;;#@' `#@@@: ;::::; ;:::: ;@ '@@@+ ;:::; ;:::::: + :;;;;;;. + .;@+@';;;;;;' + ` '#''@` + +## Quinoa ASCII art logo + +The Quinoa ASCII art logo, displayed above, has been generated at +http://picascii.com, based on the [Xfig](http://mcj.sourceforge.net/) image, +[doc/images/quinoa.fig](https://github.com/quinoacomputing/quinoa/blob/master/doc/images/quinoa.fig) +displayed at https://quinoacomputing.org. + +## ASCII art logos of executable names + +The ASCII art logos of the _executable_ names, e.g., at +https://quinoacomputing.org/inciter_main.html, have been generated at +http://patorjk.com/software/taag using the default settings: + + - Font: _Graffiti_ + - Character width: _default_ + - Character height: _default_ + +## ASCII art logos in SVG format + +The ASCII art logos in SVG format, to display them on HTML pages, e.g., at +https://quinoacomputing.org/inciter_main.html, have been generated by +[LaTeX](https://www.latex-project.org/), using +[doc/txt2pdf](https://github.com/quinoacomputing/quinoa/tree/master/doc/txt2pdf), +yielding a PDF which then was converted to SVG using +[pdf2svg](http://www.cityinthesky.co.uk/opensource/pdf2svg/) as + + cd doc/txt2pdf/ + make pdf + pdf2svg txt2pdf.pdf .svg + +## Quinoa hex color codes + + - blue: 1d3564 + - dark orange: c96a00 + - light orange: ce6861c diff --git a/doc/licenses/Hypre_license.dox b/doc/licenses/Hypre_license.dox deleted file mode 100644 index 23b1052c046..00000000000 --- a/doc/licenses/Hypre_license.dox +++ /dev/null @@ -1,509 +0,0 @@ -/*! - \page hypre_license_page Hypre license - -\verbatim - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! -\endverbatim - -*/ diff --git a/doc/pages/17-workflow.dox b/doc/pages/17-workflow.dox deleted file mode 100644 index fcce7fd955b..00000000000 --- a/doc/pages/17-workflow.dox +++ /dev/null @@ -1,7 +0,0 @@ -/*! - \page workflow Project workflow - -We roughly follow the development model described at -http://nvie.com/posts/a-successful-git-branching-model. - -*/ diff --git a/doc/pages/20c-inciter_newscheme_header.dox b/doc/pages/20c-inciter_newscheme_header.dox deleted file mode 100644 index 3594cbd242c..00000000000 --- a/doc/pages/20c-inciter_newscheme_header.dox +++ /dev/null @@ -1,6 +0,0 @@ -/*! - \page inciter_newscheme_header_page Inciter/ALECG.h - -@include Inciter/ALECG.h - -*/ diff --git a/doc/pages/20d-inciter_newscheme_class.dox b/doc/pages/20d-inciter_newscheme_class.dox deleted file mode 100644 index e6ba48cb8c2..00000000000 --- a/doc/pages/20d-inciter_newscheme_class.dox +++ /dev/null @@ -1,6 +0,0 @@ -/*! - \page inciter_newscheme_class_page Inciter/ALECG.C - -@include Inciter/ALECG.C - -*/ diff --git a/doc/pages/21e-inciter_newpde_dg.h.dox b/doc/pages/21e-inciter_newpde_dg.h.dox deleted file mode 100644 index f26f2022ada..00000000000 --- a/doc/pages/21e-inciter_newpde_dg.h.dox +++ /dev/null @@ -1,6 +0,0 @@ -/*! - \page inciter_newpde_dg_h PDE/MultiMat/Physics/DG.h - -@include PDE/MultiMat/Physics/DG.h - -*/ diff --git a/doc/pages/21g-inciter_newpde_vorticalflow.h.dox b/doc/pages/21g-inciter_newpde_vorticalflow.h.dox deleted file mode 100644 index 14022972487..00000000000 --- a/doc/pages/21g-inciter_newpde_vorticalflow.h.dox +++ /dev/null @@ -1,6 +0,0 @@ -/*! - \page inciter_newpde_vorticalflow_h PDE/MultiMat/Problem/VorticalFlow.h - -@include PDE/MultiMat/Problem/VorticalFlow.h - -*/ diff --git a/doc/pages/21h-inciter_newpde_problem.h.dox b/doc/pages/21h-inciter_newpde_problem.h.dox deleted file mode 100644 index 7b7d1dbd94f..00000000000 --- a/doc/pages/21h-inciter_newpde_problem.h.dox +++ /dev/null @@ -1,6 +0,0 @@ -/*! - \page inciter_newpde_problem_h PDE/MultiMat/Problem.h - -@include PDE/MultiMat/Problem.h - -*/ diff --git a/doc/pages/98-logo.dox b/doc/pages/98-logo.dox deleted file mode 100644 index 5b42c8aaf47..00000000000 --- a/doc/pages/98-logo.dox +++ /dev/null @@ -1,30 +0,0 @@ -/*! - \page logo How to generate logos - -@m_div{m-col-m-6 m-right-m} - -@m_enddiv - - - The Quinoa ASCII art logo, displayed here, has been generated at - http://picascii.com, based on the [Xfig](http://mcj.sourceforge.net/) image, -[doc/images/quinoa.fig](https://github.com/quinoacomputing/quinoa/blob/master/doc/images/quinoa.fig) displayed on the [main](index.html) page. - - - The ASCII art logos of the executable names, e.g., on @ref inciter_main's - page, have been generated at http://patorjk.com/software/taag using the default - settings: - - Font : Graffiti - - Character width: default - - Character height: default - - - The ASCII art logos in SVG format (to display them on HTML pages as above) have been generated by [LaTeX](https://www.latex-project.org/), using [doc/txt2pdf](https://github.com/quinoacomputing/quinoa/tree/master/doc/txt2pdf), yielding a PDF which then was converted to SVG using [pdf2svg](http://www.cityinthesky.co.uk/opensource/pdf2svg/) as - @code{.bash} - cd doc/txt2pdf/ - make pdf - pdf2svg txt2pdf.pdf .svg - @endcode - - - Quinoa hex color codes: - - blue: 1d3564 - - dark orange: c96a00 - - light orange: e6851c -*/ diff --git a/doc/pages/build.dox b/doc/pages/build.dox new file mode 100644 index 00000000000..946659101c8 --- /dev/null +++ b/doc/pages/build.dox @@ -0,0 +1,447 @@ +/*! + @page build Build + +@tableofcontents{xml} + +This page discusses various ways of building Quinoa, including requirements, +optional libraries, defaults, and build system options. + +@section build_quick Quick start + +See section @ref mainpage_build on the main page. + +@section build_requirements Minimum requirements + + - Fortran compiler + - C and C++ compilers, the latter implementing the C++17 standard + - Message Passing Interface library, e.g., [OpenMPI](https://www.open-mpi.org) + +@section build_supported Routinely tested + + Compilers: + - GNU + - Clang + - Intel + + C++ standard library: + - libc++ + - libstdc++ + + MPI: + - OpenMPI + - Intel MPI + + Operating systems: + - Debian Linux + - Alpine Linux + - RedHat Enterprise Linux + - MacOS + +@section build_stages Two-stage build + +Quinoa is built in two stages, of which the first one may be optional: + + 1. Build third-party libraries (TPLs) + 2. Build Quinoa + +Both stages consist of the following two steps + + - Use cmake to configure the build + - Perform the build + +The first step may be optional if all TPLs are found on the system or are +pre-installed and/or configured, e.g., via environment modules. + +@note If some libraries are not found by the Quinoa cmake step, not all +executable targets will be configured. Examples are builds configured for only a +single executable, see @ref build_specific_executables, or a build +configured for only building the documentation, see +https://github.com/quinoacomputing/buildenv/blob/master/debian-doc. + +@section build_default Build using the defaults + +The easiest, but not necessarily the quickest, way to build Quinoa is to use the +defaults. + +Install the prerequisites on a Debian-based Linux do + + sudo apt-get install cmake gfortran gcc g++ openmpi-bin libopenmpi-dev + +Clone the code with the external packages (third party libraries, TPLs): + + git clone --recurse-submodules https://github.com/quinoacomputing/quinoa.git + +Build the TPLs in an empty directory: + + cd quinoa + mkdir external/build + cd external/build + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .. + make -sj$(grep -c processor /proc/cpuinfo) + +If the above went fine, we build the code, in a new empty build directory: + + cd quinoa + mkdir build + cd build + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc ../src + make -sj$(grep -c processor /proc/cpuinfo) + +If this also went fine, let's run the unit-, and regression tests in the build +directory: + + cd quinoa/build + ./charmrun +p$(grep -c processor /proc/cpuinfo) Main/unittest -v -q + ctest -j$(grep -c processor /proc/cpuinfo) -LE extreme + +This will run all tests, except those that would take a long time. If all of the +above steps finished without error, you have successfully built Quinoa. You can +run the executables from `build/Main` or install them with + + make install + +The default install directory is `/usr/local`, which usually needs root +permissions. You can change that by configuring a different path in the +`CMAKE_INSTALL_PREFIX` cmake variable. + +@section build_nonrecursive Working with a non-recursive clone + +The default build process, described in section @ref build_default, instructs +you to do a _recursive_ clone, which clones not only the source code for Quinoa +but also all external packages (third-party libraries, TPLs). The TPLs are +pulled in to directory `external/` as git submodules and contain significantly +more data and files than the Quinoa source. If you plan to do code development, +it is quicker to work with the repository (changing branches, stashing, etc.) +if you work with a _non-recursive_ clone. + +To make this work, we need to clone the TPLs separately: + + git clone https://github.com/quinoacomputing/quinoa-tpl.git + +Then build the TPLs using a similar process as in @ref build_default : + + cd quinoa-tpl + mkdir build + cd build + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .. + make -sj$(grep -c processor /proc/cpuinfo) + +By default, this will install all TPLs in +`quinoa-tpl/install/-/`, e.g., `quinoa-tpl/install/gnu-x86_64/`. +Now we can clone Quinoa without cloning the TPLs: + + git clone https://github.com/quinoacomputing/quinoa.git + +To build the code using the TPLs installed above, we tell that location to +cmake using the cmake variable `TPL_DIR`: + + cd quinoa + mkdir build + cd build + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DTPL_DIR=/install/gnu-x86_64/ ../src + make -sj$(grep -c processor /proc/cpuinfo) + +Since the Quinoa clone no longer contains initialized submodules, git +operations are faster. This difference can be significant on network-mounted or +shared drives. + +If the need arises, e.g., to pull in changes from the TPL submodules into such a +non-recursive clone, the `external/` directory can still be populated under the +quinoa clone by initializing the submodules: + + cd quinoa + git submodule init + git submodule update --recursive + cd external + git submodule init + git submodule update --recursive + cd .. + git submodule status --recursive + +As you can see form the output of the commands above, there are two layers of +git submodules. You can also just use the above as a single, chained command: + + cd quinoa + git submodule init && git submodule update --recursive && cd external && git submodule init && git submodule update --recursive && cd .. && git submodule status --recursive + +After this under `quinoa/external/` the TPLs can be updated, e.g., `git pull`, +etc. When the TPL sources are, again, no longer needed, we de-populate it: + + cd quinoa + git submodule deinit --all + +@note To effect code-reuse between +[quinoa](https://github.com/quinoacomputing/quinoa) and +[quinoa-tpl](https://github.com/quinoacomputing/quinoa-tpl) the `cmake/` +directory is pulled into _quinoa_ as a git subtree, (and as a submodule into +_quinoa-tpl_) whose origin is https://github.com/quinoacomputing/cmake-modules. +Therefore changes to files under `cmake/` should be made to the +[cmake-modules](https://github.com/quinoacomputing/cmake-modules) repository +and then pulled in to _quinoa_ and _quinoa-tpl_. See also the page on on @ref +git_submodules_subtrees. + +@section build_specific_executables Build specific executables only + +The default build process, described in section @ref build_default, does a +recursive clone of _most_ TPLs and builds _all_ executables. If you only care +about a particular tool, e.g., @ref inciter_main, you can + + 1. Clone only those TPLs that are required for the given tool (instead of + cloning them all), e.g., + + git clone https://github.com/quinoacomputing/quinoa.git + git submodule init && git submodule update && cd external + git -c submodule."src/pstreams".update=none -c submodule."src/pugixml".update=none -c submodule."src/rngsse2".update=none -c submodule."src/testu01".update=none -c submodule."src/tut".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none -c submodule."src/root".update=none -c submodule."src/aec".update=none submodule update --init --recursive + + 2. Build only those TPLs that are required for the given executable by setting + the `_ONLY` cmake variable to `true`, e.g., + + cd quinoa + mkdir external/build + cd external/build + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DINCITER_ONLY=true .. + make -sj$(grep -c processor /proc/cpuinfo) + +This will build only the TPLs required for @ref inciter_main. The rest of the +build process is the same as in @ref build_default : running cmake configuring +Quinoa will enable only those build targets for which it finds the required +TPLs. Such `*_ONLY` cmake variables are defined for all executable targets in +[/CMakeLists.txt](https://github.com/quinoacomputing/quinoa-tpl/blob/master/CMakeLists.txt), +in the section starting with the comment line + + # Set which libraries are built/searched by default + +Here are the `git submodule update` commands that pull in _only_ the TPLs +required for the given tool for each executable: + +@ref walker_main + + git -c submodule."src/pugixml".update=none -c submodule."src/rngsse2".update=none -c submodule."src/aec".update=none -c submodule."src/h5part".update=none -c submodule."src/testu01".update=none -c submodule."src/tut".update=none -c submodule."src/root".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none submodule update --init --recursive + +@ref inciter_main + + git -c submodule."src/pugixml".update=none -c submodule."src/rngsse2".update=none -c submodule."src/testu01".update=none -c submodule."src/tut".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none -c submodule."src/root".update=none -c submodule."src/aec".update=none submodule update --init --recursive + +@ref rngtest_main + + git -c submodule."src/hdf5".update=none -c submodule."src/netcdf".update=none -c submodule."src/pugixml".update=none -c submodule."src/h5part".update=none -c submodule."src/trilinos".update=none -c submodule."src/tut".update=none -c submodule."src/numdiff".update=none -c submodule."src/root".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/highwayhash".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none -c submodule."src/aec".update=none submodule update --init --recursive + +@ref unittest_main + + git -c submodule."src/rngsse2".update=none -c submodule."src/testu01".update=none -c submodule."src/numdiff".update=none -c submodule."src/root".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none -c submodule."src/aec".update=none submodule update --init --recursive + +@ref meshconv_main + + git -c submodule."src/random123".update=none -c submodule."src/rngsse2".update=none -c submodule."src/lapack".update=none -c submodule."src/aec".update=none -c submodule."src/h5part".update=none -c submodule."src/testu01".update=none -c submodule."src/tut".update=none -c submodule."src/root".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none submodule update --init --recursive + +@ref fileconv_main + + git -c submodule."src/random123".update=none -c submodule."src/rngsse2".update=none -c submodule."src/lapack".update=none -c submodule."src/aec".update=none -c submodule."src/h5part".update=none -c submodule."src/testu01".update=none -c submodule."src/tut".update=none -c submodule."src/numdiff".update=none -c submodule."src/backward-cpp".update=none -c submodule."src/omega_h".update=none -c submodule."src/doxygen".update=none -c submodule."src/m.css".update=none submodule update --init --recursive + +@section build_systemlibs Using system-wide packages + +The default build process, described in section @ref build_default, attempts to +find (and if not found, build) all required and most optional packages that are +enabled by default. See the section on @ref build_optional for what packages +are enabled by default. On some platforms, it is advantageous (and could be +faster) to use the packages provided by the system. + +On a Debian-based Linux you can pre-install the packages given in + + quinoa/tools/docker/Dockerfile.quinoa-build-debian + +On Alpine Linux you can pre-install the packages given in + + quinoa/tools/docker/Dockerfile.quinoa-build-alpine + +@section build_mac Build on Mac OS + +On Mac OS we do _not_ recommend using the system-wide compilers. Instead, we +use [macports](https://www.macports.org/) to install compilers and OpenMPI: + + port install openmpi-clang60 + port select clang mp-clang-6.0 + port select mpi openmpi-clang60-fortran + +You can also use ports to install some TPLs: + + port install pugixml hdf5 +openmpi+clang60+hl + +Note that the above is optional, since it may also be installed by the TPL +build, see @ref build_default, but depending on your system you may have better +luck with one or the other. + +@section build_clang Build using Clang or Intel compilers + +The default build process on Linux, described in section @ref build_default, +uses the system-wide gnu compiler suite. You can also use the clang or the +Intel compilers. We do this by either building OpenMPI using clang or Intel or +by using the machine-specific MPI wrappers pointing to the compiler and then +use the build process given in section @ref build_default. + +@section build_rndq Build using Charm++'s randomized message queues + +For serious development work, especially involving asynchronous parallel +programming, we also build and test with Charm++ using randomized message +queues. This enables more thorough testing of the available space for +scheduling messages and thus more heavily testing the asynchronous logic. We do +this by configuring the TPL build as + + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DCHARM_EXTRA_ARGS="--enable-error-checking;--with-prio-type=int;--enable-randomized-msgq;--suffix;randq-debug" + +@section build_smp Build using Charm++'s SMP mode + +For better performance computing large problems using many threads, Quinoa can +also be used using Charm++'s symmetric multi-processing (SMP) mode. This can be +done by configuring the TPL build as + + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DCHARM_EXTRA_ARGS="smp" + +@note Multiple extra arguments to the Charm++ build can be passed to the cmake +variable `CMAKE_EXTRA_ARGS` separated by semi-colons. + +You can run the unit-, and regression tests in SMP mode as, e.g., + + ./charmrun +p 34 --bind-to none Main/unittest -v -q +ppn 17 + ctest -j 36 --output-on-failure -LE extreme + +The above will use 36 PEs, distributed into two logical (compute) nodes. See +also the Charm++ manual on how to run in SMP mode. + +@note SMP mode configures more regression tests, specifically exercising SMP, +compared to non-SMP mode, thus enables a more thorough testing. + +@section build_static Static build + +Some machines, e.g., Crays, prefer builds using static libraries. This can be +done by passing the cmake argument `-DBUILD_SHARED_LIBS=off` to _both_ TPL and +Quinoa configure steps. See also section @ref build_default. + +@section build_projections Build with Charm++'s Projections enabled + +To use Charm++'s performance analysis tool, Projections, you can build Charm++ +with + + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DCHARM_EXTRA_ARGS="--enable-tracing;--enable-commthread-tracing" + +Then configure the Quinoa build with the extra link arguments: + + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DEXTRA_LINK_ARGS="-tracemode projections" + +See also the Charm++ Projections manual. + +@section build_ninja Using ninja instead of make + +Similar to other CMake/C++ projects, Quinoa can also be built with +[ninja](https://ninja-build.org) instead of make, by configuring the Quinoa +build with + + cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -GNinja + +@section build_optional Optional third-party libraries + +The default build process, described in section @ref build_default, will +attempt to build a set of default TPLs. Not all TPLs are required: some are +optional, some must be specifically enabled if needed. Then Quinoa can be +configured to build whatever it can based on the libraries it can find. See +also the section on @ref build_specific_executables. + +All libraries, required or optional, are listed on page @ref licenses. + +@section build_debug Build in Debug mode + +Similar to other cmake projects, Quinoa can be configured for `Debug`, +`Release`, or other types of builds cmake supports. As usual, this is done by +setting the `CMAKE_BUILD_TYPE` variable, e.g., `-DCMAKE_BUILD_TYPE=Debug`. The +default is `Release`. + +@section build_disable Disabling packages + +Sometimes it may be necessary to disable searching for packages, e.g., due to +broken or unsuitable system-wide installs, etc. This can be done by configuring +the TPL build by passing to cmake, e.g., + + -DCMAKE_DISABLE_FIND_PACKAGE_Boost=true + +@section build_cpplibrary Configuring the C++ standard library + +We routinely use and test _libc++_ and _libstdc++_. Which one to use can be +configured by the cmake variable `STDLIBCPP`, as + + -DSTDLIBCPP=libc++ + +or + + -DSTDLIBCPP=libstdc++ + +@note The `STDLIBCPP` cmake variable is ignored if the gnu compiler is used. +With the gnu compilers _libstdc++_ is the only option. + +@warning The configuration for the standard library must be specified so that +_both_ the TPL and the Quinoa builds use the same implementation. See the +section on @ref build_stages. + +@section build_system_specs Build system features, requirements, and defaults + +General requirements for configuring the TPL as well as Quinoa builds: + +- In-source builds are not allowed. + +- The default build type for both TPLs and Quinoa is `Release`. + +- Shared cmake code is in https://github.com/quinoacomputing/cmake-modules.git, + pulled in as a git submodule into the TPL build and as a git subtree into the + Quinoa build. See also the page on @ref git_submodules_subtrees. + +- The TPL build requires a Fortran, C, and a C++ compiler. + +- The Quinoa build requires only a C and a C++ compiler. + +- If unspecified, the default install directory, configured by the cmake + variable `CMAKE_INSTALL_PREFIX`, for the TPL build is + `/install/-/`, where `` is the root of the + TPL repository clone. In a recursive clone `` is `quinoa/external`. See + also the section on @ref build_nonrecursive. + +- If unspecified, the default TPL directory, configured by the cmake variable + `TPL_DIR`, for the Quinoa build is + `/external/install/-architecture>/`, where `` is the + root of the Quinoa repository clone. See also the section on @ref + build_nonrecursive. + +- For the list of TPLs searched (and if not found, built) by default, see + [/CMakeLists.txt](https://github.com/quinoacomputing/quinoa-tpl/blob/master/CMakeLists.txt), section starting with the comment line + + # Set which libraries are built/searched by default + +- MPI is required and Charm++ is built on top of MPI. + +- The default C++ standard library is _libstdc++_ for gnu compilers, and + _libc++_ for clang and Intel. + +@section build_docker Helpful docker image configurations + +You can get more examples on ways we build Quinoa by browsing the following +docker images: + +- https://github.com/quinoacomputing/quinoa/tree/master/tools/docker +- https://github.com/quinoacomputing/quinoa-tpl/tree/master/docker +- https://github.com/quinoacomputing/buildenv + +@section build_cmake Main cmake files + +The most important (top-level) files responsible for configuring the build +system are + +- [external/CMakeLists.txt](https://github.com/quinoacomputing/quinoa-tpl/blob/master/CMakeLists.txt) +- [cmake/TPLs.cmake](https://github.com/quinoacomputing/quinoa/blob/develop/cmake/TPLs.cmake) +- [src/CMakeLists.txt](https://github.com/quinoacomputing/quinoa/blob/develop/src/CMakeLists.txt) + +If you have questions not answered here, consult the above. + +@section build_feedback Feedback + +If you would like to improve this page, contact us using the links in the +footer below or submit a pull request on [github](https://github.com/quinoacomputing/quinoa). + +*/ diff --git a/doc/pages/build_system.dox b/doc/pages/build_system.dox new file mode 100644 index 00000000000..0fd5848d066 --- /dev/null +++ b/doc/pages/build_system.dox @@ -0,0 +1,113 @@ +/*! + @page build_system Internals + +@tableofcontents{xml} + +This page discusses the internals of the build system: how it works, how the +different pieces fit together, and the various ways it can be configured. This +page is intended for those who would like to understand how the build system +works and how it can be modified or extended. + +@note This page is _not_ a description of how to build the third-party +libraries or Quinoa. For various ways of building Quinoa, including +requirements, optional libraries, defaults, and build system options, see the +page on @ref build "building". + +@section build_system_overview Overview + +As section _@ref build_stages_ on the @ref build "build page" describes, Quinoa +is built in two stages: + + 1. Build third-party libraries (TPLs) + 2. Build Quinoa + +Both stages consist of the following two steps + + - Use cmake to configure the build + - Perform the build + +As the section on @ref build_nonrecursive "non-recursive clones" discusses, +some of the [cmake code](https://github.com/quinoacomputing/cmake-modules) is +abstracted away into its own git repository so that it can be effectively +shared between the two repositories: +[quinoa](https://github.com/quinoacomputing/quinoa) and +[quinoa-tpl](https://github.com/quinoacomputing/quinoa-tpl). For more details, +see also the page on @ref git_submodules_subtrees "modules". + +@section build_system_tpl Third-party-libraries build + +In a @ref build_nonrecursive "recursive clone" the main entry point of the TPL-build is [external/CMakeLists.txt](https://github.com/quinoacomputing/quinoa-tpl/blob/master/CMakeLists.txt). The TPL-build uses cmake's [external project](https://cmake.org/cmake/help/latest/module/ExternalProject.html) functionality to build the third-party libraries. + +The following main steps are taken by the TPL-cmake script to configure the build of the third-party libraries: + + - In-source builds are disallowed in [cmake/DisallowInSourceBuilds.cmake](https://github.com/quinoacomputing/cmake-modules/blob/master/DisallowInSourceBuilds.cmake). + + - The default build type is set in [cmake/BuildType.cmake](https://github.com/quinoacomputing/cmake-modules/blob/master/BuildType.cmake). This can be configured by the cmake variable `CMAKE_BUILD_TYPE`. The default is _Release_. Other valid options are described at https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html. + + - The operating system is detected in [cmake/DetectOS.cmake](https://github.com/quinoacomputing/cmake-modules/blob/master/DetectOS.cmake). This is mostly used for working around some quirks for some specific operating systems, e.g., Alpine Linux. + + - Whether a dynamically or statically linked build is performed is decided in [cmake/BuildSharedS.cmake](https://github.com/quinoacomputing/cmake-modules/blob/master/BuildShared.cmake). This can be configured by the cmake variable `BUILD_SHARED_LIBS` (on/off). The default is _off_, yielding a dynamic build (except on Crays, where the default is static). + + @warning If `BUILD_SHARED_LIBS` is configured one way for the TPL-build, it is important to set the same for the Quinoa build as well. The default is _off_ for both, yielding shared objects for the third party libraries as well as for the Quinoa build, allowing dynamic linking, which, in general is less error-prone for a small runtime cost (which is negligible compared to the number crunching cost). + + - The target build architecture is detected and configured in [cmake/TargetArch.cmake](https://github.com/quinoacomputing/cmake-modules/blob/master/TargetArch.cmake). This is used for setting the correct architecture-specific configuration for, e.g., the runtime system, Charm++. + + - The install directory in which to install all third-party libraries is configured by the `CMAKE_INSTALL_PREFIX` cmake variable. For a @ref build_nonrecursive "non-recursive clone" the default is `quinoa/external/install/-/`, e.g., `quinoa/external/install/clang-x86_64/`. If a custom location is set, the subsequent Quinoa build can be told by setting the `TPL_DIR` cmake variable to the path used as `CMAKE_INSTALL_PREFIX` for the TPL build. + + - Next the TPL cmake run detects the number of CPUs available on the build machine. This is stored in the cmake variable `PROCESSOR_COUNT` and is used to configure longer-running regression tests that need more than a few CPUs, e.g., the whole build machine. + + - Next we set a number of cmake boolean variables, named as `ENABLE_`, e.g., `ENABLE_CHARM`, `ENABLE_HDF5`, etc. These are then selectively set to _true_ if a requested executable requires them. This enables configuring the build system to only build (and only build third-partly libraries for) selected executables. On how to build only a single executable, see @ref build_specific_executables. + + @note The the default is to build all executables and their required TPLs. If you only care about a single executable, e.g., because you are looking for shorter build-types or less disk space, configuring the TPL-build using the `_ONLY` is your option. + + - After this we configure the Charm++ build: architecture, communication sub-system, SMP mode, etc. + + - Next the compilers are configured. At this time, the TPL build requires Fortran, C, and a C++ compiler. Also required is MPI, e.g., OpenMPI. The Quinoa build only requires C and C++ compilers. The cmake build echoes a detailed output to screen about the MPI wrappers and the underlying compilers configured/found. Also echoed are extra Charm++ arguments, which can be provided on top of the default ones by the cmake variable `CHARM_EXTRA_ARGS`. + + @note While Charm++ does not require MPI, since it provides its own communication layer, at this time, Quinoa _requires_ Charm++ to be built using one the MPI-backends of Charm++. This is because we use MPI-only third-party libraries (which are _not_ aware that they are running on top of Charm++), and thus MPI libraries are required. We are currently exploring how to relax this requirement, by, e.g., providing the MPI layer using Charm++'s adaptive MPI (AMPI), but this is not fully functional at this time. + + - Next are compiler-specific configuration blocks: default standard library, default compiler flags, etc. This section is also a good place to look for to find out what compiler we test, tested or at least tried to use in past. + + - This is followed by multiple configuration blocks that are specific to individual third-party libraries if enabled. In each of these block, first we try to find the library on the system by invoking cmake code reused between the TPL and the Quinoa builds. These are given in the `Find_.cmake` files that live under [cmake/BuildType.cmake](https://github.com/quinoacomputing/cmake-modules]. + + - After these TPL-specific configuration blocks, there are the calls to cmake's `ExternalProject_Add()` functions, parameterized to the given TPL. These are the sections to look at to see how an individual TPL is built, e.g., whether it uses autotools or cmake, or what it takes to install a given TPL to make suitable for Quinoa. These are also the sections that potentially apply patches that are not (yet) communicated upstream to the given TPL. + +@section build_system_quinoa Quinoa build + +In the Quinoa repository the main entry point of the Quinoa-build is [src/CMakeLists.txt](https://github.com/quinoacomputing/quinoa/blob/master/src/CMakeLists.txt). The following main steps are taken by the Quinoa-cmake script to configure the build. Many of the steps are the same (or very similar) to configuring the TPL build. See the @ref build_system_tpl for more details. + + - In-source builds are disallowed. See the @ref build_system_tpl for more details. + + - The default build type is set. This can be configured by the cmake variable `CMAKE_BUILD_TYPE`. The default is _Release_. See the @ref build_system_tpl for more details. + + - The operating system is detected. See the @ref build_system_tpl for more details. + + - Whether a dynamically or statically linked build is performed is decided. The default is dynamic linking. See the @ref build_system_tpl for more details. + + - The target build architecture is detected and configured. See the @ref build_system_tpl for more details. + + - The default TPL directory, in the cmake variable `TPL_DIR`, is set to the install directory that is the default in the cmake variable `CMAKE_INSTALL_PREFIX` in the TPL build. See the @ref build_system_tpl for more details. + + - There is an option to disable tests. The default is to enable both unit-, and regression tests. This is controlled by the cmake variable `ENABLE_TESTS`. + + - We then detect all TPLs and enable all executable targets for which TPLs are found. + + @warning At this point no TPLs are _required_. If a TPL is not found, the executable target whose requriements are not found will be disabled. This enables building only specific executables. + + - Similar to the TPL-cmake configuration, there is a detailed information to screen on the compilers: MPI wrappers and their underlying compilers. + + - There is way to pass extra arguments to the linker, configured by the cmake variable `EXTRA_LINK_ARGS`. + + - Extra compiler flags can be set by the cmake variables, `CMAKE_C_FLAGS` and `CMAKE_CXX_FLAGS`. + + @note All of Quinoa is built using a C++ compiler. At this time the C compiler is only required for detecting the system architecture and some details on the HDF5 library. + + - This is followed by compiler-specific settings and flags, e.g., enabling and disabling certain warnings for all of Quinoa. Some warnings are only locally disabled under directory `src/NoWarning/`. + +@section build_system_reated Related pages +- @ref mainpage_build "Quickstart on how to build" +- @ref git_submodules_subtrees "Third-party libraries and cmake code" +- @ref licenses "A list of all required and optional third-party libraries" +- @ref build_system "Build system internals" + +*/ diff --git a/doc/pages/11-concurrency.dox b/doc/pages/concurrency.dox similarity index 100% rename from doc/pages/11-concurrency.dox rename to doc/pages/concurrency.dox diff --git a/doc/pages/contributing.dox b/doc/pages/contributing.dox new file mode 100644 index 00000000000..6911ca72e0a --- /dev/null +++ b/doc/pages/contributing.dox @@ -0,0 +1,376 @@ +/*! + \page contributing Contributing + +@note This page discusses _how_ to contribute. The current status and the rough +direction in which we envision the development of all tools, i.e., _what_ to +contribute, are described by the @ref roadmap. + +Thank you for considering contributing to Quinoa. Please read the information +below to help make your contribution easy and effective for everyone involved. + +Following these guidelines helps to communicate that you respect the time of the +developers managing this project. In return, they will reciprocate that respect +in addressing your issue, assessing changes, and helping you finalize your pull +requests. + +@tableofcontents{xml} + +@section contributing_seek Types of contributions we are looking for + +There are many ways to contribute, from writing tutorials and HOWTOs, adding +examples, improving the documentation, submitting bug reports and feature +requests to writing code which can be incorporated into Quinoa itself. + +@subsection contributing_create Create your own tool + +One way to contribute to Quinoa is to create your own @ref mainpage_tools +"tool". A tool is the largest unit of interacting components, such as @ref +walker_main or @ref inciter_main. Creating a new tool provides the largest +degree of freedom in what and how the tool should do, what its goals are, what +equations it solves, the numerical methods of choice, etc. + +The main benefit of creating a new tool in Quinoa is to be able to build +something almost entirely new, yet still not having to start it from scratch. +This can be done by relying on the existing software infrastructure, including + +- The Charm++ runtime system and its ecosystem of libraries, allowing + distributed-memory-parallel asynchronous programming and providing automatic + load balancing, fault tolerance, and many others, to enable high performance + for small as well as large problems, + +- A CMake build system that easily incorporates third-party libraries and + enables integration of Charm++-generated code as well as MPI libraries, + +- Command-line, and input-file parsers whose grammars are written purely in C++, + allowing custom and arbitrary grammar definitions, specific to each tool, to + enable user-friendly configuration of problems, + +- Distributed parallel file I/O, with partitioners, converters, and + solution-adaptive refinement for tetrahedron meshes, + +- Automated testing infrastructure, capable of testing serial, synchronous + (e.g., MPI) parallel, and asynchronous (e.g., Charm++) parallel functions and + executables, using multiple compilers, operating systems, libraries, container + technology, and code quality analysis, + +- Beautiful, professional, and no-nonsense documentation, featuring an + expertly-designed, as-you-type search-engine, whose result looks great on any + device, including math and figures. + +In summary, if you want to start a new tool but do not want to start from +scratch, yet still want the above features (for free), you could create a new +tool in Quinoa. If you are interested, @ref resources_contact "contact us" so +we can discuss the best way to go about it. + +@subsection contributing_improve Improve an existing tool + +Another way to contribute to Quinoa is to improve an existing @ref +mainpage_tools "tool". For a detailed description on the current status and +roadmap of each tool, detailing if/where help is needed, see the @ref roadmap. + +@section contributing_issues Using the issue tracker + +__Please do NOT report security vulnerabilities in public issues!__ Instead, +please disclose responsibly by letting the [Quinoa +team](mailto:quinoa@lanl.gov?subject=Security) know upfront. We will assess the +issue as soon as possible and will give you an estimate for when we have a fix +and release available. + +The issue tracker on GitHub is the preferred channel for @ref contributing_bugs +"bug reports", @ref contributing_features "feature requests", and submitting +@ref contributing_pr "pull requests", but please __do not__ use the issue +tracker for personal support requests — use our +[Chat](https://quinoa.zulipchat.com) or [email list](https://quinoa.groups.io) +for those. + +@section contributing_bugs Bug reports + +A bug is a problem that can be demonstrated and reproduced. Good bug reports are +extremely helpful. Thanks in advance for taking the time to produce a useful bug +report. + +Guidelines for bug reports: + +1. Use the GitHub [issue + search](https://github.com/quinoacomputing/quinoa/issues) — check if + the issue has already been reported. + +2. Check if the issue has been fixed — try to reproduce it using the + HEAD of the `develop` branch. + +3. Try to see if the bug can be reproduced by any of the regression tests + — see the @ref build "build page" on how to run them. + +4. Try to reproduce the bug in `Debug` mode — this can be configured by + setting `CMAKE_BUILD_TYPE=Debug`. + +A good bug report shouldn't leave others needing to chase you down for more +information. Please try to be as detailed as possible in your report. What is +your environment? What steps will reproduce the issue? What OS experiences the +problem? What would you expect to be the outcome? All these details will help +us fix any potential bugs. + +Example: + +> Short and descriptive example bug report title +> +> A summary of the issue and the OS environment in which it occurs. If suitable, +> include the steps required to reproduce the bug: +> +> 1. This is the first step. +> 2. This is the second step. +> 3. Further steps, etc. +> +> +> Attach the full screen output of both the _TPL-cmake_ as well as the +> _Quinoa-cmake_ build configuration steps. See @ref build_stages. +> +> Attach the input file and, if relevant, the input mesh file. If the mesh is +> large, try to reproduce it with a smaller mesh. If you cannot, use our [file +> transfer service](https://transfer.lanl.gov) to send us the larger mesh and +> address the file to quinoa@lanl.gov. +> +> Attach the full screen output of the run reproducing the problem, including +> those of the Charm++ runtime system as well as the call and stack traces. +> +> Include any other information you want to share that is relevant to the issue +> being reported. This might include the lines of code that you have identified +> as causing the bug, and potential solutions. + +@subsection contributing_nondeterministic Non-deterministic bugs + +Some bugs may be non-deterministic and thus may only be triggered occasionally +while some other times the code appears to run just fine, producing correct +output. If this happens, don't panic! ;-) Such bugs are usually due to the fact +that in Charm++ (and thus in Quinoa) execution is asynchronous by default and +that the runtime system may (and likely will) schedule messages and tasks (and +thus execution) in a non-deterministic fashion (while still adhering to +correctness as specified by the programmer). However, if the programmer misses +a single path of many possible paths of execution, that is incorrect, which may +lead to data races and other bugs and thus may only appear randomly. (Which we +do all the time — that's why we have an extensive test suite.) + +Such non-deterministic bugs are a bit a harder to reproduce. Here are some +techniques that have helped us in the past trigger such bugs sooner rather than +later: + +- If the bug is reproduced in `Release` mode, see if it can also be reproduced + in `Debug` mode. + +- Build the Charm++ runtime system using @ref build_rndq "randomized message + queues". This mode increases the chances of appearance of such + non-deterministic errors. + +- Run the case (or subset of regression tests) you believe will trigger the + problem in an infinite shell loop _and at the same time_ load all CPUs of the + machine with something else. For example, do + + while ctest -j36 -R asynclogic -L migration --output-on-failure; do :; done | c++filt + + While the above is running, in another terminal window do + + make clean && make -sj36 + + The above will use 36 CPU cores and run all regression tests that contain the + string `asynclogic` in their name _and_ also exercise object migration. + If/when the problem happens, the test will produce a screen output with + demangled traces using the `c++filt` utility. + +- You can also turn on Charm++'s quiescence detection feature by passing the + `-q` command line argument to any of the Quinoa executables, which help + identify a specific subset of asynchronous-logic bugs. + +@section contributing_features Feature requests + +Feature requests are welcome. Please use the github [issue +tracker](https://github.com/quinoacomputing/quinoa/issues). + +Please take a moment and consider whether your idea fits within the @ref why +"scope, aims, and philosophy" of the project and the particular tool. Please +provide as much detail and context as possible. Also see the @ref roadmap. + +@section contributing_rules Ground rules + +Here are the basic rules that all of us follow — we expect all +contributors to do the same. + +@subsection contributing_cla Sign the contributor license agreement + +We require all contributors to sign a [contributor license +agreement](https://www.clahub.com/agreements/quinoacomputing/quinoa) (CLA). + +If you are an individual and you are sure you own the intellectual property, +then you will need to sign the above _individual_ CLA. If you work for a company +that wants to allow you to contribute your work, then you will need to sign a +_corporate_ CLA. If you would like to sign the _corporate_ CLA, please send us +an [email](mailto:quinoa@lanl.gov) so we can send it to you. Once we receive the +signed CLA, we will be able to accept your pull requests. + +__NOTE:__ Only original source code from you and other people that have signed +the CLA can be accepted into the main repository. + +__IMPORTANT__: By contributing code, you agree to license your work under +Quinoa's +[license](https://github.com/quinoacomputing/quinoa/blob/master/LICENSE). + +@subsection contributing_workflow Workflow + +We roughly follow the development model described +[here](https://nvie.com/posts/a-successful-git-branching-model/). As a +consequence, our `master` (stable) branch can lag behind our `develop` +(bleeding edge) branch. In a nutshell, we always develop new code on feature +branches, forking `develop`, and issue @ref contributing_pr "pull requests" +against branch `develop`. We only occasionally merge to `master`. + +@subsection contributing_build Build with all warnings on, using multiple compilers + +We routinely work with three compilers: clang, gnu, and intel — this helps +catching more errors, increases portability, and helps decipher more complex +error messages. Using multiple compilers are not required but recommended since +our automated testing exercises all of these compilers, and it is more +time-effective to catch errors and warnings earlier than later. + +Additionally, by default we @ref build "build Quinoa" turning on most (if not +all) compiler warnings. (Also, our continuous integration testing turns all +warnings to errors.) There are some exceptions to this rule: + +- some warnings are turned off _globally_ (these are in `src/CMakeListst.txt`) + under `compiler-specific settings` — a different list for each compiler, + and + +- we turn off some warnings _locally_, when headers of third-party libraries + and Charm++-generated code are included — these are collected under + `src/NoWarning/`. + +To ensure good code quality we do not deviate from these settings, and we ask +all contributors to do the same. + +@subsection contributing_buildall Build and test all tools before a push + +While it is possible to clone, build the dependencies for, build, and work on +@ref build_specific_executables "only a single tool", doing so may run the +risk of breaking some of the code that such a single-tool build does not use +without noticing it locally. Thus, we recommend, at least before pushing to a +GitHub branch (e.g., before a @ref contributing_pr "pull request", building +and running the tests for the _full_ Quinoa build. If something breaks, our +continuous integration will most likely catch it because they test _all_ the +tools, thus testing the full build _locally_ (before publishing your changes) +reduces the chances of such problems and saves time. + +@subsection contributing_test Run unit-, and regression tests + +For example, on a workstation with 36 CPUs, run the following in the build +directory + + # Using Charm++'s non-SMP mode: + ./charmrun +p 36 Main/unittest -v -q && ctest -j 36 --output-on-failure -LE extreme + # in SMP mode: + ./charmrun +p 34 --bind-to none Main/unittest -v -q +ppn 17 && ctest -j 36 --output-on-failure -LE extreme + +We usually exclude tests labeled as _extreme_ (which also excludes _insane_ +tests), because these would take long time, but sometimes we run those too, +because we are ... _insane_ ;-). + +See the section on @ref build_smp "building Charm++ in SMP mode" on how to +build Charm++ in non-SMP and SMP mode. + +@subsection contributing_coding Follow our priorities for writing code + +We don't really have coding guidelines. Please try not to diverge significantly +from the style of the existing code. This includes file and function definition +headers, comments, and API documentation. Also, please keep line lengths max 80 +characters. See also @ref priorities "our priorities for writing code". + +@subsection contributing_review Use reviewable.io for discussing pull requests + +Though we occasionally post comments on GitHub's feed discussing pull requests, +we have had a better experience and thus prefer using +[reviewable.io](https://reviewable.io)'s interface. It is also more featureful +and posts the review comments back to GitHub's PR page (which are still +searchable by GitHub later). + +@section contributing_pr Pull requests + +Good pull requests (PR) — patches, improvements, new features — are +a fantastic help. They should remain focused in scope and avoid containing +unrelated commits. + +@ref resources_contact "Please ask first" before embarking on any significant +PR (e.g. implementing features, refactoring code), otherwise you risk spending +a lot of time working on something that we might not want to merge in. + +@subsection contributing_new For new contributors + +If you have never created a pull request on GitHub before, [here is a great +tutorial](https://egghead.io/courses/how-to-contribute-to-an-open-source-project-on-github) +on how it works. + +The basic steps for those who are _not_ members of GitHub's [QuinoaComputing](https://github.com/quinoacomputing) organization are as follows. + +1. [Fork](https://help.github.com/en/articles/fork-a-repo) the project, clone + your fork (so it is available locally to work on), and configure remotes: + + # Clone your fork of the repo into the current directory + git clone https://github.com// + # Navigate to the newly cloned directory + cd + # Assign the original repo to a remote called "upstream" + git remote add upstream https://github.com/quinoacomputing/ + +2. If you cloned/updated a while ago, get the latest changes from upstream: + + git checkout develop + git pull upstream develop + +3. Create a new topic/feature branch (off the main project's `develop` branch) to + contain your feature, change, or fix: + + git checkout -b + +4. At this point, you are ready to make your changes or develop your feature! + Feel free to @ref resources_contact "ask for help" — everyone is a + beginner at first ;-). If a developer asks you to _rebase_ your PR (or _merge + in `develop`_), they're saying that a lot of code has changed, and that you + need to update your branch so it's easier to merge. Make sure to update, or add + to the tests when appropriate. Patches and features will not be accepted + without passing the existing tests. See also the section on @ref + contributing_test "how to run the tests". + +5. If you added or changed a feature, make sure to document it accordingly so + doxygen can generate the correct documentation. + +6. Push your topic branch up to your fork: + + git push origin + +7. Open a [pull + request](https://help.github.com/en/articles/about-pull-requests) with a + clear title and description. + +@subsection contributing_members For members of GitHub's QuinoaComputing organization + +1. Clone the repo and create a branch, forking `develop` + + git clone https://github.com/quinoacomputing/ + cd + git checkout develop + git checkout -b + +2. Make sure to update, or add to the tests when appropriate. Patches and + features will not be accepted without passing the existing tests. See also + the section on @ref contributing_test "how to run the tests". + +3. Push your topic branch up to our repo + + git push origin + +4. Once a pull request is good to go, you can tidy up your commit messages using + Git's [interactive + rebase](https://help.github.com/en/articles/about-git-rebase). + +5. Open a pull request with a clear title and description. + +@note If any of the above is unclear, please do not hesitate to @ref +resources_contact "contact us". + +*/ diff --git a/doc/pages/07-coverage.dox b/doc/pages/coverage.dox similarity index 100% rename from doc/pages/07-coverage.dox rename to doc/pages/coverage.dox diff --git a/doc/pages/10-diffeq.dox b/doc/pages/diffeq.dox similarity index 100% rename from doc/pages/10-diffeq.dox rename to doc/pages/diffeq.dox diff --git a/doc/pages/directories.dox b/doc/pages/directories.dox index 28288617150..e6935de4b0d 100644 --- a/doc/pages/directories.dox +++ b/doc/pages/directories.dox @@ -26,7 +26,8 @@ executables. It has multiple grammar definitions for Grammar definitions are defined using the [Parsing Expression Grammar Template Library (PEGTL)](https://github.com/taocpp/PEGTL) according to [Parsing -Expression Grammar (PEG)](https://en.wikipedia.org/wiki/Parsing_expression_grammar). As the PEGTL documentation describes +Expression Grammar (PEG)](https://en.wikipedia.org/wiki/Parsing_expression_grammar). +As the PEGTL documentation describes > Grammars are written as regular C++ code, created with template programming > (not template meta programming), i.e. nested template instantiations that @@ -148,6 +149,33 @@ existing equation types and adding new ones. @see @ref diffeq +@dir src/DiffEq/Beta +@brief Time integrators for stochastic differential equations based on the beta PDF + +@dir src/DiffEq/Dirichlet +@brief Time integrators for stochastic differential equations based on the Dirichlet PDF + +@dir src/DiffEq/Dissipation +@brief Time integrators for stochastic differential equations modeling the dissipation rate of turbulent kinetic energy in turbulent flows + +@dir src/DiffEq/Gamma +@brief Time integrators for stochastic differential equations based on the gamma PDF + +@dir src/DiffEq/OrnsteinUhlenbeck +@brief Time integrators for stochastic differential equations based on the Ornstein-Uhlenbeck process + +@dir src/DiffEq/Position +@brief Time integrators for stochastic differential equations modeling the stochastic particle positions in turbulent flows + +@dir src/DiffEq/SkewNormal +@brief Time integrators for stochastic differential equations based on the skew-normal PDF + +@dir src/DiffEq/Velocity +@brief Time integrators for stochastic differential equations modeling the stochastic particle velocities in turbulent flows + +@dir src/DiffEq/WrightFisher +@brief Time integrators for stochastic differential equations based on the Wright-Fisher process + @dir src/PDE @brief Partial differential equations @@ -204,7 +232,7 @@ for verification or a user-defined problem). @details This directory contains code for discretizing a system of conservation equations that govern compressible flow. The subdirectories `Physics` and -`Problem` contain various ways to the compressible flow solver with respect to +`Problem` contain various ways configure the compressible flow solver with respect to the type of physics solved (e.g., inviscid or viscous) and with respect to the type of problem solved (e.g., a predefined problem with an analytical solution for verification or a user-defined problem). @@ -215,6 +243,23 @@ for verification or a user-defined problem). @dir src/PDE/CompFlow/Problem @brief Problem configurations for compressible flow +@dir src/PDE/MultiMat +@brief Partial differential equations for compressible multi-material flow + +@details This directory contains code for discretizing a system of conservation +equations that govern compressible multi-material flow. The subdirectories +`Physics` and `Problem` contain various ways to configure the compressible +multi-material flow solver with respect to the type of physics solved (e.g., +inviscid or viscous) and with respect to the type of problem solved (e.g., a +predefined problem with an analytical solution for verification or a +user-defined problem). + +@dir src/PDE/MultiMat/Physics +@brief Physics configurations for compressible multi-material flow + +@dir src/PDE/MultiMat/Problem +@brief Problem configurations for compressible multi-material flow + @dir src/PDE/Integrate @brief Integrals of various PDE operators used in discontinuous Galerkin methods @@ -278,37 +323,37 @@ subdirectory structure relative to `src/UnitTest/tests` mirrors that of the root source directory, `src`, and contain unit test definitions for the given subdirectories mirrored. -@dir src/UnitTest/tests -@brief Unit test root +@dir tests/unit +@brief Root directory of all unit tests -@dir src/UnitTest/tests/Base +@dir tests/unit/Base @brief Unit tests for subdirectory _Base_ -@dir src/UnitTest/tests/Control +@dir tests/unit/Control @brief Unit tests for subdirectory _Control_ -@dir src/UnitTest/tests/Control/Options +@dir tests/unit/Control/Options @brief Unit tests for subdirectory _Control/Options_ -@dir src/UnitTest/tests/Control/Options +@dir tests/unit/Control/Options @brief Unit tests for subdirectory _Control/Options_ -@dir src/UnitTest/tests/Inciter +@dir tests/unit/Inciter @brief Unit tests for subdirectory _Inciter_ -@dir src/UnitTest/tests/Inciter/AMR +@dir tests/unit/Inciter/AMR @brief Unit tests for subdirectory _Inciter/AMR_ -@dir src/UnitTest/tests/IO +@dir tests/unit/IO @brief Unit tests for subdirectory _IO_ -@dir src/UnitTest/tests/LoadBalance +@dir tests/unit/LoadBalance @brief Unit tests for subdirectory _LoadBalance_ -@dir src/UnitTest/tests/Mesh +@dir tests/unit/Mesh @brief Unit tests for subdirectory _Mesh_ -@dir src/UnitTest/tests/RNG +@dir tests/unit/RNG @brief Unit tests for subdirectory _RNG_ @dir src/Particles diff --git a/doc/pages/fileconv.dox b/doc/pages/fileconv.dox new file mode 100644 index 00000000000..b6298c6f52b --- /dev/null +++ b/doc/pages/fileconv.dox @@ -0,0 +1,9 @@ +/*! + \page fileconv_main FileConv + +__Output-file converter between ROOT and ExodusII__ + +This is in the process of being absorbed into @ref meshconv_main. When that is +finished, _FileConv_ as a separate executable will be eliminated. + +*/ diff --git a/doc/pages/fileconv_cmd.dox b/doc/pages/fileconv_cmd.dox new file mode 100644 index 00000000000..37e1f7c987e --- /dev/null +++ b/doc/pages/fileconv_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page fileconv_cmd FileConv command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref fileconv_main. + +@section fileconv_cmd_list List of all command line parameters + +@section fileconv_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/12-git-submodules-subtrees.dox b/doc/pages/git-submodules-subtrees.dox similarity index 97% rename from doc/pages/12-git-submodules-subtrees.dox rename to doc/pages/git-submodules-subtrees.dox index 6a0068ab356..325d8b89113 100644 --- a/doc/pages/12-git-submodules-subtrees.dox +++ b/doc/pages/git-submodules-subtrees.dox @@ -1,5 +1,5 @@ /*! - \page git_submodules_subtrees Third-party libraries and external tools using git submodules and subtrees + \page git_submodules_subtrees Modules Quinoa uses git _submodules_ as well as git _subtrees_ to pull in third-party libraries (TPLs) and auxiliary tools. This allows easy update to a TPL's (or diff --git a/doc/pages/02-inciter.dox b/doc/pages/inciter.dox similarity index 92% rename from doc/pages/02-inciter.dox rename to doc/pages/inciter.dox index 139a5cb93f2..75c97f84543 100644 --- a/doc/pages/02-inciter.dox +++ b/doc/pages/inciter.dox @@ -31,6 +31,10 @@ codes, to large problems on large computers using Charm++'s automatic load balancing capabilities. @section inciter_pages Related pages +- @ref inciter_cmd "Command line arguments" +- @ref inciter_ctr "Control file keywords" +- @ref papers_inciter "Publications" +- @ref roadmap_inciter "Roadmap" - @ref inciter_performance "Performance" - @ref inciter_design "Software design" - @ref inciter_newscheme "How to add a new scheme" diff --git a/doc/pages/inciter_cmd.dox b/doc/pages/inciter_cmd.dox new file mode 100644 index 00000000000..cdb48bea817 --- /dev/null +++ b/doc/pages/inciter_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page inciter_cmd Inciter command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref inciter_main. + +@section inciter_cmd_list List of all command line parameters + +@section inciter_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/inciter_ctr.dox b/doc/pages/inciter_ctr.dox new file mode 100644 index 00000000000..678574d54df --- /dev/null +++ b/doc/pages/inciter_ctr.dox @@ -0,0 +1,12 @@ +/*! + @page inciter_ctr RNGTest control file keywords + +@tableofcontents{xml} + +This page documents the control file keywords of @ref inciter_main. + +@section inciter_ctr_list List of all control file keywords + +@section inciter_ctr_detail Detailed description of control file keywords + +*/ diff --git a/doc/pages/18-inciter_design.dox b/doc/pages/inciter_design.dox similarity index 100% rename from doc/pages/18-inciter_design.dox rename to doc/pages/inciter_design.dox diff --git a/doc/pages/21-inciter_newpde.dox b/doc/pages/inciter_newpde.dox similarity index 79% rename from doc/pages/21-inciter_newpde.dox rename to doc/pages/inciter_newpde.dox index f91c224ef83..2eb7649d2b0 100644 --- a/doc/pages/21-inciter_newpde.dox +++ b/doc/pages/inciter_newpde.dox @@ -23,75 +23,75 @@ tree which at this time gives @code{.ansi} . -├── CGPDE.h +├── CGPDE.hpp ├── CMakeLists.txt ├── CompFlow -│   ├── CGCompFlow.h -│   ├── DGCompFlow.h +│   ├── CGCompFlow.hpp +│   ├── DGCompFlow.hpp │   ├── Physics -│   │   ├── CGEuler.h -│   │   ├── CG.h -│   │   ├── CGNavierStokes.h -│   │   ├── DGEuler.h -│   │   ├── DG.h -│   │   └── DGNavierStokes.h +│   │   ├── CGEuler.hpp +│   │   ├── CG.hpp +│   │   ├── CGNavierStokes.hpp +│   │   ├── DGEuler.hpp +│   │   ├── DG.hpp +│   │   └── DGNavierStokes.hpp │   ├── Problem -│   │   ├── NLEnergyGrowth.h -│   │   ├── RayleighTaylor.h -│   │   ├── SedovBlastwave.h -│   │   ├── SodShocktube.h -│   │   ├── TaylorGreen.h -│   │   ├── UserDefined.h -│   │   └── VorticalFlow.h -│   └── Problem.h -├── ConfigureCompFlow.C -├── ConfigureCompFlow.h -├── ConfigureTransport.C -├── ConfigureTransport.h -├── DGPDE.h -├── FunctionPrototypes.h +│   │   ├── NLEnergyGrowth.hpp +│   │   ├── RayleighTaylor.hpp +│   │   ├── SedovBlastwave.hpp +│   │   ├── SodShocktube.hpp +│   │   ├── TaylorGreen.hpp +│   │   ├── UserDefined.hpp +│   │   └── VorticalFlow.hpp +│   └── Problem.hpp +├── ConfigureCompFlow.cpp +├── ConfigureCompFlow.hpp +├── ConfigureTransport.cpp +├── ConfigureTransport.hpp +├── DGPDE.hpp +├── FunctionPrototypes.hpp ├── Integrate -│   ├── Boundary.C -│   ├── Boundary.h -│   ├── Initialize.C -│   ├── Initialize.h -│   ├── Mass.C -│   ├── Mass.h -│   ├── Quadrature.C -│   ├── Quadrature.h +│   ├── Boundary.cpp +│   ├── Boundary.hpp +│   ├── Initialize.cpp +│   ├── Initialize.hpp +│   ├── Mass.cpp +│   ├── Mass.hpp +│   ├── Quadrature.cpp +│   ├── Quadrature.hpp │   ├── Riemann -│   │   ├── HLLC.h -│   │   ├── LaxFriedrichs.h -│   │   ├── RiemannFactory.C -│   │   ├── RiemannFactory.h -│   │   ├── RiemannSolver.h -│   │   └── Upwind.h -│   ├── Source.C -│   ├── Source.h -│   ├── Surface.C -│   ├── Surface.h -│   ├── Volume.C -│   └── Volume.h -├── Limiter.C -├── Limiter.h -├── PDEFactory.h -├── PDEStack.C -├── PDEStack.h +│   │   ├── HLLC.hpp +│   │   ├── LaxFriedrichs.hpp +│   │   ├── RiemannFactory.cpp +│   │   ├── RiemannFactory.hpp +│   │   ├── RiemannSolver.hpp +│   │   └── Upwind.hpp +│   ├── Source.cpp +│   ├── Source.hpp +│   ├── Surface.cpp +│   ├── Surface.hpp +│   ├── Volume.cpp +│   └── Volume.hpp +├── Limiter.cpp +├── Limiter.hpp +├── PDEFactory.hpp +├── PDEStack.cpp +├── PDEStack.hpp └── Transport - ├── CGTransport.h - ├── DGTransport.h + ├── CGTransport.hpp + ├── DGTransport.hpp ├── Physics - │   ├── CGAdvDiff.h - │   ├── CGAdvection.h - │   ├── CG.h - │   ├── DGAdvection.h - │   └── DG.h + │   ├── CGAdvDiff.hpp + │   ├── CGAdvection.hpp + │   ├── CG.hpp + │   ├── DGAdvection.hpp + │   └── DG.hpp ├── Problem - │   ├── CylAdvect.h - │   ├── GaussHump.h - │   ├── ShearDiff.h - │   └── SlotCyl.h - └── Problem.h + │   ├── CylAdvect.hpp + │   ├── GaussHump.hpp + │   ├── ShearDiff.hpp + │   └── SlotCyl.hpp + └── Problem.hpp 8 directories, 61 files @endcode @@ -134,7 +134,7 @@ inciter compflow depvar u # assign dependent variable 'u' to this PDE physics euler # select 'euler' as compressible flow physics policy - problem vortical_flow # select 'vortical flow` as problem policy + problem vortical_flow # select 'vortical_flow` as problem policy ... end ... @@ -144,11 +144,10 @@ end This is a snippet, configuring inciter to compute a single PDE system governing compressible flow. Every PDE type is configured via a physics and a problem policy. Here the physics is `euler`, configuring the solution of the Euler -equations for inviscid flow, and the problem is `vortical_flow`, which is a test -case derived using the method of manufactured solutions, specifying a prescribed -velocity field with vortices. Since the analytical solution is known for this -specific case, it can be used to verify the correctness of the implementation of -the algorithm and the order of accuracy of the numerical method. +equations for inviscid flow, and the problem is `vortical_flow`. Since +the analytical solution is known for this specific case, it can be used to +verify the correctness of the implementation of the algorithm and the order of +accuracy of the numerical method. The important parts of this specification are the following. @@ -163,8 +162,8 @@ above this is `euler`, but this is only the simplest choice. Every PDE has a default physics which is selected if no physics is specified. 3. The PDE must be specialized with a selected `problem` type. In the example -above this is `vortical_flow`, but this is only one choice. Every PDE has a -default problem which is selected if no problem is specified. +above this is `vortical_flow`, but this is only one choice. Every PDE has +a default problem which is selected if no problem is specified. 4. The `depvar` keyword specifies the dependent variable by a single character that is used within the input file to refer to a particular PDE system. Note @@ -191,17 +190,18 @@ important feature of the new method to be implemented, _velocity equilibrium_, assuming a single velocity field for all materials, while solving for separate material fields for mass and internal energy. Another new keyword we add is `nmat` which will be used to specify the number of materials for a -multi-material flow. New keyword definitions with their documentation go to -src/Control/Keywords.h. +multi-material flow. We also a new keyword for a problem type, +`interface_advection`. New keyword definitions with their documentation go to +src/Control/Keywords.h.pp -@subsection inciter_newpde_keyword_Keywords Control/Keywords.h +@subsection inciter_newpde_keyword_Keywords Control/Keywords.hpp @code{.diff} -git diff src/Control/Keywords.h -diff --git a/src/Control/Keywords.h b/src/Control/Keywords.h +git diff src/Control/Keywords.hpp +diff --git a/src/Control/Keywords.hpp b/src/Control/Keywords.hpp index b3fbcebd..c57c65ce 100644 ---- a/src/Control/Keywords.h -+++ b/src/Control/Keywords.h +--- a/src/Control/Keywords.hpp ++++ b/src/Control/Keywords.hpp @@ -1727,6 +1727,23 @@ struct ncomp_info { }; using ncomp = keyword< ncomp_info, TAOCPP_PEGTL_STRING("ncomp") >; @@ -285,6 +285,24 @@ index b3fbcebd..c57c65ce 100644 + } +}; +using multimat = keyword< multimat_info, TAOCPP_PEGTL_STRING("multimat") >; ++ ++struct interface_advection_info { ++ using code = Code< I >; ++ static std::string name() { return "Interface advection"; } ++ static std::string shortDescription() { return ++ "Select the interface advection test problem "; } ++ static std::string longDescription() { return ++ R"(This keyword is used to select the interface advection test problem. The ++ purpose of this test problem is to test the well-balancedness of the ++ multi-material discretization and its interface capturing ++ capabilities. Example: "problem interface_advection".)"; } ++ struct expect { ++ static std::string description() { return "string"; } ++ }; ++}; ++using interface_advection = ++ keyword< interface_advection_info, ++ TAOCPP_PEGTL_STRING("interface_advection") >; + struct rcb_info { static std::string name() { return "recursive coordinate bisection"; } @@ -292,18 +310,18 @@ index b3fbcebd..c57c65ce 100644 @endcode For more details on the various (mandatory and optional) fields of a keyword -specification struct see the documentation in src/Control/Keywords.h. +specification struct see the documentation in src/Control/Keywords.hpp. We also add the new keywords to inciter's grammar's keywords pool: -@subsection inciter_newpde_keyword_InputDeck Control/Inciter/InputDeck/InputDeck.h +@subsection inciter_newpde_keyword_InputDeck Control/Inciter/InputDeck/InputDeck.hpp @code{.diff} -git diff src/Control/Inciter/InputDeck/InputDeck.h -diff --git a/src/Control/Inciter/InputDeck/InputDeck.h b/src/Control/Inciter/InputDeck/InputDeck.h +git diff src/Control/Inciter/InputDeck/InputDeck.hpp +diff --git a/src/Control/Inciter/InputDeck/InputDeck.hpp b/src/Control/Inciter/InputDeck/InputDeck.hpp index 39eff786..155c47dc 100644 ---- a/src/Control/Inciter/InputDeck/InputDeck.h -+++ b/src/Control/Inciter/InputDeck/InputDeck.h +--- a/src/Control/Inciter/InputDeck/InputDeck.hpp ++++ b/src/Control/Inciter/InputDeck/InputDeck.hpp @@ -70,12 +70,14 @@ class InputDeck : kw::phg, kw::inciter, @@ -326,6 +344,7 @@ index 39eff786..155c47dc 100644 + kw::veleq, kw::user_defined, kw::vortical_flow, ++ kw::interface_advection, kw::pde_alpha, @endcode @@ -365,19 +384,19 @@ Next is to add a new state to the existing PDE option switch, ctr::PDE. This "option switch" is really only a fancy enum, used to store the user's choice of the PDE type in a type-safe manner, after parsing a PDE-block, e.g., `compflow ... end`, in the control file. This fancy enum is an option switch because it -inherits from tk::Toggle, defined in Control/Toggle.h, which is a generic +inherits from tk::Toggle, defined in Control/Toggle.hpp, which is a generic switch (or option), that helps associating enum values to keywords and querying one based on the other. Extending the existing PDE option switch is done by -extending the list of PDE types in `src/Control/Inciter/Options/PDE.h`: +extending the list of PDE types in `src/Control/Inciter/Options/PDE.hpp`: -@subsection inciter_newpde_keyword_PDEOptions Control/Inciter/Options/PDE.h +@subsection inciter_newpde_keyword_PDEOptions Control/Inciter/Options/PDE.hpp @code{.diff} -git diff src/Control/Inciter/Options/PDE.h -diff --git a/src/Control/Inciter/Options/PDE.h b/src/Control/Inciter/Options/PDE.h +git diff src/Control/Inciter/Options/PDE.hpp +diff --git a/src/Control/Inciter/Options/PDE.hpp b/src/Control/Inciter/Options/PDE.hpp index 2b4af067..84b6d3ff 100644 ---- a/src/Control/Inciter/Options/PDE.h -+++ b/src/Control/Inciter/Options/PDE.h +--- a/src/Control/Inciter/Options/PDE.hpp ++++ b/src/Control/Inciter/Options/PDE.hpp @@ -22,7 +22,8 @@ namespace ctr { //! Differential equation types @@ -413,16 +432,16 @@ index 2b4af067..84b6d3ff 100644 } // ctr:: @endcode -We also augment the switch used for selecting the physics policy: +We also augment the switch used for selecting the physics policy and problem list: -@subsection inciter_newpde_keyword_PhysicsOptions Control/Inciter/Options/Physics.h +@subsection inciter_newpde_keyword_PhysicsOptions Control/Inciter/Options/Physics.hpp @code{.diff} -git diff src/Control/Inciter/Options/Physics.h -diff --git a/src/Control/Inciter/Options/Physics.h b/src/Control/Inciter/Options/Physics.h +git diff src/Control/Inciter/Options/Physics.hpp +diff --git a/src/Control/Inciter/Options/Physics.hpp b/src/Control/Inciter/Options/Physics.hpp index d24ccf1d..f59e85c1 100644 ---- a/src/Control/Inciter/Options/Physics.h -+++ b/src/Control/Inciter/Options/Physics.h +--- a/src/Control/Inciter/Options/Physics.hpp ++++ b/src/Control/Inciter/Options/Physics.hpp @@ -23,7 +23,8 @@ namespace ctr { enum class PhysicsType : uint8_t { ADVECTION=0, ADVDIFF, @@ -471,6 +490,62 @@ index d24ccf1d..f59e85c1 100644 }; @endcode +@subsection inciter_newpde_keyword_ProblemOptions Control/Inciter/Options/Problem.hpp + +@code{.diff} +diff --git a/src/Control/Inciter/Options/Problem.hpp b/src/Control/Inciter/Options/Problem.hpp +index c953f28f0..b21e2c891 100644 +--- a/src/Control/Inciter/Options/Problem.hpp ++++ b/src/Control/Inciter/Options/Problem.hpp +@@ -34,7 +34,8 @@ enum class ProblemType : uint8_t { USER_DEFINED, + CYL_ADVECT, + SOD_SHOCKTUBE, + ROTATED_SOD_SHOCKTUBE, +- SEDOV_BLASTWAVE }; ++ SEDOV_BLASTWAVE, ++ INTERFACE_ADVECTION }; + + //! Pack/Unpack ProblemType: forward overload to generic enum class packer + inline void operator|( PUP::er& p, ProblemType& e ) { PUP::pup( p, e ); } +@@ -56,6 +57,7 @@ class Problem : public tk::Toggle< ProblemType > { + , kw::sod_shocktube + , kw::rotated_sod_shocktube + , kw::sedov_blastwave ++ , kw::interface_advection + >; + + //! \brief Options constructor +@@ -78,7 +80,9 @@ class Problem : public tk::Toggle< ProblemType > { + { ProblemType::SOD_SHOCKTUBE, kw::sod_shocktube::name() }, + { ProblemType::ROTATED_SOD_SHOCKTUBE, + kw::rotated_sod_shocktube::name() }, +- { ProblemType::SEDOV_BLASTWAVE, kw::sedov_blastwave::name() } }, ++ { ProblemType::SEDOV_BLASTWAVE, kw::sedov_blastwave::name() }, ++ { ProblemType::INTERFACE_ADVECTION, ++ kw::interface_advection::name() } }, + //! keywords -> Enums + { { kw::user_defined::string(), ProblemType::USER_DEFINED }, + { kw::shear_diff::string(), ProblemType::SHEAR_DIFF }, +@@ -93,7 +97,9 @@ class Problem : public tk::Toggle< ProblemType > { + { kw::rotated_sod_shocktube::string(), + ProblemType::ROTATED_SOD_SHOCKTUBE }, + { kw::sod_shocktube::string(), ProblemType::SOD_SHOCKTUBE }, +- { kw::sedov_blastwave::string(), ProblemType::SEDOV_BLASTWAVE } } ) ++ { kw::sedov_blastwave::string(), ProblemType::SEDOV_BLASTWAVE }, ++ { kw::interface_advection::string(), ++ ProblemType::INTERFACE_ADVECTION } } ) + { + brigand::for_each< keywords >( assertPolicyCodes() ); + } +@@ -136,6 +142,7 @@ class Problem : public tk::Toggle< ProblemType > { + , { ProblemType::ROTATED_SOD_SHOCKTUBE, + *kw::rotated_sod_shocktube::code() } + , { ProblemType::SEDOV_BLASTWAVE, *kw::sedov_blastwave::code() } ++ , { ProblemType::INTERFACE_ADVECTION, *kw::interface_advection::code() } + }; + }; +@endcode + @section inciter_newpde_grammar 4. Add parsing/grammar for the new keywords After adding the new keywords `multimat`, `nmat`, and `veleq`, we have to teach @@ -479,14 +554,14 @@ the input file parser to recognize them. First we augment the data structures that store data parsed associated with the new keywords. First is the number of scalar components for each PDE type: -@subsection inciter_newpde_grammar_components Control/Inciter/Components.h +@subsection inciter_newpde_grammar_components Control/Inciter/Components.hpp @code{.diff} -git diff src/Control/Inciter/Components.h -diff --git a/src/Control/Inciter/Components.h b/src/Control/Inciter/Components.h +git diff src/Control/Inciter/Components.hpp +diff --git a/src/Control/Inciter/Components.hpp b/src/Control/Inciter/Components.hpp index 64f0696f..ef51a9e9 100644 ---- a/src/Control/Inciter/Components.h -+++ b/src/Control/Inciter/Components.h +--- a/src/Control/Inciter/Components.hpp ++++ b/src/Control/Inciter/Components.hpp @@ -17,8 +17,9 @@ namespace ctr { //! Number of components of partial differential equations @@ -506,13 +581,13 @@ there can be multiple PDE systems of each type. We also create a new tuple to store data during parsing the `multimat...end` block: -@subsection inciter_newpde_grammar_types Control/Inciter/Types.h +@subsection inciter_newpde_grammar_types Control/Inciter/Types.hpp @code{.diff} -git diff src/Control/Inciter/Types.h +git diff src/Control/Inciter/Types.hpp index 4bc3bf64..65a3235f 100644 ---- a/src/Control/Inciter/Types.h -+++ b/src/Control/Inciter/Types.h +--- a/src/Control/Inciter/Types.hpp ++++ b/src/Control/Inciter/Types.hpp @@ -184,10 +184,46 @@ using CompFlowPDEParameters = tk::tuple::tagged_tuple< tag::npar, std::vector< kw::npar::info::expect::type > >; @@ -572,14 +647,14 @@ Next we add a couple of new tags (empty structs used as compile-time labels), `tag::nmat` and `tag::multimat`, behind which the parser stores the tuple ctr::MultiMatPDEParameters, and the number of materials, respectively, -@subsection inciter_newpde_grammar_tags Control/Tags.h +@subsection inciter_newpde_grammar_tags Control/Tags.hpp @code{.diff} -git diff src/Control/Tags.h -diff --git a/src/Control/Tags.h b/src/Control/Tags.h +git diff src/Control/Tags.hpp +diff --git a/src/Control/Tags.hpp b/src/Control/Tags.hpp index 188a86d0..9c0b7ec6 100644 ---- a/src/Control/Tags.h -+++ b/src/Control/Tags.h +--- a/src/Control/Tags.hpp ++++ b/src/Control/Tags.hpp @@ -102,6 +102,7 @@ struct matched {}; struct part {}; struct centroid {}; @@ -600,14 +675,14 @@ index 188a86d0..9c0b7ec6 100644 We are now ready to augment the grammar itself: -@subsection inciter_newpde_grammar_grammar Control/Inciter/InputDeck/Grammar.h +@subsection inciter_newpde_grammar_grammar Control/Inciter/InputDeck/Grammar.hpp @code{.diff} -git diff src/Control/Inciter/InputDeck/Grammar.h -diff --git a/src/Control/Inciter/InputDeck/Grammar.h b/src/Control/Inciter/InputDeck/Grammar.h +git diff src/Control/Inciter/InputDeck/Grammar.hpp +diff --git a/src/Control/Inciter/InputDeck/Grammar.hpp b/src/Control/Inciter/InputDeck/Grammar.hpp index 6b16b623..43a9bba7 100644 ---- a/src/Control/Inciter/InputDeck/Grammar.h -+++ b/src/Control/Inciter/InputDeck/Grammar.h +--- a/src/Control/Inciter/InputDeck/Grammar.hpp ++++ b/src/Control/Inciter/InputDeck/Grammar.hpp @@ -35,8 +35,9 @@ namespace deck { //! \brief Number of registered equations @@ -802,7 +877,7 @@ can surely infer _what_ is (and what is _not_) parsed in this block. Examples of what are parsed: physics and problem policies, depvar, etc., and what is _NOT_ parsed: number of (scalar) components, c.f., the definition of the transport equation grammar block, deck::transport, not listed, in -Control/Inciter/InputDeck/Grammar.h. +Control/Inciter/InputDeck/Grammar.hpp. @code{.diff} //! partitioning ... end block @@ -825,14 +900,14 @@ equations recognized by the parser. One last item is to augment the grammar messages data store to include our new warning on unspecified number of materials: -@subsection inciter_newpde_grammar_common Control/CommonGrammar.h +@subsection inciter_newpde_grammar_common Control/CommonGrammar.hpp @code{.diff} -git diff src/Control/CommonGrammar.h -diff --git a/src/Control/CommonGrammar.h b/src/Control/CommonGrammar.h +git diff src/Control/CommonGrammar.hpp +diff --git a/src/Control/CommonGrammar.hpp b/src/Control/CommonGrammar.hpp index 40c0b71d..c2de296e 100644 ---- a/src/Control/CommonGrammar.h -+++ b/src/Control/CommonGrammar.h +--- a/src/Control/CommonGrammar.hpp ++++ b/src/Control/CommonGrammar.hpp @@ -98,6 +98,7 @@ namespace grm { WRONGGAUSSIAN, //!< Wrong number of parameters configuring a PDF NEGATIVEPARAM, //!< Negative variance given configuring a Gaussian @@ -864,7 +939,7 @@ inciter multimat # configure our new PDE block for compressible multi-material flow depvar u # assign dependent variable 'u' to this PDE physics veleq # select 'euler' as compressible flow physics policy - problem vortical_flow # select 'vortical flow` as problem policy + problem interface_advection # select 'interface_advection` as problem policy nmat 3 # configure 3 materials ... end @@ -880,7 +955,7 @@ instantiated according to user configuration. Class PDEStack helps with configuring and instantiating PDE class objects from factories. There are separate factories for PDEs with continuous Galerkin (CG) and discontinuous Galerkin (DG) finite element discretizations, declared in -PDE/PDEFactory.h: `CGFactory` and `DGFactory`. These factories are associative +PDE/PDEFactory.hpp: `CGFactory` and `DGFactory`. These factories are associative containers that assign PDE class constructors to a key that uniquely identifies a given PDE system configured to a given physics and problem policy. @@ -900,19 +975,19 @@ For more details, see also the discussion in PDEStack's constructor. The following diff augments PDEStack with our newly added PDE type. -@subsection inciter_newpde_pdestack_pdestack PDE/PDEStack.C +@subsection inciter_newpde_pdestack_pdestack PDE/PDEStack.cpp @code{.diff} -git diff src/PDE/PDEStack.C -diff --git a/src/PDE/PDEStack.C b/src/PDE/PDEStack.C +git diff src/PDE/PDEStack.cpp +diff --git a/src/PDE/PDEStack.cpp b/src/PDE/PDEStack.cpp index 70036aad..af1a2de7 100644 ---- a/src/PDE/PDEStack.C -+++ b/src/PDE/PDEStack.C +--- a/src/PDE/PDEStack.cpp ++++ b/src/PDE/PDEStack.cpp @@ -17,6 +17,7 @@ - #include "ConfigureTransport.h" - #include "ConfigureCompFlow.h" -+#include "ConfigureMultiMat.h" + #include "ConfigureTransport.hpp" + #include "ConfigureCompFlow.hpp" ++#include "ConfigureMultiMat.hpp" using inciter::PDEStack; @@ -961,12 +1036,12 @@ index c2ae8d9b..76562c52 100644 --- a/src/PDE/CMakeLists.txt +++ b/src/PDE/CMakeLists.txt @@ -14,7 +14,8 @@ add_library(PDE - Integrate/Riemann/RiemannFactory.C - Limiter.C - ConfigureTransport.C -- ConfigureCompFlow.C) -+ ConfigureCompFlow.C -+ ConfigureMultiMat.C) + Integrate/Riemann/RiemannFactory.cpp + Limiter.cpp + ConfigureTransport.cpp +- ConfigureCompFlow.cpp) ++ ConfigureCompFlow.cpp ++ ConfigureMultiMat.cpp) target_include_directories(PDE PUBLIC ${QUINOA_SOURCE_DIR} @@ -977,21 +1052,21 @@ index c2ae8d9b..76562c52 100644 Finally, we add a set of new files that will implement the new PDE using DG. As an example, we also add a new physics and a couple of new problem policy classes: one for a user-defined problem and another one for a verification -problem using a vortical flow setup. +problem using a interface advection. Here are the new files and subdirectories under `src/PDE/`: @code{.ansi} -├── ConfigureMultiMat.C -├── ConfigureMultiMat.h +├── ConfigureMultiMat.cpp +├── ConfigureMultiMat.hpp ├── MultiMat -│   ├── DGMultiMat.h +│   ├── DGMultiMat.hpp │   ├── Physics -│   │   ├── DG.h -│   │   └── DGVelEq.h +│   │   ├── DG.hpp +│   │   └── DGVelEq.hpp │   ├── Problem -│   │   ├── UserDefined.h -│   │   └── VorticalFlow.h +│   │   ├── UserDefined.hpp +│   │   └── InterfaceAdvection.hpp │   └── Problem.h @endcode @@ -1014,8 +1089,8 @@ Physics configuration: Problem configuration: - @subpage inciter_newpde_userdefined_h - a new problem policy for multi-material compflow -- @subpage inciter_newpde_vorticalflow_h - - a new problem policy specialized for the vortical flow verification problem +- @subpage inciter_newpde_interfaceadvection_h - + a new problem policy specialized for the interface advection verification problem - @subpage inciter_newpde_problem_h - list of all MultiMat problem policies. diff --git a/doc/pages/21b-inciter_newpde_configuremultimat.c.dox b/doc/pages/inciter_newpde_configuremultimat.c.dox similarity index 61% rename from doc/pages/21b-inciter_newpde_configuremultimat.c.dox rename to doc/pages/inciter_newpde_configuremultimat.c.dox index 75072b6207c..e6603f47179 100644 --- a/doc/pages/21b-inciter_newpde_configuremultimat.c.dox +++ b/doc/pages/inciter_newpde_configuremultimat.c.dox @@ -1,6 +1,6 @@ /*! - \page inciter_newpde_configuremultimat_c PDE/ConfigureMultiMat.C + \page inciter_newpde_configuremultimat_c PDE/ConfigureMultiMat.cpp -@include PDE/ConfigureMultiMat.C +@include PDE/ConfigureMultiMat.cpp */ diff --git a/doc/pages/21a-inciter_newpde_configuremultimat.h.dox b/doc/pages/inciter_newpde_configuremultimat.h.dox similarity index 61% rename from doc/pages/21a-inciter_newpde_configuremultimat.h.dox rename to doc/pages/inciter_newpde_configuremultimat.h.dox index 7531be3b004..e580413d227 100644 --- a/doc/pages/21a-inciter_newpde_configuremultimat.h.dox +++ b/doc/pages/inciter_newpde_configuremultimat.h.dox @@ -1,6 +1,6 @@ /*! - \page inciter_newpde_configuremultimat_h PDE/ConfigureMultiMat.h + \page inciter_newpde_configuremultimat_h PDE/ConfigureMultiMat.hpp -@include PDE/ConfigureMultiMat.h +@include PDE/ConfigureMultiMat.hpp */ diff --git a/doc/pages/inciter_newpde_dg.h.dox b/doc/pages/inciter_newpde_dg.h.dox new file mode 100644 index 00000000000..58cfd3172c9 --- /dev/null +++ b/doc/pages/inciter_newpde_dg.h.dox @@ -0,0 +1,6 @@ +/*! + \page inciter_newpde_dg_h PDE/MultiMat/Physics/DG.hpp + +@include PDE/MultiMat/Physics/DG.hpp + +*/ diff --git a/doc/pages/21c-inciter_newpde_dgmultimat.h.dox b/doc/pages/inciter_newpde_dgmultimat.h.dox similarity index 63% rename from doc/pages/21c-inciter_newpde_dgmultimat.h.dox rename to doc/pages/inciter_newpde_dgmultimat.h.dox index 800bfe88033..06f626322a1 100644 --- a/doc/pages/21c-inciter_newpde_dgmultimat.h.dox +++ b/doc/pages/inciter_newpde_dgmultimat.h.dox @@ -1,6 +1,6 @@ /*! - \page inciter_newpde_dgmultimat_h PDE/MultiMat/DGMultiMat.h + \page inciter_newpde_dgmultimat_h PDE/MultiMat/DGMultiMat.hpp -@include PDE/MultiMat/DGMultiMat.h +@include PDE/MultiMat/DGMultiMat.hpp */ diff --git a/doc/pages/21d-inciter_newpde_dgveleq.h.dox b/doc/pages/inciter_newpde_dgveleq.h.dox similarity index 59% rename from doc/pages/21d-inciter_newpde_dgveleq.h.dox rename to doc/pages/inciter_newpde_dgveleq.h.dox index 0ae8736906d..789f02d154b 100644 --- a/doc/pages/21d-inciter_newpde_dgveleq.h.dox +++ b/doc/pages/inciter_newpde_dgveleq.h.dox @@ -1,6 +1,6 @@ /*! - \page inciter_newpde_dgveleq_h PDE/MultiMat/Physics/DGVelEq.h + \page inciter_newpde_dgveleq_h PDE/MultiMat/Physics/DGVelEq.hpp -@include PDE/MultiMat/Physics/DGVelEq.h +@include PDE/MultiMat/Physics/DGVelEq.hpp */ diff --git a/doc/pages/inciter_newpde_interfaceadvection.h.dox b/doc/pages/inciter_newpde_interfaceadvection.h.dox new file mode 100644 index 00000000000..dabd36d0ae0 --- /dev/null +++ b/doc/pages/inciter_newpde_interfaceadvection.h.dox @@ -0,0 +1,6 @@ +/*! + \page inciter_newpde_interfaceadvection_h PDE/MultiMat/Problem/InterfaceAdvection.hpp + +@include PDE/MultiMat/Problem/InterfaceAdvection.hpp + +*/ diff --git a/doc/pages/inciter_newpde_problem.h.dox b/doc/pages/inciter_newpde_problem.h.dox new file mode 100644 index 00000000000..1b1b747679c --- /dev/null +++ b/doc/pages/inciter_newpde_problem.h.dox @@ -0,0 +1,6 @@ +/*! + \page inciter_newpde_problem_h PDE/MultiMat/Problem.hpp + +@include PDE/MultiMat/Problem.hpp + +*/ diff --git a/doc/pages/21f-inciter_newpde_userdefined.h.dox b/doc/pages/inciter_newpde_userdefined.h.dox similarity index 54% rename from doc/pages/21f-inciter_newpde_userdefined.h.dox rename to doc/pages/inciter_newpde_userdefined.h.dox index 8e79e6b3dc6..3721717202e 100644 --- a/doc/pages/21f-inciter_newpde_userdefined.h.dox +++ b/doc/pages/inciter_newpde_userdefined.h.dox @@ -1,6 +1,6 @@ /*! - \page inciter_newpde_userdefined_h PDE/MultiMat/Problem/UserDefined.h + \page inciter_newpde_userdefined_h PDE/MultiMat/Problem/UserDefined.hpp -@include PDE/MultiMat/Problem/UserDefined.h +@include PDE/MultiMat/Problem/UserDefined.hpp */ diff --git a/doc/pages/20-inciter_newscheme.dox b/doc/pages/inciter_newscheme.dox similarity index 96% rename from doc/pages/20-inciter_newscheme.dox rename to doc/pages/inciter_newscheme.dox index a58dcbcd203..b1e3899a132 100644 --- a/doc/pages/20-inciter_newscheme.dox +++ b/doc/pages/inciter_newscheme.dox @@ -231,7 +231,7 @@ We create the following new files: - Inciter/alecg.ci, Charm++ interface file for ALECG, - NoWarning/alecg.decl.h and NoWarning/alecg.def.h, which help ignore compiler warnings in Charm++-generated code, and -- Inciter/ALECG.h and Inciter/ALECG.C, header and implementation of ALECG. +- Inciter/ALECG.h and Inciter/ALECG.cpp, header and implementation of ALECG. Before we discuss the details of the above new files, let's get a couple of simple things out of the way. We also need to add the new include to `Refiner.h` @@ -266,12 +266,12 @@ index 141055ec..e339b65b 100644 --- a/src/Inciter/CMakeLists.txt +++ b/src/Inciter/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(Inciter - Sorter.C - DiagCG.C -+ ALECG.C - DG.C - FluxCorrector.C - DistFCT.C + Sorter.cpp + DiagCG.cpp ++ ALECG.cpp + DG.cpp + FluxCorrector.cpp + DistFCT.cpp @@ -74,6 +75,7 @@ addCharmModule( "refiner" "Inciter" ) addCharmModule( "sorter" "Inciter" ) addCharmModule( "matcg" "Inciter" ) @@ -343,7 +343,7 @@ reducers are an excellent way to rely on the asynchronous, tree-based implementation of parallel reductions in Charm++ yet still do it on custom, arbitrarily complex data types, e.g., a hash-map that holds vectors, as long as one defines how aggregation is to be performed when merging such data. Such an -example is given in Inciter/DiagReducer.C. +example is given in Inciter/DiagReducer.cpp. @subsubsection inciter_newscheme_chare_alecg_sdag Inciter/alecg.ci -- Structured DAG @@ -379,7 +379,7 @@ will not discuss them here further. Full listings are at @section inciter_newscheme_class 5. New C++ class -Next are the newly added Inciter/ALECG.h and Inciter/ALECG.C, header and +Next are the newly added Inciter/ALECG.h and Inciter/ALECG.cpp, header and implementation of ALECG. The full listings are at @subpage inciter_newscheme_header_page and @subpage inciter_newscheme_class_page, some of @@ -387,7 +387,7 @@ whose details are discussed below, rougly in order of execution. @subsection inciter_newscheme_class_constructor ALECG::ALECG -- Constructor -@snippet Inciter/ALECG.C Constructor +@snippet Inciter/ALECG.cpp Constructor As discussed in Section @ref inciter_create on the @ref inciter_design page, the worker chare array elements, such as ALECG, are created using Charm++'s dynamic @@ -420,7 +420,7 @@ targeting `Transporter::comfinal()`. @subsection inciter_newscheme_class_comfinal Transporter::comfinal() -- Complete communication maps -@snippet Inciter/Transporter.C Discretization-specific communication maps +@snippet Inciter/Transporter.cpp Discretization-specific communication maps Though asynchronously executed, the reduction operation targeting `Transporter::comfinal()` is a global synchronization point: all chares arrive @@ -450,7 +450,7 @@ buffer on the receiving side, which would lead to corrupt data and errors. @subsection inciter_newscheme_class_setup ALECG::setup() -- Set initial conditions and compute the left hand side -@snippet Inciter/ALECG.C init and lhs +@snippet Inciter/ALECG.cpp init and lhs In the ALECG::setup() code snippet above we call ALECG::lhs() which starts by computing the own contribution of the lhs followed by sending out contributions @@ -463,7 +463,7 @@ inciter_newscheme_chare_alecg_sdag. Then @subsection inciter_newscheme_class_lhs ALECG::lhs() -- Compute own and send lhs on chare-boundary -@snippet Inciter/ALECG.C Compute own and send lhs on chare-boundary +@snippet Inciter/ALECG.cpp Compute own and send lhs on chare-boundary As the above ALECG::lhs() code snippet shows, to communicate the lhs first we check if the node communication map is empty. If so, we are running in serial @@ -476,7 +476,7 @@ which sends its arguments to chare id 'target'chare' in a point-point fashion. @subsection inciter_newscheme_class_comlhs ALECG::comlhs() -- Receive left hand side on chare boundary -@snippet Inciter/ALECG.C Receive lhs on chare-boundary +@snippet Inciter/ALECG.cpp Receive lhs on chare-boundary The above code snippet from ALECG::comlhs() shows the implementation of the receive side of the lhs communication step. The function receives two vectors: @@ -498,7 +498,7 @@ of the lhs are complete, the runtime system calls `lhsmerge`(). @subsection inciter_newscheme_class_lhsmerge ALECG::lhsmerge() -- Merge left hand side and continue -@snippet Inciter/ALECG.C Merge lhs and continue +@snippet Inciter/ALECG.cpp Merge lhs and continue When the own and communicated contributions to the lhs are in place, the communication buffer for the lhs, `ALECG::m_lhsc`, is merged into @@ -517,13 +517,13 @@ which is the first step in a time step. @subsection inciter_newscheme_class_dt ALECG::dt() -- Start time step -@snippet Inciter/ALECG.C Find the minimum dt across all PDEs integrated +@snippet Inciter/ALECG.cpp Find the minimum dt across all PDEs integrated The above code snippet from ALECG::dt() shows a `for` loop that calls the the `dt()` member function of all types of PDEs configured by the user and finds the minimum size of the time step. -@snippet Inciter/ALECG.C Advance +@snippet Inciter/ALECG.cpp Advance Once we have the time step size, we enable a couple of SDAG waits and issue a reduction to Transporter::advance() which yields the global minimum across all @@ -542,11 +542,11 @@ combines the own and received contributions then solves the system. @subsection inciter_newscheme_class_solve ALECG::solve() -- Solve, diagnostics, refine -@snippet Inciter/ALECG.C Continue after solve +@snippet Inciter/ALECG.cpp Continue after solve The above code snippet shows what happens immediately after solving the linear system on a chare. First we compute _diagnostics_, which is a catch-all phrase -for various norms and integral quantities, see Inciter/NodeDiagnostics.C for +for various norms and integral quantities, see Inciter/NodeDiagnostics.cpp for details. Note that computing diagnostics only happens every few time step, depending on user configuration. If `m_diag.compute()` returns true, diagnostics have been computed in this time step. If diagnostics have been computed, their @@ -563,7 +563,7 @@ ALECG::refine(). @subsection inciter_newscheme_class_refine ALECG::refine() -- Optionally refine mesh -@snippet Inciter/ALECG.C Refine +@snippet Inciter/ALECG.cpp Refine The above snippet shows that mesh refinement happens only at every few time step with its frequency configured by the user. If the mesh is _not_ refined, we @@ -575,7 +575,7 @@ associated data structures. @subsection inciter_newscheme_class_resize ALECG::resize() -- Resize data after mesh refinement -@snippet Inciter/ALECG.C Resize +@snippet Inciter/ALECG.cpp Resize The above snippet shows ALECG::resize() called by Refiner when it finished mesh refinement. Besides resizing the mesh-related data held locally by ALECG, e.g., @@ -653,14 +653,14 @@ will be a node-centered scheme, we assign it to use the CGPDE polymorphic interface (instead of DGPDE, which is tailored for cell-centered discretizations). -@subsection inciter_newscheme_work_PDEStack PDE/PDEStack.C +@subsection inciter_newscheme_work_PDEStack PDE/PDEStack.cpp @code{.diff} -$ git diff src/PDE/PDEStack.C -diff --git a/src/PDE/PDEStack.C b/src/PDE/PDEStack.C +$ git diff src/PDE/PDEStack.cpp +diff --git a/src/PDE/PDEStack.cpp b/src/PDE/PDEStack.cpp index 438cb5e3..9b2e14e7 100644 ---- a/src/PDE/PDEStack.C -+++ b/src/PDE/PDEStack.C +--- a/src/PDE/PDEStack.cpp ++++ b/src/PDE/PDEStack.cpp @@ -108,7 +108,9 @@ PDEStack::selectedCG() const std::vector< CGPDE > pdes; // will store instantiated PDEs @@ -685,7 +685,7 @@ Though this is not strictly necessary, we also augment the unit tests of Scheme exercising our new discretization scheme: @code{.diff} -$ git diff develop src/UnitTest/TUTSuite.h src/UnitTest/tests/Inciter/TestScheme.C +$ git diff develop src/UnitTest/TUTSuite.h src/UnitTest/tests/Inciter/TestScheme.cpp diff --git a/src/UnitTest/TUTSuite.h b/src/UnitTest/TUTSuite.h index 191b3972..dd904b02 100644 --- a/src/UnitTest/TUTSuite.h @@ -699,10 +699,10 @@ index 191b3972..dd904b02 100644 }; // Tests that must be run on PE 0 -diff --git a/src/UnitTest/tests/Inciter/TestScheme.C b/src/UnitTest/tests/Inciter/TestScheme.C +diff --git a/src/UnitTest/tests/Inciter/TestScheme.cpp b/src/UnitTest/tests/Inciter/TestScheme.cpp index 6dc48c75..e4acfce4 100644 ---- a/src/UnitTest/tests/Inciter/TestScheme.C -+++ b/src/UnitTest/tests/Inciter/TestScheme.C +--- a/src/UnitTest/tests/Inciter/TestScheme.cpp ++++ b/src/UnitTest/tests/Inciter/TestScheme.cpp @@ -84,6 +84,8 @@ void Scheme_object::test< 1 >() { ensure_equals( "Underlying type", c.which(), 1 ); inciter::Scheme d( inciter::ctr::SchemeType::DG ); diff --git a/doc/pages/20a-inciter_newscheme_alecg.ci.dox b/doc/pages/inciter_newscheme_alecg.ci.dox similarity index 100% rename from doc/pages/20a-inciter_newscheme_alecg.ci.dox rename to doc/pages/inciter_newscheme_alecg.ci.dox diff --git a/doc/pages/inciter_newscheme_class.dox b/doc/pages/inciter_newscheme_class.dox new file mode 100644 index 00000000000..73447302fc1 --- /dev/null +++ b/doc/pages/inciter_newscheme_class.dox @@ -0,0 +1,6 @@ +/*! + \page inciter_newscheme_class_page Inciter/ALECG.cpp + +@include Inciter/ALECG.cpp + +*/ diff --git a/doc/pages/inciter_newscheme_header.dox b/doc/pages/inciter_newscheme_header.dox new file mode 100644 index 00000000000..605736d591d --- /dev/null +++ b/doc/pages/inciter_newscheme_header.dox @@ -0,0 +1,6 @@ +/*! + \page inciter_newscheme_header_page Inciter/ALECG.hpp + +@include Inciter/ALECG.hpp + +*/ diff --git a/doc/pages/20b-inciter_newscheme_nowarning.dox b/doc/pages/inciter_newscheme_nowarning.dox similarity index 100% rename from doc/pages/20b-inciter_newscheme_nowarning.dox rename to doc/pages/inciter_newscheme_nowarning.dox diff --git a/doc/pages/19-inciter_performance.dox b/doc/pages/inciter_performance.dox similarity index 100% rename from doc/pages/19-inciter_performance.dox rename to doc/pages/inciter_performance.dox diff --git a/doc/pages/09-inhomogeneity.dox b/doc/pages/inhomogeneity.dox similarity index 100% rename from doc/pages/09-inhomogeneity.dox rename to doc/pages/inhomogeneity.dox diff --git a/doc/pages/13-io.dox b/doc/pages/io.dox similarity index 100% rename from doc/pages/13-io.dox rename to doc/pages/io.dox diff --git a/doc/pages/08-layout.dox b/doc/pages/layout.dox similarity index 100% rename from doc/pages/08-layout.dox rename to doc/pages/layout.dox diff --git a/doc/pages/99-licenses.dox b/doc/pages/licenses.dox similarity index 71% rename from doc/pages/99-licenses.dox rename to doc/pages/licenses.dox index 9dddb7def7c..00c47dd946c 100644 --- a/doc/pages/99-licenses.dox +++ b/doc/pages/licenses.dox @@ -1,137 +1,154 @@ /*! - \page licenses Third-party libraries, compilers, and tools + \page licenses Libraries @tableofcontents{xml} This page collects links to full verbatim texts of the licenses of all third-party libraries (TPLs), and the list of compilers and tools used by Quinoa. -@section licenses_tpl_vs_tool TPLs and external tools +An important distinction between @ref tpl_licenses and @ref tools_web is that +TPLs are libraries whose source we directly use, e.g., via include files and/or +(static and dynamic) linking, while from a tool we do not include source code +nor link its object files, only build it and use it as a separate (external) +executable. -An important distinction between TPLs and tools is that TPLs are libraries whose -source we directly use, e.g., via include files and/or (static and dynamic) -linking, while from a tool we do not include source code nor link its object -files, only build it and use it as a separate (external) executable. - -\section tpl_licenses Third-party libraries +\section tpl_licenses Third-party libraries (TPLs) \subsection charm_license The Charm++ Parallel Programming System - Required + - Searched for and if not found, built by default - Web: http://charm.cs.illinois.edu - License: @subpage charm_license_page \subsection pegtl_license The Parsing Expression Grammar Template Library - Required + - Searched for and if not found, built by default - Web: https://github.com/taocpp/PEGTL - License: @subpage pegtl_license_page \subsection tut_license C++ Template Unit Test Framework - Required + - Searched for and if not found, built by default - Web: http://mrzechonek.github.io/tut-framework - License: @subpage tut_license_page \subsection boost_license Boost C++ libraries - Required + - Searched for and if not found, built by default - Web: http://www.boost.org - License: @subpage boost_license_page \subsection pstreams_license PStreams for POSIX process Control - Required + - Searched for and if not found, built by default - Web: http://pstreams.sourceforge.net/ - License: @subpage pstreams_license_page \subsection hdf5_license The HDF5 data model - Required + - Searched for and if not found, built by default - Web: http://www.hdfgroup.org/HDF5 - License: @subpage hdf5_license_page \subsection netcdf_license The NetCDF data model - Required + - Searched for and if not found, built by default - Web: http://www.unidata.ucar.edu/downloads/netcdf/index.jsp - License: @subpage netcdf_license_page \subsection seacas_license SEACAS for storing data for finite element analyses - Required + - Searched for and if not found, built by default - Web: https://github.com/trilinos/Trilinos/tree/master/packages/seacas - License: @subpage seacas_license_page \subsection zoltan_license Zoltan for static load balancing - Required + - Searched for and if not found, built by default - Web: http://www.cs.sandia.gov/Zoltan/Zoltan.html - License: @subpage zoltan_license_page -\subsection hypre_license Hypre for linear solvers and preconditioners - - Required - - Web: https://computation.llnl.gov/projects/hypre-scalable-linear-solvers-multigrid-methods - - License: @subpage hypre_license_page - \subsection rngsselib_license RNGSSELIB for random number generation - Optional + - Searched for and if not found, built by default - Web: http://cpc.cs.qub.ac.uk/summaries/AEIT_v2_0.html - License: @subpage rngsselib_license_page \subsection testu01_license TestU01 for statistical testing of random number generators - Required + - Searched for and if not found, built by default - Web: http://www.iro.umontreal.ca/~simardr/testu01/tu01.html - License: @subpage testu01_license_page \subsection pugixml_license PugiXML for XML format reading and writing - Required + - Searched for and if not found, built by default - Web: http://pugixml.org/ - License: @subpage pugixml_license_page \subsection blas_license BLAS for basic linear algebra - Required + - Searched for and if not found, built by default - Web: http://www.netlib.org/blas - License: @subpage blas_license_page \subsection lapack_license LAPACK for linear algebra - Required + - Searched for and if not found, built by default - Web: http://www.netlib.org/lapack - License: @subpage lapack_license_page \subsection aec_license AEC for adaptive entropy coding - - Required + - Required (only with static linking) + - Searched for and if not found, built by default - Web: https://gitlab.dkrz.de/k202009/libaec - License: @subpage aec_license_page \subsection libstdcpp_license Libstdc++ for standard C++ containers and algorithms - Either libc++ or libstdc++ required + - Must be present system-wide - Web: https://gcc.gnu.org/libstdc++ - License: @subpage libstdcpp_license_page \subsection libcpp_license Libc++ for standard C++ containers and algorithms - Either libc++ or libstdc++ required + - Must be present system-wide - Web: http://libcxx.llvm.org - License: @subpage libcpp_license_page \subsection musllibc_license Musl-libc for standard C library - - Either Optional + - Optional + - Must be present system-wide - Web: https://www.musl-libc.org - License: @subpage musllibc_license_page \subsection openmpi_license OpenMPI for the message passing interface - Required + - Must be present system-wide - Web: http://www.open-mpi.org - License: @subpage openmpi_license_page \subsection mkl_license Intel Math Kernel Library for BLAS/LAPACK and random number generation - Optional + - Must be present system-wide - Web: https://software.intel.com/en-us/intel-mkl - License: @subpage mkl_license_page \subsection h5part_license H5Part for saving particle data to files - Required + - Searched for and if not found, built by default - Web: http://vis.lbl.gov/Research/H5Part - License: @subpage h5part_license_page \subsection random123_license Random123 for random number generation - Required + - Searched for and if not found, built by default - Web: http://www.thesalmons.org/john/random123/releases/latest/docs/index.html - License: @subpage random123_license_page \subsection backwardcpp_license BackwardCpp for generating backtraces - Optional + - Searched for and if not found, built by default - Web: https://github.com/bombela/backward-cpp - License: @subpage backwardcpp_license_page - Possible dependencies of BackWardCpp and their licenses: @@ -142,25 +159,29 @@ files, only build it and use it as a separate (external) executable. \subsection highwayhash_license HighwayHash for generating hashes - Required + - Searched for and if not found, built by default - Web: https://github.com/google/highwayhash - License: @subpage highwayhash_license_page \subsection root_license ROOT for saving field data for data analysis - Optional + - Not searched for by default - Web: https://root.cern.ch - License: @subpage root_license_page \subsection omega_h_license Omega_h for reading large tetrahedron meshes in parallel - Optional + - Not searched for by default - Web: https://github.com/ibaned/omega_h - License: @subpage omega_h_license_page \subsection brigand_license Brigand for template meta-programming - Required + - Searched for and if not found, built by default - Web: https://github.com/edouarda/brigand - License: @subpage brigand_license_page -
+------------------------------------- \section compiler_web Compilers @@ -176,7 +197,7 @@ files, only build it and use it as a separate (external) executable. \subsection cray_web Cray C++ compiler - Web: https://pubs.cray.com/content/S-2179/8.7/cray-c-and-c++-reference-manual -
+------------------------------------- \section tools_web Tools @@ -192,11 +213,11 @@ files, only build it and use it as a separate (external) executable. \subsection gold_web Gold for linking - Web: http://www.gnu.org/software/binutils -\subsection gcov_web Gcov for unit test coverage analysis +\subsection gcov_web Gcov for test coverage analysis - Web: https://gcc.gnu.org/onlinedocs/gcc/Gcov.html -\subsection lcov_web Lcov for unit test coverage analysis report - - Web: http://ltp.sourceforge.net/coverage/lcov.php +\subsection fastcov_web FastCov for test coverage analysis report + - Web: https://github.com/RPGillespie6/fastcov \subsection git_web Git for source code version control - Web: https://git-scm.com @@ -207,4 +228,19 @@ files, only build it and use it as a separate (external) executable. \subsection mcss_web M.CSS for improving on Doxygen output - Web: http://mcss.mosra.cz/doxygen +\subsection teamcity_web TeamCity for continuous integration + - Web: https://www.jetbrains.com/?from=quinoa + +\subsection azure_web Azure DevOps for continuous integration + - Web: https://azure.microsoft.com/en-us/services/devops + +\subsection codecov_web Codecov for test coverage analysis + - Web: https://codecov.io + +\subsection sonarqube_web SonarQube for code quality analysis + - Web: https://www.sonarqube.org + +\subsection docker_web Docker for containers and testing + - Web: https://www.docker.com + */ diff --git a/doc/pages/mainpage.dox b/doc/pages/mainpage.dox index 7bfe07cd6b7..ba738d252d1 100644 --- a/doc/pages/mainpage.dox +++ b/doc/pages/mainpage.dox @@ -1,4 +1,5 @@ -/** @mainpage Quinoa +/*! +@mainpage Quinoa @m_div{m-col-t-4 m-right-t} @@ -19,7 +20,21 @@ Our ultimate goal is to simulate large and complex engineering multiphysics problems with a production-quality code that is extensible and maintainable, using hardware resources efficiently, even for problems with _a priori_ unknown, heterogeneous, and dynamic load distribution. Read more at our @ref -why page. +why "Philosophy" page. + +@m_class{m-note m-default m-landing-news} + + @par Recently modified pages + @ref walker_main + @m_span{m-text m-dim} Jun 02, 2019 @m_endspan
+ @ref build + @m_span{m-text m-dim} Jun 02, 2019 @m_endspan
+ @ref index + @m_span{m-text m-dim} Jun 04, 2019 @m_endspan
+ @ref inciter_newpde_problem_h + @m_span{m-text m-dim} Jun 01, 2019 @m_endspan
+ @ref files + @m_span{m-text m-dim} Jun 01, 2019 @m_endspan
@section mainpage_tools Tools @@ -78,28 +93,17 @@ container](https://hub.docker.com/r/quinoacomputing/quinoa). See also - https://quinoacomputing.github.io/examples.html - https://github.com/quinoacomputing/quinoa-examples -For larger problems and computers, however, you should build from source. - -@section mainpage_directory_layout Directory layout - -@verbatim - quinoa - ├── cmake/ - CMake code, shared between github.com/quinoacomputing/quinoa-tpl and src/ - ├── doc/ - Documentation, rendered at quinoacomputing.org - ├── external/ - External packages, pulled in as submodules from github.com/quinoacomputing/quinoa-tpl - ├── src/ - Compilable sources, see quinoacomputing.org/files.html - ├── tests/ - Unit-, and regression tests - ├── tools/ - Development utilities and docker files - ├── LICENSE - Copyright and license - └── README.md - This file, rendered at github.com/quinoacomputing/quinoa -@endverbatim +For larger problems and computers, however, you should @ref build "build" from source. @section mainpage_build Build +The simplest way to build from source is to perform the following steps. For +other ways to build, see the page on @ref build "building Quinoa". + - Install prerequisites: _Debian/Ubuntu linux_ (line 1: required, line 2: recommended) apt-get install cmake gfortran gcc g++ openmpi-bin libopenmpi-dev - apt-get install gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev libhypre-dev libhdf5-dev libhdf5-openmpi-dev libhypre-dev binutils-dev flex bison python3-pygments python3-jinja2 texlive-latex-base libdw-dev + apt-get install gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev libhdf5-dev libhdf5-openmpi-dev libnetcdf-mpi-dev libbackward-dcpp-dev tao-pegtl-dev intel-mkl binutils-dev flex bison python3-pygments python3-jinja2 texlive-latex-base libdw-dev - Install prerequisites: _Mac OS X_ (line 1: required, line 2: recommended) @@ -110,18 +114,12 @@ For larger problems and computers, however, you should build from source. git clone --recurse-submodules https://github.com/quinoacomputing/quinoa.git; cd quinoa mkdir external/build; cd external/build; cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 .. && make; cd - - mkdir build; cd build; cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_BUILD_TYPE=Release ../src && make -sj8 && ./charmrun +p8 Main/unittest -v -q && ctest -j8 --output-on-failure -LE extreme + mkdir build; cd build; cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc ../src && make -sj8 && ./charmrun +p8 Main/unittest -v -q && ctest -j8 --output-on-failure -LE extreme -All executables will be under `build/Main/`. + @note The above will use 8 CPU cores to compile the code and run the tests. + You might need to adjust this to get optimal performance. -@note The above is only the simplest way to build from source and by default -some optional libraries will _not_ be built. If you are building on a different -system, you might have to experiment with your package manager a bit to get all -required @ref licenses "libraries" built. The following may help with building in -various environments: -- https://github.com/quinoacomputing/quinoa/tree/master/tools/docker -- https://github.com/quinoacomputing/quinoa-tpl/tree/master/docker -- https://github.com/quinoacomputing/buildenv +All executables will be under `build/Main/`. We roughly follow the development model described [here](http://nvie.com/posts/a-successful-git-branching-model). As a @@ -135,56 +133,38 @@ edge) branch. If you want the latest, clone with git clone --recurse-submodules --branch=develop https://github.com/quinoacomputing/quinoa.git ``` -Read more about other ways of cloning and working with [quinoa's -repositories](https://github.com/quinoacomputing) on the page detailing @ref -git_submodules_subtrees. - -@section mainpage_contributing Contribute - -Contributions and collaborators are welcome. Contact us via -[GitHub](https://github.com/quinoacomputing/quinoa), -[Email](mailto:quinoa@lanl.gov) or -[Gitter](https://gitter.im/quinoacomputing/quinoa). - -@section mainpage_authors Authors - -(in chronological order of contribution) - -1. [Jozsef Bakosi](https://github.com/jbakosi) -2. [Francisco Gonzalez](https://github.com/franjgonzalez) -3. [Brandon Rogers](https://github.com/brog2610) -4. [Christoph Junghans](https://github.com/junghans) -5. [Robert Pavel](https://github.com/rspavel) -6. [Aditya Pakki](https://github.com/adityapakki) -7. [Bob Bird](https://github.com/rfbird) -8. [Aditya Pandare](https://github.com/adityakpandare) -9. [Weizhao Li](https://github.com/WeizhaoLi2018) - -@section mainpage_resources Resources - -- Source --- https://github.com/quinoacomputing/quinoa -- Releases --- https://github.com/quinoacomputing/quinoa/releases -- Contributing --- https://www.clahub.com/agreements/quinoacomputing/quinoa -- License --- https://github.com/quinoacomputing/quinoa/blob/master/LICENSE -- Third-party libraries and licenses --- https://quinoacomputing.github.io/licenses.html -- Documentation --- https://quinoacomputing.github.io -- Web --- https://quinoacomputing.github.io -- Email --- mailto:quinoa@lanl.gov -- Gitter --- https://gitter.im/quinoacomputing/quinoa -- Philosophy --- https://quinoacomputing.github.io/why -- Papers --- https://quinoacomputing.github.io/papers -- Roadmap --- https://github.com/quinoacomputing/quinoa/issues -- Doxygen --- https://quinoacomputing.github.io -- Coverage --- https://quinoacomputing.github.io/coverage -- Codecov --- https://codecov.io/gh/quinoacomputing/quinoa/commits -- Sonarqube --- https://sonarqube.com/organizations/quinoacomputing -- Docker --- https://hub.docker.com/r/quinoacomputing/quinoa -- Azure --- https://dev.azure.com/quinoacomputing/Quinoa -- Analytics --- http://www.openhub.net/p/quinoacomputing -- Cite --- https://zenodo.org/badge/latestdoi/38454430 +@section mainpage_directory_layout Directory layout + +@verbatim + quinoa + ├── cmake/ - CMake code, shared between github.com/quinoacomputing/quinoa-tpl and src/ + ├── doc/ - Documentation, rendered at quinoacomputing.org + ├── external/ - External packages from github.com/quinoacomputing/quinoa-tpl + ├── src/ - Compilable sources, see quinoacomputing.org/files.html + ├── tests/ - Unit-, and regression tests + ├── tools/ - Development utilities and docker files + ├── LICENSE - Copyright and license + └── README.md - This file, rendered at github.com/quinoacomputing/quinoa +@endverbatim + +@section mainpage_roadmap Roadmap + +The rough directions in which each of Quinoa's tools are developed are +described by the @ref roadmap. + +@section mainpage_contributing Contributing + +Contributors and collaborators are welcome. Please read the @ref roadmap and +the @ref contributing "Contributing guide" and @ref resources_contact "contact us". @section mainpage_license License +Quinoa is certified [Open +Source](http://www.opensource.org/docs/definition.html) software. It may be +used for any purpose, including commercial purposes, at absolutely no cost. It +is distributed under the terms of the 3-clause BSD license listed below. See +also @ref resources_legal. + @include LICENSE */ diff --git a/doc/pages/05-meshconv.dox b/doc/pages/meshconv.dox similarity index 86% rename from doc/pages/05-meshconv.dox rename to doc/pages/meshconv.dox index f4a99e959b1..2e98e70f38b 100644 --- a/doc/pages/05-meshconv.dox +++ b/doc/pages/meshconv.dox @@ -19,4 +19,8 @@ meshes from and to either of the following formats: Similar to the rest of Quinoa, meshconv also uses the Charm++ runtime system, however, meshconv is currently not parallelized. +@section meshconv_pages Related pages +- @ref meshconv_cmd "Command line arguments" +- @ref roadmap_meshconv "Roadmap" + */ diff --git a/doc/pages/meshconv_cmd.dox b/doc/pages/meshconv_cmd.dox new file mode 100644 index 00000000000..8b5dc1c87a6 --- /dev/null +++ b/doc/pages/meshconv_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page meshconv_cmd MeshConv command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref meshconv_main. + +@section meshconv_cmd_list List of all command line parameters + +@section meshconv_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/06-papers.dox b/doc/pages/papers.dox similarity index 98% rename from doc/pages/06-papers.dox rename to doc/pages/papers.dox index d3005fd329c..9046e0f7c51 100644 --- a/doc/pages/06-papers.dox +++ b/doc/pages/papers.dox @@ -1,5 +1,5 @@ /*! - \page papers Papers + \page papers Publications This page collects peer-reviewed journal papers related to the algorithms implemented in Quinoa. The papers are grouped by executables. diff --git a/doc/pages/resources.dox b/doc/pages/resources.dox new file mode 100644 index 00000000000..2a805605809 --- /dev/null +++ b/doc/pages/resources.dox @@ -0,0 +1,59 @@ +/*! + \page resources Resources + +@section resources_code Code + +- Source code --- https://github.com/quinoacomputing/quinoa +- Documentation --- https://quinoacomputing.org +- GitHub organization --- https://github.com/quinoacomputing +- Roadmap -- @ref roadmap + +@section resources_releases Releases + +- Source tarballs --- https://github.com/quinoacomputing/quinoa/releases +- Docker containers with pre-built executables --- https://hub.docker.com/r/quinoacomputing/quinoa + +@section resources_legal Legal + +- License --- https://github.com/quinoacomputing/quinoa/blob/master/LICENSE +- Third-party libraries and licenses --- https://quinoacomputing.org/licenses.html + +@section resources_contributing Contributing + +- Contributing --- @ref contributing "Contributing guide" + +@section resources_quality Code quality + +- GCov --- https://quinoacomputing.org/coverage +- Codecov --- https://codecov.io/gh/quinoacomputing/quinoa/commits +- Sonarqube --- https://sonarqube.com/organizations/quinoacomputing +- Azure --- https://dev.azure.com/quinoacomputing/Quinoa +- Analytics --- http://www.openhub.net/p/quinoacomputing +- Practices --- https://bestpractices.coreinfrastructure.org/projects/2120 + +@section resources_cite Cite + +- Journal papers --- @ref papers +- Software --- https://zenodo.org/badge/latestdoi/38454430 + +@section resources_contact Contact + +- Chat --- https://quinoa.zulipchat.com +- Email list --- https://quinoa.groups.io +- LANL-team email --- mailto:quinoa@lanl.gov + +@section resources_authors Authors + +@m_class{m-note m-default m-text-center} + +[Jozsef Bakosi](https://github.com/jbakosi) - +[Bob Bird](https://github.com/rfbird) - +[Francisco Gonzalez](https://github.com/franjgonzalez) - +[Christoph Junghans](https://github.com/junghans) - +[Weizhao Li](https://github.com/WeizhaoLi2018) - +[Aditya Pakki](https://github.com/adityapakki) - +[Aditya Pandare](https://github.com/adityakpandare) - +[Robert Pavel](https://github.com/rspavel) - +[Brandon Rogers](https://github.com/brog2610) + +*/ diff --git a/doc/pages/14-rngs_input.dox b/doc/pages/rngs_input.dox similarity index 100% rename from doc/pages/14-rngs_input.dox rename to doc/pages/rngs_input.dox diff --git a/doc/pages/03-rngtest.dox b/doc/pages/rngtest.dox similarity index 84% rename from doc/pages/03-rngtest.dox rename to doc/pages/rngtest.dox index 02adf0dea0c..5950bc38973 100644 --- a/doc/pages/03-rngtest.dox +++ b/doc/pages/rngtest.dox @@ -29,6 +29,11 @@ times, independent of the time taken by the individual tests. More details on the software architecture can be found on the @ref rngtest_design page. -@section rngtest_ex Examples -\subpage rngtest_examples +@section rngtest_pages Related pages +- @ref rngtest_cmd "Command line arguments" +- @ref rngtest_ctr "Control file keywords" +- @ref roadmap_rngtest "Roadmap" +- @ref rngtest_design +- @ref rngs_input +- @ref rngtest_examples "Examples" */ diff --git a/doc/pages/rngtest_cmd.dox b/doc/pages/rngtest_cmd.dox new file mode 100644 index 00000000000..9bc27ff7b80 --- /dev/null +++ b/doc/pages/rngtest_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page rngtest_cmd RNGTest command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref rngtest_main. + +@section rngtest_cmd_list List of all command line parameters + +@section rngtest_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/rngtest_ctr.dox b/doc/pages/rngtest_ctr.dox new file mode 100644 index 00000000000..98713c33e07 --- /dev/null +++ b/doc/pages/rngtest_ctr.dox @@ -0,0 +1,12 @@ +/*! + @page rngtest_ctr RNGTest control file keywords + +@tableofcontents{xml} + +This page documents the control file keywords of @ref rngtest_main. + +@section rngtest_ctr_list List of all control file keywords + +@section rngtest_ctr_detail Detailed description of control file keywords + +*/ diff --git a/doc/pages/15-rngtest_design.dox b/doc/pages/rngtest_design.dox similarity index 100% rename from doc/pages/15-rngtest_design.dox rename to doc/pages/rngtest_design.dox diff --git a/doc/pages/roadmap.dox b/doc/pages/roadmap.dox new file mode 100644 index 00000000000..0a552510ea8 --- /dev/null +++ b/doc/pages/roadmap.dox @@ -0,0 +1,267 @@ +/*! + \page roadmap Roadmap + +This page gives an idea on the approximate directions we are heading in terms +of the near-term future development of each @ref mainpage_tools "tool". The +directions are _approximate_, because they reflect _our_ views and desires. If +you have a different one, @ref resources_contact "let's discuss it"! + +The following is a brief breakdown on the current status and a roadmap of each +tool, also detailing if/where help is needed. The tool-specific sections are +followed by more general ones, such as potential improvements to the +documentation and performance. See also the @ref contributing "contributing guide". + +@note This page discusses _what_ to contribute. _How_ to contribute is +discussed by the @ref contributing "contributing guide". + +@tableofcontents{xml} + +@section roadmap_walker Walker + +@ref walker_main is relatively mature and has been used in production for a +number of years. However, contributions are welcome in the following areas: + +- **Implement new types of stochastic differential equations** besides the ones + listed among @ref walker_equations "Walker's diffrential equations". + +- **Document** those equation types that have been implemented but not yet + documented. The implementations are under `src/DiffEq/` but not all of them + are listed on @ref walker_main "Walker's main page". "Documentation" here can + consist of as little as listing them among @ref walker_equations "Walker's differential equations", + and adding examples with their documentation to @ref walker_examples "Walker's example page". + +- **Add regression tests** for those equations that are @ref coverage_gcov + "not yet adequately tested". + +- **Perform strong-, and weak scaling studies**, similar to what produced the + figure on @ref walker_performance "Walker's performance", and if not ideal, + profile and improve performance and scalability. + +@section roadmap_inciter Inciter + +Compared to all other tools @ref inciter_main is currently receiving most of +the development work. The following areas are actively developed. Please @ref +resources_contact "contact us" if you would like to use and/or contribute to +Inciter. + +@subsection roadmap_inciter_amr Solution-adaptive mesh refinement (AMR) + +The AMR algorithm closely follows [Jacob Waltz's +paper](http://dx.doi.org/10.1002/fld.674). The algorithm is specific to +tetrahedron-only grids and, by design, yields a conforming mesh, i.e., without +hanging nodes. Tetrahedra enable automatic mesh generation for arbitrary +complex 3D computational domains and since the algorithm always yields a +conforming mesh, it can be (and _is_) independent of the underlying @ref +inciter_newscheme "discretization scheme" used to solve partial differential +equations. + +The AMR algorithm (both refinement and derefinement) is already implemented +on top of Charm++, in a distributed-memory-parallel fashion, using asynchronous +communication to ensure a conforming mesh across mesh partitions. In addition, +any of Charm++'s automatic load balancing strategies can be employed to +homogenize computational load across a simulation using object migration. + +We are currently finishing derefinement in parallel. We need to add more tests +exercising AMR, and then we will investigate and most likely improve (both +serial and parallel) performance with and without load balancing. + +@subsection roadmap_inciter_dg P-adaptive discontinuous Galerkin (DG) methods. + +We are implementing DG finite element methods for solving the equations +governing single-, and multi-material fluids using the continuum approximation. +We have already implemented 1st, 2nd, and 3rd order accurate DG methods and we +are planning to also implement a 3rd order accurate reconstructed DG method as +well. + +Using this family of DG methods, we have also implemented a solution-adaptive +algorithm to allow _automatically_ selecting the degree of the approximation +polynomial depending on the accuracy of the local numerical solution +(_p_-refinement). This allows concentrating compute resources to those parts +of the computational domain where required. Such adaptation also yields +significant load imbalances for a simulation using multiple compute nodes, +which is then remedied by turning on Charm++'s load balancing. + +We are currently researching optimal ways to define refinement criteria and +experimenting with various numerical error indicators. We are also currently +implementing a DG algorithm for multi-material compressible flows. + +@subsection roadmap_inciter_cg Continuous Galerkin (CG) methods + +We also have a CG algorithm implemented for unstructured 3D meshes that uses +continuous Galerkin finite elements and combines flux-corrected transport with +explicit Lax-Wendroff-type time stepping for the single-material Euler and +Navier-Stokes equations. + +We are _not_ currently actively working on the CG algorithm but it needs more +testing, especially with AMR, equations of state other than ideal gas, and more +@ref inciter_examples "examples" exercising more complex-geometry domains, +using inviscid and viscous flows. + +@subsection roadmap_vnv Verification and validation (V&V) + + While implementing the above algorithms (AMR, DG, and CG) we have mostly +concentrated on correctness, demonstrating design-order of accuracy for smooth +problems using manufactured solutions, and parallel scalability. To increase +confidence in the algorithms, we need to setup and document more verification +and validation cases. + +@subsection roadmap_inciter_examples Add and document more examples + +Closely related to V&V, additional +[examples](https://github.com/quinoacomputing/quinoa-examples/tree/master/inciter) +that demonstrate different capabilities of Inciter should be @ref +inciter_examples "documented". + +@subsection roadmap_inciter_tests Add regression tests + +We need to add more regression tests for those parts of the methods under +`src/PDE/` that are @ref coverage_gcov "not yet adequately tested". + +@subsection roadmap_inciter_particles Hook back up particle tracer and output + +As an experimental feature, Inciter used to have Lagrangian particles that were +simply advected with the flow being computed. Particles were generated into +each tetrahedron cell and were also communicated across partition boundaries. +Such particles can be used for a variety of purposes. Examples are +visualization tracers, representing physics that are better represented in a +Lagrangian fashion, potentially interacting with other quantities represented +on the mesh, or provide a statistical representation of unresolved-scale +(sub-grid) processes, e.g., in turbulent flows. + +This code is under `src/Particles/` and parallel particle file output is under +`src/IO/ParticleWriter.[ch]pp`, but not currently compiled and tested. It would +be great to hook these pieces of code back into Inciter so additional physics +capability can use it, e.g., a particle-in-cell solver. + +@subsection roadmap_inciter_root Incorporate RootWriter into MeshConv + +Inciter can save meshes and field output data in files that can be analyzed by +[ROOT](https://root.cern.ch). To exercise and test this functionality @ref +fileconv_main is currently used to convert data between ROOT and ExodusII +formats. However, a better way to do this is to incorporate the functionality +in FileConv to @ref meshconv_main. + +@subsection roadmap_inciter_omegah Add reading of side sets from Omega_H meshes + +Inciter can also read [Omega_H](https://github.com/SNLComputation/omega_h) mesh +files. This is implemented in `src/IO/Omega_h_MeshReader.[hc]pp`. Currently +only reading of domain elements (tetrahedra) are implemented. To make this +functionality more useful for practical purposes, sidesets and surface elements +should also be read from Omega_H files, which allow specifying boundary +conditions. + +@subsection roadmap_inciter_eos Equations of state (EOS) + +Currently, equations of state for ideal gases are implemented. It would be +great to implement some more advanced EOSs, including coupling libraries with +EOS tables. A good starting point for this is under `PDE/EoS/`. + +@subsection roadmap_inciter_fieldoutput Unified field output + +Field output in Inciter is currently implemented by collecting the computed +fields (where it is available) and passed to tk::MeshWriter, which then +asynchronously writes the files in parallel, one output stream per compute node +(which may be less than the number of CPUs or the number of work units). + +A way to improve on this is to put in code to query user input on which fields +(and possibly how: in cells or in nodes of the mesh) are to be output and +assemble the fields for tk::MeshWriter by a single class that is responsible +for only that task. This would make the code more user-friendly, more +featureful, and would also better reuse code. + +@section roadmap_rngtest RNGTest + +@ref rngtest_main is mature and can be pretty much considered complete. It can +be used to test most random number generators (RNG) from all RNG libraries that +are hooked up. Naturally, if there is a need to hook up more RNG libraries, it +would be great to also ensure that RNGTest can test them. At this point, +however, the @ref rngtest_main "existing RNGs" are sufficient for our purposes. + +@section roadmap_unittest UnitTest + +@ref unittest_main is also pretty mature and we heavily use it. There is no +real need to do more work on it. + +@section roadmap_meshconv MeshConv + +@ref meshconv_main is also pretty mature for what we have needed it so far. It +could, of course, can always be augmented with new mesh formats. Examples are +ROOT and Omega_H, both discussed above. + +------------------------------------- + +@section roadmap_doc Improve the documentation + +The web site at [quinoacomputing.org](https://quinoacomputing.org) is +automatically generated by our continuous integration server whenever new +merges to branch `develop` or `master` happen. The procedure uses +[doxygen](http://www.doxygen.nl) to parse the source code and to extract API +documentation in XML format which is then post-processed by +[m.css](https://mcss.mosra.cz/documentation/doxygen) which also adds the search +function in the upper right corner. This helps us keep the content up-to-date +with the code, but does also need some extra (added) content to describe more +detailed subjects, e.g., in the form of HOWTOs. + +The documentation could be improved both in terms of _content_ as well as +_functionality_. + +@subsection roadmap_doc_content Content + +@subsubsection roadmap_doc_content_examples Examples + +Not all existing functionality is demonstrated and documented via @ref examples +"examples". This could definitely use some extra hands and most of this does +not really require writing code. + +@subsubsection roadmap_doc_content_howtos HOWTOs + +We have a few HOWTOs that detail some specific aspects of Inciter. These are +the pages titled as _"How to add ..."_. @ref inciter_main as well as @ref +walker_main could use some additional such pages to lower the barrier of entry +for contributing to these tools. + +@subsection roadmap_doc_functionality Functionality + +@subsubsection roadmap_doc_functionality_blog Add a blog page + +It would be good to post blogs in the future. We currently do not have a +mechanism on our web site to allow for a nice list of blog posts. (Well, we +don't have blog posts either, but we have to start somewhere.) The [magnum +graphics engine's blog page](https://blog.magnum.graphics/) is a good example +of how this can be done in a way that nicely fits into the existing style of +our web site. + +@section roadmap_performance Improve performance + +For all of Quinoa's tools we have so far prioritized (1) learning how to use +the Charm++ runtime system the most optimal way, and (2) achieve good parallel +scalability (good strong and weak scaling) for large problems on large +computers. Absolute performance has been somewhat secondary. By _absolute +perfomance_ we mean on-compute-node or single-CPU performance. This latter will +definitely need some work with some potentially large (and juicy) low-hanging +fruits. This can be done by profiling first, followed by identifying, then +optimizing the hot-spots, while continuously benchmarking the changes by +comparing to (1) current/previous implementation or (2) to a highly optimized +_other_ code (or codes) implementing a similar functionality. All @ref +mainpage_tools "tools", but most importantly, @ref inciter_main and @ref +walker_main need such performance optimization help. + +@section roadmap_friendly Improve user-friendliness + +Both @ref inciter_main and @ref walker_main need some work on improving their +user-friendliness. Both parse their input file, expecting a different grammar, +configuring the numerical solution they are to compute. There is only basic +error handling during and after parsing their user input. To make them more +effective, robust, and fun to use, there is more testing necessary. For +example, one could use one of their regression test inputs, under +`tests/regression/` and randomly altering them, feed them garbage input with +wrong syntax for various parameters and see if the correct error message is +generated. + +A potentially more fun (and more rewarding) way to do this is to automate this +with [fuzz testing](https://en.wikipedia.org/wiki/Fuzzing) by setting up, e.g., +[american fuzzy lop](http://lcamtuf.coredump.cx/afl). If we could get help +setting this up and make it part of our continuous integration, that would be +outstanding! + +*/ diff --git a/doc/pages/16-statistics_output.dox b/doc/pages/statistics_output.dox similarity index 100% rename from doc/pages/16-statistics_output.dox rename to doc/pages/statistics_output.dox diff --git a/doc/pages/04-unittest.dox b/doc/pages/unittest.dox similarity index 88% rename from doc/pages/04-unittest.dox rename to doc/pages/unittest.dox index 9a846f78aa5..7b3a8bde021 100644 --- a/doc/pages/04-unittest.dox +++ b/doc/pages/unittest.dox @@ -21,4 +21,9 @@ Unit tests are written using the [C++ Template Unit Test framework](http://mrzechonek.github.io/tut-framework/). The tests are organized into directories under src/UnitTest/tests mirroring the directories of the tested code. + +@section unittest_pages Related pages +- @ref unittest_cmd "Command line arguments" +- @ref roadmap_unittest "Roadmap" + */ diff --git a/doc/pages/unittest_cmd.dox b/doc/pages/unittest_cmd.dox new file mode 100644 index 00000000000..c6b528ad613 --- /dev/null +++ b/doc/pages/unittest_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page unittest_cmd UnitTest command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref unittest_main. + +@section unittest_cmd_list List of all command line parameters + +@section unittest_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/01-walker.dox b/doc/pages/walker.dox similarity index 79% rename from doc/pages/01-walker.dox rename to doc/pages/walker.dox index 5b2c4ddd2e5..b0050512c31 100644 --- a/doc/pages/01-walker.dox +++ b/doc/pages/walker.dox @@ -113,66 +113,66 @@ diffusion, whose invariant is the joint beta distribution. For more details on the beta SDE, see [Bakosi, Ristorcelli, Exploring the beta distribution in variable-density turbulent mixing, J. Turbul, 2010](https://doi.org/10.1080/14685248.2010.510843). - For a short overview of the equation and its implementation, see - DiffEq/Beta.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/BetaCoeffPolicy.h. + DiffEq/Beta/Beta.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Beta/BetaCoeffPolicy.hpp. 2. __Diagonal Ornstein-Uhlenbeck__ --- A system of SDEs with linear drift and constant diagonal diffusion, whose invariant is the joint normal distribution. - For a short overview of the equation and its implementation, see - DiffEq/DiagOrnsteinUhlenbeck.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/DiagOrnsteinUhlenbeckCoeffPolicy.h. + DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeck.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.hpp. 3. __Ornstein-Uhlenbeck__ --- A system of SDEs with linear drift and constant diffusion, whose invariant is the joint normal distribution. - For a short overview of the equation and its implementation, see - DiffEq/OrnsteinUhlenbeck.h. + DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeck.hpp. - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/OrnsteinUhlenbeckCoeffPolicy.h. + - For coefficients policies, see DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeckCoeffPolicy.hpp. 4. __Dirichlet__ --- A system of SDEs, whose invariant is the Dirichlet distribution. For more details on the Dirichlet SDE, see [Bakosi, Ristorcelli, A Stochastic Diffusion Process for the Dirichlet Distribution, Int. J. Stoch. Anal., 2013](https://doi.org/10.1155/2013/842981). - For a short overview of the equation and its implementation, see - DiffEq/Dirichlet.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/DirichletCoeffPolicy.h. + DiffEq/Dirichlet/Dirichlet.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Dirichlet/DirichletCoeffPolicy.hpp. 5. __Generalized Dirichlet__ --- A system of SDEs, whose invariant is Lochner's generalized Dirichlet distribution. For more details on the generalized Dirichlet SDE, see [Bakosi, Ristorcelli, A Stochastic Diffusion Process for Lochner's generalized Dirichlet distribution, J. Math. Phys., 2013](https://doi.org/10.1063/1.4822416). - For a short overview of the equation and its the implementation, see - DiffEq/GeneralizedDirichlet.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/GeneralizedDirichletCoeffPolicy.h. + DiffEq/Dirichlet/GeneralizedDirichlet.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.hpp. 6. __Gamma__ --- A system of SDEs, with linear drift and linear diagonal diffusion, whose invariant is the joint gamma distribution. - For a short overview of the equation and its implementation, see - DiffEq/Gamma.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/GammaCoeffPolicy.h. + DiffEq/Gamma/Gamma.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Gamma/GammaCoeffPolicy.hpp. 7. __Skew-normal__ --- A system of SDEs, whose invariant is the joint skew-normal distribution. For more details on the skew-normal distribution, see [Azzalini, Dalla Valle, The Multivariate Skew-Normal Distribution](http://www.jstor.org/stable/2337278). - For a short overview of the equation and its implementation, see - see DiffEq/SkewNormal.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/SkewNormalCoeffPolicy.h. + see DiffEq/SkewNormal/SkewNormal.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/SkewNormal/SkewNormalCoeffPolicy.hpp. 8. __Wright-Fisher__ --- A system of SDEs, whose invariant is the Dirichlet distribution. For more details on the Wright-Fisher SDE, see [Steinrucken, et al., An explicit transition density expansion for a multi-allelic Wright–Fisher diffusion with general diploid selection, Theor. Popul. Biol., 2013](http://www.sciencedirect.com/science/article/pii/S0040580912001013). - - For the implementation, see DiffEq/WrightFisher.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/WrightFisherCoeffPolicy.h. + - For the implementation, see DiffEq/WrightFisher/WrightFisher.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/WrightFisher/WrightFisherCoeffPolicy.hpp. 9. __Number-fraction beta__ --- A system of SDEs, with linear drift and quadratic diagonal diffusion, whose invariant is the joint beta distribution. @@ -182,9 +182,9 @@ integrated, assuming that the beta variables are number, or mole-, fractions. For more details on the beta SDE, see [Bakosi, Ristorcelli, Exploring the beta distribution in variable-density turbulent mixing, J. Turbul, 2010](https://doi.org/10.1080/14685248.2010.510843). - For a short overview of the equation and its implementation, see - DiffEq/NumberFractionBeta.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/NumberFractionBetaCoeffPolicy.h. + DiffEq/Beta/NumberFractionBeta.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Beta/NumberFractionBetaCoeffPolicy.hpp. 10. __Mass-fraction beta__ --- A system of SDEs, with linear drift and quadratic diagonal diffusion, whose invariant is the joint beta distribution. The @@ -194,9 +194,9 @@ assuming that the beta variables are mass-fractions. For more details on the beta SDE, see [Bakosi, Ristorcelli, Exploring the beta distribution in variable-density turbulent mixing, J. Turbul, 2010](https://doi.org/10.1080/14685248.2010.510843). - For a short overview of the equation and its implementation, see - DiffEq/MassFractionBeta.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/MassFractionBetaCoeffPolicy.h. + DiffEq/Beta/MassFractionBeta.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Beta/MassFractionBetaCoeffPolicy.hpp. 11. __Mix number-fraction beta__ --- A system of SDEs, with linear drift and quadratic diagonal diffusion, whose invariant is the joint beta distribution. @@ -208,9 +208,9 @@ beta variables are number, or mole-, fractions. For more details on the beta SDE, see [Bakosi, Ristorcelli, Exploring the beta distribution in variable-density turbulent mixing, J. Turbul, 2010](https://doi.org/10.1080/14685248.2010.510843). - For a short overview of the equation and its implementation, see - DiffEq/MixNumberFractionBeta.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/MixNumberFractionBetaCoeffPolicy.h. + DiffEq/Beta/MixNumberFractionBeta.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Beta/MixNumberFractionBetaCoeffPolicy.hpp. 12. __Mix mass-fraction beta__ --- A system of SDEs, with linear drift and quadratic diagonal diffusion, whose invariant is the joint beta distribution. @@ -222,19 +222,21 @@ beta variables are mass-fractions. For more details on the beta SDE, see [Bakosi, Ristorcelli, Exploring the beta distribution in variable-density turbulent mixing, J. Turbul, 2010](https://doi.org/10.1080/14685248.2010.510843). - For a short overview of the equation and its implementation, see - DiffEq/MixMassFractionBeta.h. - - For initialization policies, see DiffEq/InitPolicy.h. - - For coefficients policies, see DiffEq/MixMassFractionBetaCoeffPolicy.h. - -@section walker_ex Examples -\subpage walker_examples + DiffEq/Beta/MixMassFractionBeta.hpp. + - For initialization policies, see DiffEq/InitPolicy.hpp. + - For coefficients policies, see DiffEq/Beta/MixMassFractionBetaCoeffPolicy.hpp. @section walker_pages Related pages - - @ref diffeq - - @ref concurrency - - @ref inhomogeneity - - @ref io - - @ref rngs_input - - @ref statistics_output - - @ref layout +- @ref walker_cmd "Command line arguments" +- @ref walker_ctr "Control file keywords" +- @ref papers_walker "Publications" +- @ref roadmap_walker "Roadmap" +- @ref diffeq +- @ref concurrency +- @ref inhomogeneity +- @ref io +- @ref rngs_input +- @ref statistics_output +- @ref layout +- @ref walker_examples "Examples" */ diff --git a/doc/pages/walker_cmd.dox b/doc/pages/walker_cmd.dox new file mode 100644 index 00000000000..8639f2acb9d --- /dev/null +++ b/doc/pages/walker_cmd.dox @@ -0,0 +1,12 @@ +/*! + @page walker_cmd Walker command line parameters + +@tableofcontents{xml} + +This page documents the command line parameters of @ref walker_main. + +@section walker_cmd_list List of all command line parameters + +@section walker_cmd_detail Detailed description of command line parameters + +*/ diff --git a/doc/pages/walker_ctr.dox b/doc/pages/walker_ctr.dox new file mode 100644 index 00000000000..10937afe8e9 --- /dev/null +++ b/doc/pages/walker_ctr.dox @@ -0,0 +1,12 @@ +/*! + @page walker_ctr Walker control file keywords + +@tableofcontents{xml} + +This page documents the control file keywords of @ref walker_main. + +@section walker_ctr_list List of all control file keywords + +@section walker_ctr_detail Detailed description of control file keywords + +*/ diff --git a/doc/pages/00-why.dox b/doc/pages/why.dox similarity index 97% rename from doc/pages/00-why.dox rename to doc/pages/why.dox index b6b5c81001c..605c6d2e880 100644 --- a/doc/pages/00-why.dox +++ b/doc/pages/why.dox @@ -1,8 +1,8 @@ /*! - \page why Philosophy + \page why Why -This page describes our core software engineering values and explains why we are -motivated to work on this project. Here is the TL;DR version: +This page describes our philosophy and our core software engineering values and +explains why we are motivated to work on this project. @m_div{m-col-t-4 m-right-t} @@ -33,11 +33,8 @@ We strive to intertwining physics, algorithms, and complex load balancing code, to ensure sustainability. -If you agree and would like to contribute to -or use these tools, contact us via -[GitHub](https://github.com/quinoacomputing/quinoa), -[Email](mailto:quinoa@lanl.gov) or -[Gitter](https://gitter.im/quinoacomputing/quinoa), and join us! +If you agree and would like to use or contribute to these tools, @ref +resources_contact "contact us", and join us! @m_div{m-col-t-6 m-col-m-3 m-right-t} @@ -320,7 +317,7 @@ capability, with no large separate documents to open or print. Documentation is added via editing the source itself and [looks great on any device](http://mcss.mosra.cz/doxygen/#features), including [figures](walker_example_ou.html#walker_example_ou_pdf) and -[math](_generalized_dirichlet_8h.html#details). +[math](_generalized_dirichlet_8hpp.html). @m_div{m-col-t-4 m-col-m-2 m-right-t} diff --git a/doc/quinoa.doxy b/doc/quinoa.doxy index 66d8e445020..e80de4d6b5f 100644 --- a/doc/quinoa.doxy +++ b/doc/quinoa.doxy @@ -773,10 +773,11 @@ WARN_LOGFILE = # spaces. # Note: If this tag is empty the current directory is searched. -INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../doc/pages \ - @CMAKE_CURRENT_SOURCE_DIR@/../doc/examples \ +INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../doc/examples \ @CMAKE_CURRENT_SOURCE_DIR@/../doc/licenses \ - @CMAKE_CURRENT_SOURCE_DIR@/../src/ + @CMAKE_CURRENT_SOURCE_DIR@/../src/ \ + @CMAKE_CURRENT_SOURCE_DIR@/../tests/ \ + @CMAKE_CURRENT_BINARY_DIR@/doc/pages/ # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses @@ -2413,10 +2414,14 @@ HTML_EXTRA_STYLESHEET = \ ##! M_FAVICON = @CMAKE_CURRENT_SOURCE_DIR@/../doc/images/quinoa_sum.png -##! M_LINKS_NAVBAR1 = pages namespaces annotated files -##! M_LINKS_NAVBAR2 = "
GitHub papers coverage Docker Azure" +##! M_LINKS_NAVBAR1 = why \ +##! "build Quickstart git_submodules_subtrees licenses build_system" \ +##! "Tools walker_main inciter_main rngtest_main unittest_main meshconv_main" \ +##! namespaces annotated files -##! M_PAGE_FINE_PRINT = "

Quinoa docs, part of the Quinoa project. Copyright © J. Bakosi 2012–2015, Los Alamos National Security, LLC, 2016–2018, Triad National Security, LLC, 2019. Generated on @BUILD_DATE_SIMPLE@ based on @GIT_SHA1_ONLY@ by Doxygen and m.css. Contact us via GitHub, Email or Gitter.

" +##! M_LINKS_NAVBAR2 = "resources GitHub Tarballs License roadmap contributing papers Chat Email list coverage Azure OpenHub Practices" + +##! M_PAGE_FINE_PRINT = "

Quinoa docs, part of the Quinoa project. Copyright © J. Bakosi 2012–2015, Los Alamos National Security, LLC, 2016–2018, Triad National Security, LLC, 2019. Generated on @BUILD_DATE_SIMPLE@ based on @GIT_SHA1_ONLY@ by Doxygen and m.css. Contact us via GitHub, Email or Chat.

" ALIASES += \ "m_div{1}=@xmlonly@endxmlonly" \ diff --git a/external b/external index ce6dba0a643..42fe4f97dfb 160000 --- a/external +++ b/external @@ -1 +1 @@ -Subproject commit ce6dba0a643b6cfd2e74d56f426a7516eb4b23db +Subproject commit 42fe4f97dfb43251ea5cabcf5ad96945d0e35565 diff --git a/src/Base/CMakeLists.txt b/src/Base/CMakeLists.txt index 87aefd50966..0ee209e0884 100644 --- a/src/Base/CMakeLists.txt +++ b/src/Base/CMakeLists.txt @@ -15,6 +15,7 @@ add_library(Base Writer.cpp Table.cpp Vector.cpp + StrConvUtil.cpp ChareStateCollector.cpp ) @@ -25,6 +26,7 @@ target_include_directories(Base PUBLIC ${CHARM_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/../Main ${BACKWARD_INCLUDE_DIRS} + ${BRIGAND_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH} ${PSTREAMS_INCLUDE_DIRS}) diff --git a/src/Base/Callback.hpp b/src/Base/Callback.hpp index 744ecf80d82..d6f72253e72 100644 --- a/src/Base/Callback.hpp +++ b/src/Base/Callback.hpp @@ -20,26 +20,29 @@ namespace tk { using PartitionerCallback = - tk::tuple::tagged_tuple< tag::load, CkCallback - , tag::distributed, CkCallback - , tag::refinserted, CkCallback - , tag::refined, CkCallback - >; + tk::TaggedTuple< brigand::list< + tag::load, CkCallback + , tag::distributed, CkCallback + , tag::refinserted, CkCallback + , tag::refined, CkCallback + > >; using RefinerCallback = - tk::tuple::tagged_tuple< tag::edges, CkCallback - , tag::compatibility, CkCallback - , tag::bndint, CkCallback - , tag::matched, CkCallback - , tag::refined, CkCallback - >; + tk::TaggedTuple< brigand::list< + tag::edges, CkCallback + , tag::compatibility, CkCallback + , tag::bndint, CkCallback + , tag::matched, CkCallback + , tag::refined, CkCallback + > >; using SorterCallback = - tk::tuple::tagged_tuple< tag::queried, CkCallback - , tag::responded, CkCallback - , tag::discinserted, CkCallback - , tag::workinserted, CkCallback - >; + tk::TaggedTuple< brigand::list< + tag::queried, CkCallback + , tag::responded, CkCallback + , tag::discinserted, CkCallback + , tag::workinserted, CkCallback + > >; } // tk:: diff --git a/src/Base/ChareState.hpp b/src/Base/ChareState.hpp index 30e9e02965b..0141aaf1471 100644 --- a/src/Base/ChareState.hpp +++ b/src/Base/ChareState.hpp @@ -21,14 +21,14 @@ namespace tk { //! Chare state -using ChareState = tuple::tagged_tuple< - tag::ch, std::string // chare name - , tag::id, int // thisIndex - , tag::pe, int // PE - , tag::it, uint64_t // iteration count - , tag::fn, std::string // member function name - , tag::time, tk::real // time stamp - >; +using ChareState = TaggedTuple< brigand::list< + tag::ch, std::string // chare name + , tag::id, int // thisIndex + , tag::pe, int // PE + , tag::it, uint64_t // iteration count + , tag::fn, std::string // member function name + , tag::time, tk::real // time stamp +> >; } // tk:: diff --git a/src/Base/ChareStateCollector.cpp b/src/Base/ChareStateCollector.cpp index ab6869a4a23..83556ce5336 100644 --- a/src/Base/ChareStateCollector.cpp +++ b/src/Base/ChareStateCollector.cpp @@ -28,7 +28,7 @@ void ChareStateCollector::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details Since this is a [nodeinit] routine, the runtime system executes the +//! \details Since this is a [initnode] routine, the runtime system executes the //! routine exactly once on every logical node early on in the Charm++ init //! sequence. Must be static as it is called without an object. See also: //! Section "Initializations at Program Startup" at in the Charm++ manual @@ -51,7 +51,7 @@ ChareStateCollector::insert( const std::string& ch, int id, int pe, uint64_t it, //! \param[in] fn Chare member function name // ***************************************************************************** { - m_state.push_back( ChareState{ ch, id, pe, it, fn, m_timer.dsec() } ); + m_state.push_back( ChareState{{ ch, id, pe, it, fn, m_timer.dsec() }} ); } void diff --git a/src/Base/ChareStateCollector.hpp b/src/Base/ChareStateCollector.hpp index 5e98256397d..5b766818b4a 100644 --- a/src/Base/ChareStateCollector.hpp +++ b/src/Base/ChareStateCollector.hpp @@ -36,6 +36,10 @@ class ChareStateCollector : public CBase_ChareStateCollector { //! Constructor //! \details Start timer when constructor is called explicit ChareStateCollector() : m_state(), m_timer() {} + + //! Migrate constructor + explicit ChareStateCollector( CkMigrateMessage* m ) : + CBase_ChareStateCollector( m ) {} #if defined(__clang__) #pragma clang diagnostic pop #endif @@ -50,6 +54,22 @@ class ChareStateCollector : public CBase_ChareStateCollector { //! Collect chare state void collect( bool error, CkCallback cb ); + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \note This is a Charm++ group, pup() is thus only for + //! checkpoint/restart. + void pup( PUP::er &p ) override { + p | m_state; + p | m_timer; + } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] i ChareStateCollector object reference + friend void operator|( PUP::er& p, ChareStateCollector& i ) { i.pup(p); } + //@} + private: std::vector< ChareState > m_state; //!< Chare states Timer m_timer; //!< Timer for getting time stamps diff --git a/src/Base/ContainerUtil.hpp b/src/Base/ContainerUtil.hpp index c5aec042679..d11e3270902 100644 --- a/src/Base/ContainerUtil.hpp +++ b/src/Base/ContainerUtil.hpp @@ -110,9 +110,8 @@ auto extents( const Container& map ) //! copy of a std::array< Value, 2 > is created and returned. // ***************************************************************************** { - using pair_type = typename Container::value_type; auto x = std::minmax_element( begin(map), end(map), - []( const pair_type& a, const pair_type& b ) + []( const auto& a, const auto& b ) { return a.second < b.second; } ); return {{ x.first->second, x.second->second }}; } diff --git a/src/Base/Data.hpp b/src/Base/Data.hpp index 648f419b0f3..7ae18b3b9d1 100644 --- a/src/Base/Data.hpp +++ b/src/Base/Data.hpp @@ -423,6 +423,10 @@ class Data { void fill( tk::real value ) { std::fill( begin(m_vec), end(m_vec), value ); } + //! Check if vector of unknowns is empty + bool empty() const noexcept + { return m_vec.empty(); } + //! Layout name dispatch //! \return The name of the data layout used static std::string layout() { return layout( int2type< Layout >() ); } diff --git a/src/Base/Exception.cpp b/src/Base/Exception.cpp index 6bb9c90ed74..9339ca639b8 100644 --- a/src/Base/Exception.cpp +++ b/src/Base/Exception.cpp @@ -38,7 +38,7 @@ Exception::Exception( std::string&& message, //! \param[in] file String (moved from) with the file name in which the //! exception ocurred //! \param[in] function String (moved from) containing the name of the function -// in which the exception ocurred +//! in which the exception ocurred //! \param[in] line Source code line number at which the exception ocurred //! \details While throwing exceptions is possible calling this constructor, the //! easiest and recommend way is to use the Assert, ErrChk, and Throw macros. @@ -62,8 +62,10 @@ try : s << "\n>>> Exception at " << m_file << ":" << m_line << ": " << m_func; m_message = s.str(); + #ifdef EXCEPTIONS_WRITE_TO_CERR // Uses streams (std::cerr) so it can be redirected std::cerr << ">>> Exception: " << m_message << std::endl; + #endif // Save call-trace saveTrace(); diff --git a/src/Base/Factory.hpp b/src/Base/Factory.hpp index c0bbcd8c754..96822fbe31a 100644 --- a/src/Base/Factory.hpp +++ b/src/Base/Factory.hpp @@ -15,7 +15,6 @@ #ifndef Factory_h #define Factory_h -#include #include #include "NoWarning/factory.hpp" diff --git a/src/Base/Get_Tuple.hpp b/src/Base/Get_Tuple.hpp deleted file mode 100644 index a6f26142b47..00000000000 --- a/src/Base/Get_Tuple.hpp +++ /dev/null @@ -1,64 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Base/Get_Tuple.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Define std::get(std::tuple) until C++14 - \details Define std::get(std::tuple) until C++14. When we switch to - C++14, this can go away. The code below is from - https://stackoverflow.com/a/16707966. -*/ -// ***************************************************************************** -#ifndef Get_Tuple_h -#define Get_Tuple_h - -#include -#include - -namespace tk { - -#if not defined (_LIBCPP_STD_VER) || (_LIBCPP_STD_VER <= 11) - -namespace detail { - -template -struct get_number_of_element_from_tuple_by_type_impl { - static constexpr auto value = N; -}; - -template -struct get_number_of_element_from_tuple_by_type_impl { - static constexpr auto value = N; -}; - -template -struct get_number_of_element_from_tuple_by_type_impl { - static constexpr auto value = - get_number_of_element_from_tuple_by_type_impl::value; -}; - -} // detail:: - -template -T get(const std::tuple& t) { - return std::get::value>(t); -} - -template -T& get(std::tuple& t) { - return std::get::value>(t); -} - -#else - -using std::get; - -#endif - -} // tk:: - -#endif // Get_Tuple_h diff --git a/src/Base/Has.hpp b/src/Base/Has.hpp index df9472a5ecd..fa2fb82cd82 100644 --- a/src/Base/Has.hpp +++ b/src/Base/Has.hpp @@ -12,111 +12,86 @@ #ifndef Has_h #define Has_h +#include + namespace tk { -//! \brief Detect if T defines type "Proxy" -//! \see http://stackoverflow.com/a/7235647 -template< typename T > -struct HasTypedefProxy { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(typename C::Proxy*); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines type "alias" -//! \see http://stackoverflow.com/a/7235647 -template< typename T > -struct HasTypedefAlias { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(typename C::alias*); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines type "code" -//! \see http://stackoverflow.com/a/7235647 +//! Detect if a type defines type 'alias' +template< typename, typename = std::void_t<> > +struct HasTypedef_alias : std::false_type {}; + template< typename T > -struct HasTypedefCode { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(typename C::code*); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines type "expect::type" -//! \see http://stackoverflow.com/a/7235647 +struct HasTypedef_alias< T, std::void_t< typename T::alias > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasTypedef_alias_v = HasTypedef_alias< T >::value; + + +//! Detect if a type defines type 'code' +template< typename, typename = std::void_t<> > +struct HasTypedef_code : std::false_type {}; + template< typename T > -struct HasTypedefExpectType { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(typename C::expect::type*); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines function "expect::description" -//! \see http://stackoverflow.com/a/257382 +struct HasTypedef_code< T, std::void_t< typename T::code > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasTypedef_code_v = HasTypedef_code< T >::value; + + +//! Detect if a type defines function 'expect::description()' +template< typename, typename = std::void_t<> > +struct HasFunction_expect_description : std::false_type {}; + template< typename T > -struct HasFunctionExpectDescription { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(decltype(&C::expect::description)); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines variable "expect::lower" -//! \see http://stackoverflow.com/a/257382 +struct HasFunction_expect_description< T, + std::void_t< decltype(std::declval().description()) > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasFunction_expect_description_v = + HasFunction_expect_description< T >::value; + + +//! Detect if a type defines variable 'expect::lower' +template< typename, typename = std::void_t<> > +struct HasVar_expect_lower : std::false_type {}; + template< typename T > -struct HasVarExpectLower { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(decltype(&C::expect::lower)); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines variable "expect::upper" -//! \see http://stackoverflow.com/a/257382 +struct HasVar_expect_lower< T, + std::void_t< decltype(std::declval().lower) > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasVar_expect_lower_v = HasVar_expect_lower< T >::value; + + +//! Detect if a type defines variable 'expect::upper' +template< typename, typename = std::void_t<> > +struct HasVar_expect_upper : std::false_type {}; + template< typename T > -struct HasVarExpectUpper { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(decltype(&C::expect::upper)); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; - -//! \brief Detect if T defines function "expect::choices" -//! \see http://stackoverflow.com/a/257382 +struct HasVar_expect_upper< T, + std::void_t< decltype(std::declval().upper) > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasVar_expect_upper_v = HasVar_expect_upper< T >::value; + + +//! Detect if a type defines function 'expect::choices()' +template< typename, typename = std::void_t<> > +struct HasFunction_expect_choices : std::false_type {}; + template< typename T > -struct HasFunctionExpectChoices { - private: - typedef char yes; - typedef struct { char array[2]; } no; - template static yes test(decltype(&C::expect::choices)); - template static no test(...); - public: - static const bool value = sizeof(test(nullptr)) == sizeof(yes); -}; +struct HasFunction_expect_choices< T, + std::void_t< decltype(std::declval().choices()) > > + : std::true_type {}; + +template < typename T > +inline constexpr bool HasFunction_expect_choices_v = + HasFunction_expect_choices< T >::value; } // tk:: diff --git a/src/Base/HashMapReducer.hpp b/src/Base/HashMapReducer.hpp index ab063a9c034..002312b973d 100644 --- a/src/Base/HashMapReducer.hpp +++ b/src/Base/HashMapReducer.hpp @@ -14,10 +14,10 @@ #include #include +#include #include "NoWarning/charm++.hpp" -#include "Make_unique.hpp" #include "ContainerUtil.hpp" namespace tk { @@ -40,7 +40,7 @@ serialize( const std::unordered_map< Key, T, Hash, Eq >& m ) { sizer | const_cast< std::unordered_map< Key, T, Hash, Eq >& >( m ); // Create raw character stream to store the serialized map - std::unique_ptr flatData = tk::make_unique( sizer.size() ); + std::unique_ptr flatData = std::make_unique( sizer.size() ); // Serialize map, each message will contain a map PUP::toMem packer( flatData.get() ); diff --git a/src/Base/Macro.hpp b/src/Base/Macro.hpp index 0c118892a97..16deba5ef2f 100644 --- a/src/Base/Macro.hpp +++ b/src/Base/Macro.hpp @@ -18,9 +18,6 @@ namespace tk { -//! This macro can be used to suppress compiler warning on unused variable -#define IGNORE(expr) (static_cast(expr)) - //! Start-time macro for fine-grained profiling. Put this in the beginning of //! the section of code to be profiled. #define STARTTIME \ diff --git a/src/Base/Make_unique.hpp b/src/Base/Make_unique.hpp deleted file mode 100644 index 8073cd3af34..00000000000 --- a/src/Base/Make_unique.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Base/Make_unique.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Define make_unique for unique_ptr until C++14 - \details Define make_unique for unique_ptr until C++14. When we switch to - C++14, this can go away. The code below is lifted from - http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen, generated on - 2014-01-06. -*/ -// ***************************************************************************** -#ifndef Make_unique_h -#define Make_unique_h - -#include - -namespace tk { - -// libc++ has make_unique in C++1y mode, but only for a commit later than -// r181765 (e.g., r203847 already has it), until that we'll use the one taken -// from gcc below - -#if not defined (_LIBCPP_STD_VER) || (_LIBCPP_STD_VER <= 11) - -using std::unique_ptr; -using std::remove_extent; - -template - struct _MakeUniq - { typedef unique_ptr<_Tp> __single_object; }; - -template - struct _MakeUniq<_Tp[]> - { typedef unique_ptr<_Tp[]> __array; }; - -template - struct _MakeUniq<_Tp[_Bound]> - { struct __invalid_type { }; }; - -/// std::make_unique for single objects -template - inline typename _MakeUniq<_Tp>::__single_object - make_unique(_Args&&... __args) - { return unique_ptr<_Tp>(new _Tp(std::forward<_Args>(__args)...)); } - -/// std::make_unique for arrays of unknown bound -template - inline typename _MakeUniq<_Tp>::__array - make_unique(size_t __num) - { return unique_ptr<_Tp>(new typename remove_extent<_Tp>::type[__num]()); } - -/// Disable std::make_unique for arrays of known bound -template - inline typename _MakeUniq<_Tp>::__invalid_type - make_unique(_Args&&...) = delete; - -#else - -using std::make_unique; - -#endif - -} // tk:: - -#endif // Make_unique_h diff --git a/src/Base/PUPUtil.hpp b/src/Base/PUPUtil.hpp index 19b8eb4e71d..9fbef76f414 100644 --- a/src/Base/PUPUtil.hpp +++ b/src/Base/PUPUtil.hpp @@ -13,11 +13,13 @@ #ifndef PUPUtil_h #define PUPUtil_h +#include + #include #include +#include +#include -#include "NoWarning/optional.hpp" -#include "NoWarning/variant.hpp" #include "NoWarning/pup_stl.hpp" //! Extensions to Charm++'s Pack/Unpack routines @@ -124,53 +126,52 @@ inline void operator|( PUP::er& p, std::unordered_set< Key, Hash, KeyEqual >& s ) { pup( p, s ); } -//////////////////// Serialize boost::optional //////////////////// +//////////////////// Serialize std::optional //////////////////// -//! Pack/Unpack boost::optional. +//! Pack/Unpack std::optional //! \param[in] p Charm++'s pack/unpack object -//! \param[in] o boost::optional< T > of arbitrary type T to pack/unpack +//! \param[in] o std::optional< T > of arbitrary type T to pack/unpack template< class T > -inline void pup( PUP::er& p, boost::optional< T >& o ) { +inline void pup( PUP::er& p, std::optional< T >& o ) { T underlying_value = o ? *o : T(); bool exist = o ? true : false; p | exist; p | underlying_value; - o = exist ? boost::make_optional(underlying_value) : boost::none; + o = exist ? std::make_optional(underlying_value) : std::nullopt; } -//! Pack/Unpack boost::optional. +//! Pack/Unpack std::optional //! \param[in] p Charm++'s pack/unpack object -//! \param[in] o boost::optional< T > of arbitrary type T to pack/unpack +//! \param[in] o std::optional< T > of arbitrary type T to pack/unpack template< class T > -inline void operator|( PUP::er& p, boost::optional< T >& o ) { pup( p, o ); } - -//////////////////// Serialize boost::variant //////////////////// - -// Since boost::variant (as well as std::variant) when default-constructed is -// initialized to hold a value of the first alternative of its type list, -// calling PUP that works based on a boost::visitor with a templated operator() -// would always incorrectly trigger the overload for the first type. Thus when -// PUPing a variant not only its value but its type must also be sent during -// migration. The pup operator template below achieves this by reading out not -// only the value but also its zero-based index of the type alternative that is -// currently held by the variant passed to its initializer constructor. The -// index and the variant are then PUPed and when unpacking, as an additional -// step, the variant is reconstructed using the index and the value in the -// variant. This latter is done by invoking an expansion of an initializer list, -// guaranteed to happen in order, stepping through the typelist in the variant. -// Thanks to Nils Deppe for simplifying the original version of this operation. -// See UnitTest/tests/Base/TestPUPUtil.h or Inciter::SchemeBase.h for puping a -// variant in action. - -//! Pack/Unpack helper for boost::variant +inline void operator|( PUP::er& p, std::optional< T >& o ) { pup( p, o ); } + +//////////////////// Serialize std::variant //////////////////// + +// Since std::variant when default-constructed is initialized to hold a value of +// the first alternative of its type list, calling PUP that works based on a +// std::visit with a templated operator() would always incorrectly trigger the +// overload for the first type. Thus when PUPing a variant not only its value +// but its type must also be sent during migration. The pup operator template +// below achieves this by reading out not only the value but also its zero-based +// index of the type alternative that is currently held by the variant passed to +// its initializer constructor. The index and the variant are then PUPed and +// when unpacking, as an additional step, the variant is reconstructed using the +// index and the value in the variant. This latter is done by invoking an +// expansion of an initializer list, guaranteed to happen in order, stepping +// through the typelist in the variant. Thanks to Nils Deppe for simplifying +// the original version of this operation. See UnitTest/tests/Base/TestPUPUtil.h +// or Inciter::SchemeBase.h for puping a variant in action. + +//! Pack/Unpack helper for std::variant //! \param[in,out] index Counter (location) for type in variant //! \param[in] send_index Target counter (location) for type in variant //! \param[in] p Charm++'s pack/unpack object -//! \param[in] var boost::variant< Ts... > of arbitrary types to pack/unpack +//! \param[in] var std::variant< Ts... > of arbitrary types to pack/unpack template -char pup_helper( int& index, - const int send_index, +char pup_helper( std::size_t& index, + const std::size_t send_index, PUP::er& p, - boost::variant& var ) + std::variant& var ) { if (index == send_index) { if (p.isUnpacking()) { @@ -178,31 +179,30 @@ char pup_helper( int& index, p | t; var = std::move(t); } else { - p | boost::get(var); + p | std::get(var); } } index++; return '0'; } -//! Pack/Unpack boost::variant +//! Pack/Unpack std::variant //! \param[in] p Charm++'s pack/unpack object -//! \param[in] var boost::variant< Ts... > of arbitrary types to pack/unpack +//! \param[in] var std::variant< Ts... > of arbitrary types to pack/unpack template -void pup(PUP::er& p, boost::variant& var) { - // cppcheck-suppress variableScope - int index = 0; - int send_index = var.which(); +void pup(PUP::er& p, std::variant& var) { + std::size_t index = 0; + auto send_index = var.index(); p | send_index; (void)std::initializer_list{ pup_helper(index, send_index, p, var)...}; } -//! Pack/Unpack boost::variant +//! Pack/Unpack std::variant //! \param[in] p Charm++'s pack/unpack object -//! \param[in] d boost::variant< Ts... > of arbitrary types to pack/unpack +//! \param[in] d std::variant< Ts... > of arbitrary types to pack/unpack template -inline void operator|(PUP::er& p, boost::variant& d) { +inline void operator|(PUP::er& p, std::variant& d) { pup(p, d); } diff --git a/src/Base/Print.hpp b/src/Base/Print.hpp index 155f7d8f82c..da3626f001f 100644 --- a/src/Base/Print.hpp +++ b/src/Base/Print.hpp @@ -33,6 +33,7 @@ #include "Exception.hpp" #include "Has.hpp" #include "ChareState.hpp" +#include "StrConvUtil.hpp" namespace tk { @@ -449,6 +450,24 @@ class Print { } } + //! Print version information + template< Style s = VERBOSE > + void version( const std::string& executable, + const std::string& ver, + const std::string& commit, + const std::string& copyright ) const + { + stream() << m_version_fmt % executable % ver % commit % copyright; + } + + //! Print license information + template< Style s = VERBOSE > + void license( const std::string& executable, + const std::string& lic ) const + { + stream() << m_license_fmt % executable % lic; + } + //! Print lower and upper bounds for a keyword if defined template< Style s = VERBOSE, typename Info > void bounds( const Info& info ) const { @@ -535,7 +554,7 @@ class Print { explicit echoPolicies( const Print* const host ) : m_host( host ) {} //! Function call operator templated on the type that echos a policy template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); // Print policy code - policy name m_host->raw( m_host->m_item_indent + " " + @@ -773,52 +792,14 @@ class Print { mutable format m_item_widename_value_fmt = format("%s%-75s : %s\n"); mutable format m_part_underline_fmt = format(" %|=68|\n"); mutable format m_section_underline_fmt = format("%s%s\n"); + mutable format m_version_fmt = + format("\nQuinoa::%s, version %s (SHA1: %s)\n%s\n\n"); + mutable format m_license_fmt = format("\nQuinoa::%s\n\n%s\n\n"); // Stream objects std::stringstream m_null; //!< Default verbose stream std::ostream& m_stream; //!< Verbose stream std::ostream& m_qstream; //!< Quiet stream - - private: - //! \brief Clean up whitespaces and format a long string into multiple lines - //! \param[in] str String to format - //! \param[in] name String to insert before string to output - //! \param[in] indent String to use as identation - //! \param[in] width Width in characters to insert newlines for output - //! \see http://stackoverflow.com/a/6892562 - //! \see http://stackoverflow.com/a/8362145 - // TODO A line longer than 'width' will cause a hang! - std::string splitLines( std::string str, - std::string indent, - const std::string& name = "", - std::size_t width = 80 ) const { - // remove form feeds, line feeds, carriage returns, horizontal tabs, - // vertical tabs, see http://en.cppreference.com/w/cpp/string/byte/isspace - str.erase( - std::remove_if( str.begin(), str.end(), - []( char x ){ return std::isspace( x ) && x != ' '; } ), - str.end() ); - // remove duplicate spaces - str.erase( - std::unique( str.begin(), str.end(), - []( char a, char b ){ return a == b && a == ' '; } ), - str.end() ); - // format str to 'width'-character-long lines with indent - str.insert( 0, indent + name ); - std::size_t currIndex = width - 1; - while ( currIndex < str.length() ) { - const std::string whitespace = " "; - currIndex = str.find_last_of( whitespace, currIndex + 1 ); - if ( currIndex == std::string::npos ) break; - currIndex = str.find_last_not_of( whitespace, currIndex ); - if ( currIndex == std::string::npos ) break; - auto sizeToElim = - str.find_first_not_of( whitespace, currIndex + 1 ) - currIndex - 1; - str.replace( currIndex + 1, sizeToElim , "\n" + indent ); - currIndex += width + indent.length() + 1; - } - return str; - } }; } // tk:: diff --git a/src/Base/ProcessControl.cpp b/src/Base/ProcessControl.cpp index 72aee43d8af..0561a8d2f5a 100644 --- a/src/Base/ProcessControl.cpp +++ b/src/Base/ProcessControl.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file src/Base/ProcessControl.h + \file src/Base/ProcessControl.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/src/Base/Progress.hpp b/src/Base/Progress.hpp index 7ff27234ce6..006344d645f 100644 --- a/src/Base/Progress.hpp +++ b/src/Base/Progress.hpp @@ -41,8 +41,8 @@ class Progress { //! expected per sub-task explicit Progress( const tk::Print& print, bool feedback, - std::array< std::string, N >&& prefix, - std::array< std::string, N >&& legend, + const std::array< std::string, N >& prefix, + const std::array< std::string, N >& legend, std::array< int, N >&& max = std::array< int, N >() ) : m_print( print ), m_feedback( feedback ), diff --git a/src/Base/StrConvUtil.cpp b/src/Base/StrConvUtil.cpp new file mode 100644 index 00000000000..7b18dfe9e55 --- /dev/null +++ b/src/Base/StrConvUtil.cpp @@ -0,0 +1,66 @@ +// ***************************************************************************** +/*! + \file src/Base/StrConvUtil.cpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief String conversion utilities + \details Various string conversion utilities. +*/ +// ***************************************************************************** + +#include +#include +#include + +#include "StrConvUtil.hpp" + +std::string +tk::splitLines( std::string str, + std::string indent, + const std::string& name, + std::size_t width ) +// ***************************************************************************** +// Clean up whitespaces and format a long string into multiple lines +//! \param[in] str String to format +//! \param[in] name String to insert before string to output +//! \param[in] indent String to use as identation +//! \param[in] width Width in characters to insert newlines for output +//! \see http://stackoverflow.com/a/6892562 +//! \see http://stackoverflow.com/a/8362145 +//! \see https://stackoverflow.com/a/6894764 +// ***************************************************************************** +{ + // remove form feeds, line feeds, carriage returns, horizontal tabs, + // vertical tabs, see http://en.cppreference.com/w/cpp/string/byte/isspace + str.erase( + std::remove_if( str.begin(), str.end(), + []( char x ){ return std::isspace( x ) && x != ' '; } ), + str.end() ); + + // remove duplicate spaces + str.erase( + std::unique( str.begin(), str.end(), + []( char a, char b ){ return a == b && a == ' '; } ), + str.end() ); + + // format str to 'width'-character-long lines with indent + std::istringstream in(str); + std::ostringstream os; + + os << indent << name; + auto current = indent.size(); + std::string word; + + while (in >> word) { + if (current + word.size() > width) { + os << '\n' << indent; + current = indent.size(); + } + os << word << ' '; + current += word.size() + 1; + } + + return os.str(); +} diff --git a/src/Base/StrConvUtil.hpp b/src/Base/StrConvUtil.hpp index 8da3d9f426c..0792c5c211b 100644 --- a/src/Base/StrConvUtil.hpp +++ b/src/Base/StrConvUtil.hpp @@ -13,34 +13,21 @@ #define StrConvUtil_h #include +#include namespace tk { -#ifndef DOXYGEN_GENERATING_OUTPUT - -//! Operator << for writing enum class value to output streams. -//! \param[in] os Output stream into which e is written -//! \param[in] e Value of enum class to write to stream -//! \return Updated output stream for chain-use of the operator -template< typename T, typename Ch, typename Tr, - typename std::enable_if< std::is_enum::value, int >::type = 0 > -inline std::basic_ostream< Ch, Tr >& -operator<< ( std::basic_ostream< Ch, Tr >& os, const T& e ) { - os << static_cast< unsigned int >( e ); - return os; -} - -#endif // DOXYGEN_GENERATING_OUTPUT - //! Delegate operator << to default for writing non-enums to output streams. //! \param[in] os Output stream into which t is written //! \param[in] e Value of arbitrary non-enum-class type to write to stream //! \return Updated output stream for chain-use of the operator -template< typename T, typename Ch, typename Tr, - typename std::enable_if< !std::is_enum::value, int >::type = 0 > +template< typename T, typename Ch, typename Tr > inline std::basic_ostream< Ch, Tr >& operator<< ( std::basic_ostream< Ch, Tr >& os, const T& e ) { - os << e; + if constexpr( std::is_enum_v ) + os << static_cast< unsigned int >( e ); + else + os << e; return os; } @@ -67,6 +54,13 @@ operator<< ( std::basic_string< Ch, Tr >&& lhs, const T& e ) { return lhs << e; } +//! Clean up whitespaces and format a long string into multiple lines +std::string +splitLines( std::string str, + std::string indent, + const std::string& name = "", + std::size_t width = 80 ); + } // tk:: #endif // StrConvUtil_h diff --git a/src/Base/TaggedTuple.hpp b/src/Base/TaggedTuple.hpp index aced947e7d1..2912ecd49bf 100644 --- a/src/Base/TaggedTuple.hpp +++ b/src/Base/TaggedTuple.hpp @@ -24,125 +24,240 @@ #ifndef TaggedTuple_h #define TaggedTuple_h +#include #include + +#include +#include "NoWarning/any.hpp" +#include "NoWarning/partition.hpp" +#include "NoWarning/index_of.hpp" + #include "PUPUtil.hpp" +#include "Exception.hpp" namespace tk { -//! Tagged tuple allowing tag-based access to tuple members -namespace tuple { -template struct typelist { - template using prepend = typelist; -}; +//! \brief Tagged tuple, allowing tag-based access +//! \details "Tag" here is any type, but mostly an empty struct with a good name +//! for the data member +//! \tparam List Type list as brigand::list +//! \see https://stackoverflow.com/a/42988897 +//! \see https://gist.github.com/underdoeg/4c5c616c1ad4cbb718f787eefcab902d +template< class List > +class TaggedTuple{ -template struct index; -template struct index : - std::integral_constant {}; -template struct index : - std::integral_constant::value + 1> {}; - -template struct nth_impl; -template struct nth_impl<0, T, Ts...> { - using type = T; }; -template struct nth_impl { - using type = typename nth_impl::type; }; -template using nth = typename nth_impl::type; - -template struct extract_impl; -template -struct extract_impl : extract_impl {}; -template -struct extract_impl { using types = typename - extract_impl::types::template prepend; }; -template struct extract_impl { - using types = typelist<>; }; -template - using extract = typename extract_impl::types; - -template struct tt_impl; -template -struct tt_impl, typelist> : public std::tuple { - //! Accessor to type of nth element - template - using nT = nth::value, Ts...>; - //! Constructor - template explicit tt_impl(Args &&...args) : - std::tuple(std::forward(args)...) {} - //! PUP::reconstruct constructor - template explicit tt_impl(PUP::reconstruct) {} - //! Const-ref accessor - template constexpr const nT& get() const { - return std::get::value>(*this); } - //! Rvalue accessor - template nT& get() { - return std::get::value>(*this); } - //! Set value by copying source (for lvalues) - template void set(const nT& value) { - std::get::value>(*this) = value; } - //! Set value by moving source (for rvalues) - template void set(nT&& value) { - std::get::value>(*this) = std::forward>(value); } - //! Pack/Unpack - void pup( PUP::er& p ) { PUP::pup( p, *this ); } - friend void - operator|( PUP::er& p, tt_impl, typelist>& t ) - { t.pup(p); } -}; + private: + //! Generate index for every 2nd type of a type list + template< typename T > + using is_odd = brigand::size_t< (brigand::index_of::value%2) != 0 >; + + //! Partition a type list into lists of even and odd types + using Pair = brigand::partition< List, brigand::bind >; + + //! List of member types + using Data = typename Pair::first_type; + + //! List of keys + using Keys = typename Pair::second_type; + + //! Tuple of member types + using Tuple = brigand::as_tuple< Data >; + + //! False-overload for detecting if T is a tagged tuple + template< typename T, typename = std::void_t<> > + struct is_tagged_tuple : std::false_type {}; + + //! True-overload for detecting if T is a tagged tuple + template< typename T > + struct is_tagged_tuple< T, std::void_t< typename T::i_am_tagged_tuple > > + : std::true_type {}; + + //! Member data as a tuple + Tuple m_members; + + public: + //! Typedef defining self for identifying self + using i_am_tagged_tuple = void; + + //! Acces type in tuple behind tag + template< typename Tag > + using TupleElement = + std::tuple_element_t< brigand::index_of::value, Tuple >; + + //! Default constructor + explicit TaggedTuple() = default; + //! Initializer constructor + explicit TaggedTuple( Tuple&& tuple ) : m_members( std::move(tuple) ) {} + + //! Const-ref access to member tuple + const Tuple& tuple() const { return m_members; } + + //! Const-reference data member accessor of field of tagged tuple at depth + template< typename Tag, typename... Tags > + const auto& get() const noexcept { + constexpr std::size_t idx = brigand::index_of< Keys, Tag >::value; + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + return std::get< idx >( m_members ).template get< Tags... >(); + else + return std::get< idx >( m_members ); + } + + //! Reference data member accessor of field of tagged tuple at depth + template< typename Tag, typename... Tags > + auto& get() noexcept { + constexpr std::size_t idx = brigand::index_of< Keys, Tag >::value; + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + return std::get< idx >( m_members ).template get< Tags... >(); + else + return std::get< idx >( m_members ); + } + + //! Convert and store value converting from string at depth + //! \param[in] value Value to convert and store + template< typename Tag, typename... Tags > + void store( const std::string& value ) noexcept { + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + { + using T = std::remove_reference_t< decltype( get() ) >; + get< Tag, Tags... >() = convert< T >( value ); + } else { + using T = std::remove_reference_t< decltype( get< Tag >() ) >; + get< Tag >() = convert< T >( value ); + } + } + + //! Convert and push back value, converting from string, to vector + //! \param[in] value Value to convert and store + template< typename Tag, typename... Tags > + void store_back( const std::string& value ) noexcept { + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type; + get< Tag, Tags... >().push_back( convert< T >( value ) ); + } else { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type; + get< Tag >().push_back( convert< T >( value ) ); + } + } + + //! \brief Convert and push back value, converting from string, to back of + //! a nested vector + //! \param[in] value Value to convert and store + template< typename Tag, typename... Tags > + void store_back_back( const std::string& value ) noexcept { + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type::value_type; + get< Tag, Tags... >().back().push_back( convert< T >( value ) ); + } else { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type::value_type; + get< Tag >().back().push_back( convert< T >( value ) ); + } + } + + //! \brief Convert and push back value, converting from string, to back of + //! a doubly nested vector + //! \param[in] value Value to convert and store + template< typename Tag, typename... Tags > + void store_back_back_back( const std::string& value ) noexcept { + if constexpr( is_tagged_tuple>>::value and + sizeof...(Tags) != 0 ) + { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type::value_type::value_type; + get< Tag, Tags... >().back().back().push_back( convert< T >( value ) ); + } else { + using T = typename std::remove_reference_t< + decltype( get() ) >::value_type::value_type::value_type; + get< Tag >().back().back().push_back( convert< T >( value ) ); + } + } + + //! Insert key-value pair, converting value from string, to map + template< typename Tag, typename... Tags, typename Key, typename Value > + void insert( const Key& key, const Value& value ) { + get< Tag, Tags... >()[ key ] = value; + } + + //! Insert key-value pair to map of nested TaggedTuple + template< typename FieldTag, typename FieldType, + typename Tag, typename... Tags, typename Key > + void insert_field( const Key& key, const FieldType& value ) { + get< Tag, Tags... >()[ key ].template get< FieldTag >() = value; + } + + //! \brief Insert key-value pair, converting value from string, to map of + //! nested TaggedTuple + template< typename FieldTag, typename FieldType, + typename Tag, typename... Tags, typename Key > + void insert_field( const Key& key, const std::string& value ) { + get< Tag, Tags... >()[ key ].template get< FieldTag >() = + convert< FieldType >( value ); + } + + //! Operator == between two TaggedTuple objects + //! \tparam L Type list as brigand::list for other TaggedTuple + //! \return True if the lhs and rhs equal + template< typename L > + bool operator== ( const TaggedTuple< L >& t ) const { + static_assert( std::is_same_v< L, List >, "Invoking operator== on " + "TaggedTuple objects with different typelists" ); + static_assert( !brigand::any< List, + std::is_floating_point >::value, "Invoking operator== on " + "TaggedTuple objects containing a floating point type is unreliable" ); + return m_members == t.tuple(); + } + + //! Operator < between two TaggedTuple objects + //! \tparam L Type list as brigand::list for other TaggedTuple + //! \return True if lhs < rhs + template< typename L > + bool operator< ( const TaggedTuple< L >& t ) const { + static_assert( std::is_same_v< L, List >, "Invoking operator< on " + "TaggedTuple objects with different typelists" ); + return m_members < t.tuple(); + } + + //! Return number of tuple entries + static constexpr std::size_t size() { return std::tuple_size_v< Tuple >; } + + //! Pack/Unpack + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + void pup( PUP::er& p ) { p | m_members; } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] t TaggedTuple object reference + friend void operator|( PUP::er& p, TaggedTuple& t ) { t.pup(p); } + //@} -//! Tagged tuple. Client-side interface. Tagged tuple allowing tag-based access. -//! This is very much like -//! [std::tuple](http://en.cppreference.com/w/cpp/utility/tuple), but instead of -//! having to index the elements by integers, it allows access by a tag, which -//! can be an empty struct with a unique name. Credit goes to -//! ecatmur_at_stackoverflow.com, for more details, see -//! http://stackoverflow.com/questions/13065166/c11-tagged-tuple. For tags, see -//! Control/Tags.h. Tagged tuples are extensively used for transferring data -//! from the parser to an internal data structure in a type-save manner, which -//! is a tagged tuple containing a hierarchy of various containers. As an -//! example on how tagged tuples are used for parsing an input file, see -//! Control/Walker/InputDeck/InputDeck.h. Another way to use a tagged tuple is a -//! compile-time associated container between tags and an arbitrary type. As an -//! example, see rngtest::TestU01Stack::runner. -template struct tagged_tuple : - tt_impl, extract<2, 1, Ts...>> { - //! Constructor - // cppcheck-suppress noExplicitConstructor - template tagged_tuple(Args &&...args) : - tt_impl, extract<2, 1, Ts...>>( - std::forward(args)...) {} - //! Pack/Unpack - void pup( PUP::er& p ) { - tt_impl, extract<2, 1, Ts...>>::pup(p); } - friend void operator|( PUP::er& p, tagged_tuple& t ) { t.pup(p); } + //! \brief Convert string to a type given by the template argument using + //! std::stringstream + //! \param[in] str String to convert + //! \return A value of type given by the template argument + template< typename type > + type convert( const std::string& str ) { + std::stringstream ss( str ); + type num; + ss >> std::boolalpha >> num; + if (ss.fail()) + Throw( "Failed to convert '" + str + + "' to typeid " + typeid(num).name() ); + return num; + } }; -//! tagged_tuple_size = std::tuple_size/2 -template - struct tagged_tuple_size; - -template - struct tagged_tuple_size : - public std::integral_constant< - typename std::remove_cv::value)>::type, - std::tuple_size<_Tp>::value> { }; - -template - struct tagged_tuple_size : - public std::integral_constant< - typename std::remove_cv::value)>::type, - std::tuple_size<_Tp>::value> { }; - -template - struct tagged_tuple_size : - public std::integral_constant< - typename std::remove_cv::value)>::type, - std::tuple_size<_Tp>::value> { }; - -template - struct tagged_tuple_size> : - public std::integral_constant { }; - -} // tuple:: } // tk:: #endif // TaggedTuple_h diff --git a/src/Base/Variant.hpp b/src/Base/Variant.hpp deleted file mode 100644 index ad973f67865..00000000000 --- a/src/Base/Variant.hpp +++ /dev/null @@ -1,48 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Base/Variant.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Helpers for operator operator[] using boost::variant - \details Helpers for applying operator[] using boost::variant. -*/ -// ***************************************************************************** -#ifndef Variant_h -#define Variant_h - -#include "NoWarning/variant.hpp" -#include "NoWarning/charm++.hpp" - -namespace tk { - -//! Functor to dereference operator[] of chare proxy inside a variant -//! \details Since the chare array proxy is behind a variant, the returning -//! element proxy from operator() is also a variant, defined by ProxyElem with -//! a type depending on the input proxy, given by P, i.e., overloaded for all -//! proxy types the variant supports. -template< class ProxyElem > -struct Idx : boost::static_visitor< ProxyElem > { - explicit Idx( const CkArrayIndex1D& idx ) : x(idx) {} - template< typename P > - ProxyElem operator()( const P& p ) const { return p[x]; } - CkArrayIndex1D x; -}; - -//! Function dereferencing operator[] of chare proxy inside variant -//! \param[in] proxy Chare array proxy inside a variant to dereference -//! \param[in] x Chare array element index -//! \return Chare array element proxy as a variant, defined by ProxyElem -//! \details The returning element proxy is a variant, depending on the input -//! proxy. -//! \see inciter::Scheme, inciter::SchemeBase, or, e.g., DistFCT::apply() for -//! client code. -template< class ProxyElem, class Proxy > -ProxyElem element( const Proxy& proxy, const CkArrayIndex1D& x ) { - return boost::apply_visitor( Idx(x), proxy ); -} - -} // tk:: - -#endif // Variant_h diff --git a/src/Base/Vector.cpp b/src/Base/Vector.cpp index ec9c299a2f8..82f71e663d4 100644 --- a/src/Base/Vector.cpp +++ b/src/Base/Vector.cpp @@ -195,3 +195,49 @@ tk::inverseJacobian( const std::array< real, 3 >& v1, return jacInv; } + +tk::real +tk::determinant( const std::array< std::array< tk::real, 3 >, 3 >& a ) +// ***************************************************************************** +// Compute the determinant of 3x3 matrix +//! \param[in] a 3x3 matrix +//! \return Determinant of the 3x3 matrix +// ***************************************************************************** +{ + return ( a[0][0] * (a[1][1]*a[2][2]-a[1][2]*a[2][1]) + - a[0][1] * (a[1][0]*a[2][2]-a[1][2]*a[2][0]) + + a[0][2] * (a[1][0]*a[2][1]-a[1][1]*a[2][0]) ); +} + +std::array < tk::real, 3 > +tk::cramer( const std::array< std::array< tk::real, 3 >, 3>& a, + const std::array< tk::real, 3 >& b ) +// ***************************************************************************** +// Solve a 3x3 system of equations using Cramer's rule +//! \param[in] a 3x3 lhs matrix +//! \param[in] b 3x1 rhs matrix +//! \return Array of solutions of the 3x3 system +// ***************************************************************************** +{ + auto de = determinant( a ); + + auto nu(0.0); + std::array < real, 3 > x; + + nu = determinant( {{{{b[0], a[0][1], a[0][2]}}, + {{b[1], a[1][1], a[1][2]}}, + {{b[2], a[2][1], a[2][2]}}}} ); + x[0] = nu/de; + + nu = determinant( {{{{a[0][0], b[0], a[0][2]}}, + {{a[1][0], b[1], a[1][2]}}, + {{a[2][0], b[2], a[2][2]}}}} ); + x[1] = nu/de; + + nu = determinant( {{{{a[0][0], a[0][1], b[0]}}, + {{a[1][0], a[1][1], b[1]}}, + {{a[2][0], a[2][1], b[2]}}}} ); + x[2] = nu/de; + + return x; +} diff --git a/src/Base/Vector.hpp b/src/Base/Vector.hpp index d6ae53bb6fc..dab5091a6b5 100644 --- a/src/Base/Vector.hpp +++ b/src/Base/Vector.hpp @@ -66,6 +66,15 @@ inverseJacobian( const std::array< real, 3 >& v1, const std::array< real, 3 >& v3, const std::array< real, 3 >& v4 ); +//! Compute the determinant of 3x3 matrix +tk::real +determinant( const std::array< std::array< tk::real, 3 >, 3 >& a ); + +//! Solve a 3x3 system of equations using Cramer's rule +std::array < tk::real, 3 > +cramer( const std::array< std::array< tk::real, 3 >, 3>& a, + const std::array< tk::real, 3 >& b ); + } // tk:: #endif // Vector_h diff --git a/src/Base/charestatecollector.ci b/src/Base/charestatecollector.ci index 15fdad52772..a071d0cb2c2 100644 --- a/src/Base/charestatecollector.ci +++ b/src/Base/charestatecollector.ci @@ -15,7 +15,7 @@ module charestatecollector { namespace tk { - group ChareStateCollector { + group [migratable] ChareStateCollector { entry ChareStateCollector(); initnode void registerReducers(); entry void collect( bool error, CkCallback cb ); diff --git a/src/Base/str_const.hpp b/src/Base/str_const.hpp deleted file mode 100644 index fcb6ea424ee..00000000000 --- a/src/Base/str_const.hpp +++ /dev/null @@ -1,39 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Base/str_const.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Constexpr, i.e., compile-time, string class - \details Constexpr, i.e., compile-time, string class -*/ -// ***************************************************************************** -#ifndef str_const_h -#define str_const_h - -namespace tk { - -//! \brief constexpr string -//! \see http://en.cppreference.com/w/cpp/language/constexpr -//! \see https://github.com/boostcon/cppnow_presentations_2012/blob/master/wed/schurr_cpp11_tools_for_class_authors.pdf?raw=true -class str_const { - private: - const char* const p_; - const std::size_t sz_; - public: - // constructor - template< std::size_t N > - constexpr str_const( const char (&a)[N] ) : p_(a), sz_(N-1) {} - // operator [] - constexpr char operator[] ( std::size_t n ) - { return n < sz_ ? p_[n] : throw std::out_of_range(""); } - // size() - constexpr std::size_t size() { return sz_; } - // c_str accessor - constexpr const char* c_str() const { return p_; } -}; - -} // tk:: - -#endif // str_const_h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c3077ad76f5..8c48aa9f174 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -70,7 +70,8 @@ string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) # Set build type (will be exported to the source) set(BUILD_TYPE ${CMAKE_BUILD_TYPE}) # Query regression tests directory (will be exported to the source) -set(REGRESSION_DIR "${PROJECT_SOURCE_DIR}/../tests/regression") +get_filename_component(REGRESSION_DIR + "${PROJECT_SOURCE_DIR}/../tests/regression" ABSOLUTE) # Query target architecture include(TargetArch) @@ -104,7 +105,7 @@ message(STATUS "Third-party library dir: " ${TPL_DIR}) # Detect compiler version if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR - CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + CMAKE_CXX_COMPILER_ID MATCHES "Clang") include(DetectCompilerVersion) endif() @@ -113,6 +114,13 @@ if (NOT ENABLE_TESTS) message(STATUS "Tests disabled.") endif() +# Save contents of license file and copyright info in cmake variables +file(STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/../LICENSE" LICENSE) +string(REGEX REPLACE "All rights reserved\.*" "All rights reserved. See --license for details." COPYRIGHT "${LICENSE}") +string(REGEX REPLACE ";" "\\\\n" COPYRIGHT "${COPYRIGHT}") +string(REGEX REPLACE ";" "\\\\n" LICENSE "${LICENSE}") +string(APPEND LICENSE "\\n\\nFor third-party licenses, see https://quinoacomputing.org/licenses.html") + # Include third-party libraries configuration include(TPLs) @@ -209,7 +217,7 @@ execute_process(COMMAND "date" "+%A, %b %d, %Y" string(REGEX REPLACE "[\r\n]" "" BUILD_DATE_SIMPLE "${BUILD_DATE_SIMPLE}") # Set the requirement for the C++ standard -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) message(STATUS "Required language standard: C++${CMAKE_CXX_STANDARD}") @@ -230,7 +238,7 @@ macro (add_c_compiler_flag flag) endmacro (add_c_compiler_flag) # Compiler-specific settings -if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") # clang-specific settings +if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") # clang-specific settings # Include function that allows to set standard C++ library include(libstdcxx) @@ -282,8 +290,6 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") # gcc-specific settings add_compiler_flag("-Wall") add_compiler_flag("-Wextra") - add_compiler_flag("-pedantic") - add_compiler_flag("-pedantic-errors") add_compiler_flag("-Wcast-align") add_compiler_flag("-Wcast-qual") add_compiler_flag("-Wdisabled-optimization") @@ -326,14 +332,11 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") # intel-specific settings # Include function that allows to set standard C++ library include(libstdcxx) - # Offer switch between libc++ and libstdc++, using libc++ as default + # Offer switch between libc++ and libstdc++, using libstdc++ as default if (LIBCXX_FOUND) - set_libstdcpp_vs_libcpp(CMAKE_CXX_FLAGS "libc++") + set_libstdcpp_vs_libcpp(CMAKE_CXX_FLAGS "libstdc++") endif() - # Use the C++14 standard (CMAKE_CXX_STANDARD does not set this for intel) - add_compiler_flag("-std=c++11") - # Compiler flags for intel add_compiler_flag("-w3") # enable diagnostics: remarks, warnings, errors add_compiler_flag("-Wremarks") # display remarks and comments @@ -355,6 +358,8 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") # intel-specific settings # 593: parameter was set but never used # 869: parameter was never referenced # 981: operands are evaluated in unspecified order + # 1011: missing return statement at end of non-void function (constexpr) + # 1292: unknown attribute "fallthrough" # 1418: external function definition with no prior declaration # 1419: external declaration in primary source file # 1572: floating-point equality and inequality comparisons are unreliable @@ -367,7 +372,7 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") # intel-specific settings # 3346: dynamic exception specifications are deprecated # 3656: variable may be used before its value is set # 10120: overriding '-O3' with '-O2' - add_compiler_flag("-diag-disable 7,68,82,111,177,186,193,280,304,327,383,411,444,593,869,981,1418,1419,1572,2259,2407,2415,2547,2557,3280,3346,3656,10120") + add_compiler_flag("-diag-disable 7,68,82,111,177,186,193,280,304,327,383,411,444,593,869,981,1011,1292,1418,1419,1572,2259,2407,2415,2547,2557,3280,3346,3656,10120") # Compiler flags for optimization report #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -qopt-report=0 -qopt-report-phase=loop,vec -qopt-report-file=stderr") @@ -446,6 +451,10 @@ elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Cray") # cray-specific settings add_compiler_flag("-hnomessage=11709:261:12307:12489:193:826:737:997:3138:3137:7405:1418:177:181:401:11749:11548:1982:368:324:47:1:7:111:68:10153:186:550:21:237:174:7212:284:82") add_c_compiler_flag("-hnomessage=11709:301:3137:3138:7405:193:1977") +else() + + message(WARNING "Compiler '${CMAKE_CXX_COMPILER_ID}' could not be identified.") + endif() # Set runner configuration. This is used when generating code coverage and @@ -488,6 +497,9 @@ message(STATUS "Parallel job runner ncpus arg: ${RUNNER_NCPUS_ARG}") message(STATUS "Parallel/serial job runner args: ${RUNNER_ARGS}") message(STATUS "Parallel/serial job runner postfix args: ${POSTFIX_RUNNER_ARGS}") +# Find Python: required for code coverage (fastcov) and doc (m.css) +find_package(PythonInterp 3.6) + # Attempt to find tools required for code coverage analysis include(DetectCodeCoverage) @@ -522,11 +534,21 @@ set(EXECUTABLES ${INCITER_EXECUTABLE} ${UNITTEST_EXECUTABLE} ${FILECONV_EXECUTABLE}) -# Configure cmake variable to pass to the code + +# Decide if the Exception class will write to std::cerr. This may not always be +# thread-safe, so it can be disabled here by setting this to false. The default +# is true, because it works most of the time. +if (NOT EXCEPTIONS_WRITE_TO_CERR) # set default + # will become compiler define in Main/QuinoaConfig.h + set(EXCEPTIONS_WRITE_TO_CERR true CACHE BOOL "Exceptions will write std::cerr.") +endif() +message(STATUS "Exceptions write to cerr: ${EXCEPTIONS_WRITE_TO_CERR}") + +# Configure cmake variables to pass to the build configure_file( "${PROJECT_SOURCE_DIR}/Main/QuinoaConfig.hpp.in" "${PROJECT_BINARY_DIR}/Main/QuinoaConfig.hpp" ) configure_file( "${PROJECT_SOURCE_DIR}/Main/QuinoaConfig.cpp.in" - "${PROJECT_BINARY_DIR}/Main/QuinoaConfig.cpp" ) + "${PROJECT_BINARY_DIR}/Main/QuinoaConfig.cpp" ESCAPE_QUOTES) # Remove build hostname from cmake cache unset(HOSTNAME CACHE) @@ -576,7 +598,7 @@ else() PrintMissing(LoadBalance "CHARM_FOUND;PEGTL_FOUND;BRIGAND_FOUND;Zoltan2_FOUND") endif() -if (CHARM_FOUND AND PEGTL_FOUND AND BRIGAND_FOUND) +if (CHARM_FOUND AND PEGTL_FOUND AND BRIGAND_FOUND AND RANDOM123_FOUND) add_subdirectory(RNG) else() PrintMissing(RNG "CHARM_FOUND;PEGTL_FOUND;BRIGAND_FOUND") @@ -588,12 +610,12 @@ else() PrintMissing(Statistics "CHARM_FOUND;PEGTL_FOUND;BRIGAND_FOUND") endif() -if ((ENABLE_MESHCONV OR ENABLE_INCITER) AND BRIGAND_FOUND) +if ((ENABLE_MESHCONV OR ENABLE_INCITER) AND BRIGAND_FOUND AND HIGHWAYHASH_FOUND) add_subdirectory(Mesh) add_subdirectory(IO) endif() -if (ENABLE_INCITER) +if (ENABLE_INCITER AND HIGHWAYHASH_FOUND) add_subdirectory(PDE) add_subdirectory(Inciter) endif() @@ -620,22 +642,77 @@ if (NOT BUILD_SHARED_LIBS) endforeach() endif() -# add a target to generate API documentation with Doxygen +# Add a target to generate documentation using doxygen and m.css find_package(Doxygen 1.8.15) find_package(MCSS) -if(DOXYGEN_FOUND AND MCSS_FOUND AND PYTHONINTERP_FOUND AND PYGMENTS_FOUND AND JINJA2_FOUND AND LATEX_FOUND) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../doc/quinoa.doxy - ${CMAKE_CURRENT_BINARY_DIR}/doc/quinoa.doxy @ONLY) - add_custom_command(OUTPUT xml - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc - DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doc/quinoa.doxy - COMMAND ${DOXYGEN_EXECUTABLE} quinoa.doxy - COMMAND ${MCSS_DOX2HTML5} --no-doxygen quinoa.doxy - VERBATIM USES_TERMINAL) - add_custom_target(doc DEPENDS xml - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc - COMMENT "Documentation") - message(STATUS "Add target 'doc' to generate documentation to ./doc/html/index.html") +if (DOXYGEN_FOUND AND MCSS_FOUND AND PYTHONINTERP_FOUND AND PYGMENTS_FOUND AND + JINJA2_FOUND AND LATEX_FOUND) + + find_program( PERL perl ) + find_program( AWK awk ) + find_program( XARGS xargs ) + find_program( GIT git ) + find_program( HEAD head ) + find_program( RECENT_MODS + ${CMAKE_CURRENT_SOURCE_DIR}/../tools/recent_mods.sh ) + find_program( EXTRACT_CMD_KEYWORDS + ${CMAKE_CURRENT_SOURCE_DIR}/../tools/extract_cmd_keywords.sh ) + find_program( EXTRACT_CTR_KEYWORDS + ${CMAKE_CURRENT_SOURCE_DIR}/../tools/extract_ctr_keywords.sh ) + + if (PERL AND AWK AND XARGS AND GIT AND HEAD AND RECENT_MODS) + + configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../doc/quinoa.doxy + ${CMAKE_CURRENT_BINARY_DIR}/doc/quinoa.doxy @ONLY) + + file(GLOB doc_pages CONFIGURE_DEPENDS + RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "../doc/pages/*.dox") + foreach(page ${doc_pages}) + configure_file(${page} ${CMAKE_CURRENT_BINARY_DIR}/doc/${page} @ONLY) + endforeach() + + # Generate targets _cmd_keywords for extracting and generating + # reference documentation pages for command line keywords + set(executables_cmd_keywords) + foreach(exe IN LISTS EXECUTABLES) + add_custom_target(${exe}_cmd_keywords + DEPENDS ${exe} ${doc_pages} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc + COMMAND ${EXTRACT_CMD_KEYWORDS} ${exe} + COMMENT "Extract ${exe}'s command-line keywords") + list(APPEND executables_cmd_keywords "${exe}_cmd_keywords") + endforeach() + + # Generate targets _ctr_keywords for extracting and generating + # reference documentation pages for control file keywords + set(executables_ctr_keywords) + foreach(exe IN LISTS EXECUTABLES) + add_custom_target(${exe}_ctr_keywords + DEPENDS ${exe} ${doc_pages} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc + COMMAND ${EXTRACT_CTR_KEYWORDS} ${exe} + COMMENT "Extract ${exe}'s control file keywords") + list(APPEND executables_ctr_keywords "${exe}_ctr_keywords") + endforeach() + + add_custom_command(OUTPUT xml + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/doc/quinoa.doxy + ${executables_cmd_keywords} + ${executables_ctr_keywords} + COMMAND ${RECENT_MODS} ${CMAKE_CURRENT_SOURCE_DIR}/.. + COMMAND ${DOXYGEN_EXECUTABLE} quinoa.doxy + COMMAND ${MCSS_DOX2HTML5} --no-doxygen quinoa.doxy + VERBATIM USES_TERMINAL) + + add_custom_target(doc DEPENDS xml + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/doc + COMMENT "Documentation") + + message(STATUS "Add target 'doc' to generate documentation to ./doc/html/index.html") + + endif() + endif() # Optionally enable cppcheck static analysis @@ -669,7 +746,7 @@ if(CODE_COVERAGE AND ENABLE_TESTS) setup_target_for_coverage(regression doc/html regression_coverage ${CMAKE_CTEST_COMMAND} TESTRUNNER_ARGS -j${PROCESSOR_COUNT} - ${REGRESSION_COVERAGE_ARGS} + ${REGRESSION_COVERAGE_ARGS} -LE insane DEPENDS ${NONTEST_EXECUTABLES}) if (REGRESSION_COVERAGE_ARGS) message(STATUS "Regression coverage test-runner arguments: '${REGRESSION_COVERAGE_ARGS}'") diff --git a/src/Control/CommonGrammar.hpp b/src/Control/CommonGrammar.hpp index 16c01a99d35..d3f8a5ef72f 100644 --- a/src/Control/CommonGrammar.hpp +++ b/src/Control/CommonGrammar.hpp @@ -97,12 +97,16 @@ namespace grm { NOMEAN, //!< No mean when initpolicy = jointcorrgaussian NOCOV, //!< No cov when initpolicy = jointcorrgaussian NOMKLRNG, //!< No MKL RNG configured - WRONGBETAPDF, //!< Wrong number of parameters configuring a beta pdf - WRONGGAMMAPDF, //!< Wrong number of parameters configuring a gamma pdf - WRONGGAUSSIAN, //!< Wrong number of parameters configuring a PDF - NEGATIVEPARAM, //!< Negative variance given configuring a Gaussian + WRONGBETAPDF, //!< Wrong number of parameters for a beta pdf + WRONGGAMMAPDF, //!< Wrong number of parameters for a gamma pdf + WRONGGAUSSIAN, //!< Wrong number of parameters for a Gaussian PDF + WRONGDIRICHLET, //!< Wrong number of parameters for a Dirichlet PDF + NEGATIVEPARAM, //!< Negative parameter given configuring a PDF NONCOMP, //!< No number of components selected NONMAT, //!< No number of materials selected + EOSGAMMA, //!< Wrong number of EOS gamma parameters + EOSCV, //!< Wrong number of EOS cv parameters + EOSPSTIFF, //!< Wrong number of EOS pstiff parameters NORNG, //!< No RNG selected NODT, //!< No time-step-size policy selected MULDT, //!< Multiple time-step-size policies selected @@ -142,6 +146,7 @@ namespace grm { T0REFODD, //!< AMR initref vector size is odd (must be even) T0REFNOOP, //!< AMR t<0 refinement will be no-op DTREFNOOP, //!< AMR t>0 refinement will be no-op + PREFTOL, //!< p-refinement tolerance out of bounds CHARMARG, //!< Argument inteded for the Charm++ runtime system OPTIONAL }; //!< Message key used to indicate of something optional @@ -198,6 +203,21 @@ namespace grm { { MsgKey::NONMAT, "The number of materials has not been specified in the " "block preceding this position. This is mandatory for the preceding " "block. Use the keyword 'nmat' to specify the number of materials." }, + { MsgKey::EOSGAMMA, "Incorrect number of multi-material equation of state " + "(EOS) 'gamma' parameters configured in the preceding block's 'material " + "... end' sub-block. The number of components between 'gamma ... end' is " + "incorrect, whose size must equal the number of materials set by keyword " + "'nmat'." }, + { MsgKey::EOSCV, "Incorrect number of multi-material equation of state " + "(EOS) 'cv' parameters configured in the preceding block's 'material " + "... end' sub-block. The number of components between 'cv... end' is " + "incorrect, whose size must equal the number of materials set by keyword " + "'nmat'." }, + { MsgKey::EOSPSTIFF, "Incorrect number of multi-material equation of state " + "(EOS) 'pstiff' parameters configured in the preceding block's 'material " + "... end' sub-block. The number of components between 'pstiff ... end' " + "is incorrect, whose size must equal the number of materials set by " + "keyword 'nmat'." }, { MsgKey::NORNG, "The random number generator has not been specified in " "the block preceding this position. This is mandatory for the preceding " "block. Use the keyword 'rng' to specify the random number generator." }, @@ -260,6 +280,8 @@ namespace grm { { MsgKey::WRONGGAUSSIAN, "Wrong number of Gaussian distribution " "parameters. A Gaussian distribution must be configured by exactly 2 " "real numbers in a gaussian...end block." }, + { MsgKey::WRONGDIRICHLET, "Wrong number of Dirichlet distribution " + "parameters." }, { MsgKey::NEGATIVEPARAM, "Negative distribution parameter (e.g., variance, " "shape, scale) specified configuring a probabililty distribution." }, { MsgKey::NOTERMS, "Statistic requires at least one variable." }, @@ -366,9 +388,11 @@ namespace grm { kw::amr_uniform::string() + "'." }, { MsgKey::DTREFNOOP, "Mesh refinement configuration for t>0 will be a " "no-op. During-timestepping (t>0) mesh refinement configuration " - "requires in the amr ... end block: '" + kw::amr_dtref::string() + + "requires in the amr ... end block: (1) '" + kw::amr_dtref::string() + " true' and (2) a specification of at least one refinement variable, " "e.g., '" + kw::amr_refvar::string() + " c end'." }, + { MsgKey::PREFTOL, "The p-refinement tolerance must be a real number " + "between 0.0 and 1.0, both inclusive." }, { MsgKey::CHARMARG, "Arguments starting with '+' are assumed to be inteded " "for the Charm++ runtime system. Did you forget to prefix the command " "line with charmrun? If this warning persists even after running with " @@ -406,12 +430,12 @@ namespace grm { ss << typestr << " while parsing at " << pos.line << ',' << pos.byte_in_line << ". " << msg->second; } - stack.template push_back< tag::error >( ss.str() ); + stack.template get< tag::error >().push_back( ss.str() ); } else { - stack.template push_back< tag::error > - ( std::string("Unknown parser ") + - (type == MsgType::ERROR ? "error" : "warning" ) + - " with no location information." ); + stack.template get< tag::error >().push_back( + std::string("Unknown parser ") + + (type == MsgType::ERROR ? "error" : "warning" ) + + " with no location information." ); } } @@ -490,7 +514,7 @@ namespace grm { << opt.name( stack.template get< tags... >() ) << "' with '" << opt.name( opt.value( value ) ) << "' at " << pos.line << ',' << pos.byte_in_line << ".\n\n"; - stack.template set< tags... >( opt.value( value ) ); + stack.template get< tags... >() = opt.value( value ); } else { Message< Stack, ERROR, MsgKey::NOOPTION >( stack, in ); } @@ -555,7 +579,7 @@ namespace grm { struct action< Set< tag, tags... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { - stack.template set< tag, tags... >( in.string() ); + stack.template get< tag, tags... >() = in.string(); } }; @@ -634,7 +658,7 @@ namespace grm { struct action< Invert_switch< tags... > > { template< typename Input, typename Stack > static void apply( const Input&, Stack& stack ) { - stack.template set< tags... >( !stack.template get< tags... >() ); + stack.template get< tags... >() = !stack.template get< tags... >(); } }; @@ -658,7 +682,7 @@ namespace grm { static void apply( const Input& in, Stack& stack ) { Option opt; if (opt.exist(in.string())) { - stack.template push_back( opt.value( in.string() ) ); + stack.template get().push_back( opt.value( in.string() ) ); } else { Message< Stack, ERROR, MsgKey::NOOPTION >( stack, in ); } @@ -691,7 +715,8 @@ namespace grm { static void apply( const Input& in, Stack& stack ) { Option opt; if (opt.exist(in.string())) { - stack.template push_back_back( opt.value( in.string() ) ); + stack.template get().back(). + push_back( opt.value( in.string() ) ); } else { Message< Stack, ERROR, MsgKey::NOOPTION >( stack, in ); } @@ -702,38 +727,30 @@ namespace grm { }; //! Rule used to trigger action - template< typename field, typename sel, typename vec, - typename tag, typename... tags > - struct Insert_field : pegtl::success {}; + template< typename sel, typename vec, typename Tag, typename... Tags > + struct insert_seed : pegtl::success {}; //! \brief Convert and insert value to map at position given by tags //! \details This struct and its apply function are used as a functor-like //! wrapper for inserting a value into a std::map behind a key in the - //! underlying grammar stack via the member function - //! tk::Control::insert_field. We detect a recently inserted key and its - //! type from the companion tuple field, "selected vector", given by types, - //! sel and vec, and use that key to insert an associated value in a - //! std::map addressed by tag and tags..., requiring at least one tag to - //! address the map. As an example, this is used in parsing parameters - //! associated to a particular random number generator, such as seed. - //! Example input file: "mkl_mcg59 seed 2134 uniform_method accurate end". - //! The selected vector here is the std::vector< tk::ctr::RNGType > under - //! tag::sel (at the second level of the tagged tuple). The - //! std::vector and its member function back() are then interrogated to find - //! out the key type and its value (an enum value) for the particular RNG. - //! This key is then used to insert a new entry in the std::map under - //! tag::param to store the RNG parameter. Client-code is in, e.g., - //! tk::rngsse::seed. - template< typename field, typename sel, typename vec, - typename tag, typename...tags > - struct action< Insert_field< field, sel, vec, tag, tags... > > { + //! underlying grammar stack via the member function tk::Control::insert. + //! We detect a recently inserted key from the companion tuple field, + //! "selected vector", given by types, sel and vec, and use that key to + //! insert an associated value in a std::map addressed by tag and tags..., + //! requiring at least one tag to address the map. As an example, this is + //! used in parsing parameters associated to a particular random number + //! generator, such as seed. Example input file: "mkl_mcg59 seed 2134 + //! uniform_method accurate end". The selected vector here is the + //! std::vector< tk::ctr::RNGType > under tag::sel. + //! \see Example client-code: tk::rngsse::seed. + template< typename sel, typename vec, typename Tag, typename...Tags > + struct action< insert_seed< sel, vec, Tag, Tags... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { - // get recently inserted key from - using key_type = - typename Stack::template nT< sel >::template nT< vec >::value_type; - const key_type& key = stack.template get< sel, vec >().back(); + // get recently inserted key from < sel, vec > + const auto& key = stack.template get< sel, vec >().back(); stack.template - insert_field< key_type, field, tag, tags... >( key, in.string() ); + insert_field< tag::seed, kw::seed::info::expect::type, Tag, Tags... > + ( key, in.string() ); } }; @@ -755,12 +772,10 @@ namespace grm { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { // get recently inserted key from - using key_type = - typename Stack::template nT< sel >::template nT< vec >::value_type; - const key_type& key = stack.template get< sel, vec >().back(); + const auto& key = stack.template get< sel, vec >().back(); stack.template - insert_opt< key_type, field, typename Option::EnumType, tag, tags... > - ( key, Option().value(in.string()) ); + insert_field< field, typename Option::EnumType, tag, tags... > + ( key, Option().value(in.string()) ); // trigger error at compile-time if any of the expected option values // is not in the keywords pool of the grammar brigand::for_each< typename Option::keywords >( is_keyword< use >() ); @@ -784,7 +799,7 @@ namespace grm { std::transform( begin(low), end(low), begin(low), ::tolower ); if (low == "max") { const auto maxprec = PrEx::upper; - stack.template set< tag::prec, prec >( maxprec ); + stack.template get< tag::prec, prec >() = maxprec; } else { PrEx::type precision = std::cout.precision(); // set default try { //try to convert matched str to int @@ -795,7 +810,7 @@ namespace grm { } // only set precision given if it makes sense if (precision >= PrEx::lower && precision <= PrEx::upper) - stack.template set< tag::prec, prec >( precision ); + stack.template get< tag::prec, prec >() = precision; else Message< Stack, WARNING, MsgKey::PRECISIONBOUNDS >( stack, in ); } @@ -824,12 +839,12 @@ namespace grm { auto it = cmdinfo.find( in.string() ); if (it != cmdinfo.end()) { // store keyword and its info on which help was requested - stack.template set< tag::helpkw >( { it->first, it->second, true } ); + stack.template get< tag::helpkw >() = { it->first, it->second, true }; } else { it = ctrinfo.find( in.string() ); if (it != ctrinfo.end()) // store keyword and its info on which help was requested - stack.template set< tag::helpkw >( { it->first, it->second, false } ); + stack.template get< tag::helpkw >() = { it->first, it->second, false }; else Message< Stack, ERROR, MsgKey::KEYWORD >( stack, in ); } @@ -867,8 +882,8 @@ namespace grm { // find matched name in set of registered ones if (pdfnames.find( in.string() ) == pdfnames.end()) { pdfnames.insert( in.string() ); - stack.template - push_back< tag::cmd, tag::io, tag::pdfnames >( in.string() ); + stack.template get< tag::cmd, tag::io, tag::pdfnames >(). + push_back( in.string() ); } else // error out if name matched var is already registered Message< Stack, ERROR, MsgKey::PDFEXISTS >( stack, in ); @@ -951,7 +966,7 @@ namespace grm { struct action< start_vector< tag, tags... > > { template< typename Input, typename Stack > static void apply( const Input&, Stack& stack ) { - stack.template push_back< tag, tags... >(); // no arg: use default ctor + stack.template get< tag, tags... >().push_back( {} ); } }; @@ -964,7 +979,7 @@ namespace grm { template< typename Input, typename Stack > static void apply( const Input&, Stack& stack ) { // no arg: use default ctor - stack.template push_back_back< tag, tags... >(); + stack.template get< tag, tags... >().back().push_back( {} ); } }; @@ -1072,25 +1087,27 @@ namespace grm { }; //! Rule used to trigger action - template< class eq, class param > struct check_vector : pegtl::success {}; + template< class eq, class param, class... xparam > + struct check_vector : pegtl::success {}; //! Check parameter vector - template< class eq, class param > - struct action< check_vector< eq, param > > { + template< class eq, class param, class... xparam > + struct action< check_vector< eq, param, xparam... > > { template< typename Input, typename Stack > static void apply( const Input&, Stack& ) {} }; //! Rule used to trigger action - template< class eq, class param > struct check_spikes : pegtl::success {}; + template< class eq, class param, class... xparam > + struct check_spikes : pegtl::success {}; //! Check if the spikes parameter vector specifications are correct //! \details Spikes are used to specify sample-space locations and relative //! probability heights for a joint-delta PDF. - template< class eq, class param > - struct action< check_spikes< eq, param > > { + template< class eq, class param, class... xparam > + struct action< check_spikes< eq, param, xparam... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { const auto& spike = - stack.template get< tag::param, eq, param >().back().back(); + stack.template get< tag::param, eq, param, xparam... >().back().back(); // Error out if the number of spikes-vector is odd if (spike.size() % 2) Message< Stack, ERROR, MsgKey::ODDSPIKES >( stack, in ); @@ -1109,16 +1126,17 @@ namespace grm { }; //! Rule used to trigger action - template< class eq, class param > struct check_betapdfs : pegtl::success {}; + template< class eq, class param, class... xparam > + struct check_betapdfs : pegtl::success {}; //! Check if the betapdf parameter vector specifications are correct //! \details Betapdf vectors are used to configure univariate beta //! distributions. - template< class eq, class param > - struct action< check_betapdfs< eq, param > > { + template< class eq, class param, class... xparam > + struct action< check_betapdfs< eq, param, xparam... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { const auto& betapdf = - stack.template get< tag::param, eq, param >().back().back(); + stack.template get< tag::param, eq, param, xparam... >().back().back(); // Error out if the number parameters is not four if (betapdf.size() != 4) Message< Stack, ERROR, MsgKey::WRONGBETAPDF >( stack, in ); @@ -1126,16 +1144,17 @@ namespace grm { }; //! Rule used to trigger action - template< class eq, class param > struct check_gammapdfs : pegtl::success {}; + template< class eq, class param, class... xparam > + struct check_gammapdfs : pegtl::success {}; //! Check if the gammapdf parameter vector specifications are correct //! \details gammapdf vectors are used to configure univariate gamma //! distributions. - template< class eq, class param > - struct action< check_gammapdfs< eq, param > > { + template< class eq, class param, class... xparam > + struct action< check_gammapdfs< eq, param, xparam... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { const auto& gamma = - stack.template get< tag::param, eq, param >().back().back(); + stack.template get< tag::param, eq, param, xparam... >().back().back(); // Error out if the number parameters is not two if (gamma.size() != 2) Message< Stack, ERROR, MsgKey::WRONGGAMMAPDF >( stack, in ); @@ -1146,16 +1165,42 @@ namespace grm { }; //! Rule used to trigger action - template< class eq, class param > struct check_gaussians : pegtl::success {}; + template< class eq, class param, class... xparam > + struct check_dirichletpdf : pegtl::success {}; + //! Check if the dirichletpdf parameter vector specifications are correct + //! \details dirichletpdf vectors are used to configure multivariate + //! Dirichlet distributions. + template< class eq, class param, class... xparam > + struct action< check_dirichletpdf< eq, param, xparam... > > { + template< typename Input, typename Stack > + static void apply( const Input& in, Stack& stack ) { + const auto& dir = + stack.template get< tag::param, eq, param, xparam... >().back(); + // get recently configured eq block number of scalar components + auto ncomp = + stack.template get< tag::component >().template get< eq >().back(); + // Error out if the number parameters does not equal ncomp + if (dir.size() != ncomp-2) + Message< Stack, ERROR, MsgKey::WRONGDIRICHLET >( stack, in ); + // Error out if the specified shape or scale parameter negative + for (auto a : dir) + if (a < 0.0) + Message< Stack, ERROR, MsgKey::NEGATIVEPARAM >( stack, in ); + } + }; + + //! Rule used to trigger action + template< class eq, class param, class... xparam > + struct check_gaussians : pegtl::success {}; //! Check if the Gaussian PDF parameter vector specifications are correct //! \details Gaussian vectors are used to configure univariate Gaussian //! distributions. - template< class eq, class param > - struct action< check_gaussians< eq, param > > { + template< class eq, class param, class... xparam > + struct action< check_gaussians< eq, param, xparam... > > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { const auto& gaussian = - stack.template get< tag::param, eq, param >().back().back(); + stack.template get< tag::param, eq, param, xparam... >().back().back(); // Error out if the number parameters is not two if (gaussian.size() != 2) Message< Stack, ERROR, MsgKey::WRONGGAUSSIAN >( stack, in ); @@ -1394,17 +1439,17 @@ namespace grm { //! \brief Process command line 'keyword' and call its 'insert' action if //! matches 'kw_type' template< template< class > class use, class keyword, class insert, - class kw_type, class tag, class... tags> + class kw_type, class tag, class... tags > struct process_cmd : pegtl::if_must< readcmd< use< keyword > >, scan< pegtl::sor< kw_type, msg< ERROR, MsgKey::MISSING > >, insert >, typename std::conditional< - tk::HasVarExpectLower< typename keyword::info >::value, + tk::HasVar_expect_lower< typename keyword::info >::value, check_lower_bound< keyword, tag, tags... >, pegtl::success >::type, typename std::conditional< - tk::HasVarExpectUpper< typename keyword::info >::value, + tk::HasVar_expect_upper< typename keyword::info >::value, check_upper_bound< keyword, tag, tags... >, pegtl::success >::type > {}; @@ -1552,11 +1597,11 @@ namespace grm { pegtl::if_must< process< keyword, Store< tags... >, kw_type >, typename std::conditional< - tk::HasVarExpectLower< typename keyword::info >::value, + tk::HasVar_expect_lower< typename keyword::info >::value, check_lower_bound< keyword, tags... >, pegtl::success >::type, typename std::conditional< - tk::HasVarExpectUpper< typename keyword::info >::value, + tk::HasVar_expect_upper< typename keyword::info >::value, check_upper_bound< keyword, tags... >, pegtl::success >::type > {}; @@ -1653,15 +1698,16 @@ namespace grm { typename keyword, template< class, class... > class store, template< class, class... > class start, - template< class, class > class check, + template< class, class, class... > class check, typename eq, - typename param > + typename param, + typename... xparams > struct parameter_vector : pegtl::if_must< vector< keyword, - store< tag::param, eq, param >, + store< tag::param, eq, param, xparams... >, use< kw::end >, - start< tag::param, eq, param > >, - check< eq, param > > {}; + start< tag::param, eq, param, xparams... > >, + check< eq, param, xparams... > > {}; //! Match equation/model option vector //! \details This structure is used to match a keyword ... end block that diff --git a/src/Control/Control.hpp b/src/Control/Control.hpp deleted file mode 100644 index 92001ad597f..00000000000 --- a/src/Control/Control.hpp +++ /dev/null @@ -1,651 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Control/Control.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Control base contains generic accessors to tagged tuple elements - \details Control is a slightly more specialized level of a tagged tuple, - implementing still very generic accessors to tuple elements at various - depths at the tuple hierarchy. At this time, max 3 levels are implemented, - but it would be nice to replace the triple-overloads with a single generic - one that works at all depths. -*/ -// ***************************************************************************** -#ifndef Control_h -#define Control_h - -#include -#include -#include - -#include "TaggedTuple.hpp" -#include "Exception.hpp" - -namespace tk { - -//! Control is a slightly more specialized level of a tagged tuple, implementing -//! still very generic accessors to tuple elements at various depths at the -//! tuple hierarchy. At this time, max 3 levels are implemented, but it would be -//! nice to replace the triple-overloads with a single generic one that works at -//! all depths. For an example specialization, i.e., client-side code, see -//! walker::ctr::InputDeck. -template -class Control : public tuple::tagged_tuple { - - private: - //! Short-hand to innherited tagged tuple - using Tuple = tuple::tagged_tuple; - - public: - /** @name Const-ref accessors at three different depths */ - ///@{ - //! \brief Const-ref accessor to single element at 1st level - //! \return A constant reference behind a tag given by the template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - constexpr const typename Tuple::template nT& - get() const noexcept { - return Tuple::template get(); - } - //! \brief Const-ref accessor to single element at 2nd level - //! \return A constant reference behind a tag, subtag given by the template - //! arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - constexpr const typename Tuple::template nT::template nT& - get() const noexcept { - return Tuple::template get().template get(); - } - //! \brief Const-ref accessor to single element at 3rd level - //! \return A constant reference behind a tag, subtag, subsubtag given by - //! the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - constexpr const typename Tuple::template nT - ::template nT - ::template nT& - get() const noexcept { - return Tuple::template get(). - template get(). - template get(); - } - ///@} - - /** @name Rvalue accessors at three different depths */ - ///@{ - //! \brief Rvalue accessor to single element at 1st level - //! \return An rvalue reference behind a tag given by the template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - typename Tuple::template nT& get() noexcept { - return Tuple::template get(); - } - //! \brief Rvalue accessor to single element at 2nd level - //! \return An rvalue reference behind a tag, subtag given by the template - //! arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - typename Tuple::template nT::template nT& get() noexcept { - return Tuple::template get().template get(); - } - //! \brief Rvalue accessor to single element at 3rd level - //! \return An rvalue reference behind a tag, subtag, subsubtag given by the - //! template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - typename Tuple::template nT - ::template nT - ::template nT& get() noexcept { - return Tuple::template get(). - template get(). - template get(); - } - ///@} - - /** @name Set value at three different depths */ - ///@{ - //! \brief Set value at slot at tag at 1st level - //! \param[in] value Value to set behind tag given by the template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void set(const typename Tuple::template nT& value) noexcept { - Tuple::template get() = value; - } - //! \brief Set value at slot at tag at 2nd level - //! \param[in] value Value to set behind tag and subtag given by the - //! template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void set(const typename Tuple::template nT - ::template nT& value) noexcept { - Tuple::template get().template get() = value; - } - //! \brief Set value at slot at tag at 3rd level - //! \param[in] value Value to set behind tag, subtag, and subsubtag given by - //! the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void set(const typename Tuple::template nT - ::template nT - ::template nT& value) noexcept { - Tuple::template get(). - template get(). - template get() = value; - } - ///@} - - /** @name Convert and set value at tag at three different depths */ - ///@{ - //! \brief Convert and set value at tag at 1st level - //! \param[in] value Value to convert and set behind tag given by the - //! template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void store(const std::string& value) noexcept { - Tuple::template get() = - convert>( value ); - } - //! \brief Convert and set value at tag at 2nd level - //! \param[in] value Value to convert and set behind tag and subtag given by - //! the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void store(const std::string& value) noexcept { - Tuple::template get(). - template get() = - convert - ::template nT>( value ); - } - //! \brief Convert and set value at tag at 3rd level - //! \param[in] value Value to convert and set behind tag, subtag, and - // subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void store(const std::string& value) noexcept { - Tuple::template get(). - template get(). - template get() = - convert - ::template nT - ::template nT>( value ); - } - ///@} - - /** @name Push back value to vector at tag at three different depths */ - ///@{ - //! \brief Push back value to vector at tag at 1st level without conversion - //! \param[in] value Value to push back behind tag given by the template - //! argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void push_back( const typename Tuple::template nT::value_type& value = - typename Tuple::template nT::value_type() ) { - Tuple::template get().push_back( value ); - } - //! \brief Push back value to vector at tag at 2nd level without conversion - //! \param[in] value Value to push back behind tag and subtag given by the - //! template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void push_back( const typename Tuple::template nT - ::template nT - ::value_type& value = - typename Tuple::template nT - ::template nT - ::value_type() ) { - Tuple::template get(). - template get().push_back( value ); - } - //! \brief Push back value to vector at tag at 3rd level without conversion - //! \param[in] value Value to push back behind tag, subtag, and subsubtag - //! given by the template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void push_back( const typename Tuple::template nT - ::template nT - ::template nT - ::value_type& value = - typename Tuple::template nT - ::template nT - ::template nT - ::value_type() ) { - Tuple::template get(). - template get(). - template get().push_back( value ); - } - ///@} - - /** @name Push back value to vector of back of vector at tag at three different depths */ - ///@{ - //! \brief Push back value to vector of back of vector at tag at 1st level - //! without conversion. - //! \details This is similar to store_back_back but performes no conversion. - //! \param[in] value Value to push back behind tag given by the template - //! argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void push_back_back( const typename Tuple::template nT - ::value_type::value_type& value = - typename Tuple::template nT - ::value_type::value_type() ) { - Tuple::template get().back().push_back( value ); - } - //! \brief Push back value to vector of back of vector at tag at 2nd level - //! without conversion - //! \details This is similar to store_back_back but performes no conversion. - //! no conversion. - //! \param[in] value Value to push back behind tag and subtag given by the - //! template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void push_back_back( const typename Tuple::template nT - ::template nT - ::value_type::value_type& value = - typename Tuple::template nT - ::template nT - ::value_type::value_type() ) { - Tuple::template get(). - template get().back().push_back( value ); - } - //! \brief Push back value to vector of back of vector at tag at 3rd level - //! without conversion - //! \details This is similar to store_back_back but performes no conversion. - //! no conversion. - //! \param[in] value Value to push back behind tag, subtag, and subsubtag - //! given by the template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void push_back_back( const typename Tuple::template nT - ::template nT - ::template nT - ::value_type::value_type& value = - typename Tuple::template nT - ::template nT - ::template nT - ::value_type::value_type() ) { - Tuple::template get(). - template get(). - template get().back().push_back( value ); - } - ///@} - - /** @name Convert and push back value to vector at tag at three different - * depths */ - ///@{ - //! \brief Convert and push back value to vector at tag at 1st level - //! \param[in] value Value to convert and push back behind tag given by the - //! template argument - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void store_back(const std::string& value) { - Tuple::template get().push_back( - convert - ::value_type>( value )); - } - //! \brief Convert and push back value to slot at tag at 2nd level - //! \param[in] value Value to convert and push back behind tag and subtag - //! given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void store_back(const std::string& value) { - Tuple::template get(). - template get().push_back( - convert - ::template nT - ::value_type>( value )); - } - //! \brief Convert and push back value to slot at tag at 3rd level - //! \param[in] value Value to convert and push back behind tag, subtag, and - //! subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void store_back(const std::string& value) { - Tuple::template get(). - template get(). - template get().push_back( - convert - ::template nT - ::template nT - ::value_type>( value )); - } - ///@} - - /** @name Convert and push back value to vector of back of vector at tag at three different depths */ - ///@{ - //! \brief Convert and push back value to vector of back of vector at tag at - //! 1st level - //! \param[in] value Value to convert and push back behind tag given by the - //! template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void store_back_back(const std::string& value) { - Tuple::template get().back().push_back( - convert - ::value_type::value_type>( value ) ); - } - //! \brief Convert and push back value to vector of back of vector at tag at - //! 2nd level - //! \param[in] value Value to convert and push back behind tag and subtag - //! given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void store_back_back(const std::string& value) { - Tuple::template get(). - template get().back().push_back( - convert - ::template nT - ::value_type::value_type>( value ) ); - } - //! \brief Convert and push back value to vector of back of vector at tag at - //! 3rd level - //! \param[in] value Value to convert and push back behind tag, subtag, and - //! subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void store_back_back(const std::string& value) { - Tuple::template get(). - template get(). - template get().back().push_back( - convert - ::template nT - ::template nT - ::value_type::value_type>( value ) ); - } - ///@} - - /** @name Convert and push back value to vector of back of vector of back of vector at tag at three different depths */ - ///@{ - //! \brief Convert and push back value to vector of back of vector of back - //! of vector at tag at 1st level - //! \param[in] value Value to convert and push back behind tag given by the - //! template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void store_back_back_back(const std::string& value) { - Tuple::template get().back().back().push_back( - convert - ::value_type::value_type::value_type>( value ) ); - } - //! \brief Convert and push back value to vector of back of vector of back - //! of vector at tag at 2nd level - //! \param[in] value Value to convert and push back behind tag and subtag - //! given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void store_back_back_back(const std::string& value) { - Tuple::template get(). - template get().back().back().push_back( - convert - ::template nT - ::value_type::value_type::value_type>( value ) ); - } - //! \brief Convert and push back value to vector of back of vector of back - //! of vector at tag at 3rd level - //! \param[in] value Value to convert and push back behind tag, subtag, and - //! subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void store_back_back_back(const std::string& value) { - Tuple::template get(). - template get(). - template get().back().back().push_back( - convert - ::template nT - ::template nT - ::value_type::value_type::value_type>( value ) ); - } - ///@} - - /** @name Insert key-value pair to map at tag at three different depths */ - ///@{ - //! \brief Insert key-value pair to map at tag at 1st level using - //! std::map::operator[] - //! \param[in] key Key to insert to std::map behind tag given by the - //! template argument - //! \param[in] value Value to insert to std::map behind tag given by the - //! template argument; optional argument, if not given, use default - //! constructor - // TODO Combine the three overloads into a single variadic one - template< typename tag > - void insert( const typename Tuple::template nT - ::key_type& key, - const typename Tuple::template nT - ::mapped_type& value = - typename Tuple::template nT - ::mapped_type() ) - { - Tuple::template get()[ key ] = value; - } - //! \brief Insert key-value pair to map at tag at 2nd level using - //! std::map::operator[] - //! \param[in] key Key to insert to std::map behind tag and subtag given by - //! the template arguments - //! \param[in] value Value to insert to std::map behind tag and subtag given - //! by the template arguments; optional argument, if not given, use default - //! constructor - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag > - void insert( const typename Tuple::template nT - ::template nT - ::key_type& key, - const typename Tuple::template nT - ::template nT - ::mapped_type& value = - typename Tuple::template nT - ::template nT - ::mapped_type() ) - { - Tuple::template get(). - template get()[ key ] = value; - } - //! \brief Insert key-value pair to map at tag at 3rd level using - //! std::map::operator[] - //! \param[in] key Key to insert to std::map behind tag, subtag, and - //! subsubtag given by the template arguments - //! \param[in] value Value to insert to std::map behind tag, subtag, and - //! subsubstag given by the template arguments; optional argument, if not - //! given, use default constructor - // TODO Combine the three overloads into a single variadic one - template< typename tag, typename subtag, typename subsubtag > - void insert( const typename Tuple::template nT - ::template nT - ::template nT - ::key_type& key, - const typename Tuple::template nT - ::template nT - ::template nT - ::mapped_type& value = - typename Tuple::template nT - ::template nT - ::template nT - ::mapped_type() ) - { - Tuple::template get(). - template get(). - template get()[ key ] = value; - } - ///@} - - /** @name Insert key-value pair with converting value to map at tag at three different depths */ - ///@{ - //! \brief Insert key-value pair with converting value to map at tag at 1st - //! level using std::map::operator[] - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 1st level of Control object - //! given by the tag template argument. The assumed hierarchy is: Control - //! (this object) -> tag -> std::map< key_type, tagged_tuple > -> field = - //! value. This is similar to insert_opt, but performs conversion. - //! \param[in] key Key to insert to std::map behind tag given by the - //! template argument - //! \param[in] value Value to insert to std::map behind tag given by the - //! template argument - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename tag > - void insert_field(const key_type& key, const std::string& value) { - Tuple::template get()[ key ].template get() = - convert - ::mapped_type - ::template nT>( value ); - } - //! \brief Insert key-value pair with converting value to map at tag at 2nd - //! level using std::map::operator[] - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 2nd level of Control object - //! given by the tag and subtag template arguments. The assumed hierarchy - //! is: Control (this object) -> tag -> subtag -> std::map< key_type, - //! tagged_tuple > -> field = value. This is similar to insert_opt, but - //! performs conversion. - //! \param[in] key Key to insert to std::map behind tag and subtag given by - //! the template arguments - //! \param[in] value Value to insert to std::map behind tag and subtag given - //! by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename tag, typename subtag > - void insert_field(const key_type& key, const std::string& value) { - Tuple::template get(). - template get()[ key ].template get() = - convert - ::template nT - ::mapped_type - ::template nT>( value ); - } - //! \brief Insert key-value pair with converting value to map at tag at 3rd - //! level using std::map::operator[] - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 3rd level of Control object - //! given by the tag, subtag, and subsubtag template arguments. The - //! assumed hierarchy is: Control (this object) -> tag -> subtag -> - //! subsubtag -> std::map< key_type, tagged_tuple > -> field = value. This - //! is similar to insert_opt, but performs conversion. - //! \param[in] key Key to insert to std::map behind tag, subtag, and - //! subsubtag given by the template arguments - //! \param[in] value Value to insert to std::map behind tag, subtag, and - //! subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename tag, typename subtag, - typename subsubtag > - void insert_field(const key_type key, const std::string& value) { - Tuple::template get(). - template get(). - template get()[ key ].template get() = - convert - ::template nT - ::template nT - ::mapped_type - ::template nT>( value ); - } - ///@} - - /** @name Insert key-value pair without conversion of value to map at tag at three different depths */ - ///@{ - //! \brief Insert value to field of tagged tuple behind a key of a map at - //! tag at 1st level. - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 1st level of Control object - //! given by the tag template argument. The assumed hierarchy is: Control - //! (this object) -> tag -> subtag -> std::map< key_type, tagged_tuple > - //! -> field = value. This is similar to insert_field, but performs no - //! conversion. - //! \param[in] key Key used to access the std::map value using - //! std::map::operator[], behind which a type that defines the get() - //! member function (e.g., a tagged_tuple) is assumed to exist - //! \param[in] value Value to insert - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename field_type, - typename tag > - void insert_opt( const key_type& key, const field_type& value ) { - Tuple::template get()[ key ].template get() = value; - } - - //! \brief Insert value to field of tagged tuple behind a key of a map at - //! tag at 2nd level. - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 2nd level of Control object - //! given by the tag and subtag template arguments. The assumed hierarchy - //! is: Control (this object) -> tag -> subtag -> std::map< key_type, - //! tagged_tuple > -> field = value. This is similar to insert_field, but - //! performs no conversion. - //! \param[in] key Key used to access the std::map value using - //! std::map::operator[], behind which a type that defines the get() - //! member function (e.g., a tagged_tuple) is assumed to exist - //! \param[in] value Value to insert - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename field_type, - typename tag, typename subtag > - void insert_opt( const key_type& key, const field_type& value ) { - Tuple::template get(). - template get()[ key ].template get() = value; - } - - //! \brief Insert key-value pair with converting value to map at tag at 3rd - //! level using std::map::operator[] - //! \details This member function is used to set a value behind a field - //! given by the field template argument of a tagged tuple that exist as a - //! value of a std::map behind a key at the 3rd level of Control object - //! given by the tag, subtag, and subsubtag template arguments. The - //! assumed hierarchy is: Control (this object) -> tag -> subtag -> - //! subsubtag -> std::map< key_type, tagged_tuple > -> field = value. This - //! is similar to insert_field, but performs no conversion. - //! \param[in] key Key to insert to std::map behind tag, subtag, and - //! subsubtag given by the template arguments - //! \param[in] value Value to insert to std::map behind tag, subtag, and - //! subsubtag given by the template arguments - // TODO Combine the three overloads into a single variadic one - template< typename key_type, typename field, typename field_type, - typename tag, typename subtag, typename subsubtag > - void insert_opt( const key_type& key, const field_type& value ) { - Tuple::template get(). - template get(). - template get()[ key ].template get() = value; - } - ///@} - - //! \brief Convert string to a type given by the template argument using - //! std::stringstream - //! \param[in] str String to convert - //! \return A value of type given by the template argument - template< typename type > - type convert( const std::string& str ) { - std::stringstream ss( str ); - type num; - ss >> std::boolalpha >> num; - if (ss.fail()) - Throw( "Failed to convert '" + str + - "' to typeid " + typeid(num).name() ); - return num; - } - - //! \brief Convert value of type given by the template argument to - //! std::string using std::stringstream - //! \param[in] val Value of type given by the template argument - //! \return std::string of value converted - template< typename type > - std::string convert( const type& val ) { - std::stringstream ss; - ss << std::boolalpha << val; - if (ss.fail()) Throw( "Failed to convert value to string" ); - return ss.str(); - } - - /** @name Pack/Unpack: Serialize Control object for Charm++ */ - ///@{ - //! \brief Pack/Unpack serialize member function - //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { Tuple::pup(p); } - //! \brief Pack/Unpack serialize operator| - //! \param[in,out] p Charm++'s PUP::er serializer object reference - //! \param[in,out] c Control object reference - friend void operator|( PUP::er& p, Control& c ) { c.pup(p); } - ///@} -}; - -} // tk:: - -#endif // Control_h diff --git a/src/Control/FileConv/CmdLine/CmdLine.hpp b/src/Control/FileConv/CmdLine/CmdLine.hpp index 375ef96c218..a4c2cedb013 100644 --- a/src/Control/FileConv/CmdLine/CmdLine.hpp +++ b/src/Control/FileConv/CmdLine/CmdLine.hpp @@ -19,7 +19,6 @@ #include #include "Macro.hpp" -#include "Control.hpp" #include "Keywords.hpp" #include "HelpFactory.hpp" #include "FileConv/Types.hpp" @@ -28,23 +27,28 @@ namespace fileconv { //! File converter control facilitating user input to internal data transfer namespace ctr { +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::io, ios + , tag::verbose, bool + , tag::chare, bool + , tag::help, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::error, std::vector< std::string > +>; + //! \brief CmdLine : Control< specialized to FileConv > //! \details The stack is a tagged tuple, a hierarchical heterogeneous data //! structure where all parsed information is stored. //! \see Base/TaggedTuple.h //! \see Control/FileConv/Types.h -class CmdLine : - public tk::Control< // tag type - tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > > { +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { public: //! \brief FileConv command-line keywords //! \see tk::grm::use and its documentation @@ -56,6 +60,8 @@ class CmdLine : , kw::output , kw::quiescence , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set defaults. @@ -65,9 +71,11 @@ class CmdLine : //! control file parser. //! \see walker::ctr::CmdLine CmdLine() { - set< tag::verbose >( false ); // Use quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::verbose >() = false; // Use quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords brigand::for_each< keywords::set >( tk::ctr::Info(get()) ); } @@ -76,18 +84,7 @@ class CmdLine : ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] c CmdLine object reference diff --git a/src/Control/FileConv/CmdLine/Grammar.hpp b/src/Control/FileConv/CmdLine/Grammar.hpp index ea1471ea85e..6d08ea23c4b 100644 --- a/src/Control/FileConv/CmdLine/Grammar.hpp +++ b/src/Control/FileConv/CmdLine/Grammar.hpp @@ -70,6 +70,16 @@ namespace cmd { tk::grm::process_cmd_switch< use, kw::trace, tag::trace > {}; + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! \brief Match all command line keywords struct keywords : pegtl::sor< verbose, @@ -78,6 +88,8 @@ namespace cmd { helpkw, quiescence, trace, + version, + license, io< kw::input, tag::input >, io< kw::output, tag::output > > {}; diff --git a/src/Control/FileConv/CmdLine/Parser.cpp b/src/Control/FileConv/CmdLine/Parser.cpp index 72a6efab21a..0cee4b8b9b9 100644 --- a/src/Control/FileConv/CmdLine/Parser.cpp +++ b/src/Control/FileConv/CmdLine/Parser.cpp @@ -11,19 +11,13 @@ */ // ***************************************************************************** -#include -#include -#include -#include - #include "NoWarning/pegtl.hpp" - #include "NoWarning/charm.hpp" + #include "QuinoaConfig.hpp" #include "Exception.hpp" #include "Print.hpp" #include "Keywords.hpp" -#include "HelpFactory.hpp" #include "FileConv/Types.hpp" #include "FileConv/CmdLine/Parser.hpp" #include "FileConv/CmdLine/Grammar.hpp" @@ -82,12 +76,33 @@ CmdLineParser::CmdLineParser( int argc, // Print out help on all command-line arguments if the executable was invoked // without arguments or the help was requested const auto helpcmd = cmdline.get< tag::help >(); + if (argc == 1 || helpcmd) + print.help< tk::QUIET >( tk::fileconv_executable(), + cmdline.get< tag::cmdinfo >(), + "Command-line Parameters:", "-" ); + // Print out verbose help for a single keyword if requested const auto helpkw = cmdline.get< tag::helpkw >(); + if (!helpkw.keyword.empty()) + print.helpkw< tk::QUIET >( tk::fileconv_executable(), helpkw ); + + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::fileconv_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::fileconv_executable(), tk::license() ); // Immediately exit if any help was output or was called without any argument - // with zero exit code - if (argc == 1 || helpcmd || !helpkw.keyword.empty()) CkExit(); + // or version or license info was requested with zero exit code + if (argc == 1 || helpcmd || !helpkw.keyword.empty() || version || license) + CkExit(); // Make sure mandatory arguments are set auto ialias = kw::input().alias(); diff --git a/src/Control/FileConv/Types.hpp b/src/Control/FileConv/Types.hpp index ab3b1e93812..e8b50f1cd82 100644 --- a/src/Control/FileConv/Types.hpp +++ b/src/Control/FileConv/Types.hpp @@ -25,10 +25,10 @@ namespace ctr { using namespace tao; //! IO parameters storage -using ios = tk::tuple::tagged_tuple< - tag::input, std::string, //!< Input filename - tag::output, std::string //!< Output filename ->; +using ios = tk::TaggedTuple< brigand::list< + tag::input, std::string //!< Input filename + , tag::output, std::string //!< Output filename +> >; //! PEGTL location/position type to use throughout all of MeshConv's parsers using Location = pegtl::position; diff --git a/src/Control/HelpFactory.hpp b/src/Control/HelpFactory.hpp index d73ebf54044..70dbd9be09d 100644 --- a/src/Control/HelpFactory.hpp +++ b/src/Control/HelpFactory.hpp @@ -13,8 +13,6 @@ #ifndef HelpFactory_h #define HelpFactory_h -#include - #include #include @@ -39,11 +37,11 @@ namespace ctr { struct KeywordInfo { std::string shortDescription; //!< Short description std::string longDescription; //!< Long description - boost::optional< std::string > alias; //!< Keyword alias - boost::optional< std::string > expt; //!< Expected type description - boost::optional< std::string > lower; //!< Lower bound as string - boost::optional< std::string > upper; //!< Upper bound as string - boost::optional< std::string > choices; //!< Expected choices descr. + std::optional< std::string > alias; //!< Keyword alias + std::optional< std::string > expt; //!< Expected type description + std::optional< std::string > lower; //!< Lower bound as string + std::optional< std::string > upper; //!< Upper bound as string + std::optional< std::string > choices; //!< Expected choices description /** @name Pack/Unpack: Serialize KeywordInfo object for Charm++ */ ///@{ diff --git a/src/Control/Inciter/CmdLine/CmdLine.hpp b/src/Control/Inciter/CmdLine/CmdLine.hpp index c6721e4a798..a9352b4d575 100644 --- a/src/Control/Inciter/CmdLine/CmdLine.hpp +++ b/src/Control/Inciter/CmdLine/CmdLine.hpp @@ -18,7 +18,6 @@ #include -#include "Control.hpp" #include "HelpFactory.hpp" #include "Keywords.hpp" #include "Inciter/Types.hpp" @@ -27,28 +26,34 @@ namespace inciter { //! Inciter control facilitating user input to internal data transfer namespace ctr { +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::io, ios + , tag::virtualization, kw::virtualization::info::expect::type + , tag::verbose, bool + , tag::chare, bool + , tag::nonblocking, bool + , tag::benchmark, bool + , tag::feedback, bool + , tag::help, bool + , tag::helpctr, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::error, std::vector< std::string > + , tag::lbfreq, kw::lbfreq::info::expect::type + , tag::rsfreq, kw::rsfreq::info::expect::type +>; + //! \brief CmdLine : Control< specialized to Inciter > //! \details The stack is a tagged tuple //! \see Base/TaggedTuple.h //! \see Control/Inciter/Types.h -class CmdLine : public tk::Control< - // tag type - tag::io, ios, - tag::virtualization, kw::virtualization::info::expect::type, - tag::verbose, bool, - tag::chare, bool, - tag::nonblocking, bool, - tag::benchmark, bool, - tag::feedback, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string >, - tag::lbfreq, kw::lbfreq::info::expect::type > { +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { public: //! \brief Inciter command-line keywords @@ -65,10 +70,14 @@ class CmdLine : public tk::Control< , kw::control , kw::input , kw::output - , kw::diagnostics + , kw::restart + , kw::diagnostics_cmd , kw::quiescence , kw::lbfreq + , kw::rsfreq , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set all defaults. @@ -103,17 +112,21 @@ class CmdLine : public tk::Control< //! otherwise it would be a mutual dependency. // cppcheck-suppress noExplicitConstructor CmdLine( tk::ctr::HelpFactory ctrinfo = tk::ctr::HelpFactory() ) { - set< tag::io, tag::output >( "out" ); - set< tag::io, tag::diag >( "diag" ); - set< tag::io, tag::part >( "track.h5part" ); - set< tag::virtualization >( 0.0 ); - set< tag::verbose >( false ); // Quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::nonblocking>( false ); // Blocking migration by default - set< tag::benchmark >( false ); // No benchmark mode by default - set< tag::feedback >( false ); // No detailed feedback by default - set< tag::lbfreq >( 1 ); // Load balancing every time-step by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::io, tag::output >() = "out"; + get< tag::io, tag::diag >() = "diag"; + get< tag::io, tag::part >() = "track.h5part"; + get< tag::io, tag::restart >() = "restart"; + get< tag::virtualization >() = 0.0; + get< tag::verbose >() = false; // Quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::nonblocking>() = false; // Blocking migration by default + get< tag::benchmark >() = false; // No benchmark mode by default + get< tag::feedback >() = false; // No detailed feedback by default + get< tag::lbfreq >() = 1; // Load balancing every time-step by default + get< tag::rsfreq >() = 100;// Chkpt/restart after this many time steps + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords + add map passed in brigand::for_each< keywords::set >( tk::ctr::Info(get()) ); get< tag::ctrinfo >() = std::move( ctrinfo ); @@ -123,24 +136,7 @@ class CmdLine : public tk::Control< ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::io, ios, - tag::virtualization, kw::virtualization::info::expect::type, - tag::verbose, bool, - tag::chare, bool, - tag::nonblocking, bool, - tag::benchmark, bool, - tag::feedback, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string >, - tag::lbfreq, kw::lbfreq::info::expect::type >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] c CmdLine object reference diff --git a/src/Control/Inciter/CmdLine/Grammar.hpp b/src/Control/Inciter/CmdLine/Grammar.hpp index 1757a13b0a4..6530b3694ee 100644 --- a/src/Control/Inciter/CmdLine/Grammar.hpp +++ b/src/Control/Inciter/CmdLine/Grammar.hpp @@ -100,11 +100,28 @@ namespace cmd { tk::grm::number, tag::lbfreq > {}; + //! Match and set checkpoint/restartfrequency + struct rsfreq : + tk::grm::process_cmd< use, kw::rsfreq, + tk::grm::Store< tag::rsfreq >, + tk::grm::number, + tag::rsfreq > {}; + //! Match switch on trace output struct trace : tk::grm::process_cmd_switch< use, kw::trace, tag::trace > {}; + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! Match all command line keywords struct keywords : pegtl::sor< verbose, @@ -118,11 +135,15 @@ namespace cmd { helpkw, quiescence, lbfreq, + rsfreq, trace, + version, + license, io< kw::control, tag::control >, io< kw::input, tag::input >, io< kw::output, tag::output >, - io< kw::diagnostics, tag::diag > > {}; + io< kw::diagnostics_cmd, tag::diag >, + io< kw::restart, tag::restart > > {}; //! Grammar entry point: parse keywords until end of string struct read_string : diff --git a/src/Control/Inciter/CmdLine/Parser.cpp b/src/Control/Inciter/CmdLine/Parser.cpp index 4174cce2acb..5e9d9051e83 100644 --- a/src/Control/Inciter/CmdLine/Parser.cpp +++ b/src/Control/Inciter/CmdLine/Parser.cpp @@ -11,17 +11,12 @@ */ // ***************************************************************************** -#include -#include -#include - #include "NoWarning/pegtl.hpp" #include "NoWarning/charm.hpp" -#include "Print.hpp" #include "QuinoaConfig.hpp" #include "Exception.hpp" -#include "HelpFactory.hpp" +#include "Print.hpp" #include "Keywords.hpp" #include "Inciter/Types.hpp" #include "Inciter/CmdLine/Parser.hpp" @@ -105,9 +100,26 @@ CmdLineParser::CmdLineParser( int argc, char** argv, if (!helpkw.keyword.empty()) print.helpkw< tk::QUIET >( tk::inciter_executable(), helpkw ); + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::inciter_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::inciter_executable(), tk::license() ); + // Immediately exit if any help was output or was called without any argument - // with zero exit code - if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty()) CkExit(); + // or version or license info was requested with zero exit code + if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty() || version || + license) + { + CkExit(); + } // Make sure mandatory arguments are set auto ctralias = kw::control().alias(); diff --git a/src/Control/Inciter/Components.hpp b/src/Control/Inciter/Components.hpp index f2cbc35e451..e84756e063f 100644 --- a/src/Control/Inciter/Components.hpp +++ b/src/Control/Inciter/Components.hpp @@ -7,7 +7,7 @@ All rights reserved. See the LICENSE file for details. \brief Storage for number of components \details Storage for number of components. This is part of the input deck - stack and is thus populated during the control file parsing. + stack and is thus populated during control file parsing. */ // ***************************************************************************** #ifndef InciterComponents_h @@ -18,11 +18,11 @@ namespace inciter { namespace ctr { -//! Number of components of partial differential equations +//! Number of components storage for all systems of equations supported using ncomps = tk::ctr::ncomponents< - tag::transport, std::vector< tk::ctr::ncomp_type >, - tag::compflow, std::vector< tk::ctr::ncomp_type >, - tag::multimat, std::vector< tk::ctr::ncomp_type > + tag::transport + , tag::compflow + , tag::multimat >; } // ctr:: diff --git a/src/Control/Inciter/InputDeck/Grammar.hpp b/src/Control/Inciter/InputDeck/Grammar.hpp index 25b565d0b8b..3816d8d1a20 100644 --- a/src/Control/Inciter/InputDeck/Grammar.hpp +++ b/src/Control/Inciter/InputDeck/Grammar.hpp @@ -38,9 +38,11 @@ namespace deck { //! \brief Number of registered equations //! \details Counts the number of parsed equation blocks during parsing. - static tk::tuple::tagged_tuple< tag::transport, std::size_t, - tag::compflow, std::size_t, - tag::multimat, std::size_t > neq; + static tk::TaggedTuple< brigand::list< + tag::transport, std::size_t + , tag::compflow, std::size_t + , tag::multimat, std::size_t + > > neq; } // ::deck } // ::inciter @@ -150,6 +152,30 @@ namespace grm { // Set number of components to 5 (mass, 3 x mom, energy) stack.template get< tag::component, eq >().push_back( 5 ); + // Verify correct number of multi-material properties configured + const auto& gamma = stack.template get< tag::param, eq, tag::gamma >(); + if (gamma.empty() || gamma.back().size() != 1) + Message< Stack, ERROR, MsgKey::EOSGAMMA >( stack, in ); + + // If specific heat is not given, set defaults + using cv_t = kw::mat_cv::info::expect::type; + auto& cv = stack.template get< tag::param, eq, tag::cv >(); + // As a default, the specific heat of air (717.5 J/Kg-K) is used + if (cv.empty()) + cv.push_back( std::vector< cv_t >( 1, 717.5 ) ); + // If specific heat vector is wrong size, error out + if (cv.back().size() != 1) + Message< Stack, ERROR, MsgKey::EOSCV >( stack, in ); + + // If stiffness coefficient is not given, set defaults + using pstiff_t = kw::mat_pstiff::info::expect::type; + auto& pstiff = stack.template get< tag::param, eq, tag::pstiff >(); + if (pstiff.empty()) + pstiff.push_back( std::vector< pstiff_t >( 1, 0.0 ) ); + // If stiffness coefficient vector is wrong size, error out + if (pstiff.back().size() != 1) + Message< Stack, ERROR, MsgKey::EOSPSTIFF >( stack, in ); + // If problem type is not given, default to 'user_defined' auto& problem = stack.template get< tag::param, eq, tag::problem >(); if (problem.empty() || problem.size() != neq.get< eq >()) @@ -230,12 +256,16 @@ namespace grm { if (physics.empty() || physics.size() != neq.get< eq >()) physics.push_back( inciter::ctr::PhysicsType::VELEQ ); + // Use default flux type as 'ausm' + auto& flux = stack.template get< tag::discr, tag::flux >(); + flux = inciter::ctr::FluxType::AUSM; + // Set number of scalar components based on number of materials auto& nmat = stack.template get< tag::param, eq, tag::nmat >(); auto& ncomp = stack.template get< tag::component, eq >(); if (physics.back() == inciter::ctr::PhysicsType::VELEQ) { // physics = veleq: m-material compressible flow - // scalar components: volfrac:m-1 + mass:m + momentum:3 + energy:m + // scalar components: volfrac:m + mass:m + momentum:3 + energy:m // if nmat is unspecified, configure it be 2 if (nmat.empty() || nmat.size() != neq.get< eq >()) { Message< Stack, WARNING, MsgKey::NONMAT >( stack, in ); @@ -243,9 +273,33 @@ namespace grm { } // set ncomp based on nmat auto m = nmat.back(); - ncomp.push_back( m-1 + m + 3 + m ); + ncomp.push_back( m + m + 3 + m ); } + // Verify correct number of multi-material properties configured + auto& gamma = stack.template get< tag::param, eq, tag::gamma >(); + if (gamma.empty() || gamma.back().size() != nmat.back()) + Message< Stack, ERROR, MsgKey::EOSGAMMA >( stack, in ); + + // If specific heats are not given, set defaults + using cv_t = kw::mat_cv::info::expect::type; + auto& cv = stack.template get< tag::param, eq, tag::cv >(); + // As a default, the specific heat of air (717.5 J/Kg-K) is used + if (cv.empty()) + cv.push_back( std::vector< cv_t >( nmat.back(), 717.5 ) ); + // If specific heat vector is wrong size, error out + if (cv.back().size() != nmat.back()) + Message< Stack, ERROR, MsgKey::EOSCV >( stack, in ); + + // If stiffness coefficients are not given, set defaults + using pstiff_t = kw::mat_pstiff::info::expect::type; + auto& pstiff = stack.template get< tag::param, eq, tag::pstiff >(); + if (pstiff.empty()) + pstiff.push_back( std::vector< pstiff_t >( nmat.back(), 0.0 ) ); + // If stiffness coefficient vector is wrong size, error out + if (pstiff.back().size() != nmat.back()) + Message< Stack, ERROR, MsgKey::EOSPSTIFF >( stack, in ); + // If problem type is not given, default to 'user_defined' auto& problem = stack.template get< tag::param, eq, tag::problem >(); if (problem.empty() || problem.size() != neq.get< eq >()) @@ -306,21 +360,52 @@ namespace grm { std::abs(cfl - g_inputdeck_defaults.get< tag::discr, tag::cfl >()) > std::numeric_limits< tk::real >::epsilon() ) Message< Stack, WARNING, MsgKey::MULDT >( stack, in ); - // if DGP1 is configured, set ndofs to be 4 + + // "ndof" are the degrees of freedom that are evolved in the numerical + // method. For finite volume (or DGP0), these are the cell-averages. This + // implies that ndof=1 for DGP0. Similarly, ndof=4 and 10 for DGP1 and + // DGP2 respectively, since they evolve higher (>1) order solution + // information (e.g. gradients) as well. + // "rdof" include degrees of freedom that are both, evolved and + // reconstructed. For rDGPnPm methods (e.g. P0P1 and P1P2), "n" denotes + // the evolved solution-order and "m" denotes the reconstructed + // solution-order; i.e. P0P1 has ndof=1 and rdof=4, whereas P1P2 has + // ndof=4 and rdof=10. For a pure DG method without reconstruction (DGP0, + // DGP1, DGP2), rdof=ndof. + // For more information about rDGPnPm methods, ref. Luo, H. et al. (2013). + // A reconstructed discontinuous Galerkin method based on a hierarchical + // WENO reconstruction for compressible flows on tetrahedral grids. + // Journal of Computational Physics, 236, 477-492. + + // if P0P1 is configured, set ndofs to be 1 and rdofs to be 4 + if (stack.template get< tag::discr, tag::scheme >() == + inciter::ctr::SchemeType::P0P1) + { + stack.template get< tag::discr, tag::ndof >() = 1; + stack.template get< tag::discr, tag::rdof >() = 4; + } + // if DGP1 is configured, set ndofs and rdofs to be 4 if (stack.template get< tag::discr, tag::scheme >() == inciter::ctr::SchemeType::DGP1) + { stack.template get< tag::discr, tag::ndof >() = 4; - // if DGP2 is configured, set ndofs to be 10 + stack.template get< tag::discr, tag::rdof >() = 4; + } + // if DGP2 is configured, set ndofs and rdofs to be 10 if (stack.template get< tag::discr, tag::scheme >() == inciter::ctr::SchemeType::DGP2) + { stack.template get< tag::discr, tag::ndof >() = 10; - // if pDG is configured, set ndofs to be 4 and the adaptive indicator - // pref set to be true (temporary for P0/P1 adaptive) + stack.template get< tag::discr, tag::rdof >() = 10; + } + // if pDG is configured, set ndofs and rdofs to be 4 and the adaptive + // indicator pref set to be true (temporary for P0/P1 adaptive) if (stack.template get< tag::discr, tag::scheme >() == inciter::ctr::SchemeType::PDG) { stack.template get< tag::discr, tag::ndof >() = 4; - stack.template get< tag::discr, tag::pref >() = true; + stack.template get< tag::discr, tag::rdof >() = 4; + stack.template get< tag::pref, tag::pref >() = true; } } }; @@ -411,6 +496,19 @@ namespace grm { } }; + //! Rule used to trigger action + struct check_pref_errors : pegtl::success {}; + //! Do error checking for the pref...end block + template<> + struct action< check_pref_errors > { + template< typename Input, typename Stack > + static void apply( const Input& in, Stack& stack ) { + auto& tolref = stack.template get< tag::pref, tag::tolref >(); + if (tolref < 0.0 || tolref > 1.0) + Message< Stack, ERROR, MsgKey::PREFTOL >( stack, in ); + } + }; + } // ::grm } // ::tk @@ -540,20 +638,20 @@ namespace deck { //! put in material property for equation matching keyword template< typename eq, typename keyword, typename property > struct material_property : - tk::grm::process< use< keyword >, - tk::grm::Store_back< tag::param, eq, property > > {}; + pde_parameter_vector< keyword, eq, property > {}; //! Material properties block for compressible flow template< class eq > struct material_properties : pegtl::if_must< tk::grm::readkw< use< kw::material >::pegtl_string >, - tk::grm::block< use< kw::end >, - material_property< eq, kw::id, tag::id >, - material_property< eq, kw::mat_gamma, tag::gamma >, - material_property< eq, kw::mat_mu, tag::mu >, - material_property< eq, kw::mat_cv, tag::cv >, - material_property< eq, kw::mat_k, tag::k > > > {}; + tk::grm::block< + use< kw::end >, + material_property< eq, kw::mat_gamma, tag::gamma >, + material_property< eq, kw::mat_pstiff, tag::pstiff >, + material_property< eq, kw::mat_mu, tag::mu >, + material_property< eq, kw::mat_cv, tag::cv >, + material_property< eq, kw::mat_k, tag::k > > > {}; //! put in PDE parameter for equation matching keyword template< typename eq, typename keyword, typename p, @@ -737,6 +835,14 @@ namespace deck { ctr::AMRError, tag::amr, tag::error >, pegtl::alpha >, + tk::grm::control< use< kw::amr_tolref >, + pegtl::digit, + tag::amr, + tag::tolref >, + tk::grm::control< use< kw::amr_tolderef >, + pegtl::digit, + tag::amr, + tag::tolderef >, tk::grm::process< use< kw::amr_t0ref >, tk::grm::Store< tag::amr, tag::t0ref >, pegtl::alpha >, @@ -752,6 +858,17 @@ namespace deck { >, tk::grm::check_amr_errors > {}; + //! p-adaptive refinement (pref) ...end block + struct pref : + pegtl::if_must< + tk::grm::readkw< use< kw::pref >::pegtl_string >, + tk::grm::block< use< kw::end >, + tk::grm::control< use< kw::pref_tolref >, + pegtl::digit, + tag::pref, + tag::tolref > >, + tk::grm::check_pref_errors > {}; + //! plotvar ... end block struct plotvar : pegtl::if_must< @@ -776,6 +893,7 @@ namespace deck { discretization, equations, amr, + pref, partitioning, plotvar, tk::grm::diagnostics< diff --git a/src/Control/Inciter/InputDeck/InputDeck.hpp b/src/Control/Inciter/InputDeck/InputDeck.hpp index 74ac5ad3e4e..2e90d78a67c 100644 --- a/src/Control/Inciter/InputDeck/InputDeck.hpp +++ b/src/Control/Inciter/InputDeck/InputDeck.hpp @@ -22,32 +22,35 @@ #include "NoWarning/set.hpp" -#include "Control.hpp" #include "Inciter/CmdLine/CmdLine.hpp" #include "Inciter/Components.hpp" namespace inciter { namespace ctr { +//! Member data for tagged tuple +using InputDeckMembers = brigand::list< + tag::title, kw::title::info::expect::type + , tag::selected, selects + , tag::amr, amr + , tag::pref, pref + , tag::discr, discretization + , tag::prec, precision + , tag::flformat, floatformat + , tag::component, ncomps + , tag::interval, intervals + , tag::cmd, CmdLine + , tag::param, parameters + , tag::diag, diagnostics + , tag::error, std::vector< std::string > +>; + //! \brief InputDeck : Control< specialized to Inciter >, see Types.h, //! \details The stack is a tagged tuple, a hierarchical heterogeneous data //! structure where all parsed information is stored. //! \see Base/TaggedTuple.h //! \see Control/Inciter/Types.h -class InputDeck : - public tk::Control< // tag type - tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::amr, amr, - tag::discr, discretization, - tag::prec, precision, - tag::flformat, floatformat, - tag::component, ncomps, - tag::interval, intervals, - tag::cmd, CmdLine, - tag::param, parameters, - tag::diag, diagnostics, - tag::error, std::vector< std::string > > { +class InputDeck : public tk::TaggedTuple< InputDeckMembers > { public: //! \brief Inciter input deck keywords @@ -91,6 +94,7 @@ class InputDeck : kw::material, kw::id, kw::mat_gamma, + kw::mat_pstiff, kw::mat_mu, kw::mat_cv, kw::mat_k, @@ -134,12 +138,15 @@ class InputDeck : kw::amr_dtfreq, kw::amr_initial, kw::amr_uniform, + kw::amr_uniform_derefine, kw::amr_initial_conditions, kw::amr_coords, kw::amr_error, kw::amr_jump, kw::amr_hessian, kw::amr_refvar, + kw::amr_tolref, + kw::amr_tolderef, kw::amr_edgelist, kw::amr_coordref, kw::amr_xminus, @@ -148,10 +155,13 @@ class InputDeck : kw::amr_yplus, kw::amr_zminus, kw::amr_zplus, + kw::pref, + kw::pref_tolref, kw::scheme, kw::diagcg, kw::alecg, kw::dg, + kw::p0p1, kw::dgp1, kw::dgp2, kw::pdg, @@ -159,6 +169,7 @@ class InputDeck : kw::laxfriedrichs, kw::hllc, kw::upwind, + kw::ausm, kw::limiter, kw::cweight, kw::nolimiter, @@ -172,7 +183,8 @@ class InputDeck : kw::rotated_sod_shocktube, kw::cyl_advect, kw::sod_shocktube, - kw::sedov_blastwave >; + kw::sedov_blastwave, + kw::interface_advection >; //! \brief Constructor: set defaults //! \param[in] cl Previously parsed and store command line @@ -180,47 +192,53 @@ class InputDeck : //! default constructor for the corresponding type. explicit InputDeck( const CmdLine& cl = {} ) { // Set previously parsed command line - set< tag::cmd >( cl ); + get< tag::cmd >() = cl; // Default discretization parameters - set< tag::discr, tag::nstep > - ( std::numeric_limits< kw::nstep::info::expect::type >::max() ); - set< tag::discr, tag::term > - ( std::numeric_limits< kw::term::info::expect::type >::max() ); - set< tag::discr, tag::t0 >( 0.0 ); - set< tag::discr, tag::dt >( 0.0 ); - set< tag::discr, tag::cfl >( 0.0 ); - set< tag::discr, tag::fct >( true ); - set< tag::discr, tag::reorder >( false ); - set< tag::discr, tag::ctau >( 1.0 ); - set< tag::discr, tag::scheme >( SchemeType::DiagCG ); - set< tag::discr, tag::flux >( FluxType::HLLC ); - set< tag::discr, tag::ndof >( 1 ); - set< tag::discr, tag::pref >( false ); - set< tag::discr, tag::limiter >( LimiterType::NOLIMITER ); - set< tag::discr, tag::cweight >( 1.0 ); + get< tag::discr, tag::nstep >() = + std::numeric_limits< kw::nstep::info::expect::type >::max(); + get< tag::discr, tag::term >() = + std::numeric_limits< kw::term::info::expect::type >::max(); + get< tag::discr, tag::t0 >() = 0.0; + get< tag::discr, tag::dt >() = 0.0; + get< tag::discr, tag::cfl >() = 0.0; + get< tag::discr, tag::fct >() = true; + get< tag::discr, tag::reorder >() = false; + get< tag::discr, tag::ctau >() = 1.0; + get< tag::discr, tag::scheme >() = SchemeType::DiagCG; + get< tag::discr, tag::flux >() = FluxType::HLLC; + get< tag::discr, tag::ndof >() = 1; + get< tag::discr, tag::limiter >() = LimiterType::NOLIMITER; + get< tag::discr, tag::cweight >() = 1.0; + get< tag::discr, tag::ndof >() = 1; + get< tag::discr, tag::rdof >() = 1; // Default field output file type - set< tag::selected, tag::filetype >( tk::ctr::FieldFileType::EXODUSII ); + get< tag::selected, tag::filetype >() = tk::ctr::FieldFileType::EXODUSII; // Default AMR settings - set< tag::amr, tag::amr >( false ); - set< tag::amr, tag::t0ref >( false ); - set< tag::amr, tag::dtref >( false ); - set< tag::amr, tag::dtref_uniform >( false ); - set< tag::amr, tag::dtfreq >( 3 ); - set< tag::amr, tag::error >( AMRErrorType::JUMP ); + get< tag::amr, tag::amr >() = false; + get< tag::amr, tag::t0ref >() = false; + get< tag::amr, tag::dtref >() = false; + get< tag::amr, tag::dtref_uniform >() = false; + get< tag::amr, tag::dtfreq >() = 3; + get< tag::amr, tag::error >() = AMRErrorType::JUMP; + get< tag::amr, tag::tolref >() = 0.2; + get< tag::amr, tag::tolderef >() = 0.05; auto rmax = std::numeric_limits< kw::amr_xminus::info::expect::type >::max(); - set< tag::amr, tag::xminus >( rmax ); - set< tag::amr, tag::xplus >( rmax ); - set< tag::amr, tag::yminus >( rmax ); - set< tag::amr, tag::yplus >( rmax ); - set< tag::amr, tag::zminus >( rmax ); - set< tag::amr, tag::zplus >( rmax ); + get< tag::amr, tag::xminus >() = rmax; + get< tag::amr, tag::xplus >() = -rmax; + get< tag::amr, tag::yminus >() = rmax; + get< tag::amr, tag::yplus >() = -rmax; + get< tag::amr, tag::zminus >() = rmax; + get< tag::amr, tag::zplus >() = -rmax; + // Default p-refinement settings + get< tag::pref, tag::pref >() = false; + get< tag::pref, tag::tolref >() = 0.1; // Default txt floating-point output precision in digits - set< tag::prec, tag::diag >( std::cout.precision() ); + get< tag::prec, tag::diag >() = std::cout.precision(); // Default intervals - set< tag::interval, tag::tty >( 1 ); - set< tag::interval, tag::field >( 1 ); - set< tag::interval, tag::diag >( 1 ); + get< tag::interval, tag::tty >() = 1; + get< tag::interval, tag::field >() = 1; + get< tag::interval, tag::diag >() = 1; // Initialize help: fill own keywords const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() ); brigand::for_each< keywords >( ctrinfoFill ); @@ -230,20 +248,7 @@ class InputDeck : ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::amr, amr, - tag::discr, discretization, - tag::prec, precision, - tag::flformat, floatformat, - tag::component, ncomps, - tag::interval, intervals, - tag::cmd, CmdLine, - tag::param, parameters, - tag::diag, diagnostics, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] i InputDeck object reference diff --git a/src/Control/Inciter/Options/AMRInitial.hpp b/src/Control/Inciter/Options/AMRInitial.hpp index 8c00dd6fe58..4aef385a0fb 100644 --- a/src/Control/Inciter/Options/AMRInitial.hpp +++ b/src/Control/Inciter/Options/AMRInitial.hpp @@ -24,6 +24,7 @@ namespace ctr { //! Initial AMR types enum class AMRInitialType : uint8_t { UNIFORM + , UNIFORM_DEREFINE , INITIAL_CONDITIONS , EDGELIST , COORDINATES }; @@ -38,6 +39,7 @@ class AMRInitial : public tk::Toggle< AMRInitialType > { public: //! Valid expected choices to make them also available at compile-time using keywords = brigand::list< kw::amr_uniform + , kw::amr_uniform_derefine , kw::amr_initial_conditions , kw::amr_edgelist , kw::amr_coords >; @@ -51,12 +53,16 @@ class AMRInitial : public tk::Toggle< AMRInitialType > { kw::amr_initial::name(), //! Enums -> names { { AMRInitialType::UNIFORM, kw::amr_uniform::name() }, + { AMRInitialType::UNIFORM_DEREFINE, + kw::amr_uniform_derefine::name() }, { AMRInitialType::INITIAL_CONDITIONS, kw::amr_initial_conditions::name() }, { AMRInitialType::EDGELIST, kw::amr_edgelist::name() }, { AMRInitialType::COORDINATES, kw::amr_coords::name() } }, //! keywords -> Enums { { kw::amr_uniform::string(), AMRInitialType::UNIFORM }, + { kw::amr_uniform_derefine::string(), + AMRInitialType::UNIFORM_DEREFINE }, { kw::amr_initial_conditions::string(), AMRInitialType::INITIAL_CONDITIONS }, { kw::amr_edgelist::string(), AMRInitialType::EDGELIST }, @@ -83,7 +89,7 @@ class AMRInitial : public tk::Toggle< AMRInitialType > { //! \brief Function call operator templated on the type to assert the //! existence of a policy code template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); } }; @@ -91,6 +97,7 @@ class AMRInitial : public tk::Toggle< AMRInitialType > { //! Enums -> policy code std::map< AMRInitialType, std::string > policy { { AMRInitialType::UNIFORM, *kw::amr_uniform::code() } + , { AMRInitialType::UNIFORM_DEREFINE, *kw::amr_uniform_derefine::code() } , { AMRInitialType::INITIAL_CONDITIONS, *kw::amr_initial_conditions::code() } , { AMRInitialType::EDGELIST, *kw::amr_edgelist::code() } diff --git a/src/Control/Inciter/Options/Flux.hpp b/src/Control/Inciter/Options/Flux.hpp index 8865d38175f..c6745acc645 100644 --- a/src/Control/Inciter/Options/Flux.hpp +++ b/src/Control/Inciter/Options/Flux.hpp @@ -24,7 +24,8 @@ namespace ctr { //! Flux types enum class FluxType : uint8_t { LaxFriedrichs , HLLC - , UPWIND }; + , UPWIND + , AUSM }; //! Pack/Unpack FluxType: forward overload to generic enum class packer inline void operator|( PUP::er& p, FluxType& e ) { PUP::pup( p, e ); } @@ -37,6 +38,7 @@ class Flux : public tk::Toggle< FluxType > { using keywords = brigand::list< kw::laxfriedrichs , kw::hllc , kw::upwind + , kw::ausm >; //! \brief Options constructor @@ -49,11 +51,13 @@ class Flux : public tk::Toggle< FluxType > { //! Enums -> names (if defined, policy codes, if not, name) { { FluxType::LaxFriedrichs, kw::laxfriedrichs::name() }, { FluxType::HLLC, kw::hllc::name() }, - { FluxType::UPWIND, kw::upwind::name() } }, + { FluxType::UPWIND, kw::upwind::name() }, + { FluxType::AUSM, kw::ausm::name() } }, //! keywords -> Enums { { kw::laxfriedrichs::string(), FluxType::LaxFriedrichs }, { kw::hllc::string(), FluxType::HLLC }, - { kw::upwind::string(), FluxType::UPWIND } } ) + { kw::upwind::string(), FluxType::UPWIND }, + { kw::ausm::string(), FluxType::AUSM } } ) {} }; diff --git a/src/Control/Inciter/Options/PDE.hpp b/src/Control/Inciter/Options/PDE.hpp index 5f5af47edd5..a9dafc938d3 100644 --- a/src/Control/Inciter/Options/PDE.hpp +++ b/src/Control/Inciter/Options/PDE.hpp @@ -33,9 +33,11 @@ inline void operator|( PUP::er& p, PDEType& e ) { PUP::pup( p, e ); } //! Differential equation key used to access a diff eq in a factory using PDEKey = - tk::tuple::tagged_tuple< tag::pde, PDEType, - tag::physics, ctr::PhysicsType, - tag::problem, ctr::ProblemType >; + tk::TaggedTuple< brigand::list< + tag::pde, PDEType + , tag::physics, ctr::PhysicsType + , tag::problem, ctr::ProblemType + > >; //! Class with base templated on the above enum class with associations class PDE : public tk::Toggle< PDEType > { diff --git a/src/Control/Inciter/Options/Physics.hpp b/src/Control/Inciter/Options/Physics.hpp index a206974ecc3..d92bc3b1d4c 100644 --- a/src/Control/Inciter/Options/Physics.hpp +++ b/src/Control/Inciter/Options/Physics.hpp @@ -86,7 +86,7 @@ class Physics : public tk::Toggle< PhysicsType > { //! \brief Function call operator templated on the type to assert the //! existence of a policy code template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); } }; diff --git a/src/Control/Inciter/Options/Problem.hpp b/src/Control/Inciter/Options/Problem.hpp index c953f28f0cb..2c9a75bd0be 100644 --- a/src/Control/Inciter/Options/Problem.hpp +++ b/src/Control/Inciter/Options/Problem.hpp @@ -34,7 +34,8 @@ enum class ProblemType : uint8_t { USER_DEFINED, CYL_ADVECT, SOD_SHOCKTUBE, ROTATED_SOD_SHOCKTUBE, - SEDOV_BLASTWAVE }; + SEDOV_BLASTWAVE, + INTERFACE_ADVECTION }; //! Pack/Unpack ProblemType: forward overload to generic enum class packer inline void operator|( PUP::er& p, ProblemType& e ) { PUP::pup( p, e ); } @@ -56,6 +57,7 @@ class Problem : public tk::Toggle< ProblemType > { , kw::sod_shocktube , kw::rotated_sod_shocktube , kw::sedov_blastwave + , kw::interface_advection >; //! \brief Options constructor @@ -78,7 +80,9 @@ class Problem : public tk::Toggle< ProblemType > { { ProblemType::SOD_SHOCKTUBE, kw::sod_shocktube::name() }, { ProblemType::ROTATED_SOD_SHOCKTUBE, kw::rotated_sod_shocktube::name() }, - { ProblemType::SEDOV_BLASTWAVE, kw::sedov_blastwave::name() } }, + { ProblemType::SEDOV_BLASTWAVE, kw::sedov_blastwave::name() }, + { ProblemType::INTERFACE_ADVECTION, + kw::interface_advection::name() } }, //! keywords -> Enums { { kw::user_defined::string(), ProblemType::USER_DEFINED }, { kw::shear_diff::string(), ProblemType::SHEAR_DIFF }, @@ -93,7 +97,9 @@ class Problem : public tk::Toggle< ProblemType > { { kw::rotated_sod_shocktube::string(), ProblemType::ROTATED_SOD_SHOCKTUBE }, { kw::sod_shocktube::string(), ProblemType::SOD_SHOCKTUBE }, - { kw::sedov_blastwave::string(), ProblemType::SEDOV_BLASTWAVE } } ) + { kw::sedov_blastwave::string(), ProblemType::SEDOV_BLASTWAVE }, + { kw::interface_advection::string(), + ProblemType::INTERFACE_ADVECTION } } ) { brigand::for_each< keywords >( assertPolicyCodes() ); } @@ -116,7 +122,7 @@ class Problem : public tk::Toggle< ProblemType > { //! \brief Function call operator templated on the type to assert the //! existence of a policy code template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); } }; @@ -136,6 +142,7 @@ class Problem : public tk::Toggle< ProblemType > { , { ProblemType::ROTATED_SOD_SHOCKTUBE, *kw::rotated_sod_shocktube::code() } , { ProblemType::SEDOV_BLASTWAVE, *kw::sedov_blastwave::code() } + , { ProblemType::INTERFACE_ADVECTION, *kw::interface_advection::code() } }; }; diff --git a/src/Control/Inciter/Options/Scheme.hpp b/src/Control/Inciter/Options/Scheme.hpp index b6901fe87ed..122d610f4a2 100644 --- a/src/Control/Inciter/Options/Scheme.hpp +++ b/src/Control/Inciter/Options/Scheme.hpp @@ -26,6 +26,7 @@ namespace ctr { enum class SchemeType : uint8_t { DiagCG , ALECG , DG + , P0P1 , DGP1 , DGP2 , PDG }; @@ -41,6 +42,7 @@ class Scheme : public tk::Toggle< SchemeType > { using keywords = brigand::list< kw::diagcg , kw::alecg , kw::dg + , kw::p0p1 , kw::dgp1 , kw::dgp2 , kw::pdg @@ -57,6 +59,7 @@ class Scheme : public tk::Toggle< SchemeType > { { { SchemeType::DiagCG, kw::diagcg::name() }, { SchemeType::ALECG, kw::alecg::name() }, { SchemeType::DG, kw::dg::name() }, + { SchemeType::P0P1, kw::p0p1::name() }, { SchemeType::DGP1, kw::dgp1::name() }, { SchemeType::DGP2, kw::dgp2::name() }, { SchemeType::PDG, kw::pdg::name() } }, @@ -64,6 +67,7 @@ class Scheme : public tk::Toggle< SchemeType > { { { kw::diagcg::string(), SchemeType::DiagCG }, { kw::alecg::string(), SchemeType::ALECG }, { kw::dg::string(), SchemeType::DG }, + { kw::p0p1::string(), SchemeType::P0P1 }, { kw::dgp1::string(), SchemeType::DGP1 }, { kw::dgp2::string(), SchemeType::DGP2 }, { kw::pdg::string(), SchemeType::PDG } } ) {} @@ -78,6 +82,7 @@ class Scheme : public tk::Toggle< SchemeType > { return tk::Centering::NODE; else if ( type == SchemeType::DG || + type == SchemeType::P0P1 || type == SchemeType::DGP1 || type == SchemeType::DGP2 || type == SchemeType::PDG ) diff --git a/src/Control/Inciter/Types.hpp b/src/Control/Inciter/Types.hpp index 8d04f72b6b0..2bcb2751d57 100644 --- a/src/Control/Inciter/Types.hpp +++ b/src/Control/Inciter/Types.hpp @@ -37,200 +37,231 @@ namespace ctr { using namespace tao; //! Storage of selected options -using selects = tk::tuple::tagged_tuple< - tag::pde, std::vector< ctr::PDEType >, //!< Partial diff eqs - tag::partitioner, tk::ctr::PartitioningAlgorithmType,//!< Mesh partitioner - tag::filetype, tk::ctr::FieldFileType //!< Field output file type ->; +using selects = tk::TaggedTuple< brigand::list< + tag::pde, std::vector< ctr::PDEType > //!< Partial diff eqs + , tag::partitioner, tk::ctr::PartitioningAlgorithmType //!< Mesh partitioner + , tag::filetype, tk::ctr::FieldFileType //!< Field output file type +> >; //! Adaptive-mesh refinement options -using amr = tk::tuple::tagged_tuple< - tag::amr, bool, //!< AMR on/off - tag::t0ref, bool, //!< AMR before t<0 on/off - tag::dtref, bool, //!< AMR during t>0 on/off - tag::dtref_uniform, bool, //!< Force dtref uniform-only - tag::dtfreq, kw::amr_dtfreq::info::expect::type, //!< Refinement frequency - tag::init, std::vector< AMRInitialType >, //!< List of initial AMR types - tag::refvar, std::vector< std::string >, //!< List of refinement vars - tag::id, std::vector< std::size_t >, //!< List of refvar indices - tag::error, AMRErrorType, //!< Error estimator for AMR +using amr = tk::TaggedTuple< brigand::list< + tag::amr, bool //!< AMR on/off + , tag::t0ref, bool //!< AMR before t<0 on/off + , tag::dtref, bool //!< AMR during t>0 on/off + , tag::dtref_uniform, bool //!< Force dtref uniform-only + , tag::dtfreq, kw::amr_dtfreq::info::expect::type //!< Refinement frequency + , tag::init, std::vector< AMRInitialType > //!< List of initial AMR types + , tag::refvar, std::vector< std::string > //!< List of refinement vars + , tag::id, std::vector< std::size_t > //!< List of refvar indices + , tag::error, AMRErrorType //!< Error estimator for AMR + , tag::tolref, tk::real //!< Refine tolerance + , tag::tolderef, tk::real //!< De-refine tolerance //! List of edges-node pairs - tag::edge, std::vector< kw::amr_edgelist::info::expect::type >, + , tag::edge, std::vector< kw::amr_edgelist::info::expect::type > //! Refinement tagging edges with end-point coordinates lower than x coord - tag::xminus, kw::amr_xminus::info::expect::type, + , tag::xminus, kw::amr_xminus::info::expect::type //! Refinement tagging edges with end-point coordinates higher than x coord - tag::xplus, kw::amr_xplus::info::expect::type, + , tag::xplus, kw::amr_xplus::info::expect::type //! Refinement tagging edges with end-point coordinates lower than y coord - tag::yminus, kw::amr_yminus::info::expect::type, + , tag::yminus, kw::amr_yminus::info::expect::type //! Refinement tagging edges with end-point coordinates higher than y coord - tag::yplus, kw::amr_yplus::info::expect::type, + , tag::yplus, kw::amr_yplus::info::expect::type //! Refinement tagging edges with end-point coordinates lower than z coord - tag::zminus, kw::amr_zminus::info::expect::type, + , tag::zminus, kw::amr_zminus::info::expect::type //! Refinement tagging edges with end-point coordinates higher than z coord - tag::zplus, kw::amr_zplus::info::expect::type ->; + , tag::zplus, kw::amr_zplus::info::expect::type +> >; + +//! p-adaptive refinement options +using pref = tk::TaggedTuple< brigand::list< + tag::pref, bool //!< p-refinement on/off + , tag::tolref, tk::real //!< Threshold of p-refinement +> >; //! Discretization parameters storage -using discretization = tk::tuple::tagged_tuple< - tag::nstep, kw::nstep::info::expect::type, //!< Number of time steps - tag::term, kw::term::info::expect::type, //!< Time to terminate - tag::t0, kw::t0::info::expect::type, //!< Starting time - tag::dt, kw::dt::info::expect::type, //!< Size of time step - tag::cfl, kw::cfl::info::expect::type, //!< CFL coefficient - tag::fct, bool, //!< FCT on/off - tag::reorder,bool, //!< reordering on/off - tag::ctau, kw::ctau::info::expect::type, //!< FCT mass diffisivity - tag::scheme, inciter::ctr::SchemeType, //!< Spatial discretization type - tag::limiter,inciter::ctr::LimiterType, //!< Limiter type - tag::cweight,kw::cweight::info::expect::type, //!< WENO central stencil weight - tag::flux, inciter::ctr::FluxType, //!< Flux function type - tag::ndof, std::size_t, //!< Number of solution DOFs - tag::pref, bool //!< Adaptive DG on/off ->; +using discretization = tk::TaggedTuple< brigand::list< + tag::nstep, kw::nstep::info::expect::type //!< Number of time steps + , tag::term, kw::term::info::expect::type //!< Time to terminate + , tag::t0, kw::t0::info::expect::type //!< Starting time + , tag::dt, kw::dt::info::expect::type //!< Size of time step + , tag::cfl, kw::cfl::info::expect::type //!< CFL coefficient + , tag::fct, bool //!< FCT on/off + , tag::reorder,bool //!< reordering on/off + , tag::ctau, kw::ctau::info::expect::type //!< FCT mass diffisivity + , tag::scheme, inciter::ctr::SchemeType //!< Spatial discretization type + , tag::limiter,inciter::ctr::LimiterType //!< Limiter type + , tag::cweight,kw::cweight::info::expect::type//!< WENO central stencil weight + , tag::flux, inciter::ctr::FluxType //!< Flux function type + , tag::rdof, std::size_t //!< Number of reconstructed solution DOFs + , tag::ndof, std::size_t //!< Number of solution DOFs + , tag::ndof, std::size_t //!< Number of solution DOFs +> >; //! ASCII output floating-point precision in digits -using precision = tk::tuple::tagged_tuple< - tag::diag, kw::precision::info::expect::type //!< Diagnostics output precision ->; +using precision = tk::TaggedTuple< brigand::list< + tag::diag, kw::precision::info::expect::type //!< Diagnostics output precision +> >; //! ASCII output floating-point format -using floatformat = tk::tuple::tagged_tuple< - tag::diag, tk::ctr::TxtFloatFormatType //!< Diagnostics output format ->; +using floatformat = tk::TaggedTuple< brigand::list< + tag::diag, tk::ctr::TxtFloatFormatType //!< Diagnostics output format +> >; //! Output intervals storage -using intervals = tk::tuple::tagged_tuple< - tag::tty, kw::ttyi::info::expect::type, //!< TTY output interval - tag::field, kw::interval::info::expect::type, //!< Field output interval - tag::diag, kw::interval::info::expect::type, //!< Diags output interval - tag::lbfreq,kw::lbfreq::info::expect::type //!< load-balancing frequency ->; +using intervals = tk::TaggedTuple< brigand::list< + tag::tty, kw::ttyi::info::expect::type //!< TTY output interval + , tag::field, kw::interval::info::expect::type //!< Field output interval + , tag::diag, kw::interval::info::expect::type //!< Diags output interval +> >; //! IO parameters storage -using ios = tk::tuple::tagged_tuple< - tag::control, kw::control::info::expect::type, //!< Control filename - tag::input, std::string, //!< Input filename - tag::output, std::string, //!< Output filename - tag::diag, std::string, //!< Diagnostics filename - tag::part, std::string //!< Particles filename ->; +using ios = tk::TaggedTuple< brigand::list< + tag::control, kw::control::info::expect::type //!< Control filename + , tag::input, std::string //!< Input filename + , tag::output, std::string //!< Output filename + , tag::diag, std::string //!< Diagnostics filename + , tag::part, std::string //!< Particles filename + , tag::restart, std::string //!< Restart dirname +> >; //! Error/diagnostics output configuration -using diagnostics = tk::tuple::tagged_tuple< +using diagnostics = tk::TaggedTuple< brigand::list< tag::error, std::vector< tk::ctr::ErrorType > //!< Errors to compute ->; +> >; //! Transport equation parameters storage -using TransportPDEParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::physics, std::vector< PhysicsType >, - tag::problem, std::vector< ProblemType >, - tag::diffusivity, std::vector< std::vector< - kw::pde_diffusivity::info::expect::type > >, - tag::lambda, std::vector< std::vector< - kw::pde_lambda::info::expect::type > >, - tag::u0, std::vector< std::vector< - kw::pde_u0::info::expect::type > >, - tag::bcdir, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcsym, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcinlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcoutlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcextrapolate, std::vector< std::vector< +using TransportPDEParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::physics, std::vector< PhysicsType > + , tag::problem, std::vector< ProblemType > + , tag::diffusivity, std::vector< std::vector< + kw::pde_diffusivity::info::expect::type > > + , tag::lambda, std::vector< std::vector< + kw::pde_lambda::info::expect::type > > + , tag::u0, std::vector< std::vector< + kw::pde_u0::info::expect::type > > + , tag::bcdir, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcsym, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcinlet, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcoutlet, std::vector< std::vector< kw::sideset::info::expect::type > > ->; + , tag::bcextrapolate, std::vector< std::vector< + kw::sideset::info::expect::type > > +> >; //! Compressible flow equation parameters storage -using CompFlowPDEParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::physics, std::vector< PhysicsType >, - tag::problem, std::vector< ProblemType >, - tag::bcdir, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcsym, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcinlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcoutlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcextrapolate, std::vector< std::vector< - kw::sideset::info::expect::type > >, - //! Parameter vector (for specific, e.g., verification problems) - tag::alpha, std::vector< kw::pde_alpha::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::beta, std::vector< kw::pde_beta::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::betax, std::vector< kw::pde_betax::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::betay, std::vector< kw::pde_betay::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::betaz, std::vector< kw::pde_betaz::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::r0, std::vector< kw::pde_r0::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::ce, std::vector< kw::pde_ce::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::kappa, std::vector< kw::pde_kappa::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::p0, std::vector< kw::pde_p0::info::expect::type >, - //! Material ID - tag::id, std::vector< kw::id::info::expect::type >, - //! Ratio of spec heats - tag::gamma, std::vector< kw::mat_gamma::info::expect::type >, - //! Dynamic viscosity - tag::mu, std::vector< kw::mat_mu::info::expect::type >, - //! Spec. heat at const vol. - tag::cv, std::vector< kw::mat_cv::info::expect::type >, - //! Heat conductivity - tag::k, std::vector< kw::mat_k::info::expect::type >, - //! total number of optional passive tracker particles for visualization - tag::npar, std::vector< kw::npar::info::expect::type > ->; +using CompFlowPDEParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::physics, std::vector< PhysicsType > + , tag::problem, std::vector< ProblemType > + , tag::bcdir, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcsym, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcinlet, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcoutlet, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcextrapolate, std::vector< std::vector< + kw::sideset::info::expect::type > > + //! Parameter vector (for specific, e.g., verification problems) + , tag::alpha, std::vector< kw::pde_alpha::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::beta, std::vector< kw::pde_beta::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betax, std::vector< kw::pde_betax::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betay, std::vector< kw::pde_betay::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betaz, std::vector< kw::pde_betaz::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::r0, std::vector< kw::pde_r0::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::ce, std::vector< kw::pde_ce::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::kappa, std::vector< kw::pde_kappa::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::p0, std::vector< kw::pde_p0::info::expect::type > + //! Ratio of spec heats + , tag::gamma, std::vector< + std::vector< kw::mat_gamma::info::expect::type > > + //! EoS stiffness parameter + , tag::pstiff, std::vector< + std::vector< kw::mat_pstiff::info::expect::type > > + //! Dynamic viscosity + , tag::mu, std::vector< + std::vector< kw::mat_mu::info::expect::type > > + //! Spec. heat at const vol. + , tag::cv, std::vector< + std::vector< kw::mat_cv::info::expect::type > > + //! Heat conductivity + , tag::k, std::vector< + std::vector< kw::mat_k::info::expect::type > > + //! total number of optional passive tracker particles for visualization + , tag::npar, std::vector< kw::npar::info::expect::type > +> >; //! Compressible flow equation parameters storage -using MultiMatPDEParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::physics, std::vector< PhysicsType >, - tag::problem, std::vector< ProblemType >, - tag::bcdir, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcsym, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcinlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcoutlet, std::vector< std::vector< - kw::sideset::info::expect::type > >, - tag::bcextrapolate, std::vector< std::vector< - kw::sideset::info::expect::type > >, - //! Parameter vector (for specific, e.g., verification problems) - tag::alpha, std::vector< kw::pde_alpha::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::beta, std::vector< kw::pde_beta::info::expect::type >, - //! Parameter vector (for specific, e.g., verification problems) - tag::p0, std::vector< kw::pde_p0::info::expect::type >, - //! Material ID - tag::id, std::vector< kw::id::info::expect::type >, - //! Ratio of spec heats - tag::gamma, std::vector< kw::mat_gamma::info::expect::type >, - //! Dynamic viscosity - tag::mu, std::vector< kw::mat_mu::info::expect::type >, - //! Spec. heat at const vol. - tag::cv, std::vector< kw::mat_cv::info::expect::type >, - //! Heat conductivity - tag::k, std::vector< kw::mat_k::info::expect::type >, +using MultiMatPDEParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::physics, std::vector< PhysicsType > + , tag::problem, std::vector< ProblemType > + , tag::bcdir, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcsym, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcinlet, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcoutlet, std::vector< std::vector< + kw::sideset::info::expect::type > > + , tag::bcextrapolate, std::vector< std::vector< + kw::sideset::info::expect::type > > + //! Parameter vector (for specific, e.g., verification problems) + , tag::alpha, std::vector< kw::pde_alpha::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::beta, std::vector< kw::pde_beta::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betax, std::vector< kw::pde_betax::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betay, std::vector< kw::pde_betay::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::betaz, std::vector< kw::pde_betaz::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::r0, std::vector< kw::pde_r0::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::ce, std::vector< kw::pde_ce::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::kappa, std::vector< kw::pde_kappa::info::expect::type > + //! Parameter vector (for specific, e.g., verification problems) + , tag::p0, std::vector< kw::pde_p0::info::expect::type > + //! Ratio of spec heats + , tag::gamma, std::vector< + std::vector< kw::mat_gamma::info::expect::type > > + //! EoS stiffness parameter + , tag::pstiff, std::vector< + std::vector< kw::mat_pstiff::info::expect::type > > + //! Dynamic viscosity + , tag::mu, std::vector< + std::vector< kw::mat_mu::info::expect::type > > + //! Spec. heat at const vol. + , tag::cv, std::vector< + std::vector< kw::mat_cv::info::expect::type > > + //! Heat conductivity + , tag::k, std::vector< + std::vector< kw::mat_k::info::expect::type > > //! number of materials - tag::nmat, std::vector< kw::nmat::info::expect::type > ->; + , tag::nmat, std::vector< kw::nmat::info::expect::type > +> >; //! Parameters storage -using parameters = tk::tuple::tagged_tuple< - tag::transport, TransportPDEParameters, - tag::compflow, CompFlowPDEParameters, - tag::multimat, MultiMatPDEParameters ->; +using parameters = tk::TaggedTuple< brigand::list< + tag::transport, TransportPDEParameters + , tag::compflow, CompFlowPDEParameters + , tag::multimat, MultiMatPDEParameters +> >; //! PEGTL location/position type to use throughout all of Inciter's parsers using Location = pegtl::position; diff --git a/src/Control/Keyword.hpp b/src/Control/Keyword.hpp index 2f622f9a99b..708d40b2d66 100644 --- a/src/Control/Keyword.hpp +++ b/src/Control/Keyword.hpp @@ -13,8 +13,9 @@ #ifndef Keyword_h #define Keyword_h +#include + #include "NoWarning/set.hpp" -#include "NoWarning/optional.hpp" #include "NoWarning/pegtl.hpp" #include "Has.hpp" @@ -91,142 +92,92 @@ template< typename Info, typename > struct keyword; template< typename Info, char... Chars > struct keyword< Info, pegtl::string< Chars... > > { - //! \brief Accessor to keyword as pegtl::string + //! Accessor to keyword as pegtl::string using pegtl_string = pegtl::string< Chars... >; - //! \brief Accessor to keyword as std::string + //! Accessor to keyword as std::string //! \return Keyword as std::string static std::string string() { return kw::escaper< Chars... >::result(); } - //! \brief Accessor to required short name of a keyword + //! Accessor to required short name of a keyword //! \return Name of keyword as std::string static std::string name() { return Info::name(); } - //! \brief Accessor to required short description of a keyword + //! Accessor to required short description of a keyword //! \return Short help as std::string static std::string shortDescription() { return Info::shortDescription(); } - //! \brief Accessor to required long description of a keyword + //! Accessor to required long description of a keyword //! \return Long help as std::string static std::string longDescription() { return Info::longDescription(); } - //! \brief Bring template argument 'Info' to scope as 'info' + //! Bring template argument 'Info' to scope as 'info' //! \details This is used to access, e.g., Info::alias, etc., if exist. //! \see tk::grm::alias //! \see tk::grm::readcmd using info = Info; - //! \brief Overloads to optional alias accessor depending on the existence of - //! Info::alias - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. Though an alias - //! is only a single character, it returns it as std::string since - //! pegtl::string returns std::string. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasTypedefAlias< T >::value, int >::type = 0 > - static boost::optional< std::string > alias() - { return std::string( 1, static_cast( Info::alias::value ) ); } - - template< typename T = Info, typename std::enable_if< - !tk::HasTypedefAlias< T >::value, int >::type = 0 > - static boost::optional< std::string > alias() - { return boost::none; } - - //! \brief Overloads to optional policy code accessor depending on the - //! existence of Info::Code - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. Though a code - //! is only a single character, it returns it as std::string since - //! pegtl::string returns std::string. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasTypedefCode< T >::value, int >::type = 0 > - static boost::optional< std::string > code() - { return std::string( 1, Info::code::value ); } - - template< typename T = Info, typename std::enable_if< - !tk::HasTypedefCode< T >::value, int >::type = 0 > - static boost::optional< std::string > code() - { return boost::none; } - - //! \brief Overloads to optional expected type description depending on the - //! existence of Info::expect::description - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasFunctionExpectDescription< T >::value, int >::type = 0 > - static boost::optional< std::string > expt() - { return Info::expect::description(); } - - template< typename T = Info, typename std::enable_if< - !tk::HasFunctionExpectDescription< T >::value, int >::type = 0 > - static boost::optional< std::string > expt() - { return boost::none; } - - //! \brief Overloads to optional lower bound as a string depending on the - //! existence of Info::expect::lower - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasVarExpectLower< T >::value, int >::type = 0 > - static boost::optional< std::string > lower() - { return std::to_string( Info::expect::lower ); } - - template< typename T = Info, typename std::enable_if< - !tk::HasVarExpectLower< T >::value, int >::type = 0 > - static boost::optional< std::string > lower() - { return boost::none; } - - //! \brief Overloads to optional upper bound as a string depending on the - //! existence of Info::expect::upper - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasVarExpectUpper< T >::value, int >::type = 0 > - static boost::optional< std::string > upper() - { return std::to_string( Info::expect::upper ); } - - template< typename T = Info, typename std::enable_if< - !tk::HasVarExpectUpper< T >::value, int >::type = 0 > - static boost::optional< std::string > upper() - { return boost::none; } - - //! \brief Overloads to optional expected choices description depending on the - //! existence of Info::expect::choices - //! \return An initialized (or uninitialized) boost::optional< std::string > - //! \details As to why type Info has to be aliased to a local type T for - //! SFINAE to work, see http://stackoverflow.com/a/22671495. - //! \see http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html - //! \see http://en.cppreference.com/w/cpp/language/sfinae - //! \see http://en.cppreference.com/w/cpp/types/enable_if - template< typename T = Info, typename std::enable_if< - tk::HasFunctionExpectChoices< T >::value, int >::type = 0 > - static boost::optional< std::string > choices() - { return Info::expect::choices(); } - - template< typename T = Info, typename std::enable_if< - !tk::HasFunctionExpectChoices< T >::value, int >::type = 0 > - static boost::optional< std::string > choices() - { return boost::none; } + //! Alias accessor for keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + //! \details Though an alias is only a single character, it returns it as + //! std::string since pegtl::string returns std::string. + template< typename T = Info > + static std::optional< std::string > alias() { + if constexpr( tk::HasTypedef_alias_v< T > ) + return std::string( 1, static_cast( Info::alias::value ) ); + else + return std::nullopt; + } + + //! Policy code accessor for keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + template< typename T = Info > + static std::optional< std::string > code() { + if constexpr( tk::HasTypedef_code_v< T > ) + return std::string( 1, Info::code::value ); + else + return std::nullopt; + } + + //! Expected type description accessor for keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + template< typename T = Info > + static std::optional< std::string > expt() { + if constexpr( tk::HasFunction_expect_description_v< T > ) + return Info::expect::description(); + else + return std::nullopt; + } + + //! Expected choices description accessor for a keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + template< typename T = Info > + static std::optional< std::string > choices() { + if constexpr( tk::HasFunction_expect_choices_v< T > ) + return Info::expect::choices(); + else + return std::nullopt; + } + + //! Expected lower bound accessor for a keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + template< typename T = Info > + static std::optional< std::string > lower() { + if constexpr( tk::HasVar_expect_lower_v< T > ) + return std::to_string( Info::expect::lower ); + else + return std::nullopt; + } + + //! Expected upper bound accessor for a keyword + //! \return An initialized (or uninitialized) std::optional< std::string > + template< typename T = Info > + static std::optional< std::string > upper() { + if constexpr( tk::HasVar_expect_upper_v< T > ) + return std::to_string( Info::expect::upper ); + else + return std::nullopt; + } }; } // kw:: diff --git a/src/Control/Keywords.hpp b/src/Control/Keywords.hpp index 8266fc62ddb..629774412dc 100644 --- a/src/Control/Keywords.hpp +++ b/src/Control/Keywords.hpp @@ -21,7 +21,7 @@ compile-time (which is not possible in a straightforward manner at this time). This could also be done with C-style const char* as well. The '*_info' structs store these strings, which then is used to specialize the - _kw::keyword_ template, defined in Control/Keyword.h. Specializing the + _kw::keyword_ template, defined in Control/Keyword.hpp. Specializing the _keyword_ template also requires a specification of the precise string of characters that make up a keyword eventually matched by the parsers. Since these are all template arguments, the construction of keywords, their help, @@ -123,7 +123,7 @@ // at least some information on the bounds, as below, since the bounds // are NOT displayed in the help for a keyword. This decision keeps // the bounds specifications generic since they can be any type. As a - // result, the help structures, defined in HelpFactory.h, are simpler + // result, the help structures, defined in HelpFactory.hpp, are simpler // as they do not have to be parameterized by the type of the bounds, // which greatly simplifies that code. static std::string choices() { @@ -142,8 +142,8 @@ // keyword 'kw', matching the keyword 'KeYwOrD'. using kw = keyword< keyword_info, K,e,Y,w,O,r,D >; \endcode - \see Control/Keyword.h - \see Control/HelpFactory.h + \see Control/Keyword.hpp + \see Control/HelpFactory.hpp */ // ***************************************************************************** #ifndef Keywords_h @@ -254,7 +254,7 @@ struct mkl_mcg31_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_MCG31', a 31-bit multiplicative congruential random number generator, provided by Intel's Math Kernel - Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Library (MKL).)"; } }; using mkl_mcg31 = keyword< mkl_mcg31_info, TAOCPP_PEGTL_STRING("mkl_mcg31") >; @@ -266,7 +266,7 @@ struct mkl_r250_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_R250', a generalized feedback shift register random number generator, provided by Intel's Math Kernel - Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Library (MKL).)"; } }; using mkl_r250 = keyword< mkl_r250_info, TAOCPP_PEGTL_STRING("mkl_r250") >; @@ -278,8 +278,7 @@ struct mkl_mrg32k3a_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_MRG32K3A', a combined multiple recursive random number generator with two components of order 3, - provided by Intel's Math Kernel Library (MKL). For more info on MKL see - https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + provided by Intel's Math Kernel Library (MKL).)"; } }; using mkl_mrg32k3a = @@ -292,7 +291,7 @@ struct mkl_mcg59_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_MCG59', a 59-bit multiplicative congruential random number generator, provided by Intel's Math Kernel - Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Library (MKL).)"; } }; @@ -305,7 +304,7 @@ struct mkl_wh_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_WH', a set of 273 Wichmann-Hill combined multiplicative congruential random number generators, provided - by Intel's Math Kernel Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + by Intel's Math Kernel Library (MKL).)"; } }; using mkl_wh = keyword< mkl_wh_info, TAOCPP_PEGTL_STRING("mkl_wh") >; @@ -317,7 +316,7 @@ struct mkl_mt19937_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_MT19937', a Mersenne Twister pseudorandom number generator, provided by Intel's Math Kernel Library - (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + (MKL).)"; } }; using mkl_mt19937 = @@ -330,7 +329,7 @@ struct mkl_mt2203_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_MT2203', a set of 6024 Mersenne Twister pseudorandom number generators, available in Intel's Math Kernel - Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Library (MKL).)"; } }; using mkl_mt2203 = keyword< mkl_mt2203_info, TAOCPP_PEGTL_STRING("mkl_mt2203") >; @@ -342,7 +341,7 @@ struct mkl_sfmt19937_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_SFMT19937', a SIMD-oriented Fast Mersenne Twister pseudorandom number generator, provided by Intel's Math - Kernel Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Kernel Library (MKL).)"; } }; using mkl_sfmt19937 = @@ -356,7 +355,7 @@ struct mkl_sobol_info { R"(This keyword is used to select 'VSL_BRNG_SOBOL', a 32-bit Gray code-based random number generator, producing low-discrepancy sequences for dimensions 1 .le. s .le. 40 with available user-defined dimensions, provided - by Intel's Math Kernel Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + by Intel's Math Kernel Library (MKL).)"; } }; using mkl_sobol = keyword< mkl_sobol_info, TAOCPP_PEGTL_STRING("mkl_sobol") >; @@ -369,8 +368,7 @@ struct mkl_niederr_info { R"(This keyword is used to select 'VSL_BRNG_NIEDERR', a 32-bit Gray code-based random number generator, producing low-discrepancy sequences for dimensions 1 .le. s .le. 318 with available user-defined dimensions, - provided by Intel's Math Kernel Library (MKL). For more info on MKL see - https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + provided by Intel's Math Kernel Library (MKL).)"; } }; using mkl_niederr = keyword< mkl_niederr_info, TAOCPP_PEGTL_STRING("mkl_niederr") >; @@ -382,7 +380,7 @@ struct mkl_iabstract_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_IABSTRACT', an abstract random number generator for integer arrays, provided by Intel's Math Kernel - Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Library (MKL).)"; } }; using mkl_iabstract = @@ -395,7 +393,7 @@ struct mkl_dabstract_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_DABSTRACT', an abstract random number generator for double-precision floating-point arrays, provided by - Intel's Math Kernel Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Intel's Math Kernel Library (MKL).)"; } }; using mkl_dabstract = @@ -408,7 +406,7 @@ struct mkl_sabstract_info { static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_SABSTRACT', an abstract random number generator for single-precision floating-point arrays, provided by - Intel's Math Kernel Library (MKL). For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Intel's Math Kernel Library (MKL).)"; } }; using mkl_sabstract = @@ -420,8 +418,7 @@ struct mkl_nondeterm_info { "Select Intel MKL NONDETERM RNG"; } static std::string longDescription() { return R"(This keyword is used to select 'VSL_BRNG_NONDETERM', a non-deterministic - random number generator, provided by Intel's Math Kernel Library (MKL). - For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + random number generator, provided by Intel's Math Kernel Library (MKL).)"; } }; using mkl_nondeterm = @@ -434,8 +431,7 @@ struct standard_info { static std::string longDescription() { return R"(This keyword is used to select the standard method used to generate uniform random numbers using the Intel Math Kernel Library (MKL) random - number generators. Valid options are 'standard' and 'accurate'. For more - info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + number generators. Valid options are 'standard' and 'accurate'.)"; } }; using standard = keyword< standard_info, TAOCPP_PEGTL_STRING("standard") >; @@ -447,8 +443,7 @@ struct accurate_info { static std::string longDescription() { return R"(This keyword is used to select the accurate method used to generate uniform random numbers using the Intel Math Kernel Library (MKL) random - number generators. Valid options are 'standard' and 'accurate'. For more - info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + number generators. Valid options are 'standard' and 'accurate'.)"; } }; using accurate = keyword< accurate_info, TAOCPP_PEGTL_STRING("accurate") >; @@ -460,8 +455,7 @@ struct uniform_method_info { static std::string longDescription() { return R"(This keyword is used to specify the method used to generate uniform random numbers using the Intel Math Kernel Library (MKL) random number - generators. Valid options are 'standard' and 'accurate'. For more info on - MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + generators. Valid options are 'standard' and 'accurate'.)"; } struct expect { static std::string description() { return "string"; } @@ -482,7 +476,7 @@ struct boxmuller_info { R"(This keyword is used to select the Box-Muller method used to generate Gaussian random numbers using the Intel Math Kernel Library (MKL) random random number generators. Valid options are 'boxmuller', 'boxmuller2', - and 'icdf'. For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + and 'icdf'.)"; } }; using boxmuller = keyword< boxmuller_info, TAOCPP_PEGTL_STRING("boxmuller") >; @@ -494,7 +488,7 @@ struct boxmuller2_info { static std::string longDescription() { return R"(This keyword is used to specify the Box-Muller 2 method used to generate Gaussian random numbers using the Intel Math Kernel Library (MKL) random - number generators. For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + number generators.)"; } }; using boxmuller2 = keyword< boxmuller2_info, TAOCPP_PEGTL_STRING("boxmuller2") >; @@ -506,8 +500,7 @@ struct icdf_info { static std::string longDescription() { return R"(This keyword is used to specify the inverse cumulative distribution function (ICDF) method used to generate Gaussian random numbers using the - Intel Math Kernel Library (MKL) random number generators. For more info - on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Intel Math Kernel Library (MKL) random number generators.)"; } }; using icdf = keyword< icdf_info, TAOCPP_PEGTL_STRING("icdf") >; @@ -519,8 +512,7 @@ struct gaussian_method_info { static std::string longDescription() { return R"(This keyword is used to specify the method used to generate Gaussian random numbers using the Intel Math Kernel Library (MKL) random number - generators. Valid options are 'boxmuller', 'boxmuller2', and 'icdf'. For - more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + generators. Valid options are 'boxmuller', 'boxmuller2', and 'icdf'.)"; } struct expect { static std::string description() { return "string"; } @@ -541,8 +533,8 @@ struct gaussianmv_method_info { static std::string longDescription() { return R"(This keyword is used to specify the method used to generate multi-variate Gaussian random numbers using the Intel Math Kernel Library (MKL) random - number generators. Valid options are 'boxmuller', 'boxmuller2', and 'icdf'. - For more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + number generators. Valid options are 'boxmuller', 'boxmuller2', and + 'icdf'.)"; } struct expect { static std::string description() { return "string"; } @@ -563,8 +555,7 @@ struct cja_info { static std::string longDescription() { return R"(This keyword is used to select the Cheng-Johnk-Atkinson method used to generate beta random numbers using the Intel Math Kernel Library (MKL) - random number generators. For more info on MKL see - https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + random number generators.)"; } }; using cja = keyword< cja_info, TAOCPP_PEGTL_STRING("cja") >; @@ -576,8 +567,7 @@ struct cja_accurate_info { static std::string longDescription() { return R"(This keyword is used to select the accurate version of the Cheng-Johnk-Atkinson method used to generate beta random numbers using the - Intel Math Kernel Library (MKL) random number generators. For more info on - MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Intel Math Kernel Library (MKL) random number generators.)"; } }; using cja_accurate = @@ -590,8 +580,7 @@ struct beta_method_info { static std::string longDescription() { return R"(This keyword is used to specify the method used to generate beta random numbers using the Intel Math Kernel Library (MKL) random number - generators. Valid options are 'cja' and 'cja_accurate'. For - more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + generators. Valid options are 'cja' and 'cja_accurate'.)"; } struct expect { static std::string description() { return "string"; } @@ -611,8 +600,7 @@ struct gnorm_info { static std::string longDescription() { return R"(This keyword is used to select the GNORM method used to generate gamma random numbers using the Intel Math Kernel Library (MKL) - random number generators. For more info on MKL see - https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + random number generators.)"; } }; using gnorm = keyword< gnorm_info, TAOCPP_PEGTL_STRING("gnorm") >; @@ -624,8 +612,7 @@ struct gnorm_accurate_info { static std::string longDescription() { return R"(This keyword is used to select the accurate version of the GNORM method used to generate gamma random numbers using the - Intel Math Kernel Library (MKL) random number generators. For more info on - MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + Intel Math Kernel Library (MKL) random number generator.)"; } }; using gnorm_accurate = @@ -638,8 +625,7 @@ struct gamma_method_info { static std::string longDescription() { return R"(This keyword is used to specify the method used to generate gamma random numbers using the Intel Math Kernel Library (MKL) random number - generators. Valid options are 'gnorm' and 'gnorm_accurate'. For - more info on MKL see https://software.intel.com/en-us/articles/intel-math-kernel-library-documentation.)"; + generators. Valid options are 'gnorm' and 'gnorm_accurate'.)"; } struct expect { static std::string description() { return "string"; } @@ -1101,7 +1087,8 @@ struct txt_float_default_info { http://en.cppreference.com/w/cpp/io/manip/fixed.)"; } }; -using txt_float_default = keyword< txt_float_default_info, TAOCPP_PEGTL_STRING("default") >; +using txt_float_default = + keyword< txt_float_default_info, TAOCPP_PEGTL_STRING("default") >; struct txt_float_scientific_info { static std::string name() { return "scientific"; } @@ -1154,7 +1141,8 @@ struct txt_float_format_info { } }; }; -using txt_float_format = keyword< txt_float_format_info, TAOCPP_PEGTL_STRING("format") >; +using txt_float_format = + keyword< txt_float_format_info, TAOCPP_PEGTL_STRING("format") >; struct precision_info { static std::string name() { return "precision"; } @@ -1246,7 +1234,7 @@ struct raw_info { Example: "init raw", which selects raw initialization policy, which leaves the memory uninitialized. Note that this option may behave differently depending on the particular equation or physical model. See the - the init policies in DiffEq/InitPolicy.h for valid options.)"; } + the init policies in DiffEq/InitPolicy.hpp for valid options.)"; } }; using raw = keyword< raw_info, TAOCPP_PEGTL_STRING("raw") >; @@ -1262,7 +1250,7 @@ struct zero_info { Example: "init zero", which selects zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. See the init - policies in DiffEq/InitPolicy.h for valid options.)"; } + policies in DiffEq/InitPolicy.hpp for valid options.)"; } }; using zero = keyword< zero_info, TAOCPP_PEGTL_STRING("zero") >; @@ -1278,7 +1266,7 @@ struct jointdelta_info { zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. For an example, see tk::InitPolicies in - DiffEq/InitPolicy.h for valid options.) The joint delta initialization + DiffEq/InitPolicy.hpp for valid options.) The joint delta initialization policy can be used to prescribe delta-spikes on the sample space with given heights, i.e., probabilities. Example: "init jointdelta" - select delta init-policy, "delta spike 0.1 0.3 0.8 0.7 end end" - prescribe two @@ -1300,7 +1288,7 @@ struct jointgaussian_info { zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. For an example, see tk::InitPolicies in - DiffEq/InitPolicy.h for valid options.) The joint Gaussian initialization + DiffEq/InitPolicy.hpp for valid options.) The joint Gaussian initialization policy can be used to prescribe a joint Gaussian (joint Gaussian) on the sample space with given variances. Example: "init jointgaussian" - select (joint) Gaussian init-policy, "gaussian 0.1 0.3 0.8 0.7 end" - prescribe two @@ -1325,7 +1313,7 @@ struct jointcorrgaussian_info { zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. For an example, see tk::InitPolicies in - DiffEq/InitPolicy.h for valid options.) The joint correlated Gaussian + DiffEq/InitPolicy.hpp for valid options.) The joint correlated Gaussian initialization policy can be used to prescribe a joint correlated Gaussian on the sample space with a given covariance matrix. Example: "init jointcorrgaussian @@ -1353,7 +1341,7 @@ struct jointbeta_info { zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. For an example, see tk::InitPolicies in - DiffEq/InitPolicy.h for valid options.) The joint beta initialization + DiffEq/InitPolicy.hpp for valid options.) The joint beta initialization policy can be used to prescribe a multi-dimensional sample space where the samples are generated from a joint beta distribution with independent marginal univariate beta distributions.)"; @@ -1373,7 +1361,7 @@ struct jointgamma_info { zero initialization policy, which puts zeros in memory. Note that this option may behave differently depending on the particular equation or physical model. For an example, see tk::InitPolicies in - DiffEq/InitPolicy.h for valid options.) The joint gamma initialization + DiffEq/InitPolicy.hpp for valid options.) The joint gamma initialization policy can be used to prescribe a joint gamma distribution on the sample space with given shape and scale parameters. Example: "init jointgamma" - select the (joint) gamma init-policy, "gammapdf 0.1 0.3 @@ -1387,6 +1375,28 @@ struct jointgamma_info { using jointgamma = keyword< jointgamma_info, TAOCPP_PEGTL_STRING("jointgamma") >; +struct jointdirichlet_info { + using code = Code< I >; + static std::string name() { return "Dirichlet"; } + static std::string shortDescription() { return + "Select the Dirichlet initialization policy"; } + static std::string longDescription() { return + R"(This keyword is used to select the Dirichlet initialization policy. + The initialization policy is used to specify how the initial conditions are + set at t = 0 before time-integration. Example: "init zero", which selects + zero initialization policy, which puts zeros in memory. Note that this + option may behave differently depending on the particular equation or + physical model. For an example, see tk::InitPolicies in + DiffEq/InitPolicy.hpp for valid options.) The Dirichlet initialization + policy can be used to prescribe a Dirichlet distribution on the + sample space with given shape parameters. Example: "init + jointdirichlet" - select the Dirichlet init-policy, "dirichletpdf 0.1 0.3 + 0.2 end" - prescribe a Dirichlet distribution with shape parameters 0.1, + 0.3, and 0.2. All shape parameters must be positive.)"; } +}; +using jointdirichlet = + keyword< jointdirichlet_info, TAOCPP_PEGTL_STRING("jointdirichlet") >; + struct init_info { using code = Code< i >; static std::string name() { return "initialization policy"; } @@ -1399,7 +1409,7 @@ struct init_info { selects raw initialization policy, which leaves the memory uninitialized. Note that this option may behave differently depending on the particular equation or physical model. See the init policies in - DiffEq/InitPolicy.h for valid options.)"; } + DiffEq/InitPolicy.hpp for valid options.)"; } struct expect { static std::string description() { return "string"; } static std::string choices() { @@ -1577,7 +1587,7 @@ struct stationary_info { using stationary = keyword< stationary_info, TAOCPP_PEGTL_STRING("stationary") >; -struct instantaneous_velocity_info { +struct inst_velocity_info { using code = Code< V >; static std::string name() { return "instantaneous velocity"; } static std::string shortDescription() { return @@ -1588,9 +1598,8 @@ struct instantaneous_velocity_info { some other differential equation, e.g., to update Lagrangian particle position or to couple a mix model to velocity.)"; } }; -using instantaneous_velocity = - keyword< instantaneous_velocity_info, - TAOCPP_PEGTL_STRING("instantaneous_velocity") >; +using inst_velocity = + keyword< inst_velocity_info, TAOCPP_PEGTL_STRING("inst_velocity") >; struct coeff_info { using code = Code< c >; @@ -1617,7 +1626,7 @@ struct coeff_info { kw::hydrotimescale::string() + "\' | \'" + kw::const_shear::string() + "\' | \'" + kw::stationary::string() + "\' | \'" + - kw::instantaneous_velocity::string() + '\''; + kw::inst_velocity::string() + '\''; } }; }; @@ -2302,8 +2311,8 @@ using icbeta = keyword< icbeta_info, TAOCPP_PEGTL_STRING("icbeta") >; struct icgaussian_info { static std::string name() { return "icgaussian"; } - static std::string shortDescription() { return R"(Introduce an - icgaussian...end block used to configure Gaussian distributions)"; } + static std::string shortDescription() { + return R"(Configure a joint uncorrelated Gaussian as initial condition)"; } static std::string longDescription() { return R"(This keyword is used to introduce an icgaussian...end block in which Gaussian distributions are configured for the jointgaussian initialization @@ -2316,9 +2325,8 @@ using icgaussian = keyword< icgaussian_info, TAOCPP_PEGTL_STRING("icgaussian") > struct icjointgaussian_info { static std::string name() { return "icjointgaussian"; } - static std::string shortDescription() { return R"(Introduce an - icjointgaussian...end block used to configure a joint Gaussian distribution - with a covariance matrix)"; } + static std::string shortDescription() { + return R"(Configure an joint correlated Gaussian as initial condition)"; } static std::string longDescription() { return R"(This keyword is used to introduce an icjointgaussian...end block in which a multi-variate joint Gaussian distribution is configured for the @@ -2358,8 +2366,8 @@ using gammapdf = keyword< gammapdf_info, TAOCPP_PEGTL_STRING("gammapdf") >; struct icgamma_info { static std::string name() { return "icgamma"; } - static std::string shortDescription() { return R"(Introduce an icgamma...end - block used to configure gamma distributions)"; } + static std::string shortDescription() { return + R"(Configure a gamma distribution as initial condition)"; } static std::string longDescription() { return R"(This keyword is used to introduce an icgamma...end block in which gamma distributions are configured for the gamma initialization policy. Example: @@ -2370,6 +2378,36 @@ struct icgamma_info { }; using icgamma = keyword< icgamma_info, TAOCPP_PEGTL_STRING("icgamma") >; +struct dirichletpdf_info { + static std::string name() { return "dirichletpdf"; } + static std::string shortDescription() { return + R"(Configure a Dirichlet distribution)"; } + static std::string longDescription() { return + R"(This keyword is used to specify the configuration of a Dirichlet + distribution for the Dirichlet initialization policy. The configuration is + given by a vector of positive real numbers inside a dirichletpdf...end + block. Example: "dirichletpdf 0.1 0.3 0.2 end" - prescribe a Dirichlet + distribution with shape parameters 0.1, 0.3, and 0.2. See also the help on + keyword icdirichlet.)"; } + struct expect { + using type = tk::real; + static std::string description() { return "reals"; } + }; +}; +using dirichletpdf = + keyword< dirichletpdf_info, TAOCPP_PEGTL_STRING("dirichletpdf") >; + +struct icdirichlet_info { + static std::string name() { return "icdirichlet"; } + static std::string shortDescription() { return + R"(Configure a Dirichlet PDF as initial condition)"; } + static std::string longDescription() { return + R"(This keyword is used to introduce an icdirichlet...end block in which a + Dirichlet distribution is configured for the Dirichlet initialization + policy)"; } +}; +using icdirichlet = + keyword< icdirichlet_info, TAOCPP_PEGTL_STRING("icdirichlet") >; struct ic_info { static std::string name() { return "ic"; } @@ -2380,7 +2418,7 @@ struct ic_info { conditions. Example: "ic density 1.0 end" - set the initial density field to 1.0 across the whole domain.)"; } }; -using ic = keyword< ic_info, TAOCPP_PEGTL_STRING("i,c") >; +using ic = keyword< ic_info, TAOCPP_PEGTL_STRING("ic") >; struct depvar_info { static std::string name() { return "depvar"; } @@ -2609,8 +2647,8 @@ struct beta_info { the configuration of a system of stochastic differential equations (SDEs), with linear drift and quadratic diagonal diffusion, whose invariant is the joint beta distribution. For more details on the beta SDE, see - https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta.h. Keywords - allowed in a beta ... end block: )" + std::string("\'") + https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta/Beta.hpp. + Keywords allowed in a beta ... end block: )" + std::string("\'") + depvar::string()+ "\', \'" + ncomp::string() + "\', \'" + rng::string() + "\', \'" @@ -2641,7 +2679,7 @@ struct numfracbeta_info { V(X), where both rho and V are random variables, computed by rho(X) = rho2 ( 1 - r' X ), and V(X) = 1 / [ rho2 ( 1 - r'X ) ]. For more details on the beta SDE, see https://doi.org/10.1080/14685248.2010.510843 and - src/DiffEq/Beta.h. Keywords allowed in a numfracbeta ... end block: )" + src/DiffEq/Beta/Beta.hpp. Keywords allowed in a numfracbeta ... end block: )" + std::string("\'") + depvar::string()+ "\', \'" + ncomp::string() + "\', \'" @@ -2674,7 +2712,8 @@ struct massfracbeta_info { beta SDE, then the mass-fraction beta SDE additionally governs rho(Y) and V(Y), where both rho and V are random variables, computed by rho(Y) = rho2 / ( 1 + r Y ), and V(Y) = ( 1 + r Y ) / rho2. For more details on the beta - SDE, see https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta.h. + SDE, see + https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta/Beta.hpp. Keywords allowed in a massfracbeta ... end block: )" + std::string("\'") + depvar::string()+ "\', \'" @@ -2716,8 +2755,8 @@ struct mixnumfracbeta_info { random variables computed besides, X, and they are rho(X) and V(X). For more detail on the number-fraction beta SDE, see the help on keyword 'numfracbeta'. For more details on the beta SDE, see - https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta.h. Keywords - allowed in a mixnumfracbeta ... end block: )" + https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta/Beta.h. + Keywords allowed in a mixnumfracbeta ... end block: )" + std::string("\'") + depvar::string()+ "\', \'" + ncomp::string() + "\', \'" @@ -2838,9 +2877,9 @@ struct hydrotimescales_info { hydrotimescales ... end block to be in effect. The 'hydrotimescales' keyword is then used to specify a list of strings, each specifying which inverse time scale should be used for the particular component integrated. - Available time scales are defined in src/DiffEq/HydroTimescales.h. Example: - "hydrotimescales eq_A05S eq_A05H eq_A05L eq_A05S eq_A05S end", which - configures five inverse hydrodynamics time scales associated to 5 + Available time scales are defined in src/DiffEq/HydroTimescales.hpp. + Example: "hydrotimescales eq_A05S eq_A05H eq_A05L eq_A05S eq_A05S end", + which configures five inverse hydrodynamics time scales associated to 5 components, i.e., 5 scalar stochastic differential equations, integrated, specified and configured within the given mixmassfracbeta ... end block. The length of the hydrotimescales vector depends on the number of scalar @@ -2848,8 +2887,8 @@ struct hydrotimescales_info { mixmassfracbeta, ncomp is the actual number of scalar components * 4, since mixmassfractionbeta always computes 4 additional derived stochastic variables (in a diagnostic) fashion. See also MixMassFractionBeta::derived() - in src/DiffEq/MixMassFractionBeta.h. Keywords allowed in a hydrotimescales - ... end block: )" + std::string("\'") + in src/DiffEq/Beta/MixMassFractionBeta.hpp. Keywords allowed in a + hydrotimescales ... end block: )" + std::string("\'") + eq_A005H::string() + "\', \'" + eq_A005S::string() + "\', \'" + eq_A005L::string() + "\', \'" @@ -2973,7 +3012,7 @@ struct hydroproductions_info { turbulent kinetic energy production dividied by the dissipation rate (P/eps) data (from direct numerical simulations) should be used for the particular component integrated. Available P/eps data are defined in - src/DiffEq/HydroProductions.h. Example: "productions prod_A05S prod_A05H + src/DiffEq/HydroProductions.hpp. Example: "productions prod_A05S prod_A05H prod_A05L prod_A05S prod_A05S end", which configures five P/eps data sets associated to 5 components, i.e., 5 scalar stochastic differential equations, integrated, specified and configured @@ -2983,7 +3022,7 @@ struct hydroproductions_info { the actual number of scalar components * 4, since mixmassfractionbeta always computes 4 additional derived stochastic variables (in a diagnostic) fashion. See also MixMassFractionBeta::derived() in - src/DiffEq/MixMassFractionBeta.h. Keywords allowed in a hydroproductions + src/DiffEq/MixMassFractionBeta.hpp. Keywords allowed in a hydroproductions ... end block: )" + std::string("\'") + prod_A005H::string() + "\', \'" + prod_A005S::string() + "\', \'" @@ -3027,8 +3066,8 @@ struct mixmassfracbeta_info { additional random variables computed besides, Y, and they are rho(Y) and V(Y). For more detail on the mass-fraction beta SDE, see the help on keyword 'massfracbeta'. For more details on the beta SDE, see - https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta.h. Keywords - allowed in a mixmassfracbeta ... end block: )" + https://doi.org/10.1080/14685248.2010.510843 and src/DiffEq/Beta/Beta.hpp. + Keywords allowed in a mixmassfracbeta ... end block: )" + std::string("\'") + depvar::string()+ "\', \'" + ncomp::string() + "\', \'" @@ -3145,6 +3184,52 @@ struct variant_info { }; using variant = keyword< variant_info, TAOCPP_PEGTL_STRING("variant") >; +struct light_info { + static std::string name() { return "light"; } + static std::string shortDescription() { return + "Select the light-fluid normalization for the mixture Dirichlet SDE"; } + static std::string longDescription() { return + R"(This keyword is used to select the light-fluid normalization for the + mixture Dirichlet PDF/SDE model for multi-material mixing in turbulent + flows.)"; } + struct expect { + static std::string description() { return "string"; } + }; +}; +using light = keyword< light_info, TAOCPP_PEGTL_STRING("light") >; + +struct heavy_info { + static std::string name() { return "heavy"; } + static std::string shortDescription() { return + "Select the heavy-fluid normalization for the mixture Dirichlet SDE"; } + static std::string longDescription() { return + R"(This keyword is used to select the heavy-fluid normalization for the + mixture Dirichlet PDF/SDE model for multi-material mixing in turbulent + flows.)"; } + struct expect { + static std::string description() { return "string"; } + }; +}; +using heavy = keyword< heavy_info, TAOCPP_PEGTL_STRING("heavy") >; + +struct normalization_info { + static std::string name() { return "normalization"; } + static std::string shortDescription() { return + "Select mixture Dirichlet PDF model normalization type"; } + static std::string longDescription() { return + R"(This keyword is used to select the mixture Dirichlet PDF model + normalization type.)"; } + struct expect { + static std::string description() { return "string"; } + static std::string choices() { + return '\'' + light::string() + "\' | \'" + + heavy::string() + '\''; + } + }; +}; +using normalization = + keyword< normalization_info, TAOCPP_PEGTL_STRING("normalization") >; + struct position_info { static std::string name() { return "position"; } static std::string shortDescription() { return @@ -3210,7 +3295,8 @@ struct velocity_info { fluctuating velocity in homogeneous variable-density turbulence. For more details on this Langevin model, see https://doi.org/10.1080/14685248.2011.554419 and - src/DiffEq/Velocity.h. Keywords allowed in a velocity ... end block: )" + + src/DiffEq/Velocity/Velocity.hpp. Keywords allowed in a velocity ... end + block: )" + std::string("\'") + depvar::string()+ "\', \'" + rng::string() + "\', \'" @@ -3373,9 +3459,9 @@ struct charestate_info { screen output. The chare state is displayed after a run is finished and the data collected is grouped by chare id (thisIndex), and within groups data is ordered by the time-stamp when a given chare member function is - called. See src/Base/ChareState.h for details on what is collected. Note - that to collect chare state, the given chare must be instrumented. For an - example, see src/Inciter/DG.h. Note that if quescence detection is enabled, + called. See src/Base/ChareState.hpp for details on what is collected. Note + that to collect chare state, the given chare must be instrumented. Note that + if quescence detection is enabled, chare state collection is also automatically enabled, but the chare state is only output if quiescence is detected (which also triggers an error).)"; } @@ -3402,7 +3488,8 @@ struct nonblocking_info { { return "Select non-blocking migration"; } static std::string longDescription() { return R"(This keyword is used to select non-blocking, instead of the default - blocking, migration.)"; + blocking, migration. WARNING: This feature is experimental, not well + tested, and may not always work as expected.)"; } using alias = Alias< n >; }; @@ -3411,11 +3498,11 @@ using nonblocking = keyword< nonblocking_info, TAOCPP_PEGTL_STRING("nonblocking") >; struct lbfreq_info { - static std::string name() { return "lbfreq"; } + static std::string name() { return "Load balancing frequency"; } static std::string shortDescription() { return "Set load-balancing frequency during time stepping"; } static std::string longDescription() { return - R"(This keyword is used to set frequency of load-balancing during + R"(This keyword is used to set the frequency of load-balancing during time stepping. The default is 1, which means that load balancing is initiated every time step. Note, however, that this does not necessarily mean that load balancing will be performed by the runtime system every @@ -3436,6 +3523,29 @@ struct lbfreq_info { }; using lbfreq = keyword< lbfreq_info, TAOCPP_PEGTL_STRING("lbfreq") >; +struct rsfreq_info { + static std::string name() { return "Checkpoint/restart frequency"; } + static std::string shortDescription() + { return "Set checkpoint/restart frequency during time stepping"; } + static std::string longDescription() { return + R"(This keyword is used to set the frequency of dumping checkpoint/restart + files during time stepping. The default is 100, which means that + checkpoint/restart files are dumped at every 100th time step.)"; + } + using alias = Alias< r >; + struct expect { + using type = std::size_t; + static constexpr type lower = 1; + static constexpr type upper = std::numeric_limits< type >::max()-1; + static std::string description() { return "int"; } + static std::string choices() { + return "integer between [" + std::to_string(lower) + "..." + + std::to_string(upper) + "] (both inclusive)"; + } + }; +}; +using rsfreq = keyword< rsfreq_info, TAOCPP_PEGTL_STRING("rsfreq") >; + struct feedback_info { static std::string name() { return "feedback"; } static std::string shortDescription() { return "Enable on-screen feedback"; } @@ -3446,9 +3556,30 @@ struct feedback_info { } using alias = Alias< f >; }; - using feedback = keyword< feedback_info, TAOCPP_PEGTL_STRING("feedback") >; +struct version_info { + static std::string name() { return "Show version"; } + static std::string shortDescription() { return "Show version information"; } + static std::string longDescription() { return + R"(This keyword is used to display version information for the + executable/tool on the standard output and exit successfully.)"; + } + using alias = Alias< V >; +}; +using version = keyword< version_info, TAOCPP_PEGTL_STRING("version") >; + +struct license_info { + static std::string name() { return "Show license"; } + static std::string shortDescription() { return "Show license information"; } + static std::string longDescription() { return + R"(This keyword is used to display license information for the + executable/tool on the standard output and exit successfully.)"; + } + using alias = Alias< L >; +}; +using license = keyword< license_info, TAOCPP_PEGTL_STRING("license") >; + struct trace_info { static std::string name() { return "trace"; } static std::string shortDescription() @@ -3460,7 +3591,6 @@ struct trace_info { option.)"; } using alias = Alias< t >; }; - using trace = keyword< trace_info, TAOCPP_PEGTL_STRING("trace") >; struct quiescence_info { @@ -3475,7 +3605,6 @@ struct quiescence_info { } using alias = Alias< q >; }; - using quiescence = keyword< quiescence_info, TAOCPP_PEGTL_STRING("quiescence") >; @@ -3563,7 +3692,15 @@ struct output_info { static std::string name() { return "output"; } static std::string shortDescription() { return "Specify the output file"; } static std::string longDescription() { return - R"(This option is used to define the output file name.)"; + R"(This option is used to define the output file name. In MeshConv, this is + used to specify the output mesh file name. In Inciter this is used to + specify the output base filename. The base filename is appended by + ".e-s...", where 'e-s' probably stands for + ExodusII sequence (the output file format), counts the number of + new meshes (this is incremented whenever the mesh is new compared to the + previous iteration, due to, e.g., mesh refinement), is the total + number of mesh partitions, and is the work unit (or mesh + partition) id.)"; } using alias = Alias< o >; struct expect { @@ -3573,10 +3710,69 @@ struct output_info { }; using output = keyword< output_info, TAOCPP_PEGTL_STRING("output") >; -struct diagnostics_info { +struct restart_info { + static std::string name() { return "checkpoint/restart directory name"; } + static std::string shortDescription() + { return "Specify the directory for restart files"; } + static std::string longDescription() { return + R"(This option is used to specify the directory name in which to save + checkpoint/restart files.)"; + } + using alias = Alias< R >; + struct expect { + using type = std::string; + static std::string description() { return "string"; } + }; +}; +using restart = keyword< restart_info, TAOCPP_PEGTL_STRING("restart") >; + +struct l2_info { + static std::string name() { return "L2"; } + static std::string shortDescription() { return "Select the L2 norm"; } + static std::string longDescription() { return + R"(This keyword is used to enable computing the L2 norm. Example: + "diagnostics error l2 end'.")"; } + struct expect { + static std::string description() { return "string"; } + }; +}; +using l2 = keyword< l2_info, TAOCPP_PEGTL_STRING("l2") >; + +struct linf_info { + static std::string name() { return "Linf"; } + static std::string shortDescription() { return + "Select the L_{infinity} norm"; } + static std::string longDescription() { return + R"(This keyword is used to enable computing the L-infinity norm. Example: + "diagnostics error linf end'.")"; } + struct expect { + static std::string description() { return "string"; } + }; +}; +using linf = keyword< linf_info, TAOCPP_PEGTL_STRING("linf") >; + +struct error_info { + static std::string name() { return "error"; } + static std::string shortDescription() { return "Select an error norm"; } + static std::string longDescription() { return + R"(This keyword is used to select, i.e., turn on, the estimation of an + error norm. The keyword is used in a 'diagnostics ... end' block. Example: + "diagnostics error l2 end", which configures computation of the L2 norm.)"; + } + struct expect { + static std::string description() { return "string"; } + static std::string choices() { + return '\'' + l2::string() + "\' | \'" + + linf::string() + '\''; + } + }; +}; +using error = keyword< error_info, TAOCPP_PEGTL_STRING("error") >; + +struct diagnostics_cmd_info { static std::string name() { return "diagnostics"; } static std::string shortDescription() - { return "Specify the diagnostics file"; } + { return "Specify the diagnostics file name"; } static std::string longDescription() { return R"(This option is used to define the diagnostics file name.)"; } @@ -3586,23 +3782,53 @@ struct diagnostics_info { static std::string description() { return "string"; } }; }; +using diagnostics_cmd = + keyword< diagnostics_cmd_info, TAOCPP_PEGTL_STRING("diagnostics") >; + +struct diagnostics_info { + static std::string name() { return "diagnostics"; } + static std::string shortDescription() + { return "Specify the diagnostics file name"; } + static std::string longDescription() { return + R"(This keyword is used to introduce the dagnostics ... end block, used to + configure diagnostics output. Keywords allowed in this block: )" + + std::string("\'") + + interval::string() + "\' | \'" + + txt_float_format::string() + "\' | \'" + + error::string() + "\' | \'" + + precision::string() + "\'."; + } +}; using diagnostics = keyword< diagnostics_info, TAOCPP_PEGTL_STRING("diagnostics") >; -struct reorder_info { +struct reorder_cmd_info { static std::string name() { return "reorder"; } static std::string shortDescription() { return "Reorder mesh nodes"; } static std::string longDescription() { return - R"(This keyword is used in two different ways: (1) in meshconv as a command - line argument to instruct the mesh converter to not only convert but also - reorder the mesh nodes using the advancing front technique, and (2) in - inciter as a keyword in the inciter...end block as "reorder on" (or off) to - do (or not do) a global distributed mesh reordering across all PEs that - yields an approximately continous mesh node ID order as mesh partitions are - assigned to PEs after mesh partitioning. Reordering is optional in meshconv - and inciter.)"; + R"(This keyword is used as a command line argument to instruct the mesh + converter to not only convert but also reorder the mesh nodes using the + advancing front technique. Reordering is optional in meshconv and + inciter.)"; } using alias = Alias< r >; + struct expect { + using type = bool; + static std::string description() { return "string"; } + }; +}; +using reorder_cmd = keyword< reorder_cmd_info, TAOCPP_PEGTL_STRING("reorder") >; + +struct reorder_info { + static std::string name() { return "reorder"; } + static std::string shortDescription() { return "Reorder mesh nodes"; } + static std::string longDescription() { return + R"(This keyword is used in inciter as a keyword in the inciter...end block + as "reorder on" (or off) to do (or not do) a global distributed mesh + reordering across all PEs that yields an approximately continous mesh node + ID order as mesh partitions are assigned to PEs after mesh partitioning. + Reordering is optional.)"; + } struct expect { using type = bool; static std::string choices() { return "true | false"; } @@ -3868,6 +4094,24 @@ struct sedov_blastwave_info { using sedov_blastwave = keyword< sedov_blastwave_info, TAOCPP_PEGTL_STRING("sedov_blastwave") >; +struct interface_advection_info { + using code = Code< I >; + static std::string name() { return "Interface advection"; } + static std::string shortDescription() { return + "Select the interface advection test problem "; } + static std::string longDescription() { return + R"(This keyword is used to select the interface advection test problem. The + purpose of this test problem is to test the well-balancedness of the + multi-material discretization and its interface capturing + capabilities. Example: "problem interface_advection".)"; } + struct expect { + static std::string description() { return "string"; } + }; +}; +using interface_advection = + keyword< interface_advection_info, + TAOCPP_PEGTL_STRING("interface_advection") >; + struct problem_info { using code = Code< t >; static std::string name() { return "Test problem"; } @@ -3891,7 +4135,8 @@ struct problem_info { + rayleigh_taylor::string() + "\' | \'" + taylor_green::string() + "\' | \'" + sod_shocktube::string() + "\' | \'" - + rotated_sod_shocktube::string() + '\''; + + rotated_sod_shocktube::string() + "\' | \'" + + interface_advection::string() + '\''; } }; }; @@ -3997,49 +4242,6 @@ struct physics_info { }; using physics = keyword< physics_info, TAOCPP_PEGTL_STRING("physics") >; -struct l2_info { - static std::string name() { return "L2"; } - static std::string shortDescription() { return "Select the L2 norm"; } - static std::string longDescription() { return - R"(This keyword is used to enable computing the L2 norm. Example: - "diagnostics error l2 end'.")"; } - struct expect { - static std::string description() { return "string"; } - }; -}; -using l2 = keyword< l2_info, TAOCPP_PEGTL_STRING("l2") >; - -struct linf_info { - static std::string name() { return "Linf"; } - static std::string shortDescription() { return - "Select the L_{infinity} norm"; } - static std::string longDescription() { return - R"(This keyword is used to enable computing the L-infinity norm. Example: - "diagnostics error linf end'.")"; } - struct expect { - static std::string description() { return "string"; } - }; -}; -using linf = keyword< linf_info, TAOCPP_PEGTL_STRING("linf") >; - -struct error_info { - static std::string name() { return "error"; } - static std::string shortDescription() { return "Select an error norm"; } - static std::string longDescription() { return - R"(This keyword is used to select, i.e., turn on, the estimation of an - error norm. The keyword is used in a 'diagnostics ... end' block. Example: - "diagnostics error l2 end", which configures computation of the L2 norm.)"; - } - struct expect { - static std::string description() { return "string"; } - static std::string choices() { - return '\'' + l2::string() + "\' | \'" - + linf::string() + '\''; - } - }; -}; -using error = keyword< error_info, TAOCPP_PEGTL_STRING("error") >; - struct pde_diffusivity_info { static std::string name() { return "diffusivity"; } static std::string shortDescription() { return @@ -4055,7 +4257,8 @@ struct pde_diffusivity_info { static std::string description() { return "real(s)"; } }; }; -using pde_diffusivity = keyword< pde_diffusivity_info, TAOCPP_PEGTL_STRING("diffusivity") >; +using pde_diffusivity = + keyword< pde_diffusivity_info, TAOCPP_PEGTL_STRING("diffusivity") >; struct pde_lambda_info { static std::string name() { return "lambda"; } @@ -4429,6 +4632,21 @@ struct mat_gamma_info { }; using mat_gamma = keyword< mat_gamma_info, TAOCPP_PEGTL_STRING("gamma") >; +struct mat_pstiff_info { + static std::string name() { return "pstiff"; } + static std::string shortDescription() { return "EoS stiffness parameter"; } + static std::string longDescription() { return + R"(This keyword is used to specify the material property, stiffness + parameter in the stiffened gas equation of state.)"; + } + struct expect { + using type = tk::real; + static constexpr type lower = 0.0; + static std::string description() { return "real"; } + }; +}; +using mat_pstiff = keyword< mat_pstiff_info, TAOCPP_PEGTL_STRING("pstiff") >; + struct mat_mu_info { static std::string name() { return "mu"; } static std::string shortDescription() { return "dynamic viscosity"; } @@ -4485,6 +4703,7 @@ struct material_info { block: )" + std::string("\'") + id::string()+ "\', \'" + mat_gamma::string()+ "\', \'" + + mat_pstiff::string()+ "\', \'" + mat_mu::string()+ "\', \'" + mat_cv::string()+ "\', \'" + mat_k::string() + "\'. " @@ -4585,7 +4804,7 @@ struct rcb_info { R"(This keyword is used to select the recursive coordinate bisection (RCB) mesh partitioner. RCB is a geometry-based partitioner used to distribute an input mesh among processing elements. See - Control/Options/PartitioningAlgorithm.h for other valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for other valid options.)"; } }; using rcb = keyword< rcb_info, TAOCPP_PEGTL_STRING("rcb") >; @@ -4597,7 +4816,7 @@ struct rib_info { R"(This keyword is used to select the recursive inertial bisection (RIB) mesh partitioner. RIB is a geometry-based partitioner used to distribute an input mesh among processing elements. See - Control/Options/PartitioningAlgorithm.h for other valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for other valid options.)"; } }; using rib = keyword< rib_info, TAOCPP_PEGTL_STRING("rib") >; @@ -4609,7 +4828,7 @@ struct hsfc_info { R"(This keyword is used to select the Hilbert Space Filling Curve (HSFC) mesh partitioner. HSFC is a geometry-based partitioner used to distribute an input mesh among processing elements. See - Control/Options/PartitioningAlgorithm.h for other valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for other valid options.)"; } }; using hsfc = keyword< hsfc_info, TAOCPP_PEGTL_STRING("hsfc") >; @@ -4621,7 +4840,7 @@ struct mj_info { R"(This keyword is used to select the multi-jagged (MJ) mesh partitioner. MJ is a geometry-based partitioner used to distribute an input mesh among processing elements. See - Control/Options/PartitioningAlgorithm.h for other valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for other valid options.)"; } }; using mj = keyword< mj_info, TAOCPP_PEGTL_STRING("mj") >; @@ -4633,7 +4852,7 @@ struct phg_info { R"(This keyword is used to select the parallel hypergraph (PHG) mesh partitioner. PHG is a graph-based partitioner used to distribute an input mesh among processing elements. See - Control/Options/PartitioningAlgorithm.h for other valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for other valid options.)"; } }; using phg = keyword< phg_info, TAOCPP_PEGTL_STRING("phg") >; @@ -4643,7 +4862,7 @@ struct algorithm_info { "Select mesh partitioning algorithm"; } static std::string longDescription() { return R"(This keyword is used to select a mesh partitioning algorithm. See - Control/Options/PartitioningAlgorithm.h for valid options.)"; } + Control/Options/PartitioningAlgorithm.hpp for valid options.)"; } struct expect { static std::string description() { return "string"; } static std::string choices() { @@ -4680,6 +4899,17 @@ struct amr_uniform_info { }; using amr_uniform = keyword< amr_uniform_info, TAOCPP_PEGTL_STRING("uniform") >; +struct amr_uniform_derefine_info { + using code = Code< d >; + static std::string name() { return "uniform_derefine"; } + static std::string shortDescription() { return + "Select uniform initial mesh de-refinement"; } + static std::string longDescription() { return + R"(This keyword is used to select uniform initial mesh de-refinement.)"; } +}; +using amr_uniform_derefine = + keyword< amr_uniform_derefine_info, TAOCPP_PEGTL_STRING("uniform_derefine") >; + struct amr_initial_conditions_info { using code = Code< i >; static std::string name() { return "ic"; } @@ -4742,7 +4972,7 @@ struct amr_refvar_info { refinement variables: the first and third scalar component of the previously configured transport equation system.)"; } struct expect { - static std::string description() { return "list of strings"; } + static std::string description() { return "strings"; } }; }; using amr_refvar = keyword< amr_refvar_info, TAOCPP_PEGTL_STRING("refvar") >; @@ -4762,7 +4992,7 @@ struct amr_edgelist_info { struct expect { using type = std::size_t; static constexpr type lower = 0; - static std::string description() { return "pairs of integers"; } + static std::string description() { return "two ints"; } }; }; using amr_edgelist = @@ -5022,6 +5252,47 @@ struct amr_dtfreq_info { }; using amr_dtfreq = keyword< amr_dtfreq_info, TAOCPP_PEGTL_STRING("dtfreq") >; +struct amr_tolref_info { + static std::string name() { return "refine tolerance"; } + static std::string shortDescription() { return "Configure refine tolerance"; } + static std::string longDescription() { return + R"(This keyword is used to set the tolerance used to tag an edge for + refinement if the relative error exceeds this value.)"; } + struct expect { + using type = tk::real; + static constexpr type lower = 0.0; + static constexpr type upper = 1.0; + static std::string description() { return "real"; } + static std::string choices() { + return "integer between [" + std::to_string(lower) + "..." + + std::to_string(upper) + "] (both inclusive)"; + } + }; +}; +using amr_tolref = + keyword< amr_tolref_info, TAOCPP_PEGTL_STRING("tol_refine") >; + +struct amr_tolderef_info { + static std::string name() { return "derefine tolerance"; } + static std::string shortDescription() { + return "Configure derefine tolerance"; } + static std::string longDescription() { return + R"(This keyword is used to set the tolerance used to tag an edge for + derefinement if the relative error is below this value.)"; } + struct expect { + using type = tk::real; + static constexpr type lower = 0.0; + static constexpr type upper = 1.0; + static std::string description() { return "real"; } + static std::string choices() { + return "integer between [" + std::to_string(lower) + "..." + + std::to_string(upper) + "] (both inclusive)"; + } + }; +}; +using amr_tolderef = + keyword< amr_tolderef_info, TAOCPP_PEGTL_STRING("tol_derefine") >; + struct amr_info { static std::string name() { return "AMR"; } static std::string shortDescription() { return @@ -5036,6 +5307,8 @@ struct amr_info { + amr_dtfreq::string() + "\' | \'" + amr_initial::string() + "\' | \'" + amr_refvar::string() + "\' | \'" + + amr_tolref::string() + "\' | \'" + + amr_tolderef::string() + "\' | \'" + amr_error::string() + "\' | \'" + amr_coordref::string() + "\' | \'" + amr_edgelist::string() + "\'."; @@ -5043,6 +5316,41 @@ struct amr_info { }; using amr = keyword< amr_info, TAOCPP_PEGTL_STRING("amr") >; +struct pref_tolref_info { + static std::string name() { return "Tolerance for p-refinement"; } + static std::string shortDescription() { return "Configure the tolerance for " + "p-refinement for the p-adaptive DG scheme"; } + static std::string longDescription() { return + R"(This keyword can be used to configure a tolerance for p-adaptive + refinement for the DG scheme. The keyword must be used in pref ... end + block. All elements with a refinement indicator larger than this tolerance + will be p-refined. Example specification: 'tolref 0.1'.)"; } + struct expect { + using type = tk::real; + static constexpr type lower = 0.0; + static constexpr type upper = 1.0; + static std::string description() { return "real"; } + static std::string choices() { + return "real between [" + std::to_string(lower) + "..." + + std::to_string(upper) + "] (both inclusive)"; + } + }; +}; +using pref_tolref = keyword< pref_tolref_info, TAOCPP_PEGTL_STRING("tolref") >; + +struct pref_info { + static std::string name() { return "pref"; } + static std::string shortDescription() { return + "Start configuration block configuring p-adaptive refinement"; } + static std::string longDescription() { return + R"(This keyword is used to introduce the pref ... end block, used to + configure p-adaptive refinement. Keywords allowed + in this block: )" + std::string("\'") + + pref_tolref::string() + "\' | \'"; + } +}; +using pref = keyword< pref_info, TAOCPP_PEGTL_STRING("pref") >; + struct diagcg_info { static std::string name() { return "CG + LW"; } static std::string shortDescription() { return "Select continuous Galerkin " @@ -5054,7 +5362,7 @@ struct diagcg_info { transport (FCT) for treating discontinuous solutions. This option selects the scheme that stores the left-hand side matrix lumped, i.e., only the diagonal elements stored and thus does not require a linear solver. See - Control/Inciter/Options/Scheme.h for other valid options.)"; } + Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using diagcg = keyword< diagcg_info, TAOCPP_PEGTL_STRING("diagcg") >; @@ -5065,7 +5373,7 @@ struct alecg_info { static std::string longDescription() { return R"(This keyword is used to select the continuous Galerkin finite element scheme in the arbitrary Lagrangian-Eulerian (ALE) reference frame combined - with Runge-Kutta (RK) time stepping. See Control/Inciter/Options/Scheme.h + with Runge-Kutta (RK) time stepping. See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using alecg = keyword< alecg_info, TAOCPP_PEGTL_STRING("alecg") >; @@ -5079,11 +5387,25 @@ struct dg_info { Galerkin, DG(P0), spatial discretiztaion used in Inciter. As this is first order accurate, it is intended for testing and debugging purposes only. Selecting this spatial discretization also selects the Runge-Kutta scheme - for time discretization. See Control/Inciter/Options/Scheme.h for other + for time discretization. See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using dg = keyword< dg_info, TAOCPP_PEGTL_STRING("dg") >; +struct p0p1_info { + static std::string name() { return "P0P1 + RK"; } + static std::string shortDescription() { return + "Select 2nd-order finite volume discretization + Runge-Kutta"; } + static std::string longDescription() { return + R"(This keyword is used to select the second-order accurate finite volume, + P0P1, spatial discretiztaion used in Inciter. This method uses a + least-squares procedure to reconstruct the second-order solution from the + first-order one. Selecting this spatial discretization also selects the + Runge-Kutta scheme for time discretization. + See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } +}; +using p0p1 = keyword< p0p1_info, TAOCPP_PEGTL_STRING("p0p1") >; + struct dgp1_info { static std::string name() { return "DG(P1) + RK"; } static std::string shortDescription() { return @@ -5092,7 +5414,7 @@ struct dgp1_info { R"(This keyword is used to select the second-order accurate discontinuous Galerkin, DG(P1), spatial discretiztaion used in Inciter. Selecting this spatial discretization also selects the Runge-Kutta scheme for time - discretization. See Control/Inciter/Options/Scheme.h for other + discretization. See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using dgp1 = keyword< dgp1_info, TAOCPP_PEGTL_STRING("dgp1") >; @@ -5105,7 +5427,7 @@ struct dgp2_info { R"(This keyword is used to select the third-order accurate discontinuous Galerkin, DG(P2), spatial discretiztaion used in Inciter. Selecting this spatial discretization also selects the Runge-Kutta scheme for time - discretization. See Control/Inciter/Options/Scheme.h for other + discretization. See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using dgp2 = keyword< dgp2_info, TAOCPP_PEGTL_STRING("dgp2") >; @@ -5118,7 +5440,7 @@ struct pdg_info { R"(This keyword is used to select the adaptive discontinuous Galerkin spatial discretizaion used in Inciter. Selecting this spatial discretization also selects the Runge-Kutta scheme for time - discretization. See Control/Inciter/Options/Scheme.h for other valid + discretization. See Control/Inciter/Options/Scheme.hpp for other valid options.)"; } }; using pdg = keyword< pdg_info, TAOCPP_PEGTL_STRING("pdg") >; @@ -5130,7 +5452,7 @@ struct scheme_info { static std::string longDescription() { return R"(This keyword is used to select a spatial discretization scheme, necessarily connected to the teporal discretization scheme. See - Control/Inciter/Options/Scheme.h for valid options.)"; } + Control/Inciter/Options/Scheme.hpp for valid options.)"; } struct expect { static std::string description() { return "string"; } static std::string choices() { @@ -5148,7 +5470,7 @@ struct laxfriedrichs_info { static std::string longDescription() { return R"(This keyword is used to select the Lax-Friedrichs flux function used for discontinuous Galerkin (DG) spatial discretization used in inciter. See - Control/Inciter/Options/Flux.h for other valid options.)"; } + Control/Inciter/Options/Flux.hpp for other valid options.)"; } }; using laxfriedrichs = keyword< laxfriedrichs_info, TAOCPP_PEGTL_STRING("laxfriedrichs") >; @@ -5160,7 +5482,7 @@ struct hllc_info { static std::string longDescription() { return R"(This keyword is used to select the Harten-Lax-van Leer-Contact flux function used for discontinuous Galerkin (DG) spatial discretization - used in inciter. See Control/Inciter/Options/Flux.h for other valid + used in inciter. See Control/Inciter/Options/Flux.hpp for other valid options.)"; } }; using hllc = keyword< hllc_info, TAOCPP_PEGTL_STRING("hllc") >; @@ -5174,25 +5496,39 @@ struct upwind_info { function used for discontinuous Galerkin (DG) spatial discretization used in inciter. It is really only useful for scalar transport, it is thus not selectable for anything else, and for scalar transport it is the - hardcoded flux type. See Control/Inciter/Options/Flux.h for other valid + hardcoded flux type. See Control/Inciter/Options/Flux.hpp for other valid options.)"; } }; using upwind = keyword< upwind_info, TAOCPP_PEGTL_STRING("upwind") >; +struct ausm_info { + static std::string name() { return "AUSM"; } + static std::string shortDescription() { return + "Select the Advection Upstream Splitting Method (AUSM) flux function"; } + static std::string longDescription() { return + R"(This keyword is used to select the AUSM flux + function used for discontinuous Galerkin (DG) spatial discretization + used in inciter. It is only used for for multi-material hydro, it is thus + not selectable for anything else, and for multi-material hydro it is the + hardcoded flux type.)"; } +}; +using ausm = keyword< ausm_info, TAOCPP_PEGTL_STRING("ausm") >; + struct flux_info { static std::string name() { return "Flux function"; } static std::string shortDescription() { return "Select flux function"; } static std::string longDescription() { return - R"(This keyword is used to select a fllux function, used for + R"(This keyword is used to select a flux function, used for discontinuous Galerkin (DG) spatial discretization used in inciter. See - Control/Inciter/Options/Flux.h for valid options.)"; } + Control/Inciter/Options/Flux.hpp for valid options.)"; } struct expect { static std::string description() { return "string"; } static std::string choices() { return '\'' + laxfriedrichs::string() + "\' | \'" + hllc::string() + "\' | \'" - + upwind::string() + '\''; + + upwind::string() + "\' | \'" + + ausm::string() + '\''; } }; }; @@ -5205,7 +5541,7 @@ struct nolimiter_info { static std::string longDescription() { return R"(This keyword is used for discontinuous Galerkin (DG) spatial discretization without any limiter in inciter. See - Control/Inciter/Options/Limiter.h for other valid options.)"; } + Control/Inciter/Options/Limiter.hpp for other valid options.)"; } }; using nolimiter = keyword< nolimiter_info, TAOCPP_PEGTL_STRING("nolimiter") >; @@ -5217,7 +5553,7 @@ struct wenop1_info { static std::string longDescription() { return R"(This keyword is used to select the Weighted Essentially Non-Oscillatory limiter used for discontinuous Galerkin (DG) P1 spatial discretization - used in inciter. See Control/Inciter/Options/Limiter.h for other valid + used in inciter. See Control/Inciter/Options/Limiter.hpp for other valid options.)"; } }; using wenop1 = keyword< wenop1_info, TAOCPP_PEGTL_STRING("wenop1") >; @@ -5229,7 +5565,7 @@ struct superbeep1_info { static std::string longDescription() { return R"(This keyword is used to select the Superbee limiter used for discontinuous Galerkin (DG) P1 spatial discretization used in inciter. - See Control/Inciter/Options/Limiter.h for other valid options.)"; } + See Control/Inciter/Options/Limiter.hpp for other valid options.)"; } }; using superbeep1 = keyword< superbeep1_info, TAOCPP_PEGTL_STRING("superbeep1") >; @@ -5240,7 +5576,7 @@ struct limiter_info { static std::string longDescription() { return R"(This keyword is used to select a limiter function, used for discontinuous Galerkin (DG) spatial discretization used in inciter. See - Control/Inciter/Options/Limiter.h for valid options.)"; } + Control/Inciter/Options/Limiter.hpp for valid options.)"; } struct expect { static std::string description() { return "string"; } static std::string choices() { diff --git a/src/Control/MKLGrammar.hpp b/src/Control/MKLGrammar.hpp index 3fd3eaa3537..77ab70463bf 100644 --- a/src/Control/MKLGrammar.hpp +++ b/src/Control/MKLGrammar.hpp @@ -48,8 +48,7 @@ namespace mkl { typename vec, typename... tags > struct seed : tk::grm::process< use< kw::seed >, - tk::grm::Insert_field< tag::seed, - sel, vec, tags... > > {}; + tk::grm::insert_seed< sel, vec, tags... > > {}; //! \brief Match and set MKL uniform method algorithm template< template< class > class use, typename sel, diff --git a/src/Control/MeshConv/CmdLine/CmdLine.hpp b/src/Control/MeshConv/CmdLine/CmdLine.hpp index af010138589..8c248c59f0b 100644 --- a/src/Control/MeshConv/CmdLine/CmdLine.hpp +++ b/src/Control/MeshConv/CmdLine/CmdLine.hpp @@ -19,7 +19,6 @@ #include #include "Macro.hpp" -#include "Control.hpp" #include "Keywords.hpp" #include "HelpFactory.hpp" #include "MeshConv/Types.hpp" @@ -28,26 +27,31 @@ namespace meshconv { //! Mesh converter control facilitating user input to internal data transfer namespace ctr { -//! \brief CmdLine : Control< specialized to MeshConv > +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::io, ios + , tag::verbose, bool + , tag::chare, bool + , tag::reorder, bool + , tag::help, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::error, std::vector< std::string > +>; + +//! \brief CmdLine is a TaggedTuple specialized to MeshConv //! \details The stack is a tagged tuple, a hierarchical heterogeneous data //! structure where all parsed information is stored. //! \see Base/TaggedTuple.h //! \see Control/MeshConv/Types.h -class CmdLine : - public tk::Control< // tag type - tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::reorder, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > > { - public: +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { + public: //! \brief MeshConv command-line keywords //! \see tk::grm::use and its documentation using keywords = tk::cmd_keywords< kw::verbose @@ -56,9 +60,11 @@ class CmdLine : , kw::helpkw , kw::input , kw::output - , kw::reorder + , kw::reorder_cmd , kw::quiescence , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set defaults. @@ -68,10 +74,12 @@ class CmdLine : //! control file parser. //! \see walker::ctr::CmdLine CmdLine() { - set< tag::verbose >( false ); // Use quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::reorder >( false ); // Do not reorder by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::verbose >() = false; // Use quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::reorder >() = false; // Do not reorder by default + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords brigand::for_each< keywords::set >( tk::ctr::Info(get()) ); } @@ -80,19 +88,7 @@ class CmdLine : ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::reorder, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] c CmdLine object reference diff --git a/src/Control/MeshConv/CmdLine/Grammar.hpp b/src/Control/MeshConv/CmdLine/Grammar.hpp index fa35a806640..4d061e3b1c0 100644 --- a/src/Control/MeshConv/CmdLine/Grammar.hpp +++ b/src/Control/MeshConv/CmdLine/Grammar.hpp @@ -42,7 +42,7 @@ namespace cmd { //! brief Match and set reorder switch (i.e., reorder mesh nodes or not) struct reorder : - tk::grm::process_cmd_switch< use, kw::reorder, tag::reorder > {}; + tk::grm::process_cmd_switch< use, kw::reorder_cmd, tag::reorder > {}; //! \brief Match and set io parameter template< typename keyword, typename io_tag > @@ -68,6 +68,21 @@ namespace cmd { tk::grm::process_cmd_switch< use, kw::quiescence, tag::quiescence > {}; + //! Match switch on trace output + struct trace : + tk::grm::process_cmd_switch< use, kw::trace, + tag::trace > {}; + + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! \brief Match all command line keywords struct keywords : pegtl::sor< verbose, @@ -76,6 +91,9 @@ namespace cmd { help, helpkw, quiescence, + trace, + version, + license, io< kw::input, tag::input >, io< kw::output, tag::output > > {}; diff --git a/src/Control/MeshConv/CmdLine/Parser.cpp b/src/Control/MeshConv/CmdLine/Parser.cpp index 08d45ed9f35..b25e2f6927d 100644 --- a/src/Control/MeshConv/CmdLine/Parser.cpp +++ b/src/Control/MeshConv/CmdLine/Parser.cpp @@ -11,19 +11,13 @@ */ // ***************************************************************************** -#include -#include -#include -#include - #include "NoWarning/pegtl.hpp" - #include "NoWarning/charm.hpp" + #include "QuinoaConfig.hpp" #include "Exception.hpp" #include "Print.hpp" #include "Keywords.hpp" -#include "HelpFactory.hpp" #include "MeshConv/Types.hpp" #include "MeshConv/CmdLine/Parser.hpp" #include "MeshConv/CmdLine/Grammar.hpp" @@ -92,9 +86,23 @@ CmdLineParser::CmdLineParser( int argc, if (!helpkw.keyword.empty()) print.helpkw< tk::QUIET >( tk::meshconv_executable(), helpkw ); + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::meshconv_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::meshconv_executable(), tk::license() ); + // Immediately exit if any help was output or was called without any argument - // with zero exit code - if (argc == 1 || helpcmd || !helpkw.keyword.empty()) CkExit(); + // or version or license info was requested with zero exit code + if (argc == 1 || helpcmd || !helpkw.keyword.empty() || version || license) + CkExit(); // Make sure mandatory arguments are set auto ialias = kw::input().alias(); diff --git a/src/Control/MeshConv/Types.hpp b/src/Control/MeshConv/Types.hpp index e235df7d690..cff0ff5a497 100644 --- a/src/Control/MeshConv/Types.hpp +++ b/src/Control/MeshConv/Types.hpp @@ -25,10 +25,10 @@ namespace ctr { using namespace tao; //! IO parameters storage -using ios = tk::tuple::tagged_tuple< - tag::input, std::string, //!< Input filename - tag::output, std::string //!< Output filename ->; +using ios = tk::TaggedTuple< brigand::list< + tag::input, std::string //!< Input filename + , tag::output, std::string //!< Output filename +> >; //! PEGTL location/position type to use throughout all of MeshConv's parsers using Location = pegtl::position; diff --git a/src/Control/RNGParam.hpp b/src/Control/RNGParam.hpp index b28449850f8..a934e2df56f 100644 --- a/src/Control/RNGParam.hpp +++ b/src/Control/RNGParam.hpp @@ -30,31 +30,31 @@ namespace tk { namespace ctr { //! RNGSSE random number generator parameters storage -using RNGSSEParam = tk::tuple::tagged_tuple< - tag::seed, kw::seed::info::expect::type, //!< seed - tag::seqlen, RNGSSESeqLenType //!< sequence length type ->; +using RNGSSEParam = tk::TaggedTuple< brigand::list< + tag::seed, kw::seed::info::expect::type //!< seed + , tag::seqlen, RNGSSESeqLenType //!< sequence length type +> >; //! RNGSSE parameters bundle associating RNG types and their parameters using RNGSSEParameters = std::map< RNGType, RNGSSEParam >; //! Random123 random number generator parameters storage -using RNGRandom123Param = tk::tuple::tagged_tuple< +using RNGRandom123Param = tk::TaggedTuple< brigand::list< tag::seed, kw::seed::info::expect::type //!< seed ->; +> >; //! Random123 parameters bundle associating RNG types and their parameters using RNGRandom123Parameters = std::map< RNGType, RNGRandom123Param >; #ifdef HAS_MKL //! MKL random number generator parameters storage -using RNGMKLParam = tk::tuple::tagged_tuple< - tag::seed, kw::seed::info::expect::type, //!< seed - tag::uniform_method, MKLUniformMethodType, //!< uniform method type - tag::gaussian_method, MKLGaussianMethodType, //!< Gaussian method type +using RNGMKLParam = tk::TaggedTuple< brigand::list< + tag::seed, kw::seed::info::expect::type //!< seed + , tag::uniform_method, MKLUniformMethodType //!< uniform method type + , tag::gaussian_method, MKLGaussianMethodType //!< Gaussian method type //! multi-variate Gaussian method type - tag::gaussianmv_method, MKLGaussianMVMethodType, - tag::beta_method, MKLBetaMethodType, //!< beta method type - tag::gamma_method, MKLGammaMethodType //!< gamma method type ->; + , tag::gaussianmv_method, MKLGaussianMVMethodType + , tag::beta_method, MKLBetaMethodType //!< beta method type + , tag::gamma_method, MKLGammaMethodType //!< gamma method type +> >; //! MKL RNG parameters bundle associating RNG types and their parameters using RNGMKLParameters = std::map< RNGType, RNGMKLParam >; #endif diff --git a/src/Control/RNGSSEGrammar.hpp b/src/Control/RNGSSEGrammar.hpp index 8db62065016..fa7c80c44eb 100644 --- a/src/Control/RNGSSEGrammar.hpp +++ b/src/Control/RNGSSEGrammar.hpp @@ -40,15 +40,13 @@ namespace grm { ctr::RNGSSESeqLen opt; using EnumType = ctr::RNGSSESeqLen::EnumType; // get recently inserted key from - using key_type = - typename Stack::template nT< sel >::template nT< vec >::value_type; - const key_type& key = stack.template get< sel, vec >().back(); + const auto& key = stack.template get< sel, vec >().back(); // Error out if RNG does not support option specified - if ( !ctr::RNG().supportsOpt( key, opt.value(in.string()) ) ) { + if ( !ctr::RNG().supportsOpt( key, opt.value(in.string()) ) ) Message< Stack, ERROR, MsgKey::UNSUPPORTED >( stack, in ); - } - stack.template insert_opt< key_type, field, EnumType, tag, tags... > - ( key, opt.value(in.string()) ); + stack.template + insert_field< field, EnumType, tag, tags... > + ( key, opt.value(in.string()) ); // trigger error at compile-time if any of the expected option values // is not in the keywords pool of the grammar brigand::for_each< typename Option::keywords >( is_keyword< use >() ); @@ -84,8 +82,7 @@ namespace rngsse { typename vec, typename... tags > struct seed : tk::grm::process< use< kw::seed >, - tk::grm::Insert_field< tag::seed, - sel, vec, tags... > > {}; + tk::grm::insert_seed< sel, vec, tags... > > {}; //! \brief Match and set RNG sequence length parameter template< template < class > class use, typename keyword, diff --git a/src/Control/RNGTest/CmdLine/CmdLine.hpp b/src/Control/RNGTest/CmdLine/CmdLine.hpp index 1c5b7a94b9e..efae9f7474e 100644 --- a/src/Control/RNGTest/CmdLine/CmdLine.hpp +++ b/src/Control/RNGTest/CmdLine/CmdLine.hpp @@ -18,7 +18,7 @@ #include -#include "Control.hpp" +#include "TaggedTuple.hpp" #include "HelpFactory.hpp" #include "Keywords.hpp" #include "RNGTest/Types.hpp" @@ -27,20 +27,26 @@ namespace rngtest { //! RNGTest control facilitating user input to internal data transfer namespace ctr { -//! CmdLine : Control< specialized to RNGTest >, see Types.h, -class CmdLine : public tk::Control< - // tag type - tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > > { +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::io, ios + , tag::verbose, bool + , tag::chare, bool + , tag::help, bool + , tag::helpctr, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::error, std::vector< std::string > +>; + +//! CmdLine is a TaggedTuple specialized to RNGTest +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { + public: //! RNGTest command-line keywords //! \see tk::grm::use and its documentation @@ -52,6 +58,8 @@ class CmdLine : public tk::Control< , kw::helpkw , kw::quiescence , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set all defaults. @@ -86,9 +94,11 @@ class CmdLine : public tk::Control< //! otherwise it would be a mutual dependency. // cppcheck-suppress noExplicitConstructor CmdLine( tk::ctr::HelpFactory ctrinfo = tk::ctr::HelpFactory() ) { - set< tag::verbose >( false ); // Use quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::verbose >() = false; // Use quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords + add map passed in brigand::for_each< keywords::set >( tk::ctr::Info( get()) ); get< tag::ctrinfo >() = std::move( ctrinfo ); @@ -98,19 +108,7 @@ class CmdLine : public tk::Control< ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::io, ios, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] c CmdLine object reference diff --git a/src/Control/RNGTest/CmdLine/Grammar.hpp b/src/Control/RNGTest/CmdLine/Grammar.hpp index 191e043330a..90c6cf81429 100644 --- a/src/Control/RNGTest/CmdLine/Grammar.hpp +++ b/src/Control/RNGTest/CmdLine/Grammar.hpp @@ -74,6 +74,16 @@ namespace cmd { tk::grm::process_cmd_switch< use, kw::trace, tag::trace > {}; + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! Match all command line keywords struct keywords : pegtl::sor< verbose, @@ -83,7 +93,9 @@ namespace cmd { helpctr, helpkw, quiescence, - trace > {}; + trace, + version, + license > {}; //! \brief Grammar entry point: parse keywords until end of string struct read_string : diff --git a/src/Control/RNGTest/CmdLine/Parser.cpp b/src/Control/RNGTest/CmdLine/Parser.cpp index 8357c8513e9..c3e20c9fb8f 100644 --- a/src/Control/RNGTest/CmdLine/Parser.cpp +++ b/src/Control/RNGTest/CmdLine/Parser.cpp @@ -11,19 +11,13 @@ */ // ***************************************************************************** -#include -#include -#include -#include - #include "NoWarning/pegtl.hpp" - #include "NoWarning/charm.hpp" + #include "QuinoaConfig.hpp" #include "Exception.hpp" #include "Print.hpp" #include "Keywords.hpp" -#include "HelpFactory.hpp" #include "RNGTest/Types.hpp" #include "RNGTest/CmdLine/Parser.hpp" #include "RNGTest/CmdLine/Grammar.hpp" @@ -107,9 +101,26 @@ CmdLineParser::CmdLineParser( int argc, if (!helpkw.keyword.empty()) print.helpkw< tk::QUIET >( tk::rngtest_executable(), helpkw ); + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::rngtest_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::rngtest_executable(), tk::license() ); + // Immediately exit if any help was output or was called without any argument - // with zero exit code - if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty()) CkExit(); + // or version or license info was requested with zero exit code + if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty() || version || + license) + { + CkExit(); + } // Make sure mandatory arguments are set auto alias = kw::control().alias(); diff --git a/src/Control/RNGTest/InputDeck/InputDeck.hpp b/src/Control/RNGTest/InputDeck/InputDeck.hpp index 4dd9bcc1e79..4f965448e21 100644 --- a/src/Control/RNGTest/InputDeck/InputDeck.hpp +++ b/src/Control/RNGTest/InputDeck/InputDeck.hpp @@ -18,26 +18,29 @@ #include "NoWarning/set.hpp" -#include "Control.hpp" #include "QuinoaConfig.hpp" +#include "TaggedTuple.hpp" #include "RNGTest/CmdLine/CmdLine.hpp" namespace rngtest { namespace ctr { -//! \brief InputDeck : Control< specialized to RNGTest >, see Types.h +//! Member data for tagged tuple +using InputDeckMembers = brigand::list< + tag::title, kw::title::info::expect::type + , tag::selected, selects + , tag::io, ios + , tag::cmd, CmdLine + , tag::param, parameters + , tag::error, std::vector< std::string > +>; + +//! \brief InputDeck is a TaggedTuple specialized to RNGTest //! \details The stack is a tagged tuple, a hierarchical heterogeneous data //! structure where all parsed information is stored. //! \see Base/TaggedTuple.h //! \see Control/RNGTest/Types.h -class InputDeck : public tk::Control< - // tag type - tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::io, ios, - tag::cmd, CmdLine, - tag::param, parameters, - tag::error, std::vector< std::string > > { +class InputDeck : public tk::TaggedTuple< InputDeckMembers > { public: //! \brief RNGTest input deck keywords @@ -100,7 +103,7 @@ class InputDeck : public tk::Control< //! default constructor for the corresponding type. explicit InputDeck( const CmdLine& cl = {} ) { // Set previously parsed command line - set< tag::cmd >( cl ); + get< tag::cmd >() = cl; // Initialize help const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() ); brigand::for_each< keywords >( ctrinfoFill ); @@ -110,14 +113,7 @@ class InputDeck : public tk::Control< ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::io, ios, - tag::cmd, CmdLine, - tag::param, parameters, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] i InputDeck object reference diff --git a/src/Control/RNGTest/Types.hpp b/src/Control/RNGTest/Types.hpp index aaccadd8bce..700b5179794 100644 --- a/src/Control/RNGTest/Types.hpp +++ b/src/Control/RNGTest/Types.hpp @@ -31,24 +31,24 @@ using namespace tao; using tk::ctr::RNGType; //! Storage of selected options -using selects = tk::tuple::tagged_tuple< - tag::battery, BatteryType, //!< Battery - tag::rng, std::vector< RNGType > //!< Random number generators ->; +using selects = tk::TaggedTuple< brigand::list< + tag::battery, BatteryType //!< Battery + , tag::rng, std::vector< RNGType > //!< Random number generators +> >; //! IO parameters storage -using ios = tk::tuple::tagged_tuple< - tag::control, std::string //!< Control filename ->; +using ios = tk::TaggedTuple< brigand::list< + tag::control, std::string //!< Control filename +> >; //! Parameters storage -using parameters = tk::tuple::tagged_tuple< - #ifdef HAS_MKL - tag::rngmkl, tk::ctr::RNGMKLParameters, //!< MKL RNG parameters - #endif - tag::rngsse, tk::ctr::RNGSSEParameters, //!< RNGSSE parameters - tag::rng123, tk::ctr::RNGRandom123Parameters //!< Random123 parameters ->; +using parameters = tk::TaggedTuple< brigand::list< + #ifdef HAS_MKL + tag::rngmkl, tk::ctr::RNGMKLParameters, //!< MKL RNG parameters + #endif + tag::rngsse, tk::ctr::RNGSSEParameters //!< RNGSSE parameters + , tag::rng123, tk::ctr::RNGRandom123Parameters //!< Random123 parameters +> >; //! PEGTL location/position type to use throughout all of RNGTest's parsers using Location = pegtl::position; diff --git a/src/Control/Random123Grammar.hpp b/src/Control/Random123Grammar.hpp index 3b72551de02..d8af94f4164 100644 --- a/src/Control/Random123Grammar.hpp +++ b/src/Control/Random123Grammar.hpp @@ -34,8 +34,7 @@ namespace random123 { typename vec, typename... tags > struct seed : tk::grm::process< use< kw::seed >, - tk::grm::Insert_field< tag::seed, - sel, vec, tags... > > {}; + tk::grm::insert_seed< sel, vec, tags... > > {}; //! \brief Match Random123 RNGs in an rngs ... end block //! \see walker::deck::rngs diff --git a/src/Control/SystemComponents.hpp b/src/Control/SystemComponents.hpp index ff419a7ec22..ba5be7850ce 100644 --- a/src/Control/SystemComponents.hpp +++ b/src/Control/SystemComponents.hpp @@ -17,7 +17,7 @@ are functions that operate on this data structure and return, e.g., the total number of components in the whole system or the offset in the whole data structure for a given tag. The functions should thus be able to operate - on a list of types, i.e., a double for loop over all tags and associated + on a list of types, i.e., a double for-loop over all tags and associated vectors - one at compile-time and the other one at run-time. _Example:_ An example is to define storage for systems of stochastic @@ -30,10 +30,10 @@ example, it is possible to numerically integrate two systems of Dirichlet equations, see DiffEq/Dirichlet.h, one with 4, the other one with 5 scalar variables, parameterized differently, and estimate their arbitrary coupled - statistics and joint PDFs. This requires that each type of system + statistics and joint PDFs. This requires that each type of equation system has a vector of integers storing the number of scalar variables. - _Solution:_ Looping through elements of a tuple is done via [Brigand] + _Solution:_ Looping through a list of types is done using the [Brigand] (https://github.com/edouarda/brigand)'s [MetaProgramming Library]. Such operations on types happen at compile-time, i.e., the code runs inside the compiler and only its result gets compiled into code to be run at @@ -74,10 +74,11 @@ #include #include -#include #include +#include -#include "NoWarning/remove.hpp" +#include "NoWarning/flatten.hpp" +#include "NoWarning/transform.hpp" #include "TaggedTuple.hpp" #include "StatCtr.hpp" @@ -89,7 +90,7 @@ namespace tk { namespace ctr { //! Inherit type of number of components from keyword 'ncomp' -using ncomp_type = kw::ncomp::info::expect::type; +using ncomp_t = kw::ncomp::info::expect::type; //! \brief Map associating offsets to dependent variables for systems //! \details This map associates offsets of systems of differential ! @@ -104,7 +105,7 @@ using ncomp_type = kw::ncomp::info::expect::type; //! and central moments of dependent variables (which are denoted by upper and //! lower case, characters, respectively) for which the offset (for the same //! dependent variable) should be the same. -using OffsetMap = std::map< char, ncomp_type, CaseInsensitiveCharLess >; +using OffsetMap = std::map< char, ncomp_t, CaseInsensitiveCharLess >; //! \brief Map associating number of scalar components to dependent variables //! for systems @@ -113,208 +114,116 @@ using OffsetMap = std::map< char, ncomp_type, CaseInsensitiveCharLess >; //! system of systems. //! \note We use a case-insensitive character comparison functor to be //! consistent with OffsetMap. -using NcompMap = std::map< char, ncomp_type, CaseInsensitiveCharLess >; +using NcompMap = std::map< char, ncomp_t, CaseInsensitiveCharLess >; -//! \brief Number of components storage -//! \details All this trickery with boost::mpl allows the code below to be -//! generic. As a result, adding a new component requires adding a single line -//! (a tag and its type) to the already existing list, see typedefs 'ncomps'. -//! The member functions, doing initialization, computing the number of total -//! components, the offset for a given tag, and computing the offset map, need -//! no change -- even if the order of the number of components change. -template< typename... Tags > -class ncomponents : public tk::tuple::tagged_tuple< Tags... > { +//! Helper for converting a brigand::list to a tagged_tuple +template< typename... T > +using tagged_tuple_wrapper = typename tk::TaggedTuple< brigand::list >; - public: - //! Remove std::vector< ncomp_type > types, i.e., keep only the tags - using tags = typename - brigand::remove< brigand::list, std::vector >; - - private: - //! Function object for zeroing all number of components - struct zero { - //! Need to store reference to host class whose data we operate on - ncomponents* const m_host; - //! Constructor: store host object pointer - explicit zero( ncomponents* const host ) : m_host( host ) {} - //! Function call operator templated on the type that does the zeroing - template< typename U > void operator()( brigand::type_ ) { - //! Loop through and zero all elements of the vector for this system - auto& v = m_host->template get< U >(); - std::fill( begin(v), end(v), 0 ); - } - }; +//! Helper for converting a brigand::list to a tagged_tuple +template< typename L > +using as_tagged_tuple = brigand::wrap< L, tagged_tuple_wrapper >; - //! \brief Function object for computing the total number of components - //! (i.e., the sum of all of the number of components) - struct addncomp { - //! Need to store reference to host class whose data we operate on - const ncomponents* const m_host; - //! Internal reference used to return the total number of components - ncomp_type& m_nprop; - //! \brief Constructor: store host object pointer and initially zeroed - //! counter reference - addncomp( const ncomponents* const host, ncomp_type& nprop ) : - m_host( host ), m_nprop( nprop = 0 ) {} - //! Function call operator templated on the type that does the counting - template< typename U > void operator()( brigand::type_ ) { - //! Loop through and add up all elements of the vector for this system - const auto& v = m_host->template get< U >(); - m_nprop = std::accumulate( v.cbegin(), v.cend(), m_nprop ); - } - }; +//! Number of components storage as a vector for a system of equations +//! \details This is only a helper class, defining a type 'type' for +//! brigand::apply, so it can be used for defining a base for ncomponents +struct ComponentVector : public std::vector< ncomp_t > { + using type = std::vector< ncomp_t >; +}; - //! \brief Function object for computing the offset for a given tag (i.e., - //! the sum of the number of components up to a given tag) - //! \details This is used to index into the data array (the equation systems - //! operate on during the numerical solution) and get to the beginning of - //! data for a given differential equation system. - template< typename tag > - struct addncomp4tag { - //! Need to store reference to host class whose data we operate on - const ncomponents* const m_host; - //! Internal reference used to return the offset for the tag given - ncomp_type& m_offset; - //! \brief Internal storage for the index of a system within systems - //! \details Example: I want the second Dirichlet system: m_c = 1. - //! \see offset(). - const ncomp_type m_c; - //! Indicates whether the tag (eq system) was found, so it is time to quit - bool m_found; - //! \brief Constructor: store host object pointer, initially zeroed offset - //! reference, and system index we are looking for - addncomp4tag( const ncomponents* const host, ncomp_type& offset, - ncomp_type c ) : - m_host( host ), m_offset( offset = 0 ), m_c( c ), m_found( false ) {} - //! \brief Function call operator templated on the type that does the - //! offset calculation - template< typename U > void operator()( brigand::type_ ) { - if (std::is_same< tag, U >::value) { - // Make sure we are not trying to index beyond the length for this U - Assert( m_host->template get().size() >= m_c, - "Indexing out of bounds in addncomp4tag!" ); - // If we have found the tag we are looking for, we count up to the - // given system index (passed in via the constructor) and add those to - // the offset, then quit - for (ncomp_type c=0; ctemplate get()[c]; - m_found = true; - } else if (!m_found) { - // If we have not found the tag we are looking for, we add all the - // number of scalars for that tag to the offset - const auto& v = m_host->template get< U >(); - m_offset = std::accumulate( v.cbegin(), v.cend(), m_offset ); - } - } - }; +//! \brief Number of components storage +//! \details All this trickery with template meta-programming allows the code +//! below to be generic. As a result, adding a new component requires adding a +//! single line (a tag and its type) to the already existing list, see +//! typedefs 'ncomps'. The member functions, doing initialization, computing +//! the number of total components, the offset for a given tag, and computing +//! the offset map, need no change -- even if the order of the number of +//! components change. +template< typename... Tags > +class ncomponents : public + // tk::tuple::tagged_tuple< tag1, vec1, tag2, vec2, ... > + as_tagged_tuple< brigand::flatten< brigand::transform< brigand::list, + brigand::bind< brigand::list, brigand::_1, ComponentVector > > > > { - //! Function object for creating offset map: std::map< depvar, offset > - template< class InputDeck > - struct genOffsetMap { - //! Reference to input deck to operate on - const InputDeck& deck; - //! Internal reference to map we build - OffsetMap& map; - //! Constructor: store reference to input deck and offset map - genOffsetMap( const InputDeck& d, OffsetMap& m ) : deck( d ), map( m ) {} - //! \brief Functional call operator templated on the type that computes - //! the offset map for type U. - //! \details There can be multiple systems of the same equation type, - //! differentiated by a different dependent variable. - template< typename U > void operator()( brigand::type_ ) const { - const auto& depvar = deck.template get< tag::param, U, tag::depvar >(); - ncomp_type c = 0; - const auto& ncomps = deck.template get< tag::component >(); - for (auto v : depvar) map[ v ] = ncomps.template offset< U >( c++ ); - } - }; + private: + //! Access vector of number of components of an eq system as const-ref + template< typename Eq > + constexpr const auto& vec() const { return this->template get< Eq >(); } - //! \brief Function object for creating number of properties (scalar - //! components) map: std::map< depvar, offset > - template< class InputDeck > - struct genNcompMap { - //! Reference to input deck to operate on - const InputDeck& deck; - //! Internal reference to map we build - NcompMap& map; - //! Constructor: store reference to input deck and offset map - genNcompMap( const InputDeck& d, NcompMap& m ) : deck( d ), map( m ) {} - //! \brief Functional call operator templated on the type that computes - //! the number of properties (scalar components) map for type U. - //! \details There can be multiple systems of the same equation type, - //! differentiated by a different dependent variable. - template< typename U > void operator()( brigand::type_ ) const { - const auto& depvar = deck.template get< tag::param, U, tag::depvar >(); - const auto& ncomps = deck.template get< tag::component, U >(); - Assert( ncomps.size() == depvar.size(), "ncomps != depvar" ); - ncomp_type c = 0; - for (auto v : depvar) map[ v ] = ncomps.at( c++ ); - } - }; - - //! Function object for collecting depdent variables for all components - template< class InputDeck > - struct collect_depvars { - //! Reference to input deck to operate on - const InputDeck& deck; - //! Internal reference to depvar vector to fill - std::vector< std::string >& depvar; - //! Constructor: store host object pointer - explicit collect_depvars( const InputDeck& d, - std::vector< std::string >& dv ) : - deck( d ), depvar( dv ) {} - //! Function call operator templated on the type that does the collecting - template< typename U > void operator()( brigand::type_ ) { - const auto& dveq = deck.template get< tag::param, U, tag::depvar >(); - const auto& nceq = deck.template get< tag::component, U >(); - Assert( dveq.size() == nceq.size(), "Size mismatch" ); - std::size_t e = 0; - for (auto v : dveq) { - for (std::size_t c=0; c + constexpr auto& vec() { return this->template get< Eq >(); } public: //! Default constructor: set defaults to zero for all number of components - ncomponents() { brigand::for_each< tags >( zero( this ) ); } + ncomponents() { + ( ... , std::fill( begin(vec()), end(vec()), 0 ) ); + } + //! Compute total number of components in the systems of systems configured //! \return Total number of components - ncomp_type nprop() const noexcept { - ncomp_type n; - brigand::for_each< tags >( addncomp( this, n ) ); - return n; + ncomp_t nprop() const noexcept { + return (... + std::accumulate(begin(vec()), end(vec()), 0u)); } + //! \brief Compute the offset for a given equation tag, i.e., the sum of the + //! number of components up to a given tag //! \return offset for tag //! \param[in] c Index for system given by template argument tag + //! \details This offset is used to index into the data array (the equation + //! systems operate on during the numerical solution) and get to the + //! beginning of data for a given differential equation system. template< typename tag > - ncomp_type offset( ncomp_type c ) const noexcept { - ncomp_type n; - brigand::for_each< tags >( addncomp4tag< tag >( this, n, c ) ); - return n; + ncomp_t offset( ncomp_t c ) const noexcept { + ncomp_t offset = 0; + bool found = false; + ( ... , [&](){ + if (std::is_same_v< tag, Tags >) { + const auto& v = vec(); + // Make sure we are not trying to index beyond the length for this eq + Assert( v.size() >= c, "Indexing out of bounds" ); + // If we have found the tag we are looking for, we count up to the + // given system index and add those to the offset + for (ncomp_t q=0; q(); + offset = std::accumulate( begin(v), end(v), offset ); + } }() ); + return offset; } //! Compute map of offsets associated to dependent variables - //! \param[in] deck Input deck to operate on + //! \param[in] d Input deck to operate on //! \return Map of offsets associated to dependent variables template< class InputDeck > - OffsetMap offsetmap( const InputDeck& deck ) const { + OffsetMap offsetmap( const InputDeck& d ) const { OffsetMap map; - brigand::for_each< tags >( genOffsetMap< InputDeck >( deck, map ) ); + ( ... , [&](){ + const auto& depvar = d.template get< tag::param, Tags, tag::depvar >(); + ncomp_t c = 0; + const auto& ncomps = d.template get< tag::component >(); + for (auto v : depvar) + map[ v ] = ncomps.template offset< Tags >( c++ ); }() ); return map; } //! \brief Compute map of number of properties (scalar components) //! associated to dependent variables - //! \param[in] deck Input deck to operate on + //! \param[in] d Input deck to operate on //! \return Map of number of properties associated to dependent variables template< class InputDeck > - NcompMap ncompmap( const InputDeck& deck ) const { + NcompMap ncompmap( const InputDeck& d ) const { NcompMap map; - brigand::for_each< tags >( genNcompMap< InputDeck >( deck, map ) ); + ( ... , [&](){ + const auto& depvar = d.template get< tag::param, Tags, tag::depvar >(); + const auto& ncomps = d.template get< tag::component >(); + const auto& ncvec = ncomps.template get(); + Assert( ncvec.size() == depvar.size(), "ncompsize != depvarsize" ); + ncomp_t c = 0; + for (auto v : depvar) map[ v ] = ncvec[c++]; }() ); return map; } @@ -329,7 +238,16 @@ class ncomponents : public tk::tuple::tagged_tuple< Tags... > { template< class InputDeck > std::vector< std::string > depvar( const InputDeck& deck ) const { std::vector< std::string > d; - brigand::for_each< tags >( collect_depvars< InputDeck >( deck, d ) ); + ( ..., [&](){ + const auto& dveq = deck.template get< tag::param, Tags, tag::depvar >(); + const auto& nceq = deck.template get< tag::component, Tags >(); + Assert( dveq.size() == nceq.size(), "Size mismatch" ); + std::size_t e = 0; + for (auto v : dveq) { + for (std::size_t c=0; c #include "Macro.hpp" -#include "Control.hpp" +#include "TaggedTuple.hpp" #include "HelpFactory.hpp" #include "Keywords.hpp" #include "UnitTest/Types.hpp" @@ -28,22 +28,28 @@ namespace unittest { //! UnitTest control facilitating user input to internal data transfer namespace ctr { -//! CmdLine : Control< specialized to UnitTest > +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::verbose, bool + , tag::chare, bool + , tag::help, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::group, std::string + , tag::error, std::vector< std::string > +>; + +//! CmdLine is a TaggedTuple specialized to UnitTest //! \details The stack is a tagged tuple //! \see Base/TaggedTuple.h //! \see Control/UnitTest/Types.h -class CmdLine : public tk::Control< - // tag type - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::group, std::string, - tag::error, std::vector< std::string > > { +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { + public: //! \brief UnitTest command-line keywords //! \see tk::grm::use and its documentation @@ -54,6 +60,8 @@ class CmdLine : public tk::Control< , kw::group , kw::quiescence , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set defaults. @@ -63,9 +71,11 @@ class CmdLine : public tk::Control< //! control file parser. //! \see walker::ctr::CmdLine CmdLine() { - set< tag::verbose >( false ); // Use quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::verbose >() = false; // Use quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords brigand::for_each< keywords::set >( tk::ctr::Info(get()) ); } @@ -74,18 +84,7 @@ class CmdLine : public tk::Control< ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er& p ) { - tk::Control< tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::group, std::string, - tag::error, std::vector< std::string > >::pup(p); - } + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] c CmdLine object reference diff --git a/src/Control/UnitTest/CmdLine/Grammar.hpp b/src/Control/UnitTest/CmdLine/Grammar.hpp index 25e836d22f7..13e44ee684a 100644 --- a/src/Control/UnitTest/CmdLine/Grammar.hpp +++ b/src/Control/UnitTest/CmdLine/Grammar.hpp @@ -70,10 +70,20 @@ namespace cmd { tk::grm::process_cmd_switch< use, kw::trace, tag::trace > {}; + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! \brief Match all command line keywords struct keywords : pegtl::sor< verbose, charestate, help, helpkw, group, - trace, quiescence > {}; + quiescence, trace, version, license > {}; //! \brief Grammar entry point: parse keywords until end of string struct read_string : diff --git a/src/Control/UnitTest/CmdLine/Parser.cpp b/src/Control/UnitTest/CmdLine/Parser.cpp index 809415cf097..ac819e6479b 100644 --- a/src/Control/UnitTest/CmdLine/Parser.cpp +++ b/src/Control/UnitTest/CmdLine/Parser.cpp @@ -11,14 +11,9 @@ */ // ***************************************************************************** -#include -#include -#include - #include "NoWarning/pegtl.hpp" #include "Print.hpp" -#include "HelpFactory.hpp" #include "UnitTest/Types.hpp" #include "UnitTest/CmdLine/Parser.hpp" #include "UnitTest/CmdLine/Grammar.hpp" @@ -89,9 +84,23 @@ CmdLineParser::CmdLineParser( int argc, if (!helpkw.keyword.empty()) print.helpkw< tk::QUIET >( tk::unittest_executable(), helpkw ); + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::unittest_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::unittest_executable(), tk::license() ); + // Will exit in main chare constructor if any help was output if (cmdline.get< tag::help >() || // help on all cmdline args - !cmdline.get< tag::helpkw >().keyword.empty()) // help on a keyword + !cmdline.get< tag::helpkw >().keyword.empty() || // help on a keyword + version || license) // version or license output helped = true; else helped = false; diff --git a/src/Control/Walker/CmdLine/CmdLine.hpp b/src/Control/Walker/CmdLine/CmdLine.hpp index 32f1a08f3ee..3e1982c6c09 100644 --- a/src/Control/Walker/CmdLine/CmdLine.hpp +++ b/src/Control/Walker/CmdLine/CmdLine.hpp @@ -16,7 +16,7 @@ #include -#include "Control.hpp" +#include "TaggedTuple.hpp" #include "HelpFactory.hpp" #include "Keywords.hpp" #include "Walker/Types.hpp" @@ -25,21 +25,26 @@ namespace walker { //! Walker control facilitating user input to internal data transfer namespace ctr { +//! Member data for tagged tuple +using CmdLineMembers = brigand::list< + tag::io, ios + , tag::virtualization, kw::virtualization::info::expect::type + , tag::verbose, bool + , tag::chare, bool + , tag::help, bool + , tag::helpctr, bool + , tag::quiescence, bool + , tag::trace, bool + , tag::version, bool + , tag::license, bool + , tag::cmdinfo, tk::ctr::HelpFactory + , tag::ctrinfo, tk::ctr::HelpFactory + , tag::helpkw, tk::ctr::HelpKw + , tag::error, std::vector< std::string > +>; + //! CmdLine : Control< specialized to Walker >, see Types.h -class CmdLine : public tk::Control< - // tag type - tag::io, ios, - tag::virtualization, kw::virtualization::info::expect::type, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > > { +class CmdLine : public tk::TaggedTuple< CmdLineMembers > { public: //! Walker command-line keywords @@ -52,8 +57,10 @@ class CmdLine : public tk::Control< , kw::control , kw::pdf , kw::stat - , kw::trace , kw::quiescence + , kw::trace + , kw::version + , kw::license >; //! \brief Constructor: set all defaults. @@ -88,34 +95,30 @@ class CmdLine : public tk::Control< //! otherwise it would be a mutual dependency. // cppcheck-suppress noExplicitConstructor CmdLine( tk::ctr::HelpFactory ctrinfo = tk::ctr::HelpFactory() ) { - set< tag::io, tag::output >( "out" ); - set< tag::io, tag::pdf >( "pdf" ); - set< tag::io, tag::stat >( "stat.txt" ); - set< tag::virtualization >( 0.0 ); - set< tag::verbose >( false ); // Quiet output by default - set< tag::chare >( false ); // No chare state output by default - set< tag::trace >( true ); // Output call and stack trace by default + get< tag::io, tag::output >() = "out"; + get< tag::io, tag::pdf >() = "pdf"; + get< tag::io, tag::stat >() = "stat.txt"; + get< tag::virtualization >() = 0.0; + get< tag::verbose >() = false; // Quiet output by default + get< tag::chare >() = false; // No chare state output by default + get< tag::trace >() = true; // Output call and stack trace by default + get< tag::version >() = false; // Do not display version info by default + get< tag::license >() = false; // Do not display license info by default // Initialize help: fill from own keywords + add map passed in brigand::for_each< keywords::set >( tk::ctr::Info(get()) ); get< tag::ctrinfo >() = std::move( ctrinfo ); } - //! Pack/Unpack - void pup( PUP::er& p ) { - tk::Control< tag::io, ios, - tag::virtualization, kw::virtualization::info::expect::type, - tag::verbose, bool, - tag::chare, bool, - tag::help, bool, - tag::helpctr, bool, - tag::quiescence, bool, - tag::trace, bool, - tag::cmdinfo, tk::ctr::HelpFactory, - tag::ctrinfo, tk::ctr::HelpFactory, - tag::helpkw, tk::ctr::HelpKw, - tag::error, std::vector< std::string > >::pup(p); - } + /** @name Pack/Unpack: Serialize CmdLine object for Charm++ */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + void pup( PUP::er& p ) { tk::TaggedTuple< CmdLineMembers >::pup(p); } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] c CmdLine object reference friend void operator|( PUP::er& p, CmdLine& c ) { c.pup(p); } + //@} }; } // ctr:: diff --git a/src/Control/Walker/CmdLine/Grammar.hpp b/src/Control/Walker/CmdLine/Grammar.hpp index d540c0e9576..957d90da677 100644 --- a/src/Control/Walker/CmdLine/Grammar.hpp +++ b/src/Control/Walker/CmdLine/Grammar.hpp @@ -80,6 +80,16 @@ namespace cmd { tk::grm::process_cmd_switch< use, kw::trace, tag::trace > {}; + //! Match switch on version output + struct version : + tk::grm::process_cmd_switch< use, kw::version, + tag::version > {}; + + //! Match switch on license output + struct license : + tk::grm::process_cmd_switch< use, kw::license, + tag::license > {}; + //! command line keywords struct keywords : pegtl::sor< verbose, @@ -90,6 +100,8 @@ namespace cmd { virtualization, quiescence, trace, + version, + license, io< kw::control, tag::control >, io< kw::pdf, tag::pdf >, io< kw::stat, tag::stat > > {}; diff --git a/src/Control/Walker/CmdLine/Parser.cpp b/src/Control/Walker/CmdLine/Parser.cpp index 6faad7694ca..86624ae6b5c 100644 --- a/src/Control/Walker/CmdLine/Parser.cpp +++ b/src/Control/Walker/CmdLine/Parser.cpp @@ -10,18 +10,12 @@ */ // ***************************************************************************** -#include -#include -#include -#include - #include "NoWarning/pegtl.hpp" #include "NoWarning/charm.hpp" #include "Print.hpp" #include "QuinoaConfig.hpp" #include "Exception.hpp" -#include "HelpFactory.hpp" #include "Keywords.hpp" #include "Walker/Types.hpp" #include "Walker/CmdLine/Parser.hpp" @@ -105,9 +99,26 @@ CmdLineParser::CmdLineParser( int argc, char** argv, if (!helpkw.keyword.empty()) print.helpkw< tk::QUIET >( tk::walker_executable(), helpkw ); + // Print out version information if it was requested + const auto version = cmdline.get< tag::version >(); + if (version) + print.version< tk::QUIET >( tk::walker_executable(), + tk::quinoa_version(), + tk::git_commit(), + tk::copyright() ); + + // Print out license information if it was requested + const auto license = cmdline.get< tag::license >(); + if (license) + print.license< tk::QUIET >( tk::walker_executable(), tk::license() ); + // Immediately exit if any help was output or was called without any argument - // with zero exit code - if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty()) CkExit(); + // or version or license info was requested with zero exit code + if (argc == 1 || helpcmd || helpctr || !helpkw.keyword.empty() || version || + license) + { + CkExit(); + } // Make sure mandatory arguments are set auto alias = kw::control().alias(); diff --git a/src/Control/Walker/Components.hpp b/src/Control/Walker/Components.hpp index b40d8fc1f46..390ed7a3065 100644 --- a/src/Control/Walker/Components.hpp +++ b/src/Control/Walker/Components.hpp @@ -7,7 +7,7 @@ All rights reserved. See the LICENSE file for details. \brief Storage for number of components \details Storage for number of components. This is part of the input deck - stack and is thus populated during the control file parsing. + stack and is thus populated during control file parsing. */ // ***************************************************************************** #ifndef WalkerComponents_h @@ -18,24 +18,24 @@ namespace walker { namespace ctr { -//! Number of components of systems of equations +//! Number of components storage for all systems of equations supported using ncomps = tk::ctr::ncomponents< - tag::dirichlet, std::vector< tk::ctr::ncomp_type > - , tag::mixdirichlet, std::vector< tk::ctr::ncomp_type > - , tag::gendir, std::vector< tk::ctr::ncomp_type > - , tag::wrightfisher, std::vector< tk::ctr::ncomp_type > - , tag::diagou, std::vector< tk::ctr::ncomp_type > - , tag::ou, std::vector< tk::ctr::ncomp_type > - , tag::skewnormal, std::vector< tk::ctr::ncomp_type > - , tag::gamma, std::vector< tk::ctr::ncomp_type > - , tag::beta, std::vector< tk::ctr::ncomp_type > - , tag::numfracbeta, std::vector< tk::ctr::ncomp_type > - , tag::massfracbeta, std::vector< tk::ctr::ncomp_type > - , tag::mixnumfracbeta, std::vector< tk::ctr::ncomp_type > - , tag::mixmassfracbeta, std::vector< tk::ctr::ncomp_type > - , tag::velocity, std::vector< tk::ctr::ncomp_type > - , tag::position, std::vector< tk::ctr::ncomp_type > - , tag::dissipation, std::vector< tk::ctr::ncomp_type > + tag::dirichlet + , tag::mixdirichlet + , tag::gendir + , tag::wrightfisher + , tag::diagou + , tag::ou + , tag::skewnormal + , tag::gamma + , tag::beta + , tag::numfracbeta + , tag::massfracbeta + , tag::mixnumfracbeta + , tag::mixmassfracbeta + , tag::velocity + , tag::position + , tag::dissipation >; } // ctr:: diff --git a/src/Control/Walker/InputDeck/Grammar.hpp b/src/Control/Walker/InputDeck/Grammar.hpp index b3f4e75f870..896c4748249 100644 --- a/src/Control/Walker/InputDeck/Grammar.hpp +++ b/src/Control/Walker/InputDeck/Grammar.hpp @@ -51,22 +51,25 @@ namespace deck { //! \brief Number of registered equations //! \details Counts the number of parsed equation blocks during parsing. - static tk::tuple::tagged_tuple< tag::dirichlet, std::size_t, - tag::mixdirichlet, std::size_t, - tag::gendir, std::size_t, - tag::wrightfisher, std::size_t, - tag::ou, std::size_t, - tag::diagou, std::size_t, - tag::skewnormal, std::size_t, - tag::gamma, std::size_t, - tag::velocity, std::size_t, - tag::position, std::size_t, - tag::dissipation, std::size_t, - tag::beta, std::size_t, - tag::numfracbeta, std::size_t, - tag::massfracbeta, std::size_t, - tag::mixnumfracbeta, std::size_t, - tag::mixmassfracbeta, std::size_t > neq; + static tk::TaggedTuple< brigand::list< + tag::dirichlet, std::size_t + , tag::mixdirichlet, std::size_t + , tag::gendir, std::size_t + , tag::wrightfisher, std::size_t + , tag::ou, std::size_t + , tag::diagou, std::size_t + , tag::skewnormal, std::size_t + , tag::gamma, std::size_t + , tag::velocity, std::size_t + , tag::position, std::size_t + , tag::dissipation, std::size_t + , tag::beta, std::size_t + , tag::numfracbeta, std::size_t + , tag::massfracbeta, std::size_t + , tag::mixnumfracbeta, std::size_t + , tag::mixmassfracbeta, std::size_t + > > neq; + } // ::deck } // ::walker @@ -215,47 +218,48 @@ namespace grm { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { using walker::deck::neq; - const auto& init = + const auto& initpolicy = stack.template get< tag::param, eq, tag::initpolicy >(); // Error checks for joint delta initpolicy - if (init.size() == neq.get< eq >() && - init.back() == walker::ctr::InitPolicyType::JOINTDELTA) { + if (initpolicy.size() == neq.get< eq >() && + initpolicy.back() == walker::ctr::InitPolicyType::JOINTDELTA) { // Make sure there was an icdelta...end block with at least a single // spike...end block - const auto& spike = stack.template get< tag::param, eq, tag::spike >(); + const auto& spike = + stack.template get< tag::param, eq, tag::init, tag::spike >(); if (!spike.empty() && spike.back().empty()) Message< Stack, ERROR, MsgKey::NODELTA >( stack, in ); } // Error checks for joint beta initpolicy - if (init.size() == neq.get< eq >() && - init.back() == walker::ctr::InitPolicyType::JOINTBETA) { + if (initpolicy.size() == neq.get< eq >() && + initpolicy.back() == walker::ctr::InitPolicyType::JOINTBETA) { // Make sure there was an icbeta...end block with at least a single // betapdf...end block const auto& betapdf = - stack.template get< tag::param, eq, tag::betapdf >(); + stack.template get< tag::param, eq, tag::init, tag::betapdf >(); if (!betapdf.empty() && betapdf.back().empty()) Message< Stack, ERROR, MsgKey::NOBETA >( stack, in ); } // Error checks for joint gamma initpolicy - if (init.size() == neq.get< eq >() && - init.back() == walker::ctr::InitPolicyType::JOINTGAMMA) { + if (initpolicy.size() == neq.get< eq >() && + initpolicy.back() == walker::ctr::InitPolicyType::JOINTGAMMA) { // Make sure there was an icgamma...end block with at least a single // gammapdf...end block const auto& gammapdf = - stack.template get< tag::param, eq, tag::gamma >(); + stack.template get< tag::param, eq, tag::init, tag::gamma >(); if (!gammapdf.empty() && gammapdf.back().empty()) Message< Stack, ERROR, MsgKey::NOGAMMA >( stack, in ); } // Error checks for joint correlated Gaussian initpolicy - if (init.size() == neq.get< eq >() && - init.back() == walker::ctr::InitPolicyType::JOINTCORRGAUSSIAN) { + if (initpolicy.size() == neq.get< eq >() && + initpolicy.back() == walker::ctr::InitPolicyType::JOINTCORRGAUSSIAN) { // Ensure there was a mean vector and covaraiance matrix configured const auto& mean = - stack.template get< tag::param, eq, tag::mean >(); + stack.template get< tag::param, eq, tag::init, tag::mean >(); if (mean.empty() || mean.back().empty()) Message< Stack, ERROR, MsgKey::NOMEAN >( stack, in ); const auto& cov = - stack.template get< tag::param, eq, tag::cov >(); + stack.template get< tag::param, eq, tag::init, tag::cov >(); if (cov.empty() || cov.back().empty()) Message< Stack, ERROR, MsgKey::NOCOV >( stack, in ); // Ensure that an MKL RNG is configured if initpolicy is corr-Gaussian @@ -368,7 +372,7 @@ namespace grm { // Ensure a coupled position model is configured couple< tag::velocity, tag::position, tag::position_id, MsgKey::POSITION_DEPVAR > - ( in, stack, MsgKey::POSITION_MISSING ); + ( in, stack, MsgKey::OPTIONAL ); // Compute equation id if a coupled dissipation model is configured couple< tag::velocity, tag::dissipation, tag::dissipation_id, MsgKey::DISSIPATION_DEPVAR > @@ -458,6 +462,10 @@ namespace grm { static void apply( const Input& in, Stack& stack ) { using walker::deck::neq; using eq = tag::mixmassfracbeta; + // Error out if no dependent variable to solve for was selected + const auto& solve = stack.template get< tag::param, eq, tag::solve >(); + if (solve.size() != neq.get< eq >()) + Message< Stack, ERROR, MsgKey::NOSOLVE >( stack, in ); // if there was a mixmassfracbeta eq block defined if (neq.get< eq >() > 0) { // Compute equation id if a coupled velocity model is configured @@ -479,16 +487,25 @@ namespace grm { struct action< check_mixdirichlet > { template< typename Input, typename Stack > static void apply( const Input& in, Stack& stack ) { - const auto& rho = - stack.template get< tag::param, tag::mixdirichlet, tag::rho >().back(); - auto ncomp = - stack.template get< tag::component, tag::mixdirichlet >().back(); + using eq = tag::mixdirichlet; + using walker::deck::neq; + // Ensure correct size for parameter vector rho - if (rho.size() != ncomp-1) - Message< Stack, ERROR, MsgKey::MIXDIR_RHO >( stack, in ); - // Ensure parameter vector rho is sorted in increasing order - if (!std::is_sorted( rho.cbegin(), rho.cend() )) + auto& rho = stack.template get< tag::param, eq, tag::rho >().back(); + auto ncomp = stack.template get< tag::component, eq >().back(); + if (rho.size() != ncomp-2) Message< Stack, ERROR, MsgKey::MIXDIR_RHO >( stack, in ); + + // If normalization is not set, set default + auto& normv = stack.template get< tag::param, eq, tag::normalization >(); + if (normv.size() != neq.get< eq >()) + normv.push_back( walker::ctr::NormalizationType::LIGHT ); + + // Sort parameter vector rho to correct order depending on normalization + if (normv.back() == walker::ctr::NormalizationType::HEAVY) + std::sort( rho.begin(), rho.end() ); + else + std::sort( rho.begin(), rho.end(), std::greater< tk::real >() ); } }; @@ -586,21 +603,25 @@ namespace deck { // jointdelta initpolicy tk::grm::start_vector< tag::param, eq, + tag::init, tag::spike >, // start new vector or vectors of beta parameters for a // potential jointbeta initpolicy tk::grm::start_vector< tag::param, eq, + tag::init, tag::betapdf >, // start new vector or vectors of gamma parameters for a // potential jointgamma initpolicy tk::grm::start_vector< tag::param, eq, + tag::init, tag::gamma >, // start new vector or vectors of gaussian parameters // for a potential jointgaussian initpolicy tk::grm::start_vector< tag::param, eq, + tag::init, tag::gaussian > > {}; //! Discretization parameters @@ -628,6 +649,20 @@ namespace deck { tag::selected, tag::rng, tag::param, tag::rng123 > > {}; + //! SDE parameter vector + template< class keyword, + template< class, class, class... > class check_vector, + class eq, class param, class... xparams > + struct sde_parameter_vector : + tk::grm::parameter_vector< use, + use< keyword >, + tk::grm::Store_back_back, + tk::grm::start_vector, + check_vector, + eq, + param, + xparams... > {}; + //! scan icdelta ... end block template< class eq > struct icdelta : @@ -642,6 +677,7 @@ namespace deck { tk::grm::start_vector_back, tk::grm::check_spikes, eq, + tag::init, tag::spike > > > {}; //! scan icbeta ... end block @@ -658,6 +694,7 @@ namespace deck { tk::grm::start_vector_back, tk::grm::check_betapdfs, eq, + tag::init, tag::betapdf > > > {}; //! scan icgamma ... end block @@ -674,8 +711,23 @@ namespace deck { tk::grm::start_vector_back, tk::grm::check_gammapdfs, eq, + tag::init, tag::gamma > > > {}; + //! scan icdirichlet ... end block + template< class eq > + struct icdirichlet : + pegtl::if_must< + tk::grm::readkw< use< kw::icdirichlet >::pegtl_string >, + // parse a dirichletpdf ... end block (there can be multiple) + tk::grm::block< + use< kw::end >, + sde_parameter_vector< kw::dirichletpdf, + tk::grm::check_dirichletpdf, + eq, + tag::init, + tag::dirichlet > > > {}; + //! scan icgaussian ... end block template< class eq > struct icgaussian : @@ -690,21 +742,9 @@ namespace deck { tk::grm::start_vector_back, tk::grm::check_gaussians, eq, + tag::init, tag::gaussian > > > {}; - //! SDE parameter vector - template< class keyword, class eq, class param, - template< class, class > class check_vector = - tk::grm::check_vector > - struct sde_parameter_vector : - tk::grm::parameter_vector< use, - use< keyword >, - tk::grm::Store_back_back, - tk::grm::start_vector, - check_vector, - eq, - param > {}; - //! scan icjointgaussian ... end block template< class eq > struct icjointgaussian : @@ -712,9 +752,15 @@ namespace deck { tk::grm::readkw< use< kw::icjointgaussian >::pegtl_string >, // parse a jointgaussian ... end block tk::grm::block< use< kw::end >, - sde_parameter_vector< kw::sde_mean, eq, tag::mean >, + sde_parameter_vector< kw::sde_mean, + tk::grm::check_vector, + eq, + tag::init, + tag::mean >, sde_parameter_vector< kw::sde_cov, + tk::grm::check_vector, eq, + tag::init, tag::cov > > > {}; //! Error checks after an equation ... end block has been parsed @@ -774,12 +820,15 @@ namespace deck { icgaussian< tag::diagou >, icjointgaussian< tag::diagou >, sde_parameter_vector< kw::sde_sigmasq, + tk::grm::check_vector, tag::diagou, tag::sigmasq >, sde_parameter_vector< kw::sde_theta, + tk::grm::check_vector, tag::diagou, tag::theta >, sde_parameter_vector< kw::sde_mu, + tk::grm::check_vector, tag::diagou, tag::mu > >, check_errors< tag::diagou > > {}; @@ -815,12 +864,15 @@ namespace deck { icgaussian< tag::ou >, icjointgaussian< tag::ou >, sde_parameter_vector< kw::sde_sigmasq, + tk::grm::check_vector, tag::ou, tag::sigmasq >, sde_parameter_vector< kw::sde_theta, + tk::grm::check_vector, tag::ou, tag::theta >, sde_parameter_vector< kw::sde_mu, + tk::grm::check_vector, tag::ou, tag::mu > >, check_errors< tag::ou > > {}; @@ -856,12 +908,15 @@ namespace deck { icgaussian< tag::skewnormal >, icjointgaussian< tag::skewnormal >, sde_parameter_vector< kw::sde_T, + tk::grm::check_vector, tag::skewnormal, tag::timescale >, sde_parameter_vector< kw::sde_sigmasq, + tk::grm::check_vector, tag::skewnormal, tag::sigmasq >, sde_parameter_vector< kw::sde_lambda, + tk::grm::check_vector, tag::skewnormal, tag::lambda > >, check_errors< tag::skewnormal > > {}; @@ -897,12 +952,15 @@ namespace deck { icgaussian< tag::beta >, icjointgaussian< tag::beta >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::beta, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::beta, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::beta, tag::kappa > >, check_errors< tag::beta > > {}; @@ -938,18 +996,23 @@ namespace deck { icgaussian< tag::numfracbeta >, icjointgaussian< tag::numfracbeta >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::numfracbeta, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::numfracbeta, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::numfracbeta, tag::kappa >, sde_parameter_vector< kw::sde_rho2, + tk::grm::check_vector, tag::numfracbeta, tag::rho2 >, sde_parameter_vector< kw::sde_rcomma, + tk::grm::check_vector, tag::numfracbeta, tag::rcomma > >, check_errors< tag::numfracbeta > > {}; @@ -985,18 +1048,23 @@ namespace deck { icgaussian< tag::massfracbeta >, icjointgaussian< tag::massfracbeta >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::massfracbeta, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::massfracbeta, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::massfracbeta, tag::kappa >, sde_parameter_vector< kw::sde_rho2, + tk::grm::check_vector, tag::massfracbeta, tag::rho2 >, sde_parameter_vector< kw::sde_r, + tk::grm::check_vector, tag::massfracbeta, tag::r > >, check_errors< tag::massfracbeta > > {}; @@ -1032,18 +1100,23 @@ namespace deck { icgaussian< tag::mixnumfracbeta >, icjointgaussian< tag::mixnumfracbeta >, sde_parameter_vector< kw::sde_bprime, + tk::grm::check_vector, tag::mixnumfracbeta, tag::bprime >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::mixnumfracbeta, tag::S >, sde_parameter_vector< kw::sde_kappaprime, + tk::grm::check_vector, tag::mixnumfracbeta, tag::kappaprime >, sde_parameter_vector< kw::sde_rho2, + tk::grm::check_vector, tag::mixnumfracbeta, tag::rho2 >, sde_parameter_vector< kw::sde_rcomma, + tk::grm::check_vector, tag::mixnumfracbeta, tag::rcomma > >, check_errors< tag::mixnumfracbeta > > {}; @@ -1073,6 +1146,11 @@ namespace deck { ctr::CoeffPolicy, tag::mixmassfracbeta, tag::coeffpolicy >, + tk::grm::policy< use, + use< kw::solve >, + ctr::Depvar, + tag::mixmassfracbeta, + tag::solve >, icdelta< tag::mixmassfracbeta >, icbeta< tag::mixmassfracbeta >, icgamma< tag::mixmassfracbeta >, @@ -1089,24 +1167,29 @@ namespace deck { tag::hydroproductions, tk::grm::check_vector_size >, sde_parameter_vector< kw::sde_bprime, + tk::grm::check_vector, tag::mixmassfracbeta, tag::bprime >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::mixmassfracbeta, tag::S >, sde_parameter_vector< kw::sde_kappaprime, + tk::grm::check_vector, tag::mixmassfracbeta, tag::kappaprime >, sde_parameter_vector< kw::sde_rho2, + tk::grm::check_vector, tag::mixmassfracbeta, tag::rho2 >, sde_parameter_vector< kw::sde_r, + tk::grm::check_vector, tag::mixmassfracbeta, tag::r >, sde_parameter_vector< kw::mean_gradient, + tk::grm::check_mean_gradient, tag::mixmassfracbeta, - tag::mean_gradient, - tk::grm::check_mean_gradient >, + tag::mean_gradient >, tk::grm::process< use< kw::velocity >, tk::grm::Store_back< tag::param, @@ -1164,12 +1247,15 @@ namespace deck { icgaussian< tag::gamma >, icjointgaussian< tag::gamma >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::gamma, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::gamma, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::gamma, tag::kappa > >, check_errors< tag::gamma > > {}; @@ -1205,12 +1291,15 @@ namespace deck { icgaussian< tag::dirichlet >, icjointgaussian< tag::dirichlet >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::dirichlet, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::dirichlet, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::dirichlet, tag::kappa > >, @@ -1241,21 +1330,31 @@ namespace deck { ctr::CoeffPolicy, tag::mixdirichlet, tag::coeffpolicy >, + tk::grm::policy< use, + use< kw::normalization >, + ctr::Normalization, + tag::mixdirichlet, + tag::normalization >, icdelta< tag::mixdirichlet >, icbeta< tag::mixdirichlet >, icgamma< tag::mixdirichlet >, + icdirichlet< tag::mixdirichlet >, icgaussian< tag::mixdirichlet >, icjointgaussian< tag::mixdirichlet >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::mixdirichlet, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::mixdirichlet, tag::S >, sde_parameter_vector< kw::sde_kappaprime, + tk::grm::check_vector, tag::mixdirichlet, tag::kappaprime >, sde_parameter_vector< kw::sde_rho, + tk::grm::check_vector, tag::mixdirichlet, tag::rho > >, @@ -1293,15 +1392,19 @@ namespace deck { icgaussian< tag::gendir >, icjointgaussian< tag::gendir >, sde_parameter_vector< kw::sde_b, + tk::grm::check_vector, tag::gendir, tag::b >, sde_parameter_vector< kw::sde_S, + tk::grm::check_vector, tag::gendir, tag::S >, sde_parameter_vector< kw::sde_kappa, + tk::grm::check_vector, tag::gendir, tag::kappa >, sde_parameter_vector< kw::sde_c, + tk::grm::check_vector, tag::gendir, tag::c > >, check_errors< tag::gendir > > {}; @@ -1337,6 +1440,7 @@ namespace deck { icgaussian< tag::wrightfisher >, icjointgaussian< tag::wrightfisher >, sde_parameter_vector< kw::sde_omega, + tk::grm::check_vector, tag::wrightfisher, tag::omega > >, check_errors< tag::wrightfisher > > {}; diff --git a/src/Control/Walker/InputDeck/InputDeck.hpp b/src/Control/Walker/InputDeck/InputDeck.hpp index 479ecfcfcd7..0a19beb4e60 100644 --- a/src/Control/Walker/InputDeck/InputDeck.hpp +++ b/src/Control/Walker/InputDeck/InputDeck.hpp @@ -20,7 +20,7 @@ #include "NoWarning/set.hpp" #include "QuinoaConfig.hpp" -#include "Control.hpp" +#include "TaggedTuple.hpp" #include "HelpFactory.hpp" #include "Walker/CmdLine/CmdLine.hpp" #include "Walker/Components.hpp" @@ -28,195 +28,204 @@ namespace walker { namespace ctr { +//! Member data for tagged tuple +using InputDeckMembers = brigand::list< + tag::title, kw::title::info::expect::type + , tag::selected, selects + , tag::discr, discretization + , tag::prec, precision + , tag::flformat, floatformat + , tag::component, ncomps + , tag::interval, intervals + , tag::cmd, CmdLine + , tag::param, parameters + , tag::stat, std::vector< tk::ctr::Product > + , tag::pdf, std::vector< tk::ctr::Probability > + , tag::error, std::vector< std::string > +>; + //! InputDeck : Control< specialized to Walker >, see Types.h -class InputDeck : - public tk::Control< // tag type - tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::discr, discretization, - tag::prec, precision, - tag::flformat, floatformat, - tag::component, ncomps, - tag::interval, intervals, - tag::cmd, CmdLine, - tag::param, parameters, - tag::stat, std::vector< tk::ctr::Product >, - tag::pdf, std::vector< tk::ctr::Probability >, - tag::error, std::vector< std::string > > { +class InputDeck : public tk::TaggedTuple< InputDeckMembers > { public: //! \brief Walker input deck keywords //! \see See also tk::grm::use using keywords = brigand::set< kw::precision - , kw::end - , kw::depvar - , kw::title - , kw::statistics - , kw::interval - , kw::pdfs - , kw::filetype - , kw::pdf_policy - , kw::pdf_centering - , kw::txt_float_format - , kw::npar - , kw::nstep - , kw::term - , kw::dt - , kw::ttyi - , kw::rngs - , kw::ncomp - , kw::rng - , kw::walker - , kw::init - , kw::coeff - , kw::diag_ou - , kw::ornstein_uhlenbeck - , kw::skewnormal - , kw::gamma - , kw::dirichlet - , kw::mixdirichlet - , kw::gendir - , kw::wrightfisher - , kw::beta - , kw::sde_sigmasq - , kw::sde_theta - , kw::sde_mu - , kw::sde_mean - , kw::sde_cov - , kw::mean_gradient - , kw::sde_T - , kw::sde_lambda - , kw::sde_b - , kw::sde_S - , kw::sde_c - , kw::sde_kappa - , kw::sde_omega - , kw::cja - , kw::cja_accurate - #ifdef HAS_RNGSSE2 - , kw::rngsse_gm19 - , kw::rngsse_gm29 - , kw::rngsse_gm31 - , kw::rngsse_gm55 - , kw::rngsse_gm61 - , kw::rngsse_gq581 - , kw::rngsse_gq583 - , kw::rngsse_gq584 - , kw::rngsse_mt19937 - , kw::rngsse_lfsr113 - , kw::rngsse_mrg32k3a - , kw::seqlen - #endif - , kw::r123_threefry - , kw::r123_philox - , kw::const_shear - , kw::stationary - , kw::position - , kw::velocity - , kw::instantaneous_velocity - , kw::seed - #ifdef HAS_MKL - , kw::mkl_mcg31 - , kw::mkl_r250 - , kw::mkl_mrg32k3a - , kw::mkl_mcg59 - , kw::mkl_wh - , kw::mkl_mt19937 - , kw::mkl_mt2203 - , kw::mkl_sfmt19937 - , kw::mkl_sobol - , kw::mkl_niederr - , kw::mkl_nondeterm - , kw::uniform_method - , kw::gaussian_method - , kw::gaussianmv_method - , kw::beta_method - , kw::standard - , kw::accurate - , kw::boxmuller - , kw::boxmuller2 - , kw::icdf - #endif - , kw::constcoeff - , kw::decay - , kw::raw - , kw::zero - , kw::elem - , kw::node - , kw::txt - , kw::gmshtxt - , kw::gmshbin - , kw::exodusii - , kw::overwrite - , kw::multiple - , kw::evolution - , kw::txt_float_default - , kw::txt_float_fixed - , kw::txt_float_scientific - , kw::numfracbeta - , kw::sde_rho2 - , kw::sde_rho - , kw::sde_rcomma - , kw::icdelta - , kw::spike - , kw::sde_bprime - , kw::sde_kappaprime - , kw::mixnumfracbeta - , kw::mixmassfracbeta - , kw::massfracbeta - , kw::sde_r - , kw::homogeneous - , kw::homdecay - , kw::montecarlo_homdecay - , kw::hydrotimescale - , kw::jointbeta - , kw::jointdelta - , kw::jointgaussian - , kw::jointcorrgaussian - , kw::icbeta - , kw::betapdf - , kw::sde_c0 - , kw::icgaussian - , kw::icjointgaussian - , kw::gaussian - , kw::dissipation - , kw::jointgamma - , kw::hydrotimescales - , kw::hydroproductions - , kw::eq_A005H - , kw::eq_A005S - , kw::eq_A005L - , kw::eq_A05H - , kw::eq_A05S - , kw::eq_A05L - , kw::eq_A075H - , kw::eq_A075S - , kw::eq_A075L - , kw::prod_A005H - , kw::prod_A005S - , kw::prod_A005L - , kw::prod_A05H - , kw::prod_A05S - , kw::prod_A05L - , kw::prod_A075H - , kw::prod_A075S - , kw::prod_A075L - , kw::gnorm - , kw::gnorm_accurate - , kw::gamma_method - , kw::icgamma - , kw::gammapdf - , kw::sde_c3 - , kw::sde_c4 - , kw::sde_com1 - , kw::sde_com2 - , kw::fullvar - , kw::fluctuation - , kw::solve - , kw::variant - , kw::slm - , kw::glm - >; + , kw::end + , kw::depvar + , kw::title + , kw::statistics + , kw::interval + , kw::pdfs + , kw::filetype + , kw::pdf_policy + , kw::pdf_centering + , kw::txt_float_format + , kw::npar + , kw::nstep + , kw::term + , kw::dt + , kw::ttyi + , kw::rngs + , kw::ncomp + , kw::rng + , kw::walker + , kw::init + , kw::coeff + , kw::diag_ou + , kw::ornstein_uhlenbeck + , kw::skewnormal + , kw::gamma + , kw::dirichlet + , kw::mixdirichlet + , kw::gendir + , kw::wrightfisher + , kw::beta + , kw::sde_sigmasq + , kw::sde_theta + , kw::sde_mu + , kw::sde_mean + , kw::sde_cov + , kw::mean_gradient + , kw::sde_T + , kw::sde_lambda + , kw::sde_b + , kw::sde_S + , kw::sde_c + , kw::sde_kappa + , kw::sde_omega + , kw::cja + , kw::cja_accurate + #ifdef HAS_RNGSSE2 + , kw::rngsse_gm19 + , kw::rngsse_gm29 + , kw::rngsse_gm31 + , kw::rngsse_gm55 + , kw::rngsse_gm61 + , kw::rngsse_gq581 + , kw::rngsse_gq583 + , kw::rngsse_gq584 + , kw::rngsse_mt19937 + , kw::rngsse_lfsr113 + , kw::rngsse_mrg32k3a + , kw::seqlen + #endif + , kw::r123_threefry + , kw::r123_philox + , kw::const_shear + , kw::stationary + , kw::position + , kw::velocity + , kw::inst_velocity + , kw::seed + #ifdef HAS_MKL + , kw::mkl_mcg31 + , kw::mkl_r250 + , kw::mkl_mrg32k3a + , kw::mkl_mcg59 + , kw::mkl_wh + , kw::mkl_mt19937 + , kw::mkl_mt2203 + , kw::mkl_sfmt19937 + , kw::mkl_sobol + , kw::mkl_niederr + , kw::mkl_nondeterm + , kw::uniform_method + , kw::gaussian_method + , kw::gaussianmv_method + , kw::beta_method + , kw::standard + , kw::accurate + , kw::boxmuller + , kw::boxmuller2 + , kw::icdf + #endif + , kw::constcoeff + , kw::decay + , kw::raw + , kw::zero + , kw::elem + , kw::node + , kw::txt + , kw::gmshtxt + , kw::gmshbin + , kw::exodusii + , kw::overwrite + , kw::multiple + , kw::evolution + , kw::txt_float_default + , kw::txt_float_fixed + , kw::txt_float_scientific + , kw::numfracbeta + , kw::sde_rho2 + , kw::sde_rho + , kw::sde_rcomma + , kw::icdelta + , kw::spike + , kw::sde_bprime + , kw::sde_kappaprime + , kw::mixnumfracbeta + , kw::mixmassfracbeta + , kw::massfracbeta + , kw::sde_r + , kw::homogeneous + , kw::homdecay + , kw::montecarlo_homdecay + , kw::hydrotimescale + , kw::jointbeta + , kw::jointdelta + , kw::jointgaussian + , kw::jointcorrgaussian + , kw::jointdirichlet + , kw::icbeta + , kw::betapdf + , kw::dirichletpdf + , kw::sde_c0 + , kw::icgaussian + , kw::icjointgaussian + , kw::icdirichlet + , kw::gaussian + , kw::dissipation + , kw::jointgamma + , kw::hydrotimescales + , kw::hydroproductions + , kw::eq_A005H + , kw::eq_A005S + , kw::eq_A005L + , kw::eq_A05H + , kw::eq_A05S + , kw::eq_A05L + , kw::eq_A075H + , kw::eq_A075S + , kw::eq_A075L + , kw::prod_A005H + , kw::prod_A005S + , kw::prod_A005L + , kw::prod_A05H + , kw::prod_A05S + , kw::prod_A05L + , kw::prod_A075H + , kw::prod_A075S + , kw::prod_A075L + , kw::gnorm + , kw::gnorm_accurate + , kw::gamma_method + , kw::icgamma + , kw::gammapdf + , kw::sde_c3 + , kw::sde_c4 + , kw::sde_com1 + , kw::sde_com2 + , kw::fullvar + , kw::fluctuation + , kw::solve + , kw::variant + , kw::slm + , kw::glm + , kw::normalization + , kw::light + , kw::heavy + >; //! \brief Constructor: set all defaults //! \param[in] cl Previously parsed and store command line @@ -224,22 +233,22 @@ class InputDeck : //! default constructor for the corresponding type. explicit InputDeck( const CmdLine& cl = {} ) { // Set previously parsed command line - set< tag::cmd >( cl ); + get< tag::cmd >() = cl; // Default discretization parameters - set< tag::discr, tag::npar >( 1 ); - set< tag::discr, tag::nstep > - ( std::numeric_limits< kw::nstep::info::expect::type >::max() ); - set< tag::discr, tag::term >( 1.0 ); - set< tag::discr, tag::dt >( 0.5 ); + get< tag::discr, tag::npar >() = 1; + get< tag::discr, tag::nstep >() = + std::numeric_limits< kw::nstep::info::expect::type >::max(); + get< tag::discr, tag::term >() = 1.0; + get< tag::discr, tag::dt >() = 0.5; // Default txt floating-point output precision in digits - set< tag::prec, tag::stat >( std::cout.precision() ); - set< tag::prec, tag::pdf >( std::cout.precision() ); + get< tag::prec, tag::stat >() = std::cout.precision(); + get< tag::prec, tag::pdf >() = std::cout.precision(); // Default intervals - set< tag::interval, tag::tty >( 1 ); - set< tag::interval, tag::stat >( 1 ); - set< tag::interval, tag::pdf >( 1 ); + get< tag::interval, tag::tty >() = 1; + get< tag::interval, tag::stat >() = 1; + get< tag::interval, tag::pdf >() = 1; // Default requested statistics - set< tag::stat >( std::vector< tk::ctr::Product >() ); + get< tag::stat >() = std::vector< tk::ctr::Product >(); // Initialize help const auto& ctrinfoFill = tk::ctr::Info( get< tag::cmd, tag::ctrinfo >() ); brigand::for_each< keywords >( ctrinfoFill ); @@ -269,22 +278,16 @@ class InputDeck : //! \return True if there are any PDFs to estimate bool pdf() { return !get< tag::pdf >().empty(); } - //! Pack/Unpack - void pup( PUP::er& p ) { - tk::Control< tag::title, kw::title::info::expect::type, - tag::selected, selects, - tag::discr, discretization, - tag::prec, precision, - tag::flformat, floatformat, - tag::component, ncomps, - tag::interval, intervals, - tag::cmd, CmdLine, - tag::param, parameters, - tag::stat, std::vector< tk::ctr::Product >, - tag::pdf, std::vector< tk::ctr::Probability >, - tag::error, std::vector< std::string > >::pup(p); - } - friend void operator|( PUP::er& p, InputDeck& c ) { c.pup(p); } + /** @name Pack/Unpack: Serialize InputDeck object for Charm++ */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + void pup( PUP::er& p ) { tk::TaggedTuple< InputDeckMembers >::pup(p); } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] i InputDeck object reference + friend void operator|( PUP::er& p, InputDeck& i ) { i.pup(p); } + //@} }; } // ctr:: diff --git a/src/Control/Walker/Options/CoeffPolicy.hpp b/src/Control/Walker/Options/CoeffPolicy.hpp index f81a21b5f13..bf406346312 100644 --- a/src/Control/Walker/Options/CoeffPolicy.hpp +++ b/src/Control/Walker/Options/CoeffPolicy.hpp @@ -50,7 +50,7 @@ class CoeffPolicy : public tk::Toggle< CoeffPolicyType > { , kw::hydrotimescale , kw::const_shear , kw::stationary - , kw::instantaneous_velocity + , kw::inst_velocity >; //! \brief Options constructor @@ -71,7 +71,7 @@ class CoeffPolicy : public tk::Toggle< CoeffPolicyType > { { CoeffPolicyType::CONST_SHEAR, kw::const_shear::name() }, { CoeffPolicyType::STATIONARY, kw::stationary::name() }, { CoeffPolicyType::INSTANTANEOUS_VELOCITY, - kw::instantaneous_velocity::name() } }, + kw::inst_velocity::name() } }, //! keywords -> Enums { { kw::constcoeff::string(), CoeffPolicyType::CONST_COEFF }, { kw::decay::string(), CoeffPolicyType::DECAY }, @@ -82,7 +82,7 @@ class CoeffPolicy : public tk::Toggle< CoeffPolicyType > { { kw::hydrotimescale::string(), CoeffPolicyType::HYDROTIMESCALE }, { kw::const_shear::string(), CoeffPolicyType::CONST_SHEAR }, { kw::stationary::string(), CoeffPolicyType::STATIONARY }, - { kw::instantaneous_velocity::string(), + { kw::inst_velocity::string(), CoeffPolicyType::INSTANTANEOUS_VELOCITY } } ) { brigand::for_each< keywords >( assertPolicyCodes() ); @@ -106,7 +106,7 @@ class CoeffPolicy : public tk::Toggle< CoeffPolicyType > { //! \brief Function call operator templated on the type to assert the //! existence of a policy code template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); } }; @@ -123,7 +123,7 @@ class CoeffPolicy : public tk::Toggle< CoeffPolicyType > { , { CoeffPolicyType::CONST_SHEAR, *kw::const_shear::code() } , { CoeffPolicyType::STATIONARY, *kw::stationary::code() } , { CoeffPolicyType::INSTANTANEOUS_VELOCITY, - *kw::instantaneous_velocity::code() } + *kw::inst_velocity::code() } }; }; diff --git a/src/Control/Walker/Options/Depvar.hpp b/src/Control/Walker/Options/Depvar.hpp index 3b13864e39e..4ba00d4ab19 100644 --- a/src/Control/Walker/Options/Depvar.hpp +++ b/src/Control/Walker/Options/Depvar.hpp @@ -43,7 +43,7 @@ class Depvar : public tk::Toggle< DepvarType > { explicit Depvar() : tk::Toggle< DepvarType >( //! Group, i.e., options, name - "Solver for", + "Solve for", //! Enums -> names { { DepvarType::FULLVAR, kw::fullvar::name() }, { DepvarType::FLUCTUATION, kw::fluctuation::name() } }, diff --git a/src/Control/Walker/Options/DiffEq.hpp b/src/Control/Walker/Options/DiffEq.hpp index b093c4dee1e..3e9ebf3fc08 100644 --- a/src/Control/Walker/Options/DiffEq.hpp +++ b/src/Control/Walker/Options/DiffEq.hpp @@ -47,9 +47,11 @@ inline void operator|( PUP::er& p, DiffEqType& e ) { PUP::pup( p, e ); } //! Differential equation key used to access a diff eq in a factory using DiffEqKey = - tk::tuple::tagged_tuple< tag::diffeq, DiffEqType, - tag::initpolicy, ctr::InitPolicyType, - tag::coeffpolicy, ctr::CoeffPolicyType >; + tk::TaggedTuple< brigand::list< + tag::diffeq, DiffEqType + , tag::initpolicy, ctr::InitPolicyType + , tag::coeffpolicy, ctr::CoeffPolicyType +> >; //! Class with base templated on the above enum class with associations class DiffEq : public tk::Toggle< DiffEqType > { diff --git a/src/Control/Walker/Options/InitPolicy.hpp b/src/Control/Walker/Options/InitPolicy.hpp index e9a6f4333d6..a4828cb205d 100644 --- a/src/Control/Walker/Options/InitPolicy.hpp +++ b/src/Control/Walker/Options/InitPolicy.hpp @@ -29,7 +29,8 @@ enum class InitPolicyType : uint8_t { RAW=0, JOINTGAUSSIAN, JOINTCORRGAUSSIAN, JOINTBETA, - JOINTGAMMA }; + JOINTGAMMA, + JOINTDIRICHLET }; //! Pack/Unpack InitPolicyType: forward overload to generic enum class packer inline void operator|( PUP::er& p, InitPolicyType& e ) { PUP::pup( p, e ); } @@ -46,6 +47,7 @@ class InitPolicy : public tk::Toggle< InitPolicyType > { , kw::jointcorrgaussian , kw::jointbeta , kw::jointgamma + , kw::jointdirichlet >; //! \brief Options constructor @@ -62,7 +64,8 @@ class InitPolicy : public tk::Toggle< InitPolicyType > { { InitPolicyType::JOINTGAUSSIAN, kw::jointgaussian::name() }, { InitPolicyType::JOINTCORRGAUSSIAN, kw::jointcorrgaussian::name() }, { InitPolicyType::JOINTBETA, kw::jointbeta::name() }, - { InitPolicyType::JOINTGAMMA, kw::jointgamma::name() } }, + { InitPolicyType::JOINTGAMMA, kw::jointgamma::name() }, + { InitPolicyType::JOINTDIRICHLET, kw::jointdirichlet::name() } }, //! keywords -> Enums { { kw::raw::string(), InitPolicyType::RAW }, { kw::zero::string(), InitPolicyType::ZERO }, @@ -71,7 +74,8 @@ class InitPolicy : public tk::Toggle< InitPolicyType > { { kw::jointcorrgaussian::string(), InitPolicyType::JOINTCORRGAUSSIAN }, { kw::jointbeta::string(), InitPolicyType::JOINTBETA }, - { kw::jointgamma::string(), InitPolicyType::JOINTGAMMA } } ) + { kw::jointgamma::string(), InitPolicyType::JOINTGAMMA }, + { kw::jointdirichlet::string(), InitPolicyType::JOINTDIRICHLET } } ) { brigand::for_each< keywords >( assertPolicyCodes() ); } @@ -94,7 +98,7 @@ class InitPolicy : public tk::Toggle< InitPolicyType > { //! \brief Function call operator templated on the type to assert the //! existence of a policy code template< typename U > void operator()( brigand::type_ ) { - static_assert( tk::HasTypedefCode< typename U::info >::value, + static_assert( tk::HasTypedef_code_v< typename U::info >, "Policy code undefined for keyword" ); } }; @@ -108,6 +112,7 @@ class InitPolicy : public tk::Toggle< InitPolicyType > { , { InitPolicyType::JOINTCORRGAUSSIAN, *kw::jointcorrgaussian::code() } , { InitPolicyType::JOINTBETA, *kw::jointbeta::code() } , { InitPolicyType::JOINTGAMMA, *kw::jointgamma::code() } + , { InitPolicyType::JOINTDIRICHLET, *kw::jointdirichlet::code() } }; }; diff --git a/src/Control/Walker/Options/Normalization.hpp b/src/Control/Walker/Options/Normalization.hpp new file mode 100644 index 00000000000..e85490a4fbd --- /dev/null +++ b/src/Control/Walker/Options/Normalization.hpp @@ -0,0 +1,61 @@ +// ***************************************************************************** +/*! + \file src/Control/Walker/Options/Normalization.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Normalization variants (used for MixDirichlet) + \details Normalization variants (used for MixDirichlet). +*/ +// ***************************************************************************** +#ifndef NormalizationOptions_h +#define NormalizationOptions_h + +#include + +#include "Toggle.hpp" +#include "Keywords.hpp" +#include "PUPUtil.hpp" + +namespace walker { +namespace ctr { + +//! Normalization types +enum class NormalizationType : uint8_t { LIGHT=0 + , HEAVY }; + +//! \brief Pack/Unpack NormalizationType: forward overload to generic enum +//! class packer +inline void operator|( PUP::er& p, NormalizationType& e ) +{ PUP::pup( p, e ); } + +//! Normalization variants: outsource to base templated on enum type +class Normalization : public tk::Toggle< NormalizationType > { + + public: + //! Valid expected choices to make them also available at compile-time + using keywords = brigand::list< kw::light + , kw::heavy + >; + + //! \brief Options constructor + //! \details Simply initialize in-line and pass associations to base, which + //! will handle client interactions + explicit Normalization() : + tk::Toggle< NormalizationType >( + //! Group, i.e., options, name + "Normalization", + //! Enums -> names + { { NormalizationType::LIGHT, kw::light::name() }, + { NormalizationType::HEAVY, kw::heavy::name() } }, + //! keywords -> Enums + { { kw::light::string(), NormalizationType::LIGHT }, + { kw::heavy::string(), NormalizationType::HEAVY } } ) + {} +}; + +} // ctr:: +} // walker:: + +#endif // NormalizationOptions_h diff --git a/src/Control/Walker/Types.hpp b/src/Control/Walker/Types.hpp index 24581033e2a..027fcc6eb05 100644 --- a/src/Control/Walker/Types.hpp +++ b/src/Control/Walker/Types.hpp @@ -29,6 +29,7 @@ #include "Options/TxtFloatFormat.hpp" #include "Options/Depvar.hpp" #include "Options/VelocityVariant.hpp" +#include "Options/Normalization.hpp" #include "Options/RNG.hpp" #include "QuinoaConfig.hpp" @@ -36,553 +37,369 @@ namespace walker { namespace ctr { //! Storage of selected options -using selects = tk::tuple::tagged_tuple< - tag::diffeq, std::vector< ctr::DiffEqType >, //!< Differential eqs - tag::rng, std::vector< tk::ctr::RNGType >, //!< RNGs - tag::filetype, tk::ctr::PDFFileType, //!< PDF output file type - tag::pdfpolicy, tk::ctr::PDFPolicyType, //!< PDF output file policy - tag::pdfctr, tk::ctr::PDFCenteringType //!< PDF output file centering ->; +using selects = tk::TaggedTuple< brigand::list< + tag::diffeq, std::vector< ctr::DiffEqType > //!< Differential eqs + , tag::rng, std::vector< tk::ctr::RNGType > //!< RNGs + , tag::filetype, tk::ctr::PDFFileType //!< PDF output file type + , tag::pdfpolicy, tk::ctr::PDFPolicyType //!< PDF output file policy + , tag::pdfctr, tk::ctr::PDFCenteringType //!< PDF output file centering +> >; //! Discretization parameters storage -using discretization = tk::tuple::tagged_tuple< - tag::npar, kw::npar::info::expect::type, //!< Total number of particles - tag::nstep, kw::nstep::info::expect::type, //!< Number of time steps - tag::term, kw::term::info::expect::type, //!< Termination time - tag::dt, kw::dt::info::expect::type, //!< Size of time step - tag::binsize, std::vector< std::vector< tk::real > >, //!< PDF binsizes - tag::extent, std::vector< std::vector< tk::real > > //!< PDF extents ->; +using discretization = tk::TaggedTuple< brigand::list< + tag::npar, kw::npar::info::expect::type //!< Total number of particles + , tag::nstep, kw::nstep::info::expect::type //!< Number of time steps + , tag::term, kw::term::info::expect::type //!< Termination time + , tag::dt, kw::dt::info::expect::type //!< Size of time step + , tag::binsize, std::vector< std::vector< tk::real > > //!< PDF binsizes + , tag::extent, std::vector< std::vector< tk::real > > //!< PDF extents +> >; //! ASCII output floating-point precision in digits -using precision = tk::tuple::tagged_tuple< - tag::stat, kw::precision::info::expect::type, //!< Statistics output precision - tag::pdf, kw::precision::info::expect::type //!< PDF output precision ->; +using precision = tk::TaggedTuple< brigand::list< + tag::stat, kw::precision::info::expect::type//!< Statistics output precision + , tag::pdf, kw::precision::info::expect::type //!< PDF output precision +> >; //! ASCII output floating-point format -using floatformat = tk::tuple::tagged_tuple< - tag::stat, tk::ctr::TxtFloatFormatType, //!< Statistics output format - tag::pdf, tk::ctr::TxtFloatFormatType //!< PDF output format ->; +using floatformat = tk::TaggedTuple< brigand::list< + tag::stat, tk::ctr::TxtFloatFormatType //!< Statistics output format + , tag::pdf, tk::ctr::TxtFloatFormatType //!< PDF output format +> >; //! Output intervals storage -using intervals = tk::tuple::tagged_tuple< - tag::tty, kw::ttyi::info::expect::type, //!< TTY output interval - tag::stat, kw::interval::info::expect::type, //!< Statistics output interval - tag::pdf, kw::interval::info::expect::type //!< PDF output interval ->; +using intervals = tk::TaggedTuple< brigand::list< + tag::tty, kw::ttyi::info::expect::type //!< TTY output interval + , tag::stat, kw::interval::info::expect::type //!< Statistics output interval + , tag::pdf, kw::interval::info::expect::type //!< PDF output interval +> >; //! IO parameters storage -using ios = tk::tuple::tagged_tuple< - tag::control, kw::control::info::expect::type, //!< Control filename - tag::input, std::string, //!< Input filename - tag::output, std::string, //!< Output filename - tag::pdf, kw::pdf::info::expect::type, //!< PDF filename - tag::stat, kw::stat::info::expect::type, //!< Statistics filename - tag::pdfnames, std::vector< std::string > //!< PDF identifiers ->; +using ios = tk::TaggedTuple< brigand::list< + tag::control, kw::control::info::expect::type //!< Control filename + , tag::input, std::string //!< Input filename + , tag::output, std::string //!< Output filename + , tag::pdf, kw::pdf::info::expect::type //!< PDF filename + , tag::stat, kw::stat::info::expect::type //!< Statistics filename + , tag::pdfnames, std::vector< std::string > //!< PDF identifiers +> >; -//! Dirichlet parameters storage -using DirichletParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +//! Data for initialization (SDE initial conditions) +using Init = tk::TaggedTuple< brigand::list< + tag::spike, std::vector< std::vector< std::vector < + kw::spike::info::expect::type > > > + , tag::betapdf, std::vector< std::vector< std::vector < + kw::betapdf::info::expect::type > > > + , tag::gamma, std::vector< std::vector< std::vector < + kw::gammapdf::info::expect::type > > > + , tag::dirichlet, std::vector< std::vector< + kw::dirichletpdf::info::expect::type > > + , tag::gaussian, std::vector< std::vector< std::vector < + kw::gaussian::info::expect::type > > > + , tag::mean, std::vector< std::vector< + kw::sde_mu::info::expect::type > > + , tag::cov, std::vector< std::vector< + kw::sde_cov::info::expect::type > > + , tag::jointgaussian, std::vector< std::vector< std::vector < + kw::gaussian::info::expect::type > > > +> >; //! Dirichlet parameters storage -using MixDirichletParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::kappaprime, std::vector< std::vector< - kw::sde_kappaprime::info::expect::type > >, - tag::rho, std::vector< std::vector< - kw::sde_rho::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using DirichletParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; + +//! Mixture Dirichlet parameters storage +using MixDirichletParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::kappaprime, std::vector< std::vector< + kw::sde_kappaprime::info::expect::type > > + , tag::rho, std::vector< std::vector< + kw::sde_rho::info::expect::type > > + , tag::normalization, std::vector< ctr::NormalizationType > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Generalized Dirichlet parameters storage -using GenDirichletParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::c, std::vector< std::vector< - kw::sde_c::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using GenDirichletParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::c, std::vector< std::vector< + kw::sde_c::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Wright-Fisher parameters storage -using WrightFisherParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::omega, std::vector< std::vector< - kw::sde_omega::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using WrightFisherParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::omega, std::vector< std::vector< + kw::sde_omega::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Ornstein-Uhlenbeck parameters storage -using OrnsteinUhlenbeckParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::sigmasq, std::vector< std::vector< - kw::sde_sigmasq::info::expect::type > >, - tag::theta, std::vector< std::vector< - kw::sde_theta::info::expect::type > >, - tag::mu, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using OrnsteinUhlenbeckParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::sigmasq, std::vector< std::vector< + kw::sde_sigmasq::info::expect::type > > + , tag::theta, std::vector< std::vector< + kw::sde_theta::info::expect::type > > + , tag::mu, std::vector< std::vector< + kw::sde_mu::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Diagonal Ornstein-Uhlenbeck parameters storage -using DiagOrnsteinUhlenbeckParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::sigmasq, std::vector< std::vector< - kw::sde_sigmasq::info::expect::type > >, - tag::theta, std::vector< std::vector< - kw::sde_theta::info::expect::type > >, - tag::mu, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using DiagOrnsteinUhlenbeckParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::sigmasq, std::vector< std::vector< + kw::sde_sigmasq::info::expect::type > > + , tag::theta, std::vector< std::vector< + kw::sde_theta::info::expect::type > > + , tag::mu, std::vector< std::vector< + kw::sde_mu::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Skew-normal parameters storage -using SkewNormalParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::timescale, std::vector< std::vector< - kw::sde_T::info::expect::type > >, - tag::sigmasq, std::vector< std::vector< - kw::sde_sigmasq::info::expect::type > >, - tag::lambda, std::vector< std::vector< - kw::sde_lambda::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using SkewNormalParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::timescale, std::vector< std::vector< + kw::sde_T::info::expect::type > > + , tag::sigmasq, std::vector< std::vector< + kw::sde_sigmasq::info::expect::type > > + , tag::lambda, std::vector< std::vector< + kw::sde_lambda::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Gamma parameters storage -using GammaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using GammaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Beta parameters storage -using BetaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using BetaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Number-fraction beta parameters storage -using NumberFractionBetaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::rho2, std::vector< std::vector< - kw::sde_rho2::info::expect::type > >, - tag::rcomma, std::vector< std::vector< - kw::sde_rcomma::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using NumberFractionBetaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::rho2, std::vector< std::vector< + kw::sde_rho2::info::expect::type > > + , tag::rcomma, std::vector< std::vector< + kw::sde_rcomma::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Mass-fraction beta parameters storage -using MassFractionBetaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::b, std::vector< std::vector< - kw::sde_b::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappa, std::vector< std::vector< - kw::sde_kappa::info::expect::type > >, - tag::rho2, std::vector< std::vector< - kw::sde_rho2::info::expect::type > >, - tag::r, std::vector< std::vector< - kw::sde_rcomma::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using MassFractionBetaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::b, std::vector< std::vector< + kw::sde_b::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappa, std::vector< std::vector< + kw::sde_kappa::info::expect::type > > + , tag::rho2, std::vector< std::vector< + kw::sde_rho2::info::expect::type > > + , tag::r, std::vector< std::vector< + kw::sde_rcomma::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Mix number-fraction beta parameters storage -using MixNumberFractionBetaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::bprime, std::vector< std::vector< - kw::sde_bprime::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappaprime, std::vector< std::vector< - kw::sde_kappaprime::info::expect::type > >, - tag::rho2, std::vector< std::vector< - kw::sde_rho2::info::expect::type > >, - tag::rcomma, std::vector< std::vector< - kw::sde_rcomma::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > ->; +using MixNumberFractionBetaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::bprime, std::vector< std::vector< + kw::sde_bprime::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappaprime, std::vector< std::vector< + kw::sde_kappaprime::info::expect::type > > + , tag::rho2, std::vector< std::vector< + kw::sde_rho2::info::expect::type > > + , tag::rcomma, std::vector< std::vector< + kw::sde_rcomma::info::expect::type > > + , tag::init, Init + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > +> >; //! Mix mass-fraction beta parameters storage -using MixMassFractionBetaParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::bprime, std::vector< std::vector< - kw::sde_bprime::info::expect::type > >, - tag::S, std::vector< std::vector< - kw::sde_S::info::expect::type > >, - tag::kappaprime, std::vector< std::vector< - kw::sde_kappaprime::info::expect::type > >, - tag::rho2, std::vector< std::vector< - kw::sde_rho2::info::expect::type > >, - tag::r, std::vector< std::vector< - kw::sde_r::info::expect::type > >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean_gradient, std::vector< std::vector< - kw::mean_gradient::info::expect::type > >, - tag::hydrotimescales, std::vector< std::vector< ctr::HydroTimeScalesType > >, - tag::hydroproductions,std::vector< std::vector< ctr::HydroProductionsType > >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType >, - tag::dissipation, std::vector< char >, - tag::dissipation_id, std::vector< std::size_t >, - tag::velocity, std::vector< char >, - tag::velocity_id, std::vector< std::size_t > ->; +using MixMassFractionBetaParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::bprime, std::vector< std::vector< + kw::sde_bprime::info::expect::type > > + , tag::S, std::vector< std::vector< + kw::sde_S::info::expect::type > > + , tag::kappaprime, std::vector< std::vector< + kw::sde_kappaprime::info::expect::type > > + , tag::rho2, std::vector< std::vector< + kw::sde_rho2::info::expect::type > > + , tag::r, std::vector< std::vector< + kw::sde_r::info::expect::type > > + , tag::init, Init + , tag::mean_gradient, std::vector< std::vector< + kw::mean_gradient::info::expect::type > > + , tag::hydrotimescales, std::vector< std::vector< + ctr::HydroTimeScalesType > > + , tag::hydroproductions, std::vector< std::vector< + ctr::HydroProductionsType > > + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > + , tag::solve, std::vector< ctr::DepvarType > + , tag::dissipation, std::vector< char > + , tag::dissipation_id,std::vector< std::size_t > + , tag::velocity, std::vector< char > + , tag::velocity_id, std::vector< std::size_t > +> >; //! Velocity parameters storage -using VelocityParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::c0, std::vector< kw::sde_c0::info::expect::type >, - tag::position, std::vector< char >, - tag::position_id, std::vector< std::size_t >, - tag::dissipation, std::vector< char >, - tag::dissipation_id, std::vector< std::size_t >, - tag::mixmassfracbeta, std::vector< char >, - tag::mixmassfracbeta_id, std::vector< std::size_t >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType >, - tag::solve, std::vector< ctr::DepvarType >, - tag::variant, std::vector< ctr::VelocityVariantType >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::hydrotimescales, std::vector< std::vector< ctr::HydroTimeScalesType > >, - tag::hydroproductions,std::vector< std::vector< ctr::HydroProductionsType > > ->; +using VelocityParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::c0, std::vector< kw::sde_c0::info::expect::type > + , tag::position, std::vector< char > + , tag::position_id, std::vector< std::size_t > + , tag::dissipation, std::vector< char > + , tag::dissipation_id,std::vector< std::size_t > + , tag::mixmassfracbeta, std::vector< char > + , tag::mixmassfracbeta_id, std::vector< std::size_t > + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > + , tag::solve, std::vector< ctr::DepvarType > + , tag::variant, std::vector< ctr::VelocityVariantType > + , tag::init, Init + , tag::hydrotimescales, std::vector< std::vector< ctr::HydroTimeScalesType > > + , tag::hydroproductions,std::vector< std::vector< ctr::HydroProductionsType > > +> >; //! Position parameters storage -using PositionParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::velocity, std::vector< char >, - tag::velocity_id, std::vector< std::size_t >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType >, - tag::solve, std::vector< ctr::DepvarType >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > > ->; +using PositionParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::velocity, std::vector< char > + , tag::velocity_id, std::vector< std::size_t > + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > + , tag::solve, std::vector< ctr::DepvarType > + , tag::init, Init +> >; //! Dissipation parameters storage -using DissipationParameters = tk::tuple::tagged_tuple< - tag::depvar, std::vector< char >, - tag::velocity, std::vector< char >, - tag::velocity_id, std::vector< std::size_t >, - tag::c3, std::vector< kw::sde_c3::info::expect::type >, - tag::c4, std::vector< kw::sde_c4::info::expect::type >, - tag::com1, std::vector< kw::sde_com1::info::expect::type >, - tag::com2, std::vector< kw::sde_com2::info::expect::type >, - tag::rng, std::vector< tk::ctr::RNGType >, - tag::initpolicy, std::vector< ctr::InitPolicyType >, - tag::coeffpolicy, std::vector< ctr::CoeffPolicyType >, - tag::spike, std::vector< std::vector< std::vector < - kw::spike::info::expect::type > > >, - tag::betapdf, std::vector< std::vector< std::vector < - kw::betapdf::info::expect::type > > >, - tag::gamma, std::vector< std::vector< std::vector < - kw::gammapdf::info::expect::type > > >, - tag::gaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > >, - tag::mean, std::vector< std::vector< - kw::sde_mu::info::expect::type > >, - tag::cov, std::vector< std::vector< - kw::sde_cov::info::expect::type > >, - tag::jointgaussian, std::vector< std::vector< std::vector < - kw::gaussian::info::expect::type > > > ->; +using DissipationParameters = tk::TaggedTuple< brigand::list< + tag::depvar, std::vector< char > + , tag::velocity, std::vector< char > + , tag::velocity_id, std::vector< std::size_t > + , tag::c3, std::vector< kw::sde_c3::info::expect::type > + , tag::c4, std::vector< kw::sde_c4::info::expect::type > + , tag::com1, std::vector< kw::sde_com1::info::expect::type > + , tag::com2, std::vector< kw::sde_com2::info::expect::type > + , tag::rng, std::vector< tk::ctr::RNGType > + , tag::initpolicy, std::vector< ctr::InitPolicyType > + , tag::coeffpolicy, std::vector< ctr::CoeffPolicyType > + , tag::init, Init +> >; //! Parameters storage -using parameters = tk::tuple::tagged_tuple< +using parameters = tk::TaggedTuple< brigand::list< #ifdef HAS_MKL - tag::rngmkl, tk::ctr::RNGMKLParameters, + tag::rngmkl, tk::ctr::RNGMKLParameters, #endif - tag::rngsse, tk::ctr::RNGSSEParameters, - tag::rng123, tk::ctr::RNGRandom123Parameters, - tag::dirichlet, DirichletParameters, - tag::mixdirichlet, MixDirichletParameters, - tag::gendir, GenDirichletParameters, - tag::wrightfisher, WrightFisherParameters, - tag::ou, OrnsteinUhlenbeckParameters, - tag::diagou, DiagOrnsteinUhlenbeckParameters, - tag::skewnormal, SkewNormalParameters, - tag::gamma, GammaParameters, - tag::beta, BetaParameters, - tag::numfracbeta, NumberFractionBetaParameters, - tag::massfracbeta, MassFractionBetaParameters, - tag::mixnumfracbeta, MixNumberFractionBetaParameters, - tag::mixmassfracbeta, MixMassFractionBetaParameters, - tag::velocity, VelocityParameters, - tag::position, PositionParameters, - tag::dissipation, DissipationParameters ->; + tag::rngsse, tk::ctr::RNGSSEParameters + , tag::rng123, tk::ctr::RNGRandom123Parameters + , tag::dirichlet, DirichletParameters + , tag::mixdirichlet, MixDirichletParameters + , tag::gendir, GenDirichletParameters + , tag::wrightfisher, WrightFisherParameters + , tag::ou, OrnsteinUhlenbeckParameters + , tag::diagou, DiagOrnsteinUhlenbeckParameters + , tag::skewnormal, SkewNormalParameters + , tag::gamma, GammaParameters + , tag::beta, BetaParameters + , tag::numfracbeta, NumberFractionBetaParameters + , tag::massfracbeta, MassFractionBetaParameters + , tag::mixnumfracbeta, MixNumberFractionBetaParameters + , tag::mixmassfracbeta, MixMassFractionBetaParameters + , tag::velocity, VelocityParameters + , tag::position, PositionParameters + , tag::dissipation, DissipationParameters +> >; } // ctr:: } // walker:: diff --git a/src/DiffEq/Beta/Beta.hpp b/src/DiffEq/Beta/Beta.hpp index 72b62dc2023..f427594ca6e 100644 --- a/src/DiffEq/Beta/Beta.hpp +++ b/src/DiffEq/Beta/Beta.hpp @@ -64,7 +64,7 @@ template< class Init, class Coefficients > class Beta { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Beta/BetaCoeffPolicy.cpp b/src/DiffEq/Beta/BetaCoeffPolicy.cpp index 8f95ff27228..1005dba1cbd 100644 --- a/src/DiffEq/Beta/BetaCoeffPolicy.cpp +++ b/src/DiffEq/Beta/BetaCoeffPolicy.cpp @@ -17,7 +17,7 @@ using walker::BetaCoeffConst; BetaCoeffConst::BetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Beta/BetaCoeffPolicy.hpp b/src/DiffEq/Beta/BetaCoeffPolicy.hpp index b61fed2b061..8500da899d0 100644 --- a/src/DiffEq/Beta/BetaCoeffPolicy.hpp +++ b/src/DiffEq/Beta/BetaCoeffPolicy.hpp @@ -15,7 +15,7 @@ coefficients, b, S, and kappa. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -61,7 +61,7 @@ class BetaCoeffConst { public: //! Constructor: initialize coefficients BetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Beta/CMakeLists.txt b/src/DiffEq/Beta/CMakeLists.txt index 1ff865801d9..ee0b9c935ec 100644 --- a/src/DiffEq/Beta/CMakeLists.txt +++ b/src/DiffEq/Beta/CMakeLists.txt @@ -14,6 +14,7 @@ add_library(Beta target_include_directories(Beta PUBLIC ${QUINOA_SOURCE_DIR} ${QUINOA_SOURCE_DIR}/Base + ${QUINOA_SOURCE_DIR}/IO ${QUINOA_SOURCE_DIR}/RNG ${QUINOA_SOURCE_DIR}/Control ${QUINOA_SOURCE_DIR}/Statistics diff --git a/src/DiffEq/Beta/ConfigureBeta.cpp b/src/DiffEq/Beta/ConfigureBeta.cpp index 9a445007103..80719af111f 100644 --- a/src/DiffEq/Beta/ConfigureBeta.cpp +++ b/src/DiffEq/Beta/ConfigureBeta.cpp @@ -47,7 +47,7 @@ registerBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the beta SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -86,9 +86,9 @@ infoBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) parameters( g_inputdeck.get< tag::param, tag::beta, tag::kappa >().at(c) ) ); spikes( nfo, - g_inputdeck.get< tag::param, tag::beta, tag::spike >().at(c) ); + g_inputdeck.get< tag::param, tag::beta, tag::init, tag::spike >().at(c) ); betapdfs( nfo, - g_inputdeck.get< tag::param, tag::beta, tag::betapdf >().at(c) ); + g_inputdeck.get< tag::param, tag::beta, tag::init, tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Beta/ConfigureBeta.hpp b/src/DiffEq/Beta/ConfigureBeta.hpp index 63ffd21aaed..4e8082e9804 100644 --- a/src/DiffEq/Beta/ConfigureBeta.hpp +++ b/src/DiffEq/Beta/ConfigureBeta.hpp @@ -24,7 +24,7 @@ void registerBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the beta SDE std::vector< std::pair< std::string, std::string > > -infoBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Beta/ConfigureMassFractionBeta.cpp b/src/DiffEq/Beta/ConfigureMassFractionBeta.cpp index f1397a89296..91656b55755 100644 --- a/src/DiffEq/Beta/ConfigureMassFractionBeta.cpp +++ b/src/DiffEq/Beta/ConfigureMassFractionBeta.cpp @@ -47,7 +47,7 @@ registerMassFractionBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the mass fraction beta SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -97,12 +97,10 @@ infoMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) "coeff r [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::massfracbeta, tag::r >().at(c) ) ); - spikes( - nfo, - g_inputdeck.get< tag::param, tag::massfracbeta, tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::massfracbeta, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::massfracbeta, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::massfracbeta, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Beta/ConfigureMassFractionBeta.hpp b/src/DiffEq/Beta/ConfigureMassFractionBeta.hpp index 4710bf16d90..97faaec7a01 100644 --- a/src/DiffEq/Beta/ConfigureMassFractionBeta.hpp +++ b/src/DiffEq/Beta/ConfigureMassFractionBeta.hpp @@ -28,7 +28,7 @@ void registerMassFractionBeta( DiffEqFactory& f, //! Return information on the beta SDE std::vector< std::pair< std::string, std::string > > -infoMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Beta/ConfigureMixMassFractionBeta.cpp b/src/DiffEq/Beta/ConfigureMixMassFractionBeta.cpp index 64287501f4d..1f2b3f682fe 100644 --- a/src/DiffEq/Beta/ConfigureMixMassFractionBeta.cpp +++ b/src/DiffEq/Beta/ConfigureMixMassFractionBeta.cpp @@ -52,7 +52,7 @@ registerMixMassFractionBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoMixMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoMixMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the mix mass fraction beta SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -134,8 +134,10 @@ infoMixMassFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) parameters( g_inputdeck.get< tag::param, eq, tag::r >().at(c) ) ); - spikes( nfo, g_inputdeck.get< tag::param, eq, tag::spike >().at(c) ); - betapdfs( nfo, g_inputdeck.get< tag::param, eq, tag::betapdf >().at(c) ); + spikes( nfo, + g_inputdeck.get< tag::param, eq, tag::init, tag::spike >().at(c) ); + betapdfs( nfo, + g_inputdeck.get< tag::param, eq, tag::init, tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Beta/ConfigureMixMassFractionBeta.hpp b/src/DiffEq/Beta/ConfigureMixMassFractionBeta.hpp index 7b399debb52..dd4b13af6dc 100644 --- a/src/DiffEq/Beta/ConfigureMixMassFractionBeta.hpp +++ b/src/DiffEq/Beta/ConfigureMixMassFractionBeta.hpp @@ -31,7 +31,7 @@ void registerMixMassFractionBeta( DiffEqFactory& f, //! Return information on the beta SDE std::vector< std::pair< std::string, std::string > > infoMixMassFractionBeta( std::map< ctr::DiffEqType, - tk::ctr::ncomp_type >& cnt ); + tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.cpp b/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.cpp index 32c20069046..492957ec6cc 100644 --- a/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.cpp +++ b/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.cpp @@ -50,7 +50,7 @@ registerMixNumberFractionBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t } std::vector< std::pair< std::string, std::string > > -infoMixNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoMixNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the mix number fraction beta SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -107,11 +107,10 @@ infoMixNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt parameters( g_inputdeck.get< tag::param, tag::mixnumfracbeta, tag::rcomma >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::mixnumfracbeta, tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::mixnumfracbeta, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::mixnumfracbeta, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::mixnumfracbeta, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.hpp b/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.hpp index b2b0ca696c0..f28f0f182d1 100644 --- a/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.hpp +++ b/src/DiffEq/Beta/ConfigureMixNumberFractionBeta.hpp @@ -31,7 +31,7 @@ void registerMixNumberFractionBeta( DiffEqFactory& f, //! Return information on the beta SDE std::vector< std::pair< std::string, std::string > > infoMixNumberFractionBeta( std::map< ctr::DiffEqType, - tk::ctr::ncomp_type >& cnt ); + tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Beta/ConfigureNumberFractionBeta.cpp b/src/DiffEq/Beta/ConfigureNumberFractionBeta.cpp index f1cabc67efc..7e6e8cf4fca 100644 --- a/src/DiffEq/Beta/ConfigureNumberFractionBeta.cpp +++ b/src/DiffEq/Beta/ConfigureNumberFractionBeta.cpp @@ -48,7 +48,7 @@ registerNumberFractionBeta( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the number fraction beta SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -99,11 +99,10 @@ infoNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) "coeff rcomma [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::numfracbeta, tag::rcomma >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::numfracbeta, tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::numfracbeta, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::numfracbeta, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::numfracbeta, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Beta/ConfigureNumberFractionBeta.hpp b/src/DiffEq/Beta/ConfigureNumberFractionBeta.hpp index 50815aafee1..b26b7b63962 100644 --- a/src/DiffEq/Beta/ConfigureNumberFractionBeta.hpp +++ b/src/DiffEq/Beta/ConfigureNumberFractionBeta.hpp @@ -28,7 +28,7 @@ void registerNumberFractionBeta( DiffEqFactory& f, //! Return information on the beta SDE std::vector< std::pair< std::string, std::string > > -infoNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoNumberFractionBeta( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Beta/MassFractionBeta.hpp b/src/DiffEq/Beta/MassFractionBeta.hpp index 55c0406dff5..c079f30b1bf 100644 --- a/src/DiffEq/Beta/MassFractionBeta.hpp +++ b/src/DiffEq/Beta/MassFractionBeta.hpp @@ -87,7 +87,7 @@ template< class Init, class Coefficients > class MassFractionBeta { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.cpp b/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.cpp index 7737da28845..0d32a899b94 100644 --- a/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.cpp +++ b/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.cpp @@ -18,7 +18,7 @@ using walker::MassFractionBetaCoeffConst; MassFractionBetaCoeffConst::MassFractionBetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.hpp b/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.hpp index 3a2242d6993..3dcdc087aa0 100644 --- a/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.hpp +++ b/src/DiffEq/Beta/MassFractionBetaCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, b, S, kappa, rho2, and r. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -66,7 +66,7 @@ class MassFractionBetaCoeffConst { public: //! Constructor: initialize coefficients MassFractionBetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Beta/MixMassFractionBeta.hpp b/src/DiffEq/Beta/MixMassFractionBeta.hpp index 61a56821d94..bf85f27b01f 100644 --- a/src/DiffEq/Beta/MixMassFractionBeta.hpp +++ b/src/DiffEq/Beta/MixMassFractionBeta.hpp @@ -107,7 +107,7 @@ template< class Init, class Coefficients > class MixMassFractionBeta { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::mixmassfracbeta; public: @@ -123,9 +123,9 @@ class MixMassFractionBeta { // divide by the number of derived variables computed, see derived() m_ncomp( g_inputdeck.get< tag::component >().get< eq >().at(c) / 4 ), m_offset( g_inputdeck.get< tag::component >().offset< eq >(c) ), - m_grad( initScalarGradient() ), m_rng( g_rng.at( tk::ctr::raw( g_inputdeck.get< tag::param, eq, tag::rng >().at(c) ) ) ), + m_solve( g_inputdeck.get< tag::param, eq, tag::solve >().at(c) ), m_velocity_coupled( coupled< eq, tag::velocity >( c ) ), m_velocity_depvar( depvar< eq, tag::velocity >( c ) ), m_velocity_offset( offset< eq, tag::velocity, tag::velocity_id >( c ) ), @@ -138,6 +138,7 @@ class MixMassFractionBeta { m_dissipation_depvar( depvar< eq, tag::dissipation >( c ) ), m_dissipation_offset( offset< eq, tag::dissipation, tag::dissipation_id >( c ) ), + m_dY( initScalarGradient() ), m_bprime(), m_S(), m_kprime(), @@ -154,6 +155,8 @@ class MixMassFractionBeta { g_inputdeck.get< tag::param, eq, tag::r >().at(c), m_bprime, m_S, m_kprime, m_rho2, m_r, m_b, m_k ) { + // Zero prescribed scalar gradient if full variable is solved for + if (m_solve == ctr::DepvarType::FULLVAR) m_dY.fill( 0.0 ); // Populate inverse hydrodynamics time scales and hydrodyanmics // production/dissipation extracted from DNS if ( Coefficients::type() == ctr::CoeffPolicyType::HYDROTIMESCALE ) { @@ -207,8 +210,9 @@ class MixMassFractionBeta { { // Update SDE coefficients coeff.update( m_depvar, m_dissipation_depvar, m_velocity_depvar, - m_velocity_solve, m_ncomp, moments, m_bprime, m_kprime, - m_rho2, m_r, m_hts, m_hp, m_b, m_k, m_S, t ); + m_velocity_solve, m_solve, m_ncomp, moments, m_bprime, + m_kprime, m_rho2, m_r, m_hts, m_hp, m_b, m_k, m_S, t ); + // Advance particles const auto npar = particles.nunk(); for (auto p=decltype(npar){0}; p 0.0 ? std::sqrt(d) : 0.0); Y += 0.5*m_b[i]*(m_S[i] - Y)*dt + d*dW[i] - - m_grad[0]*u - m_grad[1]*v - m_grad[2]*w; + - (m_dY[0]*u - m_dY[1]*v - m_dY[2]*w)*dt; // Compute instantaneous values derived from updated Y derived( particles, p, i ); } @@ -242,8 +246,8 @@ class MixMassFractionBeta { const char m_depvar; //!< Dependent variable const ncomp_t m_ncomp; //!< Number of components const ncomp_t m_offset; //!< Offset SDE operates from - const std::vector< tk::real > m_grad; //! Prescribed mean scalar gradient const tk::RNG& m_rng; //!< Random number generator + const ctr::DepvarType m_solve; //!< Depndent variable to solve for const bool m_velocity_coupled; //!< True if coupled to velocity const char m_velocity_depvar; //!< Coupled velocity dependent variable @@ -255,6 +259,8 @@ class MixMassFractionBeta { const char m_dissipation_depvar; //!< Depvar of coupled dissipation eq const ncomp_t m_dissipation_offset; //!< Offset of coupled dissipation eq + std::array m_dY; //! Prescribed mean scalar gradient + //! Coefficients std::vector< kw::sde_bprime::info::expect::type > m_bprime; std::vector< kw::sde_S::info::expect::type > m_S; @@ -311,16 +317,15 @@ class MixMassFractionBeta { } //! Initialize imposed mean scalar gradient from user input - std::vector< tk::real > initScalarGradient() const { + std::array< tk::real, 3 > initScalarGradient() { const auto& mg = g_inputdeck.get< tag::param, eq, tag::mean_gradient >(); - std::vector< tk::real > mean_gradient; - if (mg.size() > m_c) - mean_gradient = mg[ m_c ]; - else - mean_gradient = {{ 0.0, 0.0, 0.0 }}; - Assert( mean_gradient.size() == 3, - "Mean scalar gradient vector size must be 3" ); - return mean_gradient; + std::array< tk::real, 3 > dY{{ 0.0, 0.0, 0.0 }}; + if (mg.size() > m_c) { + const auto& g = mg[ m_c ]; + dY = {{ g[0], g[1], g[2] }}; + } + Assert( dY.size() == 3, "Mean scalar gradient vector size must be 3" ); + return dY; } }; diff --git a/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.cpp b/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.cpp index 740a8125dc5..66698810d4f 100644 --- a/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.cpp +++ b/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file src/DiffEq/Beta/MixMassFracBetaCoeffPolicy.cpp + \file src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. @@ -16,6 +16,14 @@ #include #include "MixMassFractionBetaCoeffPolicy.hpp" +#include "TxtStatWriter.hpp" +#include "Walker/InputDeck/InputDeck.hpp" + +namespace walker { + +extern ctr::InputDeck g_inputdeck; + +} // ::walker walker::MixMassFracBetaCoeffDecay::MixMassFracBetaCoeffDecay( ncomp_t ncomp, @@ -75,6 +83,7 @@ walker::MixMassFracBetaCoeffDecay::update( char, char, ctr::DepvarType, + ctr::DepvarType /*scalar_solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -172,6 +181,7 @@ walker::MixMassFracBetaCoeffHomDecay::update( char, char, ctr::DepvarType, + ctr::DepvarType /*scalar_solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -310,6 +320,7 @@ walker::MixMassFracBetaCoeffMonteCarloHomDecay::update( char, char, ctr::DepvarType, + ctr::DepvarType /*scalar_solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -442,6 +453,17 @@ MixMassFracBetaCoeffHydroTimeScale( b.resize( bprime.size() ); k.resize( kprime.size() ); + + // Extra output besides normal statistics output + m_extra_out_filename = "coeff"; + tk::TxtStatWriter sw( m_extra_out_filename ); + std::vector< std::string > names; + for (ncomp_t c=0; c& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -471,9 +494,12 @@ walker::MixMassFracBetaCoeffHydroTimeScale::update( //! \param[in] kprime Coefficient vector kappa' //! \param[in] rho2 Coefficient vector rho2 //! \param[in] r Coefficient vector r +//! \param[in] hts (Inverse) hydrodynamics time scale (as input from DNS) +//! \param[in] hp Production/dissipation (as input from DNS) //! \param[in,out] b Coefficient vector to be updated //! \param[in,out] k Coefficient vector to be updated //! \param[in,out] S Coefficient vector to be updated +//! \param[in] t Physical time at which to update coefficients //! \details This where the mix mass-fraction beta SDE is made consistent //! with the no-mix and fully mixed limits by specifying the SDE //! coefficients, b and kappa as functions of b' and kappa'. Additionally, @@ -485,11 +511,20 @@ walker::MixMassFracBetaCoeffHydroTimeScale::update( using tk::ctr::mean; using tk::ctr::variance; using tk::ctr::cen3; + using tk::ctr::Product; if (m_it == 0) for (ncomp_t c=0; c(), + g_inputdeck.get< tag::prec, tag::stat >(), + std::ios_base::app ); + + std::vector< tk::real > coeffs( ncomp * 3 ); + // statistics nomenclature: // Y = instantaneous mass fraction, // R = instantaneous density, @@ -542,6 +577,11 @@ walker::MixMassFracBetaCoeffHydroTimeScale::update( (beta10 + beta2*Thetap*f2 + beta3*Thetap*(1.0-Thetap)*f2); b[c] = beta1 * ts; k[c] = kprime[c] * beta1 * ts * ds * ds; + //b[c] = bprime[c]; + //k[c] = kprime[c]; + //b[c] = bprime[c] + 0.25*std::sin(10.0*t); + //k[c] = 1.0 + 0.25*std::sin(10.0*t); + //k[c] = -(1.0 + std::sin(t)) * (S[c] - 1.0); tk::real R = 1.0 + d2/d/d; tk::real B = -1.0/r[c]/r[c]; @@ -553,8 +593,28 @@ walker::MixMassFracBetaCoeffHydroTimeScale::update( D*d*d*d*(1.0 + 3.0*d2/d/d + d3/d/d/d)/rho2[c]/rho2[c]/rho2[c]; S[c] = (rho2[c]/d/R + 2.0*k[c]/b[c]*rho2[c]*rho2[c]/d/d*r[c]*r[c]/R*diff - 1.0) / r[c]; + //S[c] = 0.5 + 0.25*std::sin(10.0*t); + + // Implementation of a constraint for MixDirichlet for S_al to keep + // d/dt = 0 to verify its behavior for beta (binary case). As input + // file use mixmassfractbeta_mmS_A0.75.q. + // auto R2 = lookup( Product({dens,dens}), moments ); // + // auto R2Yc = lookup( Product({dens,dens,Y}), moments ); // + // auto R3Yc = lookup( Product({dens,dens,dens,Y}), moments ); // + // auto R3Y2c = lookup( Product({dens,dens,dens,Y,Y}), moments ); // + // tk::real drYc = -r[c]/rho2[c]*R2; + // tk::real drYcYc = -r[c]/rho2[c]*R2Yc; + // tk::real drYc2YcYN = 2.0*std::pow(r[c]/rho2[c],2.0)*(R3Yc-R3Y2c); + // S[c] = (drYcYc - k[c]/b[c]*drYc2YcYN) / drYc; + + coeffs[ 3*c+0 ] = b[c]; + coeffs[ 3*c+1 ] = S[c]; + coeffs[ 3*c+2 ] = k[c]; } + // Extra "stat" output of coefficients + sw.stat( 0, t, coeffs, {}, {} ); + ++m_it; } @@ -616,12 +676,13 @@ walker::MixMassFracBetaCoeffInstVel::update( char dissipation_depvar, char /*velocity_depvar*/, ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType solve, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& /*bprime*/, const std::vector< kw::sde_kappaprime::info::expect::type >& kprime, - const std::vector< kw::sde_rho2::info::expect::type >& rho2, - const std::vector< kw::sde_r::info::expect::type >& r, + const std::vector< kw::sde_rho2::info::expect::type >& /*rho2*/, + const std::vector< kw::sde_r::info::expect::type >& /*r*/, const std::vector< tk::Table >&, const std::vector< tk::Table >&, std::vector< kw::sde_b::info::expect::type >& b, @@ -631,9 +692,11 @@ walker::MixMassFracBetaCoeffInstVel::update( // ***************************************************************************** // Update coefficients //! \param[in] depvar Dependent variable +//! \param[in] dissipation_depvar Dependent variable of coupled dissipation eq +//! \param[in] solve Enum selecting whether the full variable or its +//! fluctuation is solved for //! \param[in] ncomp Number of scalar components in this SDE system //! \param[in] moments Map of statistical moments estimated -//! \param[in] bprime Coefficient vector b' //! \param[in] kprime Coefficient vector kappa' //! \param[in] rho2 Coefficient vector rho2 //! \param[in] r Coefficient vector r @@ -653,78 +716,49 @@ walker::MixMassFracBetaCoeffInstVel::update( using tk::ctr::variance; using tk::ctr::cen3; - if (m_it == 0) - for (ncomp_t c=0; c, mass fraction fluctuation about its mean, - // r = R - , density fluctuation about its mean, - // = mean mass fraction, - // = mean density, for (ncomp_t c=0; c(std::toupper(depvar)), - // c, - // tk::ctr::Moment::ORDINARY ); - // const tk::ctr::Term dens( static_cast(std::toupper(depvar)), - // c+ncomp, - // tk::ctr::Moment::ORDINARY ); - const tk::ctr::Term s1( static_cast(std::tolower(depvar)), - c+ncomp, - tk::ctr::Moment::CENTRAL ); - const tk::ctr::Term s2( static_cast(std::tolower(depvar)), - c+ncomp*2, - tk::ctr::Moment::CENTRAL ); + tk::real y2 = 0.0; + tk::real ts = 1.0; - //const auto RY = tk::ctr::Product( { dens, Y } ); - //tk::real ry = lookup( RY, moments ); // - const auto dscorr = tk::ctr::Product( { s1, s2 } ); - tk::real ds = -lookup( dscorr, moments ); // b = - - tk::real d = lookup( mean(depvar,c+ncomp), moments ); // - tk::real d2 = lookup( variance(depvar,c+ncomp), moments ); // - tk::real d3 = lookup( cen3(depvar,c+ncomp), moments ); // - //tk::real yt = ry/d; - - // Compute turbulent kinetic energy - // auto K = tke( velocity_depvar, velocity_solve, moments ); - // Access mean turbulence frequency from coupled dissipation model - // hydroptimescale: eps/k = - tk::real ts = lookup( mean(dissipation_depvar,0), moments ); - - //auto pe = 1.0; // hydroproductions: P/eps = 1.0 (equilibrium) - - // tk::real a = r[c]/(1.0+r[c]*yt); - // tk::real bnm = a*a*yt*(1.0-yt); - // tk::real thetab = 1.0 - ds/bnm; - // tk::real f2 = - // 1.0 / std::pow(1.0 + std::pow(pe-1.0,2.0)*std::pow(ds,0.25),0.5); - // tk::real b1 = m_s[0]; - // tk::real b2 = m_s[1]; - // tk::real b3 = m_s[2]; - // tk::real eta = d2/d/d/ds; - // tk::real beta2 = b2*(1.0+eta*ds); - // tk::real Thetap = thetab*0.5*(1.0+eta/(1.0+eta*ds)); - // tk::real beta3 = b3*(1.0+eta*ds); - // tk::real beta10 = b1 * (1.0+ds)/(1.0+eta*ds); - tk::real beta1 = 2.0;//bprime[c] * 2.0/(1.0+eta+eta*ds) * - //(beta10 + beta2*Thetap*f2 + beta3*Thetap*(1.0-Thetap)*f2); + if (solve == ctr::DepvarType::FULLVAR) { + + y2 = lookup( variance(depvar,c), moments ); // + + // Access mean turbulence frequency from coupled dissipation model + // hydroptimescale: eps/k = + if (dissipation_depvar != '-') { // only if dissipation is coupled + ts = lookup( mean(dissipation_depvar,0), moments ); + } + + } else if (solve == ctr::DepvarType::FLUCTUATION) { + + // Since we are solving for the fluctuating scalar, the "ordinary" + // moments are really central moments + auto d = static_cast< char >( std::toupper( depvar ) ); + tk::ctr::Term y( d, c, tk::ctr::Moment::ORDINARY ); + y2 = lookup( tk::ctr::Product( {y,y} ), moments ); // + + // Access mean turbulence frequency from coupled dissipation model + // hydroptimescale: eps/k = + if (dissipation_depvar != '-') { // only if dissipation is coupled + ts = lookup( mean(dissipation_depvar,0), moments ); + } + + } else Throw( "Depvar type not implemented" ); + + tk::real beta1 = 2.0; b[c] = beta1 * ts; - k[c] = kprime[c] * beta1 * ts * ds * ds; + k[c] = kprime[c] * beta1 * ts * y2; - tk::real R = 1.0 + d2/d/d; - tk::real B = -1.0/r[c]/r[c]; - tk::real C = (2.0+r[c])/r[c]/r[c]; - tk::real D = -(1.0+r[c])/r[c]/r[c]; - tk::real diff = - B*d/rho2[c] + - C*d*d*R/rho2[c]/rho2[c] + - D*d*d*d*(1.0 + 3.0*d2/d/d + d3/d/d/d)/rho2[c]/rho2[c]/rho2[c]; - S[c] = (rho2[c]/d/R + - 2.0*k[c]/b[c]*rho2[c]*rho2[c]/d/d*r[c]*r[c]/R*diff - 1.0) / r[c]; - } + S[c] = 0.5; + } ++m_it; } diff --git a/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.hpp b/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.hpp index d3b31af840c..6cdc92936a9 100644 --- a/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.hpp +++ b/src/DiffEq/Beta/MixMassFractionBetaCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, b, S, kappa, rho2, and r. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_bprime::info::expect::type >& bprime_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappaprime::info::expect::type >& kprime_, @@ -58,6 +58,7 @@ char dissipation_depvar, char velocity_depvar, ctr::DepvarType velocity_solve, + ctr::DepvarType solve, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -71,11 +72,17 @@ std::vector< kw::sde_S::info::expect::type >& S ) const {} \endcode where _depvar_ is the dependent variable associated with the mix - mass-fraction beta SDE, specified in the control file by the user, _ncomp_ - is the number of components in the system, _moments_ is the map - associating moment IDs (tk::ctr::vector< tk::ctr::Term >) to values of - statistical moments, _bprime_, _kprime_, rho2, r, are user-defined - parameters, and _b_, _k_, _S_, are the SDE parameters computed, see + mass-fraction beta SDE, specified in the control file by the user, + _dissipation_depvar_ is a character labeling the coupled dissipation + equation, _velocity_depvar_ is an is a character labeling the coupled + velocity equation, _velocity_solve_ is an enum selecting whether the + coupled velocity equation solves for full variable or its fluctuation, + _solve_ is an enum selecting whether the mixmassfracbeta (scalar) equation + solves for full variable or its fluctuation, _ncomp_ is the number of + components in the system, _moments_ is the map associating moment IDs + (tk::ctr::vector< tk::ctr::Term >) to values of statistical moments, + _bprime_, _kprime_, rho2, r, are user-defined parameters, and _b_, _k_, + _S_, are the SDE parameters computed, see DiffEq/Beta/MixMassFractionBeta.h. The constant reference to hts, denotes a vector of y=f(x) functions (see @@ -145,7 +152,8 @@ class MixMassFracBetaCoeffDecay { char depvar, char, char, - ctr::DepvarType, + ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType /*solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -194,7 +202,8 @@ class MixMassFracBetaCoeffHomDecay { char depvar, char, char, - ctr::DepvarType, + ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType /*solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -247,7 +256,8 @@ class MixMassFracBetaCoeffMonteCarloHomDecay { char depvar, char, char, - ctr::DepvarType, + ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType /*solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -295,17 +305,13 @@ class MixMassFracBetaCoeffHydroTimeScale { static ctr::CoeffPolicyType type() noexcept { return ctr::CoeffPolicyType::HYDROTIMESCALE; } - //! \brief Update coefficients b', kappa', and S - //! \details This where the mix mass-fraction beta SDE is made consistent - //! with the no-mix and fully mixed limits by specifying the SDE - //! coefficients, b and kappa as functions of b' and kappa'. Additionally, - //! we pull in a hydrodynamic timescale from an external function. We also - //! specify S to force d\/dt = 0, where \ = rho_2/(1+rY). + //! Update coefficients b', kappa', and S void update( char depvar, char, char, - ctr::DepvarType, + ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType /*solve*/, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& bprime, @@ -335,6 +341,7 @@ class MixMassFracBetaCoeffHydroTimeScale { mutable std::size_t m_it = 0; mutable std::vector< tk::real > m_s; + mutable std::string m_extra_out_filename; }; //! \brief Mix mass-fraction beta SDE coefficients policy coupled to velocity @@ -372,6 +379,7 @@ class MixMassFracBetaCoeffInstVel { char dissipation_depvar, char /*velocity_depvar*/, ctr::DepvarType /*velocity_solve*/, + ctr::DepvarType solve, ncomp_t ncomp, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_bprime::info::expect::type >& /*bprime*/, diff --git a/src/DiffEq/Beta/MixNumberFractionBeta.hpp b/src/DiffEq/Beta/MixNumberFractionBeta.hpp index e708d09315c..ef912715867 100644 --- a/src/DiffEq/Beta/MixNumberFractionBeta.hpp +++ b/src/DiffEq/Beta/MixNumberFractionBeta.hpp @@ -102,7 +102,7 @@ template< class Init, class Coefficients > class MixNumberFractionBeta { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Beta/MixNumberFractionBetaCoeffPolicy.hpp b/src/DiffEq/Beta/MixNumberFractionBetaCoeffPolicy.hpp index 3f5d6c0abed..f39e85d54e4 100644 --- a/src/DiffEq/Beta/MixNumberFractionBetaCoeffPolicy.hpp +++ b/src/DiffEq/Beta/MixNumberFractionBetaCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, b, S, kappa, rho2, and rcomma. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_bprime::info::expect::type >& bprime_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappaprime::info::expect::type >& kprime_, diff --git a/src/DiffEq/Beta/NumberFractionBeta.hpp b/src/DiffEq/Beta/NumberFractionBeta.hpp index bc9a5acc4ff..1afce76c00a 100644 --- a/src/DiffEq/Beta/NumberFractionBeta.hpp +++ b/src/DiffEq/Beta/NumberFractionBeta.hpp @@ -75,7 +75,7 @@ template< class Init, class Coefficients > class NumberFractionBeta { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.cpp b/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.cpp index 6251d905a57..380b22fe730 100644 --- a/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.cpp +++ b/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.cpp @@ -16,7 +16,7 @@ #include "NumberFractionBetaCoeffPolicy.hpp" walker::NumFracBetaCoeffConst::NumFracBetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.hpp b/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.hpp index cf81aad1856..e71813e7f5c 100644 --- a/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.hpp +++ b/src/DiffEq/Beta/NumberFractionBetaCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, b, S, kappa, rho2, and rcomma. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -67,7 +67,7 @@ class NumFracBetaCoeffConst { public: //! Constructor: initialize coefficients NumFracBetaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/DiffEq.hpp b/src/DiffEq/DiffEq.hpp index fb774016933..dbd923331a3 100644 --- a/src/DiffEq/DiffEq.hpp +++ b/src/DiffEq/DiffEq.hpp @@ -19,9 +19,9 @@ #include #include +#include #include "Types.hpp" -#include "Make_unique.hpp" #include "Particles.hpp" #include "Statistics.hpp" @@ -38,12 +38,15 @@ namespace walker { class DiffEq { public: + //! Default constructor taking no arguments for Charm++ + explicit DiffEq() = default; + //! \brief Constructor taking an object modeling Concept. //! \details The object of class T comes pre-constructed. //! \param[in] x Instantiated object of type T given by the template //! argument. template< typename T > explicit DiffEq( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ) {} + self( std::make_unique< Model >( std::move(x) ) ) {} //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept. @@ -65,7 +68,7 @@ class DiffEq { //! \param[in] args Zero or more constructor arguments template< typename T, typename...Args > explicit DiffEq( std::function x, Args&&... args ) : - self( tk::make_unique< Model >( + self( std::make_unique< Model >( std::move( x( std::forward(args)... ) ) ) ) {} //! Public interface to setting the initial conditions for the diff eq diff --git a/src/DiffEq/DiffEqFactory.hpp b/src/DiffEq/DiffEqFactory.hpp index 7615862c2ee..4626fca1cd1 100644 --- a/src/DiffEq/DiffEqFactory.hpp +++ b/src/DiffEq/DiffEqFactory.hpp @@ -25,7 +25,7 @@ namespace walker { //! Differential equation factory: keys associated to their constructors using DiffEqFactory = std::map< ctr::DiffEqKey, - std::function< DiffEq(const tk::ctr::ncomp_type&) > >; + std::function< DiffEq(const tk::ctr::ncomp_t&) > >; //! \brief Function object for registering a differential equation into the //! differential equation factory @@ -54,11 +54,11 @@ struct registerDiffEq { // Get coefficients policy: last type of brigand::list U using CoeffPolicy = typename brigand::back< U >; // Build differential equation key - ctr::DiffEqKey key{ type, InitPolicy::type(), CoeffPolicy::type() }; + ctr::DiffEqKey key{{ type, InitPolicy::type(), CoeffPolicy::type() }}; // Register equation (with policies given by brigand::list U) into // factory tk::recordModelLate< DiffEq, Eq< InitPolicy, CoeffPolicy > > - ( factory, key, static_cast(0) ); + ( factory, key, static_cast(0) ); } }; diff --git a/src/DiffEq/DiffEqStack.hpp b/src/DiffEq/DiffEqStack.hpp index 3c3d17da06f..426c10a1c4f 100644 --- a/src/DiffEq/DiffEqStack.hpp +++ b/src/DiffEq/DiffEqStack.hpp @@ -40,7 +40,7 @@ extern ctr::InputDeck g_inputdeck; class DiffEqStack { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! Constructor: register differential equations into factory @@ -85,9 +85,9 @@ class DiffEqStack { --c; // used to index vectors starting with 0 if ( g_inputdeck.get< tag::component, EqTag >()[c] ) { // create key and search for it - ctr::DiffEqKey key{ eq, + ctr::DiffEqKey key{{ eq, g_inputdeck.get< tag::param, EqTag, tag::initpolicy >()[c], - g_inputdeck.get< tag::param, EqTag, tag::coeffpolicy >()[c] }; + g_inputdeck.get< tag::param, EqTag, tag::coeffpolicy >()[c] }}; const auto it = m_factory.find( key ); Assert( it != end( m_factory ), "Can't find eq '" + ctr::DiffEq().name( eq ) + diff --git a/src/DiffEq/Dirichlet/ConfigureDirichlet.cpp b/src/DiffEq/Dirichlet/ConfigureDirichlet.cpp index b251459965d..6fd59052d25 100644 --- a/src/DiffEq/Dirichlet/ConfigureDirichlet.cpp +++ b/src/DiffEq/Dirichlet/ConfigureDirichlet.cpp @@ -47,7 +47,7 @@ registerDirichlet( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the Dirichlet SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -95,15 +95,14 @@ infoDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) if (init == ctr::InitPolicyType::JOINTCORRGAUSSIAN) { nfo.emplace_back( "coeff mean [" + std::to_string( ncomp ) + "]", - parameters( - g_inputdeck.get< tag::param, tag::dirichlet, tag::mean >().at(c) ) - ); + parameters( g_inputdeck.get< tag::param, tag::dirichlet, tag::init, + tag::mean >().at(c) ) ); auto n = std::to_string( ncomp ); nfo.emplace_back( "coeff cov [" + n + '(' + n + "+1)/2=" + std::to_string( ncomp*(ncomp+1)/2 ) + "]", - parameters( - g_inputdeck.get< tag::param, tag::dirichlet, tag::cov >().at(c) ) + parameters( g_inputdeck.get< tag::param, tag::dirichlet, tag::init, + tag::cov >().at(c) ) ); } diff --git a/src/DiffEq/Dirichlet/ConfigureDirichlet.hpp b/src/DiffEq/Dirichlet/ConfigureDirichlet.hpp index e5da0e572b2..8761d259fb4 100644 --- a/src/DiffEq/Dirichlet/ConfigureDirichlet.hpp +++ b/src/DiffEq/Dirichlet/ConfigureDirichlet.hpp @@ -28,7 +28,7 @@ void registerDirichlet( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the Dirichlet SDE std::vector< std::pair< std::string, std::string > > -infoDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.cpp b/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.cpp index 2bdefeeba89..993d85308e9 100644 --- a/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.cpp +++ b/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.cpp @@ -47,7 +47,7 @@ registerGenDir( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoGenDir( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoGenDir( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the generalized Dirichlet SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -88,10 +88,10 @@ infoGenDir( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) nfo.emplace_back( "coeff c [" + std::to_string( ncomp*(ncomp-1)/2 ) + "]", parameters( g_inputdeck.get< tag::param, tag::gendir, tag::c >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::gendir, tag::spike >().at(c) ); - betapdfs( nfo, - g_inputdeck.get< tag::param, tag::gendir, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::gendir, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::gendir, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.hpp b/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.hpp index edc90897e10..e49418b45e9 100644 --- a/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.hpp +++ b/src/DiffEq/Dirichlet/ConfigureGeneralizedDirichlet.hpp @@ -27,7 +27,7 @@ void registerGenDir( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the generlized Dirichlet SDE std::vector< std::pair< std::string, std::string > > -infoGenDir( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoGenDir( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Dirichlet/ConfigureMixDirichlet.cpp b/src/DiffEq/Dirichlet/ConfigureMixDirichlet.cpp index ff9fc5d5e56..86d84d5166a 100644 --- a/src/DiffEq/Dirichlet/ConfigureMixDirichlet.cpp +++ b/src/DiffEq/Dirichlet/ConfigureMixDirichlet.cpp @@ -23,6 +23,7 @@ #include "DiffEqFactory.hpp" #include "Walker/Options/DiffEq.hpp" #include "Walker/Options/InitPolicy.hpp" +#include "Walker/Options/Normalization.hpp" #include "ConfigureMixDirichlet.hpp" #include "MixDirichlet.hpp" @@ -47,7 +48,7 @@ registerMixDirichlet( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the MixDirichlet SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -77,8 +78,14 @@ infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) g_inputdeck.get< tag::param, eq, tag::coeffpolicy >()[c] ) ); nfo.emplace_back( "random number generator", tk::ctr::RNG().name( g_inputdeck.get< tag::param, eq, tag::rng >()[c] ) ); + nfo.emplace_back( "initialization policy", ctr::InitPolicy().name( + g_inputdeck.get< tag::param, eq, tag::initpolicy >()[c] ) ); + + auto norm = g_inputdeck.get< tag::param, eq, tag::normalization >()[c]; + nfo.emplace_back( "normalization", ctr::Normalization().name(norm)+"-fluid" ); - auto K = ncomp - MIXDIR_NUMDERIVED; + auto numderived = MixDirichlet::NUMDERIVED; + auto K = ncomp - numderived; auto N = K + 1; nfo.emplace_back( "coeff b [" + std::to_string(K) + "]", @@ -96,7 +103,7 @@ infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) nfo.emplace_back( "coeff rho [" + std::to_string(N) + "]", parameters( rho.at(c) ) ); nfo.emplace_back( "coeff r [" + std::to_string(K) + "]", - parameters( MixDir_r(rho[c]) ) ); + parameters( MixDir_r( rho[c], norm ) ) ); } return nfo; diff --git a/src/DiffEq/Dirichlet/ConfigureMixDirichlet.hpp b/src/DiffEq/Dirichlet/ConfigureMixDirichlet.hpp index 012988b6a12..f4d2fde79e2 100644 --- a/src/DiffEq/Dirichlet/ConfigureMixDirichlet.hpp +++ b/src/DiffEq/Dirichlet/ConfigureMixDirichlet.hpp @@ -28,7 +28,7 @@ void registerMixDirichlet( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the MixDirichlet SDE std::vector< std::pair< std::string, std::string > > -infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoMixDirichlet( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Dirichlet/Dirichlet.hpp b/src/DiffEq/Dirichlet/Dirichlet.hpp index 55dfa10a787..1cfaf44d5b2 100644 --- a/src/DiffEq/Dirichlet/Dirichlet.hpp +++ b/src/DiffEq/Dirichlet/Dirichlet.hpp @@ -71,7 +71,7 @@ template< class Init, class Coefficients > class Dirichlet { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Dirichlet/DirichletCoeffPolicy.cpp b/src/DiffEq/Dirichlet/DirichletCoeffPolicy.cpp index b6abdda81ec..f9a8c6d651d 100644 --- a/src/DiffEq/Dirichlet/DirichletCoeffPolicy.cpp +++ b/src/DiffEq/Dirichlet/DirichletCoeffPolicy.cpp @@ -18,7 +18,7 @@ using walker::DirichletCoeffConst; DirichletCoeffConst::DirichletCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Dirichlet/DirichletCoeffPolicy.hpp b/src/DiffEq/Dirichlet/DirichletCoeffPolicy.hpp index 9584cb8fdad..7878ab1a05d 100644 --- a/src/DiffEq/Dirichlet/DirichletCoeffPolicy.hpp +++ b/src/DiffEq/Dirichlet/DirichletCoeffPolicy.hpp @@ -15,7 +15,7 @@ coefficients, b, S, and kappa. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -61,7 +61,7 @@ class DirichletCoeffConst { public: //! Constructor: initialize coefficients DirichletCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Dirichlet/GeneralizedDirichlet.hpp b/src/DiffEq/Dirichlet/GeneralizedDirichlet.hpp index d133f5e4f38..10219675a18 100644 --- a/src/DiffEq/Dirichlet/GeneralizedDirichlet.hpp +++ b/src/DiffEq/Dirichlet/GeneralizedDirichlet.hpp @@ -106,7 +106,7 @@ template< class Init, class Coefficients > class GeneralizedDirichlet { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.cpp b/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.cpp index 6afb0da8a1c..832f3a15d72 100644 --- a/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.cpp +++ b/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.cpp @@ -16,7 +16,7 @@ #include "GeneralizedDirichletCoeffPolicy.hpp" walker::GeneralizedDirichletCoeffConst::GeneralizedDirichletCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.hpp b/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.hpp index 521b4634601..89c66bf0d24 100644 --- a/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.hpp +++ b/src/DiffEq/Dirichlet/GeneralizedDirichletCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, b, S, kappa, and c. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -65,7 +65,7 @@ class GeneralizedDirichletCoeffConst { public: //! Constructor: initialize coefficients GeneralizedDirichletCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Dirichlet/MixDirichlet.hpp b/src/DiffEq/Dirichlet/MixDirichlet.hpp index 0887a814799..f75400eca3d 100644 --- a/src/DiffEq/Dirichlet/MixDirichlet.hpp +++ b/src/DiffEq/Dirichlet/MixDirichlet.hpp @@ -64,9 +64,6 @@ namespace walker { extern ctr::InputDeck g_inputdeck; extern std::map< tk::ctr::RawRNGType, tk::RNG > g_rng; -//! Number of derived variables computed by the MixDirichlet SDE -const std::size_t MIXDIR_NUMDERIVED = 2; - //! \brief MixDirichlet SDE used polymorphically with DiffEq //! \details The template arguments specify policies and are used to configure //! the behavior of the class. The policies are: @@ -76,10 +73,14 @@ template< class Init, class Coefficients > class MixDirichlet { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::mixdirichlet; public: + //! Number of derived variables computed by the MixDirichlet SDE + //! \details Derived variables: Nth scalar, density, specific volume. + static const std::size_t NUMDERIVED = 3; + //! \brief Constructor //! \param[in] c Index specifying which MixDirichlet SDE to construct. There //! can be multiple dirichlet ... end blocks in a control file. This index @@ -91,11 +92,12 @@ class MixDirichlet { m_depvar( g_inputdeck.get< tag::param, eq, tag::depvar >().at(c) ), // subtract the number of derived variables computed, see advance() m_ncomp( g_inputdeck.get< tag::component >().get< eq >().at(c) - - MIXDIR_NUMDERIVED ), + NUMDERIVED ), m_offset( g_inputdeck.get< tag::component >().offset< eq >(c) ), m_rng( g_rng.at( tk::ctr::raw( g_inputdeck.get< tag::param, eq, tag::rng >().at(c) ) ) ), + m_norm( g_inputdeck.get< tag::param, eq, tag::normalization >().at(c) ), m_b(), m_S(), m_kprime(), @@ -103,6 +105,7 @@ class MixDirichlet { m_rho(), m_r(), coeff( m_ncomp, + m_norm, g_inputdeck.get< tag::param, eq, tag::b >().at(c), g_inputdeck.get< tag::param, eq, tag::S >().at(c), g_inputdeck.get< tag::param, eq, tag::kappaprime >().at(c), @@ -113,27 +116,25 @@ class MixDirichlet { //! \param[in] stream Thread (or more precisely stream) ID //! \param[in,out] particles Array of particle properties void initialize( int stream, tk::Particles& particles ) { + + // Ensure the size of the parameter vector holding the pure-fluid + // densities is N = K+1 = m_ncomp+1 + Assert( m_rho.size() == m_ncomp+1, "Size mismatch" ); + //! Set initial conditions using initialization policy Init::template init< eq >( g_inputdeck, m_rng, stream, particles, m_c, m_ncomp, m_offset ); - // Initialize derived instantaneous variables const auto npar = particles.nunk(); for (auto p=decltype(npar){0}; p 1.0) Throw( "IC scalar out of bounds" ); + } + // Initialize derived instantaneous variables + derived( particles, p ); } } @@ -149,44 +150,44 @@ class MixDirichlet { const std::map< tk::ctr::Product, tk::real >& moments ) { // Update SDE coefficients - coeff.update( m_depvar, m_ncomp, moments, m_rho, m_r, m_kprime, m_k, - m_S ); + coeff.update( m_depvar, m_ncomp, m_norm, DENSITY_OFFSET, VOLUME_OFFSET, + moments, m_rho, m_r, m_kprime, m_b, m_k, m_S ); + // Advance particles const auto npar = particles.nunk(); for (auto p=decltype(npar){0}; p dW( m_ncomp ); m_rng.gaussian( stream, m_ncomp, dW.data() ); - // Advance first m_ncomp (K=N-1) scalars - tk::real v = 1.0; + // Advance all m_ncomp (=N=K+1) scalars + auto& yn = particles( p, m_ncomp, m_offset ); for (ncomp_t i=0; i 0.0 ? std::sqrt(d) : 0.0); - Y += 0.5*m_b[i]*( m_S[i]*yn - (1.0-m_S[i]) * Y )*dt + d*dW[i]; - v += m_r[i]*Y; + auto& y = particles( p, i, m_offset ); + tk::real d = m_k[i] * y * yn * dt; + if (d < 0.0) d = 0.0; + d = std::sqrt( d ); + auto dy = 0.5*m_b[i]*( m_S[i]*yn - (1.0-m_S[i])*y )*dt + d*dW[i]; + y += dy; + yn -= dy; } - // Finish computing specific volume - v /= m_rho[m_ncomp]; - // Compute and store instantaneous density - particles( p, m_ncomp, m_offset ) = 1.0 / v; - // Store instantaneous specific volume - particles( p, m_ncomp+1, m_offset ) = v; + // Compute derived instantaneous variables + derived( particles, p ); } } private: + //! Offset of particle density in solution array relative to YN + static const std::size_t DENSITY_OFFSET = 1; + //! Offset of particle specific volume in solution array relative to YN + static const std::size_t VOLUME_OFFSET = 2; + const ncomp_t m_c; //!< Equation system index const char m_depvar; //!< Dependent variable - const ncomp_t m_ncomp; //!< Number of components + const ncomp_t m_ncomp; //!< Number of components, K = N-1 const ncomp_t m_offset; //!< Offset SDE operates from const tk::RNG& m_rng; //!< Random number generator + const ctr::NormalizationType m_norm;//!< Normalization type //! Coefficients std::vector< kw::sde_b::info::expect::type > m_b; @@ -198,6 +199,37 @@ class MixDirichlet { //! Coefficients policy Coefficients coeff; + + //! \brief Return density for mass fractions + //! \details This function returns the instantaneous density, rho, + //! based on the multiple mass fractions, Y_c. + //! \param[in] particles Array of particle properties + //! \param[in] p Particle index + //! \return Instantaneous value of the density, rho + //! \details This is computed based 1/rho = sum_{i=1}^N Y_i/R_i, where R_i + //! are the constant pure-fluid densities and the Y_i are the mass + //! fractions, of the N materials. + tk::real rho( const tk::Particles& particles, ncomp_t p ) const { + // start computing density + tk::real d = 0.0; + for (ncomp_t i=0; i + #include "MixDirichletCoeffPolicy.hpp" std::vector< kw::sde_r::info::expect::type > -walker::MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho ) +walker::MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho, + ctr::NormalizationType norm ) // ***************************************************************************** // Compute parameter vector r based on r_i = rho_N/rho_i - 1 //! \param[in] rho Parameter vector rho to MixDirichlet +//! \param[in] norm Normalization type (N=heavy or N=light) //! \return Parameter vector r, determined by parameter vector rho // ***************************************************************************** { @@ -27,13 +31,121 @@ walker::MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho ) std::vector< kw::sde_r::info::expect::type > r( rho.size()-1 ); - for (std::size_t i=0; i& b_, + const std::vector< kw::sde_S::info::expect::type >& S_, + const std::vector< kw::sde_kappa::info::expect::type >& kprime_, + const std::vector< kw::sde_rho::info::expect::type >& rho_, + std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_S::info::expect::type >& S, + std::vector< kw::sde_kappa::info::expect::type >& kprime, + std::vector< kw::sde_rho::info::expect::type >& rho, + std::vector< kw::sde_r::info::expect::type >& r, + std::vector< kw::sde_kappa::info::expect::type >& k ) +// ***************************************************************************** +// Constructor: initialize coefficients +//! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) +//! \param[in] b_ Vector used to initialize coefficient vector b +//! \param[in] S_ Vector used to initialize coefficient vector S +//! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k +//! \param[in] rho_ Vector used to initialize coefficient vector rho and r +//! \param[in,out] b Coefficient vector to be initialized +//! \param[in,out] S Coefficient vector to be initialized +//! \param[in,out] kprime Coefficient vector to be initialized +//! \param[in,out] rho Coefficient vector to be initialized +//! \param[in,out] r Coefficient vector to be initialized +//! \param[in,out] k Coefficient vector to be initialized +// ***************************************************************************** +{ + ErrChk( b_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'b'"); + ErrChk( S_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'S'"); + ErrChk( kprime_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'kappaprime'"); + ErrChk( rho_.size() == ncomp+1, + "Wrong number of MixDirichlet SDE parameters 'rho'"); + + b = b_; + S = S_; + kprime = kprime_; + rho = rho_; + k.resize( kprime.size(), 0.0 ); + + // Compute parameter vector r based on r_i = rho_N/rho_i - 1 + Assert( r.empty(), "Parameter vector r must be empty" ); + r = MixDir_r( rho, norm ); +} + +void +walker::MixDirichletCoeffConst::update( + char /*depvar*/, + ncomp_t ncomp, + ctr::NormalizationType /*norm*/, + std::size_t /* density_offset */, + std::size_t /* volume_offset */, + const std::map< tk::ctr::Product, tk::real >& /*moments*/, + const std::vector< kw::sde_rho::info::expect::type >& /*rho*/, + const std::vector< kw::sde_r::info::expect::type >& /*r*/, + const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& /*b*/, + std::vector< kw::sde_kappa::info::expect::type >& k, + std::vector< kw::sde_kappa::info::expect::type >& S ) const +// ***************************************************************************** +// Update coefficients +//! \param[in] depvar Dependent variable +//! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) +//! \param[in] density_offset Offset of particle density in solution array +//! relative to YN +//! \param[in] volume_offset Offset of particle specific volume in solution +//! array relative to YN +//! \param[in] moments Map of statistical moments estimated +//! \param[in] rho Coefficient vector +//! \param[in] r Coefficient Vector +//! \param[in] kprime Coefficient vector +//! \param[in] b Coefficient vector +//! \param[in,out] k Coefficient vector to be updated +//! \param[in,out] S Coefficient vector to be updated +// ***************************************************************************** +{ + using tk::ctr::lookup; + using tk::ctr::mean; + using tk::ctr::variance; + using tk::ctr::Term; + using tk::ctr::Moment; + using tk::ctr::Product; + + for (ncomp_t c=0; c 1.0) { + std::cout << "S[" << c << "] bounds violated: " << S[c] << '\n'; + } + } +} + +walker::MixDirichletHomogeneous::MixDirichletHomogeneous( + ncomp_t ncomp, + ctr::NormalizationType norm, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& kprime_, @@ -47,6 +159,7 @@ walker::MixDirichletHomCoeffConst::MixDirichletHomCoeffConst( // ***************************************************************************** // Constructor: initialize coefficients //! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) //! \param[in] b_ Vector used to initialize coefficient vector b //! \param[in] S_ Vector used to initialize coefficient vector S //! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k @@ -54,6 +167,7 @@ walker::MixDirichletHomCoeffConst::MixDirichletHomCoeffConst( //! \param[in,out] b Coefficient vector to be initialized //! \param[in,out] S Coefficient vector to be initialized //! \param[in,out] kprime Coefficient vector to be initialized +//! \param[in,out] rho Coefficient vector to be initialized //! \param[in,out] r Coefficient vector to be initialized //! \param[in,out] k Coefficient vector to be initialized // ***************************************************************************** @@ -71,164 +185,337 @@ walker::MixDirichletHomCoeffConst::MixDirichletHomCoeffConst( S = S_; kprime = kprime_; rho = rho_; - k.resize( kprime.size() ); + k.resize( kprime.size(), 0.0 ); // Compute parameter vector r based on r_i = rho_N/rho_i - 1 Assert( r.empty(), "Parameter vector r must be empty" ); - r = MixDir_r( rho ); + r = MixDir_r( rho, norm ); } void -walker::MixDirichletHomCoeffConst::update( +walker::MixDirichletHomogeneous::update( char depvar, ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t /*volume_offset*/, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_rho::info::expect::type >& rho, const std::vector< kw::sde_r::info::expect::type >& r, const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, std::vector< kw::sde_kappa::info::expect::type >& k, std::vector< kw::sde_kappa::info::expect::type >& S ) const // ***************************************************************************** // Update coefficients //! \param[in] depvar Dependent variable //! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) +//! \param[in] density_offset Offset of particle density in solution array +//! relative to YN +//! \param[in] volume_offset Offset of particle specific volume in solution +//! array relative to YN //! \param[in] moments Map of statistical moments estimated //! \param[in] rho Coefficient vector //! \param[in] r Coefficient Vector //! \param[in] kprime Coefficient vector +//! \param[in] b Coefficient vector //! \param[in,out] k Coefficient vector to be updated //! \param[in,out] S Coefficient vector to be updated // ***************************************************************************** { using tk::ctr::lookup; using tk::ctr::mean; - using tk::ctr::variance; using tk::ctr::Term; using tk::ctr::Moment; using tk::ctr::Product; - // note: ncomp = K = N-1 + // Shorthands for dependent variable, Y, used to construct statistics + auto Yv = static_cast< char >( std::toupper(depvar) ); + + Term tR( Yv, ncomp+density_offset, Moment::ORDINARY ); + Term tYN( Yv, ncomp, Moment::ORDINARY ); + + auto R2YN = lookup( Product({tR,tR,tYN}), moments ); + + std::vector< tk::real > R2Y( ncomp, 0.0 ); + std::vector< tk::real > R3YNY( ncomp, 0.0 ); + for (ncomp_t c=0; c + R3YNY[c] = lookup( Product({tR,tR,tR,tYc,tYN}), moments ); // + } + + // Assume heavy-fluid normalization by default: rhoN = rhoH + tk::real rhoL = rho[0], rhoH = rho[ncomp]; + // Overwrite if light-fluid normalization is configured + if (norm == ctr::NormalizationType::LIGHT) { // rhoN = rhoL + rhoL = rho[ncomp]; + rhoH = rho[0]; + } - // constraint: r_i = rho_N/rho_c - 1 + for (ncomp_t c=0; c, mass fraction fluctuation about its mean - // r = R - , density fluctuation about its mean - // = mean mass fraction - // = mean density + for (ncomp_t c=0; c 1.0) { + std::cout << "S[" << c << "] bounds violated: " << S[c] << '\n'; + } + } +} + +walker::MixDirichletHydroTimeScale::MixDirichletHydroTimeScale( + tk::ctr::ncomp_t ncomp, + ctr::NormalizationType norm, + const std::vector< kw::sde_b::info::expect::type >& b_, + const std::vector< kw::sde_S::info::expect::type >& S_, + const std::vector< kw::sde_kappa::info::expect::type >& kprime_, + const std::vector< kw::sde_rho::info::expect::type >& rho_, + std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_S::info::expect::type >& S, + std::vector< kw::sde_kappa::info::expect::type >& kprime, + std::vector< kw::sde_rho::info::expect::type >& rho, + std::vector< kw::sde_r::info::expect::type >& r, + std::vector< kw::sde_kappa::info::expect::type >& k ) +// ***************************************************************************** +// Constructor: initialize coefficients +//! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) +//! \param[in] b_ Vector used to initialize coefficient vector b +//! \param[in] S_ Vector used to initialize coefficient vector S +//! \param[in] kprime_ Vector used to initialize coefficient vector kprime and k +//! \param[in] rho_ Vector used to initialize coefficient vector rho and r +//! \param[in,out] b Coefficient vector to be initialized +//! \param[in,out] S Coefficient vector to be initialized +//! \param[in,out] kprime Coefficient vector to be initialized +//! \param[in,out] rho Coefficient vector to be initialized +//! \param[in,out] r Coefficient vector to be initialized +//! \param[in,out] k Coefficient vector to be initialized +// ***************************************************************************** +{ + ErrChk( b_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'b'"); + ErrChk( S_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'S'"); + ErrChk( kprime_.size() == ncomp, + "Wrong number of MixDirichlet SDE parameters 'kappaprime'"); + ErrChk( rho_.size() == ncomp+1, + "Wrong number of MixDirichlet SDE parameters 'rho'"); + + b = b_; + S = S_; + kprime = kprime_; + rho = rho_; + k.resize( kprime.size(), 0.0 ); + + // Compute parameter vector r based on r_i = rho_N/rho_i - 1 + Assert( r.empty(), "Parameter vector r must be empty" ); + r = MixDir_r( rho, norm ); +} + +void +walker::MixDirichletHydroTimeScale::update( + char depvar, + ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t volume_offset, + const std::map< tk::ctr::Product, tk::real >& moments, + const std::vector< kw::sde_rho::info::expect::type >& rho, + const std::vector< kw::sde_r::info::expect::type >& r, + const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& k, + std::vector< kw::sde_kappa::info::expect::type >& S ) const +// ***************************************************************************** +// Update coefficients +//! \param[in] depvar Dependent variable +//! \param[in] ncomp Number of scalar components in this SDE system +//! \param[in] norm Normalization type (N=heavy or N=light) +//! \param[in] density_offset Offset of particle density in solution array +//! relative to YN +//! \param[in] volume_offset Offset of particle specific volume in solution +//! array relative to YN +//! \param[in] moments Map of statistical moments estimated +//! \param[in] rho Coefficient vector +//! \param[in] r Coefficient Vector +//! \param[in] kprime Coefficient vector +//! \param[in] b Coefficient vector +//! \param[in,out] k Coefficient vector to be updated +//! \param[in,out] S Coefficient vector to be updated +// ***************************************************************************** +{ + using tk::ctr::lookup; + using tk::ctr::mean; + using tk::ctr::variance; + using tk::ctr::Term; + using tk::ctr::Moment; + using tk::ctr::Product; + + // Shorthands for dependent variables, Y and y = Y - , used to construct + // statistics + auto Yv = static_cast< char >( std::toupper(depvar) ); + auto yv = static_cast< char >( std::tolower(depvar) ); // - tk::real R = lookup( mean(depvar,ncomp), moments ); - if (R < 1.0e-8) R = 1.0; + tk::real R = lookup( mean(depvar,ncomp+density_offset), moments ); + //if (R < 1.0e-8) R = 1.0; // b = -, density-specific-volume covariance - // Term rhoprime( static_cast(std::tolower(depvar)), - // ncomp, Moment::CENTRAL ); - // Term vprime( static_cast(std::tolower(depvar)), - // ncomp+1, Moment::CENTRAL ); - // auto ds = -lookup( Product({rhoprime,vprime}), moments ); + Term rhoprime( yv, ncomp+density_offset, Moment::CENTRAL ); + Term vprime( yv, ncomp+volume_offset, Moment::CENTRAL ); + //auto ds = -lookup( Product({rhoprime,vprime}), moments ); // b. = -/ std::vector< tk::real > bc( ncomp, 0.0 ); for (ncomp_t c=0; c(std::tolower(depvar)), - ncomp, Moment::CENTRAL ); - Term ty( static_cast(std::tolower(depvar)), - c, Moment::CENTRAL ); + Term tr( yv, ncomp+density_offset, Moment::CENTRAL ); + Term ty( yv, c, Moment::CENTRAL ); bc[c] = -lookup( Product({tr,ty}), moments ) / R; // -/ - //std::cout << "RRY: " << RRY[c] << ' '; } + Term tR( Yv, ncomp+density_offset, Moment::ORDINARY ); + Term tYN( Yv, ncomp, Moment::ORDINARY ); + + auto R2YN = lookup( Product({tR,tR,tYN}), moments ); + + std::vector< tk::real > y2( ncomp, 0.0 ); std::vector< tk::real > RY( ncomp, 0.0 ); - std::vector< tk::real > RRY( ncomp, 0.0 ); + std::vector< tk::real > R2Y( ncomp, 0.0 ); + std::vector< tk::real > R3YNY( ncomp, 0.0 ); + std::vector< tk::real > R3Y2( ncomp*ncomp, 0.0 ); for (ncomp_t c=0; c(std::toupper(depvar)), - ncomp, Moment::ORDINARY ); - Term tY( static_cast(std::toupper(depvar)), - c, Moment::ORDINARY ); - RY[c] = lookup( Product({tR,tY}), moments ); // - RRY[c] = lookup( Product({tR,tR,tY}), moments ); // - //std::cout << "RRY: " << RRY[c] << ' '; + y2[c] = lookup( variance(yv,c), moments ); + Term tYc( Yv, c, Moment::ORDINARY ); + RY[c] = lookup( Product({tR,tYc}), moments ); // + R2Y[c] = lookup( Product({tR,tR,tYc}), moments ); // + R3YNY[c] = lookup( Product({tR,tR,tR,tYc,tYN}), moments ); // + for (ncomp_t d=0; d + R3Y2[c*ncomp+d] = lookup( Product({tR,tR,tR,tYc,tYd}), moments ); + } + //std::cout << "R2Y: " << R2Y[c] << ' '; } //std::cout << std::endl; // Reynolds means // Reynolds means, Yc - std::vector< tk::real > Y( ncomp, 0.0 ); - for (ncomp_t c=0; c Y( ncomp, 0.0 ); + //for (ncomp_t c=0; c YK( ncomp, 0.0 ); -// for (ncomp_t c=0; c YK( ncomp, 0.0 ); + //for (ncomp_t c=0; c Yt( ncomp, 0.0 ); - for (ncomp_t c=0; c Yt( ncomp, 0.0 ); + //for (ncomp_t c=0; c YtK( ncomp, 0.0 ); -// for (ncomp_t c=0; c YtK( ncomp, 0.0 ); + //for (ncomp_t c=0; c - tk::real sumRRY = 0.0; - for (ncomp_t c=0; c sumR3Y2( ncomp, 0.0 ); + //for (ncomp_t c=0; c, density variance - auto rhovar = lookup( - variance(static_cast(std::tolower(depvar)),ncomp), moments ); + //auto rhovar = lookup( variance(yv,ncomp), moments ); //std::cout << ": " << rhovar << std::endl; + // + //auto R2 = lookup( Product({tR,tR}), moments ); + + // Assume heavy-fluid normalization by default: rhoN = rhoH + tk::real rhoL = rho[0], rhoH = rho[ncomp]; + // Overwrite if light-fluid normalization is configured + if (norm == ctr::NormalizationType::LIGHT) { // rhoN = rhoL + rhoL = rho[ncomp]; + rhoH = rho[0]; + } + for (ncomp_t c=0; c& b_, const std::vector< kw::sde_S::info::expect::type >& S_, - const std::vector< kw::sde_kappa::info::expect::type >& k_, + const std::vector< kw::sde_kappa::info::expect::type >& kprime_, const std::vector< kw::sde_r::info::expect::type >& rho_, - const std::vector< kw::sde_r::info::expect::type >& r_, std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& kprime, std::vector< kw::sde_S::info::expect::type >& S, - std::vector< kw::sde_kappa::info::expect::type >& k, - std::vector< kw::sde_r::info::expect::type >& r_ ); + std::vector< kw::sde_rho::info::expect::type >& rho, + std::vector< kw::sde_r::info::expect::type >& r, + std::vector< kw::sde_kappa::info::expect::type >& k ); \endcode where - - ncomp denotes the number of scalar components of the system of + - _ncomp_ denotes the number of scalar components of the system of MixDirichlet SDEs. - - Constant references to b_, S_, k_, rho_, r_, which denote three vectors + - _norm_ selects the type of normalization used (heavy or light). + - Constant references to b_, S_, kprime_, rho_, which denote vectors of real values used to initialize the parameter vectors of the MixDirichlet SDEs. The length of the vectors must be equal to the number of components given by ncomp. - - References to b, S, k, rho, r, which denote the parameter vectors to be - initialized based on b_, S_, k_, rho_. + - References to b, kprime, S, rho, r, k, which denote the parameter + vectors to be initialized based on b_, S_, kprime_, rho_. - Must define the static function _type()_, returning the enum value of the policy option. Example: @@ -53,20 +56,28 @@ void update( char depvar, ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t volume_offset, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_rho::info::expect::type >& rho, const std::vector< kw::sde_r::info::expect::type >& r, const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, std::vector< kw::sde_kappa::info::expect::type >& k, std::vector< kw::sde_kappa::info::expect::type >& S ) const {} \endcode where _depvar_ is the dependent variable associated with the mix Dirichlet SDE, specified in the control file by the user, _ncomp_ - is the number of components in the system, _moments_ is the map + is the number of components in the system, _norm_ selects the type of + normalization used (heavy or light). _density_offset_ is the offset + of the particle density in the solution array relative to the Nth scalar, + _volume_offset_ is the offset of the particle specific volume in the + solution array relative to the Nth scalar, _moments_ is the map associating moment IDs (tk::ctr::vector< tk::ctr::Term >) to values of - statistical moments, _rho_, _r_, and _kprime_ are user-defined - parameters, and _k_ and _S_ are the SDE parameters computed, see - DiffEq/DiffEq/MixDirichlet.h. + statistical moments, _rho_, _r_, _kprime_, _b_ are user-defined + parameters, and _k_ and _S_ are the SDE parameters computed/updated, see + also DiffEq/DiffEq/MixDirichlet.h. */ // ***************************************************************************** #ifndef MixDirichletCoeffPolicy_h @@ -76,26 +87,71 @@ #include "Types.hpp" #include "Walker/Options/CoeffPolicy.hpp" +#include "Walker/Options/Normalization.hpp" #include "SystemComponents.hpp" namespace walker { +//! \brief MixDirichlet constant coefficients policity: constants in time +class MixDirichletCoeffConst { + + private: + using ncomp_t = tk::ctr::ncomp_t; + + public: + //! Constructor: initialize coefficients + MixDirichletCoeffConst( + ncomp_t ncomp, + ctr::NormalizationType norm, + const std::vector< kw::sde_b::info::expect::type >& b_, + const std::vector< kw::sde_S::info::expect::type >& S_, + const std::vector< kw::sde_kappa::info::expect::type >& kprime_, + const std::vector< kw::sde_rho::info::expect::type >& rho_, + std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& kprime, + std::vector< kw::sde_S::info::expect::type >& S, + std::vector< kw::sde_rho::info::expect::type >& rho, + std::vector< kw::sde_r::info::expect::type >& r, + std::vector< kw::sde_kappa::info::expect::type >& k ); + + //! Update coefficients + void update( + char depvar, + ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t volume_offset, + const std::map< tk::ctr::Product, tk::real >& moments, + const std::vector< kw::sde_rho::info::expect::type >& rho, + const std::vector< kw::sde_r::info::expect::type >& r, + const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& k, + std::vector< kw::sde_kappa::info::expect::type >& S ) const; + + //! Coefficients policy type accessor + static ctr::CoeffPolicyType type() noexcept + { return ctr::CoeffPolicyType::CONST_COEFF; } +}; + //! Compute parameter vector r based on r_i = rho_N/rho_i - 1 std::vector< kw::sde_r::info::expect::type > -MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho ); +MixDir_r( const std::vector< kw::sde_rho::info::expect::type >& rho, + ctr::NormalizationType norm ); -//! MixDirichlet coefficients policity: constants in time + mean(rho) = const -//! \details User-defined parameters b and kappaprime are constant vectors in -//! time and, S is constrained to make \f$\mathrm{d}/\mathrm{d}t = 0\f$. -class MixDirichletHomCoeffConst { +//! MixDirichlet coefficients policity: mean(rho) forced const in time +//! \details User-defined parameter vector S is constrained to make +//! \f$\mathrm{d}/\mathrm{d}t = 0\f$. +class MixDirichletHomogeneous { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! Constructor: initialize coefficients - MixDirichletHomCoeffConst( - tk::ctr::ncomp_type ncomp, + MixDirichletHomogeneous( + ncomp_t ncomp, + ctr::NormalizationType norm, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& kprime_, @@ -114,16 +170,69 @@ class MixDirichletHomCoeffConst { void update( char depvar, ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t volume_offset, + const std::map< tk::ctr::Product, tk::real >& moments, + const std::vector< kw::sde_rho::info::expect::type >& rho, + const std::vector< kw::sde_r::info::expect::type >& r, + const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& k, + std::vector< kw::sde_kappa::info::expect::type >& S ) const; +}; + +//! MixDirichlet coefficients policity: mean(rho) forced const in time +//! \details User-defined parameters b' and kappa' are functions of an +//! externally, e.g., DNS-, provided hydrodynamics time scale ensuring decay +//! in the evolution of \. Additionally, S_alpha is constrained to +//! make d\/dt = 0. Additionally, we pull in a hydrodynamic timescale +//! from an external function. +//! \see kw::hydrotimescale_info +class MixDirichletHydroTimeScale { + + private: + using ncomp_t = tk::ctr::ncomp_t; + + public: + //! Constructor: initialize coefficients + MixDirichletHydroTimeScale( + tk::ctr::ncomp_t ncomp, + ctr::NormalizationType norm, + const std::vector< kw::sde_b::info::expect::type >& b_, + const std::vector< kw::sde_S::info::expect::type >& S_, + const std::vector< kw::sde_kappa::info::expect::type >& kprime_, + const std::vector< kw::sde_rho::info::expect::type >& rho_, + std::vector< kw::sde_b::info::expect::type >& b, + std::vector< kw::sde_kappa::info::expect::type >& kprime, + std::vector< kw::sde_S::info::expect::type >& S, + std::vector< kw::sde_rho::info::expect::type >& rho, + std::vector< kw::sde_r::info::expect::type >& r, + std::vector< kw::sde_kappa::info::expect::type >& k ); + + static ctr::CoeffPolicyType type() noexcept + { return ctr::CoeffPolicyType::HYDROTIMESCALE; } + + //! Update coefficients + void update( + char depvar, + ncomp_t ncomp, + ctr::NormalizationType norm, + std::size_t density_offset, + std::size_t volume_offset, const std::map< tk::ctr::Product, tk::real >& moments, const std::vector< kw::sde_rho::info::expect::type >& rho, const std::vector< kw::sde_r::info::expect::type >& r, const std::vector< kw::sde_kappa::info::expect::type >& kprime, + const std::vector< kw::sde_b::info::expect::type >& b, std::vector< kw::sde_kappa::info::expect::type >& k, std::vector< kw::sde_kappa::info::expect::type >& S ) const; }; //! List of all MixDirichlet's coefficients policies -using MixDirichletCoeffPolicies = brigand::list< MixDirichletHomCoeffConst >; +using MixDirichletCoeffPolicies = brigand::list< MixDirichletCoeffConst + , MixDirichletHomogeneous + , MixDirichletHydroTimeScale >; } // walker:: diff --git a/src/DiffEq/Dissipation/ConfigureDissipation.cpp b/src/DiffEq/Dissipation/ConfigureDissipation.cpp index e908a350fa5..8f1a0a6b674 100644 --- a/src/DiffEq/Dissipation/ConfigureDissipation.cpp +++ b/src/DiffEq/Dissipation/ConfigureDissipation.cpp @@ -49,7 +49,7 @@ registerDissipation( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoDissipation( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoDissipation( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the dissipation SDE //! \param[inout] cnt std::map of counters for all differential equation types diff --git a/src/DiffEq/Dissipation/ConfigureDissipation.hpp b/src/DiffEq/Dissipation/ConfigureDissipation.hpp index 35be3789722..ce3ed863a0a 100644 --- a/src/DiffEq/Dissipation/ConfigureDissipation.hpp +++ b/src/DiffEq/Dissipation/ConfigureDissipation.hpp @@ -28,7 +28,7 @@ void registerDissipation( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the dissipation SDE std::vector< std::pair< std::string, std::string > > -infoDissipation( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoDissipation( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Dissipation/Dissipation.hpp b/src/DiffEq/Dissipation/Dissipation.hpp index 363a4a53d2a..adf56c3482c 100644 --- a/src/DiffEq/Dissipation/Dissipation.hpp +++ b/src/DiffEq/Dissipation/Dissipation.hpp @@ -39,7 +39,7 @@ template< class Init, class Coefficients > class Dissipation { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::dissipation; public: diff --git a/src/DiffEq/Gamma/ConfigureGamma.cpp b/src/DiffEq/Gamma/ConfigureGamma.cpp index dea46f0d45a..52ad770f4a9 100644 --- a/src/DiffEq/Gamma/ConfigureGamma.cpp +++ b/src/DiffEq/Gamma/ConfigureGamma.cpp @@ -47,7 +47,7 @@ registerGamma( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoGamma( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoGamma( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the gamma SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -85,10 +85,10 @@ infoGamma( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) "coeff kappa [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::gamma, tag::kappa >().at(c) ) ); - spikes( nfo, g_inputdeck.get< tag::param, tag::gamma, tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::gamma, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::gamma, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::gamma, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/Gamma/ConfigureGamma.hpp b/src/DiffEq/Gamma/ConfigureGamma.hpp index 52c88a14848..555b5810ddb 100644 --- a/src/DiffEq/Gamma/ConfigureGamma.hpp +++ b/src/DiffEq/Gamma/ConfigureGamma.hpp @@ -27,7 +27,7 @@ void registerGamma( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the gamma SDE std::vector< std::pair< std::string, std::string > > -infoGamma( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoGamma( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Gamma/Gamma.hpp b/src/DiffEq/Gamma/Gamma.hpp index 142e38cfe84..74260105712 100644 --- a/src/DiffEq/Gamma/Gamma.hpp +++ b/src/DiffEq/Gamma/Gamma.hpp @@ -62,7 +62,7 @@ template< class Init, class Coefficients > class Gamma { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/Gamma/GammaCoeffPolicy.cpp b/src/DiffEq/Gamma/GammaCoeffPolicy.cpp index 907dca162d9..caea998c1ee 100644 --- a/src/DiffEq/Gamma/GammaCoeffPolicy.cpp +++ b/src/DiffEq/Gamma/GammaCoeffPolicy.cpp @@ -15,7 +15,7 @@ #include "GammaCoeffPolicy.hpp" walker::GammaCoeffConst::GammaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/Gamma/GammaCoeffPolicy.hpp b/src/DiffEq/Gamma/GammaCoeffPolicy.hpp index 9db082f1855..bf35142853f 100644 --- a/src/DiffEq/Gamma/GammaCoeffPolicy.hpp +++ b/src/DiffEq/Gamma/GammaCoeffPolicy.hpp @@ -15,7 +15,7 @@ coefficients, b, S, and kappa. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, @@ -61,7 +61,7 @@ class GammaCoeffConst { public: //! Constructor: initialize coefficients GammaCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_b::info::expect::type >& b_, const std::vector< kw::sde_S::info::expect::type >& S_, const std::vector< kw::sde_kappa::info::expect::type >& k_, diff --git a/src/DiffEq/InitPolicy.hpp b/src/DiffEq/InitPolicy.hpp index 7e5740a676b..3b9fee656c1 100644 --- a/src/DiffEq/InitPolicy.hpp +++ b/src/DiffEq/InitPolicy.hpp @@ -20,9 +20,9 @@ const tk::RNG& rng, int stream, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ); + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ); \endcode where _deck_ is the input deck from which configuration is read, _rng_ is a reference to a random number generator to use, _stream_ is the thread @@ -68,15 +68,15 @@ namespace walker { //! Raw initialization policy: leave memory uninitialized struct InitRaw { - //! Initialize particle properties + //! Do not initialize particle properties template< class eq > static void init( const ctr::InputDeck&, const tk::RNG&, int, tk::Particles&, - tk::ctr::ncomp_type, - tk::ctr::ncomp_type, - tk::ctr::ncomp_type ) {} + tk::ctr::ncomp_t, + tk::ctr::ncomp_t, + tk::ctr::ncomp_t ) {} static ctr::InitPolicyType type() noexcept { return ctr::InitPolicyType::RAW; } @@ -85,15 +85,15 @@ struct InitRaw { //! Zero initialization policy: zero particle properties struct InitZero { - //! Initialize particle properties + //! Initialize particle properties as zero template< class eq > static void init( const ctr::InputDeck&, const tk::RNG&, int, tk::Particles& particles, - tk::ctr::ncomp_type, - tk::ctr::ncomp_type, - tk::ctr::ncomp_type ) + tk::ctr::ncomp_t, + tk::ctr::ncomp_t, + tk::ctr::ncomp_t ) { particles.fill( 0.0 ); } @@ -105,19 +105,20 @@ struct InitZero { //! Delta initialization policy: put in delta-spikes as the joint PDF struct InitDelta { - //! Initialize particle properties + //! Initialize particle properties a joint delta template< class eq > static void init( const ctr::InputDeck& deck, const tk::RNG&, int, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ) + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) { - using ncomp_t = kw::ncomp::info::expect::type; + using ncomp_t = tk::ctr::ncomp_t; - const auto& spike = deck.template get< tag::param, eq, tag::spike >().at(e); + const auto& spike = + deck.template get< tag::param, eq, tag::init, tag::spike >().at(e); // use only the first ncomp spikes if there are more than the equation is // configured for @@ -146,20 +147,20 @@ struct InitDelta { //! Beta initialization policy: generate samples from a joint beta PDF struct InitBeta { - //! Initialize particle properties (zero) + //! Initialize particle properties by sampling from a joint beta distribution template< class eq > static void init( const ctr::InputDeck& deck, const tk::RNG& rng, int stream, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ) + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) { - using ncomp_t = kw::ncomp::info::expect::type; + using ncomp_t = tk::ctr::ncomp_t; const auto& betapdf = - deck.template get< tag::param, eq, tag::betapdf >().at(e); + deck.template get< tag::param, eq, tag::init, tag::betapdf >().at(e); // use only the first ncomp betapdfs if there are more than the equation is // configured for @@ -187,20 +188,20 @@ struct InitBeta { //! \note No correlations supported. For correlations, see jointCorrGaussian struct InitGaussian { - //! Initialize particle properties (zero) + //! Initialize particle properties by sampling from independent Gaussians template< class eq > static void init( const ctr::InputDeck& deck, const tk::RNG& rng, int stream, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ) + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) { - using ncomp_t = kw::ncomp::info::expect::type; + using ncomp_t = tk::ctr::ncomp_t; const auto& gaussian = - deck.template get< tag::param, eq, tag::gaussian >().at(e); + deck.template get< tag::param, eq, tag::init, tag::gaussian >().at(e); // use only the first ncomp gaussian if there are more than the equation is // configured for @@ -232,21 +233,23 @@ struct InitGaussian { //! correlated Gaussian PDF struct InitCorrGaussian { - //! Initialize particle properties (zero) + //! Initialize particle properties by sampling from a joint Gaussian template< class eq > static void init( const ctr::InputDeck& deck, const tk::RNG& rng, int stream, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ) + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) { - using ncomp_t = kw::ncomp::info::expect::type; + using ncomp_t = tk::ctr::ncomp_t; - const auto& mean = deck.template get< tag::param, eq, tag::mean >().at(e); + const auto& mean = + deck.template get< tag::param, eq, tag::init, tag::mean >().at(e); Assert( mean.size() == ncomp, "Size mismatch" ); - const auto& cov_ = deck.template get< tag::param, eq, tag::cov >().at(e); + const auto& cov_ = + deck.template get< tag::param, eq, tag::init, tag::cov >().at(e); Assert( cov_.size() == ncomp*(ncomp+1)/2, "Size mismatch" ); // Compute covariance matrix using Cholesky-decompositionm, see Intel MKL @@ -277,20 +280,20 @@ struct InitCorrGaussian { //! Gamma initialization policy: generate samples from a joint gamma PDF struct InitGamma { - //! Initialize particle properties (zero) + //! Initialize particle properties by sampling from a joint gamma distribution template< class eq > static void init( const ctr::InputDeck& deck, const tk::RNG& rng, int stream, tk::Particles& particles, - tk::ctr::ncomp_type e, - tk::ctr::ncomp_type ncomp, - tk::ctr::ncomp_type offset ) + tk::ctr::ncomp_t e, + tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) { - using ncomp_t = kw::ncomp::info::expect::type; + using ncomp_t = tk::ctr::ncomp_t; const auto& gamma = - deck.template get< tag::param, eq, tag::gamma >().at(e); + deck.template get< tag::param, eq, tag::init, tag::gamma >().at(e); // use only the first ncomp gamma if there are more than the equation is // configured for @@ -311,6 +314,59 @@ struct InitGamma { { return ctr::InitPolicyType::JOINTGAMMA; } }; +//! Dirichlet initialization policy: generate samples from a Dirichlet PDF +struct InitDirichlet { + + //! Initialize particle properties by sampling from a Dirichlet distribution + //! \see https://en.wikipedia.org/wiki/Dirichlet_distribution#Random_number_generation + template< class eq > + static void init( const ctr::InputDeck& deck, + const tk::RNG& rng, + int stream, + tk::Particles& particles, + tk::ctr::ncomp_t e, + [[ maybe_unused ]] tk::ctr::ncomp_t ncomp, + tk::ctr::ncomp_t offset ) + { + using ncomp_t = tk::ctr::ncomp_t; + + const auto& dir = + deck.template get< tag::param, eq, tag::init, tag::dirichlet >().at(e); + Assert( dir.size() == ncomp+1, "Size mismatch" ); + std::vector< tk::real > Y( dir.size() ); + + for (ncomp_t p=0; p 1.0) Throw( "Dirichlet samples out of bounds" ); + particles( p, c, offset ) = y; + } + } + + // Verify boundedness of all ncomp+1 (=N=K+1) scalars + for (ncomp_t p=0; p 1.0) Throw( "IC Dirichlet sample Y out of bounds" ); + } + } + } + + static ctr::InitPolicyType type() noexcept + { return ctr::InitPolicyType::JOINTDIRICHLET; } +}; + //! List of all initialization policies using InitPolicies = brigand::list< InitRaw , InitZero @@ -319,6 +375,7 @@ using InitPolicies = brigand::list< InitRaw , InitGaussian , InitCorrGaussian , InitGamma + , InitDirichlet >; } // walker:: diff --git a/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.cpp b/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.cpp index 350211a7190..edcf53e036d 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.cpp +++ b/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.cpp @@ -50,7 +50,7 @@ registerDiagOrnsteinUhlenbeck( DiffEqFactory& f, } std::vector< std::pair< std::string, std::string > > -infoDiagOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoDiagOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the diagonal Ornstein-Uhlenbeck SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -80,17 +80,16 @@ infoDiagOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt g_inputdeck.get< tag::param, tag::diagou, tag::rng >()[c] ) ); nfo.emplace_back( "coeff sigmasq [" + std::to_string( ncomp ) + "]", - parameters( - g_inputdeck.get< tag::param, tag::diagou, tag::sigmasq >().at(c) ) ); + parameters( g_inputdeck.get< tag::param, tag::diagou, tag::mu >().at(c) ) ); nfo.emplace_back( "coeff theta [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::diagou, tag::theta >().at(c) ) ); nfo.emplace_back( "coeff mu [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::diagou, tag::mu >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::diagou, tag::spike >().at(c) ); - betapdfs( nfo, - g_inputdeck.get< tag::param, tag::diagou, tag::betapdf >().at(c) ); + + const auto& init = g_inputdeck.get< tag::param, tag::diagou, tag::init >(); + spikes( nfo, init.get< tag::spike >().at(c) ); + betapdfs( nfo, init.get< tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.hpp b/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.hpp index 76ebd6d1014..fbfc0c005d4 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.hpp +++ b/src/DiffEq/OrnsteinUhlenbeck/ConfigureDiagOrnsteinUhlenbeck.hpp @@ -32,7 +32,7 @@ void registerDiagOrnsteinUhlenbeck( DiffEqFactory& f, //! Return information on the diagonal Ornstein-Uhlenbeck SDE std::vector< std::pair< std::string, std::string > > infoDiagOrnsteinUhlenbeck( std::map< ctr::DiffEqType, - tk::ctr::ncomp_type >& cnt ); + tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.cpp b/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.cpp index e2c7b1fa229..378a0794a99 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.cpp +++ b/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.cpp @@ -47,7 +47,7 @@ registerOrnsteinUhlenbeck( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the Ornstein-Uhlenbeck SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -83,9 +83,10 @@ infoOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) parameters( g_inputdeck.get< tag::param, tag::ou, tag::theta >().at(c) ) ); nfo.emplace_back( "coeff mu [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::ou, tag::mu >().at(c) ) ); - spikes( nfo, g_inputdeck.get< tag::param, tag::ou, tag::spike >().at(c) ); - betapdfs( nfo, - g_inputdeck.get< tag::param, tag::ou, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::ou, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::ou, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.hpp b/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.hpp index c4548ab51cf..c470853275f 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.hpp +++ b/src/DiffEq/OrnsteinUhlenbeck/ConfigureOrnsteinUhlenbeck.hpp @@ -28,7 +28,7 @@ registerOrnsteinUhlenbeck( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the Ornstein-Uhlenbeck SDE std::vector< std::pair< std::string, std::string > > -infoOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoOrnsteinUhlenbeck( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeck.hpp b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeck.hpp index 3e2e7094c7f..3ee4ad17e64 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeck.hpp +++ b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeck.hpp @@ -100,7 +100,7 @@ template< class Init, class Coefficients > class DiagOrnsteinUhlenbeck { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.cpp b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.cpp index faa4fa270b0..f29aae8d039 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.cpp +++ b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.cpp @@ -17,7 +17,7 @@ #include "DiagOrnsteinUhlenbeckCoeffPolicy.hpp" walker::DiagOrnsteinUhlenbeckCoeffConst::DiagOrnsteinUhlenbeckCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, diff --git a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.hpp b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.hpp index 45bb9d541f5..b2285b1a3e7 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.hpp +++ b/src/DiffEq/OrnsteinUhlenbeck/DiagOrnsteinUhlenbeckCoeffPolicy.hpp @@ -16,7 +16,7 @@ coefficients, sigmasq, theta, and mu. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, @@ -62,7 +62,7 @@ class DiagOrnsteinUhlenbeckCoeffConst { public: //! Constructor: initialize coefficients DiagOrnsteinUhlenbeckCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, diff --git a/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeck.hpp b/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeck.hpp index 832e6dd13a3..174473b8adb 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeck.hpp +++ b/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeck.hpp @@ -105,7 +105,7 @@ template< class Init, class Coefficients > class OrnsteinUhlenbeck { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeckCoeffPolicy.cpp b/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeckCoeffPolicy.cpp index 793abff3356..291b98e8517 100644 --- a/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeckCoeffPolicy.cpp +++ b/src/DiffEq/OrnsteinUhlenbeck/OrnsteinUhlenbeckCoeffPolicy.cpp @@ -17,7 +17,7 @@ #include "OrnsteinUhlenbeckCoeffPolicy.hpp" walker::OrnsteinUhlenbeckCoeffConst::OrnsteinUhlenbeckCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, @@ -45,8 +45,8 @@ walker::OrnsteinUhlenbeckCoeffConst::OrnsteinUhlenbeckCoeffConst( // Prepare upper triangle for Cholesky-decomposition using LAPACK sigmasq.resize( ncomp * ncomp ); std::size_t c = 0; - for (tk::ctr::ncomp_type i=0; i& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, @@ -63,14 +63,14 @@ class OrnsteinUhlenbeckCoeffConst { public: //! Constructor: initialize coefficients OrnsteinUhlenbeckCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_theta::info::expect::type >& theta_, const std::vector< kw::sde_mu::info::expect::type >& mu_, std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq, std::vector< kw::sde_theta::info::expect::type >& theta, std::vector< kw::sde_mu::info::expect::type >& mu ); - + static ctr::CoeffPolicyType type() noexcept { return ctr::CoeffPolicyType::CONST_COEFF; } }; diff --git a/src/DiffEq/Position/ConfigurePosition.cpp b/src/DiffEq/Position/ConfigurePosition.cpp index 6d9354ade4b..643df5fb241 100644 --- a/src/DiffEq/Position/ConfigurePosition.cpp +++ b/src/DiffEq/Position/ConfigurePosition.cpp @@ -49,7 +49,7 @@ registerPosition( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoPosition( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoPosition( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the position SDE //! \param[inout] cnt std::map of counters for all differential equation types diff --git a/src/DiffEq/Position/ConfigurePosition.hpp b/src/DiffEq/Position/ConfigurePosition.hpp index 320f0f428ed..19b6afd26c1 100644 --- a/src/DiffEq/Position/ConfigurePosition.hpp +++ b/src/DiffEq/Position/ConfigurePosition.hpp @@ -27,7 +27,7 @@ void registerPosition( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the position SDE std::vector< std::pair< std::string, std::string > > -infoPosition( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoPosition( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Position/Position.hpp b/src/DiffEq/Position/Position.hpp index dfac7705a14..fc3bac30952 100644 --- a/src/DiffEq/Position/Position.hpp +++ b/src/DiffEq/Position/Position.hpp @@ -36,7 +36,7 @@ template< class Init, class Coefficients > class Position { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::position; public: diff --git a/src/DiffEq/SkewNormal/ConfigureSkewNormal.cpp b/src/DiffEq/SkewNormal/ConfigureSkewNormal.cpp index b83ab05d04f..50ee98acbbf 100644 --- a/src/DiffEq/SkewNormal/ConfigureSkewNormal.cpp +++ b/src/DiffEq/SkewNormal/ConfigureSkewNormal.cpp @@ -47,7 +47,7 @@ registerSkewNormal( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoSkewNormal( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoSkewNormal( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the skew-normal SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -88,11 +88,10 @@ infoSkewNormal( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) "coeff lambda [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::skewnormal, tag::lambda >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::skewnormal, tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::skewnormal, tag::betapdf >().at(c) ); + spikes( nfo, g_inputdeck.get< tag::param, tag::skewnormal, tag::init, + tag::spike >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::skewnormal, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/SkewNormal/ConfigureSkewNormal.hpp b/src/DiffEq/SkewNormal/ConfigureSkewNormal.hpp index ca7576f331f..b01bbeb95e9 100644 --- a/src/DiffEq/SkewNormal/ConfigureSkewNormal.hpp +++ b/src/DiffEq/SkewNormal/ConfigureSkewNormal.hpp @@ -27,7 +27,7 @@ void registerSkewNormal( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the skew-normal SDE std::vector< std::pair< std::string, std::string > > -infoSkewNormal( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoSkewNormal( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/SkewNormal/SkewNormal.hpp b/src/DiffEq/SkewNormal/SkewNormal.hpp index 685c1c28eba..2f593e10d6c 100644 --- a/src/DiffEq/SkewNormal/SkewNormal.hpp +++ b/src/DiffEq/SkewNormal/SkewNormal.hpp @@ -90,7 +90,7 @@ template< class Init, class Coefficients > class SkewNormal { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! \brief Constructor diff --git a/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.cpp b/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.cpp index 44c1ff8bca0..16688338cf2 100644 --- a/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.cpp +++ b/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.cpp @@ -16,7 +16,7 @@ #include "SkewNormalCoeffPolicy.hpp" walker::SkewNormalCoeffConst::SkewNormalCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_T::info::expect::type >& timescale_, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_lambda::info::expect::type >& lambda_, diff --git a/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.hpp b/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.hpp index 099a0668568..b329f93ee55 100644 --- a/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.hpp +++ b/src/DiffEq/SkewNormal/SkewNormalCoeffPolicy.hpp @@ -15,7 +15,7 @@ coefficients, timescale, sigmasq, and lambda. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_T::info::expect::type >& timescale_, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_lambda::info::expect::type >& lambda_, @@ -61,7 +61,7 @@ class SkewNormalCoeffConst { public: //! Constructor: initialize coefficients SkewNormalCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_T::info::expect::type >& timescale_, const std::vector< kw::sde_sigmasq::info::expect::type >& sigmasq_, const std::vector< kw::sde_lambda::info::expect::type >& lambda_, diff --git a/src/DiffEq/Velocity/ConfigureVelocity.cpp b/src/DiffEq/Velocity/ConfigureVelocity.cpp index d9e0285bcf0..90e429f18af 100644 --- a/src/DiffEq/Velocity/ConfigureVelocity.cpp +++ b/src/DiffEq/Velocity/ConfigureVelocity.cpp @@ -49,7 +49,7 @@ registerVelocity( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoVelocity( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoVelocity( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the velocity SDE //! \param[inout] cnt std::map of counters for all differential equation types diff --git a/src/DiffEq/Velocity/ConfigureVelocity.hpp b/src/DiffEq/Velocity/ConfigureVelocity.hpp index 6a2181d5513..a840f1cfc0f 100644 --- a/src/DiffEq/Velocity/ConfigureVelocity.hpp +++ b/src/DiffEq/Velocity/ConfigureVelocity.hpp @@ -27,7 +27,7 @@ void registerVelocity( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the velocity SDE std::vector< std::pair< std::string, std::string > > -infoVelocity( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoVelocity( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/Velocity/Velocity.hpp b/src/DiffEq/Velocity/Velocity.hpp index 54b60b2f479..e32dd15510e 100644 --- a/src/DiffEq/Velocity/Velocity.hpp +++ b/src/DiffEq/Velocity/Velocity.hpp @@ -41,7 +41,7 @@ template< class Init, class Coefficients > class Velocity { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::velocity; public: @@ -176,7 +176,8 @@ class Velocity { //! Offset of coupled mixmassfracbeta eq const ncomp_t m_mixmassfracbeta_offset; - const ctr::DepvarType m_solve; //!< Depndent variable to solve for + //! Depndent variable to solve for + const ctr::DepvarType m_solve; //! Array of tk::ctr::Product used to access the mean velocity const std::array< tk::ctr::Product, 3 > m_U; //! Velocity model variant diff --git a/src/DiffEq/Velocity/VelocityCoeffPolicy.cpp b/src/DiffEq/Velocity/VelocityCoeffPolicy.cpp index 89d81167f4e..c1da6a3fc5c 100644 --- a/src/DiffEq/Velocity/VelocityCoeffPolicy.cpp +++ b/src/DiffEq/Velocity/VelocityCoeffPolicy.cpp @@ -46,7 +46,7 @@ walker::VelocityCoeffConstShear::update( tk::real& eps, std::array< tk::real, 9 >& G ) const // ***************************************************************************** -//! Update the model coefficients (prescribing shear) +// Update the model coefficients prescribing shear //! \param[in] depvar Dependent variable for of this SDE //! \param[in] dissipation_depvar Dependent variable for coupled dissipation eq //! \param[in] moments Map of statistical moments @@ -85,63 +85,59 @@ walker::VelocityCoeffConstShear::update( walker::VelocityCoeffStationary::VelocityCoeffStationary( kw::sde_c0::info::expect::type C0_, kw::sde_c0::info::expect::type& C0, - std::array< tk::real, 9 >& dU ) : m_dU( {{ 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0, - 0.0, 0.0, 0.0 }} ) + std::array< tk::real, 9 >& ) // ***************************************************************************** // Constructor: initialize coefficients //! \param[in] C0_ Value of C0 parameter in the Langevin model //! \param[in,out] C0 Value of to set the C0 parameter in the Langevin model -//! \param[in,out] dU Prescribed mean velocity gradient +//! \details Prescribe no shear. The value of C0 is insignificant for a forced +//! stationary velocity PDF because drift and diffusion are in balance, so +//! that dk/dt = 0. // ***************************************************************************** { C0 = C0_; - dU = m_dU; } void walker::VelocityCoeffStationary::update( - char depvar, char, - const std::map< tk::ctr::Product, tk::real >& moments, + char, + const std::map< tk::ctr::Product, tk::real >&, const tk::Table&, - ctr::DepvarType solve, - ctr::VelocityVariantType variant, + ctr::DepvarType, + ctr::VelocityVariantType, kw::sde_c0::info::expect::type C0, tk::real, tk::real& eps, std::array< tk::real, 9 >& G ) const // ***************************************************************************** -//! Update the model coefficients (prescribing shear) -//! \param[in] depvar Dependent variable for of this SDE -//! \param[in] moments Map of statistical moments -//! \param[in] solve Configured dependent variable to solve for -//! \param[in] variant Velocity model variant configured -//! \param[in] C0 Coefficient C0 in the Langevin model -//! \param[in,out] eps Dissipation rate of turbulent kinetic energy +// Update the model coefficients forcing a statistically stationary PDF +//! \param[in] C0 Coefficient C0 in the Langevin model, should not affect the +//! solution for forced velocity PDF +//! \param[in,out] eps Dissipation rate of turbulent kinetic energy, force = 1 //! \param[in,out] G Coefficient tensor (3x3) in the Langevin equation -//! \details Update the dissipation rate (eps) and G_{ij} based on the -//! turbulent kinetic energy (k) for a prescribed honmogeneous shear flow. +//! \details Update the dissipation rate (eps) and G_{ij} so that the velocity +//! PDF is stationary. The value of C0 is insignificant for a forced +//! stationary velocity PDF because drift and diffusion are in balance, so +//! that dk/dt = 0. // ***************************************************************************** { - // Compute turbulent kinetic energy - auto rs = reynoldsStress( depvar, solve, moments ); - - // Override turbulent kinetic energy to keep PDF stationary + // Override turbulent kinetic energy to keep the velocity PDF exactly + // stationary tk::real k = 1.0; - // Override mean turbulence frequency to keep PDF stationary + // Do not couple a dissipation eq for forced velocity PDF, but set to unity + // and keep the PDF stationary. tk::real O = 1.0; // Compute turbulent kinetic energy dissipation rate eps = O*k; - // update drift tensor based on the Langevin model variant configured - if (variant == ctr::VelocityVariantType::SLM) // simplified - G = slm( O, C0 ); - else if (variant == ctr::VelocityVariantType::GLM)// generalized - G = glm( O, C0, rs, m_dU ); - else Throw( "Velocity variant type not implemented" ); + // Update drift tensor to force the velocity PDF stationary. Note that his is + // NOT the simplified or generalized Langevin model, but a modification to + // keep the PDF stationary, see Pope, Turbulent Flows, 2000, Eq.12.100. + G.fill( 0.0 ); + G[0] = G[4] = G[8] = -0.75*C0*O; } walker::VelocityCoeffHydroTimeScale::VelocityCoeffHydroTimeScale( @@ -170,7 +166,8 @@ walker::VelocityCoeffHydroTimeScale::update( tk::real& eps, std::array< tk::real, 9 >& G ) const // ***************************************************************************** -//! Update the model coefficients (prescribing shear) +// Update the model coefficients sampling the hydrodynamics time scale from a +// prescribed function table //! \param[in] depvar Dependent variable for of this SDE //! \param[in] moments Map of statistical moments //! \param[in] hts Table to take hydrodynamics time scale from diff --git a/src/DiffEq/Velocity/VelocityCoeffPolicy.hpp b/src/DiffEq/Velocity/VelocityCoeffPolicy.hpp index 4e8859cc02a..d62e9dabba5 100644 --- a/src/DiffEq/Velocity/VelocityCoeffPolicy.hpp +++ b/src/DiffEq/Velocity/VelocityCoeffPolicy.hpp @@ -78,8 +78,6 @@ namespace walker { //! Velocity equation coefficients policy with prescribed mean shear -//! \details C0 is user-defined and we prescibe a hard-coded mean shear in the x -//! direction //! \see kw::const_shear_info class VelocityCoeffConstShear { @@ -93,7 +91,7 @@ class VelocityCoeffConstShear { static ctr::CoeffPolicyType type() noexcept { return ctr::CoeffPolicyType::CONST_SHEAR; } - //! Update the model coefficients (prescribing shear) + //! Update the model coefficients prescribing shear void update( char depvar, char dissipation_depvar, const std::map< tk::ctr::Product, tk::real >& moments, @@ -118,35 +116,27 @@ class VelocityCoeffStationary { public: //! Constructor: initialize coefficients VelocityCoeffStationary( kw::sde_c0::info::expect::type C0_, - kw::sde_c0::info::expect::type& C0, - std::array< tk::real, 9 >& dU ); + kw::sde_c0::info::expect::type& C0, + std::array< tk::real, 9 >& ); //! Coefficients policy type accessor static ctr::CoeffPolicyType type() noexcept { return ctr::CoeffPolicyType::STATIONARY; } - //! Update the model coefficients (prescribing shear) - //! \details Update the dissipation rate (eps) and G_{ij} based on the - //! turbulent kinetic energy (k) for a prescribed honmogeneous shear flow. - void update( char depvar, + //! Update the model coefficients forcing a statistically stationary PDF + void update( char /*depvar*/, char, - const std::map< tk::ctr::Product, tk::real >& moments, + const std::map< tk::ctr::Product, tk::real >&, const tk::Table&, - ctr::DepvarType solve, - ctr::VelocityVariantType variant, + ctr::DepvarType, + ctr::VelocityVariantType, kw::sde_c0::info::expect::type C0, tk::real, tk::real& eps, std::array< tk::real, 9 >& G ) const; - - private: - //! Mean velocity gradient prescribed for simpled 1D homogeneous shear - std::array< tk::real, 9 > m_dU; }; //! Velocity equation coefficients policy with DNS hydrodynamics time scale -//! \details C0 is user-defined and we pull in a hydrodynamic timescale from an -//! external function (from DNS). //! \see kw::hydrotimescale_info class VelocityCoeffHydroTimeScale { @@ -160,7 +150,8 @@ class VelocityCoeffHydroTimeScale { static ctr::CoeffPolicyType type() noexcept { return ctr::CoeffPolicyType::HYDROTIMESCALE; } - //! \brief Update the model coefficients + //! \brief Update the model coefficients sampling the hydrodynamics time + //! scale from a prescribed function table void update( char depvar, char, const std::map< tk::ctr::Product, tk::real >& moments, diff --git a/src/DiffEq/WrightFisher/ConfigureWrightFisher.cpp b/src/DiffEq/WrightFisher/ConfigureWrightFisher.cpp index 4b27ab8a437..72b1d210f8d 100644 --- a/src/DiffEq/WrightFisher/ConfigureWrightFisher.cpp +++ b/src/DiffEq/WrightFisher/ConfigureWrightFisher.cpp @@ -47,7 +47,7 @@ registerWrightFisher( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ) } std::vector< std::pair< std::string, std::string > > -infoWrightFisher( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) +infoWrightFisher( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the Wright-Fisher SDE //! \param[inout] cnt std::map of counters for all differential equation types @@ -79,12 +79,11 @@ infoWrightFisher( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ) "coeff omega [" + std::to_string( ncomp ) + "]", parameters( g_inputdeck.get< tag::param, tag::wrightfisher, tag::omega >().at(c) ) ); - spikes( nfo, - g_inputdeck.get< tag::param, tag::wrightfisher, tag::spike >().at(c) + spikes( nfo, g_inputdeck.get< tag::param, tag::wrightfisher, tag::init, + tag::spike >().at(c) ); - betapdfs( - nfo, - g_inputdeck.get< tag::param, tag::wrightfisher, tag::betapdf >().at(c) ); + betapdfs( nfo, g_inputdeck.get< tag::param, tag::wrightfisher, tag::init, + tag::betapdf >().at(c) ); return nfo; } diff --git a/src/DiffEq/WrightFisher/ConfigureWrightFisher.hpp b/src/DiffEq/WrightFisher/ConfigureWrightFisher.hpp index 8d689aa0780..9dbb12612d4 100644 --- a/src/DiffEq/WrightFisher/ConfigureWrightFisher.hpp +++ b/src/DiffEq/WrightFisher/ConfigureWrightFisher.hpp @@ -27,7 +27,7 @@ void registerWrightFisher( DiffEqFactory& f, std::set< ctr::DiffEqType >& t ); //! Return information on the Wright-Fisher SDE std::vector< std::pair< std::string, std::string > > -infoWrightFisher( std::map< ctr::DiffEqType, tk::ctr::ncomp_type >& cnt ); +infoWrightFisher( std::map< ctr::DiffEqType, tk::ctr::ncomp_t >& cnt ); } // walker:: diff --git a/src/DiffEq/WrightFisher/WrightFisher.hpp b/src/DiffEq/WrightFisher/WrightFisher.hpp index c1cf485cc92..80ae259c9cc 100644 --- a/src/DiffEq/WrightFisher/WrightFisher.hpp +++ b/src/DiffEq/WrightFisher/WrightFisher.hpp @@ -91,8 +91,7 @@ class WrightFisher { //! Initalize SDE, prepare for time integration //! \param[in] stream Thread (or more precisely stream) ID //! \param[in,out] particles Array of particle properties - void initialize( int stream, tk::Particles& particles ) { - IGNORE( stream ); + void initialize( [[maybe_unused]] int stream, tk::Particles& particles ) { //! Set initial conditions using initialization policy //Init::template // init< tag::wrightfisher > diff --git a/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.cpp b/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.cpp index c6ae2c760cb..45f5e853105 100644 --- a/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.cpp +++ b/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.cpp @@ -16,7 +16,7 @@ #include "WrightFisherCoeffPolicy.hpp" walker::WrightFisherCoeffConst::WrightFisherCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_omega::info::expect::type >& omega_, std::vector< kw::sde_omega::info::expect::type >& omega ) // ***************************************************************************** diff --git a/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.hpp b/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.hpp index ad15dfec53a..95f00e3904a 100644 --- a/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.hpp +++ b/src/DiffEq/WrightFisher/WrightFisherCoeffPolicy.hpp @@ -15,7 +15,7 @@ coefficient vector, omega. Required signature: \code{.cpp} CoeffPolicyName( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_omega::info::expect::type >& omega_, std::vector< kw::sde_omega::info::expect::type >& omega ) \endcode @@ -56,7 +56,7 @@ class WrightFisherCoeffConst { public: //! Constructor: initialize coefficients WrightFisherCoeffConst( - tk::ctr::ncomp_type ncomp, + tk::ctr::ncomp_t ncomp, const std::vector< kw::sde_omega::info::expect::type >& omega_, std::vector< kw::sde_omega::info::expect::type >& omega ); diff --git a/src/IO/CMakeLists.txt b/src/IO/CMakeLists.txt index 18255447f2c..fa1cf6f12b7 100644 --- a/src/IO/CMakeLists.txt +++ b/src/IO/CMakeLists.txt @@ -13,6 +13,7 @@ target_include_directories(IO PUBLIC ${QUINOA_SOURCE_DIR}/Control ${QUINOA_SOURCE_DIR}/Statistics ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} ${PEGTL_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} @@ -46,10 +47,12 @@ target_include_directories(NativeMeshIO PUBLIC ${QUINOA_SOURCE_DIR}/Mesh ${QUINOA_SOURCE_DIR}/Control ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} ${TPL_INCLUDE_DIR} ${CHARM_INCLUDE_DIRS} ${BRIGAND_INCLUDE_DIRS} ${PEGTL_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH} ${PROJECT_BINARY_DIR}/../Main) @@ -72,6 +75,8 @@ target_include_directories(ExodusIIMeshIO PUBLIC ${QUINOA_SOURCE_DIR}/Base ${QUINOA_SOURCE_DIR}/Mesh ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} + ${HIGHWAYHASH_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH}) @@ -94,6 +99,7 @@ if (HAS_OMEGA_H) ${QUINOA_SOURCE_DIR}/Mesh ${TPL_INCLUDE_DIR} ${OMEGA_H_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH}) @@ -117,6 +123,7 @@ if (HAS_ROOT) ${QUINOA_SOURCE_DIR}/Base ${QUINOA_SOURCE_DIR}/Mesh ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} ${ROOT_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH}) @@ -139,6 +146,7 @@ target_include_directories(HyperMeshIO PUBLIC ${QUINOA_SOURCE_DIR}/Base ${QUINOA_SOURCE_DIR}/Mesh ${TPL_INCLUDE_DIR} + ${HIGHWAYHASH_INCLUDE_DIRS} ${PUGIXML_INCLUDE_DIRS}) set_target_properties(HyperMeshIO PROPERTIES LIBRARY_OUTPUT_NAME @@ -177,8 +185,10 @@ target_include_directories(MeshWriter PUBLIC ${PROJECT_BINARY_DIR}/../Main ${PROJECT_BINARY_DIR}/../IO ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} ${PEGTL_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${BRIGAND_INCLUDE_DIRS}) diff --git a/src/IO/FileConvWriter.cpp b/src/IO/FileConvWriter.cpp index d10120835ac..b5fa0c80323 100644 --- a/src/IO/FileConvWriter.cpp +++ b/src/IO/FileConvWriter.cpp @@ -17,8 +17,6 @@ #include #include -#include "Make_unique.hpp" - #include "NoWarning/exodusII.hpp" #include "NoWarning/TFile.hpp" #include "NoWarning/TTree.hpp" @@ -40,10 +38,10 @@ FileConvWriter::FileConvWriter( const std::string& file_root, // ***************************************************************************** { - m_emw = tk::make_unique< tk::ExodusIIMeshWriter > - ( file_exodus.c_str(), tk::ExoWriter::CREATE ); + m_emw = std::make_unique< tk::ExodusIIMeshWriter > + ( file_exodus.c_str(), tk::ExoWriter::CREATE ); - m_infile = tk::make_unique< TFile >( file_root.c_str() ); + m_infile = std::make_unique< TFile >( file_root.c_str() ); // If the ROOT file can be opened, fetch the TTree reference if( m_infile == nullptr ){ diff --git a/src/IO/FileConvWriter.hpp b/src/IO/FileConvWriter.hpp index 18675808658..3d747ad0993 100644 --- a/src/IO/FileConvWriter.hpp +++ b/src/IO/FileConvWriter.hpp @@ -17,13 +17,10 @@ #include #include -#include "Make_unique.hpp" - #include "NoWarning/TFile.hpp" #include "NoWarning/TTree.hpp" #include "NoWarning/TGraph2D.hpp" #include "ExodusIIMeshWriter.hpp" - #include "Types.hpp" namespace tk { diff --git a/src/IO/MeshReader.hpp b/src/IO/MeshReader.hpp index 4390d051179..eb3f05d1edd 100644 --- a/src/IO/MeshReader.hpp +++ b/src/IO/MeshReader.hpp @@ -16,10 +16,10 @@ #include #include #include +#include #include "Types.hpp" #include "MeshDetect.hpp" -#include "Make_unique.hpp" #include "ExodusIIMeshReader.hpp" #ifdef HAS_OMEGA_H @@ -48,11 +48,11 @@ class MeshReader { auto meshtype = detectInput( filename ); if (meshtype == MeshReaderType::EXODUSII) { using R = ExodusIIMeshReader; - self = make_unique< Model >( R(filename) ); + self = std::make_unique< Model >( R(filename) ); #ifdef HAS_OMEGA_H } else if (meshtype == MeshReaderType::OMEGA_H) { using R = Omega_h_MeshReader; - self = make_unique< Model >( R(filename) ); + self = std::make_unique< Model >( R(filename) ); #endif } else Throw( "Mesh type not implemented or not supported" ); } diff --git a/src/IO/MeshWriter.cpp b/src/IO/MeshWriter.cpp index 0740d847121..456bcbaf45a 100644 --- a/src/IO/MeshWriter.cpp +++ b/src/IO/MeshWriter.cpp @@ -166,7 +166,7 @@ MeshWriter::filename( const std::string& basefilename, int chareid ) const // ***************************************************************************** // Compute filename -//! \param[in basefilename File name to append to +//! \param[in] basefilename String use as the base filename. //! \param[in] itr Iteration count since a new mesh. New mesh in this context //! means that either the mesh is moved and/or its topology has changed. //! \param[in] chareid The chare id the write-to-file request is coming from diff --git a/src/IO/MeshWriter.hpp b/src/IO/MeshWriter.hpp index c43ff2239c5..d0a73730696 100644 --- a/src/IO/MeshWriter.hpp +++ b/src/IO/MeshWriter.hpp @@ -38,6 +38,16 @@ class MeshWriter : public CBase_MeshWriter { Centering bnd_centering, bool benchmark ); + #if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wundefined-func-template" + #endif + //! Migrate constructor + explicit MeshWriter( CkMigrateMessage* m ) : CBase_MeshWriter( m ) {} + #if defined(__clang__) + #pragma clang diagnostic pop + #endif + //! Set the total number of chares void nchare( int n ); @@ -60,13 +70,31 @@ class MeshWriter : public CBase_MeshWriter { const std::vector< std::vector< tk::real > >& nodefields, CkCallback c ); + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \note This is a Charm++ group, pup() is thus only for + //! checkpoint/restart. + void pup( PUP::er &p ) override { + p | m_filetype; + p | m_bndCentering; + p | m_benchmark; + p | m_nchare; + } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] m MeshWriter object reference + friend void operator|( PUP::er& p, MeshWriter& m ) { m.pup(p); } + //@} + private: //! Output file format type - const ctr::FieldFileType m_filetype; + ctr::FieldFileType m_filetype; //! Centering to identify what boundary data to write. - const Centering m_bndCentering; + Centering m_bndCentering; //! True if benchmark mode - const bool m_benchmark; + bool m_benchmark; //! Total number chares across the whole problem int m_nchare; diff --git a/src/IO/Omega_h_MeshReader.cpp b/src/IO/Omega_h_MeshReader.cpp index c69e1e2efd8..34e862f92e1 100644 --- a/src/IO/Omega_h_MeshReader.cpp +++ b/src/IO/Omega_h_MeshReader.cpp @@ -23,10 +23,11 @@ void Omega_h_MeshReader::readMeshPart( std::vector< std::size_t >& ginpoel, std::vector< std::size_t >& inpoel, - std::vector< std::size_t >& triinp, + [[maybe_unused]] std::vector< std::size_t >& triinp, std::unordered_map< std::size_t, std::size_t >& lid, tk::UnsMesh::Coords& coord, - int numpes, int mype ) + int numpes, + [[maybe_unused]] int mype ) // ***************************************************************************** // Read a part of the mesh (graph and coordinates) from Omega_h file //! \param[in,out] ginpoel Container to store element connectivity of this PE's @@ -50,9 +51,6 @@ Omega_h_MeshReader::readMeshPart( //! called on in parallel. // ***************************************************************************** { - IGNORE( mype ); // Avoid compiler warning in Release mode - IGNORE( triinp ); - Assert( mype < numpes, "Invalid input: PE id must be lower than NumPEs" ); Assert( ginpoel.empty() && inpoel.empty() && lid.empty() && coord[0].empty() && coord[1].empty() && coord[2].empty(), @@ -132,39 +130,34 @@ Omega_h_MeshReader::readMeshPart( std::vector< std::size_t > Omega_h_MeshReader::triinpoel( - std::map< int, std::vector< std::size_t > >& bface, - const std::map< int, std::vector< std::size_t > >& faces, - const std::vector< std::size_t >& ginpoel, - const std::vector< std::size_t >& triinp ) const + [[maybe_unused]] std::map< int, std::vector< std::size_t > >& bface, + [[maybe_unused]] const std::map< int, std::vector< std::size_t > >& faces, + [[maybe_unused]] const std::vector< std::size_t >& ginpoel, + [[maybe_unused]] const std::vector< std::size_t >& triinp ) const // ***************************************************************************** // ... //! \note Must be preceded by a call to readElemBlockIDs() // ***************************************************************************** { - IGNORE(bface); - IGNORE(faces); - IGNORE(ginpoel); - IGNORE(triinp); std::vector< std::size_t > bnd_triinpoel; return bnd_triinpoel; } void Omega_h_MeshReader::readSidesetFaces( - std::map< int, std::vector< std::size_t > >& bface, - std::map< int, std::vector< std::size_t > >& faces ) + [[maybe_unused]] std::map< int, std::vector< std::size_t > >& bface, + [[maybe_unused]] std::map< int, std::vector< std::size_t > >& faces ) // ***************************************************************************** // Read side sets from Omega_h file //! \param[in,out] bface Elem ids of side sets to read into //! \param[in,out] faces Elem-relative face ids of tets of side sets // ***************************************************************************** { -IGNORE(bface); -IGNORE(faces); } void -Omega_h_MeshReader::readFaces( std::vector< std::size_t >& conn ) const +Omega_h_MeshReader::readFaces( + [[maybe_unused]] std::vector< std::size_t >& conn ) const // ***************************************************************************** // Read face connectivity of a number of boundary faces from Omega_h file //! \param[in,out] conn Connectivity vector to push to @@ -172,7 +165,6 @@ Omega_h_MeshReader::readFaces( std::vector< std::size_t >& conn ) const //! also called triangle-elements, and their connectivity. // ***************************************************************************** { -IGNORE(conn); } std::map< int, std::vector< std::size_t > > diff --git a/src/IO/PDFWriter.cpp b/src/IO/PDFWriter.cpp index b86ad0c7362..d2f48c97817 100644 --- a/src/IO/PDFWriter.cpp +++ b/src/IO/PDFWriter.cpp @@ -84,6 +84,7 @@ PDFWriter::writeTxt( const UniPDF& pdf, const tk::ctr::PDFInfo& info ) const << '\n' << "# Number of bins output: " << nbi << '\n' << "# Sample space extent: [" << min << " : " << max << "]\n" + << "# Integral: " << pdf.integral() << "\n" << "# Iteration: " << it << "\n" << "# Physical time: " << time << "\n#\n" << "# Example step-by-step visualization with gnuplot\n" diff --git a/src/IO/PDFWriter.hpp b/src/IO/PDFWriter.hpp index b70a9320b07..0c6a61bb965 100644 --- a/src/IO/PDFWriter.hpp +++ b/src/IO/PDFWriter.hpp @@ -74,10 +74,8 @@ class PDFWriter : public tk::Writer { private: //! Assert the number of sample space dimensions given template< std::size_t size, class Container > - void assertSampleSpaceDimensions( const Container& c ) const { - #ifdef NDEBUG - IGNORE(c); - #endif + void assertSampleSpaceDimensions( [[maybe_unused]] const Container& c ) + const { Assert( c.size() == size, "Number of sample space variables must equal " + std::to_string( size ) + " in PDF writer." ); diff --git a/src/IO/TxtStatWriter.cpp b/src/IO/TxtStatWriter.cpp index b3ad75dc360..0359deebbb7 100644 --- a/src/IO/TxtStatWriter.cpp +++ b/src/IO/TxtStatWriter.cpp @@ -24,7 +24,7 @@ TxtStatWriter::TxtStatWriter( const std::string& filename, std::ios_base::openmode mode ) : Writer( filename, mode ), m_precision( static_cast(precision) ), - m_width( std::max( 16, m_precision+8 ) ) + m_width( std::max( 20, m_precision+8 ) ) // ***************************************************************************** // Constructor //! \param[in] filename Output filename to which output the statistics diff --git a/src/IO/meshwriter.ci b/src/IO/meshwriter.ci index 99b2f3734a7..1279b0da8ac 100644 --- a/src/IO/meshwriter.ci +++ b/src/IO/meshwriter.ci @@ -21,7 +21,7 @@ module meshwriter { namespace tk { - group MeshWriter { + group [migratable] MeshWriter { entry MeshWriter( ctr::FieldFileType filetype, Centering bnd_centering, diff --git a/src/Inciter/ALECG.cpp b/src/Inciter/ALECG.cpp index ddf4ac4b9b5..d95e8239c2e 100644 --- a/src/Inciter/ALECG.cpp +++ b/src/Inciter/ALECG.cpp @@ -62,22 +62,16 @@ ALECG::ALECG( const CProxy_Discretization& disc, m_rhs( m_u.nunk(), m_u.nprop() ), m_lhsc(), m_rhsc(), - m_vol( 0.0 ), m_diag() // ***************************************************************************** // Constructor //! \param[in] disc Discretization proxy -//! \param[in] bface Boundary-faces mapped to side set ids //! \param[in] bnode Boundary-node lists mapped to side set ids -//! \param[in] triinpoel Boundary-face connectivity // ***************************************************************************** //! [Constructor] { usesAtSync = true; // enable migration at AtSync - // Size communication buffers - resizeComm(); - // Activate SDAG wait for initially computing the left-hand side thisProxy[ thisIndex ].wait4lhs(); @@ -87,32 +81,11 @@ ALECG::ALECG( const CProxy_Discretization& disc, } //! [Constructor] -void -ALECG::resizeComm() -// ***************************************************************************** -// Size communication buffers -//! \details The size of the communication buffers are determined based on -//! Disc()->Bid.size() and m_u.nprop(). -// ***************************************************************************** -{ - auto d = Disc(); - - auto np = m_u.nprop(); - auto nb = d->Bid().size(); - m_lhsc.resize( nb ); - for (auto& b : m_lhsc) b.resize( np ); - m_rhsc.resize( nb ); - for (auto& b : m_rhsc) b.resize( np ); - - // Zero communication buffers - for (auto& b : m_lhsc) std::fill( begin(b), end(b), 0.0 ); -} - void ALECG::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types initiated from this chare array -//! \details Since this is a [nodeinit] routine, the runtime system executes the +//! \details Since this is a [initnode] routine, the runtime system executes the //! routine exactly once on every logical node early on in the Charm++ init //! sequence. Must be static as it is called without an object. See also: //! Section "Initializations at Program Startup" at in the Charm++ manual @@ -132,21 +105,17 @@ ALECG::ResumeFromSync() { if (Disc()->It() == 0) Throw( "it = 0 in ResumeFromSync()" ); - if (!g_inputdeck.get< tag::cmd, tag::nonblocking >()) dt(); + if (!g_inputdeck.get< tag::cmd, tag::nonblocking >()) next(); } void -ALECG::setup( tk::real v ) +ALECG::setup() // ***************************************************************************** // Setup rows, query boundary conditions, output mesh, etc. -//! \param[in] v Total mesh volume // ***************************************************************************** { auto d = Disc(); - // Store total mesh volume - m_vol = v; - // Set initial conditions for all PDEs for (const auto& eq : g_cgpde) eq.initialize( d->Coord(), m_u, d->T() ); @@ -166,40 +135,6 @@ ALECG::init() } //! [init and lhs] -//! [Merge lhs and continue] -void -ALECG::lhsmerge() -// ***************************************************************************** -// The own and communication portion of the left-hand side is complete -// ***************************************************************************** -{ - // Combine own and communicated contributions to left hand side - auto d = Disc(); - - // Combine own and communicated contributions to LHS and ICs - for (const auto& b : d->Bid()) { - auto lid = tk::cref_find( d->Lid(), b.first ); - const auto& blhsc = m_lhsc[ b.second ]; - for (ncomp_t c=0; cTimer().zero(); // Start time stepping by computing the size of the next time step) - dt(); + next(); } //! [Compute own and send lhs on chare-boundary] @@ -261,9 +196,7 @@ ALECG::comlhs( const std::vector< std::size_t >& gid, auto d = Disc(); for (std::size_t i=0; iBid(), gid[i] ); - Assert( bid < m_lhsc.size(), "Indexing out of bounds" ); - m_lhsc[ bid ] += L[i]; + m_lhsc[ gid[i] ] += L[i]; } // When we have heard from all chares we communicate with, this chare is done @@ -274,6 +207,40 @@ ALECG::comlhs( const std::vector< std::size_t >& gid, } //! [Receive lhs on chare-boundary] +//! [Merge lhs and continue] +void +ALECG::lhsmerge() +// ***************************************************************************** +// The own and communication portion of the left-hand side is complete +// ***************************************************************************** +{ + // Combine own and communicated contributions to left hand side + auto d = Disc(); + + // Combine own and communicated contributions to LHS and ICs + for (const auto& b : m_lhsc) { + auto lid = tk::cref_find( d->Lid(), b.first ); + for (ncomp_t c=0; cTr()) ); + CkCallback(CkReductionTarget(ALECG,advance), thisProxy) ); //! [Advance] } @@ -361,16 +328,12 @@ ALECG::comrhs( const std::vector< std::size_t >& gid, using tk::operator+=; - auto d = Disc(); - for (std::size_t i=0; iBid(), gid[i] ); - Assert( bid < m_rhsc.size(), "Indexing out of bounds" ); - m_rhsc[ bid ] += R[i]; + m_rhsc[ gid[i] ] += R[i]; } // When we have heard from all chares we communicate with, this chare is done - if (++m_nrhs == d->Msum().size()) { + if (++m_nrhs == Disc()->Msum().size()) { m_nrhs = 0; comrhs_complete(); } @@ -387,14 +350,13 @@ ALECG::solve() auto d = Disc(); // Combine own and communicated contributions to rhs - for (const auto& b : d->Bid()) { + for (const auto& b : m_rhsc) { auto lid = tk::cref_find( d->Lid(), b.first ); - const auto& brhsc = m_rhsc[ b.second ]; - for (ncomp_t c=0; cnext(); - // Signal that diagnostics have been computed (or in this case, skipped) - if (!diag_computed) diag(); - // Optionally refine mesh - refine(); + // Continue to mesh refinement (if configured) + if (!diag_computed) refine(); //! [Continue after solve] } -void -ALECG::writeFields( CkCallback c ) const -// ***************************************************************************** -// Output mesh-based fields to file -//! \param[in] c Function to continue with after the write -// ***************************************************************************** -{ - auto d = Disc(); - - // Query and collect field names from PDEs integrated - std::vector< std::string > nodefieldnames; - for (const auto& eq : g_cgpde) { - auto n = eq.fieldNames(); - nodefieldnames.insert( end(nodefieldnames), begin(n), end(n) ); - } - - // Collect node field solution - auto u = m_u; - std::vector< std::vector< tk::real > > nodefields; - for (const auto& eq : g_cgpde) { - auto o = eq.fieldOutput( d->T(), m_vol, d->Coord(), d->V(), u ); - nodefields.insert( end(nodefields), begin(o), end(o) ); - } - - // Send mesh and fields data (solution dump) for output to file - d->write( d->Inpoel(), d->Coord(), {}, tk::remap(m_bnode,d->Lid()), {}, {}, - nodefieldnames, {}, nodefields, c ); -} - -void -ALECG::advance( tk::real newdt ) -// ***************************************************************************** -// Advance equations to next time step -//! \param[in] newdt Size of this new time step -// ***************************************************************************** -{ - auto d = Disc(); - - // Set new time step size - d->setdt( newdt ); - - // Compute rhs for next time step - rhs(); -} - -void -ALECG::diag() -// ***************************************************************************** -// Signal the runtime system that diagnostics have been computed -// ***************************************************************************** -{ - diag_complete(); -} - void ALECG::refine() // ***************************************************************************** @@ -480,13 +386,18 @@ ALECG::refine() // if t>0 refinement enabled and we hit the frequency if (dtref && !(d->It() % dtfreq)) { // refine + // Activate SDAG waits for re-computing the left-hand side + thisProxy[ thisIndex ].wait4lhs(); + + d->startvol(); d->Ref()->dtref( {}, m_bnode, {} ); + d->refined() = 1; } else { // do not refine - ref_complete(); + d->refined() = 0; lhs_complete(); - resize_complete(); + resized(); } //! [Refine] @@ -494,7 +405,7 @@ ALECG::refine() //! [Resize] void -ALECG::resizeAfterRefined( +ALECG::resizePostAMR( const std::vector< std::size_t >& /*ginpoel*/, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, @@ -512,9 +423,7 @@ ALECG::resizeAfterRefined( //! \param[in] addedNodes Newly added mesh nodes and their parents (local ids) //! \param[in] addedTets Newly added mesh cells and their parents (local ids) //! \param[in] msum New node communication map -//! \param[in] bface Boundary-faces mapped to side set ids //! \param[in] bnode Boundary-node lists mapped to side set ids -//! \param[in] triinpoel Boundary-face connectivity // ***************************************************************************** { auto d = Disc(); @@ -529,7 +438,7 @@ ALECG::resizeAfterRefined( ++d->Itr(); // Resize mesh data structures - d->resize( chunk, coord, msum ); + d->resizePostAMR( chunk, coord, msum ); // Resize auxiliary solution vectors auto npoin = coord[0].size(); @@ -547,17 +456,63 @@ ALECG::resizeAfterRefined( // Update physical-boundary node lists m_bnode = bnode; - // Resize communication buffers - resizeComm(); + contribute( CkCallback(CkReductionTarget(Transporter,resized), d->Tr()) ); +} +//! [Resize] - // Activate SDAG waits for re-computing the left-hand side - thisProxy[ thisIndex ].wait4lhs(); +void +ALECG::resized() +// ***************************************************************************** +// Resizing data sutrctures after mesh refinement has been completed +// ***************************************************************************** +{ + resize_complete(); +} - ref_complete(); +void +ALECG::writeFields( CkCallback c ) const +// ***************************************************************************** +// Output mesh-based fields to file +//! \param[in] c Function to continue with after the write +// ***************************************************************************** +{ + auto d = Disc(); + + // Query and collect field names from PDEs integrated + std::vector< std::string > nodefieldnames; + for (const auto& eq : g_cgpde) { + auto n = eq.fieldNames(); + nodefieldnames.insert( end(nodefieldnames), begin(n), end(n) ); + } - contribute( CkCallback(CkReductionTarget(Transporter,workresized), d->Tr()) ); + // Collect node field solution + auto u = m_u; + std::vector< std::vector< tk::real > > nodefields; + for (const auto& eq : g_cgpde) { + auto o = eq.fieldOutput( d->T(), d->meshvol(), d->Coord(), d->V(), u ); + nodefields.insert( end(nodefields), begin(o), end(o) ); + } + + // Send mesh and fields data (solution dump) for output to file + d->write( d->Inpoel(), d->Coord(), {}, tk::remap(m_bnode,d->Lid()), {}, {}, + nodefieldnames, {}, nodefields, c ); +} + +void +ALECG::advance( tk::real newdt ) +// ***************************************************************************** +// Advance equations to next time step +//! \param[in] newdt Size of this new time step +// ***************************************************************************** +{ + auto d = Disc(); + + // Set new time step size + d->setdt( newdt ); + + // Compute rhs for next time step + rhs(); } -//! [Resize] void ALECG::out() @@ -581,10 +536,57 @@ ALECG::out() step(); } +void +ALECG::evalLB() +// ***************************************************************************** +// Evaluate whether to do load balancing +// ***************************************************************************** +{ + auto d = Disc(); + + const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); + const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); + + // Load balancing if user frequency is reached or after the second time-step + if ( (d->It()) % lbfreq == 0 || d->It() == 2 ) { + + AtSync(); + if (nonblocking) next(); + + } else { + + next(); + + } +} + +void +ALECG::evalRestart() +// ***************************************************************************** +// Evaluate whether to save checkpoint/restart +// ***************************************************************************** +{ + auto d = Disc(); + + const auto rsfreq = g_inputdeck.get< tag::cmd, tag::rsfreq >(); + + if ( (d->It()) % rsfreq == 0 ) { + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,checkpoint), d->Tr()) ); + + } else { + + evalLB(); + + } +} + void ALECG::step() // ***************************************************************************** -// Evaluate whether to continue with next step +// Evaluate whether to continue with next time step // ***************************************************************************** { auto d = Disc(); @@ -595,22 +597,18 @@ ALECG::step() const auto term = g_inputdeck.get< tag::discr, tag::term >(); const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); const auto eps = std::numeric_limits< tk::real >::epsilon(); - const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); - const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); // If neither max iterations nor max time reached, continue, otherwise finish if (std::fabs(d->T()-term) > eps && d->It() < nstep) { - if ( (d->It()) % lbfreq == 0 ) { - AtSync(); - if (nonblocking) dt(); - } - else { - dt(); - } + evalRestart(); } else { - d->contribute( CkCallback( CkReductionTarget(Transporter,finish), d->Tr() ) ); + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,finish), d->Tr()) ); + } } diff --git a/src/Inciter/ALECG.hpp b/src/Inciter/ALECG.hpp index dcd67dbca3b..82398a88d17 100644 --- a/src/Inciter/ALECG.hpp +++ b/src/Inciter/ALECG.hpp @@ -80,7 +80,7 @@ class ALECG : public CBase_ALECG { #endif //! Migrate constructor // cppcheck-suppress uninitMemberVar - explicit ALECG( CkMigrateMessage* ) {} + explicit ALECG( CkMigrateMessage* msg ) : CBase_ALECG( msg ) {} #if defined(__clang__) #pragma clang diagnostic pop #endif @@ -91,8 +91,11 @@ class ALECG : public CBase_ALECG { //! Return from migration void ResumeFromSync() override; + //! Size communication buffers (no-op) + void resizeComm() {} + //! Setup: query boundary conditions, output mesh, etc. - void setup( tk::real v ); + void setup(); // Initially compute left hand side diagonal matrix void init(); @@ -114,14 +117,11 @@ class ALECG : public CBase_ALECG { //! Update solution at the end of time step void update( const tk::Fields& a ); - //! Signal the runtime system that diagnostics have been computed - void diag(); - //! Optionally refine/derefine mesh void refine(); //! Receive new mesh from refiner - void resizeAfterRefined( + void resizePostAMR( const std::vector< std::size_t >& ginpoel, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, @@ -142,6 +142,12 @@ class ALECG : public CBase_ALECG { //! Evaluate whether to continue with next time step void step(); + // Evaluate whether to do load balancing + void evalLB(); + + //! Continue to next time step + void next(); + /** @name Charm++ pack/unpack serializer member functions */ ///@{ //! \brief Pack/Unpack serialize member function @@ -159,7 +165,6 @@ class ALECG : public CBase_ALECG { p | m_rhs; p | m_lhsc; p | m_rhsc; - p | m_vol; p | m_diag; } //! \brief Pack/Unpack serialize operator| @@ -191,10 +196,12 @@ class ALECG : public CBase_ALECG { tk::Fields m_lhs; //! Right-hand side vector (for the high order system) tk::Fields m_rhs; - //! Receive buffers for communication - std::vector< std::vector< tk::real > > m_lhsc, m_rhsc; - //! Total mesh volume - tk::real m_vol; + //! Receive buffer for communication of the left hand side + //! \details Key: chare id, value: lhs for all scalar components per node + std::unordered_map< std::size_t, std::vector< tk::real > > m_lhsc; + //! Receive buffer for communication of the right hand side + //! \details Key: chare id, value: rhs for all scalar components per node + std::unordered_map< std::size_t, std::vector< tk::real > > m_rhsc; //! Diagnostics object NodeDiagnostics m_diag; @@ -204,18 +211,12 @@ class ALECG : public CBase_ALECG { return m_disc[ thisIndex ].ckLocal(); } - //! Size communication buffers - void resizeComm(); - //! Output mesh and particle fields to files void out(); //! Output mesh-based fields to file void writeFields( CkCallback c ) const; - //! The own and communication portion of the left-hand side is complete - void lhsdone(); - //! Combine own and communicated contributions to left hand side void lhsmerge(); @@ -230,6 +231,9 @@ class ALECG : public CBase_ALECG { //! Compute time step size void dt(); + + //! Evaluate whether to save checkpoint/restart + void evalRestart(); }; } // inciter:: diff --git a/src/Inciter/AMR/AMR_types.hpp b/src/Inciter/AMR/AMR_types.hpp index 9764464c676..0da510e939a 100644 --- a/src/Inciter/AMR/AMR_types.hpp +++ b/src/Inciter/AMR/AMR_types.hpp @@ -114,6 +114,9 @@ using EdgeData = tk::UnsMesh::Hash<2>, tk::UnsMesh::Eq<2> >; +//! Enum used to tag an edge for refinement or derefinement +enum class edge_tag : uint8_t { REFINE, DEREFINE }; + } // AMR:: #endif diff --git a/src/Inciter/AMR/Refinement_State.hpp b/src/Inciter/AMR/Refinement_State.hpp index e693d2fad85..ee4fc93b626 100644 --- a/src/Inciter/AMR/Refinement_State.hpp +++ b/src/Inciter/AMR/Refinement_State.hpp @@ -20,6 +20,9 @@ namespace AMR { enum Refinement_Case { initial_grid = 0, one_to_two, one_to_four, one_to_eight, two_to_eight, four_to_eight, none }; + enum Derefinement_Case { two_to_one = 0, four_to_one, four_to_two, + eight_to_one, eight_to_two, eight_to_four, skip }; + class Refinement_State { public: diff --git a/src/Inciter/AMR/active_element_store.hpp b/src/Inciter/AMR/active_element_store.hpp index fcfb31da56c..2c0862dfffa 100644 --- a/src/Inciter/AMR/active_element_store.hpp +++ b/src/Inciter/AMR/active_element_store.hpp @@ -2,6 +2,7 @@ #define AMR_active_element_store_h #include +#include namespace AMR { diff --git a/src/Inciter/AMR/marked_refinements_store.hpp b/src/Inciter/AMR/marked_refinements_store.hpp index 671502d448d..fa9f3044cc4 100644 --- a/src/Inciter/AMR/marked_refinements_store.hpp +++ b/src/Inciter/AMR/marked_refinements_store.hpp @@ -1,24 +1,37 @@ #ifndef AMR_marked_refinements_store_h #define AMR_marked_refinements_store_h -#include +#include #include "Refinement_State.hpp" namespace AMR { - class marked_refinements_store_t { + /** + * @brief This class stores the decisions made during the iterative AMR + * algorithm. + * + * The template parameter determines the internal enum type. + */ + template class marked_refinements_store_t { private: - std::map marked_refinements; + // TODO: make this have a more generic name + std::unordered_map marked_refinements; - // TODO: This probably isn't the right place for this + // TODO: This may not be right place for this // We will use this variable to check if anything has changed // during a round of refinement marking - bool refinement_state_changed = false; + bool state_changed = false; public: + //! Const-ref access to number of tets + //! \return Map of marked refinements + std::size_t size() const { + return marked_refinements.size(); + } + //! Non-const-ref access to state //! \return Map of marked refinements - std::map& data() { + std::unordered_map& data() { return marked_refinements; } @@ -50,14 +63,18 @@ namespace AMR { * * @return The marked refinement case for the given tet */ - Refinement_Case& get(size_t id) + case_t& get(size_t id) { + // TODO: is there any performance hit for at? return marked_refinements.at(id); } void erase(size_t id) { - marked_refinements[id] = Refinement_Case::none; + //marked_refinements[id] = case_t::none; + + // Changing to actually erase + marked_refinements.erase(id); } /** @@ -67,7 +84,7 @@ namespace AMR { * @param id The id of the tet to mark * @param r The refinement decision for the tet */ - void add(size_t id, Refinement_Case r) + void add(size_t id, case_t r) { // Check if that active element already exists if (exists(id)) @@ -80,7 +97,7 @@ namespace AMR { marked_refinements[id] = r; // TODO :Find a better way to handle/update this global - refinement_state_changed = true; + state_changed = true; } else { trace_out << "Not setting marked refinement val as same val"<< std::endl; @@ -88,31 +105,19 @@ namespace AMR { } else { trace_out << "Adding new marked value " << id << " = " << r << std::endl; - marked_refinements.insert( std::pair(id, r)); - refinement_state_changed = true; + marked_refinements.insert( std::pair(id, r)); + state_changed = true; } } - // TODO: document this - // jbakosi changed this to a bool-ref so that the state can be PUPed + /** + * @brief Accessor for variable which tracks state change + * + * @return Bool stating is the state has changed + */ bool& get_state_changed() { - return refinement_state_changed; - } - - // TODO: document this - void set_state_changed(bool t) - { - refinement_state_changed = t; - } - - void replace(size_t old_id, size_t new_id) - { - // Swap id out in map - auto i = marked_refinements.find(old_id); - auto value = i->second; - marked_refinements.erase(i); - marked_refinements[new_id] = value; + return state_changed; } }; } diff --git a/src/Inciter/AMR/master_element_store.hpp b/src/Inciter/AMR/master_element_store.hpp index 9f00fd5842d..66e72f4d788 100644 --- a/src/Inciter/AMR/master_element_store.hpp +++ b/src/Inciter/AMR/master_element_store.hpp @@ -3,6 +3,7 @@ #include #include +#include #include "Refinement_State.hpp" #include "AMR/Loggers.hpp" // for trace_out diff --git a/src/Inciter/AMR/mesh_adapter.cpp b/src/Inciter/AMR/mesh_adapter.cpp index 40de9e0107c..ad2fbef0e14 100644 --- a/src/Inciter/AMR/mesh_adapter.cpp +++ b/src/Inciter/AMR/mesh_adapter.cpp @@ -105,24 +105,42 @@ namespace AMR { mark_refinement(); } + /** + * @brief Helper function to apply uniform derefinement to all tets + */ + void mesh_adapter_t::mark_uniform_derefinement() + { + for (auto& kv : tet_store.edge_store.edges) { + auto& local = kv.second; + if (local.lock_case == Edge_Lock_Case::unlocked) + local.needs_derefining = 1; + } + mark_derefinement(); + } + + /** * @brief For a given set of edges, set their refinement criteria for * refinement * - * @param edge vector of edges to set the refinement criteria of - * @param crit values to set to corresponding edges refinement criteria - * @param lock values of lock case to set for edges + * @param remote Vector of edges and edge tags */ void mesh_adapter_t::mark_error_refinement( - const std::vector< edge_t >& remote ) + const std::vector< std::pair< edge_t, edge_tag > >& remote ) { - for (std::size_t e=0; e Edge_Lock_Case::unlocked) + for (const auto& r : remote) { + auto& local = tet_store.edge_store.get( r.first ); + if (r.second == edge_tag::REFINE) { + if (local.lock_case > Edge_Lock_Case::unlocked) { local.needs_refining = 0; - else + } else { local.needs_refining = 1; + } + } else if (r.second == edge_tag::DEREFINE) { + if (local.lock_case == Edge_Lock_Case::unlocked) { + local.needs_derefining = 1; + } + } } mark_refinement(); @@ -146,7 +164,9 @@ namespace AMR { * of intermediate edges * * @param num_locked_edges The number of locked edges + * @param num_intermediate_edges The number of intermediate edges * @param refinement_case The refinement case of the tet + * @param normal TODO: Document this! * * @return The compatibili4y class of the current scenario */ @@ -265,7 +285,7 @@ namespace AMR { for (iter = 0; iter < max_num_rounds; iter++) { - tet_store.marked_refinements.set_state_changed(false); + tet_store.marked_refinements.get_state_changed() = false; // Loop over Tets. for (const auto& kv : tet_store.tets) @@ -391,7 +411,6 @@ namespace AMR { //std::cout << "Print Tets" << std::endl; //print_tets(); - } /** @@ -465,12 +484,12 @@ namespace AMR { if (element.children.size() == 2) { trace_out << "perform 2:8" << std::endl; - refiner.derefine_two_to_one(tet_store,i); + refiner.derefine_two_to_one(tet_store,node_connectivity,i); } else if (element.children.size() == 4) { trace_out << "perform 4:8" << std::endl; - refiner.derefine_four_to_one(tet_store,i); + refiner.derefine_four_to_one(tet_store,node_connectivity,i); } else { std::cout << "num children " << element.children.size() << std::endl; @@ -484,7 +503,7 @@ namespace AMR { // I want to set the children stored in *my* own children, to be // the value of my new children.... - refiner.overwrite_children(tet_store, former_children, current_children); + //refiner.overwrite_children(tet_store, former_children, current_children); tet_store.unset_marked_children(i); // FIXME: This will not work well in parallel element.refinement_case = AMR::Refinement_Case::one_to_eight; @@ -509,6 +528,11 @@ namespace AMR { remove_normals(); lock_intermediates(); + + for (auto& kv : tet_store.edge_store.edges) { + auto& local = kv.second; + local.needs_refining = 0; + } } void mesh_adapter_t::lock_intermediates() @@ -527,7 +551,6 @@ namespace AMR { * @brief A method implementing "Algorithm 1" from the paper * * @param num_to_refine Number of edges to refine - * @param edge_list The list of the edges for the tet * @param tet_id The id of the given tet */ void mesh_adapter_t::refinement_class_one(int num_to_refine, size_t tet_id) @@ -1053,144 +1076,309 @@ namespace AMR { } } - /* - void mesh_adapter_t::check_derefinement() { - // Go over edges and check if it needs derefining - // TODO: This could be implicit based of refinement_criteria value? - for (auto& kv : tet_store.edge_store.edges) + std::unordered_set mesh_adapter_t::child_exclusive_nodes(size_t tet_id) + { + std::unordered_set non_parent_nodes; + + // array + auto parent_tet = tet_store.get(tet_id); + + // convert to set + std::unordered_set parent_set(begin(parent_tet), end(parent_tet)); + + child_id_list_t children = tet_store.data(tet_id).children; + for (size_t i = 0; i < children.size(); i++) { - // Mark them as needing refinement - if (kv.second.refinement_criteria > derefinement_cut_off) - { - kv.second.needs_derefining = true; - } - else + auto child_tet = tet_store.get( children[i] ); + + // Look at nodes, if not present add to set + for (std::size_t j = 0; j < NUM_TET_NODES; j++) { - // TODO: Check this won't be overwriting valuable information from last iteration - kv.second.needs_derefining = false; + auto node = child_tet[j]; + if (parent_set.count(node) == 0) + { + non_parent_nodes.insert(node); + } } } - // Loop over tets - for (const auto& kv : tet_store.tets) - { + trace_out <<" Found " << non_parent_nodes.size() << " non parent nodes " << std::endl; + return non_parent_nodes; - size_t tet_id = kv.first; + } - // This is useful for later inspection - edge_list_t edge_list = tet_store.generate_edge_keys(tet_id); - int num_to_derefine = 0; + void mesh_adapter_t::mark_derefinement() + { + const size_t max_num_rounds = AMR_MAX_ROUNDS; - AMR::Refinement_Case refinement_case = tet_store.get_refinement_case(tet_id); - for (size_t k = 0; k < NUM_TET_EDGES; k++) + // Mark refinements + size_t iter; + //Iterate until convergence + for (iter = 0; iter < max_num_rounds; iter++) + { + tet_store.marked_derefinements.get_state_changed() = false; + + // Loop over tets + for (const auto& kv : tet_store.tets) { - edge_t edge = edge_list[k]; + size_t tet_id = kv.first; - // Count edges which need refining - if (tet_store.edge_store.get(edge).needs_derefining) - { - num_to_derefine++; - } - } + // Skip tets which have no children + child_id_list_t children = tet_store.data(tet_id).children; + if (children.size() <= 0) { continue; } - // "If nderefine = 1 - if (num_to_derefine == 1) - { - // If icase = 1:2 + // This is useful for later inspection + //edge_list_t edge_list = tet_store.generate_edge_keys(tet_id); + std::size_t num_to_derefine = 0; // Nodes + + // Do number of points + std::unordered_set derefine_node_set; - if (refinement_case == AMR::Refinement_Case::one_to_two) + AMR::Refinement_Case refinement_case = tet_store.get_refinement_case(tet_id); + + // Find the set of nodes which are not in the parent + std::unordered_set non_parent_nodes = child_exclusive_nodes(tet_id); + + + // Look at children + trace_out << tet_id << " Looping over " << children.size() << "children" << std::endl; + for (size_t i = 0; i < children.size(); i++) { - // Accept as 2:1 derefine" - refiner.derefine_two_to_one(tet_id); + // TODO: Is this in element or tet ids? + edge_list_t edge_list = tet_store.generate_edge_keys(children[i]); + for (size_t k = 0; k < NUM_TET_EDGES; k++) + { + edge_t edge = edge_list[k]; + // TODO: where do we makr the edges that need to be derefed? parent of child? + if (tet_store.edge_store.get(edge).needs_derefining) + { + // Check each node, see if its an intermediate + size_t A = edge.first(); + size_t B = edge.second(); + trace_out << "Needs deref " << A << " - " << B << std::endl; + + //if (tet_store.is_intermediate(A)) + if (non_parent_nodes.count(A) ) + { + trace_out << "Adding " << A << std::endl; + derefine_node_set.insert(A); + } + + //if (tet_store.is_intermediate(B)) + if (non_parent_nodes.count(B)) + { + trace_out << "Adding " << B << std::endl; + derefine_node_set.insert(B); + } + } + } } - // "Else - else { - // Deactivate all points" - deactivate_tet_edges(tet_id); + + num_to_derefine = derefine_node_set.size(); + + if (num_to_derefine > 0) { + trace_out << "num_to_derefine " << num_to_derefine << std::endl; + trace_out << "ref_case " << refinement_case << std::endl; + trace_out << "num children " << children.size() << std::endl; } - } + //num_to_derefine = convert_derefine_edges_to_points(tet_store, tet_id, num_edges_to_derefine, refinement_case); - // "If nderefine = 2 - else if (num_to_derefine == 2) - { - // If icase = 1:4 - if (refinement_case == AMR::Refinement_Case::one_to_four) + // "If nderefine = 1 + if (num_to_derefine == 1) { - // Accept as 4:2 derefine" - refiner.derefine_four_to_two(tet_id); + // If icase = 1:2 + + //if (refinement_case == AMR::Refinement_Case::one_to_two) + if (children.size() == 2) + { + // Accept as 2:1 derefine" + trace_out << "Accept as 2:1" << std::endl; + //refiner.derefine_two_to_one(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::two_to_one); + } + // "Else + else { + // Deactivate all points" + deactivate_tet_edges(tet_id); + trace_out << "giving up on deref decision. deactivate near 2:1 ntd = 1" << std::endl; + } } - // "Else - else { - // Deactivate all points" - deactivate_tet_edges(tet_id); + + + // "If nderefine = 2 + else if (num_to_derefine == 2) + { + // If icase = 1:4 + //if (refinement_case == AMR::Refinement_Case::one_to_four) + if (children.size() == 4) + { + // Accept as 4:2 derefine" + trace_out << "Accept as 4:2" << std::endl; + //refiner.derefine_four_to_two(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::four_to_two); + } + // "Else + else { + // Deactivate all points" + deactivate_tet_edges(tet_id); + trace_out << "giving up on deref decision. deactivate near 4:2 ntd = 2" << std::endl; + } } - } - // "If nderefine = 3 - else if (num_to_derefine == 3) - { - // If icase = 1:4 - if (refinement_case == AMR::Refinement_Case::one_to_four) + // "If nderefine = 3 + else if (num_to_derefine == 3) { - // Accept as 4:2 derefine" - refiner.derefine_four_to_two(tet_id); + // If icase = 1:4 + //if (refinement_case == AMR::Refinement_Case::one_to_four) + if (children.size() == 4) + { + // Accept as 4:2 derefine" + trace_out << "Accept as 4:1" << std::endl; + //refiner.derefine_four_to_two(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::four_to_one); + } + // "Else if icase = 1:8 + //else if (refinement_case == AMR::Refinement_Case::one_to_eight) + else if (children.size() == 8) + { + bool same_face = false; // TODO: This + // If inactive points lie on same face + if (same_face == true) + { + // Accept as 8:4 derefinement + trace_out << "Accept as 8:4" << std::endl; + //refiner.derefine_eight_to_four(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::eight_to_four); + } + // "Else + else { + // Deactivate all points" + deactivate_tet_edges(tet_id); + trace_out << "giving up on deref decision. deactivate near 8:4 ntd = 3" << std::endl; + } + + } } - // "Else if icase = 1:8 - else if (refinement_case == AMR::Refinement_Case::one_to_eight) + + // "If nderefine = 4 + else if (num_to_derefine == 4) + //else if (children.size() == 4) { + // If inactive points lie on the same face bool same_face = false; // TODO: This - // If inactive points lie on same face if (same_face == true) { + // Deactivate third point of face + // TODO: Deactivate third face + // Accept as 8:4 derefinement - refiner.derefine_eight_to_four(tet_id); + trace_out << "Accept as 8:4" << std::endl; + //refiner.derefine_eight_to_four(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::eight_to_four); } // "Else else { // Deactivate all points" deactivate_tet_edges(tet_id); + trace_out << "giving up on deref decision. deactivate near 8:4 ntd = 4" << std::endl; } - } - } - // "If nderefine = 4 - else if (num_to_derefine == 4) - { - // If inactive points lie on the same face - bool same_face = false; // TODO: This - if (same_face == true) + // "If nderefine = 5 + else if (num_to_derefine == 5) { - // Deactivate third point of face - // TODO: Deactivate third face + // Accept as 8:2 derefine" + // TODO: MAKE THIS 8:2 NOT 8:1 + trace_out << "Accept as 8:2 " << std::endl; + //refiner.derefine_eight_to_two(tet_store, node_connectivity, tet_id); + //tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::eight_to_two); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::eight_to_two); + } - // Accept as 8:4 derefinement - refiner.derefine_eight_to_four(tet_id); + // "If nderefine = 6 + else if (num_to_derefine == 6) + { + // Accept as 8:1 derefine" + trace_out << "Accept as 8:1" << std::endl; + //refiner.derefine_eight_to_one(tet_store, node_connectivity, tet_id); + tet_store.mark_derefinement_decision(tet_id, AMR::Derefinement_Case::eight_to_one); } - // "Else + else { - // Deactivate all points" - deactivate_tet_edges(tet_id); + trace_out << "giving up with no deref decision" << std::endl; } } - // "If nderefine = 5 - else if (num_to_derefine == 5) + // If nothing changed during that round, break + if (!tet_store.marked_derefinements.get_state_changed()) { - // Accept as 8:2 derefine" - refiner.derefine_eight_to_two(tet_id); + trace_out << "Terminating loop at iter " << iter << std::endl; + break; } + trace_out << "End iter " << iter << std::endl; + } + trace_out << "Deref Loop took " << iter << " rounds." << std::endl; + } - // "If nderefine = 8 - else if (num_to_derefine == 6) + // TODO: document + void mesh_adapter_t::perform_derefinement() + { + trace_out << "Perform deref" << std::endl; + + // Do derefinements + for (const auto& kv : tet_store.tets) + { + size_t tet_id = kv.first; + //size_t parent_id = 0; + + // TODO: Do I really want to loop all tets? + + // TODO: is this doing a double lookup? + if (tet_store.has_derefinement_decision(tet_id)) { - // Accept as 8:1 derefine" - refiner.derefine_eight_to_one(tet_id); + trace_out << "Do derefine of " << tet_id << std::endl; + //size_t parent_id = tet_store.get_parent_id(tet_id); + //trace_out << "Parent = " << parent_id << std::endl; + switch(tet_store.marked_derefinements.get(tet_id)) + { + case AMR::Derefinement_Case::two_to_one: + refiner.derefine_two_to_one(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::four_to_one: + refiner.derefine_four_to_one(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::four_to_two: + refiner.derefine_four_to_two(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::eight_to_one: + refiner.derefine_eight_to_one(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::eight_to_two: + refiner.derefine_eight_to_two(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::eight_to_four: + refiner.derefine_eight_to_four(tet_store,node_connectivity,tet_id); + break; + case AMR::Derefinement_Case::skip: + // What do we do with skip? + break; + } + // Mark tet as not needing refinement + tet_store.marked_derefinements.erase(tet_id); } } + + node_connectivity.print(); + tet_store.process_delete_list(); + tet_store.print_node_types(); + + for (auto& kv : tet_store.edge_store.edges) { + auto& local = kv.second; + local.needs_derefining = 0; + } } - */ + } #if defined(__clang__) diff --git a/src/Inciter/AMR/mesh_adapter.hpp b/src/Inciter/AMR/mesh_adapter.hpp index 79bc9a5b4e1..c7d6a9d42bf 100644 --- a/src/Inciter/AMR/mesh_adapter.hpp +++ b/src/Inciter/AMR/mesh_adapter.hpp @@ -55,7 +55,9 @@ namespace AMR { void evaluate_error_estimate(); void mark_uniform_refinement(); - void mark_error_refinement( const std::vector< edge_t >& edge ); + void mark_uniform_derefinement(); + void mark_error_refinement( + const std::vector< std::pair< edge_t, edge_tag > >& remote ); void mark_error_refinement_corr( const EdgeData& edges ); int detect_compatibility( @@ -78,7 +80,8 @@ namespace AMR { void deactivate_tet_edges(size_t tet_id); bool check_valid_refinement_case(size_t child_id); - void check_derefinement(); + void mark_derefinement(); + void perform_derefinement(); //std::vector< std::size_t >& get_active_inpoel(); void print_tets(); @@ -88,6 +91,12 @@ namespace AMR { void remove_edge_locks(int intermediate = 0); void remove_normals(); + size_t convert_derefine_edges_to_points( + size_t num_edges_to_derefine, + AMR::Refinement_Case refinement_case); + + std::unordered_set child_exclusive_nodes(size_t tet_id); + }; } diff --git a/src/Inciter/AMR/refinement.hpp b/src/Inciter/AMR/refinement.hpp index 5f094dd09a9..3aca4f347bc 100644 --- a/src/Inciter/AMR/refinement.hpp +++ b/src/Inciter/AMR/refinement.hpp @@ -38,6 +38,7 @@ namespace AMR { * @brief function to detect when an invalid refinement is * invoked * + * @param tet_store Tet store to use * @param tet_id Id the of the tet which will be refined * * @return A bool stating if the tet can be validly refined @@ -70,6 +71,8 @@ namespace AMR { * @brief Method which takes a tet id, and deduces the other * parameters needed to perform a 1:2 * + * @param tet_store Tet store to use + * @param node_connectivity Mesh node connectivity (graph) * @param tet_id The id to refine 1:2 */ void refine_one_to_two( tet_store_t& tet_store, node_connectivity_t& node_connectivity, size_t tet_id) @@ -79,13 +82,10 @@ namespace AMR { refine_one_to_two( tet_store, node_connectivity, tet_id, nodes[0], nodes[1]); } - /** - * @brief Method which takes a tet id, and transforms arguments - * into the form needed for the main 1:2 refinement method - * - * @param tet_id The id to refine 1:2 - */ /* + //! @brief Method which takes a tet id, and transforms arguments + //! into the form needed for the main 1:2 refinement method + //! @param tet_id The id to refine 1:2 void refine_one_to_two( size_t tet_id, std::string edge_key @@ -101,6 +101,8 @@ namespace AMR { * @brief Refine a given tet id into 2 children. * NOTE: Does not do any validity checking (currently?) * + * @param tet_store Tet store to use + * @param node_connectivity Mesh node connectivity (graph) * @param tet_id Id of tet to refine * @param edge_node_A_id The first node of id of the edge which * will be split @@ -196,6 +198,8 @@ namespace AMR { * @brief Method which takes a tet id, and deduces the other * parameters needed to perform a 1:4 * + * @param tet_store Tet store to use + * @param node_connectivity Mesh node connectivity (graph) * @param tet_id The id to refine 1:4 */ void refine_one_to_four( tet_store_t& tet_store, @@ -272,6 +276,8 @@ namespace AMR { * @brief Refine a given tet id into 4 children. * NOTE: Does not do any validity checking (currently?) * + * @param tet_store Tet store to use + * @param node_connectivity Mesh node connectivity (graph) * @param tet_id The id of the tet to refine * @param face_ids The ids which make the face to be split * @param opposite_id The remaining id which is "opposite" the @@ -412,6 +418,8 @@ namespace AMR { * @brief Refine a given tet id into 8 children. * NOTE: Does not do any validity checking (currently?) * + * @param tet_store Tet store to use + * @param node_connectivity Mesh node connectivity (graph) * @param tet_id Id of tet to refine */ void refine_one_to_eight( tet_store_t& tet_store, @@ -578,6 +586,7 @@ namespace AMR { * // NOTE: this is _currently_ trivial, but will be nice if we for * example swap data stores to a map * + * @param tet_store Tet store to use * @param tet tet of the tet to look for * @param element offset into that tet to look at * @@ -593,6 +602,7 @@ namespace AMR { * single (or first?º edge which needs to be refined in an given * edge_list * + * @param tet_store Tet store to use * @param edge_list The edge list to search for a refinement edge * * @return The node pair which represent the edge which needs @@ -709,6 +719,7 @@ namespace AMR { /** * @brief Function to iterate over children and remove them * + * @param tet_store Tet store to use * @param parent_id Id of the parent for whom you will delete the * children */ @@ -718,8 +729,8 @@ namespace AMR { Refinement_State& parent = tet_store.data(parent_id); for (auto c : parent.children) { - //tet_store.erase(c); - tet_store.deactivate(c); + tet_store.erase(c); + //tet_store.deactivate(c); /* auto children = tet_store.data(c).children; @@ -739,6 +750,7 @@ namespace AMR { * @brief Common code for derefinement. Deactives the children and * actives the parent * + * @param tet_store Tet store to use * @param parent_id The id of the parent */ void generic_derefine(tet_store_t& tet_store, size_t parent_id) @@ -747,25 +759,46 @@ namespace AMR { tet_store.activate(parent_id); } - // TODO: Document This. - void derefine_two_to_one(tet_store_t& tet_store, size_t parent_id) + /** + * @brief Perform 2->1 derefinement on tet + * + * @param tet_store Tet store to use + * @param parent_id The id of the parent + */ + void derefine_two_to_one(tet_store_t& tet_store, node_connectivity_t&, size_t parent_id) { + //if (!check_allowed_derefinement(tet_store,parent_id)) return; delete_intermediates_of_children( tet_store, parent_id); generic_derefine(tet_store,parent_id); } - // TODO: Document This. - void derefine_four_to_one(tet_store_t& tet_store, size_t parent_id) + /** + * @brief Perform 4->1 derefinement on tet + * + * @param tet_store Tet store to use + * @param parent_id The id of the parent + */ + void derefine_four_to_one(tet_store_t& tet_store, node_connectivity_t&, size_t parent_id) { + //if (!check_allowed_derefinement(tet_store,parent_id)) return; delete_intermediates_of_children(tet_store, parent_id); generic_derefine(tet_store,parent_id); } - // TODO: Document This. - void derefine_eight_to_one(tet_store_t& tet_store, size_t parent_id) + /** + * @brief Perform 8->1 derefinement on tet + * + * @param tet_store Tet store to use + * @param parent_id The id of the parent + */ + void derefine_eight_to_one(tet_store_t& tet_store, node_connectivity_t&, size_t parent_id) { + //if (!check_allowed_derefinement(tet_store,parent_id)) return; + generic_derefine(tet_store,parent_id); + // TODO: Do we delete the nodes? Do we even have nodes? + // Delete the center edges // If edge isn't in the parent, delete it? Is there a better way? edge_list_t parent_edges = tet_store.generate_edge_keys(parent_id); @@ -779,28 +812,35 @@ namespace AMR { } // TODO: Document This. - /* - void derefine_four_to_two(size_t parent_id) + void derefine_four_to_two(tet_store_t& tet_store, node_connectivity_t& node_connectivity, size_t parent_id) { - assert(0); + //if (!check_allowed_derefinement(tet_store,parent_id)) return; + derefine_four_to_one(tet_store, node_connectivity, parent_id); + // TODO: actually do the refinement + refine_one_to_two( tet_store, node_connectivity, parent_id); } // TODO: Document This. - void derefine_eight_to_two(size_t parent_id) + void derefine_eight_to_two(tet_store_t& tet_store, node_connectivity_t& node_connectivity, size_t parent_id) { - assert(0); + //if (!check_allowed_derefinement(tet_store,parent_id)) return; + derefine_eight_to_one(tet_store, node_connectivity, parent_id); + refine_one_to_two( tet_store, node_connectivity, parent_id); } // TODO: Document This. - void derefine_eight_to_four(size_t parent_id) + void derefine_eight_to_four(tet_store_t& tet_store, node_connectivity_t& node_connectivity, size_t parent_id) { - assert(0); + //if (!check_allowed_derefinement(tet_store,parent_id)) return; + // TODO: think about if the logic for these derefs are right + derefine_eight_to_one(tet_store, node_connectivity, parent_id); + refine_one_to_four( tet_store, node_connectivity, parent_id); } - */ /** * @brief Loop over children and delete all intermediate edges * + * @param tet_store Tet store to use * @param parent_id Id of parent */ void delete_intermediates_of_children( tet_store_t& tet_store, size_t parent_id) @@ -812,7 +852,12 @@ namespace AMR { } } - // TODO: Document this + /** + * @brief TODO: Document this! + * + * @param tet_store Tet store to use + * @param tet_id TODO: document this! + */ void delete_intermediates( tet_store_t& tet_store, size_t tet_id) { edge_list_t edge_list = tet_store.generate_edge_keys(tet_id); @@ -833,6 +878,7 @@ namespace AMR { * @brief If edge in candidate is not present in basis, delete the * edge (candidate) from the main edge store * + * @param tet_store Tet store to use * @param candidate The edge list which is to be searched and deleted * @param basis The edge list to check against */ @@ -874,6 +920,7 @@ namespace AMR { * @brief function to detect when an invalid derefinement is * invoked * + * @param tet_store Tet store to use * @param tet_id Id the of the tet which will be de-refined * * @return A bool stating if the tet can be validly de-refined diff --git a/src/Inciter/AMR/tet_store.hpp b/src/Inciter/AMR/tet_store.hpp index 3455fe0924e..44a4f37e4b6 100644 --- a/src/Inciter/AMR/tet_store.hpp +++ b/src/Inciter/AMR/tet_store.hpp @@ -22,6 +22,8 @@ namespace AMR { // wanted a quick-fix so I could move on :( std::set center_tets; // Store for 1:4 centers + std::set delete_list; // For marking deletions in deref + AMR::active_element_store_t active_elements; AMR::master_element_store_t master_elements; @@ -38,7 +40,8 @@ namespace AMR { AMR::edge_store_t edge_store; // TODO: Make this (and others) private at some point - AMR::marked_refinements_store_t marked_refinements; + AMR::marked_refinements_store_t marked_refinements; + AMR::marked_refinements_store_t marked_derefinements; /** * @brief function to return the number of tets stored @@ -750,6 +753,36 @@ namespace AMR { return master_elements.get_parent(id); } + // Deref + void process_delete_list() + { + trace_out << "process_delete_list " << delete_list.size() << std::endl; + size_t original_size = size(); + for(auto f : delete_list) { + erase(f); + } + + size_t end_size = size(); + trace_out << "Deleted " << original_size-end_size << std::endl; + + delete_list.clear(); + } + /** + * @brief Function to mark a given tet as a specific Derefinement_Case + * + * @param tet_id The tet to mark + * @param decision The Derefinement_case to set + */ + void mark_derefinement_decision(size_t tet_id, AMR::Derefinement_Case decision) + { + trace_out << "MARKING_DEREF_DECISION" << std::endl; + marked_derefinements.add(tet_id, decision); + } + bool has_derefinement_decision(size_t id) + { + return marked_derefinements.exists(id); + } + }; } diff --git a/src/Inciter/CMakeLists.txt b/src/Inciter/CMakeLists.txt index 24799cdd170..0da4ec14660 100644 --- a/src/Inciter/CMakeLists.txt +++ b/src/Inciter/CMakeLists.txt @@ -35,10 +35,12 @@ target_include_directories(Inciter PUBLIC ${QUINOA_SOURCE_DIR}/PDE ${QUINOA_TPL_DIR} ${SEACASExodus_INCLUDE_DIRS} + ${NETCDF_INCLUDES} ${BRIGAND_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} ${PEGTL_INCLUDE_DIRS} ${HYPRE_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${ROOT_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_DIRS} ${MPI_CXX_INCLUDE_PATH} @@ -62,6 +64,7 @@ target_include_directories(MeshRefinement PUBLIC ${QUINOA_SOURCE_DIR}/Inciter ${PEGTL_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${TPL_INCLUDE_DIR} ${BRIGAND_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/../Main) diff --git a/src/Inciter/DG.cpp b/src/Inciter/DG.cpp index e0f4037674e..3d01e80f707 100644 --- a/src/Inciter/DG.cpp +++ b/src/Inciter/DG.cpp @@ -55,13 +55,19 @@ DG::DG( const CProxy_Discretization& disc, m_nlim( 0 ), m_fd( Disc()->Inpoel(), bface, tk::remap(triinpoel,Disc()->Lid()) ), m_u( Disc()->Inpoel().size()/4, - g_inputdeck.get< tag::discr, tag::ndof >()* + g_inputdeck.get< tag::discr, tag::rdof >()* g_inputdeck.get< tag::component >().nprop() ), m_un( m_u.nunk(), m_u.nprop() ), + m_p( m_u.nunk(), + g_inputdeck.get< tag::discr, tag::rdof >()* + std::accumulate( begin(g_dgpde), end(g_dgpde), 0u, + [](std::size_t s, const DGPDE& eq){ return s + eq.nprim(); } ) ), m_geoFace( tk::genGeoFaceTri( m_fd.Nipfac(), m_fd.Inpofa(), Disc()->Coord()) ), m_geoElem( tk::genGeoElemTet( Disc()->Inpoel(), Disc()->Coord() ) ), - m_lhs( m_u.nunk(), m_u.nprop() ), - m_rhs( m_u.nunk(), m_u.nprop() ), + m_lhs( m_u.nunk(), + g_inputdeck.get< tag::discr, tag::ndof >()* + g_inputdeck.get< tag::component >().nprop() ), + m_rhs( m_u.nunk(), m_lhs.nprop() ), m_nfac( m_fd.Inpofa().size()/3 ), m_nunk( m_u.nunk() ), m_ncoord( Disc()->Coord()[0].size() ), @@ -75,6 +81,10 @@ DG::DG( const CProxy_Discretization& disc, m_diag(), m_stage( 0 ), m_ndof(), + m_bid(), + m_uc(), + m_pc(), + m_ndofc(), m_initial( 1 ), m_expChBndFace() // ***************************************************************************** @@ -86,8 +96,46 @@ DG::DG( const CProxy_Discretization& disc, { usesAtSync = true; // enable migration at AtSync - // Size communication buffers and setup ghost data - resizeComm(); + // Enable SDAG wait for setting up chare boundary faces + thisProxy[ thisIndex ].wait4fac(); + + // Ensure that mesh partition is not leaky + Assert( !tk::leakyPartition(m_fd.Esuel(), Disc()->Inpoel(), Disc()->Coord()), + "Input mesh to DG leaky" ); + + // Ensure mesh physical boundary for the entire problem not leaky, + // effectively checking if the user has specified boundary conditions on all + // physical boundary faces + bndIntegral(); +} + +void +DG::bndIntegral() +// ***************************************************************************** +// Compute partial boundary surface integral and sum across all chares +//! \details This function computes a partial surface integral over the boundary +//! of the faces of this mesh partition then sends its contribution to perform +//! the integral acorss the total problem boundary. After the global sum a +//! non-zero vector result indicates a leak, e.g., a hole in the boundary +//! which indicates an error in the boundary face data structures used to +//! compute the partial surface integrals. +// ***************************************************************************** +{ + // Storage for surface integral over our mesh chunk physical boundary + std::vector< tk::real > s{{ 0.0, 0.0, 0.0 }}; + + // Integrate over all physical boundary faces + for (std::size_t f=0; fTr()) ); } void @@ -179,6 +227,8 @@ DG::resizeComm() for (const auto& c : m_msumset) { // for all chares we share nodes with thisProxy[ c.first ].comfac( thisIndex, potbndface ); } + + ownfac_complete(); } bool @@ -200,7 +250,7 @@ DG::leakyAdjacency() // ***************************************************************************** { // Storage for surface integral over our chunk of the adjacency - std::array< tk::real, 3 > s{{ 0.0, 0.0, 0.0}}; + std::array< tk::real, 3 > s{{ 0.0, 0.0, 0.0 }}; // physical boundary faces for (std::size_t f=0; fGid(); - const auto& inpoel = d->Inpoel(); - for (std::size_t e=0; e() ) d->Tr().chcomfac(); - tk::destroy(m_ipface); - - // Ensure all expected faces have been received - Assert( receivedChBndFaces(), - "Expected and received chare boundary faces mismatch" ); + comfac_complete(); + } +} - // Basic error checking on chare-boundary-face map - Assert( m_bndFace.find( thisIndex ) == m_bndFace.cend(), - "Face-communication map should not contain data for own chare ID" ); +void +DG::bndFaces() +// ***************************************************************************** +// Compute chare-boundary faces +//! \details This is called when both send and receives are completed on a +//! chare and thus we are ready to compute chare-boundary faces and ghost data. +// ***************************************************************************** +{ + auto d = Disc(); + if ( g_inputdeck.get< tag::cmd, tag::feedback >() ) d->Tr().chcomfac(); + const auto& esuel = m_fd.Esuel(); + const auto& gid = d->Gid(); + const auto& inpoel = d->Inpoel(); - // Store (local) tet ID adjacent to our chare boundary from the inside + for (const auto& in : m_infaces) { + // Find sender chare among chares we potentially share faces with. Note that + // it is feasible that a sender chare called us but we do not have a set of + // faces associated to that chare. This can happen if we only share a single + // node or an edge but not a face with that chare. + auto& bndface = m_bndFace[ in.first ]; // will associate to sender chare + // Try to find incoming faces on our chare boundary with other chares. If + // found, generate and assign new local face ID, associated to sender chare. for (std::size_t e=0; e -1) { - auto& lbndface = tk::ref_find( m_bndFace, c ); - auto& face = tk::ref_find( lbndface, t ); - face[1] = e; // store (local) inner tet ID adjacent to face + // if found among the incoming faces and if not one of our internal + // nor physical boundary faces + if ( in.second.find(t) != end(in.second) && + m_ipface.find(t) == end(m_ipface) ) { + bndface[t][0] = m_nfac++; // assign new local face ID } } } } + // If at this point if we have not found any face among our faces we + // potentially share with fromch, there is no need to keep an empty set of + // faces associated to fromch as we only share nodes or edges with it, but + // not faces. + if (bndface.empty()) m_bndFace.erase( in.first ); + } + + tk::destroy(m_ipface); + tk::destroy(m_infaces); + + // Ensure all expected faces have been received + Assert( receivedChBndFaces(), + "Expected and received chare boundary faces mismatch" ); + + // Basic error checking on chare-boundary-face map + Assert( m_bndFace.find( thisIndex ) == m_bndFace.cend(), + "Face-communication map should not contain data for own chare ID" ); - // At this point m_bndFace is complete on this PE. This means that starting - // from the sets of faces we potentially share with fellow chares we now - // only have those faces we actually share faces with (through which we need - // to communicate later). Also, m_bndFace not only has the unique faces - // associated to fellow chares, but also a newly assigned local face ID as - // well as the local id of the inner tet adjacent to the face. Continue by - // starting setting up ghost data - setupGhost(); - // Besides setting up our own ghost data, we also issue requests (for ghost - // data) to those chares which we share faces with. Note that similar to - // comfac() we are calling reqGhost() by going through msumset instead, - // which may send requests to those chare we do not share faces with. This - // is so that we can test for completing by querying the size of the already - // complete msumset in reqGhost. Requests in sendGhost will only be - // fullfilled based on m_ghostData. - for (const auto& c : m_msumset) // for all chares we share nodes with - thisProxy[ c.first ].reqGhost(); + // Store (local) tet ID adjacent to our chare boundary from the inside + for (std::size_t e=0; e -1) { + auto& lbndface = tk::ref_find( m_bndFace, c ); + auto& face = tk::ref_find( lbndface, t ); + face[1] = e; // store (local) inner tet ID adjacent to face + } + } + } } + + // At this point m_bndFace is complete on this PE. This means that starting + // from the sets of faces we potentially share with fellow chares we now + // only have those faces we actually share faces with (through which we need + // to communicate later). Also, m_bndFace not only has the unique faces + // associated to fellow chares, but also a newly assigned local face ID as + // well as the local id of the inner tet adjacent to the face. Continue by + // starting setting up ghost data + setupGhost(); + // Besides setting up our own ghost data, we also issue requests (for ghost + // data) to those chares which we share faces with. Note that similar to + // comfac() we are calling reqGhost() by going through msumset instead, + // which may send requests to those chare we do not share faces with. This + // is so that we can test for completing by querying the size of the already + // complete msumset in reqGhost. Requests in sendGhost will only be + // fullfilled based on m_ghostData. + for (const auto& c : m_msumset) // for all chares we share nodes with + thisProxy[ c.first ].reqGhost(); } bool DG::receivedChBndFaces() // ***************************************************************************** // Verify that all chare-boundary faces have been received -//! \return True of all chare-boundary faces have been received +//! \return True if all chare-boundary faces have been received // ***************************************************************************** { auto d = Disc(); @@ -441,7 +508,7 @@ DG::setupGhost() // looping through all of our tets and interrogating all faces that do // not have neighboring tets but we only care about chare-boundary faces // here as only those need ghost data. (esuel may also contain - // physical boundary faces.) + // physical boundary faces) if (c > -1) { // Will store ghost data associated to neighbor chare auto& ghost = m_ghostData[ c ]; @@ -484,8 +551,7 @@ DG::setupGhost() // More in-depth error checking on local ghost data for (const auto& c : m_ghostData) - for (const auto& t : c.second) { - IGNORE(t); + for ([[maybe_unused]] const auto& t : c.second) { Assert( !std::get< 0 >( t.second ).empty(), "Emtpy face vector in ghost data" ); Assert( std::get< 0 >( t.second ).size() % 3 == 0, @@ -561,8 +627,7 @@ DG::comGhost( int fromch, const GhostData& ghost ) auto ncoord = coord[0].size(); // nodelist with fromch, currently only used for an assert - const auto& nl = tk::cref_find( m_msumset, fromch ); - IGNORE(nl); + [[maybe_unused]] const auto& nl = tk::cref_find( m_msumset, fromch ); auto& ghostelem = m_ghost[ fromch ]; // will associate to sender chare @@ -734,9 +799,8 @@ DG::addEsuel( const std::array< std::size_t, 2 >& id, { auto d = Disc(); const auto& inpoel = d->Inpoel(); - const auto& esuf = m_fd.Esuf(); + [[maybe_unused]] const auto& esuf = m_fd.Esuf(); const auto& lid = d->Lid(); - IGNORE(esuf); std::array< tk::UnsMesh::Face, 4 > face; for (std::size_t f = 0; f<4; ++f) @@ -832,10 +896,8 @@ DG::adj() // Error checking on ghost data for(const auto& n : m_ghostData) - for(const auto& i : n.second) { + for([[maybe_unused]] const auto& i : n.second) Assert( i.first < m_fd.Esuel().size()/4, "Sender contains ghost tet id " ); - IGNORE(i); - } // Perform leak test on face geometry data structure enlarged by ghosts Assert( !leakyAdjacency(), "Face adjacency leaky" ); @@ -845,13 +907,28 @@ DG::adj() // Resize solution vectors, lhs and rhs by the number of ghost tets m_u.resize( m_nunk ); m_un.resize( m_nunk ); + m_p.resize( m_nunk ); m_lhs.resize( m_nunk ); m_rhs.resize( m_nunk ); - // Initialize the array of adaptive indicator + // Create a mapping between local ghost tet ids and zero-based boundary ids + std::vector< std::size_t > c( tk::sumvalsize( m_ghost ) ); + std::size_t j = 0; + for (const auto& n : m_ghost) { + for(const auto& i : n.second) { + c[j++] = i.second; + } + } + m_bid = tk::assignLid( c ); + + // Size communication buffer that receives number of degrees of freedom + for (auto& n : m_ndofc) n.resize( m_bid.size() ); + for (auto& u : m_uc) u.resize( m_bid.size() ); + for (auto& p : m_pc) p.resize( m_bid.size() ); + + // Initialize number of degrees of freedom in mesh elements const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); m_ndof.resize( m_nunk, ndof ); - // Ensure that we also have all the geometry and connectivity data // (including those of ghosts) @@ -863,12 +940,10 @@ DG::adj() "Ghost id map should not contain data for own chare ID" ); // Store expected ghost tet IDs - for (const auto& c : m_ghost) - for (const auto& g : c.second) { - IGNORE(g); + for (const auto& n : m_ghost) + for ([[maybe_unused]] const auto& g : n.second) Assert( m_exptGhost.insert( g.second ).second, "Failed to store local tetid as exptected ghost id" ); - } // Signal the runtime system that all workers have received their adjacency contribute( sizeof(int), &m_initial, CkReduction::sum_int, @@ -879,7 +954,7 @@ void DG::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details Since this is a [nodeinit] routine, the runtime system executes the +//! \details Since this is a [initnode] routine, the runtime system executes the //! routine exactly once on every logical node early on in the Charm++ init //! sequence. Must be static as it is called without an object. See also: //! Section "Initializations at Program Startup" at in the Charm++ manual @@ -903,14 +978,11 @@ DG::ResumeFromSync() } void -DG::setup( tk::real v ) +DG::setup() // ***************************************************************************** // Set initial conditions, generate lhs, output mesh -//! \param[in] v Total mesh volume // ***************************************************************************** { - IGNORE(v); - tk::destroy(m_msumset); auto d = Disc(); @@ -925,8 +997,12 @@ DG::setup( tk::real v ) // Set initial conditions for all PDEs for (const auto& eq : g_dgpde) + { eq.initialize( m_lhs, d->Inpoel(), d->Coord(), m_u, d->T(), m_fd.Esuel().size()/4 ); + eq.updatePrimitives( m_u, m_p, m_fd.Esuel().size()/4 ); + } + m_un = m_u; // Start timer measuring time stepping wall clock time @@ -939,23 +1015,10 @@ DG::setup( tk::real v ) void DG::next() // ***************************************************************************** -// Continue to next time step stage -// ***************************************************************************** -{ - auto d = Disc(); - - tk::real fdt = 0.0; - d->contribute( sizeof(tk::real), &fdt, CkReduction::nop, - CkCallback(CkReductionTarget(Transporter,advance), d->Tr()) ); -} - -void -DG::advance( tk::real ) -// ***************************************************************************** // Advance equations to next time step // ***************************************************************************** { - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); if (pref && m_stage == 0) eval_ndof(); @@ -964,16 +1027,20 @@ DG::advance( tk::real ) comsol_complete(); else for(const auto& n : m_ghostData) { - std::vector< std::size_t > tetid; - std::vector< std::vector< tk::real > > u; + std::vector< std::size_t > tetid( n.second.size() ); + std::vector< std::vector< tk::real > > u( n.second.size() ), + prim( n.second.size() ); std::vector< std::size_t > ndof; + std::size_t j = 0; for(const auto& i : n.second) { Assert( i.first < m_fd.Esuel().size()/4, "Sending solution ghost data" ); - tetid.push_back( i.first ); - u.push_back( m_u[i.first] ); + tetid[j] = i.first; + u[j] = m_u[i.first]; + prim[j] = m_p[i.first]; if (pref && m_stage == 0) ndof.push_back( m_ndof[i.first] ); + ++j; } - thisProxy[ n.first ].comsol( thisIndex, tetid, u, ndof ); + thisProxy[ n.first ].comsol( thisIndex, m_stage, tetid, u, prim, ndof ); } ownsol_complete(); @@ -981,21 +1048,30 @@ DG::advance( tk::real ) void DG::comsol( int fromch, + std::size_t fromstage, const std::vector< std::size_t >& tetid, const std::vector< std::vector< tk::real > >& u, + const std::vector< std::vector< tk::real > >& prim, const std::vector< std::size_t >& ndof ) // ***************************************************************************** // Receive chare-boundary solution ghost data from neighboring chares //! \param[in] fromch Sender chare id +//! \param[in] fromstage Sender chare time step stage //! \param[in] tetid Ghost tet ids we receive solution data for //! \param[in] u Solution ghost data +//! \param[in] prim Primitive variables in ghost cells //! \param[in] ndof Number of degrees of freedom for chare-boundary elements -//! \details This function receives contributions to m_u from fellow chares. +//! \details This function receives contributions to the unlimited solution +//! from fellow chares. // ***************************************************************************** { Assert( u.size() == tetid.size(), "Size mismatch in DG::comsol()" ); + Assert( prim.size() == tetid.size(), "Size mismatch in DG::comsol()" ); + + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); + if (pref && fromstage == 0) + Assert( ndof.size() == tetid.size(), "Size mismatch in DG::comsol()" ); // Find local-to-ghost tet id map for sender chare const auto& n = tk::cref_find( m_ghost, fromch ); @@ -1003,9 +1079,14 @@ DG::comsol( int fromch, for (std::size_t i=0; i= m_fd.Esuel().size()/4, "Receiving solution non-ghost data" ); - Assert( j < m_u.nunk(), "Indexing out of bounds in DG::comsol()" ); - for (std::size_t c=0; c(); - const auto ncomp= m_u.nprop()/ndof; + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); + const auto ncomp = m_u.nprop()/rdof; const auto& inpoel = Disc()->Inpoel(); const auto& coord = Disc()->Coord(); + const auto tolref = inciter::g_inputdeck.get< tag::pref, tag::tolref >(); const auto& cx = coord[0]; const auto& cy = coord[1]; @@ -1052,14 +1134,15 @@ DG::eval_ndof() for (std::size_t c=0; c, 5 > dudxi; dudxi[c][0] = 2 * m_u(e, mark+1, 0); dudxi[c][1] = m_u(e, mark+1, 0) + 3.0 * m_u(e, mark+2, 0); - dudxi[c][2] = m_u(e, mark+1, 0) + m_u(e, mark+2, 0) + 4.0 * m_u(e, mark+3, 0); + dudxi[c][2] = m_u(e, mark+1, 0) + m_u(e, mark+2, 0) + + 4.0 * m_u(e, mark+3, 0); // Gradient of unkowns in physical space std::array< std::array< tk::real, 3 >, 5 > dudx; @@ -1080,8 +1163,7 @@ DG::eval_ndof() + dudx[c][1] * dudx[c][1] + dudx[c][2] * dudx[c][2] ); - if( grad > 0.1 ) - sign++; + if (grad > tolref) ++sign; } if(sign > 0) @@ -1162,22 +1244,65 @@ DG::lim() // Compute limiter function // ***************************************************************************** { - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); + + // Combine own and communicated contributions of unlimited solution and + // degrees of freedom in cells (if p-adaptive) + for (const auto& b : m_bid) { + Assert( m_uc[0][b.second].size() == m_u.nprop(), "ncomp size mismatch" ); + Assert( m_pc[0][b.second].size() == m_p.nprop(), "ncomp size mismatch" ); + for (std::size_t c=0; c() > 1) { + if (rdof > 1) { auto d = Disc(); - const auto limiter = g_inputdeck.get< tag::discr, tag::limiter >(); - if (limiter == ctr::LimiterType::WENOP1) - WENO_P1( m_fd.Esuel(), 0, m_u ); - else if (limiter == ctr::LimiterType::SUPERBEEP1) - Superbee_P1( m_fd.Esuel(), d->Inpoel(), m_ndof, 0, d->Coord(), m_u ); + // Reconstruct second-order solution and primitive quantities + // if P0P1 + if (rdof == 4 && inciter::g_inputdeck.get< tag::discr, tag::ndof >() == 1) + for (const auto& eq : g_dgpde) + eq.reconstruct( d->T(), m_geoFace, m_geoElem, m_fd, d->Inpoel(), + d->Coord(), m_u, m_p ); + + for (const auto& eq : g_dgpde) + eq.limit( d->T(), m_geoFace, m_geoElem, m_fd, d->Inpoel(), d->Coord(), + m_ndof, m_u, m_p ); } - contribute( CkCallback( CkReductionTarget(DG,sendLim), thisProxy ) ); + // Send limited solution to neighboring chares + if (m_ghostData.empty()) + comlim_complete(); + else + for(const auto& n : m_ghostData) { + std::vector< std::size_t > tetid( n.second.size() ); + std::vector< std::vector< tk::real > > u( n.second.size() ), + prim( n.second.size() ); + std::vector< std::size_t > ndof; + std::size_t j = 0; + for(const auto& i : n.second) { + Assert( i.first < m_fd.Esuel().size()/4, "Sending limiter ghost data" ); + tetid[j] = i.first; + u[j] = m_u[i.first]; + prim[j] = m_p[i.first]; + if (pref && m_stage == 0) ndof.push_back( m_ndof[i.first] ); + ++j; + } + thisProxy[ n.first ].comlim( thisIndex, tetid, u, prim, ndof ); + } + + ownlim_complete(); } void @@ -1190,7 +1315,7 @@ DG::propagate_ndof() { const auto& esuf = m_fd.Esuf(); - // Copy m_ndof + // Copy number of degrees of freedom for each cell auto ndof = m_ndof; // p-refine (DGP0 -> DGP1) all neighboring elements of elements that have @@ -1206,61 +1331,35 @@ DG::propagate_ndof() if (m_ndof[er] == 4) ndof[el] = 4; } - // Copy the updated version of ndof to m_ndof - m_ndof = ndof; -} -void -DG::sendLim() -// ***************************************************************************** -// Send limited solution to neighboring chares -// ***************************************************************************** -{ - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); - - if (g_inputdeck.get< tag::discr, tag::ndof >() > 1) { - if (m_ghostData.empty()) - comlim_complete(); - else - for(const auto& n : m_ghostData) { - std::vector< std::size_t > tetid; - std::vector< std::vector< tk::real > > limU; - std::vector< std::size_t > ndof; - for(const auto& i : n.second) { - Assert( i.first < m_fd.Esuel().size()/4, "Sending limiter ghost data" ); - tetid.push_back( i.first ); - limU.push_back( m_u[i.first] ); - if (pref && m_stage == 0) ndof.push_back( m_ndof[i.first] ); - } - thisProxy[ n.first ].comlim( thisIndex, tetid, limU, ndof ); - } - - } else { - - comlim_complete(); - - } - - ownlim_complete(); + // Update number of degrees of freedom for each cell + m_ndof = ndof; } void DG::comlim( int fromch, const std::vector< std::size_t >& tetid, - const std::vector< std::vector< tk::real > >& lfn, + const std::vector< std::vector< tk::real > >& u, + const std::vector< std::vector< tk::real > >& prim, const std::vector< std::size_t >& ndof ) // ***************************************************************************** // Receive chare-boundary limiter ghost data from neighboring chares //! \param[in] fromch Sender chare id //! \param[in] tetid Ghost tet ids we receive solution data for -//! \param[in] lfn Limited high-order solution +//! \param[in] u Limited high-order solution +//! \param[in] prim Limited high-order primitive quantities //! \param[in] ndof Number of degrees of freedom for chare-boundary elements -//! \details This function receives contributions to m_u from fellow chares. +//! \details This function receives contributions to the limited solution from +//! fellow chares. // ***************************************************************************** { - Assert( lfn.size() == tetid.size(), "Size mismatch in DG::comlim()" ); + Assert( u.size() == tetid.size(), "Size mismatch in DG::comlim()" ); + Assert( prim.size() == tetid.size(), "Size mismatch in DG::comlim()" ); + + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); + if (pref && m_stage == 0) + Assert( ndof.size() == tetid.size(), "Size mismatch in DG::comlim()" ); // Find local-to-ghost tet id map for sender chare const auto& n = tk::cref_find( m_ghost, fromch ); @@ -1268,12 +1367,15 @@ DG::comlim( int fromch, for (std::size_t i=0; i= m_fd.Esuel().size()/4, "Receiving solution non-ghost data" ); - Assert( j < m_u.nunk(), "Indexing out of bounds in DG::comlim()" ); - Assert( lfn[i].size() == m_u.nprop(), "size mismatch in received " - "limU in DG::comlim()" ); - for (std::size_t c=0; c::max(); + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); auto d = Disc(); + // Combine own and communicated contributions of limited solution and degrees + // of freedom in cells (if p-adaptive) + for (const auto& b : m_bid) { + Assert( m_uc[1][b.second].size() == m_u.nprop(), "ncomp size mismatch" ); + Assert( m_pc[1][b.second].size() == m_p.nprop(), "ncomp size mismatch" ); + for (std::size_t c=0; c::max(); + if (m_stage == 0) { auto const_dt = g_inputdeck.get< tag::discr, tag::dt >(); @@ -1309,8 +1429,8 @@ DG::dt() // find the minimum dt across all PDEs integrated for (const auto& eq : g_dgpde) { - auto eqdt = eq.dt( d->Coord(), d->Inpoel(), m_fd, m_geoFace, m_geoElem, - m_u ); + auto eqdt = + eq.dt( d->Coord(), d->Inpoel(), m_fd, m_geoFace, m_geoElem, m_ndof, m_u ); if (eqdt < mindt) mindt = eqdt; } @@ -1328,8 +1448,7 @@ DG::dt() // Scale smallest dt with CFL coefficient and the CFL is scaled by (2*p+1) // where p is the order of the DG polynomial by linear stability theory. - mindt *= g_inputdeck.get< tag::discr, tag::cfl >() - / (2.0*dgp + 1.0); + mindt *= g_inputdeck.get< tag::discr, tag::cfl >() / (2.0*dgp + 1.0); } } @@ -1355,26 +1474,28 @@ DG::solve( tk::real newdt ) thisProxy[ thisIndex ].wait4lim(); auto d = Disc(); + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); + const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); + const auto neq = m_u.nprop()/rdof; // Set new time step size if (m_stage == 0) d->setdt( newdt ); - const auto pref = inciter::g_inputdeck.get< tag::discr, tag::pref >(); + const auto pref = inciter::g_inputdeck.get< tag::pref, tag::pref >(); if (pref && m_stage == 0) { // When the element are coarsened, high order term should be zero for(std::size_t e = 0; e < m_nunk; e++) { - const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); - const auto ncomp= m_u.nprop()/ndof; + const auto ncomp= m_u.nprop()/rdof; if(m_ndof[e] == 1) { for (std::size_t c=0; cT(), m_geoFace, m_geoElem, m_fd, d->Inpoel(), d->Coord(), m_u, - m_ndof, m_rhs ); + m_p, m_ndof, m_rhs ); // Explicit time-stepping using RK3 to discretize time-derivative - m_u = rkcoef[0][m_stage] * m_un - + rkcoef[1][m_stage] * ( m_u + d->Dt() * m_rhs/m_lhs ); + for(std::size_t e=0; eDt() * m_rhs(e, mark, 0)/m_lhs(e, mark, 0) ); + } + + // Update primitives based on the evolved solution + for (const auto& eq : g_dgpde) + eq.updatePrimitives( m_u, m_p, m_fd.Esuel().size()/4 ); if (m_stage < 2) { @@ -1398,8 +1531,6 @@ DG::solve( tk::real newdt ) } else { - thisProxy[ thisIndex ].wait4recompghost(); - // Compute diagnostics, e.g., residuals auto diag_computed = m_diag.compute( *d, m_u.nunk()-m_fd.Esuel().size()/4, m_geoElem, m_ndof, m_u ); @@ -1407,29 +1538,10 @@ DG::solve( tk::real newdt ) // Increase number of iterations and physical time d->next(); - // Signal that diagnostics have been computed (or in this case, skipped) - if (!diag_computed) diag(); - // Optionally refine mesh - refine(); - } -} - -void -DG::resized() -// ***************************************************************************** -// Resizing data sutrctures after mesh refinement has been completed -// ***************************************************************************** -{ - resize_complete(); -} + // Continue to mesh refinement (if configured) + if (!diag_computed) refine(); -void -DG::diag() -// ***************************************************************************** -// Signal the runtime system that diagnostics have been computed -// ***************************************************************************** -{ - diag_complete(); + } } void @@ -1446,20 +1558,20 @@ DG::refine() // if t>0 refinement enabled and we hit the dtref frequency if (dtref && !(d->It() % dtfreq)) { // refine + d->startvol(); d->Ref()->dtref( m_fd.Bface(), {}, tk::remap(m_fd.Triinpoel(),d->Gid()) ); d->refined() = 1; } else { // do not refine - ref_complete(); - resize_complete(); d->refined() = 0; + stage(); } } void -DG::resizeAfterRefined( +DG::resizePostAMR( const std::vector< std::size_t >& /*ginpoel*/, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, @@ -1471,14 +1583,11 @@ DG::resizeAfterRefined( const std::vector< std::size_t >& triinpoel ) // ***************************************************************************** // Receive new mesh from refiner -//! \param[in] ginpoel Mesh connectivity with global node ids //! \param[in] chunk New mesh chunk (connectivity and global<->local id maps) //! \param[in] coord New mesh node coordinates -//! \param[in] addedNodes Newly added mesh nodes and their parents (local ids) //! \param[in] addedTets Newly added mesh cells and their parents (local ids) //! \param[in] msum New node communication map //! \param[in] bface Boundary-faces mapped to side set ids -//! \param[in] bnode Boundary-node lists mapped to side set ids //! \param[in] triinpoel Boundary-face connectivity // ***************************************************************************** { @@ -1494,23 +1603,21 @@ DG::resizeAfterRefined( ++d->Itr(); // Save old number of elements - auto old_nelem = d->Inpoel().size()/4; - IGNORE(old_nelem); + [[maybe_unused]] auto old_nelem = d->Inpoel().size()/4; // Resize mesh data structures - d->resize( chunk, coord, msum ); + d->resizePostAMR( chunk, coord, msum ); // Update state auto nelem = d->Inpoel().size()/4; - auto nprop = m_u.nprop(); + auto nprop = m_p.nprop(); + m_p.resize( nelem, nprop ); + nprop = m_u.nprop(); m_u.resize( nelem, nprop ); m_un.resize( nelem, nprop ); m_lhs.resize( nelem, nprop ); m_rhs.resize( nelem, nprop ); - auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - m_ndof.resize( nelem, ndof ); - m_fd = FaceData( d->Inpoel(), bface, tk::remap(triinpoel,d->Lid()) ); m_geoFace = @@ -1527,26 +1634,22 @@ DG::resizeAfterRefined( // Update solution on new mesh, P0 (cell center value) only for now m_un = m_u; + auto pn = m_p; for (const auto& e : addedTets) { Assert( e.first < nelem, "Indexing out of new solution vector" ); Assert( e.second < old_nelem, "Indexing out of old solution vector" ); for (std::size_t c=0; cTr()) ); -} - -void -DG::recompGhostRefined() -// ***************************************************************************** -// Start recomputing ghost data after a mesh refinement step -// ***************************************************************************** -{ - if (Disc()->refined()) resizeComm(); else stage(); + // Resize communication buffers + resizeComm(); } void @@ -1585,6 +1688,53 @@ DG::stage() if (m_stage < 3) next(); else out(); } +void +DG::evalLB() +// ***************************************************************************** +// Evaluate whether to do load balancing +// ***************************************************************************** +{ + auto d = Disc(); + + const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); + const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); + + // Load balancing if user frequency is reached or after the second time-step + if ( (d->It()) % lbfreq == 0 || d->It() == 2 ) { + + AtSync(); + if (nonblocking) next(); + + } else { + + next(); + + } +} + +void +DG::evalRestart() +// ***************************************************************************** +// Evaluate whether to save checkpoint/restart +// ***************************************************************************** +{ + auto d = Disc(); + + const auto rsfreq = g_inputdeck.get< tag::cmd, tag::rsfreq >(); + + if ( (d->It()) % rsfreq == 0 ) { + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,checkpoint), d->Tr()) ); + + } else { + + evalLB(); + + } +} + void DG::step() // ***************************************************************************** @@ -1601,23 +1751,18 @@ DG::step() const auto term = g_inputdeck.get< tag::discr, tag::term >(); const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); const auto eps = std::numeric_limits< tk::real >::epsilon(); - const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); - const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); // If neither max iterations nor max time reached, continue, otherwise finish if (std::fabs(d->T()-term) > eps && d->It() < nstep) { - // Load balancing if user frequency is reached or after the second time-step - if ( (d->It()) % lbfreq == 0 || d->It() == 2 ) { - AtSync(); - if (nonblocking) next(); - } - else { - next(); - } - + evalRestart(); + } else { - contribute(CkCallback( CkReductionTarget(Transporter,finish), d->Tr() )); + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,finish), d->Tr()) ); + } } diff --git a/src/Inciter/DG.hpp b/src/Inciter/DG.hpp index f2f21d1db9f..f44dbc3e52b 100644 --- a/src/Inciter/DG.hpp +++ b/src/Inciter/DG.hpp @@ -76,7 +76,7 @@ class DG : public CBase_DG { #endif //! Migrate constructor // cppcheck-suppress uninitMemberVar - explicit DG( CkMigrateMessage* ) {} + explicit DG( CkMigrateMessage* msg ) : CBase_DG( msg ) {} #if defined(__clang__) #pragma clang diagnostic pop #endif @@ -84,6 +84,9 @@ class DG : public CBase_DG { //! Return from migration void ResumeFromSync() override; + //! Start sizing communication buffers and setting up ghost data + void resizeComm(); + //! Receive unique set of faces we potentially share with/from another chare void comfac( int fromch, const tk::UnsMesh::FaceSet& infaces ); @@ -100,42 +103,42 @@ class DG : public CBase_DG { static void registerReducers(); //! Setup: query boundary conditions, output mesh, etc. - void setup( tk::real v ); + void setup(); - //! Continue to next time step stage + // Evaluate whether to do load balancing + void evalLB(); + + //! Continue to next time step void next(); //! Receive chare-boundary limiter function data from neighboring chares void comlim( int fromch, const std::vector< std::size_t >& tetid, - const std::vector< std::vector< tk::real > >& lfn, + const std::vector< std::vector< tk::real > >& u, + const std::vector< std::vector< tk::real > >& prim, const std::vector< std::size_t >& ndof ); //! Receive chare-boundary ghost data from neighboring chares void comsol( int fromch, + std::size_t fromstage, const std::vector< std::size_t >& tetid, const std::vector< std::vector< tk::real > >& u, + const std::vector< std::vector< tk::real > >& prim, const std::vector< std::size_t >& ndof ); - //! Advance equations to next time step - void advance( tk::real ); - - //! Signal the runtime system that diagnostics have been computed - void diag(); - //! Optionally refine/derefine mesh void refine(); //! Receive new mesh from refiner - void resizeAfterRefined( - const std::vector< std::size_t >& ginpoel, + void resizePostAMR( + const std::vector< std::size_t >& /* ginpoel */, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, - const std::unordered_map< std::size_t, tk::UnsMesh::Edge >& addedNodes, + const std::unordered_map< std::size_t, tk::UnsMesh::Edge >& /* addedNodes */, const std::unordered_map< std::size_t, std::size_t >& addedTets, const std::unordered_map< int, std::vector< std::size_t > >& msum, const std::map< int, std::vector< std::size_t > >& bface, - const std::map< int, std::vector< std::size_t > >& bnode, + const std::map< int, std::vector< std::size_t > >& /* bnode */, const std::vector< std::size_t >& triinpoel ); //! Const-ref access to current solution @@ -148,15 +151,12 @@ class DG : public CBase_DG { //! Compute limiter function void lim(); - //! Send limited solution to neighboring chares - void sendLim(); - //! Const-ref access to current solution //! \param[in,out] u Reference to update with current solution void solution( tk::Fields& u ) const { u = m_u; } - //! Resizing data sutrctures after mesh refinement has been completed - void resized(); + //! Unused in DG + void resized() {} //! Compute right hand side and solve system void solve( tk::real newdt ); @@ -178,6 +178,7 @@ class DG : public CBase_DG { p | m_fd; p | m_u; p | m_un; + p | m_p; p | m_geoFace; p | m_geoElem; p | m_lhs; @@ -196,8 +197,13 @@ class DG : public CBase_DG { p | m_diag; p | m_stage; p | m_ndof; + p | m_bid; + p | m_uc; + p | m_pc; + p | m_ndofc; p | m_initial; p | m_expChBndFace; + p | m_infaces; } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference @@ -235,6 +241,8 @@ class DG : public CBase_DG { tk::Fields m_u; //! Vector of unknown at previous time-step tk::Fields m_un; + //! Vector of primitive quantities over each mesh element + tk::Fields m_p; //! Face geometry tk::Fields m_geoFace; //! Element geometry @@ -282,10 +290,21 @@ class DG : public CBase_DG { std::size_t m_stage; //! Vector of local number of degrees of freedom for each element std::vector< std::size_t > m_ndof; + //! Map local ghost tet ids (value) and zero-based boundary ids (key) + std::unordered_map< std::size_t, std::size_t > m_bid; + //! Solution receive buffers for ghosts only + std::array< std::vector< std::vector< tk::real > >, 2 > m_uc; + //! Primitive-variable receive buffers for ghosts only + std::array< std::vector< std::vector< tk::real > >, 2 > m_pc; + //! \brief Number of degrees of freedom (for p-adaptive) receive buffers + //! for ghosts only + std::array< std::vector< std::size_t >, 2 > m_ndofc; //! 1 if starting time stepping, 0 if during time stepping int m_initial; //! Unique set of chare-boundary faces this chare is expected to receive tk::UnsMesh::FaceSet m_expChBndFace; + //! Incoming communication buffer during chare-boundary face communication + std::unordered_map< int, tk::UnsMesh::FaceSet > m_infaces; //! Access bound Discretization class pointer Discretization* Disc() const { @@ -293,11 +312,11 @@ class DG : public CBase_DG { return m_disc[ thisIndex ].ckLocal(); } - //! Start sizing communication buffers and setting up ghost data - void resizeComm(); + //! Compute partial boundary surface integral and sum across all chares + void bndIntegral(); - //! Start recomputing ghost data after a mesh refinement step - void recompGhostRefined(); + //! Compute chare-boundary faces + void bndFaces(); //! Perform leak test on chare-boundary faces bool leakyAdjacency(); @@ -346,6 +365,9 @@ class DG : public CBase_DG { //! Evaluate whether to continue with next time step stage void stage(); + //! Evaluate whether to save checkpoint/restart + void evalRestart(); + //! Calculate the local number of degrees of freedom for each element for //! p-adaptive DG void eval_ndof(); diff --git a/src/Inciter/DiagCG.cpp b/src/Inciter/DiagCG.cpp index 7930cc23893..e8760f61795 100644 --- a/src/Inciter/DiagCG.cpp +++ b/src/Inciter/DiagCG.cpp @@ -52,36 +52,27 @@ DiagCG::DiagCG( const CProxy_Discretization& disc, m_nsol( 0 ), m_nlhs( 0 ), m_nrhs( 0 ), - m_ndif( 0 ), m_bnode( bnode ), m_u( m_disc[thisIndex].ckLocal()->Gid().size(), g_inputdeck.get< tag::component >().nprop() ), m_ul( m_u.nunk(), m_u.nprop() ), m_du( m_u.nunk(), m_u.nprop() ), - m_dul( m_u.nunk(), m_u.nprop() ), m_ue( m_disc[thisIndex].ckLocal()->Inpoel().size()/4, m_u.nprop() ), m_lhs( m_u.nunk(), m_u.nprop() ), m_rhs( m_u.nunk(), m_u.nprop() ), - m_dif( m_u.nunk(), m_u.nprop() ), m_bc(), m_lhsc(), m_rhsc(), m_difc(), - m_vol( 0.0 ), m_diag() // ***************************************************************************** // Constructor //! \param[in] disc Discretization proxy -//! \param[in] bface Boundary-faces mapped to side set ids //! \param[in] bnode Boundary-node lists mapped to side set ids -//! \param[in] triinpoel Boundary-face connectivity // ***************************************************************************** { usesAtSync = true; // enable migration at AtSync - // Size communication buffers - resizeComm(); - // Activate SDAG wait for initially computing the left-hand side thisProxy[ thisIndex ].wait4lhs(); @@ -90,34 +81,11 @@ DiagCG::DiagCG( const CProxy_Discretization& disc, CkCallback(CkReductionTarget(Transporter,comfinal), Disc()->Tr()) ); } -void -DiagCG::resizeComm() -// ***************************************************************************** -// Size communication buffers -//! \details The size of the communication buffers are determined based on -//! Disc()->Bid.size() and m_u.nprop(). -// ***************************************************************************** -{ - auto d = Disc(); - - auto np = m_u.nprop(); - auto nb = d->Bid().size(); - m_lhsc.resize( nb ); - for (auto& b : m_lhsc) b.resize( np ); - m_rhsc.resize( nb ); - for (auto& b : m_rhsc) b.resize( np ); - m_difc.resize( nb ); - for (auto& b : m_difc) b.resize( np ); - - // Zero communication buffers - for (auto& b : m_lhsc) std::fill( begin(b), end(b), 0.0 ); -} - void DiagCG::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types initiated from this chare array -//! \details Since this is a [nodeinit] routine, the runtime system executes the +//! \details Since this is a [initnode] routine, the runtime system executes the //! routine exactly once on every logical node early on in the Charm++ init //! sequence. Must be static as it is called without an object. See also: //! Section "Initializations at Program Startup" at in the Charm++ manual @@ -137,21 +105,17 @@ DiagCG::ResumeFromSync() { if (Disc()->It() == 0) Throw( "it = 0 in ResumeFromSync()" ); - if (!g_inputdeck.get< tag::cmd, tag::nonblocking >()) dt(); + if (!g_inputdeck.get< tag::cmd, tag::nonblocking >()) next(); } void -DiagCG::setup( tk::real v ) +DiagCG::setup() // ***************************************************************************** -// Setup rows, query boundary conditions, output mesh, etc. -//! \param[in] v Total mesh volume +// Set and output initial conditions and mesh to file // ***************************************************************************** { auto d = Disc(); - // Store total mesh volume - m_vol = v; - // Set initial conditions for all PDEs for (const auto& eq : g_cgpde) eq.initialize( d->Coord(), m_u, d->T() ); @@ -169,48 +133,24 @@ DiagCG::init() } void -DiagCG::lhsmerge() +DiagCG::start() // ***************************************************************************** -// The own and communication portion of the left-hand side is complete +// Start time stepping // ***************************************************************************** { - // Combine own and communicated contributions to left hand side - auto d = Disc(); - - // Combine own and communicated contributions to LHS and ICs - for (const auto& b : d->Bid()) { - auto lid = tk::cref_find( d->Lid(), b.first ); - const auto& blhsc = m_lhsc[ b.second ]; - for (ncomp_t c=0; cTimer().zero(); -void -DiagCG::resized() -// ***************************************************************************** -// Resizing data sutrctures after mesh refinement has been completed -// ***************************************************************************** -{ - resize_complete(); + // Start time stepping by computing the size of the next time step) + next(); } void -DiagCG::start() +DiagCG::next() // ***************************************************************************** -// Start time stepping +// Continue to next time step // ***************************************************************************** { - // Start timer measuring time stepping wall clock time - Disc()->Timer().zero(); - - // Start time stepping by computing the size of the next time step) dt(); } @@ -256,20 +196,35 @@ DiagCG::comlhs( const std::vector< std::size_t >& gid, using tk::operator+=; - auto d = Disc(); - - for (std::size_t i=0; iBid(), gid[i] ); - Assert( bid < m_lhsc.size(), "Indexing out of bounds" ); - m_lhsc[ bid ] += L[i]; - } + for (std::size_t i=0; iMsum().size()) { + if (++m_nlhs == Disc()->Msum().size()) { m_nlhs = 0; comlhs_complete(); } } +void +DiagCG::lhsmerge() +// ***************************************************************************** +// The own and communication portion of the left-hand side is complete +// ***************************************************************************** +{ + // Combine own and communicated contributions to left hand side + for (const auto& b : m_lhsc) { + auto lid = tk::cref_find( Disc()->Lid(), b.first ); + for (ncomp_t c=0; cTr()) ); + CkCallback(CkReductionTarget(DiagCG,advance), thisProxy) ); +} + +void +DiagCG::advance( tk::real newdt ) +// ***************************************************************************** +// Advance equations to next time step +//! \param[in] newdt Size of this new time step +// ***************************************************************************** +{ + auto d = Disc(); + + // Set new time step size + d->setdt( newdt ); + + // Activate SDAG-waits for FCT + d->FCT()->next(); + + // Compute rhs for next time step + rhs(); } void @@ -323,136 +297,91 @@ DiagCG::rhs() for (const auto& eq : g_cgpde) eq.rhs( d->T(), d->Dt(), d->Coord(), d->Inpoel(), m_u, m_ue, m_rhs ); + // Compute mass diffusion rhs contribution required for the low order solution + auto dif = d->FCT()->diff( *d, m_u ); + // Query and match user-specified boundary conditions to side sets - bc(); + m_bc = match( m_u.nprop(), d->T(), d->Dt(), d->Coord(), d->Gid(), + d->Lid(), m_bnode ); if (d->Msum().empty()) comrhs_complete(); else // send contributions of rhs to chare-boundary nodes to fellow chares for (const auto& n : d->Msum()) { std::vector< std::vector< tk::real > > r( n.second.size() ); - std::size_t j = 0; - for (auto i : n.second) r[ j++ ] = m_rhs[ tk::cref_find(d->Lid(),i) ]; - thisProxy[ n.first ].comrhs( n.second, r ); - } - - ownrhs_complete(); - - // Compute mass diffusion rhs contribution required for the low order solution - m_dif = d->FCT()->diff( *d, m_u ); - - if (d->Msum().empty()) - comdif_complete(); - else // send contributions of diff to chare-boundary nodes to fellow chares - for (const auto& n : d->Msum()) { std::vector< std::vector< tk::real > > D( n.second.size() ); std::size_t j = 0; - for (auto i : n.second) D[ j++ ] = m_dif[ tk::cref_find(d->Lid(),i) ]; - thisProxy[ n.first ].comdif( n.second, D ); + for (auto i : n.second) { + auto lid = tk::cref_find( d->Lid(), i ); + r[ j ] = m_rhs[ lid ]; + D[ j ] = dif[ lid ]; + ++j; + } + thisProxy[ n.first ].comrhs( n.second, r, D ); } - owndif_complete(); + ownrhs_complete( dif ); } void DiagCG::comrhs( const std::vector< std::size_t >& gid, - const std::vector< std::vector< tk::real > >& R ) + const std::vector< std::vector< tk::real > >& R, + const std::vector< std::vector< tk::real > >& D ) // ***************************************************************************** // Receive contributions to right-hand side vector on chare-boundaries //! \param[in] gid Global mesh node IDs at which we receive RHS contributions //! \param[in] R Partial contributions of RHS to chare-boundary nodes +//! \param[in] D Partial contributions to chare-boundary nodes //! \details This function receives contributions to m_rhs, which stores the //! right hand side vector at mesh nodes. While m_rhs stores own //! contributions, m_rhsc collects the neighbor chare contributions during //! communication. This way work on m_rhs and m_rhsc is overlapped. The two -//! are combined in solve(). +//! are combined in solve(). This function also receives contributions to +//! mass diffusion term of the right hand side vector at mesh nodes. // ***************************************************************************** { Assert( R.size() == gid.size(), "Size mismatch" ); + Assert( D.size() == gid.size(), "Size mismatch" ); using tk::operator+=; - auto d = Disc(); - for (std::size_t i=0; iBid(), gid[i] ); - Assert( bid < m_rhsc.size(), "Indexing out of bounds" ); - m_rhsc[ bid ] += R[i]; + m_rhsc[ gid[i] ] += R[i]; + m_difc[ gid[i] ] += D[i]; } - if (++m_nrhs == d->Msum().size()) { + if (++m_nrhs == Disc()->Msum().size()) { m_nrhs = 0; comrhs_complete(); } } void -DiagCG::comdif( const std::vector< std::size_t >& gid, - const std::vector< std::vector< tk::real > >& D ) -// ***************************************************************************** -// Receive contributions to right-hand side mass diffusion on chare-boundaries -//! \param[in] gid Global mesh node IDs at which we receive ontributions -//! \param[in] D Partial contributions to chare-boundary nodes -//! \details This function receives contributions to m_dif, which stores the -//! mass diffusion right hand side vector at mesh nodes. While m_dif stores -//! own contributions, m_difc collects the neighbor chare contributions during -//! communication. This way work on m_dif and m_difc is overlapped. The two -//! are combined in solve(). -// ***************************************************************************** -{ - Assert( D.size() == gid.size(), "Size mismatch" ); - - using tk::operator+=; - - auto d = Disc(); - - for (std::size_t i=0; iBid(), gid[i] ); - Assert( bid < m_difc.size(), "Indexing out of bounds" ); - m_difc[ bid ] += D[i]; - } - - if (++m_ndif == d->Msum().size()) { - m_ndif = 0; - comdif_complete(); - } -} - -void -DiagCG::bc() -// ***************************************************************************** -// Query and match user-specified boundary conditions to side sets -// ***************************************************************************** -{ - auto d = Disc(); - - // Match user-specified boundary conditions to side sets - m_bc = match( m_u.nprop(), d->T(), d->Dt(), d->Coord(), d->Gid(), - d->Lid(), m_bnode ); -} - -void -DiagCG::solve() +DiagCG::solve( tk::Fields& dif ) // ***************************************************************************** // Solve low and high order diagonal systems +//! \param[in,out] dif Mass diffusion own contribution // ***************************************************************************** { const auto ncomp = m_rhs.nprop(); auto d = Disc(); - // Combine own and communicated contributions to rhs and mass diffusion - for (const auto& b : d->Bid()) { + // Combine own and communicated contributions to rhs + for (const auto& b : m_rhsc) { auto lid = tk::cref_find( d->Lid(), b.first ); - const auto& brhsc = m_rhsc[ b.second ]; - for (ncomp_t c=0; cLid(), b.first ); + for (ncomp_t c=0; cFCT()->aec( *d, m_du, m_u, m_bc ); - d->FCT()->alw( m_u, m_ul, m_dul, thisProxy ); + d->FCT()->alw( m_u, m_ul, std::move(dul), thisProxy ); } void @@ -504,49 +433,55 @@ DiagCG::writeFields( CkCallback c ) const auto u = m_u; std::vector< std::vector< tk::real > > nodefields; for (const auto& eq : g_cgpde) { - auto o = eq.fieldOutput( d->T(), m_vol, d->Coord(), d->V(), u ); + auto o = eq.fieldOutput( d->T(), d->meshvol(), d->Coord(), d->V(), u ); nodefields.insert( end(nodefields), begin(o), end(o) ); } + std::vector< std::string > elemfieldnames; + std::vector< std::vector< tk::real > > elemfields; + // Query refinement data - auto r = d->Ref()->refinementFields(); + auto dtref = g_inputdeck.get< tag::amr, tag::dtref >(); - // Send mesh and fields data (solution dump) for output to file - d->write( d->Inpoel(), d->Coord(), {}, tk::remap(m_bnode,d->Lid()), {}, - std::get<0>(r), nodefieldnames, std::get<1>(r), nodefields, c ); -} + std::tuple< std::vector< std::string >, + std::vector< std::vector< tk::real > >, + std::vector< std::string >, + std::vector< std::vector< tk::real > > > r; + if (dtref) r = d->Ref()->refinementFields(); -void -DiagCG::advance( tk::real newdt ) -// ***************************************************************************** -// Advance equations to next time step -//! \param[in] newdt Size of this new time step -// ***************************************************************************** -{ - auto d = Disc(); + const auto& refinement_elemfieldnames = std::get< 0 >( r ); + const auto& refinement_elemfields = std::get< 1 >( r ); + const auto& refinement_nodefieldnames = std::get< 2 >( r ); + const auto& refinement_nodefields = std::get< 3 >( r ); - // Set new time step size - d->setdt( newdt ); + nodefieldnames.insert( end(nodefieldnames), + begin(refinement_nodefieldnames), end(refinement_nodefieldnames) ); + nodefields.insert( end(nodefields), + begin(refinement_nodefields), end(refinement_nodefields) ); - // Activate SDAG-waits for FCT - d->FCT()->next(); + elemfieldnames.insert( end(elemfieldnames), + begin(refinement_elemfieldnames), end(refinement_elemfieldnames) ); + elemfields.insert( end(elemfields), + begin(refinement_elemfields), end(refinement_elemfields) ); - // Compute rhs for next time step - rhs(); + // Send mesh and fields data (solution dump) for output to file + d->write( d->Inpoel(), d->Coord(), {}, tk::remap(m_bnode,d->Lid()), {}, + elemfieldnames, nodefieldnames, elemfields, nodefields, c ); } void -DiagCG::update( const tk::Fields& a ) +DiagCG::update( const tk::Fields& a, [[maybe_unused]] tk::Fields&& dul ) // ***************************************************************************** // Prepare for next step //! \param[in] a Limited antidiffusive element contributions +//! \param[in] dul Low order solution increment // ***************************************************************************** { auto d = Disc(); // Verify that the change in the solution at those nodes where Dirichlet // boundary conditions are set is exactly the amount the BCs prescribe - Assert( correctBC( a, m_dul, m_bc, d->Lid() ), + Assert( correctBC( a, dul, m_bc, d->Lid() ), "Dirichlet boundary condition incorrect" ); // Apply limited antidiffusive element contributions to low order solution @@ -559,19 +494,8 @@ DiagCG::update( const tk::Fields& a ) auto diag_computed = m_diag.compute( *d, m_u ); // Increase number of iterations and physical time d->next(); - // Signal that diagnostics have been computed (or in this case, skipped) - if (!diag_computed) diag(); - // Optionally refine mesh - refine(); -} - -void -DiagCG::diag() -// ***************************************************************************** -// Signal the runtime system that diagnostics have been computed -// ***************************************************************************** -{ - diag_complete(); + // Continue to mesh refinement (if configured) + if (!diag_computed) refine(); } void @@ -588,21 +512,24 @@ DiagCG::refine() // if t>0 refinement enabled and we hit the dtref frequency if (dtref && !(d->It() % dtfreq)) { // refine + // Activate SDAG waits for re-computing the left-hand side + thisProxy[ thisIndex ].wait4lhs(); + + d->startvol(); d->Ref()->dtref( {}, m_bnode, {} ); d->refined() = 1; } else { // do not refine - ref_complete(); - lhs_complete(); - resize_complete(); d->refined() = 0; + lhs_complete(); + resized(); } } void -DiagCG::resizeAfterRefined( +DiagCG::resizePostAMR( const std::vector< std::size_t >& /*ginpoel*/, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, @@ -620,9 +547,7 @@ DiagCG::resizeAfterRefined( //! \param[in] addedNodes Newly added mesh nodes and their parents (local ids) //! \param[in] addedTets Newly added mesh cells and their parents (local ids) //! \param[in] msum New node communication map -//! \param[in] bface Boundary-faces mapped to side set ids //! \param[in] bnode Boundary-node lists mapped to side set ids -//! \param[in] triinpoel Boundary-face connectivity // ***************************************************************************** { auto d = Disc(); @@ -637,7 +562,7 @@ DiagCG::resizeAfterRefined( ++d->Itr(); // Resize mesh data structures - d->resize( chunk, coord, msum ); + d->resizePostAMR( chunk, coord, msum ); // Resize auxiliary solution vectors auto nelem = d->Inpoel().size()/4; @@ -646,11 +571,9 @@ DiagCG::resizeAfterRefined( m_u.resize( npoin, nprop ); m_ul.resize( npoin, nprop ); m_du.resize( npoin, nprop ); - m_dul.resize( npoin, nprop ); m_ue.resize( nelem, nprop ); m_lhs.resize( npoin, nprop ); m_rhs.resize( npoin, nprop ); - m_dif.resize( npoin, nprop ); // Update solution on new mesh for (const auto& n : addedNodes) { @@ -662,18 +585,19 @@ DiagCG::resizeAfterRefined( // Update physical-boundary node lists m_bnode = bnode; - // Resize communication buffers - resizeComm(); - // Resize FCT data structures d->FCT()->resize( npoin, msum, d->Bid(), d->Lid(), d->Inpoel() ); - // Activate SDAG waits for re-computing the left-hand side - thisProxy[ thisIndex ].wait4lhs(); - - ref_complete(); + contribute( CkCallback(CkReductionTarget(Transporter,resized), d->Tr()) ); +} - contribute( CkCallback(CkReductionTarget(Transporter,workresized), d->Tr()) ); +void +DiagCG::resized() +// ***************************************************************************** +// Resizing data sutrctures after mesh refinement has been completed +// ***************************************************************************** +{ + resize_complete(); } void @@ -698,6 +622,53 @@ DiagCG::out() step(); } +void +DiagCG::evalLB() +// ***************************************************************************** +// Evaluate whether to do load balancing +// ***************************************************************************** +{ + auto d = Disc(); + + const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); + const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); + + // Load balancing if user frequency is reached or after the second time-step + if ( (d->It()) % lbfreq == 0 || d->It() == 2 ) { + + AtSync(); + if (nonblocking) next(); + + } else { + + next(); + + } +} + +void +DiagCG::evalRestart() +// ***************************************************************************** +// Evaluate whether to save checkpoint/restart +// ***************************************************************************** +{ + auto d = Disc(); + + const auto rsfreq = g_inputdeck.get< tag::cmd, tag::rsfreq >(); + + if ( (d->It()) % rsfreq == 0 ) { + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,checkpoint), d->Tr()) ); + + } else { + + evalLB(); + + } +} + void DiagCG::step() // ***************************************************************************** @@ -712,22 +683,18 @@ DiagCG::step() const auto term = g_inputdeck.get< tag::discr, tag::term >(); const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); const auto eps = std::numeric_limits< tk::real >::epsilon(); - const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); - const auto nonblocking = g_inputdeck.get< tag::cmd, tag::nonblocking >(); // If neither max iterations nor max time reached, continue, otherwise finish if (std::fabs(d->T()-term) > eps && d->It() < nstep) { - if ( (d->It()) % lbfreq == 0 ) { - AtSync(); - if (nonblocking) dt(); - } - else { - dt(); - } + evalRestart(); } else { - d->contribute( CkCallback( CkReductionTarget(Transporter,finish), d->Tr() ) ); + + std::vector< tk::real > t{{ static_cast(d->It()), d->T() }}; + d->contribute( t, CkReduction::nop, + CkCallback(CkReductionTarget(Transporter,finish), d->Tr()) ); + } } diff --git a/src/Inciter/DiagCG.hpp b/src/Inciter/DiagCG.hpp index c45a8c41ae5..cf4c04cfd34 100644 --- a/src/Inciter/DiagCG.hpp +++ b/src/Inciter/DiagCG.hpp @@ -85,7 +85,7 @@ class DiagCG : public CBase_DiagCG { #endif //! Migrate constructor // cppcheck-suppress uninitMemberVar - explicit DiagCG( CkMigrateMessage* ) {} + explicit DiagCG( CkMigrateMessage* msg ) : CBase_DiagCG( msg ) {} #if defined(__clang__) #pragma clang diagnostic pop #endif @@ -96,8 +96,11 @@ class DiagCG : public CBase_DiagCG { //! Return from migration void ResumeFromSync() override; + //! Size communication buffers (no-op) + void resizeComm() {} + //! Setup: query boundary conditions, output mesh, etc. - void setup( tk::real v ); + void setup(); // Initially compute left hand side diagonal matrix void init(); @@ -114,23 +117,17 @@ class DiagCG : public CBase_DiagCG { //! Receive contributions to right-hand side vector on chare-boundaries void comrhs( const std::vector< std::size_t >& gid, - const std::vector< std::vector< tk::real > >& R ); - - //! Receive contributions to RHS mass diffusion on chare-boundaries - void comdif( const std::vector< std::size_t >& gid, + const std::vector< std::vector< tk::real > >& R, const std::vector< std::vector< tk::real > >& D ); //! Update solution at the end of time step - void update( const tk::Fields& a ); - - //! Signal the runtime system that diagnostics have been computed - void diag(); + void update( const tk::Fields& a, tk::Fields&& dul ); //! Optionally refine/derefine mesh void refine(); //! Receive new mesh from refiner - void resizeAfterRefined( + void resizePostAMR( const std::vector< std::size_t >& ginpoel, const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, @@ -151,6 +148,12 @@ class DiagCG : public CBase_DiagCG { //! Evaluate whether to continue with next time step void step(); + // Evaluate whether to do load balancing + void evalLB(); + + //! Continue to next time step + void next(); + /** @name Charm++ pack/unpack serializer member functions */ ///@{ //! \brief Pack/Unpack serialize member function @@ -161,16 +164,13 @@ class DiagCG : public CBase_DiagCG { p | m_nsol; p | m_nlhs; p | m_nrhs; - p | m_ndif; p | m_bnode; p | m_u; p | m_ul; p | m_du; - p | m_dul; p | m_ue; p | m_lhs; p | m_rhs; - p | m_dif; p | m_bc; p | m_lhsc; p | m_rhsc; @@ -197,8 +197,6 @@ class DiagCG : public CBase_DiagCG { std::size_t m_nlhs; //! Counter for right-hand side vector nodes updated std::size_t m_nrhs; - //! Counter for right-hand side masss-diffusion vector nodes updated - std::size_t m_ndif; //! Boundary node lists mapped to side set ids std::map< int, std::vector< std::size_t > > m_bnode; //! Unknown/solution vector at mesh nodes @@ -207,16 +205,12 @@ class DiagCG : public CBase_DiagCG { tk::Fields m_ul; //! Unknown/solution vector increment (high order) tk::Fields m_du; - //! Unknown/solution vector increment (low order) - tk::Fields m_dul; //! Unknown/solution vector at mesh cells tk::Fields m_ue; //! Lumped lhs mass matrix tk::Fields m_lhs; //! Right-hand side vector (for the high order system) tk::Fields m_rhs; - //! Mass diffusion right-hand side vector (for the low order system) - tk::Fields m_dif; //! Boundary conditions evaluated and assigned to mesh node IDs //! \details Vector of pairs of bool and boundary condition value associated //! to meshnode IDs at which the user has set Dirichlet boundary @@ -225,8 +219,15 @@ class DiagCG : public CBase_DiagCG { //! the increment (from t to dt) in the BC specified for a component. std::unordered_map< std::size_t, std::vector< std::pair< bool, tk::real > > > m_bc; - //! Receive buffers for communication - std::vector< std::vector< tk::real > > m_lhsc, m_rhsc, m_difc; + //! Receive buffer for communication of the left hand side + //! \details Key: chare id, value: lhs for all scalar components per node + std::unordered_map< std::size_t, std::vector< tk::real > > m_lhsc; + //! Receive buffer for communication of the right hand side + //! \details Key: chare id, value: rhs for all scalar components per node + std::unordered_map< std::size_t, std::vector< tk::real > > m_rhsc; + //! Receive buffer for communication of mass diffusion on the hand side + //! \details Key: chare id, value: dif for all scalar components per node + std::unordered_map< std::size_t, std::vector< tk::real > > m_difc; //! Total mesh volume tk::real m_vol; //! Diagnostics object @@ -238,19 +239,12 @@ class DiagCG : public CBase_DiagCG { return m_disc[ thisIndex ].ckLocal(); } - //! Size communication buffers - void resizeComm(); - //! Output mesh fields to files void out(); //! Output mesh-based fields to file void writeFields( CkCallback c ) const; - //! \brief Extract node IDs from side set node lists and match to - // user-specified boundary conditions - void bc(); - //! The own and communication portion of the left-hand side is complete void lhsdone(); @@ -264,10 +258,13 @@ class DiagCG : public CBase_DiagCG { void start(); //! Solve low and high order diagonal systems - void solve(); + void solve( tk::Fields& dif ); //! Compute time step size void dt(); + + //! Evaluate whether to save checkpoint/restart + void evalRestart(); }; } // inciter:: diff --git a/src/Inciter/DiagReducer.cpp b/src/Inciter/DiagReducer.cpp index cd7f265ad72..44e67a4ba38 100644 --- a/src/Inciter/DiagReducer.cpp +++ b/src/Inciter/DiagReducer.cpp @@ -12,9 +12,9 @@ #include #include +#include #include "DiagReducer.hpp" -#include "Make_unique.hpp" #include "Diagnostics.hpp" #include "Exception.hpp" @@ -34,7 +34,7 @@ serialize( const std::vector< std::vector< tk::real > >& d ) sizer | const_cast< std::vector< std::vector< tk::real > >& >( d ); // Create raw character stream to store the serialized vectors - std::unique_ptr flatData = tk::make_unique( sizer.size() ); + std::unique_ptr flatData = std::make_unique( sizer.size() ); // Serialize vector, each message will contain a vector PUP::toMem packer( flatData.get() ); diff --git a/src/Inciter/Discretization.cpp b/src/Inciter/Discretization.cpp index 71cfe7233a6..c3df0756d69 100644 --- a/src/Inciter/Discretization.cpp +++ b/src/Inciter/Discretization.cpp @@ -19,6 +19,7 @@ #include "Inciter/InputDeck/InputDeck.hpp" #include "Inciter/Options/Scheme.hpp" #include "Print.hpp" +#include "Around.hpp" namespace inciter { @@ -52,12 +53,14 @@ Discretization::Discretization( m_el( tk::global2local( ginpoel ) ), // fills m_inpoel, m_gid, m_lid m_coord( setCoord( coordmap ) ), m_psup( tk::genPsup( m_inpoel, 4, tk::genEsup(m_inpoel,4) ) ), + m_meshvol( 0.0 ), m_v( m_gid.size(), 0.0 ), m_vol( m_gid.size(), 0.0 ), m_volc(), m_bid(), m_timer(), - m_refined( 0 ) + m_refined( 0 ), + m_prevstatus( std::chrono::high_resolution_clock::now() ) // ***************************************************************************** // Constructor //! \param[in] fctproxy Distributed FCT proxy @@ -70,26 +73,31 @@ Discretization::Discretization( //! \param[in] nc Total number of Discretization chares // ***************************************************************************** { + Assert( !ginpoel.empty(), "No elements assigned to Discretization chare" ); + Assert( tk::positiveJacobians( m_inpoel, m_coord ), + "Jacobian in input mesh to Discretization non-positive" ); + Assert( tk::conforming( m_inpoel, m_coord ), + "Input mesh to Discretization not conforming" ); Assert( m_psup.second.size()-1 == m_gid.size(), "Number of mesh points and number of global IDs unequal" ); // Convert neighbor nodes to vectors from sets - for (const auto& n : msum) { - auto& v = m_msum[ n.first ]; - v.insert( end(v), begin(n.second), end(n.second) ); + for (const auto& [ neighborchare, sharednodes ] : msum) { + auto& v = m_msum[ neighborchare ]; + v.insert( end(v), begin(sharednodes), end(sharednodes) ); } + // Get ready for computing/communicating nodal volumes + startvol(); + // Count the number of mesh nodes at which we receive data from other chares // and compute map associating boundary-chare node ID associated to global ID std::vector< std::size_t > c( tk::sumvalsize( m_msum ) ); std::size_t j = 0; - for (const auto& n : m_msum) for (auto i : n.second) c[ j++ ] = i; + for (const auto& n : m_msum) for (auto i : n.second) c[j++] = i; tk::unique( c ); m_bid = tk::assignLid( c ); - // Allocate receive buffer for nodal volumes - m_volc.resize( m_bid.size(), 0.0 ); - // Insert DistFCT chare array element if FCT is needed. Note that even if FCT // is configured false in the input deck, at this point, we still need the FCT // object as FCT is still being performed, only its results are ignored. @@ -104,7 +112,7 @@ Discretization::Discretization( } void -Discretization::resize( +Discretization::resizePostAMR( const tk::UnsMesh::Chunk& chunk, const tk::UnsMesh::Coords& coord, const std::unordered_map< int, std::vector< std::size_t > >& msum ) @@ -121,14 +129,13 @@ Discretization::resize( // Generate local ids for new chare boundary global ids std::size_t lid = m_bid.size(); - for (const auto& c : m_msum) - for (auto g : c.second) + for (const auto& [ neighborchare, sharednodes ] : m_msum) + for (auto g : sharednodes) if (m_bid.find( g ) == end(m_bid)) m_bid[ g ] = lid++; - // Resize receive buffer for nodal volumes - std::fill( begin(m_volc), end(m_volc), 0.0 ); - m_volc.resize( m_bid.size(), 0.0 ); + // Clear receive buffer that will be used for collecting nodal volumes + m_volc.clear(); // Set flag that indicates that we are during time stepping m_initial = 0.0; @@ -136,18 +143,23 @@ Discretization::resize( // Update mesh volume std::fill( begin(m_vol), end(m_vol), 0.0 ); m_vol.resize( m_gid.size(), 0.0 ); +} +void +Discretization::startvol() +// ***************************************************************************** +// Get ready for (re-)computing/communicating nodal volumes +// ***************************************************************************** +{ m_nvol = 0; - - contribute( CkCallback(CkReductionTarget(Transporter,discresized), - m_transporter) ); + thisProxy[ thisIndex ].wait4vol(); } void Discretization::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details Since this is a [nodeinit] routine, see cg.ci, the +//! \details Since this is a [initnode] routine, see the .ci file, the //! Charm++ runtime system executes the routine exactly once on every //! logical node early on in the Charm++ init sequence. Must be static as //! it is called without an object. See also: Section "Initializations at @@ -172,11 +184,11 @@ Discretization::setCoord( const tk::UnsMesh::CoordMap& coordmap ) coord[1].resize( coordmap.size() ); coord[2].resize( coordmap.size() ); - for (const auto& p : coordmap) { - auto i = tk::cref_find( m_lid, p.first ); - coord[0][i] = p.second[0]; - coord[1][i] = p.second[1]; - coord[2][i] = p.second[2]; + for (const auto& [ gid, coords ] : coordmap) { + auto i = tk::cref_find( m_lid, gid ); + coord[0][i] = coords[0]; + coord[1][i] = coords[1]; + coord[2][i] = coords[2]; } return coord; @@ -240,14 +252,16 @@ Discretization::vol() // Send our nodal volume contributions to neighbor chares if (m_msum.empty()) - contribute( CkCallback(CkReductionTarget(Transporter,vol), m_transporter) ); + totalvol(); else - for (const auto& n : m_msum) { - std::vector< tk::real > v( n.second.size() ); + for (const auto& [ neighborchare, sharednodes ] : m_msum) { + std::vector< tk::real > v( sharednodes.size() ); std::size_t j = 0; - for (auto i : n.second) v[ j++ ] = m_vol[ tk::cref_find(m_lid,i) ]; - thisProxy[ n.first ].comvol( n.second, v ); + for (auto i : sharednodes) v[ j++ ] = m_vol[ tk::cref_find(m_lid,i) ]; + thisProxy[ neighborchare ].comvol( sharednodes, v ); } + + ownvol_complete(); } void @@ -261,20 +275,17 @@ Discretization::comvol( const std::vector< std::size_t >& gid, //! \details This function receives contributions to m_vol, which stores the //! nodal volumes. While m_vol stores own contributions, m_volc collects the //! neighbor chare contributions during communication. This way work on m_vol -//! and m_volc is overlapped. The two are combined in totalvol(). +//! and m_volc is overlapped. The contributions are applied in totalvol(). // ***************************************************************************** { Assert( nodevol.size() == gid.size(), "Size mismatch" ); - for (std::size_t i=0; i tvol{ 0.0, m_initial }; @@ -298,11 +310,15 @@ Discretization::totalvol() } void -Discretization::stat() +Discretization::stat( tk::real mesh_volume ) // ***************************************************************************** // Compute mesh cell statistics +//! \param[in] mesh_volume Total mesh volume // ***************************************************************************** { + // Store total mesh volume + m_meshvol = mesh_volume; + const auto& x = m_coord[0]; const auto& y = m_coord[1]; const auto& z = m_coord[2]; @@ -327,10 +343,10 @@ Discretization::stat() // small differences. For reproducible average edge lengths and edge length // PDFs, run the mesh in serial. for (std::size_t p=0; p max[0]) max[0] = length; @@ -448,8 +464,8 @@ Discretization::msumset() const // ***************************************************************************** { std::unordered_map< int, std::unordered_set< std::size_t > > m; - for (const auto& n : m_msum) - m[ n.first ].insert( n.second.cbegin(), n.second.cend() ); + for (const auto& [ neighborchare, sharednodes ] : m_msum) + m[ neighborchare ].insert( begin(sharednodes), end(sharednodes) ); Assert( m.find( thisIndex ) == m.cend(), "Chare-node adjacency map should not contain data for own chare ID" ); @@ -492,17 +508,28 @@ Discretization::status() if (thisIndex==0 && !(m_it%tty)) { + const auto eps = std::numeric_limits< tk::real >::epsilon(); const auto term = g_inputdeck.get< tag::discr, tag::term >(); const auto t0 = g_inputdeck.get< tag::discr, tag::t0 >(); const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); const auto field = g_inputdeck.get< tag::interval,tag::field >(); const auto diag = g_inputdeck.get< tag::interval, tag::diag >(); + const auto lbfreq = g_inputdeck.get< tag::cmd, tag::lbfreq >(); + const auto rsfreq = g_inputdeck.get< tag::cmd, tag::rsfreq >(); const auto verbose = g_inputdeck.get< tag::cmd, tag::verbose >(); // estimate time elapsed and time for accomplishment tk::Timer::Watch ete, eta; m_timer.eta( term-t0, m_t-t0, nstep, m_it, ete, eta ); + // estimate grind time (taken between this and the previous status line + // measurement) in milliseconds + using std::chrono::duration_cast; + using ms = std::chrono::milliseconds; + using clock = std::chrono::high_resolution_clock; + auto grind_time = duration_cast< ms >( clock::now() - m_prevstatus ).count(); + m_prevstatus = clock::now(); + tk::Print print( verbose ? std::cout : std::clog ); // Output one-liner @@ -516,12 +543,19 @@ Discretization::status() << std::setw(2) << ete.sec.count() << " " << std::setw(3) << eta.hrs.count() << ":" << std::setw(2) << eta.min.count() << ":" - << std::setw(2) << eta.sec.count() << " "; - + << std::setw(2) << eta.sec.count() << " " + << std::scientific << std::setprecision(6) << std::setfill(' ') + << std::setw(9) << grind_time << " "; + + // Determin if this is the last time step + bool finish = not (std::fabs(m_t-term) > eps && m_it < nstep); + // Augment one-liner with output indicators if (!(m_it % field)) print << 'f'; if (!(m_it % diag)) print << 'd'; if (m_refined) print << 'h'; + if (!(m_it % lbfreq) && !finish) print << 'l'; + if (!(m_it % rsfreq) || finish) print << 'r'; print << std::endl; } diff --git a/src/Inciter/Discretization.hpp b/src/Inciter/Discretization.hpp index ef4ae60a9bf..22c8f1e69ba 100644 --- a/src/Inciter/Discretization.hpp +++ b/src/Inciter/Discretization.hpp @@ -31,6 +31,29 @@ namespace inciter { class Discretization : public CBase_Discretization { public: + #if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wunused-parameter" + #pragma clang diagnostic ignored "-Wdeprecated-declarations" + #elif defined(STRICT_GNUC) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wunused-parameter" + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #elif defined(__INTEL_COMPILER) + #pragma warning( push ) + #pragma warning( disable: 1478 ) + #endif + // Include Charm++ SDAG code. See http://charm.cs.illinois.edu/manuals/html/ + // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger". + Discretization_SDAG_CODE + #if defined(__clang__) + #pragma clang diagnostic pop + #elif defined(STRICT_GNUC) + #pragma GCC diagnostic pop + #elif defined(__INTEL_COMPILER) + #pragma warning( pop ) + #endif + //! Constructor explicit Discretization( @@ -57,10 +80,13 @@ class Discretization : public CBase_Discretization { static void registerReducers(); //! Resize mesh data structures (e.g., after mesh refinement) - void resize( const tk::UnsMesh::Chunk& chunk, - const tk::UnsMesh::Coords& coord, - const std::unordered_map< int, - std::vector< std::size_t > >& msum ); + void resizePostAMR( const tk::UnsMesh::Chunk& chunk, + const tk::UnsMesh::Coords& coord, + const std::unordered_map< int, + std::vector< std::size_t > >& msum ); + + //! Get ready for (re-)computing/communicating nodal volumes + void startvol(); //! Sum mesh volumes to nodes, start communicating them on chare-boundaries void vol(); @@ -76,7 +102,7 @@ class Discretization : public CBase_Discretization { void totalvol(); //! Compute mesh cell statistics - void stat(); + void stat( tk::real mesh_volume ); /** @name Accessors */ ///@{ @@ -102,9 +128,12 @@ class Discretization : public CBase_Discretization { //! non-const-ref std::vector< std::size_t >& Inpoel() { return m_inpoel; } - //! Total mesh volume accessors const-ref + //! Total mesh volume accessor + tk::real meshvol() const { return m_meshvol; } + + //! Nodal mesh volume accessors const-ref const std::vector< tk::real >& V() const { return m_v; } - //! Total mesh volume accessors non-const-ref + //! Nodal mesh volume accessors non-const-ref std::vector< tk::real >& V() { return m_v; } //! Nodal mesh volumes accessors as const-ref @@ -225,12 +254,14 @@ class Discretization : public CBase_Discretization { p | m_coord; p | m_psup; p | m_msum; + p | m_meshvol; p | m_v; p | m_vol; p | m_volc; p | m_bid; p | m_timer; p | m_refined; + p( reinterpret_cast(&m_prevstatus), sizeof(Clock::time_point) ); } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference @@ -239,6 +270,9 @@ class Discretization : public CBase_Discretization { //@} private: + // Shorthand for clock, setting an internal clock type + using Clock = std::chrono::high_resolution_clock; + //! Total number of Discretization chares int m_nchare; //! Iteration count @@ -293,6 +327,8 @@ class Discretization : public CBase_Discretization { //! \details msum: mesh chunks surrounding mesh chunks and their neighbor //! points std::unordered_map< int, std::vector< std::size_t > > m_msum; + //! Total mesh volume + tk::real m_meshvol; //! Nodal mesh volumes //! \details This is the volume of the mesh associated to nodes of owned //! elements (sum of surrounding cell volumes / 4) without contributions @@ -303,12 +339,12 @@ class Discretization : public CBase_Discretization { //! elements (sum of surrounding cell volumes / 4) with contributions from //! other chares on chare-boundaries std::vector< tk::real > m_vol; - //! Receive buffer for volume of nodes + //! Receive buffer for volume of nodes (with global node id as key) //! \details This is a communication buffer used to compute the volume of //! the mesh associated to nodes of owned elements (sum of surrounding //! cell volumes / 4) with contributions from other chares on //! chare-boundaries. - std::vector< tk::real > m_volc; + std::unordered_map< std::size_t, tk::real > m_volc; //! \brief Local chare-boundary mesh node IDs at which we receive //! contributions associated to global mesh node IDs of mesh elements we //! contribute to @@ -317,6 +353,8 @@ class Discretization : public CBase_Discretization { tk::Timer m_timer; //! 1 if mesh was refined in a time step, 0 if it was not int m_refined; + //! Time point storing clock state at status() + Clock::time_point m_prevstatus; //! Set mesh coordinates based on coordinates map tk::UnsMesh::Coords setCoord( const tk::UnsMesh::CoordMap& coordmap ); diff --git a/src/Inciter/DistFCT.cpp b/src/Inciter/DistFCT.cpp index 1bd86acedd9..3c641387b5a 100644 --- a/src/Inciter/DistFCT.cpp +++ b/src/Inciter/DistFCT.cpp @@ -21,7 +21,6 @@ #include "QuinoaConfig.hpp" #include "ContainerUtil.hpp" #include "DistFCT.hpp" -#include "Variant.hpp" namespace inciter { @@ -256,7 +255,7 @@ DistFCT::comaec( const std::vector< std::size_t >& gid, void DistFCT::alw( const tk::Fields& Un, const tk::Fields& Ul, - const tk::Fields& dUl, + tk::Fields&& dUl, const CProxy_DiagCG& host ) // ***************************************************************************** // Compute the maximum and minimum unknowns of elements surrounding nodes @@ -271,7 +270,7 @@ DistFCT::alw( const tk::Fields& Un, { // Store a copy of the low order solution vector and its increment for later m_ul = Ul; - m_dul = dUl; + m_dul = std::move(dUl); // Store discretization scheme proxy m_host = host; @@ -417,7 +416,7 @@ DistFCT::apply() } // Update solution in host - m_host[ thisIndex ].ckLocal()->update(m_a); + m_host[ thisIndex ].ckLocal()->update( m_a, std::move(m_dul) ); } #include "NoWarning/distfct.def.h" diff --git a/src/Inciter/DistFCT.hpp b/src/Inciter/DistFCT.hpp index b0902d0b68d..6bd641147b9 100644 --- a/src/Inciter/DistFCT.hpp +++ b/src/Inciter/DistFCT.hpp @@ -131,7 +131,7 @@ class DistFCT : public CBase_DistFCT { //! surrounding nodes void alw( const tk::Fields& Un, const tk::Fields& Ul, - const tk::Fields& dUl, + tk::Fields&& dUl, const CProxy_DiagCG& host ); //! Resize FCT data structures (e.g., after mesh refinement) diff --git a/src/Inciter/ElemDiagnostics.cpp b/src/Inciter/ElemDiagnostics.cpp index ff3bec432d9..b0c6675a8c0 100644 --- a/src/Inciter/ElemDiagnostics.cpp +++ b/src/Inciter/ElemDiagnostics.cpp @@ -39,8 +39,8 @@ void ElemDiagnostics::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details This routine is supposed to be called from a Charm++ nodeinit -//! routine. Since the runtime system executes nodeinit routines exactly once +//! \details This routine is supposed to be called from a Charm++ initnode +//! routine. Since the runtime system executes initnode routines exactly once //! on every logical node early on in the Charm++ init sequence, they must be //! static as they are called without an object. See also: Section //! "Initializations at Program Startup" at in the Charm++ manual @@ -82,15 +82,15 @@ ElemDiagnostics::compute( Discretization& d, if ( !((d.It()+1) % diagfreq) ) { // if remainder, don't compute diagnostics // Query number of degrees of freedom from user's setting - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); // Diagnostics vector (of vectors) during aggregation. See // Inciter/Diagnostics.h. std::vector< std::vector< tk::real > > - diag( NUMDIAG, std::vector< tk::real >( u.nprop()/ndof, 0.0 ) ); + diag( NUMDIAG, std::vector< tk::real >( u.nprop()/rdof, 0.0 ) ); // Compute diagnostics for DG - compute_diag(d, ndof, nchGhost, geoElem, ndofel, u, diag); + compute_diag(d, rdof, nchGhost, geoElem, ndofel, u, diag); // Append diagnostics vector with metadata on the current time step // ITER: Current iteration count (only the first entry is used) @@ -114,7 +114,7 @@ ElemDiagnostics::compute( Discretization& d, void ElemDiagnostics::compute_diag( const Discretization& d, - const std::size_t ndof, + const std::size_t rdof, const std::size_t nchGhost, const tk::Fields& geoElem, const std::vector< std::size_t >& ndofel, @@ -123,7 +123,7 @@ ElemDiagnostics::compute_diag( const Discretization& d, // ***************************************************************************** // Compute diagnostics, e.g., residuals, norms of errors, etc. for DG //! \param[in] d Discretization base class to read from -//! \param[in] ndof Number of degrees of freedom +//! \param[in] rdof Number of reconstructed degrees of freedom //! \param[in] nchGhost Number of chare boundary ghost elements //! \param[in] geoElem Element geometry //! \param[in] ndofel Vector of local number of degrees of freedom @@ -178,9 +178,9 @@ ElemDiagnostics::compute_diag( const Discretization& d, // cppcheck-suppress useStlAlgorithm s = eq.analyticSolution( gp[0], gp[1], gp[2], d.T()+d.Dt() ); - for (std::size_t c=0; c 1) diff --git a/src/Inciter/ElemDiagnostics.hpp b/src/Inciter/ElemDiagnostics.hpp index a6ec7f5c364..9f3aeee68ce 100644 --- a/src/Inciter/ElemDiagnostics.hpp +++ b/src/Inciter/ElemDiagnostics.hpp @@ -30,7 +30,7 @@ class ElemDiagnostics { bool compute( Discretization& d, const std::size_t nchGhost, const tk::Fields& geoElem, - const std::vector< std::size_t >& pIndex, + const std::vector< std::size_t >& ndofel, const tk::Fields& u ) const; /** @name Charm++ pack/unpack serializer member functions */ @@ -46,7 +46,7 @@ class ElemDiagnostics { private: //! Compute diagnostics for DG void compute_diag( const Discretization& d, - const std::size_t ndof, + const std::size_t ndofel, const std::size_t nchGhost, const tk::Fields& geoElem, const std::vector< std::size_t >& pIndex, diff --git a/src/Inciter/FaceData.hpp b/src/Inciter/FaceData.hpp index 6a7580f8864..23fce585db0 100644 --- a/src/Inciter/FaceData.hpp +++ b/src/Inciter/FaceData.hpp @@ -22,7 +22,7 @@ namespace inciter { -//! Data associated to a tetrahedron cell id used to comunicate across faces +//! Data associated to a tetrahedron cell id used to communicate across faces using GhostData = std::unordered_map< std::size_t, // tet id std::tuple< diff --git a/src/Inciter/FieldsMerger.hpp b/src/Inciter/FieldsMerger.hpp index 1e734322ef4..ee9e28edbbd 100644 --- a/src/Inciter/FieldsMerger.hpp +++ b/src/Inciter/FieldsMerger.hpp @@ -13,10 +13,9 @@ #define FieldsMerger_h #include +#include #include "NoWarning/charm++.hpp" - -#include "Make_unique.hpp" #include "ContainerUtil.hpp" namespace inciter { @@ -33,7 +32,7 @@ serialize( const std::vector< std::pair< int, T > >& m ) { const_cast< std::vector< std::pair< int, T > >& >( m ); // Create raw character stream to store the serialized node indices - std::unique_ptr flatData = tk::make_unique( sizer.size() ); + std::unique_ptr flatData = std::make_unique( sizer.size() ); // Serialize, each message will contain a list of node indices per chare PUP::toMem packer( flatData.get() ); diff --git a/src/Inciter/NodeBC.cpp b/src/Inciter/NodeBC.cpp index db2d1a09048..ea9afdd6c98 100644 --- a/src/Inciter/NodeBC.cpp +++ b/src/Inciter/NodeBC.cpp @@ -25,7 +25,7 @@ namespace inciter { extern std::vector< CGPDE > g_cgpde; std::unordered_map< std::size_t, std::vector< std::pair< bool, tk::real > > > -match( tk::ctr::ncomp_type ncomp, +match( [[maybe_unused]] tk::ctr::ncomp_t ncomp, tk::real t, tk::real dt, const tk::UnsMesh::Coords& coord, @@ -144,10 +144,8 @@ match( tk::ctr::ncomp_type ncomp, // equal to the total number of scalar components for all systems of PDEs // integrated. Assert( std::all_of( begin(dirbc), end(dirbc), - [ ncomp ]( const decltype(dirbc)::value_type& n ){ - return n.second.size() == ncomp; } ), + [ ncomp ]( const auto& n ){ return n.second.size() == ncomp; } ), "Size of NodeBC vector incorrect" ); - IGNORE( ncomp ); return dirbc; } diff --git a/src/Inciter/NodeBC.hpp b/src/Inciter/NodeBC.hpp index 34e131fbaba..66232908894 100644 --- a/src/Inciter/NodeBC.hpp +++ b/src/Inciter/NodeBC.hpp @@ -25,7 +25,7 @@ namespace inciter { //! Match user-specified boundary conditions at nodes for side sets std::unordered_map< std::size_t, std::vector< std::pair< bool, tk::real > > > -match( tk::ctr::ncomp_type ncomp, +match( tk::ctr::ncomp_t ncomp, tk::real t, tk::real dt, const tk::UnsMesh::Coords& coord, diff --git a/src/Inciter/NodeDiagnostics.cpp b/src/Inciter/NodeDiagnostics.cpp index 656363d237a..621deebfcff 100644 --- a/src/Inciter/NodeDiagnostics.cpp +++ b/src/Inciter/NodeDiagnostics.cpp @@ -34,8 +34,8 @@ void NodeDiagnostics::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details This routine is supposed to be called from a Charm++ nodeinit -//! routine. Since the runtime system executes nodeinit routines exactly once +//! \details This routine is supposed to be called from a Charm++ initnode +//! routine. Since the runtime system executes initnode routines exactly once //! on every logical node early on in the Charm++ init sequence, they must be //! static as they are called without an object. See also: Section //! "Initializations at Program Startup" at in the Charm++ manual diff --git a/src/Inciter/PUPAMR.cpp b/src/Inciter/PUPAMR.cpp index 32316760e85..16e50888abc 100644 --- a/src/Inciter/PUPAMR.cpp +++ b/src/Inciter/PUPAMR.cpp @@ -65,17 +65,6 @@ void PUP::pup( PUP::er &p, AMR::edge_t& e ) p | e.get_data(); } -void PUP::pup( PUP::er &p, AMR::marked_refinements_store_t& m ) -// ***************************************************************************** -// Pack/Unpack marked_refinements_store_t -//! \param[in] p Charm++'s pack/unpack object -//! \param[in,out] m marked_refinements_store_t object reference -// ***************************************************************************** -{ - p | m.data(); - p | m.get_state_changed(); -} - void PUP::pup( PUP::er &p, AMR::active_element_store_t& a ) // ***************************************************************************** // Pack/Unpack active_element_store_t @@ -115,6 +104,7 @@ void PUP::pup( PUP::er &p, AMR::tet_store_t& t ) // ***************************************************************************** { p | t.center_tets; + p | t.delete_list; p | t.active_elements.data(); p | t.master_elements.data(); p | t.active_tetinpoel; @@ -125,6 +115,7 @@ void PUP::pup( PUP::er &p, AMR::tet_store_t& t ) p | t.tets; p | t.edge_store; p | t.marked_refinements; + p | t.marked_derefinements; } void PUP::pup( PUP::er &p, AMR::mesh_adapter_t& m ) diff --git a/src/Inciter/PUPAMR.hpp b/src/Inciter/PUPAMR.hpp index 303b0376e3d..22a23cc85d9 100644 --- a/src/Inciter/PUPAMR.hpp +++ b/src/Inciter/PUPAMR.hpp @@ -72,11 +72,18 @@ inline void operator|( PUP::er& p, AMR::edge_t& e ) { pup(p,e); } /** @name Charm++ pack/unpack serializer member functions for marked_refinements_store_t */ ///@{ //! Pack/Unpack marked_refinements_store_t -void pup( PUP::er &p, AMR::marked_refinements_store_t& m ); +//! \param[in] p Charm++'s pack/unpack object +//! \param[in,out] m marked_refinements_store_t object reference +template< class case_t > +void pup( PUP::er &p, AMR::marked_refinements_store_t< case_t >& m ) { + p | m.data(); + p | m.get_state_changed(); +} //! Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] m marked_refinements_store_t object reference -inline void operator|( PUP::er& p, AMR::marked_refinements_store_t& m ) +template< class case_t > +inline void operator|( PUP::er& p, AMR::marked_refinements_store_t& m ) { pup(p,m); } //@} diff --git a/src/Inciter/Partitioner.cpp b/src/Inciter/Partitioner.cpp index e22b5fa5208..daeae2053e5 100644 --- a/src/Inciter/Partitioner.cpp +++ b/src/Inciter/Partitioner.cpp @@ -121,13 +121,13 @@ Partitioner::ownBndNodes( { std::map< int, std::vector< std::size_t > > bnode_own; - for (const auto& s : bnode) { - auto& b = bnode_own[ s.first ]; - for (auto n : s.second) { + for (const auto& [ setid, nodes ] : bnode) { + auto& b = bnode_own[ setid ]; + for (auto n : nodes) { auto i = lid.find( n ); if (i != end(lid)) b.push_back( n ); } - if (b.empty()) bnode_own.erase( s.first ); + if (b.empty()) bnode_own.erase( setid ); } bnode = std::move(bnode_own); @@ -187,39 +187,39 @@ Partitioner::addMesh( { // Store mesh connectivity and global node coordinates categorized by chares. // The send side also writes to the data written here, so concat. - for (const auto& c : chmesh) { - Assert( node(c.first) == CkMyNode(), "Compute node " + for (const auto& [ chareid, chunk ] : chmesh) { + Assert( node(chareid) == CkMyNode(), "Compute node " + std::to_string(CkMyNode()) + " received a mesh whose chare it does not own" ); // Store domain element (tetrahedron) connectivity - const auto& inpoel = std::get< 0 >( c.second ); - auto& inp = m_chinpoel[ c.first ]; // will store tetrahedron connectivity + const auto& inpoel = std::get< 0 >( chunk ); + auto& inp = m_chinpoel[ chareid ]; // will store tetrahedron connectivity inp.insert( end(inp), begin(inpoel), end(inpoel) ); // Store mesh node coordinates associated to global node IDs - const auto& coord = std::get< 1 >( c.second ); + const auto& coord = std::get< 1 >( chunk ); Assert( tk::uniquecopy(inpoel).size() == coord.size(), "Size mismatch" ); - auto& chcm = m_chcoordmap[ c.first ]; // will store node coordinates + auto& chcm = m_chcoordmap[ chareid ]; // will store node coordinates chcm.insert( begin(coord), end(coord) ); // concatenate node coords // Store boundary side set id + face ids + face connectivities - const auto& bconn = std::get< 2 >( c.second ); - auto& bface = m_chbface[ c.first ]; // for side set id + boundary face ids - auto& t = m_chtriinpoel[ c.first ]; // for boundary face connectivity - auto& f = m_nface[ c.first ]; // use counter for chare - for (const auto& s : bconn) { - auto& b = bface[ s.first ]; - for (std::size_t i=0; i( chunk ); + auto& bface = m_chbface[ chareid ]; // for side set id + boundary face ids + auto& t = m_chtriinpoel[ chareid ]; // for boundary face connectivity + auto& f = m_nface[ chareid ]; // use counter for chare + for (const auto& [ setid, faceids ] : bconn) { + auto& b = bface[ setid ]; + for (std::size_t i=0; i( c.second ); - auto& nodes = m_chbnode[ c.first ]; // for side set id + boundary nodes - for (const auto& s : bnode) { - auto& b = nodes[ s.first ]; - b.insert( end(b), begin(s.second), end(s.second) ); + const auto& bnode = std::get< 3 >( chunk ); + auto& nodes = m_chbnode[ chareid ]; // for side set id + boundary nodes + for (const auto& [ setid, bnodes ] : bnode) { + auto& b = nodes[ setid ]; + b.insert( end(b), begin(bnodes), end(bnodes) ); } } @@ -357,17 +357,17 @@ Partitioner::categorize( const std::vector< std::size_t >& target ) const // Build hash map associating side set id to boundary faces std::unordered_map< Face, int, tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> > faceside; - for (const auto& s : m_bface) - for (auto f : s.second) + for (const auto& [ setid, faceids ] : m_bface) + for (auto f : faceids) faceside[ {{ m_triinpoel[f*3+0], m_triinpoel[f*3+1], - m_triinpoel[f*3+2] }} ] = s.first; + m_triinpoel[f*3+2] }} ] = setid; // Build hash map associating side set ids to boundary nodes std::unordered_map< std::size_t, std::unordered_set< int > > nodeside; - for (const auto& s : m_bnode) - for (auto n : s.second) - nodeside[ n ].insert( s.first ); + for (const auto& [ setid, nodes ] : m_bnode) + for (auto n : nodes) + nodeside[ n ].insert( setid ); // Categorize mesh data (tets, node coordinates, and boundary data) by target // chare based on which chare the partitioner assigned elements (tets) to @@ -483,21 +483,21 @@ Partitioner::distribute( std::unordered_map< int, MeshData >&& mesh ) auto& bface = m_chbface[ chid ]; // will store own boundary faces auto& t = m_chtriinpoel[ chid ]; // wil store own boundary face conn auto& f = m_nface[ chid ]; // use counter for chare - for (const auto& s : bconn) { - auto& b = bface[ s.first ]; - for (std::size_t i=0; i( it->second ); auto& nodes = m_chbnode[ chid ]; // will store own boundary nodes - for (const auto& s : bnode) { - auto& b = nodes[ s.first ]; - b.insert( end(b), begin(s.second), end(s.second) ); + for (const auto& [ setid, nodeids ] : bnode) { + auto& b = nodes[ setid ]; + b.insert( end(b), begin(nodeids), end(nodeids) ); } // Remove chare ID and mesh data mesh.erase( it ); @@ -534,8 +534,8 @@ Partitioner::distribute( std::unordered_map< int, MeshData >&& mesh ) contribute( m_cbp.get< tag::distributed >() ); } else { m_ndist += exp.size(); - for (const auto& p : exp) - thisProxy[ p.first ].addMesh( CkMyNode(), p.second ); + for (const auto& [ targetchare, chunk ] : exp) + thisProxy[ targetchare ].addMesh( CkMyNode(), chunk ); } } diff --git a/src/Inciter/Partitioner.hpp b/src/Inciter/Partitioner.hpp index 0c4aeb86eae..a194d589620 100644 --- a/src/Inciter/Partitioner.hpp +++ b/src/Inciter/Partitioner.hpp @@ -67,6 +67,16 @@ class Partitioner : public CBase_Partitioner { const std::map< int, std::vector< std::size_t > >& faces, const std::map< int, std::vector< std::size_t > >& bnode ); + #if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wundefined-func-template" + #endif + //! Migrate constructor + explicit Partitioner( CkMigrateMessage* m ) : CBase_Partitioner( m ) {} + #if defined(__clang__) + #pragma clang diagnostic pop + #endif + //! Partition the computational mesh into a number of chares void partition( int nchare ); @@ -86,6 +96,46 @@ class Partitioner : public CBase_Partitioner { //! Optionally start refining the mesh void refine(); + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \note This is a Charm++ nodegroup, pup() is thus only for + //! checkpoint/restart. + void pup( PUP::er &p ) override { + p | m_cbp; + p | m_cbr; + p | m_cbs; + p | m_host; + p | m_refiner; + p | m_sorter; + p | m_meshwriter; + p | m_scheme; + p | m_ginpoel; + p | m_coord; + p | m_inpoel; + p | m_lid; + p | m_ndist; + p | m_nchare; + p | m_nface; + p | m_nodech; + p | m_linnodes; + p | m_chinpoel; + p | m_chcoordmap; + p | m_chbface; + p | m_chtriinpoel; + p | m_chbnode; + p | m_bnodechares; + p | m_bface; + p | m_triinpoel; + p | m_bnode; + } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] i Partitioner object reference + friend void operator|( PUP::er& p, Partitioner& i ) { i.pup(p); } + //@} + private: //! Charm++ callbacks associated to compile-time tags for partitioner tk::PartitionerCallback m_cbp; diff --git a/src/Inciter/Refiner.cpp b/src/Inciter/Refiner.cpp index 25c91d457d8..967488c01d4 100644 --- a/src/Inciter/Refiner.cpp +++ b/src/Inciter/Refiner.cpp @@ -80,9 +80,12 @@ Refiner::Refiner( const CProxy_Transporter& transporter, m_oldTets(), m_addedNodes(), m_addedTets(), - m_prevnTets( 0 ), + m_oldntets( 0 ), m_coarseBndFaces(), - m_coarseBndNodes() + m_coarseBndNodes(), + m_rid( ginpoel.size() ), + m_lref( ginpoel.size() ), + m_parent() // ***************************************************************************** // Constructor //! \param[in] transporter Transporter (host) proxy @@ -109,6 +112,12 @@ Refiner::Refiner( const CProxy_Transporter& transporter, Assert( tk::conforming( m_inpoel, m_coord ), "Input mesh to Refiner not conforming" ); + // Fill initial (matching) mapping between local and refiner node ids + std::iota( begin(m_rid), end(m_rid), 0 ); + // Fill in inverse, mapping refiner to local node ids + std::size_t i = 0; + for (auto r : m_rid) m_lref[r] = i++; + // Reverse initial mesh refinement type list (will pop from back) std::reverse( begin(m_initref), end(m_initref) ); @@ -123,7 +132,6 @@ Refiner::Refiner( const CProxy_Transporter& transporter, endt0ref(); } - void Refiner::coarseBnd() // ***************************************************************************** @@ -132,9 +140,9 @@ Refiner::coarseBnd() { // Generate unique set of faces for each side set of the input (coarsest) mesh m_coarseBndFaces.clear(); - for (const auto& s : m_bface) { // for all phsyical boundaries (sidesets) - auto& faces = m_coarseBndFaces[ s.first ]; - for (auto f : s.second) { + for (const auto& [ setid, faceids ] : m_bface) { + auto& faces = m_coarseBndFaces[ setid ]; + for (auto f : faceids) { faces.insert( {{{ m_triinpoel[f*3+0], m_triinpoel[f*3+1], m_triinpoel[f*3+2] }}} ); } @@ -142,8 +150,8 @@ Refiner::coarseBnd() // Generate unique set of nodes for each side set of the input (coarsest) mesh m_coarseBndNodes.clear(); - for (const auto& s : m_bnode) { // for all phsyical boundaries (sidesets) - m_coarseBndNodes[ s.first ].insert( begin(s.second), end(s.second) ); + for (const auto& [ setid, nodes ] : m_bnode) { + m_coarseBndNodes[ setid ].insert( begin(nodes), end(nodes) ); } } @@ -156,18 +164,18 @@ Refiner::sendProxy() // ***************************************************************************** { // Make sure (bound) Discretization chare is already created and accessible - Assert( m_scheme.get()[thisIndex].ckLocal() != nullptr, + Assert( m_scheme.disc()[thisIndex].ckLocal() != nullptr, "About to dereference nullptr" ); // Pass Refiner Charm++ chare proxy to fellow (bound) Discretization object - m_scheme.get()[thisIndex].ckLocal()->setRefiner( thisProxy ); + m_scheme.disc()[thisIndex].ckLocal()->setRefiner( thisProxy ); } void Refiner::registerReducers() // ***************************************************************************** // Configure Charm++ reduction types -//! \details Since this is a [nodeinit] routine, the runtime system executes the +//! \details Since this is a [initnode] routine, the runtime system executes the //! routine exactly once on every logical node early on in the Charm++ init //! sequence. Must be static as it is called without an object. See also: //! Section "Initializations at Program Startup" at in the Charm++ manual @@ -218,12 +226,12 @@ Refiner::flatcoord( const tk::UnsMesh::CoordMap& coordmap ) coord[0].resize( npoin ); coord[1].resize( npoin ); coord[2].resize( npoin ); - for (const auto& c : coordmap) { - auto i = tk::cref_find( m_lid, c.first ); + for (const auto& [ gid, coords ] : coordmap) { + auto i = tk::cref_find( m_lid, gid ); Assert( i < npoin, "Indexing out of coordinate map" ); - coord[0][i] = c.second[0]; - coord[1][i] = c.second[1]; - coord[2][i] = c.second[2]; + coord[0][i] = coords[0]; + coord[1][i] = coords[1]; + coord[2][i] = coords[2]; } return coord; @@ -295,7 +303,7 @@ Refiner::bndEdges() // ***************************************************************************** { // Generate boundary edges of our mesh chunk - tk::UnsMesh::EdgeSet bnded; + EdgeSet bnded; auto esup = tk::genEsup( m_inpoel, 4 ); // elements surrounding points auto esuel = tk::genEsuelTet( m_inpoel, esup ); // elems surrounding elements for (std::size_t e=0; e; - for (const auto& e : ed) { - red.push_back( edge_data_t{ e.first, e.second.first, e.second.second } ); - re.push_back( e.first ); + using edge_data_t = std::tuple< Edge, int, AMR::Edge_Lock_Case >; + for (const auto& [ edge, data ] : ed) { + red.push_back( edge_data_t{ edge, data.first, data.second } ); + re.push_back( edge ); } - // Add the intermediates to mesh refiner lib - for (const auto i : intermediates) { - auto l = m_lid.find( i ); // convert to local node ids + // Add intermediates to mesh refiner lib + for (const auto g : intermediates) { + auto l = m_lid.find( g ); // convert to local node ids if (l != end(m_lid)) { - m_refiner.tet_store.intermediate_list.insert( l->second ); + m_refiner.tet_store.intermediate_list.insert( m_rid[l->second] ); } } @@ -483,18 +495,14 @@ Refiner::correctref() AMR::EdgeData extra; // loop through all edges shared with other chares - for (const auto& c : m_remoteEdgeData) { // for all chares we share edges with - for (const auto& r : c.second) { // for all edges shared with c.first - const auto& edge = std::get< 0 >( r ); + for (const auto& [ neighborchare, edgedata ] : m_remoteEdgeData) { + for (const auto& [edge,remote_needs_refining,remote_lock_case] : edgedata) { // find local data of remote edge auto it = m_localEdgeData.find( edge ); - if (it != end(m_localEdgeData)) - { + if (it != end(m_localEdgeData)) { auto& local = it->second; auto& local_needs_refining = local.first; auto& local_lock_case = local.second; - auto remote_needs_refining = std::get<1>(r); - auto remote_lock_case = std::get<2>(r); auto local_needs_refining_orig = local_needs_refining; auto local_lock_case_orig = local_lock_case; @@ -524,10 +532,13 @@ Refiner::correctref() (local_lock_case != remote_lock_case || local_needs_refining != remote_needs_refining) ) { - auto l1 = tk::cref_find( m_lid, std::get<0>(r)[0] ); - auto l2 = tk::cref_find( m_lid, std::get<0>(r)[1] ); + auto l1 = tk::cref_find( m_lid, edge[0] ); + auto l2 = tk::cref_find( m_lid, edge[1] ); Assert( l1 != l2, "Edge end-points local ids are the same" ); - extra[ {{ std::min(l1,l2), std::max(l1,l2) }} ] = + auto r1 = m_rid[ l1 ]; + auto r2 = m_rid[ l2 ]; + Assert( r1 != r2, "Edge end-points refiner ids are the same" ); + extra[ {{ std::min(r1,r2), std::max(r1,r2) }} ] = { local_needs_refining, local_lock_case }; } } @@ -544,8 +555,13 @@ Refiner::correctref() updateEdgeData(); } - // Aggregate number of extra edges that still need correction - std::vector< std::size_t > m{ m_extra, m_localEdgeData.size(), m_initial }; + // Aggregate number of extra edges that still need correction and some + // refinement/derefinement statistics + const auto& tet_store = m_refiner.tet_store; + std::vector< std::size_t > m{ m_extra, + tet_store.marked_refinements.size(), + tet_store.marked_derefinements.size(), + m_initial }; contribute( m, CkReduction::sum_ulong, m_cbr.get< tag::matched >() ); } @@ -555,47 +571,88 @@ Refiner::updateEdgeData() // Query AMR lib and update our local store of edge data // ***************************************************************************** { - using Edge = tk::UnsMesh::Edge; - const auto& ref_edges = m_refiner.tet_store.edge_store.edges; - m_localEdgeData.clear(); m_intermediates.clear(); // This currently takes ALL edges from the AMR lib, i.e., on the whole // domain. We should eventually only collect edges here that are shared with // other chares. - for (const auto& e : ref_edges) { - const auto& ed = e.first.get_data(); - const auto ged = Edge{{ m_gid[ ed[0] ], m_gid[ ed[1] ] }}; - m_localEdgeData[ ged ] = { e.second.needs_refining, e.second.lock_case }; + const auto& ref_edges = m_refiner.tet_store.edge_store.edges; + const auto& refinpoel = m_refiner.tet_store.get_active_inpoel(); + for (std::size_t e=0; e edges{{ {{A,B}}, {{B,C}}, {{A,C}}, + {{A,D}}, {{B,D}}, {{C,D}} }}; + for (const auto& ed : edges) { + auto ae = AMR::edge_t{{{ std::min(ed[0],ed[1]), std::max(ed[0],ed[1]) }}}; + auto r = tk::cref_find( ref_edges, ae ); + const auto ged = Edge{{ m_gid[ tk::cref_find( m_lref, ed[0] ) ], + m_gid[ tk::cref_find( m_lref, ed[1] ) ] }}; + m_localEdgeData[ ged ] = { r.needs_refining, r.lock_case }; + } } // Build intermediates to send. This currently takes ALL intermediates from // the AMR lib, i.e., on the whole domain. We should eventually only collect // edges here that are shared with other chares. - for (const auto& i : m_refiner.tet_store.intermediate_list) { - m_intermediates.insert( m_gid[i] ); + for (const auto& r : m_refiner.tet_store.intermediate_list) { + m_intermediates.insert( m_gid[ tk::cref_find( m_lref, r ) ] ); } } std::tuple< std::vector< std::string >, + std::vector< std::vector< tk::real > >, + std::vector< std::string >, std::vector< std::vector< tk::real > > > Refiner::refinementFields() const // ***************************************************************************** // Collect mesh output fields from refiner lib -//! \return The names and fields of mesh refinement data in mesh cells, ready -//! for file output +//! \return Names and fields of mesh refinement data in mesh cells and nodes // ***************************************************************************** { + // Find number of nodes in current mesh + auto npoin = tk::npoin_in_graph( m_inpoel ); + // Generate edges surrounding points in current mesh + auto esup = tk::genEsup( m_inpoel, 4 ); + + // Update solution on current mesh + auto u = solution( npoin, esup ); + Assert( u.nunk() == npoin, "Solution uninitialized or wrong size" ); + + // Compute error in edges on current mesh + auto edgeError = errorsInEdges( npoin, esup, u ); + + // Transfer error from edges to cells for field output + std::vector< tk::real > error( m_inpoel.size()/4, 0.0 ); + for (std::size_t e=0; e edges{{ {{A,B}}, {{B,C}}, {{A,C}}, + {{A,D}}, {{B,D}}, {{C,D}} }}; + // sum error from edges to elements + for (const auto& ed : edges) error[e] += tk::cref_find( edgeError, ed ); + error[e] /= 6.0; // assign edge-average error to element + } + // Prepare element fields with mesh refinement data - std::vector< std::string > elemfieldnames{ "refinement level", "cell type" }; + std::vector< std::string > + elemfieldnames{ "refinement level", "cell type", "error" }; auto& tet_store = m_refiner.tet_store; std::vector< std::vector< tk::real > > elemfields{ - tet_store.get_refinement_level_list(), tet_store.get_cell_type_list() }; + tet_store.get_refinement_level_list(), + tet_store.get_cell_type_list(), + error }; using tuple_t = std::tuple< std::vector< std::string >, + std::vector< std::vector< tk::real > >, + std::vector< std::string >, std::vector< std::vector< tk::real > > >; - return tuple_t{ elemfieldnames, elemfields }; + return tuple_t{ elemfieldnames, elemfields, {}, {} }; } void @@ -613,8 +670,10 @@ Refiner::writeMesh( const std::string& basefilename, // ***************************************************************************** { auto r = refinementFields(); - auto elemfieldnames = std::get< 0 >( r ); - auto elemfields = std::get< 1 >( r ); + auto& elemfieldnames = std::get< 0 >( r ); + auto& elemfields = std::get< 1 >( r ); + auto& nodefieldnames = std::get< 2 >( r ); + auto& nodefields = std::get< 3 >( r ); // Prepare solution field names: depvar + component id for all eqs auto nprop = g_inputdeck.get< tag::component >().nprop(); @@ -625,9 +684,6 @@ Refiner::writeMesh( const std::string& basefilename, const auto centering = ctr::Scheme().centering( scheme ); auto t0 = g_inputdeck.get< tag::discr, tag::t0 >(); - std::vector< std::vector< tk::real > > nodefields; - std::vector< std::string > nodefieldnames; - // Prepare node or element fields for output to file if (centering == tk::Centering::NODE) { @@ -669,15 +725,15 @@ Refiner::writeMesh( const std::string& basefilename, // Output mesh m_meshwriter[ CkNodeFirst( CkMyNode() ) ]. write( /*meshoutput = */ true, /*fieldoutput = */ true, itr, 1, t, - thisIndex, basefilename, m_inpoel, m_coord, m_bface, m_bnode, - tk::remap(m_triinpoel,m_lid), elemfieldnames, nodefieldnames, - elemfields, nodefields, c ); + thisIndex, basefilename, m_inpoel, m_coord, m_bface, + tk::remap(m_bnode,m_lid), tk::remap(m_triinpoel,m_lid), + elemfieldnames, nodefieldnames, elemfields, nodefields, c ); } void -Refiner::eval() +Refiner::perform() // ***************************************************************************** -// Refine mesh and decide how to continue +// Perform mesh refinement and decide how to continue //! \details First the mesh refiner object is called to perform a single step //! of mesh refinement. Then, if this function is called during a step //! (potentially multiple levels of) initial AMR, it evaluates whether to do @@ -686,12 +742,18 @@ Refiner::eval() //! (Discretization). // ***************************************************************************** { - // Save old tet ids before performing refinement - m_prevnTets = m_oldTets.size(); // save number tets before refinement + // Save old tets and their ids before performing refinement + m_oldntets = m_oldTets.size(); m_oldTets.clear(); - for (const auto& t : m_refiner.tet_store.tets) m_oldTets.insert( t.first ); + for (const auto& [ id, tet ] : m_refiner.tet_store.tets) + m_oldTets.insert( tet ); + //auto& tet_store = m_refiner.tet_store; + //std::cout << "before ref: " << tet_store.marked_refinements.size() << ", " << tet_store.marked_derefinements.size() << ", " << tet_store.size() << ", " << tet_store.get_active_inpoel().size() << '\n'; m_refiner.perform_refinement(); + //std::cout << "after ref: " << tet_store.marked_refinements.size() << ", " << tet_store.marked_derefinements.size() << ", " << tet_store.size() << ", " << tet_store.get_active_inpoel().size() << '\n'; + m_refiner.perform_derefinement(); + //std::cout << "after deref: " << tet_store.marked_refinements.size() << ", " << tet_store.marked_derefinements.size() << ", " << tet_store.size() << ", " << tet_store.get_active_inpoel().size() << '\n'; updateMesh(); @@ -724,13 +786,13 @@ Refiner::next() } else { // if AMR during time stepping (t>0) // Augment node communication map with newly added nodes on chare-boundary - for (const auto& c : m_remoteEdges) { - auto& nodes = tk::ref_find( m_msumset, c.first ); - for (const auto& e : c.second) { + for (const auto& [ neighborchare, edges ] : m_remoteEdges) { + auto& nodes = tk::ref_find( m_msumset, neighborchare ); + for (const auto& e : edges) { // If parent nodes were part of the node communication map for chare if (nodes.find(e[0]) != end(nodes) && nodes.find(e[1]) != end(nodes)) { // Add new node if local id was generated for it - auto n = tk::UnsMesh::Hash<2>()( e ); + auto n = Hash<2>()( e ); if (m_lid.find(n) != end(m_lid)) nodes.insert( n ); } } @@ -738,20 +800,14 @@ Refiner::next() // Convert to node communication map to vectors std::unordered_map< int, std::vector< std::size_t > > msum; - for (const auto& c : m_msumset) { - auto& n = msum[ c.first ]; - n.insert( end(n), c.second.cbegin(), c.second.cend() ); + for (const auto& [ neighborchare, sharednodes ] : m_msumset) { + auto& n = msum[ neighborchare ]; + n.insert( end(n), begin(sharednodes), end(sharednodes) ); } // Send new mesh, solution, and communication data back to PDE worker - Assert( m_scheme.get()[thisIndex].ckLocal() != nullptr, - "About to use nullptr" ); - auto e = tk::element< SchemeBase::ProxyElem > - ( m_scheme.getProxy(), thisIndex ); - boost::apply_visitor( - ResizeAfterRefined( m_ginpoel, m_el, m_coord, m_addedNodes, m_addedTets, - msum, m_bface, m_bnode, m_triinpoel ), e ); - + m_scheme.ckLocal< Scheme::resizePostAMR >( thisIndex, m_ginpoel, m_el, + m_coord, m_addedNodes, m_addedTets, msum, m_bface, m_bnode, m_triinpoel ); } } @@ -794,19 +850,77 @@ Refiner::uniformRefine() } void -Refiner::errorRefine() +Refiner::uniformDeRefine() // ***************************************************************************** -// Do error-based mesh refinement +// Do uniform mesh derefinement // ***************************************************************************** { - // Find number of nodes in old mesh - auto npoin = tk::npoin_in_graph( m_inpoel ); - // Generate edges surrounding points in old mesh - auto esup = tk::genEsup( m_inpoel, 4 ); + // Do uniform derefinement + m_refiner.mark_uniform_derefinement(); + + // Update our extra-edge store based on refiner + updateEdgeData(); + + // Set number of extra edges to be zero, skipping correction (if this is the + // only step in this refinement step) + m_extra = 0; +} + +Refiner::EdgeError +Refiner::errorsInEdges( + std::size_t npoin, + const std::pair< std::vector, std::vector >& esup, + const tk::Fields& u ) const +// ***************************************************************************** +// Compute errors in edges +//! \param[in] npoin Number nodes in current mesh (partition) +//! \param[in] esup Elements surrounding points linked vectors +//! \param[in] u Solution evaluated at mesh nodes for all scalar components +//! \return A map associating errors (real values between 0.0 and 1.0 incusive) +//! to edges (2 local node IDs) +// ***************************************************************************** +{ + // Get the indices (in the system of systems) of refinement variables and the + // error indicator configured + const auto& refidx = g_inputdeck.get< tag::amr, tag::id >(); + auto errtype = g_inputdeck.get< tag::amr, tag::error >(); + + // Compute points surrounding points auto psup = tk::genPsup( m_inpoel, 4, esup ); + // Compute errors in ICs and define refinement criteria for edges + AMR::Error error; + EdgeError edgeError; + + for (std::size_t p=0; p cmax) cmax = c; // find max error at edge + } + edgeError[ {{p,q}} ] = cmax; // associate error to edge + } + } + + return edgeError; +} + +tk::Fields +Refiner::solution( std::size_t npoin, + const std::pair< std::vector< std::size_t >, + std::vector< std::size_t > >& esup ) const +// ***************************************************************************** +// Update (or evaluate) solution on current mesh +//! \param[in] npoin Number nodes in current mesh (partition) +//! \param[in] esup Elements surrounding points linked vectors +//! \return Solution updated/evaluated for all scalar components +// ***************************************************************************** +{ // Get solution whose error to evaluate tk::Fields u; + if (m_initial) { // initial (before t=0) AMR // Evaluate initial conditions at mesh nodes @@ -815,41 +929,52 @@ Refiner::errorRefine() } else { // AMR during time stepping (t>0) // Query current solution - auto e = tk::element< SchemeBase::ProxyElem > - ( m_scheme.getProxy(), thisIndex ); - u = boost::apply_visitor( solution(), e ); + u = m_scheme.ckLocal< Scheme::solution >( thisIndex ); const auto scheme = g_inputdeck.get< tag::discr, tag::scheme >(); const auto centering = ctr::Scheme().centering( scheme ); if (centering == tk::Centering::ELEM) { + // ... } } - Assert( u.nunk() == npoin, "Solution uninitialized or wrong size" ); + return u; +} - // Get the indices (in the system of systems) of refinement variables and the - // error indicator configured - const auto& refidx = g_inputdeck.get< tag::amr, tag::id >(); - auto errtype = g_inputdeck.get< tag::amr, tag::error >(); +void +Refiner::errorRefine() +// ***************************************************************************** +// Do error-based mesh refinement and derefinement +// ***************************************************************************** +{ + // Find number of nodes in old mesh + auto npoin = tk::npoin_in_graph( m_inpoel ); + // Generate edges surrounding points in old mesh + auto esup = tk::genEsup( m_inpoel, 4 ); - using AMR::edge_t; + // Update solution on current mesh + auto u = solution( npoin, esup ); + Assert( u.nunk() == npoin, "Solution uninitialized or wrong size" ); - // Compute errors in ICs and define refinement criteria for edges - std::vector< edge_t > tagged_edges; - AMR::Error error; - for (std::size_t p=0; p cmax) cmax = c; // find max error at edge - } - // if error is large, will pass edge to refiner - if (cmax > 0.8) tagged_edges.push_back( e ); + using AMR::edge_t; + using AMR::edge_tag; + + // Compute error in edges. Tag edge for refinement if error exceeds + // refinement tolerance, tag edge for derefinement if error is below + // derefinement tolerance. + auto tolref = g_inputdeck.get< tag::amr, tag::tolref >(); + auto tolderef = g_inputdeck.get< tag::amr, tag::tolderef >(); + std::vector< std::pair< edge_t, edge_tag > > tagged_edges; + for (const auto& e : errorsInEdges(npoin,esup,u)) { + if (e.second > tolref) { + tagged_edges.push_back( { edge_t( m_rid[e.first[0]], m_rid[e.first[1]] ), + edge_tag::REFINE } ); + } else if (e.second < tolderef) { + tagged_edges.push_back( { edge_t( m_rid[e.first[0]], m_rid[e.first[1]] ), + edge_tag::DEREFINE } ); } } @@ -879,43 +1004,28 @@ Refiner::edgelistRefine() auto esup = tk::genEsup( m_inpoel, 4 ); auto psup = tk::genPsup( m_inpoel, 4, esup ); - tk::UnsMesh::EdgeSet useredges; + EdgeSet useredges; for (std::size_t i=0; i edge; - //std::cout << thisIndex << ": "; + std::vector< std::pair< edge_t, edge_tag > > tagged_edges; for (std::size_t p=0; p eps ? true : false; using AMR::edge_t; + using AMR::edge_tag; if (xm || xp || ym || yp || zm || zp) { // if any half-world configured // Find number of nodes in old mesh @@ -965,10 +1076,10 @@ Refiner::coordRefine() const auto& y = m_coord[1]; const auto& z = m_coord[2]; // Compute edges to be tagged for refinement - std::vector< edge_t > edge; + std::vector< std::pair< edge_t, edge_tag > > tagged_edges; for (std::size_t p=0; pxminus && x[q]>xminus) t = false; } @@ -978,11 +1089,14 @@ Refiner::coordRefine() if (zm) { if (z[p]>zminus && z[q]>zminus) t = false; } if (zp) { if (z[p], - std::vector< std::size_t > >& esup ) + std::vector< std::size_t > >& esup ) const // ***************************************************************************** // Evaluate initial conditions (IC) at mesh nodes //! \param[in] npoin Number points in mesh (on this chare) @@ -1065,28 +1179,31 @@ Refiner::updateMesh() "Mesh not conforming after refinement" ); // Generate unique node lists of old and refined mesh using local ids - std::unordered_set< std::size_t > old( begin(m_inpoel), end(m_inpoel) ); + auto rinpoel = m_inpoel; + tk::remap( rinpoel, m_rid ); + std::unordered_set< std::size_t > old( begin(rinpoel), end(rinpoel) ); std::unordered_set< std::size_t > ref( begin(refinpoel), end(refinpoel) ); + // Augment refiner id -> local node id map with newly added nodes + std::size_t l = m_lref.size(); + for (auto r : ref) if (old.find(r) == end(old)) m_lref[r] = l++; + // Get nodal communication map from Discretization worker - if (!m_initial) m_msumset = m_scheme.get()[thisIndex].ckLocal()->msumset(); + if (!m_initial) m_msumset = m_scheme.disc()[thisIndex].ckLocal()->msumset(); // Update mesh and solution after refinement newVolMesh( old, ref ); newBndMesh( ref ); - // Update mesh connectivity with local node IDs + // Update mesh connectivity from refiner lib, remapping refiner to local ids m_inpoel = m_refiner.tet_store.get_active_inpoel(); + tk::remap( m_inpoel, m_lref ); // Update mesh connectivity with new global node ids m_ginpoel = m_inpoel; Assert( tk::uniquecopy(m_ginpoel).size() == m_coord[0].size(), "Size mismatch" ); - // cppcheck-suppress useStlAlgorithm - for (auto& i : m_ginpoel) i = m_gid[i]; - - // Update flat coordinates storage - //m_coord = flatcoord( m_coordmap ); + tk::remap( m_ginpoel, m_gid ); // Ensure valid mesh after refinement Assert( tk::positiveJacobians( m_inpoel, m_coord ), @@ -1111,84 +1228,111 @@ Refiner::newVolMesh( const std::unordered_set< std::size_t >& old, //! \param[in] ref Unique nodes of the refined mesh using local ids // ***************************************************************************** { - auto& x = m_coord[0]; - auto& y = m_coord[1]; - auto& z = m_coord[2]; - - // Resize node coordinates, global ids, and added-nodes map - auto npoin = ref.size(); - x.resize( npoin ); - y.resize( npoin ); - z.resize( npoin ); - m_gid.resize( npoin, std::numeric_limits< std::size_t >::max() ); - m_addedNodes.clear(); + const auto& x = m_coord[0]; + const auto& y = m_coord[1]; + const auto& z = m_coord[2]; - // Generate coordinates and ids to newly added nodes after refinement step + // Generate coordinates and ids to newly added nodes after refinement + std::unordered_map< std::size_t, std::size_t > gid_add; + m_addedNodes.clear(); for (auto r : ref) { // for all unique nodes of the refined mesh - if (old.find(r) == end(old)) { // if node is newly added (in this step) + if (old.find(r) == end(old)) { // if node is newly added // get (local) parent ids of newly added node auto p = m_refiner.node_connectivity.get( r ); Assert( old.find(p[0]) != end(old) && old.find(p[1]) != end(old), "Parent(s) not in old mesh" ); Assert( r >= old.size(), "Attempting to overwrite node with added one" ); + // local parent ids + decltype(p) lp{{tk::cref_find(m_lref,p[0]), tk::cref_find(m_lref,p[1])}}; // global parent ids - decltype(p) gp{{ m_gid[p[0]], m_gid[p[1]] }}; + decltype(p) gp{{m_gid[lp[0]], m_gid[lp[1]]}}; // generate new global ID for newly added node - auto g = tk::UnsMesh::Hash<2>()( gp ); + auto g = Hash<2>()( gp ); // if node added by AMR lib has not yet been added to Refiner's new mesh if (m_coordmap.find(g) == end(m_coordmap)) { - // ensure newly generated node id has not yet been used Assert( g >= old.size(), "Hashed id overwriting old id" ); - // generate coordinates for newly added node - x[r] = (x[p[0]] + x[p[1]])/2.0; - y[r] = (y[p[0]] + y[p[1]])/2.0; - z[r] = (z[p[0]] + z[p[1]])/2.0; - // store newly added node id and their parent ids (local ids) - m_addedNodes[r] = p; - // assign new global ids to local->global and to global->local maps - m_gid[r] = g; Assert( m_lid.find(g) == end(m_lid), "Overwriting entry global->local node ID map" ); - m_lid[g] = r; - // assign new coordinates to new global node id Assert( m_coordmap.find(g) == end(m_coordmap), "Overwriting entry already in coordmap" ); - m_coordmap.insert( {g, {{x[r], y[r], z[r]}}} ); + auto l = tk::cref_find( m_lref, r ); + // store newly added node id and their parent ids (local ids) + m_addedNodes[r] = lp; // key = r for later update to local + // assign new node to refiner->global map + gid_add[r] = g; // key = r for later search + // assign new node to global->local map + m_lid[g] = l; + // generate and store coordinates for newly added node + m_coordmap.insert( {g, {{ (x[lp[0]] + x[lp[1]])/2.0, + (y[lp[0]] + y[lp[1]])/2.0, + (z[lp[0]] + z[lp[1]])/2.0 }} } ); } } } - Assert( m_gid.size() == m_lid.size(), "Size mismatch" ); + // Remove coordinates and ids of removed nodes due to derefinement + std::unordered_map< std::size_t, std::size_t > gid_rem; + for (auto o : old) { // for all unique nodes of the old mesh + if (ref.find(o) == end(ref)) { // if node is no longer in new mesh + auto l = tk::cref_find( m_lref, o ); + auto g = m_gid[l]; + gid_rem[l] = g; + m_lid.erase( g ); + m_coordmap.erase( g ); + } + } - Assert( std::none_of( begin(m_gid), end(m_gid), [](std::size_t i){ - return i == std::numeric_limits< std::size_t >::max(); } ), - "Not all local->global node IDs have been assigned" ); + // Save previous states of refiner-local node id maps before update + m_oldrid = m_rid; + //m_oldlref = m_lref; + + // Generate new node id maps for nodes kept + m_lref.clear(); + std::vector< std::size_t > rid( ref.size() ); + std::vector< std::size_t > gid( ref.size() ); + std::size_t l = 0; // will generate new local node id + for (std::size_t i=0; i newtets; - for (const auto& t : tet_store.tets) - if (m_oldTets.find(t.first) == end(m_oldTets)) - newtets.push_back( t.first ); - - // Invert AMR's tet id map - std::unordered_map< std::size_t, std::size_t > newids; - std::size_t j = 0; - for (auto t : m_refiner.tet_store.get_active_id_mapping()) - newids[t] = j++; - - // Generate child->parent tet id map after refinement step - m_addedTets.clear(); - for (auto n : newtets) { - auto parent = tet_store.data( n ).parent_id; - Assert( parent < m_oldTets.size(), - "Parent tet id will index out of old solution vector" ); - auto child = tk::cref_find( newids, n ); - Assert( child < m_oldTets.size() + newtets.size(), - "New tet id will index out of new solution vector" ); - m_addedTets[ child ] = parent - m_prevnTets; + // Update node coordinates, ids, and id maps + tk::UnsMesh::Coords coord; + auto& rx = coord[0]; + auto& ry = coord[1]; + auto& rz = coord[2]; + rx.resize( ref.size() ); + ry.resize( ref.size() ); + rz.resize( ref.size() ); + for (std::size_t i=0; i @@ -1199,7 +1343,10 @@ Refiner::ancestors( std::size_t n ) //! \return Parents of local node id from the coarsest (original) mesh // ***************************************************************************** { - auto p = m_refiner.node_connectivity.get( n ); + auto d = m_refiner.node_connectivity.get( m_rid[n] ); + decltype(d) p{{ tk::cref_find( m_lref, d[0] ), + tk::cref_find( m_lref, d[1] ) }}; + std::unordered_set< std::size_t > s; if (p != AMR::node_pair_t{{n,n}}) { @@ -1217,30 +1364,32 @@ Refiner::ancestors( std::size_t n ) Refiner::BndFaceData Refiner::boundary() // ***************************************************************************** -// Generate boundary data structures used to update refined boundary faces and -// nodes of side sets +// Generate boundary data structures used to update refined/derefined boundary +// faces and nodes of side sets //! \return A tuple of boundary face data //! \details The output of this function is used to regenerate physical boundary //! face and node data structures after refinement, see updateBndFaces() and //! updateBndNodes(). // ***************************************************************************** { - using Face = tk::UnsMesh::Face; - using Tet = tk::UnsMesh::Tet; - // Generate the inverse of AMR's tet store - std::unordered_map< Tet, - std::size_t, - tk::UnsMesh::Hash<4>, - tk::UnsMesh::Eq<4> > invtets; - for (const auto& t : m_refiner.tet_store.tets) invtets[ t.second ] = t.first; - - // Generate data structure that associates the id of a tet adjacent to a - // boundary triangle face for all (physical and chare) boundary faces - std::unordered_map< Face, - std::size_t, - tk::UnsMesh::Hash<3>, - tk::UnsMesh::Eq<3> > pcFaceTets; + std::unordered_map< Tet, std::size_t, Hash<4>, Eq<4> > invtets; + for (const auto& [key, value] : m_refiner.tet_store.tets) + invtets[ value ] = key; + + //std::cout << thisIndex << " invt: " << invtets.size() << '\n'; + //std::cout << thisIndex << " active inpoel size: " << m_refiner.tet_store.get_active_inpoel().size() << '\n'; + //std::cout << thisIndex << " marked derefinement size: " << m_refiner.tet_store.marked_derefinements.size() << '\n'; + + // Generate data structure pcReFaceTets, that associates the id of a tet + // adjacent to a refined boundary triangle face for all (physical and chare) + // boundary faces in the old mesh (i.e., before the current + // refinement/derefinement step). Also generate data structure pcDeFaceTets, + // that associates the parent tetrahedron (given by four nodes) adjacent to a + // derefined boundary face for all (physical and chare) boundary faces in the + // old mesh (i.e., before the current refinement/derefinement step). + std::unordered_map< Face, std::size_t, Hash<3>, Eq<3> > pcReFaceTets; + std::unordered_map< Face, Tet, Hash<3>, Eq<3> > pcDeFaceTets; auto oldesuel = tk::genEsuelTet( m_inpoel, tk::genEsup(m_inpoel,4) ); for (std::size_t e=0; esecond; + } else { + // find parent tet + auto p = tk::cref_find( m_parent, t ); + // form all 4 faces of parent + //auto A = p[0]; + //auto B = p[1]; + //auto C = p[2]; + //auto D = p[3]; + auto A = tk::cref_find( m_lref, p[0] ); + auto B = tk::cref_find( m_lref, p[1] ); + auto C = tk::cref_find( m_lref, p[2] ); + auto D = tk::cref_find( m_lref, p[3] ); + // assign parent tet faces to derefined child's face + pcDeFaceTets[ b ] = {{ A, B, C, D }}; + } } } } + // Generate child->parent tet and id maps after refinement/derefinement step + decltype(m_parent) parent; + m_addedTets.clear(); + std::size_t p = 0; + std::size_t c = 0; + const auto& tet_store = m_refiner.tet_store; + for (const auto& t : tet_store.tets) { + // query number of children of tet + auto nc = tet_store.data( t.first ).children.size(); + for (decltype(nc) i=0; isecond[0] ); + //auto cB = tk::cref_find( m_lref, ct->second[1] ); + //auto cC = tk::cref_find( m_lref, ct->second[2] ); + //auto cD = tk::cref_find( m_lref, ct->second[3] ); + // get nodes of parent tet + //auto pA = tk::cref_find( m_lref, t.second[0] ); + //auto pB = tk::cref_find( m_lref, t.second[1] ); + //auto pC = tk::cref_find( m_lref, t.second[2] ); + //auto pD = tk::cref_find( m_lref, t.second[3] ); + // assign parent tet to child tet + //parent[ {{cA,cB,cC,cD}} ] = {{pA,pB,pC,pD}}; + parent[ ct->second ] = t.second; //{{pA,pB,pC,pD}}; + if (m_oldTets.find(ct->second) == end(m_oldTets)) { + m_addedTets[ c++ ] = p - m_oldntets; + } + } + ++p; + } + m_parent = std::move( parent ); + + //std::cout << thisIndex << " added: " << m_addedTets.size() << '\n'; + //std::cout << thisIndex << " parent: " << m_parent.size() << '\n'; + //std::cout << thisIndex << " pcret: " << pcReFaceTets.size() << '\n'; + //std::cout << thisIndex << " pcdet: " << pcDeFaceTets.size() << '\n'; + // Generate unique set of faces for each side set - std::unordered_map< int, tk::UnsMesh::FaceSet > bndFaces; - for (const auto& s : m_bface) { // for all phsyical boundaries (sidesets) - auto& faces = bndFaces[ s.first ]; - for (auto f : s.second) { + std::unordered_map< int, FaceSet > bndFaces; + for (const auto& [ setid, faceids ] : m_bface) { + auto& faces = bndFaces[ setid ]; + for (auto f : faceids) { faces.insert( {{{ m_triinpoel[f*3+0], m_triinpoel[f*3+1], m_triinpoel[f*3+2] }}} ); } } - // Generate data structure that associates the id of a tet adjacent to a - // boundary triangle face for only physical boundary faces. - decltype(pcFaceTets) bndFaceTets; - for (const auto& f : pcFaceTets) - if (!keys(bndFaces,f.first).empty()) - bndFaceTets.insert( f ); - - return BndFaceData{ bndFaceTets, bndFaces, pcFaceTets }; + return BndFaceData{ pcReFaceTets, pcDeFaceTets, bndFaces }; } void @@ -1288,28 +1492,20 @@ Refiner::newBndMesh( const std::unordered_set< std::size_t >& ref ) auto bnd = boundary(); // Regerate boundary faces and nodes after mesh refinement - updateBndFaces( ref, std::get<0>(bnd), std::get<1>(bnd) ); - updateBndNodes( ref, std::get<2>(bnd) ); + updateBndFaces( ref, bnd ); + updateBndNodes( ref, bnd ); } void Refiner::updateBndFaces( - const std::unordered_set< std::size_t >& ref, - const std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> >& bndFaceTets, - const std::unordered_map< int, tk::UnsMesh::FaceSet >& bndFaces ) + [[maybe_unused]] const std::unordered_set< std::size_t >& ref, + const BndFaceData& bnd ) // ***************************************************************************** // Regenerate boundary faces after mesh refinement step //! \param[in] ref Unique nodes of the refined mesh using local ids -//! \param[in] bndFaceTets Map associating the id of a tet adjacent to a -//! boundary triangle face for only physical boundary faces. -//! \param[in] bndFaces Unique set of faces for each side set +//! \param[in] bnd Boundary face data bundle // ***************************************************************************** { - IGNORE(ref); // to avoid compiler warning when asserts are optimized away - - using Face = tk::UnsMesh::Face; - // storage for boundary faces associated to side-set IDs of the refined mesh decltype(m_bface) bface; // will become m_bface // storage for boundary faces-node connectivity of the refined mesh @@ -1317,7 +1513,7 @@ Refiner::updateBndFaces( // face id counter std::size_t facecnt = 0; // will collect unique faces added for each side set - std::unordered_map< int, tk::UnsMesh::FaceSet > bnd; + std::unordered_map< int, FaceSet > bf; // Lambda to associate a boundary face and connectivity to a side set. // Argument 's' is the list of faces (ids) to add the new face to. Argument @@ -1326,29 +1522,34 @@ Refiner::updateBndFaces( auto addBndFace = [&]( std::vector< std::size_t >& s, int ss, const Face& f ) { // only add face if it has not yet been aded to this side set - if (bnd[ ss ].insert( f ).second) { + if (bf[ ss ].insert( f ).second) { s.push_back( facecnt++ ); triinpoel.insert( end(triinpoel), begin(f), end(f) ); } }; - // Regenerate boundary faces after refinement step + // Regenerate boundary faces for refined tets along side sets. For all + // refined faces associated to side sets, we find the ancestors (parents of + // nodes in the original/coarsest mesh) of the nodes comprising the faces of + // the tetrahedron adjacent to the refined face. + const auto& pcReFaceTets = std::get< 0 >( bnd ); + const auto& bndFaces = std::get< 2 >( bnd ); const auto& tet_store = m_refiner.tet_store; - for (const auto& f : bndFaceTets) { // for all boundary faces in old mesh + for (const auto& [ face, tetid ] : pcReFaceTets) { // for all side sets of the face, match children's faces to side sets - for (const auto& ss : keys(bndFaces,f.first)) { + for (const auto& ss : keys(bndFaces,face)) { // will associate to side set id of old (unrefined) mesh boundary face auto& faces = bface[ ss ]; const auto& coarsefaces = tk::cref_find( m_coarseBndFaces, ss ); // query number of children of boundary tet adjacent to boundary face - auto nc = tet_store.data( f.second ).children.size(); + auto nc = tet_store.data( tetid ).children.size(); if (nc == 0) { // if boundary tet is not refined, add its boundary face - addBndFace( faces, ss, f.first ); + addBndFace( faces, ss, face ); } else { // if boundary tet is refined const auto& tets = tet_store.tets; for (decltype(nc) i=0; isecond[0]; - auto B = ct->second[1]; - auto C = ct->second[2]; - auto D = ct->second[3]; + auto A = tk::cref_find( m_lref, ct->second[0] ); + auto B = tk::cref_find( m_lref, ct->second[1] ); + auto C = tk::cref_find( m_lref, ct->second[2] ); + auto D = tk::cref_find( m_lref, ct->second[3] ); // form all 4 faces of child tet - std::array face{{{{A,C,B}}, {{A,B,D}}, {{A,D,C}}, {{B,C,D}}}}; + std::array g{{{{A,C,B}}, {{A,B,D}}, {{A,D,C}}, {{B,C,D}}}}; // search all faces of child tet and match them to side sets of the // original (coarsest) mesh - for (const auto& rf : face) { // for all faces of child tet + for (const auto& rf : g) { // for all faces of child tet auto a = ancestors( rf[0] ); auto b = ancestors( rf[1] ); auto c = ancestors( rf[2] ); @@ -1383,10 +1584,45 @@ Refiner::updateBndFaces( } } + // Regenerate boundary faces for derefined tets along side sets. For all + // derefined faces associated to side sets, we find the ancestors (parents of + // nodes in the original/coarsest mesh) of the nodes comprising the faces of + // the parent tetrahedron (previously) associated to the derefined face. + const auto& pcDeFaceTets = std::get< 1 >( bnd ); + for (const auto& f : pcDeFaceTets) { + for (const auto& ss : keys(bndFaces,f.first)) { + // will associate to side set id of old (refined) mesh boundary face + auto& faces = bface[ ss ]; + const auto& coarsefaces = tk::cref_find( m_coarseBndFaces, ss ); + // form all 4 faces of parent tet + auto A = f.second[0]; + auto B = f.second[1]; + auto C = f.second[2]; + auto D = f.second[3]; + std::array parf{{ {{A,C,B}}, {{A,B,D}}, {{A,D,C}}, {{B,C,D}} }}; + for (const auto& pf : parf) { + auto a = ancestors( pf[0] ); + auto b = ancestors( pf[1] ); + auto c = ancestors( pf[2] ); + a.insert( begin(b), end(b) ); + a.insert( begin(c), end(c) ); + if (a.size() == 3) { + std::vector< std::size_t > p( begin(a), end(a) ); + Face par{{ m_gid[p[0]], m_gid[p[1]], m_gid[p[2]] }}; + auto it = coarsefaces.find( par ); + if (it != end(coarsefaces)) + addBndFace(faces,ss,{{m_gid[pf[0]],m_gid[pf[1]],m_gid[pf[2]]}}); + } + } + } + } + // Update boundary face data structures m_bface = std::move(bface); m_triinpoel = std::move(triinpoel); + //std::cout << thisIndex << " bf: " << tk::sumvalsize( m_bface ) << '\n'; + // Perform leak-test on boundary face data just updated (only in DEBUG) Assert( bndIntegral(), "Partial boundary integral" ); } @@ -1410,8 +1646,8 @@ Refiner::bndIntegral() std::vector< tk::real > s{{ 0.0, 0.0, 0.0 }}; - for (const auto& ss : m_bface) { - for (auto f : ss.second) { + for (const auto& [ setid, faceids ] : m_bface) { + for (auto f : faceids) { auto A = tk::cref_find( m_lid, m_triinpoel[f*3+0] ); auto B = tk::cref_find( m_lid, m_triinpoel[f*3+1] ); auto C = tk::cref_find( m_lid, m_triinpoel[f*3+2] ); @@ -1426,6 +1662,8 @@ Refiner::bndIntegral() } } + s.push_back( -1.0 ); // negative: no call-back after reduction + // Send contribution to host summing partial surface integrals contribute( s, CkReduction::sum_double, m_cbr.get< tag::bndint >() ); @@ -1434,18 +1672,14 @@ Refiner::bndIntegral() void Refiner::updateBndNodes( - const std::unordered_set< std::size_t >& ref, - const std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> >& pcFaceTets ) + [[maybe_unused]] const std::unordered_set< std::size_t >& ref, + const BndFaceData& bnd ) // ***************************************************************************** // Update boundary nodes after mesh refinement //! \param[in] ref Unique nodes of the refined mesh using local ids -//! \param[in] pcFaceTets Map that associates the id of a tet adjacent to a -//! boundary triangle face for all (physical and chare) boundary faces +//! \param[in] bnd Boundary face data bundle // ***************************************************************************** { - IGNORE(ref); // to avoid compiler warning when asserts are optimized away - // storage for boundary nodes associated to side-set IDs of the refined mesh decltype(m_bnode) bnode; // will become m_node @@ -1484,22 +1718,27 @@ Refiner::updateBndNodes( } }; - // Regenerate boundary node lists after refinement step + const auto& pcReFaceTets = std::get< 0 >( bnd ); + + // Regenerate boundary node lists for refined tets along side sets. For all + // refined faces associated to side sets, we find the ancestors (parents of + // nodes in the original/coarsest mesh) of the nodes comprising the nodes of + // the tetrahedron adjacent to the refined face. const auto& tet_store = m_refiner.tet_store; - for (const auto& f : pcFaceTets) { // for all boundary faces in old mesh + for (const auto& [ face, tetid ] : pcReFaceTets) { // query number of children of boundary tet adjacent to boundary face - auto nc = tet_store.data( f.second ).children.size(); + auto nc = tet_store.data( tetid ).children.size(); if (nc == 0) { // if boundary tet is not refined, add its boundary nodes to the side // set(s) of their parent (in coarse mesh) nodes - auto t = f.first; + auto t = face; for (auto& n : t) n = tk::cref_find( m_lid, n ); addBndNodes( t, search ); } else { // if boundary tet is refined const auto& tets = tet_store.tets; for (decltype(nc) i=0; isecond, search ); + auto A = tk::cref_find( m_lref, ct->second[0] ); + auto B = tk::cref_find( m_lref, ct->second[1] ); + auto C = tk::cref_find( m_lref, ct->second[2] ); + auto D = tk::cref_find( m_lref, ct->second[3] ); + addBndNodes( Tet{{A,B,C,D}}, search ); } } } + const auto& pcDeFaceTets = std::get< 1 >( bnd ); + + // Regenerate boundary node lists for derefined tets along side sets. For all + // refined faces associated to side sets, we find the ancestors (parents of + // nodes in the original/coarsest mesh) of the nodes comprising the nodes of + // the parent tetrahedron (previously) associated to the derefined face. + for (const auto& f : pcDeFaceTets) addBndNodes( f.second, search ); + // Make boundary node IDs unique for each physical boundary (side set) for (auto& s : bnode) tk::unique( s.second ); // Update boundary node lists m_bnode = std::move(bnode); + + //std::cout << thisIndex << " bn: " << tk::sumvalsize( m_bnode ) << '\n'; } #include "NoWarning/refiner.def.h" diff --git a/src/Inciter/Refiner.hpp b/src/Inciter/Refiner.hpp index 1c7009d374b..d479c547f00 100644 --- a/src/Inciter/Refiner.hpp +++ b/src/Inciter/Refiner.hpp @@ -29,7 +29,7 @@ #include "Callback.hpp" #include "UnsMesh.hpp" #include "Base/Fields.hpp" -#include "SchemeBase.hpp" +#include "Scheme.hpp" #include "DiagCG.hpp" #include "ALECG.hpp" #include "DG.hpp" @@ -74,10 +74,10 @@ class Refiner : public CBase_Refiner { //! Query Sorter and update local mesh with the reordered one void reorder(); - //! Start new step of initial mesh refinement + //! Start new step of initial mesh refinement/derefinement void start(); - //! Continue after finishing a refinement step + //! Continue after finishing a refinemen/derefinementt step void next(); //! Start mesh refinement (during time stepping, t>0) @@ -88,7 +88,7 @@ class Refiner : public CBase_Refiner { //! Receive boundary edges from all PEs (including this one) void addBndEdges( CkReductionMsg* msg ); - //! Refine mesh + //! Do a single step of mesh refinemen/derefinementt (only tag edges) void refine(); //! Receive newly added mesh edges and locks on our chare boundary @@ -99,17 +99,19 @@ class Refiner : public CBase_Refiner { //! Correct refinement to arrive at conforming mesh across chare boundaries void correctref(); - //! Communicate refined edges after a refinement step + //! Communicate refined edges after a refinement/derefinement step void comExtra(); - //! Decide what to do after a mesh refinement step - void eval(); + //! Perform mesh refinement and decide how to continue + void perform(); //! Send Refiner proxy to Discretization objects void sendProxy(); //! Get refinement field data in mesh cells std::tuple< std::vector< std::string >, + std::vector< std::vector< tk::real > >, + std::vector< std::string >, std::vector< std::vector< tk::real > > > refinementFields() const; @@ -148,13 +150,18 @@ class Refiner : public CBase_Refiner { p | m_remoteEdges; p | m_intermediates; p | m_bndEdges; + p | m_msumset; p | m_oldTets; p | m_addedNodes; p | m_addedTets; - p | m_prevnTets; + p | m_oldntets; p | m_coarseBndFaces; p | m_coarseBndNodes; - p | m_msumset; + p | m_rid; + p | m_oldrid; + p | m_lref; + //p | m_oldlref; + p | m_parent; } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference @@ -163,13 +170,24 @@ class Refiner : public CBase_Refiner { //@} private: - //! Boundary face data bundle + using Edge = tk::UnsMesh::Edge; + using Face = tk::UnsMesh::Face; + using Tet = tk::UnsMesh::Tet; + using EdgeSet = tk::UnsMesh::EdgeSet; + using FaceSet = tk::UnsMesh::FaceSet; + using TetSet = tk::UnsMesh::TetSet; + template< std::size_t N > using Hash = tk::UnsMesh::Hash< N >; + template< std::size_t N > using Eq = tk::UnsMesh::Eq< N >; + + //! Boundary face data bundle, see boundary() using BndFaceData = std::tuple< - std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> >, - std::unordered_map< int, tk::UnsMesh::FaceSet >, - std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> > >; + std::unordered_map< Face, std::size_t, Hash<3>, Eq<3> >, + std::unordered_map< Face, Tet, Hash<3>, Eq<3> >, + std::unordered_map< int, FaceSet > + >; + + //! Used to associate error to edges + using EdgeError = std::unordered_map< Edge, tk::real, Hash<2>, Eq<2> >; //! Host proxy CProxy_Transporter m_host; @@ -213,7 +231,7 @@ class Refiner : public CBase_Refiner { bool m_initial; //! Initial mesh refinement type list (in reverse order) std::vector< ctr::AMRInitialType > m_initref; - //! Number of initial mesh refinement steps + //! Number of initial mesh refinement/derefinement steps std::size_t m_ninitref; //! Mesh refiner (library) object AMR::mesh_adapter_t m_refiner; @@ -240,19 +258,28 @@ class Refiner : public CBase_Refiner { //! points. This is the same data as in Discretization::m_msum, but the //! nodelist is stored as a hash-set for faster searches. std::unordered_map< int, std::unordered_set< std::size_t > > m_msumset; - //! Local tetrahedron IDs before refinement step - std::unordered_set< std::size_t > m_oldTets; + //! Tetrahedra before refinement/derefinement step + TetSet m_oldTets; //! Newly added mesh nodes (local id) and their parents (local ids) std::unordered_map< std::size_t, tk::UnsMesh::Edge > m_addedNodes; - //! Newly added mesh cells (local id) and their parent (local ids) + //! Newly added mesh cells (local id) and their parent (local id) std::unordered_map< std::size_t, std::size_t > m_addedTets; - //! Number of tetrahedra in the mesh before refinement - std::size_t m_prevnTets; + //! Number of tetrahedra in the mesh before refinement/derefinement step + std::size_t m_oldntets; //! A unique set of faces associated to side sets of the coarsest mesh std::unordered_map< int, tk::UnsMesh::FaceSet > m_coarseBndFaces; //! A unique set of nodes associated to side sets of the coarsest mesh - std::unordered_map< int, std::unordered_set< std::size_t > > - m_coarseBndNodes; + std::unordered_map< int, std::unordered_set > m_coarseBndNodes; + //! Local -> refiner lib node id map + std::vector< std::size_t > m_rid; + //! Local -> refiner lib node id map for previous mesh + std::vector< std::size_t > m_oldrid; + //! Refiner lib -> local node id map + std::unordered_map< std::size_t, std::size_t > m_lref; + //! Refiner lib -> local node id map for previous mesh + //std::unordered_map< std::size_t, std::size_t > m_oldlref; + //! Child -> parent tet map + std::unordered_map< Tet, Tet, Hash<4>, Eq<4> > m_parent; //! (Re-)generate boundary data structures for coarse mesh void coarseBnd(); @@ -260,7 +287,7 @@ class Refiner : public CBase_Refiner { //! Generate flat coordinate data from coordinate map tk::UnsMesh::Coords flatcoord( const tk::UnsMesh::CoordMap& coordmap ); - //! Output mesh to file before a new step of mesh refinement + //! Output mesh to file before a new step of mesh refinement/derefinement void t0ref(); //! Generate boundary edges and send them to all chares @@ -272,9 +299,25 @@ class Refiner : public CBase_Refiner { //! Do uniform mesh refinement void uniformRefine(); + //! Do uniform mesh derefinement + void uniformDeRefine(); + //! Do error-based mesh refinement void errorRefine(); + //! Compute errors in edges + EdgeError + errorsInEdges( std::size_t npoin, + const std::pair< std::vector< std::size_t >, + std::vector< std::size_t > >& esup, + const tk::Fields& u ) const; + + //! Update (or evaluate) solution on current mesh + tk::Fields + solution( std::size_t npoin, + const std::pair< std::vector< std::size_t >, + std::vector< std::size_t > >& esup ) const; + //! Do mesh refinement based on user explicitly tagging edges void edgelistRefine(); @@ -297,27 +340,23 @@ class Refiner : public CBase_Refiner { //! Update boundary data structures after mesh refinement void newBndMesh( const std::unordered_set< std::size_t >& ref ); - //! \brief Generate boundary data structures used to update refined - //! boundary faces and nodes of side sets + //! \brief Generate boundary data structures used to update + //! refined/derefined boundary faces and nodes of side sets BndFaceData boundary(); - //! Regenerate boundary faces after mesh refinement step - void updateBndFaces( - const std::unordered_set< std::size_t >& ref, - const std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> >& bndFaceTets, - const std::unordered_map< int, tk::UnsMesh::FaceSet >& bndFaces ); + //! Regenerate boundary faces after mesh refinement/derefinement step + void updateBndFaces( const std::unordered_set< std::size_t >& ref, + const BndFaceData& bnd ); - //! Regenerate boundary nodes after mesh refinement step - void updateBndNodes( - const std::unordered_set< std::size_t >& ref, - const std::unordered_map< tk::UnsMesh::Face, std::size_t, - tk::UnsMesh::Hash<3>, tk::UnsMesh::Eq<3> >& pcFaceTets ); + //! Regenerate boundary nodes after mesh refinement/derefinement step + void updateBndNodes( const std::unordered_set< std::size_t >& ref, + const BndFaceData& bnd ); //! Evaluate initial conditions (IC) at mesh nodes - tk::Fields nodeinit( std::size_t npoin, - const std::pair< std::vector< std::size_t >, - std::vector< std::size_t > >& esup ); + tk::Fields + nodeinit( std::size_t npoin, + const std::pair< std::vector< std::size_t >, + std::vector< std::size_t > >& esup ) const; //! Output mesh to file(s) void writeMesh( const std::string& basefilename, @@ -365,45 +404,6 @@ class Refiner : public CBase_Refiner { void addBndNodes( const std::array< std::size_t, N >& array, F f ) { for (auto n : array) f( n ); } - - //! \brief Function class to call the resizeAfterRefined() member function - //! behind SchemeBase::Proxy - struct ResizeAfterRefined : boost::static_visitor<> { - const std::vector< std::size_t >& Ginpoel; - const tk::UnsMesh::Chunk& Chunk; - const tk::UnsMesh::Coords& Coord; - const std::unordered_map< std::size_t, tk::UnsMesh::Edge >& AddedNodes; - const std::unordered_map< std::size_t, std::size_t >& AddedTets; - const std::unordered_map< int, std::vector< std::size_t > >& Msum; - const std::map< int, std::vector< std::size_t > > Bface; - const std::map< int, std::vector< std::size_t > > Bnode; - const std::vector< std::size_t > Triinpoel; - ResizeAfterRefined( - const std::vector< std::size_t >& ginpoel, - const tk::UnsMesh::Chunk& chunk, - const tk::UnsMesh::Coords& coord, - const std::unordered_map< std::size_t, tk::UnsMesh::Edge >& addednodes, - const std::unordered_map< std::size_t, std::size_t >& addedtets, - const std::unordered_map< int, std::vector< std::size_t > >& msum, - const std::map< int, std::vector< std::size_t > >& bface, - const std::map< int, std::vector< std::size_t > >& bnode, - const std::vector< std::size_t >& triinpoel ) - : Ginpoel(ginpoel), Chunk(chunk), Coord(coord), AddedNodes(addednodes), - AddedTets(addedtets), Msum(msum), Bface(bface), Bnode(bnode), - Triinpoel(triinpoel) {} - template< typename P > void operator()( const P& p ) const { - p.ckLocal()->resizeAfterRefined( Ginpoel, Chunk, Coord, AddedNodes, - AddedTets, Msum, Bface, Bnode, Triinpoel ); - } - }; - - //! \brief Function class to call the solution() member function - //! behind SchemeBase::Proxy - struct solution : boost::static_visitor< tk::Fields > { - template< typename P > const tk::Fields& operator()( const P& p ) const { - return p.ckLocal()->solution(); - } - }; }; } // inciter:: diff --git a/src/Inciter/Scheme.hpp b/src/Inciter/Scheme.hpp index 88dcdb79705..5dd24d8ad24 100644 --- a/src/Inciter/Scheme.hpp +++ b/src/Inciter/Scheme.hpp @@ -5,9 +5,10 @@ 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Generic forwarding interface to discretization proxies - \details This file defines a generic interface to discretization proxies. - + \brief Polymorphic glue for calling Charm++ entry methods to base class + Discretization, its children implementing specific discretization schemes, + and helper classes + \details The purpose of this class is to hide, behind a single type, different Charm++ proxy types that model a single concept, i.e., define some common functions as Charm++ entry methods that can be used in either a broadcast @@ -22,14 +23,14 @@ Note that while Charm++ does support inheritance and runtime polymorphism with chare arrays, we still prefer the implementation below because it uses entirely value semantics (inside and in client code) and thus it keeps the - complexity of the dispatch behind this class and does not expose it client - code. + complexity of the dispatch behind this class and does not expose it to + client code. The advantages of this class over traditional runtime polymorphism are (1) value semantics (both internally and to client code), (2) not templated, and (3) PUPable, i.e., an instance of Scheme can be sent across the network using Charm++'s pup framework. Also, since the class only holds a couple of - chare proxies, it is extremely lightweight. + chare proxies, it is lightweight. Example usage from client code: @@ -37,264 +38,168 @@ // Instantiate a Scheme object Scheme s( ctr::SchemeType::DG ); // see Control/Inciter/Options/Scheme.h - // Call a member function entry method in broadcast fashion - s.coord< tag::bcast >( ... ); // equivalent to proxy.coord( ... ); - - // Call a member function entry method in addressing a single array - // element - s.coord< tag::elem >( 0, ... ); // equivalent to proxy[0].coord( ... ); + // Issue broadcast to child scheme entry method + s.bcast< Scheme::setup >(...); - // Broadcast to a member function with optinoal CkEntryOptions object - CkEntryOptions opt; - s.coord< tag::bcast >( ..., opt ); // proxy.coord( ..., opt ); - - // Address array element with optinoal CkEntryOptions object - s.coord< tag::elem >( 0, ..., opt ); // proxy[0].coord( ..., opt ); + // Issue broadcast to base (Discretization) entry method + s.disc().totalvol(); \endcode Organization, implementation details, end extension of the class: - Scheme, via inheriting from SchemeBase, contains two Charm++ proxies: - discproxy and proxy. The former contains data and functionality common to - all discretizations, and this can be considered as an equivalent to a base - class in the OOP sense. The latter, proxy, contains data and functionality - specific to a particular discretization. When instantiated, Scheme is - configured for a single specific discretization which must be selected from - the list of types in SchemeBase::Proxy. + Scheme contains (at least) two Charm++ proxies: discproxy and proxy. The + former contains data and functionality common to all discretizations, and + this can be considered as an equivalent to a base class in the OOP sense. + The latter, proxy, contains data and functionality specific to a particular + discretization. When instantiated, Scheme is configured for a single + specific discretization which must be selected from the list of types in + SchemeBase::Proxy. The underlying type of proxy is a variant, which allows storing exactly one object. A variant is a type-safe union. An instance of a variant at any given time either holds a value of one of its alternative types. Read more - on std::variant or boost::variant on how they work. - - All new member functions that comprise of the concept of the underlying - proxies, i.e., the interface, must be defined in Scheme. Whereas common - data, functionality, as well as the list of the proxy types that can be - configured are defined in SchemeBase. Adding a new forwarding function - either as a broadcast or addressing a particular chare array element can be - done by simply copying an existing (similar) one and modifying what - underlying function (entry method) it calls. The ones that forward to - discproxy are grouped first, while the ones that forward to the specific - proxy are listed as second. Using SFINAE, multiple overloads are (and can - be) defined for a single function, depending on (1) whether it is a - broadcast or addressing an array element, (2) whether it takes an optional - (default) last argument, usually used for passing a CkEntryOptions object. - You can see the Charm++-generated .decl.h file to see what (if any) default - arguments a particular entry method may take. - - Currently, forwarding functions are defined for two types entry method - calls: broadcasts, i.e., proxy.fn(), and addressing a particular element, - i.e., proxy[x].fn(). Another third might be useful to add in the future and - that is addressing an entry method behind a section proxy. As we have not - used section proxies so far, this is not yet implemented, but if necessary, - it should be relatively straightforward to do. - - Extending this class to other discretization schemes is done entirely in - SchemeBase. Adding a new discretization scheme amounts to, at the minimum: - (1) Adding a new type of Charm++ chare array proxy to SchemeBase::Proxy, + on std::variant on how they work. + + Adding a new child scheme is done by + (1) Adding a new type of Charm++ chare array proxy to Scheme::Proxy, (2) Adding a new type of Charm++ chare array element proxy to - SchemeBase::ProxyElem, and - (3) Adding a new branch to the if test in SchemeBase's constructor. - - Implementation details: All forwarding calls are implemented taking a - variadic parameter pack, which can take any number of arguments (including - zero) and use perfect forwarding to pass the arguments to the entry method - calls. This way the code remains generic, easy to modify, and the compiler - automatically adjusts the generated forwarding calls if the types and/or - number of the arguments to any of the entry methods change. One exception to - this is those forwarding calls that deal with default arguments, allowing - for passing CkEntryOptions objects. There the number of arguments are - hard-coded in the SFINAE construct, but should also be straightforward to - modify if necessary. - - The functors named as call_* are used to dispatch (at compile time) entry - method calls behind proxy, whose type is different depending on what - specific discretization type is configured in the constructor. All common - functionality in the call_* functors are lifted over to SchemeBase::Call. - This helps keeping the function-call-specific code in Scheme minimal and - reuses the generic part in SchemeBase. - - Note that another way of doing the dispatch, that is now done using the - call_* functors, could have been implemented using a (compile-, or runtime) - associative container storing std::function objects which would store - pre-bound function arguments. That would work, but there are three problems - with such an approach: (1) std::function is not obvious how to pup, i.e., - send across the network, (2) std::bind cannot currently be used to bind a - variadic number arguments and thus the bind calls would not be very generic, - and (3) a runtime associative container would take additional state. (Note - that problem (2) above could probably be solved with variadic lambdas, but - the (1) and (3) remain.) - - \see Talk on [Concept-based runtime polymorphism with Charm++ chare arrays + Scheme::ProxyElem, and + (3) Adding a new branch to the if test in Scheme's constructor. + + \see A talk on [Concept-based runtime polymorphism with Charm++ chare arrays using value semantics](http://charm.cs.illinois.edu/charmWorkshop/slides/CharmWorkshop2018_bakosi.pdf) at the 16th Annual Workshop on Charm++ and its - Applications, April 2018. + Applications, April 2018, discussing an earlier, more verbose + implementation of the idea, using C++11. */ // ***************************************************************************** #ifndef Scheme_h #define Scheme_h -#include "Tags.hpp" -#include "SchemeBase.hpp" - -namespace inciter { +#include "Exception.hpp" +#include "PUPUtil.hpp" +#include "Inciter/Options/Scheme.hpp" -//! Generic forwarding interface to discretization proxies -class Scheme : public SchemeBase { +#include "NoWarning/discretization.decl.h" +#include "NoWarning/diagcg.decl.h" +#include "NoWarning/alecg.decl.h" +#include "NoWarning/distfct.decl.h" +#include "NoWarning/dg.decl.h" - public: - // Inherit base constructors - using SchemeBase::SchemeBase; +namespace inciter { - // Calls to discproxy, common to all discretizations +//! Base class for generic forwarding interface to discretization proxies +class Scheme { - ////// discproxy.vol(...) - //! \brief Function to call the vol() entry method of an array discproxy - //! (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the coord member function of a chare array - //! discproxy and thus equivalent to discproxy.vol(...). - template< typename... Args > - void vol( Args&&... args ) { - discproxy.vol( std::forward(args)... ); - } + private: + //! Variant type listing all chare proxy types modeling the same concept + using Proxy = + std::variant< CProxy_DiagCG + , CProxy_DG + , CProxy_ALECG >; - ////// discproxy.totalvol(...) - //! \brief Function to call the totalvol() entry method of an array - //! discproxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the totalvol member function of a chare - //! array discproxy and thus equivalent to discproxy.totalvol(...). - template< typename... Args > - void totalvol( Args&&... args ) { - discproxy.totalvol( std::forward(args)... ); + public: + //! Variant type listing all chare element proxy types + using ProxyElem = + std::variant< CProxy_DiagCG::element_t + , CProxy_DG::element_t + , CProxy_ALECG::element_t >; + + //! Empty constructor for Charm++ + explicit Scheme() {} + + //! Constructor + //! \param[in] scheme Discretization scheme + //! \details Based on the input enum we create at least two empty chare + //! arrays: (1) discproxy which contains common functionality and data for + //! all discretizations, and (2) proxy, which have functionality and data + //! specific to a given discretization. Note that proxy is bound (in + //! migration behavior and properties) to discproxy. + //! \note There may be other bound proxy arrays created depending on the + //! specific discretization configured by the enum. + explicit Scheme( ctr::SchemeType scheme ) : + discproxy( CProxy_Discretization::ckNew() ) + { + bound.bindTo( discproxy ); + if (scheme == ctr::SchemeType::DiagCG) { + proxy = static_cast< CProxy_DiagCG >( CProxy_DiagCG::ckNew(bound) ); + fctproxy = CProxy_DistFCT::ckNew(bound); + } else if (scheme == ctr::SchemeType::DG || + scheme == ctr::SchemeType::P0P1 || + scheme == ctr::SchemeType::DGP1 || + scheme == ctr::SchemeType::DGP2 || + scheme == ctr::SchemeType::PDG) + { + proxy = static_cast< CProxy_DG >( CProxy_DG::ckNew(bound) ); + } else if (scheme == ctr::SchemeType::ALECG) { + proxy = static_cast< CProxy_ALECG >( CProxy_ALECG::ckNew(bound) ); + } else Throw( "Unknown discretization scheme" ); } - ////// discproxy.stat(...) - //! \brief Function to call the stat() entry method of an array discproxy - //! (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the stat member function of a chare array - //! discproxy and thus equivalent to discproxy.stat(...). - template< class Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::bcast >::value, int >::type = 0 > - void stat( Args&&... args ) { - discproxy.stat( std::forward(args)... ); - } - ////// discproxy[x].stat(...) - //! Function to call the stat() entry method of an element discproxy (p2p) - //! \param[in] x Chare array element index - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the stat member function of a chare array - //! element discproxy and thus equivalent to discproxy[x].stat(...). - template< typename Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::elem >::value, int >::type = 0 > - void stat( const CkArrayIndex1D& x, Args&&... args ) { - discproxy[x].stat( std::forward(args)... ); + //! Entry method tags for specific Scheme classes to use with bcast() + struct setup {}; + struct advance {}; + struct resized {}; + struct resizeComm {}; + struct refine {}; + struct lhs {}; + struct diag {}; + struct evalLB {}; + struct doneInserting {}; + //! Issue broadcast to Scheme entry method + //! \tparam Fn Function tag identifying the entry method to call + //! \tparam Args Types of arguments to pass to entry method + //! \param[in] args Arguments to member function entry method to be called + //! \details This function issues a broadcast to a member function entry + //! method of the Scheme chare array (the child of Discretization) and is + //! thus equivalent to proxy.Fn(...). + template< typename Fn, typename... Args > + void bcast( Args&&... args ) { + std::visit( [&]( auto& p ){ + if constexpr( std::is_same_v< Fn, setup > ) + p.setup( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, advance > ) + p.advance( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, resized > ) + p.resized( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, resizeComm > ) + p.resizeComm( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, refine > ) + p.refine( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, lhs > ) + p.lhs( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, diag > ) + p.diag( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, evalLB > ) + p.evalLB( std::forward< Args >( args )... ); + else if constexpr( std::is_same_v< Fn, doneInserting > ) + p.doneInserting( std::forward< Args >( args )... ); + }, proxy ); } - ////// discproxy[x].insert(...) - //! Function to call the insert entry method of an element discproxy (p2p) + //! Entry method tags for specific Scheme classes to use with ckLocal() + struct resizePostAMR {}; + struct solution {}; + //! Call Scheme entry method via Charm++ chare array element's ckLocal() + //! \tparam Fn Function tag identifying the entry method to call + //! \tparam Args Types of arguments to pass to entry method //! \param[in] x Chare array element index - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the insert member function of a chare array - //! element discproxy and thus equivalent to discproxy[x].insert(...), - //! using the last argument as default. - template< typename... Args > - void discInsert( const CkArrayIndex1D& x, Args&&... args ) { - discproxy[x].insert( fctproxy, std::forward(args)... ); - } - - ////// discproxy.doneInserting(...) - //! \brief Function to call the doneInserting entry method of an array - //! discproxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the doneInserting member function of a - //! chare array discproxy and thus equivalent to - //! discproxy.doneInserting(...). - template< class Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::bcast >::value, int >::type = 0 > - void doneDiscInserting( Args&&... args ) { - discproxy.doneInserting( std::forward(args)... ); - } - - ////// fctcproxy.doneInserting(...) - //! \brief Function to call the doneInserting entry method of an array - //! fctproxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the doneInserting member function of a - //! chare array fctproxy and thus equivalent to - //! fctproxy.doneInserting(...). - template< class Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::bcast >::value, int >::type = 0 > - void doneDistFCTInserting( Args&&... args ) { - fctproxy.doneInserting( std::forward(args)... ); - } - - // Calls to proxy, specific to a particular discretization - - ////// proxy.setup(...) - //! Function to call the setup entry method of an array proxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the setup member function of a chare array - //! proxy and thus equivalent to proxy.setup(...), using the last argument - //! as default. - template< typename... Args > - void setup( Args&&... args ) { - boost::apply_visitor( call_setup( std::forward(args)... ), - proxy ); - } - - ////// proxy.lhs(...) - //! Function to call the lhs entry method of an array proxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the lhs member function of a chare array - //! proxy and thus equivalent to proxy.lhs(...), using the last argument - //! as default. - template< typename... Args > - void lhs( Args&&... args ) { - boost::apply_visitor( call_lhs( std::forward(args)... ), - proxy ); - } - - ////// proxy.resized(...) - //! Function to call the resized entry method of an array proxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the resized member function of a chare - //! array proxy and thus equivalent to proxy.resized(...), using the last - //! argument as default. - template< typename... Args > - void resized( Args&&... args ) { - boost::apply_visitor( - call_resized( std::forward(args)... ), proxy ); - } - - ////// proxy.advance(...) - //! Function to call the advance entry method of an array proxy (broadcast) //! \param[in] args Arguments to member function entry method to be called - //! \details This function calls the advance member function of a chare - //! array proxy and thus equivalent to proxy.advance(...), using the last - //! argument as default. - template< typename... Args > - void advance( Args&&... args ) { - boost::apply_visitor( - call_advance( std::forward(args)... ), proxy ); - } - - ////// proxy.diag(...) - //! function to call the diag entry method of an array proxy (broadcast) - //! \param[in] args arguments to member function (entry method) to be called - //! \details this function calls the diag member function of a chare array - //! proxy and thus equivalent to proxy.diag(...), specifying a - //! non-default last argument. - template< class Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::bcast >::value, int >::type = 0 > - void diag( Args&&... args ) { - boost::apply_visitor( call_diag( std::forward(args)... ), - proxy ); + //! \details This function calls a member function via Charm++'s ckLocal() + //! behind the element proxy configured, indexed by the array index x. + //! Since the call is behind ckLocal(), the member function does not have + //! to be a Charm++ entry method. + template< typename Fn, typename... Args > + auto ckLocal( const CkArrayIndex1D& x, Args&&... args ) const { + auto e = element( x ); + return std::visit( [&]( auto& p ){ + if constexpr( std::is_same_v< Fn, resizePostAMR > ) + return p.ckLocal()->resizePostAMR( std::forward(args)... ); + else if constexpr( std::is_same_v< Fn, solution > ) + return p.ckLocal()->solution( std::forward(args)... ); + }, e ); } - ////// proxy[x].insert(...) - //! Function to call the insert entry method of an element proxy (p2p) + //! Function to call the insert entry method of an element proxy //! \param[in] x Chare array element index //! \param[in] args Arguments to member function (entry method) to be called //! \details This function calls the insert member function of a chare array @@ -302,56 +207,44 @@ class Scheme : public SchemeBase { //! last argument as default. template< typename... Args > void insert( const CkArrayIndex1D& x, Args&&... args ) { - auto e = tk::element< ProxyElem >( proxy, x ); - boost::apply_visitor( call_insert( std::forward(args)... ), - e ); + auto e = element( x ); + std::visit( [&]( auto& p ){ p.insert(std::forward(args)...); }, e ); } - ////// proxy.doneInserting(...) - //! \brief Function to call the doneInserting entry method of an array proxy - //! (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the doneInserting member function of a - //! chare array proxy and thus equivalent to proxy.doneInserting(...). - template< class Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::bcast >::value, int >::type = 0 > - void doneInserting( Args&&... args ) { - boost::apply_visitor( - call_doneInserting( std::forward(args)... ), proxy ); - } + //! Get reference to discretization proxy + //! \return Discretization Charm++ chare array proxy + CProxy_Discretization& disc() noexcept { return discproxy; } - ////// proxy[x].newMesh(...) - //! Function to call the newMesh entry method of an element proxy (p2p) - //! \param[in] x Chare array element index - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the newMesh member function of a chare - //! array element proxy and thus equivalent to proxy[x].newMesh(...), - //! specifying a non-default last argument. - template< typename Op, typename... Args, typename std::enable_if< - std::is_same< Op, tag::elem >::value, int >::type = 0 > - void newMesh( const CkArrayIndex1D& x, Args&&... args ) { - auto e = tk::element< ProxyElem >( proxy, x ); - boost::apply_visitor( - call_newMesh( std::forward(args)... ), e ); - } + //! Get reference to DistFCT proxy + //! \return DistFCT Charm++ chare array proxy + CProxy_DistFCT& fct() noexcept { return fctproxy; } - ////// proxy.contin(...) - //! Function to call the contin entry method of an array proxy (broadcast) - //! \param[in] args Arguments to member function (entry method) to be called - //! \details This function calls the contin member function of a chare array - //! proxy and thus equivalent to proxy.contin(...), using the last argument - //! as default. - template< typename... Args > - void contin( Args&&... args ) { - boost::apply_visitor( call_contin( std::forward(args)... ), - proxy ); + //! Get reference to scheme proxy + //! \return Variant storing Charm++ chare array proxy configured + const Proxy& getProxy() noexcept { return proxy; } + + //! Query underlying proxy type + //! \return Zero-based index into the set of types of Proxy + std::size_t index() const noexcept { return proxy.index(); } + + //! Query underlying proxy element type + //! \return Zero-based index into the set of types of ProxyElem + std::size_t index_element() const noexcept { + return element( 0 ).index(); } + //! Charm++ array options accessor for binding external proxies + //! \return Charm++ array options object reference + const CkArrayOptions& arrayoptions() { return bound; } + ///@{ //! \brief Pack/Unpack serialize member function //! \param[in,out] p Charm++'s PUP::er serializer object reference void pup( PUP::er &p ) { - SchemeBase::pup( p ); + p | proxy; + p | discproxy; + p | fctproxy; + p | bound; } //! \brief Pack/Unpack serialize operator| //! \param[in,out] p Charm++'s PUP::er serializer object reference @@ -360,194 +253,24 @@ class Scheme : public SchemeBase { //@} private: - //! Functor to call the chare entry method 'setup' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_setup : Call< call_setup, As... > { - using Base = Call< call_setup, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.setup( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'resized' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_resized : Call< call_resized, As... > { - using Base = Call< call_resized, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.resized( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'lhs' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_lhs : Call< call_lhs, As... > { - using Base = Call< call_lhs, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.lhs( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'advance' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_advance : Call< call_advance, As... > { - using Base = Call< call_advance, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.advance( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'insert' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_insert : Call< call_insert, As... > { - using Base = Call< call_insert, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.insert( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'doneInserting' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_doneInserting : Call< call_doneInserting, As... > { - using Base = Call< call_doneInserting, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.doneInserting( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'newMesh' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_newMesh : Call< call_newMesh, As... > { - using Base = Call< call_newMesh, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.newMesh( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'contin' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_contin : Call< call_contin, As... > { - using Base = Call< call_contin, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.contin( std::forward(args)... ); - } - }; - - //! Functor to call the chare entry method 'diag' - //! \details This class is intended to be used in conjunction with variant - //! and boost::visitor. The template argument types are the types of the - //! arguments to entry method to be invoked behind the variant holding a - //! Charm++ proxy. - //! \see The base class Call for the definition of operator(). - template< typename... As > - struct call_diag : Call< call_diag, As... > { - using Base = Call< call_diag, As... >; - using Base::Base; // inherit base constructors - //! Invoke the entry method - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] args Function arguments passed to entry method - //! \details P is the proxy type, Args are the types of the arguments of - //! the entry method to be called. - template< typename P, typename... Args > - static void invoke( P& p, Args&&... args ) { - p.diag( std::forward(args)... ); - } - }; + //! Variant storing one proxy to which this class is configured for + Proxy proxy; + //! Charm++ proxy to data and code common to all discretizations + CProxy_Discretization discproxy; + //! Charm++ proxy to flux-corrected transport (FCT) driver class + CProxy_DistFCT fctproxy; + //! Charm++ array options for binding chares + CkArrayOptions bound; + + //! Function dereferencing operator[] of chare proxy inside variant + //! \param[in] x Chare array element index + //! \return Chare array element proxy as a variant, defined by ProxyElem + //! \details The returning element proxy is a variant, depending on the + //! input proxy. + ProxyElem element( const CkArrayIndex1D& x ) const { + return std::visit( [&]( const auto& p ){ + return static_cast< ProxyElem >( p[x] ); }, proxy ); + } }; } // inciter:: diff --git a/src/Inciter/SchemeBase.hpp b/src/Inciter/SchemeBase.hpp deleted file mode 100644 index 82a52c2b1d5..00000000000 --- a/src/Inciter/SchemeBase.hpp +++ /dev/null @@ -1,180 +0,0 @@ -// ***************************************************************************** -/*! - \file src/Inciter/SchemeBase.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Base class to Scheme, a generic interface to discretization proxies - \details This file defines the base class to Scheme, a generic interface to - discretization proxies. This class is intended to be used in conjunction - with Scheme. See Scheme for usage and more details on how to extend this - class. -*/ -// ***************************************************************************** -#ifndef SchemeBase_h -#define SchemeBase_h - -#include - -#include "Variant.hpp" - -#include "Exception.hpp" -#include "PUPUtil.hpp" -#include "Inciter/Options/Scheme.hpp" - -#include "NoWarning/diagcg.decl.h" -#include "NoWarning/alecg.decl.h" -#include "NoWarning/distfct.decl.h" -#include "NoWarning/dg.decl.h" -#include "NoWarning/discretization.decl.h" - -namespace inciter { - -//! Base class for generic forwarding interface to discretization proxies -class SchemeBase { - - private: - //! Variant type listing all chare proxy types modeling the same concept - using Proxy = - boost::variant< CProxy_DiagCG, CProxy_DG, CProxy_ALECG >; - - public: - //! Variant type listing all chare element proxy types (behind operator[]) - using ProxyElem = - boost::variant< CProxy_DiagCG::element_t, - CProxy_DG::element_t, - CProxy_ALECG::element_t >; - - //! Empty constructor for Charm++ - explicit SchemeBase() {} - - //! Constructor - //! \param[in] scheme Discretization scheme - //! \details Based on the input enum we create at least two empty chare - //! arrays: (1) discproxy which contains common functionality and data for - //! all discretizations, and (2) proxy, which have functionality and data - //! specific to a given discretization. Note that proxy is bound (in - //! migration behavior and properties) to discproxy. - //! \note There may be other bound proxy arrays created depending on the - //! specific discretization configured by the enum. - explicit SchemeBase( ctr::SchemeType scheme ) : - discproxy( CProxy_Discretization::ckNew() ) - { - bound.bindTo( discproxy ); - if (scheme == ctr::SchemeType::DiagCG) { - proxy = static_cast< CProxy_DiagCG >( CProxy_DiagCG::ckNew(bound) ); - fctproxy = CProxy_DistFCT::ckNew(bound); - } else if (scheme == ctr::SchemeType::DG || - scheme == ctr::SchemeType::DGP1 || - scheme == ctr::SchemeType::DGP2 || - scheme == ctr::SchemeType::PDG) - { - proxy = static_cast< CProxy_DG >( CProxy_DG::ckNew(bound) ); - } else if (scheme == ctr::SchemeType::ALECG) { - proxy = static_cast< CProxy_ALECG >( CProxy_ALECG::ckNew(bound) ); - } else Throw( "Unknown discretization scheme" ); - } - - //! Get reference to discretization proxy - //! \return Discretization Charm++ chare array proxy - CProxy_Discretization& get() noexcept { return discproxy; } - - //! Get reference to scheme proxy - //! \return Variant storing Charm++ chare array proxy configured - const Proxy& getProxy() noexcept { return proxy; } - - //! Query underlying proxy type - //! \return Zero-based index into the set of types of Proxy - int which() const noexcept { return proxy.which(); } - - //! Query underlying proxy element type - //! \return Zero-based index into the set of types of ProxyElem - int which_element() const noexcept { - return tk::element< ProxyElem >( proxy, 0 ).which(); - } - - //! Charm++ array options accessor for binding external proxies - //! \return Charm++ array options object reference - const CkArrayOptions& arrayoptions() { return bound; } - - protected: - //! Variant storing one proxy to which this class is configured for - Proxy proxy; - //! Charm++ proxy to data and code common to all discretizations - CProxy_Discretization discproxy; - //! Charm++ proxy to flux-corrected transport (FCT) driver class - CProxy_DistFCT fctproxy; - //! Charm++ array options for binding chares - CkArrayOptions bound; - - //! Generic base for all call_* classes - //! \details This class stores the entry method arguments and contains a - //! helper function and classes that facilitate unpacking the tuple into a - //! variadic list of arguments passed to the called entry method. The Spec - //! template argument is the class inheriting from this class (see CRTP at - //! https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern), - //! specializing functionality of this class. CRTP enables hiding all - //! generic functionality here while exposing only the specialized one - //! (the actual function call) to the base, which minimizes client code - //! (in class Scheme). Unpacking the tuple to a variadic argument list is - //! loosely inspired by https://stackoverflow.com/a/16868151. - template< class Spec, typename... Args > - struct Call : boost::static_visitor<> { - //! Constructor storing called member function arguments in tuple - explicit Call( Args&&... args ) : arg( std::forward_as_tuple(args...) ) {} - //! Helper class for unpacking tuple into argument list - template< typename P, typename Tuple, bool Done, int Total, int... N > - struct invoke_impl { - static void invoke( P& p, Tuple&& t ) { - invoke_impl< P, Tuple, Total == 1 + sizeof...(N), Total, N..., - sizeof...(N) >::invoke( p, std::forward(t) ); - } - }; - //! Helper class for unpacking tuple into argument list (end of list) - template< typename P, typename Tuple, int Total, int... N > - struct invoke_impl< P, Tuple, true, Total, N... > { - static void invoke( P& p, Tuple&& t ) { - Spec::invoke( p, std::get< N >( std::forward(t) )... ); - } - }; - //! Invoke member function with arguments from tuple - //! \param[in,out] p Proxy behind which the entry method is called - //! \param[in] t Optional tuple holding argments to be passed to the call - template< typename P, typename Tuple = std::tuple > - static void invoke( P& p, Tuple&& t = {} ) { - typedef typename std::decay::type ttype; - invoke_impl< P, Tuple, std::tuple_size::value == 0, - std::tuple_size::value >::invoke( p, std::forward(t) ); - } - //! Function call operator overloading all types used with variant visitor - //! \param[in,out] p Proxy behind which the entry method is called - //! \details Classes inheriting from this class should also inherit from - //! boost::static_visitor which requires overloading operator(), - //! unambiguously accepting any value of types Ts over which classes - //! inheriting from this class may be used as functors for static - //! visitor with a variant of types Ts. - template< typename P > void operator()(P& p) const { invoke(p,arg); } - //! Tuple storing arguments of the entry method to be called - std::tuple< Args... > arg; - }; - - ///@{ - //! \brief Pack/Unpack serialize member function - //! \param[in,out] p Charm++'s PUP::er serializer object reference - void pup( PUP::er &p ) { - p | proxy; - p | discproxy; - p | fctproxy; - p | bound; - } - //! \brief Pack/Unpack serialize operator| - //! \param[in,out] p Charm++'s PUP::er serializer object reference - //! \param[in,out] s SchemeBase object reference - friend void operator|( PUP::er& p, SchemeBase& s ) { s.pup(p); } - //@} -}; - -} // inciter:: - -#endif // SchemeBase_h diff --git a/src/Inciter/Sorter.cpp b/src/Inciter/Sorter.cpp index fccd26e9de9..df962188cc5 100644 --- a/src/Inciter/Sorter.cpp +++ b/src/Inciter/Sorter.cpp @@ -67,6 +67,7 @@ Sorter::Sorter( const CProxy_Transporter& transporter, //! \param[in] meshwriter Mesh writer Charm++ proxy //! \param[in] cbs Charm++ callbacks for Sorter //! \param[in] scheme Discretization scheme +//! \param[in] reorderRefiner Callback to use to send reordered mesh to Refiner //! \param[in] ginpoel Mesh connectivity (this chare) using global node IDs //! \param[in] coordmap Mesh node coordinates (this chare) for global node IDs //! \param[in] bface Face lists mapped to side set ids @@ -77,10 +78,9 @@ Sorter::Sorter( const CProxy_Transporter& transporter, { // Ensure boundary face ids will not index out of face connectivity Assert( std::all_of( begin(m_bface), end(m_bface), - [&](const decltype(m_bface)::value_type& s) + [&](const auto& s) { return std::all_of( begin(s.second), end(s.second), - [&](decltype(s.second)::value_type f) - { return f*3+2 < m_triinpoel.size(); } ); } ), + [&](auto f){ return f*3+2 < m_triinpoel.size(); } ); } ), "Boundary face data structures inconsistent" ); } @@ -152,8 +152,8 @@ Sorter::setup( std::size_t npoin ) if (m_nbnd == 0) contribute( m_cbs.get< tag::queried >() ); else - for (const auto& c : chbnode) - thisProxy[ c.first ].query( thisIndex, c.second ); + for (const auto& [ targetchare, bndnodes ] : chbnode) + thisProxy[ targetchare ].query( thisIndex, bndnodes ); } void @@ -192,11 +192,11 @@ Sorter::response() std::map< int, std::unordered_set< std::size_t > > > exp; // Compute node communication map to be sent back to chares - for (const auto& c : m_chnode) { - auto& e = exp[ c.first ]; - for (auto n : c.second) + for (const auto& [ neighborchare, bndnodes ] : m_chnode) { + auto& e = exp[ neighborchare ]; + for (auto n : bndnodes) for (auto d : tk::cref_find(m_nodech,n)) - if (d != c.first) + if (d != neighborchare) e[ d ].insert( n ); } @@ -211,8 +211,8 @@ Sorter::response() if (m_nbnd == 0) contribute( m_cbs.get< tag::responded >() ); else - for (const auto& c : exp) - thisProxy[ c.first ].bnd( thisIndex, c.second ); + for (const auto& [ targetchare, bndnodes ] : exp) + thisProxy[ targetchare ].bnd( thisIndex, bndnodes ); } void @@ -224,8 +224,8 @@ Sorter::bnd( int fromch, //! \param[in] msum Boundary node communication map assembled by chare fromch // ***************************************************************************** { - for (const auto& c : msum) - m_msum[ c.first ].insert( begin(c.second), end(c.second) ); + for (const auto& [ neighborchare, bndnodes ] : msum) + m_msum[ neighborchare ].insert( begin(bndnodes), end(bndnodes) ); // Report back to chare message received from thisProxy[ fromch ].recvbnd(); @@ -279,7 +279,7 @@ Sorter::mask() auto& n = m_reordcomm[ c->first ]; for (auto j : c->second) if (std::none_of( m_msum.cbegin(), c, - [ j ]( const decltype(m_msum)::value_type& s ) + [ j ]( const auto& s ) { return s.second.find(j) != end(s.second); } )) { n.insert(j); } @@ -338,15 +338,15 @@ Sorter::reorder() thisProxy[ thisIndex ].wait4prep(); // Send out request for new global node IDs for nodes we do not reorder - for (const auto& c : m_reordcomm) - thisProxy[ c.first ].request( thisIndex, c.second ); + for (const auto& [ targetchare, nodes ] : m_reordcomm) + thisProxy[ targetchare ].request( thisIndex, nodes ); // Lambda to decide if node is assigned a new ID by this chare. If node is not // found in the asymmetric communication map, it is owned, i.e., this chare // assigns its new id. auto ownnode = [ this ]( std::size_t p ) { return std::all_of( m_reordcomm.cbegin(), m_reordcomm.cend(), - [&](const decltype(m_reordcomm)::value_type& s) + [&](const auto& s) { return s.second.find(p) == s.second.cend(); } ); }; @@ -391,15 +391,15 @@ Sorter::prepare() // ***************************************************************************** { // Find and return new node IDs to sender - for (const auto& r : m_reqnodes) { + for (const auto& [ requestorchare, nodes ] : m_reqnodes) { std::unordered_map< std::size_t, std::tuple< std::size_t, tk::UnsMesh::Coord > > n; - for (auto p : r.second) { + for (auto p : nodes) { auto newid = tk::cref_find( m_newnodes, p ); n.emplace( p, std::make_tuple( newid, tk::cref_find(m_newcoordmap,newid) ) ); } - thisProxy[ r.first ].neworder( n ); + thisProxy[ requestorchare ].neworder( n ); } tk::destroy( m_reqnodes ); // Clear queue of requests just fulfilled @@ -422,10 +422,10 @@ Sorter::neworder( const std::unordered_map< std::size_t, { // Store new node IDs associated to old ones, and node coordinates associated // to new node IDs. - for (const auto& p : nodes) { - auto id = std::get< 0 >( p.second ); - m_newnodes[ p.first ] = id; - m_newcoordmap.emplace( id, std::get<1>(p.second) ); + for (const auto& [ oldid, newnodes ] : nodes) { + auto newid = std::get< 0 >( newnodes ); + m_newnodes[ oldid ] = newid; + m_newcoordmap.emplace( newid, std::get< 1 >( newnodes ) ); } // If all our nodes have new IDs assigned, reorder complete on this PE @@ -441,29 +441,23 @@ Sorter::finish() // ***************************************************************************** { // Update elem connectivity with the reordered node IDs - for (auto& p : m_ginpoel) p = tk::cref_find( m_newnodes, p ); + tk::remap( m_ginpoel, m_newnodes ); // Update node coordinate map with the reordered IDs m_coordmap = m_newcoordmap; // Update symmetric chare-node communication map with the reordered IDs - for (auto& c : m_msum) { - decltype(c.second) n; - for (auto p : c.second) n.insert( tk::cref_find( m_newnodes, p ) ); - c.second = std::move( n ); + for (auto& [ neighborchare, bndnodes ] : m_msum) { + decltype(bndnodes) n; + for (auto p : bndnodes) n.insert( tk::cref_find( m_newnodes, p ) ); + bndnodes = std::move( n ); } - // Update unique global node IDs of this chare with the reordered node IDs - //m_nodeset.clear(); - //m_nodeset.insert( begin(m_ginpoel), end(m_ginpoel) ); - // Update boundary face-node connectivity with the reordered node IDs - for (auto& p : m_triinpoel) p = tk::cref_find( m_newnodes, p ); + tk::remap( m_triinpoel, m_newnodes ); // Update boundary node lists with the reordered node IDs - for (auto& s : m_bnode) - for (auto& p : s.second) - p = tk::cref_find( m_newnodes, p ); + for (auto& [ setid, nodes ] : m_bnode) tk::remap( nodes, m_newnodes ); // Update mesh in Refiner after reordering m_reorderRefiner.send(); @@ -504,11 +498,10 @@ Sorter::createDiscWorkers() // ***************************************************************************** { // Create worker array element using Charm++ dynamic chare array element - // insertion: 1st arg: chare id, last arg: PE chare is created on, middle - // args: Discretization ctor args. See also Charm++ manual, Sec. "Dynamic - // Insertion". - m_scheme.discInsert( thisIndex, m_host, m_meshwriter, m_ginpoel, m_coordmap, - m_msum, m_nchare ); + // insertion: last arg: PE chare is created on. See also Charm++ manual, Sec. + // "Dynamic Insertion". + m_scheme.disc()[ thisIndex ].insert( m_scheme.fct(), m_host, m_meshwriter, + m_ginpoel, m_coordmap, m_msum, m_nchare ); contribute( m_cbs.get< tag::discinserted >() ); } @@ -520,13 +513,13 @@ Sorter::createWorkers() // ***************************************************************************** { // Make sure (bound) base is already created and accessible - Assert( m_scheme.get()[thisIndex].ckLocal() != nullptr, + Assert( m_scheme.disc()[thisIndex].ckLocal() != nullptr, "About to pass nullptr" ); // Create worker array element using Charm++ dynamic chare array element // insertion: 1st arg: chare id, other args: Discretization's child ctor args. // See also Charm++ manual, Sec. "Dynamic Insertion". - m_scheme.insert( thisIndex, m_scheme.get(), m_bface, m_bnode, m_triinpoel ); + m_scheme.insert( thisIndex, m_scheme.disc(), m_bface, m_bnode, m_triinpoel ); if ( g_inputdeck.get< tag::cmd, tag::feedback >() ) m_host.chcreated(); diff --git a/src/Inciter/Sorter.hpp b/src/Inciter/Sorter.hpp index ce8d4651495..293ae42ef45 100644 --- a/src/Inciter/Sorter.hpp +++ b/src/Inciter/Sorter.hpp @@ -171,7 +171,7 @@ class Sorter : public CBase_Sorter { tk::SorterCallback m_cbs; //! Discretization scheme Scheme m_scheme; - //! Callback to send reordered mesh to Refiner + //! Callback to use to send reordered mesh to Refiner CkCallback m_reorderRefiner; //! Tetrtahedron element connectivity of our chunk of the mesh (global ids) std::vector< std::size_t > m_ginpoel; diff --git a/src/Inciter/Transporter.cpp b/src/Inciter/Transporter.cpp index e6e96990903..5dcfa13320b 100644 --- a/src/Inciter/Transporter.cpp +++ b/src/Inciter/Transporter.cpp @@ -66,21 +66,69 @@ Transporter::Transporter() : m_sorter(), m_nelem( 0 ), m_npoin_larger( 0 ), - m_V( 0.0 ), + m_meshvol( 0.0 ), m_minstat( {{ 0.0, 0.0, 0.0 }} ), m_maxstat( {{ 0.0, 0.0, 0.0 }} ), m_avgstat( {{ 0.0, 0.0, 0.0 }} ), m_timer(), m_progMesh( m_print, g_inputdeck.get< tag::cmd, tag::feedback >(), - {{ "p", "d", "r", "b", "c", "m", "r" }}, - {{ "partition", "distribute", "refine", "bnd", "comm", "mask", - "reorder" }} ), + ProgMeshPrefix, ProgMeshLegend ), m_progWork( m_print, g_inputdeck.get< tag::cmd, tag::feedback >(), - {{ "c", "b", "f", "g", "a" }}, - {{ "create", "bndface", "comfac", "ghost", "adj" }} ) + ProgWorkPrefix, ProgWorkLegend ) // ***************************************************************************** // Constructor // ***************************************************************************** +{ + // Echo configuration to screen + info(); + + const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); + const auto t0 = g_inputdeck.get< tag::discr, tag::t0 >(); + const auto term = g_inputdeck.get< tag::discr, tag::term >(); + const auto constdt = g_inputdeck.get< tag::discr, tag::dt >(); + + // If the desired max number of time steps is larger than zero, and the + // termination time is larger than the initial time, and the constant time + // step size (if that is used) is smaller than the duration of the time to be + // simulated, we have work to do, otherwise, finish right away. If a constant + // dt is not used, that part of the logic is always true as the default + // constdt is zero, see inciter::ctr::InputDeck::InputDeck(). + if ( nstep != 0 && term > t0 && constdt < term-t0 ) { + + // Enable SDAG waits for collecting mesh statistics + thisProxy.wait4stat(); + + // Configure and write diagnostics file header + diagHeader(); + + // Create mesh partitioner AND boundary condition object group + createPartitioner(); + + } else finish( 0, t0 ); // stop if no time stepping requested +} + +Transporter::Transporter( CkMigrateMessage* m ) : + CBase_Transporter( m ), + m_print( g_inputdeck.get() ? std::cout : std::clog ), + m_progMesh( m_print, g_inputdeck.get< tag::cmd, tag::feedback >(), + ProgMeshPrefix, ProgMeshLegend ), + m_progWork( m_print, g_inputdeck.get< tag::cmd, tag::feedback >(), + ProgWorkPrefix, ProgWorkLegend ) +// ***************************************************************************** +// Migrate constructor: returning from a checkpoint +//! \param[in] m Charm++ migrate message +// ***************************************************************************** +{ + m_print.diag( "Restarted from checkpoint" ); + info(); + inthead(); +} + +void +Transporter::info() +// ***************************************************************************** +// Echo configuration to screen +// ***************************************************************************** { m_print.part( "Factory" ); @@ -120,16 +168,23 @@ Transporter::Transporter() : m_print.section( "Discretization parameters" ); m_print.Item< ctr::Scheme, tag::discr, tag::scheme >(); + if (scheme == ctr::SchemeType::PDG) { + m_print.item( "p-refinement tolerance", + g_inputdeck.get< tag::pref, tag::tolref >() ); + } + if (scheme == ctr::SchemeType::DiagCG) { auto fct = g_inputdeck.get< tag::discr, tag::fct >(); m_print.item( "Flux-corrected transport (FCT)", fct ); if (fct) m_print.item( "FCT mass diffusion coeff", g_inputdeck.get< tag::discr, tag::ctau >() ); - } else if (scheme == ctr::SchemeType::DG || scheme == ctr::SchemeType::DGP1 || + } else if (scheme == ctr::SchemeType::DG || + scheme == ctr::SchemeType::P0P1 || scheme == ctr::SchemeType::DGP1 || scheme == ctr::SchemeType::DGP2 || scheme == ctr::SchemeType::PDG) { m_print.Item< ctr::Flux, tag::discr, tag::flux >(); + m_print.Item< ctr::Limiter, tag::discr, tag::limiter >(); } m_print.item( "PE-locality mesh reordering", g_inputdeck.get< tag::discr, tag::reorder >() ); @@ -193,40 +248,31 @@ Transporter::Transporter() : m_print.item( "Uniform-only mesh refinement, t>0", g_inputdeck.get< tag::amr, tag::dtref_uniform >() ); } + m_print.item( "Refinement tolerance", + g_inputdeck.get< tag::amr, tag::tolref >() ); + m_print.item( "De-refinement tolerance", + g_inputdeck.get< tag::amr, tag::tolderef >() ); } - // If the desired max number of time steps is larger than zero, and the - // termination time is larger than the initial time, and the constant time - // step size (if that is used) is smaller than the duration of the time to be - // simulated, we have work to do, otherwise, finish right away. If a constant - // dt is not used, that part of the logic is always true as the default - // constdt is zero, see inciter::ctr::InputDeck::InputDeck(). - if ( nstep != 0 && term > t0 && constdt < term-t0 ) { - - // Enable SDAG waits for collecting mesh statistics - thisProxy.wait4stat(); - - // Print I/O filenames - m_print.section( "Output filenames" ); - m_print.item( "Field", g_inputdeck.get< tag::cmd, tag::io, tag::output >() - + "." ); - m_print.item( "Diagnostics", - g_inputdeck.get< tag::cmd, tag::io, tag::diag >() ); - - // Print output intervals - m_print.section( "Output intervals" ); - m_print.item( "TTY", g_inputdeck.get< tag::interval, tag::tty>() ); - m_print.item( "Field", g_inputdeck.get< tag::interval, tag::field >() ); - m_print.item( "Diagnostics", g_inputdeck.get< tag::interval, tag::diag >() ); - m_print.endsubsection(); - - // Configure and write diagnostics file header - diagHeader(); - - // Create mesh partitioner AND boundary condition object group - createPartitioner(); - - } else finish(); // stop if no time stepping requested + // Print I/O filenames + m_print.section( "Output filenames and directories" ); + m_print.item( "Field output file(s)", + g_inputdeck.get< tag::cmd, tag::io, tag::output >() + + ".e-s..." ); + m_print.item( "Diagnostics file", + g_inputdeck.get< tag::cmd, tag::io, tag::diag >() ); + m_print.item( "Checkpoint/restart directory", + g_inputdeck.get< tag::cmd, tag::io, tag::restart >() + '/' ); + + // Print output intervals + m_print.section( "Output intervals" ); + m_print.item( "TTY", g_inputdeck.get< tag::interval, tag::tty>() ); + m_print.item( "Field", g_inputdeck.get< tag::interval, tag::field >() ); + m_print.item( "Diagnostics", + g_inputdeck.get< tag::interval, tag::diag >() ); + m_print.item( "Checkpoint/restart", + g_inputdeck.get< tag::cmd, tag::rsfreq >() ); + m_print.endsubsection(); } void @@ -258,29 +304,29 @@ Transporter::createPartitioner() } // Create partitioner callbacks (order matters) - tk::PartitionerCallback cbp { + tk::PartitionerCallback cbp {{ CkCallback( CkReductionTarget(Transporter,load), thisProxy ) , CkCallback( CkReductionTarget(Transporter,distributed), thisProxy ) , CkCallback( CkReductionTarget(Transporter,refinserted), thisProxy ) , CkCallback( CkReductionTarget(Transporter,refined), thisProxy ) - }; + }}; // Create refiner callbacks (order matters) - tk::RefinerCallback cbr { + tk::RefinerCallback cbr {{ CkCallback( CkReductionTarget(Transporter,edges), thisProxy ) , CkCallback( CkReductionTarget(Transporter,compatibility), thisProxy ) , CkCallback( CkReductionTarget(Transporter,bndint), thisProxy ) , CkCallback( CkReductionTarget(Transporter,matched), thisProxy ) , CkCallback( CkReductionTarget(Transporter,refined), thisProxy ) - }; + }}; // Create sorter callbacks (order matters) - tk::SorterCallback cbs { + tk::SorterCallback cbs {{ CkCallback( CkReductionTarget(Transporter,queried), thisProxy ) , CkCallback( CkReductionTarget(Transporter,responded), thisProxy ) , CkCallback( CkReductionTarget(Transporter,discinserted), thisProxy ) , CkCallback( CkReductionTarget(Transporter,workinserted), thisProxy ) - }; + }}; // Start timer measuring preparation of the mesh for partitioning m_timer[ TimerTag::MESH_READ ]; @@ -380,6 +426,7 @@ Transporter::refinserted( int error ) // ***************************************************************************** { if (error) { + m_print << "\n>>> ERROR: A worker chare was not assigned any mesh " "elements. This can happen in SMP-mode with a large +ppn " "parameter (number of worker threads per logical node) and is " @@ -391,9 +438,13 @@ Transporter::refinserted( int error ) "with +ppn larger than 1. Solution 1: Try a different " "partitioning algorithm (e.g., rcb instead of mj). Solution 2: " "Decrease +ppn."; - finish(); + + finish( 0, g_inputdeck.get< tag::discr, tag::t0 >() ); + } else { + m_refiner.doneInserting(); + } } @@ -411,7 +462,7 @@ Transporter::compatibility( int modified ) // ***************************************************************************** // Reduction target: all mesh refiner chares have received a round of edges, // and ran their compatibility algorithm -//! \param[in] Sum acorss all workers, if nonzero, mesh is modified +//! \param[in] modified Sum acorss all workers, if nonzero, mesh is modified //! \details This is called iteratively, until convergence by Refiner. At this //! point all Refiner chares have received a round of edge data (tags whether //! an edge needs to be refined, etc.), and applied the compatibility @@ -428,16 +479,16 @@ Transporter::compatibility( int modified ) void Transporter::matched( std::size_t nextra, - std::size_t nedge, + std::size_t nref, + std::size_t nderef, std::size_t initial ) // ***************************************************************************** -// Reduction target: all mesh refiner chares have performed a step of matching -// chare-boundary edges +// Reduction target: all mesh refiner chares have matched/corrected the tagging +// of chare-boundary edges, all chares are ready to perform refinement. //! \param[in] nextra Sum (across all chares) of the number of edges on each //! chare that need correction along chare boundaries -//! \param[in] nedge Sum (across all chares) of number of edges on each chare. -//! This is not really used for anything meaningful (as it is multiply-counted -//! in parallel), only as a feedback during mesh refinement. +//! \param[in] nref Sum of number of refined tetrahedra across all chares. +//! \param[in] nderef Sum of number of derefined tetrahedra across all chares. //! \param[in] initial Sum of contributions from all chares. If larger than //! zero, we are during time stepping and if zero we are during setup. // ***************************************************************************** @@ -454,28 +505,32 @@ Transporter::matched( std::size_t nextra, if (initial > 0) { if (!g_inputdeck.get< tag::cmd, tag::feedback >()) { - m_print.diag( { "t0ref", "nedge", "ncorr" }, - { ++m_nt0refit, nedge, m_ncit } ); + m_print.diag( { "t0ref", "nref", "nderef", "ncorr" }, + { ++m_nt0refit, nref, nderef, m_ncit } ); } m_progMesh.inc< REFINE >(); } else { - m_print.diag( { "dtref", "nedge", "ncorr" }, - { ++m_ndtrefit, nedge, m_ncit }, false ); + m_print.diag( { "dtref", "nref", "nderef", "ncorr" }, + { ++m_ndtrefit, nref, nderef, m_ncit }, false ); } m_ncit = 0; - m_refiner.eval(); + m_refiner.perform(); } } void -Transporter::bndint( tk::real sx, tk::real sy, tk::real sz ) +Transporter::bndint( tk::real sx, tk::real sy, tk::real sz, tk::real cb ) // ***************************************************************************** // Compute surface integral across the whole problem and perform leak-test +//! \param[in] sx X component of vector summed +//! \param[in] sy Y component of vector summed +//! \param[in] sz Z component of vector summed +//! \param[in] cb Invoke callback if positive //! \details This function aggregates partial surface integrals across the //! boundary faces of the whole problem. After this global sum a //! non-zero vector result indicates a leak, e.g., a hole in the boundary, @@ -483,10 +538,27 @@ Transporter::bndint( tk::real sx, tk::real sy, tk::real sz ) //! compute the partial surface integrals. // ***************************************************************************** { - auto eps = std::numeric_limits< tk::real >::epsilon() * 100; - if (std::abs(sx) > eps || std::abs(sy) > eps || std::abs(sz) > eps) - Throw( "Mesh boundary leaky, t0ref: " + std::to_string(m_nt0refit) + - ", dtref: " + std::to_string(m_ndtrefit) ); + std::stringstream err; + if (cb < 0.0) { // called from Refiner + err << "Mesh boundary leaky after mesh refinement step; this is due to a " + "problem with updating the side sets used to specify boundary conditions " + "on faces, required for DG methods: "; + } else if (cb > 0.0) { // called from DG + err << "Mesh boundary leaky during initialization of the DG algorithm; this " + "is due to incorrect or incompletely specified boundary conditions for a " + "given input mesh: "; + } + + auto eps = std::numeric_limits< tk::real >::epsilon() * 1.0e+3; // ~ 2.0e-13 + + if (std::abs(sx) > eps || std::abs(sy) > eps || std::abs(sz) > eps) { + err << "Integral result must be a zero vector: " << std::setprecision(12) << + std::abs(sx) << ", " << std::abs(sy) << ", " << std::abs(sz) << + ", eps = " << eps; + Throw( err.str() ); + } + + if (cb > 0.0) m_scheme.bcast< Scheme::resizeComm >(); } void @@ -525,38 +597,16 @@ Transporter::responded() m_sorter.start(); } -void -Transporter::discresized() -// ***************************************************************************** -// Reduction target: all Discretization chares have resized their own data after -// mesh refinement -// ***************************************************************************** -{ - discresize_complete(); -} - -void -Transporter::workresized() -// ***************************************************************************** -// Reduction target: all worker chares have resized their own data after -// mesh refinement -// ***************************************************************************** -{ - workresize_complete(); -} - void Transporter::resized() // ***************************************************************************** // Reduction target: all worker chares have resized their own data after // mesh refinement +//! \note Only used for nodal schemes // ***************************************************************************** { - m_scheme.vol(); - - const auto scheme = g_inputdeck.get< tag::discr, tag::scheme >(); - if (scheme == ctr::SchemeType::DiagCG || scheme == ctr::SchemeType::ALECG) - m_scheme.lhs(); + m_scheme.disc().vol(); + m_scheme.bcast< Scheme::lhs >(); } void @@ -565,7 +615,7 @@ Transporter::discinserted() // Reduction target: all Discretization chares have been inserted // ***************************************************************************** { - m_scheme.doneDiscInserting< tag::bcast >(); + m_scheme.disc().doneInserting(); } void @@ -585,10 +635,9 @@ Transporter::disccreated() m_refiner.sendProxy(); auto sch = g_inputdeck.get< tag::discr, tag::scheme >(); - if (sch == ctr::SchemeType::DiagCG) - m_scheme.doneDistFCTInserting< tag::bcast >(); + if (sch == ctr::SchemeType::DiagCG) m_scheme.fct().doneInserting(); - m_scheme.vol(); + m_scheme.disc().vol(); } void @@ -598,7 +647,7 @@ Transporter::workinserted() // inserted // ***************************************************************************** { - m_scheme.doneInserting< tag::bcast >(); + m_scheme.bcast< Scheme::doneInserting >(); } void @@ -617,7 +666,8 @@ Transporter::diagHeader() const auto scheme = g_inputdeck.get< tag::discr, tag::scheme >(); if (scheme == ctr::SchemeType::DiagCG || scheme == ctr::SchemeType::ALECG) for (const auto& eq : g_cgpde) varnames( eq, var ); - else if (scheme == ctr::SchemeType::DG || scheme == ctr::SchemeType::DGP1 || + else if (scheme == ctr::SchemeType::DG || + scheme == ctr::SchemeType::P0P1 || scheme == ctr::SchemeType::DGP1 || scheme == ctr::SchemeType::DGP2 || scheme == ctr::SchemeType::PDG) for (const auto& eq : g_dgpde) varnames( eq, var ); else Throw( "Diagnostics header not handled for discretization scheme" ); @@ -655,25 +705,15 @@ Transporter::comfinal( int initial ) { if (initial > 0) { m_progWork.end(); - m_scheme.setup( m_V ); + m_scheme.bcast< Scheme::setup >(); // Turn on automatic load balancing tk::CProxy_LBSwitch::ckNew( g_inputdeck.get() ); } else { - m_scheme.lhs(); + m_scheme.bcast< Scheme::lhs >(); } } // [Discretization-specific communication maps] -void -Transporter::vol() -// ***************************************************************************** -// Reduction target indicating that all workers have finished -// computing/receiving their part of the nodal volumes -// ***************************************************************************** -{ - m_scheme.totalvol(); -} - void Transporter::totalvol( tk::real v, tk::real initial ) // ***************************************************************************** @@ -683,12 +723,12 @@ Transporter::totalvol( tk::real v, tk::real initial ) //! zero, we are during time stepping and if zero we are during setup. // ***************************************************************************** { - m_V = v; + m_meshvol = v; if (initial > 0.0) - m_scheme.stat< tag::bcast >(); + m_scheme.disc().stat( m_meshvol ); else - m_scheme.resized(); + m_scheme.bcast< Scheme::resized >(); } void @@ -798,18 +838,8 @@ Transporter::stat() std::to_string( static_cast(m_maxstat[2]) ) + " / " + std::to_string( static_cast(m_avgstat[2]) ) ); - m_print.inthead( "Time integration", "Unstructured-mesh PDE solver testbed", - "Legend: it - iteration count\n" - " t - time\n" - " dt - time step size\n" - " ETE - estimated time elapsed (h:m:s)\n" - " ETA - estimated time for accomplishment (h:m:s)\n" - " out - output-saved flags\n" - " f - field\n" - " d - diagnostics\n" - " h - h-refinement\n", - "\n it t dt ETE ETA out\n" - " ---------------------------------------------------------------\n" ); + // Print out time integration header to screen + inthead(); m_progWork.start( "Preparing workers", {{ m_nchare, m_nchare, m_nchare, m_nchare, m_nchare }} ); @@ -818,16 +848,26 @@ Transporter::stat() } void -Transporter::advance( tk::real dt ) +Transporter::inthead() // ***************************************************************************** -// Reduction target computing the minimum of dt +// Print out time integration header to screen // ***************************************************************************** { - // Enable SDAG waits for resize operations after mesh refinement - thisProxy.wait4resize(); - - // Comptue size of next time step - m_scheme.advance( dt ); + m_print.inthead( "Time integration", "Navier-Stokes solver", + "Legend: it - iteration count\n" + " t - time\n" + " dt - time step size\n" + " ETE - estimated time elapsed (h:m:s)\n" + " ETA - estimated time for accomplishment (h:m:s)\n" + " EGT - estimated grind time (ms/status)\n" + " out - output-saved flags\n" + " f - field\n" + " d - diagnostics\n" + " h - h-refinement\n" + " l - load balancing\n" + " r - checkpoint/restart\n", + "\n it t dt ETE ETA EGT out\n" + " -------------------------------------------------------------------------\n" ); } void @@ -835,6 +875,7 @@ Transporter::diagnostics( CkReductionMsg* msg ) // ***************************************************************************** // Reduction target optionally collecting diagnostics, e.g., residuals //! \param[in] msg Serialized diagnostics vector aggregated across all PEs +//! \note Only used for nodal schemes // ***************************************************************************** { std::vector< std::vector< tk::real > > d; @@ -858,7 +899,7 @@ Transporter::diagnostics( CkReductionMsg* msg ) // Finish computing diagnostics for (std::size_t i=0; i(); @@ -869,7 +910,7 @@ Transporter::diagnostics( CkReductionMsg* msg ) if (e == tk::ctr::ErrorType::L2) { // Finish computing the L2 norm of the numerical - analytical solution for (std::size_t i=0; i(d[ITER][0]), d[TIME][0], d[DT][0], diag ); // Evaluate whether to continue with next step - m_scheme.diag< tag::bcast >(); + m_scheme.bcast< Scheme::refine >(); +} + +void +Transporter::resume() +// ***************************************************************************** +// Resume execution from checkpoint/restart files +//! \details This is invoked by Charm++ after the checkpoint is done, as well as +//! when the restart (returning from a checkpoint) is complete +// ***************************************************************************** +{ + const auto nstep = g_inputdeck.get< tag::discr, tag::nstep >(); + const auto term = g_inputdeck.get< tag::discr, tag::term >(); + const auto eps = std::numeric_limits< tk::real >::epsilon(); + + // If neither max iterations nor max time reached, continue, otherwise finish + if (std::fabs(m_t-term) > eps && m_it < nstep) + m_scheme.bcast< Scheme::evalLB >(); + else + mainProxy.finalize(); +} + +void +Transporter::checkpoint( tk::real it, tk::real t ) +// ***************************************************************************** +// Save checkpoint/restart files +//! \param[in] it Iteration count +//! \param[in] t Physical time +// ***************************************************************************** +{ + m_it = static_cast< uint64_t >( it ); + m_t = t; + + const auto& restart = g_inputdeck.get< tag::cmd, tag::io, tag::restart >(); + CkCallback res( CkIndex_Transporter::resume(), thisProxy ); + CkStartCheckpoint( restart.c_str(), res ); } void -Transporter::finish() +Transporter::finish( tk::real it, tk::real t ) // ***************************************************************************** // Normal finish of time stepping +//! \param[in] it Iteration count +//! \param[in] t Physical time // ***************************************************************************** { - mainProxy.finalize(); + checkpoint( it, t ); } #include "NoWarning/transporter.def.h" diff --git a/src/Inciter/Transporter.hpp b/src/Inciter/Transporter.hpp index 58ae51b2bea..25281e6ad3d 100644 --- a/src/Inciter/Transporter.hpp +++ b/src/Inciter/Transporter.hpp @@ -27,15 +27,24 @@ namespace inciter { +//! Indices for progress report on mesh preparation +enum ProgMesh{ PART=0, DIST, REFINE, BND, COMM, MASK, REORD }; +//! Prefixes for progress report on mesh preparation +static const std::array< std::string, 7 > + ProgMeshPrefix = {{ "p", "d", "r", "b", "c", "m", "r" }}, + ProgMeshLegend = {{ "partition", "distribute", "refine", "bnd", "comm", + "mask", "reorder" }}; + +//! Indices for progress report on workers preparation +enum ProgWork{ CREATE=0, BNDFACE, COMFAC, GHOST, ADJ }; +//! Prefixes for progress report on workers preparation +static const std::array< std::string, 5 > + ProgWorkPrefix = {{ "c", "b", "f", "g", "a" }}, + ProgWorkLegend = {{ "create", "bndface", "comfac", "ghost", "adj" }}; + //! Transporter drives the time integration of transport equations class Transporter : public CBase_Transporter { - private: - //! Indices for progress report on mesh preparation - enum ProgMesh{ PART=0, DIST, REFINE, BND, COMM, MASK, REORD }; - //! Indices for progress report on workers preparation - enum ProgWork{ CREATE=0, BNDFACE, COMFAC, GHOST, ADJ }; - public: #if defined(__clang__) #pragma clang diagnostic push @@ -63,8 +72,11 @@ class Transporter : public CBase_Transporter { //! Constructor explicit Transporter(); + //! Migrate constructor: returning from a checkpoint + explicit Transporter( CkMigrateMessage* m ); + //! Reduction target: the mesh has been read from file on all PEs - void load( std::size_t nelem, std::size_t nnode ); + void load( std::size_t nelem, std::size_t npoin ); //! \brief Reduction target: all Solver (PEs) have computed the number of //! chares they will recieve contributions from during linear solution @@ -94,30 +106,28 @@ class Transporter : public CBase_Transporter { //! of edges, and ran their compatibility algorithm void compatibility( int modified ); - //! \brief Reduction target: all mesh refiner chares have performed a step - //! of matching chare-boundary edges - void matched( std::size_t nextra, std::size_t nedge, std::size_t initial ); + //! \brief Reduction target: all mesh refiner chares have matched/corrected + //! the tagging of chare-boundary edges, all chares are ready to perform + //! refinement. + void matched( std::size_t nextra, std::size_t nref, std::size_t nderef, + std::size_t initial ); //! Compute surface integral across the whole problem and perform leak-test - void bndint( tk::real sx, tk::real sy, tk::real sz ); + void bndint( tk::real sx, tk::real sy, tk::real sz, tk::real cb ); //! Reduction target: all PEs have optionally refined their mesh void refined( std::size_t nelem, std::size_t npoin ); + //! \brief Reduction target: all worker chares have resized their own data + //! after mesh refinement + void resized(); + //! Reduction target: all Sorter chares have queried their boundary nodes void queried(); //! \brief Reduction target: all Sorter chares have responded with their //! boundary nodes void responded(); - //! \brief Reduction target: all Discretization chares have resized their - //! own data after mesh refinement - void discresized(); - - //! \brief Reduction target: all worker chares have resized their own data - //! after mesh refinement - void workresized(); - //! Non-reduction target for receiving progress report on partitioning mesh void pepartitioned() { m_progMesh.inc< PART >(); } //! Non-reduction target for receiving progress report on distributing mesh @@ -148,10 +158,6 @@ class Transporter : public CBase_Transporter { //! Reduction target summing total mesh volume void totalvol( tk::real v, tk::real initial ); - //! \brief Reduction target indicating that all workers have finished - //! computing/receiving their part of the nodal volumes - void vol(); - //! \brief Reduction target yielding the minimum mesh statistics across //! all workers void minstat( tk::real d0, tk::real d1, tk::real d2 ); @@ -174,11 +180,46 @@ class Transporter : public CBase_Transporter { //! residuals, from all worker chares void diagnostics( CkReductionMsg* msg ); - //! Reduction target computing minimum of dt - void advance( tk::real dt ); + //! Resume execution from checkpoint/restart files + void resume(); + + //! Save checkpoint/restart files + void checkpoint( tk::real it, tk::real t ); //! Normal finish of time stepping - void finish(); + void finish( tk::real it, tk::real t ); + + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \note This is a Charm++ mainchare, pup() is thus only for + //! checkpoint/restart. + void pup( PUP::er &p ) override { + p | m_nchare; + p | m_ncit; + p | m_nt0refit; + p | m_ndtrefit; + p | m_scheme; + p | m_partitioner; + p | m_refiner; + p | m_meshwriter; + p | m_sorter; + p | m_nelem; + p | m_npoin_larger; + p | m_t; + p | m_it; + p | m_meshvol; + p | m_minstat; + p | m_maxstat; + p | m_avgstat; + p | m_timer; + } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] t Transporter object reference + friend void operator|( PUP::er& p, Transporter& t ) { t.pup(p); } + //@} private: InciterPrint m_print; //!< Pretty printer @@ -193,8 +234,10 @@ class Transporter : public CBase_Transporter { CProxy_Sorter m_sorter; //!< Mesh sorter array proxy std::size_t m_nelem; //!< Number of mesh elements std::size_t m_npoin_larger; //!< Total number mesh points - //! Total mesh volume - tk::real m_V; + tk::real m_t; //!< Physical time + uint64_t m_it; //!< Iteration count + //! Total mesh volume + tk::real m_meshvol; //! Minimum mesh statistics std::array< tk::real, 3 > m_minstat; //! Maximum mesh statistics @@ -216,13 +259,15 @@ class Transporter : public CBase_Transporter { //! Configure and write diagnostics file header void diagHeader(); + //! Echo configuration to screen + void info(); + + //! Print out time integration header to screen + void inthead(); + //! Echo diagnostics on mesh statistics void stat(); - //! \brief All Discretization and worker chares have resized their own data - //! after mesh refinement - void resized(); - //! Query variable names for all equation systems to be integrated //! \param[in] eq Equation system whose variable names to query //! \param[in,out] var Vector of strings to which we append the variable @@ -264,8 +309,7 @@ class Transporter : public CBase_Transporter { } } // Remove sidesets not configured as BCs (will not process those further) - using Pair = std::pair< const int, std::vector< std::size_t > >; - tk::erase_if( bnd, [&]( Pair& item ) { + tk::erase_if( bnd, [&]( auto& item ) { return sidesets_as_bc.find( item.first ) == end(sidesets_as_bc); }); // Warn on no BCs diff --git a/src/Inciter/alecg.ci b/src/Inciter/alecg.ci index f54c33bdfbe..78a94e207db 100644 --- a/src/Inciter/alecg.ci +++ b/src/Inciter/alecg.ci @@ -34,10 +34,11 @@ module alecg { const std::map< int, std::vector< std::size_t > >& bnode, const std::vector< std::size_t >& /* triinpoel */ ); initnode void registerReducers(); - entry void setup( tk::real v ); + entry void setup(); + entry void resizeComm(); entry void init(); - entry void diag(); - entry void advance( tk::real newdt ); + entry void refine(); + entry [reductiontarget] void advance( tk::real newdt ); entry void comlhs( const std::vector< std::size_t >& gid, const std::vector< std::vector< tk::real > >& L ); entry void comrhs( const std::vector< std::size_t >& gid, @@ -45,6 +46,8 @@ module alecg { entry void resized(); entry void lhs(); entry void step(); + entry void next(); + entry void evalLB(); //! [Entry methods] // SDAG code follows. See http://charm.cs.illinois.edu/manuals/html/ @@ -58,15 +61,12 @@ module alecg { when ownrhs_complete(), comrhs_complete() serial "rhs" { solve(); } } entry void wait4out() { - when diag_complete(), ref_complete(), lhs_complete(), - resize_complete() serial "out" { out(); } } + when lhs_complete(), resize_complete() serial "out" { out(); } } entry void ownlhs_complete(); entry void ownrhs_complete(); entry void comlhs_complete(); entry void comrhs_complete(); - entry void diag_complete(); - entry void ref_complete(); entry void lhs_complete(); entry void resize_complete(); //! [DAG] diff --git a/src/Inciter/dg.ci b/src/Inciter/dg.ci index 497dc6dc9e2..66e7fda43bb 100644 --- a/src/Inciter/dg.ci +++ b/src/Inciter/dg.ci @@ -28,31 +28,38 @@ module dg { const std::map< int, std::vector< std::size_t > >& bface, const std::map< int, std::vector< std::size_t > >& /* bnode */, const std::vector< std::size_t >& triinpoel ); + entry void resizeComm(); entry void comfac( int fromch, const tk::UnsMesh::FaceSet& infaces ); entry void comGhost( int fromch, const GhostData& ghost ); entry void reqGhost(); initnode void registerReducers(); - entry void setup( tk::real v ); - entry void next(); - entry void diag(); - entry [reductiontarget] void sendLim(); + entry void setup(); entry void comlim( int fromch, const std::vector< std::size_t >& tetid, - const std::vector< std::vector< tk::real > >& lfn, + const std::vector< std::vector< tk::real > >& u, + const std::vector< std::vector< tk::real > >& prim, const std::vector< std::size_t >& ndof ); entry void comsol( int fromch, + std::size_t fromstage, const std::vector< std::size_t >& tetid, const std::vector< std::vector< tk::real > >& u, - const std::vector< std::size_t >& ndofel ); - entry void advance( tk::real ); + const std::vector< std::vector< tk::real > >& prim, + const std::vector< std::size_t >& ndof ); + entry void refine(); entry [reductiontarget] void solve( tk::real newdt ); entry void resized(); entry void lhs(); entry void step(); + entry void next(); + entry void evalLB(); // SDAG code follows. See http://charm.cs.illinois.edu/manuals/html/ // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger". + entry void wait4fac() { + when ownfac_complete(), comfac_complete() serial "bndfaces" + { bndFaces(); } } + entry void wait4ghost() { when ownghost_complete(), reqghost_complete() serial "ghost" { sendGhost(); } } @@ -62,22 +69,16 @@ module dg { { lim(); } } entry void wait4lim() { - when ownlim_complete(), comlim_complete() serial "lim" - { dt(); } } - - entry void wait4recompghost() { - when diag_complete(), ref_complete(), resize_complete() serial - "recomputeGhostRefined" { recompGhostRefined(); } } + when ownlim_complete(), comlim_complete() serial "lim" { dt(); } } + entry void ownfac_complete(); + entry void comfac_complete(); entry void ownghost_complete(); entry void reqghost_complete(); entry void ownsol_complete(); entry void comsol_complete(); entry void ownlim_complete(); entry void comlim_complete(); - entry void diag_complete(); - entry void ref_complete(); - entry void resize_complete(); } } // inciter:: diff --git a/src/Inciter/diagcg.ci b/src/Inciter/diagcg.ci index 8060d0b7875..a3c0a0117a3 100644 --- a/src/Inciter/diagcg.ci +++ b/src/Inciter/diagcg.ci @@ -19,6 +19,7 @@ module diagcg { include "UnsMesh.hpp"; include "PUPUtil.hpp"; + include "Fields.hpp"; namespace inciter { @@ -28,19 +29,21 @@ module diagcg { const std::map< int, std::vector< std::size_t > >& bnode, const std::vector< std::size_t >& /* triinpoel */ ); initnode void registerReducers(); - entry void setup( tk::real v ); + entry void setup(); + entry void resizeComm(); entry void init(); - entry void diag(); - entry void advance( tk::real newdt ); + entry void refine(); + entry [reductiontarget] void advance( tk::real newdt ); entry void comlhs( const std::vector< std::size_t >& gid, const std::vector< std::vector< tk::real > >& L ); entry void comrhs( const std::vector< std::size_t >& gid, - const std::vector< std::vector< tk::real > >& R ); - entry void comdif( const std::vector< std::size_t >& gid, + const std::vector< std::vector< tk::real > >& R, const std::vector< std::vector< tk::real > >& D ); entry void resized(); entry void lhs(); entry void step(); + entry void next(); + entry void evalLB(); // SDAG code follows. See http://charm.cs.illinois.edu/manuals/html/ // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger". @@ -49,22 +52,17 @@ module diagcg { when ownlhs_complete(), comlhs_complete() serial "lhs" { lhsmerge(); } } entry void wait4rhs() { - when ownrhs_complete(), comrhs_complete(), - owndif_complete(), comdif_complete() serial "rhs" { solve(); } } + when ownrhs_complete( tk::Fields& dif ), comrhs_complete() + serial "rhs" { solve( dif ); } } entry void wait4out() { - when diag_complete(), ref_complete(), lhs_complete(), - resize_complete() serial "out" { out(); } } + when lhs_complete(), resize_complete() serial "out" { out(); } } entry void ownlhs_complete(); - entry void ownrhs_complete(); - entry void owndif_complete(); entry void comlhs_complete(); - entry void comrhs_complete(); - entry void comdif_complete(); - entry void diag_complete(); - entry void ref_complete(); entry void lhs_complete(); + entry void ownrhs_complete( tk::Fields& dif ); + entry void comrhs_complete(); entry void resize_complete(); } diff --git a/src/Inciter/discretization.ci b/src/Inciter/discretization.ci index bf4edcc0d4b..0da02d862d7 100644 --- a/src/Inciter/discretization.ci +++ b/src/Inciter/discretization.ci @@ -22,7 +22,6 @@ module discretization { namespace inciter { array [1D] Discretization { - entry Discretization( const CProxy_DistFCT& fctproxy, const CProxy_Transporter& transporter, @@ -31,18 +30,21 @@ module discretization { const tk::UnsMesh::CoordMap& coordmap, const std::map< int, std::unordered_set< std::size_t > >& msum, int nchare ); - initnode void registerReducers(); - entry void vol(); - entry void comvol( const std::vector< std::size_t >& gid, const std::vector< tk::real >& nodevol ); + entry void stat( tk::real mesh_volume ); + + // SDAG code follows. See http://charm.cs.illinois.edu/manuals/html/ + // charm++/manual.html, Sec. "Structured Control Flow: Structured Dagger". - entry void totalvol(); + entry void wait4vol() { + when ownvol_complete(), comvol_complete() serial "vol" { totalvol(); } } - entry void stat(); - }; + entry void ownvol_complete(); + entry void comvol_complete(); + } } // inciter:: diff --git a/src/Inciter/partitioner.ci b/src/Inciter/partitioner.ci index 9221efd941b..9d658859879 100644 --- a/src/Inciter/partitioner.ci +++ b/src/Inciter/partitioner.ci @@ -25,7 +25,7 @@ module partitioner { namespace inciter { - nodegroup Partitioner { + nodegroup [migratable] Partitioner { entry Partitioner( const tk::PartitionerCallback& cbp, const tk::RefinerCallback& cbr, diff --git a/src/Inciter/refiner.ci b/src/Inciter/refiner.ci index 2e05bf17d4b..b335cd23e82 100644 --- a/src/Inciter/refiner.ci +++ b/src/Inciter/refiner.ci @@ -46,7 +46,7 @@ module refiner { const std::unordered_set< std::size_t > intermediates ); entry void refine(); entry void comExtra(); - entry void eval(); + entry void perform(); entry void sendProxy(); }; diff --git a/src/Inciter/transporter.ci b/src/Inciter/transporter.ci index 583ebc7eee3..17c846d1fcc 100644 --- a/src/Inciter/transporter.ci +++ b/src/Inciter/transporter.ci @@ -18,7 +18,7 @@ module transporter { namespace inciter { - chare Transporter { + chare [migratable] Transporter { entry Transporter(); entry [reductiontarget] void load( std::size_t nelem, std::size_t npoin ); entry [reductiontarget] void distributed(); @@ -29,20 +29,20 @@ module transporter { entry [reductiontarget] void edges(); entry [reductiontarget] void compatibility( int modified ); entry [reductiontarget] void matched( std::size_t nextra, - std::size_t nedge, + std::size_t nref, + std::size_t nderef, std::size_t initial ); entry [reductiontarget] void bndint( tk::real sx, tk::real sy, - tk::real sz ); + tk::real sz, + tk::real cb ); entry [reductiontarget] void refined( std::size_t nelem, std::size_t npoin ); + entry [reductiontarget] void resized(); entry [reductiontarget] void queried(); entry [reductiontarget] void responded(); - entry [reductiontarget] void discresized(); - entry [reductiontarget] void workresized(); entry [reductiontarget] void comfinal( int initial ); entry [reductiontarget] void totalvol( tk::real v, tk::real initial ); - entry [reductiontarget] void vol(); entry [reductiontarget] void minstat( tk::real d0, tk::real d1, tk::real d2); entry [reductiontarget] void maxstat( tk::real d0, tk::real d1, @@ -52,8 +52,9 @@ module transporter { tk::real d4, tk::real d5 ); entry [reductiontarget] void pdfstat( CkReductionMsg* msg ); entry [reductiontarget] void diagnostics( CkReductionMsg* msg ); - entry [reductiontarget] void advance( tk::real ); - entry [reductiontarget] void finish(); + entry void resume(); + entry [reductiontarget] void checkpoint( tk::real it, tk::real t ); + entry [reductiontarget] void finish( tk::real it, tk::real t ); entry void pepartitioned(); entry void pedistributed(); @@ -75,16 +76,10 @@ module transporter { when minstat_complete(), maxstat_complete(), sumstat_complete(), pdfstat_complete() serial "stat" { stat(); } }; - entry void wait4resize() { - when discresize_complete(), workresize_complete() serial "resize" - { resized(); } }; - entry void minstat_complete(); entry void maxstat_complete(); entry void sumstat_complete(); entry void pdfstat_complete(); - entry void discresize_complete(); - entry void workresize_complete(); } } // inciter:: diff --git a/src/Main/FileConv.cmake b/src/Main/FileConv.cmake index 2edbc152a8a..d00716f009e 100644 --- a/src/Main/FileConv.cmake +++ b/src/Main/FileConv.cmake @@ -22,7 +22,9 @@ target_link_libraries(${FILECONV_EXECUTABLE} ${ROOT_LIBRARIES} ${NETCDF_LIBRARIES} # only for static link ${BACKWARD_LIBRARIES} - ${OMEGA_H_LIBRARIES}) + ${OMEGA_H_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for FileConv's main Charm++ module addCharmModule( "fileconv" "${FILECONV_EXECUTABLE}" ) diff --git a/src/Main/FileConv.cpp b/src/Main/FileConv.cpp index a07da4c6516..7aecd8c732f 100644 --- a/src/Main/FileConv.cpp +++ b/src/Main/FileConv.cpp @@ -89,10 +89,19 @@ class Main : public CBase_Main { m_timer(1), // Start new timer measuring the total runtime m_timestamp() { + delete msg; g_trace = m_cmdline.get< tag::trace >(); - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); } catch (...) { tk::processExceptionCharm(); } void execute() { diff --git a/src/Main/Inciter.cmake b/src/Main/Inciter.cmake index 8ba8241c005..6db82b88838 100644 --- a/src/Main/Inciter.cmake +++ b/src/Main/Inciter.cmake @@ -15,6 +15,7 @@ target_link_libraries(${INCITER_EXECUTABLE} TransportProblem CGTransportPhysics CompFlowProblem + MultiMatProblem CGCompFlowPhysics Integrate MeshRefinement @@ -46,7 +47,9 @@ target_link_libraries(${INCITER_EXECUTABLE} ${HDF5_C_LIBRARIES} ${AEC_LIBRARIES} # only for static link ${BACKWARD_LIBRARIES} - ${OMEGA_H_LIBRARIES}) + ${OMEGA_H_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for Inciter's main Charm++ module addCharmModule( "inciter" "${INCITER_EXECUTABLE}" ) diff --git a/src/Main/Inciter.cpp b/src/Main/Inciter.cpp index f201af40ed7..9990c735ded 100644 --- a/src/Main/Inciter.cpp +++ b/src/Main/Inciter.cpp @@ -194,12 +194,45 @@ class Main : public CBase_Main { m_timer(1), m_timestamp() { + delete msg; g_trace = m_cmdline.get< tag::trace >(); - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); } catch (...) { tk::processExceptionCharm(); } + //! Migrate constructor: returning from a checkpoint + explicit Main( CkMigrateMessage* msg ) : CBase_Main( msg ), + m_signal( tk::setSignalHandlers() ), + m_cmdline(), + m_cmdParser( reinterpret_cast(msg)->argc, + reinterpret_cast(msg)->argv, + tk::Print(), + m_cmdline ), + m_print( m_cmdline.get< tag::verbose >() ? std::cout : std::clog ), + m_driver( tk::Main< inciter::InciterDriver > + ( reinterpret_cast(msg)->argc, + reinterpret_cast(msg)->argv, + m_cmdline, + tk::HeaderType::INCITER, + tk::inciter_executable(), + m_print ) ), + m_timer(1), + m_timestamp() + { + g_trace = m_cmdline.get< tag::trace >(); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + } + //! Execute driver created and initialized by constructor void execute() { try { @@ -227,6 +260,21 @@ class Main : public CBase_Main { tk::dumpstate( m_cmdline, m_print, msg ); } + /** @name Charm++ pack/unpack serializer member functions */ + ///@{ + //! \brief Pack/Unpack serialize member function + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \note This is a Charm++ mainchare, pup() is thus only for + //! checkpoint/restart. + void pup( PUP::er &p ) override { + p | m_timer; + } + //! \brief Pack/Unpack serialize operator| + //! \param[in,out] p Charm++'s PUP::er serializer object reference + //! \param[in,out] m Mainchare object reference + friend void operator|( PUP::er& p, Main& m ) { m.pup(p); } + //@} + private: int m_signal; //!< Used to set signal handlers inciter::ctr::CmdLine m_cmdline; //!< Command line @@ -234,7 +282,6 @@ class Main : public CBase_Main { inciter::InciterPrint m_print; //!< Pretty printer inciter::InciterDriver m_driver; //!< Driver std::vector< tk::Timer > m_timer; //!< Timers - //! Time stamps in h:m:s with labels std::vector< std::pair< std::string, tk::Timer::Watch > > m_timestamp; }; @@ -244,7 +291,11 @@ class Main : public CBase_Main { //! has finished migrating all global-scoped read-only objects which happens //! after the main chare constructor has finished. class execute : public CBase_execute { - public: execute() { mainProxy.execute(); } + public: + //! Constructor + execute() { mainProxy.execute(); } + //! Migrate constructor + explicit execute( CkMigrateMessage* m ) : CBase_execute( m ) {} }; #include "NoWarning/inciter.def.h" diff --git a/src/Main/InciterDriver.cpp b/src/Main/InciterDriver.cpp index 9d218521b58..8097553b99e 100644 --- a/src/Main/InciterDriver.cpp +++ b/src/Main/InciterDriver.cpp @@ -23,6 +23,7 @@ namespace inciter { extern ctr::InputDeck g_inputdeck; +extern ctr::InputDeck g_inputdeck_defaults; } // inciter:: @@ -53,8 +54,17 @@ InciterDriver::InciterDriver( const InciterPrint& print, print.item( "Load-balancing frequency, -" + *kw::lbfreq::alias(), std::to_string(cmdline.get< tag::lbfreq >()) ); + auto rsfreq = cmdline.get< tag::rsfreq >(); + if ( rsfreq < kw::rsfreq::info::expect::lower || + rsfreq > kw::rsfreq::info::expect::upper ) { + Throw( "Checkpoint/restart frequency should be greater than 0." ); + } + print.item( "Checkpoint/restart frequency, -" + *kw::rsfreq::alias(), + std::to_string(cmdline.get< tag::rsfreq >()) ); + // Parse input deck into g_inputdeck - m_print.item( "Control file", cmdline.get< tag::io, tag::control >() ); + m_print.item( "Control file", cmdline.get< tag::io, tag::control >() ); + g_inputdeck = g_inputdeck_defaults; // overwrite with defaults if restarted InputDeckParser inputdeckParser( m_print, cmdline, g_inputdeck ); m_print.item( "Parsed control file", "success" ); m_print.endpart(); @@ -66,7 +76,6 @@ InciterDriver::execute() const // Run inciter // ***************************************************************************** { - // Instantiate Transporter chare on PE 0 which drives the time-integration of - // a PDE via several worker chares. + // Instantiate Transporter chare on PE 0 which drives time-integration CProxy_Transporter::ckNew( 0 ); } diff --git a/src/Main/InciterPrint.cpp b/src/Main/InciterPrint.cpp index e58fbfbde96..988873f4799 100644 --- a/src/Main/InciterPrint.cpp +++ b/src/Main/InciterPrint.cpp @@ -10,8 +10,7 @@ */ // ***************************************************************************** -#include "NoWarning/replace.hpp" -#include +#include #include "CGPDE.hpp" #include "InciterPrint.hpp" @@ -39,7 +38,7 @@ InciterPrint::inthead( const std::string& t, { section( t, name ); std::string l( legend ); - boost::replace_all( l, "\n", "\n" + m_item_indent ); + l = std::regex_replace( l, std::regex("\n"), "\n" + m_item_indent ); raw( m_item_indent + l + head ); } @@ -107,9 +106,9 @@ void InciterPrint::eqlegend() { section( "PDE factory legend, policy codes" ); - static_assert( tk::HasTypedefCode< kw::physics::info >::value, + static_assert( tk::HasTypedef_code_v< kw::physics::info >, "Policy code undefined for keyword" ); - static_assert( tk::HasTypedefCode< kw::problem::info >::value, + static_assert( tk::HasTypedef_code_v< kw::problem::info >, "Policy code undefined for keyword" ); raw( m_item_indent + kw::physics::name() + diff --git a/src/Main/Init.hpp b/src/Main/Init.hpp index c8a184fcf1e..94652df436b 100644 --- a/src/Main/Init.hpp +++ b/src/Main/Init.hpp @@ -93,51 +93,30 @@ Driver Main( int argc, char* argv[], } //! Generic Main Charm++ module constructor for all executables -//! \tparam ExecuteProxy Charm++ proxy type for the 'excecute' chare, see -//! src/Main/\.C //! \tparam MainProxy Main Charm++ chare proxy for the executable //! \tparam CmdLine Executable-specific tagged tuple storing the rusult of the //! command line parser -//! \param[in] msg Charm++ CkArgMsg pointer passed (by Charm++) to the main -//! chare proxy //! \param[in,out] mp MainProxy to set for the main chare //! \param[in] thisProxy 'thisProxy' to set as MainProxy -//! \param[in,out] state Chare state collector proxy //! \param[in,out] timer Vector of timers, held by the main chare, in which to //! start the first timer, measuring the migration of global-scope data //! \param[in] cmdline Command line grammar stack for the executable (assumed //! already parsed) //! \param[in] quiescenceTarget Pre-created Charm++ callback to use as the //! target function to call if quiescence is detected -template< class ExecuteProxy, class MainProxy, class CmdLine > -void MainCtor( CkArgMsg* msg, - MainProxy& mp, +template< class MainProxy, class CmdLine > +void MainCtor( MainProxy& mp, const MainProxy& thisProxy, - tk::CProxy_ChareStateCollector& state, std::vector< tk::Timer >& timer, const CmdLine& cmdline, const CkCallback& quiescenceTarget ) { - delete msg; - // Set Charm++ main proxy mp = thisProxy; - // If quiescence detection is on or user requested it, create chare state - // collector Charm++ chare group - if ( cmdline.template get< tag::chare >() || - cmdline.template get< tag::quiescence >() ) - state = tk::CProxy_ChareStateCollector::ckNew(); - // Optionally enable quiscence detection if (cmdline.template get< tag::quiescence >()) CkStartQD( quiescenceTarget ); - // Fire up an asynchronous execute object, which when created at some - // future point in time will call back to this->execute(). This is - // necessary so that this->execute() can access already migrated - // global-scope data. - ExecuteProxy::ckNew(); - // Start new timer measuring the migration of global-scope data timer.emplace_back(); } diff --git a/src/Main/LBSwitch.hpp b/src/Main/LBSwitch.hpp index 14c753ae1ae..64d9c2dc6b2 100644 --- a/src/Main/LBSwitch.hpp +++ b/src/Main/LBSwitch.hpp @@ -27,6 +27,16 @@ class LBSwitch : public CBase_LBSwitch { //! Constructor: turn on automatic load balancing explicit LBSwitch( bool verbose ); + #if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wundefined-func-template" + #endif + //! Migrate constructor + explicit LBSwitch( CkMigrateMessage* m ) : CBase_LBSwitch( m ) {} + #if defined(__clang__) + #pragma clang diagnostic pop + #endif + //! Turn off automatic load balancing static void off(); }; diff --git a/src/Main/MeshConv.cmake b/src/Main/MeshConv.cmake index 5102535b85d..015780c76d2 100644 --- a/src/Main/MeshConv.cmake +++ b/src/Main/MeshConv.cmake @@ -26,7 +26,9 @@ target_link_libraries(${MESHCONV_EXECUTABLE} ${HDF5_C_LIBRARIES} ${AEC_LIBRARIES} # only for static link ${BACKWARD_LIBRARIES} - ${OMEGA_H_LIBRARIES}) + ${OMEGA_H_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for MeshConv's main Charm++ module addCharmModule( "meshconv" "${MESHCONV_EXECUTABLE}" ) diff --git a/src/Main/MeshConv.cpp b/src/Main/MeshConv.cpp index 079c8212c06..0b955967b51 100644 --- a/src/Main/MeshConv.cpp +++ b/src/Main/MeshConv.cpp @@ -89,10 +89,19 @@ class Main : public CBase_Main { m_timer(1), // Start new timer measuring the total runtime m_timestamp() { + delete msg; g_trace = m_cmdline.get< tag::trace >(); - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); } catch (...) { tk::processExceptionCharm(); } void execute() { diff --git a/src/Main/QuinoaConfig.cpp.in b/src/Main/QuinoaConfig.cpp.in index 223a7ada7fd..2e4d2517a1b 100644 --- a/src/Main/QuinoaConfig.cpp.in +++ b/src/Main/QuinoaConfig.cpp.in @@ -27,6 +27,8 @@ namespace tk { #define FILECONV_EXECUTABLE "@FILECONV_EXECUTABLE@" #define QUINOA_VERSION "@MAJOR_VER@.@MINOR_VER@ (C@LACC@)" +#define COPYRIGHT "@COPYRIGHT@" +#define LICENSE "@LICENSE@" #define GIT_COMMIT "@GIT_SHA1@" #define MPI_COMPILER "@MPI_COMPILER@" #define COMPILER "@COMPILER@" @@ -46,6 +48,8 @@ std::string fileconv_executable() { return FILECONV_EXECUTABLE; } std::string quinoa_version() { return QUINOA_VERSION; } std::string git_commit() { return GIT_COMMIT; } +std::string copyright() { return COPYRIGHT; } +std::string license() { return LICENSE; } std::string mpi_compiler() { return MPI_COMPILER; } std::string compiler() { return COMPILER; } std::string build_hostname() { return BUILD_HOSTNAME; } diff --git a/src/Main/QuinoaConfig.hpp.in b/src/Main/QuinoaConfig.hpp.in index f523ac54bfb..0d86aa2144b 100644 --- a/src/Main/QuinoaConfig.hpp.in +++ b/src/Main/QuinoaConfig.hpp.in @@ -51,6 +51,9 @@ namespace tk { #cmakedefine01 BACKWARD_HAS_BFD #cmakedefine01 BACKWARD_HAS_DWARF +// Exceptions write to std::cerr +#cmakedefine EXCEPTIONS_WRITE_TO_CERR + // Accessor declarations as strings of configuration values imported from cmake std::string unittest_executable(); @@ -62,6 +65,8 @@ std::string fileconv_executable(); std::string quinoa_version(); std::string git_commit(); +std::string copyright(); +std::string license(); std::string mpi_compiler(); std::string compiler(); std::string build_hostname(); diff --git a/src/Main/RNGTest.cmake b/src/Main/RNGTest.cmake index d9d9e0c2322..9af9c7417a8 100644 --- a/src/Main/RNGTest.cmake +++ b/src/Main/RNGTest.cmake @@ -25,7 +25,9 @@ target_link_libraries(${RNGTEST_EXECUTABLE} ${MKL_INTERFACE_LIBRARY} ${MKL_SEQUENTIAL_LAYER_LIBRARY} ${RNGSSE2_LIBRARIES} - ${BACKWARD_LIBRARIES}) + ${BACKWARD_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for RNGTest's main Charm++ module addCharmModule( "rngtest" "${RNGTEST_EXECUTABLE}" ) diff --git a/src/Main/RNGTest.cpp b/src/Main/RNGTest.cpp index 6a81b8c4b50..5bc980b17d8 100644 --- a/src/Main/RNGTest.cpp +++ b/src/Main/RNGTest.cpp @@ -223,10 +223,19 @@ class Main : public CBase_Main { m_timer(1), // Start new timer measuring the total runtime m_timestamp() { + delete msg; g_trace = m_cmdline.get< tag::trace >(); - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); } catch (...) { tk::processExceptionCharm(); } void execute() { diff --git a/src/Main/UnitTest.cmake b/src/Main/UnitTest.cmake index aa2f5cb4fa3..a1742783b10 100644 --- a/src/Main/UnitTest.cmake +++ b/src/Main/UnitTest.cmake @@ -36,7 +36,6 @@ add_executable(${UNITTEST_EXECUTABLE} ../../tests/unit/${TestMKLBetaMethod} ../../tests/unit/${TestMKLGammaMethod} ../../tests/unit/Control/Options/TestRNG.cpp - ../../tests/unit/Control/TestControl.cpp ../../tests/unit/Control/TestFileParser.cpp ../../tests/unit/Control/TestStringParser.cpp ../../tests/unit/Control/TestSystemComponents.cpp @@ -67,6 +66,7 @@ target_include_directories(${UNITTEST_EXECUTABLE} PUBLIC ${QUINOA_SOURCE_DIR}/RNG ${TUT_INCLUDE_DIRS} ${LAPACKE_INCLUDE_DIRS} + ${RANDOM123_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/../UnitTest ${PROJECT_BINARY_DIR}/../IO) @@ -100,7 +100,9 @@ target_link_libraries(${UNITTEST_EXECUTABLE} ${HDF5_C_LIBRARIES} ${AEC_LIBRARIES} # only for static link ${BACKWARD_LIBRARIES} - ${OMEGA_H_LIBRARIES}) + ${OMEGA_H_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for UnitTest's main Charm++ module if(ENABLE_INCITER) diff --git a/src/Main/UnitTest.cpp b/src/Main/UnitTest.cpp index b29afab2167..a2df25445af 100644 --- a/src/Main/UnitTest.cpp +++ b/src/Main/UnitTest.cpp @@ -160,10 +160,19 @@ class Main : public CBase_Main { if (m_helped) CkExit(); // Save executable name to global-scope string so FileParser can access it unittest::g_executable = msg->argv[0]; + delete msg; // Call generic mainchare contructor - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); // Quiet std::cerr tk::CProxy_QuietCerr::ckNew(); } catch (...) { tk::processExceptionCharm(); } diff --git a/src/Main/Walker.cmake b/src/Main/Walker.cmake index 6e8ca2df5ee..51e19865357 100644 --- a/src/Main/Walker.cmake +++ b/src/Main/Walker.cmake @@ -38,7 +38,9 @@ target_link_libraries(${WALKER_EXECUTABLE} ${HDF5_HL_LIBRARIES} # only for static link ${HDF5_C_LIBRARIES} ${AEC_LIBRARIES} # only for static link - ${BACKWARD_LIBRARIES}) + ${BACKWARD_LIBRARIES} + ${LIBCXX_LIBRARIES} # only for static link with libc++ + ${LIBCXXABI_LIBRARIES}) # only for static link with libc++ # Add custom dependencies for Walker's main Charm++ module addCharmModule( "walker" "${WALKER_EXECUTABLE}" ) diff --git a/src/Main/Walker.cpp b/src/Main/Walker.cpp index 5149bf2a60d..45754dc5346 100644 --- a/src/Main/Walker.cpp +++ b/src/Main/Walker.cpp @@ -202,10 +202,19 @@ class Main : public CBase_Main { m_timer(1), // start new timer measuring the total runtime m_timestamp() { + delete msg; g_trace = m_cmdline.get< tag::trace >(); - tk::MainCtor< CProxy_execute > - ( msg, mainProxy, thisProxy, stateProxy, m_timer, m_cmdline, - CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + tk::MainCtor( mainProxy, thisProxy, m_timer, m_cmdline, + CkCallback( CkIndex_Main::quiescence(), thisProxy ) ); + // If quiescence detection is on or user requested it, create chare state + // collector Charm++ chare group + if ( m_cmdline.get< tag::chare >() || m_cmdline.get< tag::quiescence >() ) + stateProxy = tk::CProxy_ChareStateCollector::ckNew(); + // Fire up an asynchronous execute object, which when created at some + // future point in time will call back to this->execute(). This is + // necessary so that this->execute() can access already migrated + // global-scope data. + CProxy_execute::ckNew(); } catch (...) { tk::processExceptionCharm(); } //! Execute driver created and initialized by constructor diff --git a/src/Main/WalkerPrint.cpp b/src/Main/WalkerPrint.cpp index 5a5c00c7ea6..645222247c1 100644 --- a/src/Main/WalkerPrint.cpp +++ b/src/Main/WalkerPrint.cpp @@ -10,8 +10,7 @@ */ // ***************************************************************************** -#include "NoWarning/replace.hpp" -#include +#include #include "Exception.hpp" #include "Tags.hpp" @@ -46,7 +45,7 @@ WalkerPrint::inthead( const std::string& t, { section( t, name ); std::string l( legend ); - boost::replace_all( l, "\n", "\n" + m_item_indent ); + l = std::regex_replace( l, std::regex("\n"), "\n" + m_item_indent ); raw( m_item_indent + l + head ); } diff --git a/src/Main/WalkerPrint.hpp b/src/Main/WalkerPrint.hpp index dbc8223eb7f..209ada145c2 100644 --- a/src/Main/WalkerPrint.hpp +++ b/src/Main/WalkerPrint.hpp @@ -146,9 +146,9 @@ class WalkerPrint : public tk::RNGPrint { raw( m_item_indent + "Legend: equation name : supported policies\n" ); raw( '\n' ); raw( m_item_indent + "Policy codes:\n" ); - static_assert( tk::HasTypedefCode< kw::init::info >::value, + static_assert( tk::HasTypedef_code_v< kw::init::info >, "Policy code undefined for keyword" ); - static_assert( tk::HasTypedefCode< kw::coeff::info >::value, + static_assert( tk::HasTypedef_code_v< kw::coeff::info >, "Policy code undefined for keyword" ); raw( m_item_indent + " * " + *kw::init::code() + ": " + kw::init::name() + ":\n" ); diff --git a/src/Main/inciter.ci b/src/Main/inciter.ci index f78a227da00..eb97594e3e9 100644 --- a/src/Main/inciter.ci +++ b/src/Main/inciter.ci @@ -36,7 +36,7 @@ mainmodule inciter { } // inciter:: - mainchare Main { + mainchare [migratable] Main { entry Main( CkArgMsg* msg ); entry void execute(); entry void finalize(); @@ -44,6 +44,6 @@ mainmodule inciter { entry [reductiontarget] void dumpstate( CkReductionMsg* msg ); } - chare execute { entry execute(); } + chare [migratable] execute { entry execute(); } } diff --git a/src/Main/lbswitch.ci b/src/Main/lbswitch.ci index 18efd071020..ea7bd9af99f 100644 --- a/src/Main/lbswitch.ci +++ b/src/Main/lbswitch.ci @@ -14,7 +14,7 @@ module lbswitch { namespace tk { - group LBSwitch { + group [migratable] LBSwitch { entry LBSwitch( bool verbose ); initproc void off(); }; diff --git a/src/Mesh/CMakeLists.txt b/src/Mesh/CMakeLists.txt index 95161d7550f..4734bbb0e96 100644 --- a/src/Mesh/CMakeLists.txt +++ b/src/Mesh/CMakeLists.txt @@ -18,6 +18,7 @@ target_include_directories(Mesh PUBLIC ${PROJECT_BINARY_DIR}/../Main ${TPL_INCLUDE_DIR} ${PEGTL_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${BRIGAND_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS}) diff --git a/src/Mesh/DerivedData.cpp b/src/Mesh/DerivedData.cpp index ce7ccd21632..dcdc50f8942 100644 --- a/src/Mesh/DerivedData.cpp +++ b/src/Mesh/DerivedData.cpp @@ -310,7 +310,7 @@ genEdsup( const std::vector< std::size_t >& inpoel, std::vector< std::size_t > edsup1( 1, 0 ), edsup2( 1, 0 ); // sort non-center points of each star and store nodes and indices in vectors - for (auto p : star) { + for (auto& p : star) { std::sort( begin(p.second), end(p.second) ); edsup2.push_back( edsup2.back() + p.second.size() ); edsup1.insert( end(edsup1), begin(p.second), end(p.second) ); @@ -413,7 +413,7 @@ genInpoed( const std::vector< std::size_t >& inpoel, // sort non-center points of each star and store both start and end points of // each star in linear vector - for (auto p : star) { + for (auto& p : star) { std::sort( begin(p.second), end(p.second) ); for (auto e : p.second) { inpoed.push_back( p.first ); @@ -581,7 +581,7 @@ genEsuel( const std::vector< std::size_t >& inpoel, std::vector< std::size_t > esuel1( 1, 0 ), esuel2( 1, 0 ); // store elements surrounding elements in linked lists - for (auto e : es) { + for (const auto& e : es) { esuel2.push_back( esuel2.back() + e.second.size() ); esuel1.insert( end(esuel1), begin(e.second), end(e.second) ); } @@ -677,7 +677,7 @@ genInedel( const std::vector< std::size_t >& inpoel, // store index of star centers in vector; assume non-center points of each // star have already been sorted std::vector< std::size_t > edsup2( 1, 0 ); - for (auto p : star) edsup2.push_back( edsup2.back() + p.second.size() ); + for (const auto& p : star) edsup2.push_back(edsup2.back() + p.second.size()); // fill up index array with the last index for points with no new edges for (std::size_t i=0; i& inpoel, // store edge ids of elements in linear vector std::size_t j = 0; - for (auto e : edges) for (auto p : e.second) inedel[ j++ ] = p; + for (const auto& e : edges) for (auto p : e.second) inedel[ j++ ] = p; // Return (move out) vector return inedel; @@ -814,7 +814,7 @@ genEsued( const std::vector< std::size_t >& inpoel, std::vector< std::size_t > esued1( 1, 0 ), esued2( 1, 0 ); // sort and store elements surrounding edges and their indices in vectors - for (auto p : revolver) { + for (auto& p : revolver) { std::sort( begin(p.second), end(p.second) ); esued2.push_back( esued2.back() + p.second.size() ); esued1.insert( end(esued1), begin(p.second), end(p.second) ); diff --git a/src/Mesh/STLMesh.cpp b/src/Mesh/STLMesh.cpp index 4e91328e82a..7ba9332a7d9 100644 --- a/src/Mesh/STLMesh.cpp +++ b/src/Mesh/STLMesh.cpp @@ -10,7 +10,8 @@ */ // ***************************************************************************** -#include "Make_unique.hpp" +#include + #include "STLMesh.hpp" using tk::STLMesh; @@ -26,7 +27,7 @@ STLMesh::alloc( std::size_t num ) m_nnode = num; // Allocate memory to store the x, y, z coordinates - m_x = tk::make_unique< tk::real[] >( num ); - m_y = tk::make_unique< tk::real[] >( num ); - m_z = tk::make_unique< tk::real[] >( num ); + m_x = std::make_unique< tk::real[] >( num ); + m_y = std::make_unique< tk::real[] >( num ); + m_z = std::make_unique< tk::real[] >( num ); } diff --git a/src/Mesh/UnsMesh.hpp b/src/Mesh/UnsMesh.hpp index 03885970928..c590fe323a1 100644 --- a/src/Mesh/UnsMesh.hpp +++ b/src/Mesh/UnsMesh.hpp @@ -115,6 +115,9 @@ class UnsMesh { //! Unique set of faces using FaceSet = std::unordered_set< Face, Hash<3>, Eq<3> >; + //! Unique set of tets + using TetSet = std::unordered_set< Tet, Hash<4>, Eq<4> >; + /** @name Constructors */ ///@{ //! Constructor without initializing anything diff --git a/src/NoWarning/H5Part.hpp b/src/NoWarning/H5Part.hpp index e7c20ec526d..cf377fc088b 100644 --- a/src/NoWarning/H5Part.hpp +++ b/src/NoWarning/H5Part.hpp @@ -21,6 +21,7 @@ #pragma clang diagnostic ignored "-Wcast-align" #pragma clang diagnostic ignored "-Wextra-semi" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wundef" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wlong-long" diff --git a/src/NoWarning/TFile.hpp b/src/NoWarning/TFile.hpp index 26965c06765..638af49e332 100644 --- a/src/NoWarning/TFile.hpp +++ b/src/NoWarning/TFile.hpp @@ -22,6 +22,9 @@ #pragma clang diagnostic ignored "-Wdeprecated" #pragma clang diagnostic ignored "-Wundef" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" +#elif defined(STRICT_GNUC) + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wcast-qual" #elif defined(__INTEL_COMPILER) #pragma warning( push ) #pragma warning( disable: 522 ) @@ -32,6 +35,8 @@ #if defined(__clang__) #pragma clang diagnostic pop +#elif defined(STRICT_GNUC) + #pragma GCC diagnostic pop #elif defined(__INTEL_COMPILER) #pragma warning( pop ) #endif diff --git a/src/NoWarning/Zoltan2_PartitioningProblem.hpp b/src/NoWarning/Zoltan2_PartitioningProblem.hpp index ec5c8331545..4674779c4ce 100644 --- a/src/NoWarning/Zoltan2_PartitioningProblem.hpp +++ b/src/NoWarning/Zoltan2_PartitioningProblem.hpp @@ -45,6 +45,9 @@ #pragma clang diagnostic ignored "-Wused-but-marked-unused" #pragma clang diagnostic ignored "-Wshadow" #pragma clang diagnostic ignored "-Wmissing-noreturn" + #pragma clang diagnostic ignored "-Winconsistent-missing-destructor-override" + #pragma clang diagnostic ignored "-Wimplicit-fallthrough" + #pragma clang diagnostic ignored "-Wreturn-type-c-linkage" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" @@ -52,6 +55,9 @@ #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wunused-but-set-parameter" #pragma GCC diagnostic ignored "-Wswitch-default" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" + #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" #pragma GCC diagnostic ignored "-Wunused-local-typedefs" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wshadow" diff --git a/src/NoWarning/remove.hpp b/src/NoWarning/any.hpp similarity index 73% rename from src/NoWarning/remove.hpp rename to src/NoWarning/any.hpp index d57b93c36fa..20de3659592 100644 --- a/src/NoWarning/remove.hpp +++ b/src/NoWarning/any.hpp @@ -1,29 +1,29 @@ // ***************************************************************************** /*! - \file src/NoWarning/remove.hpp + \file src/NoWarning/any.hpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Include brigand/algorithms/remove.hpp with turning off specific + \brief Include brigand/algorithms/any.hpp with turning off specific compiler warnings */ // ***************************************************************************** -#ifndef nowarning_remove_h -#define nowarning_remove_h +#ifndef nowarning_any_h +#define nowarning_any_h #include "Macro.hpp" #if defined(__clang__) #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #pragma clang diagnostic ignored "-Wundef" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #endif -#include +#include #if defined(__clang__) #pragma clang diagnostic pop #endif -#endif // nowarning_remove_h +#endif // nowarning_any_h diff --git a/src/NoWarning/charestatecollector.decl.h b/src/NoWarning/charestatecollector.decl.h index c984e0718ff..9a72acc3d6b 100644 --- a/src/NoWarning/charestatecollector.decl.h +++ b/src/NoWarning/charestatecollector.decl.h @@ -19,6 +19,7 @@ #pragma clang diagnostic ignored "-Wunused-private-field" #pragma clang diagnostic ignored "-Wunused-parameter" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wzero-length-array" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wsign-conversion" #pragma clang diagnostic ignored "-Wold-style-cast" @@ -50,6 +51,7 @@ #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wredundant-decls" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/src/NoWarning/charm++.hpp b/src/NoWarning/charm++.hpp index a5d50a96688..965db390dd4 100644 --- a/src/NoWarning/charm++.hpp +++ b/src/NoWarning/charm++.hpp @@ -50,6 +50,7 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wfloat-equal" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wpedantic" #pragma GCC diagnostic ignored "-Wshadow" diff --git a/src/NoWarning/dg.def.h b/src/NoWarning/dg.def.h index 291bad5c053..245cf2b1d7e 100644 --- a/src/NoWarning/dg.def.h +++ b/src/NoWarning/dg.def.h @@ -29,6 +29,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wunused-variable" + #pragma GCC diagnostic ignored "-Wunused-parameter" #endif #include "../Inciter/dg.def.h" diff --git a/src/NoWarning/discretization.def.h b/src/NoWarning/discretization.def.h index 63a6b2d942e..34d66f2f1c3 100644 --- a/src/NoWarning/discretization.def.h +++ b/src/NoWarning/discretization.def.h @@ -18,6 +18,7 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wextra-semi" #pragma clang diagnostic ignored "-Wold-style-cast" + #pragma clang diagnostic ignored "-Wextra-semi-stmt" #pragma clang diagnostic ignored "-Wsign-conversion" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wunused-variable" diff --git a/src/NoWarning/distributor.decl.h b/src/NoWarning/distributor.decl.h index 45b33efcdc2..2b536533bec 100644 --- a/src/NoWarning/distributor.decl.h +++ b/src/NoWarning/distributor.decl.h @@ -50,6 +50,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wredundant-decls" diff --git a/src/NoWarning/exodusII.hpp b/src/NoWarning/exodusII.hpp index e3f77a8225a..b96f258e5e9 100644 --- a/src/NoWarning/exodusII.hpp +++ b/src/NoWarning/exodusII.hpp @@ -21,6 +21,7 @@ #pragma clang diagnostic ignored "-Wcast-align" #pragma clang diagnostic ignored "-Wdocumentation-deprecated-sync" #pragma clang diagnostic ignored "-Wextra-semi" + #pragma clang diagnostic ignored "-Wundef" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push diff --git a/src/NoWarning/fileconv.decl.h b/src/NoWarning/fileconv.decl.h index 4e976db19a3..57d2848e64a 100644 --- a/src/NoWarning/fileconv.decl.h +++ b/src/NoWarning/fileconv.decl.h @@ -48,6 +48,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wunused-parameter" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wpedantic" #pragma GCC diagnostic ignored "-Wshadow" diff --git a/src/NoWarning/flatten.hpp b/src/NoWarning/flatten.hpp new file mode 100644 index 00000000000..cc5aa29fc3d --- /dev/null +++ b/src/NoWarning/flatten.hpp @@ -0,0 +1,29 @@ +// ***************************************************************************** +/*! + \file src/NoWarning/flatten.hpp + \copyright 2016-2018, Los Alamos National Security, LLC. + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Include brigand/algorithms/flatten.hpp with turning off specific + compiler warnings +*/ +// ***************************************************************************** +#ifndef nowarning_flatten_h +#define nowarning_flatten_h + +#include "Macro.hpp" + +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +#include + +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +#endif // nowarning_flatten_h diff --git a/src/NoWarning/format.hpp b/src/NoWarning/format.hpp index 6d790ae215a..c6420eb7deb 100644 --- a/src/NoWarning/format.hpp +++ b/src/NoWarning/format.hpp @@ -24,9 +24,11 @@ #pragma clang diagnostic ignored "-Wcomma" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #pragma clang diagnostic ignored "-Wredundant-parens" + #pragma clang diagnostic ignored "-Wcast-qual" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #elif defined(__INTEL_COMPILER) diff --git a/src/NoWarning/inciter.def.h b/src/NoWarning/inciter.def.h index e34ae22e9c8..bde18d5633f 100644 --- a/src/NoWarning/inciter.def.h +++ b/src/NoWarning/inciter.def.h @@ -23,6 +23,8 @@ #pragma clang diagnostic ignored "-Wunused-parameter" #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wimplicit-int-conversion" + #pragma clang diagnostic ignored "-Wundef" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/src/NoWarning/index_of.hpp b/src/NoWarning/index_of.hpp new file mode 100644 index 00000000000..257944800c7 --- /dev/null +++ b/src/NoWarning/index_of.hpp @@ -0,0 +1,28 @@ +// ***************************************************************************** +/*! + \file src/NoWarning/index_of.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Include brigand/algorithms/index_of.hpp with turning off + specific compiler warnings +*/ +// ***************************************************************************** +#ifndef nowarning_index_of_h +#define nowarning_index_of_h + +#include "Macro.hpp" + +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +#include + +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +#endif // nowarning_index_of_h diff --git a/src/NoWarning/integrator.decl.h b/src/NoWarning/integrator.decl.h index a69a9580194..2c59f95c1a8 100644 --- a/src/NoWarning/integrator.decl.h +++ b/src/NoWarning/integrator.decl.h @@ -55,6 +55,7 @@ #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wswitch-default" diff --git a/src/NoWarning/lbswitch.decl.h b/src/NoWarning/lbswitch.decl.h index 6a955c3551c..c767ec1fb88 100644 --- a/src/NoWarning/lbswitch.decl.h +++ b/src/NoWarning/lbswitch.decl.h @@ -19,6 +19,7 @@ #pragma clang diagnostic ignored "-Wunused-private-field" #pragma clang diagnostic ignored "-Wunused-parameter" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wzero-length-array" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wconversion" #pragma clang diagnostic ignored "-Wsign-conversion" @@ -51,6 +52,7 @@ #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wredundant-decls" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wunused-parameter" diff --git a/src/NoWarning/linearmap.decl.h b/src/NoWarning/linearmap.decl.h index 6194ae24a68..3fa4951e035 100644 --- a/src/NoWarning/linearmap.decl.h +++ b/src/NoWarning/linearmap.decl.h @@ -51,6 +51,7 @@ #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wfloat-equal" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wpedantic" #pragma GCC diagnostic ignored "-Wshadow" diff --git a/src/NoWarning/meshconv.decl.h b/src/NoWarning/meshconv.decl.h index 8fe7247325f..5d0825db632 100644 --- a/src/NoWarning/meshconv.decl.h +++ b/src/NoWarning/meshconv.decl.h @@ -52,6 +52,7 @@ #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wpedantic" #pragma GCC diagnostic ignored "-Wshadow" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wswitch-default" diff --git a/src/NoWarning/meshwriter.decl.h b/src/NoWarning/meshwriter.decl.h index 32ce8726cac..f8cbbe446d9 100644 --- a/src/NoWarning/meshwriter.decl.h +++ b/src/NoWarning/meshwriter.decl.h @@ -42,11 +42,13 @@ #pragma clang diagnostic ignored "-Woverloaded-virtual" #pragma clang diagnostic ignored "-Wcast-qual" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wzero-length-array" #pragma clang diagnostic ignored "-Wshadow-field" #pragma clang diagnostic ignored "-Wmissing-noreturn" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wshadow" diff --git a/src/NoWarning/mpi.hpp b/src/NoWarning/mpi.hpp index ba00945d9ad..9c6a8d3e8c7 100644 --- a/src/NoWarning/mpi.hpp +++ b/src/NoWarning/mpi.hpp @@ -20,6 +20,7 @@ #pragma clang diagnostic ignored "-Wdeprecated" #pragma clang diagnostic ignored "-Wcast-align" #pragma clang diagnostic ignored "-Wextra-semi" + #pragma clang diagnostic ignored "-Wundef" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push diff --git a/src/NoWarning/mpirunner.decl.h b/src/NoWarning/mpirunner.decl.h index fc3b42ef9e8..329ba9d5bc0 100644 --- a/src/NoWarning/mpirunner.decl.h +++ b/src/NoWarning/mpirunner.decl.h @@ -39,6 +39,7 @@ #pragma clang diagnostic ignored "-Wundefined-func-template" #pragma clang diagnostic ignored "-Woverloaded-virtual" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wzero-length-array" #pragma clang diagnostic ignored "-Wcast-qual" #pragma clang diagnostic ignored "-Wshadow-field-in-constructor" #pragma clang diagnostic ignored "-Wshadow-field" @@ -49,6 +50,7 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wfloat-equal" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wstrict-aliasing" diff --git a/src/NoWarning/optional.hpp b/src/NoWarning/optional.hpp deleted file mode 100644 index 5f58b614dd8..00000000000 --- a/src/NoWarning/optional.hpp +++ /dev/null @@ -1,40 +0,0 @@ -// ***************************************************************************** -/*! - \file src/NoWarning/optional.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Include boost/optional.hpp with turning off specific - compiler warnings -*/ -// ***************************************************************************** -#ifndef nowarning_optional_h -#define nowarning_optional_h - -#include "Macro.hpp" - -#if defined(__clang__) - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wundef" - #pragma clang diagnostic ignored "-Wredundant-parens" - #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" -#elif defined(__INTEL_COMPILER) - #pragma warning( push ) - #pragma warning( disable: 367 ) -#endif - -#include - -#if defined(__clang__) - #pragma clang diagnostic pop -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic pop -#elif defined(__INTEL_COMPILER) - #pragma warning( pop ) -#endif - -#endif // nowarning_optional_h diff --git a/src/NoWarning/partition.hpp b/src/NoWarning/partition.hpp new file mode 100644 index 00000000000..b16c5479f59 --- /dev/null +++ b/src/NoWarning/partition.hpp @@ -0,0 +1,29 @@ +// ***************************************************************************** +/*! + \file src/NoWarning/partition.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Include brigand/algorithms/partition.hpp with turning off + specific compiler warnings +*/ +// ***************************************************************************** +#ifndef nowarning_partition_h +#define nowarning_partition_h + +#include "Macro.hpp" + +#if defined(__clang__) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wundef" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" +#endif + +#include + +#if defined(__clang__) + #pragma clang diagnostic pop +#endif + +#endif // nowarning_partition_h diff --git a/src/NoWarning/pstream.hpp b/src/NoWarning/pstream.hpp index 60c73f8f4a8..cfd73ce812b 100644 --- a/src/NoWarning/pstream.hpp +++ b/src/NoWarning/pstream.hpp @@ -23,6 +23,7 @@ #pragma clang diagnostic ignored "-Wabstract-vbase-init" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wconversion" + #pragma clang diagnostic ignored "-Wshadow" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push diff --git a/src/NoWarning/quietcerr.decl.h b/src/NoWarning/quietcerr.decl.h index fc1444b664b..8ad16a625ab 100644 --- a/src/NoWarning/quietcerr.decl.h +++ b/src/NoWarning/quietcerr.decl.h @@ -20,6 +20,7 @@ #pragma clang diagnostic ignored "-Wunused-parameter" #pragma clang diagnostic ignored "-Wunused-variable" #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" + #pragma clang diagnostic ignored "-Wzero-length-array" #pragma clang diagnostic ignored "-Wshorten-64-to-32" #pragma clang diagnostic ignored "-Wsign-conversion" #pragma clang diagnostic ignored "-Wimplicit-int-conversion" @@ -54,6 +55,7 @@ #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wextra" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wfloat-equal" diff --git a/src/NoWarning/replace.hpp b/src/NoWarning/replace.hpp deleted file mode 100644 index fea6e96aa57..00000000000 --- a/src/NoWarning/replace.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// ***************************************************************************** -/*! - \file src/NoWarning/replace.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Include boost/algorithm/string/replace.hpp with turning off - specific compiler warnings -*/ -// ***************************************************************************** -#ifndef nowarning_replace_h -#define nowarning_replace_h - -#include "Macro.hpp" - -#if defined(__clang__) - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wold-style-cast" - #pragma clang diagnostic ignored "-Wdocumentation" - #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" - #pragma clang diagnostic ignored "-Wundef" -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" - #pragma GCC diagnostic ignored "-Wparentheses" -#endif - -#include - -#if defined(__clang__) - #pragma clang diagnostic pop -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic pop -#endif - -#endif // nowarning_replace_h diff --git a/src/NoWarning/transform.hpp b/src/NoWarning/transform.hpp index bb2945ed306..7db42ab14cf 100644 --- a/src/NoWarning/transform.hpp +++ b/src/NoWarning/transform.hpp @@ -17,6 +17,7 @@ #if defined(__clang__) #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wundef" + #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" #endif #include diff --git a/src/NoWarning/transporter.decl.h b/src/NoWarning/transporter.decl.h index 285e73b9526..ae87e135c5c 100644 --- a/src/NoWarning/transporter.decl.h +++ b/src/NoWarning/transporter.decl.h @@ -57,6 +57,7 @@ #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wswitch-default" #pragma GCC diagnostic ignored "-Wdeprecated-declarations" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wextra" #pragma GCC diagnostic ignored "-Wstrict-aliasing" #pragma GCC diagnostic ignored "-Wparentheses" diff --git a/src/NoWarning/tutsuite.decl.h b/src/NoWarning/tutsuite.decl.h index f6ca1145b4e..0d586fc0c5a 100644 --- a/src/NoWarning/tutsuite.decl.h +++ b/src/NoWarning/tutsuite.decl.h @@ -52,6 +52,7 @@ #pragma GCC diagnostic ignored "-Wcast-qual" #pragma GCC diagnostic ignored "-Wunused-parameter" #pragma GCC diagnostic ignored "-Wfloat-equal" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wpedantic" diff --git a/src/NoWarning/tuttest.decl.h b/src/NoWarning/tuttest.decl.h index bdcda7d1419..aceba718e2a 100644 --- a/src/NoWarning/tuttest.decl.h +++ b/src/NoWarning/tuttest.decl.h @@ -54,6 +54,7 @@ #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wpedantic" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wswitch-default" #pragma GCC diagnostic ignored "-Wextra" diff --git a/src/NoWarning/unsmeshmap.decl.h b/src/NoWarning/unsmeshmap.decl.h index 5f470431141..e33a940172c 100644 --- a/src/NoWarning/unsmeshmap.decl.h +++ b/src/NoWarning/unsmeshmap.decl.h @@ -54,6 +54,7 @@ #pragma GCC diagnostic ignored "-Wfloat-equal" #pragma GCC diagnostic ignored "-Wnon-virtual-dtor" #pragma GCC diagnostic ignored "-Wpedantic" + #pragma GCC diagnostic ignored "-Wdeprecated-copy" #pragma GCC diagnostic ignored "-Wshadow" #pragma GCC diagnostic ignored "-Wredundant-decls" #pragma GCC diagnostic ignored "-Wswitch-default" diff --git a/src/NoWarning/variant.hpp b/src/NoWarning/variant.hpp deleted file mode 100644 index d63ba251a07..00000000000 --- a/src/NoWarning/variant.hpp +++ /dev/null @@ -1,42 +0,0 @@ -// ***************************************************************************** -/*! - \file src/NoWarning/variant.hpp - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Include boost/variant.hpp with turning off specific compiler - warnings -*/ -// ***************************************************************************** -#ifndef nowarning_variant_h -#define nowarning_variant_h - -#include "Macro.hpp" - -#if defined(__clang__) - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" - #pragma clang diagnostic ignored "-Wold-style-cast" - #pragma clang diagnostic ignored "-Wundef" - #pragma clang diagnostic ignored "-Wundefined-func-template" - #pragma clang diagnostic ignored "-Wmissing-noreturn" - #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" - #pragma clang diagnostic ignored "-Wredundant-parens" -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" - #pragma GCC diagnostic ignored "-Wstrict-aliasing" - #pragma GCC diagnostic ignored "-Wparentheses" -#endif - -#undef I -#include - -#if defined(__clang__) - #pragma clang diagnostic pop -#elif defined(STRICT_GNUC) - #pragma GCC diagnostic pop -#endif - -#endif // nowarning_variant_h diff --git a/src/NoWarning/walker.def.h b/src/NoWarning/walker.def.h index 9928f7576b7..d1cf56d5416 100644 --- a/src/NoWarning/walker.def.h +++ b/src/NoWarning/walker.def.h @@ -25,6 +25,8 @@ #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" #pragma clang diagnostic ignored "-Wcast-qual" #pragma clang diagnostic ignored "-Wmissing-noreturn" + #pragma clang diagnostic ignored "-Wimplicit-int-conversion" + #pragma clang diagnostic ignored "-Wundef" #elif defined(STRICT_GNUC) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wcast-qual" diff --git a/src/PDE/CGPDE.hpp b/src/PDE/CGPDE.hpp index b806e38458b..15082933059 100644 --- a/src/PDE/CGPDE.hpp +++ b/src/PDE/CGPDE.hpp @@ -23,11 +23,11 @@ #include #include #include +#include #include #include #include "Types.hpp" -#include "Make_unique.hpp" #include "Fields.hpp" namespace inciter { @@ -46,12 +46,15 @@ class CGPDE { using ncomp_t = kw::ncomp::info::expect::type; public: - //! \brief Constructor taking an object modeling Concept. + //! Default constructor taking no arguments for Charm++ + explicit CGPDE() = default; + + //! Constructor taking an object modeling Concept. //! \details The object of class T comes pre-constructed. //! \param[in] x Instantiated object of type T given by the template //! argument. template< typename T > explicit CGPDE( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ) {} + self( std::make_unique< Model >( std::move(x) ) ) {} //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept. @@ -73,7 +76,7 @@ class CGPDE { //! \param[in] args Zero or more constructor arguments template< typename T, typename...Args > explicit CGPDE( std::function x, Args&&... args ) : - self( tk::make_unique< Model >( + self( std::make_unique< Model >( std::move( x( std::forward(args)... ) ) ) ) {} //! Public interface to setting the initial conditions for the diff eq diff --git a/src/PDE/CMakeLists.txt b/src/PDE/CMakeLists.txt index c40900c4a4f..e52f6b24592 100644 --- a/src/PDE/CMakeLists.txt +++ b/src/PDE/CMakeLists.txt @@ -5,6 +5,7 @@ project(PDE CXX) add_library(PDE PDEStack.cpp Limiter.cpp + Reconstruction.cpp ConfigureTransport.cpp ConfigureCompFlow.cpp ConfigureMultiMat.cpp) @@ -18,6 +19,7 @@ target_include_directories(PDE PUBLIC ${QUINOA_SOURCE_DIR}/PDE ${BRIGAND_INCLUDE_DIRS} ${PEGTL_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/../Main) @@ -36,3 +38,4 @@ add_subdirectory(Transport/Physics) add_subdirectory(Transport/Problem) add_subdirectory(CompFlow/Physics) add_subdirectory(CompFlow/Problem) +add_subdirectory(MultiMat/Problem) diff --git a/src/PDE/CompFlow/CGCompFlow.hpp b/src/PDE/CompFlow/CGCompFlow.hpp index 9ca559794de..70c157b6542 100644 --- a/src/PDE/CompFlow/CGCompFlow.hpp +++ b/src/PDE/CompFlow/CGCompFlow.hpp @@ -21,6 +21,7 @@ #include "Macro.hpp" #include "Exception.hpp" #include "Vector.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -205,9 +206,6 @@ class CompFlow { const auto& y = coord[1]; const auto& z = coord[2]; - // ratio of specific heats - auto g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0]; - // 1st stage: update element values from node values (gather-add) for (std::size_t e=0; e p; for (std::size_t a=0; a<4; ++a) - p[a] = (g-1.0)*(u[4][a] - (u[1][a]*u[1][a] + - u[2][a]*u[2][a] + - u[3][a]*u[3][a])/2.0/u[0][a]); + p[a] = eos_pressure< tag::compflow > + ( m_system, u[0][a], u[1][a]/u[0][a], u[2][a]/u[0][a], + u[3][a]/u[0][a], u[4][a] ); // sum nodal averages to element for (ncomp_t c=0; c<5; ++c) { @@ -313,8 +311,9 @@ class CompFlow { for (ncomp_t c=0; c<5; ++c) r[c] = R.cptr( c, m_offset ); // pressure - auto p = (g-1.0)*(ue[4] - - (ue[1]*ue[1] + ue[2]*ue[2] + ue[3]*ue[3])/2.0/ue[0]); + auto p = eos_pressure< tag::compflow > + ( m_system, ue[0], ue[1]/ue[0], ue[2]/ue[0], ue[3]/ue[0], + ue[4] ); // scatter-add flux contributions to rhs at nodes tk::real d = deltat * J/6.0; @@ -362,7 +361,7 @@ class CompFlow { const auto& y = coord[1]; const auto& z = coord[2]; // ratio of specific heats - auto g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0]; + auto g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0][0]; // compute the minimum dt across all elements we own tk::real mindt = std::numeric_limits< tk::real >::max(); for (std::size_t e=0; e + ( m_system, r, ru/r, rv/r, rw/r, re ); if (p < 0) p = 0.0; - auto c = std::sqrt(g*p/r); // sound speed + auto c = eos_soundspeed< tag::compflow >( m_system, r, p ); auto v = std::sqrt((ru*ru + rv*rv + rw*rw)/r/r) + c; // char. velocity if (v > maxvel) maxvel = v; } @@ -406,7 +406,7 @@ class CompFlow { return mindt; } - //! Extract the velocity field at cell nodes + //! Extract the velocity field at cell nodes. Currently unused. //! \param[in] U Solution vector at recent time step //! \param[in] N Element node indices //! \return Array of the four values of the velocity field @@ -465,7 +465,8 @@ class CompFlow { if (std::stoi(b) == ss.first) for (auto n : ss.second) { Assert( x.size() > n, "Indexing out of coordinate array" ); - auto s = m_problem.solinc( 0, x[n], y[n], z[n], t, deltat ); + auto s = m_problem.solinc( m_system, m_ncomp, x[n], y[n], z[n], + t, deltat ); bc[n] = {{ {true,s[0]}, {true,s[1]}, {true,s[2]}, {true,s[3]}, {true,s[4]} }}; } diff --git a/src/PDE/CompFlow/DGCompFlow.hpp b/src/PDE/CompFlow/DGCompFlow.hpp index 2ad31feef77..562bfccbac2 100644 --- a/src/PDE/CompFlow/DGCompFlow.hpp +++ b/src/PDE/CompFlow/DGCompFlow.hpp @@ -35,6 +35,9 @@ #include "Integrate/Volume.hpp" #include "Integrate/Source.hpp" #include "Integrate/Riemann/RiemannFactory.hpp" +#include "EoS/EoS.hpp" +#include "Reconstruction.hpp" +#include "Limiter.hpp" namespace inciter { @@ -91,6 +94,15 @@ class CompFlow { // "Boundary conditions not set in control file for DG CompFlow" ); {} + //! Find the number of primitive quantities required for this PDE system + //! \return The number of primitive quantities required to be stored for + //! this PDE system + std::size_t nprim() const + { + // compflow does not need/store any primitive quantities currently + return 0; + } + //! Initalize the compressible flow equations, prepare for time integration //! \param[in] L Block diagonal mass matrix //! \param[in] inpoel Element-node connectivity @@ -116,6 +128,103 @@ class CompFlow { tk::mass( m_ncomp, m_offset, geoElem, l ); } + //! Update the primitives for this PDE system + //! \details This function computes and stores the dofs for primitive + //! quantities, which is currently unused for compflow. But if a limiter + //! requires primitive variables for example, this would be the place to + //! add the computation of the primitive variables. + void updatePrimitives( const tk::Fields&, + tk::Fields&, + std::size_t ) const {} + + //! Reconstruct second-order solution from first-order using least-squares + //! \param[in] t Physical time + //! \param[in] geoFace Face geometry array + //! \param[in] geoElem Element geometry array + //! \param[in] fd Face connectivity and boundary conditions object + //! \param[in] inpoel Element-node connectivity + //! \param[in] coord Array of nodal coordinates + //! \param[in,out] U Solution vector at recent time step + void reconstruct( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + tk::Fields& U, + tk::Fields& ) const + { + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + + Assert( U.nprop() == rdof*5, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*5) ); + Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " + "size" ); + Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, + "Mismatch in inpofa size" ); + + // supported boundary condition types and associated state functions + std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > + bctypes{{ + { m_bcdir, Dirichlet }, + { m_bcsym, Symmetry }, + { m_bcextrapolate, Extrapolate } }}; + + // allocate and initialize matrix and vector for reconstruction + std::vector< std::array< std::array< tk::real, 3 >, 3 > > + lhs_ls( U.nunk(), {{ {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}} }} ); + std::vector< std::vector< std::array< tk::real, 3 > > > + rhs_ls( U.nunk(), std::vector< std::array< tk::real, 3 > > + ( m_ncomp, + {{ 0.0, 0.0, 0.0 }} ) ); + + // reconstruct x,y,z-derivatives of unknowns + tk::intLeastSq_P0P1( m_ncomp, m_offset, rdof, fd, geoElem, U, + lhs_ls, rhs_ls ); + + // compute boundary surface flux integrals + for (const auto& b : bctypes) + tk::bndLeastSq_P0P1( m_system, m_ncomp, m_offset, rdof, b.first, + fd, geoFace, geoElem, t, b.second, U, lhs_ls, + rhs_ls ); + + // solve 3x3 least-squares system + tk::solveLeastSq_P0P1( m_ncomp, m_offset, rdof, lhs_ls, rhs_ls, U ); + + // transform reconstructed derivatives to Dubiner dofs + tk::transform_P0P1( m_ncomp, m_offset, rdof, fd.Esuel().size()/4, + inpoel, coord, U ); + } + + //! Limit second-order solution + //! \param[in] t Physical time + //! \param[in] geoFace Face geometry array + //! \param[in] geoElem Element geometry array + //! \param[in] fd Face connectivity and boundary conditions object + //! \param[in] inpoel Element-node connectivity + //! \param[in] coord Array of nodal coordinates + //! \param[in] ndofel Vector of local number of degrees of freedome + //! \param[in,out] U Solution vector at recent time step + void limit( [[maybe_unused]] tk::real t, + [[maybe_unused]] const tk::Fields& geoFace, + [[maybe_unused]] const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + const std::vector< std::size_t >& ndofel, + tk::Fields& U, + tk::Fields& ) const + { + const auto limiter = g_inputdeck.get< tag::discr, tag::limiter >(); + + if (limiter == ctr::LimiterType::WENOP1) + WENO_P1( fd.Esuel(), m_offset, U ); + else if (limiter == ctr::LimiterType::SUPERBEEP1) + Superbee_P1( fd.Esuel(), inpoel, ndofel, m_offset, coord, U ); + } + //! Compute right hand side //! \param[in] t Physical time //! \param[in] geoFace Face geometry array @@ -124,6 +233,7 @@ class CompFlow { //! \param[in] inpoel Element-node connectivity //! \param[in] coord Array of nodal coordinates //! \param[in] U Solution vector at recent time step + //! \param[in] P Primitive vector at recent time step //! \param[in] ndofel Vector of local number of degrees of freedom //! \param[in,out] R Right-hand side vector computed void rhs( tk::real t, @@ -133,16 +243,23 @@ class CompFlow { const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, const tk::Fields& U, + const tk::Fields& P, const std::vector< std::size_t >& ndofel, tk::Fields& R ) const { const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + Assert( U.nunk() == P.nunk(), "Number of unknowns in solution " + "vector and primitive vector at recent time step incorrect" ); Assert( U.nunk() == R.nunk(), "Number of unknowns in solution " "vector and right-hand side at recent time step incorrect" ); - Assert( U.nprop() == ndof*5 && R.nprop() == ndof*5, - "Number of components in solution and right-hand side vector " - "must equal "+ std::to_string(ndof*5) ); + Assert( U.nprop() == rdof*5, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*5) ); + Assert( P.nprop() == 0, "Number of components in primitive " + "vector must equal "+ std::to_string(0) ); + Assert( R.nprop() == ndof*5, "Number of components in right-hand " + "side vector must equal "+ std::to_string(ndof*5) ); Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " "size" ); Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, @@ -151,6 +268,11 @@ class CompFlow { // set rhs to zero R.fill(0.0); + // empty vector for non-conservative terms. This vector is unused for + // single-material hydrodynamics since, there are no non-conservative + // terms in the system of PDEs. + std::vector< std::vector < tk::real > > riemannDeriv; + // configure Riemann flux function auto rieflxfn = [this]( const std::array< tk::real, 3 >& fn, @@ -159,7 +281,7 @@ class CompFlow { { return m_riemann.flux( fn, u, v ); }; // configure a no-op lambda for prescribed velocity auto velfn = [this]( ncomp_t, ncomp_t, tk::real, tk::real, tk::real ){ - return std::vector< std::array< tk::real, 3 > >( this->m_ncomp ); }; + return std::vector< std::array< tk::real, 3 > >( m_ncomp ); }; // supported boundary condition types and associated state functions std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > bctypes{{ @@ -168,8 +290,8 @@ class CompFlow { { m_bcextrapolate, Extrapolate } }}; // compute internal surface flux integrals - tk::surfInt( m_system, m_ncomp, m_offset, ndof, inpoel, coord, fd, - geoFace, rieflxfn, velfn, U, ndofel, R ); + tk::surfInt( m_system, m_ncomp, 1, m_offset, ndof, rdof, inpoel, coord, + fd, geoFace, rieflxfn, velfn, U, P, ndofel, R, riemannDeriv ); // compute source term intehrals tk::srcInt( m_system, m_ncomp, m_offset, t, ndof, inpoel, coord, geoElem, @@ -182,9 +304,9 @@ class CompFlow { // compute boundary surface flux integrals for (const auto& b : bctypes) - tk::bndSurfInt( m_system, m_ncomp, m_offset, ndof, b.first, fd, geoFace, - inpoel, coord, t, rieflxfn, velfn, b.second, U, - ndofel, R ); + tk::bndSurfInt( m_system, m_ncomp, 1, m_offset, ndof, rdof, b.first, fd, + geoFace, inpoel, coord, t, rieflxfn, velfn, b.second, U, + P, ndofel, R, riemannDeriv ); } //! Compute the minimum time step size @@ -193,6 +315,7 @@ class CompFlow { //! \param[in] fd Face connectivity and boundary conditions object //! \param[in] geoFace Face geometry array //! \param[in] geoElem Element geometry array + //! \param[in] ndofel Vector of local number of degrees of freedom //! \param[in] U Solution vector at recent time step //! \return Minimum time step size tk::real dt( const std::array< std::vector< tk::real >, 3 >& coord, @@ -200,25 +323,14 @@ class CompFlow { const inciter::FaceData& fd, const tk::Fields& geoFace, const tk::Fields& geoElem, + const std::vector< std::size_t >& ndofel, const tk::Fields& U ) const { - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - const tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[0]; + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); const auto& esuf = fd.Esuf(); const auto& inpofa = fd.Inpofa(); - // Number of quadrature points for face integration - auto ng = tk::NGfa(ndof); - - // arrays for quadrature points - std::array< std::vector< tk::real >, 2 > coordgp; - std::vector< tk::real > wgp; - - coordgp[0].resize( ng ); - coordgp[1].resize( ng ); - wgp.resize( ng ); - tk::real rho, u, v, w, rhoE, p, a, vn, dSV_l, dSV_r; std::vector< tk::real > delt( U.nunk(), 0.0 ); @@ -226,15 +338,43 @@ class CompFlow { const auto& cy = coord[1]; const auto& cz = coord[2]; - // get quadrature point weights and coordinates for triangle - tk::GaussQuadratureTri( ng, coordgp, wgp ); - // compute internal surface maximum characteristic speed for (std::size_t f=0; f(esuf[2*f]); auto er = esuf[2*f+1]; + // Number of quadrature points for face integration + std::size_t ng; + + if(er > -1) + { + auto eR = static_cast< std::size_t >( er ); + + auto ng_l = tk::NGfa(ndofel[el]); + auto ng_r = tk::NGfa(ndofel[eR]); + + // When the number of gauss points for the left and right element are + // different, choose the larger ng + ng = std::max( ng_l, ng_r ); + } + else + { + ng = tk::NGfa(ndofel[el]); + } + + // arrays for quadrature points + std::array< std::vector< tk::real >, 2 > coordgp; + std::vector< tk::real > wgp; + + coordgp[0].resize( ng ); + coordgp[1].resize( ng ); + wgp.resize( ng ); + + // get quadrature point weights and coordinates for triangle + tk::GaussQuadratureTri( ng, coordgp, wgp ); + // Extract the left element coordinates std::array< std::array< tk::real, 3>, 4 > coordel_l {{ {{ cx[inpoel[4*el ]], cy[inpoel[4*el ]], cz[inpoel[4*el ]] }}, @@ -263,7 +403,7 @@ class CompFlow { auto gp = tk::eval_gp( igp, coordfa, coordgp ); // Compute the basis function for the left element - auto B_l = tk::eval_basis( ndof, + auto B_l = tk::eval_basis( ndofel[el], tk::Jacobian(coordel_l[0], gp, coordel_l[2], coordel_l[3])/detT_l, tk::Jacobian(coordel_l[0], coordel_l[1], gp, coordel_l[3])/detT_l, tk::Jacobian(coordel_l[0], coordel_l[1], coordel_l[2], gp)/detT_l ); @@ -275,11 +415,21 @@ class CompFlow { // left element for (ncomp_t c=0; c<5; ++c) { - auto mark = c*ndof; - ugp[0].push_back( U(el, mark, m_offset) - + U(el, mark+1, m_offset) * B_l[1] - + U(el, mark+2, m_offset) * B_l[2] - + U(el, mark+3, m_offset) * B_l[3] ); + auto mark = c*rdof; + ugp[0].push_back( U(el, mark, m_offset) ); + + if(ndofel[el] > 1) //DG(P1) + ugp[0][c] += U(el, mark+1, m_offset) * B_l[1] + + U(el, mark+2, m_offset) * B_l[2] + + U(el, mark+3, m_offset) * B_l[3]; + + if(ndofel[el] > 4) //DG(P2) + ugp[0][c] += U(el, mark+4, m_offset) * B_l[4] + + U(el, mark+5, m_offset) * B_l[5] + + U(el, mark+6, m_offset) * B_l[6] + + U(el, mark+7, m_offset) * B_l[7] + + U(el, mark+8, m_offset) * B_l[8] + + U(el, mark+9, m_offset) * B_l[9]; } rho = ugp[0][0]; @@ -287,9 +437,9 @@ class CompFlow { v = ugp[0][2]/rho; w = ugp[0][3]/rho; rhoE = ugp[0][4]; - p = (g-1.0)*(rhoE - rho*(u*u + v*v + w*w)/2.0); + p = eos_pressure< tag::compflow >( m_system, rho, u, v, w, rhoE ); - a = std::sqrt(g * p / rho); + a = eos_soundspeed< tag::compflow >( m_system, rho, p ); vn = u*geoFace(f,1,0) + v*geoFace(f,2,0) + w*geoFace(f,3,0); @@ -310,25 +460,35 @@ class CompFlow { }}; // Compute the determinant of Jacobian matrix - auto detT_r = + auto detT_r = tk::Jacobian(coordel_r[0],coordel_r[1],coordel_r[2],coordel_r[3]); // Compute the coordinates of quadrature point at physical domain gp = tk::eval_gp( igp, coordfa, coordgp ); // Compute the basis function for the right element - auto B_r = tk::eval_basis( ndof, + auto B_r = tk::eval_basis( ndofel[eR], tk::Jacobian(coordel_r[0],gp,coordel_r[2],coordel_r[3])/detT_r, tk::Jacobian(coordel_r[0],coordel_r[1],gp,coordel_r[3])/detT_r, tk::Jacobian(coordel_r[0],coordel_r[1],coordel_r[2],gp)/detT_r ); for (ncomp_t c=0; c<5; ++c) { - auto mark = c*ndof; - ugp[1].push_back( U(eR, mark, m_offset) - + U(eR, mark+1, m_offset) * B_r[1] - + U(eR, mark+2, m_offset) * B_r[2] - + U(eR, mark+3, m_offset) * B_r[3] ); + auto mark = c*rdof; + ugp[1].push_back( U(eR, mark, m_offset) ); + + if(ndofel[eR] > 1) //DG(P1) + ugp[1][c] += U(eR, mark+1, m_offset) * B_r[1] + + U(eR, mark+2, m_offset) * B_r[2] + + U(eR, mark+3, m_offset) * B_r[3]; + + if(ndofel[eR] > 4) //DG(P2) + ugp[1][c] += U(eR, mark+4, m_offset) * B_r[4] + + U(eR, mark+5, m_offset) * B_r[5] + + U(eR, mark+6, m_offset) * B_r[6] + + U(eR, mark+7, m_offset) * B_r[7] + + U(eR, mark+8, m_offset) * B_r[8] + + U(eR, mark+9, m_offset) * B_r[9]; } rho = ugp[1][0]; @@ -336,9 +496,8 @@ class CompFlow { v = ugp[1][2]/rho; w = ugp[1][3]/rho; rhoE = ugp[1][4]; - p = (g-1.0)*(rhoE - rho*(u*u + v*v + w*w)/2.0); - - a = std::sqrt(g * p / rho); + p = eos_pressure< tag::compflow >( m_system, rho, u, v, w, rhoE ); + a = eos_soundspeed< tag::compflow >( m_system, rho, p ); vn = u*geoFace(f,1,0) + v*geoFace(f,2,0) + w*geoFace(f,3,0); @@ -361,7 +520,7 @@ class CompFlow { return mindt; } - //! Extract the velocity field at cell nodes + //! Extract the velocity field at cell nodes. Currently unused. //! \param[in] U Solution vector at recent time step //! \param[in] N Element node indices //! \return Array of the four values of the velocity field @@ -423,8 +582,7 @@ class CompFlow { const tk::Fields& /*geoElem*/, const tk::Fields& U ) const { - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - const tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[0]; + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); const auto& cx = coord[0]; const auto& cy = coord[1]; @@ -473,10 +631,10 @@ class CompFlow { for (ncomp_t c=0; c<5; ++c) { - if (ndof == 1) { + if (rdof == 1) { ugp[c] = U(e, c, m_offset); } else { - auto mark = c*ndof; + auto mark = c*rdof; ugp[c] = U(e, mark, m_offset) + U(e, mark+1, m_offset) * B2 + U(e, mark+2, m_offset) * B3 @@ -487,7 +645,8 @@ class CompFlow { auto u = ugp[1] / ugp[0]; auto v = ugp[2] / ugp[0]; auto w = ugp[3] / ugp[0]; - auto p = (g - 1) * (ugp[4] - 0.5 * ugp[0] * (u*u + v*v + w*w) ); + auto p = + eos_pressure< tag::compflow >( m_system, ugp[0], u, v, w, ugp[4] ); out[0][ inpoel[4*e+i] ] += ugp[0]; out[1][ inpoel[4*e+i] ] += u; @@ -554,19 +713,17 @@ class CompFlow { //! \note The function signature must follow tk::FluxFn static tk::FluxFn::result_type flux( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, const std::vector< tk::real >& ugp, const std::vector< std::array< tk::real, 3 > >& ) { Assert( ugp.size() == ncomp, "Size mismatch" ); - IGNORE(ncomp); - - const auto g = g_inputdeck.get< tag::param, eq, tag::gamma >()[ system ]; auto u = ugp[1] / ugp[0]; auto v = ugp[2] / ugp[0]; auto w = ugp[3] / ugp[0]; - auto p = (g - 1) * (ugp[4] - 0.5 * ugp[0] * (u*u + v*v + w*w) ); + auto p = + eos_pressure< tag::compflow >( system, ugp[0], u, v, w, ugp[4] ); std::vector< std::array< tk::real, 3 > > fl( ugp.size() ); diff --git a/src/PDE/CompFlow/Physics/CGNavierStokes.cpp b/src/PDE/CompFlow/Physics/CGNavierStokes.cpp index 8629fb51afc..415a20fe869 100644 --- a/src/PDE/CompFlow/Physics/CGNavierStokes.cpp +++ b/src/PDE/CompFlow/Physics/CGNavierStokes.cpp @@ -47,7 +47,7 @@ CompFlowPhysicsNavierStokes::viscousRhs( // ***************************************************************************** { // dynamic viscosity - auto mu = g_inputdeck.get< tag::param, tag::compflow, tag::mu >()[0]; + auto mu = g_inputdeck.get< tag::param, tag::compflow, tag::mu >()[0][0]; // add deviatoric viscous stress contribution to momentum rhs auto c = dt * J/6.0 * mu; @@ -119,7 +119,7 @@ CompFlowPhysicsNavierStokes::viscous_dt( // ***************************************************************************** { // dynamic viscosity - auto mu = g_inputdeck.get< tag::param, tag::compflow, tag::mu >()[0]; + auto mu = g_inputdeck.get< tag::param, tag::compflow, tag::mu >()[0][0]; // compute the minimum viscous time step size across the four nodes tk::real mindt = std::numeric_limits< tk::real >::max(); @@ -152,9 +152,9 @@ CompFlowPhysicsNavierStokes::conductRhs( // ***************************************************************************** { // specific heat at constant volume - auto cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0]; + auto cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0][0]; // thermal conductivity - auto kc = g_inputdeck.get< tag::param, tag::compflow, tag::k >()[0]; + auto kc = g_inputdeck.get< tag::param, tag::compflow, tag::k >()[0][0]; // compute temperature std::array< tk::real, 4 > T; @@ -182,16 +182,14 @@ CompFlowPhysicsNavierStokes::conduct_dt( //! Compute the minimum time step size based on thermal diffusion //! \param[in] L Characteristic length scale //! \param[in] g Ratio of specific heats -//! \param[in] cv Specific heat at constant volume -//! \param[in] kc Thermal conductivity //! \param[in] u Solution at element nodes at recent time step //! \return Minimum time step size based on thermal diffusion // ***************************************************************************** { // specific heat at constant volume - auto cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0]; + auto cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0][0]; // thermal conductivity - auto kc = g_inputdeck.get< tag::param, tag::compflow, tag::k >()[0]; + auto kc = g_inputdeck.get< tag::param, tag::compflow, tag::k >()[0][0]; // specific heat at constant pressure auto cp = g * cv; diff --git a/src/PDE/CompFlow/Physics/DGEuler.hpp b/src/PDE/CompFlow/Physics/DGEuler.hpp index 9fa73d5ffda..d74ffe3e78a 100644 --- a/src/PDE/CompFlow/Physics/DGEuler.hpp +++ b/src/PDE/CompFlow/Physics/DGEuler.hpp @@ -30,7 +30,7 @@ namespace dg { class CompFlowPhysicsEuler { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! Return physics type diff --git a/src/PDE/CompFlow/Problem/NLEnergyGrowth.cpp b/src/PDE/CompFlow/Problem/NLEnergyGrowth.cpp index 5416f776953..fad72b2dd95 100644 --- a/src/PDE/CompFlow/Problem/NLEnergyGrowth.cpp +++ b/src/PDE/CompFlow/Problem/NLEnergyGrowth.cpp @@ -14,6 +14,7 @@ #include "NLEnergyGrowth.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -58,7 +59,7 @@ CompFlowProblemNLEnergyGrowth::ec( tk::real ce, tk::real kappa, tk::real t, tk::SolutionFn::result_type CompFlowProblemNLEnergyGrowth::solution( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, tk::real x, tk::real y, tk::real z, @@ -76,9 +77,8 @@ CompFlowProblemNLEnergyGrowth::solution( ncomp_t system, //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; // manufactured solution parameters @@ -102,13 +102,14 @@ CompFlowProblemNLEnergyGrowth::solution( ncomp_t system, } std::vector< tk::real > -CompFlowProblemNLEnergyGrowth::solinc( ncomp_t system, tk::real x, tk::real y, - tk::real z, tk::real t, tk::real dt ) const +CompFlowProblemNLEnergyGrowth::solinc( ncomp_t system, ncomp_t ncomp, + tk::real x, tk::real y, tk::real z, tk::real t, tk::real dt ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) // for all components //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -117,20 +118,21 @@ CompFlowProblemNLEnergyGrowth::solinc( ncomp_t system, tk::real x, tk::real y, //! \return Increment in values of all components evaluated at (x,y,z,t+dt) // ***************************************************************************** { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); std::transform( begin(st1), end(st1), begin(st2), begin(st2), []( tk::real s, tk::real& d ){ return d -= s; } ); return st2; } tk::SrcFn::result_type -CompFlowProblemNLEnergyGrowth::src( ncomp_t system, ncomp_t, tk::real x, +CompFlowProblemNLEnergyGrowth::src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real t ) // ***************************************************************************** // Compute and return source term for NLEG manufactured solution //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -149,7 +151,7 @@ CompFlowProblemNLEnergyGrowth::src( ncomp_t system, ncomp_t, tk::real x, const auto kappa = g_inputdeck.get< param, eq, tag::kappa >()[system]; const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system]; // ratio of specific heats - const auto g = g_inputdeck.get< param, eq, tag::gamma >()[system]; + const auto g = g_inputdeck.get< param, eq, tag::gamma >()[system][0]; // spatial component of density field const auto gx = 1.0 - x*x - y*y - z*z; // derivative of spatial component of density field @@ -176,7 +178,7 @@ CompFlowProblemNLEnergyGrowth::src( ncomp_t system, ncomp_t, tk::real x, 2.0*std::pow(ie,4.0)*kappa*h*dh[2]*t }}; const auto dedt = kappa*h*h*std::pow(ie,4.0); // sources - std::vector< tk::real > r( m_ncomp ); + std::vector< tk::real > r( ncomp ); // density source r[0] = drdt; // momentum source @@ -233,7 +235,7 @@ CompFlowProblemNLEnergyGrowth::fieldNames( ncomp_t ) const std::vector< std::vector< tk::real > > CompFlowProblemNLEnergyGrowth::fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t ncomp, ncomp_t offset, tk::real t, tk::real V, @@ -244,6 +246,7 @@ CompFlowProblemNLEnergyGrowth::fieldOutput( // Return field output going to file //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] offset System offset specifying the position of the system of //! PDEs among other systems //! \param[in] t Physical time @@ -255,17 +258,15 @@ CompFlowProblemNLEnergyGrowth::fieldOutput( // ***************************************************************************** { // number of degree of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); std::vector< std::vector< tk::real > > out; - auto r = U.extract( 0*ndof, offset ); - auto u = U.extract( 1*ndof, offset ); - auto v = U.extract( 2*ndof, offset ); - auto w = U.extract( 3*ndof, offset ); - auto E = U.extract( 4*ndof, offset ); + auto r = U.extract( 0*rdof, offset ); + auto u = U.extract( 1*rdof, offset ); + auto v = U.extract( 2*rdof, offset ); + auto w = U.extract( 3*rdof, offset ); + auto E = U.extract( 4*rdof, offset ); // mesh node coordinates const auto& x = coord[0]; @@ -288,12 +289,12 @@ CompFlowProblemNLEnergyGrowth::fieldOutput( auto p = r; for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); out.push_back( p ); auto er = r, ee = r; for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); } out.push_back( r ); diff --git a/src/PDE/CompFlow/Problem/NLEnergyGrowth.h b/src/PDE/CompFlow/Problem/NLEnergyGrowth.h deleted file mode 100644 index f9720dceea6..00000000000 --- a/src/PDE/CompFlow/Problem/NLEnergyGrowth.h +++ /dev/null @@ -1,313 +0,0 @@ -// ***************************************************************************** -/*! - \file src/PDE/CompFlow/Problem/NLEnergyGrowth.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Problem configuration for the compressible flow equations - \details This file defines a policy class for the compressible flow - equations, defined in PDE/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h - for general requirements on Problem policy classes for CompFlow. -*/ -// ***************************************************************************** -#ifndef CompFlowProblemNLEnergyGrowth_h -#define CompFlowProblemNLEnergyGrowth_h - -#include -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: nonlinear energy growth (NLEG) -//! \see Waltz, et. al, "Manufactured solutions for the three-dimensional Euler -//! equations with relevance to Inertial Confinement Fusion", Journal of -//! Computational Physics 267 (2014) 196-209. -class CompFlowProblemNLEnergyGrowth { - - private: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - private: - //! Compute internal energy parameter - //! \param[in] bx Parameter betax - //! \param[in] by Parameter betay - //! \param[in] bz Parameter betaz - //! \param[in] x X coordinate to evaluate at - //! \param[in] y Y coordinate to evaluate at - //! \param[in] z Z coordinate to evaluate at - //! \return Internal energy parameter - static tk::real hx( tk::real bx, tk::real by, tk::real bz, - tk::real x, tk::real y, tk::real z ) - { return std::cos(bx*M_PI*x) * std::cos(by*M_PI*y) * std::cos(bz*M_PI*z); } - - //! Compute a power of the internal energy - //! \param[in] ce Internal energy parameter - //! \param[in] kappa Internal energy parameter - //! \param[in] t Physical time - //! \param[in] h Internal energy parameter - //! \param[in] p Power - //! \return Internal energy raised to power p - static tk::real ec( tk::real ce, tk::real kappa, tk::real t, tk::real h, - tk::real p ) - { return std::pow( -3.0*(ce + kappa*h*h*t), p ); } - - public: - - //! Evaluate analytical solution at (x,y,z,t) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution - //! \return Values of all components evaluated at (x,y,z,t) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, - tk::real t ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; - // manufactured solution parameters - const auto ce = g_inputdeck.get< param, eq, tag::ce >()[system]; - const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system]; - const auto a = g_inputdeck.get< param, eq, tag::alpha >()[system]; - const auto k = g_inputdeck.get< param, eq, tag::kappa >()[system]; - const auto bx = g_inputdeck.get< param, eq, tag::betax >()[system]; - const auto by = g_inputdeck.get< param, eq, tag::betay >()[system]; - const auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system]; - // spatial component of density field - const tk::real gx = 1.0 - x*x - y*y - z*z; - // internal energy parameter - const auto h = hx( bx, by, bz, x, y, z ); - // temporal component of the density field - tk::real ft = std::exp( -a*t ); - // solution at t - auto r = r0 + ft*gx; - return {{ r, 0.0, 0.0, 0.0, r*ec(ce,k,t,h,-1.0/3.0) }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution increment starting from - //! \param[in] dt Time increment at which evaluate the solution increment to - //! \return Increment in values of all components evaluated at (x,y,z,t+dt) - static std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) - { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); - std::transform( begin(st1), end(st1), begin(st2), begin(st2), - []( tk::real s, tk::real& d ){ return d -= s; } ); - return st2; - } - - //! Compute and return source term for NLEG manufactured solution - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Physical time at which to evaluate the source - //! \return Array of reals containing the source for all components - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, - tk::real t ) - { - using tag::param; using std::sin; using std::cos; - // manufactured solution parameters - const auto a = g_inputdeck.get< param, eq, tag::alpha >()[system]; - const auto bx = g_inputdeck.get< param, eq, tag::betax >()[system]; - const auto by = g_inputdeck.get< param, eq, tag::betay >()[system]; - const auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system]; - const auto ce = g_inputdeck.get< param, eq, tag::ce >()[system]; - const auto kappa = g_inputdeck.get< param, eq, tag::kappa >()[system]; - const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system]; - // ratio of specific heats - const auto g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - // spatial component of density field - const auto gx = 1.0 - x*x - y*y - z*z; - // derivative of spatial component of density field - const std::array< tk::real, 3 > dg{{ -2.0*x, -2.0*y, -2.0*z }}; - // spatial component of energy field - const auto h = hx( bx, by, bz, x, y, z ); - // derivative of spatial component of energy field - std::array< tk::real, 3 > - dh{{ -bx*M_PI*sin(bx*M_PI*x)*cos(by*M_PI*y)*cos(bz*M_PI*z), - -by*M_PI*cos(bx*M_PI*x)*sin(by*M_PI*y)*cos(bz*M_PI*z), - -bz*M_PI*cos(bx*M_PI*x)*cos(by*M_PI*y)*sin(bz*M_PI*z) }}; - // temporal function f and its derivative - const auto ft = std::exp(-a*t); - const auto dfdt = -a*ft; - // density and its derivatives - const auto rho = r0 + ft*gx; - const std::array< tk::real, 3 > drdx{{ ft*dg[0], ft*dg[1], ft*dg[2] }}; - const auto drdt = gx*dfdt; - // internal energy and its derivatives - const auto ie = ec( ce, kappa, t, h, -1.0/3.0 ); - const std::array< tk::real, 3 > dedx{{ - 2.0*std::pow(ie,4.0)*kappa*h*dh[0]*t, - 2.0*std::pow(ie,4.0)*kappa*h*dh[1]*t, - 2.0*std::pow(ie,4.0)*kappa*h*dh[2]*t }}; - const auto dedt = kappa*h*h*std::pow(ie,4.0); - // sources - std::vector< tk::real > r( m_ncomp ); - // density source - r[0] = drdt; - // momentum source - r[1] = (g-1.0)*(rho*dedx[0] + ie*drdx[0]); - r[2] = (g-1.0)*(rho*dedx[1] + ie*drdx[1]); - r[3] = (g-1.0)*(rho*dedx[2] + ie*drdx[2]); - // energy source - r[4] = rho*dedt + ie*drdt; - return r; - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; using tag::bcdir; - for (const auto& s : g_inputdeck.get< param, eq, bcdir >()) - for (const auto& i : s) - conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - n.push_back( "x-velocity_numerical" ); - n.push_back( "y-velocity_numerical" ); - n.push_back( "z-velocity_numerical" ); - n.push_back( "specific_total_energy_numerical" ); - n.push_back( "pressure_numerical" ); - n.push_back( "density_analytical" ); - n.push_back( "x-velocity_analytical" ); - n.push_back( "y-velocity_analytical" ); - n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_analytical" ); - n.push_back( "pressure_analytical" ); - n.push_back( "err(rho)" ); - n.push_back( "err(e)" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems - //! \param[in] t Physical time - //! \param[in] V Total mesh volume (across the whole problem) - //! \param[in] vol Nodal mesh volumes - //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real t, - tk::real V, - const std::vector< tk::real >& vol, - const std::array< std::vector< tk::real >, 3 >& coord, - tk::Fields& U ) - { - // number of degrees of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - std::vector< std::vector< tk::real > > out; - auto r = U.extract( 0*ndof, offset ); - auto u = U.extract( 1*ndof, offset ); - auto v = U.extract( 2*ndof, offset ); - auto w = U.extract( 3*ndof, offset ); - auto E = U.extract( 4*ndof, offset ); - - // mesh node coordinates - const auto& x = coord[0]; - const auto& y = coord[1]; - const auto& z = coord[2]; - - out.push_back( r ); - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - - auto p = r; - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::NL_ENERGY_GROWTH; } -}; - -} // inciter:: - -#endif // CompFlowProblemNLEnergyGrowth_h diff --git a/src/PDE/CompFlow/Problem/NLEnergyGrowth.hpp b/src/PDE/CompFlow/Problem/NLEnergyGrowth.hpp index fca332a1973..9db8e0d3412 100644 --- a/src/PDE/CompFlow/Problem/NLEnergyGrowth.hpp +++ b/src/PDE/CompFlow/Problem/NLEnergyGrowth.hpp @@ -32,9 +32,8 @@ namespace inciter { class CompFlowProblemNLEnergyGrowth { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components //! Compute internal energy parameter static tk::real hx( tk::real bx, tk::real by, tk::real bz, @@ -53,12 +52,12 @@ class CompFlowProblemNLEnergyGrowth { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) const; + solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, + tk::real t, tk::real dt ) const; //! Compute and return source term for NLEG manufactured solution static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, + src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real t ); //! \brief Query all side set IDs the user has configured for all components @@ -71,7 +70,7 @@ class CompFlowProblemNLEnergyGrowth { //! Return field output going to file std::vector< std::vector< tk::real > > fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t ncomp, ncomp_t offset, tk::real t, tk::real V, diff --git a/src/PDE/CompFlow/Problem/RayleighTaylor.cpp b/src/PDE/CompFlow/Problem/RayleighTaylor.cpp index 13d88a7eb21..74fe6dc5a9d 100644 --- a/src/PDE/CompFlow/Problem/RayleighTaylor.cpp +++ b/src/PDE/CompFlow/Problem/RayleighTaylor.cpp @@ -14,6 +14,7 @@ #include "RayleighTaylor.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,7 +26,7 @@ using inciter::CompFlowProblemRayleighTaylor; tk::SolutionFn::result_type CompFlowProblemRayleighTaylor::solution( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, tk::real x, tk::real y, tk::real z, @@ -43,9 +44,8 @@ CompFlowProblemRayleighTaylor::solution( ncomp_t system, //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; using std::sin; using std::cos; // manufactured solution parameters @@ -56,8 +56,6 @@ CompFlowProblemRayleighTaylor::solution( ncomp_t system, const auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system]; const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system]; const auto k = g_inputdeck.get< param, eq, tag::kappa >()[system]; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; // spatial component of density and pressure fields const tk::real gx = bx*x*x + by*y*y + bz*z*z; // density @@ -70,19 +68,20 @@ CompFlowProblemRayleighTaylor::solution( ncomp_t system, const tk::real v = ft*z*cos(M_PI*y); const tk::real w = ft*(-0.5*M_PI*z*z*(cos(M_PI*x)-sin(M_PI*y))); // total specific energy - const tk::real rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); + const tk::real rE = eos_totalenergy< eq >( system, r, u, v, w, p ); return {{ r, r*u, r*v, r*w, rE }}; } std::vector< tk::real > -CompFlowProblemRayleighTaylor::solinc( ncomp_t system, tk::real x, tk::real y, - tk::real z, tk::real t, tk::real dt ) const +CompFlowProblemRayleighTaylor::solinc( ncomp_t system, ncomp_t ncomp, + tk::real x, tk::real y, tk::real z, tk::real t, tk::real dt ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) // for all components //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -91,20 +90,21 @@ CompFlowProblemRayleighTaylor::solinc( ncomp_t system, tk::real x, tk::real y, //! \return Increment in values of all components evaluated at (x,y,z,t+dt) // ***************************************************************************** { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); std::transform( begin(st1), end(st1), begin(st2), begin(st2), []( tk::real s, tk::real& d ){ return d -= s; } ); return st2; } tk::SrcFn::result_type -CompFlowProblemRayleighTaylor::src( ncomp_t system, ncomp_t, tk::real x, +CompFlowProblemRayleighTaylor::src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real t ) // ***************************************************************************** // Compute and return source term for manufactured solution //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -123,10 +123,10 @@ CompFlowProblemRayleighTaylor::src( ncomp_t system, ncomp_t, tk::real x, auto k = g_inputdeck.get< param, eq, tag::kappa >()[system]; auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system]; // ratio of specific heats - tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; + tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system][0]; // evaluate solution at x,y,z,t - auto s = solution( system, m_ncomp, x, y, z, t ); + auto s = solution( system, ncomp, x, y, z, t ); // density, velocity, energy, pressure auto rho = s[0]; @@ -163,7 +163,7 @@ CompFlowProblemRayleighTaylor::src( ncomp_t system, ncomp_t, tk::real x, auto dwdt = k*M_PI*sin(k*M_PI*t)/2*M_PI*z*z*(cos(M_PI*x) - sin(M_PI*y)); auto dedt = u*dudt + v*dvdt + w*dwdt; - std::vector< tk::real > r( m_ncomp ); + std::vector< tk::real > r( ncomp ); // density source r[0] = u*drdx[0] + v*drdx[1] + w*drdx[2]; // momentum source @@ -226,7 +226,7 @@ CompFlowProblemRayleighTaylor::fieldNames( ncomp_t ) const std::vector< std::vector< tk::real > > CompFlowProblemRayleighTaylor::fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t ncomp, ncomp_t offset, tk::real t, tk::real V, @@ -237,6 +237,7 @@ CompFlowProblemRayleighTaylor::fieldOutput( // Return field output going to file //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] offset System offset specifying the position of the system of //! PDEs among other systems //! \param[in] t Physical time @@ -247,9 +248,6 @@ CompFlowProblemRayleighTaylor::fieldOutput( //! \return Vector of vectors to be output to file // ***************************************************************************** { - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - std::vector< std::vector< tk::real > > out; auto r = U.extract( 0, offset ); auto u = U.extract( 1, offset ); @@ -278,24 +276,25 @@ CompFlowProblemRayleighTaylor::fieldOutput( auto p = r; for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); out.push_back( p ); auto er = r, ee = r, ep = r, eu = r, ev = r, ew = r; for (std::size_t i=0; i( system, s[0], s[1]/s[0], s[2]/s[0], s[3]/s[0], + s[4] ); r[i] = s[0]; u[i] = s[1]/s[0]; v[i] = s[2]/s[0]; w[i] = s[3]/s[0]; E[i] = s[4]/s[0]; - p[i] = (g-1.0)*r[i]*(E[i] - (u[i]*u[i] + v[i]*v[i] + w[i]*w[i])/2.0); + p[i] = eos_pressure< eq >( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); ep[i] = std::pow( ap - p[i], 2.0 ) * vol[i] / V; } @@ -317,7 +316,7 @@ CompFlowProblemRayleighTaylor::fieldOutput( } std::vector< std::string > -CompFlowProblemRayleighTaylor::names( ncomp_t ) const +CompFlowProblemRayleighTaylor::names( ncomp_t /*ncomp*/ ) const // ***************************************************************************** // Return names of integral variables to be output to diagnostics file //! \return Vector of strings labelling integral variables output diff --git a/src/PDE/CompFlow/Problem/RayleighTaylor.h b/src/PDE/CompFlow/Problem/RayleighTaylor.h deleted file mode 100644 index 5d498fb4d6d..00000000000 --- a/src/PDE/CompFlow/Problem/RayleighTaylor.h +++ /dev/null @@ -1,320 +0,0 @@ -// ***************************************************************************** -/*! - \file src/PDE/CompFlow/Problem/RayleighTaylor.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Problem configuration for the compressible flow equations - \details This file defines a policy class for the compressible flow - equations, defined in PDE/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h - for general requirements on Problem policy classes for CompFlow. -*/ -// ***************************************************************************** -#ifndef CompFlowProblemRayleighTaylor_h -#define CompFlowProblemRayleighTaylor_h - -#include -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: Rayleigh-Taylor -//! \see Waltz, et. al, "Manufactured solutions for the three-dimensional Euler -//! equations with relevance to Inertial Confinement Fusion", Journal of -//! Computational Physics 267 (2014) 196-209. -class CompFlowProblemRayleighTaylor { - - private: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - public: - //! Evaluate analytical solution at (x,y,z,t) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution - //! \return Values of all components evaluated at (x,y,z,t) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, - tk::real t ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; using std::sin; using std::cos; - // manufactured solution parameters - const auto a = g_inputdeck.get< param, eq, tag::alpha >()[system]; - const auto bx = g_inputdeck.get< param, eq, tag::betax >()[system]; - const auto by = g_inputdeck.get< param, eq, tag::betay >()[system]; - const auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system]; - const auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system]; - const auto r0 = g_inputdeck.get< param, eq, tag::r0 >()[system]; - const auto k = g_inputdeck.get< param, eq, tag::kappa >()[system]; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - // spatial component of density and pressure fields - const tk::real gx = bx*x*x + by*y*y + bz*z*z; - // density - const tk::real r = r0 - gx; - // pressure - const tk::real p = p0 + a*gx; - // velocity - const tk::real ft = cos(k*M_PI*t); - const tk::real u = ft*z*sin(M_PI*x); - const tk::real v = ft*z*cos(M_PI*y); - const tk::real w = ft*(-0.5*M_PI*z*z*(cos(M_PI*x)-sin(M_PI*y))); - // total specific energy - const tk::real rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); - return {{ r, r*u, r*v, r*w, rE }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution increment starting from - //! \param[in] dt Time increment at which evaluate the solution increment to - //! \return Increment in values of all components evaluated at (x,y,z,t+dt) - static std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) - { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); - std::transform( begin(st1), end(st1), begin(st2), begin(st2), - []( tk::real s, tk::real& d ){ return d -= s; } ); - return st2; - } - - //! Compute and return source term for Rayleigh-Taylor manufactured solution - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Physical time at which to evaluate the source - //! \return Array of reals containing the source for all components - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, - tk::real t ) - { - using tag::param; using std::sin; using std::cos; - - // manufactured solution parameters - auto a = g_inputdeck.get< param, eq, tag::alpha >()[system]; - auto bx = g_inputdeck.get< param, eq, tag::betax >()[system]; - auto by = g_inputdeck.get< param, eq, tag::betay >()[system]; - auto bz = g_inputdeck.get< param, eq, tag::betaz >()[system]; - auto k = g_inputdeck.get< param, eq, tag::kappa >()[system]; - auto p0 = g_inputdeck.get< param, eq, tag::p0 >()[system]; - // ratio of specific heats - tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - - // evaluate solution at x,y,z,t - auto s = solution( system, m_ncomp, x, y, z, t ); - - // density, velocity, energy, pressure - auto rho = s[0]; - auto u = s[1]/s[0]; - auto v = s[2]/s[0]; - auto w = s[3]/s[0]; - auto E = s[4]/s[0]; - auto p = p0 + a*(bx*x*x + by*y*y + bz*z*z); - - // spatial gradients - std::array< tk::real, 3 > drdx{{ -2.0*bx*x, -2.0*by*y, -2.0*bz*z }}; - std::array< tk::real, 3 > dpdx{{ 2.0*a*bx*x, 2.0*a*by*y, 2.0*a*bz*z }}; - tk::real ft = cos(k*M_PI*t); - std::array< tk::real, 3 > dudx{{ ft*M_PI*z*cos(M_PI*x), - 0.0, - ft*sin(M_PI*x) }}; - std::array< tk::real, 3 > dvdx{{ 0.0, - -ft*M_PI*z*sin(M_PI*y), - ft*cos(M_PI*y) }}; - std::array< tk::real, 3 > dwdx{{ ft*M_PI*0.5*M_PI*z*z*sin(M_PI*x), - ft*M_PI*0.5*M_PI*z*z*cos(M_PI*y), - -ft*M_PI*z*(cos(M_PI*x) - sin(M_PI*y)) }}; - std::array< tk::real, 3 > dedx{{ - dpdx[0]/rho/(g-1.0) - p/(g-1.0)/rho/rho*drdx[0] - + u*dudx[0] + v*dvdx[0] + w*dwdx[0], - dpdx[1]/rho/(g-1.0) - p/(g-1.0)/rho/rho*drdx[1] - + u*dudx[1] + v*dvdx[1] + w*dwdx[1], - dpdx[2]/rho/(g-1.0) - p/(g-1.0)/rho/rho*drdx[2] - + u*dudx[2] + v*dvdx[2] + w*dwdx[2] }}; - - // time derivatives - auto dudt = -k*M_PI*sin(k*M_PI*t)*z*sin(M_PI*x); - auto dvdt = -k*M_PI*sin(k*M_PI*t)*z*cos(M_PI*y); - auto dwdt = k*M_PI*sin(k*M_PI*t)/2*M_PI*z*z*(cos(M_PI*x) - sin(M_PI*y)); - auto dedt = u*dudt + v*dvdt + w*dwdt; - - std::vector< tk::real > r( m_ncomp ); - // density source - r[0] = u*drdx[0] + v*drdx[1] + w*drdx[2]; - // momentum source - r[1] = rho*dudt+u*r[0]+dpdx[0] + s[1]*dudx[0]+s[2]*dudx[1]+s[3]*dudx[2]; - r[2] = rho*dvdt+v*r[0]+dpdx[1] + s[1]*dvdx[0]+s[2]*dvdx[1]+s[3]*dvdx[2]; - r[3] = rho*dwdt+w*r[0]+dpdx[2] + s[1]*dwdx[0]+s[2]*dwdx[1]+s[3]*dwdx[2]; - // energy source - r[4] = rho*dedt + E*r[0] + s[1]*dedx[0]+s[2]*dedx[1]+s[3]*dedx[2] - + u*dpdx[0]+v*dpdx[1]+w*dpdx[2]; - - return r; - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; using tag::bcdir; - for (const auto& s : g_inputdeck.get< param, eq, bcdir >()) - for (const auto& i : s) - conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - n.push_back( "x-velocity_numerical" ); - n.push_back( "y-velocity_numerical" ); - n.push_back( "z-velocity_numerical" ); - n.push_back( "specific_total_energy_numerical" ); - n.push_back( "pressure_numerical" ); - n.push_back( "density_analytical" ); - n.push_back( "x-velocity_analytical" ); - n.push_back( "y-velocity_analytical" ); - n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_analytical" ); - n.push_back( "pressure_analytical" ); - n.push_back( "err(rho)" ); - n.push_back( "err(e)" ); - n.push_back( "err(p)" ); - n.push_back( "err(u)" ); - n.push_back( "err(v)" ); - n.push_back( "err(w)" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems - //! \param[in] t Physical time - //! \param[in] V Total mesh volume (across the whole problem) - //! \param[in] vol Nodal mesh volumes - //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real t, - tk::real V, - const std::vector< tk::real >& vol, - const std::array< std::vector< tk::real >, 3 >& coord, - tk::Fields& U ) - { - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - std::vector< std::vector< tk::real > > out; - auto r = U.extract( 0, offset ); - auto u = U.extract( 1, offset ); - auto v = U.extract( 2, offset ); - auto w = U.extract( 3, offset ); - auto E = U.extract( 4, offset ); - - // mesh node coordinates - const auto& x = coord[0]; - const auto& y = coord[1]; - const auto& z = coord[2]; - - out.push_back( r ); - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - - auto p = r; - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::RAYLEIGH_TAYLOR; } -}; - -} // inciter:: - -#endif // CompFlowProblemRayleighTaylor_h diff --git a/src/PDE/CompFlow/Problem/RayleighTaylor.hpp b/src/PDE/CompFlow/Problem/RayleighTaylor.hpp index 3d9af44f121..5a40f59a964 100644 --- a/src/PDE/CompFlow/Problem/RayleighTaylor.hpp +++ b/src/PDE/CompFlow/Problem/RayleighTaylor.hpp @@ -32,9 +32,8 @@ namespace inciter { class CompFlowProblemRayleighTaylor { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components public: //! Evaluate analytical solution at (x,y,z,t) for all components @@ -45,12 +44,12 @@ class CompFlowProblemRayleighTaylor { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) const; + solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, + tk::real t, tk::real dt ) const; //! Compute and return source term for Rayleigh-Taylor manufactured solution static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, + src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real t ); //! \brief Query all side set IDs the user has configured for all components @@ -63,7 +62,7 @@ class CompFlowProblemRayleighTaylor { //! Return field output going to file std::vector< std::vector< tk::real > > fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t ncomp, ncomp_t offset, tk::real t, tk::real V, @@ -72,7 +71,7 @@ class CompFlowProblemRayleighTaylor { tk::Fields& U ) const; //! Return names of integral variables to be output to diagnostics file - std::vector< std::string > names( ncomp_t ) const; + std::vector< std::string > names( ncomp_t /*ncomp*/ ) const; //! Return problem type static ctr::ProblemType type() noexcept diff --git a/src/PDE/CompFlow/Problem/RotatedSodShocktube.cpp b/src/PDE/CompFlow/Problem/RotatedSodShocktube.cpp index 6dc7338e1da..88d8c05c1b2 100644 --- a/src/PDE/CompFlow/Problem/RotatedSodShocktube.cpp +++ b/src/PDE/CompFlow/Problem/RotatedSodShocktube.cpp @@ -13,13 +13,6 @@ #include "Vector.hpp" #include "RotatedSodShocktube.hpp" -#include "Inciter/InputDeck/InputDeck.hpp" - -namespace inciter { - -extern ctr::InputDeck g_inputdeck; - -} // ::inciter using inciter::CompFlowProblemRotatedSodShocktube; diff --git a/src/PDE/CompFlow/Problem/SedovBlastwave.cpp b/src/PDE/CompFlow/Problem/SedovBlastwave.cpp index ac0159f139c..59410d5da3a 100644 --- a/src/PDE/CompFlow/Problem/SedovBlastwave.cpp +++ b/src/PDE/CompFlow/Problem/SedovBlastwave.cpp @@ -14,6 +14,7 @@ #include "SedovBlastwave.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,11 +26,11 @@ using inciter::CompFlowProblemSedovBlastwave; tk::SolutionFn::result_type CompFlowProblemSedovBlastwave::solution( ncomp_t system, - ncomp_t ncomp, - tk::real x, - tk::real y, - tk::real, - tk::real ) + [[maybe_unused]] ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real, + tk::real ) // ***************************************************************************** //! Evaluate analytical solution at (x,y,z,t) for all components //! \param[in] system Equation system index, i.e., which compressible @@ -37,18 +38,14 @@ CompFlowProblemSedovBlastwave::solution( ncomp_t system, //! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution -//! \param[in] t Physical time at which to evaluate the solution //! \return Values of all components evaluated at (x) //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; tk::real r, p, u, v, w, rE; if ( (x<0.05) && (y<0.05) ) { // density @@ -71,19 +68,20 @@ CompFlowProblemSedovBlastwave::solution( ncomp_t system, w = 0.0; } // total specific energy - rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); + rE = eos_totalenergy< eq >( system, r, u, v, w, p ); return {{ r, r*u, r*v, r*w, rE }}; } std::vector< tk::real > -CompFlowProblemSedovBlastwave::solinc( ncomp_t system, tk::real x, tk::real y, - tk::real z, tk::real t, tk::real dt ) const +CompFlowProblemSedovBlastwave::solinc( ncomp_t system, ncomp_t ncomp, + tk::real x, tk::real y, tk::real z, tk::real t, tk::real dt ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) // for all components //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -92,8 +90,8 @@ CompFlowProblemSedovBlastwave::solinc( ncomp_t system, tk::real x, tk::real y, //! \return Increment in values of all components evaluated at (x,y,z,t+dt) // ***************************************************************************** { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); std::transform( begin(st1), end(st1), begin(st2), begin(st2), []( tk::real s, tk::real& d ){ return d -= s; } ); @@ -177,17 +175,14 @@ CompFlowProblemSedovBlastwave::fieldOutput( //! \return Vector of vectors to be output to file // ***************************************************************************** { - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); + const auto r = U.extract( 0*rdof, offset ); + const auto ru = U.extract( 1*rdof, offset ); + const auto rv = U.extract( 2*rdof, offset ); + const auto rw = U.extract( 3*rdof, offset ); + const auto re = U.extract( 4*rdof, offset ); // mesh node coordinates //const auto& x = coord[0]; @@ -250,7 +245,7 @@ CompFlowProblemSedovBlastwave::fieldOutput( std::vector< tk::real > P( r.size(), 0.0 ); for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], re[i] ); out.push_back( P ); //out.push_back( Pa ); diff --git a/src/PDE/CompFlow/Problem/SedovBlastwave.h b/src/PDE/CompFlow/Problem/SedovBlastwave.h deleted file mode 100644 index 670de79f620..00000000000 --- a/src/PDE/CompFlow/Problem/SedovBlastwave.h +++ /dev/null @@ -1,259 +0,0 @@ -// ***************************************************************************** -/*! - \file src/PDE/CompFlow/Problem/SedovBlastwave.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Problem configuration for Sedov's blastwave - \details This file defines a policy class for the compressible flow - equations, defined in PDE/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h - for general requirements on Problem policy classes for CompFlow. -*/ -// ***************************************************************************** -#ifndef CompFlowProblemSedovBlastwave_h -#define CompFlowProblemSedovBlastwave_h - -#include -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: Sedov blast-wave -class CompFlowProblemSedovBlastwave { - - private: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - public: - //! Evaluate analytical solution at (x,y,0) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \return Values of all components evaluated at (x,y,0) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, - tk::real x, tk::real y, tk::real, tk::real ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - tk::real r, p, u, v, w, rE; - if ( (x<0.05) && (y<0.05) ) { - // density - r = 1.0; - // pressure - p = 783.4112; - // velocity - u = 0.0; - v = 0.0; - w = 0.0; - } - else { - // density - r = 1.0; - // pressure - p = 1.0e-6; - // velocity - u = 0.0; - v = 0.0; - w = 0.0; - } - // total specific energy - rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); - return {{ r, r*u, r*v, r*w, rE }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution increment starting from - //! \param[in] dt Time increment at which evaluate the solution increment to - //! \return Increment in values of all components evaluated at (x,y,z,t+dt) - static std::vector< tk::real > - solinc( ncomp_t system, - tk::real x, tk::real y, tk::real z, tk::real t, tk::real dt ) - { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); - std::transform( begin(st1), end(st1), begin(st2), begin(st2), - []( tk::real s, tk::real& d ){ return d -= s; } ); - return st2; - } - - //! Compute and return source term for this problem - //! \return Array of reals containing the source which is zero for this - //! problem - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real ) - { - return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; - - for (const auto& s : g_inputdeck.get< param, eq, tag::bcextrapolate >()) - for (const auto& i : s) conf.insert( std::stoi(i) ); - - for (const auto& s : g_inputdeck.get< param, eq, tag::bcsym >()) - for (const auto& i : s) conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - //n.push_back( "density_analytical" ); - n.push_back( "x-velocity_numerical" ); - //n.push_back( "x-velocity_analytical" ); - //n.push_back( "err(u)" ); - n.push_back( "y-velocity_numerical" ); - //n.push_back( "y-velocity_analytical" ); - n.push_back( "z-velocity_numerical" ); - //n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_numerical" ); - //n.push_back( "specific_total_energy_analytical" ); - //n.push_back( "err(E)" ); - n.push_back( "pressure_numerical" ); - //n.push_back( "pressure_analytical" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems -// //! \param[in] V Total mesh volume -// //! \param[in] vol Nodal mesh volumes -// //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real, - tk::real /*V*/, - const std::vector< tk::real >& /*vol*/, - const std::array< std::vector< tk::real >, 3 >& /*coord*/, - tk::Fields& U ) - { - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - - std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); - - // mesh node coordinates - //const auto& x = coord[0]; - //const auto& y = coord[1]; - - out.push_back( r ); - //out.push_back( std::vector< tk::real >( r.size(), 1.0 ) ); - - std::vector< tk::real > u = ru; - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - //std::vector< tk::real > ua = ru; - //for (std::size_t i=0; i v = rv; - //std::vector< tk::real > va = rv; - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - //for (std::size_t i=0; i w = rw; - //std::vector< tk::real > wa = rw; - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - //for (std::size_t i=0; i E = re; - //std::vector< tk::real > Ea = re; - //std::vector< tk::real > Pa( r.size(), 0.0 ); - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - //for (std::size_t i=0; i P( r.size(), 0.0 ); - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::SEDOV_BLASTWAVE; } -}; - -} // inciter:: - -#endif // CompFlowProblemSedovBlasttwave_h diff --git a/src/PDE/CompFlow/Problem/SedovBlastwave.hpp b/src/PDE/CompFlow/Problem/SedovBlastwave.hpp index e238ed8a37b..1751e5ef776 100644 --- a/src/PDE/CompFlow/Problem/SedovBlastwave.hpp +++ b/src/PDE/CompFlow/Problem/SedovBlastwave.hpp @@ -29,9 +29,8 @@ namespace inciter { class CompFlowProblemSedovBlastwave { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components public: //! Evaluate analytical solution at (x,y,0) for all components @@ -42,7 +41,7 @@ class CompFlowProblemSedovBlastwave { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, + solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real t, tk::real dt ) const; //! Compute and return source term for this problem @@ -54,13 +53,12 @@ class CompFlowProblemSedovBlastwave { void side( std::unordered_set< int >& conf ) const; //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file std::vector< std::string > fieldNames( ncomp_t ) const; //! Return field output going to file std::vector< std::vector< tk::real > > fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t /*ncomp*/, ncomp_t offset, tk::real, tk::real /*V*/, diff --git a/src/PDE/CompFlow/Problem/SodShocktube.cpp b/src/PDE/CompFlow/Problem/SodShocktube.cpp index e7ee8f1b14b..83b867a4f2b 100644 --- a/src/PDE/CompFlow/Problem/SodShocktube.cpp +++ b/src/PDE/CompFlow/Problem/SodShocktube.cpp @@ -14,6 +14,7 @@ #include "SodShocktube.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,7 +26,7 @@ using inciter::CompFlowProblemSodShocktube; tk::SolutionFn::result_type CompFlowProblemSodShocktube::solution( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, tk::real x, tk::real, tk::real, @@ -38,14 +39,16 @@ CompFlowProblemSodShocktube::solution( ncomp_t system, //! \param[in] x X coordinate where to evaluate the solution //! \return Values of all components evaluated at (x) //! \note The function signature must follow tk::SolutionFn +//! \details This function only initializes the Sod shock tube problem, but does +//! not actually give the analytical solution at time greater than 0. The +//! analytical solution would require an exact Riemann solver, which has not +//! been implemented yet. // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; + tk::real r, p, u, v, w, rE; if (x<0.5) { // density @@ -68,19 +71,20 @@ CompFlowProblemSodShocktube::solution( ncomp_t system, w = 0.0; } // total specific energy - rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); + rE = eos_totalenergy< eq >( system, r, u, v, w, p ); return {{ r, r*u, r*v, r*w, rE }}; } std::vector< tk::real > -CompFlowProblemSodShocktube::solinc( ncomp_t system, tk::real x, tk::real y, - tk::real z, tk::real t, tk::real dt ) const +CompFlowProblemSodShocktube::solinc( ncomp_t system, ncomp_t ncomp, tk::real x, + tk::real y, tk::real z, tk::real t, tk::real dt ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) // for all components //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -89,8 +93,8 @@ CompFlowProblemSodShocktube::solinc( ncomp_t system, tk::real x, tk::real y, //! \return Increment in values of all components evaluated at (x,y,z,t+dt) // ***************************************************************************** { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); std::transform( begin(st1), end(st1), begin(st2), begin(st2), []( tk::real s, tk::real& d ){ return d -= s; } ); @@ -175,17 +179,15 @@ CompFlowProblemSodShocktube::fieldOutput( // ***************************************************************************** { // number of degree of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); + const auto r = U.extract( 0*rdof, offset ); + const auto ru = U.extract( 1*rdof, offset ); + const auto rv = U.extract( 2*rdof, offset ); + const auto rw = U.extract( 3*rdof, offset ); + const auto re = U.extract( 4*rdof, offset ); // mesh node coordinates //const auto& x = coord[0]; @@ -248,7 +250,7 @@ CompFlowProblemSodShocktube::fieldOutput( std::vector< tk::real > P( r.size(), 0.0 ); for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); out.push_back( P ); //out.push_back( Pa ); diff --git a/src/PDE/CompFlow/Problem/SodShocktube.h b/src/PDE/CompFlow/Problem/SodShocktube.h deleted file mode 100644 index c1463e17394..00000000000 --- a/src/PDE/CompFlow/Problem/SodShocktube.h +++ /dev/null @@ -1,259 +0,0 @@ -// ***************************************************************************** -/*! - \file src/PDE/CompFlow/Problem/SodShocktube.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Problem configuration for Sod's shock-tube - \details This file defines a policy class for the compressible flow - equations, defined in PDE/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h - for general requirements on Problem policy classes for CompFlow. -*/ -// ***************************************************************************** -#ifndef CompFlowProblemSodShocktube_h -#define CompFlowProblemSodShocktube_h - -#include -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: Sod shock-tube -//! \see G. A. Sod. A Survey of Several Finite Difference Methods for Systems of -//! Nonlinear Hyperbolic Conservation Laws. J. Comput. Phys., 27:1–31, 1978. -class CompFlowProblemSodShocktube { - - protected: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - public: - //! Evaluate analytical solution at (x,y,0) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] x X coordinate where to evaluate the solution - //! \return Values of all components evaluated at (x,y,0) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real, tk::real, - tk::real ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - tk::real r, p, u, v, w, rE; - if (x<0.5) { - // density - r = 1.0; - // pressure - p = 1.0; - // velocity - u = 0.0; - v = 0.0; - w = 0.0; - } - else { - // density - r = 0.125; - // pressure - p = 0.1; - // velocity - u = 0.0; - v = 0.0; - w = 0.0; - } - // total specific energy - rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); - return {{ r, r*u, r*v, r*w, rE }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \param[in] t Time where to evaluate the solution increment starting from - //! \param[in] dt Time increment at which evaluate the solution increment to - //! \return Increment in values of all components evaluated at (x,y,z,t+dt) - static std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) - { - auto st1 = solution( system, m_ncomp, x, y, z, t ); - auto st2 = solution( system, m_ncomp, x, y, z, t+dt ); - std::transform( begin(st1), end(st1), begin(st2), begin(st2), - []( tk::real s, tk::real& d ){ return d -= s; } ); - return st2; - } - - //! Compute and return source term for this problem - //! \return Array of reals containing the source which is zero for this - //! problem - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real ) - { return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; - - for (const auto& s : g_inputdeck.get< param, eq, tag::bcextrapolate >()) - for (const auto& i : s) conf.insert( std::stoi(i) ); - - for (const auto& s : g_inputdeck.get< param, eq, tag::bcsym >()) - for (const auto& i : s) conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - //n.push_back( "density_analytical" ); - n.push_back( "x-velocity_numerical" ); - //n.push_back( "x-velocity_analytical" ); - //n.push_back( "err(u)" ); - n.push_back( "y-velocity_numerical" ); - //n.push_back( "y-velocity_analytical" ); - n.push_back( "z-velocity_numerical" ); - //n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_numerical" ); - //n.push_back( "specific_total_energy_analytical" ); - //n.push_back( "err(E)" ); - n.push_back( "pressure_numerical" ); - //n.push_back( "pressure_analytical" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems -// //! \param[in] V Total mesh volume -// //! \param[in] vol Nodal mesh volumes -// //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real, - tk::real /*V*/, - const std::vector< tk::real >& /*vol*/, - const std::array< std::vector< tk::real >, 3 >& /*coord*/, - tk::Fields& U ) - { - // number of degrees of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); - - // mesh node coordinates - //const auto& x = coord[0]; - //const auto& y = coord[1]; - - out.push_back( r ); - //out.push_back( std::vector< tk::real >( r.size(), 1.0 ) ); - - std::vector< tk::real > u = ru; - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - //std::vector< tk::real > ua = ru; - //for (std::size_t i=0; i v = rv; - //std::vector< tk::real > va = rv; - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - //for (std::size_t i=0; i w = rw; - //std::vector< tk::real > wa = rw; - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - //for (std::size_t i=0; i E = re; - //std::vector< tk::real > Ea = re; - //std::vector< tk::real > Pa( r.size(), 0.0 ); - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - //for (std::size_t i=0; i P( r.size(), 0.0 ); - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::SOD_SHOCKTUBE; } -}; - -} // inciter:: - -#endif // CompFlowProblemSodShocktube_h diff --git a/src/PDE/CompFlow/Problem/SodShocktube.hpp b/src/PDE/CompFlow/Problem/SodShocktube.hpp index 345e67de48f..fc579d6e910 100644 --- a/src/PDE/CompFlow/Problem/SodShocktube.hpp +++ b/src/PDE/CompFlow/Problem/SodShocktube.hpp @@ -31,9 +31,8 @@ namespace inciter { class CompFlowProblemSodShocktube { protected: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components public: //! Evaluate analytical solution at (x,y,0) for all components @@ -44,8 +43,8 @@ class CompFlowProblemSodShocktube { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, tk::real x, tk::real y, tk::real z, tk::real t, - tk::real dt ) const; + solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, + tk::real t, tk::real dt ) const; //! Compute and return source term for this problem static tk::SrcFn::result_type @@ -61,7 +60,7 @@ class CompFlowProblemSodShocktube { //! Return field output going to file std::vector< std::vector< tk::real > > fieldOutput( ncomp_t system, - ncomp_t, + ncomp_t /*ncomp*/, ncomp_t offset, tk::real, tk::real /*V*/, diff --git a/src/PDE/CompFlow/Problem/TaylorGreen.cpp b/src/PDE/CompFlow/Problem/TaylorGreen.cpp index ee9cab0d2cd..68d3bb7343d 100644 --- a/src/PDE/CompFlow/Problem/TaylorGreen.cpp +++ b/src/PDE/CompFlow/Problem/TaylorGreen.cpp @@ -14,6 +14,7 @@ #include "TaylorGreen.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,11 +26,11 @@ using inciter::CompFlowProblemTaylorGreen; tk::SolutionFn::result_type CompFlowProblemTaylorGreen::solution( ncomp_t system, - ncomp_t ncomp, - tk::real x, - tk::real y, - tk::real, - tk::real ) + [[maybe_unused]] ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real, + tk::real ) // ***************************************************************************** //! Evaluate analytical solution at (x,y,z,t) for all components //! \param[in] system Equation system index, i.e., which compressible @@ -41,12 +42,10 @@ CompFlowProblemTaylorGreen::solution( ncomp_t system, //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; using std::sin; using std::cos; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; + // density const tk::real r = 1.0; // pressure @@ -56,13 +55,13 @@ CompFlowProblemTaylorGreen::solution( ncomp_t system, const tk::real v = -cos(M_PI*x) * sin(M_PI*y); const tk::real w = 0.0; // total specific energy - const tk::real rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); + const tk::real rE = eos_totalenergy< eq >( system, r, u, v, w, p ); return {{ r, r*u, r*v, r*w, rE }}; } std::vector< tk::real > -CompFlowProblemTaylorGreen::solinc( ncomp_t, tk::real, tk::real, +CompFlowProblemTaylorGreen::solinc( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) @@ -156,17 +155,15 @@ CompFlowProblemTaylorGreen::fieldOutput( // ***************************************************************************** { // number of degree of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); + const auto r = U.extract( 0*rdof, offset ); + const auto ru = U.extract( 1*rdof, offset ); + const auto rv = U.extract( 2*rdof, offset ); + const auto rw = U.extract( 3*rdof, offset ); + const auto re = U.extract( 4*rdof, offset ); // mesh node coordinates const auto& x = coord[0]; @@ -222,8 +219,8 @@ CompFlowProblemTaylorGreen::fieldOutput( for (std::size_t i=0; i( system, r[i], ua[i]/r[i], va[i]/r[i], + wa[i]/r[i], Pa[i]/r[i] ); } out.push_back( Ea ); @@ -234,7 +231,7 @@ CompFlowProblemTaylorGreen::fieldOutput( std::vector< tk::real > P( r.size(), 0.0 ); for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], r[i]*E[i] ); out.push_back( P ); out.push_back( Pa ); diff --git a/src/PDE/CompFlow/Problem/TaylorGreen.h b/src/PDE/CompFlow/Problem/TaylorGreen.h deleted file mode 100644 index cf52721b373..00000000000 --- a/src/PDE/CompFlow/Problem/TaylorGreen.h +++ /dev/null @@ -1,246 +0,0 @@ -// ***************************************************************************** -/*! - \file src/PDE/CompFlow/Problem/TaylorGreen.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Problem configuration for the compressible flow equations - \details This file defines a policy class for the compressible flow - equations, defined in PDE/CompFlow/CompFlow.h. See PDE/CompFlow/Problem.h - for general requirements on Problem policy classes for CompFlow. -*/ -// ***************************************************************************** -#ifndef CompFlowProblemTaylorGreen_h -#define CompFlowProblemTaylorGreen_h - -#include -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: Taylor-Green -//! \see G.I. Taylor, A.E. Green, "Mechanism of the Production of Small Eddies -//! from Large Ones", Proc. R. Soc. Lond. A 1937 158 499-521; DOI: -//! 10.1098/rspa.1937.0036. Published 3 February 1937 -//! \see Waltz, et. al, "Verification of a three-dimensional unstructured finite -//! element method using analytic and manufactured solutions", Computers and -//! Fluids, 2013, Vol.81, pp.57-67. -class CompFlowProblemTaylorGreen { - - private: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::compflow; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - public: - //! Evaluate analytical solution at (x,y,0) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \return Values of all components evaluated at (x,y,0) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, - tk::real x, tk::real y, tk::real, tk::real ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; using std::sin; using std::cos; - // ratio of specific heats - const tk::real g = g_inputdeck.get< param, eq, tag::gamma >()[system]; - // density - const tk::real r = 1.0; - // pressure - const tk::real p = 10.0 + r/4.0*(cos(2.0*M_PI*x) + cos(2.0*M_PI*y)); - // velocity - const tk::real u = sin(M_PI*x) * cos(M_PI*y); - const tk::real v = -cos(M_PI*x) * sin(M_PI*y); - const tk::real w = 0.0; - // total specific energy - const tk::real rE = p/(g-1.0) + 0.5*r*(u*u + v*v + w*w); - return {{ r, r*u, r*v, r*w, rE }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \return Increment in values of all components: all zero for this problem - static std::vector< tk::real > - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) { - return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; - } - - //! Compute and return source term for Rayleigh-Taylor manufactured solution - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \return Array of reals containing the source for all components - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t, ncomp_t, tk::real x, tk::real y, tk::real, tk::real ) - { - return {{ 0.0, 0.0, 0.0, 0.0, - 3.0*M_PI/8.0*( cos(3.0*M_PI*x)*cos(M_PI*y) - - cos(3.0*M_PI*y)*cos(M_PI*x) ) }}; - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; using tag::bcdir; - for (const auto& s : g_inputdeck.get< param, eq, bcdir >()) - for (const auto& i : s) - conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - n.push_back( "density_analytical" ); - n.push_back( "x-velocity_numerical" ); - n.push_back( "x-velocity_analytical" ); - n.push_back( "err(u)" ); - n.push_back( "y-velocity_numerical" ); - n.push_back( "y-velocity_analytical" ); - n.push_back( "err(v)" ); - n.push_back( "z-velocity_numerical" ); - n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_numerical" ); - n.push_back( "specific_total_energy_analytical" ); - n.push_back( "err(E)" ); - n.push_back( "pressure_numerical" ); - n.push_back( "pressure_analytical" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems - //! \param[in] V Total mesh volume - //! \param[in] vol Nodal mesh volumes - //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real, - tk::real V, - const std::vector< tk::real >& vol, - const std::array< std::vector< tk::real >, 3 >& coord, - tk::Fields& U ) - { - // number of degrees of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; - - std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); - - // mesh node coordinates - const auto& x = coord[0]; - const auto& y = coord[1]; - - out.push_back( r ); - out.push_back( std::vector< tk::real >( r.size(), 1.0 ) ); - - std::vector< tk::real > u = ru; - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - std::vector< tk::real > ua = ru; - for (std::size_t i=0; i v = rv; - std::vector< tk::real > va = rv; - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - for (std::size_t i=0; i w = rw; - std::vector< tk::real > wa = rw; - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - for (std::size_t i=0; i E = re; - std::vector< tk::real > Ea = re; - std::vector< tk::real > Pa( r.size(), 0.0 ); - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - for (std::size_t i=0; i P( r.size(), 0.0 ); - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::TAYLOR_GREEN; } -}; - -} // inciter:: - -#endif // CompFlowProblemTaylorGreen_h diff --git a/src/PDE/CompFlow/Problem/TaylorGreen.hpp b/src/PDE/CompFlow/Problem/TaylorGreen.hpp index 4f925d28ef6..ff4077214f2 100644 --- a/src/PDE/CompFlow/Problem/TaylorGreen.hpp +++ b/src/PDE/CompFlow/Problem/TaylorGreen.hpp @@ -35,7 +35,7 @@ namespace inciter { class CompFlowProblemTaylorGreen { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::compflow; static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components @@ -47,7 +47,8 @@ class CompFlowProblemTaylorGreen { //! \brief Evaluate the increment from t to t+dt of the analytical solution std::vector< tk::real > - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) const; + solinc( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) + const; //! Compute and return source term for Rayleigh-Taylor manufactured solution static tk::SrcFn::result_type @@ -72,7 +73,6 @@ class CompFlowProblemTaylorGreen { tk::Fields& U ) const; //! Return names of integral variables to be output to diagnostics file - //! \return Vector of strings labelling integral variables output std::vector< std::string > names( ncomp_t ) const; //! Return problem type diff --git a/src/PDE/CompFlow/Problem/UserDefined.cpp b/src/PDE/CompFlow/Problem/UserDefined.cpp index 132c1210b0b..397dbedd3b2 100644 --- a/src/PDE/CompFlow/Problem/UserDefined.cpp +++ b/src/PDE/CompFlow/Problem/UserDefined.cpp @@ -14,6 +14,7 @@ #include "UserDefined.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,7 +26,7 @@ using inciter::CompFlowProblemUserDefined; tk::SolutionFn::result_type CompFlowProblemUserDefined::solution( ncomp_t, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, tk::real, tk::real, tk::real, @@ -37,15 +38,13 @@ CompFlowProblemUserDefined::solution( ncomp_t, //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); return {{ 1.0, 0.0, 0.0, 1.0, 293.0 }}; } std::array< tk::real, 5 > -CompFlowProblemUserDefined::solinc( ncomp_t, tk::real, tk::real, +CompFlowProblemUserDefined::solinc( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) @@ -121,13 +120,16 @@ CompFlowProblemUserDefined::fieldOutput( //! \return Vector of vectors to be output to file // ***************************************************************************** { + // number of degrees of freedom + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0, offset ); - const auto ru = U.extract( 1, offset ); - const auto rv = U.extract( 2, offset ); - const auto rw = U.extract( 3, offset ); - const auto re = U.extract( 4, offset ); + const auto r = U.extract( 0*rdof, offset ); + const auto ru = U.extract( 1*rdof, offset ); + const auto rv = U.extract( 2*rdof, offset ); + const auto rw = U.extract( 3*rdof, offset ); + const auto re = U.extract( 4*rdof, offset ); out.push_back( r ); @@ -152,13 +154,12 @@ CompFlowProblemUserDefined::fieldOutput( out.push_back( E ); std::vector< tk::real > p = r; - tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[0]; for (std::size_t i=0; i( 0, r[i], u[i], v[i], w[i], r[i]*E[i] ); out.push_back( p ); std::vector< tk::real > T = r; - tk::real cv = g_inputdeck.get< tag::param, eq, tag::cv >()[0]; + tk::real cv = g_inputdeck.get< tag::param, eq, tag::cv >()[0][0]; for (std::size_t i=0; i - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) const; + solinc( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) + const; //! Compute and return source term for Rayleigh-Taylor manufactured solution static tk::SrcFn::result_type @@ -55,10 +56,6 @@ class CompFlowProblemUserDefined { void side( std::unordered_set< int >& conf ) const; //! Return field output going to file - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file std::vector< std::vector< tk::real > > fieldOutput( ncomp_t, ncomp_t, diff --git a/src/PDE/CompFlow/Problem/VorticalFlow.cpp b/src/PDE/CompFlow/Problem/VorticalFlow.cpp index 22868be00fd..c336a04885c 100644 --- a/src/PDE/CompFlow/Problem/VorticalFlow.cpp +++ b/src/PDE/CompFlow/Problem/VorticalFlow.cpp @@ -14,6 +14,7 @@ #include "VorticalFlow.hpp" #include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -25,7 +26,7 @@ using inciter::CompFlowProblemVorticalFlow; tk::SolutionFn::result_type CompFlowProblemVorticalFlow::solution( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, tk::real x, tk::real y, tk::real z, @@ -42,9 +43,8 @@ CompFlowProblemVorticalFlow::solution( ncomp_t system, //! \note The function signature must follow tk::SolutionFn // ***************************************************************************** { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); using tag::param; using tag::compflow; // manufactured solution parameters @@ -53,7 +53,7 @@ CompFlowProblemVorticalFlow::solution( ncomp_t system, const auto& b = g_inputdeck.get< param, compflow, tag::beta >()[ system ]; const auto& p0 = g_inputdeck.get< param, compflow, tag::p0 >()[ system ]; // ratio of specific heats - tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ]; + tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ][0]; // velocity const tk::real ru = a*x - b*y; const tk::real rv = b*x + a*y; @@ -65,24 +65,26 @@ CompFlowProblemVorticalFlow::solution( ncomp_t system, } std::vector< tk::real > -CompFlowProblemVorticalFlow::solinc( ncomp_t, tk::real, tk::real, +CompFlowProblemVorticalFlow::solinc( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real, tk::real ) const // ***************************************************************************** // Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) // for all components +//! \param[in] ncomp Number of scalar components in this PDE system //! \return Increment in values of all components evaluated at (x,y,z,t+dt) // ***************************************************************************** { - return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; + return std::vector< tk::real >( ncomp, 0.0 ); } tk::SrcFn::result_type -CompFlowProblemVorticalFlow::src( ncomp_t system, ncomp_t, tk::real x, +CompFlowProblemVorticalFlow::src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, tk::real ) // ***************************************************************************** // Compute and return source term for manufactured solution //! \param[in] system Equation system index, i.e., which compressible //! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] x X coordinate where to evaluate the solution //! \param[in] y Y coordinate where to evaluate the solution //! \param[in] z Z coordinate where to evaluate the solution @@ -97,10 +99,10 @@ CompFlowProblemVorticalFlow::src( ncomp_t system, ncomp_t, tk::real x, g_inputdeck.get< param, compflow, tag::alpha >()[ system ]; const auto& b = g_inputdeck.get< param, compflow, tag::beta >()[ system ]; // ratio of specific heats - tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ]; + tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ][0]; // evaluate solution at x,y,z - auto s = solution( system, m_ncomp, x, y, z, 0.0 ); - std::vector< tk::real > r( m_ncomp ); + auto s = solution( system, ncomp, x, y, z, 0.0 ); + std::vector< tk::real > r( ncomp ); // density source r[0] = 0.0; // momentum source @@ -182,18 +184,18 @@ CompFlowProblemVorticalFlow::fieldOutput( const auto& p0 = g_inputdeck.get< tag::param, tag::compflow, tag::p0 >()[system]; // number of degree of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); // ratio of specific heats tk::real g = - g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[system]; + g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[system][0]; std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); + const auto r = U.extract( 0*rdof, offset ); + const auto ru = U.extract( 1*rdof, offset ); + const auto rv = U.extract( 2*rdof, offset ); + const auto rw = U.extract( 3*rdof, offset ); + const auto re = U.extract( 4*rdof, offset ); // mesh node coordinates const auto& x = coord[0]; @@ -235,7 +237,7 @@ CompFlowProblemVorticalFlow::fieldOutput( std::vector< tk::real > P( r.size(), 0.0 ); for (std::size_t i=0; i( system, r[i], u[i], v[i], w[i], re[i] ); out.push_back( P ); for (std::size_t i=0; i -#include - -#include "Types.h" -#include "FunctionPrototypes.h" -#include "Inciter/Options/Problem.h" - -namespace inciter { - -//! CompFlow system of PDEs problem: vortical flow -//! \see Waltz, et. al, "Manufactured solutions for the three-dimensional Euler -//! equations with relevance to Inertial Confinement Fusion", Journal of -//! Computational Physics 267 (2014) 196-209. -class CompFlowProblemVorticalFlow { - - private: - using ncomp_t = tk::ctr::ncomp_type; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components - - public: - //! Evaluate analytical solution at (x,y,z) for all components - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \return Values of all components evaluated at (x,y,z) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, - tk::real ) - { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(ncomp); - using tag::param; using tag::compflow; - // manufactured solution parameters - const auto& a = - g_inputdeck.get< param, compflow, tag::alpha >()[ system ]; - const auto& b = g_inputdeck.get< param, compflow, tag::beta >()[ system ]; - const auto& p0 = g_inputdeck.get< param, compflow, tag::p0 >()[ system ]; - // ratio of specific heats - tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ]; - // velocity - const tk::real ru = a*x - b*y; - const tk::real rv = b*x + a*y; - const tk::real rw = -2.0*a*z; - // total specific energy - const tk::real rE = (ru*ru+rv*rv+rw*rw)/2.0 + (p0-2.0*a*a*z*z)/(g-1.0); - return {{ 1.0, ru, rv, rw, rE }}; - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \return Increment in values of all components: all zero for this problem - static std::vector< tk::real > - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) { - return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; - } - - //! Compute and return source term for vortical flow manufactured solution - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] x X coordinate where to evaluate the solution - //! \param[in] y Y coordinate where to evaluate the solution - //! \param[in] z Z coordinate where to evaluate the solution - //! \return Array of reals containing the source for all components - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, tk::real ) - { - using tag::param; using tag::compflow; - // manufactured solution parameters - const auto& a = - g_inputdeck.get< param, compflow, tag::alpha >()[ system ]; - const auto& b = g_inputdeck.get< param, compflow, tag::beta >()[ system ]; - // ratio of specific heats - tk::real g = g_inputdeck.get< param, compflow, tag::gamma >()[ system ]; - // evaluate solution at x,y,z - auto s = solution( system, m_ncomp, x, y, z, 0.0 ); - std::vector< tk::real > r( m_ncomp ); - // density source - r[0] = 0.0; - // momentum source - r[1] = a*s[1]/s[0] - b*s[2]/s[0]; - r[2] = b*s[1]/s[0] + a*s[2]/s[0]; - r[3] = 0.0; - // energy source - r[4] = (r[1]*s[1] + r[2]*s[2])/s[0] + 8.0*a*a*a*z*z/(g-1.0); - return r; - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; using tag::compflow; using tag::bcdir; - for (const auto& s : g_inputdeck.get< param, compflow, bcdir >()) - for (const auto& i : s) - conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ) { - std::vector< std::string > n; - n.push_back( "density_numerical" ); - n.push_back( "density_analytical" ); - n.push_back( "x-velocity_numerical" ); - n.push_back( "x-velocity_analytical" ); - n.push_back( "y-velocity_numerical" ); - n.push_back( "y-velocity_analytical" ); - n.push_back( "z-velocity_numerical" ); - n.push_back( "z-velocity_analytical" ); - n.push_back( "specific_total_energy_numerical" ); - n.push_back( "specific_total_energy_analytical" ); - n.push_back( "pressure_numerical" ); - n.push_back( "pressure_analytical" ); - - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); - if(pref) // Adaptive DG on - n.push_back( "ndof" ); - return n; - } - - //! Return field output going to file - //! \param[in] system Equation system index, i.e., which compressible - //! flow equation system we operate on among the systems of PDEs - //! \param[in] offset System offset specifying the position of the system of - //! PDEs among other systems - //! \param[in] coord Mesh node coordinates - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t system, - ncomp_t, - ncomp_t offset, - tk::real, - tk::real, - const std::vector< tk::real >&, - const std::array< std::vector< tk::real >, 3 >& coord, - tk::Fields& U ) - { - // manufactured solution parameters - const auto& a = - g_inputdeck.get< tag::param, tag::compflow, tag::alpha >()[system]; - const auto& b = - g_inputdeck.get< tag::param, tag::compflow, tag::beta >()[system]; - const auto& p0 = - g_inputdeck.get< tag::param, tag::compflow, tag::p0 >()[system]; - // number of degrees of freedom - const std::size_t ndof = - g_inputdeck.get< tag::discr, tag::ndof >(); - // ratio of specific heats - tk::real g = - g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[system]; - - std::vector< std::vector< tk::real > > out; - const auto r = U.extract( 0*ndof, offset ); - const auto ru = U.extract( 1*ndof, offset ); - const auto rv = U.extract( 2*ndof, offset ); - const auto rw = U.extract( 3*ndof, offset ); - const auto re = U.extract( 4*ndof, offset ); - - // mesh node coordinates - const auto& x = coord[0]; - const auto& y = coord[1]; - const auto& z = coord[2]; - - out.push_back( r ); - out.push_back( std::vector< tk::real >( r.size(), 1.0 ) ); - - std::vector< tk::real > u = ru; - std::transform( r.begin(), r.end(), u.begin(), u.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( u ); - for (std::size_t i=0; i v = rv; - std::transform( r.begin(), r.end(), v.begin(), v.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( v ); - for (std::size_t i=0; i w = rw; - std::transform( r.begin(), r.end(), w.begin(), w.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( w ); - for (std::size_t i=0; i E = re; - std::transform( r.begin(), r.end(), E.begin(), E.begin(), - []( tk::real s, tk::real& d ){ return d /= s; } ); - out.push_back( E ); - for (std::size_t i=0; i P( r.size(), 0.0 ); - for (std::size_t i=0; i names( ncomp_t ) - { return { "r", "ru", "rv", "rw", "re" }; } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::VORTICAL_FLOW; } -}; - -} // inciter:: - -#endif // CompFlowProblemVorticalFlow_h diff --git a/src/PDE/CompFlow/Problem/VorticalFlow.hpp b/src/PDE/CompFlow/Problem/VorticalFlow.hpp index 16019098cb5..df03b47d154 100644 --- a/src/PDE/CompFlow/Problem/VorticalFlow.hpp +++ b/src/PDE/CompFlow/Problem/VorticalFlow.hpp @@ -34,8 +34,8 @@ namespace inciter { class CompFlowProblemVorticalFlow { private: - using ncomp_t = tk::ctr::ncomp_type; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components + using ncomp_t = tk::ctr::ncomp_t; + using eq = tag::compflow; public: //! Evaluate analytical solution at (x,y,z) for all components @@ -46,11 +46,13 @@ class CompFlowProblemVorticalFlow { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) const; + solinc( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real, + tk::real ) const; //! Compute and return source term for vortical flow manufactured solution static tk::SrcFn::result_type - src( ncomp_t system, ncomp_t, tk::real x, tk::real y, tk::real z, tk::real ); + src( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, + tk::real ); //! \brief Query all side set IDs the user has configured for all components //! in this PDE system @@ -71,7 +73,6 @@ class CompFlowProblemVorticalFlow { tk::Fields& U ) const; //! Return names of integral variables to be output to diagnostics file - //! \return Vector of strings labelling integral variables output std::vector< std::string > names( ncomp_t ) const; //! Return problem type diff --git a/src/PDE/ConfigureCompFlow.cpp b/src/PDE/ConfigureCompFlow.cpp index c6b5b563d3e..e707a0cad24 100644 --- a/src/PDE/ConfigureCompFlow.cpp +++ b/src/PDE/ConfigureCompFlow.cpp @@ -60,13 +60,15 @@ registerCompFlow( CGFactory& cf, } std::vector< std::pair< std::string, std::string > > -infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ) +infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the compressible flow system of PDEs //! \param[inout] cnt std::map of counters for all PDE types //! \return vector of string pairs describing the PDE configuration // ***************************************************************************** { + using eq = tag::compflow; + auto c = ++cnt[ ctr::PDEType::COMPFLOW ]; // count eqs --c; // used to index vectors starting with 0 @@ -75,72 +77,74 @@ infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ) nfo.emplace_back( ctr::PDE().name( ctr::PDEType::COMPFLOW ), "" ); nfo.emplace_back( "dependent variable", std::string( 1, - g_inputdeck.get< tag::param, tag::compflow, tag::depvar >()[c] ) ); + g_inputdeck.get< tag::param, eq, tag::depvar >()[c] ) ); nfo.emplace_back( "physics", ctr::Physics().name( - g_inputdeck.get< tag::param, tag::compflow, tag::physics >()[c] ) ); + g_inputdeck.get< tag::param, eq, tag::physics >()[c] ) ); nfo.emplace_back( "problem", ctr::Problem().name( - g_inputdeck.get< tag::param, tag::compflow, tag::problem >()[c] ) ); + g_inputdeck.get< tag::param, eq, tag::problem >()[c] ) ); - auto ncomp = g_inputdeck.get< tag::component >().get< tag::compflow >()[c]; + auto ncomp = g_inputdeck.get< tag::component >().get< eq >()[c]; nfo.emplace_back( "number of components", std::to_string( ncomp ) ); nfo.emplace_back( "start offset in unknowns array", std::to_string( - g_inputdeck.get< tag::component >().offset< tag::compflow >(c) ) ); + g_inputdeck.get< tag::component >().offset< eq >(c) ) ); - nfo.emplace_back( "material id", parameters( - g_inputdeck.get< tag::param, tag::compflow, tag::id >() ) ); + const auto& gamma = g_inputdeck.get< tag::param, eq, tag::gamma >()[c]; + if (!gamma.empty()) + nfo.emplace_back( "ratio of specific heats", std::to_string( gamma[0] )) ; - nfo.emplace_back( "ratio of specific heats", parameters( - g_inputdeck.get< tag::param, tag::compflow, tag::gamma >() ) ); + const auto& pstiff = g_inputdeck.get< tag::param, eq, tag::pstiff >()[c]; + if (!pstiff.empty()) + nfo.emplace_back( "material stiffness", std::to_string( pstiff[0] ) ); - const auto& mu = g_inputdeck.get< tag::param, tag::compflow, tag::mu >(); - if (!mu.empty()) - nfo.emplace_back( "dynamic viscosity", parameters( mu ) ); + // Viscosity is optional: the outer vector may be empty + const auto& mu = g_inputdeck.get< tag::param, eq, tag::mu >(); + if (mu.size() > c) + nfo.emplace_back( "dynamic viscosity", std::to_string( mu[c][0] ) ); - const auto& cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >(); + const auto& cv = g_inputdeck.get< tag::param, eq, tag::cv >()[c]; if (!cv.empty()) - nfo.emplace_back( "specific heat at const. volume", parameters( cv ) ); + nfo.emplace_back( "specific heat at const. volume", std::to_string(cv[0]) ); - const auto& k = g_inputdeck.get< tag::param, tag::compflow, tag::k >(); - if (!k.empty()) - nfo.emplace_back( "heat conductivity", parameters( k ) ); + // Heat conductivity is optional: the outer vector may be empty + const auto& k = g_inputdeck.get< tag::param, eq, tag::k >(); + if (k.size() > c) + nfo.emplace_back( "heat conductivity", std::to_string( k[c][0] ) ); - const auto& npar = g_inputdeck.get< tag::param, tag::compflow, tag::npar >(); + const auto& npar = g_inputdeck.get< tag::param, eq, tag::npar >(); if (!npar.empty()) nfo.emplace_back( "number of tracker particles", parameters( npar ) ); - const auto& alpha = g_inputdeck.get< tag::param, tag::compflow, tag::alpha >(); + const auto& alpha = g_inputdeck.get< tag::param, eq, tag::alpha >(); if (!alpha.empty()) nfo.emplace_back( "coeff alpha", parameters( alpha ) ); const auto& beta = - g_inputdeck.get< tag::param, tag::compflow, tag::beta >(); + g_inputdeck.get< tag::param, eq, tag::beta >(); if (!beta.empty()) nfo.emplace_back( "coeff beta", parameters( beta ) ); - const auto& bx = g_inputdeck.get< tag::param, tag::compflow, tag::betax >(); + const auto& bx = g_inputdeck.get< tag::param, eq, tag::betax >(); if (!bx.empty()) nfo.emplace_back( "coeff betax", parameters( bx ) ); - const auto& by = g_inputdeck.get< tag::param, tag::compflow, tag::betay >(); + const auto& by = g_inputdeck.get< tag::param, eq, tag::betay >(); if (!by.empty()) nfo.emplace_back( "coeff betay", parameters( by ) ); - const auto& bz = g_inputdeck.get< tag::param, tag::compflow, tag::betaz >(); + const auto& bz = g_inputdeck.get< tag::param, eq, tag::betaz >(); if (!bz.empty()) nfo.emplace_back( "coeff betaz", parameters( bz ) ); - const auto& r0 = g_inputdeck.get< tag::param, tag::compflow, tag::r0 >(); + const auto& r0 = g_inputdeck.get< tag::param, eq, tag::r0 >(); if (!r0.empty()) nfo.emplace_back( "coeff r0", parameters( r0 ) ); - const auto& ce = g_inputdeck.get< tag::param, tag::compflow, tag::ce >(); + const auto& ce = g_inputdeck.get< tag::param, eq, tag::ce >(); if (!ce.empty()) nfo.emplace_back( "coeff ce", parameters( ce ) ); - const auto& kappa = g_inputdeck.get< tag::param, tag::compflow, tag::kappa >(); + const auto& kappa = g_inputdeck.get< tag::param, eq, tag::kappa >(); if (!kappa.empty()) nfo.emplace_back( "coeff k", parameters( kappa ) ); - const auto& p0 = - g_inputdeck.get< tag::param, tag::compflow, tag::p0 >(); - if (!p0.empty()) - nfo.emplace_back( "coeff p0", parameters( p0 ) ); + const auto& p0 = g_inputdeck.get< tag::param, eq, tag::p0 >(); + if (!p0.empty()) nfo.emplace_back( "coeff p0", parameters( p0 ) ); return nfo; } diff --git a/src/PDE/ConfigureCompFlow.hpp b/src/PDE/ConfigureCompFlow.hpp index e68066ea170..83352d36dc8 100644 --- a/src/PDE/ConfigureCompFlow.hpp +++ b/src/PDE/ConfigureCompFlow.hpp @@ -31,7 +31,7 @@ registerCompFlow( CGFactory& cf, //! Return information on the compressible flow PDE std::vector< std::pair< std::string, std::string > > -infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ); +infoCompFlow( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ); } // inciter:: diff --git a/src/PDE/ConfigureMultiMat.cpp b/src/PDE/ConfigureMultiMat.cpp index 97e0dcffc5d..5345b4ce701 100644 --- a/src/PDE/ConfigureMultiMat.cpp +++ b/src/PDE/ConfigureMultiMat.cpp @@ -48,7 +48,7 @@ registerMultiMat( DGFactory& df, std::set< ctr::PDEType >& dgt ) } std::vector< std::pair< std::string, std::string > > -infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ) +infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the compressible flow system of PDEs //! \param[inout] cnt std::map of counters for all PDE types @@ -82,22 +82,24 @@ infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ) nfo.emplace_back( "start offset in unknowns array", std::to_string( g_inputdeck.get< tag::component >().offset< eq >(c) ) ); - nfo.emplace_back( "material id", parameters( - g_inputdeck.get< tag::param, eq, tag::id >() ) ); - nfo.emplace_back( "ratio of specific heats", parameters( - g_inputdeck.get< tag::param, eq, tag::gamma >() ) ); + g_inputdeck.get< tag::param, eq, tag::gamma >()[c] ) ); + + // Viscosity is optional: the outer vector may be empty + const auto& mu = g_inputdeck.get< tag::param, eq, tag::mu >(); + if (mu.size() > c) + nfo.emplace_back( "dynamic viscosity", parameters( mu[c] ) ); - const auto& alpha = g_inputdeck.get< tag::param, eq, tag::alpha >(); - if (!alpha.empty()) nfo.emplace_back( "coeff alpha", parameters( alpha ) ); + nfo.emplace_back( "specific heat at constant volume", parameters( + g_inputdeck.get< tag::param, eq, tag::cv >()[c] ) ); - const auto& beta = g_inputdeck.get< tag::param, eq, tag::beta >(); - if (!beta.empty()) - nfo.emplace_back( "coeff beta", parameters( beta ) ); + // Heat conductivity is optional: the outer vector may be empty + const auto& k = g_inputdeck.get< tag::param, eq, tag::k >(); + if (k.size() > c) + nfo.emplace_back( "heat conductivity", parameters( k[c] ) ); - const auto& p0 = g_inputdeck.get< tag::param, eq, tag::p0 >(); - if (!p0.empty()) - nfo.emplace_back( "coeff p0", parameters( p0 ) ); + nfo.emplace_back( "material stiffness", parameters( + g_inputdeck.get< tag::param, eq, tag::pstiff >()[c] ) ); return nfo; } diff --git a/src/PDE/ConfigureMultiMat.hpp b/src/PDE/ConfigureMultiMat.hpp index e4399735b96..a5cb9f8adeb 100644 --- a/src/PDE/ConfigureMultiMat.hpp +++ b/src/PDE/ConfigureMultiMat.hpp @@ -30,7 +30,7 @@ registerMultiMat( DGFactory& df, std::set< ctr::PDEType >& dgt ); //! Return information on the multi-material compressible flow PDE std::vector< std::pair< std::string, std::string > > -infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ); +infoMultiMat( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ); } // inciter:: diff --git a/src/PDE/ConfigureTransport.cpp b/src/PDE/ConfigureTransport.cpp index cbef66ad692..675a161ddd3 100644 --- a/src/PDE/ConfigureTransport.cpp +++ b/src/PDE/ConfigureTransport.cpp @@ -60,7 +60,7 @@ registerTransport( CGFactory& cf, } std::vector< std::pair< std::string, std::string > > -infoTransport( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ) +infoTransport( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ) // ***************************************************************************** // Return information on the transport PDE //! \param[inout] cnt std::map of counters for all PDE types diff --git a/src/PDE/ConfigureTransport.hpp b/src/PDE/ConfigureTransport.hpp index 4263f7806e5..b2eee3c77e9 100644 --- a/src/PDE/ConfigureTransport.hpp +++ b/src/PDE/ConfigureTransport.hpp @@ -31,7 +31,7 @@ registerTransport( CGFactory& cf, //! Return information on the transport PDE std::vector< std::pair< std::string, std::string > > -infoTransport( std::map< ctr::PDEType, tk::ctr::ncomp_type >& cnt ); +infoTransport( std::map< ctr::PDEType, tk::ctr::ncomp_t >& cnt ); } // inciter:: diff --git a/src/PDE/DGPDE.hpp b/src/PDE/DGPDE.hpp index 7f2c6420497..0e4c917e926 100644 --- a/src/PDE/DGPDE.hpp +++ b/src/PDE/DGPDE.hpp @@ -22,10 +22,11 @@ #include #include #include +#include #include +#include #include "Types.hpp" -#include "Make_unique.hpp" #include "Fields.hpp" #include "FaceData.hpp" #include "UnsMesh.hpp" @@ -46,12 +47,15 @@ class DGPDE { using ncomp_t = kw::ncomp::info::expect::type; public: + //! Default constructor taking no arguments for Charm++ + explicit DGPDE() = default; + //! \brief Constructor taking an object modeling Concept. //! \details The object of class T comes pre-constructed. //! \param[in] x Instantiated object of type T given by the template //! argument. template< typename T > explicit DGPDE( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ) {} + self( std::make_unique< Model >( std::move(x) ) ) {} //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept. @@ -73,9 +77,13 @@ class DGPDE { //! \param[in] args Zero or more constructor arguments template< typename T, typename...Args > explicit DGPDE( std::function x, Args&&... args ) : - self( tk::make_unique< Model >( + self( std::make_unique< Model >( std::move( x( std::forward(args)... ) ) ) ) {} + //! Public interface to find number of primitive quantities for the diff eq + std::size_t nprim() const + { return self->nprim(); } + //! Public interface to setting the initial conditions for the diff eq void initialize( const tk::Fields& L, const std::vector< std::size_t >& inpoel, @@ -89,6 +97,39 @@ class DGPDE { void lhs( const tk::Fields& geoElem, tk::Fields& l ) const { self->lhs( geoElem, l ); } + //! Public interface to updating the primitives for the diff eq + void updatePrimitives( const tk::Fields& unk, + tk::Fields& prim, + std::size_t nielem ) const + { self->updatePrimitives( unk, prim, nielem ); } + + //! Public interface to reconstructing the second-order solution + void reconstruct( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + tk::Fields& U, + tk::Fields& P ) const + { + self->reconstruct( t, geoFace, geoElem, fd, inpoel, coord, U, P ); + } + + //! Public interface to limiting the second-order solution + void limit( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + const std::vector< std::size_t >& ndofel, + tk::Fields& U, + tk::Fields& P ) const + { + self->limit( t, geoFace, geoElem, fd, inpoel, coord, ndofel, U, P ); + } + //! Public interface to computing the P1 right-hand side vector void rhs( tk::real t, const tk::Fields& geoFace, @@ -97,10 +138,11 @@ class DGPDE { const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, const tk::Fields& U, + const tk::Fields& P, const std::vector< std::size_t >& ndofel, tk::Fields& R ) const { - self->rhs( t, geoFace, geoElem, fd, inpoel, coord, U, ndofel, R ); + self->rhs( t, geoFace, geoElem, fd, inpoel, coord, U, P, ndofel, R ); } //! Public interface for computing the minimum time step size @@ -109,8 +151,9 @@ class DGPDE { const inciter::FaceData& fd, const tk::Fields& geoFace, const tk::Fields& geoElem, + const std::vector< std::size_t >& ndofel, const tk::Fields& U ) const - { return self->dt( coord, inpoel, fd, geoFace, geoElem, U ); } + { return self->dt( coord, inpoel, fd, geoFace, geoElem, ndofel, U ); } //! \brief Public interface for collecting all side set IDs the user has //! configured for all components of a PDE system @@ -160,6 +203,7 @@ class DGPDE { Concept( const Concept& ) = default; virtual ~Concept() = default; virtual Concept* copy() const = 0; + virtual std::size_t nprim() const = 0; virtual void initialize( const tk::Fields&, const std::vector< std::size_t >&, const tk::UnsMesh::Coords&, @@ -167,6 +211,26 @@ class DGPDE { tk::real, const std::size_t nielem ) const = 0; virtual void lhs( const tk::Fields&, tk::Fields& ) const = 0; + virtual void updatePrimitives( const tk::Fields&, + tk::Fields&, + std::size_t ) const = 0; + virtual void reconstruct( tk::real, + const tk::Fields&, + const tk::Fields&, + const inciter::FaceData&, + const std::vector< std::size_t >&, + const tk::UnsMesh::Coords&, + tk::Fields&, + tk::Fields& ) const = 0; + virtual void limit( tk::real, + const tk::Fields&, + const tk::Fields&, + const inciter::FaceData&, + const std::vector< std::size_t >&, + const tk::UnsMesh::Coords&, + const std::vector< std::size_t >&, + tk::Fields&, + tk::Fields& ) const = 0; virtual void rhs( tk::real, const tk::Fields&, const tk::Fields&, @@ -174,6 +238,7 @@ class DGPDE { const std::vector< std::size_t >&, const tk::UnsMesh::Coords&, const tk::Fields&, + const tk::Fields&, const std::vector< std::size_t >&, tk::Fields& ) const = 0; virtual tk::real dt( const std::array< std::vector< tk::real >, 3 >&, @@ -181,6 +246,7 @@ class DGPDE { const inciter::FaceData&, const tk::Fields&, const tk::Fields&, + const std::vector< std::size_t >&, const tk::Fields& ) const = 0; virtual void side( std::unordered_set< int >& conf ) const = 0; virtual std::vector< std::string > fieldNames() const = 0; @@ -204,6 +270,8 @@ class DGPDE { struct Model : Concept { explicit Model( T x ) : data( std::move(x) ) {} Concept* copy() const override { return new Model( *this ); } + std::size_t nprim() const override + { return data.nprim(); } void initialize( const tk::Fields& L, const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, @@ -213,6 +281,33 @@ class DGPDE { const override { data.initialize( L, inpoel, coord, unk, t, nielem ); } void lhs( const tk::Fields& geoElem, tk::Fields& l ) const override { data.lhs( geoElem, l ); } + void updatePrimitives( const tk::Fields& unk, + tk::Fields& prim, + std::size_t nielem ) + const override { data.updatePrimitives( unk, prim, nielem ); } + void reconstruct( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + tk::Fields& U, + tk::Fields& P ) const override + { + data.reconstruct( t, geoFace, geoElem, fd, inpoel, coord, U, P ); + } + void limit( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + const std::vector< std::size_t >& ndofel, + tk::Fields& U, + tk::Fields& P ) const override + { + data.limit( t, geoFace, geoElem, fd, inpoel, coord, ndofel, U, P ); + } void rhs( tk::real t, const tk::Fields& geoFace, const tk::Fields& geoElem, @@ -220,18 +315,20 @@ class DGPDE { const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, const tk::Fields& U, + const tk::Fields& P, const std::vector< std::size_t >& ndofel, tk::Fields& R ) const override { - data.rhs( t, geoFace, geoElem, fd, inpoel, coord, U, ndofel, R ); + data.rhs( t, geoFace, geoElem, fd, inpoel, coord, U, P, ndofel, R ); } tk::real dt( const std::array< std::vector< tk::real >, 3 >& coord, const std::vector< std::size_t >& inpoel, const inciter::FaceData& fd, const tk::Fields& geoFace, const tk::Fields& geoElem, + const std::vector< std::size_t >& ndofel, const tk::Fields& U ) const override - { return data.dt( coord, inpoel, fd, geoFace, geoElem, U ); } + { return data.dt( coord, inpoel, fd, geoFace, geoElem, ndofel, U ); } void side( std::unordered_set< int >& conf ) const override { data.side( conf ); } std::vector< std::string > fieldNames() const override diff --git a/src/PDE/EoS/EoS.hpp b/src/PDE/EoS/EoS.hpp new file mode 100644 index 00000000000..ad0d5a8e945 --- /dev/null +++ b/src/PDE/EoS/EoS.hpp @@ -0,0 +1,146 @@ +// ***************************************************************************** +/*! + \file src/PDE/EoS/EoS.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Equation of state class + \details This file defines functions for equations of state for the + compressible flow equations. +*/ +// ***************************************************************************** +#ifndef EoS_h +#define EoS_h + +#include "Data.hpp" +#include "Inciter/InputDeck/InputDeck.hpp" + +namespace inciter { + +extern ctr::InputDeck g_inputdeck; + +using ncomp_t = kw::ncomp::info::expect::type; + +//! \brief Calculate density from the material pressure and temperature using +//! the stiffened-gas equation of state +//! \tparam Eq Equation type to operate on, e.g., tag::compflow, tag::multimat +//! \param[in] system Equation system index +//! \param[in] pr Material pressure +//! \param[in] temp Material temperature +//! \param[in] imat Material-id who's EoS is required. Default is 0, so that +//! for the single-material system, this argument can be left unspecified by +//! the calling code +//! \return Material density calculated using the stiffened-gas EoS +template< class Eq > +tk::real eos_density( ncomp_t system, + tk::real pr, + tk::real temp, + std::size_t imat=0 ) +{ + // query input deck to get gamma, p_c + auto g = + g_inputdeck.get< tag::param, Eq, tag::gamma >()[ system ][imat]; + auto p_c = + g_inputdeck.get< tag::param, Eq, tag::pstiff >()[ system ][imat]; + auto cv = + g_inputdeck.get< tag::param, Eq, tag::cv >()[ system ][imat]; + + tk::real rho = (pr + p_c) / ((g-1.0) * cv * temp); + return rho; +} + +//! \brief Calculate pressure from the material density, momentum and total +//! energy using the stiffened-gas equation of state +//! \tparam Eq Equation type to operate on, e.g., tag::compflow, tag::multimat +//! \param[in] system Equation system index +//! \param[in] rho Material density +//! \param[in] u X-velocity +//! \param[in] v Y-velocity +//! \param[in] w Z-velocity +//! \param[in] rhoE Material total energy +//! \param[in] imat Material-id who's EoS is required. Default is 0, so that +//! for the single-material system, this argument can be left unspecified by +//! the calling code +//! \return Material pressure calculated using the stiffened-gas EoS +template< class Eq > +tk::real eos_pressure( ncomp_t system, + tk::real rho, + tk::real u, + tk::real v, + tk::real w, + tk::real rhoE, + std::size_t imat=0 ) +{ + // query input deck to get gamma, p_c + auto g = + g_inputdeck.get< tag::param, Eq, tag::gamma >()[ system ][imat]; + auto p_c = + g_inputdeck.get< tag::param, Eq, tag::pstiff >()[ system ][imat]; + + tk::real pressure = (rhoE - 0.5 * rho * (u*u + v*v + w*w) - p_c) + * (g-1.0) - p_c; + return pressure; +} + +//! Calculate speed of sound from the material density and material pressure +//! \tparam Eq Equation type to operate on, e.g., tag::compflow, tag::multimat +//! \param[in] system Equation system index +//! \param[in] rho Material density +//! \param[in] pr Material pressure +//! \param[in] imat Material-id who's EoS is required. Default is 0, so that +//! for the single-material system, this argument can be left unspecified by +//! the calling code +//! \return Material speed of sound using the stiffened-gas EoS +template< class Eq > +tk::real eos_soundspeed( ncomp_t system, + tk::real rho, tk::real pr, + std::size_t imat=0 ) +{ + // query input deck to get gamma, p_c + auto g = + g_inputdeck.get< tag::param, Eq, tag::gamma >()[ system ][imat]; + auto p_c = + g_inputdeck.get< tag::param, Eq, tag::pstiff >()[ system ][imat]; + + auto p_eff = std::max( 1.0e-15, pr+p_c ); + + tk::real a = std::sqrt( g * p_eff / rho ); + return a; +} + +//! \brief Calculate material specific total energy from the material density, +//! momentum and material pressure +//! \tparam Eq Equation type to operate on, e.g., tag::compflow, tag::multimat +//! \param[in] system Equation system index +//! \param[in] rho Material density +//! \param[in] u X-velocity +//! \param[in] v Y-velocity +//! \param[in] w Z-velocity +//! \param[in] pr Material pressure +//! \param[in] imat Material-id who's EoS is required. Default is 0, so that +//! for the single-material system, this argument can be left unspecified by +//! the calling code +//! \return Material specific total energy using the stiffened-gas EoS +template< class Eq > +tk::real eos_totalenergy( ncomp_t system, + tk::real rho, + tk::real u, + tk::real v, + tk::real w, + tk::real pr, + std::size_t imat=0 ) +{ + // query input deck to get gamma, p_c + auto g = + g_inputdeck.get< tag::param, Eq, tag::gamma >()[ system ][imat]; + auto p_c = + g_inputdeck.get< tag::param, Eq, tag::pstiff >()[ system ][imat]; + + tk::real rhoE = (pr + p_c) / (g-1.0) + 0.5 * rho * (u*u + v*v + w*w) + p_c; + return rhoE; +} + +} //inciter:: + +#endif // EoS_h diff --git a/src/PDE/Integrate/Basis.cpp b/src/PDE/Integrate/Basis.cpp index cc6ab06e647..0a060c47ccd 100644 --- a/src/PDE/Integrate/Basis.cpp +++ b/src/PDE/Integrate/Basis.cpp @@ -86,10 +86,10 @@ tk::eval_dBdx_p1( const std::size_t ndof, { // The derivatives of the basis functions dB/dx are easily calculated // via a transformation to the reference space as, - // dB/dx = dB/dX . dx/dxi, + // dB/dx = dB/dxi . dxi/dx, // where, x = (x,y,z) are the physical coordinates, and // xi = (xi, eta, zeta) are the reference coordinates. - // The matrix dx/dxi is the inverse of the Jacobian of transformation + // The matrix dxi/dx is the inverse of the Jacobian of transformation // and the matrix vector product has to be calculated. This follows. std::array< std::vector, 3 > dBdx; @@ -155,9 +155,8 @@ tk::eval_dBdx_p2( const std::size_t igp, std::array< std::vector, 3 >& dBdx ) // ***************************************************************************** // Compute the derivatives of basis function for DG(P2) -//! \param[in] ndof Number of degrees of freedom //! \param[in] igp Index of quadrature points -//! \param[in] coord Array of nodal coordinates for tetrahedron element +//! \param[in] coordgp Gauss point coordinates for tetrahedron element //! \param[in] jacInv Array of the inverse of Jacobian //! \param[in,out] dBdx Array of the derivatives of basis function // ***************************************************************************** @@ -329,6 +328,8 @@ tk::eval_state ( ncomp_t ncomp, { Assert( B.size() == ndof_el, "Size mismatch" ); + if (U.empty()) return {}; + // Array of state variable for tetrahedron element std::vector< tk::real > state( ncomp ); diff --git a/src/PDE/Integrate/Boundary.cpp b/src/PDE/Integrate/Boundary.cpp index 14dc299a5a6..67b52bce051 100644 --- a/src/PDE/Integrate/Boundary.cpp +++ b/src/PDE/Integrate/Boundary.cpp @@ -23,8 +23,10 @@ void tk::bndSurfInt( ncomp_t system, ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, + const std::size_t rdof, const std::vector< bcconf_t >& bcconfig, const inciter::FaceData& fd, const Fields& geoFace, @@ -35,8 +37,10 @@ tk::bndSurfInt( ncomp_t system, const VelFn& vel, const StateFn& state, const Fields& U, + const Fields& P, const std::vector< std::size_t >& ndofel, - Fields& R ) + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ) // ***************************************************************************** //! Compute boundary surface flux integrals for a given boundary type for DG //! \details This function computes contributions from surface integrals along @@ -44,8 +48,10 @@ tk::bndSurfInt( ncomp_t system, //! function //! \param[in] system Equation system index //! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] nmat Number of materials in this PDE system //! \param[in] offset Offset this PDE system operates from //! \param[in] ndof Maximum number of degrees of freedom +//! \param[in] rdof Maximum number of reconstructed degrees of freedom //! \param[in] bcconfig BC configuration vector for multiple side sets //! \param[in] fd Face connectivity and boundary conditions object //! \param[in] geoFace Face geometry array @@ -57,8 +63,13 @@ tk::bndSurfInt( ncomp_t system, //! \param[in] state Function to evaluate the left and right solution state at //! boundaries //! \param[in] U Solution vector at recent time step +//! \param[in] P Vector of primitives at recent time step //! \param[in] ndofel Vector of local number of degrees of freedom //! \param[in,out] R Right-hand side vector computed +//! \param[in,out] riemannDeriv Derivatives of partial-pressures and velocities +//! computed from the Riemann solver for use in the non-conservative terms. +//! These derivatives are used only for multi-material hydro and unused for +//! single-material compflow and linear transport. // ***************************************************************************** { const auto& bface = fd.Bface(); @@ -69,6 +80,9 @@ tk::bndSurfInt( ncomp_t system, const auto& cy = coord[1]; const auto& cz = coord[2]; + Assert( (nmat==1 ? riemannDeriv.empty() : true), "Non-empty Riemann " + "derivative vector for single material compflow" ); + for (const auto& s : bcconfig) { // for all bc sidesets auto bc = bface.find( std::stoi(s) );// faces for side set if (bc != end(bface)) @@ -118,8 +132,23 @@ tk::bndSurfInt( ncomp_t system, // Compute the coordinates of quadrature point at physical domain auto gp = eval_gp( igp, coordfa, coordgp ); + // If an rDG method is set up (P0P1), then, currently we compute the P1 + // basis functions and solutions by default. This implies that P0P1 is + // unsupported in the p-adaptive DG (PDG). This is a workaround until + // we have rdofel, which is needed to distinguish between ndofs and + // rdofs per element for pDG. + std::size_t dof_el; + if (rdof > ndof) + { + dof_el = rdof; + } + else + { + dof_el = ndofel[el]; + } + //Compute the basis functions for the left element - auto B_l = eval_basis( ndofel[el], + auto B_l = eval_basis( dof_el, Jacobian( coordel_l[0], gp, coordel_l[2], coordel_l[3] ) / detT_l, Jacobian( coordel_l[0], coordel_l[1], gp, coordel_l[3] ) / detT_l, Jacobian( coordel_l[0], coordel_l[1], coordel_l[2], gp ) / detT_l ); @@ -127,9 +156,14 @@ tk::bndSurfInt( ncomp_t system, auto wt = wgp[igp] * geoFace(f,0,0); // Compute the state variables at the left element - auto ugp = eval_state( ncomp, offset, ndof, ndofel[el], el, U, B_l ); + auto ugp = eval_state( ncomp, offset, rdof, dof_el, el, U, B_l ); + auto fvel = eval_state( 3, offset, rdof, dof_el, el, P, B_l ); + + // consolidate primitives into state vector + ugp.insert(ugp.end(), fvel.begin(), fvel.end()); - Assert( ugp.size() == ncomp, "Size mismatch" ); + Assert( ugp.size() == ncomp+fvel.size(), "Incorrect size for " + "appended boundary state vector" ); // Compute the numerical flux auto fl = flux( fn, @@ -137,7 +171,8 @@ tk::bndSurfInt( ncomp_t system, vel( system, ncomp, gp[0], gp[1], gp[2] ) ); // Add the surface integration term to the rhs - update_rhs_bc( ncomp, offset, ndof, ndofel[el], wt, el, fl, B_l, R ); + update_rhs_bc( ncomp, nmat, offset, ndof, ndofel[el], wt, fn, el, fl, + B_l, R, riemannDeriv ); } } } @@ -146,28 +181,38 @@ tk::bndSurfInt( ncomp_t system, void tk::update_rhs_bc ( ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, const std::size_t ndof_l, const tk::real wt, + const std::array< tk::real, 3 >& fn, const std::size_t el, const std::vector< tk::real >& fl, const std::vector< tk::real >& B_l, - Fields& R ) + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ) // ***************************************************************************** // Update the rhs by adding the boundary surface integration term //! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] nmat Number of materials in this PDE system //! \param[in] offset Offset this PDE system operates from //! \param[in] ndof Maximum number of degrees of freedom //! \param[in] ndof_l Number of degrees of freedom for the left element //! \param[in] wt Weight of gauss quadrature point +//! \param[in] fn Face/Surface normal //! \param[in] el Left element index //! \param[in] fl Surface flux //! \param[in] B_l Basis function for the left element //! \param[in,out] R Right-hand side vector computed +//! \param[in,out] riemannDeriv Derivatives of partial-pressures and velocities +//! computed from the Riemann solver for use in the non-conservative terms. +//! These derivatives are used only for multi-material hydro and unused for +//! single-material compflow and linear transport. // ***************************************************************************** { - Assert( B_l.size() == ndof_l, "Size mismatch" ); + // following line commented until rdofel is made available. + //Assert( B_l.size() == ndof_l, "Size mismatch" ); for (ncomp_t c=0; c ncomp) + { + // Gradients of partial pressures + for (std::size_t k=0; k& bcconfig, const inciter::FaceData& fd, const Fields& geoFace, @@ -44,20 +46,25 @@ bndSurfInt( ncomp_t system, const VelFn& vel, const StateFn& state, const Fields& U, + const Fields& P, const std::vector< std::size_t >& ndofel, - Fields& R ); + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ); //! Update the rhs by adding the boundary surface integration term void update_rhs_bc ( ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, const std::size_t ndof_l, const tk::real wt, + const std::array< tk::real, 3 >& fn, const std::size_t el, const std::vector< tk::real >& fl, const std::vector< tk::real >& B_l, - Fields& R ); + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ); } // tk:: #endif // Boundary_h diff --git a/src/PDE/Integrate/CMakeLists.txt b/src/PDE/Integrate/CMakeLists.txt index 849e17d8d3e..b52f9aaf1ee 100644 --- a/src/PDE/Integrate/CMakeLists.txt +++ b/src/PDE/Integrate/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(Integrate Surface.cpp Boundary.cpp Volume.cpp + MultiMatTerms.cpp Source.cpp Basis.cpp Riemann/RiemannFactory.cpp) @@ -19,6 +20,7 @@ target_include_directories(Integrate PUBLIC ${PROJECT_BINARY_DIR}/../Main ${BRIGAND_INCLUDE_DIRS} ${PEGTL_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS}) set_target_properties(Integrate diff --git a/src/PDE/Integrate/Initialize.cpp b/src/PDE/Integrate/Initialize.cpp index 7df7b18580d..89f164bbc28 100644 --- a/src/PDE/Integrate/Initialize.cpp +++ b/src/PDE/Integrate/Initialize.cpp @@ -55,6 +55,7 @@ tk::initialize( ncomp_t system, // ***************************************************************************** { const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); // Number of quadrature points for volume integration auto ng = tk::NGinit(ndof); @@ -87,7 +88,7 @@ tk::initialize( ncomp_t system, {{ cx[ inpoel[4*e+3] ], cy[ inpoel[4*e+3] ], cz[ inpoel[4*e+3] ] }} }}; // right hand side vector - std::vector< real > R( unk.nprop(), 0.0 ); + std::vector< real > R( ncomp*ndof, 0.0 ); // Gaussian quadrature for (std::size_t igp=0; igp& R, const Fields& L, @@ -169,6 +171,7 @@ tk::eval_init( ncomp_t ncomp, //! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] offset Offset this PDE system operates from //! \param[in] ndof Number of degrees of freedom +//! \param[in] rdof Total number of reconstructed degrees of freedom //! \param[in] e Element index //! \param[in] R Right-hand side vector //! \param[in] L Block diagonal mass matrix @@ -179,22 +182,31 @@ tk::eval_init( ncomp_t ncomp, { // DG(P0) auto mark = c*ndof; - unk(e, mark, offset) = R[mark] / L(e, mark, offset); + auto rmark = c*rdof; + unk(e, rmark, offset) = R[mark] / L(e, mark, offset); + + // if P0P1, initialize higher dofs to 0 + if (rdof > ndof) + { + unk(e, rmark+1, offset) = 0.0; + unk(e, rmark+2, offset) = 0.0; + unk(e, rmark+3, offset) = 0.0; + } if(ndof > 1) // DG(P1) { - unk(e, mark+1, offset) = R[mark+1] / L(e, mark+1, offset); - unk(e, mark+2, offset) = R[mark+2] / L(e, mark+2, offset); - unk(e, mark+3, offset) = R[mark+3] / L(e, mark+3, offset); + unk(e, rmark+1, offset) = R[mark+1] / L(e, mark+1, offset); + unk(e, rmark+2, offset) = R[mark+2] / L(e, mark+2, offset); + unk(e, rmark+3, offset) = R[mark+3] / L(e, mark+3, offset); if(ndof > 4) // DG(P2) { - unk(e, mark+4, offset) = R[mark+4] / L(e, mark+4, offset); - unk(e, mark+5, offset) = R[mark+5] / L(e, mark+5, offset); - unk(e, mark+6, offset) = R[mark+6] / L(e, mark+6, offset); - unk(e, mark+7, offset) = R[mark+7] / L(e, mark+7, offset); - unk(e, mark+8, offset) = R[mark+8] / L(e, mark+8, offset); - unk(e, mark+9, offset) = R[mark+9] / L(e, mark+9, offset); + unk(e, rmark+4, offset) = R[mark+4] / L(e, mark+4, offset); + unk(e, rmark+5, offset) = R[mark+5] / L(e, mark+5, offset); + unk(e, rmark+6, offset) = R[mark+6] / L(e, mark+6, offset); + unk(e, rmark+7, offset) = R[mark+7] / L(e, mark+7, offset); + unk(e, rmark+8, offset) = R[mark+8] / L(e, mark+8, offset); + unk(e, rmark+9, offset) = R[mark+9] / L(e, mark+9, offset); } } } diff --git a/src/PDE/Integrate/Initialize.hpp b/src/PDE/Integrate/Initialize.hpp index 88961a186bd..1641276708b 100644 --- a/src/PDE/Integrate/Initialize.hpp +++ b/src/PDE/Integrate/Initialize.hpp @@ -51,6 +51,7 @@ void eval_init( ncomp_t ncomp, ncomp_t offset, const std::size_t ndof, + const std::size_t rdof, const std::size_t e, const std::vector< tk::real >& R, const Fields& L, diff --git a/src/PDE/Integrate/Mass.cpp b/src/PDE/Integrate/Mass.cpp index ad54a1703be..1a03d5a396a 100644 --- a/src/PDE/Integrate/Mass.cpp +++ b/src/PDE/Integrate/Mass.cpp @@ -38,6 +38,7 @@ tk::mass( ncomp_t ncomp, Assert( geoElem.nunk() == l.nunk(), "Size mismatch" ); const auto nelem = geoElem.nunk(); const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); + Assert( l.nprop() == ndof*ncomp, "lhs mass matrix size incorrect" ); // Compute LHS for DG(P0) for (std::size_t e=0; e& inpoel, + const UnsMesh::Coords& coord, + const Fields& geoElem, + const Fields& U, + const std::vector< std::vector< tk::real > >& + riemannDeriv, + const std::vector< std::size_t >& ndofel, + Fields& R ) +// ***************************************************************************** +// Compute volume integrals for multi-material DG +//! \details This is called for multi-material DG, computing volume integrals of +//! terms in the volume fraction and energy equations, which do not exist in +//! the single-material flow formulation (for `CompFlow` DG). For further +//! details see Pelanti, M., & Shyue, K. M. (2019). A numerical model for +//! multiphase liquid–vapor–gas flows with interfaces and cavitation. +//! International Journal of Multiphase Flow, 113, 208-230. +//! \param[in] system Equation system index +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] nmat Number of materials in this PDE system +//! \param[in] offset Offset this PDE system operates from +//! \param[in] ndof Maximum number of degrees of freedom +//! \param[in] rdof Maximum number of reconstructed degrees of freedom +//! \param[in] inpoel Element-node connectivity +//! \param[in] coord Array of nodal coordinates +//! \param[in] geoElem Element geometry array +//! \param[in] U Solution vector at recent time step +//! \param[in] riemannDeriv Derivatives of partial-pressures and velocities +//! computed from the Riemann solver for use in the non-conservative terms +//! \param[in] ndofel Vector of local number of degrees of freedome +//! \param[in,out] R Right-hand side vector added to +// ***************************************************************************** +{ + using inciter::volfracIdx; + using inciter::densityIdx; + using inciter::momentumIdx; + using inciter::energyIdx; + + const auto& cx = coord[0]; + const auto& cy = coord[1]; + const auto& cz = coord[2]; + + // compute volume integrals + for (std::size_t e=0; e, 3 > coordgp; + std::vector< real > wgp; + + coordgp[0].resize( ng ); + coordgp[1].resize( ng ); + coordgp[2].resize( ng ); + wgp.resize( ng ); + + GaussQuadratureTet( ng, coordgp, wgp ); + + // Extract the element coordinates + std::array< std::array< real, 3>, 4 > coordel {{ + {{ cx[ inpoel[4*e ] ], cy[ inpoel[4*e ] ], cz[ inpoel[4*e ] ] }}, + {{ cx[ inpoel[4*e+1] ], cy[ inpoel[4*e+1] ], cz[ inpoel[4*e+1] ] }}, + {{ cx[ inpoel[4*e+2] ], cy[ inpoel[4*e+2] ], cz[ inpoel[4*e+2] ] }}, + {{ cx[ inpoel[4*e+3] ], cy[ inpoel[4*e+3] ], cz[ inpoel[4*e+3] ] }} + }}; + + auto jacInv = + inverseJacobian( coordel[0], coordel[1], coordel[2], coordel[3] ); + + // Compute the derivatives of basis function for DG(P1) + std::array< std::vector, 3 > dBdx; + if (ndofel[e] > 1) + dBdx = eval_dBdx_p1( ndofel[e], jacInv ); + + // Gaussian quadrature + for (std::size_t igp=0; igp 4) + eval_dBdx_p2( igp, coordgp, jacInv, dBdx ); + + // If an rDG method is set up (P0P1), then, currently we compute the P1 + // basis functions and solutions by default. This implies that P0P1 is + // unsupported in the p-adaptive DG (PDG). + std::size_t dof_el; + if (rdof > ndof) + { + dof_el = rdof; + } + else + { + dof_el = ndofel[e]; + } + + // Compute the basis function + auto B = + eval_basis( dof_el, coordgp[0][igp], coordgp[1][igp], coordgp[2][igp] ); + + auto wt = wgp[igp] * geoElem(e, 0, 0); + + auto ugp = eval_state( ncomp, offset, rdof, dof_el, e, U, B ); + + // get bulk properties + tk::real rhob(0.0); + for (std::size_t k=0; k vel{{ ugp[momentumIdx(nmat, 0)]/rhob, + ugp[momentumIdx(nmat, 1)]/rhob, + ugp[momentumIdx(nmat, 2)]/rhob }}; + + std::vector< tk::real > ymat(nmat, 0.0); + std::array< tk::real, 3 > dap{{0.0, 0.0, 0.0}}; + for (std::size_t k=0; k ncf(ncomp, 0.0); + + for (std::size_t idir=0; idir<3; ++idir) + ncf[momentumIdx(nmat, idir)] = 0.0; + + for (std::size_t k=0; k, 3 >& dBdx, + const std::vector< tk::real >& ncf, + Fields& R ) +// ***************************************************************************** +// Update the rhs by adding the non-conservative term integrals +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] offset Offset this PDE system operates from +//! \param[in] ndof Maximum number of degrees of freedom +//! \param[in] ndof_el Number of degrees of freedom for local element +//! \param[in] wt Weight of gauss quadrature point +//! \param[in] e Element index +//! \param[in] dBdx Vector of basis function derivatives +//! \param[in] ncf Vector of non-conservative terms +//! \param[in,out] R Right-hand side vector computed +// ***************************************************************************** +{ + //Assert( dBdx[0].size() == ndof_el, + // "Size mismatch for basis function derivatives" ); + //Assert( dBdx[1].size() == ndof_el, + // "Size mismatch for basis function derivatives" ); + //Assert( dBdx[2].size() == ndof_el, + // "Size mismatch for basis function derivatives" ); + //Assert( ncf.size() == ncomp, + // "Size mismatch for non-conservative term" ); + Assert( ncf.size() == ncomp, "Size mismatch for non-conservative term" ); + + for (ncomp_t c=0; c& inpoel, + const UnsMesh::Coords& coord, + const Fields& geoElem, + const Fields& U, + const std::vector< std::vector< tk::real > >& riemannDeriv, + const std::vector< std::size_t >& ndofel, + Fields& R ); + +//! Update the rhs by adding the non-conservative term integrals +void +update_rhs_ncn( ncomp_t ncomp, + ncomp_t offset, + const std::size_t ndof, + const std::size_t ndof_el, + const tk::real wt, + const std::size_t e, + const std::array< std::vector, 3 >& dBdx, + const std::vector< tk::real >& ncf, + Fields& R ); + +} // tk:: + +#endif // MultiMatTerms_h diff --git a/src/PDE/Integrate/Riemann/AUSM.hpp b/src/PDE/Integrate/Riemann/AUSM.hpp new file mode 100644 index 00000000000..35a4015f685 --- /dev/null +++ b/src/PDE/Integrate/Riemann/AUSM.hpp @@ -0,0 +1,259 @@ +// ***************************************************************************** +/*! + \file src/PDE/Integrate/Riemann/AUSM.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Advection Upstream Splitting Method (AUSM+) Riemann flux function + \details This file implements the Advection Upstream Splitting Method (AUSM) + Riemann solver, with the all-speed corrections. + Ref. Liou, M. S. (2006). A sequel to AUSM, Part II: AUSM+-up for + all speeds. Journal of computational physics, 214(1), 137-170. +*/ +// ***************************************************************************** +#ifndef AUSM_h +#define AUSM_h + +#include + +#include "Types.hpp" +#include "Fields.hpp" +#include "Tags.hpp" +#include "FunctionPrototypes.hpp" +#include "Inciter/Options/Flux.hpp" +#include "EoS/EoS.hpp" +#include "MultiMat/MultiMatIndexing.hpp" + +namespace inciter { + +//! AUSM+up approximate Riemann solver +//! \details This class can be used polymorphically with inciter::RiemannSolver +struct AUSM { + + //! AUSM+up approximate Riemann solver flux function + //! \param[in] fn Face/Surface normal + //! \param[in] u Left and right unknown/state vector + //! \return Riemann flux solution according to AUSM+up, appended by Riemann + //! velocities and volume-fractions. + //! \note The function signature must follow tk::RiemannFluxFn + static tk::RiemannFluxFn::result_type + flux( const std::array< tk::real, 3 >& fn, + const std::array< std::vector< tk::real >, 2 >& u, + const std::vector< std::array< tk::real, 3 > >& ) + { + auto ncomp = u[0].size()-3; + std::vector< tk::real > flx( ncomp, 0 ); + + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[0]; + + // Primitive variables + tk::real rhol(0.0), rhor(0.0); + for (std::size_t k=0; k al_l(nmat, 0.0), al_r(nmat, 0.0), + hml(nmat, 0.0), hmr(nmat, 0.0), + pml(nmat, 0.0), pmr(nmat, 0.0), + al_12(nmat, 0.0), rhomat12(nmat, 0.0), + amat12(nmat, 0.0); + for (std::size_t k=0; k( 0, u[0][densityIdx(nmat, k)]/al_l[k], + ul, vl, wl, + u[0][energyIdx(nmat, k)]/al_l[k], + k ); + pl += al_l[k] * pml[k]; + hml[k] = u[0][energyIdx(nmat, k)] + al_l[k]*pml[k]; + amatl = eos_soundspeed< tag::multimat >( 0, + u[0][densityIdx(nmat, k)]/al_l[k], + pml[k], k ); + + al_r[k] = u[1][volfracIdx(nmat, k)]; + pmr[k] = eos_pressure< tag::multimat >( 0, u[1][densityIdx(nmat, k)]/al_r[k], + ur, vr, wr, + u[1][energyIdx(nmat, k)]/al_r[k], + k ); + pr += al_r[k] * pmr[k]; + hmr[k] = u[1][energyIdx(nmat, k)] + al_r[k]*pmr[k]; + amatr = eos_soundspeed< tag::multimat >( 0, + u[1][densityIdx(nmat, k)]/al_r[k], + pmr[k], k ); + + // Average states for mixture speed of sound + al_12[k] = 0.5*(al_l[k]+al_r[k]); + rhomat12[k] = 0.5*(u[0][densityIdx(nmat, k)]/al_l[k] + + u[1][densityIdx(nmat, k)]/al_r[k]); + amat12[k] = 0.5*(amatl+amatr); + } + + auto rho12 = 0.5*(rhol+rhor); + + // mixture speed of sound + tk::real ac12(0.0); + for (std::size_t k=0; k 1.0e-10) + { + for (std::size_t k=0; k 1.0e-10) + { + for (std::size_t k=0; k splitmach_ausm( tk::real fa, + tk::real mach ) + { + std::array< tk::real, 4 > ms; + + std::array< tk::real, 3 > msplus, msminus; + tk::real psplus, psminus; + + msplus[0] = 0.5*(mach + std::fabs(mach)); + msminus[0]= 0.5*(mach - std::fabs(mach)); + + msplus[1] = +0.25*(mach + 1.0)*(mach + 1.0); + msminus[1]= -0.25*(mach - 1.0)*(mach - 1.0); + + auto alph_fa = (3.0/16.0) * (-4.0 + 5.0*fa*fa); + + if (std::fabs(mach) >= 1.0) + { + msplus[2] = msplus[0]; + msminus[2]= msminus[0]; + psplus = msplus[0]/mach; + psminus = msminus[0]/mach; + } + else + { + msplus[2] = msplus[1]* (1.0 - 2.0*msminus[1]); + msminus[2]= msminus[1]* (1.0 + 2.0*msplus[1]); + psplus = msplus[1]* + ((+2.0 - mach) - (16.0 * alph_fa)*mach*msminus[1]); + psminus = msminus[1]* + ((-2.0 - mach) + (16.0 * alph_fa)*mach*msplus[1]); + } + + ms[0] = msplus[2]; + ms[1] = msminus[2]; + ms[2] = psplus; + ms[3] = psminus; + + return ms; + } +}; + +} // inciter:: + +#endif // AUSM_h diff --git a/src/PDE/Integrate/Riemann/HLLC.hpp b/src/PDE/Integrate/Riemann/HLLC.hpp index a6b79758aa4..934dd0213bc 100644 --- a/src/PDE/Integrate/Riemann/HLLC.hpp +++ b/src/PDE/Integrate/Riemann/HLLC.hpp @@ -19,13 +19,11 @@ #include "Fields.hpp" #include "Tags.hpp" #include "FunctionPrototypes.hpp" -#include "Inciter/InputDeck/InputDeck.hpp" #include "Inciter/Options/Flux.hpp" +#include "EoS/EoS.hpp" namespace inciter { -extern ctr::InputDeck g_inputdeck; - //! HLLC approximate Riemann solver //! \details This class can be used polymorphically with inciter::RiemannSolver struct HLLC { @@ -42,35 +40,26 @@ struct HLLC { { std::vector< tk::real > flx( u[0].size(), 0 ); - // ratio of specific heats - auto g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0]; - // Primitive variables auto rhol = u[0][0]; auto rhor = u[1][0]; - auto pl = (g-1.0)*(u[0][4] - (u[0][1]*u[0][1] + - u[0][2]*u[0][2] + - u[0][3]*u[0][3]) / (2.0*rhol)); - - auto pr = (g-1.0)*(u[1][4] - (u[1][1]*u[1][1] + - u[1][2]*u[1][2] + - u[1][3]*u[1][3]) / (2.0*rhor)); - - auto al = sqrt(g * pl / rhol); - auto ar = sqrt(g * pr / rhor); - - // Face-normal velocities auto ul = u[0][1]/rhol; auto vl = u[0][2]/rhol; auto wl = u[0][3]/rhol; - tk::real vnl = ul*fn[0] + vl*fn[1] + wl*fn[2]; - auto ur = u[1][1]/rhor; auto vr = u[1][2]/rhor; auto wr = u[1][3]/rhor; + auto pl = eos_pressure< tag::compflow >( 0, rhol, ul, vl, wl, u[0][4] ); + auto pr = eos_pressure< tag::compflow >( 0, rhor, ur, vr, wr, u[1][4] ); + + auto al = eos_soundspeed< tag::compflow >( 0, rhol, pl ); + auto ar = eos_soundspeed< tag::compflow >( 0, rhor, pr ); + + // Face-normal velocities + tk::real vnl = ul*fn[0] + vl*fn[1] + wl*fn[2]; tk::real vnr = ur*fn[0] + vr*fn[1] + wr*fn[2]; // Roe-averaged variables diff --git a/src/PDE/Integrate/Riemann/LaxFriedrichs.hpp b/src/PDE/Integrate/Riemann/LaxFriedrichs.hpp index 3d90c353873..0d32902ec88 100644 --- a/src/PDE/Integrate/Riemann/LaxFriedrichs.hpp +++ b/src/PDE/Integrate/Riemann/LaxFriedrichs.hpp @@ -17,13 +17,11 @@ #include "Types.hpp" #include "Fields.hpp" #include "FunctionPrototypes.hpp" -#include "Inciter/InputDeck/InputDeck.hpp" #include "Inciter/Options/Flux.hpp" +#include "EoS/EoS.hpp" namespace inciter { -extern ctr::InputDeck g_inputdeck; - //! Lax-Friedrichs approximate Riemann solver //! \details This class can be used polymorphically with inciter::RiemannSolver struct LaxFriedrichs { @@ -42,35 +40,26 @@ struct LaxFriedrichs { fluxl( u[0].size(), 0.0 ), fluxr( u[0].size(), 0.0 ); - // ratio of specific heats - auto g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0]; - // Primitive variables auto rhol = u[0][0]; auto rhor = u[1][0]; - auto pl = (g-1.0)*(u[0][4] - (u[0][1]*u[0][1] + - u[0][2]*u[0][2] + - u[0][3]*u[0][3]) / (2.0*rhol)); - - auto pr = (g-1.0)*(u[1][4] - (u[1][1]*u[1][1] + - u[1][2]*u[1][2] + - u[1][3]*u[1][3]) / (2.0*rhor)); - - auto al = sqrt(g * pl / rhol); - auto ar = sqrt(g * pr / rhor); - - // Face-normal velocities auto ul = u[0][1]/rhol; auto vl = u[0][2]/rhol; auto wl = u[0][3]/rhol; - tk::real vnl = ul*fn[0] + vl*fn[1] + wl*fn[2]; - auto ur = u[1][1]/rhor; auto vr = u[1][2]/rhor; auto wr = u[1][3]/rhor; + auto pl = eos_pressure< tag::compflow >( 0, rhol, ul, vl, wl, u[0][4] ); + auto pr = eos_pressure< tag::compflow >( 0, rhor, ur, vr, wr, u[1][4] ); + + auto al = eos_soundspeed< tag::compflow >( 0, rhol, pl ); + auto ar = eos_soundspeed< tag::compflow >( 0, rhor, pr ); + + // Face-normal velocities + tk::real vnl = ul*fn[0] + vl*fn[1] + wl*fn[2]; tk::real vnr = ur*fn[0] + vr*fn[1] + wr*fn[2]; // Flux functions diff --git a/src/PDE/Integrate/Riemann/RiemannSolver.hpp b/src/PDE/Integrate/Riemann/RiemannSolver.hpp index d20de6ad601..0d8bfba60b0 100644 --- a/src/PDE/Integrate/Riemann/RiemannSolver.hpp +++ b/src/PDE/Integrate/Riemann/RiemannSolver.hpp @@ -20,9 +20,9 @@ #include #include +#include #include "Types.hpp" -#include "Make_unique.hpp" #include "Fields.hpp" #include "FunctionPrototypes.hpp" @@ -44,7 +44,7 @@ class RiemannSolver { //! \param[in] x Instantiated object of type T given by the template //! argument. template< typename T > explicit RiemannSolver( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ) {} + self( std::make_unique< Model >( std::move(x) ) ) {} //! \brief Constructor taking a function pointer (std::function) to a //! constructor of an object modeling Concept. @@ -67,7 +67,7 @@ class RiemannSolver { //! \param[in] args Zero or more constructor arguments template< typename T, typename...Args > explicit RiemannSolver( std::function x, Args&&... args ) : - self( tk::make_unique< Model >( + self( std::make_unique< Model >( std::move( x( std::forward(args)... ) ) ) ) {} //! Public interface to computing the Riemann flux diff --git a/src/PDE/Integrate/Surface.cpp b/src/PDE/Integrate/Surface.cpp index 4fd3539836c..93b382ccc8e 100644 --- a/src/PDE/Integrate/Surface.cpp +++ b/src/PDE/Integrate/Surface.cpp @@ -22,8 +22,10 @@ void tk::surfInt( ncomp_t system, ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, + const std::size_t rdof, const std::vector< std::size_t >& inpoel, const UnsMesh::Coords& coord, const inciter::FaceData& fd, @@ -31,14 +33,18 @@ tk::surfInt( ncomp_t system, const RiemannFluxFn& flux, const VelFn& vel, const Fields& U, + const Fields& P, const std::vector< std::size_t >& ndofel, - Fields& R ) + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ) // ***************************************************************************** // Compute internal surface flux integrals //! \param[in] system Equation system index //! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] nmat Number of materials in this PDE system //! \param[in] offset Offset this PDE system operates from //! \param[in] ndof Maximum number of degrees of freedom +//! \param[in] rdof Maximum number of reconstructed degrees of freedom //! \param[in] inpoel Element-node connectivity //! \param[in] coord Array of nodal coordinates //! \param[in] fd Face connectivity and boundary conditions object @@ -46,8 +52,13 @@ tk::surfInt( ncomp_t system, //! \param[in] flux Riemann flux function to use //! \param[in] vel Function to use to query prescribed velocity (if any) //! \param[in] U Solution vector at recent time step +//! \param[in] P Vector of primitives at recent time step //! \param[in] ndofel Vector of local number of degrees of freedome //! \param[in,out] R Right-hand side vector computed +//! \param[in,out] riemannDeriv Derivatives of partial-pressures and velocities +//! computed from the Riemann solver for use in the non-conservative terms. +//! These derivatives are used only for multi-material hydro and unused for +//! single-material compflow and linear transport. // ***************************************************************************** { const auto& esuf = fd.Esuf(); @@ -57,6 +68,9 @@ tk::surfInt( ncomp_t system, const auto& cy = coord[1]; const auto& cz = coord[2]; + Assert( (nmat==1 ? riemannDeriv.empty() : true), "Non-empty Riemann " + "derivative vector for single material compflow" ); + // compute internal surface flux integrals for (auto f=fd.Nbfac(); f ng_r ) - ng = ng_l; - else - ng = ng_r; + auto ng = std::max( ng_l, ng_r ); // arrays for quadrature points std::array< std::vector< real >, 2 > coordgp; @@ -113,6 +123,9 @@ tk::surfInt( ncomp_t system, {{ cx[ inpofa[3*f+1] ], cy[ inpofa[3*f+1] ], cz[ inpofa[3*f+1] ] }}, {{ cx[ inpofa[3*f+2] ], cy[ inpofa[3*f+2] ], cz[ inpofa[3*f+2] ] }} }}; + std::array< real, 3 > + fn{{ geoFace(f,1,0), geoFace(f,2,0), geoFace(f,3,0) }}; + // Gaussian quadrature for (std::size_t igp=0; igp ndof) + { + dof_el = rdof; + dof_er = rdof; + } + else + { + dof_el = ndofel[el]; + dof_er = ndofel[er]; + } + //Compute the basis functions - auto B_l = eval_basis( ndofel[el], + auto B_l = eval_basis( dof_el, Jacobian( coordel_l[0], gp, coordel_l[2], coordel_l[3] ) / detT_l, Jacobian( coordel_l[0], coordel_l[1], gp, coordel_l[3] ) / detT_l, Jacobian( coordel_l[0], coordel_l[1], coordel_l[2], gp ) / detT_l ); - auto B_r = eval_basis( ndofel[er], + auto B_r = eval_basis( dof_er, Jacobian( coordel_r[0], gp, coordel_r[2], coordel_r[3] ) / detT_r, Jacobian( coordel_r[0], coordel_r[1], gp, coordel_r[3] ) / detT_r, Jacobian( coordel_r[0], coordel_r[1], coordel_r[2], gp ) / detT_r ); @@ -142,58 +172,77 @@ tk::surfInt( ncomp_t system, auto wt = wgp[igp] * geoFace(f,0,0); std::array< std::vector< real >, 2 > state; + std::array< std::vector< real >, 2 > fvel; - state[0] = eval_state( ncomp, offset, ndof, ndofel[el], el, U, B_l ); - state[1] = eval_state( ncomp, offset, ndof, ndofel[er], er, U, B_r ); + state[0] = eval_state( ncomp, offset, rdof, dof_el, el, U, B_l ); + fvel[0] = eval_state( 3, offset, rdof, dof_el, el, P, B_l ); + state[1] = eval_state( ncomp, offset, rdof, dof_er, er, U, B_r ); + fvel[1] = eval_state( 3, offset, rdof, dof_er, er, P, B_r ); - Assert( state[0].size() == ncomp, "Size mismatch" ); - Assert( state[1].size() == ncomp, "Size mismatch" ); + // consolidate primitives into state vector + state[0].insert(state[0].end(), fvel[0].begin(), fvel[0].end()); + state[1].insert(state[1].end(), fvel[1].begin(), fvel[1].end()); + + Assert( state[0].size() == ncomp+fvel[0].size(), "Incorrect size for " + "appended boundary state vector" ); + Assert( state[1].size() == ncomp+fvel[1].size(), "Incorrect size for " + "appended boundary state vector" ); // evaluate prescribed velocity (if any) auto v = vel( system, ncomp, gp[0], gp[1], gp[2] ); // compute flux auto fl = - flux( {{geoFace(f,1,0), geoFace(f,2,0), geoFace(f,3,0)}}, state, v ); + flux( fn, state, v ); // Add the surface integration term to the rhs - update_rhs_fa( ncomp, offset, ndof, ndofel[el], ndofel[er], wt, el, er, - fl, B_l, B_r, R ); + update_rhs_fa( ncomp, nmat, offset, ndof, ndofel[el], ndofel[er], wt, fn, + el, er, fl, B_l, B_r, R, riemannDeriv ); } } } void tk::update_rhs_fa ( ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, const std::size_t ndof_l, const std::size_t ndof_r, const tk::real wt, + const std::array< tk::real, 3 >& fn, const std::size_t el, const std::size_t er, const std::vector< tk::real >& fl, const std::vector< tk::real >& B_l, const std::vector< tk::real >& B_r, - Fields& R ) + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ) // ***************************************************************************** // Update the rhs by adding the surface integration term //! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] nmat Number of materials in this PDE system //! \param[in] offset Offset this PDE system operates from //! \param[in] ndof Maximum number of degrees of freedom //! \param[in] ndof_l Number of degrees of freedom for left element //! \param[in] ndof_r Number of degrees of freedom for right element //! \param[in] wt Weight of gauss quadrature point +//! \param[in] fn Face/Surface normal //! \param[in] el Left element index //! \param[in] er Right element index //! \param[in] fl Surface flux //! \param[in] B_l Basis function for the left element //! \param[in] B_r Basis function for the right element //! \param[in,out] R Right-hand side vector computed +//! \param[in,out] riemannDeriv Derivatives of partial-pressures and velocities +//! computed from the Riemann solver for use in the non-conservative terms. +//! These derivatives are used only for multi-material hydro and unused for +//! single-material compflow and linear transport. // ***************************************************************************** { - Assert( B_l.size() == ndof_l, "Size mismatch" ); - Assert( B_r.size() == ndof_r, "Size mismatch" ); + // following lines commented until rdofel is made available. + //Assert( B_l.size() == ndof_l, "Size mismatch" ); + //Assert( B_r.size() == ndof_r, "Size mismatch" ); for (ncomp_t c=0; c ncomp) + { + // Gradients of partial pressures + for (std::size_t k=0; k& inpoel, const UnsMesh::Coords& coord, const inciter::FaceData& fd, @@ -40,23 +42,28 @@ surfInt( ncomp_t system, const RiemannFluxFn& flux, const VelFn& vel, const Fields& U, + const Fields& P, const std::vector< std::size_t >& ndofel, - Fields& R ); + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ); // Update the rhs by adding surface integration term void update_rhs_fa ( ncomp_t ncomp, + std::size_t nmat, ncomp_t offset, const std::size_t ndof, const std::size_t ndof_l, const std::size_t ndof_r, const tk::real wt, + const std::array< tk::real, 3 >& fn, const std::size_t el, const std::size_t er, const std::vector< tk::real >& fl, const std::vector< tk::real >& B_l, const std::vector< tk::real >& B_r, - Fields& R ); + Fields& R, + std::vector< std::vector< tk::real > >& riemannDeriv ); } // tk:: diff --git a/src/PDE/Integrate/Volume.cpp b/src/PDE/Integrate/Volume.cpp index 92632ed034b..13e3e9313fc 100644 --- a/src/PDE/Integrate/Volume.cpp +++ b/src/PDE/Integrate/Volume.cpp @@ -129,7 +129,7 @@ tk::update_rhs( ncomp_t ncomp, //! \param[in] ndof_el Number of degrees of freedom for local element //! \param[in] wt Weight of gauss quadrature point //! \param[in] e Element index -//! \param[in] B Vector of basis functions +//! \param[in] dBdx Vector of basis function derivatives //! \param[in] fl Vector of numerical flux //! \param[in,out] R Right-hand side vector computed // ***************************************************************************** diff --git a/src/PDE/Integrate/Volume.hpp b/src/PDE/Integrate/Volume.hpp index 1acbf9e51fc..a4cde9c0e76 100644 --- a/src/PDE/Integrate/Volume.hpp +++ b/src/PDE/Integrate/Volume.hpp @@ -45,7 +45,7 @@ void update_rhs( ncomp_t ncomp, ncomp_t offset, const std::size_t ndof, - const std::size_t ndof_e, + const std::size_t ndof_el, const tk::real wt, const std::size_t e, const std::array< std::vector, 3 >& dBdx, diff --git a/src/PDE/Limiter.cpp b/src/PDE/Limiter.cpp index ec5faca4771..815fed44165 100644 --- a/src/PDE/Limiter.cpp +++ b/src/PDE/Limiter.cpp @@ -35,23 +35,24 @@ WENO_P1( const std::vector< int >& esuel, //! \param[in] esuel Elements surrounding elements //! \param[in] offset Index for equation systems //! \param[in,out] U High-order solution vector which gets limited +//! \note This limiter function is experimental and untested. Use with caution. // ***************************************************************************** { - const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); const auto cweight = inciter::g_inputdeck.get< tag::discr, tag::cweight >(); std::array< std::vector< tk::real >, 3 > limU; limU[0].resize( U.nunk() ); limU[1].resize( U.nunk() ); limU[2].resize( U.nunk() ); - std::size_t ncomp = U.nprop()/ndof; + std::size_t ncomp = U.nprop()/rdof; std::array< std::array< tk::real, 3 >, 5 > gradu; std::array< tk::real, 5 > wtStencil, osc, wtDof; for (inciter::ncomp_t c=0; c& esuel, const std::vector< std::size_t >& ndofel, inciter::ncomp_t offset, const tk::UnsMesh::Coords& coord, - tk::Fields& U ) + tk::Fields& U, + std::size_t nmat ) // ***************************************************************************** // Superbee limiter for DGP1 //! \param[in] esuel Elements surrounding elements @@ -166,16 +168,34 @@ Superbee_P1( const std::vector< int >& esuel, //! \param[in] offset Index for equation systems //! \param[in] coord Array of nodal coordinates //! \param[in,out] U High-order solution vector which gets limited +//! \param[in] nmat Number of materials in this PDE system. Default is 1, so +//! this argument can be left unspecified for single-material by the calling +//! code. // ***************************************************************************** { + const auto rdof = inciter::g_inputdeck.get< tag::discr, tag::rdof >(); const auto ndof = inciter::g_inputdeck.get< tag::discr, tag::ndof >(); - std::size_t ncomp = U.nprop()/ndof; + std::size_t ncomp = U.nprop()/rdof; auto beta_lim = 2.0; for (std::size_t e=0; e ndof) + { + dof_el = rdof; + } + else + { + dof_el = ndofel[e]; + } + if (dof_el > 1) { // Superbee is a TVD limiter, which uses min-max bounds that the @@ -191,7 +211,7 @@ Superbee_P1( const std::vector< int >& esuel, for (inciter::ncomp_t c=0; c& esuel, // ignore physical domain ghosts if (nel == -1) continue; + auto n = static_cast< std::size_t >( nel ); for (inciter::ncomp_t c=0; c( nel ); + auto mark = c*rdof; uMin[c] = std::min(uMin[c], U(n, mark, offset)); uMax[c] = std::max(uMax[c], U(n, mark, offset)); } @@ -267,12 +287,12 @@ Superbee_P1( const std::vector< int >& esuel, auto gp = tk::eval_gp( igp, coordfa, coordgp ); //Compute the basis functions - auto B_l = tk::eval_basis( ndof, + auto B_l = tk::eval_basis( rdof, tk::Jacobian( coordel[0], gp, coordel[2], coordel[3] ) / detT, tk::Jacobian( coordel[0], coordel[1], gp, coordel[3] ) / detT, tk::Jacobian( coordel[0], coordel[1], coordel[2], gp ) / detT ); - auto state = tk::eval_state( ncomp, offset, ndof, dof_el, e, U, B_l ); + auto state = tk::eval_state( ncomp, offset, rdof, dof_el, e, U, B_l ); Assert( state.size() == ncomp, "Size mismatch" ); @@ -280,7 +300,7 @@ Superbee_P1( const std::vector< int >& esuel, for (inciter::ncomp_t c=0; c 1.0e-14) { @@ -302,10 +322,13 @@ Superbee_P1( const std::vector< int >& esuel, } } + if (nmat > 1) + consistentMultiMatLimiting_P1(nmat, offset, rdof, e, U, phi); + // ----- Step-3: apply limiter function for (inciter::ncomp_t c=0; c& esuel, } } +void consistentMultiMatLimiting_P1( std::size_t nmat, + ncomp_t offset, + std::size_t rdof, + std::size_t e, + tk::Fields& U, + std::vector< tk::real >& phi ) +// ***************************************************************************** +// Consistent limiter modifications for P1 dofs +//! \param[in] nmat Number of materials in this PDE system +//! \param[in] offset Index for equation system +//! \param[in] rdof Total number of reconstructed dofs +//! \param[in] e Element being checked for consistency +//! \param[in,out] U Second-order solution vector which gets modified near +//! material interfaces for consistency +//! \param[in,out] phi Vector of limiter functions for the ncomp unknowns +// ***************************************************************************** +{ + using inciter::volfracIdx; + using inciter::densityIdx; + using inciter::momentumIdx; + using inciter::energyIdx; + + // find the limiter-function for volume-fractions + auto phi_al(1.0), almax(0.0), dalmax(0.0); + //std::size_t nmax(0); + for (std::size_t k=0; k 0.01 || + (almax > 0.0001 && almax < (1.0-0.0001)) ) + { + // 1. consistent high-order dofs + std::array< tk::real, 3 > drhob {{ 0.0, 0.0, 0.0 }}; + auto rhob(0.0), vel(0.0); + for (std::size_t k=0; k& esuel, const std::vector< std::size_t >& ndofel, inciter::ncomp_t offset, const tk::UnsMesh::Coords& coord, - tk::Fields& U ); + tk::Fields& U, + std::size_t nmat=1 ); + +//! Consistent limiter modifications for P1 dofs +void consistentMultiMatLimiting_P1( std::size_t nmat, + ncomp_t offset, + std::size_t rdof, + std::size_t e, + tk::Fields& U, + std::vector< tk::real >& phi ); } // inciter:: diff --git a/src/PDE/MultiMat/DGMultiMat.hpp b/src/PDE/MultiMat/DGMultiMat.hpp index 8419a5d9768..a49f3fd971d 100644 --- a/src/PDE/MultiMat/DGMultiMat.hpp +++ b/src/PDE/MultiMat/DGMultiMat.hpp @@ -33,8 +33,13 @@ #include "Integrate/Surface.hpp" #include "Integrate/Boundary.hpp" #include "Integrate/Volume.hpp" +#include "Integrate/MultiMatTerms.hpp" #include "Integrate/Source.hpp" -#include "Integrate/Riemann/RiemannFactory.hpp" +#include "Integrate/Riemann/AUSM.hpp" +#include "EoS/EoS.hpp" +#include "MultiMat/MultiMatIndexing.hpp" +#include "Reconstruction.hpp" +#include "Limiter.hpp" namespace inciter { @@ -81,19 +86,29 @@ class MultiMat { m_system( c ), m_ncomp( g_inputdeck.get< tag::component, eq >().at(c) ), m_offset( g_inputdeck.get< tag::component >().offset< eq >(c) ), - m_riemann( tk::cref_find( RiemannSolvers(), - g_inputdeck.get< tag::discr, tag::flux >() ) ), + //m_riemann( tk::cref_find( RiemannSolvers(), + // g_inputdeck.get< tag::discr, tag::flux >() ) ), m_bcdir( config< tag::bcdir >( c ) ), m_bcsym( config< tag::bcsym >( c ) ), m_bcextrapolate( config< tag::bcextrapolate >( c ) ) {} + //! Find the number of primitive quantities required for this PDE system + //! \return The number of primitive quantities required to be stored for + //! this PDE system + std::size_t nprim() const + { + // multimat needs and stores velocities currently + return 3; + } + //! Initalize the compressible flow equations, prepare for time integration //! \param[in] L Block diagonal mass matrix //! \param[in] inpoel Element-node connectivity //! \param[in] coord Array of nodal coordinates //! \param[in,out] unk Array of unknowns //! \param[in] t Physical time + //! \param[in] nielem Number of internal elements void initialize( const tk::Fields& L, const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, @@ -112,6 +127,166 @@ class MultiMat { tk::mass( m_ncomp, m_offset, geoElem, l ); } + //! Update the primitives for this PDE system + //! \param[in] unk Array of unknowns + //! \param[in,out] prim Array of primitives + //! \param[in] nielem Number of internal elements + //! \details This function computes and stores the dofs for primitive + //! quantities, which are required for obtaining reconstructed states used + //! in the Riemann solver. See /PDE/Integrate/Riemann/AUSM.hpp, where the + //! normal velocity for advection is calculated from independently + //! reconstructed velocities. + void updatePrimitives( const tk::Fields& unk, + tk::Fields& prim, + std::size_t nielem ) const + { + const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[m_system]; + + Assert( unk.nunk() == prim.nunk(), "Number of unknowns in solution " + "vector and primitive vector at recent time step incorrect" ); + Assert( unk.nprop() == rdof*m_ncomp, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*m_ncomp) ); + Assert( prim.nprop() == rdof*nprim(), "Number of components in vector of " + "primitive quantities must equal "+ std::to_string(rdof*nprim()) ); + + for (std::size_t e=0; e rhob(ndof, 0.0); + for (std::size_t k=0; k + vel{{ unk(e, momentumIdx(nmat, 0)*rdof, m_offset)/rhob[0], + unk(e, momentumIdx(nmat, 1)*rdof, m_offset)/rhob[0], + unk(e, momentumIdx(nmat, 2)*rdof, m_offset)/rhob[0] }}; + + // fill up vector of primitives + for (std::size_t idir=0; idir<3; ++idir) + { + prim(e, velocityIdx(nmat, idir)*rdof, m_offset) = vel[idir]; + for (std::size_t j=1; j& inpoel, + const tk::UnsMesh::Coords& coord, + tk::Fields& U, + tk::Fields& P ) const + { + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[m_system]; + + Assert( U.nprop() == rdof*m_ncomp, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*m_ncomp) ); + Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " + "size" ); + Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, + "Mismatch in inpofa size" ); + + // supported boundary condition types and associated state functions + std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > + bctypes{{ + { m_bcdir, Dirichlet }, + { m_bcsym, Symmetry }, + { m_bcextrapolate, Extrapolate } }}; + + // allocate and initialize matrix and vector for reconstruction + std::vector< std::array< std::array< tk::real, 3 >, 3 > > + lhs_ls( U.nunk(), {{ {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}} }} ); + std::vector< std::vector< std::array< tk::real, 3 > > > + rhs_ls( U.nunk(), std::vector< std::array< tk::real, 3 > > + ( m_ncomp, + {{ 0.0, 0.0, 0.0 }} ) ); + + // reconstruct x,y,z-derivatives of unknowns + tk::intLeastSq_P0P1( m_ncomp, m_offset, rdof, fd, geoElem, U, + lhs_ls, rhs_ls ); + + // compute boundary surface flux integrals + for (const auto& b : bctypes) + tk::bndLeastSq_P0P1( m_system, m_ncomp, m_offset, rdof, b.first, + fd, geoFace, geoElem, t, b.second, U, lhs_ls, + rhs_ls, nprim() ); + + // solve 3x3 least-squares system + tk::solveLeastSq_P0P1( m_ncomp, m_offset, rdof, lhs_ls, rhs_ls, U ); + + // transform reconstructed derivatives to Dubiner dofs + tk::transform_P0P1( m_ncomp, m_offset, rdof, fd.Esuel().size()/4, inpoel, + coord, U ); + + // reconstruct vector of primitives from solution vector + getMultiMatPrimitives_P0P1( m_offset, nmat, rdof, fd.Esuel().size()/4, U, + P ); + } + + //! Limit second-order solution, and primitive quantities separately + //! \param[in] t Physical time + //! \param[in] geoFace Face geometry array + //! \param[in] geoElem Element geometry array + //! \param[in] fd Face connectivity and boundary conditions object + //! \param[in] inpoel Element-node connectivity + //! \param[in] coord Array of nodal coordinates + //! \param[in] ndofel Vector of local number of degrees of freedome + //! \param[in,out] U Solution vector at recent time step + //! \param[in,out] P Vector of primitives at recent time step + void limit( [[maybe_unused]] tk::real t, + [[maybe_unused]] const tk::Fields& geoFace, + [[maybe_unused]] const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + const std::vector< std::size_t >& ndofel, + tk::Fields& U, + tk::Fields& P ) const + { + Assert( U.nunk() == P.nunk(), "Number of unknowns in solution " + "vector and primitive vector at recent time step incorrect" ); + + const auto limiter = g_inputdeck.get< tag::discr, tag::limiter >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[m_system]; + + if (limiter == ctr::LimiterType::SUPERBEEP1) + { + // limit solution vector + Superbee_P1( fd.Esuel(), inpoel, ndofel, m_offset, coord, U, nmat ); + + // limit vector of primitives + Superbee_P1( fd.Esuel(), inpoel, ndofel, m_offset, coord, P ); + } + } + //! Compute right hand side //! \param[in] t Physical time //! \param[in] geoFace Face geometry array @@ -120,6 +295,7 @@ class MultiMat { //! \param[in] inpoel Element-node connectivity //! \param[in] coord Array of nodal coordinates //! \param[in] U Solution vector at recent time step + //! \param[in] P Primitive vector at recent time step //! \param[in] ndofel Vector of local number of degrees of freedome //! \param[in,out] R Right-hand side vector computed void rhs( tk::real t, @@ -129,30 +305,41 @@ class MultiMat { const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, const tk::Fields& U, + const tk::Fields& P, const std::vector< std::size_t >& ndofel, tk::Fields& R ) const { const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[m_system]; + Assert( U.nunk() == P.nunk(), "Number of unknowns in solution " + "vector and primitive vector at recent time step incorrect" ); Assert( U.nunk() == R.nunk(), "Number of unknowns in solution " "vector and right-hand side at recent time step incorrect" ); - Assert( U.nprop() == ndof*m_ncomp && R.nprop() == ndof*m_ncomp, - "Number of components in solution and right-hand side vector " - "must equal "+ std::to_string(ndof*m_ncomp) ); + Assert( U.nprop() == rdof*m_ncomp, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*m_ncomp) ); + Assert( P.nprop() == rdof*nprim(), "Number of components in primitive " + "vector must equal "+ std::to_string(rdof*nprim()) ); + Assert( R.nprop() == ndof*m_ncomp, "Number of components in right-hand " + "side vector must equal "+ std::to_string(ndof*m_ncomp) ); Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " "size" ); Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, "Mismatch in inpofa size" ); + Assert( ndof == 1, "DGP1/2 not set up for multi-material" ); // set rhs to zero R.fill(0.0); - // configure Riemann flux function - using namespace std::placeholders; - auto rieflxfn = std::bind( &RiemannSolver::flux, m_riemann, _1, _2, _3 ); + // allocate space for Riemann derivatives used in non-conservative terms + std::vector< std::vector< tk::real > > + riemannDeriv( 3*nmat+1, std::vector(U.nunk(),0.0) ); + // configure a no-op lambda for prescribed velocity auto velfn = [this]( ncomp_t, ncomp_t, tk::real, tk::real, tk::real ){ - return std::vector< std::array< tk::real, 3 > >( this->m_ncomp ); }; + return std::vector< std::array< tk::real, 3 > >( m_ncomp ); }; // supported boundary condition types and associated state functions std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > bctypes{{ @@ -161,10 +348,11 @@ class MultiMat { { m_bcextrapolate, Extrapolate } }}; // compute internal surface flux integrals - tk::surfInt( m_system, m_ncomp, m_offset, ndof, inpoel, coord, fd, - geoFace, rieflxfn, velfn, U, ndofel, R ); + tk::surfInt( m_system, m_ncomp, nmat, m_offset, ndof, rdof, inpoel, coord, + fd, geoFace, AUSM::flux, velfn, U, P, ndofel, R, + riemannDeriv ); - // compute source term intehrals + // compute source term integrals tk::srcInt( m_system, m_ncomp, m_offset, t, ndof, inpoel, coord, geoElem, Problem::src, ndofel, R ); @@ -175,9 +363,26 @@ class MultiMat { // compute boundary surface flux integrals for (const auto& b : bctypes) - tk::bndSurfInt( m_system, m_ncomp, m_offset, ndof, b.first, fd, geoFace, - inpoel, coord, t, rieflxfn, velfn, b.second, U, - ndofel, R ); + tk::bndSurfInt( m_system, m_ncomp, nmat, m_offset, ndof, rdof, b.first, + fd, geoFace, inpoel, coord, t, AUSM::flux, velfn, + b.second, U, P, ndofel, R, riemannDeriv ); + + Assert( riemannDeriv.size() == 3*nmat+1, "Size of Riemann derivative " + "vector incorrect" ); + + // get derivatives from riemannDeriv + for (std::size_t k=0; k, 3 >& coord, const std::vector< std::size_t >& inpoel, const inciter::FaceData& fd, const tk::Fields& geoFace, const tk::Fields& geoElem, + const std::vector< std::size_t >& /*ndofel*/, const tk::Fields& U ) const { const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - const tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[0]; + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[m_system]; const auto& esuf = fd.Esuf(); const auto& inpofa = fd.Inpofa(); @@ -212,7 +421,7 @@ class MultiMat { coordgp[1].resize( ng ); wgp.resize( ng ); - tk::real rho, u, v, w, rhoE, p, a, vn, dSV_l, dSV_r; + tk::real rhok, rho, u, v, w, p, a, vn, dSV_l, dSV_r; std::vector< tk::real > delt( U.nunk(), 0.0 ); const auto& cx = coord[0]; @@ -268,21 +477,27 @@ class MultiMat { // left element for (ncomp_t c=0; c( 0, rhok, u, v, w, + ugp[0][energyIdx(nmat, k)]/ugp[0][volfracIdx(nmat, k)], + k ); + a = std::max( a, eos_soundspeed< tag::multimat >( 0, rhok, p, k ) ); + } vn = u*geoFace(f,1,0) + v*geoFace(f,2,0) + w*geoFace(f,3,0); @@ -317,21 +532,27 @@ class MultiMat { for (ncomp_t c=0; c<5; ++c) { - auto mark = c*ndof; - ugp[1].push_back( U(eR, mark, m_offset) - + U(eR, mark+1, m_offset) * B_r[1] - + U(eR, mark+2, m_offset) * B_r[2] - + U(eR, mark+3, m_offset) * B_r[3]); + auto mark = c*rdof; + ugp[1].push_back( U(eR, mark, m_offset) ); } - rho = ugp[1][0]; - u = ugp[1][1]/rho; - v = ugp[1][2]/rho; - w = ugp[1][3]/rho; - rhoE = ugp[1][4]; - p = (g-1.0)*(rhoE - rho*(u*u + v*v + w*w)/2.0); + rho = 0.0; + for (std::size_t k=0; k( 0, rhok, u, v, w, + ugp[1][energyIdx(nmat, k)]/ugp[1][volfracIdx(nmat, k)], + k ); + a = std::max( a, eos_soundspeed< tag::multimat >( 0, rhok, p, k ) ); + } vn = u*geoFace(f,1,0) + v*geoFace(f,2,0) + w*geoFace(f,3,0); @@ -354,7 +575,7 @@ class MultiMat { return mindt; } - //! Extract the velocity field at cell nodes + //! Extract the velocity field at cell nodes. Currently unused. //! \param[in] U Solution vector at recent time step //! \param[in] N Element node indices //! \return Array of the four values of the velocity field @@ -363,11 +584,26 @@ class MultiMat { const std::array< std::vector< tk::real >, 3 >&, const std::array< std::size_t, 4 >& N ) const { + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[0]; + std::array< std::array< tk::real, 4 >, 3 > v; - v[0] = U.extract( 1, m_offset, N ); - v[1] = U.extract( 2, m_offset, N ); - v[2] = U.extract( 3, m_offset, N ); - auto r = U.extract( 0, m_offset, N ); + v[0] = U.extract( momentumIdx(nmat, 0)*rdof, m_offset, N ); + v[1] = U.extract( momentumIdx(nmat, 1)*rdof, m_offset, N ); + v[2] = U.extract( momentumIdx(nmat, 2)*rdof, m_offset, N ); + + std::vector< std::array< tk::real, 4 > > ar; + ar.resize(nmat); + for (std::size_t k=0; k r{{ 0.0, 0.0, 0.0, 0.0 }}; + for (std::size_t i=0; i > - avgElemToNode( const std::vector< std::size_t >& inpoel, - const tk::UnsMesh::Coords& coord, + avgElemToNode( const std::vector< std::size_t >& /*inpoel*/, + const tk::UnsMesh::Coords& /*coord*/, const tk::Fields& /*geoElem*/, - const tk::Fields& U ) const + const tk::Fields& /*U*/ ) const { - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); - const tk::real g = g_inputdeck.get< tag::param, eq, tag::gamma >()[0]; - - const auto& cx = coord[0]; - const auto& cy = coord[1]; - const auto& cz = coord[2]; - - std::vector< tk::real > count(cx.size(), 0); - std::vector< std::vector< tk::real > > - out( 6, std::vector< tk::real >( cx.size(), 0.0 ) ); - - for (std::size_t e=0; e, 4 > - pi{{ {{ cx[ inpoel[4*e] ], - cy[ inpoel[4*e] ], - cz[ inpoel[4*e] ] }}, - {{ cx[ inpoel[4*e+1] ], - cy[ inpoel[4*e+1] ], - cz[ inpoel[4*e+1] ] }}, - {{ cx[ inpoel[4*e+2] ], - cy[ inpoel[4*e+2] ], - cz[ inpoel[4*e+2] ] }}, - {{ cx[ inpoel[4*e+3] ], - cy[ inpoel[4*e+3] ], - cz[ inpoel[4*e+3] ] }} }}; - auto detT = tk::Jacobian( pi[0], pi[1], pi[2], pi[3] ); - - for (std::size_t i=0; i<4; ++i) - { - tk::real detT_gp; - // transformation of the physical coordinates of the quadrature point - // to reference space for the left element to be able to compute - // basis functions on the left element. - detT_gp = tk::Jacobian( pi[0], pi[i], pi[2], pi[3] ); - auto xi = detT_gp / detT; - detT_gp = tk::Jacobian( pi[0], pi[1], pi[i], pi[3] ); - auto eta = detT_gp / detT; - detT_gp = tk::Jacobian( pi[0], pi[1], pi[2], pi[i] ); - auto zeta = detT_gp / detT; - - auto B2 = 2.0 * xi + eta + zeta - 1.0; - auto B3 = 3.0 * eta + zeta - 1.0; - auto B4 = 4.0 * zeta - 1.0; - - std::vector< tk::real > ugp(5,0); - - for (ncomp_t c=0; c<5; ++c) - { - if (ndof == 1) { - ugp[c] = U(e, c, m_offset); - } else { - auto mark = c*ndof; - ugp[c] = U(e, mark, m_offset) - + U(e, mark+1, m_offset) * B2 - + U(e, mark+2, m_offset) * B3 - + U(e, mark+3, m_offset) * B4; - } - } - - auto u = ugp[1] / ugp[0]; - auto v = ugp[2] / ugp[0]; - auto w = ugp[3] / ugp[0]; - auto p = (g - 1) * (ugp[4] - 0.5 * ugp[0] * (u*u + v*v + w*w) ); - - out[0][ inpoel[4*e+i] ] += ugp[0]; - out[1][ inpoel[4*e+i] ] += u; - out[2][ inpoel[4*e+i] ] += v; - out[3][ inpoel[4*e+i] ] += w; - out[4][ inpoel[4*e+i] ] += ugp[4]/ugp[0]; - out[5][ inpoel[4*e+i] ] += p; - count[ inpoel[4*e+i] ] += 1.0; - } - } - - // average - for (std::size_t i=0; i > out; return out; } @@ -525,8 +681,8 @@ class MultiMat { const ncomp_t m_ncomp; //! Offset PDE system operates from const ncomp_t m_offset; - //! Riemann solver - RiemannSolver m_riemann; + ////! Riemann solver + //RiemannSolver m_riemann; //! Dirichlet BC configuration const std::vector< bcconf_t > m_bcdir; //! Symmetric BC configuration @@ -534,7 +690,7 @@ class MultiMat { //! Extrapolation BC configuration const std::vector< bcconf_t > m_bcextrapolate; - //! Evaluate physical flux function for this PDE system + //! Evaluate conservative part of physical flux function for this PDE system //! \param[in] system Equation system index //! \param[in] ncomp Number of scalar components in this PDE system //! \param[in] ugp Numerical solution at the Gauss point at which to @@ -543,39 +699,66 @@ class MultiMat { //! \note The function signature must follow tk::FluxFn static tk::FluxFn::result_type flux( ncomp_t system, - ncomp_t ncomp, + [[maybe_unused]] ncomp_t ncomp, const std::vector< tk::real >& ugp, const std::vector< std::array< tk::real, 3 > >& ) { Assert( ugp.size() == ncomp, "Size mismatch" ); - IGNORE(ncomp); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[system]; - const auto g = g_inputdeck.get< tag::param, eq, tag::gamma >()[ system ]; + tk::real rho(0.0), p(0.0); + for (std::size_t k=0; k pk( nmat, 0.0 ); + for (std::size_t k=0; k( system, + ugp[densityIdx(nmat, k)]/ugp[volfracIdx(nmat, k)], + u, v, w, + ugp[energyIdx(nmat, k)]/ugp[volfracIdx(nmat, k)], + k ); + p += ugp[volfracIdx(nmat, k)] * pk[k]; + } std::vector< std::array< tk::real, 3 > > fl( ugp.size() ); - fl[0][0] = ugp[1]; - fl[1][0] = ugp[1] * u + p; - fl[2][0] = ugp[1] * v; - fl[3][0] = ugp[1] * w; - fl[4][0] = u * (ugp[4] + p); + // conservative part of momentum flux + fl[momentumIdx(nmat, 0)][0] = ugp[momentumIdx(nmat, 0)] * u + p; + fl[momentumIdx(nmat, 1)][0] = ugp[momentumIdx(nmat, 1)] * u; + fl[momentumIdx(nmat, 2)][0] = ugp[momentumIdx(nmat, 2)] * u; - fl[0][1] = ugp[2]; - fl[1][1] = ugp[2] * u; - fl[2][1] = ugp[2] * v + p; - fl[3][1] = ugp[2] * w; - fl[4][1] = v * (ugp[4] + p); + fl[momentumIdx(nmat, 0)][1] = ugp[momentumIdx(nmat, 0)] * v; + fl[momentumIdx(nmat, 1)][1] = ugp[momentumIdx(nmat, 1)] * v + p; + fl[momentumIdx(nmat, 2)][1] = ugp[momentumIdx(nmat, 2)] * v; - fl[0][2] = ugp[3]; - fl[1][2] = ugp[3] * u; - fl[2][2] = ugp[3] * v; - fl[3][2] = ugp[3] * w + p; - fl[4][2] = w * (ugp[4] + p); + fl[momentumIdx(nmat, 0)][2] = ugp[momentumIdx(nmat, 0)] * w; + fl[momentumIdx(nmat, 1)][2] = ugp[momentumIdx(nmat, 1)] * w; + fl[momentumIdx(nmat, 2)][2] = ugp[momentumIdx(nmat, 2)] * w + p; + + for (std::size_t k=0; k& ) { - return {{ ul, Problem::solution( system, ncomp, x, y, z, t ) }}; + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[system]; + + auto ur = Problem::solution( system, ncomp, x, y, z, t ); + Assert( ur.size() == ncomp, "Incorrect size for boundary state vector" ); + + tk::real rho(0.0); + for (std::size_t k=0; k& ul, + Symmetry( ncomp_t system, ncomp_t ncomp, const std::vector< tk::real >& ul, tk::real, tk::real, tk::real, tk::real, const std::array< tk::real, 3 >& fn ) { - std::vector< tk::real > ur(5); + const auto nmat = + g_inputdeck.get< tag::param, tag::multimat, tag::nmat >()[system]; + + Assert( ul.size() == ncomp+3, "Incorrect size for appended internal " + "state vector" ); + + tk::real rho(0.0); + for (std::size_t k=0; k #include "Problem/UserDefined.hpp" -#include "Problem/VorticalFlow.hpp" +#include "Problem/InterfaceAdvection.hpp" +#include "Problem/SodShocktube.hpp" namespace inciter { //! List of all MultiMat Problem policies (defined in the includes above) using MultiMatProblems = brigand::list< MultiMatProblemUserDefined - , MultiMatProblemVorticalFlow >; + , MultiMatProblemSodShocktube + , MultiMatProblemInterfaceAdvection >; } // inciter:: diff --git a/src/PDE/MultiMat/Problem/CMakeLists.txt b/src/PDE/MultiMat/Problem/CMakeLists.txt new file mode 100644 index 00000000000..e475edc0ed7 --- /dev/null +++ b/src/PDE/MultiMat/Problem/CMakeLists.txt @@ -0,0 +1,22 @@ +add_library(MultiMatProblem + SodShocktube.cpp + InterfaceAdvection.cpp) + +target_include_directories(MultiMatProblem PUBLIC + ${QUINOA_SOURCE_DIR} + ${QUINOA_SOURCE_DIR}/Base + ${QUINOA_SOURCE_DIR}/Control + ${QUINOA_SOURCE_DIR}/Mesh + ${QUINOA_SOURCE_DIR}/PDE + ${PROJECT_BINARY_DIR}/../Main + ${BRIGAND_INCLUDE_DIRS} + ${PEGTL_INCLUDE_DIRS} + ${CHARM_INCLUDE_DIRS}) + +set_target_properties(MultiMatProblem + PROPERTIES LIBRARY_OUTPUT_NAME quinoa_multimatproblem) + +INSTALL(TARGETS MultiMatProblem + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} COMPONENT Runtime + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Runtime + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT Development) diff --git a/src/PDE/MultiMat/Problem/InterfaceAdvection.cpp b/src/PDE/MultiMat/Problem/InterfaceAdvection.cpp new file mode 100644 index 00000000000..ba0a90aa52d --- /dev/null +++ b/src/PDE/MultiMat/Problem/InterfaceAdvection.cpp @@ -0,0 +1,309 @@ +// ***************************************************************************** +/*! + \file src/PDE/MultiMat/Problem/InterfaceAdvection.cpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Problem configuration for the compressible flow equations + \details This file defines a Problem policy class for the compressible flow + equations, defined in PDE/MultiMat/MultiMat.h. See PDE/MultiMat/Problem.h + for general requirements on Problem policy classes for MultiMat. +*/ +// ***************************************************************************** + +#include "InterfaceAdvection.hpp" +#include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" +#include "MultiMat/MultiMatIndexing.hpp" + +//namespace inciter { +// +//extern ctr::InputDeck g_inputdeck; +// +//} // ::inciter + +using inciter::MultiMatProblemInterfaceAdvection; + +tk::SolutionFn::result_type +MultiMatProblemInterfaceAdvection::solution( ncomp_t system, + ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real /*z*/, + tk::real t ) +// ***************************************************************************** +//! Evaluate analytical solution at (x,y,z,t) for all components +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] x X coordinate where to evaluate the solution +//! \param[in] y Y coordinate where to evaluate the solution +//! \param[in] t Time where to evaluate the solution +//! \return Values of all components evaluated at (x) +//! \note The function signature must follow tk::SolutionFn +// ***************************************************************************** +{ + auto nmat = + g_inputdeck.get< tag::param, eq, tag::nmat >()[system]; + + Assert( ncomp == 3*nmat+3, "Incorrect number of components in multi-material " + "system" ); + + std::vector< tk::real > s( ncomp, 0.0 ); + auto u = std::sqrt(50.0); + auto v = std::sqrt(50.0); + auto w = 0.0; + auto alphamin = 1.0e-12; + + // center of the cylinder + auto x0 = 0.45 + u*t; + auto y0 = 0.45 + v*t; + + // radii of the material-rings + std::vector< tk::real > r0(nmat, 0.0); + r0[nmat-1] = 0.0; + r0[nmat-2] = 0.1; + r0[0] = 0.35; + for (std::size_t k=1; k(nmat-2)) ); + + for (std::size_t k=0; k=r0[k+1]) + { + s[volfracIdx(nmat, k)] = 1.0 - static_cast(nmat-1)*alphamin; + is_mat = true; + } + } + if (!is_mat) + { + s[volfracIdx(nmat, nmat-1)] = 1.0 - static_cast(nmat-1)*alphamin; + } + + auto rhob = 0.0; + for (std::size_t k=0; k( system, 1.0e5, 300.0, k ); + s[densityIdx(nmat, k)] = s[volfracIdx(nmat, k)] * rhok; + s[energyIdx(nmat, k)] = s[volfracIdx(nmat, k)] + * eos_totalenergy< eq >( system, rhok, u, v, w, 1.0e5, k ); + rhob += s[densityIdx(nmat, k)]; + } + s[momentumIdx(nmat, 0)] = rhob * u; + s[momentumIdx(nmat, 1)] = rhob * v; + s[momentumIdx(nmat, 2)] = rhob * w; + + return s; +} + +std::vector< tk::real > +MultiMatProblemInterfaceAdvection::solinc( ncomp_t system, + ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real z, + tk::real t, + tk::real dt ) +// ***************************************************************************** +// Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) +// for all components +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] x X coordinate where to evaluate the solution +//! \param[in] y Y coordinate where to evaluate the solution +//! \param[in] z Z coordinate where to evaluate the solution +//! \param[in] t Time where to evaluate the solution increment starting from +//! \param[in] dt Time increment at which evaluate the solution increment to +//! \return Increment in values of all components evaluated at (x,y,z,t+dt) +// ***************************************************************************** +{ + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); + + std::transform( begin(st1), end(st1), begin(st2), begin(st2), + []( tk::real s, tk::real& d ){ return d -= s; } ); + + return st2; +} + +tk::SrcFn::result_type +MultiMatProblemInterfaceAdvection::src( ncomp_t, ncomp_t ncomp, tk::real, + tk::real, tk::real, tk::real ) +// ***************************************************************************** +// Compute and return source term for manufactured solution +//! \param[in] ncomp Number of scalar components in this PDE system +//! \return Array of reals containing the source for all components +//! \note The function signature must follow tk::SrcFn +// ***************************************************************************** +{ + std::vector< tk::real > s( ncomp, 0.0 ); + + return s; +} + +void +MultiMatProblemInterfaceAdvection::side( std::unordered_set< int >& conf ) +// ***************************************************************************** +// Query all side set IDs the user has configured for all components in this +// PDE system +//! \param[in,out] conf Set of unique side set IDs to add to +// ***************************************************************************** +{ + using tag::param; + + for (const auto& s : g_inputdeck.get< param, eq, tag::bcdir >()) + for (const auto& i : s) conf.insert( std::stoi(i) ); + + for (const auto& s : g_inputdeck.get< param, eq, tag::bcextrapolate >()) + for (const auto& i : s) conf.insert( std::stoi(i) ); + + for (const auto& s : g_inputdeck.get< param, eq, tag::bcsym >()) + for (const auto& i : s) conf.insert( std::stoi(i) ); +} + +std::vector< std::string > +MultiMatProblemInterfaceAdvection::fieldNames( ncomp_t ) +// ***************************************************************************** +// Return field names to be output to file +//! \return Vector of strings labelling fields output in file +// ***************************************************************************** +{ + auto nmat = + g_inputdeck.get< tag::param, eq, tag::nmat >()[0]; + + std::vector< std::string > n; + + for (std::size_t k=0; k > +MultiMatProblemInterfaceAdvection::fieldOutput( + ncomp_t system, + ncomp_t, + ncomp_t offset, + tk::real /*t*/, + tk::real, + const std::vector< tk::real >&, + const std::array< std::vector< tk::real >, 3 >& /*coord*/, + tk::Fields& U ) +// ***************************************************************************** +// Return field output going to file +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] offset System offset specifying the position of the system of +//! PDEs among other systems +//! \param[in] t Physical time +//! \param[in] coord Mesh node coordinates +//! \param[in] U Solution vector at recent time step +//! \return Vector of vectors to be output to file +// ***************************************************************************** +{ + // number of degree of freedom + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); + + //// ratio of specific heats + //tk::real g = + // g_inputdeck.get< tag::param, eq, tag::gamma >()[system]; + + auto nmat = + g_inputdeck.get< tag::param, eq, tag::nmat >()[system]; + + std::vector< std::vector< tk::real > > out; + std::vector< std::vector< tk::real > > al, ar, ae; + + for (std::size_t k=0; k r( ru.size(), 0.0 ); + for (std::size_t i=0; i u = ru; + std::transform( r.begin(), r.end(), u.begin(), u.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( u ); + + std::vector< tk::real > v = rv; + std::transform( r.begin(), r.end(), v.begin(), v.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( v ); + + std::vector< tk::real > w = rw; + std::transform( r.begin(), r.end(), w.begin(), w.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( w ); + + // bulk pressure + std::vector< tk::real > P( r.size(), 0.0 ); + for (std::size_t i=0; i( system, ar[k][i]/al[k][i], + u[i], v[i], w[i], + ae[k][i]/al[k][i], k ); + } + out.push_back( P ); + + // bulk total energy density + std::vector< tk::real > E( r.size(), 0.0 ); + for (std::size_t i=0; i +MultiMatProblemInterfaceAdvection::names( ncomp_t ) +// ***************************************************************************** +// Return names of integral variables to be output to diagnostics file +//! \return Vector of strings labelling integral variables output +// ***************************************************************************** +{ + return { "r", "ru", "rv", "rw", "re" }; +} diff --git a/src/PDE/MultiMat/Problem/InterfaceAdvection.hpp b/src/PDE/MultiMat/Problem/InterfaceAdvection.hpp new file mode 100644 index 00000000000..aefb40663b7 --- /dev/null +++ b/src/PDE/MultiMat/Problem/InterfaceAdvection.hpp @@ -0,0 +1,95 @@ +// ***************************************************************************** +/*! + \file src/PDE/MultiMat/Problem/InterfaceAdvection.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Problem configuration for the multi-material compressible flow + equations + \details This file defines a Problem policy class for the multi-material + compressible flow equations, defined under PDE/MultiMat. See + PDE/MultiMat/Problem.hpp for general requirements on Problem policy classes + for MultiMat. +*/ +// ***************************************************************************** +#ifndef MultiMatProblemInterfaceAdvection_h +#define MultiMatProblemInterfaceAdvection_h + +#include +#include + +#include "Types.hpp" +#include "Fields.hpp" +#include "FunctionPrototypes.hpp" +#include "SystemComponents.hpp" +#include "Inciter/Options/Problem.hpp" +#include "Inciter/InputDeck/InputDeck.hpp" + +namespace inciter { + +extern ctr::InputDeck g_inputdeck; + +//! MultiMat system of PDEs problem: interface advection +//! \see Waltz, et. al, "Manufactured solutions for the three-dimensional Euler +//! equations with relevance to Inertial Confinement Fusion", Journal of +//! Computational Physics 267 (2014) 196-209. +class MultiMatProblemInterfaceAdvection { + + private: + using ncomp_t = tk::ctr::ncomp_t; + using eq = tag::multimat; + + public: + //! Evaluate analytical solution at (x,y,z,t) for all components + static tk::SolutionFn::result_type + solution( ncomp_t system, + ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real /*z*/, + tk::real t ); + + //! \brief Evaluate the increment from t to t+dt of the analytical solution + //! at (x,y,z) for all components + static std::vector< tk::real > + solinc( ncomp_t system, + ncomp_t ncomp, + tk::real x, + tk::real y, + tk::real z, + tk::real t, + tk::real dt ); + + //! Compute and return source term for interface advection + static tk::SrcFn::result_type + src( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real ); + + //! \brief Query all side set IDs the user has configured for all components + //! in this PDE system + static void side( std::unordered_set< int >& conf ); + + //! Return field names to be output to file + static std::vector< std::string > fieldNames( ncomp_t ); + + //! Return field output going to file + static std::vector< std::vector< tk::real > > + fieldOutput( ncomp_t system, + ncomp_t /*ncomp*/, + ncomp_t offset, + tk::real t, + tk::real, + const std::vector< tk::real >&, + const std::array< std::vector< tk::real >, 3 >& coord, + tk::Fields& U ); + + //! Return names of integral variables to be output to diagnostics file + static std::vector< std::string > names( ncomp_t ); + + static ctr::ProblemType type() noexcept + { return ctr::ProblemType::INTERFACE_ADVECTION; } +}; + +} // inciter:: + +#endif // MultiMatProblemInterfaceAdvection_h diff --git a/src/PDE/MultiMat/Problem/SodShocktube.cpp b/src/PDE/MultiMat/Problem/SodShocktube.cpp new file mode 100644 index 00000000000..bb0e462ccdd --- /dev/null +++ b/src/PDE/MultiMat/Problem/SodShocktube.cpp @@ -0,0 +1,284 @@ +// ***************************************************************************** +/*! + \file src/PDE/MultiMat/Problem/SodShocktube.cpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Problem configuration for the compressible flow equations + \details This file defines a Problem policy class for the multi-material + compressible flow equations, defined in PDE/MultiMat/MultiMat.hpp. See + PDE/MultiMat/Problem.hpp for general requirements on Problem policy classes + for MultiMat. +*/ +// ***************************************************************************** + +#include "SodShocktube.hpp" +#include "Inciter/InputDeck/InputDeck.hpp" +#include "EoS/EoS.hpp" +#include "MultiMat/MultiMatIndexing.hpp" + +namespace inciter { + +extern ctr::InputDeck g_inputdeck; + +} // ::inciter + +using inciter::MultiMatProblemSodShocktube; + +tk::SolutionFn::result_type +MultiMatProblemSodShocktube::solution( ncomp_t system, + ncomp_t ncomp, + tk::real x, + tk::real, + tk::real, + tk::real ) +// ***************************************************************************** +//! Evaluate analytical solution at (x,y,z,t) for all components +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] x X coordinate where to evaluate the solution +//! \return Values of all components evaluated at (x) +//! \note The function signature must follow tk::SolutionFn +//! \details This function only initializes the Sod shock tube problem, but does +//! not actually give the analytical solution at time greater than 0. The +//! analytical solution would require an exact Riemann solver, which has not +//! been implemented yet. +// ***************************************************************************** +{ + Assert( ncomp == 9, "Number of scalar components must be 5" ); + + auto nmat = + g_inputdeck.get< tag::param, eq, tag::nmat >()[system]; + + std::vector< tk::real > s( ncomp, 0.0 ); + tk::real r, p, u, v, w; + auto alphamin = 1.0e-12; + + if (x<0.5) { + // volume-fraction + s[volfracIdx(nmat, 0)] = 1.0-alphamin; + s[volfracIdx(nmat, 1)] = alphamin; + // density + r = 1.0; + // pressure + p = 1.0; + // velocity + u = 0.0; + v = 0.0; + w = 0.0; + } + else { + // volume-fraction + s[volfracIdx(nmat, 0)] = alphamin; + s[volfracIdx(nmat, 1)] = 1.0-alphamin; + // density + r = 0.125; + // pressure + p = 0.1; + // velocity + u = 0.0; + v = 0.0; + w = 0.0; + } + s[densityIdx(nmat, 0)] = s[volfracIdx(nmat, 0)]*r; + s[densityIdx(nmat, 1)] = s[volfracIdx(nmat, 1)]*r; + // total specific energy + s[energyIdx(nmat, 0)] = s[volfracIdx(nmat, 0)]* + eos_totalenergy< eq >( system, r, u, v, w, p, 0 ); + s[energyIdx(nmat, 1)] = s[volfracIdx(nmat, 1)]* + eos_totalenergy< eq >( system, r, u, v, w, p, 1 ); + + return s; +} + +std::vector< tk::real > +MultiMatProblemSodShocktube::solinc( ncomp_t system, ncomp_t ncomp, tk::real x, + tk::real y, tk::real z, tk::real t, tk::real dt ) +// ***************************************************************************** +// Evaluate the increment from t to t+dt of the analytical solution at (x,y,z) +// for all components +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] x X coordinate where to evaluate the solution +//! \param[in] y Y coordinate where to evaluate the solution +//! \param[in] z Z coordinate where to evaluate the solution +//! \param[in] t Time where to evaluate the solution increment starting from +//! \param[in] dt Time increment at which evaluate the solution increment to +//! \return Increment in values of all components evaluated at (x,y,z,t+dt) +// ***************************************************************************** +{ + auto st1 = solution( system, ncomp, x, y, z, t ); + auto st2 = solution( system, ncomp, x, y, z, t+dt ); + + std::transform( begin(st1), end(st1), begin(st2), begin(st2), + []( tk::real s, tk::real& d ){ return d -= s; } ); + + return st2; +} + +tk::SrcFn::result_type +MultiMatProblemSodShocktube::src( ncomp_t, ncomp_t ncomp, tk::real, + tk::real, tk::real, tk::real ) +// ***************************************************************************** +// Compute and return source term for manufactured solution +//! \param[in] ncomp Number of scalar components in this PDE system +//! \return Array of reals containing the source for all components +//! \note The function signature must follow tk::SrcFn +// ***************************************************************************** +{ + std::vector< tk::real > s( ncomp, 0.0 ); + + return s; +} + +void +MultiMatProblemSodShocktube::side( std::unordered_set< int >& conf ) +// ***************************************************************************** +// Query all side set IDs the user has configured for all components in this +// PDE system +//! \param[in,out] conf Set of unique side set IDs to add to +// ***************************************************************************** +{ + using tag::param; + + for (const auto& s : g_inputdeck.get< param, eq, tag::bcextrapolate >()) + for (const auto& i : s) conf.insert( std::stoi(i) ); + + for (const auto& s : g_inputdeck.get< param, eq, tag::bcsym >()) + for (const auto& i : s) conf.insert( std::stoi(i) ); +} + +std::vector< std::string > +MultiMatProblemSodShocktube::fieldNames( ncomp_t ) +// ***************************************************************************** +// Return field names to be output to file +//! \return Vector of strings labelling fields output in file +// ***************************************************************************** +{ + std::vector< std::string > n; + + n.push_back( "volfrac1_numerical" ); + n.push_back( "volfrac2_numerical" ); + n.push_back( "density_numerical" ); + //n.push_back( "density_analytical" ); + n.push_back( "x-velocity_numerical" ); + //n.push_back( "x-velocity_analytical" ); + //n.push_back( "err(u)" ); + n.push_back( "y-velocity_numerical" ); + //n.push_back( "y-velocity_analytical" ); + n.push_back( "z-velocity_numerical" ); + //n.push_back( "z-velocity_analytical" ); + n.push_back( "pressure_numerical" ); + //n.push_back( "pressure_analytical" ); + n.push_back( "total_energy_density_numerical" ); + //n.push_back( "specific_total_energy_analytical" ); + //n.push_back( "err(E)" ); + + return n; +} + +std::vector< std::vector< tk::real > > +MultiMatProblemSodShocktube::fieldOutput( + ncomp_t system, + ncomp_t, + ncomp_t offset, + tk::real, + tk::real, + const std::vector< tk::real >&, + const std::array< std::vector< tk::real >, 3 >&, + tk::Fields& U ) +// ***************************************************************************** +// Return field output going to file +//! \param[in] system Equation system index, i.e., which compressible +//! flow equation system we operate on among the systems of PDEs +//! \param[in] offset System offset specifying the position of the system of +//! PDEs among other systems +//! \param[in] U Solution vector at recent time step +//! \return Vector of vectors to be output to file +// ***************************************************************************** +{ + // number of degree of freedom + const std::size_t rdof = + g_inputdeck.get< tag::discr, tag::rdof >(); + + auto nmat = + g_inputdeck.get< tag::param, eq, tag::nmat >()[system]; + + std::vector< std::vector< tk::real > > out; + std::vector< std::vector< tk::real > > al, ar, ae; + + for (std::size_t k=0; k r( ru.size(), 0.0 ); + for (std::size_t i=0; i u = ru; + std::transform( r.begin(), r.end(), u.begin(), u.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( u ); + + std::vector< tk::real > v = rv; + std::transform( r.begin(), r.end(), v.begin(), v.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( v ); + + std::vector< tk::real > w = rw; + std::transform( r.begin(), r.end(), w.begin(), w.begin(), + []( tk::real s, tk::real& d ){ return d /= s; } ); + out.push_back( w ); + + // bulk pressure + std::vector< tk::real > P( r.size(), 0.0 ); + for (std::size_t i=0; i( system, ar[k][i]/al[k][i], + u[i], v[i], w[i], + ae[k][i]/al[k][i], k ); + } + out.push_back( P ); + + // bulk total energy density + std::vector< tk::real > E( r.size(), 0.0 ); + for (std::size_t i=0; i +MultiMatProblemSodShocktube::names( ncomp_t ) +// ***************************************************************************** +// Return names of integral variables to be output to diagnostics file +//! \return Vector of strings labelling integral variables output +// ***************************************************************************** +{ + return { "r", "ru", "rv", "rw", "re" }; +} diff --git a/src/PDE/MultiMat/Problem/SodShocktube.hpp b/src/PDE/MultiMat/Problem/SodShocktube.hpp new file mode 100644 index 00000000000..e2c70faaa13 --- /dev/null +++ b/src/PDE/MultiMat/Problem/SodShocktube.hpp @@ -0,0 +1,82 @@ +// ***************************************************************************** +/*! + \file src/PDE/MultiMat/Problem/SodShocktube.hpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Problem configuration for Sod's shock-tube + \details This file defines a policy class for the multi-material + compressible flow equations, defined in PDE/MultiMat/MultiMat.hpp. + See PDE/MultiMat/Problem.hpp for general requirements on Problem policy + classes for MultiMat. +*/ +// ***************************************************************************** +#ifndef MultiMatProblemSodShocktube_h +#define MultiMatProblemSodShocktube_h + +#include +#include + +#include "Types.hpp" +#include "Fields.hpp" +#include "FunctionPrototypes.hpp" +#include "SystemComponents.hpp" +#include "Inciter/Options/Problem.hpp" + +namespace inciter { + +//! MultiMat system of PDEs problem: Sod shock-tube +//! \see G. A. Sod. A Survey of Several Finite Difference Methods for Systems of +//! Nonlinear Hyperbolic Conservation Laws. J. Comput. Phys., 27:1–31, 1978. +class MultiMatProblemSodShocktube { + + protected: + using ncomp_t = tk::ctr::ncomp_t; + using eq = tag::multimat; + + public: + //! Evaluate analytical solution at (x,y,0) for all components + static tk::SolutionFn::result_type + solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real, tk::real, + tk::real ); + + //! \brief Evaluate the increment from t to t+dt of the analytical solution + //! at (x,y,z) for all components + static std::vector< tk::real > + solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, + tk::real t, tk::real dt ); + + //! Compute and return source term for this problem + static tk::SrcFn::result_type + src( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real ); + + //! \brief Query all side set IDs the user has configured for all components + //! in this PDE system + static void side( std::unordered_set< int >& conf ); + + //! Return field names to be output to file + static std::vector< std::string > fieldNames( ncomp_t ); + + //! Return field output going to file + static std::vector< std::vector< tk::real > > + fieldOutput( ncomp_t system, + ncomp_t /*ncomp*/, + ncomp_t offset, + tk::real, + tk::real /*V*/, + const std::vector< tk::real >& /*vol*/, + const std::array< std::vector< tk::real >, 3 >& /*coord*/, + tk::Fields& U ); + + //! Return names of integral variables to be output to diagnostics file + static std::vector< std::string > names( ncomp_t ); + + //! Return problem type + static ctr::ProblemType type() noexcept + { return ctr::ProblemType::SOD_SHOCKTUBE; } +}; + +} // inciter:: + +#endif // MultiMatProblemSodShocktube_h diff --git a/src/PDE/MultiMat/Problem/UserDefined.hpp b/src/PDE/MultiMat/Problem/UserDefined.hpp index 57205145e13..772e7f4d74b 100644 --- a/src/PDE/MultiMat/Problem/UserDefined.hpp +++ b/src/PDE/MultiMat/Problem/UserDefined.hpp @@ -22,6 +22,7 @@ #include "Types.hpp" #include "FunctionPrototypes.hpp" #include "Inciter/Options/Problem.hpp" +#include "EoS/EoS.hpp" namespace inciter { @@ -29,8 +30,8 @@ namespace inciter { class MultiMatProblemUserDefined { private: - using ncomp_t = tk::ctr::ncomp_type; - static constexpr ncomp_t m_ncomp = 5; //!< Number of scalar components + using ncomp_t = tk::ctr::ncomp_t; + using eq = tag::compflow; public: //! Evaluate initial condition solution at (x,y,z,t) for all components @@ -44,17 +45,15 @@ class MultiMatProblemUserDefined { //! \return Values of all components evaluated at (x,y,z,t) //! \note The function signature must follow tk::SolutionFn static tk::SolutionFn::result_type - solution( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real z, - tk::real t ) + solution( [[maybe_unused]] ncomp_t system, + [[maybe_unused]] ncomp_t ncomp, + [[maybe_unused]] tk::real x, + [[maybe_unused]] tk::real y, + [[maybe_unused]] tk::real z, + [[maybe_unused]] tk::real t ) { - Assert( ncomp == m_ncomp, "Number of scalar components must be " + - std::to_string(m_ncomp) ); - IGNORE(system); - IGNORE(ncomp); - IGNORE(x); - IGNORE(y); - IGNORE(z); - IGNORE(t); + Assert( ncomp == ncomp, "Number of scalar components must be " + + std::to_string(ncomp) ); return {{ 1.0, 0.0, 0.0, 1.0, 293.0 }}; } @@ -62,7 +61,9 @@ class MultiMatProblemUserDefined { //! at (x,y,z) for all components //! \return Increment in values of all components: all zero for now static std::array< tk::real, 5 > - solinc( ncomp_t, tk::real, tk::real, tk::real, tk::real, tk::real ) { + solinc( ncomp_t, ncomp_t, tk::real, tk::real, tk::real, tk::real, + tk::real ) + { return {{ 0.0, 0.0, 0.0, 0.0, 0.0 }}; } @@ -136,12 +137,11 @@ class MultiMatProblemUserDefined { []( tk::real s, tk::real& d ){ return d /= s; } ); out.push_back( E ); std::vector< tk::real > p = r; - tk::real g = g_inputdeck.get< tag::param, tag::compflow, tag::gamma >()[0]; for (std::size_t i=0; i( 0, r[i], u[i], v[i], w[i], re[i], 0 ); out.push_back( p ); std::vector< tk::real > T = r; - tk::real cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0]; + tk::real cv = g_inputdeck.get< tag::param, tag::compflow, tag::cv >()[0][0]; for (std::size_t i=0; i -#include - -#include "Types.hpp" -#include "FunctionPrototypes.hpp" -#include "Inciter/Options/Problem.hpp" - -namespace inciter { - -//! MultiMat system of PDEs problem: vortical flow -//! \see Waltz, et. al, "Manufactured solutions for the three-dimensional Euler -//! equations with relevance to Inertial Confinement Fusion", Journal of -//! Computational Physics 267 (2014) 196-209. -class MultiMatProblemVorticalFlow { - - private: - using ncomp_t = tk::ctr::ncomp_type; - using eq = tag::multimat; - - public: - //! Evaluate analytical solution at (x,y,z) for all components - //! \param[in] ncomp Number of scalar components in this PDE system - //! \return Values of all components evaluated at (x,y,z) - //! \note The function signature must follow tk::SolutionFn - static tk::SolutionFn::result_type - solution( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real ) - { - return std::vector< tk::real >( ncomp, 0.0 ); - } - - //! \brief Evaluate the increment from t to t+dt of the analytical solution - //! at (x,y,z) for all components - //! \param[in] ncomp Number of scalar components in this PDE system - //! \return Increment in values of all components: all zero for this problem - static std::vector< tk::real > - solinc( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real, - tk::real ) - { - return std::vector< tk::real >( ncomp, 0.0 ); - } - - //! Compute and return source term for vortical flow manufactured solution - //! \param[in] ncomp Number of scalar components in this PDE system - //! \return Array of reals containing the source for all components - //! \note The function signature must follow tk::SrcFn - static tk::SrcFn::result_type - src( ncomp_t, ncomp_t ncomp, tk::real, tk::real, tk::real, tk::real ) { - return std::vector< tk::real >( ncomp, 0.0 ); - } - - //! \brief Query all side set IDs the user has configured for all components - //! in this PDE system - //! \param[in,out] conf Set of unique side set IDs to add to - static void side( std::unordered_set< int >& conf ) { - using tag::param; using tag::bcdir; - for (const auto& s : g_inputdeck.get< param, eq, bcdir >()) - for (const auto& i : s) - conf.insert( std::stoi(i) ); - } - - //! Return field names to be output to file - //! \param[in] ncomp Number of scalar components in this PDE system - //! \return Vector of strings labelling fields output in file - static std::vector< std::string > fieldNames( ncomp_t ncomp ) { - return std::vector< std::string >( ncomp, "fieldvar" ); - } - - //! Return field output going to file - //! \param[in] ncomp Number of scalar components in this PDE system - //! \param[in] U Solution vector at recent time step - //! \return Vector of vectors to be output to file - static std::vector< std::vector< tk::real > > - fieldOutput( ncomp_t, - ncomp_t ncomp, - ncomp_t, - tk::real, - tk::real, - const std::vector< tk::real >&, - const std::array< std::vector< tk::real >, 3 >&, - tk::Fields& U ) - { - return std::vector< std::vector< tk::real > > - ( ncomp, std::vector< tk::real >( U.nunk(), 0.0 ) ); - } - - //! Return names of integral variables to be output to diagnostics file - //! \param[in] ncomp Number of scalar components in this PDE system - //! \return Vector of strings labelling integral variables output - static std::vector< std::string > names( ncomp_t ncomp ) { - return std::vector< std::string >( ncomp, "diagvar" ); - } - - static ctr::ProblemType type() noexcept - { return ctr::ProblemType::VORTICAL_FLOW; } -}; - -} // inciter:: - -#endif // MultiMatProblemVorticalFlow_h diff --git a/src/PDE/PDEFactory.hpp b/src/PDE/PDEFactory.hpp index 3aa6bbb8f79..6ecfe97d1eb 100644 --- a/src/PDE/PDEFactory.hpp +++ b/src/PDE/PDEFactory.hpp @@ -28,12 +28,12 @@ namespace inciter { //! \brief Factory for PDEs using continuous Galerkin discretization storing //! keys associated to their constructors using CGFactory = - std::map< ctr::PDEKey, std::function< CGPDE(const tk::ctr::ncomp_type&) > >; + std::map< ctr::PDEKey, std::function< CGPDE(const tk::ctr::ncomp_t&) > >; //! \brief Factory for PDEs using discontinuous Galerkin discretization storing //! keys associated to their constructors using DGFactory = - std::map< ctr::PDEKey, std::function< DGPDE(const tk::ctr::ncomp_type&) > >; + std::map< ctr::PDEKey, std::function< DGPDE(const tk::ctr::ncomp_t&) > >; //! \brief Function object for registering a partial differential equation //! into the partial differential equation factory @@ -70,10 +70,10 @@ struct registerPDE { // Get problem policy: last type of brigand::list U using Problem = typename brigand::back< U >; // Build differential equation key - ctr::PDEKey key{ type, Physics::type(), Problem::type() }; + ctr::PDEKey key{{ type, Physics::type(), Problem::type() }}; // Register equation (with policies given by brigand::list U) into factory tk::recordModelLate< PDE, Eq< Physics, Problem > > - ( factory, key, static_cast(0) ); + ( factory, key, static_cast(0) ); } }; diff --git a/src/PDE/PDEStack.cpp b/src/PDE/PDEStack.cpp index b5edd7bbf53..ee2430e48ed 100644 --- a/src/PDE/PDEStack.cpp +++ b/src/PDE/PDEStack.cpp @@ -140,7 +140,8 @@ PDEStack::selectedDG() const std::vector< DGPDE > pdes; // will store instantiated PDEs auto sch = g_inputdeck.get< tag::discr, tag::scheme >(); - if (sch == ctr::SchemeType::DG || sch == ctr::SchemeType::DGP1 || + if (sch == ctr::SchemeType::DG || + sch == ctr::SchemeType::P0P1 || sch == ctr::SchemeType::DGP1 || sch == ctr::SchemeType::DGP2 || sch == ctr::SchemeType::PDG) { for (const auto& d : g_inputdeck.get< tag::selected, tag::pde >()) { diff --git a/src/PDE/PDEStack.hpp b/src/PDE/PDEStack.hpp index a1be3ae9274..0525e7e9bfc 100644 --- a/src/PDE/PDEStack.hpp +++ b/src/PDE/PDEStack.hpp @@ -42,7 +42,7 @@ extern ctr::InputDeck g_inputdeck; class PDEStack { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; public: //! Constructor: register partial differential equations into factory @@ -104,9 +104,9 @@ class PDEStack { "equation consists of. See inciter::deck::check_eq." ); if ( g_inputdeck.get< tag::component, EqTag >()[c] ) { // re-create key and search for it - ctr::PDEKey key{ eq, + ctr::PDEKey key{{ eq, g_inputdeck.get< tag::param, EqTag, tag::physics >()[c], - g_inputdeck.get< tag::param, EqTag, tag::problem >()[c] }; + g_inputdeck.get< tag::param, EqTag, tag::problem >()[c] }}; const auto it = f.find( key ); Assert( it != end( f ), "Can't find PDE with key('" + diff --git a/src/PDE/Reconstruction.cpp b/src/PDE/Reconstruction.cpp new file mode 100644 index 00000000000..fc66aa87422 --- /dev/null +++ b/src/PDE/Reconstruction.cpp @@ -0,0 +1,316 @@ +// ***************************************************************************** +/*! + \file src/PDE/Reconstruction.cpp + \copyright 2012-2015 J. Bakosi, + 2016-2018 Los Alamos National Security, LLC., + 2019 Triad National Security, LLC. + All rights reserved. See the LICENSE file for details. + \brief Reconstruction for reconstructed discontinuous Galerkin methods + \details This file contains functions that reconstruct an "n"th order + polynomial to an "n+1"th order polynomial using a least-squares + reconstruction procedure. +*/ +// ***************************************************************************** + +#include +#include + +#include "Vector.hpp" +#include "Reconstruction.hpp" + +void +tk::intLeastSq_P0P1( ncomp_t ncomp, + ncomp_t offset, + const std::size_t rdof, + const inciter::FaceData& fd, + const Fields& geoElem, + const Fields& U, + std::vector< std::array< std::array< real, 3 >, 3 > >& lhs_ls, + std::vector< std::vector< std::array< real, 3 > > >& rhs_ls ) +// ***************************************************************************** +// Compute internal surface contributions to the least-squares reconstruction +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] offset Offset this PDE system operates from +//! \param[in] rdof Maximum number of reconstructed degrees of freedom +//! \param[in] fd Face connectivity and boundary conditions object +//! \param[in] geoElem Element geometry array +//! \param[in] U Solution vector at recent time step +//! \param[in,out] lhs_ls LHS reconstruction matrix +//! \param[in,out] rhs_ls RHS reconstruction vector +// ***************************************************************************** +{ + const auto& esuf = fd.Esuf(); + + // Compute internal face contributions + for (auto f=fd.Nbfac(); f -1 && esuf[2*f+1] > -1, "Interior element detected " + "as -1" ); + + auto el = static_cast< std::size_t >(esuf[2*f]); + auto er = static_cast< std::size_t >(esuf[2*f+1]); + + // get a 3x3 system by applying the normal equation approach to the + // least-squares overdetermined system + std::array< real, 3 > wdeltax{{ geoElem(er,1,0)-geoElem(el,1,0), + geoElem(er,2,0)-geoElem(el,2,0), + geoElem(er,3,0)-geoElem(el,3,0) }}; + + for (std::size_t idir=0; idir<3; ++idir) + { + // rhs vector + for (ncomp_t c=0; c& bcconfig, + const inciter::FaceData& fd, + const Fields& geoFace, + const Fields& geoElem, + real t, + const StateFn& state, + const Fields& U, + std::vector< std::array< std::array< real, 3 >, 3 > >& lhs_ls, + std::vector< std::vector< std::array< real, 3 > > >& rhs_ls, + std::size_t nprim ) +// ***************************************************************************** +// Compute boundary face contributions to the least-squares reconstruction +//! \param[in] system Equation system index +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] offset Offset this PDE system operates from +//! \param[in] rdof Maximum number of reconstructed degrees of freedom +//! \param[in] bcconfig BC configuration vector for multiple side sets +//! \param[in] fd Face connectivity and boundary conditions object +//! \param[in] geoFace Face geometry array +//! \param[in] geoElem Element geometry array +//! \param[in] t Physical time +//! \param[in] state Function to evaluate the left and right solution state at +//! boundaries +//! \param[in] U Solution vector at recent time step +//! \param[in,out] lhs_ls LHS reconstruction matrix +//! \param[in,out] rhs_ls RHS reconstruction vector +//! \param[in] nprim Number of primitive quantities stored for this PDE system. +//! A default is set to 0, so that calling code for systems that do not store +//! primitive quantities does not need to specify this argument. +// ***************************************************************************** +{ + const auto& bface = fd.Bface(); + const auto& esuf = fd.Esuf(); + + for (const auto& s : bcconfig) { // for all bc sidesets + auto bc = bface.find( std::stoi(s) );// faces for side set + if (bc != end(bface)) + { + // Compute boundary face contributions + for (const auto& f : bc->second) + { + Assert( esuf[2*f+1] == -1, "physical boundary element not -1" ); + + std::size_t el = static_cast< std::size_t >(esuf[2*f]); + + // arrays for quadrature points + std::array< real, 3 > + fc{{ geoFace(f,4,0), geoFace(f,5,0), geoFace(f,6,0) }}; + std::array< real, 3 > + fn{{ geoFace(f,1,0), geoFace(f,2,0), geoFace(f,3,0) }}; + + // Compute the state variables at the left element + std::vector< real >B(1,1.0); + auto ul = eval_state( ncomp, offset, rdof, 1, el, U, B ); + std::vector< real >fvel(nprim,0.0); + + // consolidate primitives into state vector + ul.insert(ul.end(), fvel.begin(), fvel.end()); + + Assert( ul.size() == ncomp+fvel.size(), "Incorrect size for " + "appended boundary state vector" ); + + // Compute the state at the face-center using BC + auto ustate = state( system, ncomp, ul, fc[0], fc[1], fc[2], t, fn ); + + std::array< real, 3 > wdeltax{{ fc[0]-geoElem(el,1,0), + fc[1]-geoElem(el,2,0), + fc[2]-geoElem(el,3,0) }}; + + for (std::size_t idir=0; idir<3; ++idir) + { + // rhs vector + for (ncomp_t c=0; c, 3 > >& lhs, + const std::vector< std::vector< std::array< real, 3 > > >& rhs, + Fields& U ) +// ***************************************************************************** +// Solve 3x3 system for least-squares reconstruction +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] offset Offset this PDE system operates from +//! \param[in] rdof Maximum number of reconstructed degrees of freedom +//! \param[in] lhs LHS reconstruction matrix +//! \param[in] rhs RHS reconstruction vector +//! \param[in,out] U Solution vector at recent time step +// ***************************************************************************** +{ + for (std::size_t e=0; e& inpoel, + const UnsMesh::Coords& coord, + Fields& U ) +// ***************************************************************************** +// Transform the reconstructed P1-derivatives to the Dubiner dofs +//! \param[in] ncomp Number of scalar components in this PDE system +//! \param[in] offset Index for equation systems +//! \param[in] rdof Total number of reconstructed dofs +//! \param[in] nelem Total number of elements +//! \param[in] inpoel Element-node connectivity +//! \param[in] coord Array of nodal coordinates +//! \param[in,out] U Second-order solution vector which gets transformed to +//! the Dubiner reference space +// ***************************************************************************** +{ + const auto& cx = coord[0]; + const auto& cy = coord[1]; + const auto& cz = coord[2]; + + for (std::size_t e=0; e, 4 > coordel {{ + {{ cx[ inpoel[4*e ] ], cy[ inpoel[4*e ] ], cz[ inpoel[4*e ] ] }}, + {{ cx[ inpoel[4*e+1] ], cy[ inpoel[4*e+1] ], cz[ inpoel[4*e+1] ] }}, + {{ cx[ inpoel[4*e+2] ], cy[ inpoel[4*e+2] ], cz[ inpoel[4*e+2] ] }}, + {{ cx[ inpoel[4*e+3] ], cy[ inpoel[4*e+3] ], cz[ inpoel[4*e+3] ] }} + }}; + + auto jacInv = + tk::inverseJacobian( coordel[0], coordel[1], coordel[2], coordel[3] ); + + // Compute the derivatives of basis function for DG(P1) + auto dBdx = tk::eval_dBdx_p1( rdof, jacInv ); + + for (ncomp_t c=0; c rhob(rdof, 0.0); + for (std::size_t k=0; k + vel{{ U(e, momentumIdx(nmat, 0)*rdof, offset)/rhob[0], + U(e, momentumIdx(nmat, 1)*rdof, offset)/rhob[0], + U(e, momentumIdx(nmat, 2)*rdof, offset)/rhob[0] }}; + + // fill up high-order part of vector of primitives + for (std::size_t idir=0; idir<3; ++idir) + { + for (std::size_t j=1; j, 3 > >& lhs_ls, + std::vector< std::vector< std::array< real, 3 > > >& rhs_ls ); + +//! Compute boundary face contributions to the least-squares reconstruction +void +bndLeastSq_P0P1( ncomp_t system, + ncomp_t ncomp, + ncomp_t offset, + std::size_t rdof, + const std::vector< bcconf_t >& bcconfig, + const inciter::FaceData& fd, + const Fields& geoFace, + const Fields& geoElem, + real t, + const StateFn& state, + const Fields& U, + std::vector< std::array< std::array< real, 3 >, 3 > >& lhs_ls, + std::vector< std::vector< std::array< real, 3 > > >& rhs_ls, + std::size_t nprim=0 ); + +//! Solve 3x3 system for least-squares reconstruction +void +solveLeastSq_P0P1( ncomp_t ncomp, + ncomp_t offset, + const std::size_t rdof, + const std::vector< std::array< std::array< real, 3 >, 3 > >& lhs, + const std::vector< std::vector< std::array< real, 3 > > >& rhs, + Fields& U ); + +//! Transform the reconstructed P1-derivatives to the Dubiner dofs +void +transform_P0P1( ncomp_t ncomp, + ncomp_t offset, + std::size_t rdof, + std::size_t nelem, + const std::vector< std::size_t >& inpoel, + const UnsMesh::Coords& coord, + Fields& U ); + +//! Reconstruct the vector of high-order primitives +void +getMultiMatPrimitives_P0P1( ncomp_t offset, + std::size_t nmat, + std::size_t rdof, + std::size_t nelem, + const Fields& U, + Fields& P ); + +} // tk:: + +#endif // Reconstruction_h diff --git a/src/PDE/Transport/DGTransport.hpp b/src/PDE/Transport/DGTransport.hpp index f657186298c..584a11a542c 100644 --- a/src/PDE/Transport/DGTransport.hpp +++ b/src/PDE/Transport/DGTransport.hpp @@ -33,6 +33,8 @@ #include "Integrate/Boundary.hpp" #include "Integrate/Volume.hpp" #include "Integrate/Riemann/Upwind.hpp" +#include "Reconstruction.hpp" +#include "Limiter.hpp" namespace inciter { @@ -91,6 +93,15 @@ class Transport { m_problem.errchk( m_system, m_ncomp ); } + //! Find the number of primitive quantities required for this PDE system + //! \return The number of primitive quantities required to be stored for + //! this PDE system + std::size_t nprim() const + { + // transport does not need/store any primitive quantities currently + return 0; + } + //! Initalize the transport equations for DG //! \param[in] L Element mass matrix //! \param[in] inpoel Element-node connectivity @@ -116,6 +127,102 @@ class Transport { tk::mass( m_ncomp, m_offset, geoElem, l ); } + //! Update the primitives for this PDE system + //! \details This function computes and stores the dofs for primitive + //! quantities, which are currently unused for transport. + void updatePrimitives( const tk::Fields&, + tk::Fields&, + std::size_t ) const {} + + //! Reconstruct second-order solution from first-order + //! \param[in] t Physical time + //! \param[in] geoFace Face geometry array + //! \param[in] geoElem Element geometry array + //! \param[in] fd Face connectivity and boundary conditions object + //! \param[in] inpoel Element-node connectivity + //! \param[in] coord Array of nodal coordinates + //! \param[in,out] U Solution vector at recent time step + void reconstruct( tk::real t, + const tk::Fields& geoFace, + const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + tk::Fields& U, + tk::Fields& ) const + { + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + + Assert( U.nprop() == rdof*m_ncomp, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*m_ncomp) ); + Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " + "size" ); + Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, + "Mismatch in inpofa size" ); + + // supported boundary condition types and associated state functions + std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > + bctypes{{ + { m_bcextrapolate, Extrapolate }, + { m_bcinlet, Inlet }, + { m_bcoutlet, Outlet }, + { m_bcdir, Dirichlet } }}; + + // allocate and initialize matrix and vector for reconstruction + std::vector< std::array< std::array< tk::real, 3 >, 3 > > + lhs_ls( U.nunk(), {{ {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}}, + {{0.0, 0.0, 0.0}} }} ); + std::vector< std::vector< std::array< tk::real, 3 > > > + rhs_ls( U.nunk(), std::vector< std::array< tk::real, 3 > > + ( m_ncomp, + {{ 0.0, 0.0, 0.0 }} ) ); + + // reconstruct x,y,z-derivatives of unknowns + tk::intLeastSq_P0P1( m_ncomp, m_offset, rdof, fd, geoElem, U, + lhs_ls, rhs_ls ); + + // compute boundary surface flux integrals + for (const auto& b : bctypes) + tk::bndLeastSq_P0P1( m_system, m_ncomp, m_offset, rdof, b.first, + fd, geoFace, geoElem, t, b.second, U, lhs_ls, + rhs_ls ); + + // solve 3x3 least-squares system + tk::solveLeastSq_P0P1( m_ncomp, m_offset, rdof, lhs_ls, rhs_ls, U ); + + // transform reconstructed derivatives to Dubiner dofs + tk::transform_P0P1( m_ncomp, m_offset, rdof, fd.Esuel().size()/4, + inpoel, coord, U ); + } + + //! Limit second-order solution + //! \param[in] t Physical time + //! \param[in] geoFace Face geometry array + //! \param[in] geoElem Element geometry array + //! \param[in] fd Face connectivity and boundary conditions object + //! \param[in] inpoel Element-node connectivity + //! \param[in] coord Array of nodal coordinates + //! \param[in] ndofel Vector of local number of degrees of freedome + //! \param[in,out] U Solution vector at recent time step + void limit( [[maybe_unused]] tk::real t, + [[maybe_unused]] const tk::Fields& geoFace, + [[maybe_unused]] const tk::Fields& geoElem, + const inciter::FaceData& fd, + const std::vector< std::size_t >& inpoel, + const tk::UnsMesh::Coords& coord, + const std::vector< std::size_t >& ndofel, + tk::Fields& U, + tk::Fields& ) const + { + const auto limiter = g_inputdeck.get< tag::discr, tag::limiter >(); + + if (limiter == ctr::LimiterType::WENOP1) + WENO_P1( fd.Esuel(), m_offset, U ); + else if (limiter == ctr::LimiterType::SUPERBEEP1) + Superbee_P1( fd.Esuel(), inpoel, ndofel, m_offset, coord, U ); + } + //! Compute right hand side //! \param[in] t Physical time //! \param[in] geoFace Face geometry array @@ -124,6 +231,7 @@ class Transport { //! \param[in] inpoel Element-node connectivity //! \param[in] coord Array of nodal coordinates //! \param[in] U Solution vector at recent time step + //! \param[in] P Primitive vector at recent time step //! \param[in] ndofel Vector of local number of degrees of freedom //! \param[in,out] R Right-hand side vector computed void rhs( tk::real t, @@ -133,16 +241,23 @@ class Transport { const std::vector< std::size_t >& inpoel, const tk::UnsMesh::Coords& coord, const tk::Fields& U, + const tk::Fields& P, const std::vector< std::size_t >& ndofel, tk::Fields& R ) const { const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); + Assert( U.nunk() == P.nunk(), "Number of unknowns in solution " + "vector and primitive vector at recent time step incorrect" ); Assert( U.nunk() == R.nunk(), "Number of unknowns in solution " "vector and right-hand side at recent time step incorrect" ); - Assert( U.nprop() == ndof*m_ncomp && R.nprop() == ndof*m_ncomp, - "Number of components in solution and right-hand side vector " - "must equal "+ std::to_string(ndof*m_ncomp) ); + Assert( U.nprop() == rdof*m_ncomp, "Number of components in solution " + "vector must equal "+ std::to_string(rdof*m_ncomp) ); + Assert( P.nprop() == 0, "Number of components in primitive " + "vector must equal "+ std::to_string(0) ); + Assert( R.nprop() == ndof*m_ncomp, "Number of components in right-hand " + "side vector must equal "+ std::to_string(ndof*m_ncomp) ); Assert( inpoel.size()/4 == U.nunk(), "Connectivity inpoel has incorrect " "size" ); Assert( fd.Inpofa().size()/3 == fd.Esuf().size()/2, @@ -151,6 +266,11 @@ class Transport { // set rhs to zero R.fill(0.0); + // empty vector for non-conservative terms. This vector is unused for + // linear transport since, there are no non-conservative terms in the + // system of PDEs. + std::vector< std::vector < tk::real > > riemannDeriv; + // supported boundary condition types and associated state functions std::vector< std::pair< std::vector< bcconf_t >, tk::StateFn > > bctypes{{ { m_bcextrapolate, Extrapolate }, @@ -159,9 +279,9 @@ class Transport { { m_bcdir, Dirichlet } }}; // compute internal surface flux integrals - tk::surfInt( m_system, m_ncomp, m_offset, ndof, inpoel, coord, fd, - geoFace, Upwind::flux, Problem::prescribedVelocity, U, - ndofel, R ); + tk::surfInt( m_system, m_ncomp, 1, m_offset, ndof, rdof, inpoel, coord, + fd, geoFace, Upwind::flux, Problem::prescribedVelocity, U, P, + ndofel, R, riemannDeriv ); if(ndof > 1) // compute volume integrals @@ -170,9 +290,9 @@ class Transport { // compute boundary surface flux integrals for (const auto& b : bctypes) - tk::bndSurfInt( m_system, m_ncomp, m_offset, ndof, b.first, fd, geoFace, - inpoel, coord, t, Upwind::flux, Problem::prescribedVelocity, - b.second, U, ndofel, R ); + tk::bndSurfInt( m_system, m_ncomp, 1, m_offset, ndof, rdof, b.first, fd, + geoFace, inpoel, coord, t, Upwind::flux, Problem::prescribedVelocity, + b.second, U, P, ndofel, R, riemannDeriv ); } //! Compute the minimum time step size @@ -185,6 +305,7 @@ class Transport { const inciter::FaceData& /*fd*/, const tk::Fields& /*geoFace*/, const tk::Fields& /*geoElem*/, + const std::vector< std::size_t >& /*ndofel*/, const tk::Fields& /*U*/ ) const { tk::real mindt = std::numeric_limits< tk::real >::max(); @@ -202,7 +323,7 @@ class Transport { //! \details This functions should be written in conjunction with //! fieldOutput(), which provides the vector of fields to be output std::vector< std::string > fieldNames() const { - const auto pref = g_inputdeck.get< tag::discr, tag::pref >(); + const auto pref = g_inputdeck.get< tag::pref, tag::pref >(); std::vector< std::string > n; const auto& depvar = g_inputdeck.get< tag::param, eq, tag::depvar >().at(m_system); @@ -244,12 +365,12 @@ class Transport { const tk::Fields& geoElem, tk::Fields& U ) const { - const auto ndof = g_inputdeck.get< tag::discr, tag::ndof >(); + const auto rdof = g_inputdeck.get< tag::discr, tag::rdof >(); Assert( geoElem.nunk() == U.nunk(), "Size mismatch" ); std::vector< std::vector< tk::real > > out; // will output numerical solution for all components for (ncomp_t c=0; c, 4 >&, @@ -47,8 +47,8 @@ class TransportPhysicsAdvection { //! Compute the minimum time step size based on the diffusion //! \return A large time step size, i.e., ignore static tk::real - diffusion_dt( tk::ctr::ncomp_type, - tk::ctr::ncomp_type, + diffusion_dt( tk::ctr::ncomp_t, + tk::ctr::ncomp_t, tk::real, const std::vector< std::array< tk::real, 4 > >& ) { return std::numeric_limits< tk::real >::max(); } diff --git a/src/PDE/Transport/Physics/DGAdvection.hpp b/src/PDE/Transport/Physics/DGAdvection.hpp index 5a4a16007ab..0213cac1f4d 100644 --- a/src/PDE/Transport/Physics/DGAdvection.hpp +++ b/src/PDE/Transport/Physics/DGAdvection.hpp @@ -32,24 +32,24 @@ class TransportPhysicsAdvection { public: //! Add diffusion contribution to rhs at 2nd step stage (no-op) - void - diffusionRhs( tk::ctr::ncomp_type, - tk::ctr::ncomp_type, + static void + diffusionRhs( tk::ctr::ncomp_t, + tk::ctr::ncomp_t, tk::real, tk::real, const std::array< std::array< tk::real, 3 >, 4 >&, const std::array< std::size_t, 4 >&, const std::vector< std::array< tk::real, 4 > >&, const std::vector< const tk::real* >&, - tk::Fields& ) const {} + tk::Fields& ) {} //! Compute the minimum time step size based on the diffusion //! \return A large time step size, i.e., ignore - tk::real - diffusion_dt( tk::ctr::ncomp_type, - tk::ctr::ncomp_type, + static tk::real + diffusion_dt( tk::ctr::ncomp_t, + tk::ctr::ncomp_t, tk::real, - const std::vector< std::array< tk::real, 4 > >& ) const + const std::vector< std::array< tk::real, 4 > >& ) { return std::numeric_limits< tk::real >::max(); } static ctr::PhysicsType type() noexcept diff --git a/src/PDE/Transport/Problem/CylAdvect.hpp b/src/PDE/Transport/Problem/CylAdvect.hpp index 016a1ccdab2..05975b72644 100644 --- a/src/PDE/Transport/Problem/CylAdvect.hpp +++ b/src/PDE/Transport/Problem/CylAdvect.hpp @@ -29,7 +29,7 @@ namespace inciter { //! Transport PDE problem: advection of cylinder class TransportProblemCylAdvect { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::transport; public: diff --git a/src/PDE/Transport/Problem/GaussHump.hpp b/src/PDE/Transport/Problem/GaussHump.hpp index ecbe4cc330d..7934d33aeae 100644 --- a/src/PDE/Transport/Problem/GaussHump.hpp +++ b/src/PDE/Transport/Problem/GaussHump.hpp @@ -29,7 +29,7 @@ namespace inciter { //! Transport PDE problem: advection of two-dimensional Gaussian hump class TransportProblemGaussHump { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::transport; public: @@ -41,7 +41,7 @@ class TransportProblemGaussHump { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real, + solinc( ncomp_t, ncomp_t ncomp, tk::real x, tk::real y, tk::real, tk::real t, tk::real dt ) const; //! Do error checking on PDE parameters diff --git a/src/PDE/Transport/Problem/ShearDiff.hpp b/src/PDE/Transport/Problem/ShearDiff.hpp index 02074d0d082..b511a597535 100644 --- a/src/PDE/Transport/Problem/ShearDiff.hpp +++ b/src/PDE/Transport/Problem/ShearDiff.hpp @@ -63,7 +63,7 @@ namespace inciter { */ class TransportProblemShearDiff { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::transport; public: diff --git a/src/PDE/Transport/Problem/SlotCyl.cpp b/src/PDE/Transport/Problem/SlotCyl.cpp index c727bcabd53..272dd1be9d1 100644 --- a/src/PDE/Transport/Problem/SlotCyl.cpp +++ b/src/PDE/Transport/Problem/SlotCyl.cpp @@ -16,6 +16,7 @@ // ***************************************************************************** #include "SlotCyl.hpp" +#include "SystemComponents.hpp" #include "Inciter/InputDeck/InputDeck.hpp" namespace inciter { diff --git a/src/PDE/Transport/Problem/SlotCyl.hpp b/src/PDE/Transport/Problem/SlotCyl.hpp index 7cba077acf4..b9dec5a917b 100644 --- a/src/PDE/Transport/Problem/SlotCyl.hpp +++ b/src/PDE/Transport/Problem/SlotCyl.hpp @@ -34,7 +34,7 @@ namespace inciter { //! 627-665. class TransportProblemSlotCyl { private: - using ncomp_t = tk::ctr::ncomp_type; + using ncomp_t = tk::ctr::ncomp_t; using eq = tag::transport; public: @@ -46,7 +46,7 @@ class TransportProblemSlotCyl { //! \brief Evaluate the increment from t to t+dt of the analytical solution //! at (x,y,z) for all components std::vector< tk::real > - solinc( ncomp_t system, ncomp_t ncomp, tk::real x, tk::real y, tk::real, + solinc( ncomp_t, ncomp_t ncomp, tk::real x, tk::real y, tk::real, tk::real t, tk::real dt ) const; //! Do error checking on PDE parameters diff --git a/src/RNG/CMakeLists.txt b/src/RNG/CMakeLists.txt index a0d7854ac23..2311c87bb0d 100644 --- a/src/RNG/CMakeLists.txt +++ b/src/RNG/CMakeLists.txt @@ -14,6 +14,7 @@ target_include_directories(RNG PUBLIC ${PEGTL_INCLUDE_DIRS} ${BRIGAND_INCLUDE_DIRS} ${TPL_INCLUDE_DIR} + ${RANDOM123_INCLUDE_DIRS} ${RNGSSE2_INCLUDE_DIRS} ${MKL_INCLUDE_DIRS} ${PROJECT_BINARY_DIR}/../Main) diff --git a/src/RNG/MKLRNG.hpp b/src/RNG/MKLRNG.hpp index f70b10bb3bf..2ddbef868b8 100644 --- a/src/RNG/MKLRNG.hpp +++ b/src/RNG/MKLRNG.hpp @@ -12,10 +12,10 @@ #ifndef MKLRNG_h #define MKLRNG_h +#include #include #include "Exception.hpp" -#include "Make_unique.hpp" #include "Keywords.hpp" namespace tk { @@ -58,7 +58,7 @@ class MKLRNG { Assert( n > 0, "Need at least one thread" ); Assert( brng > 0, "Basic RNG MKL parameter must be positive" ); // Allocate array of stream-pointers for threads - m_stream = tk::make_unique< VSLStreamStatePtr[] >( + m_stream = std::make_unique< VSLStreamStatePtr[] >( static_cast(n) ); // Initialize thread-streams for block-splitting. These MKL VSL functions // dynamically allocate memory, so these calls being in a constructor are @@ -171,7 +171,7 @@ class MKLRNG { m_beta_method = x.m_beta_method; m_gamma_method = x.m_gamma_method; m_nthreads = x.m_nthreads; - m_stream = tk::make_unique< VSLStreamStatePtr[] >( + m_stream = std::make_unique< VSLStreamStatePtr[] >( static_cast(x.m_nthreads) ); if (m_nthreads == 1) errchk( vslNewStream( &m_stream[0], x.m_brng, x.m_seed ) ); @@ -198,7 +198,7 @@ class MKLRNG { m_beta_method = x.m_beta_method; m_gamma_method = x.m_gamma_method; m_nthreads = x.m_nthreads; - m_stream = tk::make_unique< VSLStreamStatePtr[] >( + m_stream = std::make_unique< VSLStreamStatePtr[] >( static_cast(x.m_nthreads) ); for (int i=0; i( i ); diff --git a/src/RNG/RNG.hpp b/src/RNG/RNG.hpp index 67602629048..dfdb47f29a1 100644 --- a/src/RNG/RNG.hpp +++ b/src/RNG/RNG.hpp @@ -18,8 +18,8 @@ #define RNG_h #include +#include -#include "Make_unique.hpp" #include "Keywords.hpp" namespace tk { @@ -42,7 +42,7 @@ class RNG { //! \param[in] x Instantiated object of type T given by the template //! argument. template< typename T > - explicit RNG( T x ) : self( make_unique< Model >( std::move(x) ) ) {} + explicit RNG( T x ) : self( std::make_unique< Model >( std::move(x) ) ) {} //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept @@ -53,7 +53,7 @@ class RNG { //! Concept template< typename T > explicit RNG( std::function x ) : - self( make_unique< Model >( std::move(x()) ) ) {} + self( std::make_unique< Model >( std::move(x()) ) ) {} //! Public interface to uniform RNG void uniform( int stream, ncomp_t num, double* r ) const diff --git a/src/RNG/RNGSSE.hpp b/src/RNG/RNGSSE.hpp index 8a87ba9a3b4..af9a130bbff 100644 --- a/src/RNG/RNGSSE.hpp +++ b/src/RNG/RNGSSE.hpp @@ -14,11 +14,11 @@ #include #include +#include #include "NoWarning/beta_distribution.hpp" #include -#include "Make_unique.hpp" #include "Exception.hpp" #include "Macro.hpp" #include "Options/RNGSSESeqLen.hpp" @@ -66,7 +66,7 @@ class RNGSSE { Assert( m_init != nullptr, "nullptr passed to RNGSSE constructor" ); Assert( n > 0, "Need at least one thread" ); // Allocate array of stream-pointers for threads - m_stream = tk::make_unique< State[] >( n ); + m_stream = std::make_unique< State[] >( n ); // Initialize thread-streams for (SeqNumType i=0; i( x.m_nthreads ); + m_stream = std::make_unique< State[] >( x.m_nthreads ); for (SeqNumType i=0; i( x.m_nthreads ); + m_stream = std::make_unique< State[] >( x.m_nthreads ); for (SeqNumType i=0; i -#include "Make_unique.hpp" #include "Exception.hpp" #include "Keywords.hpp" #include "Macro.hpp" @@ -126,15 +125,13 @@ class Random123 { //! of length d(d+1)/2 //! \param[in,out] r Pointer to memory to write the random numbers to //! \warning Not implemented! - void gaussianmv( int tid, ncomp_t num, ncomp_t d, const double* const mean, - const double* const cov, double* r ) const + void gaussianmv( [[maybe_unused]] int tid, + [[maybe_unused]] ncomp_t num, + [[maybe_unused]] ncomp_t d, + [[maybe_unused]] const double* const mean, + [[maybe_unused]] const double* const cov, + [[maybe_unused]] double* r ) const { - IGNORE(tid); - IGNORE(num); - IGNORE(d); - IGNORE(mean); - IGNORE(cov); - IGNORE(r); } //! Beta RNG: Generate beta random numbers diff --git a/src/RNGTest/Battery.hpp b/src/RNGTest/Battery.hpp index 43475cdd23d..3d39696f396 100644 --- a/src/RNGTest/Battery.hpp +++ b/src/RNGTest/Battery.hpp @@ -19,12 +19,12 @@ #define Battery_h #include +#include #include "NoWarning/charm++.hpp" #include "Macro.hpp" #include "Has.hpp" -#include "Make_unique.hpp" namespace rngtest { @@ -39,25 +39,6 @@ namespace rngtest { class Battery { public: - //! \brief Constructor taking an object modeling Concept - //! \details The object of class T comes pre-constructed. - //! \param[in] x Instantiated object of type T given by the template - //! argument. - template< typename T > explicit Battery( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ) {} - - //! \brief Constructor taking a std::function holding a constructor bound to - //! its arguments of an object modeling Concept. - //! \details Passing std::function allows late execution of the constructor - //! of T (given by the template argument), i.e., as late as inside this - //! class' constructor, and thus usage from a factory. Object of T is - //! constructed here. This overload is disabled for Charm++ chare objects - //! defining typedef 'Proxy', see also below. - template< typename T, - typename std::enable_if< !tk::HasTypedefProxy::value, int >::type = 0 > - explicit Battery( std::function x ) : - self( tk::make_unique< Model >( std::move(x()) ) ) {} - //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept //! \details Passing std::function allows late execution of the constructor @@ -80,16 +61,12 @@ class Battery { //! Concept. //! \param[in] args Constructor arguments //! \see See also tk::recordCharmModel(). - template< typename T, typename... ConstrArgs, - typename std::enable_if< tk::HasTypedefProxy::value, int >::type = 0 > - explicit Battery( std::function c, ConstrArgs... args ) : - self( tk::make_unique< Model< typename T::Proxy > > - (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { + template< typename T, typename... CtrArgs > + explicit Battery( std::function c [[maybe_unused]], CtrArgs... args ) : + self( std::make_unique< Model< typename T::Proxy > > + (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { Assert( c == nullptr, "std::function argument to Battery Charm++ " "constructor must be nullptr" ); - #ifdef NDEBUG - IGNORE(c); - #endif } //! Public interface to evaluating a statistical test diff --git a/src/RNGTest/StatTest.hpp b/src/RNGTest/StatTest.hpp index 2210f7b620c..a04b70fbfbb 100644 --- a/src/RNGTest/StatTest.hpp +++ b/src/RNGTest/StatTest.hpp @@ -19,11 +19,11 @@ #define StatTest_h #include +#include #include "NoWarning/charm++.hpp" #include "Macro.hpp" -#include "Make_unique.hpp" #include "Options/RNG.hpp" namespace rngtest { @@ -39,28 +39,6 @@ namespace rngtest { class StatTest { public: - //! \brief Constructor taking an object modeling Concept - //! \details The object of class T comes pre-constructed. - //! \param[in] x Instantiated object of type T given by the template - //! argument. - template< typename T > - explicit StatTest( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ){} - - //! \brief Constructor taking a std::function holding a constructor bound to - //! its arguments of an object modeling Concept (see below) - //! \details Passing std::function allows late execution of the constructor - //! of T, i.e., as late as inside this class' constructor, and thus usage - //! from a factory. Object of T is constructed here. This overload is - //! disabled for Charm++ chare objects defining typedef 'Proxy', see also - //! below. - //! \param[in] x Function pointer to a constructor bound of an object - //! modeling Concept - template< typename T, - typename std::enable_if< !tk::HasTypedefProxy::value, int >::type = 0 > - explicit StatTest( std::function x ) : - self( tk::make_unique< Model >( std::move(x()) ) ) {} - //! \brief Constructor taking a function pointer to a constructor of an //! object modeling Concept //! \details Passing std::function allows late execution of the constructor @@ -71,8 +49,8 @@ class StatTest { //! Charm proxy, defined by T::Proxy. The actual constructor of T is not //! called here but at some future time by the Charm++ runtime system, //! here only an asynchrounous ckNew() is called, i.e., a message (or - //! request) for a future call to T's constructor. This overload is only - //! enabled for Charm++ chare objects defining typedef 'Proxy', which must + //! request) for a future call to T's constructor. This overload can only + //! be used for Charm++ chare objects defining typedef 'Proxy', which must //! define the Charm++ proxy. All optional constructor arguments are //! forwarded to ckNew() and thus to T's constructor. If it was somehow //! possible to obtain all bound arguments' types and values from an @@ -83,16 +61,12 @@ class StatTest { //! Concept //! \param[in] args Constructor arguments //! \see See also tk::recordCharmModel(). - template< typename T, typename... ConstrArgs, - typename std::enable_if< tk::HasTypedefProxy::value, int >::type = 0 > - explicit StatTest( std::function c, ConstrArgs... args ) : - self( tk::make_unique< Model< typename T::Proxy > > - (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { + template< typename T, typename... CtrArgs > + explicit StatTest( std::function c [[maybe_unused]], CtrArgs... args ) + : self( std::make_unique< Model< typename T::Proxy > > + (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { Assert( c == nullptr, "std::function argument to StatTest Charm " "constructor must be nullptr" ); - #ifdef NDEBUG - IGNORE(c); - #endif } //! Public interface to contribute number of results/test, i.e., p-values diff --git a/src/RNGTest/TestU01Props.hpp b/src/RNGTest/TestU01Props.hpp index 1158145b548..125081ffd13 100644 --- a/src/RNGTest/TestU01Props.hpp +++ b/src/RNGTest/TestU01Props.hpp @@ -199,8 +199,7 @@ class TestU01Props { //! \param[in,out] p Charm++'s PUP::er serializer object reference //! \param[in,out] g Reference to raw function pointer to TestU01 //! statistical test - void pup( PUP::er& p, unif01_Gen*& g ) { - IGNORE(p); + void pup( [[maybe_unused]] PUP::er& p, unif01_Gen*& g ) { using tk::ctr::RNGType; using tk::ctr::raw; const auto& rngname = tk::ctr::RNG().name(m_rng); diff --git a/src/RNGTest/TestU01Stack.hpp b/src/RNGTest/TestU01Stack.hpp index d7f3fb083d0..cf8b02e450a 100644 --- a/src/RNGTest/TestU01Stack.hpp +++ b/src/RNGTest/TestU01Stack.hpp @@ -227,11 +227,11 @@ class TestU01Stack { template< class... Args > using FnPtr = std::vector(*)( Args... ); //! \brief Compile-time tag-based access to individual test wrappers. - //! \details This tagged_tuple is practically a compile-time map that + //! \details This tagged tuple is practically a compile-time map that //! associates tags (empty structs) to test wrappers. This is used to find //! the test wrapper function pointers after migration over the network. //! \see See also TestU01Props::pup(). - tk::tuple::tagged_tuple< + tk::TaggedTuple< brigand::list< tag::BirthdaySpacings, // tag FnPtr< unif01_Gen*, sres_Poisson*, @@ -365,7 +365,7 @@ class TestU01Stack { FnPtr< unif01_Gen*, sres_Basic*, const std::tuple& > - > runner { + > > runner {{ BirthdaySpacings, // Initialize by binding to member function wrappers. Collision, // Obviously the order here is important. @@ -401,7 +401,7 @@ class TestU01Stack { StringRun, AutoCorr - }; + }}; //! Find RNG properties based on RNG id unif01_Gen* generator( tk::ctr::RNGType r ) const; diff --git a/src/Statistics/PDFReducer.cpp b/src/Statistics/PDFReducer.cpp index a7c8f224055..9e8880bfddf 100644 --- a/src/Statistics/PDFReducer.cpp +++ b/src/Statistics/PDFReducer.cpp @@ -10,8 +10,9 @@ */ // ***************************************************************************** +#include + #include "PDFReducer.hpp" -#include "Make_unique.hpp" namespace tk { @@ -28,7 +29,7 @@ serialize( const std::vector< tk::UniPDF >& u ) sizer | const_cast< std::vector< tk::UniPDF >& >( u ); // Create raw character stream to store the serialized PDF - std::unique_ptr flatData = tk::make_unique( sizer.size() ); + std::unique_ptr flatData = std::make_unique( sizer.size() ); // Serialize PDF, the message will contain a univariate PDF PUP::toMem packer( flatData.get() ); @@ -93,7 +94,7 @@ serialize( const std::vector< tk::UniPDF >& u, sizer | const_cast< std::vector< tk::TriPDF >& >( t ); // Create raw character stream to store the serialized PDFs - std::unique_ptr flatData = tk::make_unique( sizer.size() ); + std::unique_ptr flatData = std::make_unique( sizer.size() ); // Serialize PDFs, each message will contain a vector of PDFs PUP::toMem packer( flatData.get() ); diff --git a/src/Statistics/UniPDF.hpp b/src/Statistics/UniPDF.hpp index b045698aec3..af7e6284b98 100644 --- a/src/Statistics/UniPDF.hpp +++ b/src/Statistics/UniPDF.hpp @@ -95,6 +95,14 @@ class UniPDF { return {{ x.first->first, x.second->first }}; } + //! Compute integral of the distribution across the whole sample space + //! \return Integral of the distribution + tk::real integral() const { + return std::accumulate( m_pdf.cbegin(), m_pdf.cend(), 0.0, + [&]( tk::real i, const pair_type& p ){ + return i + p.second; } ) / m_nsample; + } + /** @name Pack/Unpack: Serialize UniPDF object for Charm++ */ ///@{ //! Pack/Unpack serialize member function diff --git a/src/UnitTest/CMakeLists.txt b/src/UnitTest/CMakeLists.txt index e1d4dee6617..33b54c91e8c 100644 --- a/src/UnitTest/CMakeLists.txt +++ b/src/UnitTest/CMakeLists.txt @@ -21,6 +21,7 @@ target_include_directories(UnitTest PUBLIC ${QUINOA_SOURCE_DIR}/Inciter ${QUINOA_SOURCE_DIR}/Mesh ${TUT_INCLUDE_DIRS} + ${HIGHWAYHASH_INCLUDE_DIRS} ${BRIGAND_INCLUDE_DIRS} ${CHARM_INCLUDE_DIRS} ${PEGTL_INCLUDE_DIRS} diff --git a/src/UnitTest/QuietCerr.cpp b/src/UnitTest/QuietCerr.cpp index 71aca44be18..544522993f3 100644 --- a/src/UnitTest/QuietCerr.cpp +++ b/src/UnitTest/QuietCerr.cpp @@ -23,9 +23,9 @@ namespace tk { #endif //! std::tringstream used to quiet std::cerr's stream by redirecting to it -std::stringstream cerr_quiet; +static std::stringstream cerr_quiet; //! std::streambuf used to store state of std::cerr before redirecting it -std::streambuf* cerr_old; +static std::streambuf* cerr_old; #if defined(__clang__) #pragma clang diagnostic pop diff --git a/src/UnitTest/migrated_base.ci b/src/UnitTest/migrated_base.ci index d90159d28c8..cd4314f2b78 100644 --- a/src/UnitTest/migrated_base.ci +++ b/src/UnitTest/migrated_base.ci @@ -26,8 +26,8 @@ module migrated_base { entry Migrated( charm::Array a ); entry Migrated( charm::UnorderedMap m ); entry Migrated( charm::UnorderedSet s ); - entry Migrated( charm::BoostOptionalStr o ); - entry Migrated( charm::BoostOptionalInt o ); + entry Migrated( charm::OptionalStr o ); + entry Migrated( charm::OptionalInt o ); entry Migrated( charm::TaggedTuple t ); entry Migrated( charm::Variant v, int value ); entry Migrated( charm::Variant v, double value ); diff --git a/src/Walker/Collector.hpp b/src/Walker/Collector.hpp index 2f0c5cc8b2d..f0ff4600875 100644 --- a/src/Walker/Collector.hpp +++ b/src/Walker/Collector.hpp @@ -18,7 +18,6 @@ #include "Types.hpp" #include "PDFReducer.hpp" -#include "Make_unique.hpp" #include "Distributor.hpp" #include "Walker/InputDeck/InputDeck.hpp" @@ -78,7 +77,7 @@ class Collector : public CBase_Collector { {} //! \brief Configure Charm++ reduction types for collecting PDFs - //! \details Since this is a [nodeinit] routine, see collector.ci, the + //! \details Since this is a [initnode] routine, see collector.ci, the //! Charm++ runtime system executes the routine exactly once on every //! logical node early on in the Charm++ init sequence. Must be static as //! it is called without an object. See also: Section "Initializations at diff --git a/src/Walker/Distributor.cpp b/src/Walker/Distributor.cpp index 623ef52c955..62df9d8dda6 100644 --- a/src/Walker/Distributor.cpp +++ b/src/Walker/Distributor.cpp @@ -27,7 +27,6 @@ #include #include "NoWarning/format.hpp" -#include #include "Macro.hpp" #include "Print.hpp" @@ -54,7 +53,7 @@ using walker::Distributor; Distributor::Distributor( const ctr::CmdLine& cmdline ) : __dep(), m_print( cmdline.get< tag::verbose >() ? std::cout : std::clog ), - m_output( false, false ), + m_output( { false, false } ), m_it( 0 ), m_npar( 0 ), m_t( 0.0 ), @@ -225,17 +224,13 @@ Distributor::computedt() } void -Distributor::estimateOrd( tk::real* ord, int n ) +Distributor::estimateOrd( tk::real* ord, [[maybe_unused]] int n ) // ***************************************************************************** // Estimate ordinary moments //! \param[in] ord Ordinary moments (sum) collected over all chares //! \param[in] n Number of ordinary moments in array ord // ***************************************************************************** { - #ifdef NDEBUG - IGNORE(n); - #endif - Assert( static_cast(n) == m_ordinary.size(), "Number of ordinary moments contributed not equal to expected" ); @@ -251,17 +246,13 @@ Distributor::estimateOrd( tk::real* ord, int n ) } void -Distributor::estimateCen( tk::real* cen, int n ) +Distributor::estimateCen( tk::real* cen, [[maybe_unused]] int n ) // ***************************************************************************** // Estimate ordinary moments //! \param[in] cen Central moments (sum) collected over all chares //! \param[in] n Number of central moments in array cen // ***************************************************************************** { - #ifdef NDEBUG - IGNORE(n); - #endif - Assert( static_cast(n) == m_central.size(), "Number of central moments contributed not equal to expected" ); diff --git a/src/Walker/Distributor.hpp b/src/Walker/Distributor.hpp index 38ed7f8e72d..53eb50d4db2 100644 --- a/src/Walker/Distributor.hpp +++ b/src/Walker/Distributor.hpp @@ -94,6 +94,12 @@ class Distributor : public CBase_Distributor { void nostat(); private: + //! Type alias for output indicators + using OutputIndicators = tk::TaggedTuple< brigand::list< + tag::stat, bool + , tag::pdf, bool + > >; + //! Print information at startup void info( uint64_t chunksize, std::size_t nchare ); @@ -144,11 +150,8 @@ class Distributor : public CBase_Distributor { //! Evaluate time step, compute new time step size void evaluateTime(); - //! Pretty printer - WalkerPrint m_print; - //! Output indicators - tk::tuple::tagged_tuple< tag::stat, bool, - tag::pdf, bool > m_output; + WalkerPrint m_print; //! Pretty printer + OutputIndicators m_output; //!< Output indicators uint64_t m_it; //!< Iteration count tk::real m_npar; //!< Total number of particles tk::real m_t; //!< Physical time diff --git a/tests/regression/CMakeLists.txt b/tests/regression/CMakeLists.txt index e06d86b73d0..76209ccb5c5 100644 --- a/tests/regression/CMakeLists.txt +++ b/tests/regression/CMakeLists.txt @@ -18,6 +18,18 @@ if(ENABLE_MESHCONV AND NOT GMSH_FOUND) message(WARNING "Gmsh not found, meshconv regression tests will not be rigorous") endif() +# Find valgrind executable +set(ENABLE_VALGRIND false CACHE BOOL "Run all regression tests using valgrind") +if (ENABLE_VALGRIND) + find_program(VALGRIND valgrind) + if (VALGRIND) + set(USE_VALGRIND true) + message(STATUS "Will run all regression tests using valgrind") + else() + message(WARNING "Valgrind was enabled but NOT found") + endif() +endif() + # Include function used to add regression tests include(add_regression_test) @@ -27,6 +39,7 @@ include(add_regression_test) if (ENABLE_WALKER) message(STATUS "Adding regression tests for ${WALKER_EXECUTABLE}") add_subdirectory(walker/Dirichlet) + add_subdirectory(walker/MixDirichlet) add_subdirectory(walker/GeneralizedDirichlet) add_subdirectory(walker/SkewNormal) add_subdirectory(walker/DiagOrnsteinUhlenbeck) @@ -36,7 +49,7 @@ if (ENABLE_WALKER) add_subdirectory(walker/NumFracBeta) add_subdirectory(walker/MassFracBeta) add_subdirectory(walker/MixMassFracBeta) - #add_subdirectory(walker/Velocity) + add_subdirectory(walker/Velocity) endif() # RNGTest regression tests @@ -71,4 +84,7 @@ if(ENABLE_INCITER) add_subdirectory(inciter/mesh_refinement/dtref) add_subdirectory(inciter/compflow/Euler/SodShocktube) add_subdirectory(inciter/compflow/Euler/SedovBlastwave) + add_subdirectory(inciter/multimat/InterfaceAdvection) + add_subdirectory(inciter/multimat/SodShocktube) + add_subdirectory(inciter/restart) endif() diff --git a/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg.q b/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg.q index c58551e91e7..07d8fd08544 100644 --- a/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg.q +++ b/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg.q @@ -28,8 +28,7 @@ inciter kappa 0.8 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg_dgp2.q b/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg_dgp2.q index 1d2c40bab26..249543ed54e 100644 --- a/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg_dgp2.q +++ b/tests/regression/inciter/compflow/Euler/NLEnergyGrowth/nleg_dgp2.q @@ -24,8 +24,7 @@ inciter kappa 0.8 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor.q b/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor.q index b493993c20e..0420684b0c4 100644 --- a/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor.q +++ b/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor.q @@ -29,8 +29,7 @@ inciter kappa 1.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor_st.q b/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor_st.q index a3bf26cd0a6..7ab28323674 100644 --- a/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor_st.q +++ b/tests/regression/inciter/compflow/Euler/RayleighTaylor/rayleigh_taylor_st.q @@ -29,8 +29,7 @@ inciter kappa 0.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_dgp1.std b/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_dgp1.std index 6849a54cac4..1310b4d773f 100644 --- a/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_dgp1.std +++ b/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_dgp1.std @@ -1,5 +1,5 @@ # 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) - 5 2.889916e-05 5.717400e-06 1.000000e+00 2.818299e-02 2.818373e-02 1.706781e-02 8.597183e+01 7.588223e-04 2.818299e-02 2.818373e-02 1.706781e-02 3.682101e+01 - 10 5.702377e-05 5.564008e-06 1.000001e+00 5.388852e-02 5.389032e-02 3.135952e-02 8.564970e+01 1.412011e-03 5.388852e-02 5.389032e-02 3.135952e-02 3.646689e+01 - 15 8.442160e-05 5.423868e-06 1.000002e+00 7.760064e-02 7.760187e-02 4.356772e-02 8.531764e+01 2.025361e-03 7.760064e-02 7.760187e-02 4.356772e-02 3.624628e+01 - 20 1.111323e-04 5.288176e-06 1.000003e+00 9.956234e-02 9.956164e-02 5.390406e-02 8.497436e+01 2.611963e-03 9.956234e-02 9.956164e-02 5.390406e-02 3.613734e+01 + 5 2.889916e-05 5.717400e-06 1.000000e+00 2.818299e-02 2.818373e-02 1.706781e-02 8.597183e+01 7.588238e-04 2.818299e-02 2.818373e-02 1.706781e-02 3.682101e+01 + 10 5.702377e-05 5.564008e-06 1.000001e+00 5.388852e-02 5.389032e-02 3.135952e-02 8.564970e+01 1.412015e-03 5.388852e-02 5.389032e-02 3.135952e-02 3.646689e+01 + 15 8.442160e-05 5.423868e-06 1.000002e+00 7.760064e-02 7.760187e-02 4.356772e-02 8.531764e+01 2.025366e-03 7.760064e-02 7.760187e-02 4.356772e-02 3.624628e+01 + 20 1.111323e-04 5.288176e-06 1.000003e+00 9.956234e-02 9.956164e-02 5.390406e-02 8.497436e+01 2.611966e-03 9.956234e-02 9.956164e-02 5.390406e-02 3.613734e+01 diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_pdg.std b/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_pdg.std index 7154358b585..dc72591ac15 100644 --- a/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_pdg.std +++ b/tests/regression/inciter/compflow/Euler/SedovBlastwave/diag_pdg.std @@ -1,5 +1,5 @@ # 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) - 5 2.889916e-05 5.717399e-06 1.000000e+00 2.818300e-02 2.818374e-02 1.706781e-02 8.597183e+01 7.588213e-04 2.818300e-02 2.818374e-02 1.706781e-02 3.682101e+01 - 10 5.702376e-05 5.564008e-06 1.000001e+00 5.388852e-02 5.389032e-02 3.135952e-02 8.564970e+01 1.412009e-03 5.388852e-02 5.389032e-02 3.135952e-02 3.646689e+01 - 15 8.442160e-05 5.423867e-06 1.000002e+00 7.760065e-02 7.760187e-02 4.356772e-02 8.531764e+01 2.025359e-03 7.760065e-02 7.760187e-02 4.356772e-02 3.624628e+01 - 20 1.111323e-04 5.288176e-06 1.000003e+00 9.956235e-02 9.956164e-02 5.390406e-02 8.497436e+01 2.611962e-03 9.956235e-02 9.956164e-02 5.390406e-02 3.613733e+01 + 5 2.889916e-05 5.717399e-06 1.000000e+00 2.818300e-02 2.818374e-02 1.706781e-02 8.597183e+01 7.588228e-04 2.818300e-02 2.818374e-02 1.706781e-02 3.682101e+01 + 10 5.702376e-05 5.564008e-06 1.000001e+00 5.388852e-02 5.389033e-02 3.135952e-02 8.564970e+01 1.412014e-03 5.388852e-02 5.389033e-02 3.135952e-02 3.646689e+01 + 15 8.442160e-05 5.423867e-06 1.000002e+00 7.760065e-02 7.760188e-02 4.356772e-02 8.531764e+01 2.025365e-03 7.760065e-02 7.760188e-02 4.356772e-02 3.624628e+01 + 20 1.111323e-04 5.288176e-06 1.000003e+00 9.956234e-02 9.956165e-02 5.390406e-02 8.497436e+01 2.611965e-03 9.956234e-02 9.956165e-02 5.390406e-02 3.613733e+01 diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.q b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.q index 131133a7b2b..1a1f70aed09 100644 --- a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.q +++ b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.q @@ -23,8 +23,7 @@ inciter p0 10.0 material - id 1 - gamma 1.4 + gamma 1.4 end end bc_sym diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.std.exo b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.std.exo index 2c3e3613137..de6da31629e 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.std.exo and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1.std.exo differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.0 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.0 index 0a70b60bed3..fad8dacba90 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.0 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.0 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.1 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.1 index fe36df71347..2363eb7be2d 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.1 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.1 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.2 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.2 index c4d55db40f3..00930dff525 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.2 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.2 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.3 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.3 index c38b3be6576..69fd2e3c388 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.3 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_dgp1_pe4.std.exo.3 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.q b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.q index e3d2bd14981..7bf9d5375f3 100644 --- a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.q +++ b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.q @@ -23,8 +23,7 @@ inciter p0 10.0 material - id 1 - gamma 1.4 + gamma 1.4 end end bc_sym diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.std.exo b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.std.exo index a07b9c7e0ec..8800d35c464 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.std.exo and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg.std.exo differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.0 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.0 index 391437605f1..00761b495d6 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.0 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.0 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.1 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.1 index 307fb7020b5..dec57614192 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.1 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.1 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.2 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.2 index 141b160ccda..8d641bdecf3 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.2 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.2 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.3 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.3 index e47f25a64e8..75abf2d1320 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.3 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.0.std.exo.3 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.0 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.0 index 337809b5998..e884f429860 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.0 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.0 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.1 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.1 index 590342b145b..27286c00a0d 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.1 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.1 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.10 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.10 index b07b4498e5c..8db2eb5a823 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.10 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.10 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.11 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.11 index c538e247b99..ef8a4127837 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.11 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.11 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.12 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.12 index a60815eeb88..df278df4873 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.12 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.12 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.13 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.13 index 8704e866108..c2951c548f6 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.13 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.13 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.14 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.14 index 8c4d8a1bade..7fd20ca4a2e 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.14 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.14 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.15 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.15 index da410495dae..9555ae7a3cd 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.15 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.15 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.16 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.16 index 0b6026901d0..2cba9a29adc 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.16 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.16 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.17 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.17 index 5b8002ec5bd..6cdb980fe3c 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.17 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.17 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.18 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.18 index 4d7e40a08c0..ce3d81cc142 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.18 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.18 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.19 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.19 index 3af1747d7d9..e7741c3ee4a 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.19 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.19 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.2 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.2 index 05eec833094..2a41e2bc1be 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.2 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.2 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.20 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.20 index 20e17c3358f..512486b3cf3 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.20 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.20 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.21 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.21 index de8056cfdeb..d3fa0fa9f7f 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.21 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.21 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.22 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.22 index b852075890c..d91ea95d28e 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.22 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.22 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.23 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.23 index f4c0905915c..dd3d8349e54 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.23 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.23 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.24 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.24 index 88a79bb1d82..2b461451e7a 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.24 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.24 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.25 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.25 index a044adc6d1c..42c57011684 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.25 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.25 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.26 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.26 index 7603c8a80b3..2226f6958b5 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.26 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.26 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.27 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.27 index 75e14f16d64..ccc46a8856d 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.27 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.27 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.28 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.28 index 5cdfa2787fd..4fd5dc08f45 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.28 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.28 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.29 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.29 index 7e68f9f584f..a80e550aaf6 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.29 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.29 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.3 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.3 index 4af8b71d850..eb1cfb5b498 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.3 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.3 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.30 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.30 index eb36f6233a0..6b16844c3f3 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.30 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.30 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.31 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.31 index d350b632ce3..28324a8dc21 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.31 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.31 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.32 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.32 index edeaa3d6638..4de41358e29 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.32 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.32 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.33 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.33 index b474ad6f998..4692aadf203 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.33 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.33 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.34 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.34 index 1747f2f40e3..b78b4c4e35c 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.34 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.34 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.35 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.35 index 55b449c1cbe..8f0256809ba 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.35 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.35 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.36 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.36 index 69b349125b4..fe1d45962d2 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.36 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.36 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.37 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.37 index b824e705c19..ff946ba8c38 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.37 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.37 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.38 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.38 index 7d0bf9eee7f..e7280e7a043 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.38 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.38 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.39 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.39 index 9bd2599c770..2f9ffcfe93c 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.39 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.39 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.4 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.4 index 707ecdfac8c..f3178773116 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.4 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.4 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.5 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.5 index 5887cac3012..dc623506a5d 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.5 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.5 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.6 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.6 index 2662e17939e..b4e7854d1ac 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.6 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.6 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.7 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.7 index dcc18589909..56763e23d4a 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.7 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.7 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.8 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.8 index 2d70ba4f8c9..4b1d0cd4bc4 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.8 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.8 differ diff --git a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.9 b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.9 index 136bbec7e87..d6385f0d0ab 100644 Binary files a/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.9 and b/tests/regression/inciter/compflow/Euler/SedovBlastwave/sedov_blastwave_pdg_pe4_u0.9.std.exo.9 differ diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/CMakeLists.txt b/tests/regression/inciter/compflow/Euler/SodShocktube/CMakeLists.txt index faf602384dc..47c8152b1cd 100644 --- a/tests/regression/inciter/compflow/Euler/SodShocktube/CMakeLists.txt +++ b/tests/regression/inciter/compflow/Euler/SodShocktube/CMakeLists.txt @@ -15,6 +15,18 @@ add_regression_test(compflow_euler_sodshocktube_dg ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) +add_regression_test(compflow_euler_sodshocktube_p0p1 ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES sod_shocktube_p0p1.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_p0p1.q -i rectangle_01_1.5k.exo -v + BIN_BASELINE sod_shocktube_p0p1.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) + add_regression_test(compflow_euler_rotated_sodshocktube_dg ${INCITER_EXECUTABLE} NUMPES 1 INPUTFILES rotated_sod_shocktube_dg.q diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/diag_p0p1.std b/tests/regression/inciter/compflow/Euler/SodShocktube/diag_p0p1.std new file mode 100644 index 00000000000..854858e42c2 --- /dev/null +++ b/tests/regression/inciter/compflow/Euler/SodShocktube/diag_p0p1.std @@ -0,0 +1,101 @@ +# 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) + 1 2.000000e-03 2.000000e-03 7.114828e-01 1.165655e-02 6.625611e-03 6.585813e-03 1.773330e+00 1.319814e-02 1.165655e-02 6.625611e-03 6.585813e-03 3.681630e-02 + 2 4.000000e-03 2.000000e-03 7.106602e-01 2.148112e-02 1.150710e-02 1.134952e-02 1.770832e+00 2.258437e-02 2.148112e-02 1.150710e-02 1.134952e-02 6.454091e-02 + 3 6.000000e-03 2.000000e-03 7.099228e-01 2.996319e-02 1.463947e-02 1.435147e-02 1.768561e+00 3.072999e-02 2.996319e-02 1.463947e-02 1.435147e-02 8.967609e-02 + 4 8.000000e-03 2.000000e-03 7.092454e-01 3.777844e-02 1.633625e-02 1.591492e-02 1.766524e+00 3.826914e-02 3.777844e-02 1.633625e-02 1.591492e-02 1.137727e-01 + 5 1.000000e-02 2.000000e-03 7.086244e-01 4.513929e-02 1.678395e-02 1.621672e-02 1.764709e+00 4.561945e-02 4.513929e-02 1.678395e-02 1.621672e-02 1.376595e-01 + 6 1.200000e-02 2.000000e-03 7.080401e-01 5.172101e-02 1.614549e-02 1.541118e-02 1.763008e+00 5.242319e-02 5.172101e-02 1.614549e-02 1.541118e-02 1.594861e-01 + 7 1.400000e-02 2.000000e-03 7.074712e-01 5.743695e-02 1.449713e-02 1.363124e-02 1.761319e+00 5.851482e-02 5.743695e-02 1.449713e-02 1.363124e-02 1.784395e-01 + 8 1.600000e-02 2.000000e-03 7.069070e-01 6.246840e-02 1.201941e-02 1.110934e-02 1.759601e+00 6.373745e-02 6.246840e-02 1.201941e-02 1.110934e-02 1.940250e-01 + 9 1.800000e-02 2.000000e-03 7.063407e-01 6.710630e-02 9.165081e-03 8.466467e-03 1.757887e+00 6.798987e-02 6.710630e-02 9.165081e-03 8.466467e-03 2.069283e-01 + 10 2.000000e-02 2.000000e-03 7.057677e-01 7.142710e-02 6.667394e-03 6.303734e-03 1.756178e+00 7.142304e-02 7.142710e-02 6.667394e-03 6.303734e-03 2.172980e-01 + 11 2.200000e-02 2.000000e-03 7.051829e-01 7.541835e-02 5.053296e-03 5.045286e-03 1.754435e+00 7.423472e-02 7.541835e-02 5.053296e-03 5.045286e-03 2.255616e-01 + 12 2.400000e-02 2.000000e-03 7.045895e-01 7.912509e-02 4.213757e-03 4.435052e-03 1.752664e+00 7.665759e-02 7.912509e-02 4.213757e-03 4.435052e-03 2.325118e-01 + 13 2.600000e-02 2.000000e-03 7.039901e-01 8.266468e-02 3.487767e-03 3.863688e-03 1.750889e+00 7.886993e-02 8.266468e-02 3.487767e-03 3.863688e-03 2.388466e-01 + 14 2.800000e-02 2.000000e-03 7.033913e-01 8.613668e-02 3.022427e-03 3.374214e-03 1.749137e+00 8.104996e-02 8.613668e-02 3.022427e-03 3.374214e-03 2.451388e-01 + 15 3.000000e-02 2.000000e-03 7.027921e-01 8.954592e-02 3.077259e-03 3.256977e-03 1.747395e+00 8.320762e-02 8.954592e-02 3.077259e-03 3.256977e-03 2.512799e-01 + 16 3.200000e-02 2.000000e-03 7.021871e-01 9.274463e-02 3.510542e-03 3.600964e-03 1.745603e+00 8.530762e-02 9.274463e-02 3.510542e-03 3.600964e-03 2.567874e-01 + 17 3.400000e-02 2.000000e-03 7.015818e-01 9.580287e-02 3.861022e-03 3.862610e-03 1.743800e+00 8.744216e-02 9.580287e-02 3.861022e-03 3.862610e-03 2.619396e-01 + 18 3.600000e-02 2.000000e-03 7.009780e-01 9.886324e-02 3.950307e-03 3.793970e-03 1.742037e+00 8.969658e-02 9.886324e-02 3.950307e-03 3.793970e-03 2.673712e-01 + 19 3.800000e-02 2.000000e-03 7.003741e-01 1.019145e-01 3.928152e-03 3.636987e-03 1.740305e+00 9.207255e-02 1.019145e-01 3.928152e-03 3.636987e-03 2.731466e-01 + 20 4.000000e-02 2.000000e-03 6.997636e-01 1.048025e-01 3.785067e-03 3.465649e-03 1.738531e+00 9.446998e-02 1.048025e-01 3.785067e-03 3.465649e-03 2.789722e-01 + 21 4.200000e-02 2.000000e-03 6.991527e-01 1.075678e-01 3.485748e-03 3.207095e-03 1.736735e+00 9.695170e-02 1.075678e-01 3.485748e-03 3.207095e-03 2.851888e-01 + 22 4.400000e-02 2.000000e-03 6.985443e-01 1.103287e-01 2.960808e-03 2.697584e-03 1.734963e+00 9.953559e-02 1.103287e-01 2.960808e-03 2.697584e-03 2.919960e-01 + 23 4.600000e-02 2.000000e-03 6.979383e-01 1.131116e-01 2.380256e-03 2.170591e-03 1.733230e+00 1.021801e-01 1.131116e-01 2.380256e-03 2.170591e-03 2.992754e-01 + 24 4.800000e-02 2.000000e-03 6.973254e-01 1.157591e-01 2.004608e-03 1.944932e-03 1.731454e+00 1.047869e-01 1.157591e-01 2.004608e-03 1.944932e-03 3.063443e-01 + 25 5.000000e-02 2.000000e-03 6.967100e-01 1.182717e-01 1.847530e-03 1.957519e-03 1.729642e+00 1.073515e-01 1.182717e-01 1.847530e-03 1.957519e-03 3.131382e-01 + 26 5.200000e-02 2.000000e-03 6.960969e-01 1.207580e-01 1.564807e-03 1.682357e-03 1.727844e+00 1.098679e-01 1.207580e-01 1.564807e-03 1.682357e-03 3.199043e-01 + 27 5.400000e-02 2.000000e-03 6.954864e-01 1.232675e-01 1.382607e-03 1.433665e-03 1.726086e+00 1.123216e-01 1.232675e-01 1.382607e-03 1.433665e-03 3.267580e-01 + 28 5.600000e-02 2.000000e-03 6.948698e-01 1.256904e-01 1.518996e-03 1.536049e-03 1.724301e+00 1.146627e-01 1.256904e-01 1.518996e-03 1.536049e-03 3.333472e-01 + 29 5.800000e-02 2.000000e-03 6.942514e-01 1.280071e-01 1.779803e-03 1.809105e-03 1.722483e+00 1.169055e-01 1.280071e-01 1.779803e-03 1.809105e-03 3.395865e-01 + 30 6.000000e-02 2.000000e-03 6.936368e-01 1.303024e-01 1.700700e-03 1.634992e-03 1.720676e+00 1.190831e-01 1.303024e-01 1.700700e-03 1.634992e-03 3.456587e-01 + 31 6.200000e-02 2.000000e-03 6.930268e-01 1.326344e-01 1.508723e-03 1.280304e-03 1.718913e+00 1.212294e-01 1.326344e-01 1.508723e-03 1.280304e-03 3.517901e-01 + 32 6.400000e-02 2.000000e-03 6.924130e-01 1.349180e-01 1.504209e-03 1.238716e-03 1.717136e+00 1.233074e-01 1.349180e-01 1.504209e-03 1.238716e-03 3.577133e-01 + 33 6.600000e-02 2.000000e-03 6.917958e-01 1.370999e-01 1.653808e-03 1.505665e-03 1.715319e+00 1.253243e-01 1.370999e-01 1.653808e-03 1.505665e-03 3.633181e-01 + 34 6.800000e-02 2.000000e-03 6.911812e-01 1.392500e-01 1.512833e-03 1.369741e-03 1.713504e+00 1.273200e-01 1.392500e-01 1.512833e-03 1.369741e-03 3.688248e-01 + 35 7.000000e-02 2.000000e-03 6.905703e-01 1.414286e-01 1.177798e-03 9.107913e-04 1.711728e+00 1.293079e-01 1.414286e-01 1.177798e-03 9.107913e-04 3.744183e-01 + 36 7.200000e-02 2.000000e-03 6.899569e-01 1.435842e-01 1.026183e-03 7.361028e-04 1.709953e+00 1.312601e-01 1.435842e-01 1.026183e-03 7.361028e-04 3.799379e-01 + 37 7.400000e-02 2.000000e-03 6.893382e-01 1.456487e-01 1.234047e-03 1.140094e-03 1.708137e+00 1.331615e-01 1.456487e-01 1.234047e-03 1.140094e-03 3.851924e-01 + 38 7.600000e-02 2.000000e-03 6.887207e-01 1.476681e-01 1.226452e-03 1.198527e-03 1.706315e+00 1.350503e-01 1.476681e-01 1.226452e-03 1.198527e-03 3.903429e-01 + 39 7.800000e-02 2.000000e-03 6.881066e-01 1.497101e-01 9.121752e-04 7.713866e-04 1.704526e+00 1.369405e-01 1.497101e-01 9.121752e-04 7.713866e-04 3.955619e-01 + 40 8.000000e-02 2.000000e-03 6.874914e-01 1.517478e-01 7.475505e-04 4.970084e-04 1.702748e+00 1.388127e-01 1.517478e-01 7.475505e-04 4.970084e-04 4.007741e-01 + 41 8.200000e-02 2.000000e-03 6.868704e-01 1.537173e-01 1.027424e-03 9.516706e-04 1.700935e+00 1.406465e-01 1.537173e-01 1.027424e-03 9.516706e-04 4.058002e-01 + 42 8.400000e-02 2.000000e-03 6.862496e-01 1.556342e-01 1.154453e-03 1.164991e-03 1.699109e+00 1.424715e-01 1.556342e-01 1.154453e-03 1.164991e-03 4.107444e-01 + 43 8.600000e-02 2.000000e-03 6.856319e-01 1.575626e-01 9.072625e-04 8.282116e-04 1.697305e+00 1.443005e-01 1.575626e-01 9.072625e-04 8.282116e-04 4.157634e-01 + 44 8.800000e-02 2.000000e-03 6.850152e-01 1.594995e-01 7.015614e-04 5.152817e-04 1.695523e+00 1.461221e-01 1.594995e-01 7.015614e-04 5.152817e-04 4.208547e-01 + 45 9.000000e-02 2.000000e-03 6.843930e-01 1.613892e-01 9.237412e-04 8.770668e-04 1.693715e+00 1.479043e-01 1.613892e-01 9.237412e-04 8.770668e-04 4.258180e-01 + 46 9.200000e-02 2.000000e-03 6.837691e-01 1.632187e-01 1.171463e-03 1.248829e-03 1.691882e+00 1.496662e-01 1.632187e-01 1.171463e-03 1.248829e-03 4.306685e-01 + 47 9.400000e-02 2.000000e-03 6.831475e-01 1.650474e-01 9.520235e-04 9.986760e-04 1.690062e+00 1.514255e-01 1.650474e-01 9.520235e-04 9.986760e-04 4.355488e-01 + 48 9.600000e-02 2.000000e-03 6.825292e-01 1.669013e-01 5.801659e-04 5.230825e-04 1.688277e+00 1.531823e-01 1.669013e-01 5.801659e-04 5.230825e-04 4.405309e-01 + 49 9.800000e-02 2.000000e-03 6.819062e-01 1.687248e-01 6.443418e-04 6.361121e-04 1.686474e+00 1.548985e-01 1.687248e-01 6.443418e-04 6.361121e-04 4.453965e-01 + 50 1.000000e-01 2.000000e-03 6.812793e-01 1.704811e-01 1.012183e-03 1.126260e-03 1.684637e+00 1.565757e-01 1.704811e-01 1.012183e-03 1.126260e-03 4.500685e-01 + 51 1.020000e-01 2.000000e-03 6.806544e-01 1.722208e-01 9.533279e-04 1.078891e-03 1.682801e+00 1.582395e-01 1.722208e-01 9.533279e-04 1.078891e-03 4.546920e-01 + 52 1.040000e-01 2.000000e-03 6.800328e-01 1.739867e-01 5.708935e-04 6.196354e-04 1.680998e+00 1.598967e-01 1.739867e-01 5.708935e-04 6.196354e-04 4.593738e-01 + 53 1.060000e-01 2.000000e-03 6.794095e-01 1.757467e-01 4.308952e-04 4.522518e-04 1.679197e+00 1.615276e-01 1.757467e-01 4.308952e-04 4.522518e-04 4.640131e-01 + 54 1.080000e-01 2.000000e-03 6.787809e-01 1.774482e-01 8.726909e-04 9.785093e-04 1.677360e+00 1.631196e-01 1.774482e-01 8.726909e-04 9.785093e-04 4.684697e-01 + 55 1.100000e-01 2.000000e-03 6.781530e-01 1.791165e-01 1.000516e-03 1.142150e-03 1.675514e+00 1.647009e-01 1.791165e-01 1.000516e-03 1.142150e-03 4.728518e-01 + 56 1.120000e-01 2.000000e-03 6.775279e-01 1.808020e-01 6.778266e-04 7.486367e-04 1.673692e+00 1.662827e-01 1.808020e-01 6.778266e-04 7.486367e-04 4.772801e-01 + 57 1.140000e-01 2.000000e-03 6.769039e-01 1.824996e-01 4.066358e-04 3.990126e-04 1.671890e+00 1.678592e-01 1.824996e-01 4.066358e-04 3.990126e-04 4.817442e-01 + 58 1.160000e-01 2.000000e-03 6.762742e-01 1.841549e-01 7.564533e-04 8.214948e-04 1.670058e+00 1.694051e-01 1.841549e-01 7.564533e-04 8.214948e-04 4.860715e-01 + 59 1.180000e-01 2.000000e-03 6.756432e-01 1.857638e-01 1.018849e-03 1.156341e-03 1.668203e+00 1.709387e-01 1.857638e-01 1.018849e-03 1.156341e-03 4.902956e-01 + 60 1.200000e-01 2.000000e-03 6.750145e-01 1.873765e-01 8.054344e-04 8.978219e-04 1.666362e+00 1.724747e-01 1.873765e-01 8.054344e-04 8.978219e-04 4.945444e-01 + 61 1.220000e-01 2.000000e-03 6.743889e-01 1.890137e-01 4.369597e-04 4.235784e-04 1.664554e+00 1.740146e-01 1.890137e-01 4.369597e-04 4.235784e-04 4.988800e-01 + 62 1.240000e-01 2.000000e-03 6.737588e-01 1.906277e-01 5.769358e-04 6.021482e-04 1.662728e+00 1.755279e-01 1.906277e-01 5.769358e-04 6.021482e-04 5.031357e-01 + 63 1.260000e-01 2.000000e-03 6.731247e-01 1.921863e-01 1.003859e-03 1.128373e-03 1.660867e+00 1.770168e-01 1.921863e-01 1.003859e-03 1.128373e-03 5.072543e-01 + 64 1.280000e-01 2.000000e-03 6.724924e-01 1.937340e-01 9.610724e-04 1.087633e-03 1.659008e+00 1.785031e-01 1.937340e-01 9.610724e-04 1.087633e-03 5.113601e-01 + 65 1.300000e-01 2.000000e-03 6.718632e-01 1.953076e-01 5.804794e-04 6.216913e-04 1.657180e+00 1.799921e-01 1.953076e-01 5.804794e-04 6.216913e-04 5.155432e-01 + 66 1.320000e-01 2.000000e-03 6.712327e-01 1.968799e-01 4.452289e-04 4.428271e-04 1.655356e+00 1.814662e-01 1.968799e-01 4.452289e-04 4.428271e-04 5.197170e-01 + 67 1.340000e-01 2.000000e-03 6.705967e-01 1.984041e-01 8.653946e-04 9.557760e-04 1.653495e+00 1.829113e-01 1.984041e-01 8.653946e-04 9.557760e-04 5.237503e-01 + 68 1.360000e-01 2.000000e-03 6.699613e-01 1.999005e-01 9.878408e-04 1.122399e-03 1.651625e+00 1.843493e-01 1.999005e-01 9.878408e-04 1.122399e-03 5.277273e-01 + 69 1.380000e-01 2.000000e-03 6.693286e-01 2.014128e-01 6.867672e-04 7.507314e-04 1.649776e+00 1.857881e-01 2.014128e-01 6.867672e-04 7.507314e-04 5.317495e-01 + 70 1.400000e-01 2.000000e-03 6.686973e-01 2.029404e-01 4.027628e-04 3.794963e-04 1.647949e+00 1.872223e-01 2.029404e-01 4.027628e-04 3.794963e-04 5.358148e-01 + 71 1.420000e-01 2.000000e-03 6.680605e-01 2.044355e-01 7.223419e-04 7.759483e-04 1.646094e+00 1.886281e-01 2.044355e-01 7.223419e-04 7.759483e-04 5.397678e-01 + 72 1.440000e-01 2.000000e-03 6.674220e-01 2.058880e-01 1.032486e-03 1.164096e-03 1.644214e+00 1.900195e-01 2.058880e-01 1.032486e-03 1.164096e-03 5.436205e-01 + 73 1.460000e-01 2.000000e-03 6.667857e-01 2.073448e-01 8.363679e-04 9.315799e-04 1.642345e+00 1.914105e-01 2.073448e-01 8.363679e-04 9.315799e-04 5.474870e-01 + 74 1.480000e-01 2.000000e-03 6.661527e-01 2.088264e-01 4.468094e-04 4.261074e-04 1.640510e+00 1.928047e-01 2.088264e-01 4.468094e-04 4.261074e-04 5.514300e-01 + 75 1.500000e-01 2.000000e-03 6.655156e-01 2.102938e-01 5.453714e-04 5.454174e-04 1.638662e+00 1.941771e-01 2.102938e-01 5.453714e-04 5.454174e-04 5.553123e-01 + 76 1.520000e-01 2.000000e-03 6.648741e-01 2.117120e-01 9.695268e-04 1.077894e-03 1.636776e+00 1.955270e-01 2.117120e-01 9.695268e-04 1.077894e-03 5.590619e-01 + 77 1.540000e-01 2.000000e-03 6.642342e-01 2.131184e-01 9.580872e-04 1.079213e-03 1.634889e+00 1.968755e-01 2.131184e-01 9.580872e-04 1.079213e-03 5.627920e-01 + 78 1.560000e-01 2.000000e-03 6.635973e-01 2.145487e-01 6.043717e-04 6.335557e-04 1.633032e+00 1.982274e-01 2.145487e-01 6.043717e-04 6.335557e-04 5.665878e-01 + 79 1.580000e-01 2.000000e-03 6.629596e-01 2.159825e-01 4.262731e-04 3.871300e-04 1.631182e+00 1.995698e-01 2.159825e-01 4.262731e-04 3.871300e-04 5.703892e-01 + 80 1.600000e-01 2.000000e-03 6.623162e-01 2.173770e-01 8.390498e-04 9.078298e-04 1.629298e+00 2.008871e-01 2.173770e-01 8.390498e-04 9.078298e-04 5.740715e-01 + 81 1.620000e-01 2.000000e-03 6.616728e-01 2.187436e-01 1.015288e-03 1.140385e-03 1.627398e+00 2.021981e-01 2.187436e-01 1.015288e-03 1.140385e-03 5.776947e-01 + 82 1.640000e-01 2.000000e-03 6.610320e-01 2.201235e-01 7.228203e-04 7.844882e-04 1.625519e+00 2.035115e-01 2.201235e-01 7.228203e-04 7.844882e-04 5.813602e-01 + 83 1.660000e-01 2.000000e-03 6.603933e-01 2.215235e-01 3.942796e-04 3.499371e-04 1.623667e+00 2.048251e-01 2.215235e-01 3.942796e-04 3.499371e-04 5.850843e-01 + 84 1.680000e-01 2.000000e-03 6.597490e-01 2.228980e-01 6.843310e-04 7.198609e-04 1.621788e+00 2.061151e-01 2.228980e-01 6.843310e-04 7.198609e-04 5.887186e-01 + 85 1.700000e-01 2.000000e-03 6.591024e-01 2.242313e-01 1.017232e-03 1.146755e-03 1.619879e+00 2.073917e-01 2.242313e-01 1.017232e-03 1.146755e-03 5.922561e-01 + 86 1.720000e-01 2.000000e-03 6.584579e-01 2.255668e-01 8.602994e-04 9.644000e-04 1.617980e+00 2.086693e-01 2.255668e-01 8.602994e-04 9.644000e-04 5.958042e-01 + 87 1.740000e-01 2.000000e-03 6.578167e-01 2.269271e-01 4.798328e-04 4.730947e-04 1.616114e+00 2.099517e-01 2.269271e-01 4.798328e-04 4.730947e-04 5.994276e-01 + 88 1.760000e-01 2.000000e-03 6.571721e-01 2.282793e-01 4.953654e-04 4.877151e-04 1.614239e+00 2.112178e-01 2.282793e-01 4.953654e-04 4.877151e-04 6.030144e-01 + 89 1.780000e-01 2.000000e-03 6.565224e-01 2.295881e-01 9.448510e-04 1.049235e-03 1.612326e+00 2.124627e-01 2.295881e-01 9.448510e-04 1.049235e-03 6.064820e-01 + 90 1.800000e-01 2.000000e-03 6.558741e-01 2.308837e-01 9.816280e-04 1.111360e-03 1.610408e+00 2.137064e-01 2.308837e-01 9.816280e-04 1.111360e-03 6.099258e-01 + 91 1.820000e-01 2.000000e-03 6.552288e-01 2.322014e-01 6.082427e-04 6.582341e-04 1.608519e+00 2.149542e-01 2.322014e-01 6.082427e-04 6.582341e-04 6.134304e-01 + 92 1.840000e-01 2.000000e-03 6.545834e-01 2.335281e-01 3.676617e-04 3.440325e-04 1.606644e+00 2.161964e-01 2.335281e-01 3.676617e-04 3.440325e-04 6.169571e-01 + 93 1.860000e-01 2.000000e-03 6.539321e-01 2.348217e-01 7.880434e-04 8.643555e-04 1.604733e+00 2.174159e-01 2.348217e-01 7.880434e-04 8.643555e-04 6.203778e-01 + 94 1.880000e-01 2.000000e-03 6.532804e-01 2.360865e-01 9.887530e-04 1.131793e-03 1.602803e+00 2.186288e-01 2.360865e-01 9.887530e-04 1.131793e-03 6.237354e-01 + 95 1.900000e-01 2.000000e-03 6.526312e-01 2.373628e-01 7.197839e-04 8.130012e-04 1.600891e+00 2.198447e-01 2.373628e-01 7.197839e-04 8.130012e-04 6.271294e-01 + 96 1.920000e-01 2.000000e-03 6.519844e-01 2.386610e-01 3.471646e-04 3.526597e-04 1.599010e+00 2.210629e-01 2.386610e-01 3.471646e-04 3.526597e-04 6.305867e-01 + 97 1.940000e-01 2.000000e-03 6.513322e-01 2.399387e-01 6.099440e-04 6.687720e-04 1.597104e+00 2.222606e-01 2.399387e-01 6.099440e-04 6.687720e-04 6.339685e-01 + 98 1.960000e-01 2.000000e-03 6.506770e-01 2.411771e-01 1.008016e-03 1.154620e-03 1.595165e+00 2.234450e-01 2.411771e-01 1.008016e-03 1.154620e-03 6.372552e-01 + 99 1.980000e-01 2.000000e-03 6.500239e-01 2.424162e-01 8.783533e-04 1.010652e-03 1.593232e+00 2.246312e-01 2.424162e-01 8.783533e-04 1.010652e-03 6.405482e-01 + 100 2.000000e-01 2.000000e-03 6.493741e-01 2.436805e-01 4.548057e-04 4.990733e-04 1.591334e+00 2.258228e-01 2.436805e-01 4.548057e-04 4.990733e-04 6.439144e-01 diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/rotated_sod_shocktube_dg.q b/tests/regression/inciter/compflow/Euler/SodShocktube/rotated_sod_shocktube_dg.q index 3ab2f99f565..2d073a3fe0b 100644 --- a/tests/regression/inciter/compflow/Euler/SodShocktube/rotated_sod_shocktube_dg.q +++ b/tests/regression/inciter/compflow/Euler/SodShocktube/rotated_sod_shocktube_dg.q @@ -18,8 +18,7 @@ inciter depvar u material - id 1 - gamma 1.4 # ratio of specific heats + gamma 1.4 end # ratio of specific heats end bc_extrapolate diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_dg.q b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_dg.q index fa4a4fd92ce..2fd95e3ae3f 100644 --- a/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_dg.q +++ b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_dg.q @@ -18,8 +18,7 @@ inciter depvar u material - id 1 - gamma 1.4 # ratio of specific heats + gamma 1.4 end # ratio of specific heats end bc_extrapolate diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.q b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.q new file mode 100644 index 00000000000..e430dc6245a --- /dev/null +++ b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.q @@ -0,0 +1,44 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Sod shock-tube" + +inciter + + nstep 100 # Max number of time steps + dt 2.0e-3 # Time step size + ttyi 10 # TTY output interval + scheme p0p1 + limiter superbeep1 + + compflow + + physics euler + problem sod_shocktube + depvar u + + material + gamma 1.4 end # ratio of specific heats + end + + bc_extrapolate + sideset 1 3 end + end + bc_sym + sideset 2 4 5 6 end + end + + end + + diagnostics + interval 1 + format scientific + error l2 + end + + plotvar + interval 20 + end + +end diff --git a/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.std.exo b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.std.exo new file mode 100644 index 00000000000..5d4c903469b Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/SodShocktube/sod_shocktube_p0p1.std.exo differ diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/CMakeLists.txt b/tests/regression/inciter/compflow/Euler/TaylorGreen/CMakeLists.txt index e013356280b..dc52ed19c64 100644 --- a/tests/regression/inciter/compflow/Euler/TaylorGreen/CMakeLists.txt +++ b/tests/regression/inciter/compflow/Euler/TaylorGreen/CMakeLists.txt @@ -26,6 +26,18 @@ add_regression_test(compflow_euler_taylor_green_dgp2 ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF taylor_green_diag.ndiff.cfg) +add_regression_test(compflow_euler_taylor_green_dgp2_cfl ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES taylor_green_dgp2_cfl.q unitcube_1k.exo + ARGS -c taylor_green_dgp2_cfl.q -i unitcube_1k.exo -v + BIN_BASELINE taylor_green_dgp2_cfl.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_dgp2_cfl.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF taylor_green_diag.ndiff.cfg) + # Parallel + no virtualization add_regression_test(compflow_euler_taylor_green ${INCITER_EXECUTABLE} @@ -46,7 +58,7 @@ add_regression_test(compflow_euler_taylor_green ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF taylor_green_diag.ndiff.cfg) -add_regression_test(compflow_euler_taylor_green_dgp2 ${INCITER_EXECUTABLE} +add_regression_test(compflow_euler_taylor_green_dgp2_cfl ${INCITER_EXECUTABLE} NUMPES 4 INPUTFILES taylor_green_dgp2.q unitcube_1k.exo ARGS -c taylor_green_dgp2.q -i unitcube_1k.exo -v @@ -64,6 +76,24 @@ add_regression_test(compflow_euler_taylor_green_dgp2 ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF taylor_green_diag.ndiff.cfg) +add_regression_test(compflow_euler_taylor_green_dgp2 ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES taylor_green_dgp2_cfl.q unitcube_1k.exo + ARGS -c taylor_green_dgp2_cfl.q -i unitcube_1k.exo -v + BIN_BASELINE taylor_green_dgp2_cfl_pe4.std.exo.0 + taylor_green_dgp2_cfl_pe4.std.exo.1 + taylor_green_dgp2_cfl_pe4.std.exo.2 + taylor_green_dgp2_cfl_pe4.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff_dg.cfg + TEXT_BASELINE diag_dgp2_cfl.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF taylor_green_diag.ndiff.cfg) + # Parallel + virtualization add_regression_test(compflow_euler_taylor_green_u0.5 ${INCITER_EXECUTABLE} diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/diag_dgp2_cfl.std b/tests/regression/inciter/compflow/Euler/TaylorGreen/diag_dgp2_cfl.std new file mode 100644 index 00000000000..82a0ef552b3 --- /dev/null +++ b/tests/regression/inciter/compflow/Euler/TaylorGreen/diag_dgp2_cfl.std @@ -0,0 +1,9 @@ +# 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) + 5 3.928007e-04 7.855951e-05 1.000000e+00 4.999996e-01 4.999995e-01 2.616300e-05 1.525512e+01 1.168965e-05 3.885611e-04 3.881058e-04 2.616300e-05 1.432364e-03 + 10 7.855954e-04 7.855867e-05 1.000000e+00 4.999992e-01 4.999988e-01 4.951123e-05 1.525513e+01 2.148076e-05 3.939860e-04 3.936824e-04 4.951123e-05 1.510478e-03 + 15 1.178388e-03 7.855830e-05 1.000000e+00 4.999988e-01 4.999982e-01 7.055315e-05 1.525513e+01 2.975152e-05 4.016540e-04 4.016338e-04 7.055315e-05 1.607261e-03 + 20 1.571178e-03 7.855813e-05 1.000000e+00 4.999985e-01 4.999976e-01 8.965337e-05 1.525513e+01 3.679567e-05 4.107959e-04 4.111718e-04 8.965337e-05 1.708530e-03 + 25 1.963969e-03 7.855803e-05 1.000000e+00 4.999983e-01 4.999970e-01 1.070978e-04 1.525513e+01 4.284369e-05 4.208690e-04 4.217234e-04 1.070978e-04 1.807191e-03 + 30 2.356759e-03 7.855799e-05 1.000001e+00 4.999981e-01 4.999965e-01 1.231194e-04 1.525514e+01 4.807735e-05 4.314953e-04 4.328804e-04 1.231194e-04 1.900035e-03 + 35 2.749549e-03 7.855796e-05 1.000001e+00 4.999981e-01 4.999960e-01 1.379120e-04 1.525514e+01 5.264052e-05 4.424141e-04 4.443572e-04 1.379120e-04 1.985857e-03 + 40 3.142338e-03 7.855795e-05 1.000001e+00 4.999981e-01 4.999954e-01 1.516382e-04 1.525514e+01 5.664751e-05 4.534475e-04 4.559571e-04 1.516382e-04 2.064439e-03 diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green.q b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green.q index 2f5aec4f5b8..f50593859b6 100644 --- a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green.q +++ b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green.q @@ -21,8 +21,7 @@ inciter problem taylor_green material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2.q b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2.q index 5700672c8f6..d06aa14319f 100644 --- a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2.q +++ b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2.q @@ -18,8 +18,7 @@ inciter problem taylor_green material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.q b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.q new file mode 100644 index 00000000000..e55f55382db --- /dev/null +++ b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.q @@ -0,0 +1,40 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Euler equations computing stationary Taylor-Green" + +inciter + + nstep 40 # Max number of time steps + cfl 0.8 # CFL number + ttyi 5 # TTY output interval + scheme dgp2 + + compflow + + depvar u + physics euler + problem taylor_green + + material + gamma 1.66666666666667 end # =5/3 ratio of specific heats + end + + bc_dirichlet + sideset 1 2 3 4 5 6 end + end + + end + + plotvar + interval 5 + end + + diagnostics + interval 5 + format scientific + error l2 + end + +end diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.std.exo b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.std.exo new file mode 100644 index 00000000000..7d1d22dacf0 Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl.std.exo differ diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.0 b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.0 new file mode 100644 index 00000000000..5b6c8a61894 Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.0 differ diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.1 b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.1 new file mode 100644 index 00000000000..bae641dea98 Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.1 differ diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.2 b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.2 new file mode 100644 index 00000000000..9ba2577f5bc Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.2 differ diff --git a/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.3 b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.3 new file mode 100644 index 00000000000..08a4e4779c8 Binary files /dev/null and b/tests/regression/inciter/compflow/Euler/TaylorGreen/taylor_green_dgp2_cfl_pe4.std.exo.3 differ diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow.q index e8a782c3cd0..4df0bbb0b90 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow.q @@ -25,8 +25,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg.q index 00e2a0fe09c..c7e16e42b17 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg.q @@ -22,8 +22,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg_lf.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg_lf.q index f33b2933635..0498eb9ffef 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg_lf.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dg_lf.q @@ -23,8 +23,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1.q index 0e54a78e5a5..54b7a97e0cc 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1.q @@ -22,8 +22,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1_lf.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1_lf.q index f23ba266895..32f064d5f0e 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1_lf.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_dgp1_lf.q @@ -23,8 +23,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_diagcg.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_diagcg.q index 079f6c5b1b9..f6ecbcae8cb 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_diagcg.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_diagcg.q @@ -26,8 +26,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_reord_dg.q b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_reord_dg.q index c69ae851f61..1c4c4dc5f35 100644 --- a/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_reord_dg.q +++ b/tests/regression/inciter/compflow/Euler/VorticalFlow/vortical_flow_reord_dg.q @@ -24,8 +24,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/mesh_refinement/README.txt b/tests/regression/inciter/mesh_refinement/README.txt index 729022f888c..ac89f80ede8 100644 --- a/tests/regression/inciter/mesh_refinement/README.txt +++ b/tests/regression/inciter/mesh_refinement/README.txt @@ -1,6 +1,6 @@ # vim: filetype=cmake: # -# Naming convention for AMR regression tests +# Rough naming convention for AMR regression tests # # Example: amr_t0ref_uu_trans_reord_dg_u0.8_migr # @@ -13,6 +13,7 @@ # - i: initial conditions based adaptive refinement (keyword: ic) # - c: coordinate based refinement (keyword: coords) # - e: refine a list of tagged edges (keyword: edgelist) +# - d : uniform de-refinement (keyword: uniform_derefine) # * trans - type of physics, e.g., compflow, transport # * reord - perform PE-locality mesh node reordering during setup # * dg - discontinuous Galerkin discretization, e.g., dg, diagcg, dpg2, ... diff --git a/tests/regression/inciter/mesh_refinement/dtref/CMakeLists.txt b/tests/regression/inciter/mesh_refinement/dtref/CMakeLists.txt index 787bfa2a68a..c7e4076ffc7 100644 --- a/tests/regression/inciter/mesh_refinement/dtref/CMakeLists.txt +++ b/tests/regression/inciter/mesh_refinement/dtref/CMakeLists.txt @@ -13,6 +13,7 @@ add_regression_test(amr_dtref_u_trans_diagcg ${INCITER_EXECUTABLE} slot_cyl_diagcg_pe1_u_u0.0.std.e-s.1.1.0 BIN_RESULT out.e-s.0.1.0 out.e-s.1.1.0 BIN_DIFF_PROG_CONF exodiff_slot_cyl_amr_diagcg.cfg + BIN_DIFF_PROG_ARGS -m TEXT_BASELINE slot_cyl_amr_diagcg.std TEXT_RESULT diag TEXT_DIFF_PROG_CONF slot_cyl_diagcg.ndiff.cfg @@ -27,6 +28,7 @@ add_regression_test(amr_dtref_u_trans_reord_diagcg ${INCITER_EXECUTABLE} BIN_BASELINE slot_cyl_diagcg_pe1_u_u0.0.std.e-s.0.1.0 slot_cyl_diagcg_pe1_u_u0.0.std.e-s.1.1.0 BIN_RESULT out.e-s.0.1.0 out.e-s.1.1.0 + BIN_DIFF_PROG_ARGS -m BIN_DIFF_PROG_CONF exodiff_slot_cyl_amr_diagcg.cfg TEXT_BASELINE slot_cyl_amr_diagcg.std TEXT_RESULT diag diff --git a/tests/regression/inciter/mesh_refinement/dtref/nleg_diagcg_amr.q b/tests/regression/inciter/mesh_refinement/dtref/nleg_diagcg_amr.q index 08c1e2a8ddd..5f28c22d639 100644 --- a/tests/regression/inciter/mesh_refinement/dtref/nleg_diagcg_amr.q +++ b/tests/regression/inciter/mesh_refinement/dtref/nleg_diagcg_amr.q @@ -31,8 +31,7 @@ inciter kappa 0.8 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/mesh_refinement/dtref/nleg_reord_diagcg_amr.q b/tests/regression/inciter/mesh_refinement/dtref/nleg_reord_diagcg_amr.q index 90de93932a9..f92b2676628 100644 --- a/tests/regression/inciter/mesh_refinement/dtref/nleg_reord_diagcg_amr.q +++ b/tests/regression/inciter/mesh_refinement/dtref/nleg_reord_diagcg_amr.q @@ -32,8 +32,7 @@ inciter kappa 0.8 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/mesh_refinement/t0ref/CMakeLists.txt b/tests/regression/inciter/mesh_refinement/t0ref/CMakeLists.txt index 3c2c3b6ca87..c05aa9923c9 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/CMakeLists.txt +++ b/tests/regression/inciter/mesh_refinement/t0ref/CMakeLists.txt @@ -56,7 +56,7 @@ add_regression_test(amr_t0ref_u_compflow_reord_dg ${INCITER_EXECUTABLE} TEXT_DIFF_PROG_CONF vortical_flow_diag.ndiff.cfg LABELS amr) -add_regression_test(amr_t0ref_trans_cc_diagcg ${INCITER_EXECUTABLE} +add_regression_test(amr_t0ref_cc_trans_diagcg ${INCITER_EXECUTABLE} NUMPES 1 INPUTFILES slot_cyl_amr_coords.q unitcube_01_364.exo ARGS -c slot_cyl_amr_coords.q -i unitcube_01_364.exo -v @@ -105,6 +105,66 @@ add_regression_test(amr_t0ref_u_trans_reord_dg ${INCITER_EXECUTABLE} TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg LABELS amr) +add_regression_test(amr_t0ref_udu_trans_dg ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES gauss_hump_dg_uniform_deref.q + unitsquare_01_955_ss3.exo + ARGS -c gauss_hump_dg_uniform_deref.q + -i unitsquare_01_955_ss3.exo -v + BIN_BASELINE gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.1.0 + gauss_hump_dg.std.exo + BIN_RESULT t0ref.e-s.0.1.0 + t0ref.e-s.1.1.0 + t0ref.e-s.2.1.0 + t0ref.e-s.3.1.0 + out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_gauss_hump_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg + LABELS amr) + +add_regression_test(amr_t0ref_ududu_trans_dg ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES gauss_hump_dg_uniform_deref_x2.q + unitsquare_01_955_ss3.exo + ARGS -c gauss_hump_dg_uniform_deref_x2.q + -i unitsquare_01_955_ss3.exo -v + BIN_BASELINE gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.1.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.1.0 + gauss_hump_dg.std.exo + BIN_RESULT t0ref.e-s.0.1.0 + t0ref.e-s.1.1.0 + t0ref.e-s.2.1.0 + t0ref.e-s.3.1.0 + t0ref.e-s.4.1.0 + t0ref.e-s.5.1.0 + out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_gauss_hump_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg + LABELS amr) + # Parallel, no virtualization add_regression_test(amr_t0ref_u_trans_diagcg ${INCITER_EXECUTABLE} @@ -127,22 +187,32 @@ add_regression_test(amr_t0ref_ii ${INCITER_EXECUTABLE} NUMPES 2 INPUTFILES ic_ic.q unitsquare_01_141.exo ARGS -c ic_ic.q -i unitsquare_01_141.exo -v - BIN_BASELINE amr_ic_ic.std.exo.0 + BIN_BASELINE ic_ic_t0ref.e-s.0.2.0 + ic_ic_t0ref.e-s.0.2.1 + ic_ic_t0ref.e-s.1.2.0 + ic_ic_t0ref.e-s.1.2.1 + ic_ic_t0ref.e-s.2.2.0 + ic_ic_t0ref.e-s.2.2.1 + amr_ic_ic.std.exo.0 amr_ic_ic.std.exo.1 - # TODO: double check this numbering scheme - BIN_RESULT out.e-s.0.2.0 - out.e-s.0.2.1 + BIN_RESULT t0ref.e-s.0.2.0 + t0ref.e-s.0.2.1 + t0ref.e-s.1.2.0 + t0ref.e-s.1.2.1 + t0ref.e-s.2.2.0 + t0ref.e-s.2.2.1 + out.e-s.0.2.0 + out.e-s.0.2.1 BIN_DIFF_PROG_ARGS -m BIN_DIFF_PROG_CONF exodiff.cfg LABELS amr) -add_regression_test(amr_t0ref_trans_iu ${INCITER_EXECUTABLE} +add_regression_test(amr_t0ref_iu_trans ${INCITER_EXECUTABLE} NUMPES 2 INPUTFILES ic_uniform.q unitsquare_01_141.exo ARGS -c ic_uniform.q -i unitsquare_01_141.exo -v BIN_BASELINE amr_ic_uniform.std.exo.0 amr_ic_uniform.std.exo.1 - # TODO: double check this numbering scheme BIN_RESULT out.e-s.0.2.0 out.e-s.0.2.1 BIN_DIFF_PROG_ARGS -m @@ -195,6 +265,174 @@ add_regression_test(amr_t0ref_u_trans_dg ${INCITER_EXECUTABLE} TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg LABELS amr) +add_regression_test(amr_t0ref_udu_trans_dg ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES gauss_hump_dg_uniform_deref.q + unitsquare_01_955_ss3.exo + ARGS -c gauss_hump_dg_uniform_deref.q + -i unitsquare_01_955_ss3.exo -v + BIN_BASELINE gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.3 + gauss_hump_dg.std.exo.0 + gauss_hump_dg.std.exo.1 + gauss_hump_dg.std.exo.2 + gauss_hump_dg.std.exo.3 + BIN_RESULT t0ref.e-s.0.4.0 + t0ref.e-s.0.4.1 + t0ref.e-s.0.4.2 + t0ref.e-s.0.4.3 + t0ref.e-s.1.4.0 + t0ref.e-s.1.4.1 + t0ref.e-s.1.4.2 + t0ref.e-s.1.4.3 + t0ref.e-s.2.4.0 + t0ref.e-s.2.4.1 + t0ref.e-s.2.4.2 + t0ref.e-s.2.4.3 + t0ref.e-s.3.4.0 + t0ref.e-s.3.4.1 + t0ref.e-s.3.4.2 + t0ref.e-s.3.4.3 + out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_CONF exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_gauss_hump_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg + LABELS amr) + +add_regression_test(amr_t0ref_ududu_trans_dg ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES gauss_hump_dg_uniform_deref_x2.q + unitsquare_01_955_ss3.exo + ARGS -c gauss_hump_dg_uniform_deref_x2.q + -i unitsquare_01_955_ss3.exo -v + BIN_BASELINE gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.3 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.0 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.1 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.2 + gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.3 + gauss_hump_dg.std.exo.0 + gauss_hump_dg.std.exo.1 + gauss_hump_dg.std.exo.2 + gauss_hump_dg.std.exo.3 + BIN_RESULT t0ref.e-s.0.4.0 + t0ref.e-s.0.4.1 + t0ref.e-s.0.4.2 + t0ref.e-s.0.4.3 + t0ref.e-s.1.4.0 + t0ref.e-s.1.4.1 + t0ref.e-s.1.4.2 + t0ref.e-s.1.4.3 + t0ref.e-s.2.4.0 + t0ref.e-s.2.4.1 + t0ref.e-s.2.4.2 + t0ref.e-s.2.4.3 + t0ref.e-s.3.4.0 + t0ref.e-s.3.4.1 + t0ref.e-s.3.4.2 + t0ref.e-s.3.4.3 + t0ref.e-s.4.4.0 + t0ref.e-s.4.4.1 + t0ref.e-s.4.4.2 + t0ref.e-s.4.4.3 + t0ref.e-s.5.4.0 + t0ref.e-s.5.4.1 + t0ref.e-s.5.4.2 + t0ref.e-s.5.4.3 + out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_CONF exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.t0ref.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + exodiff_gauss_hump_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_gauss_hump_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg + LABELS amr) + # Parallel, virtualization add_regression_test(amr_t0ref_u_trans_diagcg_u0.5 ${INCITER_EXECUTABLE} diff --git a/tests/regression/inciter/mesh_refinement/t0ref/exodiff_gauss_hump_dg.t0ref.cfg b/tests/regression/inciter/mesh_refinement/t0ref/exodiff_gauss_hump_dg.t0ref.cfg index 757a9b6a1de..7d8ec10155c 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/exodiff_gauss_hump_dg.t0ref.cfg +++ b/tests/regression/inciter/mesh_refinement/t0ref/exodiff_gauss_hump_dg.t0ref.cfg @@ -1,4 +1,4 @@ COORDINATES absolute 1.0e-6 -TIME STEPS absolute 1.0e-8 +TIME STEPS absolute 1.0 # huge tolerance for ignoring the time stamps so baselines can be reused between tests taking different number of refinement steps ELEMENT VARIABLES relative 1.0e-7 floor 1.0e-9 c1 diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.q b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.q index 1c7cf997c7c..ade79340f5a 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.q @@ -9,7 +9,6 @@ inciter nstep 10 # Max number of time steps dt 5.0e-4 # Time step size ttyi 1 # TTY output interval - ctau 1.0 # FCT mass diffusivity scheme dg diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.0 new file mode 100644 index 00000000000..ecf8f6621f9 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.1 new file mode 100644 index 00000000000..0569d2303d4 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.2 new file mode 100644 index 00000000000..f0a5e23e4c6 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.3 new file mode 100644 index 00000000000..07b80818975 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg.std.exo.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref.q b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref.q new file mode 100644 index 00000000000..82a9b439906 --- /dev/null +++ b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref.q @@ -0,0 +1,57 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Advection of 2D Gaussian hump" + +inciter + + nstep 10 # Max number of time steps + dt 5.0e-4 # Time step size + ttyi 1 # TTY output interval + + scheme dg + + partitioning + algorithm mj + end + + transport + physics advection + problem gauss_hump + ncomp 1 + depvar c + + bc_extrapolate + sideset 1 end + end + bc_inlet + sideset 2 end + end + bc_outlet + sideset 3 end + end + end + + amr + t0ref true + dtref false + dtfreq 5 + initial uniform + initial uniform_derefine + initial uniform + refvar c end + error jump + end + + diagnostics + interval 2 + format scientific + error l2 + end + + plotvar + interval 2 + end + +end diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.1.0 new file mode 100644 index 00000000000..48b64580c17 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.0 new file mode 100644 index 00000000000..9a2bc68d2da Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.1 new file mode 100644 index 00000000000..16785606415 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.2 new file mode 100644 index 00000000000..a08f6b63c30 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.3 new file mode 100644 index 00000000000..23f8ede03fe Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.0.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.1.0 new file mode 100644 index 00000000000..5bcd3438b66 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.0 new file mode 100644 index 00000000000..e945701b957 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.1 new file mode 100644 index 00000000000..af82cb6c16b Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.2 new file mode 100644 index 00000000000..e846b686909 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.3 new file mode 100644 index 00000000000..bd249c5fb15 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.1.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.1.0 new file mode 100644 index 00000000000..45c44246cb3 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.0 new file mode 100644 index 00000000000..81b086916db Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.1 new file mode 100644 index 00000000000..4ad7ceb4b02 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.2 new file mode 100644 index 00000000000..8980260709e Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.3 new file mode 100644 index 00000000000..e422e062de6 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.2.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.1.0 new file mode 100644 index 00000000000..a32d77a9892 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.0 new file mode 100644 index 00000000000..e2e8a33ddd1 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.1 new file mode 100644 index 00000000000..6b0445d1d9a Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.2 new file mode 100644 index 00000000000..a75e69f3b3d Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.3 new file mode 100644 index 00000000000..053a9a60f94 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.3.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.1.0 new file mode 100644 index 00000000000..cca4d97c319 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.0 new file mode 100644 index 00000000000..2172f6ba3da Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.1 new file mode 100644 index 00000000000..2c15b0a6dee Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.2 new file mode 100644 index 00000000000..014dfa18a15 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.3 new file mode 100644 index 00000000000..73d7f116d93 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.4.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.1.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.1.0 new file mode 100644 index 00000000000..a32d77a9892 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.1.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.0 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.0 new file mode 100644 index 00000000000..f175a092456 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.1 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.1 new file mode 100644 index 00000000000..6b0445d1d9a Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.2 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.2 new file mode 100644 index 00000000000..37cb5c517e4 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.2 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.3 b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.3 new file mode 100644 index 00000000000..053a9a60f94 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_t0ref.std.e-s.5.4.3 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_x2.q b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_x2.q new file mode 100644 index 00000000000..00cecd85e7c --- /dev/null +++ b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_dg_uniform_deref_x2.q @@ -0,0 +1,59 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Advection of 2D Gaussian hump" + +inciter + + nstep 10 # Max number of time steps + dt 5.0e-4 # Time step size + ttyi 1 # TTY output interval + + scheme dg + + partitioning + algorithm mj + end + + transport + physics advection + problem gauss_hump + ncomp 1 + depvar c + + bc_extrapolate + sideset 1 end + end + bc_inlet + sideset 2 end + end + bc_outlet + sideset 3 end + end + end + + amr + t0ref true + dtref false + dtfreq 5 + initial uniform + initial uniform_derefine + initial uniform + initial uniform_derefine + initial uniform + refvar c end + error jump + end + + diagnostics + interval 2 + format scientific + error l2 + end + + plotvar + interval 2 + end + +end diff --git a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_reord_dg.q b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_reord_dg.q index 0551366a7e4..47711312f81 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_reord_dg.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/gauss_hump_reord_dg.q @@ -9,7 +9,6 @@ inciter nstep 10 # Max number of time steps dt 5.0e-4 # Time step size ttyi 1 # TTY output interval - ctau 1.0 # FCT mass diffusivity scheme dg reorder true diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic.q b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic.q index 2b8224674ab..36ada575fac 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic.q @@ -43,6 +43,7 @@ inciter #initial coords refvar c end error jump + tol_refine 0.8 # coordref # #x- 0.5 diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.0 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.0 new file mode 100644 index 00000000000..30cfa2ca59a Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.1 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.1 new file mode 100644 index 00000000000..4bd1239e4a4 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.0.2.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.0 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.0 new file mode 100644 index 00000000000..5462cd7ef5e Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.1 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.1 new file mode 100644 index 00000000000..7ec962e72ea Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.1.2.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.0 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.0 new file mode 100644 index 00000000000..44d0c6e1de2 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.0 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.1 b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.1 new file mode 100644 index 00000000000..68786759480 Binary files /dev/null and b/tests/regression/inciter/mesh_refinement/t0ref/ic_ic_t0ref.e-s.2.2.1 differ diff --git a/tests/regression/inciter/mesh_refinement/t0ref/ic_uniform.q b/tests/regression/inciter/mesh_refinement/t0ref/ic_uniform.q index 901a0264c14..b7d93a738f3 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/ic_uniform.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/ic_uniform.q @@ -43,6 +43,7 @@ inciter #initial coords refvar c end error jump + tol_refine 0.8 # coordref # #x- 0.5 diff --git a/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_dg.q b/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_dg.q index 25958f48f2a..b4dd660a8da 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_dg.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_dg.q @@ -27,8 +27,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_reord_dg.q b/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_reord_dg.q index 2e8c1609301..695d2ebcc33 100644 --- a/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_reord_dg.q +++ b/tests/regression/inciter/mesh_refinement/t0ref/vortical_flow_reord_dg.q @@ -29,8 +29,7 @@ inciter p0 10.0 material - id 1 - gamma 1.66666666666667 # =5/3 ratio of specific heats + gamma 1.66666666666667 end # =5/3 ratio of specific heats end bc_dirichlet diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/CMakeLists.txt b/tests/regression/inciter/multimat/InterfaceAdvection/CMakeLists.txt new file mode 100644 index 00000000000..0a42668a778 --- /dev/null +++ b/tests/regression/inciter/multimat/InterfaceAdvection/CMakeLists.txt @@ -0,0 +1,36 @@ +# See cmake/add_regression_test.cmake for documentation on the arguments to +# add_regression_test(). + +# Serial + +add_regression_test(multimat_interface_advection_dg ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES interface_advection_dg.q unitsquare_01_3.6k.exo + ARGS -c interface_advection_dg.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE interface_advection_dg.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF interface_advection_diag.ndiff.cfg) + +# Parallel + +add_regression_test(multimat_interface_advection_dg ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES interface_advection_dg.q unitsquare_01_3.6k.exo + ARGS -c interface_advection_dg.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE interface_advection_dg_pe4_u0.0.std.exo.0 + interface_advection_dg_pe4_u0.0.std.exo.1 + interface_advection_dg_pe4_u0.0.std.exo.2 + interface_advection_dg_pe4_u0.0.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff_dg.cfg + TEXT_BASELINE diag_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF interface_advection_diag.ndiff.cfg) diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/diag_dg.std b/tests/regression/inciter/multimat/InterfaceAdvection/diag_dg.std new file mode 100644 index 00000000000..a2f4ce5de08 --- /dev/null +++ b/tests/regression/inciter/multimat/InterfaceAdvection/diag_dg.std @@ -0,0 +1,51 @@ +# 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) + 1 5.000000e-07 5.000000e-07 5.919128e-01 1.796800e-01 7.857047e-01 5.919365e+00 2.086875e-01 9.125490e-01 4.237655e+01 4.237655e+01 1.756287e-15 1.482742e+05 4.493043e+04 1.964718e+05 7.257141e-05 3.512628e-05 6.350397e-05 7.257431e-04 4.079707e-05 7.375606e-05 4.535777e-03 4.535777e-03 1.756287e-15 1.817914e+01 8.783610e+00 1.587968e+01 + 2 1.000000e-06 5.000000e-07 5.919034e-01 1.796735e-01 7.856991e-01 5.919271e+00 2.086800e-01 9.125425e-01 4.237603e+01 4.237603e+01 3.436311e-15 1.482718e+05 4.492880e+04 1.964704e+05 1.450266e-04 7.021334e-05 1.268968e-04 1.450324e-03 8.154860e-05 1.473831e-04 9.064292e-03 9.064292e-03 3.436311e-15 3.632917e+01 1.755741e+01 3.173158e+01 + 3 1.500000e-06 5.000000e-07 5.918939e-01 1.796670e-01 7.856934e-01 5.919176e+00 2.086724e-01 9.125359e-01 4.237552e+01 4.237552e+01 5.079173e-15 1.482694e+05 4.492717e+04 1.964690e+05 2.173662e-04 1.052613e-04 1.901792e-04 2.173749e-03 1.222547e-04 2.208817e-04 1.358558e-02 1.358558e-02 5.079173e-15 5.445023e+01 2.632144e+01 4.755584e+01 + 4 2.000000e-06 5.000000e-07 5.918845e-01 1.796605e-01 7.856878e-01 5.919082e+00 2.086649e-01 9.125294e-01 4.237500e+01 4.237500e+01 6.684622e-15 1.482671e+05 4.492555e+04 1.964676e+05 2.895907e-04 1.402702e-04 2.533516e-04 2.896022e-03 1.629155e-04 2.942527e-04 1.809967e-02 1.809967e-02 6.684622e-15 7.254247e+01 3.507570e+01 6.335260e+01 + 5 2.500000e-06 5.000000e-07 5.918750e-01 1.796540e-01 7.856822e-01 5.918987e+00 2.086573e-01 9.125228e-01 4.237449e+01 4.237449e+01 8.244793e-15 1.482647e+05 4.492392e+04 1.964662e+05 3.617006e-04 1.752402e-04 3.164146e-04 3.617151e-03 2.035311e-04 3.674966e-04 2.260661e-02 2.260661e-02 8.244793e-15 9.060601e+01 4.382024e+01 7.912202e+01 + 6 3.000000e-06 5.000000e-07 5.918656e-01 1.796475e-01 7.856765e-01 5.918893e+00 2.086498e-01 9.125163e-01 4.237397e+01 4.237397e+01 9.768180e-15 1.482623e+05 4.492230e+04 1.964648e+05 4.336966e-04 2.101714e-04 3.793688e-04 4.337139e-03 2.441015e-04 4.406142e-04 2.710642e-02 2.710642e-02 9.768180e-15 1.086410e+02 5.255506e+01 9.486423e+01 + 7 3.500000e-06 5.000000e-07 5.918562e-01 1.796410e-01 7.856709e-01 5.918799e+00 2.086423e-01 9.125098e-01 4.237346e+01 4.237346e+01 1.125633e-14 1.482600e+05 4.492068e+04 1.964634e+05 5.055791e-04 2.450639e-04 4.422148e-04 5.055993e-03 2.846270e-04 5.136060e-04 3.159914e-02 3.159914e-02 1.125633e-14 1.266476e+02 6.128020e+01 1.105794e+02 + 8 4.000000e-06 5.000000e-07 5.918468e-01 1.796345e-01 7.856653e-01 5.918705e+00 2.086348e-01 9.125033e-01 4.237295e+01 4.237295e+01 1.271539e-14 1.482576e+05 4.491907e+04 1.964620e+05 5.773487e-04 2.799177e-04 5.049531e-04 5.773718e-03 3.251077e-04 5.864728e-04 3.608480e-02 3.608480e-02 1.271539e-14 1.446259e+02 6.999568e+01 1.262676e+02 + 9 4.500000e-06 5.000000e-07 5.918374e-01 1.796281e-01 7.856597e-01 5.918611e+00 2.086273e-01 9.124968e-01 4.237243e+01 4.237243e+01 1.414593e-14 1.482553e+05 4.491745e+04 1.964606e+05 6.490060e-04 3.147330e-04 5.675842e-04 6.490319e-03 3.655436e-04 6.592151e-04 4.056345e-02 4.056345e-02 1.414593e-14 1.625760e+02 7.870153e+01 1.419290e+02 + 10 5.000000e-06 5.000000e-07 5.918280e-01 1.796216e-01 7.856541e-01 5.918517e+00 2.086198e-01 9.124903e-01 4.237192e+01 4.237192e+01 1.553783e-14 1.482529e+05 4.491584e+04 1.964592e+05 7.205514e-04 3.495099e-04 6.301088e-04 7.205802e-03 4.059348e-04 7.318337e-04 4.503510e-02 4.503510e-02 1.553783e-14 1.804981e+02 8.739776e+01 1.575638e+02 + 11 5.500000e-06 5.000000e-07 5.918186e-01 1.796152e-01 7.856485e-01 5.918423e+00 2.086123e-01 9.124838e-01 4.237141e+01 4.237141e+01 1.689965e-14 1.482506e+05 4.491422e+04 1.964578e+05 7.919855e-04 3.842484e-04 6.925275e-04 7.920172e-03 4.462815e-04 8.043292e-04 4.949980e-02 4.949980e-02 1.689965e-14 1.983924e+02 9.608441e+01 1.731721e+02 + 12 6.000000e-06 5.000000e-07 5.918092e-01 1.796087e-01 7.856429e-01 5.918329e+00 2.086048e-01 9.124773e-01 4.237090e+01 4.237090e+01 1.823799e-14 1.482482e+05 4.491261e+04 1.964564e+05 8.633089e-04 4.189487e-04 7.548406e-04 8.633435e-03 4.865838e-04 8.767022e-04 5.395757e-02 5.395757e-02 1.823799e-14 2.162589e+02 1.047615e+02 1.887540e+02 + 13 6.500000e-06 5.000000e-07 5.917999e-01 1.796023e-01 7.856374e-01 5.918236e+00 2.085973e-01 9.124708e-01 4.237039e+01 4.237039e+01 1.955008e-14 1.482459e+05 4.491100e+04 1.964550e+05 9.345221e-04 4.536108e-04 8.170488e-04 9.345595e-03 5.268418e-04 9.489533e-04 5.840846e-02 5.840846e-02 1.955008e-14 2.340978e+02 1.134290e+02 2.043097e+02 + 14 7.000000e-06 5.000000e-07 5.917905e-01 1.795959e-01 7.856318e-01 5.918142e+00 2.085899e-01 9.124643e-01 4.236988e+01 4.236988e+01 2.083254e-14 1.482435e+05 4.490940e+04 1.964536e+05 1.005626e-03 4.882348e-04 8.791527e-04 1.005666e-02 5.670556e-04 1.021083e-03 6.285249e-02 6.285249e-02 2.083254e-14 2.519092e+02 1.220871e+02 2.198392e+02 + 15 7.500000e-06 5.000000e-07 5.917812e-01 1.795894e-01 7.856262e-01 5.918049e+00 2.085824e-01 9.124578e-01 4.236937e+01 4.236937e+01 2.209507e-14 1.482412e+05 4.490779e+04 1.964522e+05 1.076620e-03 5.228209e-04 9.411527e-04 1.076663e-02 6.072252e-04 1.093093e-03 6.728969e-02 6.728969e-02 2.209507e-14 2.696933e+02 1.307356e+02 2.353428e+02 + 16 8.000000e-06 5.000000e-07 5.917718e-01 1.795830e-01 7.856206e-01 5.917955e+00 2.085749e-01 9.124514e-01 4.236886e+01 4.236886e+01 2.333151e-14 1.482389e+05 4.490618e+04 1.964508e+05 1.147505e-03 5.573692e-04 1.003050e-03 1.147551e-02 6.473509e-04 1.164982e-03 7.172010e-02 7.172010e-02 2.333151e-14 2.874501e+02 1.393747e+02 2.508206e+02 + 17 8.500000e-06 5.000000e-07 5.917625e-01 1.795766e-01 7.856151e-01 5.917862e+00 2.085675e-01 9.124449e-01 4.236835e+01 4.236835e+01 2.453881e-14 1.482365e+05 4.490458e+04 1.964494e+05 1.218283e-03 5.918796e-04 1.064844e-03 1.218332e-02 6.874328e-04 1.236752e-03 7.614376e-02 7.614376e-02 2.453881e-14 3.051799e+02 1.480043e+02 2.662727e+02 + 18 9.000000e-06 5.000000e-07 5.917532e-01 1.795702e-01 7.856095e-01 5.917769e+00 2.085601e-01 9.124385e-01 4.236784e+01 4.236784e+01 2.573473e-14 1.482342e+05 4.490298e+04 1.964480e+05 1.288953e-03 6.263524e-04 1.126535e-03 1.289004e-02 7.274709e-04 1.308403e-03 8.056068e-02 8.056068e-02 2.573473e-14 3.228827e+02 1.566245e+02 2.816992e+02 + 19 9.500000e-06 5.000000e-07 5.917439e-01 1.795638e-01 7.856040e-01 5.917676e+00 2.085526e-01 9.124320e-01 4.236733e+01 4.236733e+01 2.691483e-14 1.482319e+05 4.490138e+04 1.964466e+05 1.359515e-03 6.607876e-04 1.188125e-03 1.359570e-02 7.674653e-04 1.379937e-03 8.497092e-02 8.497092e-02 2.691483e-14 3.405586e+02 1.652353e+02 2.971003e+02 + 20 1.000000e-05 5.000000e-07 5.917346e-01 1.795574e-01 7.855984e-01 5.917583e+00 2.085452e-01 9.124256e-01 4.236682e+01 4.236682e+01 2.807071e-14 1.482295e+05 4.489978e+04 1.964452e+05 1.429972e-03 6.951853e-04 1.249614e-03 1.430029e-02 8.074161e-04 1.451352e-03 8.937448e-02 8.937448e-02 2.807071e-14 3.582079e+02 1.738367e+02 3.124761e+02 + 21 1.050000e-05 5.000000e-07 5.917253e-01 1.795510e-01 7.855929e-01 5.917490e+00 2.085378e-01 9.124192e-01 4.236632e+01 4.236632e+01 2.921358e-14 1.482272e+05 4.489819e+04 1.964438e+05 1.500322e-03 7.295456e-04 1.311003e-03 1.500382e-02 8.473236e-04 1.522651e-03 9.377142e-02 9.377142e-02 2.921358e-14 3.758306e+02 1.824288e+02 3.278268e+02 + 22 1.100000e-05 5.000000e-07 5.917160e-01 1.795447e-01 7.855874e-01 5.917397e+00 2.085304e-01 9.124127e-01 4.236581e+01 4.236581e+01 3.034538e-14 1.482249e+05 4.489659e+04 1.964425e+05 1.570566e-03 7.638686e-04 1.372291e-03 1.570629e-02 8.871877e-04 1.593834e-03 9.816176e-02 9.816176e-02 3.034538e-14 3.934268e+02 1.910115e+02 3.431524e+02 + 23 1.150000e-05 5.000000e-07 5.917067e-01 1.795383e-01 7.855818e-01 5.917304e+00 2.085230e-01 9.124063e-01 4.236531e+01 4.236531e+01 3.145496e-14 1.482225e+05 4.489500e+04 1.964411e+05 1.640705e-03 7.981544e-04 1.433479e-03 1.640771e-02 9.270086e-04 1.664900e-03 1.025455e-01 1.025455e-01 3.145496e-14 4.109967e+02 1.995849e+02 3.584531e+02 + 24 1.200000e-05 5.000000e-07 5.916975e-01 1.795319e-01 7.855763e-01 5.917211e+00 2.085156e-01 9.123999e-01 4.236480e+01 4.236480e+01 3.255687e-14 1.482202e+05 4.489341e+04 1.964397e+05 1.710740e-03 8.324030e-04 1.494569e-03 1.710808e-02 9.667864e-04 1.735852e-03 1.069228e-01 1.069228e-01 3.255687e-14 4.285404e+02 2.081491e+02 3.737290e+02 + 25 1.250000e-05 5.000000e-07 5.916882e-01 1.795256e-01 7.855708e-01 5.917119e+00 2.085082e-01 9.123935e-01 4.236429e+01 4.236429e+01 3.363841e-14 1.482179e+05 4.489182e+04 1.964383e+05 1.780670e-03 8.666147e-04 1.555560e-03 1.780742e-02 1.006521e-03 1.806690e-03 1.112935e-01 1.112935e-01 3.363841e-14 4.460580e+02 2.167040e+02 3.889803e+02 + 26 1.300000e-05 5.000000e-07 5.916790e-01 1.795192e-01 7.855653e-01 5.917026e+00 2.085008e-01 9.123871e-01 4.236379e+01 4.236379e+01 3.470853e-14 1.482156e+05 4.489023e+04 1.964369e+05 1.850497e-03 9.007894e-04 1.616453e-03 1.850571e-02 1.046213e-03 1.877413e-03 1.156577e-01 1.156577e-01 3.470853e-14 4.635496e+02 2.252497e+02 4.042070e+02 + 27 1.350000e-05 5.000000e-07 5.916697e-01 1.795129e-01 7.855598e-01 5.916934e+00 2.084934e-01 9.123807e-01 4.236329e+01 4.236329e+01 3.577303e-14 1.482133e+05 4.488864e+04 1.964356e+05 1.920221e-03 9.349272e-04 1.677248e-03 1.920298e-02 1.085862e-03 1.948023e-03 1.200155e-01 1.200155e-01 3.577303e-14 4.810154e+02 2.337861e+02 4.194093e+02 + 28 1.400000e-05 5.000000e-07 5.916605e-01 1.795065e-01 7.855542e-01 5.916841e+00 2.084861e-01 9.123743e-01 4.236278e+01 4.236278e+01 3.681807e-14 1.482110e+05 4.488705e+04 1.964342e+05 1.989842e-03 9.690283e-04 1.737946e-03 1.989922e-02 1.125468e-03 2.018520e-03 1.243669e-01 1.243669e-01 3.681807e-14 4.984555e+02 2.423134e+02 4.345874e+02 + 29 1.450000e-05 5.000000e-07 5.916513e-01 1.795002e-01 7.855487e-01 5.916749e+00 2.084787e-01 9.123679e-01 4.236228e+01 4.236228e+01 3.784976e-14 1.482087e+05 4.488547e+04 1.964328e+05 2.059361e-03 1.003093e-03 1.798548e-03 2.059444e-02 1.165032e-03 2.088905e-03 1.287119e-01 1.287119e-01 3.784976e-14 5.158700e+02 2.508314e+02 4.497413e+02 + 30 1.500000e-05 5.000000e-07 5.916420e-01 1.794939e-01 7.855433e-01 5.916657e+00 2.084714e-01 9.123615e-01 4.236178e+01 4.236178e+01 3.886507e-14 1.482063e+05 4.488389e+04 1.964314e+05 2.128778e-03 1.037121e-03 1.859053e-03 2.128864e-02 1.204554e-03 2.159179e-03 1.330505e-01 1.330505e-01 3.886507e-14 5.332591e+02 2.593404e+02 4.648713e+02 + 31 1.550000e-05 5.000000e-07 5.916328e-01 1.794875e-01 7.855378e-01 5.916565e+00 2.084640e-01 9.123551e-01 4.236127e+01 4.236127e+01 3.986565e-14 1.482040e+05 4.488231e+04 1.964301e+05 2.198095e-03 1.071112e-03 1.919463e-03 2.198182e-02 1.244032e-03 2.229342e-03 1.373829e-01 1.373829e-01 3.986565e-14 5.506227e+02 2.678402e+02 4.799773e+02 + 32 1.600000e-05 5.000000e-07 5.916236e-01 1.794812e-01 7.855323e-01 5.916473e+00 2.084567e-01 9.123488e-01 4.236077e+01 4.236077e+01 4.085394e-14 1.482017e+05 4.488073e+04 1.964287e+05 2.267310e-03 1.105067e-03 1.979778e-03 2.267401e-02 1.283469e-03 2.299394e-03 1.417089e-01 1.417089e-01 4.085394e-14 5.679612e+02 2.763309e+02 4.950595e+02 + 33 1.650000e-05 5.000000e-07 5.916144e-01 1.794749e-01 7.855268e-01 5.916381e+00 2.084494e-01 9.123424e-01 4.236027e+01 4.236027e+01 4.183864e-14 1.481994e+05 4.487915e+04 1.964273e+05 2.336425e-03 1.138986e-03 2.039998e-03 2.336518e-02 1.322864e-03 2.369336e-03 1.460286e-01 1.460286e-01 4.183864e-14 5.852745e+02 2.848125e+02 5.101181e+02 + 34 1.700000e-05 5.000000e-07 5.916053e-01 1.794686e-01 7.855213e-01 5.916289e+00 2.084420e-01 9.123360e-01 4.235977e+01 4.235977e+01 4.281515e-14 1.481971e+05 4.487757e+04 1.964259e+05 2.405440e-03 1.172868e-03 2.100125e-03 2.405537e-02 1.362216e-03 2.439169e-03 1.503421e-01 1.503421e-01 4.281515e-14 6.025628e+02 2.932851e+02 5.251531e+02 + 35 1.750000e-05 5.000000e-07 5.915961e-01 1.794623e-01 7.855158e-01 5.916197e+00 2.084347e-01 9.123297e-01 4.235927e+01 4.235927e+01 4.378735e-14 1.481948e+05 4.487600e+04 1.964246e+05 2.474356e-03 1.206714e-03 2.160157e-03 2.474455e-02 1.401527e-03 2.508893e-03 1.546495e-01 1.546495e-01 4.378735e-14 6.198263e+02 3.017487e+02 5.401648e+02 + 36 1.800000e-05 5.000000e-07 5.915869e-01 1.794560e-01 7.855104e-01 5.916106e+00 2.084274e-01 9.123233e-01 4.235877e+01 4.235877e+01 4.475370e-14 1.481925e+05 4.487442e+04 1.964232e+05 2.543173e-03 1.240525e-03 2.220097e-03 2.543275e-02 1.440795e-03 2.578510e-03 1.589506e-01 1.589506e-01 4.475370e-14 6.370650e+02 3.102032e+02 5.551531e+02 + 37 1.850000e-05 5.000000e-07 5.915778e-01 1.794497e-01 7.855049e-01 5.916014e+00 2.084201e-01 9.123170e-01 4.235827e+01 4.235827e+01 4.571151e-14 1.481902e+05 4.487285e+04 1.964218e+05 2.611892e-03 1.274299e-03 2.279944e-03 2.611997e-02 1.480022e-03 2.648018e-03 1.632456e-01 1.632456e-01 4.571151e-14 6.542790e+02 3.186488e+02 5.701183e+02 + 38 1.900000e-05 5.000000e-07 5.915686e-01 1.794434e-01 7.854995e-01 5.915923e+00 2.084128e-01 9.123106e-01 4.235777e+01 4.235777e+01 4.666242e-14 1.481879e+05 4.487128e+04 1.964205e+05 2.680513e-03 1.308038e-03 2.339698e-03 2.680620e-02 1.519207e-03 2.717419e-03 1.675344e-01 1.675344e-01 4.666242e-14 6.714686e+02 3.270854e+02 5.850604e+02 + 39 1.950000e-05 5.000000e-07 5.915595e-01 1.794372e-01 7.854940e-01 5.915831e+00 2.084055e-01 9.123043e-01 4.235727e+01 4.235727e+01 4.760475e-14 1.481857e+05 4.486971e+04 1.964191e+05 2.749036e-03 1.341740e-03 2.399361e-03 2.749146e-02 1.558351e-03 2.786714e-03 1.718172e-01 1.718172e-01 4.760475e-14 6.886336e+02 3.355130e+02 5.999796e+02 + 40 2.000000e-05 5.000000e-07 5.915503e-01 1.794309e-01 7.854886e-01 5.915740e+00 2.083983e-01 9.122980e-01 4.235677e+01 4.235677e+01 4.854613e-14 1.481834e+05 4.486815e+04 1.964178e+05 2.817463e-03 1.375407e-03 2.458933e-03 2.817575e-02 1.597453e-03 2.855903e-03 1.760939e-01 1.760939e-01 4.854613e-14 7.057744e+02 3.439317e+02 6.148760e+02 + 41 2.050000e-05 5.000000e-07 5.915412e-01 1.794246e-01 7.854831e-01 5.915649e+00 2.083910e-01 9.122917e-01 4.235627e+01 4.235627e+01 4.948398e-14 1.481811e+05 4.486658e+04 1.964164e+05 2.885792e-03 1.409039e-03 2.518414e-03 2.885908e-02 1.636514e-03 2.924987e-03 1.803646e-01 1.803646e-01 4.948398e-14 7.228910e+02 3.523415e+02 6.297497e+02 + 42 2.100000e-05 5.000000e-07 5.915321e-01 1.794184e-01 7.854777e-01 5.915557e+00 2.083837e-01 9.122853e-01 4.235578e+01 4.235578e+01 5.041884e-14 1.481788e+05 4.486502e+04 1.964150e+05 2.954026e-03 1.442635e-03 2.577804e-03 2.954144e-02 1.675534e-03 2.993965e-03 1.846292e-01 1.846292e-01 5.041884e-14 7.399836e+02 3.607425e+02 6.446007e+02 + 43 2.150000e-05 5.000000e-07 5.915230e-01 1.794121e-01 7.854722e-01 5.915466e+00 2.083765e-01 9.122790e-01 4.235528e+01 4.235528e+01 5.135318e-14 1.481765e+05 4.486345e+04 1.964137e+05 3.022164e-03 1.476195e-03 2.637105e-03 3.022285e-02 1.714513e-03 3.062840e-03 1.888879e-01 1.888879e-01 5.135318e-14 7.570521e+02 3.691346e+02 6.594294e+02 + 44 2.200000e-05 5.000000e-07 5.915139e-01 1.794059e-01 7.854668e-01 5.915375e+00 2.083692e-01 9.122727e-01 4.235478e+01 4.235478e+01 5.228345e-14 1.481742e+05 4.486189e+04 1.964123e+05 3.090207e-03 1.509721e-03 2.696316e-03 3.090330e-02 1.753450e-03 3.131610e-03 1.931406e-01 1.931406e-01 5.228345e-14 7.740968e+02 3.775178e+02 6.742356e+02 + 45 2.250000e-05 5.000000e-07 5.915048e-01 1.793997e-01 7.854614e-01 5.915284e+00 2.083620e-01 9.122664e-01 4.235429e+01 4.235429e+01 5.321192e-14 1.481720e+05 4.486033e+04 1.964110e+05 3.158155e-03 1.543211e-03 2.755439e-03 3.158281e-02 1.792347e-03 3.200277e-03 1.973875e-01 1.973875e-01 5.321192e-14 7.911178e+02 3.858922e+02 6.890197e+02 + 46 2.300000e-05 5.000000e-07 5.914957e-01 1.793934e-01 7.854560e-01 5.915193e+00 2.083547e-01 9.122601e-01 4.235379e+01 4.235379e+01 5.413517e-14 1.481697e+05 4.485877e+04 1.964096e+05 3.226008e-03 1.576665e-03 2.814473e-03 3.226137e-02 1.831202e-03 3.268841e-03 2.016284e-01 2.016284e-01 5.413517e-14 8.081151e+02 3.942579e+02 7.037816e+02 + 47 2.350000e-05 5.000000e-07 5.914866e-01 1.793872e-01 7.854506e-01 5.915103e+00 2.083475e-01 9.122538e-01 4.235330e+01 4.235330e+01 5.506122e-14 1.481674e+05 4.485722e+04 1.964083e+05 3.293768e-03 1.610085e-03 2.873418e-03 3.293900e-02 1.870017e-03 3.337304e-03 2.058634e-01 2.058634e-01 5.506122e-14 8.250889e+02 4.026148e+02 7.185215e+02 + 48 2.400000e-05 5.000000e-07 5.914775e-01 1.793810e-01 7.854452e-01 5.915012e+00 2.083403e-01 9.122476e-01 4.235280e+01 4.235280e+01 5.597345e-14 1.481651e+05 4.485566e+04 1.964069e+05 3.361434e-03 1.643470e-03 2.932277e-03 3.361569e-02 1.908792e-03 3.405664e-03 2.100926e-01 2.100926e-01 5.597345e-14 8.420393e+02 4.109629e+02 7.332395e+02 + 49 2.450000e-05 5.000000e-07 5.914685e-01 1.793748e-01 7.854397e-01 5.914921e+00 2.083331e-01 9.122413e-01 4.235231e+01 4.235231e+01 5.688087e-14 1.481629e+05 4.485411e+04 1.964055e+05 3.429007e-03 1.676820e-03 2.991048e-03 3.429145e-02 1.947526e-03 3.473923e-03 2.143160e-01 2.143160e-01 5.688087e-14 8.589664e+02 4.193023e+02 7.479357e+02 + 50 2.500000e-05 5.000000e-07 5.914594e-01 1.793686e-01 7.854343e-01 5.914831e+00 2.083258e-01 9.122350e-01 4.235181e+01 4.235181e+01 5.778645e-14 1.481606e+05 4.485256e+04 1.964042e+05 3.496488e-03 1.710135e-03 3.049732e-03 3.496628e-02 1.986219e-03 3.542082e-03 2.185336e-01 2.185336e-01 5.778645e-14 8.758703e+02 4.276330e+02 7.626102e+02 diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/exodiff_dg.cfg b/tests/regression/inciter/multimat/InterfaceAdvection/exodiff_dg.cfg new file mode 100644 index 00000000000..78b5b26b9f3 --- /dev/null +++ b/tests/regression/inciter/multimat/InterfaceAdvection/exodiff_dg.cfg @@ -0,0 +1,12 @@ +COORDINATES absolute 1.0e-6 +TIME STEPS absolute 1.0e-8 +ELEMENT VARIABLES absolute 1.0e-7 floor 1.0e-9 + volfrac1_numerical + volfrac2_numerical + volfrac3_numerical + density_numerical + x-velocity_numerical + y-velocity_numerical + z-velocity_numerical + pressure_numerical + total_energy_density_numerical diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.q b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.q new file mode 100644 index 00000000000..cfd5ff398d6 --- /dev/null +++ b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.q @@ -0,0 +1,48 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Material interface advection" + +inciter + + nstep 50 # Max number of time steps + dt 5e-7 + ttyi 1 # TTY output interval + scheme dg + + multimat + + physics veleq + problem interface_advection + depvar u + + nmat 3 + material + gamma 1.4 1.4 1.4 end + cv 83.33 717.5 717.5 end + end + + bc_sym + sideset 1 end + end + bc_dirichlet + sideset 2 end + end + bc_extrapolate + sideset 3 end + end + + end + + diagnostics + interval 1 + format scientific + error l2 + end + + plotvar + interval 25 + end + +end diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.std.exo b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.std.exo new file mode 100644 index 00000000000..1daafdf1037 Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg.std.exo differ diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.0 b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.0 new file mode 100644 index 00000000000..41bd296eb30 Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.0 differ diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.1 b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.1 new file mode 100644 index 00000000000..3caa2a6bc9b Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.1 differ diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.2 b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.2 new file mode 100644 index 00000000000..fe61a9129f1 Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.2 differ diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.3 b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.3 new file mode 100644 index 00000000000..8f5c24e7b59 Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_dg_pe4_u0.0.std.exo.3 differ diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_diag.ndiff.cfg b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_diag.ndiff.cfg new file mode 100644 index 00000000000..641f1091937 --- /dev/null +++ b/tests/regression/inciter/multimat/InterfaceAdvection/interface_advection_diag.ndiff.cfg @@ -0,0 +1,3 @@ +#rows cols constraints +* 1 # iteration count: no constraint: smallest representable float +* 2-$ any abs=1.0e-12 rel=1.0e-7 # tolerance for t, dt, and L2 of conserved variables diff --git a/tests/regression/inciter/multimat/InterfaceAdvection/unitsquare_01_3.6k.exo b/tests/regression/inciter/multimat/InterfaceAdvection/unitsquare_01_3.6k.exo new file mode 100644 index 00000000000..0565f7a8784 Binary files /dev/null and b/tests/regression/inciter/multimat/InterfaceAdvection/unitsquare_01_3.6k.exo differ diff --git a/tests/regression/inciter/multimat/SodShocktube/CMakeLists.txt b/tests/regression/inciter/multimat/SodShocktube/CMakeLists.txt new file mode 100644 index 00000000000..b5113f0233c --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/CMakeLists.txt @@ -0,0 +1,156 @@ +# See cmake/add_regression_test.cmake for documentation on the arguments to +# add_regression_test(). + +# Serial + +add_regression_test(multimat_sod_shocktube_dg ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES sod_shocktube_dg.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_dg.q -i rectangle_01_1.5k.exo -v + BIN_BASELINE sod_shocktube_dg.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) + +add_regression_test(multimat_sod_shocktube_p0p1 ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES sod_shocktube_p0p1.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_p0p1.q -i rectangle_01_1.5k.exo -v + BIN_BASELINE sod_shocktube_p0p1.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff_dg.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) + +# Parallel + +add_regression_test(multimat_sod_shocktube_dg ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES sod_shocktube_dg.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_dg.q -i rectangle_01_1.5k.exo -v + BIN_BASELINE sod_shocktube_dg_pe4_u0.0.std.exo.0 + sod_shocktube_dg_pe4_u0.0.std.exo.1 + sod_shocktube_dg_pe4_u0.0.std.exo.2 + sod_shocktube_dg_pe4_u0.0.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff_dg.cfg + TEXT_BASELINE diag_dg.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) + +add_regression_test(multimat_sod_shocktube_p0p1 ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES sod_shocktube_p0p1.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_p0p1.q -i rectangle_01_1.5k.exo -v + BIN_BASELINE sod_shocktube_p0p1_pe4_u0.0.std.exo.0 + sod_shocktube_p0p1_pe4_u0.0.std.exo.1 + sod_shocktube_p0p1_pe4_u0.0.std.exo.2 + sod_shocktube_p0p1_pe4_u0.0.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff_dg.cfg + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) + +# Parallel + Virtualization + +add_regression_test(multimat_sod_shocktube_p0p1_u0.9 ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES sod_shocktube_p0p1.q rectangle_01_1.5k.exo + ARGS -c sod_shocktube_p0p1.q -i rectangle_01_1.5k.exo -u 0.9 -v + BIN_BASELINE sod_shocktube_p0p1_pe4_u0.9.std.exo.0 + sod_shocktube_p0p1_pe4_u0.9.std.exo.1 + sod_shocktube_p0p1_pe4_u0.9.std.exo.2 + sod_shocktube_p0p1_pe4_u0.9.std.exo.3 + sod_shocktube_p0p1_pe4_u0.9.std.exo.4 + sod_shocktube_p0p1_pe4_u0.9.std.exo.5 + sod_shocktube_p0p1_pe4_u0.9.std.exo.6 + sod_shocktube_p0p1_pe4_u0.9.std.exo.7 + sod_shocktube_p0p1_pe4_u0.9.std.exo.8 + sod_shocktube_p0p1_pe4_u0.9.std.exo.9 + sod_shocktube_p0p1_pe4_u0.9.std.exo.10 + sod_shocktube_p0p1_pe4_u0.9.std.exo.11 + sod_shocktube_p0p1_pe4_u0.9.std.exo.12 + sod_shocktube_p0p1_pe4_u0.9.std.exo.13 + sod_shocktube_p0p1_pe4_u0.9.std.exo.14 + sod_shocktube_p0p1_pe4_u0.9.std.exo.15 + sod_shocktube_p0p1_pe4_u0.9.std.exo.16 + sod_shocktube_p0p1_pe4_u0.9.std.exo.17 + sod_shocktube_p0p1_pe4_u0.9.std.exo.18 + sod_shocktube_p0p1_pe4_u0.9.std.exo.19 + sod_shocktube_p0p1_pe4_u0.9.std.exo.20 + sod_shocktube_p0p1_pe4_u0.9.std.exo.21 + sod_shocktube_p0p1_pe4_u0.9.std.exo.22 + sod_shocktube_p0p1_pe4_u0.9.std.exo.23 + sod_shocktube_p0p1_pe4_u0.9.std.exo.24 + sod_shocktube_p0p1_pe4_u0.9.std.exo.25 + sod_shocktube_p0p1_pe4_u0.9.std.exo.26 + sod_shocktube_p0p1_pe4_u0.9.std.exo.27 + sod_shocktube_p0p1_pe4_u0.9.std.exo.28 + sod_shocktube_p0p1_pe4_u0.9.std.exo.29 + sod_shocktube_p0p1_pe4_u0.9.std.exo.30 + sod_shocktube_p0p1_pe4_u0.9.std.exo.31 + sod_shocktube_p0p1_pe4_u0.9.std.exo.32 + sod_shocktube_p0p1_pe4_u0.9.std.exo.33 + sod_shocktube_p0p1_pe4_u0.9.std.exo.34 + sod_shocktube_p0p1_pe4_u0.9.std.exo.35 + sod_shocktube_p0p1_pe4_u0.9.std.exo.36 + sod_shocktube_p0p1_pe4_u0.9.std.exo.37 + sod_shocktube_p0p1_pe4_u0.9.std.exo.38 + BIN_RESULT out.e-s.0.39.0 + out.e-s.0.39.1 + out.e-s.0.39.2 + out.e-s.0.39.3 + out.e-s.0.39.4 + out.e-s.0.39.5 + out.e-s.0.39.6 + out.e-s.0.39.7 + out.e-s.0.39.8 + out.e-s.0.39.9 + out.e-s.0.39.10 + out.e-s.0.39.11 + out.e-s.0.39.12 + out.e-s.0.39.13 + out.e-s.0.39.14 + out.e-s.0.39.15 + out.e-s.0.39.16 + out.e-s.0.39.17 + out.e-s.0.39.18 + out.e-s.0.39.19 + out.e-s.0.39.20 + out.e-s.0.39.21 + out.e-s.0.39.22 + out.e-s.0.39.23 + out.e-s.0.39.24 + out.e-s.0.39.25 + out.e-s.0.39.26 + out.e-s.0.39.27 + out.e-s.0.39.28 + out.e-s.0.39.29 + out.e-s.0.39.30 + out.e-s.0.39.31 + out.e-s.0.39.32 + out.e-s.0.39.33 + out.e-s.0.39.34 + out.e-s.0.39.35 + out.e-s.0.39.36 + out.e-s.0.39.37 + out.e-s.0.39.38 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff_dg.cfg + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF sod_shocktube_diag.ndiff.cfg) diff --git a/tests/regression/inciter/multimat/SodShocktube/diag_dg.std b/tests/regression/inciter/multimat/SodShocktube/diag_dg.std new file mode 100644 index 00000000000..4260090a8a0 --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/diag_dg.std @@ -0,0 +1,101 @@ +# 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) + 1 2.000000e-04 2.000000e-04 7.071068e-01 7.070970e-01 7.070970e-01 8.838835e-02 1.258876e-03 7.601638e-04 7.601645e-04 1.767733e+00 1.767941e-01 6.885576e-05 6.885576e-05 9.442626e-05 6.591576e-06 1.258876e-03 7.601638e-04 7.601645e-04 2.554375e-04 1.106523e-04 + 2 4.000000e-04 2.000000e-04 7.071069e-01 7.070681e-01 7.070682e-01 8.838835e-02 2.501175e-03 1.503933e-03 1.503938e-03 1.767632e+00 1.768452e-01 2.720208e-04 2.720208e-04 3.728292e-04 2.615304e-05 2.501175e-03 1.503933e-03 1.503938e-03 1.009994e-03 4.322658e-04 + 3 6.000000e-04 2.000000e-04 7.071071e-01 7.070214e-01 7.070217e-01 8.838836e-02 3.724840e-03 2.228903e-03 2.228917e-03 1.767469e+00 1.769275e-01 6.016195e-04 6.016195e-04 8.238720e-04 5.814409e-05 3.724840e-03 2.228903e-03 2.228917e-03 2.236640e-03 9.400417e-04 + 4 8.000000e-04 2.000000e-04 7.071076e-01 7.069584e-01 7.069594e-01 8.838840e-02 4.928137e-03 2.932915e-03 2.932944e-03 1.767251e+00 1.770372e-01 1.046513e-03 1.046513e-03 1.431476e-03 1.017852e-04 4.928137e-03 2.932915e-03 2.932944e-03 3.896754e-03 1.599659e-03 + 5 1.000000e-03 2.000000e-04 7.071086e-01 7.068811e-01 7.068835e-01 8.838848e-02 6.109693e-03 3.614117e-03 3.614165e-03 1.766986e+00 1.771700e-01 1.593584e-03 1.593584e-03 2.176681e-03 1.561625e-04 6.109693e-03 3.614117e-03 3.614165e-03 5.943978e-03 2.372882e-03 + 6 1.200000e-03 2.000000e-04 7.071103e-01 7.067915e-01 7.067962e-01 8.838862e-02 7.268505e-03 4.270979e-03 4.271050e-03 1.766681e+00 1.773214e-01 2.229049e-03 2.229049e-03 3.039528e-03 2.203209e-04 7.268505e-03 4.270979e-03 4.271050e-03 8.328446e-03 3.222417e-03 + 7 1.400000e-03 2.000000e-04 7.071129e-01 7.066916e-01 7.066998e-01 8.838883e-02 8.403914e-03 4.902285e-03 4.902386e-03 1.766345e+00 1.774868e-01 2.939510e-03 2.939510e-03 4.000583e-03 2.933319e-04 8.403914e-03 4.902285e-03 4.902386e-03 1.100040e-02 4.115148e-03 + 8 1.600000e-03 2.000000e-04 7.071165e-01 7.065831e-01 7.065962e-01 8.838914e-02 9.515569e-03 5.507113e-03 5.507248e-03 1.765985e+00 1.776621e-01 3.712631e-03 3.712631e-03 5.041917e-03 3.743349e-04 9.515569e-03 5.507113e-03 5.507248e-03 1.391272e-02 5.023707e-03 + 9 1.800000e-03 2.000000e-04 7.071214e-01 7.064677e-01 7.064873e-01 8.838956e-02 1.060338e-02 6.084796e-03 6.084969e-03 1.765606e+00 1.778438e-01 4.537480e-03 4.537480e-03 6.147594e-03 4.625559e-04 1.060338e-02 6.084796e-03 6.084969e-03 1.702236e-02 5.926753e-03 + 10 2.000000e-03 2.000000e-04 7.071275e-01 7.063467e-01 7.063744e-01 8.839010e-02 1.166746e-02 6.634885e-03 6.635101e-03 1.765215e+00 1.780288e-01 5.404608e-03 5.404608e-03 7.303793e-03 5.573103e-04 1.166746e-02 6.634885e-03 6.635101e-03 2.029092e-02 6.808495e-03 + 11 2.200000e-03 2.000000e-04 7.071349e-01 7.062211e-01 7.062589e-01 8.839079e-02 1.270813e-02 7.157115e-03 7.157378e-03 1.764817e+00 1.782146e-01 6.305977e-03 6.305977e-03 8.498714e-03 6.579946e-04 1.270813e-02 7.157115e-03 7.157378e-03 2.368466e-02 7.657869e-03 + 12 2.400000e-03 2.000000e-04 7.071438e-01 7.060920e-01 7.061418e-01 8.839165e-02 1.372582e-02 7.651374e-03 7.651688e-03 1.764414e+00 1.783994e-01 7.234815e-03 7.234815e-03 9.722369e-03 7.640748e-04 1.372582e-02 7.651374e-03 7.651688e-03 2.717420e-02 8.467634e-03 + 13 2.600000e-03 2.000000e-04 7.071542e-01 7.059600e-01 7.060238e-01 8.839268e-02 1.472110e-02 8.117678e-03 8.118046e-03 1.764009e+00 1.785817e-01 8.185445e-03 8.185445e-03 1.096634e-02 8.750714e-04 1.472110e-02 8.117678e-03 8.118046e-03 3.073406e-02 9.233545e-03 + 14 2.800000e-03 2.000000e-04 7.071660e-01 7.058258e-01 7.059057e-01 8.839390e-02 1.569459e-02 8.556150e-03 8.556576e-03 1.763606e+00 1.787604e-01 9.153116e-03 9.153116e-03 1.222355e-02 9.905465e-04 1.569459e-02 8.556150e-03 8.556576e-03 3.434227e-02 9.953647e-03 + 15 3.000000e-03 2.000000e-04 7.071794e-01 7.056899e-01 7.057879e-01 8.839532e-02 1.664702e-02 8.967005e-03 8.967490e-03 1.763205e+00 1.789349e-01 1.013385e-02 1.013385e-02 1.348805e-02 1.110091e-03 1.664702e-02 8.967005e-03 8.967490e-03 3.797986e-02 1.062771e-02 + 16 3.200000e-03 2.000000e-04 7.071943e-01 7.055526e-01 7.056709e-01 8.839695e-02 1.757916e-02 9.350536e-03 9.351084e-03 1.762809e+00 1.791045e-01 1.112433e-02 1.112433e-02 1.475482e-02 1.233315e-03 1.757916e-02 9.350536e-03 9.351084e-03 4.163051e-02 1.125676e-02 + 17 3.400000e-03 2.000000e-04 7.072107e-01 7.054142e-01 7.055549e-01 8.839881e-02 1.849179e-02 9.707105e-03 9.707718e-03 1.762418e+00 1.792692e-01 1.212175e-02 1.212175e-02 1.601966e-02 1.359840e-03 1.849179e-02 9.707105e-03 9.707718e-03 4.528017e-02 1.184277e-02 + 18 3.600000e-03 2.000000e-04 7.072286e-01 7.052751e-01 7.054402e-01 8.840089e-02 1.938575e-02 1.003714e-02 1.003782e-02 1.762033e+00 1.794289e-01 1.312377e-02 1.312377e-02 1.727901e-02 1.489294e-03 1.938575e-02 1.003714e-02 1.003782e-02 4.891681e-02 1.238836e-02 + 19 3.800000e-03 2.000000e-04 7.072479e-01 7.051354e-01 7.053269e-01 8.840321e-02 2.026188e-02 1.034111e-02 1.034186e-02 1.761655e+00 1.795835e-01 1.412842e-02 1.412842e-02 1.852990e-02 1.621307e-03 2.026188e-02 1.034111e-02 1.034186e-02 5.253016e-02 1.289656e-02 + 20 4.000000e-03 2.000000e-04 7.072687e-01 7.049952e-01 7.052153e-01 8.840578e-02 2.112102e-02 1.061955e-02 1.062037e-02 1.761285e+00 1.797333e-01 1.513405e-02 1.513405e-02 1.976985e-02 1.755511e-03 2.112102e-02 1.061955e-02 1.062037e-02 5.611146e-02 1.337069e-02 + 21 4.200000e-03 2.000000e-04 7.072910e-01 7.048548e-01 7.051053e-01 8.840858e-02 2.196402e-02 1.087302e-02 1.087392e-02 1.760921e+00 1.798786e-01 1.613926e-02 1.613926e-02 2.099678e-02 1.891538e-03 2.196402e-02 1.087302e-02 1.087392e-02 5.965336e-02 1.381418e-02 + 22 4.400000e-03 2.000000e-04 7.073146e-01 7.047141e-01 7.049970e-01 8.841163e-02 2.279169e-02 1.110215e-02 1.110313e-02 1.760565e+00 1.800196e-01 1.714288e-02 1.714288e-02 2.220898e-02 2.029024e-03 2.279169e-02 1.110215e-02 1.110313e-02 6.314967e-02 1.423050e-02 + 23 4.600000e-03 2.000000e-04 7.073395e-01 7.045733e-01 7.048905e-01 8.841492e-02 2.360485e-02 1.130757e-02 1.130863e-02 1.760217e+00 1.801567e-01 1.814394e-02 1.814394e-02 2.340506e-02 2.167609e-03 2.360485e-02 1.130757e-02 1.130863e-02 6.659530e-02 1.462302e-02 + 24 4.800000e-03 2.000000e-04 7.073658e-01 7.044325e-01 7.047857e-01 8.841845e-02 2.440428e-02 1.148996e-02 1.149111e-02 1.759876e+00 1.802902e-01 1.914162e-02 1.914162e-02 2.458390e-02 2.306943e-03 2.440428e-02 1.148996e-02 1.149111e-02 6.998611e-02 1.499494e-02 + 25 5.000000e-03 2.000000e-04 7.073934e-01 7.042916e-01 7.046827e-01 8.842220e-02 2.519073e-02 1.165002e-02 1.165127e-02 1.759542e+00 1.804204e-01 2.013522e-02 2.013522e-02 2.574461e-02 2.446685e-03 2.519073e-02 1.165002e-02 1.165127e-02 7.331878e-02 1.534927e-02 + 26 5.200000e-03 2.000000e-04 7.074223e-01 7.041507e-01 7.045814e-01 8.842618e-02 2.596493e-02 1.178848e-02 1.178982e-02 1.759215e+00 1.805476e-01 2.112419e-02 2.112419e-02 2.688653e-02 2.586510e-03 2.596493e-02 1.178848e-02 1.178982e-02 7.659074e-02 1.568875e-02 + 27 5.400000e-03 2.000000e-04 7.074523e-01 7.040098e-01 7.044817e-01 8.843038e-02 2.672754e-02 1.190606e-02 1.190750e-02 1.758894e+00 1.806722e-01 2.210806e-02 2.210806e-02 2.800915e-02 2.726112e-03 2.672754e-02 1.190606e-02 1.190750e-02 7.980010e-02 1.601579e-02 + 28 5.600000e-03 2.000000e-04 7.074836e-01 7.038690e-01 7.043837e-01 8.843477e-02 2.747920e-02 1.200354e-02 1.200507e-02 1.758581e+00 1.807944e-01 2.308645e-02 2.308645e-02 2.911214e-02 2.865206e-03 2.747920e-02 1.200354e-02 1.200507e-02 8.294551e-02 1.633254e-02 + 29 5.800000e-03 2.000000e-04 7.075160e-01 7.037283e-01 7.042873e-01 8.843936e-02 2.822052e-02 1.208165e-02 1.208329e-02 1.758273e+00 1.809144e-01 2.405905e-02 2.405905e-02 3.019529e-02 3.003532e-03 2.822052e-02 1.208165e-02 1.208329e-02 8.602613e-02 1.664077e-02 + 30 6.000000e-03 2.000000e-04 7.075495e-01 7.035877e-01 7.041923e-01 8.844413e-02 2.895202e-02 1.214117e-02 1.214291e-02 1.757972e+00 1.810326e-01 2.502561e-02 2.502561e-02 3.125852e-02 3.140858e-03 2.895202e-02 1.214117e-02 1.214291e-02 8.904156e-02 1.694197e-02 + 31 6.200000e-03 2.000000e-04 7.075841e-01 7.034472e-01 7.040989e-01 8.844907e-02 2.967422e-02 1.218285e-02 1.218470e-02 1.757676e+00 1.811490e-01 2.598594e-02 2.598594e-02 3.230182e-02 3.276980e-03 2.967422e-02 1.218285e-02 1.218470e-02 9.199173e-02 1.723732e-02 + 32 6.400000e-03 2.000000e-04 7.076198e-01 7.033068e-01 7.040069e-01 8.845417e-02 3.038758e-02 1.220746e-02 1.220943e-02 1.757386e+00 1.812638e-01 2.693988e-02 2.693988e-02 3.332528e-02 3.411726e-03 3.038758e-02 1.220746e-02 1.220943e-02 9.487693e-02 1.752773e-02 + 33 6.600000e-03 2.000000e-04 7.076565e-01 7.031665e-01 7.039163e-01 8.845940e-02 3.109250e-02 1.221576e-02 1.221784e-02 1.757101e+00 1.813772e-01 2.788733e-02 2.788733e-02 3.432906e-02 3.544953e-03 3.109250e-02 1.221576e-02 1.221784e-02 9.769767e-02 1.781386e-02 + 34 6.800000e-03 2.000000e-04 7.076942e-01 7.030263e-01 7.038270e-01 8.846478e-02 3.178937e-02 1.220850e-02 1.221069e-02 1.756821e+00 1.814893e-01 2.882821e-02 2.882821e-02 3.531336e-02 3.676549e-03 3.178937e-02 1.220850e-02 1.221069e-02 1.004547e-01 1.809616e-02 + 35 7.000000e-03 2.000000e-04 7.077329e-01 7.028863e-01 7.037389e-01 8.847027e-02 3.247850e-02 1.218642e-02 1.218872e-02 1.756546e+00 1.816001e-01 2.976246e-02 2.976246e-02 3.627845e-02 3.806432e-03 3.247850e-02 1.218642e-02 1.218872e-02 1.031489e-01 1.837491e-02 + 36 7.200000e-03 2.000000e-04 7.077725e-01 7.027464e-01 7.036520e-01 8.847587e-02 3.316021e-02 1.215025e-02 1.215266e-02 1.756274e+00 1.817097e-01 3.069005e-02 3.069005e-02 3.722460e-02 3.934549e-03 3.316021e-02 1.215025e-02 1.215266e-02 1.057813e-01 1.865026e-02 + 37 7.400000e-03 2.000000e-04 7.078130e-01 7.026067e-01 7.035663e-01 8.848158e-02 3.383474e-02 1.210072e-02 1.210324e-02 1.756007e+00 1.818182e-01 3.161099e-02 3.161099e-02 3.815213e-02 4.060876e-03 3.383474e-02 1.210072e-02 1.210324e-02 1.083531e-01 1.892225e-02 + 38 7.600000e-03 2.000000e-04 7.078544e-01 7.024670e-01 7.034817e-01 8.848738e-02 3.450233e-02 1.203853e-02 1.204117e-02 1.755744e+00 1.819256e-01 3.252528e-02 3.252528e-02 3.906137e-02 4.185413e-03 3.450233e-02 1.203853e-02 1.204117e-02 1.108655e-01 1.919085e-02 + 39 7.800000e-03 2.000000e-04 7.078967e-01 7.023275e-01 7.033982e-01 8.849328e-02 3.516319e-02 1.196439e-02 1.196715e-02 1.755485e+00 1.820320e-01 3.343294e-02 3.343294e-02 3.995266e-02 4.308181e-03 3.516319e-02 1.196439e-02 1.196715e-02 1.133198e-01 1.945601e-02 + 40 8.000000e-03 2.000000e-04 7.079399e-01 7.021882e-01 7.033156e-01 8.849925e-02 3.581747e-02 1.187898e-02 1.188185e-02 1.755229e+00 1.821373e-01 3.433402e-02 3.433402e-02 4.082637e-02 4.429224e-03 3.581747e-02 1.187898e-02 1.188185e-02 1.157173e-01 1.971764e-02 + 41 8.200000e-03 2.000000e-04 7.079838e-01 7.020489e-01 7.032340e-01 8.850531e-02 3.646535e-02 1.178299e-02 1.178597e-02 1.754977e+00 1.822416e-01 3.522856e-02 3.522856e-02 4.168286e-02 4.548605e-03 3.646535e-02 1.178299e-02 1.178597e-02 1.180593e-01 1.997564e-02 + 42 8.400000e-03 2.000000e-04 7.080286e-01 7.019098e-01 7.031533e-01 8.851144e-02 3.710696e-02 1.167706e-02 1.168015e-02 1.754727e+00 1.823449e-01 3.611661e-02 3.611661e-02 4.252248e-02 4.666401e-03 3.710696e-02 1.167706e-02 1.168015e-02 1.203472e-01 2.022996e-02 + 43 8.600000e-03 2.000000e-04 7.080741e-01 7.017708e-01 7.030735e-01 8.851765e-02 3.774240e-02 1.156185e-02 1.156505e-02 1.754481e+00 1.824473e-01 3.699826e-02 3.699826e-02 4.334561e-02 4.782702e-03 3.774240e-02 1.156185e-02 1.156505e-02 1.225824e-01 2.048055e-02 + 44 8.800000e-03 2.000000e-04 7.081204e-01 7.016319e-01 7.029945e-01 8.852393e-02 3.837179e-02 1.143799e-02 1.144130e-02 1.754237e+00 1.825487e-01 3.787356e-02 3.787356e-02 4.415259e-02 4.897611e-03 3.837179e-02 1.143799e-02 1.144130e-02 1.247661e-01 2.072739e-02 + 45 9.000000e-03 2.000000e-04 7.081674e-01 7.014931e-01 7.029163e-01 8.853029e-02 3.899522e-02 1.130612e-02 1.130953e-02 1.753995e+00 1.826492e-01 3.874260e-02 3.874260e-02 4.494379e-02 5.011236e-03 3.899522e-02 1.130612e-02 1.130953e-02 1.268996e-01 2.097050e-02 + 46 9.200000e-03 2.000000e-04 7.082151e-01 7.013544e-01 7.028388e-01 8.853673e-02 3.961277e-02 1.116683e-02 1.117035e-02 1.753756e+00 1.827488e-01 3.960548e-02 3.960548e-02 4.571956e-02 5.123697e-03 3.961277e-02 1.116683e-02 1.117035e-02 1.289844e-01 2.120996e-02 + 47 9.400000e-03 2.000000e-04 7.082635e-01 7.012158e-01 7.027620e-01 8.854324e-02 4.022452e-02 1.102073e-02 1.102434e-02 1.753520e+00 1.828476e-01 4.046226e-02 4.046226e-02 4.648024e-02 5.235115e-03 4.022452e-02 1.102073e-02 1.102434e-02 1.310215e-01 2.144584e-02 + 48 9.600000e-03 2.000000e-04 7.083126e-01 7.010772e-01 7.026858e-01 8.854985e-02 4.083053e-02 1.086839e-02 1.087210e-02 1.753285e+00 1.829456e-01 4.131306e-02 4.131306e-02 4.722617e-02 5.345617e-03 4.083053e-02 1.086839e-02 1.087210e-02 1.330123e-01 2.167829e-02 + 49 9.800000e-03 2.000000e-04 7.083624e-01 7.009388e-01 7.026103e-01 8.855654e-02 4.143088e-02 1.071039e-02 1.071419e-02 1.753052e+00 1.830428e-01 4.215797e-02 4.215797e-02 4.795768e-02 5.455332e-03 4.143088e-02 1.071039e-02 1.071419e-02 1.349581e-01 2.190745e-02 + 50 1.000000e-02 2.000000e-04 7.084129e-01 7.008004e-01 7.025354e-01 8.856332e-02 4.202563e-02 1.054728e-02 1.055116e-02 1.752821e+00 1.831392e-01 4.299710e-02 4.299710e-02 4.867511e-02 5.564391e-03 4.202563e-02 1.054728e-02 1.055116e-02 1.368598e-01 2.213354e-02 + 51 1.020000e-02 2.000000e-04 7.084639e-01 7.006620e-01 7.024610e-01 8.857021e-02 4.261485e-02 1.037959e-02 1.038355e-02 1.752592e+00 1.832350e-01 4.383053e-02 4.383053e-02 4.937876e-02 5.672924e-03 4.261485e-02 1.037959e-02 1.038355e-02 1.387189e-01 2.235678e-02 + 52 1.040000e-02 2.000000e-04 7.085156e-01 7.005238e-01 7.023872e-01 8.857720e-02 4.319859e-02 1.020784e-02 1.021188e-02 1.752364e+00 1.833302e-01 4.465838e-02 4.465838e-02 5.006895e-02 5.781060e-03 4.319859e-02 1.020784e-02 1.021188e-02 1.405362e-01 2.257745e-02 + 53 1.060000e-02 2.000000e-04 7.085679e-01 7.003855e-01 7.023138e-01 8.858431e-02 4.377693e-02 1.003255e-02 1.003666e-02 1.752138e+00 1.834248e-01 4.548076e-02 4.548076e-02 5.074599e-02 5.888930e-03 4.377693e-02 1.003255e-02 1.003666e-02 1.423130e-01 2.279583e-02 + 54 1.080000e-02 2.000000e-04 7.086208e-01 7.002473e-01 7.022409e-01 8.859153e-02 4.434992e-02 9.854208e-03 9.858383e-03 1.751913e+00 1.835189e-01 4.629777e-02 4.629777e-02 5.141017e-02 5.996659e-03 4.434992e-02 9.854208e-03 9.858383e-03 1.440503e-01 2.301227e-02 + 55 1.100000e-02 2.000000e-04 7.086743e-01 7.001091e-01 7.021685e-01 8.859889e-02 4.491765e-02 9.673282e-03 9.677518e-03 1.751689e+00 1.836125e-01 4.710952e-02 4.710952e-02 5.206179e-02 6.104372e-03 4.491765e-02 9.673282e-03 9.677518e-03 1.457492e-01 2.322711e-02 + 56 1.120000e-02 2.000000e-04 7.087284e-01 6.999709e-01 7.020964e-01 8.860638e-02 4.548017e-02 9.490233e-03 9.494524e-03 1.751466e+00 1.837058e-01 4.791612e-02 4.791612e-02 5.270113e-02 6.212186e-03 4.548017e-02 9.490233e-03 9.494524e-03 1.474106e-01 2.344075e-02 + 57 1.140000e-02 2.000000e-04 7.087831e-01 6.998328e-01 7.020247e-01 8.861402e-02 4.603757e-02 9.305501e-03 9.309842e-03 1.751245e+00 1.837988e-01 4.871768e-02 4.871768e-02 5.332847e-02 6.320216e-03 4.603757e-02 9.305501e-03 9.309842e-03 1.490356e-01 2.365361e-02 + 58 1.160000e-02 2.000000e-04 7.088383e-01 6.996946e-01 7.019534e-01 8.862182e-02 4.658992e-02 9.119509e-03 9.123895e-03 1.751024e+00 1.838916e-01 4.951430e-02 4.951430e-02 5.394409e-02 6.428570e-03 4.658992e-02 9.119509e-03 9.123895e-03 1.506251e-01 2.386612e-02 + 59 1.180000e-02 2.000000e-04 7.088940e-01 6.995564e-01 7.018824e-01 8.862977e-02 4.713732e-02 8.932664e-03 8.937088e-03 1.750804e+00 1.839842e-01 5.030609e-02 5.030609e-02 5.454826e-02 6.537350e-03 4.713732e-02 8.932664e-03 8.937088e-03 1.521801e-01 2.407875e-02 + 60 1.200000e-02 2.000000e-04 7.089503e-01 6.994183e-01 7.018117e-01 8.863790e-02 4.767983e-02 8.745354e-03 8.749810e-03 1.750585e+00 1.840768e-01 5.109315e-02 5.109315e-02 5.514124e-02 6.646648e-03 4.767983e-02 8.745354e-03 8.749810e-03 1.537015e-01 2.429200e-02 + 61 1.220000e-02 2.000000e-04 7.090071e-01 6.992801e-01 7.017413e-01 8.864621e-02 4.821756e-02 8.557950e-03 8.562433e-03 1.750366e+00 1.841695e-01 5.187561e-02 5.187561e-02 5.572330e-02 6.756549e-03 4.821756e-02 8.557950e-03 8.562433e-03 1.551901e-01 2.450635e-02 + 62 1.240000e-02 2.000000e-04 7.090645e-01 6.991418e-01 7.016711e-01 8.865471e-02 4.875059e-02 8.370806e-03 8.375311e-03 1.750148e+00 1.842623e-01 5.265354e-02 5.265354e-02 5.629468e-02 6.867124e-03 4.875059e-02 8.370806e-03 8.375311e-03 1.566469e-01 2.472232e-02 + 63 1.260000e-02 2.000000e-04 7.091223e-01 6.990036e-01 7.016011e-01 8.866340e-02 4.927902e-02 8.184260e-03 8.188780e-03 1.749930e+00 1.843553e-01 5.342707e-02 5.342707e-02 5.685565e-02 6.978439e-03 4.927902e-02 8.184260e-03 8.188780e-03 1.580728e-01 2.494042e-02 + 64 1.280000e-02 2.000000e-04 7.091807e-01 6.988653e-01 7.015314e-01 8.867229e-02 4.980294e-02 7.998632e-03 8.003162e-03 1.749713e+00 1.844487e-01 5.419628e-02 5.419628e-02 5.740644e-02 7.090543e-03 4.980294e-02 7.998632e-03 8.003162e-03 1.594686e-01 2.516114e-02 + 65 1.300000e-02 2.000000e-04 7.092396e-01 6.987270e-01 7.014619e-01 8.868139e-02 5.032246e-02 7.814227e-03 7.818761e-03 1.749497e+00 1.845425e-01 5.496129e-02 5.496129e-02 5.794731e-02 7.203477e-03 5.032246e-02 7.814227e-03 7.818761e-03 1.608351e-01 2.538498e-02 + 66 1.320000e-02 2.000000e-04 7.092989e-01 6.985886e-01 7.013926e-01 8.869071e-02 5.083767e-02 7.631332e-03 7.635865e-03 1.749281e+00 1.846369e-01 5.572218e-02 5.572218e-02 5.847849e-02 7.317268e-03 5.083767e-02 7.631332e-03 7.635865e-03 1.621732e-01 2.561241e-02 + 67 1.340000e-02 2.000000e-04 7.093588e-01 6.984501e-01 7.013234e-01 8.870024e-02 5.134867e-02 7.450221e-03 7.454747e-03 1.749065e+00 1.847319e-01 5.647905e-02 5.647905e-02 5.900022e-02 7.431931e-03 5.134867e-02 7.450221e-03 7.454747e-03 1.634836e-01 2.584387e-02 + 68 1.360000e-02 2.000000e-04 7.094191e-01 6.983116e-01 7.012544e-01 8.871000e-02 5.185557e-02 7.271152e-03 7.275666e-03 1.748849e+00 1.848275e-01 5.723199e-02 5.723199e-02 5.951274e-02 7.547468e-03 5.185557e-02 7.271152e-03 7.275666e-03 1.647672e-01 2.607977e-02 + 69 1.380000e-02 2.000000e-04 7.094800e-01 6.981731e-01 7.011855e-01 8.871998e-02 5.235847e-02 7.094368e-03 7.098864e-03 1.748633e+00 1.849240e-01 5.798111e-02 5.798111e-02 6.001628e-02 7.663872e-03 5.235847e-02 7.094368e-03 7.098864e-03 1.660248e-01 2.632047e-02 + 70 1.400000e-02 2.000000e-04 7.095413e-01 6.980345e-01 7.011167e-01 8.873018e-02 5.285745e-02 6.920102e-03 6.924574e-03 1.748418e+00 1.850214e-01 5.872647e-02 5.872647e-02 6.051107e-02 7.781122e-03 5.285745e-02 6.920102e-03 6.924574e-03 1.672571e-01 2.656628e-02 + 71 1.420000e-02 2.000000e-04 7.096031e-01 6.978958e-01 7.010480e-01 8.874062e-02 5.335263e-02 6.748569e-03 6.753013e-03 1.748203e+00 1.851197e-01 5.946819e-02 5.946819e-02 6.099733e-02 7.899188e-03 5.335263e-02 6.748569e-03 6.753013e-03 1.684650e-01 2.681748e-02 + 72 1.440000e-02 2.000000e-04 7.096653e-01 6.977570e-01 7.009794e-01 8.875127e-02 5.384410e-02 6.579977e-03 6.584387e-03 1.747988e+00 1.852190e-01 6.020633e-02 6.020633e-02 6.147530e-02 8.018031e-03 5.384410e-02 6.579977e-03 6.584387e-03 1.696491e-01 2.707428e-02 + 73 1.460000e-02 2.000000e-04 7.097280e-01 6.976182e-01 7.009109e-01 8.876216e-02 5.433194e-02 6.414520e-03 6.418890e-03 1.747772e+00 1.853194e-01 6.094098e-02 6.094098e-02 6.194518e-02 8.137604e-03 5.433194e-02 6.414520e-03 6.418890e-03 1.708102e-01 2.733684e-02 + 74 1.480000e-02 2.000000e-04 7.097912e-01 6.974792e-01 7.008425e-01 8.877326e-02 5.481625e-02 6.252382e-03 6.256708e-03 1.747557e+00 1.854209e-01 6.167222e-02 6.167222e-02 6.240722e-02 8.257851e-03 5.481625e-02 6.252382e-03 6.256708e-03 1.719491e-01 2.760527e-02 + 75 1.500000e-02 2.000000e-04 7.098548e-01 6.973402e-01 7.007741e-01 8.878458e-02 5.529712e-02 6.093738e-03 6.098014e-03 1.747342e+00 1.855235e-01 6.240014e-02 6.240014e-02 6.286161e-02 8.378714e-03 5.529712e-02 6.093738e-03 6.098014e-03 1.730664e-01 2.787961e-02 + 76 1.520000e-02 2.000000e-04 7.099188e-01 6.972011e-01 7.007058e-01 8.879612e-02 5.577463e-02 5.938753e-03 5.942973e-03 1.747127e+00 1.856274e-01 6.312480e-02 6.312480e-02 6.330858e-02 8.500126e-03 5.577463e-02 5.938753e-03 5.942973e-03 1.741630e-01 2.815988e-02 + 77 1.540000e-02 2.000000e-04 7.099834e-01 6.970620e-01 7.006375e-01 8.880788e-02 5.624885e-02 5.787583e-03 5.791743e-03 1.746912e+00 1.857324e-01 6.384629e-02 6.384629e-02 6.374835e-02 8.622021e-03 5.624885e-02 5.787583e-03 5.791743e-03 1.752395e-01 2.844601e-02 + 78 1.560000e-02 2.000000e-04 7.100483e-01 6.969227e-01 7.005693e-01 8.881983e-02 5.671987e-02 5.640377e-03 5.644473e-03 1.746697e+00 1.858388e-01 6.456467e-02 6.456467e-02 6.418112e-02 8.744327e-03 5.671987e-02 5.640377e-03 5.644473e-03 1.762966e-01 2.873791e-02 + 79 1.580000e-02 2.000000e-04 7.101137e-01 6.967833e-01 7.005011e-01 8.883199e-02 5.718776e-02 5.497276e-03 5.501302e-03 1.746482e+00 1.859463e-01 6.528001e-02 6.528001e-02 6.460710e-02 8.866974e-03 5.718776e-02 5.497276e-03 5.501302e-03 1.773351e-01 2.903545e-02 + 80 1.600000e-02 2.000000e-04 7.101796e-01 6.966439e-01 7.004329e-01 8.884435e-02 5.765258e-02 5.358412e-03 5.362364e-03 1.746266e+00 1.860552e-01 6.599239e-02 6.599239e-02 6.502651e-02 8.989890e-03 5.765258e-02 5.358412e-03 5.362364e-03 1.783555e-01 2.933846e-02 + 81 1.620000e-02 2.000000e-04 7.102458e-01 6.965043e-01 7.003647e-01 8.885689e-02 5.811440e-02 5.223912e-03 5.227784e-03 1.746051e+00 1.861652e-01 6.670187e-02 6.670187e-02 6.543954e-02 9.113005e-03 5.811440e-02 5.223912e-03 5.227784e-03 1.793587e-01 2.964672e-02 + 82 1.640000e-02 2.000000e-04 7.103126e-01 6.963647e-01 7.002965e-01 8.886961e-02 5.857328e-02 5.093893e-03 5.097682e-03 1.745835e+00 1.862766e-01 6.740852e-02 6.740852e-02 6.584640e-02 9.236250e-03 5.857328e-02 5.093893e-03 5.097682e-03 1.803451e-01 2.996000e-02 + 83 1.660000e-02 2.000000e-04 7.103797e-01 6.962249e-01 7.002283e-01 8.888251e-02 5.902928e-02 4.968466e-03 4.972165e-03 1.745620e+00 1.863892e-01 6.811239e-02 6.811239e-02 6.624728e-02 9.359559e-03 5.902928e-02 4.968466e-03 4.972165e-03 1.813156e-01 3.027806e-02 + 84 1.680000e-02 2.000000e-04 7.104473e-01 6.960851e-01 7.001602e-01 8.889558e-02 5.948244e-02 4.847731e-03 4.851337e-03 1.745404e+00 1.865030e-01 6.881355e-02 6.881355e-02 6.664239e-02 9.482869e-03 5.948244e-02 4.847731e-03 4.851337e-03 1.822707e-01 3.060060e-02 + 85 1.700000e-02 2.000000e-04 7.105153e-01 6.959451e-01 7.000920e-01 8.890881e-02 5.993282e-02 4.731780e-03 4.735290e-03 1.745188e+00 1.866180e-01 6.951205e-02 6.951205e-02 6.703192e-02 9.606118e-03 5.993282e-02 4.731780e-03 4.735290e-03 1.832111e-01 3.092734e-02 + 86 1.720000e-02 2.000000e-04 7.105837e-01 6.958050e-01 7.000238e-01 8.892220e-02 6.038047e-02 4.620697e-03 4.624105e-03 1.744972e+00 1.867341e-01 7.020796e-02 7.020796e-02 6.741607e-02 9.729252e-03 6.038047e-02 4.620697e-03 4.624105e-03 1.841374e-01 3.125797e-02 + 87 1.740000e-02 2.000000e-04 7.106525e-01 6.956649e-01 6.999556e-01 8.893574e-02 6.082542e-02 4.514550e-03 4.517854e-03 1.744756e+00 1.868514e-01 7.090132e-02 7.090132e-02 6.779501e-02 9.852217e-03 6.082542e-02 4.514550e-03 4.517854e-03 1.850502e-01 3.159219e-02 + 88 1.760000e-02 2.000000e-04 7.107218e-01 6.955246e-01 6.998874e-01 8.894942e-02 6.126773e-02 4.413398e-03 4.416594e-03 1.744540e+00 1.869699e-01 7.159220e-02 7.159220e-02 6.816893e-02 9.974967e-03 6.126773e-02 4.413398e-03 4.416594e-03 1.859500e-01 3.192969e-02 + 89 1.780000e-02 2.000000e-04 7.107915e-01 6.953843e-01 6.998192e-01 8.896324e-02 6.170742e-02 4.317287e-03 4.320372e-03 1.744324e+00 1.870894e-01 7.228063e-02 7.228063e-02 6.853802e-02 1.009746e-02 6.170742e-02 4.317287e-03 4.320372e-03 1.868375e-01 3.227016e-02 + 90 1.800000e-02 2.000000e-04 7.108616e-01 6.952438e-01 6.997509e-01 8.897719e-02 6.214454e-02 4.226243e-03 4.229215e-03 1.744107e+00 1.872099e-01 7.296668e-02 7.296668e-02 6.890246e-02 1.021965e-02 6.214454e-02 4.226243e-03 4.229215e-03 1.877132e-01 3.261329e-02 + 91 1.820000e-02 2.000000e-04 7.109321e-01 6.951032e-01 6.996826e-01 8.899127e-02 6.257912e-02 4.140280e-03 4.143137e-03 1.743891e+00 1.873315e-01 7.365038e-02 7.365038e-02 6.926241e-02 1.034151e-02 6.257912e-02 4.140280e-03 4.143137e-03 1.885777e-01 3.295877e-02 + 92 1.840000e-02 2.000000e-04 7.110030e-01 6.949625e-01 6.996143e-01 8.900547e-02 6.301120e-02 4.059391e-03 4.062132e-03 1.743674e+00 1.874540e-01 7.433179e-02 7.433179e-02 6.961806e-02 1.046301e-02 6.301120e-02 4.059391e-03 4.062132e-03 1.894316e-01 3.330633e-02 + 93 1.860000e-02 2.000000e-04 7.110743e-01 6.948217e-01 6.995460e-01 8.901979e-02 6.344081e-02 3.983552e-03 3.986175e-03 1.743457e+00 1.875775e-01 7.501095e-02 7.501095e-02 6.996957e-02 1.058413e-02 6.344081e-02 3.983552e-03 3.986175e-03 1.902752e-01 3.365569e-02 + 94 1.880000e-02 2.000000e-04 7.111460e-01 6.946808e-01 6.994777e-01 8.903423e-02 6.386798e-02 3.912714e-03 3.915220e-03 1.743240e+00 1.877019e-01 7.568790e-02 7.568790e-02 7.031710e-02 1.070485e-02 6.386798e-02 3.912714e-03 3.915220e-03 1.911092e-01 3.400658e-02 + 95 1.900000e-02 2.000000e-04 7.112182e-01 6.945397e-01 6.994093e-01 8.904877e-02 6.429274e-02 3.846812e-03 3.849201e-03 1.743023e+00 1.878271e-01 7.636268e-02 7.636268e-02 7.066082e-02 1.082514e-02 6.429274e-02 3.846812e-03 3.849201e-03 1.919341e-01 3.435877e-02 + 96 1.920000e-02 2.000000e-04 7.112907e-01 6.943986e-01 6.993410e-01 8.906342e-02 6.471513e-02 3.785756e-03 3.788028e-03 1.742806e+00 1.879532e-01 7.703534e-02 7.703534e-02 7.100089e-02 1.094501e-02 6.471513e-02 3.785756e-03 3.788028e-03 1.927502e-01 3.471204e-02 + 97 1.940000e-02 2.000000e-04 7.113636e-01 6.942573e-01 6.992725e-01 8.907818e-02 6.513517e-02 3.729433e-03 3.731591e-03 1.742589e+00 1.880800e-01 7.770591e-02 7.770591e-02 7.133745e-02 1.106444e-02 6.513517e-02 3.729433e-03 3.731591e-03 1.935582e-01 3.506618e-02 + 98 1.960000e-02 2.000000e-04 7.114370e-01 6.941160e-01 6.992041e-01 8.909303e-02 6.555290e-02 3.677711e-03 3.679757e-03 1.742372e+00 1.882077e-01 7.837444e-02 7.837444e-02 7.167065e-02 1.118344e-02 6.555290e-02 3.677711e-03 3.679757e-03 1.943583e-01 3.542102e-02 + 99 1.980000e-02 2.000000e-04 7.115107e-01 6.939745e-01 6.991357e-01 8.910799e-02 6.596835e-02 3.630434e-03 3.632371e-03 1.742154e+00 1.883361e-01 7.904095e-02 7.904095e-02 7.200065e-02 1.130200e-02 6.596835e-02 3.630434e-03 3.632371e-03 1.951511e-01 3.577641e-02 + 100 2.000000e-02 2.000000e-04 7.115848e-01 6.938329e-01 6.990672e-01 8.912306e-02 6.638155e-02 3.587429e-03 3.589261e-03 1.741937e+00 1.884652e-01 7.970548e-02 7.970548e-02 7.232758e-02 1.142013e-02 6.638155e-02 3.587429e-03 3.589261e-03 1.959371e-01 3.613223e-02 diff --git a/tests/regression/inciter/multimat/SodShocktube/diag_p0p1.std b/tests/regression/inciter/multimat/SodShocktube/diag_p0p1.std new file mode 100644 index 00000000000..f4b25fe6bfe --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/diag_p0p1.std @@ -0,0 +1,101 @@ +# 1:it 2:t 3:dt 4:L2(r) 5:L2(ru) 6:L2(rv) 7:L2(rw) 8:L2(re) 9:L2(r-IC) 10:L2(ru-IC) 11:L2(rv-IC) 12:L2(rw-IC) 13:L2(re-IC) + 1 2.000000e-03 2.000000e-03 7.071312e-01 7.062902e-01 7.063215e-01 8.839120e-02 1.182280e-02 6.746065e-03 6.623487e-03 1.765017e+00 1.783597e-01 5.874380e-03 5.874380e-03 8.012775e-03 7.100926e-04 1.182280e-02 6.746065e-03 6.623487e-03 2.184743e-02 8.427736e-03 + 2 4.000000e-03 2.000000e-03 7.072949e-01 7.048793e-01 7.051571e-01 8.842585e-02 2.189537e-02 1.096361e-02 1.058877e-02 1.761063e+00 1.801183e-01 1.631117e-02 1.631117e-02 2.083501e-02 2.575171e-03 2.189537e-02 1.096361e-02 1.058877e-02 5.840909e-02 1.469448e-02 + 3 6.000000e-03 2.000000e-03 7.076585e-01 7.033515e-01 7.041176e-01 8.850871e-02 3.064536e-02 1.296604e-02 1.235886e-02 1.757700e+00 1.815739e-01 2.793895e-02 2.793895e-02 3.323122e-02 4.614407e-03 3.064536e-02 1.296604e-02 1.235886e-02 9.383687e-02 1.966682e-02 + 4 8.000000e-03 2.000000e-03 7.081752e-01 7.018672e-01 7.032474e-01 8.859505e-02 3.821273e-02 1.328547e-02 1.247304e-02 1.755018e+00 1.828606e-01 3.888575e-02 3.888575e-02 4.382942e-02 6.048461e-03 3.821273e-02 1.328547e-02 1.247304e-02 1.236468e-01 2.393018e-02 + 5 1.000000e-02 2.000000e-03 7.087952e-01 7.004524e-01 7.025032e-01 8.866721e-02 4.500938e-02 1.224575e-02 1.121084e-02 1.752781e+00 1.839650e-01 4.889349e-02 4.889349e-02 5.266707e-02 7.026762e-03 4.500938e-02 1.224575e-02 1.121084e-02 1.477164e-01 2.690464e-02 + 6 1.200000e-02 2.000000e-03 7.094896e-01 6.990952e-01 7.018420e-01 8.874425e-02 5.127063e-02 1.023185e-02 8.981714e-03 1.750785e+00 1.849313e-01 5.809877e-02 5.809877e-02 5.993922e-02 7.939963e-03 5.127063e-02 1.023185e-02 8.981714e-03 1.666640e-01 2.895178e-02 + 7 1.400000e-02 2.000000e-03 7.102586e-01 6.977421e-01 7.012240e-01 8.887476e-02 5.697027e-02 7.789758e-03 6.534258e-03 1.748886e+00 1.860647e-01 6.683772e-02 6.683772e-02 6.580853e-02 9.285606e-03 5.697027e-02 7.789758e-03 6.534258e-03 1.812700e-01 3.194644e-02 + 8 1.600000e-02 2.000000e-03 7.111148e-01 6.963669e-01 7.006160e-01 8.906320e-02 6.220350e-02 5.444908e-03 4.506580e-03 1.746988e+00 1.875358e-01 7.539385e-02 7.539385e-02 7.056352e-02 1.094322e-02 6.220350e-02 5.444908e-03 4.506580e-03 1.926260e-01 3.648508e-02 + 9 1.800000e-02 2.000000e-03 7.120531e-01 6.949908e-01 7.000086e-01 8.929008e-02 6.703482e-02 3.718485e-03 3.357895e-03 1.745072e+00 1.892743e-01 8.378308e-02 8.378308e-02 7.463055e-02 1.265779e-02 6.703482e-02 3.718485e-03 3.357895e-03 2.020261e-01 4.175006e-02 + 10 2.000000e-02 2.000000e-03 7.130551e-01 6.936130e-01 6.993932e-01 8.953277e-02 7.148541e-02 2.817986e-03 2.962885e-03 1.743123e+00 1.911734e-01 9.191091e-02 9.191091e-02 7.822665e-02 1.426946e-02 7.148541e-02 2.817986e-03 2.962885e-03 2.101933e-01 4.713491e-02 + 11 2.200000e-02 2.000000e-03 7.141047e-01 6.922331e-01 6.987670e-01 8.976669e-02 7.560364e-02 2.503469e-03 2.867122e-03 1.741143e+00 1.930552e-01 9.972700e-02 9.972700e-02 8.152205e-02 1.567035e-02 7.560364e-02 2.503469e-03 2.867122e-03 2.177031e-01 5.193817e-02 + 12 2.400000e-02 2.000000e-03 7.151855e-01 6.908397e-01 6.981294e-01 9.001683e-02 7.952192e-02 2.399848e-03 2.748752e-03 1.739133e+00 1.950937e-01 1.071928e-01 1.071928e-01 8.459559e-02 1.704494e-02 7.952192e-02 2.399848e-03 2.748752e-03 2.248031e-01 5.687708e-02 + 13 2.600000e-02 2.000000e-03 7.162897e-01 6.894345e-01 6.974842e-01 9.027368e-02 8.332104e-02 2.409541e-03 2.676798e-03 1.737105e+00 1.973033e-01 1.143278e-01 1.143278e-01 8.754995e-02 1.835314e-02 8.332104e-02 2.409541e-03 2.676798e-03 2.317736e-01 6.198293e-02 + 14 2.800000e-02 2.000000e-03 7.174169e-01 6.880282e-01 6.968378e-01 9.053833e-02 8.699001e-02 2.468357e-03 2.656933e-03 1.735076e+00 1.996080e-01 1.211898e-01 1.211898e-01 9.050612e-02 1.961352e-02 8.699001e-02 2.468357e-03 2.656933e-03 2.389235e-01 6.701833e-02 + 15 3.000000e-02 2.000000e-03 7.185658e-01 6.866148e-01 6.961900e-01 9.080910e-02 9.046384e-02 2.550650e-03 2.699631e-03 1.733041e+00 2.018627e-01 1.278155e-01 1.278155e-01 9.349745e-02 2.082770e-02 9.046384e-02 2.550650e-03 2.699631e-03 2.462834e-01 7.160199e-02 + 16 3.200000e-02 2.000000e-03 7.197398e-01 6.851968e-01 6.955406e-01 9.108261e-02 9.377644e-02 2.529596e-03 2.679132e-03 1.730996e+00 2.040117e-01 1.342584e-01 1.342584e-01 9.651740e-02 2.198959e-02 9.377644e-02 2.529596e-03 2.679132e-03 2.537955e-01 7.566671e-02 + 17 3.400000e-02 2.000000e-03 7.209368e-01 6.837794e-01 6.948905e-01 9.139352e-02 9.701293e-02 2.273790e-03 2.375683e-03 1.728950e+00 2.063631e-01 1.405343e-01 1.405343e-01 9.955263e-02 2.324382e-02 9.701293e-02 2.273790e-03 2.375683e-03 2.614188e-01 8.008851e-02 + 18 3.600000e-02 2.000000e-03 7.221506e-01 6.823633e-01 6.942392e-01 9.171446e-02 1.001888e-01 1.937629e-03 1.975368e-03 1.726900e+00 2.088846e-01 1.466335e-01 1.466335e-01 1.025735e-01 2.447536e-02 1.001888e-01 1.937629e-03 1.975368e-03 2.690526e-01 8.474623e-02 + 19 3.800000e-02 2.000000e-03 7.233748e-01 6.809394e-01 6.935841e-01 9.202300e-02 1.032597e-01 1.745584e-03 1.762734e-03 1.724838e+00 2.113956e-01 1.525484e-01 1.525484e-01 1.055404e-01 2.560729e-02 1.032597e-01 1.745584e-03 1.762734e-03 2.765527e-01 8.918937e-02 + 20 4.000000e-02 2.000000e-03 7.246055e-01 6.795090e-01 6.929254e-01 9.230305e-02 1.061914e-01 1.740277e-03 1.793898e-03 1.722764e+00 2.136775e-01 1.582819e-01 1.582819e-01 1.084423e-01 2.659611e-02 1.061914e-01 1.740277e-03 1.793898e-03 2.838843e-01 9.295109e-02 + 21 4.200000e-02 2.000000e-03 7.258436e-01 6.780756e-01 6.922649e-01 9.259337e-02 1.090241e-01 1.667366e-03 1.742398e-03 1.720681e+00 2.159090e-01 1.638566e-01 1.638566e-01 1.112878e-01 2.758683e-02 1.090241e-01 1.667366e-03 1.742398e-03 2.910628e-01 9.650211e-02 + 22 4.400000e-02 2.000000e-03 7.270884e-01 6.766384e-01 6.916025e-01 9.291808e-02 1.118161e-01 1.498566e-03 1.553576e-03 1.718589e+00 2.183383e-01 1.692854e-01 1.692854e-01 1.140763e-01 2.865781e-02 1.118161e-01 1.498566e-03 1.553576e-03 2.980852e-01 1.004052e-01 + 23 4.600000e-02 2.000000e-03 7.283404e-01 6.751991e-01 6.909395e-01 9.325036e-02 1.145747e-01 1.393132e-03 1.452510e-03 1.716495e+00 2.208796e-01 1.745842e-01 1.745842e-01 1.168223e-01 2.971750e-02 1.145747e-01 1.393132e-03 1.452510e-03 3.050077e-01 1.044535e-01 + 24 4.800000e-02 2.000000e-03 7.295998e-01 6.737601e-01 6.902779e-01 9.356587e-02 1.172443e-01 1.434646e-03 1.502703e-03 1.714406e+00 2.233121e-01 1.797662e-01 1.797662e-01 1.195387e-01 3.069320e-02 1.172443e-01 1.434646e-03 1.502703e-03 3.118819e-01 1.081828e-01 + 25 5.000000e-02 2.000000e-03 7.308636e-01 6.723184e-01 6.896162e-01 9.385172e-02 1.198168e-01 1.486188e-03 1.590676e-03 1.712316e+00 2.254673e-01 1.848285e-01 1.848285e-01 1.222159e-01 3.155385e-02 1.198168e-01 1.486188e-03 1.590676e-03 3.186726e-01 1.112760e-01 + 26 5.200000e-02 2.000000e-03 7.321283e-01 6.708722e-01 6.889528e-01 9.416797e-02 1.223368e-01 1.330341e-03 1.400070e-03 1.710221e+00 2.277396e-01 1.897678e-01 1.897678e-01 1.248438e-01 3.248240e-02 1.223368e-01 1.330341e-03 1.400070e-03 3.253434e-01 1.145550e-01 + 27 5.400000e-02 2.000000e-03 7.333915e-01 6.694223e-01 6.882869e-01 9.450337e-02 1.248438e-01 1.119313e-03 1.129598e-03 1.708117e+00 2.301935e-01 1.945845e-01 1.945845e-01 1.274159e-01 3.344229e-02 1.248438e-01 1.119313e-03 1.129598e-03 3.318690e-01 1.181376e-01 + 28 5.600000e-02 2.000000e-03 7.346541e-01 6.679712e-01 6.876190e-01 9.482754e-02 1.272986e-01 1.212476e-03 1.258381e-03 1.706005e+00 2.326372e-01 1.992902e-01 1.992902e-01 1.299329e-01 3.434768e-02 1.272986e-01 1.212476e-03 1.258381e-03 3.382418e-01 1.216436e-01 + 29 5.800000e-02 2.000000e-03 7.359169e-01 6.665193e-01 6.869498e-01 9.511698e-02 1.296576e-01 1.479649e-03 1.594718e-03 1.703887e+00 2.348109e-01 2.038963e-01 2.038963e-01 1.323820e-01 3.513887e-02 1.296576e-01 1.479649e-03 1.594718e-03 3.444218e-01 1.245913e-01 + 30 6.000000e-02 2.000000e-03 7.371800e-01 6.650663e-01 6.862812e-01 9.540174e-02 1.319574e-01 1.467549e-03 1.598468e-03 1.701770e+00 2.368341e-01 2.084090e-01 2.084090e-01 1.347640e-01 3.590254e-02 1.319574e-01 1.467549e-03 1.598468e-03 3.504229e-01 1.272284e-01 + 31 6.200000e-02 2.000000e-03 7.384450e-01 6.636123e-01 6.856140e-01 9.572890e-02 1.342623e-01 1.109173e-03 1.144277e-03 1.699659e+00 2.390977e-01 2.128402e-01 2.128402e-01 1.370712e-01 3.676306e-02 1.342623e-01 1.109173e-03 1.144277e-03 3.562159e-01 1.302854e-01 + 32 6.400000e-02 2.000000e-03 7.397102e-01 6.621558e-01 6.849468e-01 9.606711e-02 1.365674e-01 9.007403e-04 8.768260e-04 1.697546e+00 2.415088e-01 2.171891e-01 2.171891e-01 1.393414e-01 3.763496e-02 1.365674e-01 9.007403e-04 8.768260e-04 3.619205e-01 1.335767e-01 + 33 6.600000e-02 2.000000e-03 7.409737e-01 6.606960e-01 6.842788e-01 9.638142e-02 1.387995e-01 1.119615e-03 1.153521e-03 1.695431e+00 2.437808e-01 2.214542e-01 2.214542e-01 1.415715e-01 3.843017e-02 1.387995e-01 1.119615e-03 1.153521e-03 3.675270e-01 1.365821e-01 + 34 6.800000e-02 2.000000e-03 7.422336e-01 6.592326e-01 6.836087e-01 9.665562e-02 1.409440e-01 1.359478e-03 1.483825e-03 1.693308e+00 2.457261e-01 2.256341e-01 2.256341e-01 1.437681e-01 3.911278e-02 1.409440e-01 1.359478e-03 1.483825e-03 3.730478e-01 1.389826e-01 + 35 7.000000e-02 2.000000e-03 7.434901e-01 6.577671e-01 6.829363e-01 9.696131e-02 1.430606e-01 1.266295e-03 1.377544e-03 1.691176e+00 2.477885e-01 2.297334e-01 2.297334e-01 1.459495e-01 3.986222e-02 1.430606e-01 1.266295e-03 1.377544e-03 3.785404e-01 1.415735e-01 + 36 7.200000e-02 2.000000e-03 7.447449e-01 6.563010e-01 6.822632e-01 9.729095e-02 1.451961e-01 1.007748e-03 1.069060e-03 1.689040e+00 2.500569e-01 2.337627e-01 2.337627e-01 1.481217e-01 4.065747e-02 1.451961e-01 1.007748e-03 1.069060e-03 3.840253e-01 1.445048e-01 + 37 7.400000e-02 2.000000e-03 7.459981e-01 6.548331e-01 6.815903e-01 9.761078e-02 1.473066e-01 1.004491e-03 1.065404e-03 1.686906e+00 2.523063e-01 2.377250e-01 2.377250e-01 1.502842e-01 4.141695e-02 1.473066e-01 1.004491e-03 1.065404e-03 3.895043e-01 1.473809e-01 + 38 7.600000e-02 2.000000e-03 7.472507e-01 6.533635e-01 6.809177e-01 9.789185e-02 1.493458e-01 1.258552e-03 1.365483e-03 1.684773e+00 2.542700e-01 2.416269e-01 2.416269e-01 1.524321e-01 4.207510e-02 1.493458e-01 1.258552e-03 1.365483e-03 3.949551e-01 1.497518e-01 + 39 7.800000e-02 2.000000e-03 7.485030e-01 6.518924e-01 6.802453e-01 9.817698e-02 1.513382e-01 1.256909e-03 1.378928e-03 1.682639e+00 2.561479e-01 2.454723e-01 2.454723e-01 1.545603e-01 4.273429e-02 1.513382e-01 1.256909e-03 1.378928e-03 4.003587e-01 1.519672e-01 + 40 8.000000e-02 2.000000e-03 7.497534e-01 6.504189e-01 6.795722e-01 9.850048e-02 1.533437e-01 9.460895e-04 9.912283e-04 1.680501e+00 2.582763e-01 2.492592e-01 2.492592e-01 1.566618e-01 4.347234e-02 1.533437e-01 9.460895e-04 9.912283e-04 4.056918e-01 1.545926e-01 + 41 8.200000e-02 2.000000e-03 7.510005e-01 6.489420e-01 6.788974e-01 9.882825e-02 1.553462e-01 9.053841e-04 9.557873e-04 1.678358e+00 2.605142e-01 2.529857e-01 2.529857e-01 1.587309e-01 4.421000e-02 1.553462e-01 9.053841e-04 9.557873e-04 4.109350e-01 1.573846e-01 + 42 8.400000e-02 2.000000e-03 7.522436e-01 6.474616e-01 6.782209e-01 9.912491e-02 1.572849e-01 1.207557e-03 1.315994e-03 1.676207e+00 2.625466e-01 2.566523e-01 2.566523e-01 1.607672e-01 4.486923e-02 1.572849e-01 1.207557e-03 1.315994e-03 4.160885e-01 1.598219e-01 + 43 8.600000e-02 2.000000e-03 7.534839e-01 6.459792e-01 6.775440e-01 9.939168e-02 1.591661e-01 1.332617e-03 1.493375e-03 1.674056e+00 2.642992e-01 2.602652e-01 2.602652e-01 1.627782e-01 4.545555e-02 1.591661e-01 1.332617e-03 1.493375e-03 4.211800e-01 1.617918e-01 + 44 8.800000e-02 2.000000e-03 7.547226e-01 6.444953e-01 6.768672e-01 9.969794e-02 1.610531e-01 1.026112e-03 1.114899e-03 1.671905e+00 2.662475e-01 2.638299e-01 2.638299e-01 1.647674e-01 4.612136e-02 1.610531e-01 1.026112e-03 1.114899e-03 4.262193e-01 1.640755e-01 + 45 9.000000e-02 2.000000e-03 7.559597e-01 6.430094e-01 6.761903e-01 1.000215e-01 1.629624e-01 6.905233e-04 6.968799e-04 1.669754e+00 2.683873e-01 2.673482e-01 2.673482e-01 1.667358e-01 4.681677e-02 1.629624e-01 6.905233e-04 6.968799e-04 4.312076e-01 1.666599e-01 + 46 9.200000e-02 2.000000e-03 7.571964e-01 6.415224e-01 6.755133e-01 1.003273e-01 1.648319e-01 8.966706e-04 9.493269e-04 1.667600e+00 2.704390e-01 2.708253e-01 2.708253e-01 1.686859e-01 4.746653e-02 1.648319e-01 8.966706e-04 9.493269e-04 4.361509e-01 1.690919e-01 + 47 9.400000e-02 2.000000e-03 7.584315e-01 6.400336e-01 6.748356e-01 1.005917e-01 1.666338e-01 1.243452e-03 1.381133e-03 1.665444e+00 2.721667e-01 2.742596e-01 2.742596e-01 1.706156e-01 4.802282e-02 1.666338e-01 1.243452e-03 1.381133e-03 4.410424e-01 1.709994e-01 + 48 9.600000e-02 2.000000e-03 7.596640e-01 6.385418e-01 6.741565e-01 1.008815e-01 1.684126e-01 1.166436e-03 1.298253e-03 1.663281e+00 2.739598e-01 2.776496e-01 2.776496e-01 1.725230e-01 4.862685e-02 1.684126e-01 1.166436e-03 1.298253e-03 4.458758e-01 1.730068e-01 + 49 9.800000e-02 2.000000e-03 7.608926e-01 6.370461e-01 6.734763e-01 1.011987e-01 1.702214e-01 7.944819e-04 8.523949e-04 1.661115e+00 2.759892e-01 2.809938e-01 2.809938e-01 1.744090e-01 4.928157e-02 1.702214e-01 7.944819e-04 8.523949e-04 4.506583e-01 1.753819e-01 + 50 1.000000e-01 2.000000e-03 7.621174e-01 6.355466e-01 6.727954e-01 1.015091e-01 1.720214e-01 7.700908e-04 8.265316e-04 1.658947e+00 2.780404e-01 2.842936e-01 2.842936e-01 1.762752e-01 4.991591e-02 1.720214e-01 7.700908e-04 8.265316e-04 4.553955e-01 1.777829e-01 + 51 1.020000e-01 2.000000e-03 7.633402e-01 6.340451e-01 6.721143e-01 1.017831e-01 1.737634e-01 1.112369e-03 1.219764e-03 1.656778e+00 2.798283e-01 2.875555e-01 2.875555e-01 1.781225e-01 5.047083e-02 1.737634e-01 1.112369e-03 1.219764e-03 4.600857e-01 1.797662e-01 + 52 1.040000e-01 2.000000e-03 7.645611e-01 6.325413e-01 6.714328e-01 1.020519e-01 1.754660e-01 1.164792e-03 1.301323e-03 1.654607e+00 2.814768e-01 2.907811e-01 2.907811e-01 1.799511e-01 5.101064e-02 1.754660e-01 1.164792e-03 1.301323e-03 4.647278e-01 1.815300e-01 + 53 1.060000e-01 2.000000e-03 7.657807e-01 6.310354e-01 6.707509e-01 1.023604e-01 1.771873e-01 8.275825e-04 8.789814e-04 1.652434e+00 2.833669e-01 2.939728e-01 2.939728e-01 1.817608e-01 5.162501e-02 1.771873e-01 8.275825e-04 8.789814e-04 4.693194e-01 1.836651e-01 + 54 1.080000e-01 2.000000e-03 7.669995e-01 6.295281e-01 6.700682e-01 1.026745e-01 1.789199e-01 6.968757e-04 7.406878e-04 1.650256e+00 2.853894e-01 2.971333e-01 2.971333e-01 1.835521e-01 5.224513e-02 1.789199e-01 6.968757e-04 7.406878e-04 4.738591e-01 1.859988e-01 + 55 1.100000e-01 2.000000e-03 7.682165e-01 6.280180e-01 6.693847e-01 1.029614e-01 1.806031e-01 1.039652e-03 1.139513e-03 1.648075e+00 2.872331e-01 3.002609e-01 3.002609e-01 1.853256e-01 5.280668e-02 1.806031e-01 1.039652e-03 1.139513e-03 4.783517e-01 1.880525e-01 + 56 1.120000e-01 2.000000e-03 7.694307e-01 6.265041e-01 6.687006e-01 1.032176e-01 1.822391e-01 1.236323e-03 1.395344e-03 1.645892e+00 2.888075e-01 3.033538e-01 3.033538e-01 1.870838e-01 5.330460e-02 1.822391e-01 1.236323e-03 1.395344e-03 4.828096e-01 1.896923e-01 + 57 1.140000e-01 2.000000e-03 7.706412e-01 6.249857e-01 6.680158e-01 1.035122e-01 1.838819e-01 9.236327e-04 1.016116e-03 1.643706e+00 2.905598e-01 3.064113e-01 3.064113e-01 1.888272e-01 5.387285e-02 1.838819e-01 9.236327e-04 1.016116e-03 4.872342e-01 1.916011e-01 + 58 1.160000e-01 2.000000e-03 7.718488e-01 6.234634e-01 6.673302e-01 1.038238e-01 1.855510e-01 5.133851e-04 5.171295e-04 1.641518e+00 2.925091e-01 3.094359e-01 3.094359e-01 1.905569e-01 5.446904e-02 1.855510e-01 5.133851e-04 5.171295e-04 4.916274e-01 1.938048e-01 + 59 1.180000e-01 2.000000e-03 7.730550e-01 6.219388e-01 6.666441e-01 1.041171e-01 1.871907e-01 7.816728e-04 8.401902e-04 1.639328e+00 2.943771e-01 3.124324e-01 3.124324e-01 1.922740e-01 5.502606e-02 1.871907e-01 7.816728e-04 8.401902e-04 4.959906e-01 1.958812e-01 + 60 1.200000e-01 2.000000e-03 7.742596e-01 6.204117e-01 6.659572e-01 1.043704e-01 1.887745e-01 1.156404e-03 1.302661e-03 1.637134e+00 2.959452e-01 3.154011e-01 3.154011e-01 1.939776e-01 5.550396e-02 1.887745e-01 1.156404e-03 1.302661e-03 5.003196e-01 1.975048e-01 + 61 1.220000e-01 2.000000e-03 7.754631e-01 6.188823e-01 6.652696e-01 1.046495e-01 1.903427e-01 1.067508e-03 1.203481e-03 1.634935e+00 2.975723e-01 3.183440e-01 3.183440e-01 1.956671e-01 5.602691e-02 1.903427e-01 1.067508e-03 1.203481e-03 5.046112e-01 1.992162e-01 + 62 1.240000e-01 2.000000e-03 7.766656e-01 6.173507e-01 6.645817e-01 1.049581e-01 1.919439e-01 6.379014e-04 6.931730e-04 1.632735e+00 2.994349e-01 3.212623e-01 3.212623e-01 1.973440e-01 5.660124e-02 1.919439e-01 6.379014e-04 6.931730e-04 5.088723e-01 2.012769e-01 + 63 1.260000e-01 2.000000e-03 7.778662e-01 6.158158e-01 6.638935e-01 1.052600e-01 1.935404e-01 6.250657e-04 6.889250e-04 1.630534e+00 3.013228e-01 3.241540e-01 3.241540e-01 1.990071e-01 5.715909e-02 1.935404e-01 6.250657e-04 6.889250e-04 5.131002e-01 2.033713e-01 + 64 1.280000e-01 2.000000e-03 7.790638e-01 6.142763e-01 6.632044e-01 1.055244e-01 1.950854e-01 1.052320e-03 1.174765e-03 1.628330e+00 3.029570e-01 3.270175e-01 3.270175e-01 2.006549e-01 5.764452e-02 1.950854e-01 1.052320e-03 1.174765e-03 5.172898e-01 2.050874e-01 + 65 1.300000e-01 2.000000e-03 7.802580e-01 6.127319e-01 6.625143e-01 1.057843e-01 1.965995e-01 1.109327e-03 1.259259e-03 1.626123e+00 3.044702e-01 3.298523e-01 3.298523e-01 2.022873e-01 5.811908e-02 1.965995e-01 1.109327e-03 1.259259e-03 5.214407e-01 2.066240e-01 + 66 1.320000e-01 2.000000e-03 7.814497e-01 6.111836e-01 6.618233e-01 1.060832e-01 1.981355e-01 7.111260e-04 7.831959e-04 1.623911e+00 3.062153e-01 3.326615e-01 3.326615e-01 2.039051e-01 5.866120e-02 1.981355e-01 7.111260e-04 7.831959e-04 5.255541e-01 2.085013e-01 + 67 1.340000e-01 2.000000e-03 7.826400e-01 6.096325e-01 6.611314e-01 1.063864e-01 1.996857e-01 5.677604e-04 6.403069e-04 1.621696e+00 3.080821e-01 3.354480e-01 3.354480e-01 2.055088e-01 5.920790e-02 1.996857e-01 5.677604e-04 6.403069e-04 5.296297e-01 2.105546e-01 + 68 1.360000e-01 2.000000e-03 7.838287e-01 6.080782e-01 6.604388e-01 1.066622e-01 2.011929e-01 9.654313e-04 1.079903e-03 1.619477e+00 3.097717e-01 3.382120e-01 3.382120e-01 2.070998e-01 5.970199e-02 2.011929e-01 9.654313e-04 1.079903e-03 5.336732e-01 2.123465e-01 + 69 1.380000e-01 2.000000e-03 7.850165e-01 6.065214e-01 6.597460e-01 1.069113e-01 2.026609e-01 1.150887e-03 1.320748e-03 1.617257e+00 3.112267e-01 3.409559e-01 3.409559e-01 2.086800e-01 6.014587e-02 2.026609e-01 1.150887e-03 1.320748e-03 5.376920e-01 2.137955e-01 + 70 1.400000e-01 2.000000e-03 7.862032e-01 6.049617e-01 6.590528e-01 1.072000e-01 2.041399e-01 8.302030e-04 9.293871e-04 1.615035e+00 3.128625e-01 3.436792e-01 3.436792e-01 2.102490e-01 6.065762e-02 2.041399e-01 8.302030e-04 9.293871e-04 5.416835e-01 2.155073e-01 + 71 1.420000e-01 2.000000e-03 7.873878e-01 6.033980e-01 6.583590e-01 1.075039e-01 2.056442e-01 3.934768e-04 4.101101e-04 1.612811e+00 3.146802e-01 3.463806e-01 3.463806e-01 2.118060e-01 6.119310e-02 2.056442e-01 3.934768e-04 4.101101e-04 5.456459e-01 2.174816e-01 + 72 1.440000e-01 2.000000e-03 7.885696e-01 6.018295e-01 6.576641e-01 1.077878e-01 2.071214e-01 7.376626e-04 8.067204e-04 1.610583e+00 3.164063e-01 3.490587e-01 3.490587e-01 2.133501e-01 6.169047e-02 2.071214e-01 7.376626e-04 8.067204e-04 5.495756e-01 2.193209e-01 + 73 1.460000e-01 2.000000e-03 7.897483e-01 6.002561e-01 6.569681e-01 1.080313e-01 2.085513e-01 1.128997e-03 1.282606e-03 1.608350e+00 3.178451e-01 3.517134e-01 3.517134e-01 2.148806e-01 6.211498e-02 2.085513e-01 1.128997e-03 1.282606e-03 5.534692e-01 2.207451e-01 + 74 1.480000e-01 2.000000e-03 7.909250e-01 5.986791e-01 6.562710e-01 1.083034e-01 2.099727e-01 9.929331e-04 1.125902e-03 1.606112e+00 3.193648e-01 3.543478e-01 3.543478e-01 2.163990e-01 6.258687e-02 2.099727e-01 9.929331e-04 1.125902e-03 5.573298e-01 2.222861e-01 + 75 1.500000e-01 2.000000e-03 7.921004e-01 5.970992e-01 6.555735e-01 1.086025e-01 2.114262e-01 5.088293e-04 5.499027e-04 1.603873e+00 3.211042e-01 3.569637e-01 3.569637e-01 2.179075e-01 6.310307e-02 2.114262e-01 5.088293e-04 5.499027e-04 5.611657e-01 2.241417e-01 + 76 1.520000e-01 2.000000e-03 7.932744e-01 5.955160e-01 6.548757e-01 1.088931e-01 2.128750e-01 5.849567e-04 6.390381e-04 1.601632e+00 3.228528e-01 3.595612e-01 3.595612e-01 2.194069e-01 6.360191e-02 2.128750e-01 5.849567e-04 6.390381e-04 5.649794e-01 2.260090e-01 + 77 1.540000e-01 2.000000e-03 7.944477e-01 5.939303e-01 6.541775e-01 1.091478e-01 2.142782e-01 1.033519e-03 1.155493e-03 1.599390e+00 3.243609e-01 3.621423e-01 3.621423e-01 2.208983e-01 6.403704e-02 2.142782e-01 1.033519e-03 1.155493e-03 5.687729e-01 2.275318e-01 + 78 1.560000e-01 2.000000e-03 7.956195e-01 5.923412e-01 6.534788e-01 1.094044e-01 2.156578e-01 1.057945e-03 1.202424e-03 1.597145e+00 3.257882e-01 3.647059e-01 3.647059e-01 2.223817e-01 6.447351e-02 2.156578e-01 1.057945e-03 1.202424e-03 5.725465e-01 2.289397e-01 + 79 1.580000e-01 2.000000e-03 7.967892e-01 5.907478e-01 6.527792e-01 1.096970e-01 2.170613e-01 6.466083e-04 7.068144e-04 1.594895e+00 3.274345e-01 3.672505e-01 3.672505e-01 2.238562e-01 6.496866e-02 2.170613e-01 6.466083e-04 7.068144e-04 5.762977e-01 2.306588e-01 + 80 1.600000e-01 2.000000e-03 7.979559e-01 5.891491e-01 6.520782e-01 1.099915e-01 2.184765e-01 5.146480e-04 5.802576e-04 1.592641e+00 3.291784e-01 3.697751e-01 3.697751e-01 2.253212e-01 6.546475e-02 2.184765e-01 5.146480e-04 5.802576e-04 5.800244e-01 2.325151e-01 + 81 1.620000e-01 2.000000e-03 7.991197e-01 5.875452e-01 6.513763e-01 1.102566e-01 2.198525e-01 9.500279e-04 1.059384e-03 1.590383e+00 3.307418e-01 3.722798e-01 3.722798e-01 2.267775e-01 6.590916e-02 2.198525e-01 9.500279e-04 1.059384e-03 5.837306e-01 2.341150e-01 + 82 1.640000e-01 2.000000e-03 8.002817e-01 5.859375e-01 6.506738e-01 1.104984e-01 2.211959e-01 1.138576e-03 1.299935e-03 1.588123e+00 3.320974e-01 3.747677e-01 3.747677e-01 2.282263e-01 6.631291e-02 2.211959e-01 1.138576e-03 1.299935e-03 5.874194e-01 2.354215e-01 + 83 1.660000e-01 2.000000e-03 8.014422e-01 5.843261e-01 6.499709e-01 1.107792e-01 2.225536e-01 7.767129e-04 8.664339e-04 1.585861e+00 3.336368e-01 3.772395e-01 3.772395e-01 2.296671e-01 6.677970e-02 2.225536e-01 7.767129e-04 8.664339e-04 5.910891e-01 2.369876e-01 + 84 1.680000e-01 2.000000e-03 8.026014e-01 5.827111e-01 6.492674e-01 1.110733e-01 2.239350e-01 3.288412e-04 3.457892e-04 1.583596e+00 3.353414e-01 3.796958e-01 3.796958e-01 2.310998e-01 6.726639e-02 2.239350e-01 3.288412e-04 3.457892e-04 5.947384e-01 2.387856e-01 + 85 1.700000e-01 2.000000e-03 8.037597e-01 5.810931e-01 6.485634e-01 1.113478e-01 2.252904e-01 7.492350e-04 8.244873e-04 1.581328e+00 3.369508e-01 3.821383e-01 3.821383e-01 2.325242e-01 6.771871e-02 2.252904e-01 7.492350e-04 8.244873e-04 5.983657e-01 2.404490e-01 + 86 1.720000e-01 2.000000e-03 8.049166e-01 5.794711e-01 6.478585e-01 1.115859e-01 2.266049e-01 1.104158e-03 1.267761e-03 1.579056e+00 3.382993e-01 3.845656e-01 3.845656e-01 2.339393e-01 6.810959e-02 2.266049e-01 1.104158e-03 1.267761e-03 6.019670e-01 2.417469e-01 + 87 1.740000e-01 2.000000e-03 8.060713e-01 5.778443e-01 6.471526e-01 1.118544e-01 2.279162e-01 9.313818e-04 1.066530e-03 1.576780e+00 3.397449e-01 3.869766e-01 3.869766e-01 2.353449e-01 6.854854e-02 2.279162e-01 9.313818e-04 1.066530e-03 6.055436e-01 2.431811e-01 + 88 1.760000e-01 2.000000e-03 8.072233e-01 5.762119e-01 6.464458e-01 1.121458e-01 2.292580e-01 4.258599e-04 4.709280e-04 1.574502e+00 3.413884e-01 3.893705e-01 3.893705e-01 2.367418e-01 6.902303e-02 2.292580e-01 4.258599e-04 4.709280e-04 6.090993e-01 2.448915e-01 + 89 1.780000e-01 2.000000e-03 8.083726e-01 5.745741e-01 6.457382e-01 1.124258e-01 2.305927e-01 5.600333e-04 6.252758e-04 1.572220e+00 3.430196e-01 3.917477e-01 3.917477e-01 2.381304e-01 6.947701e-02 2.305927e-01 5.600333e-04 6.252758e-04 6.126351e-01 2.465841e-01 + 90 1.800000e-01 2.000000e-03 8.095205e-01 5.729325e-01 6.450301e-01 1.126691e-01 2.318861e-01 1.037992e-03 1.171379e-03 1.569935e+00 3.444116e-01 3.941109e-01 3.941109e-01 2.395117e-01 6.987007e-02 2.318861e-01 1.037992e-03 1.171379e-03 6.161533e-01 2.479437e-01 + 91 1.820000e-01 2.000000e-03 8.106671e-01 5.712870e-01 6.443213e-01 1.129198e-01 2.331619e-01 1.034954e-03 1.180102e-03 1.567648e+00 3.457580e-01 3.964607e-01 3.964607e-01 2.408859e-01 7.027358e-02 2.331619e-01 1.034954e-03 1.180102e-03 6.196536e-01 2.492408e-01 + 92 1.840000e-01 2.000000e-03 8.118125e-01 5.696378e-01 6.436117e-01 1.132040e-01 2.344636e-01 5.752285e-04 6.338820e-04 1.565357e+00 3.473162e-01 3.987975e-01 3.987975e-01 2.422527e-01 7.072936e-02 2.344636e-01 5.752285e-04 6.338820e-04 6.231342e-01 2.508318e-01 + 93 1.860000e-01 2.000000e-03 8.129572e-01 5.679854e-01 6.429014e-01 1.134902e-01 2.357748e-01 4.927754e-04 5.578317e-04 1.563062e+00 3.489605e-01 4.011226e-01 4.011226e-01 2.436123e-01 7.118654e-02 2.357748e-01 4.927754e-04 5.578317e-04 6.265952e-01 2.525416e-01 + 94 1.880000e-01 2.000000e-03 8.141004e-01 5.663288e-01 6.421905e-01 1.137472e-01 2.370493e-01 9.528206e-04 1.064907e-03 1.560764e+00 3.504248e-01 4.034345e-01 4.034345e-01 2.449650e-01 7.159553e-02 2.370493e-01 9.528206e-04 1.064907e-03 6.300391e-01 2.540023e-01 + 95 1.900000e-01 2.000000e-03 8.152414e-01 5.646670e-01 6.414788e-01 1.139854e-01 2.382961e-01 1.098256e-03 1.260411e-03 1.558464e+00 3.517119e-01 4.057321e-01 4.057321e-01 2.463103e-01 7.197342e-02 2.382961e-01 1.098256e-03 1.260411e-03 6.334654e-01 2.552190e-01 + 96 1.920000e-01 2.000000e-03 8.163798e-01 5.629994e-01 6.407662e-01 1.142608e-01 2.395592e-01 7.266225e-04 8.115830e-04 1.556160e+00 3.531803e-01 4.080146e-01 4.080146e-01 2.476479e-01 7.240878e-02 2.395592e-01 7.266225e-04 8.115830e-04 6.368729e-01 2.566861e-01 + 97 1.940000e-01 2.000000e-03 8.175156e-01 5.613262e-01 6.400527e-01 1.145457e-01 2.408436e-01 3.068851e-04 3.345916e-04 1.553853e+00 3.547902e-01 4.102825e-01 4.102825e-01 2.489779e-01 7.285758e-02 2.408436e-01 3.068851e-04 3.345916e-04 6.402616e-01 2.583477e-01 + 98 1.960000e-01 2.000000e-03 8.186500e-01 5.596489e-01 6.393384e-01 1.148094e-01 2.421014e-01 7.709537e-04 8.552771e-04 1.551542e+00 3.562903e-01 4.125383e-01 4.125383e-01 2.503010e-01 7.327138e-02 2.421014e-01 7.709537e-04 8.552771e-04 6.436319e-01 2.598581e-01 + 99 1.980000e-01 2.000000e-03 8.197830e-01 5.579672e-01 6.386232e-01 1.150393e-01 2.433236e-01 1.123011e-03 1.292358e-03 1.549226e+00 3.575485e-01 4.147820e-01 4.147820e-01 2.516170e-01 7.363106e-02 2.433236e-01 1.123011e-03 1.292358e-03 6.469829e-01 2.610374e-01 + 100 2.000000e-01 2.000000e-03 8.209148e-01 5.562815e-01 6.379074e-01 1.153015e-01 2.445476e-01 8.985363e-04 1.028349e-03 1.546908e+00 3.589223e-01 4.170144e-01 4.170144e-01 2.529268e-01 7.404012e-02 2.445476e-01 8.985363e-04 1.028349e-03 6.503178e-01 2.623756e-01 diff --git a/tests/regression/inciter/multimat/SodShocktube/exodiff_dg.cfg b/tests/regression/inciter/multimat/SodShocktube/exodiff_dg.cfg new file mode 100644 index 00000000000..2de05d35911 --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/exodiff_dg.cfg @@ -0,0 +1,11 @@ +COORDINATES absolute 1.0e-6 +TIME STEPS absolute 1.0e-8 +ELEMENT VARIABLES absolute 1.0e-7 floor 1.0e-9 + volfrac1_numerical + volfrac2_numerical + density_numerical + x-velocity_numerical + y-velocity_numerical + z-velocity_numerical + pressure_numerical + total_energy_density_numerical diff --git a/tests/regression/inciter/multimat/SodShocktube/rectangle_01_1.5k.exo b/tests/regression/inciter/multimat/SodShocktube/rectangle_01_1.5k.exo new file mode 100644 index 00000000000..3c560049e39 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/rectangle_01_1.5k.exo differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.q b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.q new file mode 100644 index 00000000000..5c47cd887ac --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.q @@ -0,0 +1,44 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Multi-material Sod shock-tube" + +inciter + + nstep 100 # Max number of time steps + dt 2.0e-4 # Time step size + ttyi 10 # TTY output interval + scheme dg + + multimat + + physics veleq + problem sod_shocktube + depvar u + + nmat 2 + material + gamma 1.4 1.4 end # ratio of specific heats + end + + bc_extrapolate + sideset 1 3 end + end + bc_sym + sideset 2 4 5 6 end + end + + end + + diagnostics + interval 1 + format scientific + error l2 + end + + plotvar + interval 20 + end + +end diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.std.exo b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.std.exo new file mode 100644 index 00000000000..67f423cbd0b Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg.std.exo differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.0 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.0 new file mode 100644 index 00000000000..0a089538884 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.0 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.1 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.1 new file mode 100644 index 00000000000..fcbb78c29c3 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.1 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.2 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.2 new file mode 100644 index 00000000000..e62b8cd2a5f Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.2 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.3 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.3 new file mode 100644 index 00000000000..d964826da68 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_dg_pe4_u0.0.std.exo.3 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_diag.ndiff.cfg b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_diag.ndiff.cfg new file mode 100644 index 00000000000..641f1091937 --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_diag.ndiff.cfg @@ -0,0 +1,3 @@ +#rows cols constraints +* 1 # iteration count: no constraint: smallest representable float +* 2-$ any abs=1.0e-12 rel=1.0e-7 # tolerance for t, dt, and L2 of conserved variables diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.q b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.q new file mode 100644 index 00000000000..a60985402f5 --- /dev/null +++ b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.q @@ -0,0 +1,49 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Sod shock-tube" + +inciter + + nstep 100 # Max number of time steps + dt 2.0e-3 # Time step size + ttyi 10 # TTY output interval + scheme p0p1 + limiter superbeep1 + + partitioning + algorithm mj + end + + multimat + + physics veleq + problem sod_shocktube + depvar u + + nmat 2 + material + gamma 1.4 1.4 end # ratio of specific heats + end + + bc_extrapolate + sideset 1 3 end + end + bc_sym + sideset 2 4 5 6 end + end + + end + + diagnostics + interval 1 + format scientific + error l2 + end + + plotvar + interval 20 + end + +end diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.std.exo b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.std.exo new file mode 100644 index 00000000000..4a8047d956a Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1.std.exo differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.0 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.0 new file mode 100644 index 00000000000..db9c4c86e95 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.0 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.1 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.1 new file mode 100644 index 00000000000..9d9c9cad338 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.1 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.2 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.2 new file mode 100644 index 00000000000..72b3b76c678 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.2 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.3 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.3 new file mode 100644 index 00000000000..2b86443100f Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.0.std.exo.3 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.0 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.0 new file mode 100644 index 00000000000..57f9aeccbed Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.0 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.1 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.1 new file mode 100644 index 00000000000..2e2feeab0d2 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.1 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.10 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.10 new file mode 100644 index 00000000000..1f8c861a2dd Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.10 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.11 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.11 new file mode 100644 index 00000000000..718ff53f4cd Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.11 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.12 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.12 new file mode 100644 index 00000000000..19d69be1798 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.12 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.13 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.13 new file mode 100644 index 00000000000..a2744179eac Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.13 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.14 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.14 new file mode 100644 index 00000000000..afa465f1ea6 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.14 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.15 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.15 new file mode 100644 index 00000000000..9ed7b39ac05 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.15 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.16 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.16 new file mode 100644 index 00000000000..d971ccbe14d Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.16 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.17 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.17 new file mode 100644 index 00000000000..1668a6ce5f8 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.17 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.18 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.18 new file mode 100644 index 00000000000..7b9d8d66397 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.18 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.19 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.19 new file mode 100644 index 00000000000..24972779d06 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.19 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.2 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.2 new file mode 100644 index 00000000000..eedc28368f2 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.2 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.20 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.20 new file mode 100644 index 00000000000..6cefe335883 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.20 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.21 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.21 new file mode 100644 index 00000000000..468725cdc51 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.21 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.22 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.22 new file mode 100644 index 00000000000..00f1cc5814c Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.22 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.23 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.23 new file mode 100644 index 00000000000..895b422d82b Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.23 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.24 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.24 new file mode 100644 index 00000000000..1e4baef5745 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.24 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.25 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.25 new file mode 100644 index 00000000000..64e855b875a Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.25 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.26 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.26 new file mode 100644 index 00000000000..17c1d37c966 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.26 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.27 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.27 new file mode 100644 index 00000000000..8879d751f95 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.27 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.28 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.28 new file mode 100644 index 00000000000..108f2322a00 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.28 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.29 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.29 new file mode 100644 index 00000000000..4421b3dc294 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.29 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.3 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.3 new file mode 100644 index 00000000000..38522251efe Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.3 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.30 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.30 new file mode 100644 index 00000000000..3f224d18c82 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.30 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.31 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.31 new file mode 100644 index 00000000000..cb302ecdff3 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.31 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.32 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.32 new file mode 100644 index 00000000000..ae53398a72d Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.32 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.33 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.33 new file mode 100644 index 00000000000..aa4a44e0bdc Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.33 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.34 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.34 new file mode 100644 index 00000000000..3973e00a6e7 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.34 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.35 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.35 new file mode 100644 index 00000000000..25f20f86b55 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.35 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.36 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.36 new file mode 100644 index 00000000000..876b66867f4 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.36 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.37 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.37 new file mode 100644 index 00000000000..af74ac36000 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.37 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.38 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.38 new file mode 100644 index 00000000000..0a8f0793d75 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.38 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.4 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.4 new file mode 100644 index 00000000000..b5135b552b9 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.4 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.5 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.5 new file mode 100644 index 00000000000..44e2ee2faac Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.5 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.6 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.6 new file mode 100644 index 00000000000..2dc07df7620 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.6 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.7 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.7 new file mode 100644 index 00000000000..55e03852b10 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.7 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.8 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.8 new file mode 100644 index 00000000000..675a639f176 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.8 differ diff --git a/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.9 b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.9 new file mode 100644 index 00000000000..2eee8675849 Binary files /dev/null and b/tests/regression/inciter/multimat/SodShocktube/sod_shocktube_p0p1_pe4_u0.9.std.exo.9 differ diff --git a/tests/regression/inciter/restart/CMakeLists.txt b/tests/regression/inciter/restart/CMakeLists.txt new file mode 100644 index 00000000000..6844c859526 --- /dev/null +++ b/tests/regression/inciter/restart/CMakeLists.txt @@ -0,0 +1,72 @@ +# See cmake/add_regression_test.cmake for documentation on the arguments to +# add_regression_test(). + +# Serial, checkpoint on 1 PE, restart on 1 PE + +add_regression_test(trans_diagcg_checkpoint ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES slot_cyl.q unitsquare_01_3.6k.exo + ARGS -c slot_cyl.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE slot_cyl_checkpoint.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff.cfg + TEXT_BASELINE slot_cyl_checkpoint.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF slot_cyl_diag.ndiff.cfg + LABELS restart) + +add_regression_test(trans_diagcg_restart ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES slot_cyl_restart.q unitsquare_01_3.6k.exo + ARGS -c slot_cyl_restart.q -i unitsquare_01_3.6k.exo -v + +restart restart + BIN_BASELINE slot_cyl.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff.cfg + TEXT_BASELINE slot_cyl.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF slot_cyl_diag.ndiff.cfg + CHECKPOINT trans_diagcg_checkpoint + LABELS restart) + +# Parallel, checkpoint on 4 PEs, restart on 4 PEs + +add_regression_test(trans_diagcg_checkpoint ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES slot_cyl.q unitsquare_01_3.6k.exo + ARGS -c slot_cyl.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE slot_cyl_checkpoint.std.exo.0 + slot_cyl_checkpoint.std.exo.1 + slot_cyl_checkpoint.std.exo.2 + slot_cyl_checkpoint.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_CONF exodiff.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE slot_cyl_checkpoint.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF slot_cyl_diag.ndiff.cfg + LABELS restart) + +add_regression_test(trans_diagcg_restart ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES slot_cyl_restart.q unitsquare_01_3.6k.exo + ARGS -c slot_cyl_restart.q -i unitsquare_01_3.6k.exo -v + +restart restart + BIN_BASELINE slot_cyl.std.exo.0 + slot_cyl.std.exo.1 + slot_cyl.std.exo.2 + slot_cyl.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_CONF exodiff.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE slot_cyl.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF slot_cyl_diag.ndiff.cfg + CHECKPOINT trans_diagcg_checkpoint + LABELS restart) diff --git a/tests/regression/inciter/restart/exodiff.cfg b/tests/regression/inciter/restart/exodiff.cfg new file mode 100644 index 00000000000..2cdac60e456 --- /dev/null +++ b/tests/regression/inciter/restart/exodiff.cfg @@ -0,0 +1,5 @@ +COORDINATES absolute 1.0e-6 +TIME STEPS absolute 1.0e-8 +NODAL VARIABLES relative 1.0e-7 floor 1.0e-9 + c0_numerical + c0_analytic diff --git a/tests/regression/inciter/restart/slot_cyl.q b/tests/regression/inciter/restart/slot_cyl.q new file mode 100644 index 00000000000..31214d0686e --- /dev/null +++ b/tests/regression/inciter/restart/slot_cyl.q @@ -0,0 +1,25 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Zalesak's slotted cylinder" + +inciter + + nstep 5 # Max number of time steps + cfl 0.8 # CFL coefficient + ttyi 1 # TTY output interval + ctau 1.0 # FCT mass diffusivity + + transport + depvar c + physics advection + problem slot_cyl + end + + plotvar + interval 1 + filetype exodusii + end + +end diff --git a/tests/regression/inciter/restart/slot_cyl.std b/tests/regression/inciter/restart/slot_cyl.std new file mode 100644 index 00000000000..a2345459416 --- /dev/null +++ b/tests/regression/inciter/restart/slot_cyl.std @@ -0,0 +1,11 @@ +# 1:it 2:t 3:dt 4:L2(c0) + 1 0.00835669 0.00835669 0.167774 + 2 0.0167134 0.00835669 0.166078 + 3 0.0250701 0.00835669 0.164592 + 4 0.0334268 0.00835669 0.16326 + 5 0.0417835 0.00835669 0.162052 + 6 0.0501402 0.00835669 0.160956 + 7 0.0584968 0.00835669 0.159969 + 8 0.0668535 0.00835669 0.159078 + 9 0.0752102 0.00835669 0.158268 + 10 0.0835669 0.00835669 0.157531 diff --git a/tests/regression/inciter/restart/slot_cyl.std.exo b/tests/regression/inciter/restart/slot_cyl.std.exo new file mode 100644 index 00000000000..0488dab8f6c Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl.std.exo differ diff --git a/tests/regression/inciter/restart/slot_cyl.std.exo.0 b/tests/regression/inciter/restart/slot_cyl.std.exo.0 new file mode 100644 index 00000000000..a774da9e43d Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl.std.exo.0 differ diff --git a/tests/regression/inciter/restart/slot_cyl.std.exo.1 b/tests/regression/inciter/restart/slot_cyl.std.exo.1 new file mode 100644 index 00000000000..e6be2ba3ff5 Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl.std.exo.1 differ diff --git a/tests/regression/inciter/restart/slot_cyl.std.exo.2 b/tests/regression/inciter/restart/slot_cyl.std.exo.2 new file mode 100644 index 00000000000..ed8f6cf3b5d Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl.std.exo.2 differ diff --git a/tests/regression/inciter/restart/slot_cyl.std.exo.3 b/tests/regression/inciter/restart/slot_cyl.std.exo.3 new file mode 100644 index 00000000000..aaea1b53feb Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl.std.exo.3 differ diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std b/tests/regression/inciter/restart/slot_cyl_checkpoint.std new file mode 100644 index 00000000000..e8541009ac3 --- /dev/null +++ b/tests/regression/inciter/restart/slot_cyl_checkpoint.std @@ -0,0 +1,6 @@ +# 1:it 2:t 3:dt 4:L2(c0) + 1 0.00835669 0.00835669 0.167774 + 2 0.0167134 0.00835669 0.166078 + 3 0.0250701 0.00835669 0.164592 + 4 0.0334268 0.00835669 0.16326 + 5 0.0417835 0.00835669 0.162052 diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo new file mode 100644 index 00000000000..0073e3ba620 Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo differ diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.0 b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.0 new file mode 100644 index 00000000000..9347391ba3d Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.0 differ diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.1 b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.1 new file mode 100644 index 00000000000..209da714d8a Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.1 differ diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.2 b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.2 new file mode 100644 index 00000000000..2d5dadc38e6 Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.2 differ diff --git a/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.3 b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.3 new file mode 100644 index 00000000000..93ee00cf034 Binary files /dev/null and b/tests/regression/inciter/restart/slot_cyl_checkpoint.std.exo.3 differ diff --git a/tests/regression/inciter/restart/slot_cyl_diag.ndiff.cfg b/tests/regression/inciter/restart/slot_cyl_diag.ndiff.cfg new file mode 100644 index 00000000000..641f1091937 --- /dev/null +++ b/tests/regression/inciter/restart/slot_cyl_diag.ndiff.cfg @@ -0,0 +1,3 @@ +#rows cols constraints +* 1 # iteration count: no constraint: smallest representable float +* 2-$ any abs=1.0e-12 rel=1.0e-7 # tolerance for t, dt, and L2 of conserved variables diff --git a/tests/regression/inciter/restart/slot_cyl_restart.q b/tests/regression/inciter/restart/slot_cyl_restart.q new file mode 100644 index 00000000000..26ee00a63b1 --- /dev/null +++ b/tests/regression/inciter/restart/slot_cyl_restart.q @@ -0,0 +1,25 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Zalesak's slotted cylinder - restarted" + +inciter + + nstep 10 # Max number of time steps + cfl 0.8 # CFL coefficient + ttyi 1 # TTY output interval + ctau 1.0 # FCT mass diffusivity + + transport + depvar c + physics advection + problem slot_cyl + end + + plotvar + interval 1 + filetype exodusii + end + +end diff --git a/tests/regression/inciter/mesh_refinement/t0ref/unitsquare_01_3.6k.exo b/tests/regression/inciter/restart/unitsquare_01_3.6k.exo similarity index 100% rename from tests/regression/inciter/mesh_refinement/t0ref/unitsquare_01_3.6k.exo rename to tests/regression/inciter/restart/unitsquare_01_3.6k.exo diff --git a/tests/regression/inciter/transport/CylAdvect/CMakeLists.txt b/tests/regression/inciter/transport/CylAdvect/CMakeLists.txt index a47f3c86420..348d8d2fb4a 100644 --- a/tests/regression/inciter/transport/CylAdvect/CMakeLists.txt +++ b/tests/regression/inciter/transport/CylAdvect/CMakeLists.txt @@ -51,7 +51,7 @@ add_regression_test(cyl_advect_dgp1_lbfreq5_migr ${INCITER_EXECUTABLE} NUMPES 4 INPUTFILES cyl_advect_dgp1.q unitsquare_01_3.6k.exo ARGS -c cyl_advect_dgp1.q -i unitsquare_01_3.6k.exo -v - -l 5 -n +balancer RandCentLB +LBDebug 1 + -l 5 +balancer RandCentLB +LBDebug 1 BIN_BASELINE cyl_advect_dgp1_pe4_u0.0.std.exo.0 cyl_advect_dgp1_pe4_u0.0.std.exo.1 cyl_advect_dgp1_pe4_u0.0.std.exo.2 diff --git a/tests/regression/inciter/transport/GaussHump/CMakeLists.txt b/tests/regression/inciter/transport/GaussHump/CMakeLists.txt index 44aa551a010..7cde750c4b5 100644 --- a/tests/regression/inciter/transport/GaussHump/CMakeLists.txt +++ b/tests/regression/inciter/transport/GaussHump/CMakeLists.txt @@ -15,6 +15,18 @@ add_regression_test(gauss_hump_dg ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) +add_regression_test(gauss_hump_p0p1 ${INCITER_EXECUTABLE} + NUMPES 1 + INPUTFILES gauss_hump_p0p1.q unitsquare_01_3.6k.exo + ARGS -c gauss_hump_p0p1.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE gauss_hump_p0p1.std.exo + BIN_RESULT out.e-s.0.1.0 + BIN_DIFF_PROG_CONF exodiff.cfg + BIN_DIFF_PROG_ARGS -m + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) + add_regression_test(gauss_hump_dgp1 ${INCITER_EXECUTABLE} NUMPES 1 INPUTFILES gauss_hump_dgp1.q unitsquare_01_3.6k.exo @@ -69,6 +81,24 @@ add_regression_test(gauss_hump_dg ${INCITER_EXECUTABLE} TEXT_RESULT diag TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) +add_regression_test(gauss_hump_p0p1 ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES gauss_hump_p0p1.q unitsquare_01_3.6k.exo + ARGS -c gauss_hump_p0p1.q -i unitsquare_01_3.6k.exo -v + BIN_BASELINE gauss_hump_p0p1_pe4_u0.0.std.exo.0 + gauss_hump_p0p1_pe4_u0.0.std.exo.1 + gauss_hump_p0p1_pe4_u0.0.std.exo.2 + gauss_hump_p0p1_pe4_u0.0.std.exo.3 + BIN_RESULT out.e-s.0.4.0 + out.e-s.0.4.1 + out.e-s.0.4.2 + out.e-s.0.4.3 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff.cfg + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) + add_regression_test(gauss_hump_dgp1 ${INCITER_EXECUTABLE} NUMPES 4 INPUTFILES gauss_hump_dgp1.q unitsquare_01_3.6k.exo @@ -189,8 +219,97 @@ add_regression_test(gauss_hump_pdg_u0.8 ${INCITER_EXECUTABLE} BIN_DIFF_PROG_CONF exodiff.cfg TEXT_BASELINE diag_pdg.std TEXT_RESULT diag - TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg - LABELS migration) + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) + +add_regression_test(gauss_hump_p0p1_u0.9 ${INCITER_EXECUTABLE} + NUMPES 4 + INPUTFILES gauss_hump_p0p1.q unitsquare_01_3.6k.exo + ARGS -c gauss_hump_p0p1.q -i unitsquare_01_3.6k.exo -v -u 0.9 + BIN_BASELINE gauss_hump_p0p1_pe4_u0.9.std.exo.0 + gauss_hump_p0p1_pe4_u0.9.std.exo.1 + gauss_hump_p0p1_pe4_u0.9.std.exo.2 + gauss_hump_p0p1_pe4_u0.9.std.exo.3 + gauss_hump_p0p1_pe4_u0.9.std.exo.4 + gauss_hump_p0p1_pe4_u0.9.std.exo.5 + gauss_hump_p0p1_pe4_u0.9.std.exo.6 + gauss_hump_p0p1_pe4_u0.9.std.exo.7 + gauss_hump_p0p1_pe4_u0.9.std.exo.8 + gauss_hump_p0p1_pe4_u0.9.std.exo.9 + gauss_hump_p0p1_pe4_u0.9.std.exo.10 + gauss_hump_p0p1_pe4_u0.9.std.exo.11 + gauss_hump_p0p1_pe4_u0.9.std.exo.12 + gauss_hump_p0p1_pe4_u0.9.std.exo.13 + gauss_hump_p0p1_pe4_u0.9.std.exo.14 + gauss_hump_p0p1_pe4_u0.9.std.exo.15 + gauss_hump_p0p1_pe4_u0.9.std.exo.16 + gauss_hump_p0p1_pe4_u0.9.std.exo.17 + gauss_hump_p0p1_pe4_u0.9.std.exo.18 + gauss_hump_p0p1_pe4_u0.9.std.exo.19 + gauss_hump_p0p1_pe4_u0.9.std.exo.20 + gauss_hump_p0p1_pe4_u0.9.std.exo.21 + gauss_hump_p0p1_pe4_u0.9.std.exo.22 + gauss_hump_p0p1_pe4_u0.9.std.exo.23 + gauss_hump_p0p1_pe4_u0.9.std.exo.24 + gauss_hump_p0p1_pe4_u0.9.std.exo.25 + gauss_hump_p0p1_pe4_u0.9.std.exo.26 + gauss_hump_p0p1_pe4_u0.9.std.exo.27 + gauss_hump_p0p1_pe4_u0.9.std.exo.28 + gauss_hump_p0p1_pe4_u0.9.std.exo.29 + gauss_hump_p0p1_pe4_u0.9.std.exo.30 + gauss_hump_p0p1_pe4_u0.9.std.exo.31 + gauss_hump_p0p1_pe4_u0.9.std.exo.32 + gauss_hump_p0p1_pe4_u0.9.std.exo.33 + gauss_hump_p0p1_pe4_u0.9.std.exo.34 + gauss_hump_p0p1_pe4_u0.9.std.exo.35 + gauss_hump_p0p1_pe4_u0.9.std.exo.36 + gauss_hump_p0p1_pe4_u0.9.std.exo.37 + gauss_hump_p0p1_pe4_u0.9.std.exo.38 + gauss_hump_p0p1_pe4_u0.9.std.exo.39 + BIN_RESULT out.e-s.0.40.0 + out.e-s.0.40.1 + out.e-s.0.40.2 + out.e-s.0.40.3 + out.e-s.0.40.4 + out.e-s.0.40.5 + out.e-s.0.40.6 + out.e-s.0.40.7 + out.e-s.0.40.8 + out.e-s.0.40.9 + out.e-s.0.40.10 + out.e-s.0.40.11 + out.e-s.0.40.12 + out.e-s.0.40.13 + out.e-s.0.40.14 + out.e-s.0.40.15 + out.e-s.0.40.16 + out.e-s.0.40.17 + out.e-s.0.40.18 + out.e-s.0.40.19 + out.e-s.0.40.20 + out.e-s.0.40.21 + out.e-s.0.40.22 + out.e-s.0.40.23 + out.e-s.0.40.24 + out.e-s.0.40.25 + out.e-s.0.40.26 + out.e-s.0.40.27 + out.e-s.0.40.28 + out.e-s.0.40.29 + out.e-s.0.40.30 + out.e-s.0.40.31 + out.e-s.0.40.32 + out.e-s.0.40.33 + out.e-s.0.40.34 + out.e-s.0.40.35 + out.e-s.0.40.36 + out.e-s.0.40.37 + out.e-s.0.40.38 + out.e-s.0.40.39 + BIN_DIFF_PROG_ARGS -m + BIN_DIFF_PROG_CONF exodiff.cfg + TEXT_BASELINE diag_p0p1.std + TEXT_RESULT diag + TEXT_DIFF_PROG_CONF gauss_hump_diag.ndiff.cfg) # Parallel + virtualization + migration diff --git a/tests/regression/inciter/transport/GaussHump/diag_p0p1.std b/tests/regression/inciter/transport/GaussHump/diag_p0p1.std new file mode 100644 index 00000000000..be863f3598e --- /dev/null +++ b/tests/regression/inciter/transport/GaussHump/diag_p0p1.std @@ -0,0 +1,26 @@ +# 1:it 2:t 3:dt 4:L2(c0) 5:L2(c0-IC) + 2 4.000000e-03 2.000000e-03 1.252236e-01 1.673119e-04 + 4 8.000000e-03 2.000000e-03 1.252164e-01 3.219423e-04 + 6 1.200000e-02 2.000000e-03 1.252088e-01 4.694162e-04 + 8 1.600000e-02 2.000000e-03 1.252010e-01 6.128990e-04 + 10 2.000000e-02 2.000000e-03 1.251930e-01 7.542163e-04 + 12 2.400000e-02 2.000000e-03 1.251847e-01 8.956572e-04 + 14 2.800000e-02 2.000000e-03 1.251762e-01 1.038172e-03 + 16 3.200000e-02 2.000000e-03 1.251676e-01 1.182066e-03 + 18 3.600000e-02 2.000000e-03 1.251587e-01 1.327598e-03 + 20 4.000000e-02 2.000000e-03 1.251497e-01 1.474908e-03 + 22 4.400000e-02 2.000000e-03 1.251406e-01 1.624378e-03 + 24 4.800000e-02 2.000000e-03 1.251313e-01 1.773841e-03 + 26 5.200000e-02 2.000000e-03 1.251218e-01 1.922495e-03 + 28 5.600000e-02 2.000000e-03 1.251124e-01 2.069982e-03 + 30 6.000000e-02 2.000000e-03 1.251028e-01 2.216285e-03 + 32 6.400000e-02 2.000000e-03 1.250932e-01 2.361742e-03 + 34 6.800000e-02 2.000000e-03 1.250834e-01 2.506047e-03 + 36 7.200000e-02 2.000000e-03 1.250737e-01 2.648934e-03 + 38 7.600000e-02 2.000000e-03 1.250637e-01 2.789377e-03 + 40 8.000000e-02 2.000000e-03 1.250537e-01 2.926143e-03 + 42 8.400000e-02 2.000000e-03 1.250435e-01 3.059008e-03 + 44 8.800000e-02 2.000000e-03 1.250332e-01 3.188221e-03 + 46 9.200000e-02 2.000000e-03 1.250228e-01 3.314177e-03 + 48 9.600000e-02 2.000000e-03 1.250124e-01 3.437249e-03 + 50 1.000000e-01 2.000000e-03 1.250021e-01 3.557807e-03 diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.q b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.q new file mode 100644 index 00000000000..9a82155ce82 --- /dev/null +++ b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.q @@ -0,0 +1,42 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Advection of 2D Gaussian hump" + +inciter + + nstep 50 # Max number of time steps + dt 2.0e-3 # Time step size + ttyi 1 # TTY output interval + scheme p0p1 + limiter superbeep1 + + transport + physics advection + problem gauss_hump + ncomp 1 + depvar c + + bc_extrapolate + sideset 1 end + end + bc_inlet + sideset 2 end + end + bc_outlet + sideset 3 end + end + end + + diagnostics + interval 2 + format scientific + error l2 + end + + plotvar + interval 10 + end + +end diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.std.exo b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.std.exo new file mode 100644 index 00000000000..5b503958eb0 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1.std.exo differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.0 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.0 new file mode 100644 index 00000000000..38028897851 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.0 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.1 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.1 new file mode 100644 index 00000000000..25e8063a243 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.1 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.2 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.2 new file mode 100644 index 00000000000..a3233d7ca24 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.2 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.3 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.3 new file mode 100644 index 00000000000..397839a6adf Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.0.std.exo.3 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.0 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.0 new file mode 100644 index 00000000000..f3c267691af Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.0 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.1 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.1 new file mode 100644 index 00000000000..9a5e7cb0a0e Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.1 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.10 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.10 new file mode 100644 index 00000000000..3add97e797e Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.10 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.11 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.11 new file mode 100644 index 00000000000..0e9281e295a Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.11 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.12 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.12 new file mode 100644 index 00000000000..df0729bbb8e Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.12 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.13 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.13 new file mode 100644 index 00000000000..e54756b6a99 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.13 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.14 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.14 new file mode 100644 index 00000000000..3562d47db0f Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.14 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.15 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.15 new file mode 100644 index 00000000000..609a8929088 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.15 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.16 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.16 new file mode 100644 index 00000000000..239895a78a1 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.16 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.17 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.17 new file mode 100644 index 00000000000..58362f6808c Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.17 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.18 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.18 new file mode 100644 index 00000000000..e519ca99c92 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.18 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.19 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.19 new file mode 100644 index 00000000000..239e7825655 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.19 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.2 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.2 new file mode 100644 index 00000000000..e74293b6560 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.2 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.20 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.20 new file mode 100644 index 00000000000..07ff5095187 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.20 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.21 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.21 new file mode 100644 index 00000000000..ce99cb38297 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.21 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.22 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.22 new file mode 100644 index 00000000000..fe962e37e5f Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.22 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.23 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.23 new file mode 100644 index 00000000000..a8332774288 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.23 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.24 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.24 new file mode 100644 index 00000000000..8713aa73e11 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.24 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.25 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.25 new file mode 100644 index 00000000000..72ad37fa4ff Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.25 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.26 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.26 new file mode 100644 index 00000000000..edbcbd18db1 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.26 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.27 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.27 new file mode 100644 index 00000000000..721254b0007 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.27 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.28 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.28 new file mode 100644 index 00000000000..4ab5c725eaf Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.28 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.29 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.29 new file mode 100644 index 00000000000..9e6f9e0e8a0 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.29 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.3 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.3 new file mode 100644 index 00000000000..94a899f3f28 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.3 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.30 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.30 new file mode 100644 index 00000000000..07b3b5c8df8 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.30 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.31 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.31 new file mode 100644 index 00000000000..98a02a81484 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.31 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.32 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.32 new file mode 100644 index 00000000000..ae9d10500d9 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.32 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.33 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.33 new file mode 100644 index 00000000000..0ab62c56746 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.33 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.34 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.34 new file mode 100644 index 00000000000..de03891ab15 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.34 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.35 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.35 new file mode 100644 index 00000000000..81ab89b7396 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.35 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.36 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.36 new file mode 100644 index 00000000000..3b5aaee3540 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.36 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.37 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.37 new file mode 100644 index 00000000000..f839d439de8 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.37 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.38 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.38 new file mode 100644 index 00000000000..cb46ff74cdf Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.38 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.39 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.39 new file mode 100644 index 00000000000..804c560de06 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.39 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.4 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.4 new file mode 100644 index 00000000000..eef7851222f Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.4 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.5 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.5 new file mode 100644 index 00000000000..7d21baa4daf Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.5 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.6 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.6 new file mode 100644 index 00000000000..f78da018710 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.6 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.7 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.7 new file mode 100644 index 00000000000..be73ebb4784 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.7 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.8 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.8 new file mode 100644 index 00000000000..f27ad1f225b Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.8 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.9 b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.9 new file mode 100644 index 00000000000..83d33d061c7 Binary files /dev/null and b/tests/regression/inciter/transport/GaussHump/gauss_hump_p0p1_pe4_u0.9.std.exo.9 differ diff --git a/tests/regression/inciter/transport/GaussHump/gauss_hump_pdg.q b/tests/regression/inciter/transport/GaussHump/gauss_hump_pdg.q index 0f2ac605a69..3457924f2b8 100644 --- a/tests/regression/inciter/transport/GaussHump/gauss_hump_pdg.q +++ b/tests/regression/inciter/transport/GaussHump/gauss_hump_pdg.q @@ -28,6 +28,10 @@ inciter end end + pref + tolref 0.1 + end + diagnostics interval 10 format scientific diff --git a/tests/regression/rngtest/CMakeLists.txt b/tests/regression/rngtest/CMakeLists.txt index b7a42b547a9..97dfa6e8f92 100644 --- a/tests/regression/rngtest/CMakeLists.txt +++ b/tests/regression/rngtest/CMakeLists.txt @@ -44,7 +44,7 @@ add_regression_test(BigCrush_r123_philox ${RNGTEST_EXECUTABLE} NUMPES ${PROCESSOR_COUNT} INPUTFILES BigCrush_r123_philox.q ARGS -c BigCrush_r123_philox.q -v - LABELS extreme stringent) + LABELS insane extreme stringent) add_regression_test(SmallCrush_all_r123 ${RNGTEST_EXECUTABLE} NUMPES 8 diff --git a/tests/regression/walker/MixDirichlet/CMakeLists.txt b/tests/regression/walker/MixDirichlet/CMakeLists.txt new file mode 100644 index 00000000000..1e22211d789 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/CMakeLists.txt @@ -0,0 +1,121 @@ +# See cmake/add_regression_test.cmake for documentation on the arguments to +# add_regression_test(). + +# Prescribe constant SDE coefficients, The PDF must not change in time. Only +# testing a single marginal. The PDF should not change because of constant +# coefficients for S_alpha, b_alpha, and kappa_alpha. + +add_regression_test(MixDirichlet_constpdf_nomix ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_constpdf_nomix.q + ARGS -c mixdir_constpdf_nomix.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_nomix.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +add_regression_test(MixDirichlet_constpdf_ijsa ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_constpdf_ijsa.q + ARGS -c mixdir_constpdf_ijsa.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_ijsa.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +# Constrain S_alpha to force d/dt = 0. The PDF must not change in time +# because b_alpha and kappa_alpha are consistent with the omega_alpha of the +# initial Dirichlet PDF, and (interestingly), the specification for S_alpha to +# force d/dt = 0, yields the S_alpha that would be required to leave the +# PDF unchanged. Using heavy-fluid normalization. + +add_regression_test(MixDirichlet_homogeneous_nomix_heavy ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_nomix_heavy.q + ARGS -c mixdir_homogeneous_nomix_heavy.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_nomix.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +add_regression_test(MixDirichlet_homogeneous_ijsa_heavy ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_ijsa_heavy.q + ARGS -c mixdir_homogeneous_ijsa_heavy.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_ijsa.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +# Constrain S_alpha to force d/dt = 0. The PDF must not change in time +# because b_alpha and kappa_alpha are consistent with the omega_alpha of the +# initial Dirichlet PDF, and interestingly, the specification for S_alpha to +# force d/dt = 0, yields the S_alpha that would be required to leave the +# PDF unchanged. Using light-fluid normalization. + +# Compared to the same tests using heavy-fluid normalization, light-fluid +# normalization yields a different but still constant in time. This is, +# however, not tested by the following tests, only one of the marginal PDFs, +# thus comparing to the same baseline as the above tests. + +add_regression_test(MixDirichlet_homogeneous_nomix_light ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_nomix_light.q + ARGS -c mixdir_homogeneous_nomix_light.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_nomix.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +add_regression_test(MixDirichlet_homogeneous_ijsa_light ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_ijsa_light.q + ARGS -c mixdir_homogeneous_ijsa_light.q -v + POSTPROCESS_PROG sort + POSTPROCESS_PROG_ARGS -g pdf_p1.txt COMMAND grep -v \# + POSTPROCESS_PROG_OUTPUT pdf_p1_sorted.txt + TEXT_BASELINE p1_analytic_ijsa.txt + TEXT_RESULT pdf_p1_sorted.txt + TEXT_DIFF_PROG_CONF mixdir.pdf.ndiff.cfg + LABELS verification) + +# Constrain S_alpha to force d/dt = 0. The PDF now changes in time because +# we start from an initial Dirichlet PDF, given by omega_alpha that does not +# correspond to those specified by b_alpha, and kappa_alpha. Still d. Using heavy-, and light-fluid normalization. Note +# that the value of is (correctly) different between heavy-, vs +# light-fluid normalization, but still must be constant in time. + +add_regression_test(MixDirichlet_homogeneous_evolving_pdf_heavy + ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_evolving_pdf_heavy.q + ARGS -c mixdir_homogeneous_evolving_pdf_heavy.q -v + TEXT_BASELINE stat_evolving_pdf_heavy.txt.std + TEXT_RESULT stat.txt + TEXT_DIFF_PROG_CONF mixdir.stat.ndiff.cfg) + +add_regression_test(MixDirichlet_homogeneous_evolving_pdf_light + ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES mixdir_homogeneous_evolving_pdf_light.q + ARGS -c mixdir_homogeneous_evolving_pdf_light.q -v + TEXT_BASELINE stat_evolving_pdf_light.txt.std + TEXT_RESULT stat.txt + TEXT_DIFF_PROG_CONF mixdir.stat.ndiff.cfg) diff --git a/tests/regression/walker/MixDirichlet/mixdir.pdf.ndiff.cfg b/tests/regression/walker/MixDirichlet/mixdir.pdf.ndiff.cfg new file mode 100644 index 00000000000..b7da322e138 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir.pdf.ndiff.cfg @@ -0,0 +1,3 @@ +#rows cols constraints +* 1 any rel=0.01 # sample space coordinate +* * any rel=0.15 abs=0.4 # probability diff --git a/tests/regression/walker/MixDirichlet/mixdir.stat.ndiff.cfg b/tests/regression/walker/MixDirichlet/mixdir.stat.ndiff.cfg new file mode 100644 index 00000000000..c277f9e8798 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir.stat.ndiff.cfg @@ -0,0 +1,5 @@ +#rows cols constraints +* 1-2 # iteration and time step, no constraint: smallest representable float +* 3-5 rel=1.0e-1 # tolerance for mean mass fractions +* 6 rel=1.0e-2 # tolerance for mean density +* 7-$ ign # don't bother with any other statistics saved diff --git a/tests/regression/walker/MixDirichlet/mixdir_constpdf_ijsa.q b/tests/regression/walker/MixDirichlet/mixdir_constpdf_ijsa.q new file mode 100644 index 00000000000..21711c8f8b0 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_constpdf_ijsa.q @@ -0,0 +1,72 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet holding Dirichlet IC constant in time" + +walker + nstep 300 + #term 1.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + 5.0 2.0 3.0 # IJSA paper + #0.011834 0.035503 0.106509 + end + end + + coeff const_coeff + + # IJSA paper + b 0.1 1.5 end + S 0.625 0.4 end + kappaprime 0.0125 0.3 end + + #kappaprime + # 1.0 1.0 + #end + #b + # 0.11834 0.14201 + #end + #S + # 0.1 0.25 + #end + + normalization light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mass fractions covariance matrix + + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_constpdf_nomix.q b/tests/regression/walker/MixDirichlet/mixdir_constpdf_nomix.q new file mode 100644 index 00000000000..efd0573264f --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_constpdf_nomix.q @@ -0,0 +1,72 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet holding Dirichlet IC constant in time" + +walker + nstep 300 + #term 1.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + #5.0 2.0 3.0 # IJSA paper + 0.011834 0.035503 0.106509 + end + end + + coeff const_coeff + + # IJSA paper + #b 0.1 1.5 end + #S 0.625 0.4 end + #kappaprime 0.0125 0.3 end + + kappaprime + 1.0 1.0 + end + b + 0.11834 0.14201 + end + S + 0.1 0.25 + end + + normalization light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mass fractions covariance matrix + + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_heavy.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_heavy.q new file mode 100644 index 00000000000..56f1c7630f0 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_heavy.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + 0.011834 0.035503 0.106509 + #5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + b 0.1 1.5 end + S 0.625 0.4 end + kappaprime 0.0125 0.3 end + + #kappaprime + # 1.0 1.0 + #end + #b + # 0.11834 0.14201 + #end + #S + # 0.1 0.25 + #end + + normalization heavy #light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + #pdfs + # interval 1000 + # filetype txt + # policy overwrite + # centering elem + # format scientific + # precision 8 + # p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + # #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + #end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_light.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_light.q new file mode 100644 index 00000000000..70a4d021b87 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_evolving_pdf_light.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + 0.011834 0.035503 0.106509 + #5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + b 0.1 1.5 end + S 0.625 0.4 end + kappaprime 0.0125 0.3 end + + #kappaprime + # 1.0 1.0 + #end + #b + # 0.11834 0.14201 + #end + #S + # 0.1 0.25 + #end + + normalization light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + #pdfs + # interval 1000 + # filetype txt + # policy overwrite + # centering elem + # format scientific + # precision 8 + # p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + # #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + #end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_heavy.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_heavy.q new file mode 100644 index 00000000000..4381eef0b66 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_heavy.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + #0.011834 0.035503 0.106509 + 5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + b 0.1 1.5 end + S 0.625 0.4 end + kappaprime 0.0125 0.3 end + + #kappaprime + # 1.0 1.0 + #end + #b + # 0.11834 0.14201 + #end + #S + # 0.1 0.25 + #end + + normalization heavy #light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_light.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_light.q new file mode 100644 index 00000000000..12ba6fda0b6 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_ijsa_light.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + #0.011834 0.035503 0.106509 + 5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + b 0.1 1.5 end + S 0.625 0.4 end + kappaprime 0.0125 0.3 end + + #kappaprime + # 1.0 1.0 + #end + #b + # 0.11834 0.14201 + #end + #S + # 0.1 0.25 + #end + + normalization light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_heavy.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_heavy.q new file mode 100644 index 00000000000..a22a0edc6ca --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_heavy.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + 0.011834 0.035503 0.106509 + #5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + #b 0.1 1.5 end + #S 0.625 0.4 end + #kappaprime 0.0125 0.3 end + + kappaprime + 1.0 1.0 + end + b + 0.11834 0.14201 + end + S + 0.1 0.25 + end + + normalization heavy #light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_light.q b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_light.q new file mode 100644 index 00000000000..eb0e0f026bd --- /dev/null +++ b/tests/regression/walker/MixDirichlet/mixdir_homogeneous_nomix_light.q @@ -0,0 +1,94 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Mixture Dirichlet forcing d/dt=0 constaining S" + +walker + nstep 300 + #term 10.0 # Max time + dt 0.001 # Time step size + npar 50000 # Number of particles + ttyi 100 # TTY output interval + + rngs + r123_threefry end + end + + mixdirichlet + depvar y + ncomp 5 # = N+2 = K+3 + + init jointdirichlet + icdirichlet + dirichletpdf + 0.011834 0.035503 0.106509 + #5.0 2.0 3.0 # IJSA paper + end + end + + coeff homogeneous + + # IJSA paper + #b 0.1 1.5 end + #S 0.625 0.4 end + #kappaprime 0.0125 0.3 end + + kappaprime + 1.0 1.0 + end + b + 0.11834 0.14201 + end + S + 0.1 0.25 + end + + normalization light + # rho in arbitrary order, will be sorted + rho 1.0 3.0 9.0 end # need N = K+1 + + rng r123_threefry + end + + statistics + interval 1 + precision 8 #max + # mean mass fractions + + # mean density + + # mean specific volume + + # mass fractions covariance matrix + + # density variance + + # density third moment + + # density-specific-volume covariance + # for b = - + # for b. = -/ + # other statistics, needed for the model + # + # + # + # + # + + + # + # + end + + pdfs + interval 1000 + filetype txt + policy overwrite + centering elem + format scientific + precision 8 + p1( Y1 : 1.0e-2 ; 0.01 0.99 ) + #p2( Y2 : 1.0e-2 ; 0.01 0.99 ) + end +end diff --git a/tests/regression/walker/MixDirichlet/p1_analytic_ijsa.txt b/tests/regression/walker/MixDirichlet/p1_analytic_ijsa.txt new file mode 100644 index 00000000000..3cc4bb3ac22 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/p1_analytic_ijsa.txt @@ -0,0 +1,98 @@ + 0.010101 6.29743e-06 + 0.020202 9.67088e-05 + 0.030303 0.000469709 + 0.040404 0.00142362 + 0.0505051 0.00333158 + 0.0606061 0.00661905 + 0.0707071 0.0117436 + 0.0808081 0.0191772 + 0.0909091 0.02939 + 0.10101 0.042837 + 0.111111 0.059946 + 0.121212 0.0811075 + 0.131313 0.106666 + 0.141414 0.136914 + 0.151515 0.172084 + 0.161616 0.21235 + 0.171717 0.257816 + 0.181818 0.308524 + 0.191919 0.364446 + 0.20202 0.425488 + 0.212121 0.49149 + 0.222222 0.562228 + 0.232323 0.637419 + 0.242424 0.716719 + 0.252525 0.799735 + 0.262626 0.886021 + 0.272727 0.975089 + 0.282828 1.06641 + 0.292929 1.15943 + 0.30303 1.25355 + 0.313131 1.34816 + 0.323232 1.44264 + 0.333333 1.53635 + 0.343434 1.62865 + 0.353535 1.7189 + 0.363636 1.80647 + 0.373737 1.89074 + 0.383838 1.97112 + 0.393939 2.04702 + 0.40404 2.11791 + 0.414141 2.18326 + 0.424242 2.24262 + 0.434343 2.29554 + 0.444444 2.34164 + 0.454545 2.38059 + 0.464646 2.41209 + 0.474747 2.43592 + 0.484848 2.45191 + 0.494949 2.45993 + 0.505051 2.45993 + 0.515152 2.45191 + 0.525253 2.43592 + 0.535354 2.41209 + 0.545455 2.38059 + 0.555556 2.34164 + 0.565657 2.29554 + 0.575758 2.24262 + 0.585859 2.18326 + 0.59596 2.11791 + 0.606061 2.04702 + 0.616162 1.97112 + 0.626263 1.89074 + 0.636364 1.80647 + 0.646465 1.7189 + 0.656566 1.62865 + 0.666667 1.53635 + 0.676768 1.44264 + 0.686869 1.34816 + 0.69697 1.25355 + 0.707071 1.15943 + 0.717172 1.06641 + 0.727273 0.975089 + 0.737374 0.886021 + 0.747475 0.799735 + 0.757576 0.716719 + 0.767677 0.637419 + 0.777778 0.562228 + 0.787879 0.49149 + 0.79798 0.425488 + 0.808081 0.364446 + 0.818182 0.308524 + 0.828283 0.257816 + 0.838384 0.21235 + 0.848485 0.172084 + 0.858586 0.136914 + 0.868687 0.106666 + 0.878788 0.0811075 + 0.888889 0.059946 + 0.89899 0.042837 + 0.909091 0.02939 + 0.919192 0.0191772 + 0.929293 0.0117436 + 0.939394 0.00661905 + 0.949495 0.00333158 + 0.959596 0.00142362 + 0.969697 0.000469709 + 0.979798 9.67088e-05 + 0.989899 6.29743e-06 diff --git a/tests/regression/walker/MixDirichlet/p1_analytic_nomix.txt b/tests/regression/walker/MixDirichlet/p1_analytic_nomix.txt new file mode 100644 index 00000000000..a596c74959f --- /dev/null +++ b/tests/regression/walker/MixDirichlet/p1_analytic_nomix.txt @@ -0,0 +1,98 @@ + 0.010101 1.03575 + 0.020202 0.526754 + 0.030303 0.35601 + 0.040404 0.270336 + 0.0505051 0.218818 + 0.0606061 0.184427 + 0.0707071 0.159845 + 0.0808081 0.141405 + 0.0909091 0.127068 + 0.10101 0.115607 + 0.111111 0.10624 + 0.121212 0.0984481 + 0.131313 0.091868 + 0.141414 0.086242 + 0.151515 0.0813804 + 0.161616 0.077141 + 0.171717 0.073415 + 0.181818 0.0701176 + 0.191919 0.0671819 + 0.20202 0.0645545 + 0.212121 0.0621921 + 0.222222 0.0600591 + 0.232323 0.0581264 + 0.242424 0.0563695 + 0.252525 0.054768 + 0.262626 0.0533046 + 0.272727 0.0519646 + 0.282828 0.0507355 + 0.292929 0.0496064 + 0.30303 0.048568 + 0.313131 0.0476122 + 0.323232 0.0467319 + 0.333333 0.045921 + 0.343434 0.045174 + 0.353535 0.0444862 + 0.363636 0.0438535 + 0.373737 0.0432721 + 0.383838 0.0427387 + 0.393939 0.0422506 + 0.40404 0.0418052 + 0.414141 0.0414003 + 0.424242 0.0410339 + 0.434343 0.0407042 + 0.444444 0.0404099 + 0.454545 0.0401495 + 0.464646 0.0399221 + 0.474747 0.0397266 + 0.484848 0.0395623 + 0.494949 0.0394286 + 0.505051 0.0393251 + 0.515152 0.0392513 + 0.525253 0.0392072 + 0.535354 0.0391927 + 0.545455 0.0392078 + 0.555556 0.0392529 + 0.565657 0.0393283 + 0.575758 0.0394346 + 0.585859 0.0395724 + 0.59596 0.0397427 + 0.606061 0.0399465 + 0.616162 0.040185 + 0.626263 0.0404597 + 0.636364 0.0407723 + 0.646465 0.0411248 + 0.656566 0.0415195 + 0.666667 0.0419588 + 0.676768 0.0424459 + 0.686869 0.0429841 + 0.69697 0.0435774 + 0.707071 0.0442302 + 0.717172 0.0449476 + 0.727273 0.0457358 + 0.737374 0.0466014 + 0.747475 0.0475526 + 0.757576 0.0485988 + 0.767677 0.0497507 + 0.777778 0.0510215 + 0.787879 0.0524264 + 0.79798 0.0539837 + 0.808081 0.0557157 + 0.818182 0.0576492 + 0.828283 0.0598171 + 0.838384 0.0622606 + 0.848485 0.0650313 + 0.858586 0.0681948 + 0.868687 0.0718366 + 0.878788 0.0760694 + 0.888889 0.0810453 + 0.89899 0.0869747 + 0.909091 0.094158 + 0.919192 0.103039 + 0.929293 0.114306 + 0.939394 0.129083 + 0.949495 0.149354 + 0.959596 0.178987 + 0.969697 0.226738 + 0.979798 0.317805 + 0.989899 0.570217 diff --git a/tests/regression/walker/MixDirichlet/stat_evolving_pdf_heavy.txt.std b/tests/regression/walker/MixDirichlet/stat_evolving_pdf_heavy.txt.std new file mode 100644 index 00000000000..d7fb57ff193 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/stat_evolving_pdf_heavy.txt.std @@ -0,0 +1,301 @@ +# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: + 0 0 0.076232274 0.23103474 0.69273299 6.7260795 0.095434331 0.75522291 5.8754223 53.975832 0.16136276 2.6339908 51.180479 0.47276857 0.11776677 0.018681043 0.33632075 10.168669 0.018681043 6.6939001 3.4560875 0.33632075 3.4560875 447.22916 0.23021419 0.060827746 -0.015252058 0.15399466 -0.41731001 -0.79873512 1.2160451 8.7356862 1.6603829 0.90841045 -18.896577 1.6777649 -0.54843892 + 1 0.001 0.076229689 0.23089681 0.6928735 6.7261328 0.0954405 0.75517162 5.8755206 53.972795 0.16140129 2.6355947 51.175799 0.47297466 0.11778456 0.018680252 0.33650985 10.184907 0.018680252 6.6930013 3.4732258 0.33650985 3.4732258 447.13393 0.23018124 0.060821528 -0.015242539 0.15378037 -0.41729051 -0.79787098 1.2151615 8.7319333 1.6605746 0.90662066 -18.890926 1.6775376 -0.54822956 + 2 0.002 0.076223999 0.23075803 0.69301797 6.7261426 0.095435749 0.7551857 5.8755212 53.968769 0.16139496 2.6376775 51.169696 0.47295951 0.11777464 0.018699041 0.33648583 10.203429 0.018699041 6.6930382 3.4916919 0.33648583 3.4916919 447.02382 0.23014534 0.060815213 -0.015231483 0.15354093 -0.41725774 -0.7969257 1.2141834 8.7277743 1.6607497 0.90442276 -18.88176 1.6772048 -0.54799037 + 3 0.003 0.076219683 0.23061011 0.69317021 6.7262289 0.095434797 0.75514638 5.8756477 53.965591 0.16140425 2.6396176 51.164569 0.47303669 0.11777333 0.01870746 0.3365559 10.222644 0.01870746 6.6921269 3.5118101 0.3365559 3.5118101 446.91669 0.23010863 0.060809242 -0.015221489 0.15331585 -0.41723624 -0.79599002 1.2132263 8.7234359 1.6610169 0.90262871 -18.875833 1.6770436 -0.54776332 + 4 0.004 0.076213876 0.23046807 0.69331806 6.7263429 0.095434192 0.75509176 5.875817 53.963169 0.16141563 2.6412961 51.160458 0.47308457 0.11777657 0.018721738 0.33658626 10.239784 0.018721738 6.6910535 3.5300085 0.33658626 3.5300085 446.82482 0.2300719 0.060801525 -0.015211403 0.15310019 -0.41720647 -0.7951155 1.212322 8.7194799 1.661221 0.90094778 -18.870928 1.6768515 -0.54754253 + 5 0.005 0.076209024 0.2303241 0.69346688 6.7264974 0.095436454 0.75500546 5.8760555 53.961478 0.16144352 2.6427255 51.157309 0.47323732 0.11778599 0.018733193 0.33671814 10.255242 0.018733193 6.6897106 3.5467984 0.33671814 3.5467984 446.74492 0.2300356 0.060794595 -0.015201401 0.15288995 -0.41718335 -0.79426901 1.2114524 8.7157101 1.6614574 0.89939352 -18.867228 1.6767163 -0.54733387 + 6 0.006 0.076203389 0.230181 0.69361561 6.7266215 0.095436767 0.75494217 5.8762426 53.959232 0.16146625 2.6443157 51.15345 0.47339407 0.1177895 0.018743049 0.33686152 10.271198 0.018743049 6.6888492 3.5636062 0.33686152 3.5636062 446.65848 0.22999879 0.060787126 -0.015191464 0.15267776 -0.41715459 -0.79339828 1.2105529 8.7117953 1.661672 0.89770562 -18.861691 1.6765319 -0.54711481 + 7 0.007 0.076198669 0.2300601 0.69374123 6.7265257 0.095438632 0.75498264 5.8761044 53.953904 0.16148376 2.6464783 51.145942 0.47350112 0.11779206 0.018758125 0.33695094 10.291063 0.018758125 6.6885883 3.5837168 0.33695094 3.5837168 446.52977 0.22996773 0.06077888 -0.015182965 0.15246527 -0.41711367 -0.7925225 1.2096362 8.7077568 1.6617197 0.89568377 -18.853217 1.676125 -0.54688382 + 8 0.008 0.076197151 0.22992422 0.69387863 6.7265569 0.095443225 0.75494866 5.876165 53.95043 0.16150638 2.6482656 51.140658 0.473613 0.11779862 0.018777746 0.33703663 10.308926 0.018777746 6.6876213 3.6025266 0.33703663 3.6025266 446.42501 0.22993618 0.060773954 -0.015173341 0.15225152 -0.41710124 -0.7916497 1.2087509 8.7038622 1.6619478 0.89390851 -18.847571 1.6759333 -0.54667882 + 9 0.009 0.076194222 0.22980515 0.69400063 6.7264274 0.095444215 0.75500944 5.8759737 53.944833 0.16151129 2.6504616 51.13286 0.47358154 0.11780411 0.01879358 0.33698384 10.327766 0.01879358 6.6880196 3.6209529 0.33698384 3.6209529 446.30003 0.22990712 0.060768745 -0.015165277 0.15203171 -0.41707069 -0.79075821 1.2078289 8.7000076 1.6620181 0.89161651 -18.836629 1.6754864 -0.54645355 + 10 0.01 0.07619041 0.22967412 0.69413547 6.7264222 0.095445664 0.75500623 5.8759703 53.940878 0.16153727 2.6523118 51.127029 0.4737535 0.11780907 0.018804692 0.33713974 10.344871 0.018804692 6.6877486 3.6383176 0.33713974 3.6383176 446.19405 0.22987461 0.060763594 -0.015155809 0.15181149 -0.4170432 -0.78987885 1.2069221 8.6961223 1.662177 0.88960553 -18.828569 1.6751808 -0.5462337 + 11 0.011 0.076186242 0.22954046 0.6942733 6.7264846 0.095442771 0.7549866 5.8760553 53.937864 0.16152492 2.6541491 51.12219 0.47363315 0.11780687 0.01881811 0.33700817 10.362585 0.01881811 6.687106 3.6566605 0.33700817 3.6566605 446.09666 0.22984121 0.060757927 -0.015145712 0.15159623 -0.41702282 -0.78901379 1.2060366 8.6922686 1.6623969 0.8878051 -18.822495 1.6749761 -0.54602335 + 12 0.012 0.076184087 0.22943857 0.69437735 6.7262217 0.095444936 0.75510939 5.8756674 53.930472 0.16151913 2.6566854 51.112267 0.47350175 0.11781208 0.018836888 0.33685278 10.383952 0.018836888 6.6877608 3.6773547 0.33685278 3.6773547 445.94667 0.22981665 0.060751703 -0.015139327 0.15138831 -0.41698613 -0.78814529 1.2051314 8.6884129 1.6623577 0.88543527 -18.810367 1.6744147 -0.54579773 + 13 0.013 0.076178924 0.22931757 0.6945035 6.7261485 0.095441397 0.75516018 5.8755469 53.925327 0.16152077 2.6589213 51.104885 0.47356206 0.11780627 0.018837337 0.33691845 10.404118 0.018837337 6.6877377 3.6975427 0.33691845 3.6975427 445.81907 0.22978517 0.060745538 -0.015130645 0.15117216 -0.41694935 -0.78726386 1.2042132 8.6842543 1.6624738 0.88340329 -18.80171 1.6740664 -0.54556917 + 14 0.014 0.076175967 0.2291595 0.69466453 6.7262188 0.095445931 0.75510686 5.875666 53.92169 0.1615604 2.6608982 51.099231 0.47383747 0.11781272 0.018852153 0.33717259 10.42371 0.018852153 6.6867783 3.7180797 0.33717259 3.7180797 445.70429 0.22974742 0.060739693 -0.01511912 0.15093406 -0.41693029 -0.78627009 1.2032004 8.6796701 1.6627523 0.88148003 -18.794718 1.6738865 -0.54533139 + 15 0.015 0.076170438 0.22902829 0.69480127 6.7261374 0.095442627 0.75516078 5.875534 53.916164 0.16154507 2.6633563 51.091262 0.47369728 0.11780777 0.018873111 0.3370164 10.445818 0.018873111 6.6867017 3.7402434 0.3370164 3.7402434 445.56748 0.22971334 0.060731527 -0.015107819 0.15069943 -0.41689021 -0.78531497 1.2022052 8.675239 1.6628489 0.87930235 -18.784967 1.6734885 -0.54508351 + 16 0.016 0.076165539 0.22891103 0.69492343 6.7260717 0.095442045 0.75519595 5.8754337 53.911206 0.16155879 2.6654848 51.084162 0.47381602 0.11780631 0.018881314 0.3371284 10.465822 0.018881314 6.6862451 3.7606961 0.3371284 3.7606961 445.44122 0.22968293 0.060724417 -0.015099526 0.15049789 -0.41685283 -0.78447606 1.2013289 8.6711647 1.6629469 0.87749965 -18.777711 1.6731749 -0.54486386 + 17 0.017 0.076162548 0.22878002 0.69505743 6.7260272 0.095443705 0.75521158 5.8753719 53.906378 0.16157329 2.66764 51.077165 0.47389724 0.11780859 0.018896837 0.33719181 10.486232 0.018896837 6.6856764 3.781659 0.33719181 3.781659 445.31478 0.22965116 0.060718951 -0.015090879 0.1502812 -0.41682766 -0.78356908 1.2003967 8.6669367 1.6631145 0.87555126 -18.770107 1.672891 -0.54463994 + 18 0.018 0.076155827 0.22864307 0.6952011 6.7261011 0.095444786 0.75517031 5.875486 53.903481 0.16160606 2.6692903 51.072584 0.47414206 0.11781447 0.018898352 0.33742924 10.502427 0.018898352 6.6849993 3.7985297 0.33742924 3.7985297 445.22081 0.22961475 0.060709401 -0.01508102 0.15006767 -0.416787 -0.7827061 1.1994931 8.6630449 1.663245 0.87375359 -18.763956 1.6726074 -0.54441202 + 19 0.019 0.076152299 0.22850834 0.69533937 6.7260314 0.095446894 0.75519674 5.8753877 53.898209 0.16163052 2.6715146 51.065064 0.47431294 0.11781566 0.018918219 0.33757906 10.522338 0.018918219 6.684974 3.8184455 0.33757906 3.8184455 445.09203 0.22958167 0.060703414 -0.015071447 0.1498398 -0.41675586 -0.78175748 1.1985133 8.658711 1.6633839 0.87157535 -18.753866 1.6722469 -0.54417354 + 20 0.02 0.076150302 0.22836668 0.69548302 6.7261362 0.095446033 0.75514777 5.8755424 53.895992 0.16161509 2.6731566 51.06122 0.47412956 0.11781681 0.018935882 0.33737686 10.538098 0.018935882 6.6844122 3.8347499 0.33737686 3.8347499 445.01034 0.22954842 0.060699347 -0.015061166 0.14961997 -0.41675127 -0.78087765 1.1976289 8.6550837 1.6636706 0.86968654 -18.747631 1.672082 -0.54397394 + 21 0.021 0.076148982 0.22825346 0.69559755 6.7260399 0.095450624 0.75517754 5.8754118 53.891414 0.16163355 2.6749387 51.054841 0.47418545 0.11782579 0.018955093 0.33740457 10.553527 0.018955093 6.6846403 3.8499312 0.33740457 3.8499312 444.90714 0.22952209 0.060694817 -0.015054233 0.14941556 -0.41673047 -0.78006437 1.1967948 8.6518005 1.6637488 0.86752507 -18.738325 1.6716712 -0.54377472 + 22 0.022 0.076144502 0.22814079 0.69571471 6.7259384 0.095451075 0.75522648 5.8752609 53.886112 0.1616446 2.6770884 51.047379 0.47421635 0.11782788 0.018981009 0.33740747 10.573134 0.018981009 6.6844064 3.8697469 0.33740747 3.8697469 444.78051 0.22949307 0.06068802 -0.015045582 0.14921404 -0.41669215 -0.77923443 1.1959266 8.6478645 1.663805 0.86563376 -18.729671 1.6713008 -0.54355623 + 23 0.023 0.076141703 0.2280127 0.69584559 6.7258293 0.095452747 0.75527434 5.8751023 53.880352 0.16165419 2.6794395 51.039258 0.47426177 0.11782876 0.018997937 0.33743507 10.594346 0.018997937 6.684313 3.8910348 0.33743507 3.8910348 444.6433 0.22946211 0.060682359 -0.015036106 0.14898888 -0.41666335 -0.77830019 1.1949635 8.6435713 1.6639257 0.86346335 -18.720042 1.6709258 -0.54332302 + 24 0.024 0.07614082 0.22788972 0.69596946 6.7257835 0.09545767 0.75527756 5.8750483 53.876073 0.16167485 2.6812901 51.033108 0.47433686 0.11783779 0.01901725 0.33748182 10.611754 0.01901725 6.6838597 3.9088766 0.33748182 3.9088766 444.534 0.229434 0.060678365 -0.015028237 0.1487838 -0.416649 -0.77745934 1.1941083 8.6399087 1.6640885 0.86153357 -18.712661 1.6706417 -0.54312341 + 25 0.025 0.076134436 0.22776961 0.69609595 6.7257503 0.095456982 0.7552969 5.8749965 53.871584 0.16170649 2.6832588 51.026618 0.47461207 0.11783666 0.019026544 0.33774886 10.62994 0.019026544 6.6835886 3.927325 0.33774886 3.927325 444.41785 0.22940163 0.060670311 -0.015019299 0.14858092 -0.41660423 -0.77662465 1.1932289 8.6358658 1.6641759 0.85971618 -18.704701 1.6703155 -0.54289813 + 26 0.026 0.076129821 0.22764147 0.69622871 6.7257618 0.095455753 0.7552961 5.8750099 53.86785 0.16171522 2.6851423 51.020992 0.47466748 0.11783861 0.019030307 0.33779857 10.647354 0.019030307 6.6833421 3.9449811 0.33779857 3.9449811 444.3138 0.22936906 0.060663966 -0.015009967 0.14837039 -0.41657529 -0.77576621 1.1923415 8.6319782 1.6643377 0.85782316 -18.696983 1.6700387 -0.54268164 + 27 0.027 0.076126564 0.22752001 0.69635343 6.7256711 0.095458148 0.75533187 5.8748811 53.862652 0.16174187 2.6872263 51.013684 0.47483183 0.11784534 0.019041171 0.33794533 10.666237 0.019041171 6.6832348 3.9639613 0.33794533 3.9639613 444.18977 0.22933917 0.060658852 -0.015001009 0.14815409 -0.41654408 -0.77489288 1.191437 8.6280007 1.6644402 0.85574439 -18.687932 1.6696678 -0.54245983 + 28 0.028 0.076121827 0.22740132 0.69647685 6.7255792 0.095455156 0.75538979 5.8747342 53.857363 0.16173114 2.6895002 51.006132 0.47474274 0.11784096 0.019054892 0.33784689 10.68629 0.019054892 6.6833867 3.983848 0.33784689 3.983848 444.06302 0.22930859 0.060652364 -0.014991754 0.14794068 -0.41650822 -0.77401583 1.1905241 8.6239477 1.6645283 0.85367405 -18.6783 1.669286 -0.54223305 + 29 0.029 0.076119881 0.22729213 0.69658798 6.7254627 0.095457232 0.75543972 5.8745658 53.851854 0.16175065 2.6916524 50.998451 0.47488948 0.1178416 0.019066776 0.33798111 10.705833 0.019066776 6.683252 4.0035143 0.33798111 4.0035143 443.93369 0.22928259 0.060648311 -0.014983506 0.14774879 -0.41648419 -0.77320506 1.1896892 8.6200058 1.6646517 0.85187295 -18.669786 1.6689955 -0.54203151 + 30 0.03 0.076114445 0.22715388 0.69673168 6.7255418 0.095455277 0.755408 5.8746785 53.848781 0.16175965 2.6935088 50.993513 0.4749726 0.11783309 0.019099771 0.33803974 10.723999 0.019099771 6.6823908 4.0225086 0.33803974 4.0225086 443.83173 0.22924703 0.060640901 -0.014972049 0.14753217 -0.4164556 -0.7723249 1.1887805 8.6158689 1.6648687 0.85015609 -18.66375 1.6688068 -0.54181051 + 31 0.031 0.076107866 0.2270301 0.69686203 6.7255428 0.095452996 0.75541662 5.8746732 53.845196 0.16175626 2.6953196 50.98812 0.47491806 0.11783247 0.019114264 0.33797132 10.739985 0.019114264 6.6824887 4.0383821 0.33797132 4.0383821 443.73619 0.22921368 0.060631331 -0.014962739 0.14732173 -0.41641371 -0.77148403 1.1878977 8.61227 1.6649298 0.84813717 -18.655101 1.6684125 -0.54158642 + 32 0.032 0.076105644 0.22690182 0.69699253 6.7254952 0.095457971 0.7554205 5.8746168 53.840687 0.16179465 2.6972065 50.981686 0.47515015 0.1178446 0.01912242 0.33818313 10.75703 0.01912242 6.6824244 4.0554837 0.33818313 4.0554837 443.62507 0.2291832 0.060626656 -0.014953833 0.14710858 -0.41639017 -0.77060663 1.1869968 8.6084008 1.6650748 0.84607892 -18.64588 1.668084 -0.54137052 + 33 0.033 0.076102719 0.22675672 0.69714056 6.725648 0.095459629 0.75533748 5.8748509 53.838802 0.16181278 2.6987638 50.978226 0.47526737 0.11784734 0.019134463 0.33828556 10.773899 0.019134463 6.6809496 4.0738153 0.33828556 4.0738153 443.53802 0.22914836 0.060621738 -0.014943927 0.1468999 -0.41638047 -0.76974843 1.1861289 8.604461 1.6653905 0.8445674 -18.642703 1.6680288 -0.54117118 + 34 0.034 0.076098565 0.22663713 0.69726431 6.725576 0.095457811 0.75538076 5.8747374 53.833854 0.16181146 2.700919 50.971124 0.47527389 0.11784272 0.019143719 0.33828745 10.793394 0.019143719 6.6808633 4.0933874 0.33828745 4.0933874 443.41537 0.22911809 0.060615766 -0.014936125 0.14669096 -0.41634887 -0.76888447 1.1852333 8.6004818 1.6655044 0.84255071 -18.634358 1.6676818 -0.5409511 + 35 0.035 0.076096506 0.22651836 0.69738514 6.7254514 0.095458846 0.7554389 5.8745537 53.827958 0.16182078 2.7032694 50.962868 0.47532358 0.1178431 0.019159311 0.33832117 10.81465 0.019159311 6.6807501 4.1147405 0.33832117 4.1147405 443.2767 0.22908986 0.060611723 -0.01492845 0.14648351 -0.41632451 -0.76799932 1.1843238 8.5962608 1.6656418 0.84053302 -18.625054 1.6673556 -0.54073275 + 36 0.036 0.076091699 0.22637414 0.69753416 6.7255814 0.095456057 0.75538508 5.8747402 53.825531 0.16182275 2.7050598 50.958648 0.47537423 0.11783481 0.019176025 0.3383634 10.832698 0.019176025 6.6797163 4.1338052 0.3383634 4.1338052 443.18115 0.22905354 0.060605469 -0.01491777 0.14626977 -0.41630486 -0.76711262 1.1834175 8.5920859 1.665931 0.83890822 -18.620146 1.6672516 -0.54051823 + 37 0.037 0.076087035 0.22625015 0.69766281 6.7255041 0.095455841 0.7554246 5.8746236 53.819927 0.1618361 2.7074606 50.95063 0.47544428 0.11784182 0.019173056 0.33842941 10.855292 0.019173056 6.6792345 4.1568842 0.33842941 4.1568842 443.03915 0.22902184 0.060598602 -0.014908258 0.14606604 -0.41626783 -0.76622173 1.1824896 8.5875216 1.6660594 0.83714861 -18.611757 1.6669747 -0.54028734 + 38 0.038 0.076082895 0.22612967 0.69778743 6.7254773 0.095454907 0.75544173 5.8745806 53.815613 0.1618395 2.7094833 50.94429 0.47546917 0.11783991 0.019183526 0.33844573 10.874042 0.019183526 6.6789198 4.1759385 0.33844573 4.1759385 442.92478 0.22899139 0.060591825 -0.014899234 0.14586839 -0.41623888 -0.76538826 1.1816271 8.5835682 1.6662021 0.83537893 -18.604189 1.6667083 -0.54007639 + 39 0.039 0.076079698 0.22600737 0.69791293 6.7253589 0.095454966 0.75550067 5.8744033 53.809601 0.16184996 2.7119147 50.935837 0.47552777 0.11783509 0.019220566 0.33847211 10.895951 0.019220566 6.6787587 4.1979714 0.33847211 4.1979714 442.78237 0.22896137 0.060586653 -0.014889153 0.14565188 -0.41620831 -0.76447999 1.1806883 8.5791485 1.6663323 0.83335316 -18.5943 1.6663739 -0.53984739 + 40 0.04 0.076075727 0.2258639 0.69806037 6.7253979 0.095453087 0.75548869 5.8744561 53.806187 0.16183591 2.7138533 50.930498 0.47539184 0.11783016 0.019245068 0.33831662 10.913442 0.019245068 6.6786389 4.2155576 0.33831662 4.2155576 442.68296 0.22892596 0.060579943 -0.014878165 0.14541521 -0.41618645 -0.76353592 1.1797224 8.5752101 1.6665301 0.83114372 -18.585753 1.6660587 -0.53961816 + 41 0.041 0.076072354 0.22574216 0.69818549 6.7253508 0.095453653 0.75550999 5.8743872 53.801434 0.16183302 2.7160294 50.923572 0.47530664 0.11783198 0.019267331 0.33820733 10.934372 0.019267331 6.6778771 4.2372276 0.33820733 4.2372276 442.5566 0.22889591 0.060573254 -0.014869566 0.14521738 -0.41615961 -0.76268521 1.1788448 8.5710908 1.6666701 0.82942881 -18.578993 1.665802 -0.53940526 + 42 0.042 0.076068668 0.22560479 0.69832654 6.7253597 0.095455476 0.75549823 5.874406 53.797482 0.16184659 2.7179913 50.917645 0.47534736 0.11783625 0.019290973 0.33822014 10.952445 0.019290973 6.6775745 4.2555791 0.33822014 4.2555791 442.44808 0.2288621 0.060566769 -0.014858661 0.14499655 -0.41613368 -0.76177513 1.1779088 8.5670188 1.6668412 0.82744519 -18.570315 1.6655133 -0.53917997 + 43 0.043 0.076065219 0.22548944 0.69844534 6.7252412 0.095453666 0.75556473 5.8742228 53.791566 0.16183292 2.7204709 50.909262 0.47519392 0.11783434 0.019313816 0.33804577 10.97525 0.019313816 6.677239 4.278697 0.33804577 4.278697 442.30485 0.2288334 0.060561175 -0.014850207 0.1447959 -0.41610328 -0.76090616 1.1770094 8.5626964 1.6669555 0.82559565 -18.561611 1.665204 -0.53895984 + 44 0.044 0.076062079 0.22536428 0.69857364 6.7252372 0.095455729 0.75555848 5.874223 53.787841 0.1618449 2.7222673 50.903729 0.47525216 0.11783857 0.01932169 0.3380919 10.991937 0.01932169 6.6769479 4.2956672 0.3380919 4.2956672 442.20373 0.2288028 0.060554271 -0.014839929 0.14458871 -0.41607979 -0.76006975 1.1761495 8.5590256 1.6671005 0.82370806 -18.554265 1.6649134 -0.5387531 + 45 0.045 0.076058926 0.22524349 0.69869759 6.7253156 0.095454278 0.75552511 5.8743362 53.785431 0.16184185 2.7238371 50.899752 0.47522905 0.11783276 0.019342786 0.3380535 11.0074 0.019342786 6.6761959 4.3118613 0.3380535 4.3118613 442.1197 0.22877315 0.060549381 -0.014830571 0.14440222 -0.416066 -0.75930841 1.1753744 8.5555616 1.6673301 0.82219656 -18.549452 1.6647815 -0.53857165 + 46 0.046 0.076055784 0.22509299 0.69885123 6.7254571 0.09545568 0.75544871 5.8745528 53.783475 0.16185245 2.7254099 50.896213 0.47525919 0.11783748 0.019356503 0.33806521 11.022979 0.019356503 6.6754291 4.3281933 0.33806521 4.3281933 442.03875 0.22873692 0.06054392 -0.01482031 0.14418248 -0.41605424 -0.75840455 1.1744588 8.5517011 1.667618 0.82036134 -18.543411 1.6646296 -0.53836033 + 47 0.047 0.076050001 0.2249756 0.6989744 6.72544 0.095455127 0.75545949 5.8745254 53.779532 0.16186085 2.7272706 50.8904 0.47530533 0.11783963 0.019362664 0.33810303 11.040372 0.019362664 6.6750809 4.3459286 0.33810303 4.3459286 441.93289 0.22870569 0.060535522 -0.014812577 0.14398993 -0.41601459 -0.75760038 1.173615 8.5479888 1.6676897 0.81858008 -18.536386 1.6642976 -0.53814639 + 48 0.048 0.076046156 0.22484646 0.69910739 6.7255108 0.095454191 0.75542786 5.8746287 53.776741 0.16186858 2.7289535 50.885919 0.47540051 0.11783319 0.019375592 0.33819173 11.056831 0.019375592 6.6743728 4.3630826 0.33819173 4.3630826 441.8403 0.22867357 0.060529987 -0.014803922 0.14379142 -0.41599505 -0.75677941 1.1727745 8.5442463 1.6679125 0.81689986 -18.531087 1.6641222 -0.53794658 + 49 0.049 0.07604324 0.22472407 0.69923269 6.7254618 0.095453305 0.75545586 5.8745527 53.771878 0.16186483 2.73118 50.878833 0.47535061 0.11782947 0.019398549 0.3381226 11.077823 0.019398549 6.6738044 4.3846197 0.3381226 4.3846197 441.71254 0.22864379 0.060525015 -0.014794279 0.14358829 -0.4159726 -0.75591732 1.1718899 8.540041 1.6680927 0.81513071 -18.523702 1.6638893 -0.53773505 + 50 0.05 0.076038368 0.2246023 0.69935933 6.7254373 0.095452228 0.75547246 5.8745126 53.767601 0.16186151 2.7332212 50.872518 0.47526737 0.1178315 0.019417133 0.33801874 11.096973 0.019417133 6.6733405 4.4042155 0.33801874 4.4042155 441.59785 0.22861239 0.060517966 -0.014785132 0.14338723 -0.41593905 -0.7550762 1.1710152 8.5360945 1.6682048 0.81332976 -18.516239 1.6635887 -0.53751831 + 51 0.051 0.076034302 0.22448001 0.69948569 6.725437 0.095450105 0.75548109 5.8745058 53.76371 0.16185571 2.7351886 50.866666 0.47520525 0.11782641 0.019442469 0.33793638 11.115253 0.019442469 6.672952 4.4228589 0.33793638 4.4228589 441.48999 0.2285816 0.060512131 -0.014776662 0.143191 -0.4159138 -0.75424509 1.1701589 8.5322074 1.6683737 0.81156594 -18.508848 1.6633468 -0.53731118 + 52 0.052 0.076031094 0.22436133 0.69960758 6.725444 0.095449777 0.75547889 5.8745154 53.760343 0.16185461 2.7369082 50.86158 0.47517287 0.11782266 0.019468699 0.33788152 11.130956 0.019468699 6.6727341 4.4387533 0.33788152 4.4387533 441.39703 0.22855238 0.060506867 -0.014768318 0.14299686 -0.41589309 -0.75345065 1.1693437 8.5287456 1.6685283 0.80974679 -18.501588 1.66308 -0.53711622 + 53 0.053 0.076027183 0.2242193 0.69975352 6.7255066 0.095453233 0.75543376 5.8746196 53.75702 0.16188895 2.738714 50.856417 0.47538771 0.11783421 0.019469552 0.33808394 11.148679 0.019469552 6.6719954 4.4572139 0.33808394 4.4572139 441.29336 0.22851734 0.06049974 -0.014757765 0.14278472 -0.41586809 -0.75255461 1.1684227 8.5245807 1.6687413 0.80797478 -18.494721 1.6628756 -0.53689488 + 54 0.054 0.076021769 0.22410255 0.69987569 6.7255152 0.095453938 0.75542667 5.8746345 53.753354 0.16190746 2.7405114 50.850935 0.47544382 0.11784521 0.019480818 0.33811779 11.165855 0.019480818 6.6714509 4.4749228 0.33811779 4.4749228 441.19059 0.22848658 0.060492885 -0.014748935 0.14260366 -0.41583162 -0.75177839 1.16761 8.5207997 1.6688462 0.80644196 -18.487606 1.6626281 -0.53668997 + 55 0.055 0.07601725 0.22398186 0.70000089 6.7254587 0.09545764 0.75544009 5.874561 53.74869 0.16194628 2.742434 50.84431 0.47572748 0.11784715 0.019505928 0.3383744 11.183422 0.019505928 6.6712182 4.492698 0.3383744 4.492698 441.07532 0.22845575 0.060485156 -0.014740253 0.14240255 -0.41579324 -0.75094066 1.1667339 8.5168954 1.6689191 0.80454316 -18.479104 1.662271 -0.53646969 + 56 0.056 0.076013798 0.22385438 0.70013182 6.7254536 0.095457206 0.75544438 5.874552 53.744719 0.16194621 2.7443967 50.838376 0.47568272 0.11785316 0.019503944 0.33832562 11.201544 0.019503944 6.6709974 4.5110425 0.33832562 4.5110425 440.96733 0.22842435 0.060479655 -0.014731905 0.14219717 -0.41577006 -0.75007788 1.1658479 8.5129932 1.6690905 0.80263371 -18.471174 1.6619991 -0.53625736 + 57 0.057 0.076011161 0.22373153 0.70025731 6.7254258 0.095457189 0.75545835 5.8745102 53.740507 0.16194719 2.7463735 50.832187 0.47567535 0.11785147 0.019518793 0.33830509 11.21976 0.019518793 6.670726 4.5295147 0.33830509 4.5295147 440.85639 0.22839471 0.060475099 -0.014723576 0.14199405 -0.41575024 -0.74923147 1.1649817 8.5091555 1.6692635 0.80072871 -18.463536 1.6617295 -0.53605165 + 58 0.058 0.0760059 0.22362017 0.70037393 6.7253581 0.095457364 0.75549148 5.8744093 53.735472 0.16197308 2.748483 50.825016 0.4758747 0.11785957 0.019503229 0.3385119 11.239551 0.019503229 6.6703854 4.549662 0.3385119 4.549662 440.72955 0.22836528 0.060467855 -0.014715821 0.14181291 -0.41570954 -0.74843426 1.1641438 8.5050305 1.6693511 0.79912427 -18.455896 1.6614508 -0.53583831 + 59 0.059 0.076000532 0.22348264 0.70051683 6.7254422 0.095458377 0.75544541 5.8745384 53.732809 0.16199962 2.7500869 50.820722 0.47604944 0.11786814 0.019500998 0.3386803 11.25473 0.019500998 6.6700217 4.5652075 0.3386803 4.5652075 440.64275 0.22832995 0.060460454 -0.014705717 0.14160267 -0.4156788 -0.74757417 1.163253 8.5012365 1.6695251 0.79727045 -18.448623 1.6611935 -0.53561986 + 60 0.06 0.075998601 0.22334838 0.70065302 6.7255554 0.095458137 0.75538975 5.8747075 53.730893 0.16199457 2.7515744 50.817324 0.47599895 0.11786583 0.019512744 0.33862037 11.269056 0.019512744 6.6695058 4.5800379 0.33862037 4.5800379 440.56822 0.2282984 0.060456137 -0.0146969 0.14140237 -0.41567467 -0.74675214 1.1624268 8.4977978 1.6698078 0.79551234 -18.442984 1.6610542 -0.53543351 + 61 0.061 0.075994056 0.22322846 0.70077749 6.7255206 0.095460186 0.75539897 5.8746614 53.72646 0.16202197 2.7535245 50.810914 0.47618467 0.11786841 0.019532861 0.33878339 11.287489 0.019532861 6.6689843 4.5989717 0.33878339 4.5989717 440.45226 0.22826771 0.060448723 -0.014688476 0.14120832 -0.4156394 -0.74592861 1.161568 8.4938335 1.669913 0.79376604 -18.43563 1.6607596 -0.53521916 + 62 0.062 0.075990138 0.22311624 0.70089362 6.7253748 0.095461153 0.75546798 5.8744457 53.720652 0.16203946 2.7557028 50.80291 0.47629503 0.11787442 0.019532386 0.33888822 11.306045 0.019532386 6.6695105 4.6170017 0.33888822 4.6170017 440.32519 0.22823929 0.06044307 -0.014681321 0.14100132 -0.41560101 -0.74507235 1.1606734 8.4899858 1.6699448 0.79153449 -18.424774 1.6602919 -0.53499475 + 63 0.063 0.075986225 0.22299129 0.70102248 6.7253349 0.095463204 0.75547973 5.874392 53.715924 0.16206694 2.7577775 50.796079 0.47649115 0.11787504 0.019555479 0.33906063 11.325548 0.019555479 6.6690028 4.6369894 0.33906063 4.6369894 440.2022 0.22820804 0.060436884 -0.014672289 0.14079993 -0.41556961 -0.74421138 1.159781 8.4857942 1.6700862 0.7897358 -18.416903 1.6600179 -0.53477551 + 64 0.064 0.075983399 0.22286325 0.70115335 6.7254313 0.095466743 0.7554174 5.8745471 53.713663 0.16208915 2.7592525 50.792322 0.47658559 0.11788397 0.019572479 0.33912914 11.340545 0.019572479 6.6680736 4.652899 0.33912914 4.652899 440.12003 0.22817708 0.06043072 -0.014663193 0.14061773 -0.41555438 -0.74343408 1.1589885 8.4822376 1.6703073 0.78828041 -18.411767 1.659891 -0.53458925 + 65 0.065 0.075979091 0.22272624 0.70129467 6.7255479 0.095467415 0.75535638 5.8747241 53.711393 0.1621103 2.7608279 50.788455 0.47672375 0.11789013 0.019573939 0.33925968 11.356325 0.019573939 6.6672675 4.6694834 0.33925968 4.6694834 440.03431 0.2281428 0.060424913 -0.014653504 0.14041826 -0.4155336 -0.74259965 1.1581332 8.4783982 1.6705498 0.78667014 -18.406197 1.6597487 -0.53438535 + 66 0.066 0.075974774 0.22259964 0.70142559 6.7256103 0.095469072 0.75531858 5.8748226 53.70846 0.16212782 2.7625051 50.783827 0.47681416 0.11789676 0.01958105 0.33933635 11.372828 0.01958105 6.6665346 4.6867128 0.33933635 4.6867128 439.94027 0.22811083 0.060417866 -0.014644827 0.14023396 -0.41550765 -0.74179984 1.1573075 8.4746262 1.6707247 0.78513458 -18.400267 1.659563 -0.53418454 + 67 0.067 0.075972107 0.22249948 0.70152841 6.7255227 0.09547411 0.75534221 5.8747064 53.704073 0.16215776 2.7641847 50.77773 0.47697111 0.117908 0.019592367 0.33947074 11.387761 0.019592367 6.6665809 4.7015879 0.33947074 4.7015879 439.83957 0.2280862 0.060411564 -0.014636922 0.14006078 -0.41547802 -0.7410831 1.1565611 8.4714173 1.6707599 0.78339876 -18.392015 1.6592085 -0.53399893 + 68 0.068 0.07597094 0.22235363 0.70167543 6.7256167 0.095477782 0.75528052 5.8748584 53.701444 0.16217517 2.7658523 50.773417 0.47709235 0.11790955 0.019603894 0.3395789 11.404162 0.019603894 6.665839 4.7187188 0.3395789 4.7187188 439.74838 0.22805275 0.060406702 -0.01462742 0.13984654 -0.41547364 -0.74018474 1.1556584 8.4675243 1.6710589 0.78153913 -18.38604 1.659061 -0.5337954 + 69 0.069 0.075967732 0.22222519 0.70180707 6.7256959 0.09547929 0.75523488 5.8749818 53.698745 0.16219135 2.7674937 50.76906 0.47717786 0.11791385 0.019616771 0.33964724 11.420807 0.019616771 6.6648511 4.7363393 0.33964724 4.7363393 439.6557 0.22802136 0.060400873 -0.014618237 0.1396564 -0.41545657 -0.7393842 1.1548408 8.4637594 1.6712887 0.78002632 -18.381106 1.6589291 -0.53360233 + 70 0.07 0.075963012 0.22209189 0.7019451 6.7255321 0.095481463 0.75530812 5.8747425 53.691587 0.16221135 2.7702552 50.759121 0.47728418 0.11791745 0.019639203 0.33972753 11.445463 0.019639203 6.6648604 4.7609632 0.33972753 4.7609632 439.49165 0.22798754 0.060392691 -0.014608643 0.13942671 -0.41541021 -0.73837802 1.1537882 8.4588057 1.671346 0.77775915 -18.369344 1.6584763 -0.53333753 + 71 0.071 0.075958699 0.22196536 0.70207594 6.7255841 0.095480824 0.75528464 5.8748187 53.688493 0.1622195 2.772004 50.75427 0.47732064 0.11791918 0.019650701 0.33975076 11.46205 0.019650701 6.6643902 4.7780088 0.33975076 4.7780088 439.39664 0.22795559 0.060386434 -0.014598185 0.13923013 -0.4153858 -0.73756208 1.1529479 8.4550114 1.6715356 0.77608966 -18.362484 1.6582738 -0.5331345 + 72 0.072 0.075953798 0.22185373 0.70219247 6.7254374 0.095481575 0.75535498 5.8746009 53.682518 0.16222816 2.7742971 50.745992 0.47732708 0.11792762 0.019652674 0.33974678 11.48205 0.019652674 6.6647012 4.7976958 0.33974678 4.7976958 439.26312 0.22792643 0.060378512 -0.014590153 0.13902912 -0.41534094 -0.7367084 1.1520493 8.4510089 1.6715361 0.77400279 -18.351934 1.6578105 -0.53290492 + 73 0.073 0.07595057 0.22175412 0.70229531 6.7253209 0.095485341 0.75539821 5.8744373 53.677086 0.16224439 2.7764233 50.738418 0.47733431 0.11794133 0.019667293 0.33972568 11.502686 0.019667293 6.6638924 4.8191265 0.33972568 4.8191265 439.13085 0.22790142 0.060371698 -0.014583409 0.1388643 -0.41530661 -0.73596941 1.151276 8.4471454 1.6715796 0.77256906 -18.345425 1.6575305 -0.53271019 + 74 0.074 0.075948904 0.22164801 0.70240309 6.7252857 0.09548696 0.75540932 5.8743894 53.673425 0.16225316 2.7780603 50.733112 0.47737761 0.11794207 0.019682153 0.33975339 11.517175 0.019682153 6.6639552 4.8335381 0.33975339 4.8335381 439.03961 0.22787636 0.060368065 -0.01457607 0.13868729 -0.41529112 -0.73523685 1.150528 8.4439577 1.6717182 0.77080833 -18.337718 1.6572624 -0.53253363 + 75 0.075 0.075943464 0.22154107 0.70251547 6.7251044 0.09549267 0.7554771 5.8741347 53.666709 0.16231142 2.7803699 50.724028 0.47774009 0.11795689 0.019703752 0.34007944 11.537781 0.019703752 6.663959 4.854118 0.34007944 4.854118 438.89318 0.22784776 0.060359291 -0.014567721 0.13849994 -0.41523506 -0.73440971 1.1496448 8.4396791 1.6716739 0.76895401 -18.326772 1.656811 -0.53229999 + 76 0.076 0.075940666 0.22141837 0.70264096 6.7251013 0.09549221 0.75548049 5.8741287 53.662781 0.16230571 2.7823425 50.718133 0.47766215 0.11795619 0.019719862 0.3399861 11.556319 0.019719862 6.6635022 4.8730972 0.3399861 4.8730972 438.78403 0.22781801 0.060353448 -0.014557375 0.13830226 -0.41521647 -0.73358052 1.148797 8.4357933 1.671864 0.76722341 -18.319676 1.6565954 -0.5320992 + 77 0.077 0.075937342 0.22127819 0.70278447 6.7254149 0.095488693 0.75533779 5.8745884 53.663845 0.16229775 2.7832534 50.718294 0.47766974 0.11794359 0.019730659 0.3399955 11.567485 0.019730659 6.6619752 4.8857788 0.3399955 4.8857788 438.74735 0.2277839 0.060349278 -0.014546826 0.13811924 -0.41522144 -0.73284984 1.1480713 8.4326399 1.6722808 0.76605325 -18.319347 1.6567059 -0.53194124 + 78 0.078 0.075934477 0.22117402 0.7028915 6.7251827 0.095488797 0.75545348 5.8742404 53.656597 0.16230075 2.7858205 50.708476 0.47766261 0.1179424 0.019752438 0.33996777 11.589287 0.019752438 6.6625387 4.9069962 0.33996777 4.9069962 438.59558 0.22775821 0.060344244 -0.01453892 0.13791242 -0.41518443 -0.73198223 1.1471667 8.4285152 1.6722974 0.7638034 -18.307527 1.6562207 -0.53171555 + 79 0.079 0.075932153 0.22104325 0.7030246 6.7252033 0.095492131 0.75542983 5.8742813 53.653121 0.16232876 2.7875391 50.703253 0.47784323 0.11794657 0.019771519 0.34012514 11.605025 0.019771519 6.6623275 4.9229258 0.34012514 4.9229258 438.49938 0.22772708 0.060339969 -0.014530607 0.13771043 -0.41516704 -0.73113096 1.146298 8.4247621 1.6724972 0.76188744 -18.299326 1.6559725 -0.53151091 + 80 0.08 0.075926199 0.22093869 0.70313511 6.7251611 0.095490867 0.75545601 5.8742142 53.648919 0.16234906 2.7893691 50.697201 0.47799306 0.11794577 0.019791139 0.34025614 11.621902 0.019791139 6.6620452 4.9400661 0.34025614 4.9400661 438.3923 0.22769855 0.060333198 -0.014523583 0.13753638 -0.41512505 -0.73039229 1.1455173 8.4211276 1.6725562 0.76025868 -18.291978 1.655663 -0.53130944 + 81 0.081 0.075925608 0.22083512 0.70323927 6.7251064 0.095495539 0.75546462 5.8741463 53.645164 0.16237166 2.7909102 50.691883 0.47809262 0.11795663 0.019799626 0.34033636 11.635279 0.019799626 6.6622577 4.9532218 0.34033636 4.9532218 438.30425 0.22767501 0.060329257 -0.014515772 0.13736101 -0.41511226 -0.72967507 1.1447873 8.4181077 1.6726782 0.75845888 -18.283601 1.6553714 -0.53113869 + 82 0.082 0.075919535 0.22072331 0.70335715 6.725024 0.095494172 0.75551131 5.8740185 53.639944 0.16239071 2.7930731 50.68448 0.47822969 0.11795751 0.019813319 0.34045886 11.654778 0.019813319 6.6621867 4.9727779 0.34045886 4.9727779 438.17786 0.22764477 0.060321858 -0.014507094 0.13716976 -0.41506652 -0.72885826 1.1439248 8.4139963 1.6727357 0.75666549 -18.274462 1.6550241 -0.53091652 + 83 0.083 0.075915094 0.22060487 0.70348004 6.7250361 0.095492979 0.75551006 5.874033 53.636472 0.16239541 2.7948445 50.679232 0.4782513 0.11796011 0.019813276 0.34047791 11.671013 0.019813276 6.6620405 4.9891594 0.34047791 4.9891594 438.08131 0.2276145 0.060316079 -0.014499108 0.13698192 -0.41503877 -0.72806562 1.1431044 8.4103622 1.6728789 0.75491287 -18.266975 1.6547619 -0.53071571 + 84 0.084 0.075911622 0.22047539 0.70361298 6.7250356 0.095496521 0.75549611 5.874043 53.632255 0.16242647 2.7968268 50.673002 0.47845797 0.1179679 0.019818514 0.34067155 11.690096 0.019818514 6.6613984 5.0088788 0.34067155 5.0088788 437.96434 0.22758264 0.060309458 -0.014489698 0.13678657 -0.41501184 -0.72720877 1.1422206 8.4061513 1.6730538 0.75324385 -18.259718 1.6545464 -0.53050136 + 85 0.085 0.075908417 0.22033956 0.70375202 6.725105 0.095497214 0.75545864 5.8741492 53.629296 0.1624322 2.798596 50.668267 0.47845404 0.11797009 0.01983752 0.34064643 11.706954 0.01983752 6.6608546 5.0262624 0.34064643 5.0262624 437.8698 0.22754961 0.060304208 -0.014479762 0.13658333 -0.41499486 -0.72634808 1.1413429 8.4022581 1.6732853 0.7514745 -18.252662 1.6543591 -0.53029501 + 86 0.086 0.075905414 0.22020539 0.7038892 6.7251692 0.095498396 0.75542182 5.874249 53.626222 0.16243149 2.8004242 50.663367 0.47838919 0.117974 0.01985109 0.3405641 11.724944 0.01985109 6.6600323 5.0450605 0.3405641 5.0450605 437.77004 0.22751712 0.060298171 -0.0144707 0.13638753 -0.41497835 -0.72549665 1.140475 8.3983219 1.6735102 0.7498166 -18.246689 1.6541905 -0.53009113 + 87 0.087 0.075900892 0.22009095 0.70400816 6.7251504 0.09549698 0.7554369 5.8742165 53.622219 0.16244256 2.802297 50.657479 0.47847332 0.11797347 0.019860994 0.34063885 11.742084 0.019860994 6.6598503 5.0623729 0.34063885 5.0623729 437.66445 0.22748767 0.060292683 -0.0144626 0.13620007 -0.41494794 -0.72470781 1.1396557 8.3945714 1.6736428 0.74807009 -18.23898 1.6539203 -0.52988879 + 88 0.088 0.075895566 0.21997486 0.70412957 6.7251056 0.09549541 0.75546558 5.8741446 53.617834 0.16244763 2.8042675 50.651119 0.47850322 0.11797516 0.01986206 0.340666 11.759804 0.01986206 6.6598536 5.0800882 0.340666 5.0800882 437.55381 0.22745714 0.060285304 -0.01445476 0.13600306 -0.41491028 -0.7238886 1.1387989 8.3907892 1.6737227 0.74614628 -18.230608 1.6535638 -0.52967327 + 89 0.089 0.075890487 0.2198795 0.70423001 6.7248449 0.095499273 0.75558045 5.8737652 53.610171 0.16249349 2.8067425 50.640935 0.47881355 0.11798374 0.019878949 0.34095086 11.780706 0.019878949 6.6604726 5.1003547 0.34095086 5.1003547 437.39879 0.22743143 0.06027669 -0.01444636 0.13581403 -0.41485248 -0.72307507 1.1379276 8.3866322 1.6736287 0.7441004 -18.218068 1.6530256 -0.52944111 + 90 0.09 0.07588752 0.21975829 0.70435419 6.7247507 0.095502054 0.75561644 5.8736322 53.604817 0.16250845 2.8089357 50.633373 0.47886314 0.11799462 0.019877975 0.34099054 11.80041 0.019877975 6.6604936 5.1200385 0.34099054 5.1200385 437.27133 0.22740186 0.060269989 -0.01443746 0.13561089 -0.41482259 -0.72220326 1.1370259 8.3825455 1.6737289 0.74210647 -18.208458 1.6526716 -0.52922081 + 91 0.091 0.075883097 0.21964822 0.70446868 6.7247147 0.095500387 0.75564112 5.8735732 53.600431 0.16252693 2.8108928 50.627011 0.47905993 0.11798659 0.01989487 0.34117847 11.818371 0.01989487 6.6602528 5.138223 0.34117847 5.138223 437.15783 0.22737347 0.060265128 -0.014429474 0.13543221 -0.41479179 -0.7214305 1.1362223 8.3786435 1.6738731 0.74048205 -18.200921 1.6524387 -0.5290217 + 92 0.092 0.075880756 0.21951984 0.70459941 6.7246459 0.095503098 0.75566468 5.8734781 53.595392 0.16253687 2.813063 50.619792 0.47905913 0.11799453 0.019908214 0.34115638 11.838035 0.019908214 6.6601329 5.1579944 0.34115638 5.1579944 437.03374 0.22734286 0.060259648 -0.01442132 0.13522226 -0.41476811 -0.72052848 1.1352966 8.3745299 1.6740154 0.73840906 -18.191543 1.6521046 -0.52880021 + 93 0.093 0.075876186 0.21937869 0.70474512 6.7248159 0.095502019 0.75558396 5.8737299 53.594106 0.16253614 2.814474 50.617096 0.47903008 0.11799506 0.019917345 0.34111767 11.851825 0.019917345 6.659551 5.1723566 0.34111767 5.1723566 436.96674 0.22730743 0.060252308 -0.014409625 0.13501917 -0.41475136 -0.71969734 1.1344487 8.3709571 1.6742729 0.73673344 -18.185724 1.6519611 -0.52860062 + 94 0.094 0.075871534 0.21925796 0.70487051 6.7247777 0.095499683 0.7556124 5.8736657 53.589309 0.16252504 2.8167452 50.610039 0.47891412 0.11799348 0.019931717 0.34098892 11.873231 0.019931717 6.659011 5.194288 0.34098892 5.194288 436.83859 0.22727647 0.060245638 -0.014402209 0.13483155 -0.41471952 -0.71884864 1.1335682 8.3666734 1.6744151 0.73505733 -18.178223 1.6517151 -0.52838371 + 95 0.095 0.075868021 0.21913789 0.70499408 6.7246607 0.095501872 0.75566218 5.8734966 53.583508 0.1625457 2.8190363 50.601926 0.47900235 0.11799866 0.019959854 0.34104383 11.893503 0.019959854 6.6590727 5.2144701 0.34104383 5.2144701 436.70453 0.22724666 0.060239863 -0.014394024 0.13462782 -0.41468482 -0.7179658 1.1326506 8.3624467 1.6745005 0.733012 -18.167594 1.6513364 -0.52815669 + 96 0.096 0.075864426 0.2190526 0.70508298 6.7243559 0.095501316 0.75581681 5.8730377 53.57542 0.16254502 2.8217115 50.591163 0.47895085 0.11799779 0.019986013 0.34096705 11.915797 0.019986013 6.6598593 5.2359513 0.34096705 5.2359513 436.54391 0.22722451 0.060233967 -0.014387146 0.13444385 -0.41463808 -0.7171708 1.1318089 8.3584579 1.6744246 0.73090008 -18.155101 1.6507997 -0.52793847 + 97 0.097 0.075860141 0.21892638 0.70521347 6.7243482 0.0955068 0.75579868 5.8730428 53.571458 0.16259587 2.8234545 50.585408 0.47928016 0.11801144 0.019995584 0.34127314 11.931844 0.019995584 6.6596409 5.2522077 0.34127314 5.2522077 436.44059 0.22719266 0.060225989 -0.014377178 0.13424616 -0.41460321 -0.71633857 1.1309418 8.3545989 1.6745302 0.7290689 -18.146411 1.6504866 -0.52772253 + 98 0.098 0.075858228 0.21880065 0.70534112 6.724315 0.095508669 0.75580784 5.8729985 53.566803 0.16261981 2.8255368 50.578646 0.47950076 0.11800854 0.020004581 0.34148764 11.951223 0.020004581 6.6592861 5.2719319 0.34148764 5.2719319 436.31863 0.22716301 0.060222606 -0.014368838 0.13404956 -0.41458595 -0.71547668 1.1300626 8.3503908 1.6747501 0.72726647 -18.138596 1.6502815 -0.52751566 + 99 0.099 0.075853893 0.21868148 0.70546463 6.7243284 0.095507345 0.75580643 5.8730146 53.563149 0.16263132 2.8273778 50.57314 0.47959822 0.11800818 0.020009105 0.34158094 11.968437 0.020009105 6.6589451 5.2894826 0.34158094 5.2894826 436.21559 0.22713268 0.060217255 -0.014360261 0.13386153 -0.41455914 -0.71467963 1.1292388 8.3465572 1.6749215 0.72559019 -18.131503 1.6500614 -0.52731471 + 100 0.1 0.075852186 0.21856662 0.70558119 6.7242189 0.095509874 0.75585104 5.872858 53.55766 0.16263534 2.8296139 50.56541 0.47956283 0.11801253 0.020027527 0.34152278 11.988838 0.020027527 6.6587338 5.3100764 0.34152278 5.3100764 436.08476 0.22710564 0.060211884 -0.014351764 0.13366741 -0.41453683 -0.71383879 1.1283756 8.3425396 1.6750426 0.72371363 -18.122794 1.649752 -0.52710802 + 101 0.101 0.075851325 0.2184481 0.70570058 6.724119 0.095517548 0.7558703 5.8727312 53.552586 0.16267763 2.8315319 50.558377 0.47978814 0.11803379 0.0200201 0.34173426 12.005889 0.0200201 6.6588686 5.3270002 0.34173426 5.3270002 435.96878 0.22707853 0.060207981 -0.014343982 0.13347073 -0.41451579 -0.71300071 1.1275165 8.3388099 1.67515 0.72167445 -18.11307 1.6493943 -0.52690308 + 102 0.102 0.075847815 0.21836394 0.70578824 6.7239759 0.095514612 0.75595358 5.8725077 53.547744 0.16265496 2.8333998 50.551689 0.47958833 0.11802632 0.020047884 0.34151412 12.020771 0.020047884 6.6597221 5.3410011 0.34151412 5.3410011 435.86857 0.22705671 0.060202058 -0.014337876 0.13330554 -0.41448427 -0.7123203 1.1268046 8.3358917 1.6751401 0.71975249 -18.102965 1.6489584 -0.52672386 + 103 0.103 0.075843165 0.21827054 0.70588629 6.7239265 0.095512574 0.75598645 5.8724275 53.543884 0.16265497 2.8351071 50.546122 0.47956528 0.11802514 0.020064194 0.34147594 12.035966 0.020064194 6.6597426 5.3561588 0.34147594 5.3561588 435.77334 0.22703182 0.060195813 -0.014330607 0.13314564 -0.41445129 -0.71164865 1.1260999 8.3326968 1.6751974 0.71820075 -18.095519 1.6486645 -0.52654529 + 104 0.104 0.075840592 0.2181297 0.70602971 6.7241164 0.095511531 0.75589567 5.8727092 53.542617 0.16265349 2.8366013 50.543362 0.47957436 0.11802099 0.020069568 0.3414838 12.051635 0.020069568 6.6586103 5.3729547 0.3414838 5.3729547 435.69804 0.22699824 0.060191273 -0.014319971 0.1329564 -0.41444944 -0.71083382 1.1252833 8.3288757 1.6755622 0.71682503 -18.09176 1.6486831 -0.52636257 + 105 0.105 0.075838625 0.21801108 0.70615029 6.7240595 0.095513881 0.75591471 5.872631 53.537873 0.16266592 2.8386675 50.53654 0.47963591 0.11802433 0.020081369 0.34153021 12.070607 0.020081369 6.6583752 5.39215 0.34153021 5.39215 435.57864 0.22697013 0.060186631 -0.014312149 0.13276931 -0.41442955 -0.7100048 1.1244344 8.3248967 1.6757252 0.71504685 -18.08349 1.6484328 -0.52616067 + 106 0.106 0.075832528 0.21787586 0.70629162 6.7241802 0.09551194 0.75586215 5.8728061 53.535447 0.16266777 2.8404161 50.532363 0.47961371 0.11802619 0.020093368 0.34149416 12.088279 0.020093368 6.6573594 5.4108267 0.34149416 5.4108267 435.48534 0.22693466 0.060178339 -0.014300915 0.1325751 -0.41439965 -0.70917437 1.123574 8.3208481 1.6759352 0.7135672 -18.078201 1.6482907 -0.52594955 + 107 0.107 0.075828097 0.21775764 0.70641426 6.7241752 0.095510812 0.75586917 5.8727952 53.531478 0.16267849 2.8423355 50.526464 0.47972874 0.1180207 0.020106048 0.34160199 12.105963 0.020106048 6.6571037 5.4287535 0.34160199 5.4287535 435.37749 0.22690445 0.060172122 -0.014291517 0.1323861 -0.4143706 -0.70837133 1.1227419 8.316946 1.6760894 0.71187317 -18.070693 1.6480512 -0.52574527 + 108 0.108 0.075824273 0.21762381 0.70655192 6.7242581 0.095514011 0.7558149 5.8729292 53.528636 0.16271602 2.8439795 50.52194 0.48000204 0.11802867 0.020106372 0.341867 12.122131 0.020106372 6.6564169 5.4456079 0.341867 5.4456079 435.28384 0.22687131 0.060166013 -0.014282416 0.13219642 -0.41434797 -0.70754374 1.1218917 8.3129886 1.6763116 0.71028761 -18.064283 1.6478964 -0.52554125 + 109 0.109 0.075820887 0.21749233 0.70668678 6.7244621 0.095512409 0.75571931 5.8732304 53.528211 0.16271714 2.8451053 50.520389 0.48001166 0.11802333 0.020127954 0.34186037 12.133683 0.020127954 6.6556205 5.4579344 0.34186037 5.4579344 435.23295 0.22683908 0.060161589 -0.014273513 0.13201565 -0.41434227 -0.70679965 1.1211419 8.3098207 1.6766185 0.70882458 -18.060134 1.6478441 -0.52537083 + 110 0.11 0.07581495 0.21739632 0.70678873 6.7243858 0.095511982 0.75575917 5.8731146 53.523864 0.16273649 2.8468579 50.51427 0.48013572 0.11802364 0.020151783 0.34196029 12.148788 0.020151783 6.6558594 5.4727768 0.34196029 5.4727768 435.13246 0.22681247 0.06015382 -0.014266179 0.13184854 -0.41429699 -0.70609755 1.1203945 8.3065001 1.676613 0.70711141 -18.051218 1.6474585 -0.52517456 + 111 0.111 0.07581134 0.21727558 0.70691307 6.7243344 0.095517218 0.7557639 5.8730533 53.519201 0.16278013 2.848784 50.507637 0.48042807 0.11803304 0.020164386 0.34223064 12.166544 0.020164386 6.6555988 5.4907804 0.34223064 5.4907804 435.01631 0.22678243 0.060146357 -0.014257375 0.13165784 -0.41426359 -0.7052698 1.1195334 8.3025272 1.6767116 0.70530831 -18.042649 1.6471455 -0.52496092 + 112 0.112 0.075808649 0.21713311 0.70705824 6.7243975 0.095515662 0.75573858 5.8731433 53.515626 0.16277332 2.8508828 50.501969 0.48037659 0.11802626 0.020186585 0.34216374 12.186863 0.020186585 6.6547947 5.5118821 0.34216374 5.5118821 434.90261 0.22674838 0.06014172 -0.014246586 0.13144587 -0.41425183 -0.70435075 1.1186026 8.2981034 1.677014 0.70353766 -18.035942 1.6470208 -0.52474624 + 113 0.113 0.075805036 0.21703002 0.70716494 6.7241837 0.095516416 0.75584246 5.8728249 53.508581 0.16278942 2.8533787 50.492413 0.48048999 0.11802881 0.020192143 0.34226904 12.207821 0.020192143 6.6555248 5.5321044 0.34226904 5.5321044 434.75498 0.22672226 0.060135709 -0.014239954 0.13125727 -0.41421057 -0.70350727 1.1177178 8.2939339 1.6770255 0.70143458 -18.023736 1.6465637 -0.52452213 + 114 0.114 0.075801569 0.21690846 0.70728998 6.7241699 0.095520291 0.75583391 5.8728157 53.504176 0.16280894 2.8554406 50.485926 0.48054468 0.11803957 0.020209625 0.34229549 12.228371 0.020209625 6.6544585 5.5537034 0.34229549 5.5537034 434.63157 0.22669216 0.060128146 -0.014230977 0.13108084 -0.41418234 -0.70269539 1.1168777 8.2897158 1.6771732 0.7000187 -18.017597 1.6463803 -0.52431661 + 115 0.115 0.075796373 0.21677799 0.70742564 6.7242462 0.095522948 0.75578509 5.8729382 53.501494 0.16283624 2.857016 50.481642 0.48066591 0.11805057 0.020227832 0.3423875 12.24358 0.020227832 6.6538708 5.5694814 0.3423875 5.5694814 434.54484 0.22665855 0.060119885 -0.014221567 0.13089045 -0.41415053 -0.70188346 1.116034 8.2860068 1.6773173 0.6983443 -18.01056 1.6461363 -0.52410791 + 116 0.116 0.075795034 0.21664509 0.70755988 6.724352 0.09552969 0.75570522 5.8731171 53.49962 0.16287685 2.8582665 50.478477 0.48089117 0.1180682 0.020227441 0.34259553 12.255505 0.020227441 6.6535372 5.5817402 0.34259553 5.5817402 434.47771 0.22662783 0.06011576 -0.014213001 0.13070519 -0.4141428 -0.70109263 1.1152354 8.2827102 1.6775553 0.69662372 -18.003555 1.6459655 -0.5239253 + 117 0.117 0.0757899 0.2165306 0.7076795 6.7243789 0.095527111 0.75570212 5.8731496 53.496519 0.1628778 2.8599343 50.473707 0.48089635 0.11806517 0.020241256 0.34258992 12.270376 0.020241256 6.6535511 5.596584 0.34258992 5.596584 434.3903 0.22659782 0.060109525 -0.014204845 0.13052408 -0.41411289 -0.7003317 1.1144446 8.2792476 1.6776859 0.69489215 -17.995711 1.6456969 -0.52372962 + 118 0.118 0.075789045 0.21642231 0.70778864 6.7242336 0.095533115 0.75575076 5.8729497 53.490901 0.16289639 2.8620152 50.465989 0.48094141 0.11807621 0.02025817 0.34260702 12.288633 0.02025817 6.6537189 5.6146563 0.34260702 5.6146563 434.26647 0.226573 0.060104561 -0.01419826 0.13034054 -0.41409012 -0.69952343 1.1136135 8.2755836 1.6777495 0.6929085 -17.985916 1.6453126 -0.52352976 + 119 0.119 0.075782661 0.21630905 0.70790829 6.7242318 0.09553265 0.75575351 5.8729456 53.487244 0.16291678 2.863754 50.460573 0.48107645 0.11808181 0.02026003 0.34273461 12.304365 0.02026003 6.6536704 5.6304343 0.34273461 5.6304343 434.16924 0.22654215 0.060096116 -0.014189477 0.13016017 -0.41404753 -0.69875869 1.1128062 8.2719508 1.6778142 0.69120978 -17.977801 1.6449926 -0.52332196 + 120 0.12 0.075779609 0.21621972 0.70800068 6.7241014 0.09553125 0.75582431 5.8727458 53.482175 0.16292084 2.8656856 50.453568 0.48112288 0.11807025 0.020301348 0.34275128 12.320722 0.020301348 6.6540185 5.6464025 0.34275128 5.6464025 434.05814 0.22651959 0.060091426 -0.01418287 0.12999294 -0.41401853 -0.69805898 1.1120775 8.2686351 1.6778676 0.68942374 -17.968703 1.6446432 -0.52314069 + 121 0.121 0.07577455 0.21609766 0.70812779 6.7241045 0.095532781 0.7558166 5.8727552 53.478244 0.16293397 2.8676127 50.447697 0.48113297 0.11808108 0.020312085 0.34273981 12.339052 0.020312085 6.6534825 5.6652579 0.34273981 5.6652579 433.94884 0.22648797 0.06008344 -0.014174471 0.12981161 -0.41398322 -0.69724666 1.1112299 8.2646618 1.677977 0.68780818 -17.961177 1.6443813 -0.52292878 + 122 0.122 0.075771464 0.21597251 0.70825603 6.724119 0.095533472 0.75580663 5.8727789 53.474464 0.16294799 2.8695113 50.442005 0.48122986 0.11807957 0.020332753 0.34281753 12.356915 0.020332753 6.6530125 5.6835693 0.34281753 5.6835693 433.84198 0.22645741 0.060078771 -0.014166009 0.12962204 -0.41396287 -0.69641819 1.1103811 8.2606883 1.6781807 0.68609485 -17.953851 1.6441817 -0.52272659 + 123 0.123 0.075767859 0.21587463 0.70835751 6.7240816 0.095532295 0.75583002 5.8727193 53.470621 0.16295323 2.8712435 50.436425 0.48126623 0.11807146 0.020370583 0.34282418 12.372237 0.020370583 6.6529953 5.6988708 0.34282418 5.6988708 433.74579 0.22643246 0.060073552 -0.014158313 0.12946245 -0.41393697 -0.69572859 1.1096656 8.2573481 1.6782907 0.68456466 -17.945997 1.6439394 -0.52255033 + 124 0.124 0.07576122 0.21575997 0.70847881 6.7240513 0.095529246 0.75585736 5.8726647 53.466165 0.16296347 2.8732946 50.429907 0.48136124 0.11806498 0.02039505 0.3429012 12.390653 0.02039505 6.652919 5.7173386 0.3429012 5.7173386 433.63104 0.22640108 0.060065149 -0.014148633 0.1292759 -0.41389309 -0.69492373 1.1088168 8.2532988 1.6783783 0.68284226 -17.937158 1.6436345 -0.52233246 + 125 0.125 0.075761208 0.215645 0.70859379 6.7240218 0.095533882 0.75585358 5.8726343 53.462486 0.16296907 2.8749787 50.424538 0.48129595 0.1180783 0.020399633 0.34281802 12.405824 0.020399633 6.6528935 5.7325309 0.34281802 5.7325309 433.53789 0.22637552 0.060061793 -0.014141251 0.12909423 -0.41388613 -0.69414811 1.1080342 8.2500173 1.6785452 0.68099474 -17.929153 1.6433724 -0.52215392 + 126 0.126 0.075756133 0.2155124 0.70873147 6.7240603 0.095535362 0.75582841 5.8726965 53.458661 0.16300127 2.8769358 50.418724 0.48153793 0.11807967 0.020418102 0.34304016 12.424843 0.020418102 6.6521172 5.7523075 0.34304016 5.7523075 433.42423 0.22634154 0.060054451 -0.01413133 0.12890063 -0.41385345 -0.69328996 1.1071434 8.2456741 1.6787309 0.67937841 -17.922119 1.6431782 -0.52193416 + 127 0.127 0.075752706 0.21541092 0.70883637 6.7239461 0.095538808 0.75587173 5.8725355 53.453433 0.16301824 2.8789676 50.411448 0.48155543 0.11809211 0.020435909 0.34302741 12.443003 0.020435909 6.6521094 5.7704572 0.34302741 5.7704572 433.30441 0.22631594 0.060047459 -0.014125189 0.12873752 -0.4138183 -0.69253969 1.106358 8.2419827 1.6787599 0.67771329 -17.912846 1.642834 -0.5217362 + 128 0.128 0.075748837 0.21530457 0.70894659 6.7238856 0.095538042 0.75590504 5.8724425 53.448885 0.16301614 2.8809779 50.404891 0.48152385 0.11808973 0.020451813 0.34298231 12.461266 0.020451813 6.6519602 5.7888541 0.34298231 5.7888541 433.19062 0.22628887 0.060040927 -0.014118492 0.12856784 -0.41378847 -0.69177826 1.1055667 8.2382479 1.6788579 0.67606436 -17.905018 1.6425547 -0.52154048 + 129 0.129 0.075745227 0.21517097 0.7090838 6.7238759 0.095541623 0.75589555 5.8724387 53.44445 0.1630463 2.8830312 50.398373 0.48170106 0.11809798 0.0204659 0.34313719 12.480674 0.0204659 6.6514397 5.8087682 0.34313719 5.8087682 433.07082 0.22625597 0.06003431 -0.014108969 0.12836412 -0.41375989 -0.69088733 1.1046472 8.2339432 1.6790245 0.67421843 -17.89678 1.6422925 -0.52131708 + 130 0.13 0.075745067 0.21506502 0.70918991 6.7236008 0.095548419 0.75600594 5.8720464 53.436226 0.16307479 2.8857912 50.38736 0.48181126 0.11811064 0.020488336 0.34321228 12.5049 0.020488336 6.6516567 5.8327554 0.34321228 5.8327554 432.89907 0.22623229 0.060030398 -0.014101051 0.12817097 -0.41373117 -0.69000541 1.1037366 8.229419 1.6790707 0.67216978 -17.884762 1.6418784 -0.52109558 + 131 0.131 0.075742289 0.21492305 0.70933466 6.7237718 0.095549734 0.75591516 5.8723069 53.43471 0.16308661 2.8872717 50.384352 0.48189361 0.11811329 0.02048978 0.34329054 12.520429 0.02048978 6.6505491 5.8493896 0.34329054 5.8493896 432.82138 0.22619827 0.060025129 -0.014090769 0.12797811 -0.41372413 -0.68917841 1.1029025 8.2256027 1.6793927 0.67067731 -17.880564 1.6418329 -0.52090554 + 132 0.132 0.07573853 0.21479973 0.70946174 6.7238516 0.095553418 0.75586053 5.8724376 53.432501 0.16311034 2.8886403 50.380751 0.48196498 0.11812477 0.02051496 0.34332524 12.533468 0.02051496 6.6500875 5.8628651 0.34332524 5.8628651 432.74823 0.22616752 0.060018317 -0.014082069 0.12779808 -0.41370122 -0.68842097 1.1021222 8.2223208 1.6795425 0.66903436 -17.873683 1.6416009 -0.52071686 + 133 0.133 0.075735006 0.21468565 0.70957934 6.7237857 0.09555053 0.75590505 5.8723301 53.427626 0.1631025 2.8908123 50.373712 0.48196206 0.11811461 0.020521754 0.34332569 12.552628 0.020521754 6.650254 5.8818525 0.34332569 5.8818525 432.62792 0.22613904 0.060012965 -0.014074126 0.12760815 -0.41367541 -0.68759527 1.1012707 8.2183329 1.6796905 0.66715373 -17.864841 1.6413146 -0.52051043 + 134 0.134 0.075730015 0.21458382 0.70968617 6.7237133 0.09554951 0.75594532 5.8722185 53.423154 0.16311124 2.8926878 50.367355 0.48199212 0.11811342 0.020550847 0.34332785 12.568548 0.020550847 6.6506176 5.8973799 0.34332785 5.8973799 432.5241 0.22611197 0.060006411 -0.014066757 0.12743712 -0.4136374 -0.68685474 1.1004921 8.2148336 1.6797335 0.66537225 -17.85499 1.640957 -0.52031207 + 135 0.135 0.075724957 0.21448249 0.70979255 6.7236956 0.09554935 0.75595479 5.8721915 53.419537 0.16312626 2.8943568 50.362054 0.48206373 0.11811927 0.020559256 0.3433852 12.583583 0.020559256 6.6505769 5.9124473 0.3433852 5.9124473 432.43068 0.22608496 0.059999532 -0.014059766 0.12727996 -0.41360221 -0.68616018 1.0997624 8.211454 1.6798049 0.66386603 -17.847186 1.6406857 -0.52012645 + 136 0.136 0.075721309 0.21435074 0.70992795 6.7236871 0.095550769 0.7559534 5.8721829 53.415285 0.16313446 2.8964112 50.35574 0.48207137 0.11812509 0.020569032 0.34337725 12.60242 0.020569032 6.6503643 5.9314865 0.34337725 5.9314865 432.3168 0.22605244 0.059992825 -0.014049439 0.12707479 -0.41357562 -0.68527388 1.0988495 8.2073178 1.6799652 0.66193957 -17.838378 1.6404001 -0.51990586 + 137 0.137 0.075717354 0.21424946 0.71003318 6.723639 0.095553611 0.75596606 5.8721193 53.411079 0.16315296 2.8982239 50.349702 0.48212024 0.11813762 0.020577719 0.3434049 12.62001 0.020577719 6.6496919 5.9497401 0.3434049 5.9497401 432.20746 0.22602642 0.059986071 -0.014042985 0.1269177 -0.41354254 -0.68456998 1.0981125 8.2037581 1.6800289 0.66053166 -17.832298 1.6401438 -0.51972003 + 138 0.138 0.07571566 0.21413358 0.71015076 6.7236157 0.095560027 0.75595206 5.8721036 53.407139 0.16317814 2.8999883 50.343973 0.4821999 0.11815317 0.020588989 0.34345773 12.637082 0.020588989 6.6490502 5.9674432 0.34345773 5.9674432 432.10231 0.22599916 0.059979717 -0.014033954 0.12674076 -0.41352297 -0.6837998 1.0973228 8.2001317 1.6801604 0.65894072 -17.825656 1.6399072 -0.51953149 + 139 0.139 0.075710105 0.2140046 0.71028529 6.7237193 0.095558831 0.75590505 5.8722554 53.404621 0.16318558 2.9016839 50.339751 0.4822361 0.11815299 0.02060509 0.34347802 12.653868 0.02060509 6.6482234 5.9850396 0.34347802 5.9850396 432.01134 0.22596556 0.05997179 -0.014024078 0.12655955 -0.41349466 -0.68300182 1.0964965 8.1962201 1.6803601 0.65747429 -17.819881 1.6397589 -0.51932899 + 140 0.14 0.075704368 0.21389855 0.71039709 6.723721 0.095556794 0.75591233 5.8722519 53.401083 0.16319591 2.903419 50.334469 0.4823442 0.11815062 0.020607024 0.34358656 12.66977 0.020607024 6.6480724 6.0010909 0.34358656 6.0010909 431.91466 0.22593689 0.059963899 -0.014016299 0.12639458 -0.41345825 -0.68228181 1.0957401 8.1926597 1.6804565 0.65594997 -17.812844 1.6395058 -0.51913663 + 141 0.141 0.075701934 0.21378932 0.71050874 6.7237601 0.095562732 0.75586903 5.8723283 53.39854 0.16321651 2.9047841 50.33054 0.4823574 0.11817013 0.020615073 0.3435722 12.683326 0.020615073 6.6474051 6.015306 0.3435722 6.015306 431.83679 0.22591046 0.059957214 -0.014009487 0.12624129 -0.41343891 -0.68159909 1.095038 8.1895909 1.6805718 0.65456371 -17.80731 1.6393002 -0.51896772 + 142 0.142 0.075697624 0.21366521 0.71063716 6.7238172 0.095564782 0.75583225 5.8724202 53.395678 0.16323264 2.9064081 50.326037 0.48241157 0.11817612 0.020636618 0.34359883 12.698639 0.020636618 6.6469705 6.0310318 0.34359883 6.0310318 431.74885 0.22587905 0.059949514 -0.014000926 0.12606345 -0.41341221 -0.68081359 1.0942258 8.1859595 1.6807229 0.65294153 -17.800041 1.6390741 -0.51876942 + 143 0.143 0.075693304 0.2135543 0.7107524 6.7238266 0.095561424 0.75584101 5.8724241 53.392194 0.1632067 2.9082959 50.320691 0.48219155 0.11816983 0.020655066 0.34336665 12.7164 0.020655066 6.6465112 6.0492337 0.34336665 6.0492337 431.64822 0.22585056 0.059942313 -0.013992692 0.12589115 -0.41338723 -0.68006106 1.0934483 8.18235 1.6808632 0.65138862 -17.793844 1.6388536 -0.51857999 + 144 0.144 0.07568635 0.21344381 0.71086984 6.7237297 0.095557085 0.75590679 5.8722659 53.386846 0.16321663 2.9104945 50.313134 0.48232106 0.11815954 0.020676181 0.34348535 12.734767 0.020676181 6.6471368 6.0669545 0.34348535 6.0669545 431.52598 0.22581983 0.059934593 -0.013982994 0.12569297 -0.41333748 -0.67923174 1.0925692 8.178304 1.6809001 0.64934376 -17.782626 1.6384321 -0.51835148 + 145 0.145 0.07568357 0.21332251 0.71099392 6.7237937 0.095556549 0.75587694 5.8723602 53.384101 0.1632189 2.9121459 50.308736 0.48233583 0.11815936 0.020679704 0.34349677 12.7502 0.020679704 6.6468375 6.0826832 0.34349677 6.0826832 431.4391 0.2257904 0.059930427 -0.01397383 0.12551596 -0.41332416 -0.67845964 1.0917838 8.1746985 1.6811324 0.6477607 -17.775835 1.6382868 -0.51816806 + 146 0.146 0.075678048 0.21322821 0.71109374 6.7237442 0.09555326 0.75591487 5.872276 53.380018 0.16322209 2.9139516 50.302844 0.48241234 0.11815169 0.020686477 0.34357417 12.765974 0.020686477 6.6470494 6.0982381 0.34357417 6.0982381 431.33871 0.22576453 0.05992361 -0.013966694 0.12536138 -0.41328658 -0.67777705 1.0910636 8.1712819 1.681193 0.64622507 -17.767889 1.6379993 -0.51798297 + 147 0.147 0.075673111 0.21311734 0.71120955 6.7236941 0.095547441 0.7559632 5.8721834 53.375201 0.16319002 2.9162627 50.295748 0.48221545 0.11813473 0.020708444 0.34337227 12.787048 0.020708444 6.6468243 6.1195156 0.34337227 6.1195156 431.21284 0.22573551 0.05991665 -0.013958217 0.12518275 -0.41325541 -0.67697257 1.090228 8.1671391 1.6813284 0.64459497 -17.760223 1.6377574 -0.51777649 + 148 0.148 0.075670698 0.21300427 0.71132503 6.7237983 0.095547249 0.75591186 5.8723392 53.373356 0.16320101 2.9176102 50.292545 0.48232943 0.11813213 0.020711314 0.34348598 12.800532 0.020711314 6.646135 6.1336854 0.34348598 6.1336854 431.14047 0.22570824 0.059912791 -0.013949751 0.1250211 -0.41324726 -0.67628587 1.0895331 8.1638927 1.6815843 0.64327716 -17.755909 1.6376921 -0.51761664 + 149 0.149 0.075668147 0.2129006 0.71143125 6.7237405 0.095549142 0.7559332 5.8722581 53.369155 0.16321029 2.9194134 50.286531 0.48235104 0.11813556 0.020728537 0.34348695 12.816551 0.020728537 6.6461708 6.1496512 0.34348695 6.1496512 431.03845 0.22568293 0.059907437 -0.013942259 0.12485274 -0.41322384 -0.67555519 1.088779 8.1604692 1.6816849 0.64160372 -17.747616 1.6374096 -0.51743345 + 150 0.15 0.075665248 0.2127734 0.71156135 6.7238206 0.095551556 0.75588347 5.8723856 53.366475 0.16323495 2.9210153 50.282225 0.48250333 0.11814596 0.020721779 0.3436356 12.832144 0.020721779 6.6456096 6.1658131 0.3436356 6.1658131 430.94987 0.22565209 0.059902513 -0.013933111 0.12467314 -0.413208 -0.67476668 1.0879747 8.1567116 1.6819203 0.64006936 -17.741176 1.6372779 -0.51724415 + 151 0.151 0.075657581 0.21268697 0.71165545 6.7237926 0.095545296 0.75592253 5.8723247 53.362633 0.16322156 2.9228638 50.276548 0.48239424 0.11814794 0.020708142 0.34353816 12.84931 0.020708142 6.6453996 6.1832018 0.34353816 6.1832018 430.84748 0.22562606 0.059893766 -0.013926053 0.12453593 -0.41316058 -0.67414053 1.0873011 8.1532467 1.6819459 0.6388892 -17.734829 1.6370384 -0.51706286 + 152 0.152 0.075649723 0.21257929 0.71177099 6.723793 0.095542304 0.75593426 5.8723165 53.359037 0.16322694 2.9246425 50.271167 0.48239941 0.11815085 0.02071813 0.34353043 12.86539 0.02071813 6.6453237 6.1993486 0.34353043 6.1993486 430.75069 0.22559515 0.059883633 -0.01391743 0.1243653 -0.41311077 -0.67340485 1.0865156 8.1496439 1.6819733 0.63728638 -17.726804 1.6367066 -0.5168551 + 153 0.153 0.075647695 0.212467 0.7118853 6.7237051 0.095542667 0.75597678 5.8721856 53.35415 0.1632266 2.9266915 50.264232 0.48239229 0.11814839 0.020729992 0.34351391 12.882849 0.020729992 6.6457676 6.216351 0.34351391 6.216351 430.63741 0.2255684 0.059879114 -0.013909455 0.12417511 -0.41309012 -0.67258869 1.0856788 8.1459398 1.6821005 0.63527115 -17.71685 1.6363718 -0.51665538 + 154 0.154 0.075644354 0.21233587 0.71201977 6.7237481 0.095543437 0.75595221 5.8722524 53.350653 0.16323683 2.9285924 50.258824 0.4824391 0.11814929 0.020748997 0.34354081 12.900973 0.020748997 6.6451835 6.2350401 0.34354081 6.2350401 430.53243 0.22553629 0.059873806 -0.013900469 0.1239844 -0.41307014 -0.6717407 1.0848108 8.1418651 1.6823203 0.63356539 -17.70963 1.6361881 -0.51644917 + 155 0.155 0.075642761 0.21224097 0.71211627 6.7235462 0.095544892 0.75604733 5.871954 53.34382 0.16324151 2.9310821 50.249496 0.48245374 0.11815045 0.020758149 0.34354514 12.923267 0.020758149 6.6452034 6.2573051 0.34354514 6.2573051 430.38164 0.22551378 0.059869849 -0.013894325 0.12381811 -0.4130427 -0.67096462 1.0840073 8.137746 1.6823912 0.63186153 -17.700445 1.6358725 -0.51625232 + 156 0.156 0.075639564 0.2121167 0.71224374 6.7235296 0.095548091 0.75604286 5.8719386 53.339477 0.16326458 2.9330864 50.243126 0.48259729 0.11815475 0.020772985 0.34366956 12.941864 0.020772985 6.6448651 6.2762255 0.34366956 6.2762255 430.26643 0.22548332 0.059863461 -0.013885807 0.1236359 -0.41301675 -0.67013004 1.0831468 8.1336269 1.6825505 0.63017096 -17.692125 1.6356385 -0.51604379 + 157 0.157 0.07563713 0.21198518 0.71237769 6.7237167 0.095548209 0.75594879 5.8722197 53.338579 0.16326595 2.9343721 50.240941 0.48259458 0.11815696 0.020771651 0.34366597 12.955295 0.020771651 6.6439404 6.2905825 0.34366597 6.2905825 430.20373 0.22545193 0.059859259 -0.013877617 0.12346624 -0.41301443 -0.66937951 1.0823939 8.1302121 1.682873 0.62882023 -17.688118 1.6356249 -0.51587494 + 158 0.158 0.07563446 0.21184551 0.71252003 6.7237211 0.095549447 0.75594168 5.8722299 53.33427 0.16327775 2.9364986 50.234494 0.48264389 0.11815558 0.020805624 0.34368269 12.974611 0.020805624 6.6437159 6.3100892 0.34368269 6.3100892 430.08703 0.22541852 0.059854705 -0.013867707 0.12325338 -0.41299557 -0.66844847 1.081444 8.1258454 1.683103 0.62679476 -17.678532 1.6353793 -0.51565127 + 159 0.159 0.075630403 0.21171774 0.71265186 6.7237695 0.095546596 0.75592886 5.872294 53.330755 0.16327437 2.9384877 50.228993 0.48259832 0.11815303 0.020823357 0.34362193 12.993523 0.020823357 6.6431398 6.3295596 0.34362193 6.3295596 429.97966 0.22538652 0.059850397 -0.013859284 0.1230671 -0.4129748 -0.6676124 1.0805872 8.1216789 1.6833426 0.62516466 -17.671334 1.63523 -0.51544703 + 160 0.16 0.07562751 0.21158054 0.71279195 6.7238689 0.095550257 0.75586452 5.8724541 53.328134 0.16331357 2.940089 50.224731 0.48281942 0.118168 0.02082936 0.34382206 13.009062 0.02082936 6.6425519 6.3456808 0.34382206 6.3456808 429.89114 0.22535346 0.059846193 -0.013849587 0.12287754 -0.4129592 -0.66677528 1.0797345 8.1177206 1.6836067 0.6235129 -17.663834 1.6350977 -0.51524713 + 161 0.161 0.075622654 0.21149027 0.71288708 6.7237496 0.095550957 0.75592136 5.8722773 53.322981 0.16332485 2.9420835 50.217572 0.48283533 0.11817707 0.020835872 0.34382239 13.026976 0.020835872 6.6425444 6.3635959 0.34382239 6.3635959 429.77296 0.22532909 0.059838817 -0.01384397 0.12272772 -0.41291683 -0.66608624 1.0790031 8.1141718 1.6835983 0.62198632 -17.655498 1.634751 -0.51505635 + 162 0.162 0.075620868 0.21136086 0.71301827 6.7239602 0.095553017 0.75580785 5.8725993 53.32254 0.16333239 2.943221 50.215987 0.48287433 0.11817714 0.020850026 0.34384716 13.03964 0.020850026 6.6412747 6.3775151 0.34384716 6.3775151 429.71671 0.22529874 0.059833911 -0.013833988 0.12256501 -0.41291868 -0.66537417 1.0782929 8.1109 1.6839332 0.62082171 -17.652785 1.6347899 -0.51489976 + 163 0.163 0.075616295 0.21126125 0.71312245 6.7239254 0.095554702 0.75581849 5.8725522 53.318473 0.16335274 2.9450171 50.210103 0.48295784 0.11818344 0.020874669 0.34389973 13.056632 0.020874669 6.6407622 6.3949948 0.34389973 6.3949948 429.61084 0.22527254 0.059826882 -0.013826437 0.12241519 -0.41288363 -0.6646864 1.07757 8.1072997 1.6840048 0.61949343 -17.645863 1.6345584 -0.51471576 + 164 0.164 0.075611951 0.21115512 0.71323293 6.7238579 0.095548842 0.75587567 5.8724334 53.31338 0.16331909 2.9473942 50.202667 0.48267985 0.11817403 0.020899862 0.34360595 13.078577 0.020899862 6.6403859 6.4172916 0.34360595 6.4172916 429.47967 0.22524509 0.059821189 -0.013817427 0.12224209 -0.41285517 -0.66390135 1.0767565 8.1031148 1.6841495 0.61795776 -17.638151 1.6343457 -0.51451601 + 165 0.165 0.075607293 0.21104326 0.71334944 6.7239625 0.095548316 0.75582549 5.8725887 53.311584 0.16331552 2.9487773 50.199491 0.4825668 0.11817465 0.020937839 0.3434543 13.092341 0.020937839 6.6395758 6.4318278 0.3434543 6.4318278 429.40885 0.2252161 0.059813761 -0.013809488 0.12208869 -0.41283229 -0.66322151 1.0760538 8.099912 1.6843086 0.61667976 -17.633063 1.6342032 -0.51434459 + 166 0.166 0.075602646 0.21094346 0.7134539 6.7239379 0.095547489 0.75584107 5.8725494 53.307974 0.16331341 2.9504803 50.19418 0.48248913 0.11817342 0.020972075 0.34334363 13.107688 0.020972075 6.6394288 6.4472875 0.34334363 6.4472875 429.31566 0.22518979 0.05980679 -0.013802731 0.1219315 -0.41280001 -0.66252965 1.0753297 8.0966321 1.6843729 0.61512852 -17.625538 1.6339156 -0.51416216 + 167 0.167 0.075599677 0.21082567 0.71357465 6.7239582 0.09554907 0.75582464 5.8725845 53.304483 0.16333267 2.9522395 50.188911 0.48260064 0.11817577 0.020993602 0.34343126 13.124213 0.020993602 6.6389968 6.4642226 0.34343126 6.4642226 429.21665 0.22516097 0.059801527 -0.013792341 0.12175281 -0.41277999 -0.66175836 1.0745384 8.0928697 1.6845618 0.61355706 -17.618232 1.6337343 -0.51397296 + 168 0.168 0.075596693 0.2107135 0.71368981 6.7239556 0.095547988 0.75583026 5.8725773 53.300507 0.16332985 2.954227 50.182951 0.4825827 0.11817462 0.02099446 0.34341362 13.143084 0.02099446 6.6385016 6.4835878 0.34341362 6.4835878 429.10507 0.22513339 0.059796236 -0.013783536 0.121585 -0.41276082 -0.66099796 1.0737588 8.0889289 1.6847585 0.61213226 -17.611704 1.6335925 -0.51378694 + 169 0.169 0.075592902 0.21061445 0.71379265 6.7239058 0.095551497 0.7558411 5.8725132 53.296322 0.16336601 2.9559513 50.177004 0.48282076 0.118183 0.02100466 0.3436331 13.159078 0.02100466 6.6382233 6.49985 0.3436331 6.49985 429.00079 0.22510801 0.059789071 -0.013775913 0.12143161 -0.41272806 -0.66031065 1.0730387 8.0854121 1.6848316 0.61070891 -17.604375 1.6333412 -0.51360508 + 170 0.17 0.075587668 0.2104959 0.71391643 6.7238767 0.095550861 0.7558582 5.8724676 53.291787 0.16337063 2.9580693 50.170347 0.48279479 0.11819681 0.020983206 0.34361478 13.178814 0.020983206 6.637972 6.5198585 0.34361478 6.5198585 428.88101 0.22507702 0.059781414 -0.013768647 0.12125392 -0.4126913 -0.6594903 1.0721816 8.0812688 1.6849395 0.60902938 -17.596219 1.6330639 -0.51339011 + 171 0.171 0.075583375 0.21041914 0.71399748 6.7236824 0.095550437 0.75595703 5.872175 53.285516 0.16338655 2.9602668 50.161863 0.48293506 0.1181914 0.021006364 0.34373729 13.198111 0.021006364 6.63812 6.5389844 0.34373729 6.5389844 428.74617 0.22505614 0.05977559 -0.013762749 0.12111102 -0.41264818 -0.65883448 1.0714827 8.0776103 1.684918 0.60756183 -17.587519 1.6327186 -0.51320604 + 172 0.172 0.075578965 0.21031201 0.71410903 6.7235883 0.095554278 0.75598873 5.8720453 53.280148 0.16341579 2.9624103 50.154322 0.48307162 0.11820325 0.021022224 0.34384614 13.218583 0.021022224 6.6374662 6.5600945 0.34384614 6.5600945 428.614 0.22502842 0.059767558 -0.0137554 0.12094439 -0.41260757 -0.65806262 1.0706702 8.073508 1.6849642 0.60603979 -17.580076 1.6324215 -0.51299842 + 173 0.173 0.075574922 0.21018855 0.71423652 6.723576 0.095555666 0.75598935 5.872031 53.276128 0.16343309 2.9642953 50.1484 0.48314646 0.11820666 0.021049039 0.34389077 13.235138 0.021049039 6.6375638 6.5765252 0.34389077 6.5765252 428.51101 0.22499739 0.059761258 -0.013748001 0.12075718 -0.41257806 -0.65722936 1.0698074 8.0696545 1.6850938 0.60412601 -17.57026 1.6321113 -0.51278703 + 174 0.174 0.07557301 0.21010256 0.71432443 6.7234871 0.095557471 0.75602657 5.8719031 53.271913 0.16344428 2.9659581 50.142511 0.48322497 0.11820178 0.021079685 0.3439435 13.249659 0.021079685 6.6376631 6.5909164 0.3439435 6.5909164 428.41436 0.22497658 0.059756804 -0.013741804 0.12061144 -0.41255668 -0.65659527 1.069152 8.0666347 1.6851646 0.60261246 -17.562748 1.6318379 -0.51262711 + 175 0.175 0.075572431 0.20998593 0.71444164 6.7234814 0.095563161 0.75600663 5.8719117 53.267961 0.16349301 2.9677142 50.136753 0.48360978 0.11820603 0.021089559 0.34431419 13.266224 0.021089559 6.6372433 6.6078916 0.34431419 6.6078916 428.30828 0.22495015 0.059754061 -0.013734009 0.1204453 -0.41254668 -0.65582988 1.0683766 8.0627578 1.6854036 0.60111193 -17.555432 1.6317169 -0.51244813 + 176 0.176 0.075570062 0.20988579 0.71454415 6.7233602 0.095562191 0.75607113 5.8717269 53.262629 0.16348342 2.9698725 50.129274 0.48350187 0.11820948 0.021086534 0.34420586 13.284485 0.021086534 6.637838 6.6255601 0.34420586 6.6255601 428.18893 0.22492579 0.05974952 -0.013727183 0.12027765 -0.41252256 -0.65506664 1.0675892 8.0590569 1.6854987 0.59930149 -17.545048 1.6313992 -0.51225708 + 177 0.177 0.075568717 0.20979537 0.71463592 6.7232255 0.095561298 0.75614204 5.8715222 53.257274 0.16347392 2.9719824 50.121817 0.4834131 0.11820778 0.021094978 0.34411033 13.302962 0.021094978 6.63806 6.6438068 0.34411033 6.6438068 428.06794 0.2249045 0.059746755 -0.013721195 0.1201218 -0.41250423 -0.65435952 1.0668637 8.055512 1.685608 0.59766645 -17.536476 1.631133 -0.51208365 + 178 0.178 0.075563654 0.20967855 0.71475779 6.7233045 0.095561069 0.75610345 5.87164 53.254526 0.1634743 2.9737101 50.117342 0.48335766 0.11821405 0.021099287 0.34404432 13.320321 0.021099287 6.6371378 6.6620844 0.34404432 6.6620844 427.97342 0.22487404 0.059737726 -0.013711905 0.11996648 -0.41247639 -0.6536293 1.0661057 8.0517023 1.6857765 0.59647596 -17.531259 1.6310182 -0.51189664 + 179 0.179 0.075559379 0.20954691 0.71489371 6.7235399 0.095558638 0.75599551 5.8719857 53.254523 0.16348003 2.9747479 50.116295 0.48342255 0.11820578 0.021125767 0.34409101 13.330731 0.021125767 6.636497 6.673108 0.34409101 6.673108 427.93051 0.22484098 0.059732533 -0.013701884 0.11979273 -0.41246786 -0.65290152 1.0653694 8.0485344 1.6860895 0.59504581 -17.526328 1.6309787 -0.51172732 + 180 0.18 0.075555824 0.20943856 0.71500561 6.7234572 0.095560573 0.75602911 5.8718675 53.249585 0.16349946 2.976767 50.109319 0.48352545 0.11820921 0.021147982 0.34416826 13.348215 0.021147982 6.6367519 6.6903153 0.34416826 6.6903153 427.81541 0.22481375 0.059726057 -0.013693354 0.11961983 -0.41243578 -0.65212209 1.0645579 8.0447085 1.6861717 0.59328037 -17.51618 1.6306594 -0.5115256 + 181 0.181 0.075554472 0.20932194 0.71512359 6.7234228 0.095566037 0.75602446 5.8718323 53.245113 0.16353791 2.9786943 50.102881 0.48377787 0.11821586 0.02116825 0.34439376 13.366487 0.02116825 6.636208 6.7091106 0.34439376 6.7091106 427.69905 0.22478663 0.0597223 -0.013685566 0.11944982 -0.41241862 -0.65133545 1.0637541 8.0406991 1.686361 0.59173114 -17.508625 1.6304834 -0.51133554 + 182 0.182 0.075553018 0.20922203 0.71522496 6.7233732 0.095566471 0.75604754 5.8717592 53.241152 0.16353759 2.9804531 50.097161 0.48376627 0.11821919 0.021159262 0.34438782 13.381905 0.021159262 6.6364495 6.7242962 0.34438782 6.7242962 427.60207 0.22476313 0.059718992 -0.013678854 0.1192906 -0.41240466 -0.65063021 1.0630349 8.0374048 1.6865088 0.590091 -17.50065 1.6302503 -0.51116641 + 183 0.183 0.075550638 0.20909745 0.71535191 6.7234844 0.095570397 0.75597622 5.8719378 53.239168 0.16356833 2.9818222 50.093778 0.48396835 0.11822566 0.021170646 0.34457204 13.395606 0.021170646 6.6357145 6.738721 0.34457204 6.738721 427.52669 0.22473334 0.059713438 -0.013670661 0.1191243 -0.41239314 -0.64988725 1.0622804 8.0339261 1.6867529 0.58866125 -17.495114 1.6301495 -0.51099107 + 184 0.184 0.075546053 0.20898325 0.7154707 6.7234759 0.095571177 0.75597732 5.8719274 53.235303 0.16357465 2.9836917 50.088036 0.48396634 0.11823061 0.021180339 0.34455539 13.41284 0.021180339 6.6354713 6.7561886 0.34455539 6.7561886 427.42276 0.22470388 0.059705312 -0.013662024 0.11895186 -0.41236089 -0.64911653 1.0614774 8.0301741 1.6868547 0.58704389 -17.487328 1.6298806 -0.51079113 + 185 0.185 0.075537384 0.2088784 0.71558421 6.7234178 0.095562405 0.75604148 5.8718139 53.230305 0.16355737 2.9859981 50.08075 0.4839071 0.11821407 0.021198343 0.34449469 13.433277 0.021198343 6.6355597 6.7765188 0.34449469 6.7765188 427.29674 0.22467288 0.059696309 -0.013654594 0.11878029 -0.41230699 -0.6483353 1.0606423 8.025958 1.6869037 0.58539522 -17.478384 1.6295578 -0.51056961 + 186 0.186 0.075532433 0.20877334 0.71569423 6.7234818 0.095557806 0.7560279 5.871896 53.227957 0.16355035 2.9874878 50.076919 0.48389973 0.11820248 0.021216781 0.34448047 13.446672 0.021216781 6.6354919 6.7899634 0.34448047 6.7899634 427.22206 0.22464513 0.059690513 -0.013646563 0.11862078 -0.41228313 -0.64765585 1.059939 8.0227505 1.6870694 0.58391386 -17.471759 1.6293759 -0.51039741 + 187 0.187 0.075527925 0.2086833 0.71578877 6.7233017 0.095556722 0.75612226 5.8716227 53.221591 0.16353965 2.9899034 50.068148 0.48372893 0.11821021 0.021223148 0.34429557 13.467971 0.021223148 6.6356869 6.8110613 0.34429557 6.8110613 427.08149 0.22462111 0.059683333 -0.013640637 0.11846689 -0.41224031 -0.64691855 1.0591589 8.0188056 1.6870552 0.58230302 -17.461966 1.6290053 -0.51019551 + 188 0.188 0.075524119 0.20856405 0.71591183 6.7232798 0.095563692 0.75610534 5.8716107 53.217508 0.16358584 2.9916619 50.06226 0.48398582 0.11823054 0.021221204 0.34453408 13.484464 0.021221204 6.6353618 6.8278811 0.34453408 6.8278811 426.97589 0.22459123 0.059675618 -0.013633415 0.11829395 -0.41220609 -0.64612911 1.0583352 8.0150165 1.6871342 0.58061664 -17.453836 1.6287008 -0.50998966 + 189 0.189 0.075521539 0.20845866 0.7160198 6.7232772 0.095567203 0.75609258 5.8716174 53.214282 0.16360306 2.9931943 50.057484 0.48409304 0.11823265 0.021236639 0.34462376 13.498439 0.021236639 6.6352085 6.8419934 0.34462376 6.8419934 426.88977 0.22456552 0.059669376 -0.013625867 0.11813541 -0.41218504 -0.6454328 1.0576178 8.0118254 1.6872471 0.57906349 -17.446899 1.628456 -0.50981621 + 190 0.19 0.075516891 0.20836698 0.71611613 6.7231686 0.095566128 0.75615119 5.8714513 53.209502 0.16360008 2.9951075 50.050794 0.48405382 0.11823159 0.021247068 0.34457516 13.514526 0.021247068 6.6357326 6.8575466 0.34457516 6.8575466 426.78333 0.22454101 0.059661079 -0.013618232 0.11797442 -0.41214666 -0.64473511 1.0568818 8.0085057 1.6872469 0.57733035 -17.437487 1.6280707 -0.50962706 + 191 0.191 0.07551357 0.20827156 0.71621487 6.7231008 0.095563768 0.75619452 5.8713425 53.205056 0.16359222 2.9970567 50.044407 0.48402512 0.11822474 0.021253473 0.34454691 13.531838 0.021253473 6.6358226 6.8747615 0.34454691 6.8747615 426.67446 0.22451685 0.059656214 -0.013612281 0.11782167 -0.41212157 -0.64403619 1.0561578 8.0049716 1.6873583 0.575797 -17.429789 1.6278289 -0.50944944 + 192 0.192 0.075509655 0.2081645 0.71632584 6.7230453 0.095562542 0.75622719 5.8712555 53.200383 0.16359527 2.9991309 50.037657 0.48405073 0.11821534 0.021291986 0.3445434 13.550545 0.021291986 6.6356488 6.893604 0.3445434 6.893604 426.55721 0.22448958 0.059650487 -0.013604348 0.11765446 -0.41209229 -0.64327219 1.0553645 8.0010457 1.6874829 0.57419562 -17.421416 1.6275838 -0.50925363 + 193 0.193 0.075505031 0.20803943 0.71645554 6.7231423 0.095560607 0.7561864 5.8713953 53.197761 0.16359824 3.0008669 50.033296 0.4840699 0.11820984 0.021317772 0.34454228 13.567617 0.021317772 6.6348215 6.9114779 0.34454228 6.9114779 426.46435 0.22445768 0.059644609 -0.013594614 0.11748008 -0.41207046 -0.64249227 1.0545627 7.9971183 1.6877164 0.57276918 -17.415593 1.6274744 -0.50906092 + 194 0.194 0.075499852 0.20791585 0.7165843 6.7233272 0.095557567 0.75610613 5.8716635 53.196788 0.16359566 3.0021957 50.030997 0.48407823 0.1182058 0.021318146 0.34455428 13.581569 0.021318146 6.6338238 6.9264267 0.34455428 6.9264267 426.3987 0.22442561 0.059637657 -0.013585879 0.11731953 -0.41205264 -0.64178016 1.0538328 7.9936594 1.6879755 0.57153633 -17.412059 1.6274308 -0.50888683 + 195 0.195 0.075496431 0.20782353 0.71668004 6.7232608 0.095550235 0.75616864 5.871542 53.192096 0.16355294 3.0044142 50.024129 0.48380425 0.11818161 0.021359675 0.34426296 13.601621 0.021359675 6.6336145 6.9466468 0.34426296 6.9466468 426.27885 0.22440206 0.059633483 -0.013578465 0.11717052 -0.41203196 -0.64108316 1.0531151 7.9898594 1.6881363 0.57018362 -17.404966 1.627273 -0.50871356 + 196 0.196 0.075495641 0.20771934 0.71678502 6.723182 0.095552806 0.75619778 5.8714314 53.187513 0.1635578 3.0063312 50.017624 0.48377352 0.11818397 0.021387485 0.34420207 13.618744 0.021387485 6.6335686 6.9637876 0.34420207 6.9637876 426.16943 0.2243782 0.059631006 -0.013571822 0.1170036 -0.41201813 -0.64033714 1.0523553 7.9863371 1.6882781 0.56846234 -17.396582 1.6270166 -0.50853548 + 197 0.197 0.075491297 0.20761637 0.71689233 6.7231181 0.095552535 0.75623079 5.8713348 53.182772 0.16355567 3.008423 50.010793 0.48368042 0.11818646 0.021414447 0.34407952 13.638049 0.021414447 6.6332213 6.983413 0.34407952 6.983413 426.05019 0.22435146 0.059623631 -0.013563795 0.11684584 -0.41198437 -0.63959862 1.051583 7.9824545 1.6883584 0.56700286 -17.388621 1.6267637 -0.50834136 + 198 0.198 0.075488939 0.20749486 0.7170162 6.7231734 0.095553339 0.75619995 5.8714201 53.179734 0.16356837 3.0101399 50.006025 0.48380824 0.11818041 0.021431935 0.3441959 13.654294 0.021431935 6.6327547 7.0001072 0.3441959 7.0001072 425.95614 0.22432236 0.059619526 -0.01355588 0.11667688 -0.41197189 -0.638824 1.0507959 7.9786733 1.6886036 0.56546723 -17.382029 1.6266403 -0.50815812 + 199 0.199 0.07548305 0.2073647 0.71715225 6.7233795 0.095551325 0.75610497 5.8717232 53.178759 0.1635818 3.0115006 50.003677 0.48391878 0.1181807 0.021435916 0.34430216 13.668934 0.021435916 6.6315422 7.0159559 0.34430216 7.0159559 425.88651 0.2242882 0.059612101 -0.013545561 0.11651162 -0.41194986 -0.63808658 1.0500364 7.9749281 1.6888773 0.56429963 -17.378298 1.6266242 -0.50797467 + 200 0.2 0.075481607 0.20726357 0.71725482 6.7234218 0.095550395 0.75608753 5.8717839 53.176107 0.16358102 3.0130205 49.999505 0.48397439 0.11817218 0.021438671 0.34436353 13.683516 0.021438671 6.6310799 7.030997 0.34436353 7.030997 425.80329 0.22426445 0.059608428 -0.013537814 0.11636225 -0.41194429 -0.6374329 1.0493772 7.9717063 1.6891134 0.56301112 -17.373548 1.6265477 -0.50782446 + 201 0.201 0.075477794 0.20715966 0.71736255 6.7235652 0.095551627 0.75601087 5.8720028 53.175115 0.16361123 3.0140412 49.997463 0.48424546 0.11817159 0.021441463 0.34463241 13.69427 0.021441463 6.6302843 7.0425448 0.34463241 7.0425448 425.74784 0.22423796 0.059602632 -0.013529849 0.11622791 -0.41192825 -0.6368406 1.0487688 7.9687853 1.6893237 0.56198127 -17.370121 1.6265058 -0.50767857 + 202 0.202 0.075474167 0.20703337 0.71749246 6.7237567 0.095549514 0.7559236 5.8722836 53.174159 0.16361632 3.0153604 49.995182 0.48431774 0.11816516 0.02145392 0.34469866 13.707881 0.02145392 6.6293659 7.0570609 0.34469866 7.0570609 425.68317 0.22420668 0.059597917 -0.013520185 0.11606488 -0.41192042 -0.63611841 1.0480388 7.9652548 1.6896463 0.56074594 -17.36585 1.6265181 -0.50751113 + 203 0.203 0.075473044 0.20691614 0.71761082 6.7237941 0.095552217 0.75589407 5.8723478 53.171203 0.16363145 3.0169463 49.990625 0.48441637 0.11816606 0.021469108 0.3447812 13.722414 0.021469108 6.6291746 7.0717705 0.3447812 7.0717705 425.59728 0.22417963 0.059594589 -0.013512443 0.11589657 -0.41191299 -0.63536744 1.0472804 7.9617955 1.6898752 0.55912602 -17.358503 1.6263616 -0.50733765 + 204 0.204 0.07546954 0.20684898 0.71768148 6.7235047 0.095553396 0.75603404 5.8719173 53.163748 0.1636419 3.0193297 49.980776 0.48442746 0.11817557 0.021472559 0.34477933 13.742369 0.021472559 6.629909 7.0909877 0.34477933 7.0909877 425.45101 0.22416159 0.059589137 -0.013508344 0.11576088 -0.41186642 -0.63471609 1.0465825 7.9582319 1.6897699 0.55749567 -17.347558 1.6259056 -0.5071515 + 205 0.205 0.075464215 0.20674003 0.71779576 6.7235308 0.095551236 0.75602967 5.8719499 53.160401 0.16364994 3.0210884 49.975662 0.48447367 0.11817929 0.021470706 0.34482368 13.758708 0.021470706 6.629661 7.1075763 0.34482368 7.1075763 425.35482 0.22413264 0.05958282 -0.013499753 0.11560021 -0.41183474 -0.63399327 1.045828 7.9545345 1.6899091 0.55605225 -17.340305 1.6257086 -0.50696271 + 206 0.206 0.075462341 0.20659965 0.71793801 6.7237086 0.095555013 0.75592566 5.8722279 53.159012 0.16367596 3.0224788 49.972857 0.48462698 0.11819255 0.021458146 0.34497629 13.77339 0.021458146 6.6286271 7.123305 0.34497629 7.123305 425.28101 0.22409978 0.059578804 -0.013491272 0.11542384 -0.41183178 -0.63319018 1.045022 7.9507548 1.6902462 0.55461807 -17.33551 1.6256895 -0.50678162 + 207 0.207 0.075460207 0.20650333 0.71803646 6.7236954 0.09555623 0.75592737 5.8722118 53.155684 0.16368333 3.024054 49.967947 0.48466094 0.11819212 0.021476059 0.34499276 13.787648 0.021476059 6.6285145 7.1376576 0.34499276 7.1376576 425.19361 0.22407648 0.059574286 -0.013483886 0.1152788 -0.41181522 -0.63253815 1.0443534 7.947604 1.6903846 0.55321572 -17.328595 1.6255009 -0.50662201 + 208 0.208 0.075455868 0.20639957 0.71814456 6.7237861 0.095554435 0.7558892 5.8723425 53.153729 0.1636907 3.0254104 49.964628 0.48474799 0.11818987 0.021474682 0.34508344 13.800732 0.021474682 6.6280821 7.1511747 0.34508344 7.1511747 425.12237 0.22404957 0.059568668 -0.013477167 0.11513777 -0.41179468 -0.63189739 1.0436921 7.944429 1.6905687 0.55198914 -17.323474 1.625392 -0.50646136 + 209 0.209 0.075451114 0.20630449 0.7182444 6.7239012 0.095551937 0.75584165 5.8725076 53.152182 0.16369571 3.0266814 49.961805 0.48479841 0.11818115 0.021506887 0.34511037 13.813785 0.021506887 6.6271462 7.1651318 0.34511037 7.1651318 425.05486 0.22402421 0.059562793 -0.013468905 0.11501527 -0.4117739 -0.63132936 1.0431033 7.941335 1.6907584 0.55114003 -17.319842 1.6253719 -0.50631666 + 210 0.21 0.075447044 0.20620579 0.71834716 6.7238283 0.095552598 0.75587546 5.8724002 53.147605 0.16370889 3.0285891 49.955307 0.48483512 0.11819141 0.021506782 0.34513693 13.830879 0.021506782 6.6271842 7.1821878 0.34513693 7.1821878 424.94497 0.22399866 0.059556598 -0.013462331 0.11485918 -0.41174037 -0.63061687 1.0423572 7.9377385 1.6908223 0.54956412 -17.311344 1.6250785 -0.50612852 + 211 0.211 0.075443969 0.20611554 0.71844049 6.7237597 0.095554431 0.75590245 5.8723028 53.143391 0.16372261 3.0303324 49.949336 0.48488746 0.11819628 0.021522922 0.34516826 13.846644 0.021522922 6.6270819 7.1980392 0.34516826 7.1980392 424.84339 0.22397587 0.059550582 -0.013455777 0.11471939 -0.41171269 -0.6299689 1.0416816 7.9344474 1.6908885 0.54817249 -17.303891 1.6248281 -0.50595992 + 212 0.212 0.075440414 0.20602263 0.71853696 6.7236905 0.09555304 0.75594257 5.8721949 53.138892 0.16372003 3.0322815 49.94289 0.48486625 0.11819092 0.021543301 0.34513203 13.864748 0.021543301 6.6267195 7.2164852 0.34513203 7.2164852 424.73037 0.22395206 0.05954455 -0.013448509 0.11456817 -0.41168496 -0.62928984 1.0409748 7.9308772 1.6909846 0.54676756 -17.297392 1.6246013 -0.50578437 + 213 0.213 0.075438993 0.20592023 0.71864078 6.7236295 0.095558799 0.75595005 5.8721207 53.134576 0.16376688 3.0339774 49.936831 0.48521187 0.11819778 0.021553929 0.34546016 13.879942 0.021553929 6.6267115 7.2316769 0.34546016 7.2316769 424.62731 0.22392804 0.05954047 -0.013441886 0.11441189 -0.41166504 -0.62858127 1.0402463 7.9273819 1.6911144 0.54518867 -17.289157 1.6243659 -0.50560921 + 214 0.214 0.075436207 0.20581039 0.71875341 6.7237772 0.095557529 0.75588127 5.8723384 53.133341 0.16375931 3.03529 49.934291 0.48511598 0.11819997 0.021559001 0.345357 13.893669 0.021559001 6.6257343 7.2463758 0.345357 7.2463758 424.56128 0.22390116 0.059535931 -0.013433666 0.1142736 -0.41165872 -0.62794191 1.0396006 7.9241604 1.6913847 0.54417969 -17.285525 1.6243819 -0.50546151 + 215 0.215 0.07543172 0.20566237 0.71890591 6.7240184 0.095558757 0.75575578 5.8727039 53.132749 0.16377478 3.036609 49.932365 0.48519399 0.11820261 0.021579052 0.34541232 13.907989 0.021579052 6.6244296 7.2619808 0.34541232 7.2619808 424.49664 0.22386428 0.059529 -0.0134241 0.11409308 -0.41164552 -0.62712176 1.0387673 7.9203259 1.6917041 0.54275853 -17.281205 1.62435 -0.50526751 + 216 0.216 0.075428254 0.20553211 0.71903964 6.7241259 0.095563034 0.7556849 5.872878 53.130296 0.16380005 3.0382187 49.928277 0.48527206 0.11821637 0.021598696 0.34545699 13.924668 0.021598696 6.6232551 7.2798146 0.34545699 7.2798146 424.40594 0.22383225 0.059521959 -0.013415192 0.11392467 -0.41162605 -0.62633887 1.0379649 7.9164261 1.6919253 0.54139996 -17.275743 1.6242447 -0.50507624 + 217 0.217 0.075422717 0.20538909 0.71918819 6.7243862 0.095562951 0.7555551 5.8732681 53.130354 0.16381138 3.0393153 49.927227 0.48533526 0.11821582 0.021620301 0.34549914 13.936296 0.021620301 6.6222895 7.2923866 0.34549914 7.2923866 424.35839 0.22379555 0.059513174 -0.013404673 0.11374437 -0.41160853 -0.62556047 1.037169 7.9129844 1.6922051 0.53994059 -17.271034 1.6241691 -0.50488768 + 218 0.218 0.075420024 0.20527034 0.71930964 6.7245519 0.095567975 0.75545213 5.8735318 53.129512 0.16385257 3.0403173 49.925342 0.48558189 0.11822296 0.021653802 0.34570513 13.947209 0.021653802 6.6212084 7.3043466 0.34570513 7.3043466 424.3037 0.22376676 0.059508025 -0.01339677 0.11359491 -0.41159789 -0.62489893 1.0364968 7.9099134 1.6924463 0.53873497 -17.266874 1.6241156 -0.50473122 + 219 0.219 0.075417132 0.20518855 0.71939432 6.7244452 0.095570831 0.75549407 5.8733803 53.124828 0.16386227 3.0421404 49.918825 0.48556254 0.1182299 0.021679344 0.34565329 13.963897 0.021679344 6.6209655 7.3212526 0.34565329 7.3212526 424.19479 0.22374602 0.059501087 -0.01339038 0.11346561 -0.41156754 -0.6242851 1.0358526 7.9066646 1.6924669 0.53747572 -17.259704 1.623854 -0.50456784 + 220 0.22 0.075414584 0.20510992 0.7194755 6.7242336 0.095574798 0.75558402 5.8730748 53.118292 0.16387982 3.0443856 49.910027 0.48561873 0.1182407 0.021687009 0.34569102 13.983893 0.021687009 6.621041 7.3411646 0.34569102 7.3411646 424.05553 0.22372628 0.059494844 -0.013385293 0.11333299 -0.41153048 -0.62362299 1.0351535 7.9029752 1.69244 0.53607023 -17.250811 1.6235179 -0.50438776 + 221 0.221 0.075410541 0.20500448 0.71958498 6.7243609 0.09557237 0.75553006 5.8732585 53.117182 0.16386048 3.0455911 49.907731 0.48542638 0.11823609 0.021714613 0.34547568 13.995451 0.021714613 6.6205761 7.3531598 0.34547568 7.3531598 424.00082 0.22369925 0.059488145 -0.013376767 0.11318852 -0.41151532 -0.62299404 1.0345094 7.9001525 1.6926202 0.53480436 -17.24573 1.6233967 -0.50423452 + 222 0.222 0.075407629 0.20488651 0.71970587 6.7244866 0.095576722 0.75544984 5.87346 53.115921 0.16388309 3.0466966 49.905341 0.48547174 0.11825387 0.021722572 0.34549529 14.005958 0.021722572 6.6202651 7.3639707 0.34549529 7.3639707 423.9467 0.22367045 0.059482181 -0.013369626 0.11303672 -0.41150087 -0.62230671 1.0338076 7.8972017 1.6928015 0.53334737 -17.238951 1.6232341 -0.50406893 + 223 0.223 0.07540433 0.20476251 0.71983316 6.7246392 0.095574093 0.75538402 5.8736811 53.114467 0.16387824 3.0481299 49.902459 0.48548676 0.1182393 0.021751527 0.34549594 14.019847 0.021751527 6.6196547 7.378441 0.34549594 7.378441 423.87735 0.22363996 0.059476857 -0.013359593 0.11286906 -0.41149282 -0.62156998 1.0330628 7.8936947 1.6930989 0.53194595 -17.23351 1.623187 -0.50389806 + 224 0.224 0.075401069 0.20465719 0.71994174 6.7246071 0.095577907 0.7553848 5.8736444 53.110355 0.16389178 3.0499878 49.896475 0.48544887 0.1182592 0.021751778 0.34543789 14.037531 0.021751778 6.6191724 7.3966067 0.34543789 7.3966067 423.76951 0.22361366 0.059469591 -0.013352752 0.11272112 -0.41146466 -0.62085442 1.0323191 7.8900132 1.6931907 0.53057589 -17.22621 1.6229641 -0.50371401 + 225 0.225 0.075396508 0.2045205 0.72008299 6.7247658 0.095578496 0.7553031 5.8738842 53.108662 0.1639045 3.0514971 49.893261 0.48551141 0.11825774 0.02178358 0.34547009 14.052658 0.02178358 6.6182734 7.4126014 0.34547009 7.4126014 423.69231 0.22357923 0.059462202 -0.013343057 0.11254259 -0.41144537 -0.6200494 1.0314948 7.8861868 1.6934443 0.52906075 -17.220284 1.6228529 -0.50351797 + 226 0.226 0.075394688 0.20440432 0.72020099 6.7248687 0.095581872 0.75523817 5.8740486 53.106889 0.16392221 3.0527755 49.890192 0.48557117 0.11827015 0.02178376 0.34551726 14.065115 0.02178376 6.6177972 7.4255346 0.34551726 7.4255346 423.62547 0.22355179 0.059458 -0.013334576 0.11238537 -0.4114375 -0.61935406 1.0307916 7.8830306 1.6936712 0.52764722 -17.214344 1.6227405 -0.50335646 + 227 0.227 0.075392961 0.20429483 0.72031221 6.7249048 0.09558609 0.75520326 5.8741154 53.10414 0.16394417 3.054225 49.88597 0.48569496 0.1182776 0.021790881 0.34562648 14.078529 0.021790881 6.6175845 7.4391536 0.34562648 7.4391536 423.54563 0.22352593 0.059453502 -0.013328314 0.11223562 -0.41142439 -0.61866 1.0300844 7.8797955 1.6938456 0.52618311 -17.207391 1.6225701 -0.50319057 + 228 0.228 0.075388074 0.20417318 0.72043874 6.7251937 0.095585996 0.75505915 5.8745486 53.104855 0.16396877 3.0550693 49.885817 0.48587223 0.1182812 0.021798543 0.34579248 14.089572 0.021798543 6.6158319 7.4519412 0.34579248 7.4519412 423.50439 0.22349455 0.059447321 -0.013319411 0.11210138 -0.41141341 -0.61804506 1.0294585 7.8766241 1.6941658 0.5254276 -17.20651 1.6226868 -0.50304415 + 229 0.229 0.075384299 0.20404678 0.72056892 6.7252442 0.095585907 0.75503429 5.874624 53.101741 0.16397156 3.0568421 49.880927 0.48584782 0.11828402 0.021812022 0.34575178 14.105641 0.021812022 6.6157206 7.4681088 0.34575178 7.4681088 423.41225 0.22346311 0.0594412 -0.013310172 0.11191762 -0.41139191 -0.61723013 1.028622 7.8728318 1.6943561 0.52364949 -17.198002 1.6224609 -0.50284395 + 230 0.23 0.075380384 0.20392788 0.72069173 6.7253874 0.095585742 0.75496332 5.8748384 53.100167 0.16397549 3.0582581 49.877933 0.48585408 0.11828484 0.021823295 0.34574594 14.120275 0.021823295 6.6147309 7.4837204 0.34574594 7.4837204 423.33852 0.2234332 0.05943487 -0.0133025 0.11176811 -0.41137655 -0.61653072 1.0279073 7.8693307 1.6945978 0.52246926 -17.19367 1.6224135 -0.50267487 + 231 0.231 0.075377464 0.2038075 0.72081504 6.7254789 0.095588621 0.75490606 5.8749842 53.098036 0.163991 3.0596732 49.874372 0.4859169 0.11828789 0.021849509 0.3457795 14.133968 0.021849509 6.614147 7.4979719 0.3457795 7.4979719 423.26341 0.22340386 0.05942819 -0.013293925 0.1116022 -0.41136092 -0.61579698 1.0271579 7.8659693 1.6947941 0.5209544 -17.18749 1.6222513 -0.50249793 + 232 0.232 0.075373003 0.20370395 0.72092305 6.7254388 0.095591027 0.7549165 5.8749312 53.094194 0.16400991 3.0613379 49.868846 0.48600526 0.11829517 0.02186131 0.34584878 14.148277 0.02186131 6.6144364 7.5119796 0.34584878 7.5119796 423.17104 0.22337688 0.059420108 -0.013285641 0.11143835 -0.41132549 -0.61508191 1.0264074 7.8626672 1.6948299 0.51923251 -17.178376 1.6219005 -0.50230753 + 233 0.233 0.075368568 0.20358582 0.72104561 6.7254598 0.095591403 0.75490451 5.8749639 53.090687 0.16401325 3.0631724 49.863501 0.48595397 0.11829771 0.021891807 0.34576445 14.16503 0.021891807 6.6141933 7.5289454 0.34576445 7.5289454 423.0728 0.22334669 0.059413364 -0.013277494 0.1112705 -0.41129687 -0.61430373 1.0256006 7.858878 1.6949653 0.51761139 -17.169925 1.6216605 -0.50210915 + 234 0.234 0.075367551 0.20348766 0.72114479 6.7253389 0.095598327 0.75493724 5.8748033 53.085571 0.16403555 3.0650976 49.856437 0.48598714 0.118313 0.021914392 0.34575975 14.182225 0.021914392 6.6141691 7.5461416 0.34575975 7.5461416 422.95767 0.22332397 0.059408031 -0.013271323 0.11111908 -0.41127399 -0.61358626 1.0248603 7.8553872 1.6950201 0.51598991 -17.160947 1.621349 -0.50192939 + 235 0.235 0.075363864 0.20340829 0.72122785 6.7252546 0.095592352 0.75500328 5.874659 53.081064 0.16399992 3.0671139 49.849951 0.48573087 0.11830225 0.021925225 0.3455034 14.200214 0.021925225 6.6142044 7.5640846 0.3455034 7.5640846 422.84777 0.22330305 0.059402845 -0.013265153 0.11098909 -0.41124882 -0.61296923 1.024218 7.8520148 1.6951119 0.51473382 -17.153966 1.6211514 -0.50176989 + 236 0.236 0.075358996 0.20328247 0.72135854 6.7253419 0.095592534 0.75495891 5.8747905 53.078331 0.1640056 3.0688508 49.845474 0.48572182 0.11830491 0.021944661 0.34547225 14.217213 0.021944661 6.6134434 7.5818253 0.34547225 7.5818253 422.75454 0.22327077 0.05939494 -0.013256199 0.11081895 -0.41122248 -0.61218519 1.0234077 7.8481069 1.6952995 0.51326627 -17.147552 1.620992 -0.50157225 + 237 0.237 0.075355637 0.20319521 0.72144915 6.7252941 0.095593688 0.75497819 5.8747222 53.07453 0.16402052 3.0704765 49.840033 0.48580012 0.11830439 0.021974718 0.34552101 14.231912 0.021974718 6.6132892 7.5966485 0.34552101 7.5966485 422.66066 0.22324839 0.059389938 -0.013251052 0.1106881 -0.41119513 -0.61156937 1.0227645 7.8449489 1.6953719 0.51195393 -17.140458 1.6207648 -0.50141109 + 238 0.238 0.075350922 0.20306416 0.72158492 6.725542 0.095592519 0.75485891 5.8750906 53.074677 0.1640325 3.0714708 49.839173 0.48589867 0.11830531 0.021975674 0.34561769 14.242622 0.021975674 6.6124049 7.6082416 0.34561769 7.6082416 422.61728 0.22321508 0.059383873 -0.013242253 0.11052418 -0.41118328 -0.61085765 1.0220409 7.841761 1.6956675 0.51060366 -17.136499 1.6207275 -0.50124239 + 239 0.239 0.075350374 0.20295302 0.7216966 6.7255571 0.0955928 0.75485027 5.875114 53.071167 0.16403297 3.0732911 49.833843 0.48587871 0.11830321 0.021996182 0.34557932 14.259838 0.021996182 6.6119064 7.6259354 0.34557932 7.6259354 422.51657 0.22318989 0.059382338 -0.013235105 0.11036675 -0.41118044 -0.61012186 1.0213023 7.8380498 1.6959357 0.5091561 -17.129865 1.6206442 -0.50107636 + 240 0.24 0.075347616 0.20284025 0.72181214 6.7256716 0.095594832 0.75478488 5.8752919 53.06964 0.16404018 3.0745412 49.831059 0.48585232 0.11830961 0.022016207 0.3455265 14.27197 0.022016207 6.6113855 7.6385681 0.3455265 7.6385681 422.45409 0.22316238 0.059376406 -0.013226881 0.11021888 -0.41116849 -0.609452 1.0206205 7.8349823 1.6961377 0.50783014 -17.124002 1.6205291 -0.50091688 + 241 0.241 0.075342742 0.20273828 0.72191898 6.7256902 0.095592974 0.75478301 5.8753142 53.06646 0.16404837 3.0761824 49.826229 0.48593337 0.11830344 0.022037204 0.34559273 14.286745 0.022037204 6.6112994 7.6534082 0.34559273 7.6534082 422.3655 0.22313539 0.059369996 -0.01321886 0.11006747 -0.41113897 -0.60877185 1.0199108 7.8315516 1.6962624 0.50640122 -17.116564 1.6203224 -0.50073949 + 242 0.242 0.075336864 0.20261447 0.72204867 6.7258025 0.095590226 0.75473786 5.8754744 53.063823 0.16404292 3.0780281 49.821752 0.48585325 0.11830317 0.022053826 0.34549625 14.305682 0.022053826 6.6100703 7.6735574 0.34549625 7.6735574 422.26563 0.22310265 0.059362268 -0.013209764 0.10990724 -0.41111064 -0.60800703 1.0191177 7.8274038 1.6964788 0.50520023 -17.111719 1.6202479 -0.50054435 + 243 0.243 0.075333113 0.2025137 0.72215319 6.7258227 0.09559382 0.75471337 5.8755155 53.061135 0.16406806 3.0793625 49.817704 0.48596192 0.11831413 0.02206876 0.34557903 14.317423 0.02206876 6.6101451 7.6852087 0.34557903 7.6852087 422.1935 0.22307692 0.059355308 -0.013202189 0.10976222 -0.41108334 -0.60735786 1.0184412 7.8244438 1.6965549 0.50371843 -17.103756 1.6199863 -0.50037583 + 244 0.244 0.075328522 0.20239793 0.72227355 6.7260036 0.09559682 0.75461093 5.8757958 53.060664 0.16410594 3.0802605 49.816297 0.48619315 0.11832413 0.022083622 0.3457854 14.326858 0.022083622 6.6094084 7.6953664 0.3457854 7.6953664 422.14851 0.22304712 0.059348372 -0.013193452 0.10961455 -0.41106309 -0.60671826 1.0177814 7.8215397 1.6967482 0.50247039 -17.09891 1.6198807 -0.50021569 + 245 0.245 0.075326861 0.20229525 0.72237789 6.7259523 0.095600214 0.75462297 5.8757292 53.056172 0.16412919 3.082183 49.809859 0.48633164 0.11833373 0.022080604 0.3459173 14.344583 0.022080604 6.6092097 7.7132926 0.3459173 7.7132926 422.0356 0.22302282 0.059344152 -0.013186984 0.10947016 -0.41104467 -0.60600526 1.0170499 7.8177366 1.696908 0.50109638 -17.091004 1.6197174 -0.50004087 + 246 0.246 0.075324425 0.20216904 0.72250654 6.7260027 0.095603829 0.75458333 5.8758156 53.052512 0.16415384 3.0841406 49.804218 0.48644531 0.1183456 0.022087243 0.34601247 14.364711 0.022087243 6.6079282 7.7346955 0.34601247 7.7346955 421.91976 0.22299261 0.059340182 -0.013178519 0.10930487 -0.41102845 -0.60520618 1.0162346 7.8134 1.6971609 0.49980192 -17.085614 1.6196545 -0.49984889 + 247 0.247 0.075320708 0.20205343 0.72262586 6.7259478 0.095606048 0.75460192 5.8757398 53.047489 0.16417999 3.0863005 49.797009 0.48660231 0.11835487 0.022089298 0.34615814 14.384573 0.022089298 6.6077086 7.7547752 0.34615814 7.7547752 421.79333 0.22296361 0.059334367 -0.013170672 0.10913641 -0.4109971 -0.6043989 1.015396 7.8091156 1.6972956 0.49818424 -17.076612 1.6194148 -0.49964162 + 248 0.248 0.075319167 0.20191982 0.72276101 6.7260785 0.095610551 0.75451854 5.8759494 53.045568 0.16420386 3.087754 49.79361 0.48667968 0.11836937 0.022100054 0.34621026 14.399088 0.022100054 6.6069484 7.7700399 0.34621026 7.7700399 421.71648 0.22293255 0.059330377 -0.013162423 0.10896679 -0.41099208 -0.60361005 1.0146021 7.8054356 1.6975859 0.49665943 -17.070104 1.619334 -0.49946186 + 249 0.249 0.075316809 0.20178097 0.72290222 6.726392 0.095615304 0.75434278 5.8764339 53.046565 0.16423953 3.0885233 49.793802 0.4869007 0.1183832 0.02209473 0.34642277 14.409273 0.02209473 6.6053395 7.7818385 0.34642277 7.7818385 421.6809 0.2228996 0.059325548 -0.013153107 0.10881509 -0.41099508 -0.60291511 1.0139102 7.8022158 1.6979695 0.49562277 -17.068181 1.6194446 -0.4993101 + 250 0.25 0.075314236 0.20168744 0.72299833 6.7263225 0.095614862 0.75437932 5.8763283 53.042141 0.1642418 3.0904134 49.787486 0.48689591 0.11838075 0.022117129 0.34639803 14.426284 0.022117129 6.6052499 7.7989165 0.34639803 7.7989165 421.57304 0.22287653 0.059321915 -0.013146677 0.10866748 -0.41097297 -0.60223543 1.0132084 7.7987272 1.698087 0.49413922 -17.060517 1.6192193 -0.49913941 + 251 0.251 0.075311945 0.2015817 0.72310636 6.726376 0.095617482 0.7543421 5.8764164 53.039845 0.16424221 3.0918003 49.783803 0.48680265 0.11838558 0.022146286 0.34627079 14.439429 0.022146286 6.6048017 7.8124812 0.34627079 7.8124812 421.50034 0.22285099 0.059316487 -0.013140772 0.10852538 -0.41095897 -0.60157219 1.0125312 7.7957118 1.6982374 0.49273966 -17.054389 1.6190421 -0.49897957 + 252 0.252 0.075307448 0.20150358 0.72318897 6.7264579 0.095612673 0.75432038 5.8765248 53.03857 0.1642231 3.0928828 49.781465 0.48671748 0.11837173 0.022158279 0.34618747 14.449721 0.022158279 6.6044788 7.8230843 0.34618747 7.8230843 421.44824 0.22282964 0.059309525 -0.013133441 0.10841111 -0.4109397 -0.60108499 1.0120247 7.7933351 1.6983609 0.49176644 -17.050837 1.6189356 -0.49885418 + 253 0.253 0.07530201 0.20141054 0.72328745 6.7265272 0.095613212 0.75428357 5.8766304 53.036157 0.16423348 3.0943598 49.777564 0.48671467 0.11837673 0.022186398 0.34615155 14.465216 0.022186398 6.6032653 7.8397644 0.34615155 7.8397644 421.36342 0.22280413 0.059300633 -0.013124935 0.10829359 -0.4109078 -0.60050989 1.0114177 7.7899894 1.6984692 0.49101095 -17.047038 1.618864 -0.49869802 + 254 0.254 0.075296081 0.20130898 0.72339494 6.7265216 0.095611765 0.75429216 5.8766176 53.032315 0.16425257 3.0961793 49.771883 0.4868898 0.11837537 0.022190201 0.34632422 14.481948 0.022190201 6.6030721 7.8566857 0.34632422 7.8566857 421.25997 0.22277629 0.059292741 -0.013118166 0.10814944 -0.41086895 -0.59981705 1.010686 7.7862225 1.6985648 0.48966264 -17.039577 1.6186493 -0.49850952 + 255 0.255 0.075291752 0.20118683 0.72352142 6.7266561 0.095610231 0.75423102 5.8768149 53.030342 0.16425726 3.0977523 49.768333 0.48694964 0.11837411 0.022186385 0.34638915 14.498136 0.022186385 6.6020716 7.8738785 0.34638915 7.8738785 421.17586 0.2227453 0.059287324 -0.013110254 0.1079927 -0.41085149 -0.59908361 1.0099351 7.7824399 1.6988233 0.48840457 -17.035259 1.6185995 -0.49833102 + 256 0.256 0.075285795 0.20107412 0.72364009 6.7265939 0.09560799 0.75427111 5.8767148 53.025102 0.16427085 3.1000382 49.760793 0.48708441 0.11837359 0.022182264 0.34652856 14.518772 0.022182264 6.602057 7.8945323 0.34652856 7.8945323 421.04478 0.22271495 0.059279585 -0.013102484 0.1078214 -0.41080897 -0.59827281 1.0090818 7.7780366 1.6989242 0.48673911 -17.026014 1.6183191 -0.49811304 + 257 0.257 0.075283788 0.20096594 0.72375027 6.7267518 0.095608891 0.75418855 5.8769543 53.02461 0.16426599 3.1010142 49.75933 0.48697079 0.11838226 0.022182527 0.346406 14.528629 0.022182527 6.601519 7.9049275 0.346406 7.9049275 421.00153 0.22268913 0.059275629 -0.013095611 0.10768421 -0.41080646 -0.59765947 1.0084659 7.7754203 1.6991587 0.48548724 -17.021569 1.6182494 -0.49797452 + 258 0.258 0.075280147 0.20084048 0.72387937 6.7267649 0.095607758 0.75418653 5.8769706 53.020771 0.16426075 3.1030136 49.753496 0.48687103 0.11838637 0.022192378 0.34629228 14.546707 0.022192378 6.6014378 7.9230772 0.34629228 7.9230772 420.89561 0.22265802 0.059270427 -0.01308684 0.10749857 -0.41078409 -0.59682018 1.0076043 7.7714051 1.6993453 0.48363437 -17.012534 1.6180035 -0.49776812 + 259 0.259 0.07527769 0.20075055 0.72397176 6.7267277 0.095605319 0.75421486 5.8769075 53.01711 0.16423002 3.1047998 49.74808 0.48656858 0.11838348 0.02221689 0.3459682 14.562791 0.02221689 6.6013357 7.9392386 0.3459682 7.9392386 420.80129 0.22263585 0.059265656 -0.013081052 0.10736271 -0.41076721 -0.59617946 1.0069467 7.7682439 1.6994628 0.48225933 -17.005529 1.6178023 -0.49761073 + 260 0.26 0.075273089 0.20066083 0.72406608 6.7266699 0.095602568 0.75425478 5.8768125 53.013131 0.16421834 3.1065758 49.742337 0.48647033 0.11837957 0.022229045 0.34586171 14.578025 0.022229045 6.6016623 7.9541338 0.34586171 7.9541338 420.70587 0.22261182 0.059258627 -0.013074058 0.10721592 -0.41073465 -0.59552437 1.006259 7.7650429 1.6995091 0.48070876 -16.997227 1.6174989 -0.49743622 + 261 0.261 0.075267529 0.20054554 0.72418693 6.7267597 0.095602416 0.75421047 5.8769468 53.010681 0.16421963 3.1081998 49.738261 0.48638691 0.11838692 0.022247215 0.34575278 14.594339 0.022247215 6.6007407 7.9713515 0.34575278 7.9713515 420.61852 0.22258126 0.059250203 -0.013065082 0.10706346 -0.41070417 -0.59481118 1.0055153 7.7613844 1.6996532 0.47944807 -16.991695 1.6173468 -0.49725063 + 262 0.262 0.075264291 0.20043327 0.72430244 6.7268628 0.095603312 0.75415535 5.8771042 53.00856 0.16423102 3.1096787 49.73465 0.48644738 0.11838912 0.022259432 0.34579883 14.609509 0.022259432 6.599762 7.9874879 0.34579883 7.9874879 420.5372 0.22255343 0.059244429 -0.013057579 0.10692062 -0.41068925 -0.59413178 1.004821 7.7578763 1.6998798 0.47828559 -16.987209 1.61729 -0.49708639 + 263 0.263 0.075260377 0.20032418 0.72441544 6.7269362 0.095602635 0.75412138 5.8772122 53.006334 0.16422546 3.1111439 49.730965 0.48634244 0.11838872 0.022288504 0.34566522 14.623104 0.022288504 6.5994412 8.0013747 0.34566522 8.0013747 420.46357 0.22252571 0.059238086 -0.013049469 0.10676917 -0.41066912 -0.59344661 1.0041157 7.7546639 1.7000386 0.47684831 -16.980425 1.6171118 -0.49691624 + 264 0.264 0.075254959 0.20023726 0.72450778 6.726902 0.095600434 0.75414728 5.8771543 53.002776 0.16421513 3.1128106 49.72575 0.48619728 0.11839192 0.022301773 0.34550358 14.63796 0.022301773 6.5994605 8.0161977 0.34550358 8.0161977 420.37362 0.22250158 0.059229905 -0.013043876 0.10663636 -0.4106323 -0.59282912 1.0034614 7.7515654 1.7000599 0.47548697 -16.973035 1.6168281 -0.49674629 + 265 0.265 0.075251023 0.20015294 0.72459604 6.7268996 0.095596739 0.75416325 5.8771396 52.999758 0.16419585 3.1143855 49.721177 0.48604086 0.11838454 0.022322739 0.34533357 14.652204 0.022322739 6.5993421 8.0305389 0.34533357 8.0305389 420.29097 0.22247934 0.059224026 -0.013036409 0.10650768 -0.41060934 -0.59224546 1.0028548 7.7485803 1.7001654 0.47427969 -16.966805 1.6166536 -0.49659618 + 266 0.266 0.075247092 0.20005695 0.72469596 6.7267953 0.095599936 0.7542026 5.8769928 52.994338 0.16423579 3.1164665 49.713636 0.4863273 0.11838886 0.02234195 0.34559649 14.67152 0.02234195 6.5989717 8.0502061 0.34559649 8.0502061 420.16174 0.22245452 0.059218271 -0.013030568 0.10636452 -0.41057185 -0.59153956 1.0021114 7.7445633 1.7002315 0.47291177 -16.958864 1.6164084 -0.49640599 + 267 0.267 0.075247815 0.19994813 0.72480406 6.7267793 0.095604723 0.75419148 5.8769831 52.990786 0.16425667 3.118087 49.708442 0.48644888 0.11839276 0.022359514 0.34569661 14.685909 0.022359514 6.5989992 8.0645501 0.34569661 8.0645501 420.07106 0.22243097 0.059216281 -0.013023715 0.10620506 -0.41057072 -0.59081542 1.0013861 7.7412268 1.700453 0.4712486 -16.950702 1.6162357 -0.49624406 + 268 0.268 0.075246007 0.19981018 0.72494381 6.7268692 0.095606373 0.75413988 5.877123 52.987845 0.16426375 3.1199341 49.703647 0.4864595 0.1183943 0.022379927 0.34568528 14.703534 0.022379927 6.5984164 8.0827381 0.34568528 8.0827381 419.97344 0.22239871 0.059211875 -0.013013674 0.10601769 -0.41056368 -0.58995706 1.0005207 7.7370752 1.7007563 0.4695513 -16.943031 1.6161282 -0.49604706 + 269 0.269 0.075240774 0.19969179 0.72506744 6.7270065 0.095601848 0.75408935 5.8773153 52.985955 0.16424894 3.121556 49.70015 0.48635299 0.11838875 0.02238876 0.34557549 14.71981 0.02238876 6.5975418 8.0998797 0.34557549 8.0998797 419.89153 0.22236775 0.059205583 -0.013005408 0.10586521 -0.41054333 -0.5892386 0.99978193 7.7333385 1.701 0.46831977 -16.93815 1.616071 -0.49586932 + 270 0.27 0.075236927 0.19961977 0.7251433 6.7268356 0.095602892 0.75417064 5.877062 52.980358 0.16426628 3.1235162 49.692575 0.48646622 0.11839052 0.022403091 0.34567261 14.736595 0.022403091 6.5979129 8.1162793 0.34567261 8.1162793 419.77328 0.22234833 0.059199282 -0.012999619 0.10573809 -0.41050354 -0.58863872 0.99914226 7.7300406 1.7009667 0.46694125 -16.929281 1.6157351 -0.49570064 + 271 0.271 0.075232198 0.19956979 0.72519801 6.7266081 0.095601364 0.75429052 5.8767162 52.973775 0.16428442 3.1257111 49.683779 0.4866422 0.1183825 0.022428773 0.34583093 14.756484 0.022428773 6.5977428 8.1363129 0.34583093 8.1363129 419.6326 0.22233302 0.059193755 -0.012995525 0.10564488 -0.41045615 -0.58813725 0.99859339 7.7265189 1.7009061 0.46608343 -16.922482 1.6154907 -0.49554707 + 272 0.272 0.075231715 0.19945912 0.72530917 6.7266291 0.09559974 0.75428647 5.8767429 52.970374 0.16425509 3.1276237 49.678496 0.48637495 0.11837487 0.022460939 0.34553914 14.774595 0.022460939 6.5971652 8.1549688 0.34553914 8.1549688 419.5317 0.22230799 0.059191266 -0.01298682 0.10548628 -0.4104561 -0.58740105 0.99785715 7.7228346 1.701175 0.46465756 -16.916174 1.6154128 -0.49538344 + 273 0.273 0.075229608 0.19936576 0.72540464 6.7266737 0.095597762 0.75427209 5.8768039 52.968222 0.16423271 3.1289897 49.675 0.4861939 0.1183665 0.022484252 0.34534314 14.786741 0.022484252 6.5971461 8.167111 0.34534314 8.167111 419.46558 0.22228538 0.059186249 -0.012978746 0.10534933 -0.41044726 -0.58679631 0.99724357 7.720083 1.7013437 0.46331458 -16.909941 1.6152643 -0.49524119 + 274 0.274 0.075226095 0.19924939 0.72552452 6.7268418 0.095594996 0.75419913 5.8770477 52.967574 0.16421437 3.1301437 49.673216 0.4860228 0.11836257 0.022502984 0.34515724 14.797622 0.022502984 6.5968237 8.178295 0.34515724 8.178295 419.41764 0.22225639 0.059180711 -0.0129696 0.10519115 -0.41043905 -0.58611999 0.99655904 7.7171733 1.7015877 0.46185984 -16.904159 1.6151579 -0.49508359 + 275 0.275 0.075221216 0.19914169 0.7256371 6.7268811 0.09559636 0.75417403 5.8771107 52.9647 0.16423251 3.131685 49.668782 0.48608164 0.1183805 0.022483454 0.34521769 14.812038 0.022483454 6.5966295 8.1929254 0.34521769 8.1929254 419.3333 0.22222812 0.059173689 -0.012963136 0.10504395 -0.41040781 -0.58542843 0.99583624 7.7137707 1.7016925 0.46042012 -16.896904 1.6149311 -0.49490215 + 276 0.276 0.07521828 0.19902098 0.72576074 6.7268454 0.095594936 0.75419757 5.8770529 52.959893 0.16423179 3.1339305 49.661731 0.48608459 0.11837729 0.022491602 0.3452157 14.832174 0.022491602 6.5966336 8.2130491 0.3452157 8.2130491 419.20949 0.22219869 0.059169552 -0.012954764 0.10486345 -0.4103868 -0.5845858 0.9949726 7.7094444 1.7018969 0.45863718 -16.88748 1.6147166 -0.49469622 + 277 0.277 0.075214914 0.19889847 0.72588662 6.7268971 0.095595579 0.75416915 5.8771323 52.956768 0.16424799 3.1356609 49.656859 0.48619564 0.1183826 0.022487752 0.34532529 14.848069 0.022487752 6.5964885 8.2290929 0.34532529 8.2290929 419.11652 0.22216847 0.059164252 -0.012945768 0.10468961 -0.41036741 -0.58380035 0.99416776 7.7056237 1.7021079 0.45697082 -16.879394 1.6145338 -0.49450444 + 278 0.278 0.075212706 0.19879253 0.72599476 6.7269199 0.095600591 0.7541377 5.8771816 52.953627 0.16429091 3.137162 49.652175 0.48648732 0.11839342 0.022491762 0.34560215 14.862166 0.022491762 6.5961791 8.2434951 0.34560215 8.2434951 419.02867 0.22214297 0.059160015 -0.012939519 0.10454945 -0.41034926 -0.58312374 0.993473 7.7021766 1.7022784 0.4556296 -16.872241 1.6143874 -0.49433795 + 279 0.279 0.075209148 0.19867707 0.72611378 6.7270568 0.095598449 0.75407781 5.8773805 52.952128 0.1642851 3.1385509 49.649292 0.4864807 0.11838561 0.022500152 0.34559493 14.875621 0.022500152 6.5956681 8.2574529 0.34559493 8.2574529 418.96092 0.22211415 0.059154356 -0.012931754 0.10440046 -0.41033776 -0.58243413 0.9927719 7.6988354 1.7025315 0.45431207 -16.866913 1.6143195 -0.49417448 + 280 0.28 0.07520647 0.19859593 0.7261976 6.7267065 0.095603943 0.754231 5.8768715 52.942772 0.1643306 3.1414707 49.636971 0.48678626 0.11839596 0.022510725 0.34587957 14.900609 0.022510725 6.5962709 8.2818273 0.34587957 8.2818273 418.77434 0.22209374 0.059148357 -0.012926233 0.10425179 -0.4102879 -0.58166555 0.99195345 7.6941921 1.7024642 0.45263831 -16.85419 1.6138878 -0.49395937 + 281 0.281 0.07520132 0.19849271 0.72630597 6.7268467 0.095602781 0.75416552 5.8770784 52.94179 0.1643233 3.142622 49.634845 0.48665098 0.11839713 0.022540818 0.34571302 14.912424 0.022540818 6.5954237 8.2944596 0.34571302 8.2944596 418.71881 0.22206622 0.059140274 -0.012918057 0.10411796 -0.41026497 -0.58106454 0.99132951 7.6913233 1.70261 0.45152656 -16.849958 1.6137703 -0.49380543 + 282 0.282 0.075199364 0.19840362 0.72639702 6.7269483 0.095603352 0.75411245 5.8772325 52.940736 0.16432619 3.1435943 49.632816 0.4866569 0.11839851 0.022545339 0.34571305 14.921833 0.022545339 6.5950765 8.3042114 0.34571305 8.3042114 418.67129 0.22204468 0.059136026 -0.012911373 0.104001 -0.41025888 -0.58053844 0.99079732 7.6889032 1.702797 0.45046472 -16.845598 1.6137006 -0.4936831 + 283 0.283 0.075197836 0.19828884 0.72651332 6.7270447 0.095604601 0.75405927 5.8773808 52.938181 0.16434866 3.1452159 49.628616 0.48688928 0.11839528 0.022543198 0.34595081 14.938515 0.022543198 6.5940411 8.321931 0.34595081 8.321931 418.5782 0.22201782 0.059133187 -0.012902935 0.10385638 -0.4102546 -0.57983863 0.99009323 7.6850511 1.703114 0.44936601 -16.841387 1.6137383 -0.49352378 + 284 0.284 0.075192617 0.19818379 0.72662359 6.7270911 0.095605193 0.75403368 5.8774522 52.935278 0.1643598 3.1468319 49.624086 0.48693258 0.11840014 0.022552231 0.34598021 14.954485 0.022552231 6.593292 8.3386412 0.34598021 8.3386412 418.48703 0.22198984 0.059124969 -0.012896162 0.10371621 -0.41022239 -0.57916673 0.98938912 7.681523 1.7032245 0.44813274 -16.835978 1.6135624 -0.49334584 + 285 0.285 0.075188719 0.19806806 0.72674322 6.7271696 0.095599371 0.75401773 5.8775525 52.932607 0.16433112 3.1486351 49.619641 0.48676697 0.11837807 0.022594286 0.34579462 14.971036 0.022594286 6.5929625 8.3554797 0.34579462 8.3554797 418.39818 0.22196065 0.059120355 -0.012888251 0.10355564 -0.41020789 -0.57841968 0.98862757 7.6777965 1.7034723 0.44663099 -16.829048 1.6134489 -0.49316695 + 286 0.286 0.075185095 0.19798809 0.72682681 6.7271402 0.095604613 0.75401143 5.8775242 52.929547 0.16438023 3.1498368 49.61533 0.48709619 0.11839219 0.022594164 0.34610983 14.981464 0.022594164 6.593157 8.3657126 0.34610983 8.3657126 418.32584 0.22193966 0.059114181 -0.012883545 0.10344282 -0.41017607 -0.57788223 0.9880583 7.675131 1.7034911 0.44540643 -16.821625 1.6131935 -0.49301922 + 287 0.287 0.075178087 0.19790796 0.72691396 6.7269705 0.095605793 0.7540916 5.8772731 52.923541 0.16440586 3.1519731 49.607162 0.48722157 0.11840479 0.022596449 0.34622033 15.000125 0.022596449 6.5934305 8.3840982 0.34622033 8.3840982 418.19618 0.22191562 0.059104038 -0.012877944 0.1033108 -0.41011498 -0.57722937 0.98734435 7.6714095 1.703378 0.44399309 -16.811941 1.6127789 -0.49281984 + 288 0.288 0.075174254 0.19782086 0.72700488 6.7268883 0.0956074 0.75412623 5.8771547 52.918816 0.16442221 3.1539009 49.600492 0.48729957 0.11840974 0.022611219 0.34627861 15.017928 0.022611219 6.5931451 8.4021715 0.34627861 8.4021715 418.08141 0.22189286 0.059097142 -0.012870203 0.10318064 -0.41008141 -0.57659262 0.98667403 7.6677889 1.7034334 0.44280347 -16.804595 1.6125638 -0.4926485 + 289 0.289 0.075171097 0.197713 0.72711591 6.7268622 0.095605393 0.75414734 5.8771095 52.91431 0.16442427 3.1560279 49.593858 0.48732155 0.11840767 0.022617782 0.3462961 15.03776 0.022617782 6.5927741 8.4223683 0.3462961 8.4223683 417.96095 0.22186609 0.059093515 -0.01286142 0.10302122 -0.41006022 -0.57584073 0.98590095 7.6636349 1.7036347 0.44138372 -16.797006 1.6124272 -0.49246258 + 290 0.29 0.075167438 0.19760815 0.72722441 6.7268025 0.09560608 0.75417443 5.877022 52.909486 0.16442325 3.1581753 49.586888 0.4872456 0.11840383 0.022666474 0.34617529 15.057601 0.022666474 6.592322 8.4426129 0.34617529 8.4426129 417.83857 0.22183953 0.059086425 -0.012853139 0.10286763 -0.41003043 -0.57509658 0.98512701 7.6596141 1.7037402 0.43995178 -16.788879 1.6122028 -0.49227073 + 291 0.291 0.075164356 0.19749937 0.72733627 6.7269035 0.095610436 0.75410649 5.8771866 52.907667 0.16444427 3.1594552 49.583768 0.48731157 0.1184169 0.022675842 0.34621883 15.071208 0.022675842 6.5912409 8.4572913 0.34621883 8.4572913 417.76607 0.22181262 0.059080402 -0.012847715 0.10273439 -0.41001294 -0.57445273 0.98446567 7.6564362 1.7039085 0.43880031 -16.784892 1.6120965 -0.49211211 + 292 0.292 0.075162553 0.19741114 0.7274263 6.7268671 0.095610152 0.75412584 5.8771311 52.904198 0.16443029 3.1610819 49.578686 0.48718895 0.1184105 0.022699843 0.34607861 15.085587 0.022699843 6.5912758 8.4716111 0.34607861 8.4716111 417.67863 0.22179141 0.059075431 -0.012840632 0.10259742 -0.40999835 -0.57383269 0.98383104 7.6534568 1.7040246 0.43739616 -16.777986 1.6118877 -0.49196136 + 293 0.293 0.075158799 0.19731671 0.72752449 6.726869 0.095611907 0.75411786 5.8771392 52.900894 0.16444798 3.1626717 49.573774 0.48729698 0.11841362 0.022712918 0.34617044 15.100496 0.022712918 6.590923 8.4868602 0.34617044 8.4868602 417.58785 0.22176709 0.059068719 -0.012833565 0.10246767 -0.40997149 -0.5732058 0.98317729 7.6501271 1.7041293 0.43620206 -16.771514 1.6117154 -0.49179817 + 294 0.294 0.075153764 0.19722627 0.72761997 6.7268864 0.09560917 0.75412014 5.877157 52.897754 0.16444116 3.1643468 49.568966 0.48722377 0.11840731 0.022744105 0.34607236 15.116683 0.022744105 6.5902429 8.5036959 0.34607236 8.5036959 417.49496 0.22174252 0.05906198 -0.012826677 0.10234204 -0.40994166 -0.57259856 0.98254023 7.6467542 1.7042378 0.43513102 -16.766242 1.6115738 -0.49163672 + 295 0.295 0.075149241 0.19715384 0.72769692 6.7268099 0.095605236 0.75417411 5.8770306 52.894138 0.16442405 3.1658795 49.563834 0.4870955 0.1183944 0.022782881 0.34591822 15.128908 0.022782881 6.5908721 8.5152535 0.34591822 8.5152535 417.41548 0.2217224 0.059055401 -0.012819909 0.10221076 -0.40990942 -0.57204231 0.98195174 7.6441662 1.7042353 0.43363682 -16.757857 1.6112395 -0.49148444 + 296 0.296 0.075145674 0.19707901 0.72777531 6.7265394 0.09560664 0.75430375 5.876629 52.886589 0.16442245 3.1684429 49.553724 0.48694763 0.11839857 0.022832922 0.34571613 15.151061 0.022832922 6.5911307 8.5370974 0.34571613 8.5370974 417.26078 0.2217026 0.05904895 -0.012814874 0.10207418 -0.40986369 -0.57135599 0.98121969 7.640257 1.7041526 0.43210325 -16.747105 1.6108253 -0.49129128 + 297 0.297 0.07514432 0.19696787 0.72788781 6.7267152 0.095603367 0.75422894 5.8768829 52.885744 0.16441013 3.169706 49.551628 0.48690489 0.11838676 0.022846091 0.34567204 15.164076 0.022846091 6.5902546 8.5509752 0.34567204 8.5509752 417.20067 0.2216767 0.059047686 -0.012806671 0.10193771 -0.40987107 -0.57071782 0.98058888 7.6370466 1.7045188 0.4310261 -16.743506 1.6109114 -0.49115602 + 298 0.298 0.07513918 0.19686194 0.72799888 6.7267125 0.095604692 0.75422497 5.8768829 52.882029 0.1644391 3.1714353 49.546155 0.4871225 0.11838885 0.02285926 0.34587439 15.179807 0.02285926 6.5901185 8.5668288 0.34587439 8.5668288 417.10204 0.22164859 0.059039815 -0.012798133 0.10178391 -0.40983497 -0.57000871 0.97984368 7.633368 1.7046108 0.42954583 -16.735482 1.6106643 -0.49096635 + 299 0.299 0.07513424 0.19675646 0.7281093 6.7266628 0.095602673 0.75425788 5.8768023 52.877326 0.16443751 3.1735696 49.539319 0.48709681 0.11838557 0.022878094 0.34583315 15.199189 0.022878094 6.5899563 8.5863547 0.34583315 8.5863547 416.98231 0.22162076 0.059032448 -0.012790538 0.10162583 -0.40980003 -0.56925648 0.97905651 7.6293333 1.704713 0.42800692 -16.727068 1.6104131 -0.49076813 diff --git a/tests/regression/walker/MixDirichlet/stat_evolving_pdf_light.txt.std b/tests/regression/walker/MixDirichlet/stat_evolving_pdf_light.txt.std new file mode 100644 index 00000000000..97587e67d82 --- /dev/null +++ b/tests/regression/walker/MixDirichlet/stat_evolving_pdf_light.txt.std @@ -0,0 +1,301 @@ +# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: + 0 0 0.076232274 0.23103474 0.69273299 1.8921552 0.53037855 0.63106135 0.73071527 6.8442608 4.2171576 1.8052816 0.82182156 35.29055 34.730476 0.30278776 0.25728656 5.3737265 0.30278776 4.9489503 0.12198844 0.25728656 0.12198844 0.75257135 0.77821482 0.060827746 -0.015252058 0.15399466 0.38613526 0.19390777 -0.58004304 3.2640096 2.2341483 -0.50978756 16.493694 -1.6460513 -0.47250319 + 1 0.001 0.076261253 0.23132644 0.6924123 1.8921621 0.53038105 0.63106835 0.73071265 6.8428968 4.2166002 1.8039685 0.82232811 35.282296 34.721831 0.30276972 0.25769576 5.3670828 0.30276972 4.9409786 0.12333451 0.25769576 0.12333451 0.75258374 0.77799459 0.060822781 -0.015277145 0.15379457 0.3860824 0.19336124 -0.57944364 3.2626195 2.2336914 -0.5107161 16.488314 -1.645026 -0.47209185 + 2 0.002 0.076287075 0.23161709 0.69209583 1.8921378 0.5304091 0.63099461 0.73073412 6.841647 4.2165006 1.802263 0.82288343 35.279764 34.719198 0.30263206 0.25793461 5.358877 0.30263206 4.9314116 0.12483335 0.25793461 0.12483335 0.75261291 0.77777787 0.06081773 -0.015300633 0.15356923 0.38606344 0.19274314 -0.57880659 3.2614615 2.2336009 -0.51177258 16.486414 -1.6442413 -0.47166294 + 3 0.003 0.076314541 0.23189701 0.69178845 1.8921124 0.53040489 0.63096207 0.73074543 6.840149 4.2159193 1.8008292 0.8234005 35.2717 34.710975 0.30237066 0.25835411 5.351777 0.30237066 4.9232609 0.12614551 0.25835411 0.12614551 0.75264599 0.77756685 0.060812972 -0.015325185 0.15335842 0.3860092 0.19218686 -0.57819606 3.2600598 2.2331709 -0.51265919 16.481493 -1.643268 -0.47124386 + 4 0.004 0.076340329 0.23217711 0.69148256 1.8921186 0.53041383 0.63095942 0.73074532 6.839098 4.2157035 1.7995311 0.82386337 35.268732 34.707998 0.30221166 0.25852205 5.3452383 0.30221166 4.9156119 0.12741474 0.25852205 0.12741474 0.75266712 0.77735719 0.060806474 -0.015349116 0.15316058 0.38596888 0.19165279 -0.57762167 3.2589853 2.2330068 -0.51361056 16.479417 -1.6424879 -0.47085198 + 5 0.005 0.076367199 0.23246252 0.69117028 1.8921204 0.53040977 0.63096761 0.73074304 6.8377253 4.2151279 1.7982368 0.82436062 35.260588 34.699747 0.30186083 0.25898026 5.3385331 0.30186083 4.9079634 0.1287089 0.25898026 0.1287089 0.75268207 0.77714303 0.060800726 -0.015373667 0.15296448 0.38591383 0.19112054 -0.57703437 3.2576056 2.2325591 -0.51452421 16.474128 -1.6414808 -0.47044821 + 6 0.006 0.0763932 0.23274574 0.69086106 1.8921167 0.53039762 0.63097825 0.73074085 6.8363128 4.2144676 1.797004 0.82484122 35.251658 34.690573 0.3016872 0.25939703 5.3322447 0.3016872 4.9006114 0.12994604 0.25939703 0.12994604 0.75270398 0.7769311 0.060794487 -0.015398042 0.1527654 0.38585277 0.19059613 -0.57644891 3.2562071 2.2320628 -0.51537898 16.4686 -1.6404698 -0.47004433 + 7 0.007 0.076419853 0.23305018 0.69052997 1.8921149 0.5303687 0.63101401 0.73073214 6.8347644 4.2136397 1.795788 0.82533665 35.241523 34.68017 0.30159877 0.2597546 5.3259879 0.30159877 4.8931681 0.13122101 0.2597546 0.13122101 0.75273469 0.77670446 0.060787547 -0.015423863 0.15256624 0.38577356 0.19005632 -0.57582988 3.2546658 2.2314723 -0.51627177 16.462659 -1.6393497 -0.46961405 + 8 0.008 0.076449254 0.23334015 0.69021059 1.8921414 0.53039236 0.63102223 0.73072677 6.8336986 4.213374 1.7945038 0.82582077 35.236795 34.675096 0.3016703 0.26002878 5.3195586 0.3016703 4.8853551 0.13253319 0.26002878 0.13253319 0.75275095 0.776485 0.060783962 -0.015448254 0.15236538 0.38573957 0.18950967 -0.57524924 3.2534996 2.2311952 -0.51723065 16.45918 -1.6384642 -0.4692194 + 9 0.009 0.076477232 0.2336404 0.68988237 1.8921413 0.53039041 0.63102471 0.73072616 6.8322256 4.2127602 1.7931128 0.82635254 35.228432 34.66648 0.30153426 0.26041775 5.3125088 0.30153426 4.8770483 0.13392625 0.26041775 0.13392625 0.75277515 0.77625997 0.060780065 -0.015473849 0.15216246 0.38568468 0.18894406 -0.57462875 3.252027 2.2307107 -0.51818882 16.453935 -1.6373948 -0.46879354 + 10 0.01 0.076504796 0.23393428 0.68956093 1.8921579 0.53042747 0.63100022 0.73073021 6.831203 4.2127106 1.7916201 0.82687224 35.225852 34.663709 0.30143386 0.26070948 5.305144 0.30143386 4.868374 0.13533611 0.26070948 0.13533611 0.75279249 0.77603955 0.060776075 -0.015498577 0.15195455 0.38566832 0.18835963 -0.57402795 3.2509415 2.2306001 -0.51924476 16.45153 -1.6365925 -0.46838937 + 11 0.011 0.07653191 0.23421771 0.68925038 1.8921688 0.53043986 0.63100009 0.73072887 6.8300109 4.2123365 1.7903144 0.82735996 35.220056 34.657717 0.30129068 0.26104888 5.2985504 0.30129068 4.860633 0.13662668 0.26104888 0.13662668 0.7528123 0.77582649 0.060771761 -0.015522189 0.15175624 0.38562857 0.18782064 -0.57344921 3.249708 2.230274 -0.52017182 16.447568 -1.6356846 -0.46799471 + 12 0.012 0.076561585 0.23453623 0.68890218 1.8922049 0.5304313 0.63106567 0.73070797 6.8287704 4.2117716 1.7891528 0.82784605 35.213449 34.65112 0.3010225 0.26130634 5.2922894 0.3010225 4.8533417 0.13792526 0.26130634 0.13792526 0.75283693 0.77558777 0.060766671 -0.015549601 0.15156087 0.38556109 0.18727506 -0.57283615 3.2483309 2.229829 -0.52116689 16.443358 -1.6346256 -0.46757101 + 13 0.013 0.076588248 0.23483571 0.68857604 1.892226 0.53044395 0.63108044 0.73070164 6.8276499 4.211483 1.7878252 0.82834175 35.209054 34.646624 0.30085775 0.26157221 5.2854865 0.30085775 4.8453484 0.13928038 0.26157221 0.13928038 0.75285138 0.77536441 0.06076179 -0.015574623 0.15136182 0.38552167 0.18671819 -0.57223986 3.2471306 2.229577 -0.52217692 16.440177 -1.6337282 -0.46716472 + 14 0.014 0.076616898 0.23509869 0.68828441 1.8921839 0.5304654 0.6309887 0.73072983 6.8263002 4.2112333 1.7861967 0.82887023 35.204632 34.642029 0.30072555 0.26187705 5.277837 0.30072555 4.836493 0.14061845 0.26187705 0.14061845 0.75289996 0.77516363 0.060757277 -0.015597013 0.15114099 0.38549214 0.18613873 -0.57163087 3.2459401 2.2293792 -0.52307498 16.437417 -1.6329538 -0.46675217 + 15 0.015 0.076642526 0.23539686 0.68796061 1.8921572 0.53046087 0.63095471 0.73074167 6.8247745 4.2106885 1.7846745 0.82941146 35.197229 34.634311 0.30072858 0.26218882 5.2704426 0.30072858 4.8276807 0.14203332 0.26218882 0.14203332 0.75293493 0.77494207 0.060750406 -0.015619926 0.15092019 0.38544116 0.18554683 -0.57098798 3.2445154 2.22899 -0.52402355 16.433015 -1.6319754 -0.46631225 + 16 0.016 0.07666902 0.23570055 0.68763042 1.8921809 0.53044554 0.63101064 0.73072473 6.8234241 4.2099824 1.783555 0.82988675 35.187935 34.624744 0.30060337 0.26258744 5.2645356 0.30060337 4.8206663 0.14326587 0.26258744 0.14326587 0.75295508 0.77471606 0.060744563 -0.015645238 0.15072782 0.38537389 0.18502255 -0.57039644 3.2430755 2.2284429 -0.52492212 16.427155 -1.6308901 -0.46590293 + 17 0.017 0.076697161 0.23599026 0.68731258 1.8921764 0.53044702 0.63100194 0.73072746 6.8220669 4.2094723 1.7822059 0.83038864 35.180984 34.617648 0.30040346 0.26293242 5.2578811 0.30040346 4.8129748 0.14450284 0.26293242 0.14450284 0.75300631 0.77449791 0.060740304 -0.015670178 0.15052186 0.38532246 0.18446674 -0.56978921 3.2417352 2.228043 -0.52582261 16.422883 -1.6299342 -0.46548669 + 18 0.018 0.076721928 0.23626338 0.68701469 1.8921336 0.53041892 0.63097524 0.73073949 6.8204926 4.208792 1.7808158 0.83088481 35.173056 34.609559 0.30031723 0.26317962 5.2510842 0.30031723 4.8049796 0.14578738 0.26317962 0.14578738 0.75304684 0.77429381 0.060732021 -0.01569357 0.15032621 0.38525077 0.18393334 -0.56918411 3.2403229 2.2276187 -0.52666976 16.418623 -1.6289924 -0.46506736 + 19 0.019 0.076749848 0.23654322 0.68670693 1.8921171 0.53043926 0.63092324 0.73075456 6.8192626 4.2085867 1.7792694 0.83140653 35.169599 34.606081 0.30007626 0.26344108 5.2435528 0.30007626 4.7963234 0.1471531 0.26344108 0.1471531 0.75308426 0.77408243 0.060727303 -0.015717483 0.15011468 0.38521956 0.18335578 -0.56857534 3.2391556 2.2274483 -0.52764214 16.416264 -1.6281926 -0.46465457 + 20 0.02 0.076778975 0.23681811 0.68640292 1.8921239 0.5304674 0.63089593 0.73076053 6.8181336 4.2083424 1.7778915 0.83189978 35.164935 34.601165 0.30000295 0.26376756 5.236864 0.30000295 4.7884549 0.14840618 0.26376756 0.14840618 0.75312354 0.77387328 0.060724626 -0.015740533 0.14991132 0.38519207 0.18280674 -0.56799881 3.2380009 2.2271909 -0.52855202 16.412945 -1.6273572 -0.46426411 + 21 0.021 0.076809463 0.23711923 0.68607131 1.8921622 0.5304925 0.63091996 0.73074974 6.8170266 4.208063 1.776546 0.83241766 35.159842 34.595847 0.29987277 0.26412235 5.2298637 0.29987277 4.7801463 0.14984468 0.26412235 0.14984468 0.7531225 0.77364544 0.060721432 -0.01576692 0.14972466 0.38515654 0.18225192 -0.56740846 3.2367488 2.2268935 -0.5296025 16.408968 -1.6263926 -0.46386265 + 22 0.022 0.076835795 0.23742288 0.68574133 1.8922037 0.53049365 0.63098073 0.73072935 6.8158704 4.2075429 1.7754428 0.83288471 35.152283 34.588024 0.29974497 0.26451413 5.2240134 0.29974497 4.7731959 0.15107249 0.26451413 0.15107249 0.75313675 0.7734196 0.060715987 -0.015791626 0.14953505 0.38510468 0.18172828 -0.56683295 3.2354354 2.226447 -0.53053462 16.403798 -1.6253743 -0.46346745 + 23 0.023 0.076864403 0.23771513 0.68542047 1.8922161 0.53052409 0.63095874 0.7307333 6.814863 4.207463 1.7740197 0.83338034 35.15031 34.585864 0.29978553 0.26466069 5.2171489 0.29978553 4.7649798 0.15238359 0.26466069 0.15238359 0.75317907 0.77319933 0.060711616 -0.015816048 0.14932387 0.38508002 0.18115033 -0.56623036 3.2343811 2.2263333 -0.53152751 16.402192 -1.6246113 -0.46306024 + 24 0.024 0.076894869 0.23800827 0.68509686 1.8922466 0.53054511 0.6309764 0.73072508 6.8136919 4.2070839 1.7727227 0.83388524 35.143884 34.579197 0.29960425 0.26508277 5.2104776 0.29960425 4.7571599 0.15371339 0.26508277 0.15371339 0.75319381 0.77297682 0.060708959 -0.015841728 0.14913216 0.38504105 0.18060606 -0.56564711 3.2330947 2.2259607 -0.5324947 16.397542 -1.6236353 -0.46266275 + 25 0.025 0.076919403 0.23830366 0.68477693 1.892251 0.53052726 0.63100677 0.73071694 6.8122993 4.2064305 1.7714985 0.83437031 35.135643 34.570861 0.29933721 0.26544462 5.2041074 0.29933721 4.749797 0.15497312 0.26544462 0.15497312 0.75321875 0.77275809 0.060702335 -0.015866104 0.14893904 0.38497644 0.18007643 -0.56505287 3.2316855 2.2254884 -0.53339699 16.392487 -1.6226139 -0.46225224 + 26 0.026 0.076946069 0.23858551 0.68446842 1.8922572 0.53052915 0.63101366 0.73071443 6.8110368 4.2059556 1.7702284 0.83485268 35.12903 34.563916 0.29938984 0.26572386 5.1977635 0.29938984 4.7421161 0.15625755 0.26572386 0.15625755 0.75324196 0.77254649 0.060697348 -0.015889422 0.14874787 0.38492739 0.1795485 -0.56447589 3.2303993 2.2251098 -0.53429013 16.38829 -1.621682 -0.46185668 + 27 0.027 0.076974123 0.23888231 0.68414357 1.8922882 0.53057117 0.631004 0.73071298 6.8101085 4.2059661 1.7687757 0.83536669 35.127248 34.56188 0.29941565 0.26595195 5.1905544 0.29941565 4.7334472 0.15769156 0.26595195 0.15769156 0.75325262 0.77232369 0.060693583 -0.015914131 0.14854876 0.38491395 0.17896984 -0.56388379 3.229354 2.2250277 -0.53536373 16.386274 -1.6208933 -0.46145896 + 28 0.028 0.07700024 0.23917813 0.68382163 1.8923076 0.5305792 0.63102243 0.73070595 6.8089206 4.2055498 1.7675198 0.83585099 35.121026 34.555335 0.29943446 0.26625663 5.1842795 0.29943446 4.7258936 0.15895146 0.26625663 0.15895146 0.7532831 0.77210325 0.060688567 -0.015938226 0.14835005 0.38487106 0.17842384 -0.5632949 3.2280926 2.2246724 -0.53629065 16.382136 -1.6199595 -0.46105683 + 29 0.029 0.077030297 0.23947606 0.68349364 1.8924155 0.53063049 0.63111598 0.73066906 6.8084797 4.2056149 1.7666098 0.83625507 35.119612 34.553642 0.29947267 0.26649704 5.1792558 0.29947267 4.7196722 0.160111 0.26649704 0.160111 0.75327395 0.77187791 0.060685622 -0.015963013 0.14817174 0.38485716 0.17792776 -0.56278492 3.2272431 2.2245363 -0.53728465 16.379707 -1.6191758 -0.46071376 + 30 0.03 0.077056008 0.23974553 0.68319847 1.892401 0.53063007 0.6310947 0.7306762 6.8071264 4.2051164 1.7652664 0.8367437 35.112742 34.546552 0.29936894 0.26682097 5.1726156 0.29936894 4.7118652 0.1613814 0.26682097 0.1613814 0.75330313 0.77167542 0.060679507 -0.015984016 0.14797477 0.38480921 0.17740003 -0.56220924 3.225945 2.2241598 -0.53813573 16.375487 -1.6182737 -0.46031931 + 31 0.031 0.077080469 0.240023 0.68289653 1.8923644 0.53059308 0.63108921 0.73068214 6.8054381 4.2042658 1.7639229 0.83724951 35.102764 34.536433 0.29916892 0.26716131 5.1658315 0.29916892 4.7039711 0.16269152 0.26716131 0.16269152 0.75333441 0.77146869 0.0606715 -0.016006626 0.14778732 0.38472875 0.17687822 -0.56160697 3.224395 2.2236054 -0.53897492 16.369952 -1.6172215 -0.45989992 + 32 0.032 0.077109449 0.24029894 0.68259161 1.8923919 0.53063353 0.63107648 0.73068189 6.8045993 4.204279 1.7626057 0.83771456 35.101598 34.535111 0.29916273 0.26732352 5.1594131 0.29916273 4.6963275 0.16392287 0.26732352 0.16392287 0.75337099 0.77125897 0.06066804 -0.016029985 0.1475922 0.38471223 0.1763367 -0.56104894 3.2234522 2.2235275 -0.53992864 16.36859 -1.6165165 -0.45952423 + 33 0.033 0.077137713 0.24056282 0.68229947 1.8923861 0.53065457 0.63103977 0.73069179 6.8034238 4.2040212 1.7611949 0.83820769 35.097226 34.530666 0.2989189 0.2676409 5.1525171 0.2989189 4.6884248 0.16517345 0.2676409 0.16517345 0.75341199 0.77105793 0.060664318 -0.016052574 0.14739868 0.38468023 0.17580202 -0.56048225 3.2222986 2.2232936 -0.54082651 16.365598 -1.61571 -0.45913933 + 34 0.034 0.077164481 0.24085447 0.68198105 1.8923826 0.53064707 0.63104454 0.73069104 6.8019994 4.2034376 1.7598418 0.8387201 35.089745 34.523241 0.29847273 0.26803095 5.1455712 0.29847273 4.6806305 0.16646797 0.26803095 0.16646797 0.75344955 0.7708397 0.060659676 -0.016077437 0.14720408 0.38462235 0.17525572 -0.55987807 3.2208874 2.2228595 -0.54175194 16.360976 -1.6147071 -0.45872368 + 35 0.035 0.077193415 0.2411513 0.68165529 1.8924104 0.53065623 0.63107391 0.73068023 6.8008026 4.2029609 1.7586405 0.83920122 35.083038 34.516444 0.298191 0.26840347 5.1394244 0.298191 4.6735879 0.16764551 0.26840347 0.16764551 0.75349677 0.7706161 0.060656947 -0.016102606 0.14700552 0.38457461 0.1747167 -0.55929131 3.2195856 2.2224377 -0.54265325 16.356545 -1.6137314 -0.4583219 + 36 0.036 0.07721941 0.24141393 0.68136666 1.892387 0.53065873 0.63103553 0.73069274 6.7994254 4.2024702 1.7572641 0.83969118 35.076086 34.509334 0.29797788 0.26877379 5.1327606 0.29797788 4.665941 0.16884176 0.26877379 0.16884176 0.75354684 0.77041791 0.060652131 -0.016123984 0.14680556 0.38452972 0.17418695 -0.55871667 3.2182969 2.2220645 -0.54347017 16.352338 -1.612855 -0.45792883 + 37 0.037 0.077246025 0.24169998 0.68105399 1.8923995 0.53064947 0.63106664 0.7306834 6.798074 4.2017596 1.7561657 0.84014879 35.066166 34.498904 0.29807013 0.2691913 5.1273154 0.29807013 4.6592977 0.16994751 0.2691913 0.16994751 0.75358947 0.77020355 0.060646601 -0.016147269 0.14660803 0.38446913 0.17367372 -0.55814285 3.2168981 2.221497 -0.54424882 16.346224 -1.6118314 -0.45753282 + 38 0.038 0.077272355 0.24198342 0.68074422 1.8924233 0.53064577 0.63110731 0.73067026 6.7968416 4.201146 1.7550994 0.8405962 35.057341 34.489739 0.29797307 0.26962844 5.1218679 0.29797307 4.6528554 0.17103947 0.26962844 0.17103947 0.75362433 0.76999118 0.060641673 -0.016169951 0.1464184 0.38441376 0.17317223 -0.55758599 3.2155755 2.2209909 -0.54505397 16.340539 -1.6108449 -0.45714928 + 39 0.039 0.077300006 0.24227523 0.68042476 1.8924362 0.53065453 0.63111495 0.73066674 6.7955219 4.2005998 1.7538289 0.84109329 35.049017 34.48088 0.29811959 0.27001766 5.1156737 0.29811959 4.6452744 0.17227964 0.27001766 0.17227964 0.75366479 0.76977206 0.060637837 -0.016192854 0.14621495 0.3843692 0.17262452 -0.55699373 3.2142071 2.2205175 -0.54591961 16.335198 -1.6098469 -0.45674453 + 40 0.04 0.077327453 0.2425409 0.68013165 1.8923594 0.53064744 0.63100919 0.73070278 6.7937303 4.199987 1.7520737 0.84166962 35.040911 34.472476 0.2980842 0.27035046 5.107547 0.2980842 4.6357643 0.17369847 0.27035046 0.17369847 0.75373119 0.76957056 0.060632184 -0.0162144 0.14600179 0.3843161 0.17203465 -0.55635075 3.2127062 2.2201167 -0.5467865 16.330869 -1.6089128 -0.45630408 + 41 0.041 0.077355012 0.24282916 0.67981583 1.8923838 0.53063749 0.63105899 0.73068728 6.792463 4.1993321 1.7510094 0.84212151 35.032388 34.463757 0.2979067 0.27072353 5.1019922 0.2979067 4.6292653 0.1748202 0.27072353 0.1748202 0.75376772 0.76935388 0.060626788 -0.016237741 0.14581363 0.38425212 0.17153303 -0.55578515 3.2113467 2.2195961 -0.54761136 16.325544 -1.6079001 -0.45591279 + 42 0.042 0.077382103 0.24309737 0.67952053 1.8923701 0.5306588 0.63101003 0.73070123 6.7912139 4.1990443 1.7495401 0.84262956 35.02698 34.458009 0.2978924 0.27107916 5.09499 0.2978924 4.620985 0.17611262 0.27107916 0.17611262 0.75380545 0.769151 0.060621675 -0.016259219 0.14561138 0.38422323 0.17097985 -0.55520308 3.2101494 2.2193408 -0.54850043 16.321896 -1.6070804 -0.45551832 + 43 0.043 0.077409114 0.24339103 0.67919986 1.892418 0.53067831 0.63105586 0.73068379 6.7903227 4.1988133 1.7484393 0.84307004 35.023099 34.453977 0.29779266 0.27132942 5.0893289 0.29779266 4.6142775 0.17725875 0.27132942 0.17725875 0.75383608 0.76893122 0.060617357 -0.016283478 0.14541915 0.38418791 0.17045831 -0.55464623 3.2090769 2.2190922 -0.54942103 16.318894 -1.6062457 -0.45513924 + 44 0.044 0.077436651 0.24366012 0.67890323 1.8924168 0.53067758 0.63105509 0.73068413 6.789009 4.1982608 1.7472072 0.84354098 35.015444 34.445782 0.29806593 0.27159642 5.0833845 0.29806593 4.6068448 0.17847384 0.27159642 0.17847384 0.75387232 0.76872734 0.060611781 -0.016304955 0.14523506 0.38413517 0.16994858 -0.55408375 3.2077676 2.218655 -0.55023065 16.31427 -1.6053173 -0.45475253 + 45 0.045 0.07746391 0.24393612 0.67859997 1.892501 0.53072734 0.63111499 0.73065863 6.7887157 4.1985427 1.7462653 0.84390781 35.018068 34.448272 0.2982593 0.27153715 5.0785769 0.2982593 4.6007884 0.1795292 0.27153715 0.1795292 0.75389395 0.76851911 0.060607722 -0.016327434 0.14506046 0.38412682 0.16946566 -0.55359248 3.2071558 2.2187415 -0.55117554 16.314863 -1.6047643 -0.45442316 + 46 0.046 0.077491112 0.24419029 0.67831859 1.8924672 0.53073778 0.63105037 0.73067901 6.7873139 4.1981313 1.7447618 0.84442088 35.011855 34.441871 0.29809069 0.27189314 5.0713784 0.29809069 4.5924706 0.18081706 0.27189314 0.18081706 0.75393818 0.76832548 0.060603736 -0.016348651 0.1448636 0.3840884 0.16892826 -0.55301666 3.2058819 2.2184254 -0.55201676 16.31106 -1.6039225 -0.45403075 + 47 0.047 0.077516861 0.24446912 0.67801402 1.8924556 0.53070279 0.6310797 0.73067312 6.7857369 4.1972237 1.7436236 0.84488954 35.000777 34.430596 0.29786786 0.2723126 5.0655815 0.29786786 4.5857796 0.18193402 0.2723126 0.18193402 0.75398792 0.76811671 0.060596599 -0.016372505 0.14468344 0.38400557 0.16843274 -0.55243831 3.2043486 2.2177877 -0.55278245 16.304712 -1.6028452 -0.45362678 + 48 0.048 0.077543376 0.24474314 0.67771348 1.892471 0.53071635 0.63108467 0.73066996 6.7846337 4.1968848 1.7423977 0.84535123 34.995324 34.424985 0.29767827 0.27266038 5.0594929 0.29767827 4.5787385 0.18307615 0.27266038 0.18307615 0.75403024 0.76791046 0.060592502 -0.016395709 0.14449569 0.38396776 0.16791538 -0.55188314 3.2031873 2.2174857 -0.55364485 16.300983 -1.6020018 -0.45324826 + 49 0.049 0.077571504 0.24503177 0.67739672 1.8925288 0.53075351 0.63112185 0.73065344 6.7838919 4.1968137 1.741293 0.84578515 34.99266 34.421975 0.29780274 0.27288226 5.0539746 0.29780274 4.571952 0.18421984 0.27288226 0.18421984 0.75405829 0.76769304 0.06058888 -0.016419444 0.14430283 0.38394721 0.16739216 -0.55133937 3.2022266 2.2173147 -0.55456498 16.298472 -1.6012364 -0.45288118 + 50 0.05 0.077596713 0.2453194 0.67708389 1.8925564 0.5307641 0.63114916 0.73064316 6.7828302 4.1964739 1.7401122 0.84624415 34.987169 34.416237 0.29772621 0.2732055 5.0480163 0.29772621 4.5648879 0.18540218 0.2732055 0.18540218 0.75408726 0.76747888 0.060583376 -0.016442556 0.14411208 0.38390794 0.16686836 -0.5507763 3.2010604 2.2170137 -0.55546322 16.294616 -1.60037 -0.45249708 + 51 0.051 0.077623251 0.24558806 0.67678869 1.8925666 0.53075962 0.63117043 0.73063657 6.7815911 4.1959052 1.7389964 0.84668945 34.979506 34.408357 0.29759192 0.27355722 5.0423979 0.29759192 4.558313 0.18649296 0.27355722 0.18649296 0.75412989 0.76727618 0.060578926 -0.016465795 0.14393222 0.38385245 0.16637867 -0.55023111 3.1997827 2.2165634 -0.55624682 16.289867 -1.5994474 -0.45212129 + 52 0.052 0.077649834 0.24585433 0.67649584 1.8925868 0.53077108 0.63118542 0.73063029 6.7805052 4.1955159 1.7378565 0.84713286 34.973426 34.401945 0.29760422 0.27387609 5.0368067 0.29760422 4.5516197 0.18758282 0.27387609 0.18758282 0.75417458 0.76707504 0.060575181 -0.016488281 0.14375592 0.38381203 0.16588477 -0.54969679 3.1986205 2.2162156 -0.55706269 16.285837 -1.5985943 -0.45175609 + 53 0.053 0.077677692 0.24610539 0.67621692 1.8925491 0.53076582 0.63113591 0.73064738 6.779077 4.1949599 1.7365119 0.84760515 34.966134 34.394474 0.29746382 0.27419711 5.0305162 0.29746382 4.544388 0.18866438 0.27419711 0.18866438 0.75425068 0.7668829 0.060569336 -0.016509389 0.14355953 0.38375698 0.16536937 -0.54912634 3.1973348 2.215819 -0.55779477 16.2818 -1.5977537 -0.45136356 + 54 0.054 0.077702608 0.2463762 0.6759212 1.8926191 0.53079445 0.63120276 0.73062192 6.7784929 4.1948818 1.7356349 0.84797617 34.963568 34.391794 0.29730323 0.27447025 5.0258844 0.29730323 4.5389699 0.18961128 0.27447025 0.18961128 0.75427571 0.76668022 0.060563839 -0.016531291 0.143387 0.383733 0.16490646 -0.54863946 3.1964858 2.2156544 -0.55863458 16.279244 -1.5970475 -0.45103364 + 55 0.055 0.077728559 0.24664683 0.67562461 1.8926108 0.53079228 0.63119323 0.73062534 6.7772046 4.1944334 1.7343128 0.84845842 34.957558 34.385665 0.29713424 0.2747592 5.0193504 0.29713424 4.5313774 0.19083876 0.2747592 0.19083876 0.7543167 0.76647673 0.060557557 -0.016553458 0.14320304 0.38368236 0.16438675 -0.54806912 3.1952288 2.2153282 -0.55950355 16.275563 -1.5961783 -0.45064216 + 56 0.056 0.077755707 0.24691506 0.67532924 1.8926088 0.53080576 0.63117215 0.73063086 6.7760645 4.1941758 1.7329491 0.84893953 34.953902 34.38195 0.29698913 0.2749627 5.0126646 0.29698913 4.5235878 0.19208775 0.2749627 0.19208775 0.75435887 0.76627378 0.060553396 -0.016576873 0.14301687 0.38364462 0.16385855 -0.54750317 3.1940965 2.2151197 -0.56040347 16.273187 -1.595393 -0.45025648 + 57 0.057 0.077783454 0.24719591 0.67502063 1.8926409 0.5308342 0.63118247 0.73062427 6.7751471 4.1940394 1.7317067 0.84940097 34.951096 34.379066 0.29683114 0.27519951 5.0064678 0.29683114 4.5163668 0.19326991 0.27519951 0.19326991 0.75439994 0.76606188 0.060550028 -0.016600331 0.14282817 0.38361805 0.16332937 -0.54694741 3.1930574 2.2149426 -0.56132962 16.27089 -1.5946182 -0.44988006 + 58 0.058 0.077807812 0.24746971 0.67472248 1.892676 0.53082103 0.6312527 0.73060232 6.7741365 4.1935329 1.7308134 0.84979015 34.945337 34.373315 0.29661953 0.2754025 5.0016836 0.29661953 4.5108127 0.19425144 0.2754025 0.19425144 0.75443939 0.7658577 0.060544244 -0.016623907 0.14265935 0.38355604 0.16287271 -0.54642876 3.1919139 2.2145575 -0.56211074 16.267351 -1.5937551 -0.44952051 + 59 0.059 0.07783355 0.24770824 0.67445821 1.8926427 0.53083723 0.63118109 0.73062439 6.7729572 4.1933403 1.7293513 0.85026556 34.942165 34.36998 0.29659689 0.275588 4.9948626 0.29659689 4.5028044 0.19546134 0.275588 0.19546134 0.75449089 0.7656758 0.060538107 -0.016643644 0.14247646 0.38352613 0.1623579 -0.54588403 3.1908608 2.2144211 -0.56293695 16.265461 -1.593083 -0.44915071 + 60 0.06 0.077862017 0.24795191 0.67418608 1.8926106 0.53082671 0.63114698 0.73063693 6.7713167 4.1924998 1.7280594 0.85075751 34.93048 34.35801 0.29629088 0.27617955 4.9885832 0.29629088 4.4957313 0.1965611 0.27617955 0.1965611 0.75455052 0.76548805 0.06053536 -0.016664896 0.14229778 0.38346423 0.16187057 -0.5453348 3.1893418 2.2137745 -0.56361741 16.258524 -1.5920546 -0.44877081 + 61 0.061 0.07788792 0.24822074 0.67389134 1.8926093 0.53081494 0.63116072 0.73063366 6.7700581 4.191965 1.7268866 0.85120657 34.924066 34.351499 0.29615283 0.27641415 4.9827258 0.29615283 4.4888884 0.19768457 0.27641415 0.19768457 0.75459903 0.7652858 0.060529358 -0.016688093 0.14211995 0.38340354 0.16137583 -0.54477937 3.1880881 2.213393 -0.56442506 16.254804 -1.5911771 -0.44838703 + 62 0.062 0.077915229 0.24849833 0.67358644 1.8926244 0.53084689 0.63114082 0.73063674 6.7691455 4.1919841 1.7254694 0.85169196 34.923312 34.350716 0.2960384 0.2765585 4.9758233 0.2960384 4.480813 0.19897194 0.2765585 0.19897194 0.75463926 0.76507647 0.060524603 -0.016712323 0.14193608 0.38338262 0.16082681 -0.54420943 3.1871182 2.213366 -0.56542143 16.253819 -1.5904888 -0.44800242 + 63 0.063 0.077942589 0.24876004 0.67329737 1.8926288 0.53086021 0.63112951 0.73063903 6.7679241 4.1915479 1.7242125 0.85216372 34.916051 34.343237 0.29577251 0.27704186 4.9696392 0.29577251 4.4737767 0.20008996 0.27704186 0.20008996 0.75468463 0.76487767 0.060520033 -0.016733983 0.14175181 0.38334383 0.1603191 -0.54366293 3.1858805 2.2129833 -0.5662257 16.248961 -1.5896125 -0.44762947 + 64 0.064 0.077970583 0.24900074 0.67302867 1.8926361 0.53086039 0.63114023 0.73063543 6.7668497 4.1910902 1.7232001 0.85255933 34.91025 34.337236 0.29575821 0.27725576 4.9647154 0.29575821 4.4679287 0.2010285 0.27725576 0.2010285 0.75474364 0.76469232 0.06051517 -0.016754747 0.14158348 0.38329046 0.15987245 -0.5431629 3.1847784 2.2126164 -0.56691122 16.245556 -1.5888293 -0.44728426 + 65 0.065 0.077995452 0.24925949 0.67274506 1.8926373 0.53087356 0.63112457 0.73063919 6.765716 4.1907669 1.7219289 0.85302028 34.905083 34.331872 0.29564525 0.27756598 4.9585089 0.29564525 4.4606764 0.20218723 0.27756598 0.20218723 0.75478387 0.76449772 0.060510819 -0.016775638 0.14139967 0.38325646 0.15936676 -0.54262322 3.1836399 2.2123408 -0.56773702 16.242131 -1.5880338 -0.44691692 + 66 0.066 0.078022096 0.24951131 0.6724666 1.8926413 0.53086065 0.63114782 0.73063288 6.7644529 4.1900773 1.7209475 0.85342802 34.895864 34.322275 0.29564734 0.27794214 4.9537333 0.29564734 4.4549822 0.20310376 0.27794214 0.20310376 0.75484431 0.76430615 0.060505371 -0.016797492 0.14122598 0.3831928 0.1589124 -0.5421052 3.1823616 2.2118074 -0.56838831 16.236666 -1.5871255 -0.44655742 + 67 0.067 0.078050206 0.24978787 0.67216192 1.8927254 0.53088386 0.63124303 0.73059856 6.7638165 4.1898633 1.7201521 0.85380104 34.891911 34.317914 0.29585266 0.27814423 4.9494646 0.29585266 4.4494986 0.20411339 0.27814423 0.20411339 0.75485833 0.76409679 0.06050034 -0.016820072 0.14106789 0.38315625 0.15846317 -0.54161941 3.1814069 2.2115269 -0.56922175 16.233384 -1.5863205 -0.44622544 + 68 0.068 0.078079653 0.25003205 0.67188829 1.8926612 0.53087173 0.63116277 0.73062666 6.7620946 4.1891287 1.7186453 0.85432065 34.882518 34.308261 0.29573604 0.27852099 4.9424818 0.29573604 4.4414401 0.20530569 0.27852099 0.20530569 0.75493865 0.76390783 0.060496651 -0.016841952 0.14087462 0.3830934 0.15793682 -0.54103022 3.1799284 2.2110147 -0.56993688 16.228358 -1.5853885 -0.44581868 + 69 0.069 0.078106892 0.25029399 0.67159912 1.8926664 0.53086583 0.63117846 0.73062209 6.7607852 4.1885147 1.7174919 0.85477855 34.874376 34.299895 0.29559757 0.27888273 4.9366379 0.29559757 4.434589 0.20645139 0.27888273 0.20645139 0.75497446 0.76370899 0.060492113 -0.016863856 0.14070101 0.38303554 0.15745544 -0.54049099 3.1785992 2.2105338 -0.57071323 16.223356 -1.5844435 -0.44544633 + 70 0.07 0.078133362 0.25057164 0.671295 1.8925988 0.530849 0.63109956 0.73065026 6.7590393 4.1878551 1.7158539 0.8553303 34.866167 34.291487 0.29548555 0.27919466 4.9290765 0.29548555 4.4258532 0.20773776 0.27919466 0.20773776 0.75506275 0.76350037 0.060485524 -0.016886621 0.14048377 0.3829739 0.15686798 -0.53984187 3.177109 2.2101167 -0.57154594 16.219104 -1.5835176 -0.44499989 + 71 0.071 0.078160264 0.25081759 0.67102214 1.8926161 0.53087971 0.63108456 0.73065185 6.7582151 4.1878016 1.714663 0.8557505 34.864501 34.289629 0.29554454 0.27932794 4.9233707 0.29554454 4.4190021 0.20882401 0.27932794 0.20882401 0.75510606 0.76331248 0.06048017 -0.016905788 0.14030755 0.38295234 0.15638314 -0.53933548 3.1762193 2.2100142 -0.57236274 16.217696 -1.5828819 -0.4446575 + 72 0.072 0.078185085 0.25109214 0.67072278 1.8926099 0.53086927 0.63108916 0.73065147 6.7568766 4.1872502 1.7133997 0.85622664 34.857557 34.282511 0.29544529 0.27960058 4.9170999 0.29544529 4.4116233 0.21003136 0.27960058 0.21003136 0.75514945 0.76310739 0.06047343 -0.016927994 0.14012655 0.3828954 0.15586969 -0.5387651 3.1749043 2.20962 -0.57319991 16.213596 -1.5819734 -0.4442646 + 73 0.073 0.078212535 0.2513788 0.67040866 1.8926772 0.53085219 0.63121287 0.73061213 6.7557914 4.186503 1.7126673 0.85662108 34.847958 34.272746 0.29518684 0.28002444 4.9127651 0.29518684 4.4065641 0.2110141 0.28002444 0.2110141 0.75516922 0.76289188 0.060467883 -0.016951697 0.13996955 0.38282111 0.15543394 -0.53825505 3.1735645 2.2090019 -0.57396797 16.207332 -1.5809119 -0.44390806 + 74 0.074 0.078240214 0.25164326 0.67011653 1.8927598 0.53090306 0.63126899 0.73058777 6.7553669 4.1866263 1.7117422 0.8569984 34.84749 34.272118 0.29513912 0.28023351 4.9080097 0.29513912 4.4008824 0.21198814 0.28023351 0.21198814 0.75519863 0.76269097 0.060465244 -0.016973663 0.13980644 0.38281313 0.15496874 -0.53778187 3.1728271 2.2089383 -0.57483757 16.205834 -1.5802757 -0.44359083 + 75 0.075 0.078264598 0.25191626 0.66981914 1.8927794 0.53088813 0.63131828 0.730573 6.7542212 4.1860592 1.7107505 0.85741157 34.840524 34.264976 0.29506275 0.28048537 4.9029426 0.29506275 4.3948711 0.21300868 0.28048537 0.21300868 0.75524364 0.76248729 0.060457867 -0.016995411 0.13963195 0.38275051 0.15449637 -0.53724688 3.1716073 2.2085182 -0.57560278 16.201647 -1.5793921 -0.44322026 + 76 0.076 0.078292601 0.25217666 0.66953074 1.892782 0.53088907 0.63132084 0.73057204 6.7529129 4.1854433 1.7096054 0.85786424 34.831555 34.255496 0.29517288 0.28088617 4.8974653 0.29517288 4.388226 0.21406638 0.28088617 0.21406638 0.75529921 0.7622888 0.060453385 -0.017016535 0.13945039 0.38269825 0.1540054 -0.53670365 3.1702894 2.2080115 -0.576319 16.196147 -1.5784643 -0.44284649 + 77 0.077 0.078319519 0.2524041 0.66927638 1.8928065 0.5309368 0.63129397 0.7305757 6.7522297 4.185518 1.7084442 0.85826751 34.830359 34.254055 0.29518822 0.2811158 4.8919798 0.29518822 4.3817191 0.21507248 0.2811158 0.21507248 0.75534159 0.76211325 0.060450461 -0.017035265 0.13928296 0.38269311 0.15354186 -0.53623497 3.1695134 2.2079586 -0.57709631 16.194654 -1.577899 -0.44253289 + 78 0.078 0.07834547 0.25269611 0.66895842 1.8928441 0.5309701 0.63130594 0.73056801 6.7513584 4.1854852 1.7071247 0.85874859 34.828792 34.252224 0.29532834 0.28123968 4.8854981 0.29532834 4.3737891 0.2163807 0.28123968 0.2163807 0.75537284 0.76189551 0.060446659 -0.017058668 0.13909681 0.38267434 0.15299162 -0.53566597 3.1684998 2.2078611 -0.57809589 16.193063 -1.5771459 -0.44214939 + 79 0.079 0.078373087 0.25294119 0.66868572 1.8928453 0.53099929 0.63126884 0.73057713 6.7503465 4.1853277 1.7058149 0.85920389 34.825179 34.248335 0.295329 0.28151414 4.8793211 0.295329 4.3664873 0.21750475 0.28151414 0.21750475 0.75542296 0.76170757 0.060443521 -0.017080406 0.13891972 0.38265116 0.1524903 -0.53514146 3.1674833 2.2076834 -0.57890693 16.190469 -1.5764473 -0.44179456 + 80 0.08 0.078397346 0.2532152 0.66838745 1.8929074 0.5310177 0.63133751 0.7305522 6.7497411 4.1852758 1.7048828 0.85958251 34.82438 34.247701 0.29505518 0.28162396 4.874363 0.29505518 4.3608134 0.21849438 0.28162396 0.21849438 0.7554595 0.76150333 0.060438285 -0.017103976 0.13875788 0.38261878 0.15202458 -0.53464336 3.1666426 2.2075902 -0.57979119 16.189364 -1.5757749 -0.4414553 + 81 0.081 0.07842724 0.25346793 0.66810483 1.8929761 0.53105612 0.63138935 0.73053065 6.7491695 4.1852225 1.7039933 0.85995361 34.822555 34.245503 0.29532702 0.28172428 4.8699375 0.29532702 4.3551468 0.21946364 0.28172428 0.21946364 0.75549637 0.76130828 0.060435454 -0.017124637 0.1386028 0.38259523 0.15158061 -0.53417584 3.1658109 2.2074165 -0.58058163 16.187551 -1.5750936 -0.44113839 + 82 0.082 0.078451473 0.25373766 0.66781087 1.892993 0.53106384 0.63140441 0.73052477 6.7481443 4.1849205 1.7028328 0.86039091 34.818019 34.240746 0.29532023 0.28195312 4.8642696 0.29532023 4.3483948 0.22055457 0.28195312 0.22055457 0.75554459 0.76110692 0.060429729 -0.017146933 0.1384253 0.38255575 0.1510808 -0.53363655 3.1647217 2.2071679 -0.58141526 16.184559 -1.5743169 -0.44077009 + 83 0.083 0.07847733 0.25398829 0.66753438 1.8930099 0.53108437 0.63140237 0.73052317 6.7471498 4.18466 1.7016631 0.86082665 34.813006 34.235598 0.29505478 0.28235304 4.858495 0.29505478 4.3418414 0.22159878 0.28235304 0.22159878 0.75558783 0.76091685 0.060425472 -0.017168033 0.13825568 0.38252601 0.15060002 -0.53312603 3.1636632 2.2069106 -0.58220857 16.180928 -1.5735593 -0.44042313 + 84 0.084 0.078504539 0.25423146 0.667264 1.8929987 0.5310848 0.63138504 0.7305289 6.7459673 4.1842252 1.7004859 0.8612562 34.807478 34.229901 0.29501074 0.28256591 4.8528915 0.29501074 4.3352607 0.22262001 0.28256591 0.22262001 0.75565332 0.76073054 0.060419778 -0.017188115 0.13807926 0.38247581 0.1501252 -0.532601 3.162523 2.2065837 -0.58292486 16.177797 -1.5727911 -0.44006196 + 85 0.085 0.078531037 0.2544677 0.66700126 1.8929869 0.53111278 0.63133004 0.73054412 6.7448783 4.1840131 1.6991529 0.86171231 34.802787 34.224745 0.29516834 0.28287422 4.8467971 0.29516834 4.3279086 0.22372019 0.28287422 0.22372019 0.75570844 0.7605495 0.060415975 -0.017207725 0.13789849 0.38245455 0.14962601 -0.53208056 3.1614787 2.2063679 -0.58368094 16.174645 -1.5720953 -0.43971027 + 86 0.086 0.078557734 0.25471513 0.66672714 1.892975 0.53112315 0.63129834 0.73055354 6.7437754 4.1837343 1.6978882 0.86215295 34.799113 34.221073 0.29497114 0.28306915 4.8408021 0.29497114 4.321076 0.22475492 0.28306915 0.22475492 0.75578251 0.76036082 0.060411333 -0.017228718 0.13771491 0.38241532 0.14912897 -0.53154429 3.1604209 2.2061532 -0.58444826 16.172527 -1.5713929 -0.43934404 + 87 0.087 0.078582747 0.25497214 0.66644512 1.8929672 0.53112 0.63129083 0.73055639 6.7424123 4.183125 1.6966677 0.86261965 34.790539 34.212193 0.29486413 0.28348218 4.8349296 0.29486413 4.3142407 0.2258248 0.28348218 0.2258248 0.7558467 0.76016725 0.060407511 -0.017249916 0.13754091 0.38236544 0.14863694 -0.53100237 3.1590874 2.2056772 -0.58518925 16.167359 -1.5704758 -0.43897168 + 88 0.088 0.078607066 0.25524139 0.66615155 1.8929355 0.53109085 0.63128214 0.73056252 6.7407516 4.1823086 1.6953127 0.86313032 34.780568 34.202069 0.29463093 0.28386839 4.8281716 0.29463093 4.3064471 0.22709363 0.28386839 0.22709363 0.75589151 0.75996613 0.06040167 -0.017272397 0.13736623 0.38229274 0.14812666 -0.5304194 3.1575467 2.2051268 -0.58599446 16.16172 -1.5694498 -0.43856688 + 89 0.089 0.07863247 0.25552604 0.66584149 1.8929378 0.53105439 0.63133412 0.73054925 6.7391153 4.1812591 1.6942541 0.86360204 34.767589 34.188762 0.29447926 0.28434808 4.8227147 0.29447926 4.3000518 0.22818358 0.28434808 0.22818358 0.75594662 0.75975378 0.060394697 -0.017293416 0.13718992 0.38220802 0.14763924 -0.52984725 3.1559019 2.2043539 -0.58670909 16.154204 -1.5682863 -0.43816662 + 90 0.09 0.078658486 0.25578054 0.66556098 1.8929125 0.53104849 0.63130415 0.7305599 6.7377216 4.1807061 1.6929389 0.86407667 34.760321 34.18115 0.29455654 0.28461504 4.8165411 0.29455654 4.2926613 0.22932329 0.28461504 0.22932329 0.75601168 0.75956099 0.060389578 -0.017314054 0.13700874 0.38215485 0.14713396 -0.52928882 3.1546038 2.2039557 -0.5874626 16.150117 -1.56743 -0.43778251 + 91 0.091 0.078684739 0.25604757 0.66526769 1.8929942 0.53109252 0.63136801 0.73053372 6.7372556 4.1807393 1.6920729 0.86444336 34.758496 34.178943 0.29471033 0.28484221 4.8121816 0.29471033 4.287216 0.23025531 0.28484221 0.23025531 0.75604245 0.75935963 0.060385897 -0.017335691 0.13684142 0.38214276 0.14667144 -0.5288142 3.1538284 2.203832 -0.58828138 16.147873 -1.5667742 -0.43746342 + 92 0.092 0.078711913 0.2562999 0.66498819 1.892955 0.53109436 0.63130667 0.73055396 6.7358145 4.1802879 1.6905721 0.86495452 34.752558 34.17298 0.29443069 0.28514647 4.8050277 0.29443069 4.2791091 0.23148789 0.28514647 0.23148789 0.75610895 0.75916725 0.060382 -0.017357909 0.1366571 0.38209625 0.1461425 -0.52823874 3.1525359 2.203517 -0.5890988 16.144518 -1.5659493 -0.43706944 + 93 0.093 0.078736906 0.25650578 0.66475731 1.8929043 0.53110304 0.63121909 0.73058219 6.7345867 4.1799826 1.6892134 0.86539068 34.748295 34.168434 0.29455611 0.28530454 4.7989467 0.29455611 4.2718585 0.2325321 0.28530454 0.2325321 0.75617947 0.75900778 0.060375894 -0.017374101 0.13648814 0.38206161 0.14567819 -0.52773979 3.1514999 2.20331 -0.58975678 16.142354 -1.5653265 -0.43672911 + 94 0.094 0.078762983 0.25676468 0.66447234 1.8928971 0.53109126 0.63122392 0.73058189 6.7333372 4.1794484 1.6880623 0.86582648 34.742105 34.162394 0.29412596 0.2855848 4.7932326 0.29412596 4.2655875 0.23351915 0.2855848 0.23351915 0.75625511 0.75881201 0.060370665 -0.017396276 0.13630859 0.38200104 0.14519482 -0.52719586 3.1502778 2.2029333 -0.59049851 16.138879 -1.5644973 -0.43635303 + 95 0.095 0.07878981 0.25701552 0.66419467 1.8928677 0.53109582 0.63117376 0.7305981 6.7319245 4.1789733 1.6866209 0.86633036 34.735555 34.155877 0.29370294 0.28597488 4.7862619 0.29370294 4.2578577 0.23470133 0.28597488 0.23470133 0.75632159 0.75862093 0.060366337 -0.017416758 0.13612763 0.38195713 0.14467739 -0.52663453 3.1489765 2.2025776 -0.59129853 16.134981 -1.5636478 -0.43596905 + 96 0.096 0.07881572 0.25730967 0.66387461 1.8929281 0.53110215 0.63125597 0.73056999 6.730932 4.1785119 1.6856566 0.86676348 34.728863 34.148936 0.29361233 0.2863149 4.7811419 0.29361233 4.2517448 0.23578474 0.2863149 0.23578474 0.7563558 0.7584018 0.060361704 -0.017439581 0.13595804 0.38190966 0.14418726 -0.52609692 3.1477551 2.2021536 -0.59214952 16.130342 -1.5627035 -0.43560009 + 97 0.097 0.078842157 0.25755618 0.66360167 1.8929041 0.53109336 0.63123173 0.73057905 6.7295534 4.1779194 1.6844147 0.86721931 34.721205 34.140952 0.29365883 0.28659402 4.7752883 0.29365883 4.2447653 0.23686418 0.28659402 0.23686418 0.7564208 0.75821396 0.060355156 -0.017458843 0.13578177 0.38185271 0.14370258 -0.52555529 3.1464673 2.2017257 -0.59285375 16.126051 -1.5618537 -0.43522635 + 98 0.098 0.078869849 0.25779599 0.66333416 1.8929122 0.53112732 0.6311985 0.73058635 6.7286696 4.1778419 1.6831802 0.86764745 34.71913 34.138903 0.29339488 0.28683223 4.7694622 0.29339488 4.2382298 0.23783748 0.28683223 0.23783748 0.75649805 0.75802948 0.060352911 -0.017479692 0.13560406 0.38183362 0.14321334 -0.52504696 3.1455531 2.2015977 -0.59362437 16.124468 -1.5612262 -0.43488322 + 99 0.099 0.078894813 0.25804667 0.66305851 1.8929336 0.53115105 0.63119899 0.73058355 6.7277963 4.177706 1.6820194 0.86807089 34.716541 34.136177 0.29334965 0.28701418 4.7638046 0.29334965 4.2315449 0.23891007 0.28701418 0.23891007 0.75654374 0.75784016 0.060348715 -0.017499898 0.13543552 0.38180841 0.14273377 -0.52454218 3.1445987 2.2014418 -0.5944371 16.122509 -1.5605457 -0.4345411 + 100 0.1 0.078924085 0.25830703 0.66276889 1.8929438 0.53116002 0.6312024 0.73058142 6.7265414 4.1771815 1.6808209 0.86853892 34.708843 34.128128 0.29332197 0.28739337 4.757927 0.29332197 4.2245633 0.24004182 0.28739337 0.24004182 0.75659239 0.75764057 0.060344982 -0.017521041 0.13526174 0.38176116 0.1422417 -0.52400286 3.143305 2.2009905 -0.59520311 16.117633 -1.559634 -0.43417105 + 101 0.101 0.078952611 0.25854997 0.66249742 1.892964 0.53121512 0.63115922 0.73058969 6.7258248 4.1773556 1.6794836 0.86898554 34.708927 34.128094 0.293232 0.28760115 4.7516631 0.293232 4.2172933 0.24113785 0.28760115 0.24113785 0.75665058 0.75745326 0.060342456 -0.017541521 0.13508794 0.38176067 0.14173343 -0.5234941 3.1425119 2.2010157 -0.59607074 16.116912 -1.5590779 -0.43383177 + 102 0.102 0.078978436 0.25883112 0.66219044 1.8930404 0.53122422 0.6312616 0.73055455 6.7250518 4.1769997 1.6786843 0.86936788 34.703607 34.122458 0.29330001 0.28784876 4.7473541 0.29330001 4.2119381 0.242116 0.28784876 0.242116 0.75667935 0.75724286 0.060338268 -0.017564672 0.13493569 0.38171485 0.14128384 -0.52299869 3.14145 2.2006623 -0.59688045 16.113027 -1.558224 -0.43349132 + 103 0.103 0.079003016 0.25910592 0.66189106 1.8931 0.53121866 0.6313584 0.7305229 6.72407 4.1764155 1.6779011 0.86975344 34.695617 34.114084 0.29335624 0.28817623 4.7431596 0.29335624 4.2067461 0.24305726 0.28817623 0.24305726 0.75671477 0.75703782 0.060333378 -0.017587028 0.1347816 0.38165806 0.14084499 -0.52250305 3.1402425 2.2001599 -0.59761255 16.107802 -1.5572894 -0.43314827 + 104 0.104 0.079030662 0.25932288 0.66164645 1.8931011 0.53125226 0.63131525 0.73053355 6.7232198 4.1763361 1.6767301 0.87015369 34.693481 34.11183 0.29327783 0.28837349 4.7377152 0.29327783 4.2004405 0.24399684 0.28837349 0.24399684 0.75677991 0.7568686 0.06032986 -0.017604771 0.1346105 0.38163923 0.14039082 -0.52203005 3.1393882 2.2000323 -0.59830269 16.106253 -1.5567158 -0.43282875 + 105 0.105 0.079059904 0.25957885 0.66136125 1.8931143 0.53125598 0.6313301 0.73052819 6.7219956 4.1757475 1.6756587 0.87058943 34.684949 34.102864 0.29331568 0.28876842 4.732568 0.29331568 4.1942764 0.24497595 0.28876842 0.24497595 0.7568454 0.75667197 0.060326483 -0.017627127 0.13443748 0.38158655 0.13991768 -0.52150423 3.138114 2.1995333 -0.59898949 16.100984 -1.5558144 -0.4324665 + 106 0.106 0.079082774 0.25979634 0.66112089 1.8930719 0.53124806 0.63127706 0.73054675 6.7206575 4.1752118 1.6744294 0.87101631 34.677746 34.095268 0.29344464 0.28903381 4.7269856 0.29344464 4.1875747 0.24596625 0.28903381 0.24596625 0.75691269 0.75650664 0.06031986 -0.017644109 0.13426921 0.38153868 0.13946392 -0.52100261 3.1369364 2.1991632 -0.59960324 16.097065 -1.5550763 -0.43212145 + 107 0.107 0.079109024 0.26003407 0.6608569 1.8930797 0.53127229 0.63125652 0.73055091 6.7197092 4.1750391 1.6732254 0.87144468 34.674579 34.091991 0.29332099 0.28926637 4.7212069 0.29332099 4.1808776 0.24700832 0.28926637 0.24700832 0.75696786 0.75632482 0.060314914 -0.01766237 0.13410143 0.3815126 0.13899129 -0.52050389 3.1359583 2.1989819 -0.6003711 16.094845 -1.5544032 -0.43178317 + 108 0.108 0.079136112 0.26024743 0.66061646 1.8930539 0.53128589 0.63119961 0.73056836 6.7185962 4.1747677 1.6719567 0.8718719 34.670443 34.087604 0.29337363 0.28946487 4.7153687 0.29337363 4.1739532 0.24804185 0.28946487 0.24804185 0.75702852 0.7561585 0.060309753 -0.017680964 0.13393954 0.38147697 0.13853721 -0.52001417 3.1349433 2.1987712 -0.60105753 16.092449 -1.5537583 -0.43144878 + 109 0.109 0.079162532 0.26046185 0.66037561 1.8930379 0.53130275 0.6311532 0.73058196 6.7175242 4.1745046 1.6707233 0.87229631 34.666601 34.083789 0.29309284 0.28971929 4.7095311 0.29309284 4.1674212 0.24901698 0.28971929 0.24901698 0.75709962 0.75599207 0.060306561 -0.01769871 0.13378063 0.38144508 0.13808903 -0.51953411 3.1339316 2.1985484 -0.60175107 16.090137 -1.5530978 -0.43112165 + 110 0.11 0.079186445 0.26071673 0.66009683 1.8930668 0.53129113 0.63121204 0.73056364 6.7163563 4.1738357 1.66982 0.87270063 34.657439 34.074358 0.29292722 0.29015352 4.7047974 0.29292722 4.1618966 0.24997363 0.29015352 0.24997363 0.75713681 0.7558009 0.06030043 -0.017718822 0.13363066 0.3813859 0.13765786 -0.51904376 3.1326543 2.1980133 -0.6024375 16.084341 -1.5521646 -0.4307816 + 111 0.111 0.079212078 0.26095039 0.65983754 1.8930176 0.53126157 0.6311776 0.7305784 6.7146941 4.1729624 1.6685649 0.87316679 34.646767 34.063424 0.292808 0.29053485 4.6988575 0.292808 4.1550283 0.25102123 0.29053485 0.25102123 0.7572114 0.75562234 0.060294676 -0.017738391 0.13346397 0.38131172 0.13719393 -0.51850565 3.1311785 2.197418 -0.60305818 16.078606 -1.5512216 -0.43040637 + 112 0.112 0.079239699 0.26117268 0.65958762 1.8929655 0.5312784 0.63107706 0.73061005 6.7134104 4.1726915 1.6670788 0.8736402 34.643115 34.059671 0.29274082 0.29070331 4.6921911 0.29274082 4.1473474 0.25210286 0.29070331 0.25210286 0.75730555 0.75544959 0.060290903 -0.017756707 0.13327639 0.38128039 0.13668619 -0.51796657 3.130092 2.1972216 -0.6037651 16.076851 -1.5505758 -0.43004002 + 113 0.113 0.079265724 0.26143028 0.659304 1.8929676 0.53127446 0.63108538 0.73060771 6.7122233 4.1721928 1.6659599 0.8740706 34.636572 34.052897 0.292706 0.29096892 4.6868338 0.292706 4.1410361 0.25309167 0.29096892 0.25309167 0.75737683 0.75525473 0.060286383 -0.017779016 0.13310531 0.38122701 0.13620635 -0.51743337 3.1288972 2.1968428 -0.60448689 16.07302 -1.5497579 -0.42967269 + 114 0.114 0.07929225 0.26168236 0.65902539 1.8929768 0.53125531 0.63112472 0.73059673 6.7109105 4.1713951 1.6650406 0.87447488 34.626034 34.041961 0.29267802 0.29139565 4.6822714 0.29267802 4.1356089 0.25398453 0.29139565 0.25398453 0.75743607 0.75506309 0.060280909 -0.017800187 0.13293669 0.38115692 0.13576608 -0.51692301 3.1275496 2.1962295 -0.60509042 16.066767 -1.5488104 -0.42931688 + 115 0.115 0.079316661 0.26191252 0.65877082 1.8929366 0.53124028 0.63108456 0.73061178 6.7094315 4.1707237 1.6637775 0.87493039 34.616984 34.032565 0.29263691 0.29178192 4.676349 0.29263691 4.1286747 0.25503733 0.29178192 0.25503733 0.75749774 0.75488796 0.060274777 -0.01781919 0.13276901 0.38109887 0.13530077 -0.51639964 3.1262225 2.195762 -0.60573821 16.061639 -1.547963 -0.42895506 + 116 0.116 0.079344267 0.26211484 0.65854089 1.8929104 0.53126794 0.63100827 0.73063414 6.7084097 4.1705603 1.6625019 0.87534747 34.613669 34.02915 0.29246235 0.2920562 4.6706122 0.29246235 4.1222156 0.25593419 0.2920562 0.25593419 0.75758538 0.75472853 0.060272019 -0.017837449 0.13260591 0.38107636 0.13484837 -0.51592473 3.1253001 2.1955997 -0.60638362 16.059613 -1.5473884 -0.42863345 + 117 0.117 0.079369526 0.26235 0.65828047 1.8929235 0.53128908 0.63099978 0.73063462 6.7075683 4.1704634 1.6613494 0.87575552 34.612075 34.027572 0.29232205 0.29218144 4.6650076 0.29232205 4.1157245 0.25696099 0.29218144 0.25696099 0.75763725 0.75454931 0.060267008 -0.017856606 0.13244873 0.38104864 0.1343913 -0.51543994 3.1244091 2.1954951 -0.60716606 16.058414 -1.5467738 -0.4283041 + 118 0.118 0.079398219 0.26260444 0.65799734 1.8929332 0.53129532 0.63100599 0.73063186 6.7064207 4.1700109 1.6602168 0.87619301 34.605931 34.021309 0.2921352 0.29248704 4.6595205 0.2921352 4.1094419 0.25794338 0.29248704 0.25794338 0.75771333 0.75435418 0.060263307 -0.017877993 0.13227902 0.3809998 0.13391333 -0.51491313 3.1232248 2.1951187 -0.60789702 16.054678 -1.545952 -0.42794204 + 119 0.119 0.079421868 0.26285046 0.65772767 1.8929245 0.53128723 0.63100371 0.73063351 6.7052109 4.1695154 1.6590758 0.87661969 34.599413 34.014529 0.29214006 0.29274324 4.654084 0.29214006 4.1029922 0.25895175 0.29274324 0.25895175 0.75777541 0.75416914 0.060256587 -0.017897926 0.13211425 0.38094763 0.13344765 -0.51439528 3.1220479 2.1947649 -0.60860459 16.050908 -1.5451657 -0.42758522 + 120 0.12 0.079448344 0.2631226 0.65742905 1.8929833 0.53129603 0.63108019 0.73060704 6.7041904 4.1689762 1.6581757 0.87703843 34.591174 34.005943 0.29203921 0.29319168 4.6493231 0.29203921 4.0973354 0.25994848 0.29319168 0.25994848 0.75781209 0.75396418 0.060253875 -0.017919514 0.13195908 0.38090164 0.13299351 -0.51389515 3.1208048 2.1942585 -0.60935726 16.045267 -1.5442139 -0.42724158 + 121 0.121 0.079473239 0.26334728 0.65717948 1.892971 0.53129492 0.63106332 0.73061279 6.7030748 4.1685676 1.6570655 0.87744169 34.585823 34.000539 0.29183061 0.29345305 4.6439967 0.29183061 4.0912892 0.2608768 0.29345305 0.2608768 0.75787686 0.75379227 0.06024782 -0.017937892 0.13179892 0.38085439 0.13255455 -0.51340893 3.1197355 2.1939599 -0.61001484 16.042162 -1.54351 -0.42690693 + 122 0.122 0.079499456 0.26357171 0.65692884 1.8929632 0.53132014 0.63101788 0.73062514 6.7021807 4.1685111 1.6558116 0.87785807 34.584795 33.999602 0.29162424 0.29356949 4.6381294 0.29162424 4.0846444 0.26186074 0.29356949 0.26186074 0.75795233 0.75361935 0.060244039 -0.017957242 0.13163263 0.3808306 0.13208635 -0.51291695 3.1188712 2.1938948 -0.61076283 16.04151 -1.5429535 -0.42657365 + 123 0.123 0.079524322 0.26381132 0.65666436 1.893018 0.53133387 0.63108182 0.7306023 6.7014593 4.1682184 1.6550375 0.87820345 34.580566 33.995303 0.2914514 0.29381205 4.6340702 0.2914514 4.0799472 0.2626716 0.29381205 0.2626716 0.75800047 0.7534375 0.06024014 -0.017976384 0.13148757 0.38079289 0.13168225 -0.51247514 3.1179422 2.1935938 -0.61143707 16.038496 -1.5422364 -0.42627074 + 124 0.124 0.079546414 0.26404813 0.65640546 1.8929822 0.5313034 0.63106873 0.73061005 6.6998944 4.1673522 1.6538988 0.87864344 34.569754 33.984104 0.29146423 0.29418586 4.6287017 0.29146423 4.0735854 0.2636521 0.29418586 0.2636521 0.75807209 0.75325999 0.060233661 -0.01799435 0.13132185 0.38072346 0.13123032 -0.51195378 3.1165129 2.1929942 -0.61202912 16.032579 -1.5413088 -0.42590773 + 125 0.125 0.079575707 0.26427085 0.65615344 1.8929912 0.53133753 0.63103678 0.73061691 6.6990306 4.1672643 1.6527066 0.87905964 34.567704 33.982003 0.29132179 0.29437897 4.6230891 0.29132179 4.0671447 0.26462262 0.29437897 0.26462262 0.75814333 0.75308547 0.060231438 -0.018014469 0.13116616 0.38070141 0.13077438 -0.51147579 3.1156149 2.1928554 -0.61276142 16.031069 -1.5406972 -0.42558417 + 126 0.126 0.079601697 0.26450791 0.65589039 1.8929675 0.53133914 0.63099912 0.73062928 6.6977805 4.1668051 1.6514793 0.8794961 34.561289 33.975435 0.29114549 0.29470821 4.6173953 0.29114549 4.06068 0.26556979 0.29470821 0.26556979 0.75822748 0.75290433 0.060225313 -0.018033234 0.13098447 0.38065571 0.13029424 -0.51094995 3.1144544 2.1925126 -0.61342214 16.027387 -1.539952 -0.42522346 + 127 0.127 0.079627707 0.26475336 0.65561894 1.8929746 0.53130513 0.63105512 0.73061439 6.6963754 4.165847 1.6506385 0.87988992 34.549578 33.963555 0.29085548 0.29516678 4.613022 0.29085548 4.055768 0.26639855 0.29516678 0.26639855 0.7582941 0.75271758 0.060219827 -0.018054039 0.13083252 0.3805719 0.12988373 -0.51045563 3.1130224 2.191804 -0.61398258 16.020645 -1.5389485 -0.42487529 + 128 0.128 0.079654167 0.26500057 0.65534526 1.8929715 0.53128095 0.63108264 0.7306079 6.695009 4.1650671 1.6496335 0.88030844 34.540371 33.9544 0.29042296 0.29554827 4.6079319 0.29042296 4.050217 0.26729193 0.29554827 0.26729193 0.75837244 0.75252925 0.060214951 -0.018075011 0.13067354 0.38049789 0.12944412 -0.509942 3.1116679 2.1912384 -0.61461577 16.015458 -1.5380236 -0.42451642 + 129 0.129 0.079680929 0.26522585 0.65509323 1.8929184 0.53128011 0.63100416 0.73063416 6.6935545 4.1645818 1.6481783 0.88079434 34.534041 33.948003 0.29018432 0.29585338 4.6011435 0.29018432 4.0425354 0.26842383 0.29585338 0.26842383 0.75844713 0.75235528 0.060209735 -0.018093779 0.13050048 0.38045061 0.12895327 -0.50940388 3.1104143 2.1909092 -0.61532138 16.012035 -1.5372606 -0.42414717 + 130 0.13 0.079710965 0.26547756 0.65481147 1.8929399 0.53130574 0.63100213 0.73063199 6.6924811 4.1642152 1.6470249 0.88124098 34.527614 33.941148 0.29023467 0.2962317 4.5956639 0.29023467 4.0359789 0.26945029 0.2962317 0.26945029 0.75850959 0.75216077 0.060207264 -0.018114934 0.13032963 0.38041768 0.12846907 -0.50888675 3.1092598 2.1905355 -0.61604711 16.007722 -1.5364446 -0.4237951 + 131 0.131 0.079737608 0.2656835 0.65457889 1.8929004 0.53132565 0.63091638 0.73065836 6.6912498 4.1638956 1.6456633 0.88169088 34.522129 33.935368 0.2901928 0.29656822 4.5895359 0.2901928 4.0288852 0.27045797 0.29656822 0.27045797 0.75858619 0.75199979 0.060203734 -0.018131603 0.13016107 0.3803903 0.12800399 -0.50839429 3.1081779 2.1902694 -0.61668891 16.004466 -1.5357802 -0.4234607 + 132 0.132 0.079764156 0.26588794 0.6543479 1.8928716 0.53133209 0.63086458 0.73067491 6.6900328 4.1634989 1.6444099 0.88212396 34.516689 33.929793 0.29006137 0.29683485 4.5836111 0.29006137 4.0220534 0.27149637 0.29683485 0.27149637 0.75864352 0.7518399 0.060198242 -0.018147682 0.13001425 0.38034879 0.12757285 -0.50792163 3.10707 2.1899713 -0.61734721 16.001333 -1.5350763 -0.42313637 + 133 0.133 0.079789592 0.26612355 0.65408686 1.8928511 0.53133714 0.63082712 0.73068683 6.6887991 4.1630988 1.6431236 0.8825767 34.511188 33.924174 0.28990247 0.29711203 4.5775434 0.28990247 4.0150932 0.27254779 0.29711203 0.27254779 0.75871499 0.75166022 0.060194191 -0.018167433 0.12984795 0.38030733 0.12709487 -0.50740219 3.1059138 2.189672 -0.61806673 15.998141 -1.5343306 -0.42278087 + 134 0.134 0.079815784 0.26636546 0.65381876 1.8928845 0.53135216 0.63085719 0.73067514 6.6879624 4.1628609 1.6421356 0.88296584 34.507577 33.92056 0.28966022 0.29735636 4.5725537 0.28966022 4.0094135 0.27348002 0.29735636 0.27348002 0.75876624 0.75147566 0.06018859 -0.018185978 0.1296958 0.3802701 0.12665814 -0.50692824 3.1049507 2.1894412 -0.618805 15.995567 -1.5336333 -0.42245663 + 135 0.135 0.079838729 0.26659377 0.6535675 1.8928987 0.53132764 0.63091116 0.73065988 6.6868346 4.1621715 1.6413419 0.8833212 34.499762 33.912842 0.28926265 0.29765702 4.5683247 0.28926265 4.0047906 0.27427146 0.29765702 0.27427146 0.75882437 0.75130306 0.06018321 -0.018205326 0.12955796 0.38020102 0.12627616 -0.50647717 3.1037692 2.1889391 -0.61938248 15.991098 -1.532802 -0.42214056 + 136 0.136 0.07986445 0.26681775 0.6533178 1.8928567 0.53135323 0.63081413 0.73068938 6.6857045 4.16205 1.6398716 0.88378286 34.496859 33.909628 0.28937612 0.29785485 4.5618815 0.28937612 3.99718 0.27532537 0.29785485 0.27532537 0.75891275 0.75113088 0.060177996 -0.018223116 0.12937391 0.38018127 0.12576635 -0.50594762 3.1027979 2.1888425 -0.62010838 15.989449 -1.5322322 -0.42178314 + 137 0.137 0.079890173 0.26708171 0.65302812 1.892927 0.53136147 0.63090852 0.730657 6.6849644 4.1617352 1.6390758 0.88415335 34.492565 33.90522 0.28928477 0.2980603 4.5574638 0.28928477 3.991869 0.27631008 0.2980603 0.27631008 0.75893218 0.75093204 0.060172591 -0.018244803 0.12922787 0.3801352 0.12534234 -0.50547754 3.1017918 2.1885359 -0.62088368 15.986251 -1.5314427 -0.42145952 + 138 0.138 0.079918611 0.26731493 0.65276646 1.8929412 0.53137987 0.63090524 0.73065604 6.6840327 4.1614932 1.6379797 0.8845598 34.489005 33.901392 0.28941168 0.29820123 4.552266 0.28941168 3.9855473 0.27730707 0.29820123 0.27730707 0.75899064 0.75075128 0.060167524 -0.018263314 0.12907025 0.38009865 0.12489381 -0.50499245 3.1008064 2.1883058 -0.62159529 15.984002 -1.5307639 -0.421128 + 139 0.139 0.079943906 0.26752905 0.65252705 1.8929126 0.53137907 0.63086343 0.73067007 6.682881 4.1610908 1.6368316 0.88495862 34.483485 33.895505 0.28958412 0.29839556 4.5471298 0.28958412 3.9793351 0.27821053 0.29839556 0.27821053 0.75906671 0.75058605 0.060161129 -0.018281034 0.1289072 0.38005225 0.12445433 -0.50450658 3.099763 2.1880239 -0.62219555 15.981017 -1.5301131 -0.42079378 + 140 0.14 0.079967387 0.26777533 0.65225728 1.8929067 0.53133746 0.6309101 0.73065914 6.6813618 4.1600632 1.6359317 0.88536689 34.471091 33.882874 0.28937632 0.29884059 4.5425203 0.28937632 3.9740478 0.2790962 0.29884059 0.2790962 0.75913031 0.75040099 0.060155233 -0.018300959 0.12875374 0.37996666 0.12403639 -0.50400304 3.098266 2.1872892 -0.62275074 15.974027 -1.5290899 -0.42043907 + 141 0.141 0.079994634 0.26799783 0.65200753 1.8929343 0.5313391 0.63094931 0.73064589 6.6804462 4.1596354 1.6350873 0.88572348 34.465255 33.876997 0.28910071 0.29915772 4.5381645 0.28910071 3.9691481 0.27991568 0.29915772 0.27991568 0.75917851 0.75022844 0.06015004 -0.018321007 0.12861708 0.37991452 0.12364702 -0.50356154 3.0972459 2.1869291 -0.62336912 15.97026 -1.5283575 -0.42013314 + 142 0.142 0.080020977 0.268202 0.65177703 1.8928768 0.53131191 0.6308994 0.73066554 6.6787924 4.1587088 1.6339284 0.88615531 34.453094 33.86453 0.28887013 0.2996931 4.532841 0.28887013 3.9632088 0.28076208 0.2996931 0.28076208 0.75926872 0.75006891 0.060144338 -0.018338395 0.12846064 0.37984205 0.12322605 -0.5030681 3.0958097 2.1862768 -0.62384056 15.963554 -1.5274634 -0.41978808 + 143 0.143 0.080045409 0.26843942 0.65151517 1.892866 0.53128919 0.63091335 0.73066342 6.6773208 4.1578348 1.6329024 0.8865835 34.441291 33.852294 0.28879202 0.30020479 4.5278338 0.28879202 3.957341 0.28170078 0.30020479 0.28170078 0.75932715 0.74988891 0.060139298 -0.018357532 0.12830467 0.37977396 0.1227935 -0.50256746 3.0943792 2.1856236 -0.62441699 15.956594 -1.5264985 -0.41943919 + 144 0.144 0.080067196 0.268682 0.6512508 1.8928391 0.53129528 0.630865 0.73067886 6.6760918 4.1574964 1.6315505 0.88704492 34.436155 33.846741 0.28899918 0.30041429 4.521733 0.28899918 3.9499414 0.28279235 0.30041429 0.28279235 0.75940144 0.74970782 0.060133141 -0.018375727 0.12813211 0.37974096 0.12229319 -0.50203414 3.0932518 2.1853833 -0.62515787 15.953672 -1.5257911 -0.41907631 + 145 0.145 0.080092412 0.2688914 0.65101619 1.8928687 0.53134545 0.6308424 0.73068082 6.6754562 4.1575224 1.6305181 0.8874157 34.433639 33.843827 0.2890721 0.30073978 4.5170072 0.2890721 3.9443041 0.28363095 0.30073978 0.28363095 0.75945652 0.74954581 0.060130724 -0.018391924 0.12797755 0.37974103 0.12186629 -0.50160732 3.0925044 2.1852692 -0.62580844 15.951302 -1.5252559 -0.41879178 + 146 0.146 0.080116098 0.26913052 0.65075338 1.892899 0.53133469 0.6309023 0.73066205 6.674451 4.1569274 1.6297582 0.88776549 34.425993 33.835942 0.28900772 0.30104231 4.5132067 0.28900772 3.9398293 0.28436977 0.30104231 0.28436977 0.75952643 0.74936535 0.060125399 -0.018411195 0.12783034 0.379683 0.1214654 -0.5011484 3.0913843 2.1847932 -0.62638379 15.946719 -1.5244492 -0.41847294 + 147 0.147 0.080140942 0.26936166 0.65049739 1.8928912 0.53132998 0.63089681 0.7306644 6.6733057 4.1564432 1.6286975 0.88816499 34.419801 33.829683 0.28879254 0.30132531 4.5081767 0.28879254 3.934162 0.28522214 0.30132531 0.28522214 0.75961035 0.74918916 0.060119811 -0.018429131 0.12766721 0.37963189 0.12102448 -0.50065638 3.0902687 2.1844344 -0.62700756 15.943209 -1.5237145 -0.41813356 + 148 0.148 0.08016736 0.26958371 0.65024893 1.8929205 0.53134954 0.6309147 0.73065626 6.6723461 4.156037 1.6277558 0.88855336 34.413097 33.822602 0.28878638 0.30170792 4.5035708 0.28878638 3.928674 0.28611039 0.30170792 0.28611039 0.75966013 0.74901765 0.060117298 -0.018446965 0.12752279 0.3795991 0.12061416 -0.50021326 3.0891981 2.1840308 -0.6276261 15.938712 -1.5229433 -0.41783086 + 149 0.149 0.080194084 0.269812 0.64999391 1.8929352 0.53136061 0.63092191 0.73065263 6.6713762 4.1557087 1.6267166 0.88895086 34.408668 33.818042 0.28871585 0.30190986 4.498549 0.28871585 3.922794 0.28703908 0.30190986 0.28703908 0.75972563 0.7488417 0.060113237 -0.018465743 0.12737579 0.37955841 0.12018529 -0.4997437 3.0881727 2.1837449 -0.62830666 15.935987 -1.5222355 -0.41750878 + 150 0.15 0.080218578 0.27001191 0.64976952 1.8929184 0.53138089 0.63086981 0.73066774 6.6703848 4.1554833 1.6255551 0.88934636 34.404745 33.81389 0.28870703 0.30214875 4.4932831 0.28870703 3.9166492 0.28792686 0.30214875 0.28792686 0.75979866 0.74868666 0.060109505 -0.01848207 0.12722302 0.37953366 0.11975929 -0.49929296 3.0872445 2.1835419 -0.62891732 15.933604 -1.521648 -0.41720278 + 151 0.151 0.080240211 0.27025678 0.64950301 1.8929652 0.53134361 0.6309896 0.73063195 6.6692764 4.1545675 1.6250434 0.88966542 34.393644 33.802396 0.28875352 0.30249458 4.4903824 0.28875352 3.9130039 0.28862504 0.30249458 0.28862504 0.75984656 0.74850418 0.060102766 -0.018501103 0.12709182 0.37945168 0.11940293 -0.49885462 3.0859592 2.1828458 -0.62942494 15.927058 -1.5206907 -0.41689234 + 152 0.152 0.080261542 0.27048076 0.64925769 1.8929207 0.53129459 0.63098825 0.73063785 6.6676092 4.153518 1.6240087 0.89008245 34.380954 33.789262 0.28880403 0.3028875 4.4855197 0.28880403 3.9071943 0.28952129 0.3028875 0.28952129 0.75992119 0.7483359 0.060094685 -0.018518264 0.12694397 0.37936586 0.11898962 -0.49835548 3.0844604 2.1821464 -0.6299271 15.92027 -1.5197343 -0.41654051 + 153 0.153 0.080288929 0.27071335 0.64899772 1.8929262 0.53132403 0.63095732 0.73064489 6.6665973 4.153297 1.6227771 0.89052308 34.376201 33.784124 0.28885757 0.30321968 4.4797999 0.28885757 3.9003907 0.2905516 0.30321968 0.2905516 0.75998147 0.7481565 0.060091558 -0.018537005 0.12678109 0.37934301 0.11851692 -0.49785993 3.0834275 2.1819064 -0.63064731 15.916975 -1.5190408 -0.41620507 + 154 0.154 0.080315562 0.27091352 0.64877092 1.8928921 0.53135813 0.63086063 0.73067333 6.6656974 4.1533516 1.6214059 0.89093995 34.376151 33.784002 0.28886328 0.30328582 4.4737941 0.28886328 3.8934313 0.29149951 0.30328582 0.29149951 0.76007502 0.74799938 0.060087066 -0.018554131 0.12661496 0.37932944 0.11805058 -0.49738001 3.082657 2.181933 -0.63133566 15.917086 -1.5186056 -0.41588211 + 155 0.155 0.080343316 0.27115938 0.6484973 1.8929495 0.53138797 0.63090693 0.73065458 6.6650309 4.1532134 1.6205043 0.89131324 34.37332 33.781152 0.28862447 0.30354391 4.469213 0.28862447 3.8882305 0.29235806 0.30354391 0.29235806 0.76013345 0.7478108 0.060084426 -0.018575037 0.12646387 0.37930213 0.11761592 -0.49691805 3.0817731 2.1817231 -0.63206337 15.91472 -1.5179339 -0.41556806 + 156 0.156 0.080370856 0.27135914 0.64827001 1.8929074 0.53138818 0.63084351 0.7306757 6.6637582 4.1527273 1.6193065 0.89172442 34.366912 33.774833 0.28816691 0.30391239 4.4637164 0.28816691 3.8823923 0.29315719 0.30391239 0.29315719 0.76023731 0.74765315 0.060079705 -0.018592267 0.12630367 0.37925359 0.1171858 -0.49643939 3.0806598 2.1813714 -0.63260888 15.911251 -1.5172576 -0.41523817 + 157 0.157 0.080395402 0.27154961 0.64805499 1.8928853 0.53140311 0.63079045 0.73069173 6.6627093 4.1524323 1.6181596 0.89211738 34.362255 33.770166 0.28784669 0.30424276 4.4583448 0.28784669 3.8764822 0.29401593 0.30424276 0.29401593 0.76030732 0.74750435 0.060077062 -0.018609037 0.12615742 0.37922384 0.11677819 -0.49600203 3.0796946 2.1811267 -0.63319193 15.908404 -1.5166513 -0.41493998 + 158 0.158 0.080423917 0.27175015 0.64782593 1.8928209 0.53144046 0.63064407 0.73073637 6.6615184 4.1524139 1.6164943 0.89261012 34.360633 33.768431 0.28775512 0.30444773 4.4510159 0.28775512 3.8681088 0.29515195 0.30444773 0.29515195 0.76039862 0.7473453 0.060073362 -0.018626252 0.1259818 0.37921239 0.1162697 -0.49548208 3.0787475 2.1811063 -0.63392974 15.907551 -1.5161413 -0.41459081 + 159 0.159 0.080448123 0.2719618 0.64759008 1.8928004 0.53146373 0.63058235 0.73075436 6.6605174 4.1522653 1.6152217 0.89303038 34.35801 33.765815 0.28753057 0.30466458 4.4451643 0.28753057 3.8615399 0.29609391 0.30466458 0.29609391 0.76048079 0.74718269 0.060070111 -0.018643728 0.1258183 0.37919148 0.11581294 -0.49500443 3.077824 2.1809716 -0.63460616 15.905971 -1.5155707 -0.41426773 + 160 0.16 0.080474657 0.27215079 0.64737455 1.8927725 0.53151241 0.63047559 0.73078454 6.6597647 4.1524647 1.6138687 0.89343134 34.359273 33.766944 0.28762006 0.30470866 4.4393513 0.28762006 3.8547305 0.29700072 0.30470866 0.29700072 0.76057459 0.74703311 0.06006674 -0.018659711 0.12565418 0.37919219 0.11535605 -0.49454823 3.0771769 2.1810733 -0.63527709 15.906697 -1.5152138 -0.41396375 + 161 0.161 0.080498655 0.2723966 0.64710475 1.8928084 0.53149584 0.63055154 0.73076106 6.6586506 4.1517651 1.6130764 0.89380907 34.350041 33.757485 0.28743489 0.30512182 4.4351007 0.28743489 3.8497899 0.29787592 0.30512182 0.29787592 0.76061467 0.74684791 0.060061517 -0.018680111 0.12551673 0.37912731 0.11495696 -0.49408427 3.0759268 2.1805219 -0.63590033 15.900924 -1.5143081 -0.41364003 + 162 0.162 0.080527069 0.27257891 0.64689402 1.8928169 0.5315327 0.63051515 0.73076909 6.6579744 4.1517176 1.6121128 0.89414406 34.348111 33.755296 0.28752938 0.30528601 4.4308376 0.28752938 3.8447147 0.29859352 0.30528601 0.29859352 0.76069222 0.74670111 0.060058002 -0.018694886 0.12537394 0.3791097 0.11457317 -0.49368287 3.0752184 2.1803999 -0.63644271 15.899543 -1.5138381 -0.41336851 + 163 0.163 0.080550435 0.27280706 0.64664251 1.8928877 0.53155854 0.63058676 0.73074235 6.6576138 4.1517396 1.6114364 0.8944378 34.347754 33.754752 0.28768555 0.30531635 4.4273925 0.28768555 3.8403535 0.29935348 0.30531635 0.29935348 0.76072927 0.74652824 0.060052494 -0.018713451 0.12523939 0.37908562 0.11419365 -0.49327927 3.0745901 2.1803329 -0.63711913 15.898724 -1.5133276 -0.41309409 + 164 0.164 0.08057432 0.27305167 0.64637401 1.8929134 0.53156738 0.63061354 0.73073244 6.6566363 4.1513356 1.6104704 0.8948304 34.342061 33.748723 0.28779078 0.3055472 4.4227594 0.28779078 3.8347125 0.30025611 0.3055472 0.30025611 0.76079534 0.74634394 0.060048249 -0.018731062 0.12507811 0.37904718 0.11375039 -0.49279757 3.0735153 2.1799747 -0.63777453 15.895187 -1.5125723 -0.41276442 + 165 0.165 0.080598791 0.27326752 0.64613369 1.8929206 0.53155145 0.6306456 0.73072353 6.6554309 4.1505924 1.6096423 0.89519621 34.332116 33.738535 0.28757248 0.30600885 4.4185943 0.28757248 3.8299981 0.30102373 0.30600885 0.30102373 0.76085398 0.74617829 0.06004252 -0.018747214 0.12493701 0.37898434 0.11337189 -0.49235623 3.0722826 2.1793983 -0.63827878 15.889221 -1.5117237 -0.41245623 + 166 0.166 0.08062232 0.27349806 0.64587961 1.8929439 0.53155011 0.63068243 0.7307114 6.6544966 4.1501715 1.6087669 0.89555814 34.326497 33.732777 0.28745154 0.306268 4.414268 0.28745154 3.8249829 0.30183354 0.306268 0.30183354 0.76091718 0.74600367 0.060037207 -0.018765409 0.12479395 0.37893658 0.11296593 -0.49190251 3.0712598 2.1790592 -0.63890135 15.885749 -1.5110072 -0.41214313 + 167 0.167 0.080646791 0.27370755 0.64564566 1.8929581 0.53159077 0.63064948 0.73071787 6.6537182 4.1501108 1.6076591 0.89594833 34.323373 33.729117 0.28773717 0.30651866 4.4092456 0.28773717 3.8187303 0.30277821 0.30651866 0.30277821 0.76096463 0.74584226 0.060033627 -0.018780796 0.12464048 0.37892977 0.11253255 -0.49146232 3.0704278 2.1789134 -0.63955262 15.883288 -1.5104435 -0.41184816 + 168 0.168 0.080672471 0.27392485 0.64540268 1.8929729 0.53160043 0.63065885 0.73071367 6.6526485 4.1495982 1.6067156 0.8963346 34.315662 33.720977 0.28779254 0.30689214 4.404757 0.28779254 3.8133386 0.30362581 0.30689214 0.30362581 0.76102687 0.74567457 0.060030414 -0.018796874 0.1244923 0.37888963 0.11212652 -0.49101614 3.0693019 2.178457 -0.64011502 15.878469 -1.5096629 -0.41154179 + 169 0.169 0.080697652 0.27415919 0.64514316 1.8929813 0.5315672 0.63071564 0.73069843 6.6511985 4.1485574 1.605916 0.89672512 34.302458 33.707371 0.28769017 0.30739728 4.4006649 0.28769017 3.8085365 0.30443824 0.30739728 0.30443824 0.76109045 0.74549596 0.060025461 -0.018815179 0.12435049 0.37880806 0.11173743 -0.49054549 3.0678204 2.1776682 -0.64060493 15.870802 -1.5086351 -0.41120989 + 170 0.17 0.080721649 0.27438173 0.64489662 1.8929276 0.53153045 0.63068406 0.73071304 6.6495416 4.1476403 1.6047341 0.89716728 34.291252 33.695879 0.28758 0.30779375 4.3951633 0.28758 3.8022039 0.30537943 0.30779375 0.30537943 0.76117483 0.74532627 0.060019794 -0.018835708 0.1241938 0.37873021 0.11129932 -0.49002954 3.0663669 2.1770606 -0.64114179 15.864842 -1.5077371 -0.41084863 + 171 0.171 0.080745013 0.27463345 0.64462154 1.8930102 0.53153253 0.63080534 0.73067238 6.6488582 4.1472104 1.6041581 0.89748973 34.285394 33.689827 0.28750512 0.30806117 4.3918271 0.28750512 3.7981634 0.30615861 0.30806117 0.30615861 0.76120784 0.74513769 0.060015556 -0.018856239 0.12406457 0.37868139 0.11092141 -0.4896028 3.0653704 2.1766527 -0.64179146 15.860737 -1.5069414 -0.41055328 + 172 0.172 0.080769085 0.2748766 0.64435431 1.8929963 0.53149691 0.63083187 0.7306675 6.647306 4.146228 1.6031606 0.89791741 34.272936 33.677048 0.28733138 0.30855668 4.3868969 0.28733138 3.7924959 0.30706956 0.30855668 0.30706956 0.76127682 0.74495419 0.060009348 -0.018875772 0.12390952 0.37860133 0.11049149 -0.48909282 3.0638711 2.1759494 -0.64234826 15.853617 -1.5059451 -0.41019551 + 173 0.173 0.080793576 0.27507311 0.64413331 1.8929015 0.5314608 0.63073778 0.73070287 6.6453719 4.1452125 1.6017556 0.89840374 34.260184 33.664172 0.28689406 0.30911758 4.3804309 0.28689406 3.7854874 0.3080494 0.30911758 0.3080494 0.76137421 0.74480141 0.060004951 -0.018893447 0.12375495 0.37852653 0.11005149 -0.48857801 3.062296 2.1752824 -0.64284073 15.846873 -1.5050238 -0.40983568 + 174 0.174 0.080821749 0.27530184 0.64387641 1.8929768 0.53148703 0.63081581 0.73067395 6.6446924 4.1449039 1.6010348 0.89875365 34.254513 33.658088 0.2869634 0.30946193 4.3765754 0.2869634 3.7806931 0.3089189 0.30946193 0.3089189 0.76139603 0.74462389 0.060001908 -0.018911529 0.12363265 0.37849333 0.10967582 -0.48816915 3.0613312 2.1749101 -0.64348884 15.842559 -1.5042609 -0.40955573 + 175 0.175 0.080852701 0.27550355 0.64364375 1.8930113 0.53153376 0.63080534 0.73067225 6.6439983 4.144795 1.6000871 0.89911621 34.250744 33.653971 0.28696198 0.30981097 4.3721665 0.28696198 3.7755031 0.30970135 0.30981097 0.30970135 0.76145899 0.7444619 0.060000113 -0.018928454 0.12348641 0.37847868 0.10927399 -0.48775267 3.0605064 2.174681 -0.64407188 15.839571 -1.5036685 -0.40927482 + 176 0.176 0.080877722 0.27571268 0.6434096 1.8930234 0.53155309 0.63079761 0.73067267 6.6431168 4.144529 1.5991015 0.89948634 34.24635 33.649331 0.28695751 0.31006194 4.367582 0.28695751 3.7701108 0.31051369 0.31006194 0.31051369 0.76153045 0.74430024 0.059997373 -0.018945596 0.12334367 0.37844967 0.10886707 -0.48731674 3.0595792 2.1744206 -0.64466586 15.836753 -1.5030411 -0.40897776 + 177 0.177 0.080903973 0.27595047 0.64314556 1.8931052 0.531598 0.63086047 0.73064673 6.6426483 4.144503 1.5983105 0.89983469 34.243852 33.646407 0.28714655 0.31029783 4.3636191 0.28714655 3.7651008 0.31137176 0.31029783 0.31137176 0.76156657 0.74411838 0.059995978 -0.01896485 0.12320668 0.37843827 0.1084572 -0.48689547 3.058801 2.1742395 -0.64537316 15.834211 -1.5024086 -0.40869438 + 178 0.178 0.080926021 0.27615476 0.64291922 1.8930819 0.53155468 0.63088322 0.73064396 6.6412133 4.1434624 1.5975805 0.9001703 34.2311 33.633243 0.28713192 0.31072476 4.3602261 0.28713192 3.7611257 0.31196842 0.31072476 0.31196842 0.76165585 0.74396259 0.059989463 -0.018980177 0.12305855 0.3783551 0.10809966 -0.48645476 3.0574543 2.1735011 -0.64570509 15.827292 -1.5015309 -0.40838208 + 179 0.179 0.080948343 0.27632689 0.64272477 1.8930409 0.53157337 0.63079679 0.73067069 6.6401905 4.1432578 1.5963807 0.90055197 34.227519 33.629447 0.28712841 0.31094314 4.3549893 0.28712841 3.755075 0.31278591 0.31094314 0.31278591 0.76174076 0.74382799 0.059985887 -0.018993378 0.12291497 0.37833485 0.1076987 -0.48603355 3.0565868 2.1733388 -0.64623855 15.825338 -1.501031 -0.40809677 + 180 0.18 0.080974299 0.27654154 0.64248416 1.8930252 0.53157011 0.63077767 0.73067743 6.6389251 4.1426395 1.5953304 0.90095512 34.219051 33.620623 0.28712 0.31130808 4.3501718 0.28712 3.7494354 0.31361643 0.31130808 0.31361643 0.76182652 0.74366182 0.059981155 -0.019010659 0.12276233 0.37828372 0.10727756 -0.48556128 3.0553806 2.172856 -0.64676637 15.820496 -1.5002499 -0.40777057 + 181 0.181 0.081001414 0.27675856 0.64224002 1.8930511 0.53160729 0.63076693 0.73067688 6.6382466 4.1426118 1.5943108 0.90132395 34.217411 33.618711 0.287251 0.31144918 4.3455076 0.287251 3.7437939 0.31446278 0.31144918 0.31446278 0.76189756 0.74349303 0.059978283 -0.019028815 0.12260925 0.37826748 0.10684883 -0.4851163 3.0546041 2.1727451 -0.64742132 15.819145 -1.4997148 -0.40747031 + 182 0.182 0.081027347 0.27697435 0.6419983 1.893092 0.53164169 0.63078248 0.73066787 6.6375135 4.1424303 1.5933919 0.90169139 34.212731 33.613529 0.287412 0.31178971 4.3411729 0.287412 3.7384556 0.31530535 0.31178971 0.31530535 0.76194631 0.74332613 0.059976702 -0.019047336 0.12247417 0.37824947 0.10644455 -0.48469401 3.053716 2.172488 -0.64804775 15.81559 -1.4990687 -0.40718478 + 183 0.183 0.081054707 0.27716639 0.6417789 1.8930551 0.53162997 0.63074275 0.73068242 6.6361144 4.141707 1.592313 0.90209449 34.20344 33.604086 0.28715222 0.31220223 4.336161 0.28715222 3.7329024 0.31610636 0.31220223 0.31610636 0.76203657 0.74317378 0.059972603 -0.019063025 0.12233095 0.37818894 0.10605148 -0.48424043 3.0524567 2.1719536 -0.64851754 15.810479 -1.4982804 -0.40686894 + 184 0.184 0.081078871 0.27737113 0.64155 1.893023 0.53161873 0.63070959 0.73069472 6.6348834 4.1411934 1.5911994 0.90249064 34.197324 33.597814 0.28711075 0.31239941 4.3310225 0.28711075 3.7269203 0.31699142 0.31239941 0.31699142 0.76211579 0.74301581 0.059966308 -0.019079086 0.12218449 0.37813455 0.10563966 -0.48377421 3.0513472 2.1716097 -0.64908232 15.807325 -1.4975982 -0.40654604 + 185 0.185 0.081099376 0.27759852 0.64130211 1.8929797 0.53157254 0.63070614 0.730701 6.6332457 4.1402003 1.590132 0.90291344 34.18525 33.585579 0.28680259 0.31286841 4.3258901 0.28680259 3.7212338 0.31785375 0.31286841 0.31785375 0.76219904 0.74284599 0.059959517 -0.019097255 0.12203196 0.37805307 0.10521779 -0.48327086 3.0498736 2.1709546 -0.64959747 15.800765 -1.4966725 -0.40619237 + 186 0.186 0.081123106 0.27780739 0.64106951 1.8929658 0.53156639 0.63069346 0.73070591 6.6319983 4.1396075 1.5890721 0.90331868 34.177335 33.577651 0.28639021 0.31329402 4.3207341 0.28639021 3.7156394 0.31870449 0.31329402 0.31870449 0.7622734 0.74268565 0.05995535 -0.01911342 0.12189133 0.37800313 0.10481359 -0.48281671 3.0486789 2.1705053 -0.65016311 15.796106 -1.495896 -0.4058785 + 187 0.187 0.081147288 0.27805116 0.64080155 1.892993 0.53154013 0.63076936 0.73068353 6.6307593 4.1387435 1.5883248 0.90369104 34.166214 33.566199 0.28627354 0.31374125 4.3167917 0.28627354 3.7110022 0.31951589 0.31374125 0.31951589 0.7623256 0.74250164 0.059950279 -0.019133906 0.12174958 0.37792888 0.10442045 -0.48234933 3.0473367 2.1698419 -0.6506999 15.789433 -1.4949484 -0.40555042 + 188 0.188 0.081172646 0.27823947 0.64058788 1.8929285 0.5315221 0.63069667 0.73070977 6.6292983 4.1381137 1.5870697 0.9041149 34.158552 33.558465 0.28603741 0.31404961 4.3110632 0.28603741 3.7046071 0.32041869 0.31404961 0.32041869 0.76241427 0.74235356 0.059944276 -0.019150963 0.12160678 0.37786809 0.10400924 -0.48187732 3.0461199 2.1694415 -0.65122688 15.785535 -1.4942412 -0.40522223 + 189 0.189 0.081199325 0.27845102 0.64034966 1.8929523 0.53153894 0.6307098 0.73070352 6.6284496 4.1378253 1.5861457 0.90447867 34.153804 33.553494 0.28597599 0.31433401 4.3065855 0.28597599 3.6993584 0.32125109 0.31433401 0.32125109 0.76246897 0.74218881 0.059939873 -0.019168147 0.12147004 0.3778325 0.10361532 -0.48144781 3.0451814 2.1691619 -0.65183057 15.782339 -1.4935902 -0.40492799 + 190 0.19 0.081222925 0.27867299 0.64010408 1.8929288 0.53149897 0.63072796 0.73070191 6.62682 4.1367473 1.5851736 0.90489903 34.14001 33.53913 0.28605522 0.31482566 4.3018779 0.28605522 3.6936495 0.32217322 0.31482566 0.32217322 0.76252733 0.74201985 0.059934156 -0.019185291 0.1213346 0.37774975 0.10321982 -0.48096957 3.0436404 2.1683908 -0.65231766 15.774526 -1.4925801 -0.40459077 + 191 0.191 0.081248055 0.27889647 0.63985547 1.8929541 0.5314981 0.63076698 0.73068899 6.6257459 4.1361571 1.5843117 0.90527717 34.131671 33.530536 0.28588991 0.31524535 4.2975197 0.28588991 3.6886254 0.32300437 0.31524535 0.32300437 0.76258179 0.74184853 0.059931001 -0.019203991 0.12119933 0.37769927 0.10282877 -0.48052804 3.0424708 2.1678933 -0.65288574 15.769274 -1.4917591 -0.40428519 + 192 0.192 0.081273953 0.27911116 0.63961489 1.8929604 0.53151279 0.6307569 0.73069072 6.6247473 4.1357869 1.5832977 0.90566263 34.12588 33.524502 0.28580437 0.31557419 4.2928195 0.28580437 3.6832102 0.32380492 0.31557419 0.32380492 0.76266386 0.74168238 0.059927037 -0.019220488 0.12104943 0.37766441 0.10241052 -0.48007493 3.0414482 2.16756 -0.65346133 15.765676 -1.4910791 -0.40397538 + 193 0.193 0.081299075 0.27930637 0.63939456 1.8929526 0.53154199 0.63070628 0.73070435 6.6239681 4.1357485 1.5821919 0.90602772 34.124551 33.522935 0.28595691 0.31565895 4.2879767 0.28595691 3.6774014 0.32461839 0.31565895 0.32461839 0.76274838 0.74152991 0.059922318 -0.019235833 0.12089756 0.37764669 0.10199256 -0.47963925 3.0406985 2.1674914 -0.65405876 15.7649 -1.4906199 -0.40368099 + 194 0.194 0.081322871 0.27949322 0.63918391 1.8929215 0.53153716 0.63066601 0.73071831 6.6228222 4.1352725 1.5811544 0.90639529 34.118293 33.516406 0.28598936 0.31589767 4.2833494 0.28598936 3.6719734 0.32538665 0.31589767 0.32538665 0.76283333 0.74138419 0.059917423 -0.019251607 0.12075858 0.37759935 0.1016073 -0.47920665 3.0396705 2.1671538 -0.65454877 15.761562 -1.4899931 -0.40338206 + 195 0.195 0.081348142 0.27971504 0.63893682 1.8930011 0.53157221 0.63073868 0.73069019 6.6224323 4.135214 1.5805282 0.90669014 34.116318 33.51408 0.28621596 0.31602207 4.2802283 0.28621596 3.6679289 0.32608344 0.31602207 0.32608344 0.7628821 0.74121385 0.059914365 -0.019267571 0.12062353 0.37758009 0.10123781 -0.4788179 3.0389792 2.1669724 -0.65515232 15.75968 -1.4894295 -0.40311862 + 196 0.196 0.081373896 0.27994493 0.63868117 1.893064 0.53163748 0.630746 0.7306805 6.6221144 4.1355718 1.5794799 0.9070627 34.118913 33.516668 0.28612055 0.31612402 4.2751532 0.28612055 3.6620158 0.32701682 0.31612402 0.32701682 0.7629322 0.74103769 0.05991282 -0.019285912 0.12047409 0.37759149 0.10079233 -0.47838382 3.0384232 2.1670948 -0.65596011 15.760194 -1.4889998 -0.40283177 + 197 0.197 0.081396849 0.28016245 0.6384407 1.8930653 0.53161995 0.63077141 0.73067398 6.6208895 4.1348154 1.5786491 0.90742505 34.108645 33.505959 0.2861323 0.31655356 4.2712301 0.2861323 3.6573617 0.32773603 0.31655356 0.32773603 0.76300709 0.74087228 0.059907791 -0.019302667 0.12032914 0.3775304 0.10040558 -0.47793598 3.0371931 2.1665164 -0.6564242 15.754185 -1.4881762 -0.40251963 + 198 0.198 0.081422703 0.28036039 0.63821691 1.893041 0.53162985 0.63072166 0.73068946 6.6197518 4.1343974 1.5775364 0.90781802 34.102623 33.499824 0.28590701 0.31689244 4.2662329 0.28590701 3.6518355 0.32849045 0.31689244 0.32849045 0.76311094 0.74071734 0.059904887 -0.019319835 0.1201751 0.37749334 0.099987961 -0.4774813 3.0361477 2.1661786 -0.65694242 15.750785 -1.4875305 -0.40220828 + 199 0.199 0.081443892 0.28053806 0.63801805 1.8930036 0.53163304 0.63066131 0.73070923 6.6187479 4.1341136 1.5764651 0.90816925 34.098926 33.495978 0.28591448 0.31703341 4.2615295 0.28591448 3.6463774 0.32923768 0.31703341 0.32923768 0.76319743 0.74058006 0.059899022 -0.019332722 0.1200287 0.37745946 0.09960176 -0.47706122 3.0352854 2.1659928 -0.65743859 15.748998 -1.4870345 -0.40192069 + 200 0.2 0.081469198 0.28073383 0.63779697 1.8930459 0.53166117 0.63068728 0.73069744 6.6180277 4.1338605 1.5756587 0.9085085 34.094148 33.49091 0.28588524 0.31735319 4.2575007 0.28588524 3.6415827 0.33003275 0.31735319 0.33003275 0.76323612 0.74042705 0.05989732 -0.01934729 0.11990704 0.37743624 0.099245244 -0.47668149 3.0344049 2.1656868 -0.65799721 15.745505 -1.4863901 -0.40166238 + 201 0.201 0.081492786 0.28093292 0.63757429 1.8930924 0.53167358 0.63074056 0.7306783 6.6172693 4.1334483 1.575001 0.90882009 34.087636 33.484002 0.28594547 0.31768846 4.2541303 0.28594547 3.6374334 0.33075147 0.31768846 0.33075147 0.76327088 0.74027336 0.059893242 -0.019361804 0.11978588 0.37740021 0.09890857 -0.47630878 3.0334703 2.1652816 -0.65849394 15.741095 -1.4856988 -0.4014059 + 202 0.202 0.081515662 0.28110959 0.63737475 1.8930627 0.53168018 0.63068719 0.73069536 6.616162 4.133023 1.5739516 0.90918743 34.081581 33.477828 0.2857326 0.31802015 4.2493838 0.2857326 3.6321715 0.33147964 0.31802015 0.33147964 0.76335865 0.74013524 0.059890045 -0.019375076 0.11964323 0.37736591 0.098529109 -0.47589502 3.0324755 2.1649475 -0.65895858 15.73768 -1.485092 -0.40112244 + 203 0.203 0.081541444 0.28130288 0.63715568 1.8930766 0.5317266 0.63064604 0.73070392 6.615578 4.133177 1.5728496 0.90955148 34.082292 33.47851 0.28565987 0.31812262 4.2443217 0.28565987 3.6263284 0.33233346 0.31812262 0.33233346 0.7634267 0.73998347 0.059887663 -0.019390461 0.11950196 0.37736241 0.098118156 -0.47548056 3.0318392 2.1649813 -0.65962192 15.737694 -1.4846799 -0.40084536 + 204 0.204 0.081566868 0.28155205 0.63688108 1.8931607 0.53173171 0.63076539 0.73066357 6.6148676 4.132721 1.5722657 0.90988088 34.075821 33.471883 0.28547252 0.31846533 4.2409513 0.28547252 3.6223983 0.33308046 0.31846533 0.33308046 0.76346902 0.73979475 0.059883679 -0.019411838 0.11937704 0.37731253 0.097742124 -0.47505465 3.0308103 2.1645405 -0.6602469 15.733159 -1.4838714 -0.40055033 + 205 0.205 0.081589996 0.28175031 0.63665969 1.89317 0.53174803 0.63075758 0.73066436 6.614055 4.1324857 1.5713466 0.9102227 34.071878 33.467555 0.2856809 0.31864147 4.236809 0.2856809 3.6172858 0.33384234 0.31864147 0.33384234 0.76353731 0.73964202 0.059878915 -0.019427668 0.11923925 0.3772843 0.097356345 -0.47464065 3.0299624 2.1643183 -0.66078969 15.73071 -1.4833121 -0.40026806 + 206 0.206 0.0816161 0.28191485 0.63646905 1.8931095 0.53176803 0.63064021 0.73070126 6.6129 4.1322699 1.5699925 0.91063755 34.068487 33.464196 0.28539766 0.31889337 4.2307916 0.28539766 3.6106684 0.33472557 0.31889337 0.33472557 0.76362976 0.73950912 0.0598761 -0.019442657 0.11909398 0.37725982 0.09694453 -0.47420435 3.0290364 2.1641625 -0.6613354 15.728988 -1.4828098 -0.39997175 + 207 0.207 0.081643461 0.28212792 0.63622862 1.8931783 0.53180698 0.63069147 0.73067984 6.6124045 4.1321727 1.5692757 0.9109561 34.065371 33.460697 0.28553393 0.31913944 4.2272401 0.28553393 3.6062347 0.3354715 0.31913944 0.3354715 0.76367233 0.73934275 0.059872878 -0.019459629 0.11896411 0.37724135 0.096573015 -0.47381437 3.0282804 2.1639428 -0.6619281 15.726284 -1.4822193 -0.39970766 + 208 0.208 0.081668596 0.28230036 0.63603104 1.8931809 0.53181448 0.6306854 0.73068104 6.6115243 4.1318085 1.568437 0.91127874 34.060235 33.455513 0.28528843 0.31943316 4.2232209 0.28528843 3.6017912 0.33614123 0.31943316 0.33614123 0.76373909 0.73920545 0.059868812 -0.019474477 0.11884784 0.37720105 0.096239739 -0.47344079 3.0273903 2.163635 -0.66239716 15.723162 -1.481633 -0.39944965 + 209 0.209 0.081693264 0.28248695 0.63581979 1.8932551 0.53183998 0.63076275 0.73065242 6.6111233 4.1315705 1.5680415 0.91151125 34.055395 33.450182 0.28549281 0.31971932 4.221276 0.28549281 3.5991946 0.33658857 0.31971932 0.33658857 0.76379069 0.73905914 0.059864274 -0.019488209 0.11873122 0.37717379 0.095942883 -0.47311667 3.0267082 2.1633138 -0.66280322 15.719564 -1.4810768 -0.39922751 + 210 0.21 0.08171973 0.28269591 0.63558436 1.8932509 0.53183144 0.63076779 0.73065169 6.6098901 4.1309149 1.5670722 0.91190298 34.046714 33.441266 0.28534403 0.32010406 4.216593 0.28534403 3.5938225 0.33742645 0.32010406 0.33742645 0.76386037 0.7388963 0.059859657 -0.019506085 0.11859815 0.37711549 0.095553495 -0.47266899 3.0254911 2.162808 -0.66333021 15.71449 -1.4802759 -0.3989161 + 211 0.211 0.081745133 0.28290513 0.63534974 1.8932852 0.53182659 0.63082569 0.73063293 6.6089344 4.1302905 1.5664197 0.91222413 34.038178 33.432342 0.28537432 0.32046107 4.2133611 0.28537432 3.589913 0.33807382 0.32046107 0.33807382 0.76392607 0.73873424 0.059855517 -0.019523496 0.11847425 0.37705974 0.095205594 -0.47226533 3.0244055 2.1622791 -0.66378439 15.709278 -1.4795029 -0.39863461 + 212 0.212 0.081770031 0.28314033 0.63508964 1.8933316 0.53183165 0.6308885 0.73061143 6.608051 4.1298587 1.5656007 0.91259147 34.032287 33.426196 0.28538135 0.32070983 4.2091296 0.28538135 3.5847849 0.33896339 0.32070983 0.33896339 0.76396925 0.73855531 0.059851183 -0.019540857 0.11834042 0.37701387 0.094809977 -0.47182385 3.0233465 2.1618937 -0.66441842 15.705433 -1.4787377 -0.39833009 + 213 0.213 0.081797368 0.28335203 0.6348506 1.8933421 0.53183575 0.63089875 0.73060756 6.6069386 4.1293215 1.5646328 0.91298428 34.02497 33.41884 0.28501942 0.32111059 4.204295 0.28501942 3.5794673 0.33980824 0.32111059 0.33980824 0.76403592 0.73838987 0.059848386 -0.01955846 0.11820503 0.37696535 0.094416431 -0.47138178 3.0221944 2.1614426 -0.66498184 15.700929 -1.4779611 -0.3980246 + 214 0.214 0.081822111 0.28353461 0.63464328 1.8933892 0.53186884 0.63092534 0.73059501 6.6065254 4.1293062 1.5639627 0.9132565 34.023767 33.417592 0.28490102 0.32127337 4.2010337 0.28490102 3.5757385 0.3403942 0.32127337 0.3403942 0.76409473 0.73824616 0.05984511 -0.01957279 0.1180803 0.37694774 0.094083981 -0.47103172 3.0216027 2.1613288 -0.66549106 15.699699 -1.4775204 -0.39778731 + 215 0.215 0.081846283 0.28369578 0.63445793 1.8932727 0.53184753 0.63077895 0.73064618 6.6048331 4.1285897 1.5625543 0.91368904 34.014973 33.408692 0.28465162 0.32162893 4.1951124 0.28465162 3.5693017 0.34115908 0.32162893 0.34115908 0.7642328 0.73811723 0.059840281 -0.019587159 0.11792111 0.3768902 0.093665479 -0.47055568 3.0203517 2.1608969 -0.66587759 15.695658 -1.4768788 -0.39745716 + 216 0.216 0.081870912 0.28386655 0.63426254 1.8931925 0.53182035 0.63069493 0.73067721 6.6031025 4.1276213 1.5613699 0.91411126 34.002014 33.395253 0.28458473 0.32217606 4.1899401 0.28458473 3.5634089 0.34194642 0.32217606 0.34194642 0.76433178 0.73798149 0.059835576 -0.019600384 0.11777776 0.37682296 0.09328091 -0.47010387 3.0189247 2.1602225 -0.66622741 15.688653 -1.4760461 -0.39714102 + 217 0.217 0.081893811 0.28402692 0.63407926 1.8930444 0.53176222 0.63055038 0.73073185 6.6008843 4.1263784 1.5599219 0.914584 33.987115 33.380127 0.28426866 0.32271927 4.1836861 0.28426866 3.5566214 0.34279597 0.32271927 0.34279597 0.76446099 0.73785422 0.059829185 -0.019613064 0.11762547 0.3767336 0.092874781 -0.46960838 3.017267 2.15946 -0.66653919 15.681368 -1.4751605 -0.39679083 + 218 0.218 0.081919967 0.28419251 0.63388752 1.893024 0.53176783 0.63051219 0.73074395 6.5998805 4.1260087 1.5589398 0.91493196 33.982413 33.37527 0.28424538 0.32289686 4.1791782 0.28424538 3.5513638 0.34356907 0.32289686 0.34356907 0.76453151 0.73772058 0.059825062 -0.019627335 0.11750645 0.37669137 0.092528953 -0.46922032 3.0163407 2.1591751 -0.66701585 15.678846 -1.4745895 -0.39652274 + 219 0.219 0.081945603 0.28441946 0.63363494 1.8930854 0.53175229 0.63062507 0.73070806 6.5989853 4.1252863 1.5584681 0.91523088 33.973276 33.365849 0.28418519 0.32324135 4.1764823 0.28418519 3.5481076 0.34418948 0.32324135 0.34418948 0.76458535 0.73754649 0.059820232 -0.019645219 0.11738366 0.37662226 0.09219474 -0.468817 3.015213 2.1585723 -0.66747673 15.67322 -1.4737464 -0.3962385 + 220 0.22 0.081971947 0.28463408 0.63339397 1.8931505 0.53175794 0.63071509 0.73067742 6.5983086 4.1248552 1.5579303 0.91552311 33.967113 33.359365 0.28423285 0.3235148 4.1735835 0.28423285 3.5445028 0.34484792 0.3235148 0.34484792 0.76462772 0.73737999 0.059815535 -0.019663501 0.11726619 0.37657271 0.091859948 -0.46843266 3.01429 2.1581614 -0.66798266 15.669087 -1.4730439 -0.39597127 + 221 0.221 0.081998622 0.28481274 0.63318864 1.8931571 0.53176627 0.63071392 0.73067688 6.5974616 4.124503 1.5571195 0.91583913 33.962286 33.35421 0.28439373 0.3236817 4.1699028 0.28439373 3.5399832 0.3455258 0.3236817 0.3455258 0.76469923 0.73723718 0.05981003 -0.019677355 0.11714412 0.37653 0.091518669 -0.46804867 3.0134179 2.1578593 -0.66844004 15.666317 -1.4724705 -0.39570578 + 222 0.222 0.082023869 0.28497438 0.63300175 1.8931141 0.53176795 0.63064723 0.73069893 6.5963148 4.1240562 1.5560595 0.91619916 33.956299 33.348266 0.2840102 0.3240233 4.1651467 0.2840102 3.5349507 0.34618589 0.3240233 0.34618589 0.76480127 0.73710697 0.059805826 -0.019690857 0.11701278 0.37648741 0.091158207 -0.46764562 3.0124338 2.1575337 -0.66886706 15.663118 -1.4718963 -0.39542761 + 223 0.223 0.082050735 0.28514551 0.63280375 1.893085 0.53178096 0.63058628 0.7307178 6.5952374 4.1236723 1.5549988 0.91656628 33.950764 33.342473 0.284008 0.32428377 4.1604457 0.284008 3.5294929 0.34694475 0.32428377 0.34694475 0.7648865 0.736969 0.059801564 -0.019703338 0.11687239 0.37645194 0.090781568 -0.46723351 3.0114664 2.1572171 -0.66931799 15.660056 -1.4713144 -0.39514499 + 224 0.224 0.082074451 0.28533584 0.63258971 1.8930716 0.53175937 0.63059486 0.73071734 6.5939817 4.1228831 1.5541877 0.91691087 33.940339 33.331596 0.28405656 0.32468698 4.1566816 0.28405656 3.5249988 0.34762627 0.32468698 0.34762627 0.76495912 0.73682104 0.059796879 -0.019719323 0.1167446 0.37638656 0.090433701 -0.46682026 3.0102617 2.1566323 -0.66970651 15.654132 -1.4705355 -0.39485497 + 225 0.225 0.082097011 0.285494 0.63240899 1.8929582 0.53173232 0.63046092 0.73076499 6.5922777 4.1221051 1.5528391 0.91733353 33.9311 33.322124 0.2839939 0.32498215 4.1510462 0.2839939 3.5186521 0.34840017 0.32498215 0.34840017 0.76509101 0.73669555 0.059791563 -0.019731574 0.11659486 0.37632611 0.09003271 -0.46635882 3.0089868 2.1561596 -0.67007292 15.649941 -1.469871 -0.3945339 + 226 0.226 0.082122701 0.28566173 0.63221557 1.8929535 0.53176971 0.63040399 0.73077981 6.5914787 4.1220044 1.5517818 0.91769241 33.92787 33.31854 0.28407775 0.32525185 4.1463793 0.28407775 3.5131259 0.34917565 0.32525185 0.34917565 0.76516144 0.73656089 0.059788932 -0.019744868 0.11646746 0.37631525 0.089659615 -0.46597486 3.0082057 2.1559999 -0.67059436 15.647688 -1.4693814 -0.39427552 + 227 0.227 0.08214687 0.28583595 0.63201718 1.8929448 0.531779 0.63037857 0.73078726 6.590515 4.1216475 1.5508253 0.91804223 33.922811 33.313429 0.28383912 0.32554238 4.141854 0.28383912 3.5080909 0.34992394 0.32554238 0.34992394 0.76522954 0.73642326 0.059785993 -0.01975887 0.11634414 0.37627951 0.089306881 -0.46558639 3.0072749 2.1557047 -0.67108687 15.644668 -1.4687907 -0.39400859 + 228 0.228 0.082169599 0.285978 0.6318524 1.892921 0.53177616 0.63034661 0.73079822 6.5894746 4.1210912 1.5500421 0.91834126 33.914773 33.305088 0.28373948 0.32594607 4.1383157 0.28373948 3.504091 0.3504852 0.32594607 0.3504852 0.76529663 0.73630836 0.059781857 -0.019771258 0.11623355 0.37623561 0.08901285 -0.46524846 3.0063247 2.1552681 -0.67139118 15.639992 -1.4681998 -0.39377355 + 229 0.229 0.08219311 0.28616551 0.63164138 1.8928561 0.53177888 0.63024563 0.73083158 6.5880741 4.1206246 1.5486609 0.91878863 33.908098 33.298213 0.28359303 0.32629213 4.1321603 0.28359303 3.4971252 0.35144213 0.32629213 0.35144213 0.76538657 0.73616245 0.059777371 -0.019785426 0.11607918 0.37619915 0.088575495 -0.46477464 3.0051699 2.1549486 -0.67194007 15.636395 -1.4675498 -0.39344957 + 230 0.23 0.082215536 0.28633423 0.63145023 1.8928113 0.53176208 0.63020083 0.73084838 6.5868155 4.120009 1.547661 0.91914552 33.900703 33.29081 0.28329419 0.32659876 4.1275661 0.28329419 3.4921321 0.35213981 0.32659876 0.35213981 0.76547683 0.73603004 0.059772847 -0.01979921 0.11595047 0.37614359 0.088224168 -0.46436776 3.0040809 2.1545328 -0.67235317 15.632569 -1.4669048 -0.39316597 + 231 0.231 0.082242882 0.28652384 0.63123328 1.8927516 0.53173626 0.63014567 0.73086964 6.5851838 4.1191089 1.5465031 0.91957178 33.889597 33.279477 0.28309494 0.32702424 4.1222746 0.28309494 3.4861974 0.35298227 0.32702424 0.35298227 0.765575 0.73587932 0.059767667 -0.019814071 0.11580587 0.37607092 0.087827221 -0.46389814 3.0026753 2.1539068 -0.67277931 15.626699 -1.4660643 -0.39283674 + 232 0.232 0.082265506 0.2867117 0.6310228 1.8927155 0.53172827 0.63010218 0.73088502 6.5838656 4.1184844 1.5454128 0.91996851 33.880506 33.269766 0.28334541 0.32739527 4.1174715 0.28334541 3.4802942 0.35383187 0.32739527 0.35383187 0.7656473 0.73573398 0.059762311 -0.019828556 0.11567371 0.37602307 0.087438516 -0.46346159 3.0014938 2.15345 -0.67325098 15.62152 -1.4653438 -0.39253507 + 233 0.233 0.082288043 0.28689813 0.63081383 1.892672 0.53172258 0.63004463 0.73090484 6.5826605 4.1180079 1.5443055 0.9203471 33.874327 33.263431 0.28323679 0.32765885 4.1126139 0.28323679 3.4748134 0.35456364 0.32765885 0.35456364 0.76575268 0.73558966 0.059757456 -0.019843807 0.11552869 0.3759783 0.087040566 -0.46301887 3.0004531 2.1531264 -0.67372593 15.618351 -1.4647395 -0.39222998 + 234 0.234 0.082314515 0.28712041 0.63056507 1.8927065 0.53173464 0.63008016 0.73089165 6.5818375 4.1176631 1.5434791 0.9206953 33.869329 33.258142 0.28330985 0.32787737 4.1086973 0.28330985 3.4700809 0.35530663 0.32787737 0.35530663 0.76582894 0.73541794 0.059753737 -0.019861524 0.11538791 0.37593743 0.086645508 -0.46258294 2.9994998 2.1528039 -0.67428979 15.615208 -1.464077 -0.39193028 + 235 0.235 0.082337694 0.2873269 0.6303354 1.8927571 0.53173217 0.63015941 0.73086551 6.5809324 4.1170203 1.5429026 0.92100952 33.860103 33.248536 0.2832428 0.3283243 4.1055916 0.2832428 3.4663764 0.35597238 0.3283243 0.35597238 0.76587158 0.73525967 0.059750932 -0.019877207 0.11527334 0.37588691 0.086319374 -0.46220629 2.998403 2.1522363 -0.67473955 15.609259 -1.4632725 -0.39166795 + 236 0.236 0.082361687 0.28749497 0.63014334 1.8926665 0.53169789 0.63006917 0.7308994 6.5792783 4.1161644 1.5416986 0.92141533 33.850241 33.238529 0.28307596 0.32863591 4.1003317 0.28307596 3.460515 0.3567407 0.32863591 0.3567407 0.76598666 0.7351263 0.059744814 -0.019890991 0.11513157 0.37581468 0.085937084 -0.46175177 2.997092 2.1517003 -0.67511133 15.604565 -1.4625483 -0.39134889 + 237 0.237 0.082386811 0.28769014 0.62992305 1.892732 0.53173092 0.63012351 0.73087762 6.5790173 4.1162906 1.5410405 0.92168628 33.851613 33.240106 0.28284158 0.32866492 4.0968822 0.28284158 3.4566405 0.35740012 0.32866492 0.35740012 0.76603458 0.73497385 0.059740558 -0.019907136 0.11501866 0.37579476 0.08560317 -0.46139793 2.9965827 2.1517088 -0.67572567 15.604821 -1.4621462 -0.39110857 + 238 0.238 0.082411242 0.28784046 0.6297483 1.8926496 0.53172826 0.63000341 0.73091795 6.5776213 4.1157859 1.539743 0.92209241 33.844532 33.232839 0.28266751 0.32902571 4.0912775 0.28266751 3.4504118 0.35819823 0.32902571 0.35819823 0.76613458 0.73485192 0.059736333 -0.019920774 0.11488686 0.37575266 0.08522227 -0.46097493 2.9954987 2.1513797 -0.67615434 15.601177 -1.461568 -0.39081721 + 239 0.239 0.082440589 0.28803154 0.62952787 1.892677 0.53178307 0.62997136 0.73092254 6.5770167 4.1158269 1.5387404 0.9224494 33.842701 33.230779 0.28260553 0.32931623 4.0867955 0.28260553 3.4452752 0.35891476 0.32931623 0.35891476 0.76622045 0.73469845 0.059735626 -0.019936911 0.11474413 0.37574967 0.0848207 -0.46057037 2.9947906 2.1512682 -0.67672417 15.599437 -1.461089 -0.39054684 + 240 0.24 0.082465415 0.28820214 0.62933244 1.8926536 0.53177806 0.62994303 0.73093254 6.5758738 4.1152403 1.5378432 0.92279031 33.835089 33.222875 0.28260644 0.32960754 4.082778 0.28260644 3.4405936 0.35957793 0.32960754 0.35957793 0.76630794 0.73456265 0.059731448 -0.019950512 0.11461668 0.37569959 0.084476206 -0.4601758 2.993736 2.1508197 -0.67710611 15.595299 -1.4604357 -0.39027266 + 241 0.241 0.082488976 0.28839628 0.62911475 1.8926629 0.53178807 0.62994358 0.73093124 6.574942 4.1148623 1.5369355 0.92314414 33.829263 33.216776 0.28256526 0.32992098 4.0784755 0.28256526 3.4355563 0.36035391 0.32992098 0.36035391 0.76636828 0.73441228 0.059726884 -0.019965113 0.11448819 0.37566425 0.084106651 -0.4597709 2.9927691 2.1504906 -0.67762438 15.591626 -1.4597976 -0.38999487 + 242 0.242 0.082511251 0.28857568 0.62891307 1.8926167 0.53177764 0.62988825 0.73095085 6.5737363 4.1143436 1.5358878 0.92350484 33.822978 33.210458 0.28234092 0.33017911 4.0738232 0.28234092 3.4304486 0.36103373 0.33017911 0.36103373 0.7664737 0.73427288 0.059720931 -0.019978465 0.11433992 0.37561546 0.083725091 -0.45934055 2.9917382 2.1501442 -0.67805164 15.588497 -1.4592049 -0.38969714 + 243 0.243 0.082535982 0.28873512 0.6287289 1.892592 0.53177777 0.62985091 0.73096328 6.5726571 4.1138425 1.5349745 0.9238402 33.816254 33.203484 0.2823051 0.33046471 4.0697324 0.2823051 3.4257301 0.3616972 0.33046471 0.3616972 0.76655617 0.7341446 0.059715507 -0.019990545 0.11422279 0.37557083 0.083393153 -0.45896398 2.9907528 2.1497571 -0.67844088 15.584797 -1.4586013 -0.38943617 + 244 0.244 0.08255941 0.28887744 0.62856315 1.8925375 0.53176864 0.6297814 0.73098746 6.5713706 4.1132147 1.5339634 0.92419251 33.807701 33.194593 0.28227211 0.33083585 4.0652864 0.28227211 3.4206217 0.36239261 0.33083585 0.36239261 0.76663544 0.7340289 0.059710294 -0.020001674 0.11411004 0.37552186 0.083070007 -0.45859187 2.9896724 2.1493078 -0.67878353 15.580152 -1.4579735 -0.38917721 + 245 0.245 0.082586319 0.28903913 0.62837455 1.8925286 0.53178089 0.62975177 0.73099598 6.5703971 4.1127674 1.5331128 0.92451688 33.800773 33.187432 0.28209822 0.33124219 4.0615032 0.28209822 3.4164547 0.36295034 0.33124219 0.36295034 0.76672874 0.73389718 0.059707929 -0.020016274 0.1139886 0.37548391 0.082736932 -0.45822085 2.9887324 2.1489144 -0.6791531 15.576009 -1.4573774 -0.38892143 + 246 0.246 0.082610294 0.28921927 0.62817044 1.8925468 0.53184964 0.62968727 0.73100984 6.5701888 4.1133481 1.5319989 0.92484177 33.80652 33.193309 0.28201235 0.33119846 4.0566105 0.28201235 3.4109009 0.36369726 0.33119846 0.36369726 0.76680952 0.73375578 0.059704866 -0.02003117 0.11384269 0.3755058 0.082326288 -0.45783209 2.9884556 2.1492583 -0.67983894 15.578863 -1.4572258 -0.38866713 + 247 0.247 0.082634937 0.28939795 0.62796712 1.8924974 0.53184978 0.62961302 0.73103457 6.5690066 4.1129352 1.5308503 0.92522114 33.801091 33.187682 0.28199102 0.331418 4.0516714 0.28199102 3.4052436 0.36443675 0.331418 0.36443675 0.76691801 0.73361476 0.059699921 -0.020046921 0.1136991 0.37546338 0.081928166 -0.45739154 2.9874603 2.1489788 -0.68030443 15.576185 -1.4566671 -0.388364 + 248 0.248 0.082660799 0.28955982 0.62777938 1.8924397 0.5318735 0.62949495 0.73107129 6.5679327 4.1127528 1.529569 0.92561088 33.797911 33.184317 0.28198126 0.33161267 4.0463292 0.28198126 3.3991653 0.36518263 0.33161267 0.36518263 0.76703749 0.73348386 0.059697463 -0.020061443 0.11355241 0.37544292 0.081520447 -0.45696337 2.9866045 2.148836 -0.68078546 15.574718 -1.4562195 -0.38807401 + 249 0.249 0.08268573 0.28968905 0.62762522 1.8923877 0.53190336 0.62937701 0.73110729 6.5670305 4.1126362 1.5284494 0.92594493 33.794963 33.181146 0.28196171 0.33185493 4.0417443 0.28196171 3.3939933 0.36578927 0.33185493 0.36578927 0.76714241 0.73337554 0.059694323 -0.020072531 0.11342182 0.3754299 0.081173021 -0.45660292 2.9858995 2.1487186 -0.68116906 15.573167 -1.4558594 -0.38783082 + 250 0.25 0.082712098 0.28989942 0.62738848 1.8924462 0.53194935 0.6294035 0.73109335 6.5664796 4.1125948 1.5275904 0.92629443 33.792171 33.178116 0.28187702 0.33217856 4.0375617 0.28187702 3.389121 0.36656368 0.33217856 0.36656368 0.76719781 0.73321185 0.059692036 -0.02008822 0.11329002 0.37542115 0.080784443 -0.4562056 2.985127 2.1485389 -0.68178871 15.570579 -1.4552865 -0.38756399 + 251 0.251 0.082737669 0.29007054 0.62719179 1.8924358 0.53195605 0.62937891 0.7311008 6.5656303 4.1123369 1.5266759 0.92661747 33.789095 33.175168 0.28157943 0.33234725 4.0333217 0.28157943 3.3845294 0.36721288 0.33234725 0.36721288 0.7672857 0.73307504 0.059687979 -0.020104282 0.11316979 0.37538033 0.080439044 -0.45581937 2.9843171 2.1483456 -0.68227145 15.568972 -1.4547929 -0.38729743 + 252 0.252 0.082758978 0.29025873 0.6269823 1.8924878 0.53194334 0.62947398 0.73107053 6.564826 4.1116871 1.5262578 0.92688113 33.780785 33.166415 0.28175987 0.33260992 4.0309753 0.28175987 3.3813964 0.36781901 0.33260992 0.36781901 0.76731813 0.73293065 0.059683054 -0.020116591 0.11307304 0.37532298 0.080162864 -0.45548585 2.9833158 2.1478004 -0.68265473 15.563876 -1.4540528 -0.38706234 + 253 0.253 0.082783047 0.29042975 0.6267872 1.8925134 0.53192008 0.62954329 0.73105001 6.5638917 4.1109245 1.5258347 0.92713242 33.77155 33.156875 0.28177067 0.33290372 4.0287323 0.28177067 3.3786522 0.36830945 0.33290372 0.36830945 0.7673733 0.73279523 0.059675714 -0.020128233 0.11296937 0.37525206 0.079901092 -0.45515315 2.9822848 2.1472065 -0.68294252 15.558588 -1.453333 -0.38682478 + 254 0.254 0.082803991 0.29060393 0.62659208 1.8924627 0.53187897 0.62952215 0.73106162 6.5623934 4.1099696 1.5249365 0.92748728 33.760209 33.145314 0.28160617 0.33328816 4.024614 0.28160617 3.3740414 0.3689665 0.33328816 0.3689665 0.76746643 0.7326605 0.05967009 -0.020141996 0.11284655 0.37517551 0.079565043 -0.45474055 2.9809782 2.1465659 -0.68326853 15.552679 -1.4525462 -0.3865327 + 255 0.255 0.082827606 0.29077551 0.62639688 1.8924409 0.5319045 0.6294553 0.73108107 6.5616079 4.1099601 1.5238036 0.92784409 33.759646 33.144879 0.28135704 0.33341015 4.0195066 0.28135704 3.3684118 0.36973781 0.33341015 0.36973781 0.76755258 0.73252512 0.059666004 -0.020155874 0.11271184 0.37515816 0.079179833 -0.45433799 2.9802754 2.1465486 -0.68383757 15.552408 -1.4521515 -0.38626047 + 256 0.256 0.082849737 0.29095608 0.62619419 1.8923509 0.53186511 0.62937289 0.73111291 6.5598583 4.1090256 1.5225603 0.92827241 33.748475 33.13339 0.28132082 0.33376426 4.0140666 0.28132082 3.362165 0.37058077 0.33376426 0.37058077 0.76766057 0.73238507 0.05966057 -0.02017198 0.11257156 0.37508434 0.078781888 -0.45386623 2.9788663 2.1459607 -0.6842363 15.546872 -1.4513631 -0.38592956 + 257 0.257 0.082876637 0.29111187 0.62601149 1.892367 0.53190603 0.62934248 0.7311185 6.5593322 4.1090499 1.5217146 0.92856771 33.747195 33.131835 0.28143719 0.33392243 4.0103743 0.28143719 3.35774 0.37119714 0.33392243 0.37119714 0.76773284 0.7322573 0.059657649 -0.0201857 0.11245771 0.37507301 0.078451975 -0.45352499 2.9782793 2.1458829 -0.68470474 15.545763 -1.4509816 -0.38569955 + 258 0.258 0.082898414 0.29127879 0.6258228 1.8922747 0.53191599 0.62919075 0.73116797 6.5581146 4.1089128 1.5202094 0.92899236 33.746196 33.130981 0.28128384 0.33393143 4.0040288 0.28128384 3.3506839 0.37206103 0.33393143 0.37206103 0.76786852 0.73212666 0.05965335 -0.020199075 0.11230472 0.37504941 0.078011267 -0.45306068 2.9774111 2.1458625 -0.68526774 15.546172 -1.4505882 -0.38538477 + 259 0.259 0.082922362 0.29147738 0.62560026 1.892317 0.53192774 0.62923857 0.73115073 6.5574492 4.1086293 1.5195257 0.92929408 33.74238 33.126999 0.28129355 0.33408716 4.0006246 0.28129355 3.3465902 0.37274083 0.33408716 0.37274083 0.76792634 0.73197298 0.059649925 -0.020214694 0.11218496 0.37501234 0.077670963 -0.4526833 2.9765854 2.1455857 -0.68577852 15.543699 -1.4500016 -0.38512494 + 260 0.26 0.082947967 0.29167468 0.62537735 1.8923202 0.53192403 0.62924829 0.7311479 6.5563537 4.1080727 1.5186199 0.92966106 33.735007 33.119368 0.28124322 0.33439515 3.9962454 0.28124322 3.3414473 0.37355492 0.33439515 0.37355492 0.76798774 0.73181868 0.059644337 -0.020229574 0.11206217 0.37495991 0.077306393 -0.45226631 2.9754779 2.145148 -0.68627936 15.539355 -1.4492787 -0.3848353 + 261 0.261 0.082969011 0.29184221 0.62518878 1.8922719 0.53191143 0.62919253 0.73116789 6.5552877 4.1076758 1.5176227 0.9299892 33.731037 33.115352 0.28123853 0.33444608 3.9919608 0.28123853 3.3365224 0.37419982 0.33444608 0.37419982 0.76809525 0.73168829 0.059637499 -0.020242184 0.11192741 0.37491151 0.076947727 -0.45185924 2.9745949 2.1449211 -0.68669902 15.537868 -1.4487972 -0.38455316 + 262 0.262 0.082993179 0.29200822 0.6249986 1.892241 0.53190192 0.62915887 0.73118016 6.5540988 4.1070418 1.5167311 0.93032596 33.722372 33.106255 0.2813226 0.33479476 3.988111 0.2813226 3.3319731 0.37481533 0.33479476 0.37481533 0.76818809 0.73155614 0.059633737 -0.020256537 0.1118029 0.37485883 0.076608951 -0.45146778 2.973523 2.1444498 -0.68704485 15.533104 -1.4481477 -0.38428048 + 263 0.263 0.083014775 0.29217904 0.62480619 1.8922146 0.53190458 0.62911583 0.73119422 6.5530595 4.1066371 1.5157511 0.93067124 33.716834 33.10043 0.28138789 0.33501557 3.9838228 0.28138789 3.3269237 0.37551122 0.33501557 0.37551122 0.76827688 0.73142306 0.059629525 -0.020268462 0.11167354 0.37482281 0.076250377 -0.45107319 2.9725833 2.1441459 -0.68747965 15.530134 -1.4475877 -0.38400942 + 264 0.264 0.083036212 0.29237303 0.62459076 1.8921779 0.53183519 0.62915318 0.73118947 6.5512689 4.1052358 1.5149888 0.93104426 33.700269 33.083628 0.28104543 0.33559535 3.9799045 0.28104543 3.3226462 0.37621283 0.33559535 0.37621283 0.76835161 0.73127468 0.059624067 -0.020284545 0.11156239 0.37471591 0.07593142 -0.45064733 2.9709319 2.143185 -0.68777698 15.521104 -1.4465353 -0.38370176 + 265 0.265 0.08305844 0.2925615 0.62438006 1.8922212 0.53184351 0.62920716 0.73117056 6.5505947 4.1048771 1.5143907 0.93132688 33.695183 33.078322 0.28102977 0.3358314 3.9768836 0.28102977 3.319033 0.3768208 0.3358314 0.3768208 0.76840534 0.73112927 0.059620121 -0.020297993 0.11145036 0.37467857 0.075616071 -0.45029464 2.9700935 2.1428455 -0.68822582 15.517802 -1.4459343 -0.38345833 + 266 0.266 0.08308375 0.29274798 0.62416827 1.8922218 0.53184551 0.6292053 0.73117096 6.5496021 4.1044375 1.5134871 0.93167745 33.689317 33.072525 0.28061977 0.33617267 3.9724605 0.28061977 3.3143004 0.37754032 0.33617267 0.37754032 0.76847816 0.73098246 0.05961579 -0.02031414 0.11132833 0.37463263 0.075261193 -0.44989382 2.9690989 2.142496 -0.68871743 15.514282 -1.4452959 -0.38318091 + 267 0.267 0.083110623 0.29291982 0.62396956 1.8922075 0.53188216 0.629135 0.73119031 6.5486856 4.1042891 1.5123318 0.93206476 33.685897 33.068847 0.28061568 0.33643417 3.9673637 0.28061568 3.3083936 0.3783544 0.33643417 0.3783544 0.76856505 0.73084401 0.059615154 -0.020327587 0.11119448 0.37461962 0.074869937 -0.44948955 2.9682365 2.1423076 -0.6892469 15.512104 -1.4447755 -0.38290851 + 268 0.268 0.083137329 0.29306967 0.623793 1.8921139 0.53189998 0.62897092 0.73124303 6.5472671 4.1039135 1.5108451 0.9325085 33.679887 33.062601 0.28049265 0.33679366 3.9611262 0.28049265 3.3014314 0.37920214 0.33679366 0.37920214 0.76868627 0.73072037 0.05961229 -0.020339589 0.11104444 0.37459468 0.074449714 -0.44904439 2.967172 2.1420396 -0.689695 15.509065 -1.4442385 -0.38260619 + 269 0.269 0.083158888 0.29325106 0.62359005 1.8920787 0.53188711 0.62893525 0.73125635 6.545948 4.1032084 1.5098595 0.93288018 33.670186 33.052501 0.28046544 0.33721976 3.9567139 0.28046544 3.2963276 0.37992077 0.33721976 0.37992077 0.76877106 0.73058028 0.059608102 -0.020353935 0.11090669 0.37454395 0.074081163 -0.44862511 2.9659862 2.1415213 -0.6900815 15.503604 -1.4435202 -0.38231539 + 270 0.27 0.083181497 0.29345089 0.62336761 1.8921436 0.53190106 0.62901392 0.73122858 6.5454317 4.1029887 1.5092805 0.93316242 33.667108 33.049348 0.280381 0.33737862 3.9535352 0.280381 3.2925407 0.38061349 0.33737862 0.38061349 0.76880474 0.73042696 0.059603599 -0.020368782 0.11080187 0.37450973 0.073762707 -0.44827243 2.9652244 2.1412776 -0.69062152 15.501283 -1.4429435 -0.38207267 + 271 0.271 0.083203496 0.29368399 0.62311251 1.8923045 0.53191866 0.62923187 0.73115397 6.5454218 4.1028028 1.5092723 0.93334678 33.664214 33.046381 0.28027415 0.33755788 3.9524974 0.28027415 3.2911389 0.38108439 0.33755788 0.38108439 0.76881221 0.73025201 0.059599363 -0.020385901 0.11070612 0.37447231 0.073492332 -0.44796464 2.9646055 2.1409695 -0.69115309 15.498362 -1.4423153 -0.38185916 + 272 0.272 0.083229205 0.29386015 0.62291065 1.8923236 0.53197247 0.62918875 0.73116237 6.5449076 4.1029335 1.508298 0.93367607 33.663983 33.045676 0.28067222 0.3376343 3.948437 0.28067222 3.2859788 0.38178596 0.3376343 0.38178596 0.76889916 0.73011172 0.059598005 -0.020397681 0.11056856 0.37447588 0.07311026 -0.44758615 2.9640191 2.1409469 -0.69168601 15.49789 -1.4419399 -0.38160763 + 273 0.273 0.083255708 0.29403128 0.62271301 1.8923421 0.53198784 0.62919602 0.73115823 6.5441315 4.1025802 1.5075772 0.93397412 33.658534 33.039557 0.28118739 0.33778918 3.9453539 0.28118739 3.2817486 0.38241795 0.33778918 0.38241795 0.76896934 0.72997407 0.059594065 -0.02041088 0.11045605 0.37443956 0.072788253 -0.44722781 2.9631729 2.1406084 -0.69208274 15.494655 -1.4413746 -0.38136066 + 274 0.274 0.083278974 0.29418753 0.62253349 1.8922995 0.53200388 0.62911069 0.7311849 6.5430885 4.1023347 1.506404 0.93434983 33.654868 33.035701 0.2811988 0.33796826 3.9401971 0.2811988 3.275758 0.38324037 0.33796826 0.38324037 0.76905101 0.72984922 0.059590195 -0.020421935 0.11033099 0.37441512 0.072419776 -0.44683489 2.9622913 2.1404219 -0.69257087 15.492758 -1.4408833 -0.38109329 + 275 0.275 0.083299593 0.29434609 0.62235432 1.8922416 0.53197925 0.62905676 0.73120561 6.5416753 4.1015861 1.5053691 0.93472014 33.645465 33.026209 0.28087288 0.33838308 3.9354075 0.28087288 3.2705605 0.38397412 0.33838308 0.38397412 0.76913064 0.72972519 0.059585683 -0.020436218 0.11021632 0.37435629 0.07208284 -0.44643913 2.961097 2.1399221 -0.69294377 15.487708 -1.4401905 -0.38081638 + 276 0.276 0.083323567 0.29450899 0.62216745 1.8921835 0.53200704 0.62893251 0.73124394 6.5405684 4.1014258 1.5040097 0.93513295 33.642126 33.022659 0.28083857 0.33862862 3.9296264 0.28083857 3.2639736 0.38481419 0.33862862 0.38481419 0.76923615 0.72959528 0.059583048 -0.020448723 0.11007196 0.37434356 0.071667471 -0.44601103 2.9602101 2.1397889 -0.69346249 15.485954 -1.4397262 -0.38052814 + 277 0.277 0.083347697 0.29466445 0.62198785 1.8921115 0.53202455 0.62880125 0.73128574 6.5392978 4.1010923 1.5026563 0.93554918 33.636384 33.016543 0.28087983 0.33896092 3.9239633 0.28087983 3.257454 0.38562945 0.33896092 0.38562945 0.76934371 0.72947019 0.059579532 -0.02046078 0.10993029 0.37432141 0.071263245 -0.44558466 2.9592117 2.1395411 -0.69391828 15.482883 -1.4392022 -0.38023897 + 278 0.278 0.083374381 0.29482293 0.62180269 1.892112 0.53204539 0.62877409 0.73129248 6.5385719 4.1009259 1.5017887 0.93585729 33.633941 33.014212 0.28057377 0.33915547 3.9199505 0.28057377 3.2531443 0.38623241 0.33915547 0.38623241 0.76942922 0.72934082 0.059576144 -0.020475131 0.10981631 0.37429173 0.070936096 -0.44522782 2.9584842 2.1393728 -0.69437026 15.481432 -1.4387512 -0.37999449 + 279 0.279 0.083399253 0.29495748 0.62164326 1.8920473 0.5320397 0.62868468 0.73132292 6.5373923 4.1004693 1.5007251 0.93619789 33.628702 33.008941 0.28042699 0.33933347 3.9153658 0.28042699 3.2480583 0.3868805 0.33933347 0.3868805 0.769534 0.72922901 0.059571861 -0.020487142 0.1097024 0.37424437 0.070611169 -0.44485554 2.9575493 2.1390795 -0.69472698 15.479114 -1.4382527 -0.37973578 + 280 0.28 0.083426164 0.29517904 0.6213948 1.8920738 0.53203253 0.62873404 0.73130726 6.5362657 4.0997714 1.4999259 0.93656838 33.619688 32.999913 0.27999065 0.33978419 3.9112132 0.27999065 3.24361 0.38761249 0.33978419 0.38761249 0.76961042 0.72905738 0.059567645 -0.020503796 0.10956687 0.37418407 0.070233507 -0.44441758 2.9563223 2.138508 -0.69521667 15.473651 -1.4374182 -0.3794304 + 281 0.281 0.083447937 0.29533441 0.62121765 1.8920425 0.53201377 0.62871205 0.73131667 6.5351354 4.0991621 1.4990898 0.93688344 33.612436 32.992429 0.28000495 0.34000172 3.9074159 0.28000495 3.2391492 0.38826172 0.34000172 0.38826172 0.7696849 0.72893445 0.059561542 -0.020515918 0.10945915 0.37412672 0.069926804 -0.44405353 2.9553106 2.1380912 -0.69556952 15.4699 -1.4368125 -0.37917496 + 282 0.282 0.083472313 0.29551014 0.62101754 1.8921003 0.53203902 0.62876503 0.73129621 6.5345359 4.098827 1.4985508 0.93715809 33.605854 32.985365 0.28005438 0.34043494 3.9047373 0.28005438 3.2358739 0.38880907 0.34043494 0.38880907 0.76972896 0.72879563 0.059559461 -0.020529795 0.1093553 0.37410103 0.069630211 -0.44373124 2.9544925 2.1377008 -0.69596546 15.465175 -1.4362015 -0.37895439 + 283 0.283 0.083499168 0.29565738 0.62084345 1.892114 0.53209774 0.62870735 0.73130891 6.5341823 4.0990942 1.4976435 0.9374446 33.607838 32.987199 0.28018461 0.34045503 3.9009538 0.28018461 3.231386 0.38938321 0.34045503 0.38938321 0.76982186 0.7286736 0.059557069 -0.020540382 0.10923105 0.3741078 0.069289884 -0.44339768 2.9540869 2.1377862 -0.69644444 15.466096 -1.4359581 -0.37873352 + 284 0.284 0.083521102 0.295833 0.62064589 1.8920758 0.53207333 0.6286826 0.73131987 6.5330249 4.0985328 1.4967132 0.93777886 33.602024 32.981393 0.28004587 0.34058501 3.8967384 0.28004587 3.2266432 0.39004926 0.34058501 0.39004926 0.76991966 0.72853702 0.059550724 -0.020555087 0.10910674 0.37404507 0.068944131 -0.4429892 2.9530741 2.1374441 -0.69686621 15.463458 -1.4353729 -0.37844726 + 285 0.285 0.083545827 0.29599012 0.62046406 1.8920144 0.53207457 0.62858881 0.731351 6.531757 4.0980379 1.4955635 0.93815568 33.59557 32.974805 0.27989192 0.3408734 3.8918734 0.27989192 3.2212756 0.39070581 0.3408734 0.39070581 0.77004559 0.7284103 0.059547051 -0.020566973 0.10896863 0.37400466 0.068571252 -0.44257591 2.9520386 2.1370924 -0.69724766 15.460291 -1.4348059 -0.37816276 + 286 0.286 0.083570278 0.29615561 0.62027412 1.892039 0.53206197 0.62864249 0.7313345 6.5308485 4.0973765 1.4950457 0.93842635 33.587225 32.966266 0.27975165 0.34120751 3.889193 0.27975165 3.2182187 0.39122266 0.34120751 0.39122266 0.77010685 0.72827824 0.059542682 -0.020581027 0.10887796 0.37394375 0.068304544 -0.44224829 2.9510371 2.1365593 -0.6975714 15.455381 -1.4341163 -0.37793081 + 287 0.287 0.083589707 0.29635464 0.62005565 1.892015 0.53200101 0.6286878 0.73132618 6.5292712 4.0961664 1.4943291 0.93877568 33.572746 32.951471 0.27957404 0.34170046 3.8855986 0.27957404 3.2141388 0.39188575 0.34170046 0.39188575 0.77018038 0.72812828 0.059535462 -0.020596267 0.10876216 0.37384803 0.067980378 -0.44182841 2.9495505 2.1357343 -0.69789047 15.447444 -1.4331702 -0.37762961 + 288 0.288 0.083612899 0.29653536 0.61985174 1.8920652 0.53202471 0.62873146 0.73130899 6.528905 4.0961335 1.4937485 0.93902306 33.572095 32.950633 0.27976414 0.34169727 3.8828816 0.27976414 3.2106808 0.39243666 0.34169727 0.39243666 0.77024448 0.72798718 0.059529966 -0.020608732 0.1086495 0.37382366 0.067667227 -0.44149089 2.9489944 2.1356353 -0.69836434 15.446862 -1.4327663 -0.37739918 + 289 0.289 0.083637362 0.29670402 0.61965861 1.8920728 0.53208095 0.62866787 0.73132394 6.5283444 4.0963013 1.4926723 0.93937072 33.571998 32.950173 0.27998188 0.34184374 3.8782797 0.27998188 3.2051019 0.39319592 0.34184374 0.39319592 0.77032278 0.727853 0.059527344 -0.020620217 0.10851594 0.37383297 0.06728227 -0.44111524 2.9484051 2.1356495 -0.69891962 15.446344 -1.4324087 -0.37715082 + 290 0.29 0.083661046 0.29688737 0.61945159 1.8920505 0.53207644 0.62864056 0.73133354 6.5271714 4.09572 1.4917212 0.93973013 33.564278 32.942199 0.27990573 0.34217377 3.8740239 0.27990573 3.2002464 0.39387182 0.34217377 0.39387182 0.77042021 0.72770971 0.059522378 -0.020632449 0.10837901 0.37378551 0.066914651 -0.44070016 2.9473161 2.1352078 -0.69932528 15.442088 -1.4317457 -0.37686356 + 291 0.291 0.083685906 0.2970231 0.61929099 1.8919956 0.53206398 0.62857481 0.73135684 6.5260516 4.0952632 1.490733 0.9400554 33.559563 32.93776 0.27943544 0.34236695 3.8695353 0.27943544 3.195623 0.39447691 0.34236695 0.39447691 0.77052232 0.72759713 0.059517617 -0.020645803 0.10827517 0.37373061 0.066608399 -0.44033901 2.9464041 2.1349313 -0.69970073 15.440036 -1.4312496 -0.37661059 + 292 0.292 0.083712566 0.29718801 0.61909942 1.8920133 0.5320928 0.62856283 0.73135763 6.5253504 4.095074 1.4899071 0.94036934 33.556 32.933882 0.27954523 0.34257197 3.8657985 0.27954523 3.1911101 0.39514316 0.34257197 0.39514316 0.7705914 0.72746349 0.059513976 -0.020656847 0.10816087 0.37370752 0.066279167 -0.43998668 2.9456363 2.134701 -0.70015094 15.437689 -1.4307447 -0.37637057 + 293 0.293 0.083735962 0.29734789 0.61891615 1.8920244 0.5321035 0.62856533 0.73135561 6.5246341 4.0947648 1.489228 0.94064123 33.551101 32.928525 0.27980516 0.34277147 3.8628847 0.27980516 3.1874115 0.39566809 0.34277147 0.39566809 0.77066615 0.72733611 0.05950946 -0.020669452 0.10805104 0.37367302 0.065975854 -0.43964887 2.9448776 2.1344213 -0.70051399 15.434764 -1.4302541 -0.37613769 + 294 0.294 0.083760242 0.2975301 0.61870966 1.8920554 0.53210434 0.62861072 0.73134039 6.5237834 4.0942206 1.4886312 0.94093165 33.54314 32.92008 0.27994 0.3431206 3.8600194 0.27994 3.183829 0.3962504 0.3431206 0.3962504 0.77072368 0.72719305 0.059504602 -0.020683842 0.10793807 0.37362532 0.065667269 -0.43929259 2.9439096 2.1339473 -0.70088298 15.429814 -1.4295867 -0.37588957 + 295 0.295 0.083783267 0.29771193 0.6185048 1.8920841 0.53211741 0.62863631 0.73133041 6.5230277 4.0939187 1.4878571 0.94125192 33.538511 32.915059 0.28014271 0.34330906 3.8562857 0.28014271 3.1791194 0.39702363 0.34330906 0.39702363 0.77076526 0.72705137 0.059499691 -0.020695893 0.10783363 0.37359242 0.065340292 -0.43893272 2.9430454 2.1336616 -0.70138477 15.426798 -1.4289982 -0.37564235 + 296 0.296 0.083806797 0.29792447 0.61826873 1.8921177 0.53210834 0.62869874 0.7313106 6.522036 4.0933016 1.487142 0.94159239 33.530337 32.906794 0.27982898 0.34371485 3.8525236 0.27982898 3.174967 0.39772758 0.34371485 0.39772758 0.77082599 0.72688875 0.059495157 -0.020711817 0.1077143 0.37353602 0.064990574 -0.4385266 2.9419267 2.1331624 -0.70187174 15.421727 -1.4282299 -0.37535907 + 297 0.297 0.083832778 0.29806348 0.61810375 1.8921449 0.53217719 0.62864779 0.73131994 6.5218485 4.0936735 1.4863241 0.94185093 33.533153 32.909414 0.28000071 0.34373831 3.8491707 0.28000071 3.1709355 0.39823446 0.34373831 0.39823446 0.77091296 0.72677299 0.059494418 -0.020723011 0.10759675 0.37355343 0.064668495 -0.43822192 2.9416362 2.1332944 -0.70232503 15.422923 -1.428045 -0.37515982 + 298 0.298 0.083856483 0.29823847 0.61790504 1.892099 0.53216589 0.62859396 0.73133914 6.520572 4.0930772 1.4852732 0.94222155 33.52562 32.90148 0.28017418 0.3439658 3.8446776 0.28017418 3.165541 0.39896243 0.3439658 0.39896243 0.77101565 0.72663526 0.05948827 -0.020735925 0.10746267 0.37350112 0.064297253 -0.43779837 2.9405334 2.1328828 -0.70272574 15.419113 -1.427412 -0.37486583 + 299 0.299 0.083877382 0.29841573 0.61770688 1.8920314 0.53212936 0.62854127 0.73136076 6.5188355 4.0919998 1.4842064 0.94262927 33.5114 32.886716 0.2801449 0.34453861 3.8399835 0.2801449 3.160139 0.39969952 0.34453861 0.39969952 0.77111403 0.7264985 0.059483895 -0.020749122 0.10732789 0.37343072 0.063929334 -0.43736005 2.9390527 2.1321317 -0.7030293 15.411334 -1.426542 -0.37455797 diff --git a/tests/regression/walker/MixMassFracBeta/mixmassfracbeta.q b/tests/regression/walker/MixMassFracBeta/mixmassfracbeta.q index 178860568d6..c8685be392f 100644 --- a/tests/regression/walker/MixMassFracBeta/mixmassfracbeta.q +++ b/tests/regression/walker/MixMassFracBeta/mixmassfracbeta.q @@ -18,6 +18,7 @@ walker depvar y ncomp 20 init jointbeta + solve fullvar icbeta betapdf 0.01 0.01 0.0 1.0 end # light = heavy betapdf 0.2 0.8 0.0 1.0 end # light > heavy diff --git a/tests/regression/walker/OrnsteinUhlenbeck/ou_pdf.ndiff.cfg b/tests/regression/walker/OrnsteinUhlenbeck/ou_pdf.ndiff.cfg index dbe1bb534db..9522b6de752 100644 --- a/tests/regression/walker/OrnsteinUhlenbeck/ou_pdf.ndiff.cfg +++ b/tests/regression/walker/OrnsteinUhlenbeck/ou_pdf.ndiff.cfg @@ -1,4 +1,4 @@ #rows cols constraints -1-26 * skip +1-27 * skip * 1 # no constraint for sample space coordinate: smallest representable float * * any rel=0.01 abs=0.02 diff --git a/tests/regression/walker/OrnsteinUhlenbeck/pdf_f1.txt.std b/tests/regression/walker/OrnsteinUhlenbeck/pdf_f1.txt.std index 219733cea21..104ddcb141e 100644 --- a/tests/regression/walker/OrnsteinUhlenbeck/pdf_f1.txt.std +++ b/tests/regression/walker/OrnsteinUhlenbeck/pdf_f1.txt.std @@ -24,6 +24,7 @@ # # # +# -6 3.48133e-05 -5.8 6.28027e-05 -5.6 0.000111052 diff --git a/tests/regression/walker/SkewNormal/pdf_p1.txt.std b/tests/regression/walker/SkewNormal/pdf_p1.txt.std index de71c0e7df8..472ce8c8e72 100644 --- a/tests/regression/walker/SkewNormal/pdf_p1.txt.std +++ b/tests/regression/walker/SkewNormal/pdf_p1.txt.std @@ -24,6 +24,7 @@ # # # +# -0.5 0 -0.49 0 -0.48 0 diff --git a/tests/regression/walker/SkewNormal/pdf_p2.txt.std b/tests/regression/walker/SkewNormal/pdf_p2.txt.std index ae2a37526f1..8457ac19aff 100644 --- a/tests/regression/walker/SkewNormal/pdf_p2.txt.std +++ b/tests/regression/walker/SkewNormal/pdf_p2.txt.std @@ -24,6 +24,7 @@ # # # +# -2.5 5.94688e-06 -2.49 6.571e-06 -2.48 7.25772e-06 diff --git a/tests/regression/walker/SkewNormal/skew_pdf.ndiff.cfg b/tests/regression/walker/SkewNormal/skew_pdf.ndiff.cfg index cd4d29f5406..9e723e463d4 100644 --- a/tests/regression/walker/SkewNormal/skew_pdf.ndiff.cfg +++ b/tests/regression/walker/SkewNormal/skew_pdf.ndiff.cfg @@ -1,4 +1,4 @@ #rows cols constraints -1-26 * skip +1-27 * skip * 1 # no constraint for sample space coordinate: smallest representable float * * any rel=0.3 abs=0.3 diff --git a/tests/regression/walker/Velocity/CMakeLists.txt b/tests/regression/walker/Velocity/CMakeLists.txt index d664dbc6ce7..c1fa15d7d25 100644 --- a/tests/regression/walker/Velocity/CMakeLists.txt +++ b/tests/regression/walker/Velocity/CMakeLists.txt @@ -1,17 +1,10 @@ # See cmake/add_regression_test.cmake for documentation on the arguments to # add_regression_test(). -add_regression_test(Velocity_SLM_HomogeneousShear ${WALKER_EXECUTABLE} - NUMPES 1 - INPUTFILES slm_homogeneous_shear.q - ARGS -c slm_homogeneous_shear.q -v - TEXT_BASELINE slm_homogeneous_shear.stat.txt.std - TEXT_RESULT stat.txt - TEXT_DIFF_PROG_CONF velocity.ndiff.cfg - LABELS verification) +# Velocity coefficients: constant imposed mean shear add_regression_test(Velocity_SLM_HomogeneousShear ${WALKER_EXECUTABLE} - NUMPES 2 + NUMPES 1 INPUTFILES slm_homogeneous_shear.q ARGS -c slm_homogeneous_shear.q -v TEXT_BASELINE slm_homogeneous_shear.stat.txt.std @@ -63,3 +56,22 @@ add_regression_test(Velocity_GLM_HomogeneousShear_u0.9 ${WALKER_EXECUTABLE} TEXT_RESULT stat.txt TEXT_DIFF_PROG_CONF velocity.ndiff.cfg LABELS verification) + +# Velocity coefficients: force stationary PDF + +add_regression_test(Velocity_stationary ${WALKER_EXECUTABLE} + NUMPES 4 + INPUTFILES stationary.q + ARGS -c stationary.q -v + TEXT_BASELINE stationary.stat.txt.std + stationary_pdf_u1.txt.std + stationary_pdf_u1.txt.std + stationary_pdf_u1.txt.std + TEXT_RESULT stat.txt + pdf_u1.txt + pdf_u2.txt + pdf_u3.txt + TEXT_DIFF_PROG_CONF stationary_velocity.ndiff.cfg + stationary_velocity_pdf.ndiff.cfg + stationary_velocity_pdf.ndiff.cfg + stationary_velocity_pdf.ndiff.cfg) diff --git a/tests/regression/walker/Velocity/glm.agr b/tests/regression/walker/Velocity/glm.agr new file mode 100644 index 00000000000..67209561e05 --- /dev/null +++ b/tests/regression/walker/Velocity/glm.agr @@ -0,0 +1,5910 @@ +# Grace project file +# +@version 50119 +@page size 792, 612 +@page scroll 5% +@page inout 5% +@link page off +@map font 39 to "Courier", "Courier" +@map font 40 to "Courier-Bold", "Courier-Bold" +@map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" +@map font 9 to "Courier-Oblique", "Courier-Oblique" +@map font 4 to "Helvetica", "Helvetica" +@map font 6 to "Helvetica-Bold", "Helvetica-Bold" +@map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" +@map font 15 to "Helvetica-Narrow", "Helvetica-Narrow" +@map font 16 to "Helvetica-Narrow-Bold", "Helvetica-Narrow-Bold" +@map font 17 to "Helvetica-Narrow-BoldOblique", "Helvetica-Narrow-BoldOblique" +@map font 18 to "Helvetica-Narrow-Oblique", "Helvetica-Narrow-Oblique" +@map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" +@map font 20 to "NewCenturySchlbk-Bold", "NewCenturySchlbk-Bold" +@map font 21 to "NewCenturySchlbk-BoldItalic", "NewCenturySchlbk-BoldItalic" +@map font 22 to "NewCenturySchlbk-Italic", "NewCenturySchlbk-Italic" +@map font 23 to "NewCenturySchlbk-Roman", "NewCenturySchlbk-Roman" +@map font 24 to "Palatino-Bold", "Palatino-Bold" +@map font 25 to "Palatino-BoldItalic", "Palatino-BoldItalic" +@map font 26 to "Palatino-Italic", "Palatino-Italic" +@map font 27 to "Palatino-Roman", "Palatino-Roman" +@map font 12 to "Symbol", "Symbol" +@map font 2 to "Times-Bold", "Times-Bold" +@map font 3 to "Times-BoldItalic", "Times-BoldItalic" +@map font 1 to "Times-Italic", "Times-Italic" +@map font 0 to "Times-Roman", "Times-Roman" +@map font 33 to "ZapfChancery-MediumItalic", "ZapfChancery-MediumItalic" +@map font 13 to "ZapfDingbats", "ZapfDingbats" +@map font 35 to "CharterBT-Bold", "CharterBT-Bold" +@map font 36 to "CharterBT-BoldItalic", "CharterBT-BoldItalic" +@map font 37 to "CharterBT-Italic", "CharterBT-Italic" +@map font 38 to "CharterBT-Roman", "CharterBT-Roman" +@map font 41 to "Courier-BoldItalic", "Courier-BoldItalic" +@map font 42 to "Courier-Italic", "Courier-Italic" +@map font 43 to "Hershey-Gothic-English", "Hershey-Gothic-English" +@map font 44 to "Hershey-Gothic-German", "Hershey-Gothic-German" +@map font 45 to "Hershey-Gothic-Italian", "Hershey-Gothic-Italian" +@map font 46 to "Hershey-Plain-Duplex", "Hershey-Plain-Duplex" +@map font 47 to "Hershey-Plain-Duplex-Italic", "Hershey-Plain-Duplex-Italic" +@map font 48 to "Hershey-Plain-Triplex", "Hershey-Plain-Triplex" +@map font 49 to "Hershey-Plain-Triplex-Italic", "Hershey-Plain-Triplex-Italic" +@map font 50 to "Hershey-Script-Complex", "Hershey-Script-Complex" +@map font 51 to "Hershey-Script-Simplex", "Hershey-Script-Simplex" +@map font 54 to "LMRoman10-Bold", "LMRoman10-Bold" +@map font 55 to "LMRoman10-BoldItalic", "LMRoman10-BoldItalic" +@map font 58 to "LMRoman10-DemiOblique", "LMRoman10-DemiOblique" +@map font 56 to "LMRoman10-Italic", "LMRoman10-Italic" +@map font 57 to "LMRoman10-Regular", "LMRoman10-Regular" +@map font 60 to "LMSans10-Bold", "LMSans10-Bold" +@map font 64 to "LMSans10-DemiCondensed", "LMSans10-DemiCondensed" +@map font 65 to "LMSans10-DemiCondensedOblique", "LMSans10-DemiCondensedOblique" +@map font 66 to "LMSans10-Oblique", "LMSans10-Oblique" +@map font 63 to "LMSans10-Regular", "LMSans10-Regular" +@map font 68 to "LMTypewriter10-CapsOblique", "LMTypewriter10-CapsOblique" +@map font 70 to "LMTypewriter10-Dark", "LMTypewriter10-Dark" +@map font 71 to "LMTypewriter10-DarkOblique", "LMTypewriter10-DarkOblique" +@map font 69 to "LMTypewriter10-Italic", "LMTypewriter10-Italic" +@map font 73 to "LMTypewriter10-Light", "LMTypewriter10-Light" +@map font 74 to "LuxiMono", "LuxiMono" +@map font 75 to "LuxiMono-Bold", "LuxiMono-Bold" +@map font 76 to "LuxiMono-BoldOblique", "LuxiMono-BoldOblique" +@map font 77 to "LuxiMono-Oblique", "LuxiMono-Oblique" +@map font 78 to "LuxiSans", "LuxiSans" +@map font 79 to "LuxiSans-Bold", "LuxiSans-Bold" +@map font 80 to "LuxiSans-BoldOblique", "LuxiSans-BoldOblique" +@map font 81 to "LuxiSans-Oblique", "LuxiSans-Oblique" +@map font 82 to "LuxiSerif", "LuxiSerif" +@map font 83 to "LuxiSerif-Bold", "LuxiSerif-Bold" +@map font 84 to "LuxiSerif-BoldOblique", "LuxiSerif-BoldOblique" +@map font 85 to "LuxiSerif-Oblique", "LuxiSerif-Oblique" +@map font 86 to "Utopia-Bold", "Utopia-Bold" +@map font 87 to "Utopia-BoldItalic", "Utopia-BoldItalic" +@map font 88 to "Utopia-Italic", "Utopia-Italic" +@map font 89 to "Utopia-Regular", "Utopia-Regular" +@map color 0 to (255, 255, 255), "white" +@map color 1 to (0, 0, 0), "black" +@map color 2 to (255, 0, 0), "red" +@map color 3 to (0, 255, 0), "green" +@map color 4 to (0, 0, 255), "blue" +@map color 5 to (255, 255, 0), "yellow" +@map color 6 to (188, 143, 143), "brown" +@map color 7 to (220, 220, 220), "grey" +@map color 8 to (148, 0, 211), "violet" +@map color 9 to (0, 255, 255), "cyan" +@map color 10 to (255, 0, 255), "magenta" +@map color 11 to (255, 165, 0), "orange" +@map color 12 to (114, 33, 188), "indigo" +@map color 13 to (103, 7, 72), "maroon" +@map color 14 to (64, 224, 208), "turquoise" +@map color 15 to (0, 139, 0), "green4" +@reference date 0 +@date wrap off +@date wrap year 1950 +@default linewidth 1.0 +@default linestyle 1 +@default color 1 +@default pattern 1 +@default font 0 +@default char size 1.000000 +@default symbol size 1.000000 +@default sformat "%.8g" +@background color 0 +@page background fill on +@timestamp off +@timestamp 0.03, 0.03 +@timestamp color 1 +@timestamp rot 0 +@timestamp font 0 +@timestamp char size 1.000000 +@timestamp def "Mon May 15 15:56:45 2006" +@with string +@ string on +@ string loctype view +@ string 0.897647058823, 0.71294117647 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.500000 +@ string def "b\s11" +@with string +@ string on +@ string loctype view +@ string 0.88, 0.411764705882 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.500000 +@ string def "b\s33" +@with string +@ string on +@ string loctype view +@ string 1.01882352941, 0.285882352941 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.500000 +@ string def "b\s12" +@with string +@ string on +@ string loctype view +@ string 0.995294117647, 0.176470588235 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.500000 +@ string def "b\s22" +@with string +@ string on +@ string loctype view +@ string 0.211764705882, 0.944705882353 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 0.990000 +@ string def "Reynolds stress anisotropy in homogeneous shear flow\nlines - generalized Langevin model, symbols - DNS data\nof Rogers and Moin (1987)" +@r0 off +@link r0 to g0 +@r0 type above +@r0 linestyle 1 +@r0 linewidth 1.0 +@r0 color 1 +@r0 line 0, 0, 0, 0 +@r1 off +@link r1 to g0 +@r1 type above +@r1 linestyle 1 +@r1 linewidth 1.0 +@r1 color 1 +@r1 line 0, 0, 0, 0 +@r2 off +@link r2 to g0 +@r2 type above +@r2 linestyle 1 +@r2 linewidth 1.0 +@r2 color 1 +@r2 line 0, 0, 0, 0 +@r3 off +@link r3 to g0 +@r3 type above +@r3 linestyle 1 +@r3 linewidth 1.0 +@r3 color 1 +@r3 line 0, 0, 0, 0 +@r4 off +@link r4 to g0 +@r4 type above +@r4 linestyle 1 +@r4 linewidth 1.0 +@r4 color 1 +@r4 line 0, 0, 0, 0 +@g0 on +@g0 hidden false +@g0 type XY +@g0 stacked false +@g0 bar hgap 0.000000 +@g0 fixedpoint off +@g0 fixedpoint type 0 +@g0 fixedpoint xy 0.000000, 0.000000 +@g0 fixedpoint format general general +@g0 fixedpoint prec 6, 6 +@with g0 +@ world 0, -0.2, 15, 0.3001 +@ stack world 0, 0, 0, 0 +@ znorm 1 +@ view 0.150000, 0.150000, 1.150000, 0.850000 +@ title "" +@ title font 39 +@ title size 1.500000 +@ title color 1 +@ subtitle "" +@ subtitle font 39 +@ subtitle size 1.000000 +@ subtitle color 1 +@ xaxes scale Normal +@ yaxes scale Normal +@ xaxes invert off +@ yaxes invert off +@ xaxis on +@ xaxis type zero false +@ xaxis offset 0.000000 , 0.000000 +@ xaxis bar on +@ xaxis bar color 1 +@ xaxis bar linestyle 1 +@ xaxis bar linewidth 1.0 +@ xaxis label "St" +@ xaxis label layout para +@ xaxis label place auto +@ xaxis label char size 1.000000 +@ xaxis label font 39 +@ xaxis label color 1 +@ xaxis label place normal +@ xaxis tick on +@ xaxis tick major 5 +@ xaxis tick minor ticks 4 +@ xaxis tick default 6 +@ xaxis tick place rounded true +@ xaxis tick in +@ xaxis tick major size 1.000000 +@ xaxis tick major color 7 +@ xaxis tick major linewidth 1.0 +@ xaxis tick major linestyle 1 +@ xaxis tick major grid on +@ xaxis tick minor color 7 +@ xaxis tick minor linewidth 1.0 +@ xaxis tick minor linestyle 1 +@ xaxis tick minor grid off +@ xaxis tick minor size 0.500000 +@ xaxis ticklabel on +@ xaxis ticklabel format general +@ xaxis ticklabel prec 5 +@ xaxis ticklabel formula "" +@ xaxis ticklabel append "" +@ xaxis ticklabel prepend "" +@ xaxis ticklabel angle 0 +@ xaxis ticklabel skip 0 +@ xaxis ticklabel stagger 0 +@ xaxis ticklabel place normal +@ xaxis ticklabel offset auto +@ xaxis ticklabel offset 0.000000 , 0.010000 +@ xaxis ticklabel start type auto +@ xaxis ticklabel start 0.000000 +@ xaxis ticklabel stop type auto +@ xaxis ticklabel stop 0.000000 +@ xaxis ticklabel char size 1.000000 +@ xaxis ticklabel font 39 +@ xaxis ticklabel color 1 +@ xaxis tick place both +@ xaxis tick spec type none +@ yaxis on +@ yaxis type zero false +@ yaxis offset 0.000000 , 0.000000 +@ yaxis bar on +@ yaxis bar color 1 +@ yaxis bar linestyle 1 +@ yaxis bar linewidth 1.0 +@ yaxis label "Reynolds stress anisotropy, b\sij" +@ yaxis label layout para +@ yaxis label place auto +@ yaxis label char size 1.000000 +@ yaxis label font 39 +@ yaxis label color 1 +@ yaxis label place normal +@ yaxis tick on +@ yaxis tick major 0.1 +@ yaxis tick minor ticks 4 +@ yaxis tick default 6 +@ yaxis tick place rounded true +@ yaxis tick in +@ yaxis tick major size 1.000000 +@ yaxis tick major color 7 +@ yaxis tick major linewidth 1.0 +@ yaxis tick major linestyle 1 +@ yaxis tick major grid on +@ yaxis tick minor color 7 +@ yaxis tick minor linewidth 1.0 +@ yaxis tick minor linestyle 1 +@ yaxis tick minor grid off +@ yaxis tick minor size 0.500000 +@ yaxis ticklabel on +@ yaxis ticklabel format general +@ yaxis ticklabel prec 5 +@ yaxis ticklabel formula "" +@ yaxis ticklabel append "" +@ yaxis ticklabel prepend "" +@ yaxis ticklabel angle 0 +@ yaxis ticklabel skip 0 +@ yaxis ticklabel stagger 0 +@ yaxis ticklabel place normal +@ yaxis ticklabel offset auto +@ yaxis ticklabel offset 0.000000 , 0.010000 +@ yaxis ticklabel start type auto +@ yaxis ticklabel start 0.000000 +@ yaxis ticklabel stop type auto +@ yaxis ticklabel stop 0.000000 +@ yaxis ticklabel char size 1.000000 +@ yaxis ticklabel font 39 +@ yaxis ticklabel color 1 +@ yaxis tick place both +@ yaxis tick spec type none +@ altxaxis off +@ altyaxis off +@ legend on +@ legend loctype view +@ legend 1, 0.65 +@ legend box color 1 +@ legend box pattern 1 +@ legend box linewidth 1.0 +@ legend box linestyle 1 +@ legend box fill color 0 +@ legend box fill pattern 1 +@ legend font 39 +@ legend char size 1.000000 +@ legend color 1 +@ legend length 4 +@ legend vgap 1 +@ legend hgap 1 +@ legend invert false +@ frame type 0 +@ frame linestyle 1 +@ frame linewidth 1.0 +@ frame color 1 +@ frame pattern 1 +@ frame background color 0 +@ frame background pattern 0 +@ s0 hidden false +@ s0 type xy +@ s0 symbol 0 +@ s0 symbol size 1.000000 +@ s0 symbol color 2 +@ s0 symbol pattern 1 +@ s0 symbol fill color 2 +@ s0 symbol fill pattern 0 +@ s0 symbol linewidth 1.0 +@ s0 symbol linestyle 1 +@ s0 symbol char 65 +@ s0 symbol char font 0 +@ s0 symbol skip 0 +@ s0 line type 1 +@ s0 line linestyle 1 +@ s0 line linewidth 2.0 +@ s0 line color 2 +@ s0 line pattern 1 +@ s0 baseline type 0 +@ s0 baseline off +@ s0 dropline off +@ s0 fill type 0 +@ s0 fill rule 0 +@ s0 fill color 1 +@ s0 fill pattern 1 +@ s0 avalue off +@ s0 avalue type 2 +@ s0 avalue char size 1.000000 +@ s0 avalue font 0 +@ s0 avalue color 1 +@ s0 avalue rot 0 +@ s0 avalue format general +@ s0 avalue prec 3 +@ s0 avalue prepend "" +@ s0 avalue append "" +@ s0 avalue offset 0.000000 , 0.000000 +@ s0 errorbar on +@ s0 errorbar place both +@ s0 errorbar color 2 +@ s0 errorbar pattern 1 +@ s0 errorbar size 1.000000 +@ s0 errorbar linewidth 1.0 +@ s0 errorbar linestyle 1 +@ s0 errorbar riser linewidth 1.0 +@ s0 errorbar riser linestyle 1 +@ s0 errorbar riser clip off +@ s0 errorbar riser clip length 0.100000 +@ s0 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/GLM/shear.rs" +@ s0 legend "" +@ s1 hidden false +@ s1 type xy +@ s1 symbol 0 +@ s1 symbol size 1.000000 +@ s1 symbol color 10 +@ s1 symbol pattern 1 +@ s1 symbol fill color 10 +@ s1 symbol fill pattern 0 +@ s1 symbol linewidth 1.0 +@ s1 symbol linestyle 1 +@ s1 symbol char 65 +@ s1 symbol char font 0 +@ s1 symbol skip 0 +@ s1 line type 1 +@ s1 line linestyle 1 +@ s1 line linewidth 2.0 +@ s1 line color 10 +@ s1 line pattern 1 +@ s1 baseline type 0 +@ s1 baseline off +@ s1 dropline off +@ s1 fill type 0 +@ s1 fill rule 0 +@ s1 fill color 1 +@ s1 fill pattern 1 +@ s1 avalue off +@ s1 avalue type 2 +@ s1 avalue char size 1.000000 +@ s1 avalue font 0 +@ s1 avalue color 1 +@ s1 avalue rot 0 +@ s1 avalue format general +@ s1 avalue prec 3 +@ s1 avalue prepend "" +@ s1 avalue append "" +@ s1 avalue offset 0.000000 , 0.000000 +@ s1 errorbar on +@ s1 errorbar place both +@ s1 errorbar color 10 +@ s1 errorbar pattern 1 +@ s1 errorbar size 1.000000 +@ s1 errorbar linewidth 1.0 +@ s1 errorbar linestyle 1 +@ s1 errorbar riser linewidth 1.0 +@ s1 errorbar riser linestyle 1 +@ s1 errorbar riser clip off +@ s1 errorbar riser clip length 0.100000 +@ s1 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/GLM/shear.rs" +@ s1 legend "" +@ s2 hidden false +@ s2 type xy +@ s2 symbol 0 +@ s2 symbol size 1.000000 +@ s2 symbol color 4 +@ s2 symbol pattern 1 +@ s2 symbol fill color 4 +@ s2 symbol fill pattern 0 +@ s2 symbol linewidth 1.0 +@ s2 symbol linestyle 1 +@ s2 symbol char 65 +@ s2 symbol char font 0 +@ s2 symbol skip 0 +@ s2 line type 1 +@ s2 line linestyle 1 +@ s2 line linewidth 2.0 +@ s2 line color 4 +@ s2 line pattern 1 +@ s2 baseline type 0 +@ s2 baseline off +@ s2 dropline off +@ s2 fill type 0 +@ s2 fill rule 0 +@ s2 fill color 1 +@ s2 fill pattern 1 +@ s2 avalue off +@ s2 avalue type 2 +@ s2 avalue char size 1.000000 +@ s2 avalue font 0 +@ s2 avalue color 1 +@ s2 avalue rot 0 +@ s2 avalue format general +@ s2 avalue prec 3 +@ s2 avalue prepend "" +@ s2 avalue append "" +@ s2 avalue offset 0.000000 , 0.000000 +@ s2 errorbar on +@ s2 errorbar place both +@ s2 errorbar color 4 +@ s2 errorbar pattern 1 +@ s2 errorbar size 1.000000 +@ s2 errorbar linewidth 1.0 +@ s2 errorbar linestyle 1 +@ s2 errorbar riser linewidth 1.0 +@ s2 errorbar riser linestyle 1 +@ s2 errorbar riser clip off +@ s2 errorbar riser clip length 0.100000 +@ s2 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/GLM/shear.rs" +@ s2 legend "" +@ s3 hidden false +@ s3 type xy +@ s3 symbol 0 +@ s3 symbol size 1.000000 +@ s3 symbol color 3 +@ s3 symbol pattern 1 +@ s3 symbol fill color 3 +@ s3 symbol fill pattern 0 +@ s3 symbol linewidth 1.0 +@ s3 symbol linestyle 1 +@ s3 symbol char 65 +@ s3 symbol char font 0 +@ s3 symbol skip 0 +@ s3 line type 1 +@ s3 line linestyle 1 +@ s3 line linewidth 2.0 +@ s3 line color 3 +@ s3 line pattern 1 +@ s3 baseline type 0 +@ s3 baseline off +@ s3 dropline off +@ s3 fill type 0 +@ s3 fill rule 0 +@ s3 fill color 1 +@ s3 fill pattern 1 +@ s3 avalue off +@ s3 avalue type 2 +@ s3 avalue char size 1.000000 +@ s3 avalue font 0 +@ s3 avalue color 1 +@ s3 avalue rot 0 +@ s3 avalue format general +@ s3 avalue prec 3 +@ s3 avalue prepend "" +@ s3 avalue append "" +@ s3 avalue offset 0.000000 , 0.000000 +@ s3 errorbar on +@ s3 errorbar place both +@ s3 errorbar color 3 +@ s3 errorbar pattern 1 +@ s3 errorbar size 1.000000 +@ s3 errorbar linewidth 1.0 +@ s3 errorbar linestyle 1 +@ s3 errorbar riser linewidth 1.0 +@ s3 errorbar riser linestyle 1 +@ s3 errorbar riser clip off +@ s3 errorbar riser clip length 0.100000 +@ s3 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/GLM/shear.rs" +@ s3 legend "" +@ s16 hidden false +@ s16 type xy +@ s16 symbol 1 +@ s16 symbol size 0.500000 +@ s16 symbol color 1 +@ s16 symbol pattern 1 +@ s16 symbol fill color 1 +@ s16 symbol fill pattern 1 +@ s16 symbol linewidth 1.0 +@ s16 symbol linestyle 1 +@ s16 symbol char 65 +@ s16 symbol char font 0 +@ s16 symbol skip 0 +@ s16 line type 0 +@ s16 line linestyle 1 +@ s16 line linewidth 1.0 +@ s16 line color 1 +@ s16 line pattern 1 +@ s16 baseline type 0 +@ s16 baseline off +@ s16 dropline off +@ s16 fill type 0 +@ s16 fill rule 0 +@ s16 fill color 1 +@ s16 fill pattern 1 +@ s16 avalue off +@ s16 avalue type 2 +@ s16 avalue char size 1.000000 +@ s16 avalue font 0 +@ s16 avalue color 1 +@ s16 avalue rot 0 +@ s16 avalue format general +@ s16 avalue prec 3 +@ s16 avalue prepend "" +@ s16 avalue append "" +@ s16 avalue offset 0.000000 , 0.000000 +@ s16 errorbar on +@ s16 errorbar place both +@ s16 errorbar color 1 +@ s16 errorbar pattern 1 +@ s16 errorbar size 1.000000 +@ s16 errorbar linewidth 1.0 +@ s16 errorbar linestyle 1 +@ s16 errorbar riser linewidth 1.0 +@ s16 errorbar riser linestyle 1 +@ s16 errorbar riser clip off +@ s16 errorbar riser clip length 0.100000 +@ s16 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b11_DNS.txt" +@ s16 legend "b\s11" +@ s17 hidden false +@ s17 type xy +@ s17 symbol 1 +@ s17 symbol size 0.500000 +@ s17 symbol color 1 +@ s17 symbol pattern 1 +@ s17 symbol fill color 1 +@ s17 symbol fill pattern 0 +@ s17 symbol linewidth 1.0 +@ s17 symbol linestyle 1 +@ s17 symbol char 65 +@ s17 symbol char font 0 +@ s17 symbol skip 0 +@ s17 line type 0 +@ s17 line linestyle 1 +@ s17 line linewidth 1.0 +@ s17 line color 1 +@ s17 line pattern 1 +@ s17 baseline type 0 +@ s17 baseline off +@ s17 dropline off +@ s17 fill type 0 +@ s17 fill rule 0 +@ s17 fill color 1 +@ s17 fill pattern 1 +@ s17 avalue off +@ s17 avalue type 2 +@ s17 avalue char size 1.000000 +@ s17 avalue font 0 +@ s17 avalue color 1 +@ s17 avalue rot 0 +@ s17 avalue format general +@ s17 avalue prec 3 +@ s17 avalue prepend "" +@ s17 avalue append "" +@ s17 avalue offset 0.000000 , 0.000000 +@ s17 errorbar on +@ s17 errorbar place both +@ s17 errorbar color 1 +@ s17 errorbar pattern 1 +@ s17 errorbar size 1.000000 +@ s17 errorbar linewidth 1.0 +@ s17 errorbar linestyle 1 +@ s17 errorbar riser linewidth 1.0 +@ s17 errorbar riser linestyle 1 +@ s17 errorbar riser clip off +@ s17 errorbar riser clip length 0.100000 +@ s17 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b12_DNS.txt" +@ s17 legend "b\s12" +@ s18 hidden false +@ s18 type xy +@ s18 symbol 4 +@ s18 symbol size 0.500000 +@ s18 symbol color 1 +@ s18 symbol pattern 1 +@ s18 symbol fill color 1 +@ s18 symbol fill pattern 1 +@ s18 symbol linewidth 1.0 +@ s18 symbol linestyle 1 +@ s18 symbol char 65 +@ s18 symbol char font 0 +@ s18 symbol skip 0 +@ s18 line type 0 +@ s18 line linestyle 1 +@ s18 line linewidth 1.0 +@ s18 line color 1 +@ s18 line pattern 1 +@ s18 baseline type 0 +@ s18 baseline off +@ s18 dropline off +@ s18 fill type 0 +@ s18 fill rule 0 +@ s18 fill color 1 +@ s18 fill pattern 1 +@ s18 avalue off +@ s18 avalue type 2 +@ s18 avalue char size 1.000000 +@ s18 avalue font 0 +@ s18 avalue color 1 +@ s18 avalue rot 0 +@ s18 avalue format general +@ s18 avalue prec 3 +@ s18 avalue prepend "" +@ s18 avalue append "" +@ s18 avalue offset 0.000000 , 0.000000 +@ s18 errorbar on +@ s18 errorbar place both +@ s18 errorbar color 1 +@ s18 errorbar pattern 1 +@ s18 errorbar size 1.000000 +@ s18 errorbar linewidth 1.0 +@ s18 errorbar linestyle 1 +@ s18 errorbar riser linewidth 1.0 +@ s18 errorbar riser linestyle 1 +@ s18 errorbar riser clip off +@ s18 errorbar riser clip length 0.100000 +@ s18 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b22_DNS.txt" +@ s18 legend "b\s22" +@ s19 hidden false +@ s19 type xy +@ s19 symbol 2 +@ s19 symbol size 0.500000 +@ s19 symbol color 1 +@ s19 symbol pattern 1 +@ s19 symbol fill color 1 +@ s19 symbol fill pattern 1 +@ s19 symbol linewidth 1.0 +@ s19 symbol linestyle 1 +@ s19 symbol char 65 +@ s19 symbol char font 0 +@ s19 symbol skip 0 +@ s19 line type 0 +@ s19 line linestyle 1 +@ s19 line linewidth 1.0 +@ s19 line color 1 +@ s19 line pattern 1 +@ s19 baseline type 0 +@ s19 baseline off +@ s19 dropline off +@ s19 fill type 0 +@ s19 fill rule 0 +@ s19 fill color 1 +@ s19 fill pattern 1 +@ s19 avalue off +@ s19 avalue type 2 +@ s19 avalue char size 1.000000 +@ s19 avalue font 0 +@ s19 avalue color 1 +@ s19 avalue rot 0 +@ s19 avalue format general +@ s19 avalue prec 3 +@ s19 avalue prepend "" +@ s19 avalue append "" +@ s19 avalue offset 0.000000 , 0.000000 +@ s19 errorbar on +@ s19 errorbar place both +@ s19 errorbar color 1 +@ s19 errorbar pattern 1 +@ s19 errorbar size 1.000000 +@ s19 errorbar linewidth 1.0 +@ s19 errorbar linestyle 1 +@ s19 errorbar riser linewidth 1.0 +@ s19 errorbar riser linestyle 1 +@ s19 errorbar riser clip off +@ s19 errorbar riser clip length 0.100000 +@ s19 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b33_DNS.txt" +@ s19 legend "b\s33" +@target G0.S0 +@type xy +0 -0.00127661 +0.0117571 -0.00189124 +0.0235142 -0.00233821 +0.0352713 -0.002478 +0.0470284 -0.00254741 +0.0587856 -0.00337823 +0.0705427 -0.0029811 +0.0822998 -0.00293301 +0.0940569 -0.00196455 +0.105814 -0.00139902 +0.117571 -0.00162934 +0.129328 -0.00171836 +0.141085 -0.00171199 +0.152842 -0.0016162 +0.1646 -0.000524591 +0.176357 -0.000452804 +0.188114 -0.000365101 +0.199871 -0.000805526 +0.211628 -0.000567211 +0.223385 -7.76917e-05 +0.235142 0.00065872 +0.246899 0.0008441 +0.258656 0.00152163 +0.270414 0.00119015 +0.282171 0.00185614 +0.293928 0.0023926 +0.305685 0.0029668 +0.317442 0.00338131 +0.329199 0.00375172 +0.340956 0.00422745 +0.352713 0.00464087 +0.36447 0.00522522 +0.376228 0.00552172 +0.387985 0.00607837 +0.399742 0.00618128 +0.411499 0.0059707 +0.423256 0.00551147 +0.435013 0.00596107 +0.44677 0.00657284 +0.458527 0.00675169 +0.470284 0.00691638 +0.482042 0.00686377 +0.493799 0.00710282 +0.505556 0.00788219 +0.517313 0.0080951 +0.52907 0.00805273 +0.540827 0.0088941 +0.552584 0.00994746 +0.564341 0.0106189 +0.576098 0.010889 +0.587856 0.0119346 +0.599613 0.0118551 +0.61137 0.0123591 +0.623127 0.0130948 +0.634884 0.0138792 +0.646641 0.0143783 +0.658398 0.0147279 +0.670155 0.0158358 +0.681912 0.0160109 +0.69367 0.0158632 +0.705427 0.0163607 +0.717184 0.0162945 +0.728941 0.0170407 +0.740698 0.0175337 +0.752455 0.0178276 +0.764212 0.0189005 +0.775969 0.0193044 +0.787727 0.0198732 +0.799484 0.0199957 +0.811241 0.0208131 +0.822998 0.0211614 +0.834755 0.0215896 +0.846512 0.021399 +0.858269 0.0223026 +0.870026 0.0229622 +0.881783 0.0237966 +0.893541 0.0243934 +0.905298 0.0246154 +0.917055 0.0250675 +0.928812 0.0258673 +0.940569 0.0270869 +0.952326 0.0276324 +0.964083 0.0279021 +0.97584 0.0282656 +0.987597 0.0287433 +0.999355 0.0292363 +1.01111 0.0292849 +1.02287 0.0305275 +1.03463 0.0310973 +1.04638 0.0319994 +1.05814 0.0326591 +1.0699 0.0327225 +1.08165 0.0330845 +1.09341 0.0337372 +1.10517 0.0343187 +1.11693 0.0353038 +1.12868 0.0358549 +1.14044 0.0357726 +1.1522 0.0358638 +1.16395 0.0366005 +1.17571 0.037217 +1.18747 0.0374945 +1.19923 0.0384946 +1.21098 0.0385325 +1.22274 0.0392501 +1.2345 0.0396099 +1.24625 0.0402056 +1.25801 0.0407505 +1.26977 0.0415402 +1.28153 0.0426024 +1.29328 0.0427305 +1.30504 0.0432276 +1.3168 0.0439145 +1.32855 0.0444238 +1.34031 0.0453924 +1.35207 0.0460171 +1.36382 0.0461209 +1.37558 0.0464476 +1.38734 0.0470958 +1.3991 0.0475134 +1.41085 0.0473616 +1.42261 0.0476683 +1.43437 0.0479653 +1.44612 0.0487096 +1.45788 0.0495656 +1.46964 0.0502784 +1.4814 0.0512353 +1.49315 0.0520464 +1.50491 0.0521045 +1.51667 0.05253 +1.52842 0.0529761 +1.54018 0.0534018 +1.55194 0.0542945 +1.5637 0.0546847 +1.57545 0.0553647 +1.58721 0.0559138 +1.59897 0.0568535 +1.61072 0.0577423 +1.62248 0.0587154 +1.63424 0.0591809 +1.646 0.0593818 +1.65775 0.0602997 +1.66951 0.0609324 +1.68127 0.0618602 +1.69302 0.062774 +1.70478 0.063219 +1.71654 0.0639494 +1.7283 0.065251 +1.74005 0.0660894 +1.75181 0.0668401 +1.76357 0.0667567 +1.77532 0.0674015 +1.78708 0.0680913 +1.79884 0.068593 +1.8106 0.0686536 +1.82235 0.0693883 +1.83411 0.0698794 +1.84587 0.0702436 +1.85762 0.0705928 +1.86938 0.0712966 +1.88114 0.0720768 +1.8929 0.0728716 +1.90465 0.073071 +1.91641 0.0732412 +1.92817 0.0741877 +1.93992 0.0744275 +1.95168 0.0742058 +1.96344 0.0751474 +1.97519 0.0757395 +1.98695 0.0754924 +1.99871 0.0759119 +2.01047 0.0767236 +2.02222 0.0776572 +2.03398 0.0782051 +2.04574 0.0779284 +2.05749 0.078519 +2.06925 0.0793259 +2.08101 0.0791886 +2.09277 0.0794993 +2.10452 0.0798393 +2.11628 0.0805705 +2.12804 0.0810903 +2.13979 0.0813334 +2.15155 0.0820834 +2.16331 0.0825308 +2.17507 0.08285 +2.18682 0.0831429 +2.19858 0.0838605 +2.21034 0.0848764 +2.22209 0.085256 +2.23385 0.0849392 +2.24561 0.0858828 +2.25737 0.0861117 +2.26912 0.0864991 +2.28088 0.0870954 +2.29264 0.0869306 +2.30439 0.0877583 +2.31615 0.0879398 +2.32791 0.0883879 +2.33967 0.0886766 +2.35142 0.0890068 +2.36318 0.0895204 +2.37494 0.0896415 +2.38669 0.0907075 +2.39845 0.0915222 +2.41021 0.0915689 +2.42197 0.0922712 +2.43372 0.0928633 +2.44548 0.0931878 +2.45724 0.0936606 +2.46899 0.0942707 +2.48075 0.0947179 +2.49251 0.0954846 +2.50426 0.0958096 +2.51602 0.0965343 +2.52778 0.0971573 +2.53954 0.0978119 +2.55129 0.0981204 +2.56305 0.0976562 +2.57481 0.09864 +2.58656 0.0990345 +2.59832 0.0995533 +2.61008 0.100065 +2.62184 0.100543 +2.63359 0.100792 +2.64535 0.10147 +2.65711 0.102049 +2.66886 0.102715 +2.68062 0.102511 +2.69238 0.10293 +2.70414 0.103393 +2.71589 0.104407 +2.72765 0.105022 +2.73941 0.105529 +2.75116 0.105455 +2.76292 0.10564 +2.77468 0.105579 +2.78644 0.106577 +2.79819 0.106893 +2.80995 0.107335 +2.82171 0.108253 +2.83346 0.108914 +2.84522 0.108964 +2.85698 0.110194 +2.86874 0.110509 +2.88049 0.11036 +2.89225 0.111333 +2.90401 0.111805 +2.91576 0.112437 +2.92752 0.112321 +2.93928 0.112701 +2.95104 0.112725 +2.96279 0.112938 +2.97455 0.113361 +2.98631 0.114321 +2.99806 0.114014 +3.00982 0.114458 +3.02158 0.1141 +3.03333 0.114521 +3.04509 0.114985 +3.05685 0.115352 +3.06861 0.115808 +3.08036 0.116266 +3.09212 0.11696 +3.10388 0.117504 +3.11563 0.117865 +3.12739 0.118365 +3.13915 0.119114 +3.15091 0.119575 +3.16266 0.120222 +3.17442 0.120619 +3.18618 0.120912 +3.19793 0.121492 +3.20969 0.121638 +3.22145 0.121786 +3.23321 0.121949 +3.24496 0.122043 +3.25672 0.123018 +3.26848 0.123082 +3.28023 0.123749 +3.29199 0.124178 +3.30375 0.124357 +3.31551 0.124323 +3.32726 0.12427 +3.33902 0.124581 +3.35078 0.124408 +3.36253 0.124788 +3.37429 0.125104 +3.38605 0.125543 +3.39781 0.125797 +3.40956 0.126767 +3.42132 0.126976 +3.43308 0.127364 +3.44483 0.127004 +3.45659 0.126959 +3.46835 0.127662 +3.48011 0.127841 +3.49186 0.12828 +3.50362 0.128936 +3.51538 0.129985 +3.52713 0.130187 +3.53889 0.130182 +3.55065 0.130836 +3.5624 0.131189 +3.57416 0.131055 +3.58592 0.131149 +3.59768 0.131545 +3.60943 0.132175 +3.62119 0.132233 +3.63295 0.132756 +3.6447 0.133424 +3.65646 0.133159 +3.66822 0.133404 +3.67998 0.133684 +3.69173 0.134017 +3.70349 0.133687 +3.71525 0.134317 +3.727 0.134819 +3.73876 0.135199 +3.75052 0.135249 +3.76228 0.135456 +3.77403 0.135549 +3.78579 0.135997 +3.79755 0.135732 +3.8093 0.136269 +3.82106 0.13711 +3.83282 0.137593 +3.84458 0.137868 +3.85633 0.138178 +3.86809 0.138438 +3.87985 0.138566 +3.8916 0.138947 +3.90336 0.139611 +3.91512 0.140051 +3.92688 0.140498 +3.93863 0.141065 +3.95039 0.141653 +3.96215 0.141918 +3.9739 0.142212 +3.98566 0.141553 +3.99742 0.142384 +4.00918 0.142818 +4.02093 0.143173 +4.03269 0.143261 +4.04445 0.143189 +4.0562 0.143319 +4.06796 0.143653 +4.07972 0.144126 +4.09147 0.144035 +4.10323 0.144218 +4.11499 0.144759 +4.12675 0.145667 +4.1385 0.145996 +4.15026 0.146156 +4.16202 0.145976 +4.17377 0.146107 +4.18553 0.146553 +4.19729 0.146554 +4.20905 0.146834 +4.2208 0.1475 +4.23256 0.147685 +4.24432 0.148243 +4.25607 0.14851 +4.26783 0.148729 +4.27959 0.14901 +4.29135 0.149621 +4.3031 0.149641 +4.31486 0.150285 +4.32662 0.150614 +4.33837 0.150961 +4.35013 0.151312 +4.36189 0.151707 +4.37365 0.151693 +4.3854 0.15215 +4.39716 0.15196 +4.40892 0.152161 +4.42067 0.151667 +4.43243 0.152347 +4.44419 0.152713 +4.45595 0.152937 +4.4677 0.152832 +4.47946 0.153111 +4.49122 0.153278 +4.50297 0.153522 +4.51473 0.153523 +4.52649 0.153853 +4.53825 0.154447 +4.55 0.154959 +4.56176 0.154775 +4.57352 0.155336 +4.58527 0.155579 +4.59703 0.155891 +4.60879 0.155637 +4.62055 0.15561 +4.6323 0.155696 +4.64406 0.156151 +4.65582 0.156349 +4.66757 0.15633 +4.67933 0.156942 +4.69109 0.156751 +4.70284 0.157023 +4.7146 0.157047 +4.72636 0.157673 +4.73812 0.158023 +4.74987 0.158659 +4.76163 0.158389 +4.77339 0.158663 +4.78514 0.158655 +4.7969 0.158945 +4.80866 0.159173 +4.82042 0.158866 +4.83217 0.159027 +4.84393 0.159648 +4.85569 0.159573 +4.86744 0.1598 +4.8792 0.159845 +4.89096 0.160033 +4.90272 0.160192 +4.91447 0.159968 +4.92623 0.159939 +4.93799 0.160363 +4.94974 0.16046 +4.9615 0.160326 +4.97326 0.161051 +4.98502 0.161025 +4.99677 0.160882 +5.00853 0.160826 +5.02029 0.161099 +5.03204 0.161115 +5.0438 0.160725 +5.05556 0.161153 +5.06732 0.161242 +5.07907 0.161436 +5.09083 0.161482 +5.10259 0.16184 +5.11434 0.162075 +5.1261 0.162167 +5.13786 0.161859 +5.14962 0.161937 +5.16137 0.162184 +5.17313 0.1619 +5.18489 0.16186 +5.19664 0.162472 +5.2084 0.163199 +5.22016 0.162631 +5.23191 0.162502 +5.24367 0.163014 +5.25543 0.1633 +5.26719 0.163724 +5.27894 0.163694 +5.2907 0.16372 +5.30246 0.164237 +5.31421 0.164591 +5.32597 0.164279 +5.33773 0.164305 +5.34949 0.16405 +5.36124 0.164393 +5.373 0.164711 +5.38476 0.164969 +5.39651 0.165158 +5.40827 0.164957 +5.42003 0.16513 +5.43179 0.165211 +5.44354 0.165142 +5.4553 0.165017 +5.46706 0.164862 +5.47881 0.164634 +5.49057 0.164719 +5.50233 0.16448 +5.51409 0.164816 +5.52584 0.164974 +5.5376 0.16502 +5.54936 0.165423 +5.56111 0.165869 +5.57287 0.165614 +5.58463 0.165446 +5.59639 0.165564 +5.60814 0.166197 +5.6199 0.166135 +5.63166 0.166257 +5.64341 0.165805 +5.65517 0.165922 +5.66693 0.165757 +5.67869 0.166057 +5.69044 0.166469 +5.7022 0.166532 +5.71396 0.166969 +5.72571 0.167578 +5.73747 0.167308 +5.74923 0.167339 +5.76098 0.167512 +5.77274 0.16813 +5.7845 0.168667 +5.79626 0.168144 +5.80801 0.168894 +5.81977 0.168927 +5.83153 0.168875 +5.84328 0.168867 +5.85504 0.169038 +5.8668 0.169717 +5.87856 0.170112 +5.89031 0.170015 +5.90207 0.169464 +5.91383 0.169585 +5.92558 0.169995 +5.93734 0.170189 +5.9491 0.169749 +5.96086 0.170148 +5.97261 0.170965 +5.98437 0.171272 +5.99613 0.171564 +6.00788 0.172007 +6.01964 0.172061 +6.0314 0.172341 +6.04316 0.171931 +6.05491 0.171797 +6.06667 0.1723 +6.07843 0.172207 +6.09018 0.172123 +6.10194 0.171692 +6.1137 0.171817 +6.12546 0.171134 +6.13721 0.171343 +6.14897 0.171538 +6.16073 0.172338 +6.17248 0.172356 +6.18424 0.172341 +6.196 0.172675 +6.20776 0.172795 +6.21951 0.172732 +6.23127 0.172898 +6.24303 0.172995 +6.25478 0.173399 +6.26654 0.173608 +6.2783 0.173239 +6.29005 0.173218 +6.30181 0.173561 +6.31357 0.173688 +6.32533 0.173876 +6.33708 0.174149 +6.34884 0.174419 +6.3606 0.174181 +6.37235 0.174229 +6.38411 0.174668 +6.39587 0.17449 +6.40763 0.174708 +6.41938 0.174658 +6.43114 0.174355 +6.4429 0.174704 +6.45465 0.174693 +6.46641 0.174574 +6.47817 0.174552 +6.48993 0.174652 +6.50168 0.174347 +6.51344 0.174288 +6.5252 0.174556 +6.53695 0.17433 +6.54871 0.174074 +6.56047 0.174085 +6.57223 0.174389 +6.58398 0.174927 +6.59574 0.174386 +6.6075 0.173671 +6.61925 0.173539 +6.63101 0.173872 +6.64277 0.174282 +6.65453 0.174286 +6.66628 0.174805 +6.67804 0.174381 +6.6898 0.174006 +6.70155 0.174436 +6.71331 0.174791 +6.72507 0.174525 +6.73683 0.174501 +6.74858 0.17453 +6.76034 0.175178 +6.7721 0.175054 +6.78385 0.174868 +6.79561 0.174367 +6.80737 0.174977 +6.81912 0.174882 +6.83088 0.175178 +6.84264 0.175337 +6.8544 0.175045 +6.86615 0.174801 +6.87791 0.175144 +6.88967 0.175195 +6.90142 0.175539 +6.91318 0.175363 +6.92494 0.175253 +6.9367 0.175743 +6.94845 0.176675 +6.96021 0.176104 +6.97197 0.176342 +6.98372 0.176225 +6.99548 0.176376 +7.00724 0.176107 +7.019 0.176761 +7.03075 0.176518 +7.04251 0.176461 +7.05427 0.176524 +7.06602 0.176566 +7.07778 0.176985 +7.08954 0.176674 +7.1013 0.176591 +7.11305 0.176194 +7.12481 0.176621 +7.13657 0.176777 +7.14832 0.177081 +7.16008 0.177294 +7.17184 0.177554 +7.1836 0.17748 +7.19535 0.177823 +7.20711 0.178245 +7.21887 0.178126 +7.23062 0.178445 +7.24238 0.178251 +7.25414 0.178528 +7.2659 0.178418 +7.27765 0.1781 +7.28941 0.177867 +7.30117 0.178034 +7.31292 0.178596 +7.32468 0.178543 +7.33644 0.178841 +7.34819 0.178928 +7.35995 0.178483 +7.37171 0.178301 +7.38347 0.178481 +7.39522 0.178495 +7.40698 0.178244 +7.41874 0.178496 +7.43049 0.178064 +7.44225 0.178323 +7.45401 0.178361 +7.46577 0.178085 +7.47752 0.177529 +7.48928 0.177434 +7.50104 0.177383 +7.51279 0.177373 +7.52455 0.177603 +7.53631 0.177755 +7.54807 0.177627 +7.55982 0.177272 +7.57158 0.17734 +7.58334 0.176723 +7.59509 0.177172 +7.60685 0.177389 +7.61861 0.177336 +7.63037 0.17761 +7.64212 0.177673 +7.65388 0.177726 +7.66564 0.178096 +7.67739 0.178386 +7.68915 0.178833 +7.70091 0.179217 +7.71267 0.179226 +7.72442 0.179408 +7.73618 0.179101 +7.74794 0.179155 +7.75969 0.179036 +7.77145 0.179098 +7.78321 0.179149 +7.79497 0.178655 +7.80672 0.178292 +7.81848 0.177905 +7.83024 0.177969 +7.84199 0.177987 +7.85375 0.178368 +7.86551 0.178783 +7.87727 0.178615 +7.88902 0.178732 +7.90078 0.178952 +7.91254 0.178754 +7.92429 0.178685 +7.93605 0.178821 +7.94781 0.178866 +7.95956 0.17873 +7.97132 0.178858 +7.98308 0.179197 +7.99484 0.179162 +8.00659 0.179429 +8.01835 0.179529 +8.03011 0.179479 +8.04186 0.179314 +8.05362 0.179068 +8.06538 0.178865 +8.07714 0.178468 +8.08889 0.179132 +8.10065 0.179375 +8.11241 0.179497 +8.12416 0.179297 +8.13592 0.180106 +8.14768 0.18047 +8.15944 0.180725 +8.17119 0.180432 +8.18295 0.180366 +8.19471 0.180073 +8.20646 0.180377 +8.21822 0.180381 +8.22998 0.180441 +8.24174 0.180306 +8.25349 0.18071 +8.26525 0.180706 +8.27701 0.180536 +8.28876 0.180623 +8.30052 0.180381 +8.31228 0.18068 +8.32404 0.180684 +8.33579 0.180544 +8.34755 0.180587 +8.35931 0.180764 +8.37106 0.180349 +8.38282 0.180441 +8.39458 0.18036 +8.40634 0.180849 +8.41809 0.181135 +8.42985 0.181019 +8.44161 0.181407 +8.45336 0.18113 +8.46512 0.181255 +8.47688 0.181034 +8.48863 0.181294 +8.50039 0.181171 +8.51215 0.181127 +8.52391 0.181545 +8.53566 0.181597 +8.54742 0.181956 +8.55918 0.181321 +8.57093 0.181597 +8.58269 0.181666 +8.59445 0.181872 +8.60621 0.181776 +8.61796 0.181852 +8.62972 0.181304 +8.64148 0.181525 +8.65323 0.181392 +8.66499 0.181658 +8.67675 0.181248 +8.68851 0.181334 +8.70026 0.181721 +8.71202 0.181756 +8.72378 0.181652 +8.73553 0.181341 +8.74729 0.181603 +8.75905 0.181292 +8.77081 0.181144 +8.78256 0.180703 +8.79432 0.1803 +8.80608 0.180472 +8.81783 0.180394 +8.82959 0.180589 +8.84135 0.180617 +8.85311 0.180593 +8.86486 0.180289 +8.87662 0.179897 +8.88838 0.18062 +8.90013 0.180617 +8.91189 0.18147 +8.92365 0.18219 +8.93541 0.181931 +8.94716 0.181453 +8.95892 0.18134 +8.97068 0.181217 +8.98243 0.180997 +8.99419 0.180937 +9.00595 0.18157 +9.0177 0.181696 +9.02946 0.181806 +9.04122 0.181723 +9.05298 0.182011 +9.06473 0.181923 +9.07649 0.182183 +9.08825 0.182283 +9.1 0.182408 +9.11176 0.1829 +9.12352 0.183057 +9.13528 0.183122 +9.14703 0.183127 +9.15879 0.182952 +9.17055 0.182216 +9.1823 0.182509 +9.19406 0.181904 +9.20582 0.182129 +9.21758 0.182502 +9.22933 0.18299 +9.24109 0.183099 +9.25285 0.183572 +9.2646 0.18334 +9.27636 0.183056 +9.28812 0.183185 +9.29988 0.183701 +9.31163 0.183834 +9.32339 0.183711 +9.33515 0.184367 +9.3469 0.18423 +9.35866 0.184396 +9.37042 0.184836 +9.38218 0.185039 +9.39393 0.184872 +9.40569 0.184745 +9.41745 0.184242 +9.4292 0.183871 +9.44096 0.184218 +9.45272 0.184447 +9.46448 0.184376 +9.47623 0.18359 +9.48799 0.18388 +9.49975 0.183914 +9.5115 0.183889 +9.52326 0.184183 +9.53502 0.184542 +9.54677 0.184309 +9.55853 0.184264 +9.57029 0.184336 +9.58205 0.1843 +9.5938 0.184299 +9.60556 0.184491 +9.61732 0.184295 +9.62907 0.183574 +9.64083 0.184193 +9.65259 0.184032 +9.66435 0.184174 +9.6761 0.184146 +9.68786 0.184928 +9.69962 0.184728 +9.71137 0.184548 +9.72313 0.184254 +9.73489 0.18416 +9.74665 0.183955 +9.7584 0.183677 +9.77016 0.183567 +9.78192 0.183214 +9.79367 0.183502 +9.80543 0.183519 +9.81719 0.183418 +9.82895 0.18293 +9.8407 0.18289 +9.85246 0.182829 +9.86422 0.18256 +9.87597 0.182613 +9.88773 0.182449 +9.89949 0.182465 +9.91125 0.182792 +9.923 0.182746 +9.93476 0.182873 +9.94652 0.182428 +9.95827 0.182062 +9.97003 0.182359 +9.98179 0.182576 +9.99355 0.182192 +10.0053 0.181576 +10.0171 0.181928 +10.0288 0.18203 +10.0406 0.182 +10.0523 0.18218 +10.0641 0.182769 +10.0758 0.182423 +10.0876 0.182665 +10.0994 0.18318 +10.1111 0.183856 +10.1229 0.183517 +10.1346 0.183886 +10.1464 0.1838 +10.1581 0.182964 +10.1699 0.182908 +10.1817 0.182631 +10.1934 0.182076 +10.2052 0.182251 +10.2169 0.182528 +10.2287 0.182993 +10.2404 0.183337 +10.2522 0.182802 +10.264 0.183188 +10.2757 0.182901 +10.2875 0.182821 +10.2992 0.183295 +10.311 0.183385 +10.3227 0.183363 +10.3345 0.18311 +10.3463 0.183079 +10.358 0.182467 +10.3698 0.182826 +10.3815 0.18285 +10.3933 0.182817 +10.405 0.182956 +10.4168 0.183653 +10.4286 0.183362 +10.4403 0.183277 +10.4521 0.183379 +10.4638 0.183664 +10.4756 0.183616 +10.4873 0.18349 +10.4991 0.18304 +10.5109 0.182706 +10.5226 0.182734 +10.5344 0.183141 +10.5461 0.183322 +10.5579 0.184015 +10.5696 0.184005 +10.5814 0.184237 +10.5932 0.18397 +10.6049 0.184307 +10.6167 0.184612 +10.6284 0.184716 +10.6402 0.184881 +10.6519 0.184493 +10.6637 0.184077 +10.6755 0.18385 +10.6872 0.183704 +10.699 0.183698 +10.7107 0.184006 +10.7225 0.184505 +10.7342 0.18426 +10.746 0.184139 +10.7578 0.184114 +10.7695 0.184085 +10.7813 0.184637 +10.793 0.185033 +10.8048 0.184614 +10.8165 0.184137 +10.8283 0.184114 +10.8401 0.184419 +10.8518 0.184231 +10.8636 0.184389 +10.8753 0.184675 +10.8871 0.184869 +10.8988 0.184947 +10.9106 0.184297 +10.9224 0.18409 +10.9341 0.184485 +10.9459 0.184209 +10.9576 0.185055 +10.9694 0.185176 +10.9811 0.185605 +10.9929 0.185514 +11.0047 0.185712 +11.0164 0.186196 +11.0282 0.185864 +11.0399 0.186134 +11.0517 0.185696 +11.0634 0.186018 +11.0752 0.186239 +11.087 0.186298 +11.0987 0.186626 +11.1105 0.18633 +11.1222 0.186347 +11.134 0.186416 +11.1457 0.186592 +11.1575 0.186736 +11.1693 0.186718 +11.181 0.186779 +11.1928 0.187252 +11.2045 0.187279 +11.2163 0.186898 +11.228 0.186772 +11.2398 0.186916 +11.2516 0.186908 +11.2633 0.186449 +11.2751 0.186522 +11.2868 0.1861 +11.2986 0.186597 +11.3103 0.187288 +11.3221 0.187267 +11.3339 0.187256 +11.3456 0.187691 +11.3574 0.187805 +11.3691 0.187514 +11.3809 0.187112 +11.3926 0.187442 +11.4044 0.187657 +11.4162 0.187724 +11.4279 0.187878 +11.4397 0.188245 +11.4514 0.188244 +11.4632 0.188607 +11.4749 0.188898 +11.4867 0.189032 +11.4985 0.189203 +11.5102 0.189014 +11.522 0.188955 +11.5337 0.188944 +11.5455 0.188389 +11.5572 0.188048 +11.569 0.188248 +11.5808 0.188285 +11.5925 0.188236 +11.6043 0.188682 +11.616 0.188947 +11.6278 0.189158 +11.6395 0.189437 +11.6513 0.189298 +11.6631 0.188899 +11.6748 0.188616 +11.6866 0.18884 +11.6983 0.188888 +11.7101 0.189022 +11.7218 0.189556 +11.7336 0.189449 +11.7454 0.189822 +11.7571 0.189231 +11.7689 0.189051 +11.7806 0.189144 +11.7924 0.188927 +11.8041 0.188731 +11.8159 0.188436 +11.8277 0.189372 +11.8394 0.189472 +11.8512 0.189041 +11.8629 0.188443 +11.8747 0.188845 +11.8864 0.189389 +11.8982 0.189085 +11.91 0.188925 +11.9217 0.188512 +11.9335 0.188501 +11.9452 0.189518 +11.957 0.18961 +11.9687 0.189471 +11.9805 0.189891 +11.9923 0.189624 +12.004 0.189864 +12.0158 0.189444 +12.0275 0.18998 +12.0393 0.189412 +12.051 0.189593 +12.0628 0.189749 +12.0746 0.189982 +12.0863 0.189614 +12.0981 0.189419 +12.1098 0.189531 +12.1216 0.189538 +12.1333 0.190032 +12.1451 0.189978 +12.1569 0.189312 +12.1686 0.189208 +12.1804 0.188712 +12.1921 0.189363 +12.2039 0.189439 +12.2156 0.189656 +12.2274 0.18988 +12.2392 0.190027 +12.2509 0.190086 +12.2627 0.189888 +12.2744 0.190589 +12.2862 0.19066 +12.2979 0.190965 +12.3097 0.190446 +12.3215 0.190149 +12.3332 0.189563 +12.345 0.189799 +12.3567 0.190401 +12.3685 0.190428 +12.3802 0.190497 +12.392 0.190436 +12.4038 0.190783 +12.4155 0.191193 +12.4273 0.191553 +12.439 0.191591 +12.4508 0.191279 +12.4625 0.191784 +12.4743 0.191662 +12.4861 0.19142 +12.4978 0.191361 +12.5096 0.191642 +12.5213 0.191358 +12.5331 0.191113 +12.5448 0.191208 +12.5566 0.191717 +12.5684 0.191679 +12.5801 0.191228 +12.5919 0.191184 +12.6036 0.191012 +12.6154 0.190932 +12.6271 0.191226 +12.6389 0.19161 +12.6507 0.191681 +12.6624 0.191672 +12.6742 0.19133 +12.6859 0.191363 +12.6977 0.192075 +12.7094 0.191998 +12.7212 0.192546 +12.733 0.192109 +12.7447 0.191709 +12.7565 0.190883 +12.7682 0.191499 +12.78 0.191139 +12.7917 0.190692 +12.8035 0.190755 +12.8153 0.190766 +12.827 0.190482 +12.8388 0.190406 +12.8505 0.190384 +12.8623 0.190555 +12.874 0.190851 +12.8858 0.19078 +12.8976 0.190339 +12.9093 0.190524 +12.9211 0.190514 +12.9328 0.190426 +12.9446 0.19038 +12.9563 0.190154 +12.9681 0.189923 +12.9799 0.190584 +12.9916 0.189972 +13.0034 0.189925 +13.0151 0.189643 +13.0269 0.189699 +13.0386 0.189425 +13.0504 0.189627 +13.0622 0.189897 +13.0739 0.189842 +13.0857 0.19034 +13.0974 0.190385 +13.1092 0.19078 +13.1209 0.190603 +13.1327 0.190784 +13.1445 0.190825 +13.1562 0.190362 +13.168 0.190425 +13.1797 0.190086 +13.1915 0.189973 +13.2032 0.189999 +13.215 0.190716 +13.2268 0.190415 +13.2385 0.190246 +13.2503 0.189956 +13.262 0.189591 +13.2738 0.189857 +13.2855 0.190488 +13.2973 0.190371 +13.3091 0.190539 +13.3208 0.190312 +13.3326 0.18986 +13.3443 0.189574 +13.3561 0.189711 +13.3678 0.189685 +13.3796 0.189566 +13.3914 0.189691 +13.4031 0.189979 +13.4149 0.189665 +13.4266 0.190213 +13.4384 0.190521 +13.4501 0.190465 +13.4619 0.190521 +13.4737 0.1903 +13.4854 0.190283 +13.4972 0.190418 +13.5089 0.190294 +13.5207 0.190445 +13.5324 0.190336 +13.5442 0.19021 +13.556 0.190657 +13.5677 0.190511 +13.5795 0.190243 +13.5912 0.190342 +13.603 0.190427 +13.6147 0.190452 +13.6265 0.190651 +13.6382 0.190859 +13.65 0.19029 +13.6618 0.190244 +13.6735 0.190152 +13.6853 0.189706 +13.697 0.189575 +13.7088 0.189722 +13.7205 0.189902 +13.7323 0.18976 +13.7441 0.189721 +13.7558 0.189689 +13.7676 0.18983 +13.7793 0.189889 +13.7911 0.189766 +13.8028 0.189776 +13.8146 0.189858 +13.8264 0.190118 +13.8381 0.189994 +13.8499 0.189728 +13.8616 0.190037 +13.8734 0.189899 +13.8851 0.19025 +13.8969 0.190019 +13.9087 0.189957 +13.9204 0.189871 +13.9322 0.189607 +13.9439 0.189077 +13.9557 0.188809 +13.9674 0.188825 +13.9792 0.188784 +13.991 0.189513 +14.0027 0.189283 +14.0145 0.189343 +14.0262 0.189013 +14.038 0.188764 +14.0497 0.188747 +14.0615 0.18857 +14.0733 0.188689 +14.085 0.189015 +14.0968 0.189034 +14.1085 0.189942 +14.1203 0.190726 +14.132 0.19043 +14.1438 0.189948 +14.1556 0.190258 +14.1673 0.189586 +14.1791 0.189476 +14.1908 0.188992 +14.2026 0.189891 +14.2143 0.189608 +14.2261 0.189614 +14.2379 0.189539 +14.2496 0.188826 +14.2614 0.189354 +14.2731 0.189979 +14.2849 0.190004 +14.2966 0.18992 +14.3084 0.190302 +14.3202 0.190129 +14.3319 0.190214 +14.3437 0.190138 +14.3554 0.190618 +14.3672 0.19091 +14.3789 0.190345 +14.3907 0.19008 +14.4025 0.190422 +14.4142 0.189816 +14.426 0.189419 +14.4377 0.189308 +14.4495 0.188497 +14.4612 0.188589 +14.473 0.188271 +14.4848 0.188827 +14.4965 0.188987 +14.5083 0.188638 +14.52 0.188648 +14.5318 0.189158 +14.5435 0.189459 +14.5553 0.189513 +14.5671 0.189953 +14.5788 0.190183 +14.5906 0.190415 +14.6023 0.190836 +14.6141 0.190593 +14.6258 0.190586 +14.6376 0.190555 +14.6494 0.190344 +14.6611 0.190447 +14.6729 0.190305 +14.6846 0.190033 +14.6964 0.190279 +14.7081 0.190224 +14.7199 0.190191 +14.7317 0.190219 +14.7434 0.190064 +14.7552 0.190225 +14.7669 0.190679 +14.7787 0.191612 +14.7904 0.19159 +14.8022 0.190811 +14.814 0.190449 +14.8257 0.190229 +14.8375 0.19143 +14.8492 0.191939 +14.861 0.191635 +14.8727 0.19197 +14.8845 0.191622 +14.8963 0.192088 +14.908 0.193091 +14.9198 0.193338 +14.9315 0.193381 +14.9433 0.193627 +14.955 0.193349 +14.9668 0.19322 +14.9786 0.192829 +15 0.193147 +& +@target G0.S1 +@type xy +0 0.00112976 +0.0117571 0.00127777 +0.0235142 0.00152523 +0.0352713 0.00123996 +0.0470284 0.00115881 +0.0587856 0.0017035 +0.0705427 0.00167152 +0.0822998 0.00145227 +0.0940569 0.000743014 +0.105814 0.000177628 +0.117571 0.000481564 +0.129328 -0.000284655 +0.141085 -0.000639051 +0.152842 -0.000627717 +0.1646 -0.00154803 +0.176357 -0.00178403 +0.188114 -0.00182344 +0.199871 -0.00227489 +0.211628 -0.00222383 +0.223385 -0.00278884 +0.235142 -0.00346873 +0.246899 -0.00342105 +0.258656 -0.00357288 +0.270414 -0.00390954 +0.282171 -0.00436357 +0.293928 -0.00480353 +0.305685 -0.00506486 +0.317442 -0.00491676 +0.329199 -0.00562012 +0.340956 -0.00556946 +0.352713 -0.00596947 +0.36447 -0.00620967 +0.376228 -0.00651909 +0.387985 -0.00725741 +0.399742 -0.00759559 +0.411499 -0.00739833 +0.423256 -0.00750117 +0.435013 -0.00775817 +0.44677 -0.00803758 +0.458527 -0.00822312 +0.470284 -0.00803935 +0.482042 -0.00875077 +0.493799 -0.00946084 +0.505556 -0.0098608 +0.517313 -0.00991891 +0.52907 -0.0104786 +0.540827 -0.0113454 +0.552584 -0.0119259 +0.564341 -0.0123429 +0.576098 -0.0135831 +0.587856 -0.0141151 +0.599613 -0.0147905 +0.61137 -0.0152918 +0.623127 -0.0159866 +0.634884 -0.0165399 +0.646641 -0.0168499 +0.658398 -0.0175036 +0.670155 -0.0185835 +0.681912 -0.0190485 +0.69367 -0.0188871 +0.705427 -0.0191338 +0.717184 -0.0193349 +0.728941 -0.0202703 +0.740698 -0.0207639 +0.752455 -0.0216353 +0.764212 -0.0223119 +0.775969 -0.0226329 +0.787727 -0.0227274 +0.799484 -0.0228592 +0.811241 -0.0230622 +0.822998 -0.0231498 +0.834755 -0.0230703 +0.846512 -0.0235153 +0.858269 -0.0243508 +0.870026 -0.0252219 +0.881783 -0.0258928 +0.893541 -0.0259029 +0.905298 -0.0259643 +0.917055 -0.026446 +0.928812 -0.0273631 +0.940569 -0.0276609 +0.952326 -0.0283742 +0.964083 -0.028085 +0.97584 -0.0282818 +0.987597 -0.0289305 +0.999355 -0.029032 +1.01111 -0.0290374 +1.02287 -0.029584 +1.03463 -0.0297408 +1.04638 -0.0305702 +1.05814 -0.0309314 +1.0699 -0.0313013 +1.08165 -0.031982 +1.09341 -0.0321181 +1.10517 -0.0327856 +1.11693 -0.0332602 +1.12868 -0.0334228 +1.14044 -0.0331573 +1.1522 -0.0332078 +1.16395 -0.034104 +1.17571 -0.034667 +1.18747 -0.0351633 +1.19923 -0.0359329 +1.21098 -0.0363309 +1.22274 -0.0368583 +1.2345 -0.0368957 +1.24625 -0.03768 +1.25801 -0.038447 +1.26977 -0.0390948 +1.28153 -0.0396509 +1.29328 -0.0396536 +1.30504 -0.0401154 +1.3168 -0.0402062 +1.32855 -0.0406267 +1.34031 -0.0407986 +1.35207 -0.0411488 +1.36382 -0.0415452 +1.37558 -0.0416877 +1.38734 -0.0421146 +1.3991 -0.0429046 +1.41085 -0.0433864 +1.42261 -0.0436713 +1.43437 -0.0440752 +1.44612 -0.0447264 +1.45788 -0.0450913 +1.46964 -0.0456771 +1.4814 -0.0466282 +1.49315 -0.0472642 +1.50491 -0.0474315 +1.51667 -0.0474413 +1.52842 -0.0475867 +1.54018 -0.0481927 +1.55194 -0.0490521 +1.5637 -0.0498897 +1.57545 -0.0507296 +1.58721 -0.051258 +1.59897 -0.0519518 +1.61072 -0.0523608 +1.62248 -0.0529687 +1.63424 -0.0535613 +1.646 -0.0539088 +1.65775 -0.0543267 +1.66951 -0.0550566 +1.68127 -0.0557289 +1.69302 -0.0561843 +1.70478 -0.0563455 +1.71654 -0.0566583 +1.7283 -0.0568894 +1.74005 -0.0582114 +1.75181 -0.0588216 +1.76357 -0.0588906 +1.77532 -0.0594166 +1.78708 -0.0597469 +1.79884 -0.0599538 +1.8106 -0.0599876 +1.82235 -0.0606934 +1.83411 -0.061132 +1.84587 -0.0607957 +1.85762 -0.0610329 +1.86938 -0.0615721 +1.88114 -0.0622759 +1.8929 -0.0627471 +1.90465 -0.0634002 +1.91641 -0.0637166 +1.92817 -0.0648059 +1.93992 -0.0646044 +1.95168 -0.0646365 +1.96344 -0.0654426 +1.97519 -0.0656544 +1.98695 -0.0658237 +1.99871 -0.0664801 +2.01047 -0.0665141 +2.02222 -0.0667419 +2.03398 -0.0673244 +2.04574 -0.0674834 +2.05749 -0.068278 +2.06925 -0.0683035 +2.08101 -0.0683122 +2.09277 -0.0682249 +2.10452 -0.0685257 +2.11628 -0.0689504 +2.12804 -0.0695204 +2.13979 -0.0697013 +2.15155 -0.0702932 +2.16331 -0.070781 +2.17507 -0.0711914 +2.18682 -0.0714091 +2.19858 -0.0716815 +2.21034 -0.0724751 +2.22209 -0.0727336 +2.23385 -0.0726207 +2.24561 -0.0735418 +2.25737 -0.0738448 +2.26912 -0.074281 +2.28088 -0.0740672 +2.29264 -0.0741937 +2.30439 -0.0746869 +2.31615 -0.0744191 +2.32791 -0.0750498 +2.33967 -0.0748651 +2.35142 -0.0750677 +2.36318 -0.075692 +2.37494 -0.0761134 +2.38669 -0.0763026 +2.39845 -0.0767543 +2.41021 -0.0770171 +2.42197 -0.07727 +2.43372 -0.0777183 +2.44548 -0.0781941 +2.45724 -0.0786045 +2.46899 -0.0793317 +2.48075 -0.0793483 +2.49251 -0.0799144 +2.50426 -0.0804557 +2.51602 -0.0808472 +2.52778 -0.0808961 +2.53954 -0.0814055 +2.55129 -0.0814811 +2.56305 -0.0811434 +2.57481 -0.0814669 +2.58656 -0.0818501 +2.59832 -0.082319 +2.61008 -0.0828396 +2.62184 -0.0833993 +2.63359 -0.0834094 +2.64535 -0.0837198 +2.65711 -0.0838239 +2.66886 -0.0843502 +2.68062 -0.0845492 +2.69238 -0.0849015 +2.70414 -0.0853932 +2.71589 -0.0857579 +2.72765 -0.0863036 +2.73941 -0.0866024 +2.75116 -0.0869274 +2.76292 -0.0869217 +2.77468 -0.0867231 +2.78644 -0.0873753 +2.79819 -0.0878986 +2.80995 -0.0883863 +2.82171 -0.0889081 +2.83346 -0.0893063 +2.84522 -0.0896378 +2.85698 -0.0901664 +2.86874 -0.0900572 +2.88049 -0.0896059 +2.89225 -0.0900162 +2.90401 -0.0901865 +2.91576 -0.0904116 +2.92752 -0.0906734 +2.93928 -0.0909826 +2.95104 -0.0907189 +2.96279 -0.091129 +2.97455 -0.0913643 +2.98631 -0.0914904 +2.99806 -0.0913457 +3.00982 -0.091446 +3.02158 -0.0917711 +3.03333 -0.0919522 +3.04509 -0.0919672 +3.05685 -0.0917617 +3.06861 -0.092374 +3.08036 -0.0927883 +3.09212 -0.0931261 +3.10388 -0.0933499 +3.11563 -0.0937396 +3.12739 -0.0944386 +3.13915 -0.095099 +3.15091 -0.0952181 +3.16266 -0.0956195 +3.17442 -0.0956726 +3.18618 -0.0959049 +3.19793 -0.0961775 +3.20969 -0.0969616 +3.22145 -0.0971299 +3.23321 -0.0971954 +3.24496 -0.0974913 +3.25672 -0.0982008 +3.26848 -0.0984967 +3.28023 -0.0988903 +3.29199 -0.0989567 +3.30375 -0.0988656 +3.31551 -0.0986356 +3.32726 -0.0983088 +3.33902 -0.0983037 +3.35078 -0.0985623 +3.36253 -0.0992255 +3.37429 -0.0996188 +3.38605 -0.100026 +3.39781 -0.100362 +3.40956 -0.100438 +3.42132 -0.100528 +3.43308 -0.100601 +3.44483 -0.10016 +3.45659 -0.099973 +3.46835 -0.100399 +3.48011 -0.100678 +3.49186 -0.101296 +3.50362 -0.10144 +3.51538 -0.10197 +3.52713 -0.102181 +3.53889 -0.102079 +3.55065 -0.10238 +3.5624 -0.102927 +3.57416 -0.10278 +3.58592 -0.10313 +3.59768 -0.103297 +3.60943 -0.103706 +3.62119 -0.104005 +3.63295 -0.104241 +3.6447 -0.104378 +3.65646 -0.10442 +3.66822 -0.104972 +3.67998 -0.105286 +3.69173 -0.105821 +3.70349 -0.105516 +3.71525 -0.105921 +3.727 -0.106222 +3.73876 -0.106105 +3.75052 -0.106164 +3.76228 -0.106003 +3.77403 -0.106238 +3.78579 -0.106471 +3.79755 -0.10641 +3.8093 -0.106546 +3.82106 -0.107154 +3.83282 -0.107446 +3.84458 -0.107495 +3.85633 -0.10712 +3.86809 -0.10697 +3.87985 -0.106832 +3.8916 -0.106963 +3.90336 -0.10742 +3.91512 -0.107675 +3.92688 -0.107996 +3.93863 -0.108003 +3.95039 -0.108396 +3.96215 -0.108831 +3.9739 -0.109088 +3.98566 -0.108438 +3.99742 -0.108926 +4.00918 -0.109118 +4.02093 -0.109106 +4.03269 -0.10935 +4.04445 -0.10937 +4.0562 -0.109333 +4.06796 -0.109056 +4.07972 -0.109181 +4.09147 -0.109434 +4.10323 -0.109474 +4.11499 -0.1097 +4.12675 -0.110499 +4.1385 -0.110655 +4.15026 -0.110793 +4.16202 -0.110438 +4.17377 -0.110627 +4.18553 -0.11051 +4.19729 -0.110631 +4.20905 -0.110904 +4.2208 -0.111166 +4.23256 -0.110915 +4.24432 -0.111165 +4.25607 -0.111278 +4.26783 -0.111374 +4.27959 -0.111182 +4.29135 -0.111836 +4.3031 -0.111835 +4.31486 -0.112246 +4.32662 -0.112569 +4.33837 -0.112878 +4.35013 -0.113202 +4.36189 -0.113279 +4.37365 -0.113471 +4.3854 -0.113468 +4.39716 -0.112969 +4.40892 -0.113079 +4.42067 -0.112806 +4.43243 -0.113003 +4.44419 -0.113525 +4.45595 -0.113566 +4.4677 -0.113656 +4.47946 -0.113688 +4.49122 -0.113488 +4.50297 -0.113649 +4.51473 -0.11361 +4.52649 -0.113552 +4.53825 -0.113675 +4.55 -0.113626 +4.56176 -0.113472 +4.57352 -0.113722 +4.58527 -0.113587 +4.59703 -0.113464 +4.60879 -0.113784 +4.62055 -0.113664 +4.6323 -0.114015 +4.64406 -0.114084 +4.65582 -0.11426 +4.66757 -0.114304 +4.67933 -0.1144 +4.69109 -0.114341 +4.70284 -0.114543 +4.7146 -0.114456 +4.72636 -0.114673 +4.73812 -0.114934 +4.74987 -0.115009 +4.76163 -0.115491 +4.77339 -0.115269 +4.78514 -0.115335 +4.7969 -0.115205 +4.80866 -0.115022 +4.82042 -0.114865 +4.83217 -0.114806 +4.84393 -0.114515 +4.85569 -0.114661 +4.86744 -0.11518 +4.8792 -0.115339 +4.89096 -0.115535 +4.90272 -0.115613 +4.91447 -0.115592 +4.92623 -0.115673 +4.93799 -0.11584 +4.94974 -0.115566 +4.9615 -0.115056 +4.97326 -0.115353 +4.98502 -0.115605 +4.99677 -0.11573 +5.00853 -0.115544 +5.02029 -0.115646 +5.03204 -0.115908 +5.0438 -0.1157 +5.05556 -0.115999 +5.06732 -0.115791 +5.07907 -0.115873 +5.09083 -0.115891 +5.10259 -0.115871 +5.11434 -0.115733 +5.1261 -0.115705 +5.13786 -0.115767 +5.14962 -0.115701 +5.16137 -0.116066 +5.17313 -0.116294 +5.18489 -0.116339 +5.19664 -0.116723 +5.2084 -0.117165 +5.22016 -0.116875 +5.23191 -0.117192 +5.24367 -0.117409 +5.25543 -0.117347 +5.26719 -0.117507 +5.27894 -0.11789 +5.2907 -0.118174 +5.30246 -0.11854 +5.31421 -0.118788 +5.32597 -0.118584 +5.33773 -0.118469 +5.34949 -0.118367 +5.36124 -0.118394 +5.373 -0.118501 +5.38476 -0.118716 +5.39651 -0.118567 +5.40827 -0.118275 +5.42003 -0.118357 +5.43179 -0.118187 +5.44354 -0.11834 +5.4553 -0.118589 +5.46706 -0.118764 +5.47881 -0.118444 +5.49057 -0.118466 +5.50233 -0.118497 +5.51409 -0.118699 +5.52584 -0.118747 +5.5376 -0.118685 +5.54936 -0.119001 +5.56111 -0.119021 +5.57287 -0.119035 +5.58463 -0.118883 +5.59639 -0.118814 +5.60814 -0.119156 +5.6199 -0.119038 +5.63166 -0.119282 +5.64341 -0.11911 +5.65517 -0.119245 +5.66693 -0.119276 +5.67869 -0.119597 +5.69044 -0.119757 +5.7022 -0.119755 +5.71396 -0.120242 +5.72571 -0.120465 +5.73747 -0.120418 +5.74923 -0.120572 +5.76098 -0.120623 +5.77274 -0.120829 +5.7845 -0.120943 +5.79626 -0.121014 +5.80801 -0.121273 +5.81977 -0.121279 +5.83153 -0.121346 +5.84328 -0.121297 +5.85504 -0.121141 +5.8668 -0.121521 +5.87856 -0.121762 +5.89031 -0.121587 +5.90207 -0.121144 +5.91383 -0.121258 +5.92558 -0.121408 +5.93734 -0.121656 +5.9491 -0.121426 +5.96086 -0.12161 +5.97261 -0.121984 +5.98437 -0.12175 +5.99613 -0.12198 +6.00788 -0.122095 +6.01964 -0.121822 +6.0314 -0.122195 +6.04316 -0.12206 +6.05491 -0.121987 +6.06667 -0.122271 +6.07843 -0.122383 +6.09018 -0.122313 +6.10194 -0.121947 +6.1137 -0.12202 +6.12546 -0.121724 +6.13721 -0.121903 +6.14897 -0.121902 +6.16073 -0.122474 +6.17248 -0.122348 +6.18424 -0.122249 +6.196 -0.122048 +6.20776 -0.122108 +6.21951 -0.122617 +6.23127 -0.12246 +6.24303 -0.122255 +6.25478 -0.122369 +6.26654 -0.122611 +6.2783 -0.122434 +6.29005 -0.122571 +6.30181 -0.122716 +6.31357 -0.122769 +6.32533 -0.122948 +6.33708 -0.122726 +6.34884 -0.122859 +6.3606 -0.122777 +6.37235 -0.122793 +6.38411 -0.123265 +6.39587 -0.122997 +6.40763 -0.122946 +6.41938 -0.122949 +6.43114 -0.122899 +6.4429 -0.123286 +6.45465 -0.123201 +6.46641 -0.123302 +6.47817 -0.12333 +6.48993 -0.123342 +6.50168 -0.123107 +6.51344 -0.123189 +6.5252 -0.123471 +6.53695 -0.123721 +6.54871 -0.123524 +6.56047 -0.123756 +6.57223 -0.123994 +6.58398 -0.12418 +6.59574 -0.123952 +6.6075 -0.123742 +6.61925 -0.123897 +6.63101 -0.12383 +6.64277 -0.124099 +6.65453 -0.124279 +6.66628 -0.124435 +6.67804 -0.124297 +6.6898 -0.124194 +6.70155 -0.124404 +6.71331 -0.124632 +6.72507 -0.124784 +6.73683 -0.124942 +6.74858 -0.125227 +6.76034 -0.125319 +6.7721 -0.125183 +6.78385 -0.125182 +6.79561 -0.125047 +6.80737 -0.125315 +6.81912 -0.125261 +6.83088 -0.125094 +6.84264 -0.124998 +6.8544 -0.124955 +6.86615 -0.125027 +6.87791 -0.125049 +6.88967 -0.125131 +6.90142 -0.125458 +6.91318 -0.125659 +6.92494 -0.125112 +6.9367 -0.125428 +6.94845 -0.126054 +6.96021 -0.126057 +6.97197 -0.126151 +6.98372 -0.126 +6.99548 -0.126167 +7.00724 -0.126187 +7.019 -0.12655 +7.03075 -0.126191 +7.04251 -0.126071 +7.05427 -0.126153 +7.06602 -0.126266 +7.07778 -0.126294 +7.08954 -0.126338 +7.1013 -0.126291 +7.11305 -0.126342 +7.12481 -0.126508 +7.13657 -0.126587 +7.14832 -0.126827 +7.16008 -0.126856 +7.17184 -0.127221 +7.1836 -0.127519 +7.19535 -0.127723 +7.20711 -0.127925 +7.21887 -0.128104 +7.23062 -0.128224 +7.24238 -0.12832 +7.25414 -0.128657 +7.2659 -0.128799 +7.27765 -0.128787 +7.28941 -0.128612 +7.30117 -0.12866 +7.31292 -0.128484 +7.32468 -0.128462 +7.33644 -0.128818 +7.34819 -0.1289 +7.35995 -0.12864 +7.37171 -0.128579 +7.38347 -0.128583 +7.39522 -0.128451 +7.40698 -0.128515 +7.41874 -0.128781 +7.43049 -0.128694 +7.44225 -0.129028 +7.45401 -0.12898 +7.46577 -0.129073 +7.47752 -0.129035 +7.48928 -0.128756 +7.50104 -0.128957 +7.51279 -0.128802 +7.52455 -0.128576 +7.53631 -0.128806 +7.54807 -0.128703 +7.55982 -0.128354 +7.57158 -0.128192 +7.58334 -0.128257 +7.59509 -0.128178 +7.60685 -0.128166 +7.61861 -0.12812 +7.63037 -0.128295 +7.64212 -0.128244 +7.65388 -0.128156 +7.66564 -0.128226 +7.67739 -0.128225 +7.68915 -0.128384 +7.70091 -0.128656 +7.71267 -0.128664 +7.72442 -0.128912 +7.73618 -0.128802 +7.74794 -0.129001 +7.75969 -0.129135 +7.77145 -0.129177 +7.78321 -0.129542 +7.79497 -0.12915 +7.80672 -0.129364 +7.81848 -0.129369 +7.83024 -0.129353 +7.84199 -0.129478 +7.85375 -0.129487 +7.86551 -0.129851 +7.87727 -0.129925 +7.88902 -0.129803 +7.90078 -0.129851 +7.91254 -0.129754 +7.92429 -0.129882 +7.93605 -0.129914 +7.94781 -0.129956 +7.95956 -0.129972 +7.97132 -0.129971 +7.98308 -0.129864 +7.99484 -0.130111 +8.00659 -0.130051 +8.01835 -0.130462 +8.03011 -0.130184 +8.04186 -0.13025 +8.05362 -0.13019 +8.06538 -0.130316 +8.07714 -0.130011 +8.08889 -0.130191 +8.10065 -0.130332 +8.11241 -0.130491 +8.12416 -0.130359 +8.13592 -0.130435 +8.14768 -0.13099 +8.15944 -0.130958 +8.17119 -0.130614 +8.18295 -0.130339 +8.19471 -0.130402 +8.20646 -0.130404 +8.21822 -0.130574 +8.22998 -0.130834 +8.24174 -0.130756 +8.25349 -0.130717 +8.26525 -0.130966 +8.27701 -0.130954 +8.28876 -0.130977 +8.30052 -0.130865 +8.31228 -0.130803 +8.32404 -0.131001 +8.33579 -0.130991 +8.34755 -0.130962 +8.35931 -0.131295 +8.37106 -0.131181 +8.38282 -0.131372 +8.39458 -0.131283 +8.40634 -0.131427 +8.41809 -0.131748 +8.42985 -0.131839 +8.44161 -0.131979 +8.45336 -0.132018 +8.46512 -0.132195 +8.47688 -0.132042 +8.48863 -0.132037 +8.50039 -0.13176 +8.51215 -0.131643 +8.52391 -0.131506 +8.53566 -0.131901 +8.54742 -0.13199 +8.55918 -0.1316 +8.57093 -0.13184 +8.58269 -0.131652 +8.59445 -0.132008 +8.60621 -0.132241 +8.61796 -0.132398 +8.62972 -0.13183 +8.64148 -0.131855 +8.65323 -0.131609 +8.66499 -0.131505 +8.67675 -0.131367 +8.68851 -0.131265 +8.70026 -0.131386 +8.71202 -0.131964 +8.72378 -0.13198 +8.73553 -0.13204 +8.74729 -0.132044 +8.75905 -0.131839 +8.77081 -0.131494 +8.78256 -0.131519 +8.79432 -0.131354 +8.80608 -0.13159 +8.81783 -0.131485 +8.82959 -0.131329 +8.84135 -0.131295 +8.85311 -0.131187 +8.86486 -0.131224 +8.87662 -0.131222 +8.88838 -0.131669 +8.90013 -0.131574 +8.91189 -0.132103 +8.92365 -0.13226 +8.93541 -0.132266 +8.94716 -0.132088 +8.95892 -0.132099 +8.97068 -0.132269 +8.98243 -0.132251 +8.99419 -0.132214 +9.00595 -0.132037 +9.0177 -0.131935 +9.02946 -0.132287 +9.04122 -0.132244 +9.05298 -0.13254 +9.06473 -0.132741 +9.07649 -0.132915 +9.08825 -0.133114 +9.1 -0.133143 +9.11176 -0.133009 +9.12352 -0.13281 +9.13528 -0.133007 +9.14703 -0.13313 +9.15879 -0.132965 +9.17055 -0.132875 +9.1823 -0.132882 +9.19406 -0.132787 +9.20582 -0.13283 +9.21758 -0.133293 +9.22933 -0.133394 +9.24109 -0.133804 +9.25285 -0.13364 +9.2646 -0.13358 +9.27636 -0.133818 +9.28812 -0.134064 +9.29988 -0.13431 +9.31163 -0.134362 +9.32339 -0.134068 +9.33515 -0.134273 +9.3469 -0.133912 +9.35866 -0.134042 +9.37042 -0.134205 +9.38218 -0.134332 +9.39393 -0.134022 +9.40569 -0.133961 +9.41745 -0.133584 +9.4292 -0.133529 +9.44096 -0.133648 +9.45272 -0.133891 +9.46448 -0.133572 +9.47623 -0.133186 +9.48799 -0.133306 +9.49975 -0.133084 +9.5115 -0.133111 +9.52326 -0.133087 +9.53502 -0.133617 +9.54677 -0.13373 +9.55853 -0.133996 +9.57029 -0.134083 +9.58205 -0.13403 +9.5938 -0.133642 +9.60556 -0.133848 +9.61732 -0.133628 +9.62907 -0.133506 +9.64083 -0.134007 +9.65259 -0.13393 +9.66435 -0.134035 +9.6761 -0.134078 +9.68786 -0.134258 +9.69962 -0.134115 +9.71137 -0.134549 +9.72313 -0.134729 +9.73489 -0.134827 +9.74665 -0.134529 +9.7584 -0.134347 +9.77016 -0.134202 +9.78192 -0.13401 +9.79367 -0.134176 +9.80543 -0.134365 +9.81719 -0.134251 +9.82895 -0.134342 +9.8407 -0.134424 +9.85246 -0.134409 +9.86422 -0.134485 +9.87597 -0.134594 +9.88773 -0.134382 +9.89949 -0.134098 +9.91125 -0.134649 +9.923 -0.134623 +9.93476 -0.13477 +9.94652 -0.134529 +9.95827 -0.134507 +9.97003 -0.134561 +9.98179 -0.134695 +9.99355 -0.134614 +10.0053 -0.134726 +10.0171 -0.135129 +10.0288 -0.134921 +10.0406 -0.13475 +10.0523 -0.134825 +10.0641 -0.135243 +10.0758 -0.135219 +10.0876 -0.135022 +10.0994 -0.135431 +10.1111 -0.135601 +10.1229 -0.135402 +10.1346 -0.135795 +10.1464 -0.136029 +10.1581 -0.135711 +10.1699 -0.13569 +10.1817 -0.135661 +10.1934 -0.135333 +10.2052 -0.135269 +10.2169 -0.135255 +10.2287 -0.1354 +10.2404 -0.13555 +10.2522 -0.135414 +10.264 -0.135912 +10.2757 -0.135729 +10.2875 -0.135514 +10.2992 -0.135743 +10.311 -0.135543 +10.3227 -0.135399 +10.3345 -0.135457 +10.3463 -0.135667 +10.358 -0.135823 +10.3698 -0.136192 +10.3815 -0.136292 +10.3933 -0.136444 +10.405 -0.136487 +10.4168 -0.136679 +10.4286 -0.13684 +10.4403 -0.136944 +10.4521 -0.136847 +10.4638 -0.137158 +10.4756 -0.137099 +10.4873 -0.136849 +10.4991 -0.136761 +10.5109 -0.136887 +10.5226 -0.13705 +10.5344 -0.137047 +10.5461 -0.137327 +10.5579 -0.137362 +10.5696 -0.137472 +10.5814 -0.137892 +10.5932 -0.137908 +10.6049 -0.138279 +10.6167 -0.13834 +10.6284 -0.138501 +10.6402 -0.138565 +10.6519 -0.138479 +10.6637 -0.138411 +10.6755 -0.138183 +10.6872 -0.138393 +10.699 -0.138434 +10.7107 -0.138551 +10.7225 -0.138514 +10.7342 -0.138955 +10.746 -0.138774 +10.7578 -0.138555 +10.7695 -0.138626 +10.7813 -0.138795 +10.793 -0.138977 +10.8048 -0.138994 +10.8165 -0.13894 +10.8283 -0.138941 +10.8401 -0.138816 +10.8518 -0.139088 +10.8636 -0.138876 +10.8753 -0.13884 +10.8871 -0.139029 +10.8988 -0.139325 +10.9106 -0.139017 +10.9224 -0.139082 +10.9341 -0.13925 +10.9459 -0.139066 +10.9576 -0.139077 +10.9694 -0.139176 +10.9811 -0.139665 +10.9929 -0.13925 +11.0047 -0.139468 +11.0164 -0.139667 +11.0282 -0.1397 +11.0399 -0.139839 +11.0517 -0.139664 +11.0634 -0.139768 +11.0752 -0.139857 +11.087 -0.13998 +11.0987 -0.14036 +11.1105 -0.14035 +11.1222 -0.140605 +11.134 -0.140269 +11.1457 -0.140386 +11.1575 -0.140383 +11.1693 -0.140552 +11.181 -0.140497 +11.1928 -0.140699 +11.2045 -0.140949 +11.2163 -0.140627 +11.228 -0.140801 +11.2398 -0.141127 +11.2516 -0.141193 +11.2633 -0.140894 +11.2751 -0.140747 +11.2868 -0.140765 +11.2986 -0.141077 +11.3103 -0.141525 +11.3221 -0.142146 +11.3339 -0.142254 +11.3456 -0.142217 +11.3574 -0.14221 +11.3691 -0.142001 +11.3809 -0.142069 +11.3926 -0.142145 +11.4044 -0.142177 +11.4162 -0.142125 +11.4279 -0.142344 +11.4397 -0.142627 +11.4514 -0.142244 +11.4632 -0.142278 +11.4749 -0.142611 +11.4867 -0.142898 +11.4985 -0.143193 +11.5102 -0.142919 +11.522 -0.142805 +11.5337 -0.142965 +11.5455 -0.142887 +11.5572 -0.142895 +11.569 -0.142979 +11.5808 -0.143171 +11.5925 -0.143095 +11.6043 -0.143507 +11.616 -0.143306 +11.6278 -0.143702 +11.6395 -0.143737 +11.6513 -0.143877 +11.6631 -0.143718 +11.6748 -0.143229 +11.6866 -0.143614 +11.6983 -0.143603 +11.7101 -0.143796 +11.7218 -0.143986 +11.7336 -0.143846 +11.7454 -0.144053 +11.7571 -0.143914 +11.7689 -0.143922 +11.7806 -0.144413 +11.7924 -0.144353 +11.8041 -0.144327 +11.8159 -0.144232 +11.8277 -0.144383 +11.8394 -0.144513 +11.8512 -0.144382 +11.8629 -0.144339 +11.8747 -0.144457 +11.8864 -0.14457 +11.8982 -0.144886 +11.91 -0.144711 +11.9217 -0.144777 +11.9335 -0.144705 +11.9452 -0.145023 +11.957 -0.145084 +11.9687 -0.145005 +11.9805 -0.145079 +11.9923 -0.14496 +12.004 -0.144817 +12.0158 -0.144712 +12.0275 -0.14485 +12.0393 -0.145009 +12.051 -0.145073 +12.0628 -0.145187 +12.0746 -0.145699 +12.0863 -0.145434 +12.0981 -0.145533 +12.1098 -0.145662 +12.1216 -0.146215 +12.1333 -0.146643 +12.1451 -0.146585 +12.1569 -0.14613 +12.1686 -0.146229 +12.1804 -0.146252 +12.1921 -0.146357 +12.2039 -0.146315 +12.2156 -0.146561 +12.2274 -0.146801 +12.2392 -0.146694 +12.2509 -0.146968 +12.2627 -0.146879 +12.2744 -0.146744 +12.2862 -0.146514 +12.2979 -0.146898 +12.3097 -0.146832 +12.3215 -0.146629 +12.3332 -0.146497 +12.345 -0.146425 +12.3567 -0.146434 +12.3685 -0.146402 +12.3802 -0.146572 +12.392 -0.146466 +12.4038 -0.146501 +12.4155 -0.147087 +12.4273 -0.147082 +12.439 -0.147083 +12.4508 -0.147199 +12.4625 -0.147528 +12.4743 -0.146866 +12.4861 -0.146817 +12.4978 -0.146553 +12.5096 -0.146636 +12.5213 -0.146793 +12.5331 -0.146758 +12.5448 -0.147239 +12.5566 -0.147356 +12.5684 -0.14729 +12.5801 -0.147202 +12.5919 -0.14727 +12.6036 -0.147092 +12.6154 -0.147072 +12.6271 -0.147205 +12.6389 -0.147215 +12.6507 -0.14737 +12.6624 -0.147328 +12.6742 -0.147456 +12.6859 -0.147321 +12.6977 -0.147714 +12.7094 -0.147648 +12.7212 -0.147641 +12.733 -0.147698 +12.7447 -0.147644 +12.7565 -0.147562 +12.7682 -0.147996 +12.78 -0.147503 +12.7917 -0.147777 +12.8035 -0.147711 +12.8153 -0.147532 +12.827 -0.147016 +12.8388 -0.146607 +12.8505 -0.146855 +12.8623 -0.147101 +12.874 -0.147047 +12.8858 -0.146985 +12.8976 -0.147111 +12.9093 -0.147083 +12.9211 -0.146972 +12.9328 -0.146932 +12.9446 -0.147444 +12.9563 -0.147676 +12.9681 -0.147644 +12.9799 -0.147902 +12.9916 -0.147586 +13.0034 -0.147478 +13.0151 -0.147654 +13.0269 -0.147543 +13.0386 -0.147221 +13.0504 -0.14757 +13.0622 -0.147438 +13.0739 -0.147449 +13.0857 -0.147552 +13.0974 -0.147441 +13.1092 -0.147299 +13.1209 -0.147242 +13.1327 -0.147483 +13.1445 -0.147607 +13.1562 -0.147761 +13.168 -0.147542 +13.1797 -0.147334 +13.1915 -0.147377 +13.2032 -0.147294 +13.215 -0.147661 +13.2268 -0.147574 +13.2385 -0.147353 +13.2503 -0.14738 +13.262 -0.147002 +13.2738 -0.147358 +13.2855 -0.147443 +13.2973 -0.147366 +13.3091 -0.147353 +13.3208 -0.147399 +13.3326 -0.147468 +13.3443 -0.147393 +13.3561 -0.147495 +13.3678 -0.147577 +13.3796 -0.147725 +13.3914 -0.147549 +13.4031 -0.147738 +13.4149 -0.147813 +13.4266 -0.148001 +13.4384 -0.148233 +13.4501 -0.148383 +13.4619 -0.14866 +13.4737 -0.148504 +13.4854 -0.148758 +13.4972 -0.148831 +13.5089 -0.148858 +13.5207 -0.148776 +13.5324 -0.149053 +13.5442 -0.149416 +13.556 -0.14968 +13.5677 -0.149583 +13.5795 -0.149446 +13.5912 -0.149592 +13.603 -0.14967 +13.6147 -0.149795 +13.6265 -0.149472 +13.6382 -0.149958 +13.65 -0.149582 +13.6618 -0.150021 +13.6735 -0.14979 +13.6853 -0.149703 +13.697 -0.149679 +13.7088 -0.149917 +13.7205 -0.14957 +13.7323 -0.149558 +13.7441 -0.149516 +13.7558 -0.149305 +13.7676 -0.149313 +13.7793 -0.149707 +13.7911 -0.149739 +13.8028 -0.150086 +13.8146 -0.149891 +13.8264 -0.150152 +13.8381 -0.14999 +13.8499 -0.149793 +13.8616 -0.149971 +13.8734 -0.149829 +13.8851 -0.149568 +13.8969 -0.149516 +13.9087 -0.1494 +13.9204 -0.149431 +13.9322 -0.149143 +13.9439 -0.149106 +13.9557 -0.148827 +13.9674 -0.148747 +13.9792 -0.148311 +13.991 -0.148391 +14.0027 -0.148559 +14.0145 -0.148454 +14.0262 -0.148378 +14.038 -0.148329 +14.0497 -0.148491 +14.0615 -0.148531 +14.0733 -0.148838 +14.085 -0.148955 +14.0968 -0.14926 +14.1085 -0.14948 +14.1203 -0.149147 +14.132 -0.149129 +14.1438 -0.149042 +14.1556 -0.149116 +14.1673 -0.149069 +14.1791 -0.148876 +14.1908 -0.148921 +14.2026 -0.149297 +14.2143 -0.149367 +14.2261 -0.149319 +14.2379 -0.149383 +14.2496 -0.149668 +14.2614 -0.149503 +14.2731 -0.149673 +14.2849 -0.149699 +14.2966 -0.149729 +14.3084 -0.149688 +14.3202 -0.149508 +14.3319 -0.149964 +14.3437 -0.149602 +14.3554 -0.150089 +14.3672 -0.150106 +14.3789 -0.149486 +14.3907 -0.149529 +14.4025 -0.149758 +14.4142 -0.149222 +14.426 -0.149069 +14.4377 -0.149191 +14.4495 -0.148943 +14.4612 -0.149106 +14.473 -0.149309 +14.4848 -0.149593 +14.4965 -0.149507 +14.5083 -0.149511 +14.52 -0.14963 +14.5318 -0.14982 +14.5435 -0.150142 +14.5553 -0.15013 +14.5671 -0.150418 +14.5788 -0.150682 +14.5906 -0.150793 +14.6023 -0.150701 +14.6141 -0.150677 +14.6258 -0.150557 +14.6376 -0.150422 +14.6494 -0.150011 +14.6611 -0.150188 +14.6729 -0.150295 +14.6846 -0.150188 +14.6964 -0.15024 +14.7081 -0.150098 +14.7199 -0.150395 +14.7317 -0.149925 +14.7434 -0.150392 +14.7552 -0.150485 +14.7669 -0.150526 +14.7787 -0.150692 +14.7904 -0.150989 +14.8022 -0.150698 +14.814 -0.150974 +14.8257 -0.150834 +14.8375 -0.151319 +14.8492 -0.151707 +14.861 -0.152141 +14.8727 -0.152218 +14.8845 -0.152184 +14.8963 -0.152286 +14.908 -0.152294 +14.9198 -0.15248 +14.9315 -0.152339 +14.9433 -0.152593 +14.955 -0.152468 +14.9668 -0.152198 +14.9786 -0.152089 +15 -0.1524 +& +@target G0.S2 +@type xy +0 0.000146851 +0.0117571 0.00061347 +0.0235142 0.000812989 +0.0352713 0.00123804 +0.0470284 0.0013886 +0.0587856 0.00167473 +0.0705427 0.00130957 +0.0822998 0.00148074 +0.0940569 0.00122154 +0.105814 0.00122139 +0.117571 0.00114777 +0.129328 0.00200301 +0.141085 0.00235104 +0.152842 0.00224392 +0.1646 0.00207262 +0.176357 0.00223683 +0.188114 0.00218855 +0.199871 0.00308042 +0.211628 0.00279104 +0.223385 0.00286653 +0.235142 0.00281001 +0.246899 0.00257695 +0.258656 0.00205125 +0.270414 0.00271939 +0.282171 0.00250743 +0.293928 0.00241093 +0.305685 0.00209806 +0.317442 0.00153545 +0.329199 0.0018684 +0.340956 0.00134201 +0.352713 0.0013286 +0.36447 0.000984448 +0.376228 0.000997373 +0.387985 0.00117904 +0.399742 0.00141431 +0.411499 0.00142762 +0.423256 0.0019897 +0.435013 0.00179709 +0.44677 0.00146474 +0.458527 0.00147144 +0.470284 0.00112298 +0.482042 0.001887 +0.493799 0.00235802 +0.505556 0.00197861 +0.517313 0.00182381 +0.52907 0.00242583 +0.540827 0.00245132 +0.552584 0.00197846 +0.564341 0.00172401 +0.576098 0.00269412 +0.587856 0.00218045 +0.599613 0.00293536 +0.61137 0.00293271 +0.623127 0.00289186 +0.634884 0.00266073 +0.646641 0.00247163 +0.658398 0.00277574 +0.670155 0.00274774 +0.681912 0.0030376 +0.69367 0.00302396 +0.705427 0.00277313 +0.717184 0.00304048 +0.728941 0.00322957 +0.740698 0.00323024 +0.752455 0.0038078 +0.764212 0.00341143 +0.775969 0.0033285 +0.787727 0.00285421 +0.799484 0.00286353 +0.811241 0.00224906 +0.822998 0.0019884 +0.834755 0.00148072 +0.846512 0.0021163 +0.858269 0.00204823 +0.870026 0.00225969 +0.881783 0.00209613 +0.893541 0.00150947 +0.905298 0.00134886 +0.917055 0.00137849 +0.928812 0.00149577 +0.940569 0.000574003 +0.952326 0.00074177 +0.964083 0.000182884 +0.97584 1.62378e-05 +0.987597 0.000187128 +0.999355 -0.00020423 +1.01111 -0.000247576 +1.02287 -0.000943539 +1.03463 -0.00135649 +1.04638 -0.00142922 +1.05814 -0.00172772 +1.0699 -0.00142121 +1.08165 -0.00110246 +1.09341 -0.00161913 +1.10517 -0.00153317 +1.11693 -0.00204357 +1.12868 -0.00243211 +1.14044 -0.00261537 +1.1522 -0.00265591 +1.16395 -0.00249647 +1.17571 -0.00254998 +1.18747 -0.00233124 +1.19923 -0.00256168 +1.21098 -0.0022016 +1.22274 -0.00239177 +1.2345 -0.00271426 +1.24625 -0.00252561 +1.25801 -0.00230349 +1.26977 -0.0024454 +1.28153 -0.00295152 +1.29328 -0.00307686 +1.30504 -0.0031122 +1.3168 -0.00370831 +1.32855 -0.00379711 +1.34031 -0.00459387 +1.35207 -0.00486826 +1.36382 -0.00457572 +1.37558 -0.00475994 +1.38734 -0.0049812 +1.3991 -0.00460883 +1.41085 -0.00397526 +1.42261 -0.00399697 +1.43437 -0.00389006 +1.44612 -0.00398319 +1.45788 -0.00447429 +1.46964 -0.00460133 +1.4814 -0.00460712 +1.49315 -0.00478212 +1.50491 -0.00467307 +1.51667 -0.00508871 +1.52842 -0.00538942 +1.54018 -0.00520915 +1.55194 -0.00524244 +1.5637 -0.00479503 +1.57545 -0.00463514 +1.58721 -0.00465583 +1.59897 -0.00490165 +1.61072 -0.00538154 +1.62248 -0.00574672 +1.63424 -0.00561959 +1.646 -0.00547304 +1.65775 -0.00597301 +1.66951 -0.00587577 +1.68127 -0.00613125 +1.69302 -0.00658966 +1.70478 -0.00687354 +1.71654 -0.00729106 +1.7283 -0.00836165 +1.74005 -0.00787804 +1.75181 -0.00801848 +1.76357 -0.00786616 +1.77532 -0.00798496 +1.78708 -0.0083444 +1.79884 -0.00863915 +1.8106 -0.008666 +1.82235 -0.00869489 +1.83411 -0.00874736 +1.84587 -0.00944789 +1.85762 -0.00955992 +1.86938 -0.00972449 +1.88114 -0.00980089 +1.8929 -0.0101244 +1.90465 -0.00967079 +1.91641 -0.0095246 +1.92817 -0.00938183 +1.93992 -0.00982309 +1.95168 -0.00956931 +1.96344 -0.00970473 +1.97519 -0.0100851 +1.98695 -0.00966873 +1.99871 -0.00943172 +2.01047 -0.0102095 +2.02222 -0.0109153 +2.03398 -0.0108807 +2.04574 -0.0104451 +2.05749 -0.010241 +2.06925 -0.0110223 +2.08101 -0.0108764 +2.09277 -0.0112744 +2.10452 -0.0113137 +2.11628 -0.0116201 +2.12804 -0.01157 +2.13979 -0.0116322 +2.15155 -0.0117902 +2.16331 -0.0117498 +2.17507 -0.0116586 +2.18682 -0.0117338 +2.19858 -0.012179 +2.21034 -0.0124012 +2.22209 -0.0125225 +2.23385 -0.0123185 +2.24561 -0.012341 +2.25737 -0.0122669 +2.26912 -0.0122181 +2.28088 -0.0130282 +2.29264 -0.0127369 +2.30439 -0.0130714 +2.31615 -0.0135207 +2.32791 -0.0133382 +2.33967 -0.0138115 +2.35142 -0.0139391 +2.36318 -0.0138284 +2.37494 -0.0135281 +2.38669 -0.0144049 +2.39845 -0.0147679 +2.41021 -0.0145518 +2.42197 -0.0150013 +2.43372 -0.015145 +2.44548 -0.0149937 +2.45724 -0.0150561 +2.46899 -0.014939 +2.48075 -0.0153697 +2.49251 -0.0155703 +2.50426 -0.0153539 +2.51602 -0.0156872 +2.52778 -0.0162612 +2.53954 -0.0164063 +2.55129 -0.0166393 +2.56305 -0.0165128 +2.57481 -0.0171731 +2.58656 -0.0171843 +2.59832 -0.0172343 +2.61008 -0.0172258 +2.62184 -0.0171435 +2.63359 -0.017383 +2.64535 -0.0177504 +2.65711 -0.0182256 +2.66886 -0.0183647 +2.68062 -0.0179616 +2.69238 -0.018028 +2.70414 -0.0179996 +2.71589 -0.0186494 +2.72765 -0.018718 +2.73941 -0.0189268 +2.75116 -0.0185278 +2.76292 -0.0187187 +2.77468 -0.0188562 +2.78644 -0.019202 +2.79819 -0.0189941 +2.80995 -0.0189485 +2.82171 -0.0193452 +2.83346 -0.0196082 +2.84522 -0.0193265 +2.85698 -0.0200275 +2.86874 -0.0204522 +2.88049 -0.0207544 +2.89225 -0.0213166 +2.90401 -0.0216189 +2.91576 -0.0220255 +2.92752 -0.0216478 +2.93928 -0.0217186 +2.95104 -0.0220066 +2.96279 -0.0218092 +2.97455 -0.0219972 +2.98631 -0.0228309 +2.99806 -0.0226681 +3.00982 -0.0230118 +3.02158 -0.0223286 +3.03333 -0.0225685 +3.04509 -0.0230182 +3.05685 -0.0235905 +3.06861 -0.0234337 +3.08036 -0.0234772 +3.09212 -0.0238342 +3.10388 -0.0241539 +3.11563 -0.0241255 +3.12739 -0.0239263 +3.13915 -0.0240154 +3.15091 -0.024357 +3.16266 -0.0246026 +3.17442 -0.024946 +3.18618 -0.0250067 +3.19793 -0.0253146 +3.20969 -0.0246759 +3.22145 -0.0246556 +3.23321 -0.0247537 +3.24496 -0.0245519 +3.25672 -0.0248172 +3.26848 -0.0245848 +3.28023 -0.0248584 +3.29199 -0.0252217 +3.30375 -0.0254916 +3.31551 -0.0256879 +3.32726 -0.0259611 +3.33902 -0.0262776 +3.35078 -0.0258454 +3.36253 -0.0255623 +3.37429 -0.0254857 +3.38605 -0.0255166 +3.39781 -0.0254343 +3.40956 -0.0263285 +3.42132 -0.0264478 +3.43308 -0.0267633 +3.44483 -0.0268437 +3.45659 -0.0269862 +3.46835 -0.027263 +3.48011 -0.0271629 +3.49186 -0.0269839 +3.50362 -0.0274962 +3.51538 -0.028015 +3.52713 -0.028006 +3.53889 -0.0281026 +3.55065 -0.0284556 +3.5624 -0.0282621 +3.57416 -0.0282755 +3.58592 -0.0280193 +3.59768 -0.0282476 +3.60943 -0.0284683 +3.62119 -0.0282278 +3.63295 -0.0285148 +3.6447 -0.029046 +3.65646 -0.0287389 +3.66822 -0.0284326 +3.67998 -0.028398 +3.69173 -0.028196 +3.70349 -0.0281718 +3.71525 -0.0283951 +3.727 -0.0285966 +3.73876 -0.0290941 +3.75052 -0.0290859 +3.76228 -0.0294531 +3.77403 -0.0293106 +3.78579 -0.029526 +3.79755 -0.0293226 +3.8093 -0.0297226 +3.82106 -0.0299556 +3.83282 -0.0301463 +3.84458 -0.0303723 +3.85633 -0.0310578 +3.86809 -0.0314676 +3.87985 -0.0317345 +3.8916 -0.0319841 +3.90336 -0.0321913 +3.91512 -0.0323766 +3.92688 -0.0325023 +3.93863 -0.0330626 +3.95039 -0.0332572 +3.96215 -0.0330871 +3.9739 -0.0331238 +3.98566 -0.0331145 +3.99742 -0.0334589 +4.00918 -0.0336997 +4.02093 -0.0340671 +4.03269 -0.0339108 +4.04445 -0.0338195 +4.0562 -0.0339865 +4.06796 -0.0345971 +4.07972 -0.0349454 +4.09147 -0.034601 +4.10323 -0.034744 +4.11499 -0.0350589 +4.12675 -0.0351683 +4.1385 -0.0353409 +4.15026 -0.0353629 +4.16202 -0.0355374 +4.17377 -0.0354797 +4.18553 -0.036043 +4.19729 -0.0359226 +4.20905 -0.0359298 +4.2208 -0.0363341 +4.23256 -0.0367693 +4.24432 -0.0370777 +4.25607 -0.0372316 +4.26783 -0.0373559 +4.27959 -0.0378285 +4.29135 -0.0377847 +4.3031 -0.0378059 +4.31486 -0.0380383 +4.32662 -0.0380453 +4.33837 -0.0380833 +4.35013 -0.0381093 +4.36189 -0.0384282 +4.37365 -0.0382218 +4.3854 -0.038682 +4.39716 -0.0389909 +4.40892 -0.0390818 +4.42067 -0.0388607 +4.43243 -0.0393444 +4.44419 -0.0391876 +4.45595 -0.0393707 +4.4677 -0.039176 +4.47946 -0.0394227 +4.49122 -0.0397901 +4.50297 -0.0398726 +4.51473 -0.0399126 +4.52649 -0.0403006 +4.53825 -0.0407723 +4.55 -0.0413336 +4.56176 -0.0413029 +4.57352 -0.0416139 +4.58527 -0.0419923 +4.59703 -0.0424268 +4.60879 -0.041854 +4.62055 -0.0419468 +4.6323 -0.0416806 +4.64406 -0.0420669 +4.65582 -0.0420893 +4.66757 -0.0420254 +4.67933 -0.042542 +4.69109 -0.0424104 +4.70284 -0.0424804 +4.7146 -0.0425909 +4.72636 -0.0430006 +4.73812 -0.0430881 +4.74987 -0.0436504 +4.76163 -0.0428977 +4.77339 -0.0433938 +4.78514 -0.0433208 +4.7969 -0.04374 +4.80866 -0.0441509 +4.82042 -0.0440018 +4.83217 -0.0442206 +4.84393 -0.0451336 +4.85569 -0.0449123 +4.86744 -0.0446199 +4.8792 -0.0445059 +4.89096 -0.0444978 +4.90272 -0.0445796 +4.91447 -0.044376 +4.92623 -0.044266 +4.93799 -0.0445237 +4.94974 -0.0448946 +4.9615 -0.0452694 +4.97326 -0.0456977 +4.98502 -0.0454203 +4.99677 -0.0451524 +5.00853 -0.0452818 +5.02029 -0.0454531 +5.03204 -0.0452065 +5.0438 -0.0450252 +5.05556 -0.045154 +5.06732 -0.0454506 +5.07907 -0.0455624 +5.09083 -0.045591 +5.10259 -0.0459686 +5.11434 -0.0463421 +5.1261 -0.0464617 +5.13786 -0.0460919 +5.14962 -0.0462363 +5.16137 -0.046118 +5.17313 -0.0456054 +5.18489 -0.0455212 +5.19664 -0.0457489 +5.2084 -0.0460344 +5.22016 -0.0457564 +5.23191 -0.04531 +5.24367 -0.0456051 +5.25543 -0.045953 +5.26719 -0.046217 +5.27894 -0.0458038 +5.2907 -0.0455463 +5.30246 -0.0456971 +5.31421 -0.045803 +5.32597 -0.0456943 +5.33773 -0.0458363 +5.34949 -0.0456835 +5.36124 -0.0459984 +5.373 -0.0462102 +5.38476 -0.0462528 +5.39651 -0.0465912 +5.40827 -0.0466823 +5.42003 -0.0467732 +5.43179 -0.0470242 +5.44354 -0.046802 +5.4553 -0.0464284 +5.46706 -0.0460979 +5.47881 -0.0461898 +5.49057 -0.0462528 +5.50233 -0.045983 +5.51409 -0.0461169 +5.52584 -0.0462269 +5.5376 -0.0463353 +5.54936 -0.0464218 +5.56111 -0.0468474 +5.57287 -0.0465786 +5.58463 -0.0465635 +5.59639 -0.0467499 +5.60814 -0.0470413 +5.6199 -0.0470974 +5.63166 -0.0469747 +5.64341 -0.0466952 +5.65517 -0.0466774 +5.66693 -0.0464811 +5.67869 -0.0464604 +5.69044 -0.046712 +5.7022 -0.0467763 +5.71396 -0.0467268 +5.72571 -0.0471132 +5.73747 -0.0468898 +5.74923 -0.0467665 +5.76098 -0.0468895 +5.77274 -0.0473005 +5.7845 -0.0477239 +5.79626 -0.0471306 +5.80801 -0.0476208 +5.81977 -0.0476479 +5.83153 -0.0475296 +5.84328 -0.0475705 +5.85504 -0.0478967 +5.8668 -0.0481957 +5.87856 -0.0483498 +5.89031 -0.048428 +5.90207 -0.0483207 +5.91383 -0.0483271 +5.92558 -0.0485878 +5.93734 -0.0485326 +5.9491 -0.0483228 +5.96086 -0.0485381 +5.97261 -0.0489804 +5.98437 -0.0495218 +5.99613 -0.049584 +6.00788 -0.0499119 +6.01964 -0.0502388 +6.0314 -0.050146 +6.04316 -0.049871 +6.05491 -0.04981 +6.06667 -0.0500292 +6.07843 -0.0498238 +6.09018 -0.0498096 +6.10194 -0.0497452 +6.1137 -0.0497964 +6.12546 -0.0494097 +6.13721 -0.0494403 +6.14897 -0.0496362 +6.16073 -0.0498646 +6.17248 -0.0500081 +6.18424 -0.0500926 +6.196 -0.0506264 +6.20776 -0.0506867 +6.21951 -0.0501151 +6.23127 -0.0504388 +6.24303 -0.0507395 +6.25478 -0.0510302 +6.26654 -0.0509966 +6.2783 -0.0508052 +6.29005 -0.0506474 +6.30181 -0.0508446 +6.31357 -0.050919 +6.32533 -0.0509286 +6.33708 -0.0514224 +6.34884 -0.0515593 +6.3606 -0.0514036 +6.37235 -0.0514366 +6.38411 -0.0514026 +6.39587 -0.0514933 +6.40763 -0.051762 +6.41938 -0.0517089 +6.43114 -0.0514554 +6.4429 -0.0514182 +6.45465 -0.0514923 +6.46641 -0.0512719 +6.47817 -0.0512223 +6.48993 -0.0513095 +6.50168 -0.0512397 +6.51344 -0.0510987 +6.5252 -0.0510842 +6.53695 -0.050609 +6.54871 -0.05055 +6.56047 -0.0503287 +6.57223 -0.0503954 +6.58398 -0.0507471 +6.59574 -0.0504343 +6.6075 -0.0499297 +6.61925 -0.049642 +6.63101 -0.0500424 +6.64277 -0.0501832 +6.65453 -0.0500076 +6.66628 -0.0503698 +6.67804 -0.050084 +6.6898 -0.0498123 +6.70155 -0.0500314 +6.71331 -0.050159 +6.72507 -0.0497409 +6.73683 -0.0495588 +6.74858 -0.0493026 +6.76034 -0.049859 +6.7721 -0.0498708 +6.78385 -0.0496863 +6.79561 -0.0493202 +6.80737 -0.0496618 +6.81912 -0.0496207 +6.83088 -0.0500839 +6.84264 -0.0503387 +6.8544 -0.0500902 +6.86615 -0.049774 +6.87791 -0.0500952 +6.88967 -0.0500648 +6.90142 -0.0500801 +6.91318 -0.0497032 +6.92494 -0.0501413 +6.9367 -0.0503149 +6.94845 -0.0506211 +6.96021 -0.0500467 +6.97197 -0.0501907 +6.98372 -0.050225 +6.99548 -0.0502092 +7.00724 -0.0499199 +7.019 -0.0502114 +7.03075 -0.0503267 +7.04251 -0.05039 +7.05427 -0.050371 +7.06602 -0.0503 +7.07778 -0.0506906 +7.08954 -0.0503363 +7.1013 -0.0503 +7.11305 -0.0498518 +7.12481 -0.0501131 +7.13657 -0.05019 +7.14832 -0.0502542 +7.16008 -0.0504381 +7.17184 -0.0503327 +7.1836 -0.0499607 +7.19535 -0.0501007 +7.20711 -0.0503195 +7.21887 -0.050022 +7.23062 -0.0502217 +7.24238 -0.0499311 +7.25414 -0.0498708 +7.2659 -0.0496194 +7.27765 -0.0493128 +7.28941 -0.0492556 +7.30117 -0.0493741 +7.31292 -0.0501114 +7.32468 -0.0500815 +7.33644 -0.0500234 +7.34819 -0.0500278 +7.35995 -0.0498425 +7.37171 -0.0497223 +7.38347 -0.0498977 +7.39522 -0.050044 +7.40698 -0.0497299 +7.41874 -0.0497148 +7.43049 -0.0493704 +7.44225 -0.0492944 +7.45401 -0.049381 +7.46577 -0.0490118 +7.47752 -0.0484946 +7.48928 -0.0486777 +7.50104 -0.0484262 +7.51279 -0.0485711 +7.52455 -0.0490268 +7.53631 -0.0489489 +7.54807 -0.0489239 +7.55982 -0.0489177 +7.57158 -0.0491483 +7.58334 -0.0484665 +7.59509 -0.0489939 +7.60685 -0.0492227 +7.61861 -0.0492163 +7.63037 -0.0493152 +7.64212 -0.0494289 +7.65388 -0.04957 +7.66564 -0.04987 +7.67739 -0.0501613 +7.68915 -0.0504489 +7.70091 -0.0505608 +7.71267 -0.050562 +7.72442 -0.0504964 +7.73618 -0.0502991 +7.74794 -0.0501539 +7.75969 -0.0499011 +7.77145 -0.049921 +7.78321 -0.0496072 +7.79497 -0.049505 +7.80672 -0.0489274 +7.81848 -0.0485366 +7.83024 -0.048616 +7.84199 -0.048509 +7.85375 -0.0488814 +7.86551 -0.0489321 +7.87727 -0.0486903 +7.88902 -0.0489292 +7.90078 -0.0491011 +7.91254 -0.0489993 +7.92429 -0.0488038 +7.93605 -0.0489069 +7.94781 -0.0489102 +7.95956 -0.0487578 +7.97132 -0.0488866 +7.98308 -0.0493327 +7.99484 -0.0490516 +8.00659 -0.0493786 +8.01835 -0.0490664 +8.03011 -0.0492956 +8.04186 -0.0490637 +8.05362 -0.0488786 +8.06538 -0.0485486 +8.07714 -0.0484569 +8.08889 -0.0489411 +8.10065 -0.0490436 +8.11241 -0.0490064 +8.12416 -0.0489379 +8.13592 -0.0496712 +8.14768 -0.0494799 +8.15944 -0.0497668 +8.17119 -0.0498183 +8.18295 -0.0500262 +8.19471 -0.0496706 +8.20646 -0.0499738 +8.21822 -0.0498068 +8.22998 -0.0496075 +8.24174 -0.0495492 +8.25349 -0.0499931 +8.26525 -0.04974 +8.27701 -0.0495816 +8.28876 -0.0496461 +8.30052 -0.0495163 +8.31228 -0.0498777 +8.32404 -0.0496835 +8.33579 -0.0495532 +8.34755 -0.0496251 +8.35931 -0.0494687 +8.37106 -0.049168 +8.38282 -0.0490691 +8.39458 -0.0490775 +8.40634 -0.0494223 +8.41809 -0.0493868 +8.42985 -0.0491796 +8.44161 -0.0494274 +8.45336 -0.0491113 +8.46512 -0.0490608 +8.47688 -0.0489921 +8.48863 -0.0492571 +8.50039 -0.0494107 +8.51215 -0.0494835 +8.52391 -0.0500391 +8.53566 -0.0496962 +8.54742 -0.0499659 +8.55918 -0.0497203 +8.57093 -0.0497568 +8.58269 -0.0500135 +8.59445 -0.0498642 +8.60621 -0.0495353 +8.61796 -0.0494537 +8.62972 -0.0494737 +8.64148 -0.0496699 +8.65323 -0.0497829 +8.66499 -0.0501532 +8.67675 -0.0498815 +8.68851 -0.050069 +8.70026 -0.0503343 +8.71202 -0.0497912 +8.72378 -0.0496724 +8.73553 -0.0493014 +8.74729 -0.0495588 +8.75905 -0.0494528 +8.77081 -0.0496502 +8.78256 -0.0491838 +8.79432 -0.0489462 +8.80608 -0.0488819 +8.81783 -0.0489081 +8.82959 -0.0492594 +8.84135 -0.0493212 +8.85311 -0.0494059 +8.86486 -0.0490656 +8.87662 -0.0486756 +8.88838 -0.0489508 +8.90013 -0.0490433 +8.91189 -0.049367 +8.92365 -0.0499305 +8.93541 -0.0496646 +8.94716 -0.0493646 +8.95892 -0.0492412 +8.97068 -0.0489476 +8.98243 -0.0487466 +8.99419 -0.0487229 +9.00595 -0.0495335 +9.0177 -0.049761 +9.02946 -0.0495194 +9.04122 -0.0494782 +9.05298 -0.0494713 +9.06473 -0.0491826 +9.07649 -0.0492686 +9.08825 -0.0491691 +9.1 -0.0492648 +9.11176 -0.0498916 +9.12352 -0.050247 +9.13528 -0.0501156 +9.14703 -0.049997 +9.15879 -0.0499867 +9.17055 -0.049341 +9.1823 -0.0496272 +9.19406 -0.0491177 +9.20582 -0.0492992 +9.21758 -0.049209 +9.22933 -0.0495964 +9.24109 -0.0492948 +9.25285 -0.049932 +9.2646 -0.0497602 +9.27636 -0.0492382 +9.28812 -0.0491203 +9.29988 -0.0493913 +9.31163 -0.0494711 +9.32339 -0.0496425 +9.33515 -0.0500939 +9.3469 -0.0503177 +9.35866 -0.0503543 +9.37042 -0.0506316 +9.38218 -0.0507075 +9.39393 -0.05085 +9.40569 -0.0507848 +9.41745 -0.0506579 +9.4292 -0.0503421 +9.44096 -0.0505705 +9.45272 -0.0505565 +9.46448 -0.0508039 +9.47623 -0.0504039 +9.48799 -0.050574 +9.49975 -0.0508299 +9.5115 -0.0507774 +9.52326 -0.0510961 +9.53502 -0.0509245 +9.54677 -0.0505789 +9.55853 -0.0502687 +9.57029 -0.050253 +9.58205 -0.05027 +9.5938 -0.0506565 +9.60556 -0.050643 +9.61732 -0.0506671 +9.62907 -0.0500677 +9.64083 -0.0501864 +9.65259 -0.0501026 +9.66435 -0.0501396 +9.6761 -0.0500678 +9.68786 -0.0506706 +9.69962 -0.0506127 +9.71137 -0.049999 +9.72313 -0.049525 +9.73489 -0.0493335 +9.74665 -0.0494263 +9.7584 -0.0493299 +9.77016 -0.0493643 +9.78192 -0.0492041 +9.79367 -0.049326 +9.80543 -0.0491542 +9.81719 -0.0491669 +9.82895 -0.0485876 +9.8407 -0.0484655 +9.85246 -0.0484202 +9.86422 -0.0480751 +9.87597 -0.0480186 +9.88773 -0.048067 +9.89949 -0.0483673 +9.91125 -0.0481426 +9.923 -0.0481233 +9.93476 -0.0481024 +9.94652 -0.0478994 +9.95827 -0.0475556 +9.97003 -0.0477986 +9.98179 -0.0478812 +9.99355 -0.0475787 +10.0053 -0.0468495 +10.0171 -0.0467991 +10.0288 -0.0471086 +10.0406 -0.0472507 +10.0523 -0.0473557 +10.0641 -0.0475265 +10.0758 -0.0472038 +10.0876 -0.047643 +10.0994 -0.0477495 +10.1111 -0.0482554 +10.1229 -0.0481153 +10.1346 -0.0480902 +10.1464 -0.0477706 +10.1581 -0.0472533 +10.1699 -0.0472181 +10.1817 -0.0469701 +10.1934 -0.0467432 +10.2052 -0.0469817 +10.2169 -0.0472732 +10.2287 -0.0475923 +10.2404 -0.0477878 +10.2522 -0.0473883 +10.264 -0.0472756 +10.2757 -0.0471714 +10.2875 -0.0473066 +10.2992 -0.0475522 +10.311 -0.0478422 +10.3227 -0.0479637 +10.3345 -0.047653 +10.3463 -0.0474116 +10.358 -0.0466437 +10.3698 -0.0466338 +10.3815 -0.046558 +10.3933 -0.0463725 +10.405 -0.046469 +10.4168 -0.0469737 +10.4286 -0.0465216 +10.4403 -0.0463331 +10.4521 -0.0465321 +10.4638 -0.0465065 +10.4756 -0.0465177 +10.4873 -0.0466409 +10.4991 -0.0462782 +10.5109 -0.0458191 +10.5226 -0.0456832 +10.5344 -0.0460949 +10.5461 -0.0459954 +10.5579 -0.0466533 +10.5696 -0.0465334 +10.5814 -0.0463455 +10.5932 -0.0460624 +10.6049 -0.0460282 +10.6167 -0.0462718 +10.6284 -0.046215 +10.6402 -0.0463161 +10.6519 -0.0460136 +10.6637 -0.045666 +10.6755 -0.0456671 +10.6872 -0.045311 +10.699 -0.0452645 +10.7107 -0.045455 +10.7225 -0.0459909 +10.7342 -0.0453042 +10.746 -0.0453642 +10.7578 -0.0455589 +10.7695 -0.0454598 +10.7813 -0.045842 +10.793 -0.0460561 +10.8048 -0.0456203 +10.8165 -0.0451971 +10.8283 -0.0451732 +10.8401 -0.0456036 +10.8518 -0.0451438 +10.8636 -0.0455132 +10.8753 -0.0458351 +10.8871 -0.0458399 +10.8988 -0.0456219 +10.9106 -0.0452807 +10.9224 -0.0450076 +10.9341 -0.0452346 +10.9459 -0.0451427 +10.9576 -0.0459777 +10.9694 -0.0460005 +10.9811 -0.0459394 +10.9929 -0.0462643 +11.0047 -0.0462432 +11.0164 -0.0465283 +11.0282 -0.0461644 +11.0399 -0.0462947 +11.0517 -0.0460322 +11.0634 -0.0462497 +11.0752 -0.0463824 +11.087 -0.0463176 +11.0987 -0.0462661 +11.1105 -0.0459793 +11.1222 -0.0457418 +11.134 -0.0461476 +11.1457 -0.0462062 +11.1575 -0.0463524 +11.1693 -0.0461665 +11.181 -0.0462815 +11.1928 -0.0465528 +11.2045 -0.0463302 +11.2163 -0.0462705 +11.228 -0.0459707 +11.2398 -0.04579 +11.2516 -0.0457148 +11.2633 -0.0455554 +11.2751 -0.0457756 +11.2868 -0.0453352 +11.2986 -0.0455201 +11.3103 -0.0457628 +11.3221 -0.0451212 +11.3339 -0.0450015 +11.3456 -0.0454735 +11.3574 -0.0455948 +11.3691 -0.0455132 +11.3809 -0.0450432 +11.3926 -0.0452968 +11.4044 -0.0454797 +11.4162 -0.045599 +11.4279 -0.0455336 +11.4397 -0.0456182 +11.4514 -0.0460003 +11.4632 -0.0463288 +11.4749 -0.0462865 +11.4867 -0.0461344 +11.4985 -0.0460101 +11.5102 -0.0460951 +11.522 -0.04615 +11.5337 -0.0459787 +11.5455 -0.0455021 +11.5572 -0.0451534 +11.569 -0.0452693 +11.5808 -0.045114 +11.5925 -0.0451414 +11.6043 -0.0451744 +11.616 -0.0456415 +11.6278 -0.0454554 +11.6395 -0.0457001 +11.6513 -0.0454206 +11.6631 -0.0451806 +11.6748 -0.0453865 +11.6866 -0.0452257 +11.6983 -0.0452846 +11.7101 -0.0452255 +11.7218 -0.0455699 +11.7336 -0.0456031 +11.7454 -0.0457689 +11.7571 -0.0453165 +11.7689 -0.0451285 +11.7806 -0.0447303 +11.7924 -0.0445735 +11.8041 -0.044404 +11.8159 -0.0442047 +11.8277 -0.0449893 +11.8394 -0.0449587 +11.8512 -0.0446588 +11.8629 -0.0441039 +11.8747 -0.0443881 +11.8864 -0.0448192 +11.8982 -0.0441988 +11.91 -0.0442139 +11.9217 -0.0437355 +11.9335 -0.0437955 +11.9452 -0.0444947 +11.957 -0.0445257 +11.9687 -0.0444651 +11.9805 -0.044812 +11.9923 -0.0446641 +12.004 -0.0450471 +12.0158 -0.0447325 +12.0275 -0.0451304 +12.0393 -0.0444036 +12.051 -0.0445197 +12.0628 -0.0445627 +12.0746 -0.0442829 +12.0863 -0.0441809 +12.0981 -0.0438859 +12.1098 -0.0438694 +12.1216 -0.0433229 +12.1333 -0.0433886 +12.1451 -0.0433928 +12.1569 -0.0431828 +12.1686 -0.0429781 +12.1804 -0.0424607 +12.1921 -0.0430061 +12.2039 -0.043124 +12.2156 -0.043095 +12.2274 -0.0430784 +12.2392 -0.0433324 +12.2509 -0.0431181 +12.2627 -0.043009 +12.2744 -0.0438452 +12.2862 -0.0441461 +12.2979 -0.0440666 +12.3097 -0.0436143 +12.3215 -0.0435206 +12.3332 -0.0430656 +12.345 -0.0433745 +12.3567 -0.0439667 +12.3685 -0.0440257 +12.3802 -0.0439256 +12.392 -0.04397 +12.4038 -0.0442829 +12.4155 -0.0441052 +12.4273 -0.0444717 +12.439 -0.0445082 +12.4508 -0.04408 +12.4625 -0.0442562 +12.4743 -0.0447963 +12.4861 -0.0446022 +12.4978 -0.0448087 +12.5096 -0.0450057 +12.5213 -0.0445644 +12.5331 -0.0443555 +12.5448 -0.0439684 +12.5566 -0.0443609 +12.5684 -0.0443897 +12.5801 -0.0440257 +12.5919 -0.0439139 +12.6036 -0.0439194 +12.6154 -0.0438606 +12.6271 -0.0440211 +12.6389 -0.044395 +12.6507 -0.0443111 +12.6624 -0.0443445 +12.6742 -0.043874 +12.6859 -0.0440422 +12.6977 -0.0443605 +12.7094 -0.0443495 +12.7212 -0.0449053 +12.733 -0.0444114 +12.7447 -0.0440651 +12.7565 -0.043321 +12.7682 -0.0435034 +12.78 -0.0436364 +12.7917 -0.0429151 +12.8035 -0.0430435 +12.8153 -0.043234 +12.827 -0.043466 +12.8388 -0.0437996 +12.8505 -0.0435293 +12.8623 -0.043454 +12.874 -0.0438034 +12.8858 -0.0437952 +12.8976 -0.0432282 +12.9093 -0.0434404 +12.9211 -0.0435418 +12.9328 -0.0434947 +12.9446 -0.0429364 +12.9563 -0.0424787 +12.9681 -0.0422783 +12.9799 -0.0426815 +12.9916 -0.0423857 +13.0034 -0.0424467 +13.0151 -0.0419897 +13.0269 -0.0421558 +13.0386 -0.0422036 +13.0504 -0.0420568 +13.0622 -0.0424585 +13.0739 -0.0423924 +13.0857 -0.0427885 +13.0974 -0.0429445 +13.1092 -0.0434808 +13.1209 -0.0433612 +13.1327 -0.0433006 +13.1445 -0.0432183 +13.1562 -0.0426012 +13.168 -0.0428835 +13.1797 -0.0427516 +13.1915 -0.0425964 +13.2032 -0.0427053 +13.215 -0.0430551 +13.2268 -0.0428409 +13.2385 -0.0428938 +13.2503 -0.042576 +13.262 -0.0425895 +13.2738 -0.0424986 +13.2855 -0.0430445 +13.2973 -0.0430042 +13.3091 -0.0431863 +13.3208 -0.0429136 +13.3326 -0.0423927 +13.3443 -0.0421804 +13.3561 -0.042216 +13.3678 -0.0421087 +13.3796 -0.0418412 +13.3914 -0.0421421 +13.4031 -0.0422411 +13.4149 -0.0418511 +13.4266 -0.0422119 +13.4384 -0.0422876 +13.4501 -0.0420816 +13.4619 -0.0418618 +13.4737 -0.041796 +13.4854 -0.0415246 +13.4972 -0.0415865 +13.5089 -0.0414365 +13.5207 -0.0416692 +13.5324 -0.0412824 +13.5442 -0.0407946 +13.556 -0.0409767 +13.5677 -0.0409284 +13.5795 -0.0407969 +13.5912 -0.0407504 +13.603 -0.0407576 +13.6147 -0.0406566 +13.6265 -0.0411791 +13.6382 -0.0409014 +13.65 -0.0407079 +13.6618 -0.0402229 +13.6735 -0.0403623 +13.6853 -0.0400027 +13.697 -0.0398964 +13.7088 -0.0398051 +13.7205 -0.0403323 +13.7323 -0.0402027 +13.7441 -0.0402051 +13.7558 -0.0403841 +13.7676 -0.0405179 +13.7793 -0.040182 +13.7911 -0.0400277 +13.8028 -0.0396898 +13.8146 -0.0399671 +13.8264 -0.0399659 +13.8381 -0.0400045 +13.8499 -0.0399345 +13.8616 -0.0400662 +13.8734 -0.0400698 +13.8851 -0.0406819 +13.8969 -0.0405023 +13.9087 -0.0405574 +13.9204 -0.0404402 +13.9322 -0.0404636 +13.9439 -0.0399715 +13.9557 -0.0399818 +13.9674 -0.0400788 +13.9792 -0.0404731 +13.991 -0.041122 +14.0027 -0.0407236 +14.0145 -0.0408891 +14.0262 -0.0406348 +14.038 -0.0404345 +14.0497 -0.0402554 +14.0615 -0.0400386 +14.0733 -0.039851 +14.085 -0.0400599 +14.0968 -0.0397735 +14.1085 -0.0404611 +14.1203 -0.041579 +14.132 -0.0413007 +14.1438 -0.0409064 +14.1556 -0.0411416 +14.1673 -0.040517 +14.1791 -0.0405999 +14.1908 -0.0400705 +14.2026 -0.0405934 +14.2143 -0.040241 +14.2261 -0.0402945 +14.2379 -0.0401568 +14.2496 -0.0391581 +14.2614 -0.0398515 +14.2731 -0.0403058 +14.2849 -0.040305 +14.2966 -0.0401905 +14.3084 -0.0406143 +14.3202 -0.040621 +14.3319 -0.0402495 +14.3437 -0.040536 +14.3554 -0.040529 +14.3672 -0.0408041 +14.3789 -0.0408593 +14.3907 -0.0405506 +14.4025 -0.0406634 +14.4142 -0.040594 +14.426 -0.0403506 +14.4377 -0.0401173 +14.4495 -0.0395535 +14.4612 -0.0394831 +14.473 -0.038962 +14.4848 -0.0392345 +14.4965 -0.0394798 +14.5083 -0.039127 +14.52 -0.0390179 +14.5318 -0.0393375 +14.5435 -0.0393171 +14.5553 -0.039383 +14.5671 -0.0395344 +14.5788 -0.0395008 +14.5906 -0.0396219 +14.6023 -0.0401347 +14.6141 -0.0399164 +14.6258 -0.0400295 +14.6376 -0.040133 +14.6494 -0.0403337 +14.6611 -0.0402593 +14.6729 -0.0400092 +14.6846 -0.0398448 +14.6964 -0.0400396 +14.7081 -0.0401259 +14.7199 -0.0397951 +14.7317 -0.0402946 +14.7434 -0.0396717 +14.7552 -0.0397402 +14.7669 -0.0401526 +14.7787 -0.0409203 +14.7904 -0.0406011 +14.8022 -0.0401136 +14.814 -0.0394758 +14.8257 -0.0393943 +14.8375 -0.0401104 +14.8492 -0.0402315 +14.861 -0.0394936 +14.8727 -0.0397521 +14.8845 -0.0394386 +14.8963 -0.0398029 +14.908 -0.0407967 +14.9198 -0.0408582 +14.9315 -0.041042 +14.9433 -0.0410337 +14.955 -0.0408808 +14.9668 -0.0410218 +14.9786 -0.0407392 +15 -0.0407472 +& +@target G0.S3 +@type xy +0 -0.000546173 +0.0117571 -0.00208087 +0.0235142 -0.00368541 +0.0352713 -0.00570815 +0.0470284 -0.00766386 +0.0587856 -0.00915978 +0.0705427 -0.0102562 +0.0822998 -0.0115553 +0.0940569 -0.0126616 +0.105814 -0.0145011 +0.117571 -0.0156361 +0.129328 -0.0167997 +0.141085 -0.0184821 +0.152842 -0.0193473 +0.1646 -0.0211335 +0.176357 -0.0224897 +0.188114 -0.0237945 +0.199871 -0.0244947 +0.211628 -0.025841 +0.223385 -0.0272553 +0.235142 -0.0289308 +0.246899 -0.0305972 +0.258656 -0.0317545 +0.270414 -0.032601 +0.282171 -0.0337813 +0.293928 -0.0350797 +0.305685 -0.0361736 +0.317442 -0.0374991 +0.329199 -0.0378 +0.340956 -0.0386903 +0.352713 -0.0399559 +0.36447 -0.0414282 +0.376228 -0.0426638 +0.387985 -0.0431871 +0.399742 -0.0440015 +0.411499 -0.0451332 +0.423256 -0.0460391 +0.435013 -0.0475564 +0.44677 -0.048431 +0.458527 -0.0488953 +0.470284 -0.0501029 +0.482042 -0.0507068 +0.493799 -0.051765 +0.505556 -0.0523621 +0.517313 -0.0529287 +0.52907 -0.0537521 +0.540827 -0.0542431 +0.552584 -0.0552077 +0.564341 -0.0565531 +0.576098 -0.0573427 +0.587856 -0.0584293 +0.599613 -0.0591232 +0.61137 -0.0595992 +0.623127 -0.0607928 +0.634884 -0.0616615 +0.646641 -0.0627675 +0.658398 -0.0635613 +0.670155 -0.0633819 +0.681912 -0.0642743 +0.69367 -0.0645586 +0.705427 -0.0655279 +0.717184 -0.0661769 +0.728941 -0.0667695 +0.740698 -0.0677162 +0.752455 -0.0688251 +0.764212 -0.068855 +0.775969 -0.0693488 +0.787727 -0.0704853 +0.799484 -0.071446 +0.811241 -0.072729 +0.822998 -0.0738803 +0.834755 -0.074773 +0.846512 -0.0754543 +0.858269 -0.0754517 +0.870026 -0.0761123 +0.881783 -0.0766049 +0.893541 -0.0772574 +0.905298 -0.078083 +0.917055 -0.0786077 +0.928812 -0.0790203 +0.940569 -0.0794557 +0.952326 -0.0798377 +0.964083 -0.0803555 +0.97584 -0.0805204 +0.987597 -0.0812454 +0.999355 -0.0823282 +1.01111 -0.0829442 +1.02287 -0.0834779 +1.03463 -0.0842045 +1.04638 -0.0843298 +1.05814 -0.0849861 +1.0699 -0.0856245 +1.08165 -0.0859253 +1.09341 -0.0863197 +1.10517 -0.0870006 +1.11693 -0.0879742 +1.12868 -0.0881712 +1.14044 -0.0885987 +1.1522 -0.088733 +1.16395 -0.0897276 +1.17571 -0.0901211 +1.18747 -0.0902294 +1.19923 -0.0902201 +1.21098 -0.0906496 +1.22274 -0.0910476 +1.2345 -0.091588 +1.24625 -0.0916695 +1.25801 -0.0916957 +1.26977 -0.092321 +1.28153 -0.0925783 +1.29328 -0.0931467 +1.30504 -0.0934292 +1.3168 -0.0939998 +1.32855 -0.094449 +1.34031 -0.0949391 +1.35207 -0.0951465 +1.36382 -0.0961995 +1.37558 -0.0964552 +1.38734 -0.0963618 +1.3991 -0.096471 +1.41085 -0.0972628 +1.42261 -0.0974751 +1.43437 -0.0978931 +1.44612 -0.0981783 +1.45788 -0.0986427 +1.46964 -0.0991011 +1.4814 -0.0992193 +1.49315 -0.0994425 +1.50491 -0.0993796 +1.51667 -0.0995185 +1.52842 -0.0998476 +1.54018 -0.100225 +1.55194 -0.100888 +1.5637 -0.100421 +1.57545 -0.100588 +1.58721 -0.101025 +1.59897 -0.100918 +1.61072 -0.101286 +1.62248 -0.101614 +1.63424 -0.101927 +1.646 -0.102397 +1.65775 -0.102603 +1.66951 -0.102286 +1.68127 -0.102762 +1.69302 -0.103146 +1.70478 -0.103058 +1.71654 -0.103491 +1.7283 -0.103625 +1.74005 -0.103677 +1.75181 -0.103722 +1.76357 -0.103763 +1.77532 -0.103632 +1.78708 -0.103848 +1.79884 -0.104352 +1.8106 -0.104542 +1.82235 -0.104502 +1.83411 -0.105055 +1.84587 -0.105574 +1.85762 -0.10581 +1.86938 -0.106018 +1.88114 -0.106021 +1.8929 -0.106348 +1.90465 -0.106333 +1.91641 -0.106349 +1.92817 -0.106631 +1.93992 -0.106969 +1.95168 -0.10727 +1.96344 -0.107084 +1.97519 -0.107184 +1.98695 -0.107271 +1.99871 -0.107177 +2.01047 -0.107652 +2.02222 -0.107632 +2.03398 -0.107633 +2.04574 -0.107597 +2.05749 -0.10743 +2.06925 -0.108044 +2.08101 -0.1078 +2.09277 -0.107773 +2.10452 -0.107661 +2.11628 -0.108138 +2.12804 -0.108374 +2.13979 -0.108315 +2.15155 -0.108389 +2.16331 -0.108461 +2.17507 -0.107785 +2.18682 -0.107924 +2.19858 -0.10785 +2.21034 -0.10806 +2.22209 -0.108142 +2.23385 -0.108141 +2.24561 -0.108179 +2.25737 -0.107907 +2.26912 -0.108265 +2.28088 -0.108773 +2.29264 -0.109165 +2.30439 -0.109039 +2.31615 -0.109219 +2.32791 -0.108961 +2.33967 -0.108716 +2.35142 -0.108544 +2.36318 -0.108815 +2.37494 -0.109028 +2.38669 -0.109385 +2.39845 -0.10908 +2.41021 -0.109451 +2.42197 -0.108907 +2.43372 -0.108703 +2.44548 -0.108296 +2.45724 -0.10817 +2.46899 -0.108303 +2.48075 -0.10878 +2.49251 -0.108763 +2.50426 -0.109065 +2.51602 -0.109251 +2.52778 -0.109422 +2.53954 -0.10961 +2.55129 -0.109411 +2.56305 -0.10949 +2.57481 -0.109945 +2.58656 -0.109763 +2.59832 -0.110161 +2.61008 -0.110123 +2.62184 -0.109786 +2.63359 -0.109092 +2.64535 -0.109069 +2.65711 -0.109512 +2.66886 -0.11016 +2.68062 -0.109995 +2.69238 -0.110234 +2.70414 -0.110442 +2.71589 -0.110587 +2.72765 -0.110858 +2.73941 -0.111036 +2.75116 -0.111131 +2.76292 -0.111193 +2.77468 -0.111492 +2.78644 -0.111708 +2.79819 -0.111277 +2.80995 -0.111261 +2.82171 -0.111319 +2.83346 -0.111201 +2.84522 -0.111214 +2.85698 -0.111279 +2.86874 -0.110988 +2.88049 -0.111304 +2.89225 -0.111109 +2.90401 -0.111162 +2.91576 -0.111062 +2.92752 -0.111148 +2.93928 -0.110936 +2.95104 -0.110788 +2.96279 -0.110281 +2.97455 -0.11036 +2.98631 -0.110497 +2.99806 -0.110327 +3.00982 -0.110462 +3.02158 -0.110359 +3.03333 -0.11023 +3.04509 -0.110156 +3.05685 -0.110484 +3.06861 -0.110268 +3.08036 -0.11028 +3.09212 -0.110242 +3.10388 -0.110156 +3.11563 -0.110227 +3.12739 -0.110439 +3.13915 -0.110298 +3.15091 -0.109981 +3.16266 -0.110278 +3.17442 -0.110166 +3.18618 -0.110161 +3.19793 -0.10994 +3.20969 -0.109819 +3.22145 -0.110145 +3.23321 -0.1102 +3.24496 -0.110309 +3.25672 -0.110342 +3.26848 -0.11074 +3.28023 -0.110467 +3.29199 -0.110079 +3.30375 -0.110261 +3.31551 -0.110499 +3.32726 -0.110899 +3.33902 -0.111502 +3.35078 -0.111131 +3.36253 -0.111238 +3.37429 -0.111537 +3.38605 -0.111265 +3.39781 -0.111414 +3.40956 -0.111576 +3.42132 -0.111472 +3.43308 -0.111206 +3.44483 -0.11113 +3.45659 -0.111431 +3.46835 -0.111168 +3.48011 -0.111073 +3.49186 -0.110542 +3.50362 -0.110261 +3.51538 -0.110391 +3.52713 -0.110518 +3.53889 -0.110979 +3.55065 -0.110773 +3.5624 -0.110899 +3.57416 -0.111271 +3.58592 -0.111275 +3.59768 -0.111648 +3.60943 -0.112023 +3.62119 -0.112051 +3.63295 -0.112379 +3.6447 -0.112345 +3.65646 -0.112123 +3.66822 -0.112002 +3.67998 -0.11206 +3.69173 -0.111843 +3.70349 -0.11185 +3.71525 -0.112392 +3.727 -0.112458 +3.73876 -0.112515 +3.75052 -0.112436 +3.76228 -0.112371 +3.77403 -0.112446 +3.78579 -0.112362 +3.79755 -0.112361 +3.8093 -0.112061 +3.82106 -0.112035 +3.83282 -0.111921 +3.84458 -0.112243 +3.85633 -0.11212 +3.86809 -0.112326 +3.87985 -0.112371 +3.8916 -0.112495 +3.90336 -0.112863 +3.91512 -0.11247 +3.92688 -0.11274 +3.93863 -0.112786 +3.95039 -0.112883 +3.96215 -0.112908 +3.9739 -0.112408 +3.98566 -0.112664 +3.99742 -0.113028 +4.00918 -0.113226 +4.02093 -0.113317 +4.03269 -0.113034 +4.04445 -0.113098 +4.0562 -0.113143 +4.06796 -0.113176 +4.07972 -0.113093 +4.09147 -0.113057 +4.10323 -0.11316 +4.11499 -0.113368 +4.12675 -0.113452 +4.1385 -0.113015 +4.15026 -0.113022 +4.16202 -0.113002 +4.17377 -0.113159 +4.18553 -0.113698 +4.19729 -0.113703 +4.20905 -0.113701 +4.2208 -0.113352 +4.23256 -0.113755 +4.24432 -0.113686 +4.25607 -0.113848 +4.26783 -0.113477 +4.27959 -0.113574 +4.29135 -0.113457 +4.3031 -0.113339 +4.31486 -0.113519 +4.32662 -0.113629 +4.33837 -0.113679 +4.35013 -0.113567 +4.36189 -0.113577 +4.37365 -0.113545 +4.3854 -0.113846 +4.39716 -0.113948 +4.40892 -0.114301 +4.42067 -0.114466 +4.43243 -0.114197 +4.44419 -0.114483 +4.45595 -0.114721 +4.4677 -0.114721 +4.47946 -0.114514 +4.49122 -0.114929 +4.50297 -0.115325 +4.51473 -0.115686 +4.52649 -0.115357 +4.53825 -0.115504 +4.55 -0.115748 +4.56176 -0.11605 +4.57352 -0.116265 +4.58527 -0.116891 +4.59703 -0.116818 +4.60879 -0.116767 +4.62055 -0.116585 +4.6323 -0.116881 +4.64406 -0.11713 +4.65582 -0.117131 +4.66757 -0.117192 +4.67933 -0.116927 +4.69109 -0.117246 +4.70284 -0.117274 +4.7146 -0.117636 +4.72636 -0.117772 +4.73812 -0.117955 +4.74987 -0.118048 +4.76163 -0.118085 +4.77339 -0.118231 +4.78514 -0.118299 +4.7969 -0.118396 +4.80866 -0.118624 +4.82042 -0.11886 +4.83217 -0.118878 +4.84393 -0.119212 +4.85569 -0.11909 +4.86744 -0.119056 +4.8792 -0.119337 +4.89096 -0.119554 +4.90272 -0.119426 +4.91447 -0.119462 +4.92623 -0.119857 +4.93799 -0.120038 +4.94974 -0.120131 +4.9615 -0.120536 +4.97326 -0.120309 +4.98502 -0.120148 +4.99677 -0.120382 +5.00853 -0.120691 +5.02029 -0.12116 +5.03204 -0.121113 +5.0438 -0.121386 +5.05556 -0.120954 +5.06732 -0.121203 +5.07907 -0.121448 +5.09083 -0.121718 +5.10259 -0.122088 +5.11434 -0.122296 +5.1261 -0.122309 +5.13786 -0.122399 +5.14962 -0.12252 +5.16137 -0.122487 +5.17313 -0.122307 +5.18489 -0.122367 +5.19664 -0.12247 +5.2084 -0.122289 +5.22016 -0.122265 +5.23191 -0.122527 +5.24367 -0.122551 +5.25543 -0.122809 +5.26719 -0.122954 +5.27894 -0.123023 +5.2907 -0.123163 +5.30246 -0.12303 +5.31421 -0.122959 +5.32597 -0.123299 +5.33773 -0.123204 +5.34949 -0.123738 +5.36124 -0.123582 +5.373 -0.123318 +5.38476 -0.123551 +5.39651 -0.123812 +5.40827 -0.123855 +5.42003 -0.123934 +5.43179 -0.124099 +5.44354 -0.124409 +5.4553 -0.12433 +5.46706 -0.124309 +5.47881 -0.124636 +5.49057 -0.124946 +5.50233 -0.124724 +5.51409 -0.12493 +5.52584 -0.125491 +5.5376 -0.125568 +5.54936 -0.125752 +5.56111 -0.125867 +5.57287 -0.125735 +5.58463 -0.126133 +5.59639 -0.126284 +5.60814 -0.126464 +5.6199 -0.126755 +5.63166 -0.127074 +5.64341 -0.127089 +5.65517 -0.126808 +5.66693 -0.126671 +5.67869 -0.126413 +5.69044 -0.126191 +5.7022 -0.126307 +5.71396 -0.126265 +5.72571 -0.12667 +5.73747 -0.126393 +5.74923 -0.12647 +5.76098 -0.126672 +5.77274 -0.126774 +5.7845 -0.126906 +5.79626 -0.126673 +5.80801 -0.126808 +5.81977 -0.126956 +5.83153 -0.127178 +5.84328 -0.127287 +5.85504 -0.128154 +5.8668 -0.127597 +5.87856 -0.127699 +5.89031 -0.127955 +5.90207 -0.127896 +5.91383 -0.127778 +5.92558 -0.128286 +5.93734 -0.127989 +5.9491 -0.128058 +5.96086 -0.128277 +5.97261 -0.128392 +5.98437 -0.128593 +5.99613 -0.12868 +6.00788 -0.128461 +6.01964 -0.128574 +6.0314 -0.128568 +6.04316 -0.128934 +6.05491 -0.128967 +6.06667 -0.129019 +6.07843 -0.129319 +6.09018 -0.129572 +6.10194 -0.129432 +6.1137 -0.129369 +6.12546 -0.129605 +6.13721 -0.129688 +6.14897 -0.129879 +6.16073 -0.129873 +6.17248 -0.129849 +6.18424 -0.129678 +6.196 -0.130059 +6.20776 -0.130356 +6.21951 -0.130371 +6.23127 -0.130706 +6.24303 -0.130907 +6.25478 -0.130827 +6.26654 -0.13069 +6.2783 -0.131054 +6.29005 -0.130897 +6.30181 -0.130852 +6.31357 -0.131142 +6.32533 -0.131084 +6.33708 -0.131476 +6.34884 -0.131355 +6.3606 -0.13075 +6.37235 -0.130974 +6.38411 -0.131101 +6.39587 -0.13098 +6.40763 -0.131029 +6.41938 -0.131141 +6.43114 -0.131382 +6.4429 -0.131331 +6.45465 -0.131468 +6.46641 -0.13122 +6.47817 -0.131412 +6.48993 -0.131321 +6.50168 -0.131473 +6.51344 -0.131649 +6.5252 -0.131685 +6.53695 -0.131434 +6.54871 -0.131413 +6.56047 -0.131183 +6.57223 -0.131265 +6.58398 -0.131483 +6.59574 -0.13174 +6.6075 -0.131959 +6.61925 -0.131792 +6.63101 -0.131652 +6.64277 -0.131568 +6.65453 -0.131689 +6.66628 -0.131939 +6.67804 -0.132024 +6.6898 -0.131982 +6.70155 -0.132478 +6.71331 -0.132465 +6.72507 -0.132256 +6.73683 -0.132195 +6.74858 -0.132382 +6.76034 -0.132424 +6.7721 -0.132608 +6.78385 -0.133062 +6.79561 -0.132963 +6.80737 -0.133298 +6.81912 -0.133146 +6.83088 -0.133313 +6.84264 -0.133329 +6.8544 -0.13352 +6.86615 -0.133617 +6.87791 -0.133934 +6.88967 -0.133836 +6.90142 -0.134046 +6.91318 -0.133804 +6.92494 -0.134009 +6.9367 -0.134196 +6.94845 -0.134048 +6.96021 -0.133898 +6.97197 -0.133698 +6.98372 -0.134089 +6.99548 -0.134058 +7.00724 -0.13378 +7.019 -0.13413 +7.03075 -0.134307 +7.04251 -0.134734 +7.05427 -0.134593 +7.06602 -0.134849 +7.07778 -0.134783 +7.08954 -0.135042 +7.1013 -0.135017 +7.11305 -0.135074 +7.12481 -0.13518 +7.13657 -0.135292 +7.14832 -0.135444 +7.16008 -0.135538 +7.17184 -0.135297 +7.1836 -0.135462 +7.19535 -0.135626 +7.20711 -0.135653 +7.21887 -0.135365 +7.23062 -0.135608 +7.24238 -0.135356 +7.25414 -0.135129 +7.2659 -0.135193 +7.27765 -0.134919 +7.28941 -0.135347 +7.30117 -0.135126 +7.31292 -0.135636 +7.32468 -0.135972 +7.33644 -0.135873 +7.34819 -0.135956 +7.35995 -0.136187 +7.37171 -0.136237 +7.38347 -0.136228 +7.39522 -0.136147 +7.40698 -0.13582 +7.41874 -0.135595 +7.43049 -0.135632 +7.44225 -0.135841 +7.45401 -0.13598 +7.46577 -0.135745 +7.47752 -0.135386 +7.48928 -0.136055 +7.50104 -0.135884 +7.51279 -0.13628 +7.52455 -0.136347 +7.53631 -0.136407 +7.54807 -0.136491 +7.55982 -0.136825 +7.57158 -0.136907 +7.58334 -0.136863 +7.59509 -0.136744 +7.60685 -0.136497 +7.61861 -0.136337 +7.63037 -0.136135 +7.64212 -0.136253 +7.65388 -0.136323 +7.66564 -0.136432 +7.67739 -0.136204 +7.68915 -0.135991 +7.70091 -0.135963 +7.71267 -0.136067 +7.72442 -0.136152 +7.73618 -0.135843 +7.74794 -0.135753 +7.75969 -0.135865 +7.77145 -0.135961 +7.78321 -0.136097 +7.79497 -0.136017 +7.80672 -0.135923 +7.81848 -0.135872 +7.83024 -0.135782 +7.84199 -0.135918 +7.85375 -0.136077 +7.86551 -0.135764 +7.87727 -0.135671 +7.88902 -0.135969 +7.90078 -0.135854 +7.91254 -0.13552 +7.92429 -0.135533 +7.93605 -0.135839 +7.94781 -0.13575 +7.95956 -0.136074 +7.97132 -0.135849 +7.98308 -0.135835 +7.99484 -0.135899 +8.00659 -0.135901 +8.01835 -0.135776 +8.03011 -0.136273 +8.04186 -0.136336 +8.05362 -0.136336 +8.06538 -0.136123 +8.07714 -0.136327 +8.08889 -0.136221 +8.10065 -0.136068 +8.11241 -0.13648 +8.12416 -0.136545 +8.13592 -0.136359 +8.14768 -0.136149 +8.15944 -0.136068 +8.17119 -0.136258 +8.18295 -0.136309 +8.19471 -0.13652 +8.20646 -0.136634 +8.21822 -0.136519 +8.22998 -0.136725 +8.24174 -0.137054 +8.25349 -0.137137 +8.26525 -0.137081 +8.27701 -0.137057 +8.28876 -0.136946 +8.30052 -0.137159 +8.31228 -0.137284 +8.32404 -0.136945 +8.33579 -0.136971 +8.34755 -0.137141 +8.35931 -0.136994 +8.37106 -0.136924 +8.38282 -0.136735 +8.39458 -0.136549 +8.40634 -0.136694 +8.41809 -0.136746 +8.42985 -0.136638 +8.44161 -0.136558 +8.45336 -0.136384 +8.46512 -0.136499 +8.47688 -0.136515 +8.48863 -0.136569 +8.50039 -0.136679 +8.51215 -0.13664 +8.52391 -0.136905 +8.53566 -0.136919 +8.54742 -0.137207 +8.55918 -0.13704 +8.57093 -0.136738 +8.58269 -0.136562 +8.59445 -0.136794 +8.60621 -0.136819 +8.61796 -0.13658 +8.62972 -0.136775 +8.64148 -0.136611 +8.65323 -0.137293 +8.66499 -0.137224 +8.67675 -0.137342 +8.68851 -0.136916 +8.70026 -0.137304 +8.71202 -0.137041 +8.72378 -0.137225 +8.73553 -0.137238 +8.74729 -0.136859 +8.75905 -0.137137 +8.77081 -0.13681 +8.78256 -0.136747 +8.79432 -0.136855 +8.80608 -0.13675 +8.81783 -0.137399 +8.82959 -0.13744 +8.84135 -0.137382 +8.85311 -0.137481 +8.86486 -0.137175 +8.87662 -0.13711 +8.88838 -0.137157 +8.90013 -0.137306 +8.91189 -0.137294 +8.92365 -0.137405 +8.93541 -0.137668 +8.94716 -0.137665 +8.95892 -0.137702 +8.97068 -0.137414 +8.98243 -0.137579 +8.99419 -0.137316 +9.00595 -0.137669 +9.0177 -0.137906 +9.02946 -0.137624 +9.04122 -0.137632 +9.05298 -0.137147 +9.06473 -0.13698 +9.07649 -0.136777 +9.08825 -0.136963 +9.1 -0.13656 +9.11176 -0.136811 +9.12352 -0.137075 +9.13528 -0.137092 +9.14703 -0.136777 +9.15879 -0.136508 +9.17055 -0.136762 +9.1823 -0.136758 +9.19406 -0.136749 +9.20582 -0.136567 +9.21758 -0.136883 +9.22933 -0.137087 +9.24109 -0.136865 +9.25285 -0.137671 +9.2646 -0.137561 +9.27636 -0.137353 +9.28812 -0.136999 +9.29988 -0.13712 +9.31163 -0.137171 +9.32339 -0.137402 +9.33515 -0.137471 +9.3469 -0.137441 +9.35866 -0.137305 +9.37042 -0.13765 +9.38218 -0.137823 +9.39393 -0.137703 +9.40569 -0.137418 +9.41745 -0.137658 +9.4292 -0.137903 +9.44096 -0.137939 +9.45272 -0.137837 +9.46448 -0.138069 +9.47623 -0.138386 +9.48799 -0.138216 +9.49975 -0.138434 +9.5115 -0.138154 +9.52326 -0.1378 +9.53502 -0.137494 +9.54677 -0.137175 +9.55853 -0.137158 +9.57029 -0.137333 +9.58205 -0.137427 +9.5938 -0.137752 +9.60556 -0.137322 +9.61732 -0.13755 +9.62907 -0.137399 +9.64083 -0.137113 +9.65259 -0.137048 +9.66435 -0.137056 +9.6761 -0.136832 +9.68786 -0.136942 +9.69962 -0.137278 +9.71137 -0.136965 +9.72313 -0.136587 +9.73489 -0.136669 +9.74665 -0.137103 +9.7584 -0.136753 +9.77016 -0.136344 +9.78192 -0.136668 +9.79367 -0.136346 +9.80543 -0.136404 +9.81719 -0.136306 +9.82895 -0.136441 +9.8407 -0.136812 +9.85246 -0.1368 +9.86422 -0.136933 +9.87597 -0.13656 +9.88773 -0.136985 +9.89949 -0.13719 +9.91125 -0.136723 +9.923 -0.136861 +9.93476 -0.13686 +9.94652 -0.136713 +9.95827 -0.136848 +9.97003 -0.136755 +9.98179 -0.13689 +9.99355 -0.136438 +10.0053 -0.136791 +10.0171 -0.136556 +10.0288 -0.13652 +10.0406 -0.136844 +10.0523 -0.136869 +10.0641 -0.136943 +10.0758 -0.136581 +10.0876 -0.137142 +10.0994 -0.137044 +10.1111 -0.137138 +10.1229 -0.137293 +10.1346 -0.137137 +10.1464 -0.136908 +10.1581 -0.136682 +10.1699 -0.136711 +10.1817 -0.136559 +10.1934 -0.136498 +10.2052 -0.136877 +10.2169 -0.136877 +10.2287 -0.136903 +10.2404 -0.137207 +10.2522 -0.137173 +10.264 -0.13695 +10.2757 -0.136609 +10.2875 -0.136683 +10.2992 -0.136833 +10.311 -0.136896 +10.3227 -0.137062 +10.3345 -0.137106 +10.3463 -0.13691 +10.358 -0.136338 +10.3698 -0.136512 +10.3815 -0.136501 +10.3933 -0.136536 +10.405 -0.136794 +10.4168 -0.136637 +10.4286 -0.136516 +10.4403 -0.136648 +10.4521 -0.136631 +10.4638 -0.13648 +10.4756 -0.136112 +10.4873 -0.135909 +10.4991 -0.136174 +10.5109 -0.136214 +10.5226 -0.136324 +10.5344 -0.136352 +10.5461 -0.135945 +10.5579 -0.135834 +10.5696 -0.136038 +10.5814 -0.135785 +10.5932 -0.135485 +10.6049 -0.135337 +10.6167 -0.135484 +10.6284 -0.13521 +10.6402 -0.135106 +10.6519 -0.1354 +10.6637 -0.134801 +10.6755 -0.134892 +10.6872 -0.134626 +10.699 -0.134878 +10.7107 -0.13484 +10.7225 -0.135098 +10.7342 -0.135065 +10.746 -0.135007 +10.7578 -0.135132 +10.7695 -0.134855 +10.7813 -0.134918 +10.793 -0.134924 +10.8048 -0.134723 +10.8165 -0.134641 +10.8283 -0.135101 +10.8401 -0.135535 +10.8518 -0.135322 +10.8636 -0.135246 +10.8753 -0.135189 +10.8871 -0.134978 +10.8988 -0.134785 +10.9106 -0.134818 +10.9224 -0.134667 +10.9341 -0.134579 +10.9459 -0.134995 +10.9576 -0.13507 +10.9694 -0.13489 +10.9811 -0.13455 +10.9929 -0.134815 +11.0047 -0.134908 +11.0164 -0.134898 +11.0282 -0.134661 +11.0399 -0.134511 +11.0517 -0.134087 +11.0634 -0.13377 +11.0752 -0.133713 +11.087 -0.133729 +11.0987 -0.133616 +11.1105 -0.134004 +11.1222 -0.133892 +11.134 -0.134325 +11.1457 -0.134196 +11.1575 -0.133964 +11.1693 -0.133963 +11.181 -0.133805 +11.1928 -0.13375 +11.2045 -0.133537 +11.2163 -0.133216 +11.228 -0.133299 +11.2398 -0.133492 +11.2516 -0.133133 +11.2633 -0.133323 +11.2751 -0.133251 +11.2868 -0.133137 +11.2986 -0.13329 +11.3103 -0.133512 +11.3221 -0.132893 +11.3339 -0.132823 +11.3456 -0.132438 +11.3574 -0.132809 +11.3691 -0.13308 +11.3809 -0.133309 +11.3926 -0.132928 +11.4044 -0.133188 +11.4162 -0.133166 +11.4279 -0.133267 +11.4397 -0.133213 +11.4514 -0.133242 +11.4632 -0.133974 +11.4749 -0.133778 +11.4867 -0.133758 +11.4985 -0.133188 +11.5102 -0.1335 +11.522 -0.133457 +11.5337 -0.133322 +11.5455 -0.133269 +11.5572 -0.133002 +11.569 -0.133053 +11.5808 -0.133345 +11.5925 -0.133056 +11.6043 -0.132896 +11.616 -0.133339 +11.6278 -0.13294 +11.6395 -0.132907 +11.6513 -0.132612 +11.6631 -0.13285 +11.6748 -0.133078 +11.6866 -0.132812 +11.6983 -0.132731 +11.7101 -0.132507 +11.7218 -0.132323 +11.7336 -0.1323 +11.7454 -0.131765 +11.7571 -0.131619 +11.7689 -0.131411 +11.7806 -0.131219 +11.7924 -0.131356 +11.8041 -0.131674 +11.8159 -0.131729 +11.8277 -0.131534 +11.8394 -0.131527 +11.8512 -0.131345 +11.8629 -0.130912 +11.8747 -0.130847 +11.8864 -0.131041 +11.8982 -0.130852 +11.91 -0.131145 +11.9217 -0.13076 +11.9335 -0.130854 +11.9452 -0.130994 +11.957 -0.13088 +11.9687 -0.130615 +11.9805 -0.130443 +11.9923 -0.130672 +12.004 -0.130332 +12.0158 -0.130821 +12.0275 -0.130569 +12.0393 -0.130378 +12.051 -0.130665 +12.0628 -0.130878 +12.0746 -0.130518 +12.0863 -0.13032 +12.0981 -0.130054 +12.1098 -0.129978 +12.1216 -0.130015 +12.1333 -0.129529 +12.1451 -0.129049 +12.1569 -0.128877 +12.1686 -0.128845 +12.1804 -0.128797 +12.1921 -0.128906 +12.2039 -0.12866 +12.2156 -0.128778 +12.2274 -0.128921 +12.2392 -0.128301 +12.2509 -0.128173 +12.2627 -0.128083 +12.2744 -0.128365 +12.2862 -0.128216 +12.2979 -0.128084 +12.3097 -0.127935 +12.3215 -0.127876 +12.3332 -0.127516 +12.345 -0.127486 +12.3567 -0.127748 +12.3685 -0.128151 +12.3802 -0.128187 +12.392 -0.127953 +12.4038 -0.128016 +12.4155 -0.12806 +12.4273 -0.128219 +12.439 -0.128031 +12.4508 -0.127903 +12.4625 -0.127564 +12.4743 -0.127958 +12.4861 -0.127687 +12.4978 -0.127808 +12.5096 -0.127736 +12.5213 -0.127255 +12.5331 -0.127295 +12.5448 -0.126941 +12.5566 -0.127286 +12.5684 -0.127138 +12.5801 -0.127337 +12.5919 -0.127202 +12.6036 -0.12743 +12.6154 -0.127365 +12.6271 -0.127414 +12.6389 -0.127262 +12.6507 -0.127055 +12.6624 -0.1273 +12.6742 -0.126851 +12.6859 -0.1267 +12.6977 -0.126675 +12.7094 -0.126461 +12.7212 -0.126698 +12.733 -0.126915 +12.7447 -0.126743 +12.7565 -0.126839 +12.7682 -0.126827 +12.78 -0.12692 +12.7917 -0.126643 +12.8035 -0.126103 +12.8153 -0.126232 +12.827 -0.126202 +12.8388 -0.126328 +12.8505 -0.126034 +12.8623 -0.126144 +12.874 -0.126577 +12.8858 -0.126521 +12.8976 -0.126037 +12.9093 -0.12608 +12.9211 -0.126309 +12.9328 -0.126037 +12.9446 -0.125583 +12.9563 -0.125415 +12.9681 -0.12559 +12.9799 -0.125772 +12.9916 -0.125817 +13.0034 -0.125422 +13.0151 -0.12531 +13.0269 -0.125075 +13.0386 -0.125123 +13.0504 -0.124976 +13.0622 -0.125279 +13.0739 -0.125576 +13.0857 -0.124844 +13.0974 -0.125324 +13.1092 -0.125285 +13.1209 -0.125028 +13.1327 -0.12448 +13.1445 -0.124582 +13.1562 -0.124275 +13.168 -0.124518 +13.1797 -0.124496 +13.1915 -0.124835 +13.2032 -0.12489 +13.215 -0.124742 +13.2268 -0.12467 +13.2385 -0.124949 +13.2503 -0.125182 +13.262 -0.125371 +13.2738 -0.125373 +13.2855 -0.125916 +13.2973 -0.126191 +13.3091 -0.125759 +13.3208 -0.125914 +13.3326 -0.125753 +13.3443 -0.12621 +13.3561 -0.126014 +13.3678 -0.125802 +13.3796 -0.125633 +13.3914 -0.125624 +13.4031 -0.12606 +13.4149 -0.125822 +13.4266 -0.125567 +13.4384 -0.125566 +13.4501 -0.125299 +13.4619 -0.125434 +13.4737 -0.125211 +13.4854 -0.124997 +13.4972 -0.124398 +13.5089 -0.124431 +13.5207 -0.124744 +13.5324 -0.124503 +13.5442 -0.124021 +13.556 -0.123824 +13.5677 -0.124228 +13.5795 -0.12428 +13.5912 -0.12393 +13.603 -0.123865 +13.6147 -0.124002 +13.6265 -0.124273 +13.6382 -0.124101 +13.65 -0.124337 +13.6618 -0.124455 +13.6735 -0.124655 +13.6853 -0.124557 +13.697 -0.124493 +13.7088 -0.124034 +13.7205 -0.124055 +13.7323 -0.123822 +13.7441 -0.124272 +13.7558 -0.124196 +13.7676 -0.124397 +13.7793 -0.123835 +13.7911 -0.12421 +13.8028 -0.124076 +13.8146 -0.123946 +13.8264 -0.124307 +13.8381 -0.124635 +13.8499 -0.124715 +13.8616 -0.124612 +13.8734 -0.124359 +13.8851 -0.124558 +13.8969 -0.124336 +13.9087 -0.124114 +13.9204 -0.124463 +13.9322 -0.124329 +13.9439 -0.124402 +13.9557 -0.124304 +13.9674 -0.124562 +13.9792 -0.12409 +13.991 -0.124248 +14.0027 -0.124295 +14.0145 -0.124814 +14.0262 -0.124811 +14.038 -0.124564 +14.0497 -0.124428 +14.0615 -0.124022 +14.0733 -0.123734 +14.085 -0.123598 +14.0968 -0.1239 +14.1085 -0.124296 +14.1203 -0.1243 +14.132 -0.1237 +14.1438 -0.123982 +14.1556 -0.123749 +14.1673 -0.123575 +14.1791 -0.123888 +14.1908 -0.123898 +14.2026 -0.123773 +14.2143 -0.123919 +14.2261 -0.123326 +14.2379 -0.122912 +14.2496 -0.122706 +14.2614 -0.122944 +14.2731 -0.122753 +14.2849 -0.12267 +14.2966 -0.122809 +14.3084 -0.123165 +14.3202 -0.123039 +14.3319 -0.122812 +14.3437 -0.123019 +14.3554 -0.122847 +14.3672 -0.123379 +14.3789 -0.123435 +14.3907 -0.123643 +14.4025 -0.123785 +14.4142 -0.123962 +14.426 -0.123611 +14.4377 -0.123511 +14.4495 -0.123069 +14.4612 -0.123499 +14.473 -0.123434 +14.4848 -0.123592 +14.4965 -0.123874 +14.5083 -0.123765 +14.52 -0.123668 +14.5318 -0.123411 +14.5435 -0.123384 +14.5553 -0.123314 +14.5671 -0.123313 +14.5788 -0.123539 +14.5906 -0.123217 +14.6023 -0.12355 +14.6141 -0.123815 +14.6258 -0.123878 +14.6376 -0.124086 +14.6494 -0.124189 +14.6611 -0.123645 +14.6729 -0.123401 +14.6846 -0.123415 +14.6964 -0.123727 +14.7081 -0.123353 +14.7199 -0.123566 +14.7317 -0.124076 +14.7434 -0.12345 +14.7552 -0.122997 +14.7669 -0.122653 +14.7787 -0.123077 +14.7904 -0.122861 +14.8022 -0.122918 +14.814 -0.123006 +14.8257 -0.122727 +14.8375 -0.122613 +14.8492 -0.12227 +14.861 -0.12205 +14.8727 -0.122013 +14.8845 -0.122219 +14.8963 -0.121978 +14.908 -0.122448 +14.9198 -0.121848 +14.9315 -0.121872 +14.9433 -0.12217 +14.955 -0.122309 +14.9668 -0.122345 +14.9786 -0.121746 +15 -0.12162 +& +@target G0.S16 +@type xy +0 0.00097561 +1.99557 0.0682927 +3.99113 0.136585 +5.9867 0.178537 +7.98226 0.206829 +10.0111 0.217561 +12.0067 0.220488 +14.0022 0.212683 +15.9978 0.186341 +& +@target G0.S17 +@type xy +0 0.00097561 +1.99557 -0.159024 +3.99113 -0.158049 +5.9867 -0.158049 +8.01552 -0.158049 +10.0111 -0.158049 +12.0067 -0.157073 +14.0022 -0.157073 +15.9978 -0.157073 +& +@target G0.S18 +@type xy +0 0.00097561 +1.99557 -0.0565854 +3.99113 -0.101463 +8.01552 -0.171707 +10.0111 -0.166829 +12.0067 -0.164878 +14.0022 -0.164878 +16.031 -0.145366 +& +@target G0.S19 +@type xy +-8.88178e-16 -5.55112e-17 +1.99557 -0.00682927 +4.02439 -0.00682927 +6.01996 -0.0146341 +7.98226 -0.0302439 +10.0111 -0.0468293 +12.0067 -0.0517073 +14.0022 -0.057561 +15.9978 -0.0487805 +& diff --git a/tests/regression/walker/Velocity/glm.pdf b/tests/regression/walker/Velocity/glm.pdf new file mode 100644 index 00000000000..41247827225 Binary files /dev/null and b/tests/regression/walker/Velocity/glm.pdf differ diff --git a/tests/regression/walker/Velocity/glm.ps b/tests/regression/walker/Velocity/glm.ps new file mode 100644 index 00000000000..6ff53efaadd Binary files /dev/null and b/tests/regression/walker/Velocity/glm.ps differ diff --git a/tests/regression/walker/Velocity/glm_homogeneous_shear.q b/tests/regression/walker/Velocity/glm_homogeneous_shear.q index 25855b20af1..35d55bbb2f5 100644 --- a/tests/regression/walker/Velocity/glm_homogeneous_shear.q +++ b/tests/regression/walker/Velocity/glm_homogeneous_shear.q @@ -8,9 +8,9 @@ title "Coupled position, velocity, dissipation joint PDF computing a walker #nstep 2 # Max number of time steps - term 2.0 # Max time - dt 0.1 # Time step size - npar 100000 # Number of particles + term 15.0 # Max time + dt 0.2 # Time step size + npar 70000 # Number of particles ttyi 1 # TTY output interval rngs @@ -34,7 +34,7 @@ walker velocity # configure a velocity equation depvar u solve fluctuation - variant glm # select the simplified Langevin model (SLM/GLM) + variant glm # select the generalized Langevin model (SLM/GLM) position x # couple a position model with dependent variable x dissipation o # couple a dissipation model with dependent variable o init jointgaussian @@ -73,17 +73,17 @@ walker end - pdfs - interval 10 - filetype txt - policy multiple - centering elem - format scientific - precision 6 - # save marginal PDFs of all velocity components - U1( U1 : 1.0e-2 ) - U2( U2 : 1.0e-2 ) - U3( U3 : 1.0e-2 ) - O( O : 1.0e-2 ) # dissipation (turbulence frequency) PDF - end + #pdfs + # interval 10 + # filetype txt + # policy multiple + # centering elem + # format scientific + # precision 6 + # # save marginal PDFs of all velocity components + # U1( U1 : 1.0e-2 ) + # U2( U2 : 1.0e-2 ) + # U3( U3 : 1.0e-2 ) + # O( O : 1.0e-2 ) # dissipation (turbulence frequency) PDF + #end end diff --git a/tests/regression/walker/Velocity/glm_homogeneous_shear.stat.txt.std b/tests/regression/walker/Velocity/glm_homogeneous_shear.stat.txt.std index 906ae75cb06..328faaa516a 100644 --- a/tests/regression/walker/Velocity/glm_homogeneous_shear.stat.txt.std +++ b/tests/regression/walker/Velocity/glm_homogeneous_shear.stat.txt.std @@ -1,21 +1,77 @@ -# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: - 0 0 1.00011 0.669854 0.000234173 8.1204e-05 0.668662 -0.00209731 0.669061 - 1 0.1 0.911512 0.633173 -0.0221641 0.000679013 0.63117 -0.00150767 0.629848 - 2 0.2 0.837949 0.599423 -0.0369075 0.0011803 0.59834 -0.00168686 0.595104 - 3 0.3 0.775607 0.571123 -0.0535062 0.00193513 0.567179 -0.00178112 0.566678 - 4 0.4 0.722698 0.549313 -0.0657359 -0.000138879 0.539533 0.000187861 0.540513 - 5 0.5 0.678657 0.529365 -0.0766594 -0.000972851 0.513374 0.00222881 0.518167 - 6 0.6 0.6405 0.512689 -0.0844536 -0.00283926 0.488909 0.00123953 0.500045 - 7 0.7 0.606664 0.497917 -0.0908956 -0.00136735 0.467432 0.000616044 0.483907 - 8 0.8 0.57656 0.487801 -0.0985345 -0.00188643 0.447866 -0.000354639 0.469724 - 9 0.9 0.550101 0.481022 -0.1058 -0.000565481 0.432588 -0.00079194 0.456056 - 10 1 0.526565 0.475143 -0.110758 -0.00116531 0.417574 -0.000954436 0.446049 - 11 1.1 0.505294 0.471522 -0.115903 -0.00131007 0.405516 -0.000773734 0.437785 - 12 1.2 0.485986 0.46969 -0.120639 0.000742524 0.393225 -0.00158134 0.429586 - 13 1.3 0.468808 0.469367 -0.124991 0.000885213 0.383123 -0.000541929 0.423739 - 14 1.4 0.452638 0.47044 -0.127926 0.00095059 0.374077 -0.00100005 0.419841 - 15 1.5 0.438297 0.470844 -0.129587 0.00025922 0.365245 -0.000964599 0.414547 - 16 1.6 0.424945 0.471289 -0.132367 -4.32731e-05 0.356938 -0.000989048 0.410291 - 17 1.7 0.412247 0.474664 -0.134034 0.00174426 0.350121 -0.000451312 0.406127 - 18 1.8 0.400976 0.476504 -0.136084 0.00213593 0.343921 -0.000751244 0.402619 - 19 1.9 0.390482 0.480903 -0.138438 0.00224662 0.3379 -0.00152211 0.400011 +# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: + 0 0 0.99915 0.667575 0.00580741 -0.000100127 0.658261 -0.00285091 0.670739 + 1 0.2 0.819992 0.65026 -0.0290928 -0.000526114 0.645538 -0.00248754 0.65244 + 2 0.4 0.699147 0.629921 -0.0561143 -0.00483723 0.62058 0.000565088 0.625395 + 3 0.6 0.614503 0.605229 -0.0741302 -0.00241309 0.595566 -0.00123618 0.598256 + 4 0.8 0.55178 0.58738 -0.0935272 -0.0019154 0.565005 -0.00098689 0.570592 + 5 1 0.50211 0.575814 -0.110798 -0.000907944 0.540648 0.00201254 0.552335 + 6 1.2 0.462481 0.5716 -0.124029 -0.00233269 0.51399 0.00238433 0.529301 + 7 1.4 0.430057 0.570959 -0.136569 -0.00293759 0.494725 0.00561993 0.517519 + 8 1.6 0.403729 0.572249 -0.14847 -0.00336519 0.477335 0.0051488 0.509325 + 9 1.8 0.380839 0.581301 -0.156611 -0.0012092 0.464188 0.00293154 0.502868 + 10 2 0.361892 0.589425 -0.16749 -0.00141731 0.451753 0.00453438 0.500903 + 11 2.2 0.345033 0.602662 -0.17568 -0.00090597 0.442506 0.00432402 0.503075 + 12 2.4 0.330215 0.61918 -0.184975 -0.000305525 0.433344 0.0045083 0.503635 + 13 2.6 0.317356 0.641357 -0.192109 -0.00258109 0.430376 0.0064535 0.507285 + 14 2.8 0.305906 0.661039 -0.199761 -0.00277093 0.425197 0.00700336 0.515057 + 15 3 0.295931 0.686845 -0.208156 -0.00402963 0.422926 0.00624527 0.521738 + 16 3.2 0.286427 0.716144 -0.213732 -0.00532016 0.425679 0.00745201 0.530145 + 17 3.4 0.278285 0.74436 -0.220778 -0.00419193 0.42522 0.00521536 0.540706 + 18 3.6 0.270616 0.772334 -0.228396 -0.00661003 0.429427 0.00363688 0.548236 + 19 3.8 0.263336 0.802369 -0.23802 -0.0046406 0.435322 0.00508673 0.559266 + 20 4 0.257102 0.832422 -0.243816 -0.00398293 0.441074 0.00478963 0.571257 + 21 4.2 0.251144 0.863617 -0.250569 -0.00474832 0.446984 0.00346453 0.588111 + 22 4.4 0.245621 0.898282 -0.255369 -0.00268164 0.453614 0.000665459 0.602798 + 23 4.6 0.240371 0.933946 -0.263065 -0.000831178 0.460652 -0.000187345 0.61978 + 24 4.8 0.235397 0.965756 -0.27164 -0.000684692 0.467438 0.000817877 0.635847 + 25 5 0.230536 1.00498 -0.28084 -0.00213258 0.477961 0.000265435 0.65099 + 26 5.2 0.226543 1.04809 -0.292705 -0.00332447 0.49017 0.000911573 0.669055 + 27 5.4 0.222641 1.08594 -0.305483 -0.00160301 0.503746 0.00066357 0.68736 + 28 5.6 0.219005 1.13058 -0.316345 -0.0021729 0.518508 0.000748038 0.710335 + 29 5.8 0.215556 1.17513 -0.32844 -0.00275658 0.533409 0.00199305 0.735868 + 30 6 0.212291 1.21503 -0.339885 -0.00591279 0.546646 0.00412958 0.761887 + 31 6.2 0.20902 1.26606 -0.353716 -0.0056389 0.565121 0.00238482 0.785354 + 32 6.4 0.206154 1.3166 -0.369678 -0.00678314 0.580542 0.00346914 0.811892 + 33 6.6 0.203598 1.37127 -0.38394 -0.00121389 0.599791 0.00610532 0.841348 + 34 6.8 0.200897 1.4228 -0.399363 -0.000410369 0.615029 0.00738296 0.874106 + 35 7 0.198479 1.48102 -0.415703 -0.00100932 0.638142 0.008338 0.914141 + 36 7.2 0.196216 1.5472 -0.431721 0.00133053 0.659867 0.00838777 0.947477 + 37 7.4 0.19389 1.60807 -0.445982 -0.000357223 0.681607 0.00764744 0.979939 + 38 7.6 0.191775 1.67376 -0.464427 -0.0040416 0.705604 0.00984902 1.02004 + 39 7.8 0.190024 1.73958 -0.489006 -0.00356682 0.728283 0.00833471 1.05117 + 40 8 0.188175 1.81677 -0.512654 -0.000671216 0.751423 0.00405854 1.09613 + 41 8.2 0.186459 1.90054 -0.536526 0.000140097 0.781269 0.00644364 1.14074 + 42 8.4 0.184813 1.98639 -0.561354 -0.00215511 0.807392 0.0078577 1.19217 + 43 8.6 0.183083 2.07911 -0.586845 -0.00524959 0.840971 0.00629272 1.24116 + 44 8.8 0.181641 2.17336 -0.608892 -0.00690647 0.877568 0.00177958 1.29602 + 45 9 0.180145 2.26619 -0.63383 -0.0129582 0.91025 -0.00062198 1.3439 + 46 9.2 0.178848 2.3713 -0.65939 -0.0126556 0.945059 -0.00142766 1.39881 + 47 9.4 0.17748 2.47416 -0.690775 -0.0202692 0.983485 0.00162579 1.45915 + 48 9.6 0.176226 2.57289 -0.716236 -0.0177669 1.02332 0.00138114 1.51527 + 49 9.8 0.175021 2.67423 -0.745989 -0.0143476 1.06636 0.00248034 1.58482 + 50 10 0.173875 2.80355 -0.780516 -0.0129088 1.10421 0.00519623 1.64992 + 51 10.2 0.172786 2.92837 -0.816291 -0.00987582 1.15365 0.00320888 1.72931 + 52 10.4 0.171881 3.05772 -0.850902 -0.0120156 1.20146 0.00123414 1.80296 + 53 10.6 0.170839 3.20953 -0.886142 0.000834586 1.2455 -0.000603013 1.88584 + 54 10.8 0.169809 3.35003 -0.923861 -0.00227864 1.29013 -0.0056713 1.97596 + 55 11 0.168822 3.49305 -0.95789 0.00640587 1.34007 -0.00877236 2.05516 + 56 11.2 0.167791 3.64326 -0.989686 0.0110282 1.38779 -0.00762463 2.13329 + 57 11.4 0.16687 3.79812 -1.02654 0.0120857 1.44159 -0.00128158 2.22231 + 58 11.6 0.16607 3.95984 -1.06996 0.00582996 1.50035 -0.0018735 2.31464 + 59 11.8 0.165224 4.14806 -1.10473 0.00978496 1.55229 -0.00494526 2.41958 + 60 12 0.164208 4.33381 -1.16435 0.0159213 1.61657 0.000649158 2.51584 + 61 12.2 0.163333 4.53712 -1.21684 0.0209691 1.68765 -0.00360466 2.60567 + 62 12.4 0.162427 4.72708 -1.26981 0.0182274 1.76039 0.00135725 2.71064 + 63 12.6 0.161705 4.91546 -1.3237 0.0243576 1.82634 0.000771489 2.83685 + 64 12.8 0.161013 5.13895 -1.37971 0.00424088 1.89719 0.00668222 2.96021 + 65 13 0.160423 5.37393 -1.4422 0.00500174 1.98362 0.0057725 3.09162 + 66 13.2 0.159679 5.60397 -1.4977 0.00462577 2.06048 0.000879298 3.20793 + 67 13.4 0.159038 5.85502 -1.57696 0.0156881 2.14787 -0.000238642 3.35845 + 68 13.6 0.15836 6.12747 -1.65041 0.0158552 2.24653 0.00349267 3.50062 + 69 13.8 0.157821 6.39137 -1.73115 0.00751878 2.33535 0.000345652 3.65388 + 70 14 0.157292 6.67822 -1.8033 0.014142 2.43756 0.000912304 3.82751 + 71 14.2 0.156672 6.99462 -1.88772 0.00110576 2.5441 -0.00166756 4.00661 + 72 14.4 0.156027 7.29949 -1.98238 0.00749725 2.66732 -0.00631668 4.20526 + 73 14.6 0.155453 7.62035 -2.05832 0.0126754 2.77238 -0.0108707 4.39246 + 74 14.8 0.154972 7.95817 -2.13538 0.00973108 2.88958 -0.0108084 4.59246 + 75 15 0.154531 8.30199 -2.22039 -0.00811714 3.00333 -0.00946442 4.7834 diff --git a/tests/regression/walker/Velocity/slm.agr b/tests/regression/walker/Velocity/slm.agr new file mode 100644 index 00000000000..01462243e9d --- /dev/null +++ b/tests/regression/walker/Velocity/slm.agr @@ -0,0 +1,6776 @@ +# Grace project file +# +@version 50119 +@page size 792, 612 +@page scroll 5% +@page inout 5% +@link page off +@map font 39 to "Courier", "Courier" +@map font 40 to "Courier-Bold", "Courier-Bold" +@map font 11 to "Courier-BoldOblique", "Courier-BoldOblique" +@map font 9 to "Courier-Oblique", "Courier-Oblique" +@map font 4 to "Helvetica", "Helvetica" +@map font 6 to "Helvetica-Bold", "Helvetica-Bold" +@map font 7 to "Helvetica-BoldOblique", "Helvetica-BoldOblique" +@map font 15 to "Helvetica-Narrow", "Helvetica-Narrow" +@map font 16 to "Helvetica-Narrow-Bold", "Helvetica-Narrow-Bold" +@map font 17 to "Helvetica-Narrow-BoldOblique", "Helvetica-Narrow-BoldOblique" +@map font 18 to "Helvetica-Narrow-Oblique", "Helvetica-Narrow-Oblique" +@map font 5 to "Helvetica-Oblique", "Helvetica-Oblique" +@map font 20 to "NewCenturySchlbk-Bold", "NewCenturySchlbk-Bold" +@map font 21 to "NewCenturySchlbk-BoldItalic", "NewCenturySchlbk-BoldItalic" +@map font 22 to "NewCenturySchlbk-Italic", "NewCenturySchlbk-Italic" +@map font 23 to "NewCenturySchlbk-Roman", "NewCenturySchlbk-Roman" +@map font 24 to "Palatino-Bold", "Palatino-Bold" +@map font 25 to "Palatino-BoldItalic", "Palatino-BoldItalic" +@map font 26 to "Palatino-Italic", "Palatino-Italic" +@map font 27 to "Palatino-Roman", "Palatino-Roman" +@map font 12 to "Symbol", "Symbol" +@map font 2 to "Times-Bold", "Times-Bold" +@map font 3 to "Times-BoldItalic", "Times-BoldItalic" +@map font 1 to "Times-Italic", "Times-Italic" +@map font 0 to "Times-Roman", "Times-Roman" +@map font 33 to "ZapfChancery-MediumItalic", "ZapfChancery-MediumItalic" +@map font 13 to "ZapfDingbats", "ZapfDingbats" +@map font 35 to "CharterBT-Bold", "CharterBT-Bold" +@map font 36 to "CharterBT-BoldItalic", "CharterBT-BoldItalic" +@map font 37 to "CharterBT-Italic", "CharterBT-Italic" +@map font 38 to "CharterBT-Roman", "CharterBT-Roman" +@map font 41 to "Courier-BoldItalic", "Courier-BoldItalic" +@map font 42 to "Courier-Italic", "Courier-Italic" +@map font 43 to "Hershey-Gothic-English", "Hershey-Gothic-English" +@map font 44 to "Hershey-Gothic-German", "Hershey-Gothic-German" +@map font 45 to "Hershey-Gothic-Italian", "Hershey-Gothic-Italian" +@map font 46 to "Hershey-Plain-Duplex", "Hershey-Plain-Duplex" +@map font 47 to "Hershey-Plain-Duplex-Italic", "Hershey-Plain-Duplex-Italic" +@map font 48 to "Hershey-Plain-Triplex", "Hershey-Plain-Triplex" +@map font 49 to "Hershey-Plain-Triplex-Italic", "Hershey-Plain-Triplex-Italic" +@map font 50 to "Hershey-Script-Complex", "Hershey-Script-Complex" +@map font 51 to "Hershey-Script-Simplex", "Hershey-Script-Simplex" +@map font 54 to "LMRoman10-Bold", "LMRoman10-Bold" +@map font 55 to "LMRoman10-BoldItalic", "LMRoman10-BoldItalic" +@map font 58 to "LMRoman10-DemiOblique", "LMRoman10-DemiOblique" +@map font 56 to "LMRoman10-Italic", "LMRoman10-Italic" +@map font 57 to "LMRoman10-Regular", "LMRoman10-Regular" +@map font 60 to "LMSans10-Bold", "LMSans10-Bold" +@map font 64 to "LMSans10-DemiCondensed", "LMSans10-DemiCondensed" +@map font 65 to "LMSans10-DemiCondensedOblique", "LMSans10-DemiCondensedOblique" +@map font 66 to "LMSans10-Oblique", "LMSans10-Oblique" +@map font 63 to "LMSans10-Regular", "LMSans10-Regular" +@map font 68 to "LMTypewriter10-CapsOblique", "LMTypewriter10-CapsOblique" +@map font 70 to "LMTypewriter10-Dark", "LMTypewriter10-Dark" +@map font 71 to "LMTypewriter10-DarkOblique", "LMTypewriter10-DarkOblique" +@map font 69 to "LMTypewriter10-Italic", "LMTypewriter10-Italic" +@map font 73 to "LMTypewriter10-Light", "LMTypewriter10-Light" +@map font 74 to "LuxiMono", "LuxiMono" +@map font 75 to "LuxiMono-Bold", "LuxiMono-Bold" +@map font 76 to "LuxiMono-BoldOblique", "LuxiMono-BoldOblique" +@map font 77 to "LuxiMono-Oblique", "LuxiMono-Oblique" +@map font 78 to "LuxiSans", "LuxiSans" +@map font 79 to "LuxiSans-Bold", "LuxiSans-Bold" +@map font 80 to "LuxiSans-BoldOblique", "LuxiSans-BoldOblique" +@map font 81 to "LuxiSans-Oblique", "LuxiSans-Oblique" +@map font 82 to "LuxiSerif", "LuxiSerif" +@map font 83 to "LuxiSerif-Bold", "LuxiSerif-Bold" +@map font 84 to "LuxiSerif-BoldOblique", "LuxiSerif-BoldOblique" +@map font 85 to "LuxiSerif-Oblique", "LuxiSerif-Oblique" +@map font 86 to "Utopia-Bold", "Utopia-Bold" +@map font 87 to "Utopia-BoldItalic", "Utopia-BoldItalic" +@map font 88 to "Utopia-Italic", "Utopia-Italic" +@map font 89 to "Utopia-Regular", "Utopia-Regular" +@map color 0 to (255, 255, 255), "white" +@map color 1 to (0, 0, 0), "black" +@map color 2 to (255, 0, 0), "red" +@map color 3 to (0, 255, 0), "green" +@map color 4 to (0, 0, 255), "blue" +@map color 5 to (255, 255, 0), "yellow" +@map color 6 to (188, 143, 143), "brown" +@map color 7 to (220, 220, 220), "grey" +@map color 8 to (148, 0, 211), "violet" +@map color 9 to (0, 255, 255), "cyan" +@map color 10 to (255, 0, 255), "magenta" +@map color 11 to (255, 165, 0), "orange" +@map color 12 to (114, 33, 188), "indigo" +@map color 13 to (103, 7, 72), "maroon" +@map color 14 to (64, 224, 208), "turquoise" +@map color 15 to (0, 139, 0), "green4" +@reference date 0 +@date wrap off +@date wrap year 1950 +@default linewidth 1.0 +@default linestyle 1 +@default color 1 +@default pattern 1 +@default font 0 +@default char size 1.000000 +@default symbol size 1.000000 +@default sformat "%.8g" +@background color 0 +@page background fill on +@timestamp off +@timestamp 0.03, 0.03 +@timestamp color 1 +@timestamp rot 0 +@timestamp font 0 +@timestamp char size 1.000000 +@timestamp def "Mon May 15 15:56:59 2006" +@with string +@ string on +@ string loctype view +@ string 0.182352941177, 0.957647058823 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 0.990000 +@ string def "Reynolds stress anisotropy in homogeneous shear flow,\nsimplified Langevin model - thick lines, LRR-IP Reynolds\nstress model - thin lines, symbols - DNS data of Rogers\nand Moin (1987)" +@with string +@ string on +@ string loctype view +@ string 0.968235294118, 0.684705882353 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.250000 +@ string def "b\s11" +@with string +@ string on +@ string loctype view +@ string 0.321176470589, 0.365882352942 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.250000 +@ string def "b\s22\N,b\s33" +@with string +@ string on +@ string loctype view +@ string 0.298823529412, 0.250588235295 +@ string color 1 +@ string rot 0 +@ string font 39 +@ string just 0 +@ string char size 1.250000 +@ string def "b\s12" +@r0 off +@link r0 to g0 +@r0 type above +@r0 linestyle 1 +@r0 linewidth 1.0 +@r0 color 1 +@r0 line 0, 0, 0, 0 +@r1 off +@link r1 to g0 +@r1 type above +@r1 linestyle 1 +@r1 linewidth 1.0 +@r1 color 1 +@r1 line 0, 0, 0, 0 +@r2 off +@link r2 to g0 +@r2 type above +@r2 linestyle 1 +@r2 linewidth 1.0 +@r2 color 1 +@r2 line 0, 0, 0, 0 +@r3 off +@link r3 to g0 +@r3 type above +@r3 linestyle 1 +@r3 linewidth 1.0 +@r3 color 1 +@r3 line 0, 0, 0, 0 +@r4 off +@link r4 to g0 +@r4 type above +@r4 linestyle 1 +@r4 linewidth 1.0 +@r4 color 1 +@r4 line 0, 0, 0, 0 +@g0 on +@g0 hidden false +@g0 type XY +@g0 stacked false +@g0 bar hgap 0.000000 +@g0 fixedpoint off +@g0 fixedpoint type 0 +@g0 fixedpoint xy 0.000000, 0.000000 +@g0 fixedpoint format general general +@g0 fixedpoint prec 6, 6 +@with g0 +@ world 0, -0.2, 15, 0.3001 +@ stack world 0, 0, 0, 0 +@ znorm 1 +@ view 0.150000, 0.150000, 1.150000, 0.850000 +@ title "" +@ title font 39 +@ title size 1.020000 +@ title color 1 +@ subtitle "" +@ subtitle font 39 +@ subtitle size 1.000000 +@ subtitle color 1 +@ xaxes scale Normal +@ yaxes scale Normal +@ xaxes invert off +@ yaxes invert off +@ xaxis on +@ xaxis type zero false +@ xaxis offset 0.000000 , 0.000000 +@ xaxis bar on +@ xaxis bar color 1 +@ xaxis bar linestyle 1 +@ xaxis bar linewidth 1.0 +@ xaxis label "St" +@ xaxis label layout para +@ xaxis label place auto +@ xaxis label char size 1.000000 +@ xaxis label font 39 +@ xaxis label color 1 +@ xaxis label place normal +@ xaxis tick on +@ xaxis tick major 5 +@ xaxis tick minor ticks 4 +@ xaxis tick default 6 +@ xaxis tick place rounded true +@ xaxis tick in +@ xaxis tick major size 1.000000 +@ xaxis tick major color 7 +@ xaxis tick major linewidth 1.0 +@ xaxis tick major linestyle 1 +@ xaxis tick major grid on +@ xaxis tick minor color 7 +@ xaxis tick minor linewidth 1.0 +@ xaxis tick minor linestyle 1 +@ xaxis tick minor grid off +@ xaxis tick minor size 0.500000 +@ xaxis ticklabel on +@ xaxis ticklabel format general +@ xaxis ticklabel prec 5 +@ xaxis ticklabel formula "" +@ xaxis ticklabel append "" +@ xaxis ticklabel prepend "" +@ xaxis ticklabel angle 0 +@ xaxis ticklabel skip 0 +@ xaxis ticklabel stagger 0 +@ xaxis ticklabel place normal +@ xaxis ticklabel offset auto +@ xaxis ticklabel offset 0.000000 , 0.010000 +@ xaxis ticklabel start type auto +@ xaxis ticklabel start 0.000000 +@ xaxis ticklabel stop type auto +@ xaxis ticklabel stop 0.000000 +@ xaxis ticklabel char size 1.000000 +@ xaxis ticklabel font 39 +@ xaxis ticklabel color 1 +@ xaxis tick place both +@ xaxis tick spec type none +@ yaxis on +@ yaxis type zero false +@ yaxis offset 0.000000 , 0.000000 +@ yaxis bar on +@ yaxis bar color 1 +@ yaxis bar linestyle 1 +@ yaxis bar linewidth 1.0 +@ yaxis label "Reynolds stress anisotropy, b\sij" +@ yaxis label layout para +@ yaxis label place auto +@ yaxis label char size 1.000000 +@ yaxis label font 39 +@ yaxis label color 1 +@ yaxis label place normal +@ yaxis tick on +@ yaxis tick major 0.1 +@ yaxis tick minor ticks 4 +@ yaxis tick default 6 +@ yaxis tick place rounded true +@ yaxis tick in +@ yaxis tick major size 1.000000 +@ yaxis tick major color 7 +@ yaxis tick major linewidth 1.0 +@ yaxis tick major linestyle 1 +@ yaxis tick major grid on +@ yaxis tick minor color 7 +@ yaxis tick minor linewidth 1.0 +@ yaxis tick minor linestyle 1 +@ yaxis tick minor grid off +@ yaxis tick minor size 0.500000 +@ yaxis ticklabel on +@ yaxis ticklabel format general +@ yaxis ticklabel prec 5 +@ yaxis ticklabel formula "" +@ yaxis ticklabel append "" +@ yaxis ticklabel prepend "" +@ yaxis ticklabel angle 0 +@ yaxis ticklabel skip 0 +@ yaxis ticklabel stagger 0 +@ yaxis ticklabel place normal +@ yaxis ticklabel offset auto +@ yaxis ticklabel offset 0.000000 , 0.010000 +@ yaxis ticklabel start type auto +@ yaxis ticklabel start 0.000000 +@ yaxis ticklabel stop type auto +@ yaxis ticklabel stop 0.000000 +@ yaxis ticklabel char size 1.000000 +@ yaxis ticklabel font 39 +@ yaxis ticklabel color 1 +@ yaxis tick place both +@ yaxis tick spec type none +@ altxaxis off +@ altyaxis off +@ legend on +@ legend loctype view +@ legend 1, 0.65 +@ legend box color 1 +@ legend box pattern 1 +@ legend box linewidth 1.0 +@ legend box linestyle 1 +@ legend box fill color 0 +@ legend box fill pattern 1 +@ legend font 39 +@ legend char size 1.000000 +@ legend color 1 +@ legend length 4 +@ legend vgap 1 +@ legend hgap 1 +@ legend invert false +@ frame type 0 +@ frame linestyle 1 +@ frame linewidth 1.0 +@ frame color 1 +@ frame pattern 1 +@ frame background color 0 +@ frame background pattern 0 +@ s0 hidden false +@ s0 type xy +@ s0 symbol 0 +@ s0 symbol size 1.000000 +@ s0 symbol color 2 +@ s0 symbol pattern 1 +@ s0 symbol fill color 2 +@ s0 symbol fill pattern 0 +@ s0 symbol linewidth 1.0 +@ s0 symbol linestyle 1 +@ s0 symbol char 65 +@ s0 symbol char font 0 +@ s0 symbol skip 0 +@ s0 line type 1 +@ s0 line linestyle 1 +@ s0 line linewidth 1.0 +@ s0 line color 2 +@ s0 line pattern 1 +@ s0 baseline type 0 +@ s0 baseline off +@ s0 dropline off +@ s0 fill type 0 +@ s0 fill rule 0 +@ s0 fill color 1 +@ s0 fill pattern 1 +@ s0 avalue off +@ s0 avalue type 2 +@ s0 avalue char size 1.000000 +@ s0 avalue font 0 +@ s0 avalue color 1 +@ s0 avalue rot 0 +@ s0 avalue format general +@ s0 avalue prec 3 +@ s0 avalue prepend "" +@ s0 avalue append "" +@ s0 avalue offset 0.000000 , 0.000000 +@ s0 errorbar on +@ s0 errorbar place both +@ s0 errorbar color 2 +@ s0 errorbar pattern 1 +@ s0 errorbar size 1.000000 +@ s0 errorbar linewidth 1.0 +@ s0 errorbar linestyle 1 +@ s0 errorbar riser linewidth 1.0 +@ s0 errorbar riser linestyle 1 +@ s0 errorbar riser clip off +@ s0 errorbar riser clip length 0.100000 +@ s0 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/lrr-ip.txt" +@ s0 legend "" +@ s1 hidden false +@ s1 type xy +@ s1 symbol 0 +@ s1 symbol size 1.000000 +@ s1 symbol color 4 +@ s1 symbol pattern 1 +@ s1 symbol fill color 4 +@ s1 symbol fill pattern 0 +@ s1 symbol linewidth 1.0 +@ s1 symbol linestyle 1 +@ s1 symbol char 65 +@ s1 symbol char font 0 +@ s1 symbol skip 0 +@ s1 line type 1 +@ s1 line linestyle 1 +@ s1 line linewidth 1.0 +@ s1 line color 4 +@ s1 line pattern 1 +@ s1 baseline type 0 +@ s1 baseline off +@ s1 dropline off +@ s1 fill type 0 +@ s1 fill rule 0 +@ s1 fill color 1 +@ s1 fill pattern 1 +@ s1 avalue off +@ s1 avalue type 2 +@ s1 avalue char size 1.000000 +@ s1 avalue font 0 +@ s1 avalue color 1 +@ s1 avalue rot 0 +@ s1 avalue format general +@ s1 avalue prec 3 +@ s1 avalue prepend "" +@ s1 avalue append "" +@ s1 avalue offset 0.000000 , 0.000000 +@ s1 errorbar on +@ s1 errorbar place both +@ s1 errorbar color 4 +@ s1 errorbar pattern 1 +@ s1 errorbar size 1.000000 +@ s1 errorbar linewidth 1.0 +@ s1 errorbar linestyle 1 +@ s1 errorbar riser linewidth 1.0 +@ s1 errorbar riser linestyle 1 +@ s1 errorbar riser clip off +@ s1 errorbar riser clip length 0.100000 +@ s1 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/lrr-ip.txt" +@ s1 legend "" +@ s2 hidden false +@ s2 type xy +@ s2 symbol 0 +@ s2 symbol size 1.000000 +@ s2 symbol color 3 +@ s2 symbol pattern 1 +@ s2 symbol fill color 3 +@ s2 symbol fill pattern 0 +@ s2 symbol linewidth 1.0 +@ s2 symbol linestyle 1 +@ s2 symbol char 65 +@ s2 symbol char font 0 +@ s2 symbol skip 0 +@ s2 line type 1 +@ s2 line linestyle 1 +@ s2 line linewidth 1.0 +@ s2 line color 3 +@ s2 line pattern 1 +@ s2 baseline type 0 +@ s2 baseline off +@ s2 dropline off +@ s2 fill type 0 +@ s2 fill rule 0 +@ s2 fill color 1 +@ s2 fill pattern 1 +@ s2 avalue off +@ s2 avalue type 2 +@ s2 avalue char size 1.000000 +@ s2 avalue font 0 +@ s2 avalue color 1 +@ s2 avalue rot 0 +@ s2 avalue format general +@ s2 avalue prec 3 +@ s2 avalue prepend "" +@ s2 avalue append "" +@ s2 avalue offset 0.000000 , 0.000000 +@ s2 errorbar on +@ s2 errorbar place both +@ s2 errorbar color 3 +@ s2 errorbar pattern 1 +@ s2 errorbar size 1.000000 +@ s2 errorbar linewidth 1.0 +@ s2 errorbar linestyle 1 +@ s2 errorbar riser linewidth 1.0 +@ s2 errorbar riser linestyle 1 +@ s2 errorbar riser clip off +@ s2 errorbar riser clip length 0.100000 +@ s2 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/lrr-ip.txt" +@ s2 legend "" +@ s3 hidden false +@ s3 type xy +@ s3 symbol 0 +@ s3 symbol size 1.000000 +@ s3 symbol color 2 +@ s3 symbol pattern 1 +@ s3 symbol fill color 2 +@ s3 symbol fill pattern 0 +@ s3 symbol linewidth 1.0 +@ s3 symbol linestyle 1 +@ s3 symbol char 65 +@ s3 symbol char font 0 +@ s3 symbol skip 0 +@ s3 line type 1 +@ s3 line linestyle 1 +@ s3 line linewidth 2.0 +@ s3 line color 2 +@ s3 line pattern 1 +@ s3 baseline type 0 +@ s3 baseline off +@ s3 dropline off +@ s3 fill type 0 +@ s3 fill rule 0 +@ s3 fill color 1 +@ s3 fill pattern 1 +@ s3 avalue off +@ s3 avalue type 2 +@ s3 avalue char size 1.000000 +@ s3 avalue font 0 +@ s3 avalue color 1 +@ s3 avalue rot 0 +@ s3 avalue format general +@ s3 avalue prec 3 +@ s3 avalue prepend "" +@ s3 avalue append "" +@ s3 avalue offset 0.000000 , 0.000000 +@ s3 errorbar on +@ s3 errorbar place both +@ s3 errorbar color 2 +@ s3 errorbar pattern 1 +@ s3 errorbar size 1.000000 +@ s3 errorbar linewidth 1.0 +@ s3 errorbar linestyle 1 +@ s3 errorbar riser linewidth 1.0 +@ s3 errorbar riser linestyle 1 +@ s3 errorbar riser clip off +@ s3 errorbar riser clip length 0.100000 +@ s3 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/SLM/shear.rs" +@ s3 legend "" +@ s4 hidden false +@ s4 type xy +@ s4 symbol 0 +@ s4 symbol size 1.000000 +@ s4 symbol color 10 +@ s4 symbol pattern 1 +@ s4 symbol fill color 10 +@ s4 symbol fill pattern 0 +@ s4 symbol linewidth 1.0 +@ s4 symbol linestyle 1 +@ s4 symbol char 65 +@ s4 symbol char font 0 +@ s4 symbol skip 0 +@ s4 line type 1 +@ s4 line linestyle 1 +@ s4 line linewidth 2.0 +@ s4 line color 10 +@ s4 line pattern 1 +@ s4 baseline type 0 +@ s4 baseline off +@ s4 dropline off +@ s4 fill type 0 +@ s4 fill rule 0 +@ s4 fill color 1 +@ s4 fill pattern 1 +@ s4 avalue off +@ s4 avalue type 2 +@ s4 avalue char size 1.000000 +@ s4 avalue font 0 +@ s4 avalue color 1 +@ s4 avalue rot 0 +@ s4 avalue format general +@ s4 avalue prec 3 +@ s4 avalue prepend "" +@ s4 avalue append "" +@ s4 avalue offset 0.000000 , 0.000000 +@ s4 errorbar on +@ s4 errorbar place both +@ s4 errorbar color 10 +@ s4 errorbar pattern 1 +@ s4 errorbar size 1.000000 +@ s4 errorbar linewidth 1.0 +@ s4 errorbar linestyle 1 +@ s4 errorbar riser linewidth 1.0 +@ s4 errorbar riser linestyle 1 +@ s4 errorbar riser clip off +@ s4 errorbar riser clip length 0.100000 +@ s4 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/SLM/shear.rs" +@ s4 legend "" +@ s5 hidden false +@ s5 type xy +@ s5 symbol 0 +@ s5 symbol size 1.000000 +@ s5 symbol color 4 +@ s5 symbol pattern 1 +@ s5 symbol fill color 4 +@ s5 symbol fill pattern 0 +@ s5 symbol linewidth 1.0 +@ s5 symbol linestyle 1 +@ s5 symbol char 65 +@ s5 symbol char font 0 +@ s5 symbol skip 0 +@ s5 line type 1 +@ s5 line linestyle 1 +@ s5 line linewidth 2.0 +@ s5 line color 4 +@ s5 line pattern 1 +@ s5 baseline type 0 +@ s5 baseline off +@ s5 dropline off +@ s5 fill type 0 +@ s5 fill rule 0 +@ s5 fill color 1 +@ s5 fill pattern 1 +@ s5 avalue off +@ s5 avalue type 2 +@ s5 avalue char size 1.000000 +@ s5 avalue font 0 +@ s5 avalue color 1 +@ s5 avalue rot 0 +@ s5 avalue format general +@ s5 avalue prec 3 +@ s5 avalue prepend "" +@ s5 avalue append "" +@ s5 avalue offset 0.000000 , 0.000000 +@ s5 errorbar on +@ s5 errorbar place both +@ s5 errorbar color 4 +@ s5 errorbar pattern 1 +@ s5 errorbar size 1.000000 +@ s5 errorbar linewidth 1.0 +@ s5 errorbar linestyle 1 +@ s5 errorbar riser linewidth 1.0 +@ s5 errorbar riser linestyle 1 +@ s5 errorbar riser clip off +@ s5 errorbar riser clip length 0.100000 +@ s5 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/SLM/shear.rs" +@ s5 legend "" +@ s6 hidden false +@ s6 type xy +@ s6 symbol 0 +@ s6 symbol size 1.000000 +@ s6 symbol color 3 +@ s6 symbol pattern 1 +@ s6 symbol fill color 3 +@ s6 symbol fill pattern 0 +@ s6 symbol linewidth 1.0 +@ s6 symbol linestyle 1 +@ s6 symbol char 65 +@ s6 symbol char font 0 +@ s6 symbol skip 0 +@ s6 line type 1 +@ s6 line linestyle 1 +@ s6 line linewidth 2.0 +@ s6 line color 3 +@ s6 line pattern 1 +@ s6 baseline type 0 +@ s6 baseline off +@ s6 dropline off +@ s6 fill type 0 +@ s6 fill rule 0 +@ s6 fill color 1 +@ s6 fill pattern 1 +@ s6 avalue off +@ s6 avalue type 2 +@ s6 avalue char size 1.000000 +@ s6 avalue font 0 +@ s6 avalue color 1 +@ s6 avalue rot 0 +@ s6 avalue format general +@ s6 avalue prec 3 +@ s6 avalue prepend "" +@ s6 avalue append "" +@ s6 avalue offset 0.000000 , 0.000000 +@ s6 errorbar on +@ s6 errorbar place both +@ s6 errorbar color 3 +@ s6 errorbar pattern 1 +@ s6 errorbar size 1.000000 +@ s6 errorbar linewidth 1.0 +@ s6 errorbar linestyle 1 +@ s6 errorbar riser linewidth 1.0 +@ s6 errorbar riser linestyle 1 +@ s6 errorbar riser clip off +@ s6 errorbar riser clip length 0.100000 +@ s6 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/results/SLM/shear.rs" +@ s6 legend "" +@ s7 hidden false +@ s7 type xy +@ s7 symbol 1 +@ s7 symbol size 0.500000 +@ s7 symbol color 1 +@ s7 symbol pattern 1 +@ s7 symbol fill color 1 +@ s7 symbol fill pattern 1 +@ s7 symbol linewidth 1.0 +@ s7 symbol linestyle 1 +@ s7 symbol char 65 +@ s7 symbol char font 0 +@ s7 symbol skip 0 +@ s7 line type 0 +@ s7 line linestyle 1 +@ s7 line linewidth 1.0 +@ s7 line color 1 +@ s7 line pattern 1 +@ s7 baseline type 0 +@ s7 baseline off +@ s7 dropline off +@ s7 fill type 0 +@ s7 fill rule 0 +@ s7 fill color 1 +@ s7 fill pattern 1 +@ s7 avalue off +@ s7 avalue type 2 +@ s7 avalue char size 1.000000 +@ s7 avalue font 0 +@ s7 avalue color 1 +@ s7 avalue rot 0 +@ s7 avalue format general +@ s7 avalue prec 3 +@ s7 avalue prepend "" +@ s7 avalue append "" +@ s7 avalue offset 0.000000 , 0.000000 +@ s7 errorbar on +@ s7 errorbar place both +@ s7 errorbar color 1 +@ s7 errorbar pattern 1 +@ s7 errorbar size 1.000000 +@ s7 errorbar linewidth 1.0 +@ s7 errorbar linestyle 1 +@ s7 errorbar riser linewidth 1.0 +@ s7 errorbar riser linestyle 1 +@ s7 errorbar riser clip off +@ s7 errorbar riser clip length 0.100000 +@ s7 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b11_DNS.txt" +@ s7 legend "b\s11" +@ s8 hidden false +@ s8 type xy +@ s8 symbol 1 +@ s8 symbol size 0.500000 +@ s8 symbol color 1 +@ s8 symbol pattern 1 +@ s8 symbol fill color 1 +@ s8 symbol fill pattern 0 +@ s8 symbol linewidth 1.0 +@ s8 symbol linestyle 1 +@ s8 symbol char 65 +@ s8 symbol char font 0 +@ s8 symbol skip 0 +@ s8 line type 0 +@ s8 line linestyle 1 +@ s8 line linewidth 1.0 +@ s8 line color 1 +@ s8 line pattern 1 +@ s8 baseline type 0 +@ s8 baseline off +@ s8 dropline off +@ s8 fill type 0 +@ s8 fill rule 0 +@ s8 fill color 1 +@ s8 fill pattern 1 +@ s8 avalue off +@ s8 avalue type 2 +@ s8 avalue char size 1.000000 +@ s8 avalue font 0 +@ s8 avalue color 1 +@ s8 avalue rot 0 +@ s8 avalue format general +@ s8 avalue prec 3 +@ s8 avalue prepend "" +@ s8 avalue append "" +@ s8 avalue offset 0.000000 , 0.000000 +@ s8 errorbar on +@ s8 errorbar place both +@ s8 errorbar color 1 +@ s8 errorbar pattern 1 +@ s8 errorbar size 1.000000 +@ s8 errorbar linewidth 1.0 +@ s8 errorbar linestyle 1 +@ s8 errorbar riser linewidth 1.0 +@ s8 errorbar riser linestyle 1 +@ s8 errorbar riser clip off +@ s8 errorbar riser clip length 0.100000 +@ s8 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b12_DNS.txt" +@ s8 legend "b\s12" +@ s9 hidden false +@ s9 type xy +@ s9 symbol 4 +@ s9 symbol size 0.500000 +@ s9 symbol color 1 +@ s9 symbol pattern 1 +@ s9 symbol fill color 1 +@ s9 symbol fill pattern 1 +@ s9 symbol linewidth 1.0 +@ s9 symbol linestyle 1 +@ s9 symbol char 65 +@ s9 symbol char font 0 +@ s9 symbol skip 0 +@ s9 line type 0 +@ s9 line linestyle 1 +@ s9 line linewidth 1.0 +@ s9 line color 1 +@ s9 line pattern 1 +@ s9 baseline type 0 +@ s9 baseline off +@ s9 dropline off +@ s9 fill type 0 +@ s9 fill rule 0 +@ s9 fill color 1 +@ s9 fill pattern 1 +@ s9 avalue off +@ s9 avalue type 2 +@ s9 avalue char size 1.000000 +@ s9 avalue font 0 +@ s9 avalue color 1 +@ s9 avalue rot 0 +@ s9 avalue format general +@ s9 avalue prec 3 +@ s9 avalue prepend "" +@ s9 avalue append "" +@ s9 avalue offset 0.000000 , 0.000000 +@ s9 errorbar on +@ s9 errorbar place both +@ s9 errorbar color 1 +@ s9 errorbar pattern 1 +@ s9 errorbar size 1.000000 +@ s9 errorbar linewidth 1.0 +@ s9 errorbar linestyle 1 +@ s9 errorbar riser linewidth 1.0 +@ s9 errorbar riser linestyle 1 +@ s9 errorbar riser clip off +@ s9 errorbar riser clip length 0.100000 +@ s9 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b22_DNS.txt" +@ s9 legend "b\s22" +@ s10 hidden false +@ s10 type xy +@ s10 symbol 2 +@ s10 symbol size 0.500000 +@ s10 symbol color 1 +@ s10 symbol pattern 1 +@ s10 symbol fill color 1 +@ s10 symbol fill pattern 1 +@ s10 symbol linewidth 1.0 +@ s10 symbol linestyle 1 +@ s10 symbol char 65 +@ s10 symbol char font 0 +@ s10 symbol skip 0 +@ s10 line type 0 +@ s10 line linestyle 1 +@ s10 line linewidth 1.0 +@ s10 line color 1 +@ s10 line pattern 1 +@ s10 baseline type 0 +@ s10 baseline off +@ s10 dropline off +@ s10 fill type 0 +@ s10 fill rule 0 +@ s10 fill color 1 +@ s10 fill pattern 1 +@ s10 avalue off +@ s10 avalue type 2 +@ s10 avalue char size 1.000000 +@ s10 avalue font 0 +@ s10 avalue color 1 +@ s10 avalue rot 0 +@ s10 avalue format general +@ s10 avalue prec 3 +@ s10 avalue prepend "" +@ s10 avalue append "" +@ s10 avalue offset 0.000000 , 0.000000 +@ s10 errorbar on +@ s10 errorbar place both +@ s10 errorbar color 1 +@ s10 errorbar pattern 1 +@ s10 errorbar size 1.000000 +@ s10 errorbar linewidth 1.0 +@ s10 errorbar linestyle 1 +@ s10 errorbar riser linewidth 1.0 +@ s10 errorbar riser linestyle 1 +@ s10 errorbar riser clip off +@ s10 errorbar riser clip length 0.100000 +@ s10 comment "/home/jbakosi/work/06-work_at_gmu/code/pdf/10_homogeneous_shear/figures/b33_DNS.txt" +@ s10 legend "b\s33" +@target G0.S0 +@type xy +0 0.000136286 +0.062543 0.000533872 +0.125086 0.00117886 +0.187629 0.00205918 +0.250172 0.00316379 +0.312715 0.00448221 +0.375258 0.00600425 +0.437801 0.00771984 +0.500344 0.00961892 +0.562887 0.0116914 +0.62543 0.0139271 +0.687973 0.0163159 +0.750516 0.0188476 +0.813059 0.021512 +0.875602 0.024299 +0.938145 0.0271984 +1.00069 0.0302005 +1.06323 0.0332953 +1.12577 0.0364733 +1.18832 0.0397251 +1.25086 0.0430418 +1.3134 0.0464145 +1.37595 0.0498347 +1.43849 0.0532944 +1.50103 0.0567857 +1.56358 0.0603012 +1.62612 0.0638339 +1.68866 0.0673773 +1.7512 0.0709249 +1.81375 0.074471 +1.87629 0.07801 +1.93883 0.081537 +2.00138 0.0850471 +2.06392 0.0885359 +2.12646 0.0919995 +2.18901 0.0954342 +2.25155 0.0988366 +2.31409 0.102204 +2.37663 0.105533 +2.43918 0.108822 +2.50172 0.112068 +2.56426 0.115269 +2.62681 0.118424 +2.68935 0.121532 +2.75189 0.124591 +2.81444 0.127599 +2.87698 0.130557 +2.93952 0.133464 +3.00206 0.136319 +3.06461 0.139121 +3.12715 0.14187 +3.18969 0.144567 +3.25224 0.147212 +3.31478 0.149803 +3.37732 0.152342 +3.43987 0.15483 +3.50241 0.157265 +3.56495 0.159649 +3.62749 0.161982 +3.69004 0.164265 +3.75258 0.166498 +3.81512 0.168682 +3.87767 0.170817 +3.94021 0.172905 +4.00275 0.174946 +4.0653 0.17694 +4.12784 0.178889 +4.19038 0.180794 +4.25292 0.182654 +4.31547 0.184471 +4.37801 0.186246 +4.44055 0.18798 +4.5031 0.189673 +4.56564 0.191326 +4.62818 0.19294 +4.69073 0.194516 +4.75327 0.196055 +4.81581 0.197556 +4.87835 0.199023 +4.9409 0.200454 +5.00344 0.201851 +5.06598 0.203214 +5.12853 0.204545 +5.19107 0.205844 +5.25361 0.207112 +5.31616 0.208349 +5.3787 0.209557 +5.44124 0.210736 +5.50378 0.211886 +5.56633 0.213008 +5.62887 0.214104 +5.69141 0.215173 +5.75396 0.216217 +5.8165 0.217235 +5.87904 0.218229 +5.94159 0.219199 +6.00413 0.220145 +6.06667 0.221069 +6.12921 0.221971 +6.19176 0.222851 +6.2543 0.22371 +6.31684 0.224548 +6.37939 0.225367 +6.44193 0.226166 +6.50447 0.226945 +6.56702 0.227706 +6.62956 0.228449 +6.6921 0.229174 +6.75464 0.229882 +6.81719 0.230573 +6.87973 0.231248 +6.94227 0.231906 +7.00482 0.232549 +7.06736 0.233177 +7.1299 0.23379 +7.19245 0.234388 +7.25499 0.234972 +7.31753 0.235543 +7.38008 0.2361 +7.44262 0.236644 +7.50516 0.237175 +7.5677 0.237693 +7.63025 0.2382 +7.69279 0.238695 +7.75533 0.239178 +7.81788 0.239649 +7.88042 0.24011 +7.94296 0.24056 +8.00551 0.241 +8.06805 0.241429 +8.13059 0.241848 +8.19313 0.242258 +8.25568 0.242658 +8.31822 0.243049 +8.38076 0.243431 +8.44331 0.243804 +8.50585 0.244169 +8.56839 0.244525 +8.63094 0.244873 +8.69348 0.245213 +8.75602 0.245545 +8.81856 0.245869 +8.88111 0.246186 +8.94365 0.246496 +9.00619 0.246799 +9.06874 0.247095 +9.13128 0.247384 +9.19382 0.247667 +9.25637 0.247943 +9.31891 0.248213 +9.38145 0.248477 +9.44399 0.248735 +9.50654 0.248987 +9.56908 0.249234 +9.63162 0.249475 +9.69417 0.24971 +9.75671 0.24994 +9.81925 0.250166 +9.8818 0.250386 +9.94434 0.250601 +10.0069 0.250811 +10.0694 0.251017 +10.132 0.251218 +10.1945 0.251414 +10.2571 0.251607 +10.3196 0.251795 +10.3821 0.251979 +10.4447 0.252158 +10.5072 0.252334 +10.5698 0.252506 +10.6323 0.252674 +10.6949 0.252839 +10.7574 0.253 +10.8199 0.253157 +10.8825 0.253311 +10.945 0.253462 +11.0076 0.253609 +11.0701 0.253753 +11.1327 0.253894 +11.1952 0.254032 +11.2577 0.254167 +11.3203 0.254299 +11.3828 0.254428 +11.4454 0.254554 +11.5079 0.254678 +11.5705 0.254799 +11.633 0.254917 +11.6955 0.255033 +11.7581 0.255146 +11.8206 0.255257 +11.8832 0.255366 +11.9457 0.255472 +12.0083 0.255576 +12.0708 0.255678 +12.1333 0.255778 +12.1959 0.255875 +12.2584 0.255971 +12.321 0.256064 +12.3835 0.256156 +12.4461 0.256245 +12.5086 0.256333 +12.5711 0.256419 +12.6337 0.256503 +12.6962 0.256585 +12.7588 0.256666 +12.8213 0.256744 +12.8839 0.256822 +12.9464 0.256897 +13.0089 0.256971 +13.0715 0.257044 +13.134 0.257115 +13.1966 0.257185 +13.2591 0.257253 +13.3217 0.257319 +13.3842 0.257385 +13.4467 0.257449 +13.5093 0.257512 +13.5718 0.257573 +13.6344 0.257633 +13.6969 0.257692 +13.7595 0.25775 +13.822 0.257807 +13.8845 0.257862 +13.9471 0.257916 +14.0096 0.25797 +14.0722 0.258022 +14.1347 0.258073 +14.1973 0.258123 +14.2598 0.258172 +14.3223 0.25822 +14.3849 0.258267 +14.4474 0.258314 +14.51 0.258359 +14.5725 0.258403 +14.6351 0.258447 +14.6976 0.25849 +14.7602 0.258531 +14.8227 0.258572 +14.8852 0.258613 +15 0.258652 +& +@target G0.S1 +@type xy +0 -6.8143e-05 +0.062543 -0.000266936 +0.125086 -0.000589431 +0.187629 -0.00102959 +0.250172 -0.00158189 +0.312715 -0.0022411 +0.375258 -0.00300213 +0.437801 -0.00385992 +0.500344 -0.00480946 +0.562887 -0.0058457 +0.62543 -0.00696356 +0.687973 -0.00815797 +0.750516 -0.00942382 +0.813059 -0.010756 +0.875602 -0.0121495 +0.938145 -0.0135992 +1.00069 -0.0151002 +1.06323 -0.0166476 +1.12577 -0.0182366 +1.18832 -0.0198626 +1.25086 -0.0215209 +1.3134 -0.0232073 +1.37595 -0.0249174 +1.43849 -0.0266472 +1.50103 -0.0283928 +1.56358 -0.0301506 +1.62612 -0.031917 +1.68866 -0.0336886 +1.7512 -0.0354624 +1.81375 -0.0372355 +1.87629 -0.039005 +1.93883 -0.0407685 +2.00138 -0.0425235 +2.06392 -0.0442679 +2.12646 -0.0459997 +2.18901 -0.0477171 +2.25155 -0.0494183 +2.31409 -0.0511019 +2.37663 -0.0527664 +2.43918 -0.0544108 +2.50172 -0.0560338 +2.56426 -0.0576345 +2.62681 -0.0592122 +2.68935 -0.060766 +2.75189 -0.0622953 +2.81444 -0.0637997 +2.87698 -0.0652787 +2.93952 -0.066732 +3.00206 -0.0681593 +3.06461 -0.0695604 +3.12715 -0.0709352 +3.18969 -0.0722837 +3.25224 -0.0736058 +3.31478 -0.0749016 +3.37732 -0.0761712 +3.43987 -0.0774148 +3.50241 -0.0786325 +3.56495 -0.0798244 +3.62749 -0.080991 +3.69004 -0.0821324 +3.75258 -0.0832489 +3.81512 -0.0843409 +3.87767 -0.0854087 +3.94021 -0.0864525 +4.00275 -0.0874729 +4.0653 -0.0884702 +4.12784 -0.0894447 +4.19038 -0.0903969 +4.25292 -0.0913271 +4.31547 -0.0922357 +4.37801 -0.0931232 +4.44055 -0.09399 +4.5031 -0.0948365 +4.56564 -0.095663 +4.62818 -0.0964701 +4.69073 -0.097258 +4.75327 -0.0980273 +4.81581 -0.0987782 +4.87835 -0.0995113 +4.9409 -0.100227 +5.00344 -0.100925 +5.06598 -0.101607 +5.12853 -0.102273 +5.19107 -0.102922 +5.25361 -0.103556 +5.31616 -0.104175 +5.3787 -0.104779 +5.44124 -0.105368 +5.50378 -0.105943 +5.56633 -0.106504 +5.62887 -0.107052 +5.69141 -0.107587 +5.75396 -0.108108 +5.8165 -0.108617 +5.87904 -0.109114 +5.94159 -0.109599 +6.00413 -0.110073 +6.06667 -0.110535 +6.12921 -0.110985 +6.19176 -0.111426 +6.2543 -0.111855 +6.31684 -0.112274 +6.37939 -0.112683 +6.44193 -0.113083 +6.50447 -0.113473 +6.56702 -0.113853 +6.62956 -0.114225 +6.6921 -0.114587 +6.75464 -0.114941 +6.81719 -0.115287 +6.87973 -0.115624 +6.94227 -0.115953 +7.00482 -0.116275 +7.06736 -0.116588 +7.1299 -0.116895 +7.19245 -0.117194 +7.25499 -0.117486 +7.31753 -0.117771 +7.38008 -0.11805 +7.44262 -0.118322 +7.50516 -0.118587 +7.5677 -0.118847 +7.63025 -0.1191 +7.69279 -0.119347 +7.75533 -0.119589 +7.81788 -0.119825 +7.88042 -0.120055 +7.94296 -0.12028 +8.00551 -0.1205 +8.06805 -0.120715 +8.13059 -0.120924 +8.19313 -0.121129 +8.25568 -0.121329 +8.31822 -0.121525 +8.38076 -0.121716 +8.44331 -0.121902 +8.50585 -0.122084 +8.56839 -0.122262 +8.63094 -0.122436 +8.69348 -0.122606 +8.75602 -0.122772 +8.81856 -0.122935 +8.88111 -0.123093 +8.94365 -0.123248 +9.00619 -0.1234 +9.06874 -0.123548 +9.13128 -0.123692 +9.19382 -0.123834 +9.25637 -0.123972 +9.31891 -0.124107 +9.38145 -0.124239 +9.44399 -0.124368 +9.50654 -0.124494 +9.56908 -0.124617 +9.63162 -0.124737 +9.69417 -0.124855 +9.75671 -0.12497 +9.81925 -0.125083 +9.8818 -0.125193 +9.94434 -0.1253 +10.0069 -0.125406 +10.0694 -0.125508 +10.132 -0.125609 +10.1945 -0.125707 +10.2571 -0.125803 +10.3196 -0.125897 +10.3821 -0.125989 +10.4447 -0.126079 +10.5072 -0.126167 +10.5698 -0.126253 +10.6323 -0.126337 +10.6949 -0.126419 +10.7574 -0.1265 +10.8199 -0.126579 +10.8825 -0.126656 +10.945 -0.126731 +11.0076 -0.126804 +11.0701 -0.126877 +11.1327 -0.126947 +11.1952 -0.127016 +11.2577 -0.127083 +11.3203 -0.127149 +11.3828 -0.127214 +11.4454 -0.127277 +11.5079 -0.127339 +11.5705 -0.127399 +11.633 -0.127459 +11.6955 -0.127517 +11.7581 -0.127573 +11.8206 -0.127629 +11.8832 -0.127683 +11.9457 -0.127736 +12.0083 -0.127788 +12.0708 -0.127839 +12.1333 -0.127889 +12.1959 -0.127938 +12.2584 -0.127985 +12.321 -0.128032 +12.3835 -0.128078 +12.4461 -0.128123 +12.5086 -0.128166 +12.5711 -0.128209 +12.6337 -0.128251 +12.6962 -0.128292 +12.7588 -0.128333 +12.8213 -0.128372 +12.8839 -0.128411 +12.9464 -0.128449 +13.0089 -0.128486 +13.0715 -0.128522 +13.134 -0.128558 +13.1966 -0.128592 +13.2591 -0.128626 +13.3217 -0.12866 +13.3842 -0.128692 +13.4467 -0.128724 +13.5093 -0.128756 +13.5718 -0.128787 +13.6344 -0.128817 +13.6969 -0.128846 +13.7595 -0.128875 +13.822 -0.128903 +13.8845 -0.128931 +13.9471 -0.128958 +14.0096 -0.128985 +14.0722 -0.129011 +14.1347 -0.129036 +14.1973 -0.129062 +14.2598 -0.129086 +14.3223 -0.12911 +14.3849 -0.129134 +14.4474 -0.129157 +14.51 -0.129179 +14.5725 -0.129202 +14.6351 -0.129223 +14.6976 -0.129245 +14.7602 -0.129266 +14.8227 -0.129286 +14.8852 -0.129306 +15 -0.129326 +& +@target G0.S2 +@type xy +0 -0.00783383 +0.062543 -0.0148786 +0.125086 -0.0213613 +0.187629 -0.0274197 +0.250172 -0.0331419 +0.312715 -0.0385863 +0.375258 -0.0437924 +0.437801 -0.0487881 +0.500344 -0.0535931 +0.562887 -0.0582216 +0.62543 -0.0626842 +0.687973 -0.0669888 +0.750516 -0.0711416 +0.813059 -0.0751474 +0.875602 -0.0790102 +0.938145 -0.0827335 +1.00069 -0.0863202 +1.06323 -0.0897732 +1.12577 -0.0930951 +1.18832 -0.0962886 +1.25086 -0.0993562 +1.3134 -0.102301 +1.37595 -0.105125 +1.43849 -0.107831 +1.50103 -0.110423 +1.56358 -0.112903 +1.62612 -0.115274 +1.68866 -0.11754 +1.7512 -0.119703 +1.81375 -0.121766 +1.87629 -0.123734 +1.93883 -0.125608 +2.00138 -0.127393 +2.06392 -0.129092 +2.12646 -0.130707 +2.18901 -0.132243 +2.25155 -0.133702 +2.31409 -0.135087 +2.37663 -0.136401 +2.43918 -0.137648 +2.50172 -0.13883 +2.56426 -0.139951 +2.62681 -0.141012 +2.68935 -0.142018 +2.75189 -0.14297 +2.81444 -0.14387 +2.87698 -0.144723 +2.93952 -0.145529 +3.00206 -0.146292 +3.06461 -0.147012 +3.12715 -0.147694 +3.18969 -0.148338 +3.25224 -0.148947 +3.31478 -0.149522 +3.37732 -0.150065 +3.43987 -0.150579 +3.50241 -0.151064 +3.56495 -0.151522 +3.62749 -0.151955 +3.69004 -0.152364 +3.75258 -0.152751 +3.81512 -0.153117 +3.87767 -0.153462 +3.94021 -0.153789 +4.00275 -0.154098 +4.0653 -0.154391 +4.12784 -0.154667 +4.19038 -0.154929 +4.25292 -0.155178 +4.31547 -0.155413 +4.37801 -0.155636 +4.44055 -0.155848 +4.5031 -0.156049 +4.56564 -0.15624 +4.62818 -0.156422 +4.69073 -0.156595 +4.75327 -0.156759 +4.81581 -0.156916 +4.87835 -0.157066 +4.9409 -0.157209 +5.00344 -0.157346 +5.06598 -0.157477 +5.12853 -0.157603 +5.19107 -0.157723 +5.25361 -0.157839 +5.31616 -0.157951 +5.3787 -0.158058 +5.44124 -0.158162 +5.50378 -0.158262 +5.56633 -0.158359 +5.62887 -0.158452 +5.69141 -0.158543 +5.75396 -0.158632 +5.8165 -0.158718 +5.87904 -0.158801 +5.94159 -0.158883 +6.00413 -0.158963 +6.06667 -0.159041 +6.12921 -0.159117 +6.19176 -0.159192 +6.2543 -0.159266 +6.31684 -0.159338 +6.37939 -0.15941 +6.44193 -0.15948 +6.50447 -0.159549 +6.56702 -0.159618 +6.62956 -0.159685 +6.6921 -0.159752 +6.75464 -0.159818 +6.81719 -0.159884 +6.87973 -0.159949 +6.94227 -0.160014 +7.00482 -0.160078 +7.06736 -0.160142 +7.1299 -0.160205 +7.19245 -0.160268 +7.25499 -0.160331 +7.31753 -0.160394 +7.38008 -0.160456 +7.44262 -0.160518 +7.50516 -0.16058 +7.5677 -0.160642 +7.63025 -0.160703 +7.69279 -0.160765 +7.75533 -0.160826 +7.81788 -0.160888 +7.88042 -0.160949 +7.94296 -0.16101 +8.00551 -0.161071 +8.06805 -0.161132 +8.13059 -0.161193 +8.19313 -0.161253 +8.25568 -0.161314 +8.31822 -0.161375 +8.38076 -0.161435 +8.44331 -0.161496 +8.50585 -0.161556 +8.56839 -0.161617 +8.63094 -0.161677 +8.69348 -0.161737 +8.75602 -0.161798 +8.81856 -0.161858 +8.88111 -0.161918 +8.94365 -0.161978 +9.00619 -0.162038 +9.06874 -0.162098 +9.13128 -0.162157 +9.19382 -0.162217 +9.25637 -0.162277 +9.31891 -0.162336 +9.38145 -0.162395 +9.44399 -0.162454 +9.50654 -0.162514 +9.56908 -0.162572 +9.63162 -0.162631 +9.69417 -0.16269 +9.75671 -0.162748 +9.81925 -0.162807 +9.8818 -0.162865 +9.94434 -0.162923 +10.0069 -0.162981 +10.0694 -0.163038 +10.132 -0.163096 +10.1945 -0.163153 +10.2571 -0.16321 +10.3196 -0.163267 +10.3821 -0.163324 +10.4447 -0.16338 +10.5072 -0.163437 +10.5698 -0.163493 +10.6323 -0.163548 +10.6949 -0.163604 +10.7574 -0.163659 +10.8199 -0.163715 +10.8825 -0.163769 +10.945 -0.163824 +11.0076 -0.163878 +11.0701 -0.163932 +11.1327 -0.163986 +11.1952 -0.16404 +11.2577 -0.164093 +11.3203 -0.164146 +11.3828 -0.164199 +11.4454 -0.164251 +11.5079 -0.164304 +11.5705 -0.164356 +11.633 -0.164407 +11.6955 -0.164459 +11.7581 -0.16451 +11.8206 -0.16456 +11.8832 -0.164611 +11.9457 -0.164661 +12.0083 -0.164711 +12.0708 -0.16476 +12.1333 -0.16481 +12.1959 -0.164858 +12.2584 -0.164907 +12.321 -0.164955 +12.3835 -0.165003 +12.4461 -0.165051 +12.5086 -0.165098 +12.5711 -0.165145 +12.6337 -0.165192 +12.6962 -0.165239 +12.7588 -0.165285 +12.8213 -0.16533 +12.8839 -0.165376 +12.9464 -0.165421 +13.0089 -0.165466 +13.0715 -0.16551 +13.134 -0.165554 +13.1966 -0.165598 +13.2591 -0.165642 +13.3217 -0.165685 +13.3842 -0.165728 +13.4467 -0.16577 +13.5093 -0.165812 +13.5718 -0.165854 +13.6344 -0.165896 +13.6969 -0.165937 +13.7595 -0.165978 +13.822 -0.166018 +13.8845 -0.166059 +13.9471 -0.166099 +14.0096 -0.166138 +14.0722 -0.166177 +14.1347 -0.166216 +14.1973 -0.166255 +14.2598 -0.166293 +14.3223 -0.166331 +14.3849 -0.166369 +14.4474 -0.166406 +14.51 -0.166444 +14.5725 -0.16648 +14.6351 -0.166517 +14.6976 -0.166553 +14.7602 -0.166589 +14.8227 -0.166624 +14.8852 -0.166659 +15 -0.166694 +& +@target G0.S3 +@type xy +0 1.9856e-05 +0.0117571 9.41872e-05 +0.0235142 -0.000263608 +0.0352713 0.000495562 +0.0470284 0.000764174 +0.0587856 0.000567285 +0.0705427 0.000690913 +0.0822998 0.00135833 +0.0940569 0.00264133 +0.105814 0.00334842 +0.117571 0.0038347 +0.129328 0.00457022 +0.141085 0.00498282 +0.152842 0.00561648 +0.1646 0.0061892 +0.176357 0.00634688 +0.188114 0.00738261 +0.199871 0.00856687 +0.211628 0.00852037 +0.223385 0.00945685 +0.235142 0.0100385 +0.246899 0.0109779 +0.258656 0.0116045 +0.270414 0.0125811 +0.282171 0.0127035 +0.293928 0.0129672 +0.305685 0.0133423 +0.317442 0.0144828 +0.329199 0.0146781 +0.340956 0.0145661 +0.352713 0.0146884 +0.36447 0.0151245 +0.376228 0.0154433 +0.387985 0.0152401 +0.399742 0.0160808 +0.411499 0.0168192 +0.423256 0.0184845 +0.435013 0.0191176 +0.44677 0.0202823 +0.458527 0.0220847 +0.470284 0.022532 +0.482042 0.0235472 +0.493799 0.0240825 +0.505556 0.0251614 +0.517313 0.0262614 +0.52907 0.0275804 +0.540827 0.0279245 +0.552584 0.0289179 +0.564341 0.0304582 +0.576098 0.0310183 +0.587856 0.0316627 +0.599613 0.032468 +0.61137 0.0334221 +0.623127 0.03427 +0.634884 0.0347316 +0.646641 0.03525 +0.658398 0.0351427 +0.670155 0.0354135 +0.681912 0.0366305 +0.69367 0.0375203 +0.705427 0.0384806 +0.717184 0.0394386 +0.728941 0.041016 +0.740698 0.041391 +0.752455 0.0418256 +0.764212 0.0421884 +0.775969 0.0431962 +0.787727 0.0439322 +0.799484 0.044177 +0.811241 0.0453008 +0.822998 0.0460008 +0.834755 0.0467905 +0.846512 0.0474844 +0.858269 0.0476235 +0.870026 0.0480057 +0.881783 0.0487231 +0.893541 0.0491598 +0.905298 0.0501486 +0.917055 0.0502307 +0.928812 0.051129 +0.940569 0.0516888 +0.952326 0.0526143 +0.964083 0.0535393 +0.97584 0.0542048 +0.987597 0.05481 +0.999355 0.0556719 +1.01111 0.056244 +1.02287 0.0569141 +1.03463 0.0575947 +1.04638 0.057755 +1.05814 0.0586492 +1.0699 0.0593 +1.08165 0.0597187 +1.09341 0.0605858 +1.10517 0.0611432 +1.11693 0.0619992 +1.12868 0.0623208 +1.14044 0.0624563 +1.1522 0.0632976 +1.16395 0.0631114 +1.17571 0.063795 +1.18747 0.064345 +1.19923 0.0645051 +1.21098 0.0656229 +1.22274 0.0663166 +1.2345 0.0670963 +1.24625 0.067695 +1.25801 0.068411 +1.26977 0.0691997 +1.28153 0.0697186 +1.29328 0.0703384 +1.30504 0.0705256 +1.3168 0.0704412 +1.32855 0.0702948 +1.34031 0.0705475 +1.35207 0.0713228 +1.36382 0.0715784 +1.37558 0.0721464 +1.38734 0.0730964 +1.3991 0.0735682 +1.41085 0.0741272 +1.42261 0.0748109 +1.43437 0.0755047 +1.44612 0.0756236 +1.45788 0.0759946 +1.46964 0.0767076 +1.4814 0.0774659 +1.49315 0.0778341 +1.50491 0.0783417 +1.51667 0.0782994 +1.52842 0.0793137 +1.54018 0.0797413 +1.55194 0.0805747 +1.5637 0.0810906 +1.57545 0.0816357 +1.58721 0.081619 +1.59897 0.0818451 +1.61072 0.0819806 +1.62248 0.0824924 +1.63424 0.0830143 +1.646 0.0836647 +1.65775 0.0844233 +1.66951 0.0850761 +1.68127 0.0855516 +1.69302 0.0862623 +1.70478 0.0864937 +1.71654 0.0868594 +1.7283 0.0870612 +1.74005 0.0881666 +1.75181 0.0883946 +1.76357 0.089015 +1.77532 0.0888034 +1.78708 0.0888491 +1.79884 0.0892704 +1.8106 0.0896717 +1.82235 0.089964 +1.83411 0.0899136 +1.84587 0.0905201 +1.85762 0.0907067 +1.86938 0.0915062 +1.88114 0.0915673 +1.8929 0.09251 +1.90465 0.0931272 +1.91641 0.0931205 +1.92817 0.0934498 +1.93992 0.094291 +1.95168 0.0950027 +1.96344 0.0950808 +1.97519 0.095271 +1.98695 0.0953716 +1.99871 0.0960507 +2.01047 0.0964357 +2.02222 0.0969171 +2.03398 0.097819 +2.04574 0.0981862 +2.05749 0.098553 +2.06925 0.0988702 +2.08101 0.0993019 +2.09277 0.0999091 +2.10452 0.100602 +2.11628 0.101233 +2.12804 0.101261 +2.13979 0.101961 +2.15155 0.102585 +2.16331 0.103339 +2.17507 0.103558 +2.18682 0.104379 +2.19858 0.104528 +2.21034 0.105451 +2.22209 0.105632 +2.23385 0.106016 +2.24561 0.10665 +2.25737 0.107608 +2.26912 0.107906 +2.28088 0.108591 +2.29264 0.108965 +2.30439 0.109447 +2.31615 0.110248 +2.32791 0.110177 +2.33967 0.110556 +2.35142 0.111034 +2.36318 0.11132 +2.37494 0.111373 +2.38669 0.111657 +2.39845 0.111686 +2.41021 0.112128 +2.42197 0.113056 +2.43372 0.113647 +2.44548 0.114291 +2.45724 0.114781 +2.46899 0.115007 +2.48075 0.115886 +2.49251 0.116744 +2.50426 0.11694 +2.51602 0.1175 +2.52778 0.117307 +2.53954 0.117795 +2.55129 0.11829 +2.56305 0.118068 +2.57481 0.118329 +2.58656 0.118991 +2.59832 0.118971 +2.61008 0.118798 +2.62184 0.119472 +2.63359 0.119787 +2.64535 0.119554 +2.65711 0.120435 +2.66886 0.120645 +2.68062 0.121194 +2.69238 0.121411 +2.70414 0.121577 +2.71589 0.122043 +2.72765 0.122 +2.73941 0.122111 +2.75116 0.12254 +2.76292 0.122814 +2.77468 0.122843 +2.78644 0.123384 +2.79819 0.123701 +2.80995 0.124581 +2.82171 0.124936 +2.83346 0.12484 +2.84522 0.126043 +2.85698 0.126594 +2.86874 0.126909 +2.88049 0.127057 +2.89225 0.127044 +2.90401 0.127106 +2.91576 0.128164 +2.92752 0.127947 +2.93928 0.128662 +2.95104 0.128912 +2.96279 0.128886 +2.97455 0.129011 +2.98631 0.128919 +2.99806 0.129416 +3.00982 0.130785 +3.02158 0.131028 +3.03333 0.131614 +3.04509 0.132137 +3.05685 0.132183 +3.06861 0.132981 +3.08036 0.133528 +3.09212 0.133876 +3.10388 0.134434 +3.11563 0.134647 +3.12739 0.134813 +3.13915 0.134847 +3.15091 0.13528 +3.16266 0.136018 +3.17442 0.136235 +3.18618 0.137048 +3.19793 0.137357 +3.20969 0.137563 +3.22145 0.137985 +3.23321 0.137901 +3.24496 0.138841 +3.25672 0.1391 +3.26848 0.139354 +3.28023 0.139652 +3.29199 0.139706 +3.30375 0.14011 +3.31551 0.140065 +3.32726 0.141018 +3.33902 0.141127 +3.35078 0.141597 +3.36253 0.141033 +3.37429 0.141287 +3.38605 0.142218 +3.39781 0.1427 +3.40956 0.143476 +3.42132 0.144431 +3.43308 0.145051 +3.44483 0.14539 +3.45659 0.145348 +3.46835 0.145813 +3.48011 0.14628 +3.49186 0.146828 +3.50362 0.146963 +3.51538 0.147051 +3.52713 0.14689 +3.53889 0.147667 +3.55065 0.147653 +3.5624 0.1482 +3.57416 0.148429 +3.58592 0.148998 +3.59768 0.149416 +3.60943 0.149539 +3.62119 0.149783 +3.63295 0.150656 +3.6447 0.150729 +3.65646 0.150976 +3.66822 0.150966 +3.67998 0.151384 +3.69173 0.152048 +3.70349 0.15229 +3.71525 0.152842 +3.727 0.152851 +3.73876 0.153238 +3.75052 0.153476 +3.76228 0.153646 +3.77403 0.153696 +3.78579 0.153622 +3.79755 0.153674 +3.8093 0.15424 +3.82106 0.154573 +3.83282 0.1549 +3.84458 0.155148 +3.85633 0.155255 +3.86809 0.155615 +3.87985 0.155939 +3.8916 0.155981 +3.90336 0.156637 +3.91512 0.157029 +3.92688 0.157805 +3.93863 0.157983 +3.95039 0.158422 +3.96215 0.158703 +3.9739 0.158954 +3.98566 0.158795 +3.99742 0.159075 +4.00918 0.158911 +4.02093 0.158869 +4.03269 0.159537 +4.04445 0.159608 +4.0562 0.160251 +4.06796 0.160466 +4.07972 0.160355 +4.09147 0.160429 +4.10323 0.160165 +4.11499 0.160004 +4.12675 0.160597 +4.1385 0.160949 +4.15026 0.161333 +4.16202 0.161412 +4.17377 0.161723 +4.18553 0.161576 +4.19729 0.16182 +4.20905 0.161808 +4.2208 0.161853 +4.23256 0.162214 +4.24432 0.162836 +4.25607 0.162892 +4.26783 0.162989 +4.27959 0.163164 +4.29135 0.163225 +4.3031 0.163755 +4.31486 0.164459 +4.32662 0.165101 +4.33837 0.165687 +4.35013 0.165698 +4.36189 0.165718 +4.37365 0.165921 +4.3854 0.166101 +4.39716 0.166023 +4.40892 0.166206 +4.42067 0.166052 +4.43243 0.166948 +4.44419 0.167442 +4.45595 0.166987 +4.4677 0.16701 +4.47946 0.167202 +4.49122 0.167557 +4.50297 0.167704 +4.51473 0.167822 +4.52649 0.168358 +4.53825 0.168299 +4.55 0.16847 +4.56176 0.168901 +4.57352 0.169137 +4.58527 0.169661 +4.59703 0.170364 +4.60879 0.170943 +4.62055 0.171625 +4.6323 0.171918 +4.64406 0.172048 +4.65582 0.172452 +4.66757 0.172308 +4.67933 0.172876 +4.69109 0.172692 +4.70284 0.173003 +4.7146 0.17356 +4.72636 0.17432 +4.73812 0.174174 +4.74987 0.173852 +4.76163 0.174418 +4.77339 0.175236 +4.78514 0.174663 +4.7969 0.174314 +4.80866 0.174533 +4.82042 0.175082 +4.83217 0.17473 +4.84393 0.175149 +4.85569 0.174726 +4.86744 0.174866 +4.8792 0.17494 +4.89096 0.174825 +4.90272 0.175535 +4.91447 0.175312 +4.92623 0.175691 +4.93799 0.176011 +4.94974 0.176007 +4.9615 0.176652 +4.97326 0.176692 +4.98502 0.177397 +4.99677 0.177911 +5.00853 0.178168 +5.02029 0.178657 +5.03204 0.178845 +5.0438 0.179476 +5.05556 0.179629 +5.06732 0.179672 +5.07907 0.179705 +5.09083 0.1795 +5.10259 0.179882 +5.11434 0.18021 +5.1261 0.180082 +5.13786 0.180362 +5.14962 0.180752 +5.16137 0.181242 +5.17313 0.181255 +5.18489 0.181645 +5.19664 0.181795 +5.2084 0.182548 +5.22016 0.182363 +5.23191 0.182271 +5.24367 0.182417 +5.25543 0.182597 +5.26719 0.183027 +5.27894 0.182984 +5.2907 0.183375 +5.30246 0.18279 +5.31421 0.183035 +5.32597 0.18322 +5.33773 0.183469 +5.34949 0.183574 +5.36124 0.182959 +5.373 0.18323 +5.38476 0.183547 +5.39651 0.18382 +5.40827 0.183909 +5.42003 0.184184 +5.43179 0.184332 +5.44354 0.184474 +5.4553 0.184896 +5.46706 0.185636 +5.47881 0.185372 +5.49057 0.185231 +5.50233 0.185171 +5.51409 0.185596 +5.52584 0.18579 +5.5376 0.185517 +5.54936 0.185933 +5.56111 0.186478 +5.57287 0.186623 +5.58463 0.186527 +5.59639 0.1866 +5.60814 0.186738 +5.6199 0.186966 +5.63166 0.186656 +5.64341 0.186885 +5.65517 0.186833 +5.66693 0.186986 +5.67869 0.186557 +5.69044 0.186948 +5.7022 0.186772 +5.71396 0.186713 +5.72571 0.187174 +5.73747 0.187677 +5.74923 0.187873 +5.76098 0.188262 +5.77274 0.187972 +5.7845 0.187933 +5.79626 0.188449 +5.80801 0.188732 +5.81977 0.188913 +5.83153 0.190087 +5.84328 0.190174 +5.85504 0.189972 +5.8668 0.190381 +5.87856 0.190046 +5.89031 0.190644 +5.90207 0.190937 +5.91383 0.191015 +5.92558 0.191467 +5.93734 0.191894 +5.9491 0.191441 +5.96086 0.191658 +5.97261 0.191788 +5.98437 0.192007 +5.99613 0.192073 +6.00788 0.192478 +6.01964 0.193099 +6.0314 0.193004 +6.04316 0.192888 +6.05491 0.192932 +6.06667 0.19275 +6.07843 0.192467 +6.09018 0.192619 +6.10194 0.192604 +6.1137 0.192789 +6.12546 0.192995 +6.13721 0.192988 +6.14897 0.192921 +6.16073 0.193238 +6.17248 0.193709 +6.18424 0.193379 +6.196 0.193278 +6.20776 0.193258 +6.21951 0.192786 +6.23127 0.193314 +6.24303 0.193579 +6.25478 0.193697 +6.26654 0.193786 +6.2783 0.193765 +6.29005 0.194163 +6.30181 0.194213 +6.31357 0.194354 +6.32533 0.194309 +6.33708 0.19455 +6.34884 0.194276 +6.3606 0.194401 +6.37235 0.194278 +6.38411 0.194546 +6.39587 0.194734 +6.40763 0.195249 +6.41938 0.19506 +6.43114 0.195358 +6.4429 0.195505 +6.45465 0.19565 +6.46641 0.195737 +6.47817 0.196085 +6.48993 0.196723 +6.50168 0.196401 +6.51344 0.196575 +6.5252 0.196142 +6.53695 0.196209 +6.54871 0.196479 +6.56047 0.196688 +6.57223 0.196631 +6.58398 0.196683 +6.59574 0.197365 +6.6075 0.197946 +6.61925 0.198036 +6.63101 0.198154 +6.64277 0.19841 +6.65453 0.198676 +6.66628 0.198467 +6.67804 0.198146 +6.6898 0.198199 +6.70155 0.198542 +6.71331 0.198811 +6.72507 0.199306 +6.73683 0.199445 +6.74858 0.19961 +6.76034 0.199587 +6.7721 0.199954 +6.78385 0.199968 +6.79561 0.199836 +6.80737 0.199429 +6.81912 0.199722 +6.83088 0.200336 +6.84264 0.200536 +6.8544 0.200407 +6.86615 0.200451 +6.87791 0.20058 +6.88967 0.200833 +6.90142 0.201015 +6.91318 0.201393 +6.92494 0.20142 +6.9367 0.201705 +6.94845 0.201819 +6.96021 0.201264 +6.97197 0.201899 +6.98372 0.201946 +6.99548 0.201836 +7.00724 0.20212 +7.019 0.202182 +7.03075 0.202608 +7.04251 0.202011 +7.05427 0.201992 +7.06602 0.202496 +7.07778 0.202542 +7.08954 0.202917 +7.1013 0.202872 +7.11305 0.202684 +7.12481 0.202858 +7.13657 0.203061 +7.14832 0.203254 +7.16008 0.203417 +7.17184 0.203703 +7.1836 0.203925 +7.19535 0.204166 +7.20711 0.204358 +7.21887 0.204438 +7.23062 0.204492 +7.24238 0.205037 +7.25414 0.205344 +7.2659 0.205663 +7.27765 0.205374 +7.28941 0.20572 +7.30117 0.2064 +7.31292 0.206284 +7.32468 0.206235 +7.33644 0.206262 +7.34819 0.206375 +7.35995 0.206765 +7.37171 0.206607 +7.38347 0.206605 +7.39522 0.206298 +7.40698 0.20654 +7.41874 0.206984 +7.43049 0.207366 +7.44225 0.207258 +7.45401 0.207372 +7.46577 0.206846 +7.47752 0.206743 +7.48928 0.206354 +7.50104 0.206527 +7.51279 0.206642 +7.52455 0.207085 +7.53631 0.20685 +7.54807 0.207211 +7.55982 0.207415 +7.57158 0.207448 +7.58334 0.207272 +7.59509 0.207184 +7.60685 0.206992 +7.61861 0.207344 +7.63037 0.207681 +7.64212 0.208131 +7.65388 0.20815 +7.66564 0.208551 +7.67739 0.209041 +7.68915 0.209096 +7.70091 0.209662 +7.71267 0.210218 +7.72442 0.210047 +7.73618 0.210145 +7.74794 0.209883 +7.75969 0.210107 +7.77145 0.210181 +7.78321 0.210123 +7.79497 0.210144 +7.80672 0.210041 +7.81848 0.209876 +7.83024 0.209711 +7.84199 0.209913 +7.85375 0.210202 +7.86551 0.210209 +7.87727 0.210776 +7.88902 0.211035 +7.90078 0.210764 +7.91254 0.210769 +7.92429 0.211206 +7.93605 0.211576 +7.94781 0.211618 +7.95956 0.21175 +7.97132 0.211551 +7.98308 0.211517 +7.99484 0.211553 +8.00659 0.211428 +8.01835 0.211102 +8.03011 0.210873 +8.04186 0.210841 +8.05362 0.210729 +8.06538 0.210781 +8.07714 0.211181 +8.08889 0.21083 +8.10065 0.210849 +8.11241 0.211161 +8.12416 0.21128 +8.13592 0.2115 +8.14768 0.211883 +8.15944 0.212079 +8.17119 0.211798 +8.18295 0.212361 +8.19471 0.21274 +8.20646 0.213051 +8.21822 0.213262 +8.22998 0.213823 +8.24174 0.213826 +8.25349 0.213503 +8.26525 0.213557 +8.27701 0.213012 +8.28876 0.212781 +8.30052 0.213248 +8.31228 0.213388 +8.32404 0.213307 +8.33579 0.213354 +8.34755 0.213884 +8.35931 0.214047 +8.37106 0.213708 +8.38282 0.213498 +8.39458 0.213683 +8.40634 0.21431 +8.41809 0.21451 +8.42985 0.214797 +8.44161 0.214124 +8.45336 0.214225 +8.46512 0.214278 +8.47688 0.214089 +8.48863 0.214246 +8.50039 0.214083 +8.51215 0.213969 +8.52391 0.214893 +8.53566 0.215249 +8.54742 0.214921 +8.55918 0.214879 +8.57093 0.215186 +8.58269 0.215486 +8.59445 0.215569 +8.60621 0.215298 +8.61796 0.21544 +8.62972 0.215602 +8.64148 0.215795 +8.65323 0.215758 +8.66499 0.215411 +8.67675 0.215472 +8.68851 0.215336 +8.70026 0.215599 +8.71202 0.215586 +8.72378 0.215992 +8.73553 0.216133 +8.74729 0.215716 +8.75905 0.215694 +8.77081 0.215947 +8.78256 0.216551 +8.79432 0.216927 +8.80608 0.216909 +8.81783 0.217397 +8.82959 0.217776 +8.84135 0.217245 +8.85311 0.217699 +8.86486 0.217508 +8.87662 0.217461 +8.88838 0.217759 +8.90013 0.217452 +8.91189 0.217837 +8.92365 0.217859 +8.93541 0.218336 +8.94716 0.218827 +8.95892 0.219457 +8.97068 0.218909 +8.98243 0.219376 +8.99419 0.219961 +9.00595 0.219552 +9.0177 0.219242 +9.02946 0.219145 +9.04122 0.219261 +9.05298 0.219721 +9.06473 0.219943 +9.07649 0.219981 +9.08825 0.219968 +9.1 0.219736 +9.11176 0.219858 +9.12352 0.219884 +9.13528 0.220094 +9.14703 0.220006 +9.15879 0.220028 +9.17055 0.219631 +9.1823 0.219852 +9.19406 0.21947 +9.20582 0.21995 +9.21758 0.219627 +9.22933 0.219861 +9.24109 0.220358 +9.25285 0.220406 +9.2646 0.220593 +9.27636 0.220987 +9.28812 0.221338 +9.29988 0.221496 +9.31163 0.221508 +9.32339 0.221292 +9.33515 0.221087 +9.3469 0.220701 +9.35866 0.221114 +9.37042 0.221547 +9.38218 0.221741 +9.39393 0.221187 +9.40569 0.221394 +9.41745 0.221507 +9.4292 0.221271 +9.44096 0.221234 +9.45272 0.221416 +9.46448 0.221988 +9.47623 0.221657 +9.48799 0.222022 +9.49975 0.222135 +9.5115 0.222351 +9.52326 0.222049 +9.53502 0.222167 +9.54677 0.222262 +9.55853 0.222369 +9.57029 0.223121 +9.58205 0.223174 +9.5938 0.222914 +9.60556 0.223346 +9.61732 0.223764 +9.62907 0.223538 +9.64083 0.223442 +9.65259 0.223037 +9.66435 0.223368 +9.6761 0.223735 +9.68786 0.223719 +9.69962 0.223733 +9.71137 0.223396 +9.72313 0.223626 +9.73489 0.223576 +9.74665 0.22357 +9.7584 0.223255 +9.77016 0.223625 +9.78192 0.223628 +9.79367 0.223673 +9.80543 0.223534 +9.81719 0.223399 +9.82895 0.223466 +9.8407 0.223093 +9.85246 0.223013 +9.86422 0.223214 +9.87597 0.22317 +9.88773 0.223218 +9.89949 0.223392 +9.91125 0.223761 +9.923 0.224149 +9.93476 0.224283 +9.94652 0.224629 +9.95827 0.224947 +9.97003 0.225233 +9.98179 0.225258 +9.99355 0.225487 +10.0053 0.225345 +10.0171 0.225449 +10.0288 0.225125 +10.0406 0.225527 +10.0523 0.225561 +10.0641 0.225497 +10.0758 0.225655 +10.0876 0.225664 +10.0994 0.225745 +10.1111 0.226491 +10.1229 0.226069 +10.1346 0.226128 +10.1464 0.226313 +10.1581 0.225845 +10.1699 0.226328 +10.1817 0.226473 +10.1934 0.226144 +10.2052 0.225751 +10.2169 0.226076 +10.2287 0.22602 +10.2404 0.226334 +10.2522 0.226503 +10.264 0.226224 +10.2757 0.226165 +10.2875 0.226432 +10.2992 0.2259 +10.311 0.225494 +10.3227 0.225923 +10.3345 0.225563 +10.3463 0.225624 +10.358 0.225538 +10.3698 0.225705 +10.3815 0.225814 +10.3933 0.225798 +10.405 0.225864 +10.4168 0.226136 +10.4286 0.225558 +10.4403 0.22558 +10.4521 0.225829 +10.4638 0.225755 +10.4756 0.225423 +10.4873 0.225174 +10.4991 0.225547 +10.5109 0.225459 +10.5226 0.22559 +10.5344 0.225695 +10.5461 0.225787 +10.5579 0.225542 +10.5696 0.22589 +10.5814 0.225967 +10.5932 0.226346 +10.6049 0.226169 +10.6167 0.225916 +10.6284 0.225766 +10.6402 0.225764 +10.6519 0.22568 +10.6637 0.226116 +10.6755 0.226324 +10.6872 0.226442 +10.699 0.227224 +10.7107 0.227417 +10.7225 0.227671 +10.7342 0.227677 +10.746 0.227405 +10.7578 0.227605 +10.7695 0.227796 +10.7813 0.227566 +10.793 0.227751 +10.8048 0.227704 +10.8165 0.227313 +10.8283 0.227267 +10.8401 0.227185 +10.8518 0.226978 +10.8636 0.227246 +10.8753 0.227441 +10.8871 0.227181 +10.8988 0.226406 +10.9106 0.226259 +10.9224 0.22621 +10.9341 0.22633 +10.9459 0.226478 +10.9576 0.226017 +10.9694 0.226021 +10.9811 0.225681 +10.9929 0.225777 +11.0047 0.225556 +11.0164 0.225027 +11.0282 0.225032 +11.0399 0.225366 +11.0517 0.225822 +11.0634 0.226501 +11.0752 0.226214 +11.087 0.226127 +11.0987 0.22614 +11.1105 0.226242 +11.1222 0.226641 +11.134 0.226464 +11.1457 0.226357 +11.1575 0.226018 +11.1693 0.225953 +11.181 0.226334 +11.1928 0.226388 +11.2045 0.226698 +11.2163 0.227168 +11.228 0.227466 +11.2398 0.227332 +11.2516 0.226968 +11.2633 0.22661 +11.2751 0.226724 +11.2868 0.227358 +11.2986 0.227748 +11.3103 0.228065 +11.3221 0.228451 +11.3339 0.22828 +11.3456 0.228102 +11.3574 0.228102 +11.3691 0.227946 +11.3809 0.228092 +11.3926 0.228459 +11.4044 0.228285 +11.4162 0.228025 +11.4279 0.228219 +11.4397 0.22857 +11.4514 0.228596 +11.4632 0.228451 +11.4749 0.228546 +11.4867 0.228691 +11.4985 0.229083 +11.5102 0.228933 +11.522 0.229109 +11.5337 0.228987 +11.5455 0.229357 +11.5572 0.229317 +11.569 0.229191 +11.5808 0.229337 +11.5925 0.228803 +11.6043 0.229197 +11.616 0.229723 +11.6278 0.229773 +11.6395 0.229981 +11.6513 0.229859 +11.6631 0.229903 +11.6748 0.229931 +11.6866 0.229538 +11.6983 0.229656 +11.7101 0.229762 +11.7218 0.229648 +11.7336 0.229877 +11.7454 0.230157 +11.7571 0.23027 +11.7689 0.229999 +11.7806 0.230489 +11.7924 0.231088 +11.8041 0.230872 +11.8159 0.231231 +11.8277 0.231109 +11.8394 0.231204 +11.8512 0.230977 +11.8629 0.231475 +11.8747 0.231069 +11.8864 0.230936 +11.8982 0.23156 +11.91 0.231032 +11.9217 0.230968 +11.9335 0.230629 +11.9452 0.231195 +11.957 0.231167 +11.9687 0.231941 +11.9805 0.232084 +11.9923 0.232162 +12.004 0.231648 +12.0158 0.231526 +12.0275 0.231547 +12.0393 0.231337 +12.051 0.231217 +12.0628 0.231391 +12.0746 0.231244 +12.0863 0.23161 +12.0981 0.231475 +12.1098 0.231021 +12.1216 0.231253 +12.1333 0.231486 +12.1451 0.231618 +12.1569 0.231928 +12.1686 0.231937 +12.1804 0.231585 +12.1921 0.231773 +12.2039 0.232053 +12.2156 0.232303 +12.2274 0.231695 +12.2392 0.23147 +12.2509 0.231995 +12.2627 0.231812 +12.2744 0.23214 +12.2862 0.232396 +12.2979 0.232068 +12.3097 0.232079 +12.3215 0.232204 +12.3332 0.232369 +12.345 0.231972 +12.3567 0.231806 +12.3685 0.231821 +12.3802 0.231698 +12.392 0.232083 +12.4038 0.231987 +12.4155 0.231974 +12.4273 0.231907 +12.439 0.231519 +12.4508 0.231773 +12.4625 0.231629 +12.4743 0.232165 +12.4861 0.232133 +12.4978 0.23194 +12.5096 0.231319 +12.5213 0.231079 +12.5331 0.231081 +12.5448 0.230731 +12.5566 0.231166 +12.5684 0.231305 +12.5801 0.231283 +12.5919 0.23103 +12.6036 0.231375 +12.6154 0.230629 +12.6271 0.230622 +12.6389 0.230956 +12.6507 0.230969 +12.6624 0.230656 +12.6742 0.230525 +12.6859 0.230513 +12.6977 0.230526 +12.7094 0.230509 +12.7212 0.230922 +12.733 0.231259 +12.7447 0.231695 +12.7565 0.231569 +12.7682 0.231876 +12.78 0.231874 +12.7917 0.231901 +12.8035 0.23172 +12.8153 0.231794 +12.827 0.231635 +12.8388 0.231774 +12.8505 0.23215 +12.8623 0.232014 +12.874 0.231903 +12.8858 0.232022 +12.8976 0.231969 +12.9093 0.231409 +12.9211 0.231234 +12.9328 0.230977 +12.9446 0.230845 +12.9563 0.230808 +12.9681 0.231302 +12.9799 0.23104 +12.9916 0.230956 +13.0034 0.230886 +13.0151 0.230527 +13.0269 0.231105 +13.0386 0.231174 +13.0504 0.23127 +13.0622 0.230981 +13.0739 0.231243 +13.0857 0.231644 +13.0974 0.231466 +13.1092 0.231072 +13.1209 0.231165 +13.1327 0.231096 +13.1445 0.231346 +13.1562 0.230859 +13.168 0.230682 +13.1797 0.230811 +13.1915 0.231211 +13.2032 0.230999 +13.215 0.230572 +13.2268 0.230552 +13.2385 0.230933 +13.2503 0.230827 +13.262 0.230631 +13.2738 0.230566 +13.2855 0.230563 +13.2973 0.231038 +13.3091 0.230774 +13.3208 0.230623 +13.3326 0.230304 +13.3443 0.230692 +13.3561 0.23103 +13.3678 0.231712 +13.3796 0.230816 +13.3914 0.231002 +13.4031 0.2308 +13.4149 0.230875 +13.4266 0.231007 +13.4384 0.230887 +13.4501 0.230767 +13.4619 0.230982 +13.4737 0.230934 +13.4854 0.230812 +13.4972 0.230942 +13.5089 0.231121 +13.5207 0.23103 +13.5324 0.231208 +13.5442 0.231341 +13.556 0.231565 +13.5677 0.231873 +13.5795 0.231503 +13.5912 0.231691 +13.603 0.231483 +13.6147 0.231594 +13.6265 0.231981 +13.6382 0.231565 +13.65 0.231804 +13.6618 0.231664 +13.6735 0.231974 +13.6853 0.231793 +13.697 0.231832 +13.7088 0.232215 +13.7205 0.232287 +13.7323 0.231881 +13.7441 0.231695 +13.7558 0.231826 +13.7676 0.231898 +13.7793 0.23242 +13.7911 0.232375 +13.8028 0.232659 +13.8146 0.232732 +13.8264 0.232607 +13.8381 0.233064 +13.8499 0.232967 +13.8616 0.233283 +13.8734 0.233432 +13.8851 0.233391 +13.8969 0.233439 +13.9087 0.234231 +13.9204 0.233649 +13.9322 0.233581 +13.9439 0.233233 +13.9557 0.233272 +13.9674 0.233056 +13.9792 0.23329 +13.991 0.232932 +14.0027 0.233328 +14.0145 0.233346 +14.0262 0.233305 +14.038 0.233305 +14.0497 0.232986 +14.0615 0.233634 +14.0733 0.233783 +14.085 0.233648 +14.0968 0.233301 +14.1085 0.233349 +14.1203 0.233298 +14.132 0.233089 +14.1438 0.233598 +14.1556 0.233923 +14.1673 0.234046 +14.1791 0.23411 +14.1908 0.233905 +14.2026 0.233769 +14.2143 0.233834 +14.2261 0.233693 +14.2379 0.233693 +14.2496 0.233782 +14.2614 0.233924 +14.2731 0.233888 +14.2849 0.233697 +14.2966 0.23368 +14.3084 0.233595 +14.3202 0.233638 +14.3319 0.233591 +14.3437 0.233841 +14.3554 0.233935 +14.3672 0.234243 +14.3789 0.234285 +14.3907 0.234453 +14.4025 0.234917 +14.4142 0.235093 +14.426 0.234819 +14.4377 0.234719 +14.4495 0.234411 +14.4612 0.234627 +14.473 0.234362 +14.4848 0.234229 +14.4965 0.233503 +14.5083 0.233107 +14.52 0.233115 +14.5318 0.233521 +14.5435 0.233507 +14.5553 0.233674 +14.5671 0.233063 +14.5788 0.233259 +14.5906 0.233386 +14.6023 0.233669 +14.6141 0.233309 +14.6258 0.233378 +14.6376 0.233946 +14.6494 0.233952 +14.6611 0.23401 +14.6729 0.234031 +14.6846 0.233514 +14.6964 0.232901 +14.7081 0.233163 +14.7199 0.23313 +14.7317 0.233611 +14.7434 0.233586 +14.7552 0.233739 +14.7669 0.233711 +14.7787 0.23363 +14.7904 0.233512 +14.8022 0.233257 +14.814 0.233246 +14.8257 0.233109 +14.8375 0.233273 +14.8492 0.232957 +14.861 0.232908 +14.8727 0.232545 +14.8845 0.232213 +14.8963 0.231885 +14.908 0.231953 +14.9198 0.231963 +14.9315 0.232038 +14.9433 0.231774 +14.955 0.231422 +14.9668 0.231526 +14.9786 0.231228 +15 0.231046 +& +@target G0.S4 +@type xy +0 0.000425499 +0.0117571 0.000187356 +0.0235142 -0.000125228 +0.0352713 -0.00045988 +0.0470284 -0.00111744 +0.0587856 -0.000625082 +0.0705427 -0.000666631 +0.0822998 -0.00202333 +0.0940569 -0.00264681 +0.105814 -0.00273623 +0.117571 -0.00313249 +0.129328 -0.00273926 +0.141085 -0.00288445 +0.152842 -0.00340483 +0.1646 -0.00402885 +0.176357 -0.00350536 +0.188114 -0.004165 +0.199871 -0.0048016 +0.211628 -0.00514191 +0.223385 -0.00470719 +0.235142 -0.00515124 +0.246899 -0.00571744 +0.258656 -0.00640529 +0.270414 -0.00756101 +0.282171 -0.00796806 +0.293928 -0.00833032 +0.305685 -0.00872981 +0.317442 -0.0095929 +0.329199 -0.0100816 +0.340956 -0.00999262 +0.352713 -0.0097741 +0.36447 -0.00994346 +0.376228 -0.00983688 +0.387985 -0.010343 +0.399742 -0.0105883 +0.411499 -0.0115434 +0.423256 -0.0123261 +0.435013 -0.0125197 +0.44677 -0.0125449 +0.458527 -0.0138006 +0.470284 -0.0142044 +0.482042 -0.0138186 +0.493799 -0.0139541 +0.505556 -0.0143889 +0.517313 -0.0150871 +0.52907 -0.0158259 +0.540827 -0.0162447 +0.552584 -0.0163707 +0.564341 -0.017322 +0.576098 -0.0174775 +0.587856 -0.0180355 +0.599613 -0.0189085 +0.61137 -0.0193006 +0.623127 -0.0195431 +0.634884 -0.0192869 +0.646641 -0.0193917 +0.658398 -0.0196015 +0.670155 -0.0197629 +0.681912 -0.0206593 +0.69367 -0.0215052 +0.705427 -0.0218685 +0.717184 -0.0224804 +0.728941 -0.0232014 +0.740698 -0.0227729 +0.752455 -0.023488 +0.764212 -0.0234679 +0.775969 -0.024202 +0.787727 -0.0248163 +0.799484 -0.0248611 +0.811241 -0.0253254 +0.822998 -0.0257549 +0.834755 -0.0257015 +0.846512 -0.0256059 +0.858269 -0.0252375 +0.870026 -0.025154 +0.881783 -0.0262169 +0.893541 -0.0262974 +0.905298 -0.0267955 +0.917055 -0.0272813 +0.928812 -0.0279415 +0.940569 -0.0286629 +0.952326 -0.0287975 +0.964083 -0.0290303 +0.97584 -0.029205 +0.987597 -0.0292536 +0.999355 -0.0297294 +1.01111 -0.030005 +1.02287 -0.0304115 +1.03463 -0.0307181 +1.04638 -0.0310967 +1.05814 -0.031511 +1.0699 -0.0318376 +1.08165 -0.0320712 +1.09341 -0.0326681 +1.10517 -0.0326331 +1.11693 -0.0330895 +1.12868 -0.0330254 +1.14044 -0.0333527 +1.1522 -0.0337093 +1.16395 -0.0333813 +1.17571 -0.0332793 +1.18747 -0.0334311 +1.19923 -0.0333282 +1.21098 -0.0337267 +1.22274 -0.0338758 +1.2345 -0.0348707 +1.24625 -0.0350562 +1.25801 -0.0350481 +1.26977 -0.0353278 +1.28153 -0.0351527 +1.29328 -0.0352736 +1.30504 -0.0350248 +1.3168 -0.035113 +1.32855 -0.0352397 +1.34031 -0.035198 +1.35207 -0.0359888 +1.36382 -0.0362453 +1.37558 -0.0365769 +1.38734 -0.0371456 +1.3991 -0.0375018 +1.41085 -0.037679 +1.42261 -0.0379818 +1.43437 -0.0383541 +1.44612 -0.0383335 +1.45788 -0.0389163 +1.46964 -0.0393369 +1.4814 -0.0397826 +1.49315 -0.0403374 +1.50491 -0.0403678 +1.51667 -0.0408036 +1.52842 -0.0415937 +1.54018 -0.0417033 +1.55194 -0.042188 +1.5637 -0.042412 +1.57545 -0.0425473 +1.58721 -0.042403 +1.59897 -0.0422981 +1.61072 -0.0428852 +1.62248 -0.0428074 +1.63424 -0.0427446 +1.646 -0.0431878 +1.65775 -0.0433538 +1.66951 -0.0438057 +1.68127 -0.0442483 +1.69302 -0.043964 +1.70478 -0.0441638 +1.71654 -0.04428 +1.7283 -0.0441858 +1.74005 -0.0445586 +1.75181 -0.0447788 +1.76357 -0.0449211 +1.77532 -0.0450309 +1.78708 -0.0446616 +1.79884 -0.0447532 +1.8106 -0.0447108 +1.82235 -0.0451354 +1.83411 -0.0449927 +1.84587 -0.0455725 +1.85762 -0.0455018 +1.86938 -0.0462571 +1.88114 -0.0459165 +1.8929 -0.0457727 +1.90465 -0.0463341 +1.91641 -0.0465096 +1.92817 -0.0470251 +1.93992 -0.0475806 +1.95168 -0.0475799 +1.96344 -0.0476287 +1.97519 -0.0475787 +1.98695 -0.0475703 +1.99871 -0.0483012 +2.01047 -0.0485921 +2.02222 -0.0487363 +2.03398 -0.0495131 +2.04574 -0.0500248 +2.05749 -0.0503297 +2.06925 -0.0503322 +2.08101 -0.0507757 +2.09277 -0.0512366 +2.10452 -0.0516777 +2.11628 -0.0518992 +2.12804 -0.0519112 +2.13979 -0.0521023 +2.15155 -0.0524324 +2.16331 -0.053012 +2.17507 -0.0531045 +2.18682 -0.0536815 +2.19858 -0.0535243 +2.21034 -0.0542602 +2.22209 -0.0543444 +2.23385 -0.0543112 +2.24561 -0.0542801 +2.25737 -0.0548666 +2.26912 -0.0554405 +2.28088 -0.0560311 +2.29264 -0.0560903 +2.30439 -0.0564183 +2.31615 -0.0564258 +2.32791 -0.0563384 +2.33967 -0.0563534 +2.35142 -0.0568832 +2.36318 -0.0566005 +2.37494 -0.0569221 +2.38669 -0.0568802 +2.39845 -0.0568474 +2.41021 -0.0571759 +2.42197 -0.057553 +2.43372 -0.0575684 +2.44548 -0.0578012 +2.45724 -0.0583638 +2.46899 -0.058529 +2.48075 -0.0587049 +2.49251 -0.0589015 +2.50426 -0.059426 +2.51602 -0.0594221 +2.52778 -0.0596998 +2.53954 -0.0600875 +2.55129 -0.0602417 +2.56305 -0.0599896 +2.57481 -0.060366 +2.58656 -0.0605716 +2.59832 -0.060728 +2.61008 -0.0605677 +2.62184 -0.060758 +2.63359 -0.0610251 +2.64535 -0.0607117 +2.65711 -0.0610839 +2.66886 -0.0610319 +2.68062 -0.0610852 +2.69238 -0.0611952 +2.70414 -0.0611025 +2.71589 -0.0615442 +2.72765 -0.061792 +2.73941 -0.0618262 +2.75116 -0.0619595 +2.76292 -0.0618217 +2.77468 -0.0619749 +2.78644 -0.0623991 +2.79819 -0.062597 +2.80995 -0.0628588 +2.82171 -0.0637004 +2.83346 -0.0637093 +2.84522 -0.0644837 +2.85698 -0.0648891 +2.86874 -0.0653183 +2.88049 -0.0657052 +2.89225 -0.0655349 +2.90401 -0.0657308 +2.91576 -0.0663819 +2.92752 -0.0661004 +2.93928 -0.0662787 +2.95104 -0.0663567 +2.96279 -0.0664161 +2.97455 -0.06639 +2.98631 -0.0665389 +2.99806 -0.0669616 +3.00982 -0.0678602 +3.02158 -0.0681082 +3.03333 -0.0685451 +3.04509 -0.0687404 +3.05685 -0.0689531 +3.06861 -0.0694528 +3.08036 -0.0697981 +3.09212 -0.0696649 +3.10388 -0.0698927 +3.11563 -0.0698725 +3.12739 -0.0695199 +3.13915 -0.0692366 +3.15091 -0.0698248 +3.16266 -0.0701679 +3.17442 -0.0706104 +3.18618 -0.0712565 +3.19793 -0.0715857 +3.20969 -0.0717496 +3.22145 -0.072139 +3.23321 -0.0719668 +3.24496 -0.0725221 +3.25672 -0.0723866 +3.26848 -0.0723179 +3.28023 -0.0722923 +3.29199 -0.0724855 +3.30375 -0.0725261 +3.31551 -0.0724661 +3.32726 -0.0731127 +3.33902 -0.0730978 +3.35078 -0.0732554 +3.36253 -0.0725017 +3.37429 -0.0726392 +3.38605 -0.0729057 +3.39781 -0.0731931 +3.40956 -0.0735666 +3.42132 -0.0741513 +3.43308 -0.0747809 +3.44483 -0.0751101 +3.45659 -0.074789 +3.46835 -0.0745378 +3.48011 -0.0749298 +3.49186 -0.0754765 +3.50362 -0.0753517 +3.51538 -0.0752513 +3.52713 -0.0754687 +3.53889 -0.0760888 +3.55065 -0.0760811 +3.5624 -0.0760118 +3.57416 -0.0759026 +3.58592 -0.0761649 +3.59768 -0.0761703 +3.60943 -0.0762469 +3.62119 -0.0765033 +3.63295 -0.0771932 +3.6447 -0.0772829 +3.65646 -0.0775818 +3.66822 -0.0776698 +3.67998 -0.0776518 +3.69173 -0.0778062 +3.70349 -0.0779256 +3.71525 -0.0783885 +3.727 -0.0782982 +3.73876 -0.0783391 +3.75052 -0.0786604 +3.76228 -0.0788521 +3.77403 -0.0789923 +3.78579 -0.0789248 +3.79755 -0.0791425 +3.8093 -0.0794071 +3.82106 -0.0796792 +3.83282 -0.0796248 +3.84458 -0.0797943 +3.85633 -0.0796095 +3.86809 -0.0799769 +3.87985 -0.0803124 +3.8916 -0.0806296 +3.90336 -0.081099 +3.91512 -0.0814441 +3.92688 -0.081948 +3.93863 -0.0818914 +3.95039 -0.0819114 +3.96215 -0.0818419 +3.9739 -0.0819878 +3.98566 -0.0818827 +3.99742 -0.0817362 +4.00918 -0.0816107 +4.02093 -0.0812396 +4.03269 -0.0810493 +4.04445 -0.0811272 +4.0562 -0.0814724 +4.06796 -0.0820969 +4.07972 -0.0820464 +4.09147 -0.0821445 +4.10323 -0.0819598 +4.11499 -0.0814929 +4.12675 -0.081607 +4.1385 -0.081759 +4.15026 -0.0818693 +4.16202 -0.081996 +4.17377 -0.0820509 +4.18553 -0.0823047 +4.19729 -0.0824778 +4.20905 -0.082706 +4.2208 -0.082882 +4.23256 -0.0828464 +4.24432 -0.0829578 +4.25607 -0.0824017 +4.26783 -0.0826183 +4.27959 -0.0827272 +4.29135 -0.0829137 +4.3031 -0.0836743 +4.31486 -0.0836656 +4.32662 -0.0839074 +4.33837 -0.0840141 +4.35013 -0.0842798 +4.36189 -0.0841612 +4.37365 -0.0842483 +4.3854 -0.084642 +4.39716 -0.0844005 +4.40892 -0.0845493 +4.42067 -0.0847779 +4.43243 -0.0850858 +4.44419 -0.0855428 +4.45595 -0.0851794 +4.4677 -0.0853219 +4.47946 -0.0848445 +4.49122 -0.0854107 +4.50297 -0.0853792 +4.51473 -0.0853186 +4.52649 -0.0857908 +4.53825 -0.0860004 +4.55 -0.0854675 +4.56176 -0.085608 +4.57352 -0.0854075 +4.58527 -0.0855801 +4.59703 -0.086034 +4.60879 -0.0861971 +4.62055 -0.0863338 +4.6323 -0.0865087 +4.64406 -0.086292 +4.65582 -0.0863962 +4.66757 -0.0862145 +4.67933 -0.0863373 +4.69109 -0.0862028 +4.70284 -0.0866162 +4.7146 -0.0869395 +4.72636 -0.0872977 +4.73812 -0.0869801 +4.74987 -0.0870759 +4.76163 -0.0871099 +4.77339 -0.0879133 +4.78514 -0.087795 +4.7969 -0.0876881 +4.80866 -0.0878025 +4.82042 -0.0878083 +4.83217 -0.0875735 +4.84393 -0.0879527 +4.85569 -0.087713 +4.86744 -0.0876637 +4.8792 -0.0875357 +4.89096 -0.0872748 +4.90272 -0.0880088 +4.91447 -0.0879573 +4.92623 -0.0881157 +4.93799 -0.0881489 +4.94974 -0.0881985 +4.9615 -0.0883161 +4.97326 -0.0883798 +4.98502 -0.0891359 +4.99677 -0.0889483 +5.00853 -0.0890256 +5.02029 -0.0892914 +5.03204 -0.0895539 +5.0438 -0.0897635 +5.05556 -0.0897362 +5.06732 -0.0895676 +5.07907 -0.0899598 +5.09083 -0.0898133 +5.10259 -0.0901993 +5.11434 -0.0903764 +5.1261 -0.0903954 +5.13786 -0.0909461 +5.14962 -0.0912172 +5.16137 -0.0911279 +5.17313 -0.0909587 +5.18489 -0.0915361 +5.19664 -0.091506 +5.2084 -0.0920245 +5.22016 -0.0918921 +5.23191 -0.091815 +5.24367 -0.0917063 +5.25543 -0.0919318 +5.26719 -0.0922795 +5.27894 -0.0927575 +5.2907 -0.0929861 +5.30246 -0.0928542 +5.31421 -0.0926837 +5.32597 -0.0929645 +5.33773 -0.0929874 +5.34949 -0.0932015 +5.36124 -0.0924499 +5.373 -0.0928923 +5.38476 -0.0928504 +5.39651 -0.0926119 +5.40827 -0.0926934 +5.42003 -0.092908 +5.43179 -0.0933451 +5.44354 -0.0934812 +5.4553 -0.0932873 +5.46706 -0.0937951 +5.47881 -0.0937819 +5.49057 -0.0934473 +5.50233 -0.0935036 +5.51409 -0.09379 +5.52584 -0.0940091 +5.5376 -0.0939725 +5.54936 -0.0942219 +5.56111 -0.0942857 +5.57287 -0.0940569 +5.58463 -0.0941417 +5.59639 -0.0940725 +5.60814 -0.0936748 +5.6199 -0.0939667 +5.63166 -0.0940074 +5.64341 -0.093876 +5.65517 -0.0940603 +5.66693 -0.0940406 +5.67869 -0.0940867 +5.69044 -0.0941675 +5.7022 -0.0939763 +5.71396 -0.0939821 +5.72571 -0.0938947 +5.73747 -0.0940116 +5.74923 -0.0943567 +5.76098 -0.0945012 +5.77274 -0.0941297 +5.7845 -0.0944156 +5.79626 -0.0948585 +5.80801 -0.0950934 +5.81977 -0.0950425 +5.83153 -0.0955721 +5.84328 -0.0953999 +5.85504 -0.0953249 +5.8668 -0.0954412 +5.87856 -0.0953503 +5.89031 -0.0957502 +5.90207 -0.096142 +5.91383 -0.096148 +5.92558 -0.0963379 +5.93734 -0.0967118 +5.9491 -0.096589 +5.96086 -0.0962926 +5.97261 -0.0964828 +5.98437 -0.096511 +5.99613 -0.0965553 +6.00788 -0.096692 +6.01964 -0.0967124 +6.0314 -0.0969976 +6.04316 -0.0971657 +6.05491 -0.0972022 +6.06667 -0.0973354 +6.07843 -0.0974768 +6.09018 -0.0976275 +6.10194 -0.0975425 +6.1137 -0.097946 +6.12546 -0.0979489 +6.13721 -0.0976651 +6.14897 -0.0977591 +6.16073 -0.0975217 +6.17248 -0.0980115 +6.18424 -0.0978612 +6.196 -0.0981055 +6.20776 -0.0979887 +6.21951 -0.0981899 +6.23127 -0.0985262 +6.24303 -0.098209 +6.25478 -0.0982997 +6.26654 -0.0983035 +6.2783 -0.0980821 +6.29005 -0.0980071 +6.30181 -0.0978531 +6.31357 -0.0977492 +6.32533 -0.0981937 +6.33708 -0.0983094 +6.34884 -0.0981341 +6.3606 -0.0982493 +6.37235 -0.0977738 +6.38411 -0.0978096 +6.39587 -0.097824 +6.40763 -0.0981474 +6.41938 -0.0980421 +6.43114 -0.0979647 +6.4429 -0.0984697 +6.45465 -0.098671 +6.46641 -0.0987398 +6.47817 -0.0990672 +6.48993 -0.09914 +6.50168 -0.0991121 +6.51344 -0.099256 +6.5252 -0.099024 +6.53695 -0.0990191 +6.54871 -0.0993784 +6.56047 -0.0994881 +6.57223 -0.0995413 +6.58398 -0.0996178 +6.59574 -0.100118 +6.6075 -0.100107 +6.61925 -0.0999534 +6.63101 -0.100171 +6.64277 -0.101033 +6.65453 -0.100888 +6.66628 -0.101044 +6.67804 -0.101012 +6.6898 -0.101065 +6.70155 -0.101272 +6.71331 -0.101128 +6.72507 -0.101495 +6.73683 -0.101687 +6.74858 -0.101931 +6.76034 -0.101962 +6.7721 -0.10254 +6.78385 -0.102334 +6.79561 -0.102245 +6.80737 -0.101971 +6.81912 -0.102584 +6.83088 -0.102363 +6.84264 -0.102227 +6.8544 -0.1025 +6.86615 -0.102574 +6.87791 -0.102728 +6.88967 -0.102698 +6.90142 -0.102888 +6.91318 -0.103045 +6.92494 -0.103242 +6.9367 -0.103456 +6.94845 -0.103477 +6.96021 -0.103027 +6.97197 -0.10343 +6.98372 -0.103692 +6.99548 -0.103846 +7.00724 -0.104072 +7.019 -0.104252 +7.03075 -0.104469 +7.04251 -0.103989 +7.05427 -0.103649 +7.06602 -0.103751 +7.07778 -0.103836 +7.08954 -0.104072 +7.1013 -0.103822 +7.11305 -0.103577 +7.12481 -0.103762 +7.13657 -0.103659 +7.14832 -0.103581 +7.16008 -0.103712 +7.17184 -0.103888 +7.1836 -0.104154 +7.19535 -0.104213 +7.20711 -0.104169 +7.21887 -0.10425 +7.23062 -0.10424 +7.24238 -0.104334 +7.25414 -0.104639 +7.2659 -0.104884 +7.27765 -0.104563 +7.28941 -0.104674 +7.30117 -0.104976 +7.31292 -0.105006 +7.32468 -0.104762 +7.33644 -0.104683 +7.34819 -0.105003 +7.35995 -0.105291 +7.37171 -0.104985 +7.38347 -0.10486 +7.39522 -0.105069 +7.40698 -0.105024 +7.41874 -0.105274 +7.43049 -0.105251 +7.44225 -0.105217 +7.45401 -0.105335 +7.46577 -0.105113 +7.47752 -0.105692 +7.48928 -0.10525 +7.50104 -0.105269 +7.51279 -0.10499 +7.52455 -0.105012 +7.53631 -0.104817 +7.54807 -0.104503 +7.55982 -0.104554 +7.57158 -0.104601 +7.58334 -0.104624 +7.59509 -0.10482 +7.60685 -0.104804 +7.61861 -0.104604 +7.63037 -0.10485 +7.64212 -0.104933 +7.65388 -0.104934 +7.66564 -0.10517 +7.67739 -0.105384 +7.68915 -0.105302 +7.70091 -0.105914 +7.71267 -0.106261 +7.72442 -0.105979 +7.73618 -0.106023 +7.74794 -0.105805 +7.75969 -0.106005 +7.77145 -0.105785 +7.78321 -0.105733 +7.79497 -0.105829 +7.80672 -0.105654 +7.81848 -0.105797 +7.83024 -0.105946 +7.84199 -0.106064 +7.85375 -0.106523 +7.86551 -0.106697 +7.87727 -0.106753 +7.88902 -0.106887 +7.90078 -0.107171 +7.91254 -0.107365 +7.92429 -0.107253 +7.93605 -0.107487 +7.94781 -0.107393 +7.95956 -0.107586 +7.97132 -0.107457 +7.98308 -0.107739 +7.99484 -0.107302 +8.00659 -0.107564 +8.01835 -0.107286 +8.03011 -0.107205 +8.04186 -0.107351 +8.05362 -0.107475 +8.06538 -0.107704 +8.07714 -0.10779 +8.08889 -0.107587 +8.10065 -0.107746 +8.11241 -0.107993 +8.12416 -0.107928 +8.13592 -0.107778 +8.14768 -0.107769 +8.15944 -0.107727 +8.17119 -0.107987 +8.18295 -0.1085 +8.19471 -0.108258 +8.20646 -0.108444 +8.21822 -0.108189 +8.22998 -0.108734 +8.24174 -0.109092 +8.25349 -0.109238 +8.26525 -0.108819 +8.27701 -0.108508 +8.28876 -0.108575 +8.30052 -0.109132 +8.31228 -0.109474 +8.32404 -0.10973 +8.33579 -0.109789 +8.34755 -0.109776 +8.35931 -0.109625 +8.37106 -0.109695 +8.38282 -0.109955 +8.39458 -0.109884 +8.40634 -0.110224 +8.41809 -0.110198 +8.42985 -0.110515 +8.44161 -0.110023 +8.45336 -0.110047 +8.46512 -0.110021 +8.47688 -0.110251 +8.48863 -0.110186 +8.50039 -0.110273 +8.51215 -0.110536 +8.52391 -0.110655 +8.53566 -0.110629 +8.54742 -0.110637 +8.55918 -0.110569 +8.57093 -0.11082 +8.58269 -0.110859 +8.59445 -0.110562 +8.60621 -0.110537 +8.61796 -0.110659 +8.62972 -0.110688 +8.64148 -0.11038 +8.65323 -0.110425 +8.66499 -0.110492 +8.67675 -0.110727 +8.68851 -0.110496 +8.70026 -0.110894 +8.71202 -0.110753 +8.72378 -0.110993 +8.73553 -0.111267 +8.74729 -0.111026 +8.75905 -0.110902 +8.77081 -0.110877 +8.78256 -0.111182 +8.79432 -0.11116 +8.80608 -0.111253 +8.81783 -0.111093 +8.82959 -0.111185 +8.84135 -0.110996 +8.85311 -0.111249 +8.86486 -0.111326 +8.87662 -0.110863 +8.88838 -0.11078 +8.90013 -0.110822 +8.91189 -0.110972 +8.92365 -0.11137 +8.93541 -0.111722 +8.94716 -0.112086 +8.95892 -0.112396 +8.97068 -0.112405 +8.98243 -0.112644 +8.99419 -0.112611 +9.00595 -0.112468 +9.0177 -0.11241 +9.02946 -0.11222 +9.04122 -0.112026 +9.05298 -0.112245 +9.06473 -0.112571 +9.07649 -0.112542 +9.08825 -0.112468 +9.1 -0.112484 +9.11176 -0.112607 +9.12352 -0.1129 +9.13528 -0.112801 +9.14703 -0.112808 +9.15879 -0.112716 +9.17055 -0.112442 +9.1823 -0.112355 +9.19406 -0.112448 +9.20582 -0.112819 +9.21758 -0.112645 +9.22933 -0.113035 +9.24109 -0.1133 +9.25285 -0.113534 +9.2646 -0.113531 +9.27636 -0.113247 +9.28812 -0.11322 +9.29988 -0.113091 +9.31163 -0.113034 +9.32339 -0.113023 +9.33515 -0.112878 +9.3469 -0.112722 +9.35866 -0.113033 +9.37042 -0.113514 +9.38218 -0.113816 +9.39393 -0.113623 +9.40569 -0.113782 +9.41745 -0.11424 +9.4292 -0.114143 +9.44096 -0.114362 +9.45272 -0.11423 +9.46448 -0.114775 +9.47623 -0.114115 +9.48799 -0.114335 +9.49975 -0.11453 +9.5115 -0.114766 +9.52326 -0.114653 +9.53502 -0.114869 +9.54677 -0.115241 +9.55853 -0.115563 +9.57029 -0.115505 +9.58205 -0.115572 +9.5938 -0.115487 +9.60556 -0.115925 +9.61732 -0.11609 +9.62907 -0.116092 +9.64083 -0.116151 +9.65259 -0.11578 +9.66435 -0.116216 +9.6761 -0.116509 +9.68786 -0.116256 +9.69962 -0.11614 +9.71137 -0.115922 +9.72313 -0.115948 +9.73489 -0.116186 +9.74665 -0.1161 +9.7584 -0.115718 +9.77016 -0.115655 +9.78192 -0.11548 +9.79367 -0.115775 +9.80543 -0.11601 +9.81719 -0.115895 +9.82895 -0.115365 +9.8407 -0.115367 +9.85246 -0.115531 +9.86422 -0.115881 +9.87597 -0.115665 +9.88773 -0.11558 +9.89949 -0.11553 +9.91125 -0.115704 +9.923 -0.116036 +9.93476 -0.116143 +9.94652 -0.116329 +9.95827 -0.116369 +9.97003 -0.116562 +9.98179 -0.11682 +9.99355 -0.117093 +10.0053 -0.117289 +10.0171 -0.117344 +10.0288 -0.116995 +10.0406 -0.117307 +10.0523 -0.117215 +10.0641 -0.117568 +10.0758 -0.117629 +10.0876 -0.117958 +10.0994 -0.117999 +10.1111 -0.118507 +10.1229 -0.118164 +10.1346 -0.118244 +10.1464 -0.118422 +10.1581 -0.11803 +10.1699 -0.118096 +10.1817 -0.118052 +10.1934 -0.117889 +10.2052 -0.118199 +10.2169 -0.11839 +10.2287 -0.118254 +10.2404 -0.118502 +10.2522 -0.118587 +10.264 -0.11857 +10.2757 -0.118814 +10.2875 -0.118793 +10.2992 -0.118489 +10.311 -0.118356 +10.3227 -0.11851 +10.3345 -0.118321 +10.3463 -0.118387 +10.358 -0.118492 +10.3698 -0.118286 +10.3815 -0.118451 +10.3933 -0.118054 +10.405 -0.11806 +10.4168 -0.11784 +10.4286 -0.117732 +10.4403 -0.117773 +10.4521 -0.1178 +10.4638 -0.117376 +10.4756 -0.117354 +10.4873 -0.11749 +10.4991 -0.117716 +10.5109 -0.117455 +10.5226 -0.117772 +10.5344 -0.118107 +10.5461 -0.118176 +10.5579 -0.118264 +10.5696 -0.11836 +10.5814 -0.11811 +10.5932 -0.118349 +10.6049 -0.118106 +10.6167 -0.117715 +10.6284 -0.11755 +10.6402 -0.117684 +10.6519 -0.11757 +10.6637 -0.117766 +10.6755 -0.117935 +10.6872 -0.118055 +10.699 -0.118619 +10.7107 -0.118628 +10.7225 -0.118375 +10.7342 -0.11869 +10.746 -0.118777 +10.7578 -0.118809 +10.7695 -0.119141 +10.7813 -0.119112 +10.793 -0.119752 +10.8048 -0.119811 +10.8165 -0.119942 +10.8283 -0.119637 +10.8401 -0.119346 +10.8518 -0.119144 +10.8636 -0.119238 +10.8753 -0.119379 +10.8871 -0.119131 +10.8988 -0.11892 +10.9106 -0.118766 +10.9224 -0.119044 +10.9341 -0.118831 +10.9459 -0.118587 +10.9576 -0.11826 +10.9694 -0.118387 +10.9811 -0.118142 +10.9929 -0.118194 +11.0047 -0.118041 +11.0164 -0.117789 +11.0282 -0.117917 +11.0399 -0.11827 +11.0517 -0.118335 +11.0634 -0.118675 +11.0752 -0.118464 +11.087 -0.118566 +11.0987 -0.118809 +11.1105 -0.118911 +11.1222 -0.119327 +11.134 -0.119334 +11.1457 -0.119251 +11.1575 -0.118823 +11.1693 -0.118876 +11.181 -0.118984 +11.1928 -0.119051 +11.2045 -0.119241 +11.2163 -0.119608 +11.228 -0.119908 +11.2398 -0.11985 +11.2516 -0.119676 +11.2633 -0.119451 +11.2751 -0.119492 +11.2868 -0.119826 +11.2986 -0.11999 +11.3103 -0.120056 +11.3221 -0.120282 +11.3339 -0.120173 +11.3456 -0.120146 +11.3574 -0.119991 +11.3691 -0.119788 +11.3809 -0.120155 +11.3926 -0.120203 +11.4044 -0.120244 +11.4162 -0.120534 +11.4279 -0.120729 +11.4397 -0.120821 +11.4514 -0.120705 +11.4632 -0.120661 +11.4749 -0.120428 +11.4867 -0.120308 +11.4985 -0.120191 +11.5102 -0.120225 +11.522 -0.120201 +11.5337 -0.120001 +11.5455 -0.120182 +11.5572 -0.120223 +11.569 -0.120364 +11.5808 -0.120394 +11.5925 -0.120149 +11.6043 -0.12018 +11.616 -0.120659 +11.6278 -0.120191 +11.6395 -0.120452 +11.6513 -0.120279 +11.6631 -0.120366 +11.6748 -0.120473 +11.6866 -0.120583 +11.6983 -0.120646 +11.7101 -0.120634 +11.7218 -0.120665 +11.7336 -0.120895 +11.7454 -0.120819 +11.7571 -0.1208 +11.7689 -0.120712 +11.7806 -0.120924 +11.7924 -0.121333 +11.8041 -0.121464 +11.8159 -0.121734 +11.8277 -0.121691 +11.8394 -0.121676 +11.8512 -0.121825 +11.8629 -0.122146 +11.8747 -0.121702 +11.8864 -0.121566 +11.8982 -0.121889 +11.91 -0.121791 +11.9217 -0.121869 +11.9335 -0.121544 +11.9452 -0.122232 +11.957 -0.122213 +11.9687 -0.122397 +11.9805 -0.122618 +11.9923 -0.122647 +12.004 -0.122632 +12.0158 -0.122335 +12.0275 -0.122699 +12.0393 -0.122652 +12.051 -0.122481 +12.0628 -0.122238 +12.0746 -0.122285 +12.0863 -0.122258 +12.0981 -0.12184 +12.1098 -0.121878 +12.1216 -0.122289 +12.1333 -0.122436 +12.1451 -0.122826 +12.1569 -0.123061 +12.1686 -0.122827 +12.1804 -0.122356 +12.1921 -0.122258 +12.2039 -0.12209 +12.2156 -0.122217 +12.2274 -0.122058 +12.2392 -0.122234 +12.2509 -0.122446 +12.2627 -0.122313 +12.2744 -0.122527 +12.2862 -0.122556 +12.2979 -0.12222 +12.3097 -0.122307 +12.3215 -0.122113 +12.3332 -0.122509 +12.345 -0.122622 +12.3567 -0.122294 +12.3685 -0.122157 +12.3802 -0.122008 +12.392 -0.122308 +12.4038 -0.122153 +12.4155 -0.122123 +12.4273 -0.122238 +12.439 -0.12216 +12.4508 -0.122336 +12.4625 -0.122022 +12.4743 -0.121982 +12.4861 -0.121991 +12.4978 -0.122092 +12.5096 -0.121903 +12.5213 -0.121698 +12.5331 -0.121596 +12.5448 -0.121025 +12.5566 -0.121222 +12.5684 -0.120958 +12.5801 -0.121036 +12.5919 -0.12084 +12.6036 -0.121237 +12.6154 -0.120975 +12.6271 -0.12085 +12.6389 -0.121009 +12.6507 -0.120759 +12.6624 -0.12045 +12.6742 -0.120367 +12.6859 -0.120495 +12.6977 -0.12042 +12.7094 -0.120249 +12.7212 -0.120734 +12.733 -0.120721 +12.7447 -0.12087 +12.7565 -0.120958 +12.7682 -0.120806 +12.78 -0.120944 +12.7917 -0.120969 +12.8035 -0.120711 +12.8153 -0.1207 +12.827 -0.120602 +12.8388 -0.120588 +12.8505 -0.120993 +12.8623 -0.120635 +12.874 -0.120504 +12.8858 -0.120611 +12.8976 -0.12093 +12.9093 -0.120665 +12.9211 -0.121182 +12.9328 -0.121138 +12.9446 -0.121304 +12.9563 -0.120923 +12.9681 -0.121184 +12.9799 -0.121397 +12.9916 -0.121162 +13.0034 -0.121059 +13.0151 -0.120679 +13.0269 -0.120973 +13.0386 -0.120986 +13.0504 -0.121188 +13.0622 -0.121092 +13.0739 -0.121498 +13.0857 -0.121737 +13.0974 -0.121834 +13.1092 -0.121332 +13.1209 -0.121623 +13.1327 -0.121411 +13.1445 -0.121216 +13.1562 -0.120907 +13.168 -0.120539 +13.1797 -0.121107 +13.1915 -0.120914 +13.2032 -0.120992 +13.215 -0.121364 +13.2268 -0.121183 +13.2385 -0.121477 +13.2503 -0.121548 +13.262 -0.121348 +13.2738 -0.121371 +13.2855 -0.121245 +13.2973 -0.121567 +13.3091 -0.121256 +13.3208 -0.121295 +13.3326 -0.121082 +13.3443 -0.121067 +13.3561 -0.12105 +13.3678 -0.121331 +13.3796 -0.12103 +13.3914 -0.121254 +13.4031 -0.12112 +13.4149 -0.121259 +13.4266 -0.121706 +13.4384 -0.121537 +13.4501 -0.12145 +13.4619 -0.121302 +13.4737 -0.121614 +13.4854 -0.121865 +13.4972 -0.121528 +13.5089 -0.121641 +13.5207 -0.12176 +13.5324 -0.121731 +13.5442 -0.121834 +13.556 -0.121871 +13.5677 -0.122226 +13.5795 -0.122189 +13.5912 -0.122391 +13.603 -0.122558 +13.6147 -0.122671 +13.6265 -0.122764 +13.6382 -0.122586 +13.65 -0.122645 +13.6618 -0.122495 +13.6735 -0.122767 +13.6853 -0.122416 +13.697 -0.122459 +13.7088 -0.122091 +13.7205 -0.122324 +13.7323 -0.122378 +13.7441 -0.12182 +13.7558 -0.122048 +13.7676 -0.122523 +13.7793 -0.122365 +13.7911 -0.122051 +13.8028 -0.122266 +13.8146 -0.122156 +13.8264 -0.122116 +13.8381 -0.122134 +13.8499 -0.121925 +13.8616 -0.122327 +13.8734 -0.122368 +13.8851 -0.122612 +13.8969 -0.122539 +13.9087 -0.122623 +13.9204 -0.122344 +13.9322 -0.122347 +13.9439 -0.122641 +13.9557 -0.122882 +13.9674 -0.122615 +13.9792 -0.122809 +13.991 -0.122663 +14.0027 -0.122715 +14.0145 -0.12268 +14.0262 -0.12267 +14.038 -0.122905 +14.0497 -0.122678 +14.0615 -0.123064 +14.0733 -0.123157 +14.085 -0.123149 +14.0968 -0.122696 +14.1085 -0.122821 +14.1203 -0.123012 +14.132 -0.123055 +14.1438 -0.123265 +14.1556 -0.12342 +14.1673 -0.123449 +14.1791 -0.123412 +14.1908 -0.123723 +14.2026 -0.123588 +14.2143 -0.123398 +14.2261 -0.123459 +14.2379 -0.123422 +14.2496 -0.123229 +14.2614 -0.123443 +14.2731 -0.123523 +14.2849 -0.123587 +14.2966 -0.123555 +14.3084 -0.123468 +14.3202 -0.123514 +14.3319 -0.123573 +14.3437 -0.123786 +14.3554 -0.123683 +14.3672 -0.12369 +14.3789 -0.123794 +14.3907 -0.123935 +14.4025 -0.124349 +14.4142 -0.124274 +14.426 -0.123816 +14.4377 -0.123872 +14.4495 -0.123691 +14.4612 -0.124096 +14.473 -0.123718 +14.4848 -0.123649 +14.4965 -0.123474 +14.5083 -0.12346 +14.52 -0.123608 +14.5318 -0.123908 +14.5435 -0.123921 +14.5553 -0.124344 +14.5671 -0.124013 +14.5788 -0.124025 +14.5906 -0.124122 +14.6023 -0.124144 +14.6141 -0.124132 +14.6258 -0.124137 +14.6376 -0.124412 +14.6494 -0.124746 +14.6611 -0.124784 +14.6729 -0.12457 +14.6846 -0.124244 +14.6964 -0.123537 +14.7081 -0.123509 +14.7199 -0.123327 +14.7317 -0.123136 +14.7434 -0.123147 +14.7552 -0.123137 +14.7669 -0.123162 +14.7787 -0.123054 +14.7904 -0.123061 +14.8022 -0.122906 +14.814 -0.123308 +14.8257 -0.123503 +14.8375 -0.123588 +14.8492 -0.123284 +14.861 -0.123279 +14.8727 -0.122929 +14.8845 -0.122701 +14.8963 -0.12244 +14.908 -0.122514 +14.9198 -0.122849 +14.9315 -0.122712 +14.9433 -0.122289 +14.955 -0.121901 +14.9668 -0.12221 +14.9786 -0.122111 +15 -0.122139 +& +@target G0.S5 +@type xy +0 -0.000445355 +0.0117571 -0.000281543 +0.0235142 0.000388836 +0.0352713 -3.56828e-05 +0.0470284 0.00035327 +0.0587856 5.77973e-05 +0.0705427 -2.4282e-05 +0.0822998 0.000664998 +0.0940569 5.47206e-06 +0.105814 -0.00061219 +0.117571 -0.000702207 +0.129328 -0.00183095 +0.141085 -0.00209837 +0.152842 -0.00221165 +0.1646 -0.00216036 +0.176357 -0.00284153 +0.188114 -0.00321761 +0.199871 -0.00376527 +0.211628 -0.00337846 +0.223385 -0.00474966 +0.235142 -0.00488722 +0.246899 -0.00526047 +0.258656 -0.00519926 +0.270414 -0.00502007 +0.282171 -0.00473543 +0.293928 -0.00463688 +0.305685 -0.00461253 +0.317442 -0.00488991 +0.329199 -0.00459655 +0.340956 -0.00457344 +0.352713 -0.00491433 +0.36447 -0.00518102 +0.376228 -0.00560638 +0.387985 -0.00489713 +0.399742 -0.0054925 +0.411499 -0.00527588 +0.423256 -0.00615844 +0.435013 -0.00659783 +0.44677 -0.00773747 +0.458527 -0.00828414 +0.470284 -0.00832756 +0.482042 -0.00972865 +0.493799 -0.0101283 +0.505556 -0.0107725 +0.517313 -0.0111744 +0.52907 -0.0117545 +0.540827 -0.0116798 +0.552584 -0.0125472 +0.564341 -0.0131363 +0.576098 -0.0135407 +0.587856 -0.0136272 +0.599613 -0.0135595 +0.61137 -0.0141215 +0.623127 -0.0147269 +0.634884 -0.0154447 +0.646641 -0.0158584 +0.658398 -0.0155411 +0.670155 -0.0156506 +0.681912 -0.0159712 +0.69367 -0.0160152 +0.705427 -0.0166121 +0.717184 -0.0169581 +0.728941 -0.0178146 +0.740698 -0.0186181 +0.752455 -0.0183376 +0.764212 -0.0187205 +0.775969 -0.0189942 +0.787727 -0.019116 +0.799484 -0.0193158 +0.811241 -0.0199754 +0.822998 -0.0202459 +0.834755 -0.021089 +0.846512 -0.0218785 +0.858269 -0.022386 +0.870026 -0.0228517 +0.881783 -0.0225062 +0.893541 -0.0228624 +0.905298 -0.0233531 +0.917055 -0.0229494 +0.928812 -0.0231875 +0.940569 -0.0230259 +0.952326 -0.0238168 +0.964083 -0.024509 +0.97584 -0.0249997 +0.987597 -0.0255564 +0.999355 -0.0259425 +1.01111 -0.026239 +1.02287 -0.0265026 +1.03463 -0.0268766 +1.04638 -0.0266583 +1.05814 -0.0271382 +1.0699 -0.0274624 +1.08165 -0.0276475 +1.09341 -0.0279177 +1.10517 -0.0285101 +1.11693 -0.0289097 +1.12868 -0.0292954 +1.14044 -0.0291036 +1.1522 -0.0295883 +1.16395 -0.0297301 +1.17571 -0.0305157 +1.18747 -0.0309139 +1.19923 -0.0311769 +1.21098 -0.0318962 +1.22274 -0.0324408 +1.2345 -0.0322256 +1.24625 -0.0326388 +1.25801 -0.0333629 +1.26977 -0.0338718 +1.28153 -0.0345659 +1.29328 -0.0350648 +1.30504 -0.0355008 +1.3168 -0.0353281 +1.32855 -0.0350551 +1.34031 -0.0353496 +1.35207 -0.035334 +1.36382 -0.035333 +1.37558 -0.0355695 +1.38734 -0.0359508 +1.3991 -0.0360664 +1.41085 -0.0364482 +1.42261 -0.0368291 +1.43437 -0.0371506 +1.44612 -0.0372901 +1.45788 -0.0370783 +1.46964 -0.0373707 +1.4814 -0.0376833 +1.49315 -0.0374967 +1.50491 -0.0379739 +1.51667 -0.0374959 +1.52842 -0.03772 +1.54018 -0.038038 +1.55194 -0.0383867 +1.5637 -0.0386786 +1.57545 -0.0390885 +1.58721 -0.0392161 +1.59897 -0.039547 +1.61072 -0.0390954 +1.62248 -0.039685 +1.63424 -0.0402697 +1.646 -0.0404769 +1.65775 -0.0410694 +1.66951 -0.0412704 +1.68127 -0.0413033 +1.69302 -0.0422983 +1.70478 -0.0423299 +1.71654 -0.0425794 +1.7283 -0.0428754 +1.74005 -0.043608 +1.75181 -0.0436158 +1.76357 -0.044094 +1.77532 -0.0437726 +1.78708 -0.0441874 +1.79884 -0.0445172 +1.8106 -0.0449609 +1.82235 -0.0448286 +1.83411 -0.0449209 +1.84587 -0.0449476 +1.85762 -0.0452049 +1.86938 -0.0452491 +1.88114 -0.0456507 +1.8929 -0.0467372 +1.90465 -0.0467931 +1.91641 -0.0466109 +1.92817 -0.0464246 +1.93992 -0.0467105 +1.95168 -0.0474228 +1.96344 -0.0474521 +1.97519 -0.0476923 +1.98695 -0.0478013 +1.99871 -0.0477495 +2.01047 -0.0478435 +2.02222 -0.0481808 +2.03398 -0.0483059 +2.04574 -0.0481614 +2.05749 -0.0482233 +2.06925 -0.048538 +2.08101 -0.0485261 +2.09277 -0.0486725 +2.10452 -0.0489239 +2.11628 -0.0493337 +2.12804 -0.0493494 +2.13979 -0.0498584 +2.15155 -0.0501531 +2.16331 -0.0503274 +2.17507 -0.0504536 +2.18682 -0.0506971 +2.19858 -0.0510041 +2.21034 -0.0511904 +2.22209 -0.0512881 +2.23385 -0.0517051 +2.24561 -0.0523704 +2.25737 -0.0527419 +2.26912 -0.0524655 +2.28088 -0.0525603 +2.29264 -0.0528747 +2.30439 -0.0530282 +2.31615 -0.0538225 +2.32791 -0.0538382 +2.33967 -0.0542031 +2.35142 -0.0541503 +2.36318 -0.0547193 +2.37494 -0.0544504 +2.38669 -0.0547767 +2.39845 -0.054839 +2.41021 -0.0549525 +2.42197 -0.0555025 +2.43372 -0.0560789 +2.44548 -0.0564895 +2.45724 -0.056417 +2.46899 -0.0564776 +2.48075 -0.0571808 +2.49251 -0.057842 +2.50426 -0.057514 +2.51602 -0.0580777 +2.52778 -0.0576074 +2.53954 -0.0577071 +2.55129 -0.0580482 +2.56305 -0.0580787 +2.57481 -0.0579626 +2.58656 -0.0584195 +2.59832 -0.0582427 +2.61008 -0.0582302 +2.62184 -0.0587143 +2.63359 -0.0587616 +2.64535 -0.0588425 +2.65711 -0.0593511 +2.66886 -0.0596129 +2.68062 -0.0601093 +2.69238 -0.0602157 +2.70414 -0.0604741 +2.71589 -0.060499 +2.72765 -0.060208 +2.73941 -0.0602844 +2.75116 -0.0605806 +2.76292 -0.0609922 +2.77468 -0.0608685 +2.78644 -0.0609849 +2.79819 -0.061104 +2.80995 -0.0617225 +2.82171 -0.0612359 +2.83346 -0.061131 +2.84522 -0.0615594 +2.85698 -0.0617047 +2.86874 -0.0615912 +2.88049 -0.0613522 +2.89225 -0.0615087 +2.90401 -0.0613755 +2.91576 -0.0617821 +2.92752 -0.0618463 +2.93928 -0.0623832 +2.95104 -0.0625556 +2.96279 -0.0624703 +2.97455 -0.062621 +2.98631 -0.0623798 +2.99806 -0.0624542 +3.00982 -0.0629249 +3.02158 -0.0629194 +3.03333 -0.0630692 +3.04509 -0.0633963 +3.05685 -0.0632303 +3.06861 -0.0635287 +3.08036 -0.0637298 +3.09212 -0.0642114 +3.10388 -0.0645417 +3.11563 -0.0647742 +3.12739 -0.0652927 +3.13915 -0.0656102 +3.15091 -0.0654548 +3.16266 -0.0658504 +3.17442 -0.0656247 +3.18618 -0.0657918 +3.19793 -0.0657713 +3.20969 -0.0658134 +3.22145 -0.065846 +3.23321 -0.0659345 +3.24496 -0.0663186 +3.25672 -0.0667134 +3.26848 -0.0670364 +3.28023 -0.0673596 +3.29199 -0.0672202 +3.30375 -0.0675841 +3.31551 -0.0675991 +3.32726 -0.0679052 +3.33902 -0.0680288 +3.35078 -0.0683418 +3.36253 -0.0685309 +3.37429 -0.0686474 +3.38605 -0.0693122 +3.39781 -0.0695071 +3.40956 -0.0699099 +3.42132 -0.0702792 +3.43308 -0.0702698 +3.44483 -0.07028 +3.45659 -0.0705588 +3.46835 -0.0712751 +3.48011 -0.0713506 +3.49186 -0.0713516 +3.50362 -0.0716111 +3.51538 -0.0718 +3.52713 -0.0714212 +3.53889 -0.0715778 +3.55065 -0.0715721 +3.5624 -0.0721881 +3.57416 -0.072526 +3.58592 -0.0728329 +3.59768 -0.0732457 +3.60943 -0.073292 +3.62119 -0.0732794 +3.63295 -0.0734631 +3.6447 -0.0734463 +3.65646 -0.0733944 +3.66822 -0.0732964 +3.67998 -0.0737327 +3.69173 -0.0742421 +3.70349 -0.0743649 +3.71525 -0.0744538 +3.727 -0.0745523 +3.73876 -0.0748992 +3.75052 -0.0748161 +3.76228 -0.074794 +3.77403 -0.0747036 +3.78579 -0.0746971 +3.79755 -0.0745319 +3.8093 -0.0748327 +3.82106 -0.0748936 +3.83282 -0.0752752 +3.84458 -0.0753538 +3.85633 -0.0756452 +3.86809 -0.0756385 +3.87985 -0.0756261 +3.8916 -0.0753512 +3.90336 -0.0755382 +3.91512 -0.0755852 +3.92688 -0.0758573 +3.93863 -0.0760912 +3.95039 -0.0765109 +3.96215 -0.0768608 +3.9739 -0.0769664 +3.98566 -0.0769119 +3.99742 -0.0773387 +4.00918 -0.0773001 +4.02093 -0.0776297 +4.03269 -0.0784882 +4.04445 -0.0784808 +4.0562 -0.0787781 +4.06796 -0.0783691 +4.07972 -0.0783084 +4.09147 -0.078285 +4.10323 -0.0782055 +4.11499 -0.0785111 +4.12675 -0.0789902 +4.1385 -0.0791896 +4.15026 -0.0794632 +4.16202 -0.0794164 +4.17377 -0.0796726 +4.18553 -0.0792715 +4.19729 -0.0793422 +4.20905 -0.0791019 +4.2208 -0.0789714 +4.23256 -0.0793674 +4.24432 -0.0798781 +4.25607 -0.0804904 +4.26783 -0.0803712 +4.27959 -0.080437 +4.29135 -0.0803112 +4.3031 -0.0800802 +4.31486 -0.080793 +4.32662 -0.0811935 +4.33837 -0.081673 +4.35013 -0.081418 +4.36189 -0.0815568 +4.37365 -0.0816725 +4.3854 -0.0814588 +4.39716 -0.0816226 +4.40892 -0.0816568 +4.42067 -0.0812738 +4.43243 -0.0818619 +4.44419 -0.0818994 +4.45595 -0.0818073 +4.4677 -0.0816884 +4.47946 -0.0823572 +4.49122 -0.0821464 +4.50297 -0.0823252 +4.51473 -0.0825034 +4.52649 -0.082567 +4.53825 -0.082299 +4.55 -0.0830026 +4.56176 -0.0832928 +4.57352 -0.0837299 +4.58527 -0.0840808 +4.59703 -0.0843297 +4.60879 -0.0847457 +4.62055 -0.0852912 +4.6323 -0.0854097 +4.64406 -0.085756 +4.65582 -0.0860563 +4.66757 -0.0860933 +4.67933 -0.086539 +4.69109 -0.0864893 +4.70284 -0.0863872 +4.7146 -0.0866209 +4.72636 -0.0870226 +4.73812 -0.0871936 +4.74987 -0.0867758 +4.76163 -0.0873085 +4.77339 -0.0873229 +4.78514 -0.0868678 +4.7969 -0.0866256 +4.80866 -0.0867307 +4.82042 -0.0872735 +4.83217 -0.0871568 +4.84393 -0.0871966 +4.85569 -0.0870131 +4.86744 -0.0872025 +4.8792 -0.0874038 +4.89096 -0.0875502 +4.90272 -0.087526 +4.91447 -0.0873552 +4.92623 -0.0875752 +4.93799 -0.0878618 +4.94974 -0.0878081 +4.9615 -0.088336 +4.97326 -0.0883119 +4.98502 -0.0882607 +4.99677 -0.0889623 +5.00853 -0.0891419 +5.02029 -0.0893655 +5.03204 -0.0892916 +5.0438 -0.0897124 +5.05556 -0.0898926 +5.06732 -0.0901041 +5.07907 -0.0897456 +5.09083 -0.089687 +5.10259 -0.0896822 +5.11434 -0.0898337 +5.1261 -0.0896868 +5.13786 -0.0894158 +5.14962 -0.0895346 +5.16137 -0.0901143 +5.17313 -0.0902965 +5.18489 -0.0901085 +5.19664 -0.090289 +5.2084 -0.0905239 +5.22016 -0.0904708 +5.23191 -0.090456 +5.24367 -0.0907104 +5.25543 -0.0906649 +5.26719 -0.0907475 +5.27894 -0.0902266 +5.2907 -0.0903893 +5.30246 -0.0899363 +5.31421 -0.0903509 +5.32597 -0.090256 +5.33773 -0.0904818 +5.34949 -0.090373 +5.36124 -0.0905086 +5.373 -0.090338 +5.38476 -0.0906969 +5.39651 -0.0912085 +5.40827 -0.0912155 +5.42003 -0.0912758 +5.43179 -0.0909867 +5.44354 -0.0909925 +5.4553 -0.0916084 +5.46706 -0.0918414 +5.47881 -0.0915901 +5.49057 -0.0917841 +5.50233 -0.0916674 +5.51409 -0.0918055 +5.52584 -0.0917806 +5.5376 -0.0915443 +5.54936 -0.0917113 +5.56111 -0.0921927 +5.57287 -0.0925664 +5.58463 -0.0923854 +5.59639 -0.0925275 +5.60814 -0.0930631 +5.6199 -0.092999 +5.63166 -0.0926488 +5.64341 -0.0930086 +5.65517 -0.0927725 +5.66693 -0.0929453 +5.67869 -0.0924705 +5.69044 -0.0927801 +5.7022 -0.0927953 +5.71396 -0.0927312 +5.72571 -0.0932795 +5.73747 -0.0936649 +5.74923 -0.0935166 +5.76098 -0.0937607 +5.77274 -0.0938422 +5.7845 -0.0935172 +5.79626 -0.0935907 +5.80801 -0.0936387 +5.81977 -0.0938709 +5.83153 -0.094515 +5.84328 -0.0947742 +5.85504 -0.0946476 +5.8668 -0.0949399 +5.87856 -0.0946954 +5.89031 -0.0948943 +5.90207 -0.0947946 +5.91383 -0.0948671 +5.92558 -0.0951287 +5.93734 -0.0951825 +5.9491 -0.0948523 +5.96086 -0.0953652 +5.97261 -0.0953057 +5.98437 -0.0954956 +5.99613 -0.0955177 +6.00788 -0.0957863 +6.01964 -0.0963866 +6.0314 -0.0960062 +6.04316 -0.0957222 +6.05491 -0.09573 +6.06667 -0.0954149 +6.07843 -0.09499 +6.09018 -0.0949912 +6.10194 -0.095062 +6.1137 -0.0948433 +6.12546 -0.0950465 +6.13721 -0.0953233 +6.14897 -0.0951617 +6.16073 -0.0957163 +6.17248 -0.0956973 +6.18424 -0.0955182 +6.196 -0.0951727 +6.20776 -0.0952697 +6.21951 -0.094596 +6.23127 -0.0947874 +6.24303 -0.09537 +6.25478 -0.0953971 +6.26654 -0.0954827 +6.2783 -0.0956829 +6.29005 -0.0961556 +6.30181 -0.0963604 +6.31357 -0.0966045 +6.32533 -0.0961157 +6.33708 -0.0962407 +6.34884 -0.0961421 +6.3606 -0.0961518 +6.37235 -0.0965044 +6.38411 -0.0967367 +6.39587 -0.09691 +6.40763 -0.0971014 +6.41938 -0.0970175 +6.43114 -0.0973936 +6.4429 -0.0970355 +6.45465 -0.0969786 +6.46641 -0.0969972 +6.47817 -0.0970182 +6.48993 -0.0975826 +6.50168 -0.0972892 +6.51344 -0.0973194 +6.5252 -0.0971175 +6.53695 -0.0971904 +6.54871 -0.0971006 +6.56047 -0.0971995 +6.57223 -0.0970899 +6.58398 -0.0970656 +6.59574 -0.0972469 +6.6075 -0.0978394 +6.61925 -0.0980821 +6.63101 -0.0979831 +6.64277 -0.0973771 +6.65453 -0.0977881 +6.66628 -0.0974221 +6.67804 -0.097134 +6.6898 -0.0971346 +6.70155 -0.0972698 +6.71331 -0.0976829 +6.72507 -0.0978112 +6.73683 -0.0977584 +6.74858 -0.0976794 +6.76034 -0.0976241 +6.7721 -0.0974135 +6.78385 -0.097634 +6.79561 -0.0975911 +6.80737 -0.0974577 +6.81912 -0.0971381 +6.83088 -0.097973 +6.84264 -0.098309 +6.8544 -0.0979071 +6.86615 -0.0978774 +6.87791 -0.0978521 +6.88967 -0.0981346 +6.90142 -0.0981272 +6.91318 -0.0983481 +6.92494 -0.0981782 +6.9367 -0.098249 +6.94845 -0.0983416 +6.96021 -0.0982375 +6.97197 -0.0984694 +6.98372 -0.0982538 +6.99548 -0.0979894 +7.00724 -0.0980475 +7.019 -0.0979301 +7.03075 -0.0981389 +7.04251 -0.0980222 +7.05427 -0.0983434 +7.06602 -0.098745 +7.07778 -0.098706 +7.08954 -0.0988454 +7.1013 -0.0990498 +7.11305 -0.099107 +7.12481 -0.0990962 +7.13657 -0.0994014 +7.14832 -0.0996727 +7.16008 -0.0997049 +7.17184 -0.099815 +7.1836 -0.0997717 +7.19535 -0.0999529 +7.20711 -0.100189 +7.21887 -0.100188 +7.23062 -0.100252 +7.24238 -0.100703 +7.25414 -0.100705 +7.2659 -0.100779 +7.27765 -0.100811 +7.28941 -0.101046 +7.30117 -0.101424 +7.31292 -0.101278 +7.32468 -0.101473 +7.33644 -0.101579 +7.34819 -0.101372 +7.35995 -0.101474 +7.37171 -0.101622 +7.38347 -0.101744 +7.39522 -0.101229 +7.40698 -0.101516 +7.41874 -0.101709 +7.43049 -0.102115 +7.44225 -0.10204 +7.45401 -0.102037 +7.46577 -0.101733 +7.47752 -0.101051 +7.48928 -0.101104 +7.50104 -0.101258 +7.51279 -0.101652 +7.52455 -0.102073 +7.53631 -0.102034 +7.54807 -0.102708 +7.55982 -0.102861 +7.57158 -0.102847 +7.58334 -0.102648 +7.59509 -0.102364 +7.60685 -0.102188 +7.61861 -0.10274 +7.63037 -0.102831 +7.64212 -0.103198 +7.65388 -0.103216 +7.66564 -0.103382 +7.67739 -0.103657 +7.68915 -0.103793 +7.70091 -0.103748 +7.71267 -0.103957 +7.72442 -0.104068 +7.73618 -0.104122 +7.74794 -0.104078 +7.75969 -0.104103 +7.77145 -0.104396 +7.78321 -0.10439 +7.79497 -0.104316 +7.80672 -0.104388 +7.81848 -0.104079 +7.83024 -0.103765 +7.84199 -0.103849 +7.85375 -0.103679 +7.86551 -0.103512 +7.87727 -0.104023 +7.88902 -0.104148 +7.90078 -0.103593 +7.91254 -0.103404 +7.92429 -0.103953 +7.93605 -0.104089 +7.94781 -0.104225 +7.95956 -0.104164 +7.97132 -0.104094 +7.98308 -0.103778 +7.99484 -0.104251 +8.00659 -0.103864 +8.01835 -0.103816 +8.03011 -0.103668 +8.04186 -0.10349 +8.05362 -0.103254 +8.06538 -0.103077 +8.07714 -0.103391 +8.08889 -0.103243 +8.10065 -0.103103 +8.11241 -0.103168 +8.12416 -0.103352 +8.13592 -0.103723 +8.14768 -0.104114 +8.15944 -0.104352 +8.17119 -0.103811 +8.18295 -0.10386 +8.19471 -0.104482 +8.20646 -0.104607 +8.21822 -0.105073 +8.22998 -0.105088 +8.24174 -0.104734 +8.25349 -0.104264 +8.26525 -0.104738 +8.27701 -0.104504 +8.28876 -0.104206 +8.30052 -0.104116 +8.31228 -0.103914 +8.32404 -0.103577 +8.33579 -0.103565 +8.34755 -0.104108 +8.35931 -0.104423 +8.37106 -0.104013 +8.38282 -0.103543 +8.39458 -0.1038 +8.40634 -0.104087 +8.41809 -0.104312 +8.42985 -0.104281 +8.44161 -0.104101 +8.45336 -0.104178 +8.46512 -0.104257 +8.47688 -0.103838 +8.48863 -0.10406 +8.50039 -0.103809 +8.51215 -0.103434 +8.52391 -0.104238 +8.53566 -0.10462 +8.54742 -0.104283 +8.55918 -0.10431 +8.57093 -0.104366 +8.58269 -0.104627 +8.59445 -0.105007 +8.60621 -0.104761 +8.61796 -0.104781 +8.62972 -0.104914 +8.64148 -0.105415 +8.65323 -0.105334 +8.66499 -0.104918 +8.67675 -0.104745 +8.68851 -0.10484 +8.70026 -0.104705 +8.71202 -0.104834 +8.72378 -0.104999 +8.73553 -0.104866 +8.74729 -0.10469 +8.75905 -0.104792 +8.77081 -0.10507 +8.78256 -0.105369 +8.79432 -0.105767 +8.80608 -0.105656 +8.81783 -0.106304 +8.82959 -0.106591 +8.84135 -0.106249 +8.85311 -0.106449 +8.86486 -0.106183 +8.87662 -0.106598 +8.88838 -0.106979 +8.90013 -0.10663 +8.91189 -0.106865 +8.92365 -0.106489 +8.93541 -0.106614 +8.94716 -0.106741 +8.95892 -0.107061 +8.97068 -0.106504 +8.98243 -0.106732 +8.99419 -0.10735 +9.00595 -0.107085 +9.0177 -0.106832 +9.02946 -0.106925 +9.04122 -0.107235 +9.05298 -0.107476 +9.06473 -0.107371 +9.07649 -0.107439 +9.08825 -0.1075 +9.1 -0.107252 +9.11176 -0.10725 +9.12352 -0.106984 +9.13528 -0.107293 +9.14703 -0.107198 +9.15879 -0.107312 +9.17055 -0.107189 +9.1823 -0.107497 +9.19406 -0.107022 +9.20582 -0.107131 +9.21758 -0.106982 +9.22933 -0.106827 +9.24109 -0.107058 +9.25285 -0.106872 +9.2646 -0.107062 +9.27636 -0.107739 +9.28812 -0.108118 +9.29988 -0.108405 +9.31163 -0.108474 +9.32339 -0.108268 +9.33515 -0.108209 +9.3469 -0.107979 +9.35866 -0.108081 +9.37042 -0.108033 +9.38218 -0.107925 +9.39393 -0.107564 +9.40569 -0.107613 +9.41745 -0.107267 +9.4292 -0.107128 +9.44096 -0.106871 +9.45272 -0.107186 +9.46448 -0.107213 +9.47623 -0.107542 +9.48799 -0.107687 +9.49975 -0.107605 +9.5115 -0.107585 +9.52326 -0.107396 +9.53502 -0.107298 +9.54677 -0.107021 +9.55853 -0.106806 +9.57029 -0.107617 +9.58205 -0.107602 +9.5938 -0.107426 +9.60556 -0.107421 +9.61732 -0.107674 +9.62907 -0.107446 +9.64083 -0.107292 +9.65259 -0.107257 +9.66435 -0.107152 +9.6761 -0.107226 +9.68786 -0.107463 +9.69962 -0.107593 +9.71137 -0.107474 +9.72313 -0.107679 +9.73489 -0.10739 +9.74665 -0.10747 +9.7584 -0.107537 +9.77016 -0.10797 +9.78192 -0.108148 +9.79367 -0.107898 +9.80543 -0.107525 +9.81719 -0.107504 +9.82895 -0.108101 +9.8407 -0.107726 +9.85246 -0.107482 +9.86422 -0.107332 +9.87597 -0.107505 +9.88773 -0.107638 +9.89949 -0.107862 +9.91125 -0.108058 +9.923 -0.108113 +9.93476 -0.10814 +9.94652 -0.1083 +9.95827 -0.108578 +9.97003 -0.108671 +9.98179 -0.108437 +9.99355 -0.108394 +10.0053 -0.108056 +10.0171 -0.108106 +10.0288 -0.108131 +10.0406 -0.10822 +10.0523 -0.108346 +10.0641 -0.107929 +10.0758 -0.108026 +10.0876 -0.107706 +10.0994 -0.107746 +10.1111 -0.107984 +10.1229 -0.107905 +10.1346 -0.107884 +10.1464 -0.107891 +10.1581 -0.107815 +10.1699 -0.108231 +10.1817 -0.10842 +10.1934 -0.108255 +10.2052 -0.107552 +10.2169 -0.107686 +10.2287 -0.107765 +10.2404 -0.107832 +10.2522 -0.107916 +10.264 -0.107654 +10.2757 -0.107351 +10.2875 -0.107638 +10.2992 -0.107412 +10.311 -0.107138 +10.3227 -0.107413 +10.3345 -0.107242 +10.3463 -0.107238 +10.358 -0.107045 +10.3698 -0.107419 +10.3815 -0.107362 +10.3933 -0.107744 +10.405 -0.107804 +10.4168 -0.108296 +10.4286 -0.107827 +10.4403 -0.107808 +10.4521 -0.108029 +10.4638 -0.108379 +10.4756 -0.108069 +10.4873 -0.107685 +10.4991 -0.107832 +10.5109 -0.108004 +10.5226 -0.107819 +10.5344 -0.107588 +10.5461 -0.10761 +10.5579 -0.107278 +10.5696 -0.10753 +10.5814 -0.107858 +10.5932 -0.107997 +10.6049 -0.108062 +10.6167 -0.1082 +10.6284 -0.108216 +10.6402 -0.10808 +10.6519 -0.10811 +10.6637 -0.108351 +10.6755 -0.10839 +10.6872 -0.108386 +10.699 -0.108605 +10.7107 -0.10879 +10.7225 -0.109296 +10.7342 -0.108987 +10.746 -0.108628 +10.7578 -0.108796 +10.7695 -0.108654 +10.7813 -0.108454 +10.793 -0.107999 +10.8048 -0.107893 +10.8165 -0.10737 +10.8283 -0.107631 +10.8401 -0.107838 +10.8518 -0.107834 +10.8636 -0.108008 +10.8753 -0.108062 +10.8871 -0.10805 +10.8988 -0.107486 +10.9106 -0.107494 +10.9224 -0.107166 +10.9341 -0.107499 +10.9459 -0.107891 +10.9576 -0.107757 +10.9694 -0.107634 +10.9811 -0.107539 +10.9929 -0.107583 +11.0047 -0.107515 +11.0164 -0.107239 +11.0282 -0.107115 +11.0399 -0.107095 +11.0517 -0.107487 +11.0634 -0.107827 +11.0752 -0.10775 +11.087 -0.107561 +11.0987 -0.107331 +11.1105 -0.107331 +11.1222 -0.107314 +11.134 -0.10713 +11.1457 -0.107106 +11.1575 -0.107195 +11.1693 -0.107077 +11.181 -0.10735 +11.1928 -0.107336 +11.2045 -0.107456 +11.2163 -0.107561 +11.228 -0.107558 +11.2398 -0.107482 +11.2516 -0.107292 +11.2633 -0.10716 +11.2751 -0.107232 +11.2868 -0.107533 +11.2986 -0.107757 +11.3103 -0.108008 +11.3221 -0.108169 +11.3339 -0.108107 +11.3456 -0.107955 +11.3574 -0.108112 +11.3691 -0.108158 +11.3809 -0.107937 +11.3926 -0.108256 +11.4044 -0.10804 +11.4162 -0.10749 +11.4279 -0.107491 +11.4397 -0.10775 +11.4514 -0.107891 +11.4632 -0.10779 +11.4749 -0.108118 +11.4867 -0.108382 +11.4985 -0.108891 +11.5102 -0.108708 +11.522 -0.108908 +11.5337 -0.108986 +11.5455 -0.109175 +11.5572 -0.109093 +11.569 -0.108827 +11.5808 -0.108944 +11.5925 -0.108654 +11.6043 -0.109016 +11.616 -0.109065 +11.6278 -0.109582 +11.6395 -0.109529 +11.6513 -0.10958 +11.6631 -0.109537 +11.6748 -0.109458 +11.6866 -0.108954 +11.6983 -0.10901 +11.7101 -0.109129 +11.7218 -0.108983 +11.7336 -0.108982 +11.7454 -0.109337 +11.7571 -0.109469 +11.7689 -0.109288 +11.7806 -0.109566 +11.7924 -0.109755 +11.8041 -0.109408 +11.8159 -0.109497 +11.8277 -0.109418 +11.8394 -0.109528 +11.8512 -0.109152 +11.8629 -0.109329 +11.8747 -0.109367 +11.8864 -0.10937 +11.8982 -0.109672 +11.91 -0.109241 +11.9217 -0.109099 +11.9335 -0.109085 +11.9452 -0.108963 +11.957 -0.108953 +11.9687 -0.109544 +11.9805 -0.109466 +11.9923 -0.109514 +12.004 -0.109016 +12.0158 -0.109191 +12.0275 -0.108848 +12.0393 -0.108685 +12.051 -0.108736 +12.0628 -0.109152 +12.0746 -0.10896 +12.0863 -0.109352 +12.0981 -0.109636 +12.1098 -0.109143 +12.1216 -0.108964 +12.1333 -0.10905 +12.1451 -0.108792 +12.1569 -0.108867 +12.1686 -0.10911 +12.1804 -0.109229 +12.1921 -0.109515 +12.2039 -0.109962 +12.2156 -0.110085 +12.2274 -0.109637 +12.2392 -0.109235 +12.2509 -0.109548 +12.2627 -0.109499 +12.2744 -0.109613 +12.2862 -0.10984 +12.2979 -0.109848 +12.3097 -0.109773 +12.3215 -0.110092 +12.3332 -0.10986 +12.345 -0.109351 +12.3567 -0.109512 +12.3685 -0.109664 +12.3802 -0.109691 +12.392 -0.109776 +12.4038 -0.109834 +12.4155 -0.109851 +12.4273 -0.109669 +12.439 -0.109359 +12.4508 -0.109437 +12.4625 -0.109606 +12.4743 -0.110183 +12.4861 -0.110142 +12.4978 -0.109847 +12.5096 -0.109416 +12.5213 -0.109381 +12.5331 -0.109485 +12.5448 -0.109707 +12.5566 -0.109944 +12.5684 -0.110346 +12.5801 -0.110247 +12.5919 -0.11019 +12.6036 -0.110138 +12.6154 -0.109654 +12.6271 -0.109772 +12.6389 -0.109948 +12.6507 -0.11021 +12.6624 -0.110206 +12.6742 -0.110158 +12.6859 -0.110018 +12.6977 -0.110107 +12.7094 -0.11026 +12.7212 -0.110188 +12.733 -0.110538 +12.7447 -0.110825 +12.7565 -0.110611 +12.7682 -0.11107 +12.78 -0.110929 +12.7917 -0.110932 +12.8035 -0.11101 +12.8153 -0.111094 +12.827 -0.111033 +12.8388 -0.111187 +12.8505 -0.111156 +12.8623 -0.111379 +12.874 -0.111399 +12.8858 -0.111411 +12.8976 -0.111039 +12.9093 -0.110745 +12.9211 -0.110051 +12.9328 -0.109839 +12.9446 -0.109541 +12.9563 -0.109885 +12.9681 -0.110118 +12.9799 -0.109643 +12.9916 -0.109793 +13.0034 -0.109827 +13.0151 -0.109848 +13.0269 -0.110132 +13.0386 -0.110187 +13.0504 -0.110082 +13.0622 -0.109889 +13.0739 -0.109744 +13.0857 -0.109907 +13.0974 -0.109633 +13.1092 -0.10974 +13.1209 -0.109543 +13.1327 -0.109685 +13.1445 -0.11013 +13.1562 -0.109952 +13.168 -0.110143 +13.1797 -0.109703 +13.1915 -0.110297 +13.2032 -0.110007 +13.215 -0.109208 +13.2268 -0.109369 +13.2385 -0.109456 +13.2503 -0.109279 +13.262 -0.109283 +13.2738 -0.109195 +13.2855 -0.109318 +13.2973 -0.109471 +13.3091 -0.109518 +13.3208 -0.109328 +13.3326 -0.109221 +13.3443 -0.109625 +13.3561 -0.10998 +13.3678 -0.110381 +13.3796 -0.109786 +13.3914 -0.109748 +13.4031 -0.109681 +13.4149 -0.109616 +13.4266 -0.109301 +13.4384 -0.10935 +13.4501 -0.109317 +13.4619 -0.10968 +13.4737 -0.109321 +13.4854 -0.108948 +13.4972 -0.109414 +13.5089 -0.10948 +13.5207 -0.10927 +13.5324 -0.109477 +13.5442 -0.109507 +13.556 -0.109693 +13.5677 -0.109647 +13.5795 -0.109313 +13.5912 -0.109299 +13.603 -0.108926 +13.6147 -0.108923 +13.6265 -0.109218 +13.6382 -0.108979 +13.65 -0.109159 +13.6618 -0.109169 +13.6735 -0.109207 +13.6853 -0.109377 +13.697 -0.109374 +13.7088 -0.110124 +13.7205 -0.109964 +13.7323 -0.109503 +13.7441 -0.109875 +13.7558 -0.109779 +13.7676 -0.109375 +13.7793 -0.110055 +13.7911 -0.110324 +13.8028 -0.110392 +13.8146 -0.110576 +13.8264 -0.110491 +13.8381 -0.11093 +13.8499 -0.111042 +13.8616 -0.110956 +13.8734 -0.111065 +13.8851 -0.110779 +13.8969 -0.1109 +13.9087 -0.111608 +13.9204 -0.111305 +13.9322 -0.111234 +13.9439 -0.110591 +13.9557 -0.11039 +13.9674 -0.11044 +13.9792 -0.110481 +13.991 -0.110269 +14.0027 -0.110613 +14.0145 -0.110666 +14.0262 -0.110636 +14.038 -0.1104 +14.0497 -0.110308 +14.0615 -0.11057 +14.0733 -0.110626 +14.085 -0.110499 +14.0968 -0.110605 +14.1085 -0.110528 +14.1203 -0.110285 +14.132 -0.110034 +14.1438 -0.110334 +14.1556 -0.110503 +14.1673 -0.110596 +14.1791 -0.110698 +14.1908 -0.110182 +14.2026 -0.110182 +14.2143 -0.110436 +14.2261 -0.110234 +14.2379 -0.110271 +14.2496 -0.110553 +14.2614 -0.11048 +14.2731 -0.110365 +14.2849 -0.11011 +14.2966 -0.110124 +14.3084 -0.110127 +14.3202 -0.110124 +14.3319 -0.110018 +14.3437 -0.110055 +14.3554 -0.110252 +14.3672 -0.110554 +14.3789 -0.110491 +14.3907 -0.110518 +14.4025 -0.110568 +14.4142 -0.110819 +14.426 -0.111004 +14.4377 -0.110847 +14.4495 -0.110719 +14.4612 -0.11053 +14.473 -0.110644 +14.4848 -0.11058 +14.4965 -0.11003 +14.5083 -0.109647 +14.52 -0.109507 +14.5318 -0.109613 +14.5435 -0.109586 +14.5553 -0.10933 +14.5671 -0.109051 +14.5788 -0.109234 +14.5906 -0.109264 +14.6023 -0.109525 +14.6141 -0.109177 +14.6258 -0.109241 +14.6376 -0.109534 +14.6494 -0.109206 +14.6611 -0.109226 +14.6729 -0.109461 +14.6846 -0.10927 +14.6964 -0.109364 +14.7081 -0.109654 +14.7199 -0.109803 +14.7317 -0.110475 +14.7434 -0.110439 +14.7552 -0.110602 +14.7669 -0.110549 +14.7787 -0.110577 +14.7904 -0.11045 +14.8022 -0.110351 +14.814 -0.109938 +14.8257 -0.109606 +14.8375 -0.109685 +14.8492 -0.109673 +14.861 -0.109629 +14.8727 -0.109616 +14.8845 -0.109512 +14.8963 -0.109445 +14.908 -0.109439 +14.9198 -0.109114 +14.9315 -0.109326 +14.9433 -0.109485 +14.955 -0.109521 +14.9668 -0.109316 +14.9786 -0.109117 +15 -0.108907 +& +@target G0.S6 +@type xy +0 -0.00439471 +0.0117571 -0.0082075 +0.0235142 -0.0119792 +0.0352713 -0.0156012 +0.0470284 -0.0186922 +0.0587856 -0.021983 +0.0705427 -0.0255811 +0.0822998 -0.0282146 +0.0940569 -0.0319309 +0.105814 -0.0344231 +0.117571 -0.0376076 +0.129328 -0.0401434 +0.141085 -0.0435322 +0.152842 -0.0459861 +0.1646 -0.0482162 +0.176357 -0.0505135 +0.188114 -0.052699 +0.199871 -0.0545591 +0.211628 -0.0565672 +0.223385 -0.0585971 +0.235142 -0.0604338 +0.246899 -0.0617848 +0.258656 -0.0632571 +0.270414 -0.0654686 +0.282171 -0.0669882 +0.293928 -0.068578 +0.305685 -0.0699293 +0.317442 -0.0713942 +0.329199 -0.072588 +0.340956 -0.0737289 +0.352713 -0.0751257 +0.36447 -0.0769206 +0.376228 -0.0781512 +0.387985 -0.0799167 +0.399742 -0.0814496 +0.411499 -0.0831511 +0.423256 -0.0843885 +0.435013 -0.0859075 +0.44677 -0.0872439 +0.458527 -0.0884573 +0.470284 -0.0892316 +0.482042 -0.0907308 +0.493799 -0.0918625 +0.505556 -0.0928712 +0.517313 -0.0937677 +0.52907 -0.095015 +0.540827 -0.0961587 +0.552584 -0.0967499 +0.564341 -0.0974006 +0.576098 -0.0984676 +0.587856 -0.0994509 +0.599613 -0.100592 +0.61137 -0.101319 +0.623127 -0.10225 +0.634884 -0.102933 +0.646641 -0.103685 +0.658398 -0.104074 +0.670155 -0.104911 +0.681912 -0.105427 +0.69367 -0.106086 +0.705427 -0.106523 +0.717184 -0.107782 +0.728941 -0.108276 +0.740698 -0.10915 +0.752455 -0.109866 +0.764212 -0.111124 +0.775969 -0.111324 +0.787727 -0.111536 +0.799484 -0.112697 +0.811241 -0.112966 +0.822998 -0.113567 +0.834755 -0.1147 +0.846512 -0.116036 +0.858269 -0.116471 +0.870026 -0.116945 +0.881783 -0.117385 +0.893541 -0.117817 +0.905298 -0.118635 +0.917055 -0.11908 +0.928812 -0.119708 +0.940569 -0.120015 +0.952326 -0.120474 +0.964083 -0.12115 +0.97584 -0.1215 +0.987597 -0.122182 +0.999355 -0.12285 +1.01111 -0.123455 +1.02287 -0.123728 +1.03463 -0.123993 +1.04638 -0.124652 +1.05814 -0.125454 +1.0699 -0.125968 +1.08165 -0.126382 +1.09341 -0.12685 +1.10517 -0.127214 +1.11693 -0.12773 +1.12868 -0.128399 +1.14044 -0.128638 +1.1522 -0.129033 +1.16395 -0.129129 +1.17571 -0.12968 +1.18747 -0.129913 +1.19923 -0.130662 +1.21098 -0.131337 +1.22274 -0.132244 +1.2345 -0.132787 +1.24625 -0.132773 +1.25801 -0.133213 +1.26977 -0.133502 +1.28153 -0.133983 +1.29328 -0.134273 +1.30504 -0.13457 +1.3168 -0.134602 +1.32855 -0.134399 +1.34031 -0.13506 +1.35207 -0.134954 +1.36382 -0.135531 +1.37558 -0.135918 +1.38734 -0.136187 +1.3991 -0.136963 +1.41085 -0.137624 +1.42261 -0.137689 +1.43437 -0.138145 +1.44612 -0.138716 +1.45788 -0.139162 +1.46964 -0.13904 +1.4814 -0.139768 +1.49315 -0.140388 +1.50491 -0.140843 +1.51667 -0.141276 +1.52842 -0.141368 +1.54018 -0.141717 +1.55194 -0.141962 +1.5637 -0.142437 +1.57545 -0.142442 +1.58721 -0.142514 +1.59897 -0.142893 +1.61072 -0.142886 +1.62248 -0.14312 +1.63424 -0.143238 +1.646 -0.143598 +1.65775 -0.143834 +1.66951 -0.143997 +1.68127 -0.144224 +1.69302 -0.144945 +1.70478 -0.145027 +1.71654 -0.145689 +1.7283 -0.146054 +1.74005 -0.14669 +1.75181 -0.147441 +1.76357 -0.147868 +1.77532 -0.147779 +1.78708 -0.148182 +1.79884 -0.148457 +1.8106 -0.148648 +1.82235 -0.148667 +1.83411 -0.148673 +1.84587 -0.149034 +1.85762 -0.149786 +1.86938 -0.150073 +1.88114 -0.150297 +1.8929 -0.150639 +1.90465 -0.15109 +1.91641 -0.151308 +1.92817 -0.151303 +1.93992 -0.151389 +1.95168 -0.151986 +1.96344 -0.152079 +1.97519 -0.152878 +1.98695 -0.153316 +1.99871 -0.153162 +2.01047 -0.153445 +2.02222 -0.153956 +2.03398 -0.153873 +2.04574 -0.15426 +2.05749 -0.154588 +2.06925 -0.154973 +2.08101 -0.155158 +2.09277 -0.154916 +2.10452 -0.155289 +2.11628 -0.154948 +2.12804 -0.155275 +2.13979 -0.155182 +2.15155 -0.15529 +2.16331 -0.155364 +2.17507 -0.155794 +2.18682 -0.156152 +2.19858 -0.156776 +2.21034 -0.157039 +2.22209 -0.157207 +2.23385 -0.157739 +2.24561 -0.158213 +2.25737 -0.158866 +2.26912 -0.158839 +2.28088 -0.1589 +2.29264 -0.158847 +2.30439 -0.158749 +2.31615 -0.159086 +2.32791 -0.158963 +2.33967 -0.159079 +2.35142 -0.159126 +2.36318 -0.159145 +2.37494 -0.159549 +2.38669 -0.159515 +2.39845 -0.159661 +2.41021 -0.159869 +2.42197 -0.160594 +2.43372 -0.161022 +2.44548 -0.161205 +2.45724 -0.161563 +2.46899 -0.16138 +2.48075 -0.161636 +2.49251 -0.161408 +2.50426 -0.161339 +2.51602 -0.161637 +2.52778 -0.161255 +2.53954 -0.161547 +2.55129 -0.161841 +2.56305 -0.161625 +2.57481 -0.16185 +2.58656 -0.161828 +2.59832 -0.162207 +2.61008 -0.162089 +2.62184 -0.162388 +2.63359 -0.161709 +2.64535 -0.161962 +2.65711 -0.161845 +2.66886 -0.162264 +2.68062 -0.162599 +2.69238 -0.16323 +2.70414 -0.163974 +2.71589 -0.163906 +2.72765 -0.163724 +2.73941 -0.164149 +2.75116 -0.164408 +2.76292 -0.164864 +2.77468 -0.164811 +2.78644 -0.164807 +2.79819 -0.165134 +2.80995 -0.165678 +2.82171 -0.16522 +2.83346 -0.165495 +2.84522 -0.165583 +2.85698 -0.165918 +2.86874 -0.165982 +2.88049 -0.165919 +2.89225 -0.166197 +2.90401 -0.166042 +2.91576 -0.16586 +2.92752 -0.166346 +2.93928 -0.166661 +2.95104 -0.166751 +2.96279 -0.166524 +2.97455 -0.166487 +2.98631 -0.166824 +2.99806 -0.167107 +3.00982 -0.167498 +3.02158 -0.168016 +3.03333 -0.167993 +3.04509 -0.168164 +3.05685 -0.168265 +3.06861 -0.168757 +3.08036 -0.169161 +3.09212 -0.169375 +3.10388 -0.169736 +3.11563 -0.169896 +3.12739 -0.170578 +3.13915 -0.170567 +3.15091 -0.170432 +3.16266 -0.170107 +3.17442 -0.170084 +3.18618 -0.169714 +3.19793 -0.169961 +3.20969 -0.170106 +3.22145 -0.170025 +3.23321 -0.170315 +3.24496 -0.170206 +3.25672 -0.170083 +3.26848 -0.170143 +3.28023 -0.170145 +3.29199 -0.170111 +3.30375 -0.170103 +3.31551 -0.170476 +3.32726 -0.170365 +3.33902 -0.170437 +3.35078 -0.170322 +3.36253 -0.171079 +3.37429 -0.170975 +3.38605 -0.171401 +3.39781 -0.171635 +3.40956 -0.171676 +3.42132 -0.171702 +3.43308 -0.171809 +3.44483 -0.171751 +3.45659 -0.172013 +3.46835 -0.171992 +3.48011 -0.171927 +3.49186 -0.171824 +3.50362 -0.171517 +3.51538 -0.171301 +3.52713 -0.17129 +3.53889 -0.171575 +3.55065 -0.171775 +3.5624 -0.172084 +3.57416 -0.17239 +3.58592 -0.172597 +3.59768 -0.172409 +3.60943 -0.17264 +3.62119 -0.172792 +3.63295 -0.172575 +3.6447 -0.1728 +3.65646 -0.172858 +3.66822 -0.17315 +3.67998 -0.173643 +3.69173 -0.173637 +3.70349 -0.173692 +3.71525 -0.173802 +3.727 -0.173996 +3.73876 -0.174155 +3.75052 -0.173847 +3.76228 -0.173912 +3.77403 -0.173934 +3.78579 -0.174221 +3.79755 -0.17386 +3.8093 -0.173917 +3.82106 -0.173735 +3.83282 -0.173851 +3.84458 -0.173675 +3.85633 -0.174254 +3.86809 -0.174327 +3.87985 -0.174323 +3.8916 -0.17456 +3.90336 -0.17394 +3.91512 -0.17402 +3.92688 -0.174091 +3.93863 -0.174396 +3.95039 -0.174696 +3.96215 -0.174811 +3.9739 -0.174975 +3.98566 -0.174885 +3.99742 -0.17518 +4.00918 -0.175322 +4.02093 -0.175843 +4.03269 -0.176211 +4.04445 -0.176337 +4.0562 -0.176895 +4.06796 -0.176532 +4.07972 -0.176555 +4.09147 -0.176621 +4.10323 -0.17687 +4.11499 -0.17726 +4.12675 -0.177416 +4.1385 -0.177114 +4.15026 -0.177498 +4.16202 -0.177819 +4.17377 -0.177965 +4.18553 -0.178082 +4.19729 -0.178025 +4.20905 -0.1778 +4.2208 -0.177925 +4.23256 -0.178058 +4.24432 -0.178353 +4.25607 -0.179159 +4.26783 -0.179031 +4.27959 -0.178712 +4.29135 -0.178396 +4.3031 -0.178098 +4.31486 -0.178555 +4.32662 -0.178212 +4.33837 -0.178735 +4.35013 -0.178624 +4.36189 -0.178917 +4.37365 -0.179255 +4.3854 -0.179512 +4.39716 -0.179866 +4.40892 -0.179502 +4.42067 -0.179377 +4.43243 -0.179184 +4.44419 -0.179205 +4.45595 -0.178983 +4.4677 -0.178763 +4.47946 -0.179129 +4.49122 -0.179061 +4.50297 -0.17887 +4.51473 -0.17896 +4.52649 -0.178914 +4.53825 -0.178788 +4.55 -0.179238 +4.56176 -0.179232 +4.57352 -0.178755 +4.58527 -0.17887 +4.59703 -0.17908 +4.60879 -0.179259 +4.62055 -0.179854 +4.6323 -0.179894 +4.64406 -0.180128 +4.65582 -0.18015 +4.66757 -0.180173 +4.67933 -0.180244 +4.69109 -0.180118 +4.70284 -0.180474 +4.7146 -0.180856 +4.72636 -0.180971 +4.73812 -0.181074 +4.74987 -0.180922 +4.76163 -0.180932 +4.77339 -0.181094 +4.78514 -0.181163 +4.7969 -0.181391 +4.80866 -0.181959 +4.82042 -0.182057 +4.83217 -0.181865 +4.84393 -0.181841 +4.85569 -0.182071 +4.86744 -0.182185 +4.8792 -0.182264 +4.89096 -0.182588 +4.90272 -0.182442 +4.91447 -0.182295 +4.92623 -0.182455 +4.93799 -0.182404 +4.94974 -0.182544 +4.9615 -0.182758 +4.97326 -0.183034 +4.98502 -0.182942 +4.99677 -0.183451 +5.00853 -0.18341 +5.02029 -0.183651 +5.03204 -0.183425 +5.0438 -0.183989 +5.05556 -0.184166 +5.06732 -0.184038 +5.07907 -0.183613 +5.09083 -0.183239 +5.10259 -0.183243 +5.11434 -0.183611 +5.1261 -0.183663 +5.13786 -0.183755 +5.14962 -0.183453 +5.16137 -0.183373 +5.17313 -0.183285 +5.18489 -0.1835 +5.19664 -0.183647 +5.2084 -0.183684 +5.22016 -0.183814 +5.23191 -0.1841 +5.24367 -0.183897 +5.25543 -0.183793 +5.26719 -0.183327 +5.27894 -0.183116 +5.2907 -0.182995 +5.30246 -0.183012 +5.31421 -0.183323 +5.32597 -0.183263 +5.33773 -0.18325 +5.34949 -0.183371 +5.36124 -0.183347 +5.373 -0.183343 +5.38476 -0.183486 +5.39651 -0.183501 +5.40827 -0.183177 +5.42003 -0.183634 +5.43179 -0.183973 +5.44354 -0.184029 +5.4553 -0.184157 +5.46706 -0.184031 +5.47881 -0.184306 +5.49057 -0.184385 +5.50233 -0.184171 +5.51409 -0.184064 +5.52584 -0.184309 +5.5376 -0.184153 +5.54936 -0.183897 +5.56111 -0.183883 +5.57287 -0.183927 +5.58463 -0.18374 +5.59639 -0.183485 +5.60814 -0.183821 +5.6199 -0.183976 +5.63166 -0.184148 +5.64341 -0.184801 +5.65517 -0.184693 +5.66693 -0.184875 +5.67869 -0.184705 +5.69044 -0.184276 +5.7022 -0.184372 +5.71396 -0.184713 +5.72571 -0.185005 +5.73747 -0.184712 +5.74923 -0.184659 +5.76098 -0.185145 +5.77274 -0.185385 +5.7845 -0.185285 +5.79626 -0.184928 +5.80801 -0.184762 +5.81977 -0.184979 +5.83153 -0.185208 +5.84328 -0.185331 +5.85504 -0.185479 +5.8668 -0.185683 +5.87856 -0.185434 +5.89031 -0.18511 +5.90207 -0.184884 +5.91383 -0.185098 +5.92558 -0.184895 +5.93734 -0.184905 +5.9491 -0.184806 +5.96086 -0.185233 +5.97261 -0.185104 +5.98437 -0.185173 +5.99613 -0.184902 +6.00788 -0.184987 +6.01964 -0.185175 +6.0314 -0.185314 +6.04316 -0.185079 +6.05491 -0.184661 +6.06667 -0.184481 +6.07843 -0.184698 +6.09018 -0.184765 +6.10194 -0.184457 +6.1137 -0.18459 +6.12546 -0.184738 +6.13721 -0.184887 +6.14897 -0.184531 +6.16073 -0.18461 +6.17248 -0.18461 +6.18424 -0.184972 +6.196 -0.184934 +6.20776 -0.184554 +6.21951 -0.18469 +6.23127 -0.184359 +6.24303 -0.184419 +6.25478 -0.184317 +6.26654 -0.184538 +6.2783 -0.185008 +6.29005 -0.185077 +6.30181 -0.185271 +6.31357 -0.185222 +6.32533 -0.18507 +6.33708 -0.185006 +6.34884 -0.185341 +6.3606 -0.185544 +6.37235 -0.185673 +6.38411 -0.1856 +6.39587 -0.186106 +6.40763 -0.186128 +6.41938 -0.18607 +6.43114 -0.186226 +6.4429 -0.186231 +6.45465 -0.186086 +6.46641 -0.186138 +6.47817 -0.186052 +6.48993 -0.18614 +6.50168 -0.185998 +6.51344 -0.186131 +6.5252 -0.186251 +6.53695 -0.186196 +6.54871 -0.186032 +6.56047 -0.185992 +6.57223 -0.186135 +6.58398 -0.186088 +6.59574 -0.185935 +6.6075 -0.185909 +6.61925 -0.18598 +6.63101 -0.186033 +6.64277 -0.18575 +6.65453 -0.18567 +6.66628 -0.185936 +6.67804 -0.185849 +6.6898 -0.185744 +6.70155 -0.18589 +6.71331 -0.186129 +6.72507 -0.185906 +6.73683 -0.185601 +6.74858 -0.18568 +6.76034 -0.185853 +6.7721 -0.185688 +6.78385 -0.185958 +6.79561 -0.186131 +6.80737 -0.185832 +6.81912 -0.185606 +6.83088 -0.18603 +6.84264 -0.186189 +6.8544 -0.185693 +6.86615 -0.185706 +6.87791 -0.186023 +6.88967 -0.185869 +6.90142 -0.186202 +6.91318 -0.186413 +6.92494 -0.186339 +6.9367 -0.186155 +6.94845 -0.186139 +6.96021 -0.185928 +6.97197 -0.185882 +6.98372 -0.185775 +6.99548 -0.185932 +7.00724 -0.18588 +7.019 -0.185386 +7.03075 -0.185833 +7.04251 -0.185787 +7.05427 -0.185982 +7.06602 -0.186137 +7.07778 -0.185896 +7.08954 -0.185875 +7.1013 -0.186307 +7.11305 -0.186466 +7.12481 -0.18619 +7.13657 -0.186146 +7.14832 -0.186245 +7.16008 -0.186155 +7.17184 -0.186645 +7.1836 -0.186353 +7.19535 -0.186728 +7.20711 -0.18685 +7.21887 -0.186958 +7.23062 -0.186768 +7.24238 -0.187061 +7.25414 -0.187086 +7.2659 -0.18694 +7.27765 -0.187146 +7.28941 -0.18748 +7.30117 -0.187278 +7.31292 -0.187263 +7.32468 -0.187474 +7.33644 -0.187567 +7.34819 -0.187441 +7.35995 -0.187131 +7.37171 -0.187167 +7.38347 -0.187051 +7.39522 -0.187195 +7.40698 -0.187504 +7.41874 -0.187558 +7.43049 -0.187423 +7.44225 -0.187447 +7.45401 -0.187325 +7.46577 -0.187268 +7.47752 -0.187034 +7.48928 -0.187238 +7.50104 -0.187109 +7.51279 -0.18718 +7.52455 -0.18746 +7.53631 -0.187591 +7.54807 -0.187943 +7.55982 -0.188174 +7.57158 -0.187972 +7.58334 -0.187984 +7.59509 -0.188087 +7.60685 -0.187757 +7.61861 -0.188163 +7.63037 -0.188138 +7.64212 -0.188004 +7.65388 -0.188397 +7.66564 -0.188543 +7.67739 -0.188796 +7.68915 -0.188572 +7.70091 -0.188182 +7.71267 -0.188763 +7.72442 -0.188728 +7.73618 -0.188488 +7.74794 -0.188394 +7.75969 -0.188454 +7.77145 -0.188446 +7.78321 -0.188729 +7.79497 -0.188821 +7.80672 -0.189017 +7.81848 -0.18907 +7.83024 -0.188803 +7.84199 -0.18876 +7.85375 -0.188314 +7.86551 -0.18835 +7.87727 -0.188466 +7.88902 -0.188414 +7.90078 -0.188553 +7.91254 -0.188344 +7.92429 -0.188532 +7.93605 -0.188564 +7.94781 -0.188417 +7.95956 -0.188282 +7.97132 -0.188202 +7.98308 -0.188171 +7.99484 -0.188569 +8.00659 -0.188167 +8.01835 -0.188039 +8.03011 -0.18827 +8.04186 -0.188229 +8.05362 -0.188052 +8.06538 -0.187818 +8.07714 -0.187931 +8.08889 -0.187887 +8.10065 -0.187646 +8.11241 -0.187652 +8.12416 -0.187629 +8.13592 -0.187914 +8.14768 -0.188354 +8.15944 -0.188417 +8.17119 -0.188332 +8.18295 -0.188401 +8.19471 -0.188094 +8.20646 -0.18827 +8.21822 -0.188526 +8.22998 -0.188087 +8.24174 -0.18807 +8.25349 -0.1877 +8.26525 -0.187784 +8.27701 -0.187737 +8.28876 -0.187633 +8.30052 -0.187575 +8.31228 -0.187409 +8.32404 -0.187284 +8.33579 -0.187359 +8.34755 -0.187842 +8.35931 -0.187971 +8.37106 -0.18779 +8.38282 -0.187779 +8.39458 -0.187504 +8.40634 -0.187775 +8.41809 -0.188253 +8.42985 -0.188463 +8.44161 -0.188377 +8.45336 -0.188206 +8.46512 -0.188598 +8.47688 -0.188495 +8.48863 -0.188417 +8.50039 -0.18824 +8.51215 -0.188128 +8.52391 -0.188509 +8.53566 -0.188451 +8.54742 -0.188679 +8.55918 -0.188666 +8.57093 -0.188797 +8.58269 -0.189286 +8.59445 -0.189085 +8.60621 -0.188791 +8.61796 -0.188726 +8.62972 -0.188571 +8.64148 -0.188832 +8.65323 -0.188599 +8.66499 -0.188566 +8.67675 -0.188652 +8.68851 -0.188679 +8.70026 -0.188487 +8.71202 -0.188214 +8.72378 -0.187872 +8.73553 -0.187715 +8.74729 -0.188086 +8.75905 -0.187965 +8.77081 -0.188266 +8.78256 -0.188362 +8.79432 -0.188475 +8.80608 -0.188604 +8.81783 -0.189043 +8.82959 -0.188967 +8.84135 -0.18898 +8.85311 -0.188815 +8.86486 -0.18893 +8.87662 -0.18922 +8.88838 -0.189541 +8.90013 -0.189352 +8.91189 -0.189241 +8.92365 -0.188909 +8.93541 -0.188935 +8.94716 -0.18892 +8.95892 -0.18886 +8.97068 -0.188572 +8.98243 -0.188534 +8.99419 -0.188688 +9.00595 -0.189248 +9.0177 -0.189161 +9.02946 -0.189095 +9.04122 -0.189069 +9.05298 -0.189153 +9.06473 -0.18938 +9.07649 -0.189223 +9.08825 -0.189184 +9.1 -0.188893 +9.11176 -0.188943 +9.12352 -0.188618 +9.13528 -0.188894 +9.14703 -0.189502 +9.15879 -0.189376 +9.17055 -0.189531 +9.1823 -0.189536 +9.19406 -0.189346 +9.20582 -0.189262 +9.21758 -0.189112 +9.22933 -0.189167 +9.24109 -0.188766 +9.25285 -0.188784 +9.2646 -0.188561 +9.27636 -0.189001 +9.28812 -0.189189 +9.29988 -0.189244 +9.31163 -0.189168 +9.32339 -0.189212 +9.33515 -0.189151 +9.3469 -0.189307 +9.35866 -0.189472 +9.37042 -0.189515 +9.38218 -0.189492 +9.39393 -0.189609 +9.40569 -0.1897 +9.41745 -0.18914 +9.4292 -0.189221 +9.44096 -0.189277 +9.45272 -0.189434 +9.46448 -0.189376 +9.47623 -0.189385 +9.48799 -0.189877 +9.49975 -0.189731 +9.5115 -0.189548 +9.52326 -0.189494 +9.53502 -0.189176 +9.54677 -0.188824 +9.55853 -0.18838 +9.57029 -0.188421 +9.58205 -0.188349 +9.5938 -0.188332 +9.60556 -0.188061 +9.61732 -0.188435 +9.62907 -0.188365 +9.64083 -0.188324 +9.65259 -0.188334 +9.66435 -0.188425 +9.6761 -0.187886 +9.68786 -0.188192 +9.69962 -0.18821 +9.71137 -0.188226 +9.72313 -0.188156 +9.73489 -0.188301 +9.74665 -0.188477 +9.7584 -0.189228 +9.77016 -0.189016 +9.78192 -0.189152 +9.79367 -0.188994 +9.80543 -0.1885 +9.81719 -0.188406 +9.82895 -0.188546 +9.8407 -0.188873 +9.85246 -0.188756 +9.86422 -0.188517 +9.87597 -0.188565 +9.88773 -0.188609 +9.89949 -0.188351 +9.91125 -0.188299 +9.923 -0.188496 +9.93476 -0.189026 +9.94652 -0.189054 +9.95827 -0.189439 +9.97003 -0.189779 +9.98179 -0.189289 +9.99355 -0.188841 +10.0053 -0.188567 +10.0171 -0.187968 +10.0288 -0.187935 +10.0406 -0.187801 +10.0523 -0.187927 +10.0641 -0.187856 +10.0758 -0.188106 +10.0876 -0.188016 +10.0994 -0.187893 +10.1111 -0.187989 +10.1229 -0.18798 +10.1346 -0.187926 +10.1464 -0.188015 +10.1581 -0.18789 +10.1699 -0.187784 +10.1817 -0.187763 +10.1934 -0.187785 +10.2052 -0.187634 +10.2169 -0.187436 +10.2287 -0.187379 +10.2404 -0.187164 +10.2522 -0.187113 +10.264 -0.187388 +10.2757 -0.187423 +10.2875 -0.187282 +10.2992 -0.186862 +10.311 -0.186863 +10.3227 -0.186897 +10.3345 -0.186654 +10.3463 -0.186552 +10.358 -0.186753 +10.3698 -0.186653 +10.3815 -0.186333 +10.3933 -0.186455 +10.405 -0.186619 +10.4168 -0.186947 +10.4286 -0.186701 +10.4403 -0.186676 +10.4521 -0.186636 +10.4638 -0.186531 +10.4756 -0.186529 +10.4873 -0.186436 +10.4991 -0.186427 +10.5109 -0.186884 +10.5226 -0.187149 +10.5344 -0.187094 +10.5461 -0.187158 +10.5579 -0.187296 +10.5696 -0.187001 +10.5814 -0.187288 +10.5932 -0.187147 +10.6049 -0.187724 +10.6167 -0.187971 +10.6284 -0.188023 +10.6402 -0.187962 +10.6519 -0.188088 +10.6637 -0.187599 +10.6755 -0.187366 +10.6872 -0.187497 +10.699 -0.187007 +10.7107 -0.186915 +10.7225 -0.18677 +10.7342 -0.186747 +10.746 -0.18685 +10.7578 -0.186864 +10.7695 -0.186645 +10.7813 -0.186316 +10.793 -0.186155 +10.8048 -0.185899 +10.8165 -0.185731 +10.8283 -0.185668 +10.8401 -0.186011 +10.8518 -0.186115 +10.8636 -0.186028 +10.8753 -0.186195 +10.8871 -0.186228 +10.8988 -0.186197 +10.9106 -0.186076 +10.9224 -0.185849 +10.9341 -0.185967 +10.9459 -0.186124 +10.9576 -0.186331 +10.9694 -0.186175 +10.9811 -0.186121 +10.9929 -0.186129 +11.0047 -0.186222 +11.0164 -0.186052 +11.0282 -0.185682 +11.0399 -0.185878 +11.0517 -0.185808 +11.0634 -0.185514 +11.0752 -0.18604 +11.087 -0.186006 +11.0987 -0.186069 +11.1105 -0.185802 +11.1222 -0.185647 +11.134 -0.185501 +11.1457 -0.185359 +11.1575 -0.185696 +11.1693 -0.185254 +11.181 -0.18521 +11.1928 -0.185281 +11.2045 -0.185159 +11.2163 -0.185138 +11.228 -0.184967 +11.2398 -0.184961 +11.2516 -0.184862 +11.2633 -0.184781 +11.2751 -0.184825 +11.2868 -0.184908 +11.2986 -0.184844 +11.3103 -0.184813 +11.3221 -0.184947 +11.3339 -0.185091 +11.3456 -0.185087 +11.3574 -0.18524 +11.3691 -0.185019 +11.3809 -0.184776 +11.3926 -0.184911 +11.4044 -0.184968 +11.4162 -0.18473 +11.4279 -0.184801 +11.4397 -0.184987 +11.4514 -0.184898 +11.4632 -0.184897 +11.4749 -0.185126 +11.4867 -0.185194 +11.4985 -0.185232 +11.5102 -0.185083 +11.522 -0.185235 +11.5337 -0.185306 +11.5455 -0.185401 +11.5572 -0.185493 +11.569 -0.185222 +11.5808 -0.185397 +11.5925 -0.185476 +11.6043 -0.185513 +11.616 -0.185408 +11.6278 -0.18575 +11.6395 -0.185798 +11.6513 -0.186008 +11.6631 -0.186155 +11.6748 -0.186075 +11.6866 -0.185591 +11.6983 -0.185711 +11.7101 -0.185684 +11.7218 -0.185825 +11.7336 -0.185402 +11.7454 -0.185667 +11.7571 -0.185419 +11.7689 -0.185595 +11.7806 -0.185707 +11.7924 -0.185682 +11.8041 -0.185608 +11.8159 -0.185632 +11.8277 -0.185465 +11.8394 -0.185382 +11.8512 -0.185025 +11.8629 -0.184446 +11.8747 -0.18471 +11.8864 -0.184652 +11.8982 -0.184598 +11.91 -0.18408 +11.9217 -0.184614 +11.9335 -0.184428 +11.9452 -0.184372 +11.957 -0.184601 +11.9687 -0.184826 +11.9805 -0.184959 +11.9923 -0.184897 +12.004 -0.184543 +12.0158 -0.184248 +12.0275 -0.18437 +12.0393 -0.18429 +12.051 -0.184082 +12.0628 -0.184493 +12.0746 -0.184273 +12.0863 -0.184193 +12.0981 -0.184082 +12.1098 -0.183962 +12.1216 -0.183873 +12.1333 -0.18379 +12.1451 -0.183058 +12.1569 -0.182685 +12.1686 -0.183036 +12.1804 -0.183405 +12.1921 -0.183373 +12.2039 -0.18325 +12.2156 -0.18356 +12.2274 -0.183451 +12.2392 -0.182909 +12.2509 -0.183396 +12.2627 -0.183372 +12.2744 -0.183549 +12.2862 -0.183643 +12.2979 -0.183853 +12.3097 -0.183863 +12.3215 -0.184207 +12.3332 -0.184219 +12.345 -0.183826 +12.3567 -0.183543 +12.3685 -0.183945 +12.3802 -0.184236 +12.392 -0.184076 +12.4038 -0.183793 +12.4155 -0.183795 +12.4273 -0.184043 +12.439 -0.183791 +12.4508 -0.183797 +12.4625 -0.18351 +12.4743 -0.184245 +12.4861 -0.184348 +12.4978 -0.184363 +12.5096 -0.184002 +12.5213 -0.184054 +12.5331 -0.184509 +12.5448 -0.184562 +12.5566 -0.1844 +12.5684 -0.184271 +12.5801 -0.184041 +12.5919 -0.183707 +12.6036 -0.183875 +12.6154 -0.183574 +12.6271 -0.183883 +12.6389 -0.183716 +12.6507 -0.183678 +12.6624 -0.183821 +12.6742 -0.184253 +12.6859 -0.18457 +12.6977 -0.184826 +12.7094 -0.184652 +12.7212 -0.184221 +12.733 -0.184084 +12.7447 -0.184069 +12.7565 -0.183768 +12.7682 -0.183999 +12.78 -0.184305 +12.7917 -0.184543 +12.8035 -0.18477 +12.8153 -0.184941 +12.827 -0.185169 +12.8388 -0.185112 +12.8505 -0.184775 +12.8623 -0.185213 +12.874 -0.185198 +12.8858 -0.185369 +12.8976 -0.185074 +12.9093 -0.184804 +12.9211 -0.184377 +12.9328 -0.184673 +12.9446 -0.1847 +12.9563 -0.185163 +12.9681 -0.185452 +12.9799 -0.185123 +12.9916 -0.185213 +13.0034 -0.185135 +13.0151 -0.185511 +13.0269 -0.185341 +13.0386 -0.185519 +13.0504 -0.185401 +13.0622 -0.185092 +13.0739 -0.18485 +13.0857 -0.184775 +13.0974 -0.184457 +13.1092 -0.184778 +13.1209 -0.184649 +13.1327 -0.184856 +13.1445 -0.184803 +13.1562 -0.184959 +13.168 -0.184806 +13.1797 -0.184662 +13.1915 -0.185044 +13.2032 -0.185193 +13.215 -0.184603 +13.2268 -0.184895 +13.2385 -0.184873 +13.2503 -0.184989 +13.262 -0.185167 +13.2738 -0.185467 +13.2855 -0.185651 +13.2973 -0.185544 +13.3091 -0.185784 +13.3208 -0.185353 +13.3326 -0.18515 +13.3443 -0.185108 +13.3561 -0.184927 +13.3678 -0.184631 +13.3796 -0.184193 +13.3914 -0.184416 +13.4031 -0.183973 +13.4149 -0.184104 +13.4266 -0.183955 +13.4384 -0.184222 +13.4501 -0.18446 +13.4619 -0.184323 +13.4737 -0.184428 +13.4854 -0.184464 +13.4972 -0.184773 +13.5089 -0.184872 +13.5207 -0.184734 +13.5324 -0.184923 +13.5442 -0.184972 +13.556 -0.184715 +13.5677 -0.184509 +13.5795 -0.184161 +13.5912 -0.183757 +13.603 -0.183893 +13.6147 -0.183724 +13.6265 -0.183312 +13.6382 -0.183223 +13.65 -0.183612 +13.6618 -0.183753 +13.6735 -0.183603 +13.6853 -0.183683 +13.697 -0.183507 +13.7088 -0.18396 +13.7205 -0.184095 +13.7323 -0.18374 +13.7441 -0.184131 +13.7558 -0.18428 +13.7676 -0.183821 +13.7793 -0.18371 +13.7911 -0.184437 +13.8028 -0.184165 +13.8146 -0.184284 +13.8264 -0.184277 +13.8381 -0.184506 +13.8499 -0.184925 +13.8616 -0.184766 +13.8734 -0.184856 +13.8851 -0.184541 +13.8969 -0.184432 +13.9087 -0.184303 +13.9204 -0.184071 +13.9322 -0.184325 +13.9439 -0.184315 +13.9557 -0.184151 +13.9674 -0.184424 +13.9792 -0.184099 +13.991 -0.184112 +14.0027 -0.184529 +14.0145 -0.184495 +14.0262 -0.184391 +14.038 -0.184491 +14.0497 -0.184512 +14.0615 -0.184828 +14.0733 -0.184628 +14.085 -0.184501 +14.0968 -0.184494 +14.1085 -0.184924 +14.1203 -0.184815 +14.132 -0.184349 +14.1438 -0.184657 +14.1556 -0.184767 +14.1673 -0.184534 +14.1791 -0.184388 +14.1908 -0.184007 +14.2026 -0.183804 +14.2143 -0.184435 +14.2261 -0.184281 +14.2379 -0.184184 +14.2496 -0.18437 +14.2614 -0.18432 +14.2731 -0.184281 +14.2849 -0.184211 +14.2966 -0.184101 +14.3084 -0.184065 +14.3202 -0.183781 +14.3319 -0.183669 +14.3437 -0.183608 +14.3554 -0.183761 +14.3672 -0.184391 +14.3789 -0.184491 +14.3907 -0.184641 +14.4025 -0.184494 +14.4142 -0.184196 +14.426 -0.184273 +14.4377 -0.184101 +14.4495 -0.183989 +14.4612 -0.183838 +14.473 -0.183965 +14.4848 -0.183892 +14.4965 -0.184025 +14.5083 -0.184049 +14.52 -0.183975 +14.5318 -0.184052 +14.5435 -0.184218 +14.5553 -0.183936 +14.5671 -0.184076 +14.5788 -0.184107 +14.5906 -0.184121 +14.6023 -0.18424 +14.6141 -0.184032 +14.6258 -0.183736 +14.6376 -0.18387 +14.6494 -0.183446 +14.6611 -0.183429 +14.6729 -0.18366 +14.6846 -0.183533 +14.6964 -0.1835 +14.7081 -0.183447 +14.7199 -0.183596 +14.7317 -0.184119 +14.7434 -0.18432 +14.7552 -0.184265 +14.7669 -0.184035 +14.7787 -0.18456 +14.7904 -0.184547 +14.8022 -0.184188 +14.814 -0.183607 +14.8257 -0.18336 +14.8375 -0.183114 +14.8492 -0.183659 +14.861 -0.183577 +14.8727 -0.183681 +14.8845 -0.183876 +14.8963 -0.183787 +14.908 -0.184117 +14.9198 -0.184005 +14.9315 -0.184134 +14.9433 -0.184442 +14.955 -0.184856 +14.9668 -0.184702 +14.9786 -0.184567 +15 -0.184261 +& +@target G0.S7 +@type xy +-8.88178e-16 0.00097561 +1.99557 0.0682927 +3.99113 0.136585 +5.9867 0.178537 +7.98226 0.206829 +10.0111 0.217561 +12.0067 0.220488 +14.0022 0.212683 +15.9978 0.186341 +& +@target G0.S8 +@type xy +-8.88178e-16 0.00097561 +1.99557 -0.159024 +3.99113 -0.158049 +5.9867 -0.158049 +8.01552 -0.158049 +10.0111 -0.158049 +12.0067 -0.157073 +14.0022 -0.157073 +15.9978 -0.157073 +& +@target G0.S9 +@type xy +-8.88178e-16 0.00097561 +1.99557 -0.0565854 +3.99113 -0.101463 +8.01552 -0.171707 +10.0111 -0.166829 +12.0067 -0.164878 +14.0022 -0.164878 +16.031 -0.145366 +& +@target G0.S10 +@type xy +-8.88178e-16 -5.55112e-17 +1.99557 -0.00682927 +4.02439 -0.00682927 +6.01996 -0.0146341 +7.98226 -0.0302439 +10.0111 -0.0468293 +12.0067 -0.0517073 +14.0022 -0.057561 +15.9978 -0.0487805 +& diff --git a/tests/regression/walker/Velocity/slm.pdf b/tests/regression/walker/Velocity/slm.pdf new file mode 100644 index 00000000000..763275da403 Binary files /dev/null and b/tests/regression/walker/Velocity/slm.pdf differ diff --git a/tests/regression/walker/Velocity/slm.ps b/tests/regression/walker/Velocity/slm.ps new file mode 100644 index 00000000000..c5e16fd0541 Binary files /dev/null and b/tests/regression/walker/Velocity/slm.ps differ diff --git a/tests/regression/walker/Velocity/slm_homogeneous_shear.q b/tests/regression/walker/Velocity/slm_homogeneous_shear.q index 2f10350e265..292b9f87a74 100644 --- a/tests/regression/walker/Velocity/slm_homogeneous_shear.q +++ b/tests/regression/walker/Velocity/slm_homogeneous_shear.q @@ -8,9 +8,9 @@ title "Coupled position, velocity, dissipation joint PDF computing a walker #nstep 2 # Max number of time steps - term 2.0 # Max time - dt 0.1 # Time step size - npar 100000 # Number of particles + term 15.0 # Max time + dt 0.2 # Time step size + npar 70000 # Number of particles ttyi 1 # TTY output interval rngs @@ -72,17 +72,17 @@ walker end - pdfs - interval 10 - filetype txt - policy multiple - centering elem - format scientific - precision 6 - # save marginal PDFs of all velocity components - U1( U1 : 1.0e-2 ) - U2( U2 : 1.0e-2 ) - U3( U3 : 1.0e-2 ) - O( O : 1.0e-2 ) # dissipation (turbulence frequency) PDF - end + #pdfs + # interval 10 + # filetype txt + # policy multiple + # centering elem + # format scientific + # precision 6 + # # save marginal PDFs of all velocity components + # U1( U1 : 1.0e-2 ) + # U2( U2 : 1.0e-2 ) + # U3( U3 : 1.0e-2 ) + # O( O : 1.0e-2 ) # dissipation (turbulence frequency) PDF + #end end diff --git a/tests/regression/walker/Velocity/slm_homogeneous_shear.stat.txt.std b/tests/regression/walker/Velocity/slm_homogeneous_shear.stat.txt.std index c637b39dbc7..690585689a4 100644 --- a/tests/regression/walker/Velocity/slm_homogeneous_shear.stat.txt.std +++ b/tests/regression/walker/Velocity/slm_homogeneous_shear.stat.txt.std @@ -1,21 +1,77 @@ -# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: - 0 0 1.00011 0.669854 0.000234173 8.1204e-05 0.668662 -0.00209731 0.669061 - 1 0.1 0.911512 0.63949 -0.0539998 0.000847994 0.630995 -0.00111894 0.629889 - 2 0.2 0.83929 0.615952 -0.0846441 0.00129059 0.598799 -0.00121218 0.594471 - 3 0.3 0.778681 0.598847 -0.10947 0.0017575 0.568226 -0.00120746 0.565505 - 4 0.4 0.727524 0.587709 -0.124926 -0.000756618 0.542072 0.000889851 0.538293 - 5 0.5 0.685086 0.57604 -0.136853 -0.00189615 0.517629 0.00272244 0.515064 - 6 0.6 0.648341 0.566763 -0.144266 -0.00329222 0.495418 0.00107006 0.495861 - 7 0.7 0.615707 0.557486 -0.149812 -0.00131858 0.47611 0.000235829 0.478257 - 8 0.8 0.586621 0.552134 -0.156248 -0.00159806 0.458524 -0.000800399 0.462362 - 9 0.9 0.561025 0.548925 -0.162074 -0.000122655 0.445258 -0.000918989 0.446631 - 10 1 0.53821 0.546486 -0.165898 -0.00059122 0.4322 -0.000907575 0.434625 - 11 1.1 0.517545 0.545159 -0.169863 -0.000939551 0.422072 -0.000674525 0.42425 - 12 1.2 0.49874 0.545414 -0.173374 0.00132309 0.411302 -0.00122133 0.413838 - 13 1.3 0.481995 0.545586 -0.177014 0.00114495 0.402764 -0.000143296 0.405755 - 14 1.4 0.466183 0.546912 -0.17933 0.00113047 0.395615 -0.000514647 0.399408 - 15 1.5 0.452176 0.546566 -0.180538 0.000299327 0.388391 -0.00052314 0.391524 - 16 1.6 0.439128 0.546676 -0.183322 -0.000496451 0.381457 -0.000434082 0.384753 - 17 1.7 0.426704 0.549771 -0.185079 0.00122207 0.375903 0.000300747 0.377952 - 18 1.8 0.415725 0.551271 -0.187506 0.00118878 0.370639 2.10698e-05 0.372057 - 19 1.9 0.405525 0.555427 -0.18996 0.00141026 0.365238 -0.000837309 0.367001 +# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: + 0 0 0.99915 0.667575 0.00580741 -0.000100127 0.658261 -0.00285091 0.670739 + 1 0.2 0.819992 0.675182 -0.0773427 -0.000579328 0.646523 -0.00173533 0.651507 + 2 0.4 0.702649 0.684182 -0.120109 -0.00433427 0.624892 0.00143011 0.625186 + 3 0.6 0.621117 0.684902 -0.145629 -0.000591534 0.606165 -0.000819805 0.599987 + 4 0.8 0.560897 0.691132 -0.170068 -0.000154244 0.581214 -0.000128864 0.574466 + 5 1 0.513216 0.69948 -0.189757 0.000797196 0.563562 0.00272329 0.557919 + 6 1.2 0.4751 0.712967 -0.203764 -0.00123413 0.543121 0.00196956 0.534612 + 7 1.4 0.443802 0.726624 -0.218087 -0.0029695 0.531022 0.00510818 0.523093 + 8 1.6 0.418371 0.7401 -0.231932 -0.00322505 0.519586 0.00320011 0.51391 + 9 1.8 0.396157 0.758765 -0.241402 -0.00124776 0.512954 0.000634096 0.505246 + 10 2 0.377784 0.777482 -0.255182 -0.000925624 0.505063 0.00240084 0.500938 + 11 2.2 0.361391 0.799831 -0.265855 -0.000115918 0.501609 0.0021046 0.499849 + 12 2.4 0.346971 0.825746 -0.277526 -0.000514747 0.497078 0.00292032 0.496274 + 13 2.6 0.334466 0.854095 -0.286585 -0.00187443 0.499328 0.00419576 0.495491 + 14 2.8 0.32333 0.882777 -0.299083 -0.00163013 0.49849 0.00386753 0.499467 + 15 3 0.313729 0.916283 -0.31046 -0.00344483 0.500243 0.00259201 0.501388 + 16 3.2 0.304528 0.952155 -0.321207 -0.00339824 0.508355 0.00304208 0.50517 + 17 3.4 0.29679 0.989968 -0.332776 -0.000838198 0.511487 0.000226807 0.51196 + 18 3.6 0.289513 1.02461 -0.347012 -0.00209066 0.520395 -0.00200059 0.515235 + 19 3.8 0.28266 1.06196 -0.362018 0.000475512 0.527889 0.000582853 0.522927 + 20 4 0.276924 1.10157 -0.373621 0.00157343 0.53769 -4.25447e-05 0.531174 + 21 4.2 0.271466 1.14178 -0.385365 0.0024489 0.546938 -0.00161999 0.545269 + 22 4.4 0.26644 1.18347 -0.396087 0.00495855 0.558618 -0.00423611 0.556292 + 23 4.6 0.261702 1.23009 -0.411647 0.00799455 0.56966 -0.00519865 0.570481 + 24 4.8 0.25726 1.27642 -0.42868 0.00704689 0.579647 -0.0028514 0.583092 + 25 5 0.252932 1.33024 -0.445213 0.00549407 0.595278 -0.00346713 0.593885 + 26 5.2 0.249555 1.3858 -0.462616 0.00263358 0.610776 -0.00266592 0.608804 + 27 5.4 0.246198 1.43772 -0.482826 0.00386596 0.626748 -0.00179693 0.623689 + 28 5.6 0.243103 1.50096 -0.501496 0.00277901 0.646743 -0.00205758 0.642257 + 29 5.8 0.240177 1.56337 -0.520164 0.000987729 0.664705 -0.000882877 0.664128 + 30 6 0.237395 1.62139 -0.538451 -0.00285621 0.680687 0.00115668 0.685561 + 31 6.2 0.234555 1.68688 -0.56213 -0.00246433 0.705714 -0.000332669 0.704141 + 32 6.4 0.232178 1.76209 -0.587157 -0.00150679 0.724219 -0.000155678 0.725548 + 33 6.6 0.230117 1.83439 -0.611244 0.0051606 0.750366 0.00210436 0.750098 + 34 6.8 0.227851 1.90667 -0.63308 0.00615301 0.76928 0.00378437 0.777606 + 35 7 0.225855 1.98547 -0.663173 0.00272605 0.801276 0.00427861 0.810914 + 36 7.2 0.22405 2.0775 -0.691887 0.0020246 0.830719 0.00489758 0.836747 + 37 7.4 0.222147 2.16904 -0.717209 0.00474634 0.859262 0.0017682 0.860625 + 38 7.6 0.220473 2.26582 -0.747924 0.00338066 0.891286 0.00153875 0.893272 + 39 7.8 0.219205 2.36411 -0.785975 0.00397139 0.919699 0.00103909 0.916768 + 40 8 0.217779 2.47255 -0.820366 0.0100712 0.949773 -0.0037433 0.955799 + 41 8.2 0.216453 2.58617 -0.856457 0.00757849 0.989097 0.000470888 0.992013 + 42 8.4 0.21517 2.69823 -0.888342 0.0020892 1.01833 0.00218271 1.03379 + 43 8.6 0.213716 2.82304 -0.925104 -0.000344873 1.06162 -0.000874027 1.07335 + 44 8.8 0.212575 2.94258 -0.958156 0.00536455 1.10909 -0.00758133 1.11756 + 45 9 0.211333 3.07414 -1.00143 0.00144473 1.15328 -0.00913268 1.1551 + 46 9.2 0.210337 3.23261 -1.0485 0.00136648 1.20023 -0.00913063 1.19771 + 47 9.4 0.20925 3.3828 -1.09893 -0.00781871 1.2502 -0.00616709 1.24739 + 48 9.6 0.208288 3.53167 -1.14524 -0.006549 1.30556 -0.00438304 1.29379 + 49 9.8 0.207376 3.69461 -1.20066 -0.00124545 1.36342 -0.00180337 1.35321 + 50 10 0.206539 3.87452 -1.24981 0.000807464 1.41372 0.00133704 1.40528 + 51 10.2 0.205721 4.03941 -1.30649 0.00495675 1.47697 -0.00146066 1.47582 + 52 10.4 0.205124 4.20998 -1.36686 -0.00523705 1.54332 -0.000273172 1.53469 + 53 10.6 0.204358 4.41751 -1.4235 0.0135743 1.60566 0.000189501 1.60348 + 54 10.8 0.203576 4.60868 -1.48804 0.00876911 1.66746 -0.0061585 1.68384 + 55 11 0.202857 4.79969 -1.54838 0.0115378 1.7374 -0.00618485 1.74572 + 56 11.2 0.202081 5.00204 -1.6078 0.0176766 1.80547 -0.00223399 1.80714 + 57 11.4 0.201456 5.21993 -1.68083 0.0142314 1.88288 0.00365786 1.87589 + 58 11.6 0.201016 5.43825 -1.76706 0.00931728 1.96533 -0.00162055 1.95127 + 59 11.8 0.200554 5.68129 -1.82847 0.0182374 2.03784 -0.00437588 2.04134 + 60 12 0.199846 5.97128 -1.92082 0.0194932 2.1183 0.00601226 2.12025 + 61 12.2 0.199277 6.241 -2.01142 0.0351788 2.21575 0.000178196 2.19686 + 62 12.4 0.198665 6.53937 -2.10441 0.0329054 2.31015 0.00459675 2.28031 + 63 12.6 0.198285 6.82997 -2.19386 0.0429048 2.39766 0.00537061 2.39199 + 64 12.8 0.19791 7.12342 -2.26724 0.0223 2.48902 0.00566846 2.49733 + 65 13 0.197604 7.43047 -2.37106 0.0309134 2.60464 0.00167569 2.60807 + 66 13.2 0.197085 7.73303 -2.4592 0.0318118 2.70631 -0.00411481 2.70112 + 67 13.4 0.196691 8.08574 -2.56007 0.0466651 2.80727 -0.00425717 2.83291 + 68 13.6 0.196171 8.42299 -2.66706 0.0415621 2.93683 -0.000956737 2.95178 + 69 13.8 0.195816 8.79383 -2.78974 0.029483 3.0462 -0.000171274 3.07643 + 70 14 0.195457 9.17163 -2.9019 0.0200803 3.18292 0.00352052 3.21677 + 71 14.2 0.19496 9.59683 -3.05365 -0.00257644 3.33443 0.000302674 3.36806 + 72 14.4 0.19445 10.0406 -3.2117 -0.00144423 3.49559 -0.00467348 3.53056 + 73 14.6 0.194032 10.4714 -3.3472 -0.0135339 3.6416 -0.00887739 3.67444 + 74 14.8 0.193767 10.9402 -3.49948 -0.00792061 3.80866 -0.0111528 3.83116 + 75 15 0.193588 11.4104 -3.64186 -0.0427899 3.96586 -0.0080408 3.98285 diff --git a/tests/regression/walker/Velocity/stationary.q b/tests/regression/walker/Velocity/stationary.q new file mode 100644 index 00000000000..117e267345e --- /dev/null +++ b/tests/regression/walker/Velocity/stationary.q @@ -0,0 +1,53 @@ +# vim: filetype=sh: +# This is a comment +# Keywords are case-sensitive + +title "Langevin velocity PDF model keeping the joint + PDF constant in time using constant coefficients" + +walker + + #nstep 2 # Max number of time steps + term 1.0 # Max time + dt 0.01 # Time step size + npar 50000 # Number of particles + ttyi 10 # TTY output interval + + rngs + r123_philox end + end + + velocity # configure a velocity equation + depvar u + solve fullvar # fluctuation + init jointgaussian + icgaussian # unit kinetic energy, isotropic Reynolds stress at t=0 + gaussian 0.0 0.666667 end + gaussian 0.0 0.666667 end + gaussian 0.0 0.666667 end + end + coeff stationary + rng r123_philox + end + + statistics + interval 1 + # estimate and save mean velocity + + # estimate and save Reynolds stress + + end + + pdfs + interval 100 + filetype txt + policy overwrite #multiple + centering elem + format scientific + precision 12 + # save marginal PDFs of all velocity components + u1( u1 : 5.0e-2 ; -4 4 ) + u2( u2 : 5.0e-2 ; -4 4 ) + u3( u3 : 5.0e-2 ; -4 4 ) + end +end diff --git a/tests/regression/walker/Velocity/stationary.stat.txt.std b/tests/regression/walker/Velocity/stationary.stat.txt.std new file mode 100644 index 00000000000..f5921897194 --- /dev/null +++ b/tests/regression/walker/Velocity/stationary.stat.txt.std @@ -0,0 +1,101 @@ +# 1:it 2:t 3: 4: 5: 6: 7: 8: 9: 10: 11: + 0 0 -0.00414755 0.00196374 0.00674953 0.666482 -0.0016872 0.00749509 0.67083 0.00409747 0.66468 + 1 0.01 -0.00317084 0.00244889 0.00774626 0.666176 -0.000883444 0.00728651 0.669936 0.00369286 0.663276 + 2 0.02 -0.0031102 0.00146759 0.00798183 0.665782 1.78009e-05 0.00656424 0.668218 0.00355399 0.664812 + 3 0.03 -0.00250451 0.000837708 0.00819999 0.665237 0.000452788 0.00524219 0.669914 0.00253615 0.663678 + 4 0.04 -0.00239257 0.00171031 0.00780009 0.663702 0.00142114 0.00463396 0.669971 0.00308498 0.662377 + 5 0.05 -0.000915688 0.00146398 0.00782244 0.664005 0.00216896 0.00396182 0.668641 0.00161777 0.66319 + 6 0.06 -0.00114669 0.000267325 0.00820138 0.664674 0.00276395 0.00351491 0.667819 0.00176659 0.663173 + 7 0.07 -0.000796141 0.000711553 0.00831719 0.664428 0.00236535 0.00179511 0.666527 0.00159429 0.66325 + 8 0.08 -0.000350382 -0.000963718 0.00950946 0.665049 0.00381446 0.00228757 0.666425 0.00112213 0.663853 + 9 0.09 0.000307865 -0.00144832 0.0102573 0.665135 0.0036284 0.00176352 0.667761 0.000867145 0.66241 + 10 0.1 0.000640711 -0.00177952 0.00953489 0.665834 0.00394091 0.00101152 0.669373 0.00122897 0.663392 + 11 0.11 0.0016274 -0.00154619 0.00906071 0.66605 0.00412025 0.00118719 0.668108 0.00120626 0.66352 + 12 0.12 0.0027189 -0.000748537 0.00929082 0.665746 0.00294111 0.000369343 0.667135 0.00182396 0.664052 + 13 0.13 0.00257989 -0.00173936 0.00940949 0.666685 0.00350904 -6.19006e-05 0.665376 0.000960865 0.664698 + 14 0.14 0.00292326 -0.000198248 0.00952248 0.665883 0.00265379 -0.000629735 0.666116 0.000307742 0.665921 + 15 0.15 0.0035061 -0.00148689 0.00937323 0.665456 0.00343218 0.000286649 0.666225 0.000252441 0.66706 + 16 0.16 0.00375187 -0.000963387 0.00960331 0.666565 0.00484311 0.000217194 0.665522 0.000667336 0.669334 + 17 0.17 0.00317383 -0.00124828 0.00964878 0.666536 0.00403526 -0.000207053 0.666852 -0.00115038 0.668719 + 18 0.18 0.00230962 -0.00112096 0.00973462 0.666606 0.00296244 -0.000825349 0.667577 -0.00143686 0.670506 + 19 0.19 0.000301203 -0.0010116 0.00991798 0.666701 0.00329284 -0.00110002 0.667058 -0.00120646 0.670646 + 20 0.2 0.000810547 -0.000106822 0.0107429 0.66898 0.0023668 -0.00135781 0.668021 -0.000312743 0.671732 + 21 0.21 0.000853568 -0.00127673 0.0107451 0.667885 0.00264307 -0.000856179 0.666541 -0.000204528 0.672155 + 22 0.22 0.000245067 -0.00161094 0.0102579 0.66861 0.00198579 -8.91512e-07 0.665457 -0.000628249 0.670866 + 23 0.23 -0.00023755 -0.00445198 0.0110734 0.669515 0.00300672 0.000344138 0.666964 -0.00132602 0.671207 + 24 0.24 -0.000282961 -0.00432906 0.00986864 0.669302 0.003425 -0.000544392 0.667587 -0.000612435 0.670511 + 25 0.25 -0.000171029 -0.00501698 0.00939942 0.667633 0.0024105 -0.000180526 0.666536 0.000152513 0.669688 + 26 0.26 0.00158616 -0.00558894 0.00991908 0.668811 0.00317452 0.000160152 0.667147 0.000672277 0.669 + 27 0.27 0.00160911 -0.0054749 0.00995543 0.669309 0.00213064 0.000947226 0.666204 0.000579441 0.669402 + 28 0.28 0.00107582 -0.00552648 0.0104759 0.668859 0.00269012 0.00180609 0.667089 -0.000294695 0.670179 + 29 0.29 0.000676154 -0.00642 0.0103615 0.668737 0.0025878 0.00174703 0.667208 -0.000618534 0.668875 + 30 0.3 0.00156161 -0.00646634 0.0106991 0.668959 0.00152103 0.00157495 0.670599 -0.00143852 0.670376 + 31 0.31 0.00268179 -0.00596431 0.0109444 0.66948 0.00235742 0.00116125 0.670461 -0.000223578 0.669003 + 32 0.32 0.00192677 -0.00554946 0.0101403 0.668902 0.00154508 0.00078631 0.671085 0.000220111 0.668461 + 33 0.33 0.000665937 -0.00609262 0.00948146 0.668523 0.00155184 0.00106068 0.671247 0.000324574 0.66944 + 34 0.34 0.00101092 -0.00646421 0.00992809 0.66811 0.00167069 0.00100956 0.670735 0.000507758 0.669344 + 35 0.35 -0.000575914 -0.00712904 0.010103 0.669606 0.00164203 0.00105239 0.670938 0.000470533 0.670168 + 36 0.36 -0.000469758 -0.00710192 0.0100347 0.671348 0.000897088 0.000314584 0.671272 0.000797446 0.670669 + 37 0.37 -0.00032974 -0.00604429 0.0105229 0.671985 0.00127991 -7.05799e-05 0.672374 9.29811e-05 0.670934 + 38 0.38 0.000361318 -0.00585867 0.0102505 0.673784 0.00172771 0.000287103 0.672796 0.000638839 0.670391 + 39 0.39 5.35727e-05 -0.00598935 0.00970841 0.673624 0.00158313 0.00130279 0.673045 0.000242246 0.670661 + 40 0.4 0.000308864 -0.00571371 0.00941929 0.673573 0.00159726 0.000502044 0.671853 0.000349437 0.668931 + 41 0.41 -0.000137495 -0.00457076 0.00877065 0.673968 0.000202667 0.000332062 0.671117 6.89373e-05 0.667721 + 42 0.42 -0.000198199 -0.00573579 0.00920092 0.675636 0.000459393 -0.000295674 0.671445 0.000384934 0.667656 + 43 0.43 -0.000210648 -0.00611633 0.009091 0.67736 0.000299996 -0.000713732 0.670346 0.000622622 0.669871 + 44 0.44 -0.000292973 -0.00530692 0.00908901 0.677413 0.00120542 0.00058763 0.669495 0.00100498 0.669357 + 45 0.45 -0.000624134 -0.00589139 0.00924823 0.677828 0.00141429 -3.87458e-05 0.668717 8.62861e-05 0.670319 + 46 0.46 -0.000339624 -0.00532809 0.00933921 0.677829 0.00123294 0.000241746 0.669044 -0.00146258 0.670849 + 47 0.47 -0.00162396 -0.00532732 0.00876315 0.67706 0.00228996 0.00140548 0.667447 -0.000764263 0.671989 + 48 0.48 -0.00103527 -0.00608241 0.00810716 0.675835 0.0018628 0.00158933 0.666971 -0.00022225 0.671206 + 49 0.49 -0.000223677 -0.00630854 0.00765627 0.674464 0.00147198 0.00240345 0.668075 -8.82002e-07 0.67056 + 50 0.5 -0.000381152 -0.00598099 0.00812213 0.673833 0.00179951 0.00256539 0.668285 -0.000523901 0.669434 + 51 0.51 0.000534658 -0.00605177 0.0080818 0.673228 0.000922781 0.00220752 0.66755 -0.000907998 0.671378 + 52 0.52 0.000543249 -0.00508911 0.00794437 0.674161 -7.45842e-05 0.00247452 0.668064 -0.00103778 0.671803 + 53 0.53 0.00109765 -0.00510985 0.00748649 0.675529 1.75541e-05 0.00287015 0.667681 -0.00024079 0.671272 + 54 0.54 0.000864947 -0.00383427 0.00727116 0.675909 -0.000523245 0.0021746 0.667054 0.000232798 0.670143 + 55 0.55 0.000444 -0.00446857 0.00881821 0.676341 0.000691732 0.0026835 0.668016 0.000867857 0.670147 + 56 0.56 -6.61348e-06 -0.0041722 0.00835986 0.677863 -6.07025e-05 0.0035045 0.668394 0.00125807 0.669208 + 57 0.57 -4.26269e-05 -0.00317651 0.00908931 0.675951 -0.00118201 0.00299997 0.669227 0.00265514 0.670139 + 58 0.58 -0.000207409 -0.00354115 0.00859579 0.675699 -0.000233631 0.00393067 0.671072 0.00382894 0.669733 + 59 0.59 -9.44866e-05 -0.00321823 0.00934309 0.677916 -0.00129484 0.00354865 0.670528 0.00437315 0.669186 + 60 0.6 -0.000534567 -0.00265459 0.00964955 0.677329 -0.000689337 0.00418389 0.671304 0.00262878 0.666035 + 61 0.61 -0.000134384 -0.00221731 0.0105424 0.676453 0.000164064 0.00412341 0.67204 0.000996781 0.666352 + 62 0.62 -2.01375e-05 -0.00161369 0.0115918 0.675963 0.000289377 0.00392332 0.67191 0.00122851 0.665523 + 63 0.63 -0.00104228 -0.00104361 0.0120209 0.675175 0.000716801 0.00267226 0.67303 0.000815538 0.668011 + 64 0.64 0.000802151 -0.000997642 0.0119358 0.675082 -2.80597e-05 0.00406954 0.673197 0.00146818 0.668188 + 65 0.65 0.00143435 -0.00106895 0.0115734 0.675753 0.00179816 0.0032069 0.674538 0.000543089 0.668174 + 66 0.66 0.00133583 -0.00136808 0.0125819 0.675555 0.00187417 0.00196938 0.67574 0.000572505 0.6683 + 67 0.67 0.00320436 -0.00214602 0.0113959 0.676041 0.00147268 0.00117051 0.67615 0.0013152 0.667841 + 68 0.68 0.00296259 -0.00245119 0.0113109 0.675339 0.00136948 -0.000655667 0.675695 0.000775614 0.669154 + 69 0.69 0.00349282 -0.00214244 0.0120604 0.674965 0.00113897 -0.000812585 0.674965 0.000675875 0.667187 + 70 0.7 0.00393387 -0.00113445 0.0124697 0.675963 0.000980758 0.000175589 0.674996 8.50845e-05 0.667153 + 71 0.71 0.00407165 -0.00126767 0.012181 0.674741 0.00134864 -0.000316617 0.676816 -0.000933977 0.669225 + 72 0.72 0.00489719 -0.000629593 0.0119363 0.674393 0.00179243 -0.000504632 0.675545 -0.00134692 0.668999 + 73 0.73 0.00444737 -0.000602951 0.0116272 0.675169 0.00154219 0.000310457 0.674561 -0.00183438 0.669357 + 74 0.74 0.00462295 -0.00023615 0.0111897 0.674395 0.00183513 0.00132198 0.674549 -0.00257915 0.669537 + 75 0.75 0.00424496 0.000239093 0.0113667 0.676485 0.000931717 0.000230782 0.67391 -0.00253746 0.668588 + 76 0.76 0.00378941 -0.000236811 0.0114468 0.675425 0.00065234 -0.00027394 0.674938 -0.00263823 0.667275 + 77 0.77 0.00397244 -0.00148794 0.0112516 0.676391 0.00103074 -0.000518443 0.674592 -0.00181688 0.668239 + 78 0.78 0.00366891 -0.00178607 0.011777 0.675213 0.00108426 0.000646855 0.675314 -0.00124158 0.669804 + 79 0.79 0.00391328 -0.00192325 0.0125681 0.673867 -0.000282063 0.00108181 0.674532 -0.000819443 0.669986 + 80 0.8 0.00461048 -0.00106884 0.0128933 0.674258 -0.000848429 0.00108613 0.675588 -0.000396605 0.669655 + 81 0.81 0.00490582 -0.000141693 0.0136718 0.673608 -0.00129664 0.000696985 0.676016 0.000139928 0.66919 + 82 0.82 0.00654318 0.000771999 0.0142974 0.672204 -0.00128164 0.0010108 0.674247 -0.000258675 0.668198 + 83 0.83 0.00649439 0.000969416 0.0137163 0.671564 -0.00083537 0.00117454 0.674034 -0.0011354 0.667045 + 84 0.84 0.00700152 0.000240445 0.0145269 0.671318 -0.00172358 0.000518113 0.673314 -0.00217811 0.666959 + 85 0.85 0.0073169 0.00057237 0.0136791 0.672908 -0.00156359 0.00126671 0.674099 -0.00300424 0.667674 + 86 0.86 0.00829393 0.00109185 0.0137731 0.67167 -0.00144853 0.000560005 0.672787 -0.00379066 0.670045 + 87 0.87 0.00763618 -0.00055281 0.0136794 0.673764 -0.00123089 0.00117467 0.672444 -0.0037259 0.668984 + 88 0.88 0.00760654 -0.000331822 0.013174 0.676416 -0.00227203 0.000921579 0.670464 -0.0042218 0.667346 + 89 0.89 0.00818384 -4.84803e-05 0.0124507 0.675879 -0.00105276 0.000590118 0.669213 -0.00444462 0.667468 + 90 0.9 0.00840268 -0.000763436 0.0128651 0.677872 -0.00122068 0.000302326 0.669122 -0.00414524 0.66777 + 91 0.91 0.00840008 -0.000781188 0.0131593 0.677334 -0.00138676 0.00032887 0.669401 -0.00499112 0.668263 + 92 0.92 0.00870343 -0.00117995 0.0138634 0.675323 -0.00105746 0.00132478 0.668217 -0.00428156 0.667306 + 93 0.93 0.00831791 -0.00135903 0.0141872 0.674061 -0.00145558 0.00199186 0.668216 -0.00426578 0.668501 + 94 0.94 0.00743705 -0.000176154 0.0150485 0.675139 -0.00191437 0.0033391 0.668645 -0.00377255 0.66821 + 95 0.95 0.00738742 0.000105032 0.0143239 0.676628 -0.0017226 0.00387592 0.669488 -0.00265161 0.669583 + 96 0.96 0.00785923 0.00102408 0.0131827 0.677346 -0.00289293 0.00351652 0.671438 -0.00239889 0.668715 + 97 0.97 0.00780079 0.000892174 0.0130176 0.677404 -0.00265913 0.00394658 0.671436 -0.00156777 0.668176 + 98 0.98 0.00797285 -0.000712277 0.0134194 0.67871 -0.00326142 0.003951 0.672777 -0.00177299 0.670221 + 99 0.99 0.00876 -0.000363527 0.0132836 0.679064 -0.00357989 0.0029234 0.673808 -0.000615756 0.670899 diff --git a/tests/regression/walker/Velocity/stationary_pdf_u1.txt.std b/tests/regression/walker/Velocity/stationary_pdf_u1.txt.std new file mode 100644 index 00000000000..2a25b8ff9a4 --- /dev/null +++ b/tests/regression/walker/Velocity/stationary_pdf_u1.txt.std @@ -0,0 +1,187 @@ +# vim: filetype=sh: +# +# Univariate PDF: u1(u1) +# ----------------------------------------------- +# Numeric precision: 12 +# Bin size: 5.000000000000e-02 +# Number of bins estimated: 143 +# Number of bins output: 160 +# Sample space extent: [-4.000000000000e+00 : 4.000000000000e+00] +# Integral: 1.000000000000e+00 +# Iteration: 100 +# Physical time: 1.000000000000e+00 +# +# Example step-by-step visualization with gnuplot +# ----------------------------------------------- +# gnuplot> set grid +# gnuplot> unset key +# gnuplot> set xlabel "u1" +# gnuplot> set ylabel "u1(u1)" +# gnuplot> plot [-4.000000000000e+00:4.000000000000e+00] "pdf_u1.txt" with points +# +# Gnuplot one-liner for quick copy-paste +# ----------------------------------------------- +# set grid; unset key; set xlabel "u1"; set ylabel "u1(u1)"; plot [-4.000000000000e+00:4.000000000000e+00] "pdf_u1.txt" w p +# +# Data columns: u1, u1(u1) +# ----------------------------------------------- +-4.000000000000e+00 0.000000000000e+00 +-3.950000000000e+00 0.000000000000e+00 +-3.900000000000e+00 0.000000000000e+00 +-3.850000000000e+00 0.000000000000e+00 +-3.800000000000e+00 0.000000000000e+00 +-3.750000000000e+00 0.000000000000e+00 +-3.700000000000e+00 0.000000000000e+00 +-3.650000000000e+00 4.001600640256e-04 +-3.600000000000e+00 0.000000000000e+00 +-3.550000000000e+00 0.000000000000e+00 +-3.500000000000e+00 0.000000000000e+00 +-3.450000000000e+00 0.000000000000e+00 +-3.400000000000e+00 0.000000000000e+00 +-3.350000000000e+00 0.000000000000e+00 +-3.300000000000e+00 4.001600640256e-04 +-3.250000000000e+00 0.000000000000e+00 +-3.200000000000e+00 0.000000000000e+00 +-3.150000000000e+00 0.000000000000e+00 +-3.100000000000e+00 1.600640256102e-03 +-3.050000000000e+00 1.200480192077e-03 +-3.000000000000e+00 0.000000000000e+00 +-2.950000000000e+00 4.001600640256e-04 +-2.900000000000e+00 1.600640256102e-03 +-2.850000000000e+00 1.600640256102e-03 +-2.800000000000e+00 4.001600640256e-04 +-2.750000000000e+00 1.200480192077e-03 +-2.700000000000e+00 2.801120448179e-03 +-2.650000000000e+00 3.201280512205e-03 +-2.600000000000e+00 4.801920768307e-03 +-2.550000000000e+00 2.000800320128e-03 +-2.500000000000e+00 6.402561024410e-03 +-2.450000000000e+00 6.002400960384e-03 +-2.400000000000e+00 8.403361344538e-03 +-2.350000000000e+00 8.403361344538e-03 +-2.300000000000e+00 8.803521408563e-03 +-2.250000000000e+00 7.603041216487e-03 +-2.200000000000e+00 1.840736294518e-02 +-2.150000000000e+00 1.840736294518e-02 +-2.100000000000e+00 1.800720288115e-02 +-2.050000000000e+00 1.520608243297e-02 +-2.000000000000e+00 3.001200480192e-02 +-1.950000000000e+00 3.561424569828e-02 +-1.900000000000e+00 3.321328531413e-02 +-1.850000000000e+00 3.441376550620e-02 +-1.800000000000e+00 4.561824729892e-02 +-1.750000000000e+00 4.761904761905e-02 +-1.700000000000e+00 5.522208883553e-02 +-1.650000000000e+00 6.602641056423e-02 +-1.600000000000e+00 6.922769107643e-02 +-1.550000000000e+00 8.003201280512e-02 +-1.500000000000e+00 9.083633453381e-02 +-1.450000000000e+00 1.068427370948e-01 +-1.400000000000e+00 1.124449779912e-01 +-1.350000000000e+00 1.276510604242e-01 +-1.300000000000e+00 1.436574629852e-01 +-1.250000000000e+00 1.520608243297e-01 +-1.200000000000e+00 1.668667466987e-01 +-1.150000000000e+00 1.680672268908e-01 +-1.100000000000e+00 2.028811524610e-01 +-1.050000000000e+00 2.384953981593e-01 +-1.000000000000e+00 2.304921968788e-01 +-9.500000000000e-01 2.492997198880e-01 +-9.000000000000e-01 2.541016406563e-01 +-8.500000000000e-01 2.865146058423e-01 +-8.000000000000e-01 3.069227691076e-01 +-7.500000000000e-01 3.357342937175e-01 +-7.000000000000e-01 3.181272509004e-01 +-6.500000000000e-01 3.517406962785e-01 +-6.000000000000e-01 3.577430972389e-01 +-5.500000000000e-01 4.009603841537e-01 +-5.000000000000e-01 3.949579831933e-01 +-4.500000000000e-01 4.205682272909e-01 +-4.000000000000e-01 4.217687074830e-01 +-3.500000000000e-01 4.705882352941e-01 +-3.000000000000e-01 4.629851940776e-01 +-2.500000000000e-01 4.581832733093e-01 +-2.000000000000e-01 4.797919167667e-01 +-1.500000000000e-01 4.685874349740e-01 +-1.000000000000e-01 4.725890356142e-01 +-5.000000000000e-02 4.793917567027e-01 +0.000000000000e+00 4.689875950380e-01 +5.000000000000e-02 4.865946378551e-01 +1.000000000000e-01 4.753901560624e-01 +1.500000000000e-01 4.917967186875e-01 +2.000000000000e-01 4.465786314526e-01 +2.500000000000e-01 4.533813525410e-01 +3.000000000000e-01 4.605842336935e-01 +3.500000000000e-01 4.445778311325e-01 +4.000000000000e-01 4.429771908764e-01 +4.500000000000e-01 4.165666266507e-01 +5.000000000000e-01 3.897559023609e-01 +5.500000000000e-01 3.937575030012e-01 +6.000000000000e-01 3.605442176871e-01 +6.500000000000e-01 3.613445378151e-01 +7.000000000000e-01 3.605442176871e-01 +7.500000000000e-01 3.481392557023e-01 +8.000000000000e-01 3.113245298119e-01 +8.500000000000e-01 2.813125250100e-01 +9.000000000000e-01 2.432973189276e-01 +9.500000000000e-01 2.629051620648e-01 +1.000000000000e+00 2.244897959184e-01 +1.050000000000e+00 2.132853141257e-01 +1.100000000000e+00 1.720688275310e-01 +1.150000000000e+00 1.772709083633e-01 +1.200000000000e+00 1.664665866347e-01 +1.250000000000e+00 1.488595438175e-01 +1.300000000000e+00 1.384553821529e-01 +1.350000000000e+00 1.268507402961e-01 +1.400000000000e+00 1.300520208083e-01 +1.450000000000e+00 1.032412965186e-01 +1.500000000000e+00 9.643857543017e-02 +1.550000000000e+00 8.043217286915e-02 +1.600000000000e+00 7.683073229292e-02 +1.650000000000e+00 6.082432973189e-02 +1.700000000000e+00 5.242096838735e-02 +1.750000000000e+00 5.122048819528e-02 +1.800000000000e+00 4.801920768307e-02 +1.850000000000e+00 3.921568627451e-02 +1.900000000000e+00 2.601040416166e-02 +1.950000000000e+00 2.561024409764e-02 +2.000000000000e+00 3.081232492997e-02 +2.050000000000e+00 1.960784313725e-02 +2.100000000000e+00 2.280912364946e-02 +2.150000000000e+00 1.520608243297e-02 +2.200000000000e+00 1.400560224090e-02 +2.250000000000e+00 1.360544217687e-02 +2.300000000000e+00 1.160464185674e-02 +2.350000000000e+00 8.403361344538e-03 +2.400000000000e+00 7.202881152461e-03 +2.450000000000e+00 6.802721088435e-03 +2.500000000000e+00 5.202080832333e-03 +2.550000000000e+00 5.202080832333e-03 +2.600000000000e+00 2.400960384154e-03 +2.650000000000e+00 1.600640256102e-03 +2.700000000000e+00 1.200480192077e-03 +2.750000000000e+00 2.000800320128e-03 +2.800000000000e+00 2.000800320128e-03 +2.850000000000e+00 0.000000000000e+00 +2.900000000000e+00 2.400960384154e-03 +2.950000000000e+00 0.000000000000e+00 +3.000000000000e+00 8.003201280512e-04 +3.050000000000e+00 4.001600640256e-04 +3.100000000000e+00 8.003201280512e-04 +3.150000000000e+00 4.001600640256e-04 +3.200000000000e+00 8.003201280512e-04 +3.250000000000e+00 0.000000000000e+00 +3.300000000000e+00 8.003201280512e-04 +3.350000000000e+00 0.000000000000e+00 +3.400000000000e+00 0.000000000000e+00 +3.450000000000e+00 4.001600640256e-04 +3.500000000000e+00 0.000000000000e+00 +3.550000000000e+00 0.000000000000e+00 +3.600000000000e+00 0.000000000000e+00 +3.650000000000e+00 0.000000000000e+00 +3.700000000000e+00 0.000000000000e+00 +3.750000000000e+00 0.000000000000e+00 +3.800000000000e+00 0.000000000000e+00 +3.850000000000e+00 0.000000000000e+00 +3.900000000000e+00 0.000000000000e+00 +3.950000000000e+00 0.000000000000e+00 diff --git a/tests/regression/walker/Velocity/stationary_velocity.ndiff.cfg b/tests/regression/walker/Velocity/stationary_velocity.ndiff.cfg new file mode 100644 index 00000000000..5b817b6e766 --- /dev/null +++ b/tests/regression/walker/Velocity/stationary_velocity.ndiff.cfg @@ -0,0 +1,4 @@ +#rows cols constraints +* 1-2 # no constraint: smallest representable float +* 3-5 abs=0.02 # tolerance for mean velocity components +* 6-$ any rel=0.01 abs=0.04 # tolerance for Reynolds stress components diff --git a/tests/regression/walker/Velocity/stationary_velocity_pdf.ndiff.cfg b/tests/regression/walker/Velocity/stationary_velocity_pdf.ndiff.cfg new file mode 100644 index 00000000000..4d1b2e86d2a --- /dev/null +++ b/tests/regression/walker/Velocity/stationary_velocity_pdf.ndiff.cfg @@ -0,0 +1,4 @@ +#rows cols constraints +0-27 * skip +* 1 # sample space variable: no constraint: smallest representable float +* 2 any rel=0.01 abs=0.07 # tolerance for probabilities diff --git a/tests/regression/walker/Velocity/velocity.ndiff.cfg b/tests/regression/walker/Velocity/velocity.ndiff.cfg index de531316aec..6b67a30ade1 100644 --- a/tests/regression/walker/Velocity/velocity.ndiff.cfg +++ b/tests/regression/walker/Velocity/velocity.ndiff.cfg @@ -1,4 +1,4 @@ #rows cols constraints -* 1-2 # no constraint: smallest representable float -* 3 rel=0.05 # tolerance for means -* 4-$ abs=0.2 # tolerance for 2nd order stats +* 1-2 # no constraint: smallest representable float +* 3 rel=0.05 # tolerance for mean frequency +* 4-$ any rel=0.25 abs=0.2 # tolerance for Reynolds stress components diff --git a/tests/unit/Base/MigratedTypes.hpp b/tests/unit/Base/MigratedTypes.hpp index 4a9e8e1cb8b..9c0f3869144 100644 --- a/tests/unit/Base/MigratedTypes.hpp +++ b/tests/unit/Base/MigratedTypes.hpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Base/MigratedTypes.h + \file tests/unit/Base/MigratedTypes.hpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. @@ -12,7 +12,8 @@ #ifndef test_MigratedTypes_h #define test_MigratedTypes_h -#include "NoWarning/variant.hpp" +#include +#include #include "PUPUtil.hpp" #include "TaggedTuple.hpp" @@ -40,12 +41,12 @@ using Tuple = std::tuple< int, double, std::vector< std::string >, using Array = std::array< int, 2 >; using UnorderedMap = std::unordered_map< int, std::string >; using UnorderedSet = std::unordered_set< int >; -using BoostOptionalStr = boost::optional< std::string >; -using BoostOptionalInt = boost::optional< int >; -using TaggedTuple = tk::tuple::tagged_tuple< tag::name, std::string, - tag::age, int, - tag::email, std::string >; -using Variant = boost::variant< int, double >; +using OptionalStr = std::optional< std::string >; +using OptionalInt = std::optional< int >; +using TaggedTuple = tk::TaggedTuple< brigand::list< tag::name, std::string, + tag::age, int, + tag::email, std::string > >; +using Variant = std::variant< int, double >; //! Pack/Unpack: delegate to PUP:: inline void operator|( PUP::er& p, Enum_default& e ) { PUP::pup( p, e ); } @@ -55,9 +56,8 @@ inline void operator|( PUP::er& p, Tuple& t ) { PUP::pup( p, t ); } inline void operator|( PUP::er& p, Array& a ) { PUP::pup( p, a ); } inline void operator|( PUP::er& p, UnorderedMap& m ) { PUP::pup( p, m ); } inline void operator|( PUP::er& p, UnorderedSet& s ) { PUP::pup( p, s ); } -inline void operator|( PUP::er& p, BoostOptionalStr& o ) { PUP::pup( p, o ); } -inline void operator|( PUP::er& p, BoostOptionalInt& o ) { PUP::pup( p, o ); } -inline void operator|( PUP::er& p, TaggedTuple& t ) { PUP::pup( p, t ); } +inline void operator|( PUP::er& p, OptionalStr& o ) { PUP::pup( p, o ); } +inline void operator|( PUP::er& p, OptionalInt& o ) { PUP::pup( p, o ); } } // charm:: } // tut:: diff --git a/tests/unit/Base/TestContainerUtil.cpp b/tests/unit/Base/TestContainerUtil.cpp index 709ac932a7e..8b04a7ef0fb 100644 --- a/tests/unit/Base/TestContainerUtil.cpp +++ b/tests/unit/Base/TestContainerUtil.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestContainerUtil.C + \file tests/unit/Base/TestContainerUtil.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/ContainerUtil.h - \details Unit tests for Base/ContainerUtil.h + \brief Unit tests for Base/ContainerUtil.hpp + \details Unit tests for Base/ContainerUtil.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestData.cpp b/tests/unit/Base/TestData.cpp index 52bc7acf888..a77f57ad830 100644 --- a/tests/unit/Base/TestData.cpp +++ b/tests/unit/Base/TestData.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestData.C + \file tests/unit/Base/TestData.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Data.h - \details Unit tests for Base/Data.h + \brief Unit tests for Base/Data.hpp + \details Unit tests for Base/Data.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestException.cpp b/tests/unit/Base/TestException.cpp index 03a378ad8c3..690560ea307 100644 --- a/tests/unit/Base/TestException.cpp +++ b/tests/unit/Base/TestException.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestException.C + \file tests/unit/Base/TestException.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Exception.h - \details Unit tests for Base/Exception.h + \brief Unit tests for Base/Exception.hpp + \details Unit tests for Base/Exception.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestExceptionMPI.cpp b/tests/unit/Base/TestExceptionMPI.cpp index c842f505787..1a7745f8611 100644 --- a/tests/unit/Base/TestExceptionMPI.cpp +++ b/tests/unit/Base/TestExceptionMPI.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestExceptionMPI.C + \file tests/unit/Base/TestExceptionMPI.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/TestExceptionMPI.h - \details Unit tests for Base/TestExceptionMPI.h + \brief Unit tests for Base/TestExceptionMPI.hpp + \details Unit tests for Base/TestExceptionMPI.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestFactory.cpp b/tests/unit/Base/TestFactory.cpp index 954b3a6a3c0..e6854930040 100644 --- a/tests/unit/Base/TestFactory.cpp +++ b/tests/unit/Base/TestFactory.cpp @@ -1,22 +1,22 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestFactory.C + \file tests/unit/Base/TestFactory.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Factory.h - \details Unit tests for Base/Factory.h + \brief Unit tests for Base/Factory.hpp + \details Unit tests for Base/Factory.hpp */ // ***************************************************************************** +#include #include #include "NoWarning/tut.hpp" #include "TUTConfig.hpp" #include "Macro.hpp" -#include "Make_unique.hpp" #include "Factory.hpp" #include "QuinoaConfig.hpp" @@ -64,7 +64,7 @@ struct Factory_common { //! of class T was pre-constructed. template< typename T > explicit VBase( T x ) : - self( tk::make_unique< Model >( std::move(x) ) ), + self( std::make_unique< Model >( std::move(x) ) ), ctor( "val" ), assg() {} @@ -74,7 +74,7 @@ struct Factory_common { //! constructor, and thus usage from a factory. template< typename T > explicit VBase( std::function x ) : - self( tk::make_unique< Model >( std::move(x()) ) ), + self( std::make_unique< Model >( std::move(x()) ) ), ctor( "fun" ), assg() {} @@ -392,16 +392,12 @@ struct VBase { //! from an already-bound std::function, we could use those instead of //! having to explicitly forward the model constructor arguments via this //! host constructor. See also tk::recordCharmModel(). - template< typename T, typename... ConstrArgs, - typename std::enable_if< tk::HasTypedefProxy::value, int >::type = 0 > - explicit VBase( std::function c, ConstrArgs... args ) : - self( tk::make_unique< Model< typename T::Proxy > > - (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { + template< typename T, typename... CtrArgs > + explicit VBase( std::function c [[maybe_unused]], CtrArgs... args ) : + self( std::make_unique< Model< typename T::Proxy > > + (std::move(T::Proxy::ckNew(std::forward(args)...))) ) { Assert( c == nullptr, "std::function argument to VBase Charm " "constructor must be nullptr" ); - #ifdef NDEBUG - IGNORE(c); - #endif } //! Copy assignment VBase& operator=( const VBase& x ) diff --git a/tests/unit/Base/TestFlip_map.cpp b/tests/unit/Base/TestFlip_map.cpp index 818a1c847f6..cc56b12cda4 100644 --- a/tests/unit/Base/TestFlip_map.cpp +++ b/tests/unit/Base/TestFlip_map.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestFlip_map.C + \file tests/unit/Base/TestFlip_map.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Flip_map.h - \details Unit tests for Base/Flip_map.h + \brief Unit tests for Base/Flip_map.hpp + \details Unit tests for Base/Flip_map.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestHas.cpp b/tests/unit/Base/TestHas.cpp index ccdec0158c1..77c4087bc85 100644 --- a/tests/unit/Base/TestHas.cpp +++ b/tests/unit/Base/TestHas.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestHas.C + \file tests/unit/Base/TestHas.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Has.h - \details Unit tests for Base/Has.h + \brief Unit tests for Base/Has.hpp + \details Unit tests for Base/Has.hpp */ // ***************************************************************************** @@ -23,16 +23,16 @@ namespace tut { //! All tests in group inherited from this base struct Has_common { - struct noProxy {}; - struct yesProxy { using Proxy = int; }; struct noAlias {}; struct yesAlias { using alias = char; }; struct noCode {}; struct yesCode { using code = char; }; - struct noExpectType {}; - struct yesExpectType { struct expect{ using type = char; }; }; struct noExpectDescription {}; struct yesExpectDescription { struct expect{ void description(){} }; }; + struct noExpectLower {}; + struct yesExpectLower { struct expect{ int lower = 1; }; }; + struct noExpectUpper {}; + struct yesExpectUpper { struct expect{ int upper = 1; }; }; struct noExpectChoices {}; struct yesExpectChoices { struct expect{ void choices(){} }; }; }; @@ -46,124 +46,134 @@ static Has_group Has( "Base/Has" ); //! Test definitions for group -//! Test if tk::HasTypedefProxy correctly detects the absence of typedef Proxy +//! Test if tk::HasTypedef_alias correctly detects the absence of typedef alias template<> template<> void Has_object::test< 1 >() { - set_test_name( "HasTypedefProxy detects absence" ); + set_test_name( "HasTypedef_alias detects absence" ); - struct no { bool value = tk::HasTypedefProxy< noProxy >::value; }; - ensure_equals( "struct has no Proxy", no().value, false ); + struct no { bool value = tk::HasTypedef_alias_v< noAlias >; }; + ensure_equals( "struct has no alias", no().value, false ); } -//! Test if tk::HasTypedefProxy correctly detects the presence of typedef Proxy +//! Test if tk::HasTypedef_alias correctly detects the presence of typedef alias template<> template<> void Has_object::test< 2 >() { - set_test_name( "HasTypedefProxy detects presence" ); + set_test_name( "HasTypedef_alias detects presence" ); - struct yes { bool value = tk::HasTypedefProxy< yesProxy >::value; }; - ensure_equals( "struct has Proxy", yes().value, true ); + struct yes { bool value = tk::HasTypedef_alias_v< yesAlias >; }; + ensure_equals( "struct has alias", yes().value, true ); } -//! Test if tk::HasTypedefAlias correctly detects the absence of typedef alias +//! Test if tk::HasTypedef_code correctly detects the absence of typedef code template<> template<> void Has_object::test< 3 >() { - set_test_name( "HasTypedefAlias detects absence" ); + set_test_name( "HasTypedef_code detects absence" ); - struct no { bool value = tk::HasTypedefAlias< noAlias >::value; }; - ensure_equals( "struct has no alias", no().value, false ); + struct no { bool value = tk::HasTypedef_code_v< noCode >; }; + ensure_equals( "struct has no code", no().value, false ); } -//! Test if tk::HasTypedefAlias correctly detects the presence of typedef alias +//! Test if tk::HasTypedef_code correctly detects the presence of typedef code template<> template<> void Has_object::test< 4 >() { - set_test_name( "HasTypedefAlias detects presence" ); + set_test_name( "HasTypedef_code detects presence" ); - struct yes { bool value = tk::HasTypedefAlias< yesAlias >::value; }; - ensure_equals( "struct has alias", yes().value, true ); + struct yes { bool value = tk::HasTypedef_code_v< yesCode >; }; + ensure_equals( "struct has code", yes().value, true ); } -//! Test if tk::HasTypedefCode correctly detects the absence of typedef code +//! \brief Test if tk::HasFunction_expect_description correctly detects the +//! absence of function expect::description() template<> template<> void Has_object::test< 5 >() { - set_test_name( "HasTypedefCode detects absence" ); + set_test_name( "HasFunction_expect_description: absence" ); - struct no { bool value = tk::HasTypedefCode< noCode >::value; }; - ensure_equals( "struct has no code", no().value, false ); + struct no { + bool value = tk::HasFunction_expect_description_v< noExpectDescription >; + }; + ensure_equals( "struct has no expect::description", no().value, false ); } -//! Test if tk::HasTypedefCode correctly detects the presence of typedef code +//! \brief Test if tk::HasFunction_expect_description correctly detects the +//! presence of function expect::description() template<> template<> void Has_object::test< 6 >() { - set_test_name( "HasTypedefCode detects presence" ); + set_test_name( "HasFunction_expect_description: presence" ); - struct yes { bool value = tk::HasTypedefCode< yesCode >::value; }; - ensure_equals( "struct has code", yes().value, true ); + struct yes { + bool value = tk::HasFunction_expect_description_v< yesExpectDescription >; + }; + ensure_equals( "struct has expect::description", yes().value, true ); } -//! \brief Test if tk::HasTypedefExpectType correctly detects the absence of -//! typedef expect::type +//! \brief Test if tk::HasVar_expect_lower correctly detects the +//! absence of function expect::lower() template<> template<> void Has_object::test< 7 >() { - set_test_name( "HasTypedefExpectType: absence" ); + set_test_name( "HasVar_expect_lower: absence" ); - struct no { bool value = tk::HasTypedefExpectType< noExpectType >::value; }; - ensure_equals( "struct has no expect::type", no().value, false ); + struct no { + bool value = tk::HasVar_expect_lower_v< noExpectLower >; + }; + ensure_equals( "struct has no expect::lower", no().value, false ); } -//! \brief Test if tk::HasTypedefExpectType correctly detects the presence of -//! typedef expect::type +//! \brief Test if tk::HasVar_expect_lower correctly detects the +//! presence of variable expect::lower() template<> template<> void Has_object::test< 8 >() { - set_test_name( "HasTypedefExpectType: presence" ); + set_test_name( "HasVar_expect_lower: presence" ); - struct yes { bool value = tk::HasTypedefExpectType< yesExpectType >::value; }; - ensure_equals( "struct has expect::type", yes().value, true ); + struct yes { + bool value = tk::HasVar_expect_lower_v< yesExpectLower >; + }; + ensure_equals( "struct has expect::lower", yes().value, true ); } -//! \brief Test if tk::HasFunctionExpectDescription correctly detects the -//! absence of function expect::description() +//! \brief Test if tk::HasVar_expect_upper correctly detects the +//! absence of function expect::upper() template<> template<> void Has_object::test< 9 >() { - set_test_name( "HasFunctionExpectDescription: absence" ); + set_test_name( "HasVar_expect_upper: absence" ); struct no { - bool value = tk::HasFunctionExpectDescription< noExpectDescription >::value; + bool value = tk::HasVar_expect_upper_v< noExpectUpper >; }; - ensure_equals( "struct has no expect::description", no().value, false ); + ensure_equals( "struct has no expect::upper", no().value, false ); } -//! \brief Test if tk::HasFunctionExpectDescription correctly detects the -//! presence of function expect::description() +//! \brief Test if tk::HasVar_expect_upper correctly detects the +//! presence of variable expect::upper() template<> template<> void Has_object::test< 10 >() { - set_test_name( "HasFunctionExpectDescription: presence" ); + set_test_name( "HasVar_expect_upper: presence" ); struct yes { - bool value = tk::HasFunctionExpectDescription< yesExpectDescription >::value; + bool value = tk::HasVar_expect_upper_v< yesExpectUpper >; }; - ensure_equals( "struct has expect::description", yes().value, true ); + ensure_equals( "struct has expect::upper", yes().value, true ); } -//! \brief Test if tk::HasFunctionExpectChoices correctly detects the absence of -//! function expect::choices() +//! \brief Test if tk::HasFunction_expect_choices correctly detects the absence +//! of function expect::choices() template<> template<> void Has_object::test< 11 >() { - set_test_name( "HasFunctionExpectChoices: absence" ); + set_test_name( "HasFunction_expect_choices: absence" ); struct no { - bool value = tk::HasFunctionExpectChoices< noExpectChoices >::value; + bool value = tk::HasFunction_expect_choices_v< noExpectChoices >; }; ensure_equals( "struct has no expect::choices", no().value, false ); } -//! \brief Test if tk::HasFunctionExpectChoices correctly detects the presence +//! \brief Test if tk::HasFunction_expect_choices correctly detects the presence //! of function expect::choices() template<> template<> void Has_object::test< 12 >() { - set_test_name( "HasFunctionExpectChoices: presence" ); + set_test_name( "HasFunction_expect_choices: presence" ); struct yes { - bool value = tk::HasFunctionExpectChoices< yesExpectChoices >::value; + bool value = tk::HasFunction_expect_choices_v< yesExpectChoices >; }; ensure_equals( "struct has expect::choices", yes().value, true ); } diff --git a/tests/unit/Base/TestPUPUtil.cpp b/tests/unit/Base/TestPUPUtil.cpp index ad823403e36..e7de660600d 100644 --- a/tests/unit/Base/TestPUPUtil.cpp +++ b/tests/unit/Base/TestPUPUtil.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestPUPUtil.C + \file tests/unit/Base/TestPUPUtil.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/PUPUtil.h - \details Unit tests for Base/PUPUtil.h + \brief Unit tests for Base/PUPUtil.hpp + \details Unit tests for Base/PUPUtil.hpp */ // ***************************************************************************** @@ -468,8 +468,8 @@ class Migrated : public CBase_Migrated { tr.exception_typeid } ); } - //! Constructor taking (and migrating) a boost::optional< std::string > - explicit Migrated( charm::BoostOptionalStr o ) : + //! Constructor taking (and migrating) a std::optional< std::string > + explicit Migrated( charm::OptionalStr o ) : m_enum_default(), m_enum_uint8_t(), m_enum_cstyle(), @@ -486,7 +486,7 @@ class Migrated : public CBase_Migrated { { // Create test result struct, assume test is ok tut::test_result tr( "Base/PUPUtil", 10, - "Charm:migrate boost::optional 2", + "Charm:migrate std::optional 2", tut::test_result::result_type::ok ); try { @@ -494,10 +494,10 @@ class Migrated : public CBase_Migrated { std::string expected = "blah"; std::string actual = o ? *o : ""; // Evaluate test - ensure( "boost::optional different after migrated: " + ensure( "std::optional different after migrated: " "expected `" + expected + "` actual `" + actual + "`", m_boost_optional_str == - charm::BoostOptionalStr{ { "blah" } } ); + charm::OptionalStr{ { "blah" } } ); } catch ( const failure& ex ) { tr.result = ex.result(); tr.exception_typeid = ex.type(); @@ -509,8 +509,8 @@ class Migrated : public CBase_Migrated { tr.exception_typeid } ); } - //! Constructor taking (and migrating) an uninitialized boost::optional< int > - explicit Migrated( charm::BoostOptionalInt o ) : + //! Constructor taking (and migrating) an uninitialized std::optional< int > + explicit Migrated( charm::OptionalInt o ) : m_enum_default(), m_enum_uint8_t(), m_enum_cstyle(), @@ -527,18 +527,17 @@ class Migrated : public CBase_Migrated { { // Create test result struct, assume test is ok tut::test_result tr( "Base/PUPUtil", 11, - "Charm:migrate boost::optional 2", + "Charm:migrate std::optional 2", tut::test_result::result_type::ok ); try { // Generate error message with expected and actual value in case if fail - std::string expected = "boost::none"; - std::string actual = o ? std::to_string(*o) : "boost::none"; + std::string expected = "std::nullopt"; + std::string actual = o ? std::to_string(*o) : "std::nullopt"; // Evaluate test - ensure( "boost::optional different after migrated: " + ensure( "std::optional different after migrated: " "expected `" + expected + "` actual `" + actual + "`", - m_boost_optional_int == - charm::BoostOptionalInt{ boost::none } ); + m_boost_optional_int == charm::OptionalInt{ std::nullopt } ); } catch ( const failure& ex ) { tr.result = ex.result(); tr.exception_typeid = ex.type(); @@ -579,9 +578,9 @@ class Migrated : public CBase_Migrated { std::to_string( m_tagged_tuple.get< charm::tag::age >() ) + m_tagged_tuple.get< charm::tag::email >() + " ]"; // Evaluate test - ensure( "tk::tuple::tagged_tuple different after migrated: " - "expected `" + expected + "` actual `" + actual + "`", - m_tagged_tuple == charm::TaggedTuple{ "Bob", 32, "bob@bob.bob"} ); + ensure("tk::tuple::tagged_tuple different after migrated: " + "expected `" + expected + "` actual `" + actual + "`", + m_tagged_tuple == charm::TaggedTuple{{"Bob", 32, "bob@bob.bob"}}); } catch ( const failure& ex ) { tr.result = ex.result(); tr.exception_typeid = ex.type(); @@ -593,7 +592,7 @@ class Migrated : public CBase_Migrated { tr.exception_typeid } ); } - //! \brief Constructor taking (and migrating) a tk::Variant + //! \brief Constructor taking (and migrating) a std::variant //! holding int explicit Migrated( charm::Variant v, int value ) : m_enum_default(), @@ -612,18 +611,18 @@ class Migrated : public CBase_Migrated { { // Create test result struct, assume test is ok tut::test_result tr( "Base/PUPUtil", 13, - "Charm:migrate tk::Variant(int) 2", + "Charm:migrate std::variant(int) 2", tut::test_result::result_type::ok ); try { // Generate error message with expected and actual value in case if fail std::string expected = "[ " + std::to_string(value) + " ]"; std::string actual = "[ " + - std::to_string( boost::get< int >( m_variant ) ) + " ]"; + std::to_string( std::get< int >( m_variant ) ) + " ]"; // Evaluate test - ensure_equals( "tk::Variant(int) different after migrated:" + ensure_equals( "std::variant(int) different after migrated:" " expected `" + expected + "` actual `" + actual + "`", - boost::get< int >( m_variant ), value ); + std::get< int >( m_variant ), value ); } catch ( const failure& ex ) { tr.result = ex.result(); tr.exception_typeid = ex.type(); @@ -635,7 +634,7 @@ class Migrated : public CBase_Migrated { tr.exception_typeid } ); } - //! \brief Constructor taking (and migrating) a tk::Variant + //! \brief Constructor taking (and migrating) a std::variant //! holding double explicit Migrated( charm::Variant v, double value ) : m_enum_default(), @@ -654,18 +653,18 @@ class Migrated : public CBase_Migrated { { // Create test result struct, assume test is ok tut::test_result tr( "Base/PUPUtil", 14, - "Charm:migrate tk::Variant(double) 2", + "Charm:migrate std::variant(double) 2", tut::test_result::result_type::ok ); try { // Generate error message with expected and actual value in case if fail std::string expected = "[ " + std::to_string(value) + " ]"; std::string actual = "[ " + - std::to_string( boost::get< double >( m_variant ) ) + " ]"; + std::to_string( std::get< double >( m_variant ) ) + " ]"; // Evaluate test ensure_equals( "rk::Variant(double) different after " "migrated: expected `" + expected + "` actual `" + actual + - "`", boost::get< double >( m_variant ), value, + "`", std::get< double >( m_variant ), value, 1.0e-15 ); } catch ( const failure& ex ) { tr.result = ex.result(); @@ -687,8 +686,8 @@ class Migrated : public CBase_Migrated { charm::Array m_array; charm::UnorderedMap m_unordered_map; charm::UnorderedSet m_unordered_set; - charm::BoostOptionalStr m_boost_optional_str; - charm::BoostOptionalInt m_boost_optional_int; + charm::OptionalStr m_boost_optional_str; + charm::OptionalInt m_boost_optional_int; charm::TaggedTuple m_tagged_tuple; charm::Variant m_variant; }; @@ -880,7 +879,7 @@ void PUPUtil_object::test< 9 >() { CProxy_Migrated::ckNew( charm::UnorderedSet{ 11, 12 } ); } -//! Test Pack/Unpack of a boost::optional< std::string > +//! Test Pack/Unpack of a std::optional< std::string > //! \details Every Charm++ migration test, such as this one, consists of two //! unit tests: one for send and one for receive. Both trigger a TUT test, //! but the receive side is created manually, i.e., without the awareness of @@ -895,12 +894,12 @@ void PUPUtil_object::test< 10 >() { // firing up an asynchronous Charm++ chare. The second part creates a new test // result, sending it back to the suite if successful. If that chare never // executes, the suite will hang waiting for that chare to call back. - set_test_name( "Charm:migrate boost::optional 1" ); + set_test_name( "Charm:migrate std::optional 1" ); - CProxy_Migrated::ckNew( charm::BoostOptionalStr{ {"blah"} } ); + CProxy_Migrated::ckNew( charm::OptionalStr{ {"blah"} } ); } -//! Test Pack/Unpack of an uninitialized boost::optional< int > +//! Test Pack/Unpack of an uninitialized std::optional< int > //! \details Every Charm++ migration test, such as this one, consists of two //! unit tests: one for send and one for receive. Both trigger a TUT test, //! but the receive side is created manually, i.e., without the awareness of @@ -915,9 +914,9 @@ void PUPUtil_object::test< 11 >() { // firing up an asynchronous Charm++ chare. The second part creates a new test // result, sending it back to the suite if successful. If that chare never // executes, the suite will hang waiting for that chare to call back. - set_test_name( "Charm:migrate boost::optional 1" ); + set_test_name( "Charm:migrate std::optional 1" ); - CProxy_Migrated::ckNew( charm::BoostOptionalInt{ boost::none } ); + CProxy_Migrated::ckNew( charm::OptionalInt{ std::nullopt } ); } //! Test Pack/Unpack of tk::tuple::tagged_tuple @@ -937,10 +936,10 @@ void PUPUtil_object::test< 12 >() { // executes, the suite will hang waiting for that chare to call back. set_test_name( "Charm:migrate tk::tuple::tagged_tuple 1" ); - CProxy_Migrated::ckNew( charm::TaggedTuple{ "Bob", 32, "bob@bob.bob" } ); + CProxy_Migrated::ckNew( charm::TaggedTuple{{"Bob", 32, "bob@bob.bob"}} ); } -//! Test Pack/Unpack of tk::Variant holding an int +//! Test Pack/Unpack of std::variant holding an int //! \details Every Charm++ migration test, such as this one, consists of two //! unit tests: one for send and one for receive. Both trigger a TUT test, //! but the receive side is created manually, i.e., without the awareness of @@ -955,13 +954,13 @@ void PUPUtil_object::test< 13 >() { // firing up an asynchronous Charm++ chare. The second part creates a new test // result, sending it back to the suite if successful. If that chare never // executes, the suite will hang waiting for that chare to call back. - set_test_name( "Charm:migrate tk::Variant(int) 1" ); + set_test_name( "Charm:migrate std::variant(int) 1" ); - boost::variant< int, double > v{213}; + std::variant< int, double > v{213}; CProxy_Migrated::ckNew( charm::Variant(v), 213 ); } -//! Test Pack/Unpack of tk::Variant holding a double +//! Test Pack/Unpack of std::variant holding a double //! \details Every Charm++ migration test, such as this one, consists of two //! unit tests: one for send and one for receive. Both trigger a TUT test, //! but the receive side is created manually, i.e., without the awareness of @@ -976,9 +975,9 @@ void PUPUtil_object::test< 14 >() { // firing up an asynchronous Charm++ chare. The second part creates a new test // result, sending it back to the suite if successful. If that chare never // executes, the suite will hang waiting for that chare to call back. - set_test_name( "Charm:migrate tk::Variant(double) 1" ); + set_test_name( "Charm:migrate std::variant(double) 1" ); - boost::variant< int, double > v{3.14}; + std::variant< int, double > v{3.14}; CProxy_Migrated::ckNew( charm::Variant(v), 3.14 ); } diff --git a/tests/unit/Base/TestPrint.cpp b/tests/unit/Base/TestPrint.cpp index 6a425ec50fa..6678a6b5136 100644 --- a/tests/unit/Base/TestPrint.cpp +++ b/tests/unit/Base/TestPrint.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestPrint.C + \file tests/unit/Base/TestPrint.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Print.h - \details Unit tests for Base/Print.h + \brief Unit tests for Base/Print.pp + \details Unit tests for Base/Print.pp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestProcessControl.cpp b/tests/unit/Base/TestProcessControl.cpp index 83863587749..8b99b62745e 100644 --- a/tests/unit/Base/TestProcessControl.cpp +++ b/tests/unit/Base/TestProcessControl.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestProcessControl.C + \file tests/unit/Base/TestProcessControl.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/ProcessControl.h - \details Unit tests for Base/ProcessControl.h + \brief Unit tests for Base/ProcessControl.hpp + \details Unit tests for Base/ProcessControl.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestReader.cpp b/tests/unit/Base/TestReader.cpp index 7838f2a16b5..63cb75733cd 100644 --- a/tests/unit/Base/TestReader.cpp +++ b/tests/unit/Base/TestReader.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestReader.C + \file tests/unit/Base/TestReader.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Reader - \details Unit tests for Base/Reader + \brief Unit tests for Base/Reader.hpp + \details Unit tests for Base/Reader.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestStrConvUtil.cpp b/tests/unit/Base/TestStrConvUtil.cpp index b8c471723dd..8e8fe6967d8 100644 --- a/tests/unit/Base/TestStrConvUtil.cpp +++ b/tests/unit/Base/TestStrConvUtil.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestStrConvUtil.C + \file tests/unit/Base/TestStrConvUtil.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/StrConvUtil.h - \details Unit tests for Base/StrConvUtil.h + \brief Unit tests for Base/StrConvUtil.hpp + \details Unit tests for Base/StrConvUtil.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestTaggedTuple.cpp b/tests/unit/Base/TestTaggedTuple.cpp index b49d5225ed2..f592585e4e5 100644 --- a/tests/unit/Base/TestTaggedTuple.cpp +++ b/tests/unit/Base/TestTaggedTuple.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestTaggedTuple.C + \file tests/unit/Base/TestTaggedTuple.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/TaggedTuple.h - \details Unit tests for Base/TaggedTuple.h + \brief Unit tests for tk::tuple::TaggedTuple + \details Unit tests for tk::tuple::TaggedTuple */ // ***************************************************************************** @@ -14,6 +14,7 @@ #include "TUTConfig.hpp" #include "TaggedTuple.hpp" +#include "Types.hpp" #ifndef DOXYGEN_GENERATING_OUTPUT @@ -25,14 +26,68 @@ struct TaggedTuple_common { struct name {}; struct age {}; struct email {}; + struct tag1 {}; + struct tag2 {}; + struct tag3 {}; + struct tag4 {}; + struct tag5 {}; + struct tag6 {}; + struct tag7 {}; + struct tag8 {}; + struct tag9 {}; // Define a tagged tuple: odd template arguments are tags, even ones are types - using record = tk::tuple::tagged_tuple< name, std::string, - age, int, - email, std::string >; + using record = tk::TaggedTuple< brigand::list< name, std::string, + age, int, + email, std::string > >; // Declare a record, initialize with an std::initializer_list - record tup{ "Bob", 32, "bob@bob.bob" }; + record tup{{ "Bob", 32, "bob@bob.bob" }}; + + using map_value_tuple = tk::TaggedTuple< brigand::list< tag1, tk::real > >; + using tuple1 = tk::TaggedTuple< brigand::list< + tag1, std::string, + tag2, int, + tag5, std::vector< int >, + tag6, std::vector< std::vector< int > >, + tag9, std::vector< std::vector< std::vector< int > > >, + tag7, std::map< int, std::string >, + tag8, std::map< int, map_value_tuple > > >; + using tuple2 = tk::TaggedTuple< brigand::list< + tag1, std::string, + tag2, int, + tag3, tuple1, + tag5, std::vector< int >, + tag6, std::vector< std::vector< int > >, + tag9, std::vector< std::vector< std::vector< int > > >, + tag7, std::map< int, std::string >, + tag8, std::map< int, map_value_tuple > > >; + using control = tk::TaggedTuple< brigand::list< + tag1, std::string, + tag2, int, + tag3, tuple1, + tag4, tuple2, + tag5, std::vector< int >, + tag6, std::vector< std::vector< int > >, + tag9, std::vector< std::vector< std::vector< int > > >, + tag7, std::map< int, std::string >, + tag8, std::map< int, map_value_tuple > > >; + + double precision = std::numeric_limits< tk::real >::epsilon(); + + //! Lambda to compare two maps of TaggedTuple objects + void compare( const std::map< int, map_value_tuple >& lhs, + const std::map< int, map_value_tuple >& rhs ) + { + ensure_equals( "sizes of lhs and rhs not equal", lhs.size(), rhs.size() ); + for (const auto& e : lhs) { + auto r = rhs.find( e.first ); + ensure( "key in lhs not found in rhs", r != end(rhs) ); + auto v = r->second.template get< tag1 >(); + ensure_equals( "value in lhs not equal value in rhs", + e.second.template get< tag1 >(), v, precision ); + } + } }; //! Test group shortcuts @@ -44,7 +99,7 @@ static TaggedTuple_group TaggedTuple( "Base/TaggedTuple" ); //! Test definitions for group -//! Test const-ref accessor of tagged_tuple +//! Test const-ref accessor of TaggedTuple template<> template<> void TaggedTuple_object::test< 1 >() { set_test_name( "const-ref accessors" ); @@ -66,7 +121,7 @@ void TaggedTuple_object::test< 1 >() { a.getEmail(), "bob@bob.bob" ); } -//! Test non-const-ref accessors of tagged_tuple +//! Test non-const-ref accessors of TaggedTuple template<> template<> void TaggedTuple_object::test< 2 >() { set_test_name( "non-const-ref accessors" ); @@ -80,48 +135,48 @@ void TaggedTuple_object::test< 2 >() { tup.get< email >(), "bob@bob.bob" ); } -//! Test set(const char*) with const rvalue argument of tagged_tuple +//! Test set(const char*) with const rvalue argument of TaggedTuple template<> template<> void TaggedTuple_object::test< 3 >() { - set_test_name( "set(const char*) - const rvalue arg" ); + set_test_name( "get(const char*) - const rvalue arg" ); - record t{ "Bob", 32, "bob@bob.bob" }; - t.set< name >( "Alice" ); // const rvalue + record t{{ "Bob", 32, "bob@bob.bob" }}; + t.get< name >() = "Alice"; // const rvalue ensure_equals( "get() after set(const char*)", t.get< name >(), "Alice" ); } -//! Test set(std::string) with non-const lvalue argument of tagged_tuple +//! Test set(std::string) with non-const lvalue argument of TaggedTuple template<> template<> void TaggedTuple_object::test< 4 >() { - set_test_name( "set(std::string) - non-const lvalue arg" ); + set_test_name( "get(std::string) - non-const lvalue arg" ); - record t{ "Bob", 32, "bob@bob.bob" }; + record t{{ "Bob", 32, "bob@bob.bob" }}; std::string n( "Alice" ); - t.set< name >( n ); // non-const lvalue + t.get< name >() = n; // non-const lvalue ensure_equals( "get() after set(std::string)", t.get< name >(), "Alice" ); ensure_equals( "original source kept intact", n, "Alice" ); } -//! Test set(std::string) with const lvalue argument of tagged_tuple +//! Test set(std::string) with const lvalue argument of TaggedTuple template<> template<> void TaggedTuple_object::test< 5 >() { - set_test_name( "set(const std::string) - const lvalue" ); + set_test_name( "get(const std::string) - const lvalue" ); - record t{ "Bob", 32, "bob@bob.bob" }; + record t{{ "Bob", 32, "bob@bob.bob" }}; const std::string n( "Alice" ); - t.set< name >( n ); // const lvalue + t.get< name >() = n; // const lvalue ensure_equals( "get() after set(std::string)", t.get< name >(), "Alice" ); ensure_equals( "original source kept intact", n, "Alice" ); } -//! Test set(std::string) with rvalue argument of tagged_tuple +//! Test set(std::string) with rvalue argument of TaggedTuple template<> template<> void TaggedTuple_object::test< 6 >() { - set_test_name( "set(std::string&&) - rvalue ref arg" ); + set_test_name( "get(std::string&&) - rvalue ref arg" ); - record t{ "Bob", 32, "bob@bob.bob" }; + record t{{ "Bob", 32, "bob@bob.bob" }}; std::string n( "Alice" ); - t.set< name >( std::move(n) ); // rvalue reference + t.get< name >() = std::move(n); // rvalue reference ensure_equals( "get() after set(std::string)", t.get< name >(), "Alice" ); // n here should still be in a valid but unspecified state, so we try to use // it, if that's not the case, the constructor or the copy assignment throws. @@ -134,12 +189,327 @@ void TaggedTuple_object::test< 6 >() { ensure_equals( "original source in valid but unspecified state", k, n ); } -//! Test size of tagged_tuple +//! Test size of TaggedTuple template<> template<> void TaggedTuple_object::test< 7 >() { - set_test_name( "tagged_tuple_size()" ); - ensure_equals( "tagged_tuple_size = std::tuple_size/2", - tk::tuple::tagged_tuple_size< record >::value, 3UL ); + set_test_name( "TaggedTuple::size()" ); + static_assert( record::size() == 3, "Size of tuple incorrect" ); + ensure_equals( "TaggedTuple::size() incorrect", record().size(), 3UL ); +} + +//! Test set(), const-ref get() at three levels +template<> template<> +void TaggedTuple_object::test< 8 >() { + set_test_name( "set(), const-ref get() at three depths" ); + + control c; + c.get< tag1 >() = "blah1"; + c.get< tag3, tag1 >() ="blah2"; + c.get< tag4, tag3, tag1 >() = "blah3"; + + ensure_equals( "get() 1st level", c.get< tag1 >(), "blah1" ); + ensure_equals( "get() 2nd level", c.get< tag3, tag1 >(), "blah2" ); + ensure_equals( "get() 3rd level", c.get< tag4, tag3, tag1 >(), "blah3" ); +} + +//! Test set(), rvalue get() at three levels +template<> template<> +void TaggedTuple_object::test< 9 >() { + set_test_name( "set(), rvalue get() at three depths" ); + + control c; + c.get< tag1 >() = "blah1"; + c.get< tag3, tag1 >() = "blah2"; + c.get< tag4, tag3, tag1 >() = "blah3"; + + ensure_equals( "get() 1st level", c.get< tag1 >(), "blah1" ); + ensure_equals( "get() 2nd level", c.get< tag3, tag1 >(), "blah2" ); + ensure_equals( "get() 3rd level", c.get< tag4, tag3, tag1 >(), "blah3" ); +} + +//! Test store() at three levels +template<> template<> +void TaggedTuple_object::test< 10 >() { + set_test_name( "store() at three depths" ); + + control c; + c.store< tag2 >( "1" ); + c.store< tag3, tag2 >( "2" ); + c.store< tag4, tag3, tag2 >( "3" ); + + ensure_equals( "get() 1st level", c.get< tag2 >(), 1 ); + ensure_equals( "get() 2nd level", c.get< tag3, tag2 >(), 2 ); + ensure_equals( "get() 3rd level", c.get< tag4, tag3, tag2 >(), 3 ); +} + +//! Test push_back() at three levels +template<> template<> +void TaggedTuple_object::test< 11 >() { + set_test_name( "push_back() at three depths" ); + + control c; + c.get< tag5 >().push_back( 1 ); + c.get< tag5 >().push_back( 1 ); + c.get< tag3, tag5 >().push_back( 2 ); + c.get< tag3, tag5 >().push_back( 2 ); + c.get< tag4, tag3, tag5 >().push_back( 3 ); + c.get< tag4, tag3, tag5 >().push_back( 3 ); + + ensure_equals( "vector size at 1st level", c.get< tag5 >().size(), 2 ); + ensure_equals( "vector size at 2nd level", c.get< tag3, tag5 >().size(), 2 ); + ensure_equals( "vector size at 3rd level", + c.get< tag4, tag3, tag5 >().size(), 2 ); + + ensure( "vector elements incorrect at 1st level", + c.get< tag5 >() == std::vector< int >{ 1, 1 } ); + ensure( "vector elements incorrect at 2nd level", + c.get< tag3, tag5 >() == std::vector< int >{ 2, 2 } ); + ensure( "vector elements incorrect at 3rd level", + c.get< tag4, tag3, tag5 >() == std::vector< int >{ 3, 3 } ); +} + +//! Test push_back_back() at three levels +template<> template<> +void TaggedTuple_object::test< 12 >() { + set_test_name( "push_back_back() at three depths" ); + + control c; + c.get< tag6 >().push_back( {} ); // create an outer vector element + c.get< tag6 >().back().push_back( 1 ); // push to inner vector + c.get< tag6 >().back().push_back( 1 ); + c.get< tag3, tag6 >().push_back( {} ); + c.get< tag3, tag6 >().back().push_back( 2 ); + c.get< tag3, tag6 >().back().push_back( 2 ); + c.get< tag4, tag3, tag6 >().push_back( {} ); + c.get< tag4, tag3, tag6 >().back().push_back( 3 ); + c.get< tag4, tag3, tag6 >().back().push_back( 3 ); + + ensure_equals( "vector size at 1st level", + c.get< tag6 >().back().size(), 2 ); + ensure_equals( "vector size at 2nd level", + c.get< tag3, tag6 >().back().size(), 2 ); + ensure_equals( "vector size at 3rd level", + c.get< tag4, tag3, tag6 >().back().size(), 2 ); + + ensure( "vector elements incorrect at 1st level", + c.get< tag6 >().back() == std::vector< int >{ 1, 1 } ); + ensure( "vector elements incorrect at 2nd level", + c.get< tag3, tag6 >().back() == std::vector< int >{ 2, 2 } ); + ensure( "vector elements incorrect at 3rd level", + c.get< tag4, tag3, tag6 >().back() == std::vector< int >{ 3, 3 } ); +} + +//! Test store_back() at three levels +template<> template<> +void TaggedTuple_object::test< 13 >() { + set_test_name( "store_back() at three depths" ); + + control c; + c.store_back< tag5 >( "1" ); + c.store_back< tag5 >( "1" ); + c.store_back< tag3, tag5 >( "2" ); + c.store_back< tag3, tag5 >( "2" ); + c.store_back< tag4, tag3, tag5 >( "3" ); + c.store_back< tag4, tag3, tag5 >( "3" ); + + ensure_equals( "vector size at 1st level", c.get< tag5 >().size(), 2 ); + ensure_equals( "vector size at 2nd level", c.get< tag3, tag5 >().size(), 2 ); + ensure_equals( "vector size at 3rd level", + c.get< tag4, tag3, tag5 >().size(), 2 ); + + ensure( "vector elements incorrect at 1st level", + c.get< tag5 >() == std::vector< int >{ 1, 1 } ); + ensure( "vector elements incorrect at 2nd level", + c.get< tag3, tag5 >() == std::vector< int >{ 2, 2 } ); + ensure( "vector elements incorrect at 3rd level", + c.get< tag4, tag3, tag5 >() == std::vector< int >{ 3, 3 } ); +} + +//! Test store_back_back() at three levels +template<> template<> +void TaggedTuple_object::test< 14 >() { + set_test_name( "store_back_back() at three depths" ); + + control c; + c.get< tag6 >().push_back( {} ); // create an outer vector element + c.store_back_back< tag6 >( "1" ); // push to inner vector + c.store_back_back< tag6 >( "1" ); + c.get< tag3, tag6 >().push_back( {} ); + c.store_back_back< tag3, tag6 >( "2" ); + c.store_back_back< tag3, tag6 >( "2" ); + c.get< tag4, tag3, tag6 >().push_back( {} ); + c.store_back_back< tag4, tag3, tag6 >( "3" ); + c.store_back_back< tag4, tag3, tag6 >( "3" ); + + ensure_equals( "vector size at 1st level", + c.get< tag6 >().back().size(), 2 ); + ensure_equals( "vector size at 2nd level", + c.get< tag3, tag6 >().back().size(), 2 ); + ensure_equals( "vector size at 3rd level", + c.get< tag4, tag3, tag6 >().back().size(), 2 ); + + ensure( "vector elements incorrect at 1st level", + c.get< tag6 >().back() == std::vector< int >{ 1, 1 } ); + ensure( "vector elements incorrect at 2nd level", + c.get< tag3, tag6 >().back() == std::vector< int >{ 2, 2 } ); + ensure( "vector elements incorrect at 3rd level", + c.get< tag4, tag3, tag6 >().back() == std::vector< int >{ 3, 3 } ); +} + +//! Test store_back_back_back() at three levels +template<> template<> +void TaggedTuple_object::test< 15 >() { + set_test_name( "store_back_back_back() at three depths" ); + + control c; + c.get< tag9 >().push_back( {} ); + c.get< tag9 >().back().push_back( {} ); + c.store_back_back_back< tag9 >( "1" ); + c.store_back_back_back< tag9 >( "1" ); + c.get< tag3, tag9 >().push_back( {} ); + c.get< tag3, tag9 >().back().push_back( {} ); + c.store_back_back_back< tag3, tag9 >( "2" ); + c.store_back_back_back< tag3, tag9 >( "2" ); + c.get< tag4, tag3, tag9 >().push_back( {} ); + c.get< tag4, tag3, tag9 >().back().push_back( {} ); + c.store_back_back_back< tag4, tag3, tag9 >( "3" ); + c.store_back_back_back< tag4, tag3, tag9 >( "3" ); + + ensure_equals( "vector size at 1st level", + c.get< tag9 >().back().back().size(), 2 ); + ensure_equals( "vector size at 2nd level", + c.get< tag3, tag9 >().back().back().size(), 2 ); + ensure_equals( "vector size at 3rd level", + c.get< tag4, tag3, tag9 >().back().back().size(), 2 ); + + ensure( "vector elements incorrect at 1st level", + c.get< tag9 >().back().back() == std::vector{1,1} ); + ensure( "vector elements incorrect at 2nd level", + c.get< tag3, tag9 >().back().back() == std::vector{2,2} ); + ensure( "vector elements incorrect at 3rd level", + c.get< tag4, tag3, tag9 >().back().back() == std::vector{3,3} ); +} + +//! Test insert() at three levels +template<> template<> +void TaggedTuple_object::test< 16 >() { + set_test_name( "insert() at three depths" ); + + control c; + c.insert< tag7 >( 1, "one" ); + c.insert< tag7 >( 2, "two" ); + c.insert< tag7 >( 10, "" ); + c.insert< tag3, tag7 >( 3, "three" ); + c.insert< tag3, tag7 >( 4, "four" ); + c.insert< tag3, tag7 >( 10, "" ); + c.insert< tag4, tag3, tag7 >( 5, "five" ); + c.insert< tag4, tag3, tag7 >( 6, "six" ); + c.insert< tag4, tag3, tag7 >( 10, "" ); + + ensure_equals( "map size at 1st level", c.get< tag7 >().size(), 3 ); + ensure_equals( "map size at 2nd level", c.get< tag3, tag7 >().size(), 3 ); + ensure_equals( "map size at 3rd level", + c.get< tag4, tag3, tag7 >().size(), 3 ); + + ensure( "map elements incorrect at 1st level", + c.get< tag7 >() == + std::map< int, std::string >{ {1,"one"}, {2,"two"}, {10,""} } ); + ensure( "map elements incorrect at 2nd level", + c.get< tag3, tag7 >() == + std::map< int, std::string >{ {3,"three"}, {4,"four"}, {10,""} } ); + ensure( "map elements incorrect at 3rd level", + c.get< tag4, tag3, tag7 >() == + std::map< int, std::string >{ {5,"five"}, {6,"six"}, {10,""} } ); +} + +//! Test insert_field() at three levels, with conversion from string +template<> template<> +void TaggedTuple_object::test< 17 >() { + set_test_name( "insert_field() at three depths" ); + + control c; + c.insert_field< tag1, tk::real, tag8 >( 1, "-1.2" ); + c.insert_field< tag1, tk::real, tag8 >( 2, "3.14" ); + c.insert_field< tag1, tk::real, tag3, tag8 >( 3, "2.1" ); + c.insert_field< tag1, tk::real, tag3, tag8 >( 4, "3e-3" ); + c.insert_field< tag1, tk::real, tag4, tag3, tag8 >( 5, "-2.3" ); + c.insert_field< tag1, tk::real, tag4, tag3, tag8 >( 6, "-10" ); + + ensure_equals( "map size at 1st level", c.get< tag8 >().size(), 2 ); + ensure_equals( "map size at 2nd level", c.get< tag3, tag8 >().size(), 2 ); + ensure_equals( "map size at 3rd level", + c.get< tag4, tag3, tag8 >().size(), 2 ); + + compare( c.get< tag8 >(), + std::map< int, map_value_tuple >{ {1,map_value_tuple{-1.2}}, + {2,map_value_tuple{3.14}} } ); + compare( c.get< tag3, tag8 >(), + std::map< int, map_value_tuple >{ {3,map_value_tuple{2.1}}, + {4,map_value_tuple{3e-3}} } ); + compare( c.get< tag4, tag3, tag8 >(), + std::map< int, map_value_tuple >{ {5,map_value_tuple{-2.3}}, + {6,map_value_tuple{-10}} } ); +} + +//! Test insert_field() at three levels, without conversion +template<> template<> +void TaggedTuple_object::test< 18 >() { + set_test_name( "insert_field() at three depths, with conversion" ); + + control c; + c.insert_field< tag1, tk::real, tag8 >( 1, 1.2 ); + c.insert_field< tag1, tk::real, tag8 >( 2, 3.14 ); + c.insert_field< tag1, tk::real, tag3, tag8 >( 3, 2.1 ); + c.insert_field< tag1, tk::real, tag3, tag8 >( 4, 3e-3 ); + c.insert_field< tag1, tk::real, tag4, tag3, tag8 >( 5, -2.3 ); + c.insert_field< tag1, tk::real, tag4, tag3, tag8 >( 6, -10 ); + + ensure_equals( "map size at 1st level", c.get< tag8 >().size(), 2 ); + ensure_equals( "map size at 2nd level", c.get< tag3, tag8 >().size(), 2 ); + ensure_equals( "map size at 3rd level", + c.get< tag4, tag3, tag8 >().size(), 2 ); + + compare( c.get< tag8 >(), + std::map< int, map_value_tuple >{ {1,map_value_tuple{1.2}}, + {2,map_value_tuple{3.14}} } ); + compare( c.get< tag3, tag8 >(), + std::map< int, map_value_tuple >{ {3,map_value_tuple{2.1}}, + {4,map_value_tuple{3e-3}} } ); + compare( c.get< tag4, tag3, tag8 >(), + std::map< int, map_value_tuple >{ {5,map_value_tuple{-2.3}}, + {6,map_value_tuple{-10}} } ); +} + +//! Test T convert( str ) feeding garbage +template<> template<> +void TaggedTuple_object::test< 19 >() { + set_test_name( "T convert(str) feeding garbage" ); + + try { + control().insert_field< tag1, tk::real, tag8 >( 1, "a" ); + fail( "should throw exception" ); + } + catch ( tk::Exception& ) { + // exception thrown, test ok + } +} + +//! Test T convert( str ) feeding convertible value +template<> template<> +void TaggedTuple_object::test< 20 >() { + set_test_name( "T convert(str)" ); + + try { + control c; + c.insert_field< tag1, tk::real, tag8 >( 1, "345" ); + const auto& m = c.get< tag8 >(); + auto i = m.find( 1 ); + Assert( i != end(m), "Key not found in map in TaggedTuple" ); + ensure_equals( "conversion", i->second.get< tag1 >(), 345.0, precision ); + } + catch ( tk::Exception& ) { + fail( "should not throw exception" ); + } } } // tut:: diff --git a/tests/unit/Base/TestTimer.cpp b/tests/unit/Base/TestTimer.cpp index 38b0189bb6a..feb2bc4c828 100644 --- a/tests/unit/Base/TestTimer.cpp +++ b/tests/unit/Base/TestTimer.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestTimer.C + \file tests/unit/Base/TestTimer.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Timer.h - \details Unit tests for Base/Timer.h + \brief Unit tests for tk::Timer + \details Unit tests for tk::Timer */ // ***************************************************************************** diff --git a/tests/unit/Base/TestVector.cpp b/tests/unit/Base/TestVector.cpp index cc69a162ecb..baae14990bf 100644 --- a/tests/unit/Base/TestVector.cpp +++ b/tests/unit/Base/TestVector.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestVector.C + \file tests/unit/Base/TestVector.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Vector.h - \details Unit tests for Base/Vector.h + \brief Unit tests for Base/Vector.hpp + \details Unit tests for Base/Vector.hpp */ // ***************************************************************************** diff --git a/tests/unit/Base/TestWriter.cpp b/tests/unit/Base/TestWriter.cpp index 640335fc061..908dcc072cc 100644 --- a/tests/unit/Base/TestWriter.cpp +++ b/tests/unit/Base/TestWriter.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Base/TestWriter.C + \file tests/unit/Base/TestWriter.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Base/Writer - \details Unit tests for Base/Writer + \brief Unit tests for Base/Writer.hpp + \details Unit tests for Base/Writer.hpp */ // ***************************************************************************** diff --git a/tests/unit/Control/Options/TestMKLBetaMethod.cpp b/tests/unit/Control/Options/TestMKLBetaMethod.cpp index 4ff07719d1c..f0369d11696 100644 --- a/tests/unit/Control/Options/TestMKLBetaMethod.cpp +++ b/tests/unit/Control/Options/TestMKLBetaMethod.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/Options/TestMKLBetaMethod.C + \file tests/unit/Control/Options/TestMKLBetaMethod.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/Options/TestMKLGammaMethod.cpp b/tests/unit/Control/Options/TestMKLGammaMethod.cpp index 10fbed5ecf6..fc1e9161547 100644 --- a/tests/unit/Control/Options/TestMKLGammaMethod.cpp +++ b/tests/unit/Control/Options/TestMKLGammaMethod.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/Options/TestMKLGammaMethod.C + \file tests/unit/Control/Options/TestMKLGammaMethod.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/Options/TestMKLGaussianMethod.cpp b/tests/unit/Control/Options/TestMKLGaussianMethod.cpp index 4997dd5dfbf..4a7e5eed409 100644 --- a/tests/unit/Control/Options/TestMKLGaussianMethod.cpp +++ b/tests/unit/Control/Options/TestMKLGaussianMethod.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/Options/TestMKLGaussianMethod.C + \file tests/unit/Control/Options/TestMKLGaussianMethod.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/Options/TestMKLUniformMethod.cpp b/tests/unit/Control/Options/TestMKLUniformMethod.cpp index 73a2cbe6913..72750d71107 100644 --- a/tests/unit/Control/Options/TestMKLUniformMethod.cpp +++ b/tests/unit/Control/Options/TestMKLUniformMethod.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/Options/TestMKLUniformMethod.C + \file tests/unit/Control/Options/TestMKLUniformMethod.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/Options/TestRNG.cpp b/tests/unit/Control/Options/TestRNG.cpp index 9885685b997..cd53e051e5e 100644 --- a/tests/unit/Control/Options/TestRNG.cpp +++ b/tests/unit/Control/Options/TestRNG.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/Options/TestRNG.C + \file tests/unit/Control/Options/TestRNG.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. @@ -185,7 +185,8 @@ void RNGOptions_object::test< 13 >() { // specify sequence length parameter for RNGSSE rng std::map< tk::ctr::RNGType, tk::ctr::RNGSSEParam > b { - { tk::ctr::RNGType::RNGSSE_GQ581, { 12, tk::ctr::RNGSSESeqLenType::LONG } } + { tk::ctr::RNGType::RNGSSE_GQ581, + tk::ctr::RNGSSEParam{{12, tk::ctr::RNGSSESeqLenType::LONG}} } }; ensure( "does not return specified sequence length for RNGSSE rng", m.param< tag::seqlen > // query this field diff --git a/tests/unit/Control/TestControl.cpp b/tests/unit/Control/TestControl.cpp index f02e21c941b..340a75b3db1 100644 --- a/tests/unit/Control/TestControl.cpp +++ b/tests/unit/Control/TestControl.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/TestControl.C + \file tests/unit/Control/TestControl.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/TestFileParser.cpp b/tests/unit/Control/TestFileParser.cpp index 17ebbc828b3..d9b5f0228c5 100644 --- a/tests/unit/Control/TestFileParser.cpp +++ b/tests/unit/Control/TestFileParser.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/TestFileParser.C + \file tests/unit/Control/TestFileParser.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/TestStringParser.cpp b/tests/unit/Control/TestStringParser.cpp index a402035b8c3..22676c7084d 100644 --- a/tests/unit/Control/TestStringParser.cpp +++ b/tests/unit/Control/TestStringParser.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/TestStringParser.C + \file tests/unit/Control/TestStringParser.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Control/TestSystemComponents.cpp b/tests/unit/Control/TestSystemComponents.cpp index 88ff18dbd7f..ec5d4b5f485 100644 --- a/tests/unit/Control/TestSystemComponents.cpp +++ b/tests/unit/Control/TestSystemComponents.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/TestSystemComponents.C + \file tests/unit/Control/TestSystemComponents.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. @@ -19,7 +19,6 @@ #include "SystemComponents.hpp" #include "TaggedTuple.hpp" #include "Tags.hpp" -#include "Control.hpp" #ifndef DOXYGEN_GENERATING_OUTPUT @@ -32,17 +31,14 @@ struct eq2 {}; //! All tests in group inherited from this base struct SystemComponents_common { // Typedef simple set of equations of two types - using ncomps = tk::ctr::ncomponents< - eq1, std::vector< tk::ctr::ncomp_type >, - eq2, std::vector< tk::ctr::ncomp_type > - >; + using ncomps = tk::ctr::ncomponents< eq1, eq2 >; // Typedef vector of all equation tags using eqs = brigand::list< eq1, eq2 >; // Functor verifying the number of components struct testncomp { const ncomps& m_host; - const std::vector< tk::ctr::ncomp_type > m_comps{ 2, 3, 3, 2 }; + const std::vector< tk::ctr::ncomp_t > m_comps{ 2, 3, 3, 2 }; std::size_t m_c; explicit testncomp( const ncomps& host ) : m_host( host ), m_c( 0 ) {} template< typename U > void operator()( brigand::type_ ) { @@ -55,7 +51,7 @@ struct SystemComponents_common { // Functor verifying the offset struct testoffset { const ncomps& m_host; - const std::vector< tk::ctr::ncomp_type > m_offs{ 0, 2, 5, 8 }; + const std::vector< tk::ctr::ncomp_t > m_offs{ 0, 2, 5, 8 }; std::size_t m_c; explicit testoffset( const ncomps& host ) : m_host( host ), m_c( 0 ) {} template< typename U > void operator()( brigand::type_ ) { @@ -153,22 +149,22 @@ void SystemComponents_object::test< 4 >() { nc.get< eq2 >().push_back( 2 ); // Dependent variables (as the only parameters) for two equation systems - using eq1_parameters = tk::tuple::tagged_tuple< + using eq1_parameters = tk::TaggedTuple< brigand::list< tag::depvar, std::vector< char > - >; - using eq2_parameters = tk::tuple::tagged_tuple< + > >; + using eq2_parameters = tk::TaggedTuple< brigand::list< tag::depvar, std::vector< char > - >; + > >; // Parameters for two equation systems - using parameters = tk::tuple::tagged_tuple< + using parameters = tk::TaggedTuple< brigand::list< eq1, eq1_parameters, eq2, eq2_parameters - >; + > >; // Crate mock input deck with two systems of eqations with dependent variables - tk::Control< tag::component, ncomps, - tag::param, parameters > deck; + tk::TaggedTuple< brigand::list< tag::component, ncomps, + tag::param, parameters > > deck; // Assign ncomps to deck deck.get< tag::component >() = std::move( nc ); @@ -200,22 +196,22 @@ void SystemComponents_object::test< 5 >() { nc.get< eq2 >().push_back( 8 ); // Dependent variables (as the only parameters) for two equation systems - using eq1_parameters = tk::tuple::tagged_tuple< + using eq1_parameters = tk::TaggedTuple< brigand::list< tag::depvar, std::vector< char > - >; - using eq2_parameters = tk::tuple::tagged_tuple< + > >; + using eq2_parameters = tk::TaggedTuple< brigand::list< tag::depvar, std::vector< char > - >; + > >; // Parameters for two equation systems - using parameters = tk::tuple::tagged_tuple< + using parameters = tk::TaggedTuple< brigand::list< eq1, eq1_parameters, eq2, eq2_parameters - >; + > >; // Crate mock input deck with two systems of eqations with dependent variables - tk::Control< tag::component, ncomps, - tag::param, parameters > deck; + tk::TaggedTuple< brigand::list< tag::component, ncomps, + tag::param, parameters > > deck; // Assign ncomps to deck deck.get< tag::component >() = std::move( nc ); diff --git a/tests/unit/Control/TestToggle.cpp b/tests/unit/Control/TestToggle.cpp index 0daca9a5671..1e0b9c768c2 100644 --- a/tests/unit/Control/TestToggle.cpp +++ b/tests/unit/Control/TestToggle.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Control/TestToggle.C + \file tests/unit/Control/TestToggle.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/IO/TestExodusIIMeshReader.cpp b/tests/unit/IO/TestExodusIIMeshReader.cpp index 0a4184f5d87..afb60434021 100644 --- a/tests/unit/IO/TestExodusIIMeshReader.cpp +++ b/tests/unit/IO/TestExodusIIMeshReader.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/IO/TestExodusIIMeshReader.C + \file tests/unit/IO/TestExodusIIMeshReader.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/IO/TestMesh.cpp b/tests/unit/IO/TestMesh.cpp index 7014c7f7fe4..0fb862b8649 100644 --- a/tests/unit/IO/TestMesh.cpp +++ b/tests/unit/IO/TestMesh.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/IO/TestMesh.C + \file tests/unit/IO/TestMesh.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/IO/TestMeshReader.cpp b/tests/unit/IO/TestMeshReader.cpp index 645a22ebcf4..b44e05f1800 100644 --- a/tests/unit/IO/TestMeshReader.cpp +++ b/tests/unit/IO/TestMeshReader.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/IO/TestMeshReader.C + \file tests/unit/IO/TestMeshReader.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. @@ -27,18 +27,6 @@ namespace tut { //! All tests in group inherited from this base struct MeshReader_common { - //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces - tk::MeshReader er; - //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces - tk::MeshReader erf; - - //! \brief Constructor for MeshReader_common as base class for all tests in - //! this group - MeshReader_common() : - er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ), - erf( tk::regression_dir() + - "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ) {} - // Coordinates for simple tetrahedron-mesh std::vector< tk::real > box24_coord { 0, 0, 0, 1, 0, 0, @@ -162,6 +150,12 @@ template<> template<> void MeshReader_object::test< 1 >() { set_test_name( "ctor dispatching to ExodusII reader" ); + //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces + tk::MeshReader er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ); + //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces + tk::MeshReader erf( tk::regression_dir() + + "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ); + // Verify the output of mesh reader dispatching to ExodusII reader using two // different meshes, one with only tets, one with faces/sidesets. verifyTets( er ); @@ -173,6 +167,12 @@ template<> template<> void MeshReader_object::test< 2 >() { set_test_name( "copy ctor dispatching to ExodusII reader" ); + //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces + tk::MeshReader er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ); + //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces + tk::MeshReader erf( tk::regression_dir() + + "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ); + std::vector< tk::MeshReader > v; // Invoke copy constructor @@ -195,6 +195,12 @@ template<> template<> void MeshReader_object::test< 3 >() { set_test_name( "move ctor dispatching to ExodusII reader" ); + //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces + tk::MeshReader er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ); + //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces + tk::MeshReader erf( tk::regression_dir() + + "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ); + std::vector< tk::MeshReader > v; // Invoke move constructor @@ -215,6 +221,12 @@ template<> template<> void MeshReader_object::test< 4 >() { set_test_name( "copy assignment dispatching to ExoII reader" ); + //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces + tk::MeshReader er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ); + //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces + tk::MeshReader erf( tk::regression_dir() + + "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ); + // Invoke constructor tk::MeshReader q( er ); // Invoke copy assignment @@ -239,6 +251,12 @@ template<> template<> void MeshReader_object::test< 5 >() { set_test_name( "move assignment dispatching to ExoII reader" ); + //! Mesh reader configured for ExodusIIMesReader for a simple mesh w/o faces + tk::MeshReader er( tk::regression_dir() + "/meshconv/gmsh_output/box_24.exo" ); + //! Mesh reader configured for ExodusIIMesReader for mesh w/ faces + tk::MeshReader erf( tk::regression_dir() + + "/inciter/transport/GaussHump/unitsquare_01_3.6k.exo" ); + // Invoke move assignment auto c = er; auto p = std::move(c); diff --git a/tests/unit/Inciter/AMR/TestError.cpp b/tests/unit/Inciter/AMR/TestError.cpp index 1eae0060253..84bde571177 100644 --- a/tests/unit/Inciter/AMR/TestError.cpp +++ b/tests/unit/Inciter/AMR/TestError.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Inciter/AMR/TestError.C + \file tests/unit/Inciter/AMR/TestError.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Inciter/TestScheme.cpp b/tests/unit/Inciter/TestScheme.cpp index 66641ac58ac..bcc6de3c97d 100644 --- a/tests/unit/Inciter/TestScheme.cpp +++ b/tests/unit/Inciter/TestScheme.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/Inciter/TestScheme.C + \file tests/unit/Inciter/TestScheme.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for Inciter/Scheme.h - \details Unit tests for Inciter/Scheme.h + \brief Unit tests for Inciter/Scheme.hpp + \details Unit tests for Inciter/Scheme.hpp */ // ***************************************************************************** @@ -55,7 +55,7 @@ class Receiver : public CBase_Receiver { tut::test_result::result_type::ok ); try { - int actual = s.which(); + auto actual = s.index(); // Evaluate test ensure_equals( "Scheme underlying type different after migrated", actual, expected ); @@ -79,11 +79,11 @@ void Scheme_object::test< 1 >() { set_test_name( "ctor which" ); inciter::Scheme c( inciter::ctr::SchemeType::DiagCG ); - ensure_equals( "Underlying type", c.which(), 0 ); + ensure_equals( "Underlying type", c.index(), 0 ); inciter::Scheme d( inciter::ctr::SchemeType::DG ); - ensure_equals( "Underlying type", d.which(), 1 ); + ensure_equals( "Underlying type", d.index(), 1 ); inciter::Scheme a( inciter::ctr::SchemeType::ALECG ); - ensure_equals( "Underlying type", a.which(), 2 ); + ensure_equals( "Underlying type", a.index(), 2 ); } //! Test if operator[] returns the correct underlying type @@ -92,11 +92,11 @@ void Scheme_object::test< 2 >() { set_test_name( "operator[] which" ); inciter::Scheme c( inciter::ctr::SchemeType::DiagCG ); - ensure_equals( "Underlying element type", c.which_element(), 0 ); + ensure_equals( "Underlying element type", c.index_element(), 0 ); inciter::Scheme d( inciter::ctr::SchemeType::DG ); - ensure_equals( "Underlying element type", d.which_element(), 1 ); + ensure_equals( "Underlying element type", d.index_element(), 1 ); inciter::Scheme a( inciter::ctr::SchemeType::ALECG ); - ensure_equals( "Underlying element type", a.which_element(), 2 ); + ensure_equals( "Underlying element type", a.index_element(), 2 ); } //! Test Pack/Unpack of Scheme holding CProxy_DiagCG diff --git a/tests/unit/LoadBalance/TestLinearMap.cpp b/tests/unit/LoadBalance/TestLinearMap.cpp index ee266482e25..14488d44bf6 100644 --- a/tests/unit/LoadBalance/TestLinearMap.cpp +++ b/tests/unit/LoadBalance/TestLinearMap.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/LoadBalance/TestLinearMap.C + \file tests/unit/LoadBalance/TestLinearMap.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/LoadBalance/TestLoadDistributor.cpp b/tests/unit/LoadBalance/TestLoadDistributor.cpp index 01e05dc2208..db9e64fd27f 100644 --- a/tests/unit/LoadBalance/TestLoadDistributor.cpp +++ b/tests/unit/LoadBalance/TestLoadDistributor.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/LoadBalance/TestLoadDistributor.C + \file tests/unit/LoadBalance/TestLoadDistributor.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/LoadBalance/TestUnsMeshMap.cpp b/tests/unit/LoadBalance/TestUnsMeshMap.cpp index 03e365f3fce..4cd4dc45d1d 100644 --- a/tests/unit/LoadBalance/TestUnsMeshMap.cpp +++ b/tests/unit/LoadBalance/TestUnsMeshMap.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/LoadBalance/TestUnsMeshMap.C + \file tests/unit/LoadBalance/TestUnsMeshMap.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Mesh/TestAround.cpp b/tests/unit/Mesh/TestAround.cpp index cd2a436c65e..f253a44d376 100644 --- a/tests/unit/Mesh/TestAround.cpp +++ b/tests/unit/Mesh/TestAround.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Mesh/TestAround.C + \file tests/unit/Mesh/TestAround.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Mesh/TestDerivedData.cpp b/tests/unit/Mesh/TestDerivedData.cpp index 9d2ca595cfe..6cf61148ae1 100644 --- a/tests/unit/Mesh/TestDerivedData.cpp +++ b/tests/unit/Mesh/TestDerivedData.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Mesh/TestDerivedData.C + \file tests/unit/Mesh/TestDerivedData.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Mesh/TestDerivedData_MPISingle.cpp b/tests/unit/Mesh/TestDerivedData_MPISingle.cpp index b0c38008a04..a9a73273194 100644 --- a/tests/unit/Mesh/TestDerivedData_MPISingle.cpp +++ b/tests/unit/Mesh/TestDerivedData_MPISingle.cpp @@ -1,14 +1,14 @@ // ***************************************************************************** /*! - \file tests/unit/Mesh/TestDerivedData_MPISingle.C + \file tests/unit/Mesh/TestDerivedData_MPISingle.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. \brief Unit tests for Mesh/DerivedData that require to be invoked from a - single thread + single thread \details Unit tests for Mesh/DerivedData that require to be invoked from a - single thread. + single thread. */ // ***************************************************************************** @@ -39,6 +39,8 @@ using DerivedData_MPISingle_group = using DerivedData_MPISingle_object = DerivedData_MPISingle_group::object; //! Define test group +//! \note Those test groups whose name contains "MPISingle" will be started as +//! MPI tests (from a Charm++ nodegroup) and from only a single MPI rank. static DerivedData_MPISingle_group DerivedData_MPISingle( "Mesh/DerivedData_MPISingle" ); diff --git a/tests/unit/Mesh/TestGradients.cpp b/tests/unit/Mesh/TestGradients.cpp index 2d753f183b3..dab5db7ea72 100644 --- a/tests/unit/Mesh/TestGradients.cpp +++ b/tests/unit/Mesh/TestGradients.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Mesh/TestGradients.C + \file tests/unit/Mesh/TestGradients.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/Mesh/TestReorder.cpp b/tests/unit/Mesh/TestReorder.cpp index ac3304fac15..ee160ecd8ac 100644 --- a/tests/unit/Mesh/TestReorder.cpp +++ b/tests/unit/Mesh/TestReorder.cpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/Mesh/TestReorder.C + \file tests/unit/Mesh/TestReorder.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/RNG/TestMKLRNG.cpp b/tests/unit/RNG/TestMKLRNG.cpp index 00e4c0e3ea7..f9a74ee40fd 100644 --- a/tests/unit/RNG/TestMKLRNG.cpp +++ b/tests/unit/RNG/TestMKLRNG.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/RNG/TestMKLRNG.C + \file tests/unit/RNG/TestMKLRNG.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for RNG/MKLRNG.h - \details Unit tests for RNG/MKLRNG.h + \brief Unit tests for RNG/MKLRNG.hpp + \details Unit tests for RNG/MKLRNG.hpp */ // ***************************************************************************** diff --git a/tests/unit/RNG/TestRNG.cpp b/tests/unit/RNG/TestRNG.cpp index 86c10c50aa8..08227d6f012 100644 --- a/tests/unit/RNG/TestRNG.cpp +++ b/tests/unit/RNG/TestRNG.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/RNG/TestRNG.C + \file tests/unit/RNG/TestRNG.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for RNG/RNG.h - \details Unit tests for RNG/RNG.h + \brief Unit tests for RNG/RNG.hpp + \details Unit tests for RNG/RNG.hpp */ // ***************************************************************************** diff --git a/tests/unit/RNG/TestRNG.h b/tests/unit/RNG/TestRNG.h deleted file mode 100644 index 01c8528da59..00000000000 --- a/tests/unit/RNG/TestRNG.h +++ /dev/null @@ -1,348 +0,0 @@ -// ***************************************************************************** -/*! - \file tests/unit/RNG/TestRNG.h - \copyright 2012-2015 J. Bakosi, - 2016-2018 Los Alamos National Security, LLC., - 2019 Triad National Security, LLC. - All rights reserved. See the LICENSE file for details. - \brief Reused test code for unit testing random number generators - \details Reused test code for unit testing random number generators -*/ -// ***************************************************************************** - -#include - -#include "NoWarning/value_factory.h" - -#include "QuinoaConfig.h" - -#include "NoWarning/threefry.h" -#include "NoWarning/philox.h" - -#ifdef HAS_MKL - #include - #include "MKLRNG.h" -#endif - -#ifdef HAS_MKL - #include -#else - #include -#endif - -#ifdef HAS_RNGSSE2 - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include - #include "RNGSSE.h" -#endif - -#include "RNG.h" -#include "Random123.h" - -namespace tut { - -//! All tests in group inherited from this base -struct RNG_common { - - //! Constructor: create a vector of RNGs to be tested by most tests - RNG_common() : rngs() - { - #ifdef HAS_MKL - rngs.emplace_back( tk::MKLRNG( 4, VSL_BRNG_MCG31 ) ); - #endif - #ifdef HAS_RNGSSE2 - rngs.emplace_back( tk::RNGSSE< gm19_state, unsigned, gm19_generate_ > - ( 4, gm19_init_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gm29_state, unsigned, gm29_generate_ > - ( 4, gm29_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gm31_state, unsigned, gm31_generate_ > - ( 4, gm31_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gm55_state, unsigned long long, - gm55_generate_ > - ( 4, gm55_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gm61_state, unsigned long long, - gm61_generate_ > - ( 4, gm61_init_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gq58x1_state, unsigned, gq58x1_generate_ > - ( 4, gq58x1_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gq58x3_state, unsigned, gq58x3_generate_ > - ( 4, gq58x3_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< gq58x4_state, unsigned, gq58x4_generate_ > - ( 4, gq58x4_init_short_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< mt19937_state, unsigned long long, - mt19937_generate_ > - ( 4, mt19937_init_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< lfsr113_state, unsigned long long, - lfsr113_generate_ > - ( 4, lfsr113_init_long_sequence_ ) ); - rngs.emplace_back( tk::RNGSSE< mrg32k3a_state, unsigned long long, - mrg32k3a_generate_ > - ( 4, mrg32k3a_init_sequence_ ) ); - #endif - rngs.emplace_back( tk::Random123< r123::Threefry2x64 >( 4 ) ); - rngs.emplace_back( tk::Random123< r123::Philox2x64 >( 4 ) ); - } - - //! \brief Add a model constructor bound to its arguments to a vector of - //! objects modeling tk::RNG - template< class ModelCtor, typename... Args > - void add( std::vector< tk::RNG >& v, Args&&... args ) { - // Bind model constructor to its arguments - std::function< ModelCtor() > c = - std::bind( boost::value_factory< ModelCtor >(), - std::forward< Args >( args )... ); - // Add to vector - v.emplace_back( std::move(c) ); - } - - //! Test uniform distribution of a random number generator - //! \param[in] r RNG to test - //! \details In real code the member function used to generate random numbers - //! are called by different threads, but here we pass a different thread ID - //! (first argument to the member function called) will exercise multiple - //! streams in serial, i.e., emulate multi-threaded RNG on a single thread. - //! This is done here this way because the unit test harness deals out each - //! test to a PE, thus calling the generators from real threads would create - //! contention. - template< class rng > - static void test_uniform( const rng& r ) { - std::size_t num = 100000; - std::vector< double > numbers( num ); - auto n = r.nthreads(); - for (std::size_t i=0; i(i), num/n, &numbers[i*num/n] ); - for (auto m : numbers) ensure( "sample space incorrect", 0.0 - static void test_gaussian( const rng& r ) { - std::size_t num = 100000; - std::vector< double > numbers( num ); - auto n = r.nthreads(); - for (std::size_t i=0; i(i), num/n, &numbers[i*num/n] ); - test_stats( numbers, 0.0, 1.0, 0.0, 0.0 ); - } - - // Compute the Cholesky decomposition of a covariance matrix - //! \tparam D Number of dimensions of covariance matrix - //! \param[in] C Covariance matrix to decompose, only the upper diagonal and - //! the diagonal are stored as the matrix is assumed to be symmetric (and - //! positive definite) - //! \return Choleksy decomposition (upper triangle only) - template< std::size_t D > - static std::array< double, D*(D+1)/2 > - cholesky( const std::array< double, D*(D+1)/2 >& C ) { - auto cov = C; - lapack_int ndim = static_cast< lapack_int >( D ); - #ifndef NDEBUG - lapack_int info = - #endif - LAPACKE_dpptrf( LAPACK_ROW_MAJOR, 'U', ndim, cov.data() ); - Assert( info == 0, "Error in Cholesky-decomposition" ); - return cov; - } - - //! Test multi-variate Gaussian distribution of a random number generator - //! \tparam D Number of dimensions of covariance matrix - //! \tparam rng Random number generator class type whose instance to test - //! \param[in] r RNG to test - //! \param[in] mean Vector of means - //! \param[in] C Upper triangle of the covariance matrix - //! \details In real code the member function used to generate random numbers - //! are called by different threads, but here we pass a different thread ID - //! (first argument to the member function called) will exercise multiple - //! streams in serial, i.e., emulate multi-threaded RNG on a single thread. - //! This is done here this way because the unit test harness deals out each - //! test to a PE, thus calling the generators from real threads would create - //! contention. - template< std::size_t D, class rng > - static void test_gaussianmv( const rng& r, - const std::array< double, D >& mean, - const std::array< double, D*(D+1)/2 >& C ) - { - const auto n = r.nthreads(); - const std::size_t num = 1000000; - // Compute Cholesky decomposition of covariance matrix - auto cov = cholesky< D >( C ); - // Generate joint Gaussian random vectors of D dimension - std::vector< double > numbers( num*D ); - for (std::size_t i=0; i(i), num/n, D, mean.data(), cov.data(), - &numbers[i*num*D/n] ); - // Test first two moments - test_statsmv< D >( numbers, mean, C ); - } - - //! Test beta distribution of a random number generator - //! \param[in] r RNG to test - //! \details In real code the member function used to generate random numbers - //! are called by different threads, but here we pass a different thread ID - //! (first argument to the member function called) will exercise multiple - //! streams in serial, i.e., emulate multi-threaded RNG on a single thread. - //! This is done here this way because the unit test harness deals out each - //! test to a PE, thus calling the generators from real threads would create - //! contention. - template< class rng > - static void test_beta( const rng& r ) { - std::size_t num = 100000; - double a = 0.2; - double b = 0.6; - std::vector< double > numbers( num ); - auto n = r.nthreads(); - for (std::size_t i=0; i(i), num/n, a, b, 0.0, 1.0, &numbers[i*num/n] ); - // test sample space - for (auto m : numbers) - ensure( "sample space incorrect", -eps(i), num/n, a, b, 0.5, 2.5, &numbers[i*num/n] ); - for (auto m : numbers) - ensure( "sample space incorrect", 0.5-eps - static void test_copy_ctor( const rng& r ) { - std::vector< rng > v; - v.push_back( r ); - test_gaussian( r ); // test that source of copy still works - test_gaussian( v[0] ); // test that the copy works - } - - //! Test move constructor of a random number generator - //! \param[in] r RNG to test - template< class rng > - static void test_move_ctor( const rng& r ) { - std::vector< rng > v; - auto p = r; - v.emplace_back( std::move(p) ); - test_gaussian( v[0] ); // test that the newly moved RNG works - } - - //! Test copy assignment of a random number generator - //! \param[in] r RNG to test - template< class rng > - static void test_copy_assignment( const rng& r ) { - rng v( r ); - v = r; - test_gaussian( r ); // test that source of copy still works - test_gaussian( v ); // test that the copy works - } - - //! Test move assignment of a random number generator - //! \param[in] r RNG to test - template< class rng > - static void test_move_assignment( const rng& r ) { - auto p = r; - auto v = std::move(p); - test_gaussian( v ); // test that the newly moved RNG works - } - - // Test the first four moments of random numbers passed in - //! \param[in] numbers Random numbers to test - //! \param[in] correct_mean Baseline mean to compare to - //! \param[in] correct_variance Baseline variance to compare to - //! \param[in] correct_skewness Baseline skewness to compare to - //! \param[in] correct_excess_kurtosis Baseline excess kurtosis to compare to - static void test_stats( const std::vector< double >& numbers, - double correct_mean, - double correct_variance, - double correct_skewness, - double correct_excess_kurtosis ) - { - const double precision = 0.05; - std::array< double, 4 > s{{ 0.0, 0.0, 0.0, 0.0 }}; - for (auto n : numbers) s[0] += n; - s[0] /= static_cast< double >( numbers.size() ); - ensure_equals( "mean inaccurate", s[0], correct_mean, precision ); - for (auto n : numbers) { - s[1] += (n-s[0])*(n-s[0]); - s[2] += (n-s[0])*(n-s[0])*(n-s[0]); - s[3] += (n-s[0])*(n-s[0])*(n-s[0])*(n-s[0]); - } - s[1] /= static_cast< double >( numbers.size() ); - s[2] /= static_cast< double >( numbers.size() ); - s[3] /= static_cast< double >( numbers.size() ); - ensure_equals( "variance inaccurate", s[1], correct_variance, precision ); - ensure_equals( "skewness inaccurate", - s[2]/std::pow(s[1],1.5), correct_skewness, precision ); - ensure_equals( "excess kurtosis inaccurate", - s[3]/s[1]/s[1]-3.0, correct_excess_kurtosis, precision ); - } - - // Test the first the two moments of multi-variate random numbers passed in - //! \tparam D Number of dimensions of sample space in multi-variate - //! distribution - //! \param[in] numbers Random vectors to test, size: num*D, vector size: D - //! \param[in] correct_mean Baseline mean vector to compare to - //! \param[in] correct_cov Baseline covariance matrix to compare to - template< std::size_t D > - static void test_statsmv( - const std::vector< double >& numbers, - const std::array< double, D >& correct_mean, - const std::array< double, D*(D+1)/2 >& correct_cov ) - { - const double precision = 0.05; - const auto N = numbers.size() / D; - - // Compute and test means - std::array< double, D > mean; - for (std::size_t i=0; i cov; - cov.fill( 0.0 ); - std::size_t e = 0; - for (std::size_t r=0; r rngs; -}; - -} // tut:: diff --git a/tests/unit/RNG/TestRNG.hpp b/tests/unit/RNG/TestRNG.hpp index 67df2460683..345245d8a82 100644 --- a/tests/unit/RNG/TestRNG.hpp +++ b/tests/unit/RNG/TestRNG.hpp @@ -1,6 +1,6 @@ // ***************************************************************************** /*! - \file tests/unit/RNG/TestRNG.h + \file tests/unit/RNG/TestRNG.hpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. diff --git a/tests/unit/RNG/TestRNGSSE.cpp b/tests/unit/RNG/TestRNGSSE.cpp index 6972aa0e978..e1cbc3c2941 100644 --- a/tests/unit/RNG/TestRNGSSE.cpp +++ b/tests/unit/RNG/TestRNGSSE.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/RNG/TestRNGSSE.C + \file tests/unit/RNG/TestRNGSSE.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for RNG/RNGSSE.h - \details Unit tests for RNG/RNGSSE.h + \brief Unit tests for RNG/RNGSSE.hpp + \details Unit tests for RNG/RNGSSE.hpp */ // ***************************************************************************** diff --git a/tests/unit/RNG/TestRandom123.cpp b/tests/unit/RNG/TestRandom123.cpp index a70541b8aa3..fc044558ad3 100644 --- a/tests/unit/RNG/TestRandom123.cpp +++ b/tests/unit/RNG/TestRandom123.cpp @@ -1,12 +1,12 @@ // ***************************************************************************** /*! - \file tests/unit/RNG/TestRandom123.C + \file tests/unit/RNG/TestRandom123.cpp \copyright 2012-2015 J. Bakosi, 2016-2018 Los Alamos National Security, LLC., 2019 Triad National Security, LLC. All rights reserved. See the LICENSE file for details. - \brief Unit tests for RNG/Random123.h - \details Unit tests for RNG/Random123.h + \brief Unit tests for RNG/Random123.hpp + \details Unit tests for RNG/Random123.hpp */ // ***************************************************************************** diff --git a/tools/docker/Dockerfile.quinoa-build-alpine b/tools/docker/Dockerfile.quinoa-build-alpine index 9d682296cb1..baa8e9f37a9 100644 --- a/tools/docker/Dockerfile.quinoa-build-alpine +++ b/tools/docker/Dockerfile.quinoa-build-alpine @@ -20,12 +20,11 @@ FROM alpine:latest # Install system-wide prerequisites -RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && cat /etc/apk/repositories -RUN apk update && apk add patch libtool autoconf automake gfortran gcc g++ make boost-dev bash m4 file git cmake perl grep zlib-dev libexecinfo-dev ninja graphviz libelf-dev binutils-dev flex bison vim +RUN apk update && apk add patch libtool autoconf automake gfortran gcc g++ make boost-dev bash m4 file git cmake perl grep zlib-dev libexecinfo-dev libexecinfo-static ninja graphviz binutils-dev flex bison vim # Install OpenMPI ADD http://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.1.tar.gz /openmpi/ -RUN cd /openmpi/ && tar xzf openmpi-3.1.1.tar.gz && cd openmpi-3.1.1 && ./configure --enable-shared --enable-static --prefix=/opt/openmpi && make -sj$(grep -c processor /proc/cpuinfo) install +RUN cd /openmpi/ && tar xzf openmpi-3.1.1.tar.gz && cd openmpi-3.1.1 && ./configure --disable-shared --enable-static --prefix=/opt/openmpi && make -sj$(grep -c processor /proc/cpuinfo) install ENV PATH /opt/openmpi/bin:$PATH ENV LD_LIBRARY_PATH /opt/openmpi/lib:$LD_LIBRARY_PATH ENV OMPI_MCA_plm isolated @@ -52,9 +51,9 @@ RUN cd quinoa && git checkout $COMMIT # Update submodules RUN cd quinoa && git submodule init && git submodule update --recursive && cd external && git submodule init && git submodule update --recursive && cd .. && git submodule status --recursive # Build TPLs -RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=off .. && make -sj$(grep -c processor /proc/cpuinfo) +RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_Fortran_COMPILER=mpif90 -DBUILD_SHARED_LIBS=off .. && make -sj$(grep -c processor /proc/cpuinfo) # Build quinoa -RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=off -DCMAKE_CXX_FLAGS=-Werror -DRUNNER_ARGS="--bind-to none -oversubscribe" ../src && make -sj$(grep -c processor /proc/cpuinfo) && npe=$(grep -c processor /proc/cpuinfo) && ./charmrun +p $npe Main/unittest -v -q && ctest -j $npe --output-on-failure -LE extreme +RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_COMPILER=mpicxx -DCMAKE_C_COMPILER=mpicc -DBUILD_SHARED_LIBS=off -DCMAKE_CXX_FLAGS=-Werror -DRUNNER_ARGS="--bind-to none -oversubscribe" ../src && make -sj$(grep -c processor /proc/cpuinfo) && npe=$(grep -c processor /proc/cpuinfo) && ./charmrun +p $npe Main/unittest -v -q && ctest -j $npe --output-on-failure -LE extreme # Ensure all executables are statically linked RUN cd quinoa/build && \ diff --git a/tools/docker/Dockerfile.quinoa-build-azure b/tools/docker/Dockerfile.quinoa-build-azure index 815bc55f30a..f87379dba8c 100644 --- a/tools/docker/Dockerfile.quinoa-build-azure +++ b/tools/docker/Dockerfile.quinoa-build-azure @@ -21,6 +21,7 @@ ARG SMP ENV PATH=/opt/openmpi/${COMPILER}/bin:$PATH ENV RUNNER_ARGS="--bind-to none -oversubscribe" +ENV OMPI_MCA_btl_base_warn_component_unused="0" USER quinoa COPY . /home/quinoa/ diff --git a/tools/docker/Dockerfile.quinoa-build-debian b/tools/docker/Dockerfile.quinoa-build-debian index 45d1691ce9e..afb6f15da8b 100644 --- a/tools/docker/Dockerfile.quinoa-build-debian +++ b/tools/docker/Dockerfile.quinoa-build-debian @@ -23,7 +23,8 @@ FROM debian:stable # Install system-wide prerequisites -RUN apt-get update -y && apt-get install -y m4 autoconf git cmake gfortran gcc g++ openmpi-bin libopenmpi-dev gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev libhypre-dev zlib1g-dev libhdf5-dev libhdf5-openmpi-dev binutils-dev libx11-dev libxpm-dev libxft-dev libxext-dev ninja-build flex bison libdw-dev libdwarf-dev vim +#RUN sed -i 's/stable main/stable main contrib non-free/g' /etc/apt/sources.list +RUN apt-get update -y && apt-get install -y m4 autoconf git cmake gfortran gcc g++ openmpi-bin libopenmpi-dev gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev zlib1g-dev libhdf5-dev libhdf5-openmpi-dev libnetcdf-mpi-dev libbackward-cpp-dev tao-pegtl-dev binutils-dev libx11-dev libxpm-dev libxft-dev libxext-dev ninja-build flex bison libdw-dev libdwarf-dev vim # Setup user RUN adduser --gecos "" --disabled-password quinoa @@ -40,8 +41,8 @@ RUN cd quinoa && git checkout $COMMIT && git log -1 HEAD # Update submodules RUN cd quinoa && git submodule init && git submodule update --recursive && cd external && git submodule init && git submodule update --recursive && cd .. && git submodule status --recursive # Build TPLs -RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -DENABLE_ROOT=true -DENABLE_OMEGA_H=true -DCMAKE_BUILD_TYPE=Release .. && make -sj$(grep -c processor /proc/cpuinfo) +RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -DENABLE_ROOT=true -DENABLE_OMEGA_H=true -DCXXFLAGS=-w .. && make -sj$(grep -c processor /proc/cpuinfo) # Build code -RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_FLAGS=-Werror -DCMAKE_BUILD_TYPE=Release -GNinja -DRUNNER=mpirun -DRUNNER_NCPUS_ARG=-n -DRUNNER_ARGS=-oversubscribe ../src && ninja +RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_FLAGS=-Werror -GNinja -DRUNNER=mpirun -DRUNNER_NCPUS_ARG=-n -DRUNNER_ARGS="--bind-to none -oversubscribe" ../src && ninja # Run tests RUN cd quinoa/build && npe=$(grep -c processor /proc/cpuinfo) && mpirun -n $npe Main/unittest -v -q && ctest -j $npe --output-on-failure -LE extreme diff --git a/tools/docker/Dockerfile.quinoa-build-debian-executable-only b/tools/docker/Dockerfile.quinoa-build-debian-executable-only index 40d4667a23a..ea9341edf4b 100644 --- a/tools/docker/Dockerfile.quinoa-build-debian-executable-only +++ b/tools/docker/Dockerfile.quinoa-build-debian-executable-only @@ -1,50 +1,56 @@ ################################################################################ # vim: filetype=dockerfile: # -# \file tools/docker/Dockerfile.quinoa-build-debian +# \file tools/docker/Dockerfile.quinoa-build-debian-executabl-only # \copyright 2012-2015 J. Bakosi, # 2016-2018 Los Alamos National Security, LLC., # 2019 Triad National Security, LLC. # All rights reserved. See the LICENSE file for details. -# \brief Dockerfile for a simple dynamic build of Quinoa on Debian -# \details Dockerfile for a simple dynamic build of Quinoa on Debian Linux -# using the native system-wide compiler and MPI wrappers. +# \brief Dockerfile for a testing a single executable of Quinoa on Debian +# \details Dockerfile for a building and testing a single executable of +# Quinoa on Debian Linux using the native system-wide compiler and +# MPI wrappers. # -# We start from the Debian/testing Linux distribution and install all possible +# We start from a Debian Linux distribution and install all possible # prerequisites, then build the required but missing third-party libraries, # build the code, and test. # # This docker image is intended to test building a single executable, preceded -# by building only those third-party libraries that are required for the -# executable. +# by cloning and building only those third-party libraries that are required +# for the executable. # ################################################################################ FROM debian:stable # Install system-wide prerequisites -RUN apt-get update -y && apt-get install -y m4 autoconf git cmake gfortran gcc g++ openmpi-bin libopenmpi-dev gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev libhypre-dev zlib1g-dev libhdf5-dev libhdf5-openmpi-dev binutils-dev libx11-dev libxpm-dev libxft-dev libxext-dev ninja-build flex bison libdw-dev libdwarf-dev vim +#RUN sed -i 's/stable main/stable main contrib non-free/g' /etc/apt/sources.list +RUN apt-get update -y && apt-get install -y m4 autoconf git cmake gfortran gcc g++ openmpi-bin libopenmpi-dev gmsh libpugixml-dev libpstreams-dev libboost-all-dev libblas-dev liblapack-dev liblapacke-dev zlib1g-dev libhdf5-dev libhdf5-openmpi-dev libnetcdf-mpi-dev libbackward-cpp-dev tao-pegtl-dev binutils-dev libx11-dev libxpm-dev libxft-dev libxext-dev ninja-build flex bison libdw-dev libdwarf-dev vim wget # Setup user RUN adduser --gecos "" --disabled-password quinoa -WORKDIR /home/quinoa USER quinoa WORKDIR /home/quinoa CMD ["/bin/bash"] SHELL ["/bin/bash", "-c"] -# Clone quinoa -RUN git clone --recurse-submodules http://github.com/quinoacomputing/quinoa.git +# Clone quinoa non-recursively +RUN git clone http://github.com/quinoacomputing/quinoa.git # Checkout commit to be tested ARG COMMIT RUN cd quinoa && git checkout $COMMIT && git log -1 HEAD -# Update submodules -RUN cd quinoa && git submodule init && git submodule update --recursive && cd external && git submodule init && git submodule update --recursive && cd .. && git submodule status --recursive -# Build TPLs +# Update submodules required by executable tested +RUN wget https://raw.githubusercontent.com/quinoacomputing/quinoa/$COMMIT/doc/pages/build.dox ARG EXECUTABLE ENV EXECUTABLE $EXECUTABLE -RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -D${EXECUTABLE^^}_ONLY=true -DCMAKE_BUILD_TYPE=Release .. && make -sj$(grep -c processor /proc/cpuinfo) +# Get git update submodule command for executable +RUN grep "^@ref $EXECUTABLE" build.dox -A2 | grep -v $EXECUTABLE | grep -v -e "^$" > submodule_update.sh +RUN cat submodule_update.sh +# Pull in submodules required for the executable +RUN cd quinoa && git submodule init && git submodule update && cd external && sh ../../submodule_update.sh +# Build TPLs +RUN cd quinoa && mkdir -p external/build && cd external/build && cmake -D${EXECUTABLE^^}_ONLY=true .. && make -sj$(grep -c processor /proc/cpuinfo) # Build code -RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_FLAGS=-Werror -DCMAKE_BUILD_TYPE=Release -GNinja -DRUNNER=mpirun -DRUNNER_NCPUS_ARG=-n -DRUNNER_ARGS=-oversubscribe ../src && ninja ${EXECUTABLE,,} +RUN cd quinoa && mkdir -p build && cd build && cmake -DCMAKE_CXX_FLAGS=-Werror -GNinja -DRUNNER=mpirun -DRUNNER_NCPUS_ARG=-n -DRUNNER_ARGS="--bind-to none -oversubscribe" ../src && ninja ${EXECUTABLE,,} # Run tests RUN cd quinoa/build && npe=$(grep -c processor /proc/cpuinfo) && if [ ${EXECUTABLE} = unittest ]; then mpirun -n $npe Main/unittest -v -q; else ctest -j $npe --output-on-failure -LE extreme -R ${EXECUTABLE,,}; fi diff --git a/tools/extract_cmd_keywords.sh b/tools/extract_cmd_keywords.sh new file mode 100755 index 00000000000..18a9bfccc6d --- /dev/null +++ b/tools/extract_cmd_keywords.sh @@ -0,0 +1,28 @@ +#!/bin/bash -eu +# -e: Exit immediately if a command exits with a non-zero status +# -u: Treat unset variables as an error when substituting +################################################################################ +# +# \file tools/extract_cmd_keywords.sh +# \brief Generate documentation pages for command line keywords +# \copyright 2012-2015 J. Bakosi, +# 2016-2018 Los Alamos National Security, LLC., +# 2019 Triad National Security, LLC. +# All rights reserved. See the LICENSE file for details. +# \details This script runs an executable and extracts the help for each of +# the executable's command line keyword, describing their documentation, +# generating a documentation page with this information. +# +# A single command line argument is required: the name of the executable. +################################################################################ + +export exe=$1 + +# generate summary of all command line keywords +export screen_out=$(../Main/$exe -h | awk "/$exe Command-line Parameters/,0" | grep "^[[:space:]]\|^-" | sed 's/^/ /') +perl -i -p0e 's/(\@section $ENV{exe}_cmd_list List of all command line parameters).*(\@section $ENV{exe}_cmd_detail)/$1\n\n$ENV{screen_out}\n\n$2/s' pages/${exe}_cmd.dox + +# generate detailed description on all keywords +export commands=$(../Main/$exe -h | awk "/$exe Command-line Parameters/,0" | grep "^[[:space:]]\|^-" | awk '{print $2}' | sed 's/\-\-//') +export detail=$(for c in $commands; do ../Main/$exe -H $c ++quiet | grep -v '^Quinoa>' | sed "s/$exe command-line keyword/@subsection ${exe}_cmd_kw_$c Keyword/" | sed 's/--/\\--/' | sed 's/Expected type:/_Expected type:_/' | sed 's/Lower bound:/_Lower bound:_/' | sed 's/Upper bound:/_Upper bound:_/' | sed 's/Expected valid choices:/_Expected valid choices:_/'; done) +perl -i -p0e 's/(\@section $ENV{exe}_cmd_detail Detailed description of command line parameters).*(\*\/)/$1\n$ENV{detail}\n\n$2/s' pages/${exe}_cmd.dox diff --git a/tools/extract_ctr_keywords.sh b/tools/extract_ctr_keywords.sh new file mode 100755 index 00000000000..717bee34941 --- /dev/null +++ b/tools/extract_ctr_keywords.sh @@ -0,0 +1,32 @@ +#!/bin/bash -eu +# -e: Exit immediately if a command exits with a non-zero status +# -u: Treat unset variables as an error when substituting +################################################################################ +# +# \file tools/extract_ctr_keywords.sh +# \brief Generate documentation pages for control file keywords +# \copyright 2012-2015 J. Bakosi, +# 2016-2018 Los Alamos National Security, LLC., +# 2019 Triad National Security, LLC. +# All rights reserved. See the LICENSE file for details. +# \details This script runs an executable and extracts the help for each of +# the executable's control file keyword, describing their documentation, +# generating a documentation page with this information. +# +# A single command line argument is required: the name of the executable. +################################################################################ + +export exe=$1 + +if ( ../Main/$exe -h | grep '\-C' > /dev/null ); then + + # generate summary of all control file keywords + export screen_out=$(../Main/$exe -C | awk "/$exe Control File Keywords/,0" | grep "^[[:space:]]\|^-" | sed 's/^/ /') + perl -i -p0e 's/(\@section $ENV{exe}_ctr_list List of all control file keywords).*(\@section $ENV{exe}_ctr_detail)/$1\n\n$ENV{screen_out}\n\n$2/s' pages/${exe}_ctr.dox + + # generate detailed description on all keywords + export keywords=$(../Main/$exe -C | awk "/$exe Control File Keywords/,0" | grep "^[[:space:]]" | awk '{print $1}') + export detail=$(for k in $keywords; do l=$(echo $k | sed 's/+/plus/' | sed 's/-/minus/' | sed 's/\./_/'); ../Main/$exe -H $k ++quiet | grep -v '^Quinoa>' | sed "s/$exe control file keyword/@subsection ${exe}_ctr_kw_$l Keyword/" | sed 's/Expected type:/_Expected type:_/' | sed 's/Lower bound:/_Lower bound:_/' | sed 's/Upper bound:/_Upper bound:_/' | sed 's/Expected valid choices:/_Expected valid choices:_/'; done) + perl -i -p0e 's/(\@section $ENV{exe}_ctr_detail Detailed description of control file keywords).*(\*\/)/$1\n$ENV{detail}\n\n$2/s' pages/${exe}_ctr.dox + +fi diff --git a/tools/llvm-gcov.sh b/tools/llvm-gcov.sh deleted file mode 100755 index cdc91454ee1..00000000000 --- a/tools/llvm-gcov.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -############################################################################### -# -# \file script/llvm-gcov.sh -# \copyright 2012-2015 J. Bakosi, -# 2016-2018 Los Alamos National Security, LLC., -# 2019 Triad National Security, LLC. -# All rights reserved. See the LICENSE file for details. -# \brief Helper script for calling llvm-cov -# -################################################################################ - -exec llvm-cov-3.8 gcov "$@" diff --git a/tools/recent_mods.sh b/tools/recent_mods.sh new file mode 100755 index 00000000000..4a8aa416df3 --- /dev/null +++ b/tools/recent_mods.sh @@ -0,0 +1,25 @@ +#!/bin/bash -e +################################################################################ +# +# \file tools/recent_mods.sh +# \brief Generate a list of recently modified doc pages +# \copyright 2012-2015 J. Bakosi, +# 2016-2018 Los Alamos National Security, LLC., +# 2019 Triad National Security, LLC. +# All rights reserved. See the LICENSE file for details. +# \details This script runs git and queries recently modified documentation +# pages and replaces this list in mainpage.dox, which then doxygen incorporates +# into the documentation. The final product is then renderd under section +# "Recently modified pages" on the main documentation pages. +# +# A single command line argument is required: the root of the quinoa git +# repository. +################################################################################ + +echo "Generating recently modified documentation pages..." + +cd $1 +export mods=$(paste -d "\n" <(git ls-tree -r --name-only HEAD doc/pages | grep -v directories | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort -r | grep dox$ | head -n 5 | awk '{print $4}' | xargs grep -i -- '@page\|\\page\|@mainpage\|\\mainpage' | awk '{ if (!length($3)) print " @ref index"; else print " @ref " $3 }') <(git ls-tree -r --name-only HEAD doc/pages | grep -v directories | while read filename; do echo "$(git log -1 --format="%ai" -- $filename) $filename"; done | sort -r | grep dox$ | head -n 5 | awk '{print $1}' | xargs -i date -d "{}" +"%b %d, %Y" | awk '{print " @m_span{m-text m-dim} " $0 " @m_endspan
" }')) +cd - + +perl -i -p0e 's/(\@par Recently modified pages).*(\@section mainpage_tools Tools)/$1\n$ENV{mods}\n\n$2/s' pages/mainpage.dox