diff --git a/cmake/SimpleTesting/README.md b/cmake/SimpleTesting/README.md
new file mode 100644
index 000000000000..948ce7ab403f
--- /dev/null
+++ b/cmake/SimpleTesting/README.md
@@ -0,0 +1,139 @@
+CMake File Structure
+====================
+This CMake structure attempts to capture the structure of the original
+`TFW_testing_single_configure_prototype` that is used by the current / old Trilinos
+Pull-Request (PR) framework.
+
+**Note**: _Trilinos uses the **`pull_request_changes`** branch from this repository_.
+
+Specifically, this new configuration will replace the existing `simple_testing.cmake`
+script.
+
+This diagram describes the current structure of the CMake files and how they
+interact with each other.
+
+
+
+
+CMake Files
+-----------
+
+| Filename | Guarded? | Purpose |
+|-------------------------------|:--------:|--------------------------------------------------------------------------|
+| `ctest-driver.cmake` | | Main driver script / entry-point |
+| `ctest-common.cmake` | X | Common activities such as option handling, etc. |
+| `ctest-cdash-setup.cmake` | X | Handle CDash configurations |
+| `ctest-stage-configure.cmake` | | Handle the _configuration_ stage of the test |
+| `ctest-stage-build.cmake` | | Handle the _build_ stage of the test |
+| `ctest-stage-test.cmake` | | Handle the _test_ stage of the test. |
+| `ctest-functions.cmake` | X | Functions and macros |
+| `ctest-CTestConfig.cmake` | | Required file that is copied into the build directory at configure time. |
+
+The _guarded_ files use the CMake command [`include_guard()`][1] which should prevent that file
+from being include more than once in an include chain.
+
+Options and Variables (`simple_testing.cmake`)
+----------------------------------------------
+The `simple_testing.cmake` file has a number of optional parameters that can be sent into the
+CMake system via `-D:BOOL=` parameters:
+
+| Option | Required? | Default | PR Override | Purpose |
+|----------------------------|:---------:|---------------------------------------------|-------------|----------------------------------|
+| `build_name` | YES | N/A | YES | Sets `CTEST_BUILD_NAME` |
+| `ctest_submit_retry_count` | NO | 5 | | |
+| `ctest_submit_retry_delay` | NO | 3 | | |
+| `dashboard_model` | NO | `Experimental` | YES but NO | Set to the same value as default |
+| `dashboard_track` | NO | `Experimental` | YES but NO | Set to the same value as default |
+| `skip_by_parts_submit` | NO | `ON` | YES | |
+| `skip_clean_build_dir` | NO | `ON` | | |
+| `skip_single_submit` | NO | `ON` | | |
+| `skip_update_step` | NO | `OFF` | YES | |
+| `skip_upload_config_files` | NO | `OFF` | | |
+| `PARALLEL_LEVEL` | NO | _num cores_ | YES | |
+| `TEST_PARALLEL_LEVEL` | NO | `${PARALLEL_LEVEL}` | YES | |
+| `build_root` | NO | `${CTEST_SOURCE_DIRECTORY}/nightly_testing` | | |
+| `build_dir` | NO | `${build_root}/${CTEST_BUILD_NAME}` | YES | The CMake build dir |
+| `configure_script` | YES | N/A | YES | See note below table |
+| `package_enables` | YES | N/A | YES | `packageEnables.cmake` |
+| `subprojects_file` | YES | N/A | YES | `package_subproject_list.cmake` |
+
+1. `configure_script` points to the `cmake/std/PullRequestLinuxTestingSettings.cmake` file.
+ - Example: `${WORKSPACE}/Trilinos/cmake/std/PullRequestLinuxGCC8.3.0TestingSettings.cmake`
+
+See `TrilinosPRConfigurationStandard.py`[2] for information on what options are set to something
+other than the default during normal Trilinos PR operations.
+
+Expected Operation
+------------------
+The expected operation of this set of files to replace the old `simple_testing.cmake` is to load
+the [`ctest-driver.cmake`](ctest-driver.cmake) file in its place.
+
+
+`ctest-driver.cmake` Options
+----------------------------
+
+| Option | Type | Required? | Default | Description |
+|----------------------------|--------|:---------:|-----------------------------------------------|--------------------------------------------------------------------|
+| `build_name` | STRING | YES | N/A | The build name, see Jenkins' `${JOB_NAME}` envvar. |
+| `subprojects_file` | STRING | YES | N/A | This is the `package_subproject_list.cmake` file. |
+| `source_dir` | PATH | YES | N/A | Path to the source directory. |
+| `configure_script` | STRING | YES | N/A | Test settings CMake script. |
+| `package_enables` | STRING | YES | N/A | This is the `packageEnables.cmake` file. |
+| `ctest_submit_retry_count` | STRING | NO | 5 | Number of times to retry a ctest submssion. |
+| `ctest_submit_retry_delay` | STRING | NO | 3 | Delay (seconds) between attempts to submit to cdash. |
+| `dashboard_model` | STRING | NO | Experimental | CDash model |
+| `dashboard_track` | STRING | NO | Experimental | CDash track |
+| `skip_clean_build_dir` | BOOL | NO | ON | Skip cleaning the build directory (`ctest_empty_binary_directory`) |
+| `skip_update_step` | BOOL | NO | OFF | Skip the update step (`ctest_update()`) of the repository. |
+| `skip_by_parts_submit` | BOOL | NO | ON | Skip submission to CDash after each phase. |
+| `skip_single_submit` | BOOL | NO | ON | Skip single submission |
+| `skip_upload_config_files` | BOOL | NO | OFF | Skip upload config files (???) |
+| `build_root` | STRING | NO | `${source_dir}/nightly_testing` | Used to generate `build_dir` if `build_dir` is not defined. |
+| `build_dir` | STRING | NO | `${build_root}/${CTEST_BUILD_NAME}` | Path to the build directory. |
+| `PARALLEL_LEVEL` | STRING | NO | `` | |
+| `TEST_PARALLEL_LEVEL` | STRING | NO | `${PARALLEL_LEVEL}` | |
+
+1. It might worthwhile to remove `build_root` since it's only used to create `build_dir` IF `build_dir` is not passed in
+ via a `-D` option.
+2. Related to (1), we might also change `build_dir` to be `BUILD_DIR` and pass that in.
+
+
+
+Example CTest call from a Trilinos PR
+-------------------------------------
+This is an example, for reference, of how the `ctest` command is invoked in the current/old Trilinos
+PR test driver.
+```bash
+ctest \
+ -S simple_testing.cmake \
+ -Dsource_dir=${WORKSPACE}/Trilinos \
+ -Dbuild_name=PR-9495-test-Trilinos_pullrequest_gcc_8.3.0-5164 \
+ -Dskip_by_parts_submit=OFF \
+ -Dskip_update_step=ON \
+ -Ddashboard_model=Experimental \
+ -Ddashboard_track=Pull Request \
+ -DPARALLEL_LEVEL=20 \
+ -DTEST_PARALLEL_LEVEL=4 \
+ -Dbuild_dir=${WORKSPACE}/pull_request_test \
+ -Dconfigure_script=${WORKSPACE}/Trilinos/cmake/std/PullRequestLinuxGCC8.3.0TestingSettings.cmake \
+ -Dpackage_enables=../packageEnables.cmake \
+ -Dsubprojects_file=../package_subproject_list.cmake
+```
+
+Additional Notes and Pitfalls
+=============================
+
+`ctest_test()` and `CAPTURE_CMAKE_ERROR`
+----------------------------------------
+For Trilinos testing we should avoid checking the value returned by `ctest_test()`
+for the `CAPTURE_CMAKE_ERROR` parameter. The reason for this is that CTest will
+flag this as an error (i.e., -1 is returned) if there were _no tests run_.
+
+The _no tests were run_ though is a valid 'success' result for Trilinos PR tests since
+this project enables packages dynamically based on what packages have modifications.
+This allows some PR's to go through without building Trilinos, which is advantageous
+when only documentation or perhaps the testing framework itself is modified and we do
+not need to spend O(5 hours) for the test suite to run.
+
+[1]: https://cmake.org/cmake/help/latest/command/include_guard.html
+[2]: https://github.com/trilinos/Trilinos/blob/master/cmake/std/trilinosprhelpers/TrilinosPRConfigurationStandard.py
diff --git a/cmake/SimpleTesting/cmake/ctest-CTestConfig.cmake b/cmake/SimpleTesting/cmake/ctest-CTestConfig.cmake
new file mode 100644
index 000000000000..c6b1dcf95fde
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-CTestConfig.cmake
@@ -0,0 +1,38 @@
+# This file will be copied to "CTestConfig.cmake" and should be placed
+# in the ${CTEST_BINARY_DIRECTORY} directory.
+#
+# https://cmake.org/cmake/help/latest/module/CTest.html
+message(">>> CTestConfig.cmake STARTED")
+
+# Must match what is in CDash project 'Trilinos'
+set(CTEST_NIGHTLY_START_TIME "04:00:00 UTC") # 10 PM MDT or 9 PM MST
+
+
+if (NOT DEFINED CTEST_DROP_METHOD)
+ set(CTEST_DROP_METHOD "http")
+endif()
+
+
+# Temporarily changing TEST_DROP_SITE from testing-vm.sandia.gov to
+# testing.sandia.gov due to the broken CDash installation
+if (CTEST_DROP_METHOD STREQUAL "http")
+ set(CTEST_PROJECT_NAME "Trilinos")
+ if (NOT DEFINED CTEST_DROP_SITE)
+ set(CTEST_DROP_SITE "testing.sandia.gov")
+ endif()
+
+ if (${CTEST_DROP_SITE} STREQUAL "testing.sandia.gov")
+ set(CTEST_DROP_LOCATION "/cdash/submit.php?project=${CTEST_PROJECT_NAME}")
+ else()
+ set(CTEST_DROP_METHOD "https")
+ set(CTEST_DROP_LOCATION "/submit.php?project=${CTEST_PROJECT_NAME}")
+ endif()
+
+ set(CTEST_TRIGGER_SITE "")
+ set(CTEST_DROP_SITE_CDASH TRUE)
+ message(">>> CTEST_DROP_SITE : ${CTEST_DROP_SITE}")
+ message(">>> CTEST_DROP_LOCATION : ${CTEST_DROP_LOCATION}")
+ message(">>> CTEST_PROJECT_NAME : ${CTEST_PROJECT_NAME}")
+endif()
+
+message(">>> CTestConfig.cmake FINISHED")
diff --git a/cmake/SimpleTesting/cmake/ctest-cdash-setup.cmake b/cmake/SimpleTesting/cmake/ctest-cdash-setup.cmake
new file mode 100644
index 000000000000..44cdb85bd49e
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-cdash-setup.cmake
@@ -0,0 +1,142 @@
+include_guard()
+message("+--------------------------------------+")
+message("| ctest-cdash-setup.cmake START |")
+message("+--------------------------------------+")
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+
+
+
+# ===============================================================================
+# --
+# -- Set up the Dashboard and Testing Infrastructure
+# --
+# ===============================================================================
+print_options_list()
+
+# -----------------------------------------------------------
+# -- Specify the Generator
+# -----------------------------------------------------------
+set(CTEST_CMAKE_GENERATOR "Ninja")
+
+
+set(CTEST_CONFIGURE_COMMAND_ARGS
+ "${CMAKE_COMMAND}"
+ "-C \"${configure_file}\""
+ "-C \"${package_enables_file}\""
+ "-G \"${CTEST_CMAKE_GENERATOR}\""
+ "${CTEST_SOURCE_DIRECTORY}"
+)
+
+list(JOIN CTEST_CONFIGURE_COMMAND_ARGS " " CTEST_CONFIGURE_COMMAND)
+
+banner("CMake Configuration Command")
+message(">>> CTEST_CONFIGURE_COMMAND : ${CTEST_CONFIGURE_COMMAND}")
+message(">>>")
+
+
+
+# -----------------------------------------------------------
+# -- Configure Preparation
+# -----------------------------------------------------------
+
+# Optionally skip cleaning the build directory
+if(NOT skip_clean_build_dir)
+ ctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})
+endif()
+
+# Optionally upload the config files
+# TODO: Note how this works / what it's doing in CMake-land.
+message(">>> Write `configure_command_file`:")
+if(skip_upload_config_files)
+ message(">>> - SKIPPED")
+else()
+ message(">>> - WRITTEN")
+ #message(">>> - configure_command_file : ${configure_command_file}")
+ #message(">>> - CTEST_CONFIGURE_COMMAND: ${CTEST_CONFIGURE_COMMAND}")
+ file(WRITE ${configure_command_file} ${CTEST_CONFIGURE_COMMAND})
+endif()
+message(">>>")
+
+
+# -----------------------------------------------------------
+# -- COPY files
+# -- ctest-CTestConfig.cmake -> ${CTEST_BINARY_DIRECTORY}/CTestConfig.cmake
+# -- See: https://cmake.org/cmake/help/latest/command/configure_file.html
+# -----------------------------------------------------------
+banner("Copy CTestConfig.cmake to BUILD dir")
+configure_file(${CMAKE_CURRENT_LIST_DIR}/ctest-CTestConfig.cmake ${CTEST_BINARY_DIRECTORY}/CTestConfig.cmake COPYONLY)
+
+
+# -----------------------------------------------------------
+# -- Start the testing engine
+# -- CTEST_DROP_LOCATION defined in ctest-CTestConfig.cmake
+# -- See: https://cmake.org/cmake/help/latest/command/ctest_start.html
+# -----------------------------------------------------------
+banner("ctest_start() START")
+ctest_start(${dashboard_model} GROUP ${dashboard_track})
+banner("ctest_start() FINISH")
+message(">>> CTEST_DROP_LOCATION = ${CTEST_DROP_LOCATION}")
+message(">>>")
+
+# -----------------------------------------------------------
+# -- Configure CDash Drop URLs
+# -- CTEST_DROP_SITE is defined in ctest-CTestConfig.cmake
+# -- CTEST_PROJECT_NAME is defined in ctest-CTestConfig.cmake
+# -- CTEST_BUILD_NAME is defined in ctest-common.cmake
+# -- URL_location is defined here
+# -- build_stamp is defined here
+# -- machine_name is defined here
+# -----------------------------------------------------------
+
+string(FIND ${CTEST_DROP_LOCATION} submit.php index)
+string(SUBSTRING ${CTEST_DROP_LOCATION} 0 ${index} URL_location)
+
+file(STRINGS ${CTEST_BINARY_DIRECTORY}/Testing/TAG tag_strings LIMIT_COUNT 2)
+foreach(item ${tag_strings})
+ set(build_stamp_tmp "${build_stamp_tmp}-${item}")
+endforeach()
+# strip initial "-" using this method to avoid having to calculate string length
+string(SUBSTRING ${build_stamp_tmp} 1 1024 build_stamp)
+
+generate_build_url1(build_url1 ${CTEST_DROP_SITE} ${URL_location} ${CTEST_PROJECT_NAME} ${CTEST_BUILD_NAME} ${build_stamp} ${machine_name})
+generate_build_url2(build_url2 ${CTEST_DROP_SITE} ${URL_location} ${CTEST_PROJECT_NAME} ${CTEST_BUILD_NAME} ${build_stamp})
+generate_build_url3(build_url3 ${CTEST_DROP_SITE} ${URL_location} ${CTEST_PROJECT_NAME} ${CTEST_BUILD_NAME} ${build_stamp})
+message(">>> CDash URL1 = ${build_url1}")
+message(">>> CDash URL2 = ${build_url2}")
+message(">>> CDash URL3 = ${build_url3}")
+
+# -----------------------------------------------------------
+# -- Optionally update the repository
+# -- skip_update_step defined in ctest-common.cmake
+# -- skip_by_parts_submit defined in ctest-common.cmake
+# -----------------------------------------------------------
+# TODO: Do we really do this in the Trilinos CTest framework?
+# Or is this all handled by the framework code around
+# pulling in the source/target branches and merging them?
+# If we don't use this, consider removing.
+banner("Update repository START")
+if(NOT skip_update_step)
+ message(">>> Updating repository")
+ ctest_update(RETURN_VALUE update_error)
+ if(${update_error} EQUAL -1)
+ message(WARNING ">>> Update failed. ")
+ else()
+ message(">>> Updated ${update_error} files.")
+ endif()
+ submit_by_parts("Update")
+else()
+ set(CTEST_UPDATE_VERSION_ONLY ON)
+ ctest_update(RETURN_VALUE update_error)
+ if(${update_error} EQUAL -1)
+ message(WARNING ">>> Update failed. ")
+ else()
+ message(">>> Updated ${update_error} files.")
+ endif()
+ submit_by_parts("Update")
+endif()
+banner("Update repository FINISH")
+
+message("+--------------------------------------+")
+message("| ctest-cdash-setup.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/cmake/ctest-common.cmake b/cmake/SimpleTesting/cmake/ctest-common.cmake
new file mode 100644
index 000000000000..b000faca25d9
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-common.cmake
@@ -0,0 +1,196 @@
+include_guard()
+message("+--------------------------------------+")
+message("| ctest-common.cmake START |")
+message("+--------------------------------------+")
+
+cmake_minimum_required(VERSION 3.17.0 FATAL_ERROR)
+
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+
+
+# -----------------------------------------------------------
+# -- Required Parameters
+# -----------------------------------------------------------
+if(DEFINED build_name)
+ set(CTEST_BUILD_NAME ${build_name})
+else()
+ message(FATAL_ERROR "No build_name supplied. This is necessary to run and submit results.")
+endif()
+
+# `subprojects_file` is a -D parameter that is passed in from Trilinos
+# See: https://github.com/trilinos/Trilinos/blob/master/cmake/std/trilinosprhelpers/TrilinosPRConfigurationStandard.py
+include( ${subprojects_file} OPTIONAL RESULT_VARIABLE subproject_include_success )
+if( NOT subproject_include_success )
+ message(FATAL_ERROR "Subproject label file '${subprojects_file}' not found.")
+else()
+ message("Subproject label file '${subprojects_file}' loaded.")
+endif()
+list(LENGTH CTEST_LABELS_FOR_SUBPROJECTS subproject_count)
+
+# configure_script is passed into CTest via -Dconfigure_script, points to
+# Trilinos/cmake/std/
+get_filename_component(configure_file ${configure_script} ABSOLUTE)
+
+# package_enables is passed into CTest via -Dpackage_enables, points to the
+# generated "PackageEnables.cmake file"
+get_filename_component(package_enables_file ${package_enables} ABSOLUTE)
+
+
+# -----------------------------------------------------------
+# -- Optional Parameters
+# -----------------------------------------------------------
+if( NOT DEFINED ctest_submit_retry_count )
+ set( ctest_submit_retry_count 5 )
+endif()
+
+if( NOT DEFINED ctest_submit_retry_delay )
+ set( ctest_submit_retry_delay 3 )
+endif()
+
+if( NOT DEFINED dashboard_model )
+ set( dashboard_model Experimental )
+endif()
+
+if( NOT DEFINED dashboard_track )
+ set( dashboard_track Experimental )
+endif()
+
+if( NOT DEFINED skip_by_parts_submit )
+ set( skip_by_parts_submit ON )
+endif()
+
+if( NOT DEFINED skip_clean_build_dir )
+ set( skip_clean_build_dir ON )
+endif()
+
+if( NOT DEFINED skip_single_submit )
+ set( skip_single_submit ON )
+endif()
+
+if( NOT DEFINED skip_update_step )
+ set( skip_update_step OFF )
+endif()
+
+if( NOT DEFINED skip_upload_config_files )
+ set( skip_upload_config_files OFF )
+endif()
+
+
+# -----------------------------------------------------------
+# -- Miscellaneous Settings
+# -----------------------------------------------------------
+
+# Set the output to English
+set($ENV{LC_MESSAGES} "en_EN")
+
+# Set the machine_name
+cmake_host_system_information(RESULT machine_name QUERY HOSTNAME)
+message(">>> machine_name : ${machine_name}")
+
+
+# -----------------------------------------------------------
+# -- Set Git command
+# -----------------------------------------------------------
+find_program(CTEST_GIT_COMMAND NAMES git)
+set(CTEST_UPDATE_COMMAND "${CTEST_GIT_COMMAND}")
+
+# -----------------------------------------------------------
+# -- build specific
+# -----------------------------------------------------------
+
+# -- Set `CTEST_SOURCE_DIRECTORY` which would be the directory that contains the Trilinos repository.
+# Note-1: CTEST_SOURCE_DIRECTORY is the path to the **this** cmake file.
+# Note-2: use of `get_filename_component()` is just getting the path up 1
+# level.
+if(DEFINED source_dir)
+ set(CTEST_SOURCE_DIRECTORY ${source_dir})
+else()
+ message(FATAL_ERROR "Missing required parameter: `source_dir`")
+endif()
+message(">>> CTEST_SOURCE_DIRECTORY = ${CTEST_SOURCE_DIRECTORY}")
+
+
+## -- build_root
+if( NOT DEFINED build_root )
+ get_filename_component(bin_dir ${CTEST_SOURCE_DIRECTORY} DIRECTORY)
+ set(build_root "${bin_dir}/nightly_testing")
+endif()
+
+
+# -- build_dir
+if(DEFINED build_dir)
+ message(">>> set CTEST_BINARY_DIRECTORY = ${build_dir} (A)")
+ set(CTEST_BINARY_DIRECTORY "${build_dir}")
+else()
+ message(">>> set CTEST_BINARY_DIRECTORY = ${build_root}/${CTEST_BUILD_NAME} (B)")
+ set(CTEST_BINARY_DIRECTORY "${build_root}/${CTEST_BUILD_NAME}")
+endif()
+message(">>> CTEST_BINARY_DIRECTORY = ${CTEST_BINARY_DIRECTORY}")
+
+
+# -----------------------------------------------------------
+# -- Configure parallelism
+# -----------------------------------------------------------
+if( NOT DEFINED PARALLEL_LEVEL )
+ cmake_host_system_information(RESULT PARALLEL_LEVEL QUERY NUMBER_OF_PHYSICAL_CORES)
+endif()
+
+if( NOT DEFINED TEST_PARALLEL_LEVEL )
+ set(TEST_PARALLEL_LEVEL "${PARALLEL_LEVEL}")
+endif()
+
+# These are command line options to Ninja
+# See: https://manpages.debian.org/testing/ninja-build/ninja.1.en.html
+# -j${PARALLEL_LEVEL} - now many concurrent build jobs to allow
+# -k NNN - keep going until NNN jobs fail. 0 == infinity
+# -l N - might be an interesting option to reduce # of jobs based on LOAD AVERAGE
+# but load average is dependent on the # of cores on a system.
+set(CTEST_BUILD_FLAGS "-j${PARALLEL_LEVEL} -k 0")
+
+
+
+
+# -----------------------------------------------------------
+# -- Dependent Variables
+# -----------------------------------------------------------
+
+# * REQUIRES `CTEST_BINARY_DIRECTORY` to be set.
+if(NOT skip_upload_config_files)
+ set(configure_command_file ${CTEST_BINARY_DIRECTORY}/configure_command.txt)
+endif()
+
+
+# -----------------------------------------------------------
+# -- CTest Settings
+# -----------------------------------------------------------
+
+# Set CTEST_SITE to the name of the system.
+cmake_host_system_information(RESULT HOSTNAME QUERY HOSTNAME)
+
+set(CTEST_SITE "${HOSTNAME}")
+
+# See: https://cmake.org/cmake/help/latest/command/site_name.html#command:site_name
+site_name(${CTEST_SITE})
+
+# This is required to make build information detailed enough to
+# enable assignment to a specific subproject.
+# This must be set for both cmake and ctest to work.
+set(CTEST_USE_LAUNCHERS ON)
+set(ENV{CTEST_USE_LAUNCHERS_DEFAULT} 1)
+
+
+# -----------------------------------------------------------
+# -- Print out settings
+# -----------------------------------------------------------
+print_options_list()
+
+
+# -----------------------------------------------------------
+# -- Set up CDash
+# -----------------------------------------------------------
+# include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+message("+--------------------------------------+")
+message("| ctest-common.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/cmake/ctest-driver.cmake b/cmake/SimpleTesting/cmake/ctest-driver.cmake
new file mode 100644
index 000000000000..124b3d70381d
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-driver.cmake
@@ -0,0 +1,24 @@
+message("+--------------------------------------+")
+message("| ctest-driver.cmake START |")
+message("+--------------------------------------+")
+message("Snapshot: 2021-09-22 001")
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-stage-configure.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-stage-build.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-stage-test.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-stage-coverage.cmake)
+
+if(STAGE_CONFIGURE_ERROR OR STAGE_BUILD_ERROR OR STAGE_TEST_ERROR OR STAGE_COVERAGE_ERROR)
+ message(FATAL_ERROR "STAGE_CONFIGURE_ERROR: ${STAGE_CONFIGURE_ERROR}, STAGE_BUILD_ERROR: ${STAGE_BUILD_ERROR}, STAGE_TEST_ERROR: ${STAGE_TEST_ERROR}, STAGE_COVERAGE_ERROR: ${STAGE_COVERAGE_ERROR}")
+endif()
+
+message("+--------------------------------------+")
+message("| ctest-driver.cmake FINISH |")
+message("+--------------------------------------+")
\ No newline at end of file
diff --git a/cmake/SimpleTesting/cmake/ctest-functions.cmake b/cmake/SimpleTesting/cmake/ctest-functions.cmake
new file mode 100644
index 000000000000..df53579c3b3f
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-functions.cmake
@@ -0,0 +1,192 @@
+include_guard()
+message("+--------------------------------------+")
+message("| ctest-functions.cmake START |")
+message("+--------------------------------------+")
+
+
+
+macro(banner arg_banner_message)
+ message("+----------------------------------------------------------+")
+ message("+ ${arg_banner_message}")
+ message("+----------------------------------------------------------+")
+endmacro()
+
+
+
+macro(submit_by_parts arg_parts_value)
+ banner("submit_by_parts() START")
+ message(">>> arg_parts_value: ${arg_parts_value}")
+ message(">>> CTEST_DROP_METHOD : ${CTEST_DROP_METHOD}")
+ message(">>> CTEST_DROP_LOCATION : ${CTEST_DROP_LOCATION}")
+ message(">>> CDash URL1 = ${build_url1}")
+ message(">>> CDash URL2 = ${build_url2}")
+ message(">>> CDash URL3 = ${build_url3}")
+ if(NOT skip_by_parts_submit)
+ message(">>> ctest_submit(PARTS ${arg_parts_value}")
+ message(" RETRY_COUNT ${ctest_submit_retry_count}")
+ message(" RETRY_DELAY ${ctest_submit_retry_delay}")
+ message(" RETURN_VALUE ctest_submit_error)")
+
+ # https://cmake.org/cmake/help/latest/command/ctest_submit.html
+ ctest_submit(PARTS ${arg_parts_value}
+ RETRY_COUNT ${ctest_submit_retry_count}
+ RETRY_DELAY ${ctest_submit_retry_delay}
+ BUILD_ID cdash_build_id
+ RETURN_VALUE ctest_submit_error)
+
+ if(ctest_submit_error EQUAL 0)
+ message(">>> ${arg_parts_value} submit: OK")
+ message(">>> CDash Build-ID : ${cdash_build_id}")
+ else()
+ message(">>> ${arg_parts_value} submit: FAILED")
+ message(">>> - The ERROR code is ${ctest_submit_error}")
+ endif()
+ else()
+ message(">>> SKIPPED")
+ message(">>> skip_by_parts_submit : ${skip_by_parts_submit}")
+ endif()
+ banner("submit_by_parts() FINISH")
+endmacro()
+
+
+
+macro(submit_single_submit)
+ banner("submit_single_submit() START")
+ if(NOT skip_single_submit)
+ message(">>> ctest_submit(RETRY_COUNT ${ctest_submit_retry_count}")
+ message(" RETRY_DELAY ${ctest_submit_retry_delay}")
+ message(" RETURN_VALUE error_code)")
+
+ ctest_submit(RETRY_COUNT ${ctest_submit_retry_count}
+ RETRY_DELAY ${ctest_submit_retry_delay}
+ RETURN_VALUE error_code)
+
+ if(error_code EQUAL 0)
+ message(">>> Single submit: OK")
+ else()
+ message(">>> Single submit: FAILED")
+ message(">>> - The ERROR code is ${error_code}")
+ endif()
+ else()
+ message(">>> SKIPPED")
+ message(">>> skip_single_submit : ${skip_single_submit}")
+ endif()
+ banner("submit_single_submit() FINISH")
+endmacro()
+
+
+
+macro(submit_upload_config_files)
+ banner("submit_upload_config_files() START")
+ if( NOT skip_upload_config_files )
+ if( NOT (skip_single_submit AND skip_by_parts_submit) )
+ message(">>> ctest_upload(FILES ${configure_command_file}")
+ message(" ${configure_file}")
+ message(" ${package_enables_file} )")
+ ctest_upload(FILES ${configure_command_file} ${configure_file} ${package_enables_file})
+ message(">>> ctest_submit(PARTS upload")
+ message(" RETRY_COUNT ${ctest_submit_retry_count}")
+ message(" RETRY_DELAY ${ctest_submit_retry_delay}")
+ message(" RETURN_VALUE file_upload_erorr)")
+
+ ctest_submit(PARTS Upload
+ RETRY_COUNT ${ctest_submit_retry_count}
+ RETRY_DELAY ${ctest_submit_retry_delay}
+ RETURN_VALUE file_upload_error)
+
+ if(file_upload_error EQUAL 0)
+ message(">>> Config Files Upload: OK")
+ else()
+ message(">>> Config Files Upload: FAILED")
+ message(">>> - The ERROR code is ${file_upload_error}")
+ endif()
+ else()
+ message(">>> SKIPPED")
+ message(">>> skip_single_submit : ${skip_single_submit}")
+ message(">>> skip_by_parts_submit : ${skip_by_parts_submit}")
+ endif()
+ else()
+ message(">>> SKIPPED")
+ message(">>> skip_upload_config_files : ${skip_upload_config_files}")
+ endif()
+ banner("submit_upload_config_files() FINISH")
+endmacro()
+
+
+
+macro(print_options_list)
+ banner("OPTIONS")
+ message(">>> CTEST_BUILD_NAME = ${CTEST_BUILD_NAME}")
+ message(">>> PARALLEL_LEVEL = ${PARALLEL_LEVEL}")
+ message(">>> TEST_PARALLEL_LEVEL = ${TEST_PARALLEL_LEVEL}")
+ message(">>> skip_by_parts_submit = ${skip_by_parts_submit}")
+ message(">>> skip_single_submit = ${skip_single_submit}")
+ message(">>> skip_update_step = ${skip_update_step}")
+ message(">>> skip_upload_config_files = ${skip_upload_config_files}")
+ message(">>> skip_clean_build_dir = ${skip_clean_build_dir}")
+ message(">>> subproject_count = ${subproject_count}")
+ message(">>> dashboard_model = ${dashboard_model}")
+ message(">>> dashboard_track = ${dashboard_track}")
+ message(">>> configure_command_file = ${configure_command_file}")
+ message(">>> configure_file = ${configure_file}")
+ message(">>> build_root = ${build_root}")
+ message(">>> build_dir = ${build_dir}")
+ message(">>> SOURCE_DIR = ${SOURCE_DIR}")
+ message(">>> CMAKE_CURRENT_LIST_DIR = ${CMAKE_CURRENT_LIST_DIR}")
+ message(">>> CTEST_SOURCE_DIRECTORY = ${CTEST_SOURCE_DIRECTORY}")
+ message(">>> CTEST_BINARY_DIRECTORY = ${CTEST_BINARY_DIRECTORY}")
+endmacro()
+
+
+
+function(generate_build_url1 url_output cdash_site cdash_location project_name build_name build_stamp machine_name)
+ banner("generate_build_url1() START")
+ message(">>> cdash_site : ${cdash_site}")
+ message(">>> cdash_location: ${cdash_location}")
+ message(">>> project_name : ${project_name}")
+ message(">>> build_name : ${build_name}")
+ message(">>> build_stamp : ${build_stamp}")
+ message(">>> machine_name : ${machine_name}")
+ string(REPLACE " " "%20" url_output_tmp
+ "https://${cdash_site}${cdash_location}index.php?project=${project_name}&display=project&filtercount=3&showfilters=1&filtercombine=and&field1=site&compare1=61&value1=${machine_name}&field2=buildname&compare2=61&value2=${build_name}&field3=buildstamp&compare3=61&value3=${build_stamp}"
+ )
+ set(${url_output} ${url_output_tmp} PARENT_SCOPE)
+ banner("generate_build_url1() FINISH")
+endfunction()
+
+
+
+function(generate_build_url2 url_output cdash_site cdash_location project_name build_name build_stamp)
+ banner("generate_build_url2() START")
+ message(">>> cdash_site : ${cdash_site}")
+ message(">>> cdash_location: ${cdash_location}")
+ message(">>> project_name : ${project_name}")
+ message(">>> build_name : ${build_name}")
+ message(">>> build_stamp : ${build_stamp}")
+ string(REPLACE " " "%20" url_output_tmp
+ "https://${cdash_site}${cdash_location}index.php?project=${project_name}&display=project&filtercount=2&showfilters=0&filtercombine=and&field1=buildname&compare1=61&value1=${build_name}&field2=buildstamp&compare2=61&value2=${build_stamp}"
+ )
+ set(${url_output} ${url_output_tmp} PARENT_SCOPE)
+ banner("generate_build_url2() FINISH")
+endfunction()
+
+
+
+function(generate_build_url3 url_output cdash_site cdash_location project_name build_name build_stamp)
+ banner("generate_build_url2() START")
+ message(">>> cdash_site : ${cdash_site}")
+ message(">>> cdash_location: ${cdash_location}")
+ message(">>> project_name : ${project_name}")
+ message(">>> build_name : ${build_name}")
+ message(">>> build_stamp : ${build_stamp}")
+ string(REPLACE " " "%20" url_output_tmp
+ "https://${cdash_site}${cdash_location}index.php?project=${project_name}&filtercount=2&showfilters=0&filtercombine=and&field1=buildname&compare1=61&value1=${build_name}&field2=buildstamp&compare2=61&value2=${build_stamp}"
+ )
+ set(${url_output} ${url_output_tmp} PARENT_SCOPE)
+ banner("generate_build_url3() FINISH")
+endfunction()
+
+
+message("+--------------------------------------+")
+message("| ctest-functions.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/cmake/ctest-stage-build.cmake b/cmake/SimpleTesting/cmake/ctest-stage-build.cmake
new file mode 100644
index 000000000000..c96d9a53e59f
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-stage-build.cmake
@@ -0,0 +1,32 @@
+message("+--------------------------------------+")
+message("| ctest-stage-build.cmake START |")
+message("+--------------------------------------+")
+set(STAGE_BUILD_ERROR OFF)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+
+# -----------------------------------------------------------
+# -- Build
+# -----------------------------------------------------------
+banner("START build step")
+
+# Execute the build step
+ctest_build(RETURN_VALUE build_error)
+
+# Print out final stage banner
+if(${build_error} EQUAL 0)
+ banner("END build step - SUCCESS")
+else()
+ message(WARNING "Build failed with error ${build_error}")
+ banner("END build step - FAILURE")
+ set(STAGE_BUILD_ERROR ON)
+endif()
+
+# Submit to CDash
+submit_by_parts( "Build" )
+
+message("+--------------------------------------+")
+message("| ctest-stage-build.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/cmake/ctest-stage-configure.cmake b/cmake/SimpleTesting/cmake/ctest-stage-configure.cmake
new file mode 100644
index 000000000000..82a8e650178d
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-stage-configure.cmake
@@ -0,0 +1,47 @@
+message("+--------------------------------------+")
+message("| ctest-stage-configure.cmake START |")
+message("+--------------------------------------+")
+set(STAGE_CONFIGURE_ERROR OFF)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+# -----------------------------------------------------------
+# -- Configure
+# -----------------------------------------------------------
+banner("START configure step")
+
+message(">>> CTEST_SOURCE_DIRECTORY: ${CTEST_SOURCE_DIRECTORY}")
+message(">>> CTEST_BINARY_DIRECTORY: ${CTEST_BINARY_DIRECTORY}")
+
+ctest_configure(SOURCE ${CTEST_SOURCE_DIRECTORY}
+ BUILD ${CTEST_BINARY_DIRECTORY}
+ RETURN_VALUE configure_error
+ CAPTURE_CMAKE_ERROR tmp_cmake_error
+ )
+
+ctest_read_custom_files(BUILD "${CTEST_BINARY_DIRECTORY}")
+# NOTE: The CTestCustom.cmake file read in by the above command is
+# automatically written in the binary dir by the configure of Trilinos in
+# ctest_configure() above.
+
+message(">>> configure_error: ${configure_error}")
+message(">>> tmp_cmake_error: ${tmp_cmake_error}") # NEW (testing this out)
+
+if( (${configure_error} EQUAL 0) AND (${tmp_cmake_error} EQUAL 0) )
+ banner("END configure step - SUCCESS")
+else()
+ banner("END configure step - FAILURE")
+ set(STAGE_CONFIGURE_ERROR ON)
+endif()
+
+submit_by_parts("Configure")
+
+if((NOT ${configure_error} EQUAL 0) OR (NOT ${tmp_cmake_error} EQUAL 0))
+ submit_single_submit()
+ message(WARNING "Configure failed with error ${configure_error}")
+endif()
+
+message("+--------------------------------------+")
+message("| ctest-stage-configure.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/cmake/ctest-stage-coverage.cmake b/cmake/SimpleTesting/cmake/ctest-stage-coverage.cmake
new file mode 100644
index 000000000000..64826418b5be
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-stage-coverage.cmake
@@ -0,0 +1,78 @@
+message("+----------------------------------+")
+message("| ctest-stage-coverage.cmake START |")
+message("+----------------------------------+")
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+include(CTestCoverageCollectGCOV)
+
+
+# -----------------------------------------------------------
+# -- Coverage
+# -----------------------------------------------------------
+set(STAGE_COVERAGE_ERROR OFF)
+
+# Rather than attempt to parse this out via GenConfig and
+# pass it through the PR driver scripts, use a substring
+# match here.
+if(CTEST_BUILD_NAME MATCHES ".*coverage.*")
+ banner("START coverage step")
+
+ find_program(GCOV_EXECUTABLE
+ NAMES gcov
+ DOC "Path to gcov executable")
+
+
+ # Execute the coverage parsing step
+ ctest_coverage_collect_gcov(TARBALL "${CTEST_BUILD_NAME}-gcov.tar.gz"
+ GCOV_COMMAND ${GCOV_EXECUTABLE}
+ GCOV_OPTIONS --branch-probabilities --hash-filenames --demangled-names --human-readable --display-progress
+ GLOB ON)
+
+
+ #find_program(GCOVR_EXECUTABLE
+ # NAMES gcovr
+ # DOC "Path to gcovr executable")
+
+ # TODO: Try using gcovr
+ #execute_process(COMMAND ${GCOVR_EXECUTABLE} --json --output ${CTEST_BUILD_NAME}-gcovr-report.json --exclude-throw-branches --exlude-unreachable-branches -j 29 --gcov-executable ${GCOV_EXECUTABLE} --root ${CTEST_SOURCE_DIRECTORY} ${CTEST_BINARY_DIRECTORY}
+ # COMMAND rm -f ${CTEST_BUILD_NAME}-gcovr-report.tar.gz
+ # COMMAND tar -czf ${CTEST_BUILD_NAME}-gcovr-report.tar.gz ${CTEST_BUILD_NAME}-gcovr-report.json)
+
+ # Print out final stage banner
+ banner("END coverage step")
+
+ banner("ctest_upload() START")
+
+ ctest_submit(CDASH_UPLOAD ${CTEST_BUILD_NAME}-gcov.tar.gz
+ CDASH_UPLOAD_TYPE GcovTar
+ RETRY_COUNT ${ctest_submit_retry_count}
+ RETRY_DELAY ${ctest_submit_retry_delay}
+ RETURN_VALUE coverage_upload_error)
+
+ if(coverage_upload_error EQUAL 0)
+ message(">>> Coverage Upload: OK")
+ else()
+ message(">>> Coverage Upload: FAILED")
+ message(">>> - The ERROR code is ${coverage_upload_error}")
+ set(STAGE_COVERAGE_ERROR ON)
+ endif()
+
+ banner("ctest_upload() FINISH")
+
+ # TODO: Check for coverage percentage drop?
+ #if( NOT (coverage_error EQUAL 0) )
+ # message(WARNING "Coverage has decreased from X to Y.")
+ # set(STAGE_COVERAGE_ERROR ON)
+ #else()
+ # message("Coverage passed.")
+ #endif()
+
+ message("+-----------------------------------+")
+ message("| ctest-stage-coverage.cmake FINISH |")
+ message("+-----------------------------------+")
+else()
+ message("+------------------------------------+")
+ message("| ctest-stage-coverage.cmake SKIPPED |")
+ message("+------------------------------------+")
+endif()
diff --git a/cmake/SimpleTesting/cmake/ctest-stage-test.cmake b/cmake/SimpleTesting/cmake/ctest-stage-test.cmake
new file mode 100644
index 000000000000..76ec3a0656f3
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-stage-test.cmake
@@ -0,0 +1,66 @@
+message("+--------------------------------------+")
+message("| ctest-stage-test.cmake START |")
+message("+--------------------------------------+")
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-functions.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+
+# -----------------------------------------------------------
+# -- Test
+# -----------------------------------------------------------
+banner("START test step")
+
+set(STAGE_TEST_ERROR OFF)
+
+if(CTEST_BUILD_NAME MATCHES .*_asan_.*)
+ set(CTEST_MEMORYCHECK_TYPE "AddressSanitizer")
+ set(ENV{LSAN_OPTIONS} "suppressions=${CTEST_SOURCE_DIRECTORY}/packages/framework/asan_assets/lsan.supp")
+ set(ENV{LD_PRELOAD} ${CTEST_SOURCE_DIRECTORY}/packages/framework/asan_assets/dummy_dlclose.so)
+ ctest_memcheck(PARALLEL_LEVEL ${TEST_PARALLEL_LEVEL}
+ CAPTURE_CMAKE_ERROR captured_cmake_error
+ RETURN_VALUE test_error)
+ unset(ENV{LD_PRELOAD})
+ submit_by_parts( "MemCheck" )
+else()
+ ctest_test(PARALLEL_LEVEL ${TEST_PARALLEL_LEVEL}
+ CAPTURE_CMAKE_ERROR captured_cmake_error
+ RETURN_VALUE test_error)
+ submit_by_parts( "Test" )
+endif()
+
+# Print out final stage banner
+if(${test_error} EQUAL 0)
+ banner("END test step - SUCCESS")
+else()
+ banner("END test step - FAILURE")
+endif()
+
+# Single submit
+submit_single_submit()
+
+# Upload configure files
+submit_upload_config_files()
+
+# Display what return values were captured.
+message(">>> captured_cmake_error = ${captured_cmake_error} (unused)")
+message(">>> test_error = ${test_error}")
+
+# We fail the test here if the `test_error` value from ctest_test is
+# nonzero.
+# We should NOT check `captured_cmake_error` (CAPTURE_CMAKE_ERROR)
+# to determine if our test has failed since that value contain a
+# nonzero value if there were _no tests to run_. For Trilinos, this
+# can happen since we dynamically enable tests based on changes in
+# a Pull-Request.
+if( NOT (test_error EQUAL 0) )
+ message(WARNING "There are errors detected in the test.")
+ set(STAGE_TEST_ERROR ON)
+else()
+ message("Test(s) passed.")
+endif()
+
+message("+--------------------------------------+")
+message("| ctest-stage-test.cmake FINISH |")
+message("+--------------------------------------+")
+
diff --git a/cmake/SimpleTesting/cmake/ctest-submit.cmake b/cmake/SimpleTesting/cmake/ctest-submit.cmake
new file mode 100644
index 000000000000..a9cb232e8eb0
--- /dev/null
+++ b/cmake/SimpleTesting/cmake/ctest-submit.cmake
@@ -0,0 +1,20 @@
+# A utility driver for submitting partial results to CDash
+# when an exception of failure occurs.
+message("+--------------------------------------+")
+message("| ctest-submit.cmake START |")
+message("+--------------------------------------+")
+message("Snapshot: 2021-09-22 001")
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-common.cmake)
+
+include(${CMAKE_CURRENT_LIST_DIR}/ctest-cdash-setup.cmake)
+
+message(" -- Submit - ${CTEST_BUILD_NAME} --")
+
+ctest_start(APPEND)
+
+ctest_submit(RETURN_VALUE res)
+
+message("+--------------------------------------+")
+message("| ctest-submit.cmake FINISH |")
+message("+--------------------------------------+")
diff --git a/cmake/SimpleTesting/img/CMake-structure.graffle b/cmake/SimpleTesting/img/CMake-structure.graffle
new file mode 100644
index 000000000000..1d02d4dc104f
--- /dev/null
+++ b/cmake/SimpleTesting/img/CMake-structure.graffle
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df060b5017cd4f5e7daa1d83050684d1c5cd2633aa5d7511d328e95bb0628690
+size 205737
diff --git a/cmake/SimpleTesting/img/CMake-structure.pdf b/cmake/SimpleTesting/img/CMake-structure.pdf
new file mode 100644
index 000000000000..761748303739
Binary files /dev/null and b/cmake/SimpleTesting/img/CMake-structure.pdf differ
diff --git a/cmake/SimpleTesting/img/CMake-structure.png b/cmake/SimpleTesting/img/CMake-structure.png
new file mode 100644
index 000000000000..56c479003f6a
--- /dev/null
+++ b/cmake/SimpleTesting/img/CMake-structure.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da7f79b64d607b9552f9176401a3e516c76062707565e5ca1f4ba30746b5c1e3
+size 193664
diff --git a/packages/framework/ini-files/config-specs.ini b/packages/framework/ini-files/config-specs.ini
index d4dafe9eb65d..b6ce9a18284f 100644
--- a/packages/framework/ini-files/config-specs.ini
+++ b/packages/framework/ini-files/config-specs.ini
@@ -923,6 +923,24 @@ opt-set-cmake-var Trilinos_ENABLE_Piro BOOL : OFF
opt-set-cmake-var Trilinos_ENABLE_Rythmos BOOL : OFF
opt-set-cmake-var Trilinos_ENABLE_TriKota BOOL : OFF
+[PACKAGE-ENABLES|NO-EPETRA]
+# Identical from ALL-NO-EPETRA directive, but without enabling all of the
+# packages first. This directive can be used in builds that may be enabling
+# certain packages directly without any of the directives pre-defined above.
+opt-set-cmake-var Trilinos_ENABLE_Amesos BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Domi BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Epetra BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_EpetraExt BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_FEI BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Ifpack BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Intrepid BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Komplex BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Moertel BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_ML BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Piro BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_Rythmos BOOL : OFF
+opt-set-cmake-var Trilinos_ENABLE_TriKota BOOL : OFF
+
[PACKAGE-ENABLES|NO-PACKAGE-ENABLES]
# Nothing to do here.
@@ -2278,6 +2296,8 @@ opt-set-cmake-var Kokkos_CoreUnitTest_CudaTimingBased_MPI_1_DISABLE BOOL : ON
# MPI issue (TRILFRAME-552)
opt-set-cmake-var ROL_example_PinT_parabolic-control_AugmentedSystem_test_MPI_2_DISABLE BOOL FORCE : ON
+use PACKAGE-ENABLES|NO-EPETRA
+
use RHEL7_POST
use CUDA11-RUN-SERIAL-TESTS
@@ -2285,7 +2305,7 @@ use CUDA11-RUN-SERIAL-TESTS
[rhel7_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.0.5_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_all]
# uses sems-v2 modules
use rhel7_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.0.5_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables
-use PACKAGE-ENABLES|ALL
+use PACKAGE-ENABLES|ALL-NO-EPETRA
[rhel7_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.0.5_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables]
# uses sems-v2 modules
@@ -2300,6 +2320,7 @@ use USE-RDC|NO
use USE-UVM|YES
use USE-DEPRECATED|YES
use PACKAGE-ENABLES|NO-PACKAGE-ENABLES
+use PACKAGE-ENABLES|NO-EPETRA
use COMMON_SPACK_TPLS
use SEMS_COMMON_CUDA_11
use RHEL7_POST
@@ -2314,7 +2335,7 @@ opt-set-cmake-var ROL_example_PinT_parabolic-control_AugmentedSystem_test_MPI_2_
use rhel7_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.0.5_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables
use NODE-TYPE|CUDA_USE-RDC|YES_USE-PT|YES
use USE-RDC|YES
-use PACKAGE-ENABLES|ALL
+use PACKAGE-ENABLES|ALL-NO-EPETRA
opt-set-cmake-var Trilinos_AUTOGENERATE_TEST_RESOURCE_FILE BOOL : ON
opt-set-cmake-var Trilinos_CUDA_NUM_GPUS STRING : 4
@@ -2425,6 +2446,8 @@ opt-set-cmake-var Kokkos_CoreUnitTest_CudaTimingBased_MPI_1_DISABLE BOOL : ON
# MPI issue (TRILFRAME-552)
opt-set-cmake-var ROL_example_PinT_parabolic-control_AugmentedSystem_test_MPI_2_DISABLE BOOL FORCE : ON
+use PACKAGE-ENABLES|NO-EPETRA
+
use RHEL7_POST
use CUDA11-RUN-SERIAL-TESTS
@@ -2432,7 +2455,7 @@ use CUDA11-RUN-SERIAL-TESTS
[rhel8_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.1.4_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_all]
# uses sems-v2 modules
use rhel8_sems-cuda-11.4.2-sems-gnu-10.1.0-sems-openmpi-4.1.4_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables
-use PACKAGE-ENABLES|ALL
+use PACKAGE-ENABLES|ALL-NO-EPETRA
[rhel7_ascdo-gnu-10.3.0-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_no-mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables]
# uses asc-do modules
diff --git a/packages/framework/pr_tools/PullRequestLinuxDriver.sh b/packages/framework/pr_tools/PullRequestLinuxDriver.sh
index 1eb949e73332..477d3a9cc0b4 100755
--- a/packages/framework/pr_tools/PullRequestLinuxDriver.sh
+++ b/packages/framework/pr_tools/PullRequestLinuxDriver.sh
@@ -194,7 +194,7 @@ test_cmd_options=(
--filename-subprojects=${WORKSPACE:?}/package_subproject_list.cmake
--source-dir=${WORKSPACE}/Trilinos
--build-dir=${TRILINOS_BUILD_DIR:?}
- --ctest-driver=${WORKSPACE:?}/pr-ctest-framework/cmake/ctest-driver.cmake
+ --ctest-driver=${WORKSPACE:?}/Trilinos/cmake/SimpleTesting/cmake/ctest-driver.cmake
--ctest-drop-site=${TRILINOS_CTEST_DROP_SITE:?}
#--dry-run
)
diff --git a/packages/nox/src/NOX_Utils.C b/packages/nox/src/NOX_Utils.C
index 1074bd4645eb..c59720538022 100644
--- a/packages/nox/src/NOX_Utils.C
+++ b/packages/nox/src/NOX_Utils.C
@@ -222,7 +222,7 @@ NOX::Utils::Sci NOX::Utils::sciformat(double dval, int p)
std::ostream& NOX::operator<<(std::ostream& os, const NOX::Utils::Sci& s)
{
- os.setf(std::ios::scientific);
+ os.setf(std::ios::scientific, std::ios::floatfield);
std::streamsize p = os.precision();
os.precision(s.p);
os << std::setw(s.p + 6) << s.d;
diff --git a/packages/stokhos/src/sacado/kokkos/pce/linalg/Kokkos_CrsMatrix_UQ_PCE.hpp b/packages/stokhos/src/sacado/kokkos/pce/linalg/Kokkos_CrsMatrix_UQ_PCE.hpp
index 714b05c5e17e..6683ee7689bc 100644
--- a/packages/stokhos/src/sacado/kokkos/pce/linalg/Kokkos_CrsMatrix_UQ_PCE.hpp
+++ b/packages/stokhos/src/sacado/kokkos/pce/linalg/Kokkos_CrsMatrix_UQ_PCE.hpp
@@ -1467,7 +1467,11 @@ class MeanMultiply< KokkosSparse::CrsMatrix< Sacado::UQ::PCE,
namespace KokkosSparse {
-template = 40199
+ typename ExecutionSpace,
+#endif
+ typename AlphaType,
typename BetaType,
typename MatrixType,
typename InputType,
@@ -1479,6 +1483,10 @@ typename std::enable_if<
Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value
>::type
spmv(
+#if KOKKOSKERNELS_VERSION >= 40199
+ const ExecutionSpace& space,
+#endif
+ KokkosKernels::Experimental::Controls,
const char mode[],
const AlphaType& a,
const MatrixType& A,
@@ -1494,6 +1502,12 @@ spmv(
typedef Stokhos::MeanMultiply mean_multiply_type;
+#if KOKKOSKERNELS_VERSION >= 40199
+ if(space != ExecutionSpace()) {
+ Kokkos::Impl::raise_error(
+ "Stokhos spmv not implemented for non-default execution space instance");
+ }
+#endif
if(mode[0]!='N') {
Kokkos::Impl::raise_error(
"Stokhos spmv not implemented for transposed or conjugated matrix-vector multiplies");
@@ -1514,7 +1528,11 @@ spmv(
Sacado::Value::eval(b) );
}
-template = 40199
+ typename ExecutionSpace,
+#endif
+ typename AlphaType,
typename BetaType,
typename MatrixType,
typename InputType,
@@ -1526,30 +1544,10 @@ typename std::enable_if<
Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value
>::type
spmv(
+#if KOKKOSKERNELS_VERSION >= 40199
+ const ExecutionSpace& space,
+#endif
KokkosKernels::Experimental::Controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y,
- const RANK_ONE)
-{
- spmv(mode, a, A, x, b, y, RANK_ONE());
-}
-
-template
-typename std::enable_if<
- Kokkos::is_view_uq_pce< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value
- >::type
-spmv(
const char mode[],
const AlphaType& a,
const MatrixType& A,
@@ -1558,6 +1556,12 @@ spmv(
const Kokkos::View< OutputType, OutputP... >& y,
const RANK_TWO)
{
+#if KOKKOSKERNELS_VERSION >= 40199
+ if(space != ExecutionSpace()) {
+ Kokkos::Impl::raise_error(
+ "Stokhos spmv not implemented for non-default execution space instance");
+ }
+#endif
if(mode[0]!='N') {
Kokkos::Impl::raise_error(
"Stokhos spmv not implemented for transposed or conjugated matrix-vector multiplies");
@@ -1565,7 +1569,11 @@ spmv(
if (y.extent(1) == 1) {
auto y_1D = subview(y, Kokkos::ALL(), 0);
auto x_1D = subview(x, Kokkos::ALL(), 0);
- spmv(mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#if KOKKOSKERNELS_VERSION >= 40199
+ spmv(space, KokkosKernels::Experimental::Controls(), mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#else
+ spmv(KokkosKernels::Experimental::Controls(), mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#endif
}
else {
typedef Kokkos::View< OutputType, OutputP... > OutputVectorType;
@@ -1595,77 +1603,6 @@ spmv(
}
}
-template
-typename std::enable_if<
- Kokkos::is_view_uq_pce< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value
- >::type
-spmv(
- KokkosKernels::Experimental::Controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y,
- const RANK_TWO)
-{
- spmv(mode, a, A, x, b, y, RANK_TWO());
-}
-
-template
-std::enable_if_t<
- Kokkos::is_view_uq_pce< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value &&
- KokkosSparse::is_crs_matrix::value>
-spmv(
- KokkosKernels::Experimental::Controls controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y)
-{
- using RANK_SPECIALISE = std::conditional_t::rank == 2, RANK_TWO, RANK_ONE>;
- spmv(controls, mode, a, A, x, b, y, RANK_SPECIALISE());
-}
-
-template
-std::enable_if_t<
- Kokkos::is_view_uq_pce< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_uq_pce< Kokkos::View< OutputType, OutputP... > >::value &&
- KokkosSparse::is_crs_matrix::value>
-spmv(
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y)
-{
- using RANK_SPECIALISE = std::conditional_t::rank == 2, RANK_TWO, RANK_ONE>;
- spmv(mode, a, A, x, b, y, RANK_SPECIALISE());
-}
-
}
#endif /* #ifndef KOKKOS_CRSMATRIX_UQ_PCE_HPP */
diff --git a/packages/stokhos/src/sacado/kokkos/vector/linalg/Kokkos_CrsMatrix_MP_Vector.hpp b/packages/stokhos/src/sacado/kokkos/vector/linalg/Kokkos_CrsMatrix_MP_Vector.hpp
index eb6aa8239653..e1c828a60740 100644
--- a/packages/stokhos/src/sacado/kokkos/vector/linalg/Kokkos_CrsMatrix_MP_Vector.hpp
+++ b/packages/stokhos/src/sacado/kokkos/vector/linalg/Kokkos_CrsMatrix_MP_Vector.hpp
@@ -529,7 +529,11 @@ class Multiply< KokkosSparse::CrsMatrix< Sacado::MP::Vector,
namespace KokkosSparse {
-template = 40199
+ typename ExecutionSpace,
+#endif
+ typename AlphaType,
typename BetaType,
typename MatrixType,
typename InputType,
@@ -541,6 +545,10 @@ typename std::enable_if<
Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value
>::type
spmv(
+#if KOKKOSKERNELS_VERSION >= 40199
+ const ExecutionSpace& space,
+#endif
+ KokkosKernels::Experimental::Controls,
const char mode[],
const AlphaType& a,
const MatrixType& A,
@@ -554,6 +562,12 @@ spmv(
using input_vector_type = const_type_t;
typedef typename InputVectorType::array_type::non_const_value_type value_type;
+#if KOKKOSKERNELS_VERSION >= 40199
+ if(space != ExecutionSpace()) {
+ Kokkos::Impl::raise_error(
+ "Stokhos spmv not implemented for non-default execution space instance");
+ }
+#endif
if(mode[0]!='N') {
Kokkos::Impl::raise_error(
"Stokhos spmv not implemented for transposed or conjugated matrix-vector multiplies");
@@ -612,7 +626,11 @@ spmv(
}
}
-template = 40199
+ typename ExecutionSpace,
+#endif
+ typename AlphaType,
typename BetaType,
typename MatrixType,
typename InputType,
@@ -624,30 +642,10 @@ typename std::enable_if<
Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value
>::type
spmv(
+#if KOKKOSKERNELS_VERSION >= 40199
+ const ExecutionSpace& space,
+#endif
KokkosKernels::Experimental::Controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y,
- const RANK_ONE)
-{
- spmv(mode, a, A, x, b, y, RANK_ONE());
-}
-
-template
-typename std::enable_if<
- Kokkos::is_view_mp_vector< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value
- >::type
-spmv(
const char mode[],
const AlphaType& a,
const MatrixType& A,
@@ -656,6 +654,12 @@ spmv(
const Kokkos::View< OutputType, OutputP... >& y,
const RANK_TWO)
{
+#if KOKKOSKERNELS_VERSION >= 40199
+ if(space != ExecutionSpace()) {
+ Kokkos::Impl::raise_error(
+ "Stokhos spmv not implemented for non-default execution space instance");
+ }
+#endif
if(mode[0]!='N') {
Kokkos::Impl::raise_error(
"Stokhos spmv not implemented for transposed or conjugated matrix-vector multiplies");
@@ -663,7 +667,11 @@ spmv(
if (y.extent(1) == 1) {
auto y_1D = subview(y, Kokkos::ALL(), 0);
auto x_1D = subview(x, Kokkos::ALL(), 0);
- spmv(mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#if KOKKOSKERNELS_VERSION >= 40199
+ spmv(space, KokkosKernels::Experimental::Controls(), mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#else
+ spmv(KokkosKernels::Experimental::Controls(), mode, a, A, x_1D, b, y_1D, RANK_ONE());
+#endif
}
else {
typedef Kokkos::View< OutputType, OutputP... > OutputVectorType;
@@ -725,77 +733,6 @@ spmv(
}
}
-template
-typename std::enable_if<
- Kokkos::is_view_mp_vector< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value
- >::type
-spmv(
- KokkosKernels::Experimental::Controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y,
- const RANK_TWO)
-{
- spmv(mode, a, A, x, b, y, RANK_TWO());
-}
-
-template
-std::enable_if_t<
- Kokkos::is_view_mp_vector< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value &&
- KokkosSparse::is_crs_matrix::value>
-spmv(
- KokkosKernels::Experimental::Controls controls,
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y)
-{
- using RANK_SPECIALISE = std::conditional_t::rank == 2, RANK_TWO, RANK_ONE>;
- spmv(controls, mode, a, A, x, b, y, RANK_SPECIALISE());
-}
-
-template
-std::enable_if_t<
- Kokkos::is_view_mp_vector< Kokkos::View< InputType, InputP... > >::value &&
- Kokkos::is_view_mp_vector< Kokkos::View< OutputType, OutputP... > >::value &&
- KokkosSparse::is_crs_matrix::value>
-spmv(
- const char mode[],
- const AlphaType& a,
- const MatrixType& A,
- const Kokkos::View< InputType, InputP... >& x,
- const BetaType& b,
- const Kokkos::View< OutputType, OutputP... >& y)
-{
- using RANK_SPECIALISE = std::conditional_t::rank == 2, RANK_TWO, RANK_ONE>;
- spmv(mode, a, A, x, b, y, RANK_SPECIALISE());
-}
-
}
#endif /* #ifndef KOKKOS_CRSMATRIX_MP_VECTOR_HPP */