Repository: trilinos/Trilinos
Pull request #13837: Ifpack2: Fused block jacobi
Author: login: brian-kelley
Labels: name: pkg: Ifpack2
name: impacting: performance
name: client: SPARC
description: Issues related to or needed more specifically by the ATDM SPARC code
Created: 2025-02-26T05:30:38Z | Merged: 2025-05-13T23:29:04Z

More performant paths for block Jacobi case inside BTDS (GPU only, BlockCrs only).
- Fuses residual and diagonal solve into one kernel
- Inverts diagonal blocks completely in shared memory before writing them back out. This would double the shared mem requirement per team, so to compensate the vector length is halved.

Compared to #13805, this gives between 9% (bs = 7) and 33% (bs = 11) speedup on the overall solve and about 1.9x speedup in numeric setup for both block sizes. **Note:** this was measured on a single GPU run, so the speedup only applies to local computation. Multi-rank runs will speed up less due to time spent doing communication.

<!---
  Note that anything between these delimiters is a comment that will not appear
  in the pull request description once created. Most areas in this message are
  commented out and can be easily added by removing the comment delimiters.

  CHOOSE APPROPRIATE BRANCH
  Be sure to select `develop` as the `base` branch against which to create this
  pull request.  Only pull requests against `develop` will undergo Trilinos'
  automated testing.  Pull requests against `master` will be ignored.

  TITLE
  Provide a general summary of your changes in the Title above.  If this pull
  request pertains to a particular package in Trilinos, it's worthwhile to start
  the title with "PackageName:  ".

  REVIEWERS
  Please make sure to mark:
  * Reviewers
  * Assignees
  * Labels

  SHOULD THIS PR BE IN THE RELEASE NOTES?
  If the changes in the PR should be considered for inclusion in the release notes,
  please apply the label "xx.y release note" where xx.y is the version of the
  upcoming release.

  NOTIFY THE RIGHT TEAMS
  Replace <teamName> below with the appropriate Trilinos package/team name.
-->
@trilinos/ifpack2

## Related Issues
<!---
  If applicable, let us know how this merge request is related to any other open
  issues or pull requests:
-->

Follows #13805

## Stakeholder Feedback
<!--- 
  If a github issue includes feedback from the relevant stakeholder(s), please link it.  
  If the stakeholder(s) communicated that feedback through a different medium, please note that you did so.
-->
Will ask SPARC team to evaluate.

## Testing
<!---
  Please confirm that any classes or functions in the Trilinos library that this PR touches are 
  exercised by at least one test in Trilinos.  Please specify which test that is.  For untestable 
  changes (e.g. changes to the nightly testing system) or changes to Trilinos tests, please say "N/A".=
-->
Tested in Ifpack2_BlockTriDiContainerUnitAndPerfTests, and ran this on OpenMP, Cuda and HIP. For Cuda tested double, float and complex_double.

<!--- 
  ## Additional Information
  Anything else we need to know in evaluating this merge request?
-->



Diff:
diff --git a/packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp b/packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
new file mode 100644
index 000000000000..3753da6836d2
--- /dev/null
+++ b/packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
@@ -0,0 +1,699 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, residual, and A
+    impl_scalar_type* local_residual = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_Dinv_residual = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_Dinv_residual[i] = 0;
+                             local_residual[i]     = b(row + i, col);
+                           });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              int64_t remote_cutoff = blocksize * num_local_rows;
+              if (x_offset >= remote_cutoff)
+                xx = &x_remote(x_offset - remote_cutoff, col);
+              else
+                xx = &x(x_offset, col);
+
+              Kokkos::parallel_for(
+                  Kokkos::ThreadVectorRange(member, blocksize),
+                  [&](const local_ordinal_type& i) { local_x[i] = xx[i]; });
+
+              // matvec on block: local_residual -= A_block_cst * local_x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const int k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_residual + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Compute local_Dinv_residual = D^-1 * local_residual
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, blocksize),
+          [&](const local_ordinal_type& k0) {
+            Kokkos::parallel_reduce(
+                Kokkos::ThreadVectorRange(member, blocksize),
+                [&](const local_ordinal_type& k1, impl_scalar_type& update) {
+                  update += d_inv(rowidx, k0, k1) * local_residual[k1];
+                },
+                local_Dinv_residual[k0]);
+          });
+      member.team_barrier();
+      // local_Dinv_residual is fully computed. Now compute the
+      // squared y update norm and update y (using damping factor).
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type old_y    = x(row + k, col);
+            impl_scalar_type y_update = local_Dinv_residual[k] - old_y;
+            if constexpr(Kokkos::ArithTraits<impl_scalar_type>::is_complex) {
+              magnitude_type ydiff =
+                  Kokkos::ArithTraits<impl_scalar_type>::abs(y_update);
+              update += ydiff * ydiff;
+            }
+            else {
+              update += y_update * y_update;
+            }
+            y(row + k, col) = old_y + damping_factor * y_update;
+          },
+          colNorm);
+      norm += colNorm;
+    }
+    Kokkos::single(Kokkos::PerTeam(member), [&]() { W(rowidx) = norm; });
+  }
+
+  // Launch SinglePass version (owned + nonowned residual, plus Dinv in a single
+  // kernel)
+  void run(const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& b_,
+           const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& x_,
+           const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& x_remote_,
+           const Unmanaged<impl_scalar_type_2d_view_tpetra>& y_) {
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_BEGIN;
+    IFPACK2_BLOCKHELPER_TIMER_WITH_FENCE(
+        "BlockTriDi::ComputeResidualAndSolve::RunSinglePass",
+        ComputeResidualAndSolve0, execution_space);
+
+    y        = y_;
+    b        = b_;
+    x        = x_;
+    x_remote = x_remote_;
+
+    const local_ordinal_type blocksize = blocksize_requested;
+    const local_ordinal_type nrows     = d_inv.extent(0);
+
+    const local_ordinal_type team_size   = 8;
+    const local_ordinal_type vector_size = 8;
+    // team: local_residual, local_Dinv_residual
+    const size_t shmem_team_size = 2 * blocksize * sizeof(impl_scalar_type);
+    // thread: local_x
+    const size_t shmem_thread_size = blocksize * sizeof(impl_scalar_type);
+    Kokkos::TeamPolicy<execution_space> policy(nrows, team_size, vector_size);
+    policy.set_scratch_size(0, Kokkos::PerTeam(shmem_team_size),
+                            Kokkos::PerThread(shmem_thread_size));
+    Kokkos::parallel_for("ComputeResidualAndSolve::TeamPolicy::SinglePass",
+                         policy, *this);
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_END;
+    IFPACK2_BLOCKHELPER_TIMER_FENCE(execution_space)
+  }
+};
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_2Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+  // Tag for computing residual with owned columns only (pass 1)
+  struct OwnedTag {};
+
+  // Tag for finishing the residual with nonowned columns, and solving/norming
+  // (pass 2)
+  struct NonownedTag {};
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_2Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const OwnedTag, const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_residual = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& i) { local_residual[i] = b(row + i, col); });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const local_ordinal_type& i) {
+                                     local_x[i] = x(x_offset + i, col);
+                                   });
+
+              // MatVec op Ax += A*x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const local_ordinal_type& k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_residual + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Write back the partial residual to y
+      if (member.team_rank() == 0) {
+        Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                             [&](const local_ordinal_type& k) {
+                               y(row + k, col) = local_residual[k];
+                             });
+      }
+    }
+  }
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const NonownedTag, const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_residual = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_Dinv_residual = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays.
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_Dinv_residual[i] = 0;
+                             local_residual[i]     = y(row + i, col);
+                           });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets_remote.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets_remote(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets_remote(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const local_ordinal_type& i) {
+                                     local_x[i] = x_remote(x_offset + i, col);
+                                   });
+
+              // matvec on block: local_residual -= A_block_cst * local_x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const int k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_residual + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Compute local_Dinv_residual = D^-1 * local_residual
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, blocksize),
+          [&](const local_ordinal_type& k0) {
+            Kokkos::parallel_reduce(
+                Kokkos::ThreadVectorRange(member, blocksize),
+                [&](const local_ordinal_type& k1, impl_scalar_type& update) {
+                  update += d_inv(rowidx, k0, k1) * local_residual[k1];
+                },
+                local_Dinv_residual[k0]);
+          });
+      member.team_barrier();
+      // local_Dinv_residual is fully computed. Now compute the
+      // squared y update norm and update y (using damping factor).
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type old_y    = x(row + k, col);
+            impl_scalar_type y_update = local_Dinv_residual[k] - old_y;
+            if constexpr(Kokkos::ArithTraits<impl_scalar_type>::is_complex) {
+              magnitude_type ydiff =
+                  Kokkos::ArithTraits<impl_scalar_type>::abs(y_update);
+              update += ydiff * ydiff;
+            }
+            else {
+              update += y_update * y_update;
+            }
+            y(row + k, col) = old_y + damping_factor * y_update;
+          },
+          colNorm);
+      norm += colNorm;
+    }
+    Kokkos::single(Kokkos::PerTeam(member), [&]() { W(rowidx) = norm; });
+  }
+
+  // Launch pass 1 of the 2-pass version.
+  // This computes just the owned part of residual and writes that back to y.
+  void run_pass1(const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& b_,
+                 const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& x_,
+                 const Unmanaged<impl_scalar_type_2d_view_tpetra>& y_) {
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_BEGIN;
+    IFPACK2_BLOCKHELPER_TIMER_WITH_FENCE(
+        "BlockTriDi::ComputeResidualAndSolve::RunPass1",
+        ComputeResidualAndSolve0, execution_space);
+
+    b = b_;
+    x = x_;
+    y = y_;
+
+    const local_ordinal_type blocksize = blocksize_requested;
+    const local_ordinal_type nrows     = d_inv.extent(0);
+
+    const local_ordinal_type team_size   = 8;
+    const local_ordinal_type vector_size = 8;
+    const size_t shmem_team_size         = blocksize * sizeof(impl_scalar_type);
+    const size_t shmem_thread_size       = blocksize * sizeof(impl_scalar_type);
+    Kokkos::TeamPolicy<execution_space, OwnedTag> policy(nrows, team_size,
+                                                         vector_size);
+    policy.set_scratch_size(0, Kokkos::PerTeam(shmem_team_size),
+                            Kokkos::PerThread(shmem_thread_size));
+    Kokkos::parallel_for("ComputeResidualAndSolve::TeamPolicy::Pass1", policy,
+                         *this);
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_END;
+    IFPACK2_BLOCKHELPER_TIMER_FENCE(execution_space)
+  }
+
+  // Launch pass 2 of the 2-pass version.
+  // This finishes computing residual with x_remote,
+  // and then applies Dinv and computes norm.
+  void run_pass2(
+      const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& x_,
+      const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& x_remote_,
+      const Unmanaged<impl_scalar_type_2d_view_tpetra>& y_) {
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_BEGIN;
+    IFPACK2_BLOCKHELPER_TIMER_WITH_FENCE(
+        "BlockTriDi::ComputeResidualAndSolve::RunPass2",
+        ComputeResidualAndSolve0, execution_space);
+
+    x        = x_;
+    x_remote = x_remote_;
+    y        = y_;
+
+    const local_ordinal_type blocksize = blocksize_requested;
+    const local_ordinal_type nrows     = d_inv.extent(0);
+
+    const local_ordinal_type team_size   = 8;
+    const local_ordinal_type vector_size = 8;
+    const size_t shmem_team_size   = 2 * blocksize * sizeof(impl_scalar_type);
+    const size_t shmem_thread_size = blocksize * sizeof(impl_scalar_type);
+    Kokkos::TeamPolicy<execution_space, NonownedTag> policy(nrows, team_size,
+                                                            vector_size);
+    policy.set_scratch_size(0, Kokkos::PerTeam(shmem_team_size),
+                            Kokkos::PerThread(shmem_thread_size));
+    Kokkos::parallel_for("ComputeResidualAndSolve::TeamPolicy::Pass2", policy,
+                         *this);
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_END;
+    IFPACK2_BLOCKHELPER_TIMER_FENCE(execution_space)
+  }
+};
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_SolveOnly {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_SolveOnly(
+      const AmD<MatrixType>& amd, const btdm_scalar_type_3d_view& d_inv_,
+      const impl_scalar_type_1d_view& W_,
+      const local_ordinal_type& blocksize_requested_,
+      const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx =
+        member.league_rank() * member.team_size() + member.team_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Dinv_residual =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    if (rowidx >= (local_ordinal_type)d_inv.extent(0)) return;
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      // Compute local_Dinv_residual = D^-1 * local_residual
+      Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& k0) {
+                             impl_scalar_type val = 0;
+                             for (local_ordinal_type k1 = 0; k1 < blocksize;
+                                  k1++) {
+                               val += d_inv(rowidx, k0, k1) * b(row + k1, col);
+                             }
+                             local_Dinv_residual[k0] = val;
+                           });
+
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::ThreadVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type y_update = local_Dinv_residual[k];
+            if constexpr(Kokkos::ArithTraits<impl_scalar_type>::is_complex) {
+              magnitude_type ydiff =
+                  Kokkos::ArithTraits<impl_scalar_type>::abs(y_update);
+              update += ydiff * ydiff;
+            }
+            else {
+              update += y_update * y_update;
+            }
+            y(row + k, col) = damping_factor * y_update;
+          },
+          colNorm);
+      norm += colNorm;
+    }
+    Kokkos::single(Kokkos::PerThread(member), [&]() { W(rowidx) = norm; });
+  }
+
+  // ComputeResidualAndSolve_SolveOnly::run does the solve for the first
+  // iteration, when the initial guess for y is zero. This means the residual
+  // vector is just b. The kernel applies the inverse diags to b to find y, and
+  // also puts the partial squared update norms (1 per row) into W.
+  void run(const ConstUnmanaged<impl_scalar_type_2d_view_tpetra>& b_,
+           const Unmanaged<impl_scalar_type_2d_view_tpetra>& y_) {
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_BEGIN;
+    IFPACK2_BLOCKHELPER_TIMER_WITH_FENCE(
+        "BlockTriDi::ComputeResidualAndSolve::Run_Y_Zero",
+        ComputeResidualAndSolve0, execution_space);
+
+    y = y_;
+    b = b_;
+
+    const local_ordinal_type blocksize = blocksize_requested;
+    const local_ordinal_type nrows     = d_inv.extent(0);
+
+    const local_ordinal_type team_size   = 8;
+    const local_ordinal_type vector_size = 8;
+    const size_t shmem_thread_size       = blocksize * sizeof(impl_scalar_type);
+    Kokkos::TeamPolicy<execution_space> policy(
+        (nrows + team_size - 1) / team_size, team_size, vector_size);
+    policy.set_scratch_size(0, Kokkos::PerThread(shmem_thread_size));
+    Kokkos::parallel_for("ComputeResidualAndSolve::TeamPolicy::y_zero", policy,
+                         *this);
+    IFPACK2_BLOCKHELPER_PROFILER_REGION_END;
+    IFPACK2_BLOCKHELPER_TIMER_FENCE(execution_space)
+  }
+};
+
+}  // namespace Ifpack2::BlockHelperDetails
+
+#endif
diff --git a/packages/ifpack2/src/Ifpack2_BlockHelper.hpp b/packages/ifpack2/src/Ifpack2_BlockHelper.hpp
index f67cebeb7e30..913691071364 100644
--- a/packages/ifpack2/src/Ifpack2_BlockHelper.hpp
+++ b/packages/ifpack2/src/Ifpack2_BlockHelper.hpp
@@ -311,6 +311,7 @@ namespace Ifpack2 {
 
       static constexpr int vector_length = DefaultVectorLength<btdm_scalar_type,memory_space>::value;
       static constexpr int internal_vector_length = DefaultInternalVectorLength<btdm_scalar_type,memory_space>::value;
+      static constexpr int half_vector_length = (vector_length > 1) ? (vector_length / 2) : 1;
       typedef Vector<SIMD<btdm_scalar_type>,vector_length> vector_type;
       typedef Vector<SIMD<btdm_scalar_type>,internal_vector_length> internal_vector_type;
 
@@ -329,6 +330,7 @@ namespace Ifpack2 {
       // tpetra multivector values (layout left): may need to change the typename more explicitly
       typedef Kokkos::View<impl_scalar_type**,Kokkos::LayoutLeft,device_type> impl_scalar_type_2d_view;
       typedef Kokkos::View<impl_scalar_type**,Kokkos::LayoutLeft,node_device_type> impl_scalar_type_2d_view_tpetra;
+      typedef Kokkos::View<const impl_scalar_type**,Kokkos::LayoutLeft,node_device_type> const_impl_scalar_type_2d_view_tpetra;
 
       // packed data always use layout right
       typedef Kokkos::View<vector_type*,device_type> vector_type_1d_view;
diff --git a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_decl.hpp b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_decl.hpp
index 578c7d5a9788..75cf5043e04d 100644
--- a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_decl.hpp
+++ b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_decl.hpp
@@ -376,6 +376,12 @@ namespace Ifpack2 {
                        const bool explicitConversion = false);
 
     void clearInternal();
+
+    // Decide whether the fused block Jacobi path can and should be used.
+    bool shouldUseFusedBlockJacobi(
+        const Teuchos::RCP<const row_matrix_type>& matrix,
+        const Teuchos::Array<Teuchos::Array<local_ordinal_type> >& partitions,
+        bool useSeqMethod);
   };
   
   ///
diff --git a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_def.hpp b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_def.hpp
index d2e39255ba04..a85dc2b4683f 100644
--- a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_def.hpp
+++ b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_def.hpp
@@ -169,6 +169,7 @@ namespace Ifpack2 {
     const bool useSeqMethod = false;
     const bool overlapCommAndComp = false;
     initInternal(matrix, importer, overlapCommAndComp, useSeqMethod);
+    impl_->use_fused_jacobi = shouldUseFusedBlockJacobi(matrix, partitions, useSeqMethod);
     n_subparts_per_part_ = -1;
     block_size_ = -1;
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
@@ -187,11 +188,36 @@ namespace Ifpack2 {
   {
     IFPACK2_BLOCKHELPER_TIMER("BlockTriDiContainer::BlockTriDiContainer", BlockTriDiContainer);
     initInternal(matrix, Teuchos::null, overlapCommAndComp, useSeqMethod, block_size, explicitConversion);
+    impl_->use_fused_jacobi = shouldUseFusedBlockJacobi(matrix, partitions, useSeqMethod);
     n_subparts_per_part_ = n_subparts_per_part;
     block_size_ = block_size;
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
   }
 
+  template <typename MatrixType>
+  bool BlockTriDiContainer<MatrixType, BlockTriDiContainerDetails::ImplSimdTag>
+  ::shouldUseFusedBlockJacobi(
+      const Teuchos::RCP<const row_matrix_type>& matrix,
+      const Teuchos::Array<Teuchos::Array<local_ordinal_type> >& partitions,
+      bool useSeqMethod)
+  {
+    using Helpers = BlockHelperDetails::ImplType<MatrixType>;
+    auto matrixBCRS = Teuchos::rcp_dynamic_cast<const block_crs_matrix_type>(matrix);
+    bool hasBlockCrs = !matrixBCRS.is_null();
+    bool onePartitionPerRow = hasBlockCrs && size_t(partitions.size()) == matrixBCRS->getLocalNumRows();
+    constexpr bool isGPU = BlockHelperDetails::is_device<typename Helpers::execution_space>::value;
+    // The fused block Jacobi solve is actually slower on V100
+#ifdef KOKKOS_ARCH_VOLTA
+    constexpr bool isVolta = true;
+#else
+    constexpr bool isVolta = false;
+#endif
+    // Jacobi case can be represented in two ways:
+    // - partitions is empty
+    // - partitions has length equal to local number of rows (meaning all line lengths must be 1)
+    return isGPU && !isVolta && !useSeqMethod && hasBlockCrs && (!partitions.size() || onePartitionPerRow);
+  }
+
   template <typename MatrixType>
   BlockTriDiContainer<MatrixType, BlockTriDiContainerDetails::ImplSimdTag>
   ::~BlockTriDiContainer ()
@@ -254,7 +280,7 @@ namespace Ifpack2 {
          impl_->block_tridiags,
          impl_->a_minus_d,
          impl_->overlap_communication_and_computation,
-         impl_->async_importer, useSeqMethod);
+         impl_->async_importer, useSeqMethod, impl_->use_fused_jacobi);
     }
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
   }
@@ -273,7 +299,8 @@ namespace Ifpack2 {
         (impl_->A,
          impl_->blockGraph, 
          impl_->part_interface, impl_->block_tridiags, 
-         Kokkos::ArithTraits<magnitude_type>::zero());
+         Kokkos::ArithTraits<magnitude_type>::zero(),
+         impl_->use_fused_jacobi);
     }
     this->IsComputed_ = true;
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
@@ -302,21 +329,38 @@ namespace Ifpack2 {
     const magnitude_type tol = Kokkos::ArithTraits<magnitude_type>::zero();
     const int check_tol_every = 1;
 
-    BlockTriDiContainerDetails::applyInverseJacobi<MatrixType>
-      (impl_->A,
-       impl_->blockGraph,
-       impl_->tpetra_importer, 
-       impl_->async_importer, 
-       impl_->overlap_communication_and_computation,
-       X, Y, impl_->Z, impl_->W,
-       impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
-       impl_->work,
-       impl_->norm_manager,
-       dampingFactor,
-       zeroStartingSolution,
-       numSweeps,
-       tol,
-       check_tol_every);
+    if(!impl_->use_fused_jacobi) {
+      BlockTriDiContainerDetails::applyInverseJacobi<MatrixType>
+        (impl_->A,
+         impl_->blockGraph,
+         impl_->tpetra_importer, 
+         impl_->async_importer, 
+         impl_->overlap_communication_and_computation,
+         X, Y, impl_->Z, impl_->W,
+         impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
+         impl_->work,
+         impl_->norm_manager,
+         dampingFactor,
+         zeroStartingSolution,
+         numSweeps,
+         tol,
+         check_tol_every);
+    }
+    else {
+      BlockTriDiContainerDetails::applyFusedBlockJacobi<MatrixType>
+        (impl_->tpetra_importer, 
+         impl_->async_importer,
+         impl_->overlap_communication_and_computation,
+         X, Y, impl_->W,
+         impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
+         impl_->work_flat,
+         impl_->norm_manager,
+         dampingFactor,
+         zeroStartingSolution,
+         numSweeps,
+         tol,
+         check_tol_every);
+    }
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
   }
 
@@ -342,7 +386,8 @@ namespace Ifpack2 {
         (impl_->A,
          impl_->blockGraph, 
          impl_->part_interface, impl_->block_tridiags, 
-         in.addRadiallyToDiagonal);
+         in.addRadiallyToDiagonal,
+         impl_->use_fused_jacobi);
     }
     this->IsComputed_ = true;
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
@@ -367,21 +412,38 @@ namespace Ifpack2 {
     IFPACK2_BLOCKHELPER_TIMER("BlockTriDiContainer::applyInverseJacobi", applyInverseJacobi);
     int r_val = 0;
     {
-      r_val = BlockTriDiContainerDetails::applyInverseJacobi<MatrixType>
-        (impl_->A,
-         impl_->blockGraph,
-         impl_->tpetra_importer, 
-         impl_->async_importer,
-         impl_->overlap_communication_and_computation,
-         X, Y, impl_->Z, impl_->W,
-         impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
-         impl_->work,
-         impl_->norm_manager,
-         in.dampingFactor,
-         in.zeroStartingSolution,
-         in.maxNumSweeps,
-         in.tolerance,
-         in.checkToleranceEvery);
+      if(!impl_->use_fused_jacobi) {
+        r_val = BlockTriDiContainerDetails::applyInverseJacobi<MatrixType>
+          (impl_->A,
+           impl_->blockGraph,
+           impl_->tpetra_importer, 
+           impl_->async_importer,
+           impl_->overlap_communication_and_computation,
+           X, Y, impl_->Z, impl_->W,
+           impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
+           impl_->work,
+           impl_->norm_manager,
+           in.dampingFactor,
+           in.zeroStartingSolution,
+           in.maxNumSweeps,
+           in.tolerance,
+           in.checkToleranceEvery);
+      }
+      else {
+        r_val = BlockTriDiContainerDetails::applyFusedBlockJacobi<MatrixType>
+          (impl_->tpetra_importer, 
+           impl_->async_importer,
+           impl_->overlap_communication_and_computation,
+           X, Y, impl_->W,
+           impl_->part_interface, impl_->block_tridiags, impl_->a_minus_d,
+           impl_->work_flat,
+           impl_->norm_manager,
+           in.dampingFactor,
+           in.zeroStartingSolution,
+           in.maxNumSweeps,
+           in.tolerance,
+           in.checkToleranceEvery);
+      }
     }
     IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
     return r_val;
diff --git a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
index 88bb7a09b9db..56c02d3167b8 100644
--- a/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
+++ b/packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
@@ -50,6 +50,7 @@
 
 #include "Ifpack2_BlockHelper.hpp"
 #include "Ifpack2_BlockComputeResidualVector.hpp"
+#include "Ifpack2_BlockComputeResidualAndSolve.hpp"
 
 //#include <KokkosBlas2_gemv.hpp>
 
@@ -1180,29 +1181,21 @@ namespace Ifpack2 {
       local_ordinal_type pack_nrows_sub = 0;
       if (jacobi) {
         IFPACK2_BLOCKHELPER_TIMER("compute part indices (Jacobi)", Jacobi);
+        // Jacobi (all lines have length 1) means that A_n_lclrows == nparts,
+        // so the mapping between parts and rows is trivial.
+        // Note: we can leave interf.row_contiguous = true, since for all i: lclrow(i) == i
+        for (local_ordinal_type i=0; i <= nparts; ++i) {
+          part2rowidx0(i) = i;
+          partptr(i) = i;
+        }
+        for (local_ordinal_type i=0; i < nparts; ++i) {
+          rowidx2part(i) = i;
+          lclrow(i) = i;
+        }
         for (local_ordinal_type ip=0;ip<nparts;++ip) {
-          constexpr local_ordinal_type ipnrows = 1;
           //assume No overlap.
-          part2rowidx0(ip+1) = part2rowidx0(ip) + ipnrows;
-          // Since parts are ordered in decreasing size, the size of the first
-          // part in a pack is the size for all parts in the pack.
-          if (ip % vector_length == 0) pack_nrows = ipnrows;
+          if (ip % vector_length == 0) pack_nrows = 1;
           part2packrowidx0(ip+1) = part2packrowidx0(ip) + ((ip+1) % vector_length == 0 || ip+1 == nparts ? pack_nrows : 0);
-          const local_ordinal_type offset = partptr(ip);
-          for (local_ordinal_type i=0;i<ipnrows;++i) {
-            const auto lcl_row = ip;
-            TEUCHOS_TEST_FOR_EXCEPT_MSG(lcl_row < 0 || lcl_row >= A_n_lclrows,
-                BlockHelperDetails::get_msg_prefix(comm)
-                << "partitions[" << p[ip] << "]["
-                << i << "] = " << lcl_row
-                << " but input matrix implies limits of [0, " << A_n_lclrows-1
-                << "].");
-            lclrow(offset+i) = lcl_row;
-            rowidx2part(offset+i) = ip;
-            if (interf.row_contiguous && offset+i > 0 && lclrow((offset+i)-1) + 1 != lcl_row)
-              interf.row_contiguous = false;
-          }
-          partptr(ip+1) = offset + ipnrows;
         }
         part2rowidx0_sub(0) = 0;
         partptr_sub(0, 0) = 0;
@@ -1569,6 +1562,7 @@ namespace Ifpack2 {
       using size_type_2d_view = typename impl_type::size_type_2d_view;
       using vector_type_3d_view = typename impl_type::vector_type_3d_view;
       using vector_type_4d_view = typename impl_type::vector_type_4d_view;
+      using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
 
       // flat_td_ptr(i) is the index into flat-array values of the start of the
       // i'th tridiag. pack_td_ptr is the same, but for packs. If vector_length ==
@@ -1587,6 +1581,15 @@ namespace Ifpack2 {
       // inv(A_00)*A_01 block values.
       vector_type_4d_view e_values;
 
+      // The following are for fused block Jacobi only.
+      // For block row i, diag_offset(i)...diag_offset(i + bs^2)
+      // is the range of scalars for the diagonal block.
+      size_type_1d_view diag_offsets;
+      // For fused residual+solve block Jacobi case,
+      // this contains the diagonal block inverses in flat, local row indexing:
+      // d_inv(row, :, :) gives the row-major block for row.
+      btdm_scalar_type_3d_view d_inv;
+
       bool is_diagonal_only;
 
       BlockTridiags() = default;
@@ -1866,7 +1869,8 @@ namespace Ifpack2 {
                          BlockHelperDetails::AmD<MatrixType> &amd,
                          const bool overlap_communication_and_computation,
                          const Teuchos::RCP<AsyncableImport<MatrixType> > &async_importer,
-                         bool useSeqMethod) {
+                         bool useSeqMethod,
+                         bool use_fused_jacobi) {
       IFPACK2_BLOCKHELPER_TIMER("BlockTriDi::SymbolicPhase", SymbolicPhase);
 
       using impl_type = BlockHelperDetails::ImplType<MatrixType>;
@@ -1883,6 +1887,7 @@ namespace Ifpack2 {
       using vector_type_4d_view = typename impl_type::vector_type_4d_view;
       using crs_matrix_type = typename impl_type::tpetra_crs_matrix_type;
       using block_crs_matrix_type = typename impl_type::tpetra_block_crs_matrix_type;
+      using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
 
       constexpr int vector_length = impl_type::vector_length;
 
@@ -2193,6 +2198,13 @@ namespace Ifpack2 {
         BlockHelperDetails::precompute_A_x_offsets<MatrixType>(amd, interf, g, dm2cm, blocksize, ownedRemoteSeparate);
       }
 
+      // If using fused block Jacobi path, allocate diagonal inverses here (d_inv) and find diagonal offsets.
+      if(use_fused_jacobi) {
+        btdm.d_inv = btdm_scalar_type_3d_view(do_not_initialize_tag("btdm.d_inv"), interf.nparts, blocksize, blocksize);
+        auto rowptrs = A_bcrs->getCrsGraph().getLocalRowPtrsDevice();
+        auto entries = A_bcrs->getCrsGraph().getLocalIndicesDevice();
+        btdm.diag_offsets = BlockHelperDetails::findDiagOffsets<execution_space, size_type_1d_view>(rowptrs, entries, interf.nparts, blocksize);
+      }
       IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
     }
 
@@ -2786,6 +2798,7 @@ namespace Ifpack2 {
       /// views
       using local_ordinal_type_1d_view = typename impl_type::local_ordinal_type_1d_view;
       using local_ordinal_type_2d_view = typename impl_type::local_ordinal_type_2d_view;
+      using size_type_1d_view = typename impl_type::size_type_1d_view;
       using size_type_2d_view = typename impl_type::size_type_2d_view;
       using impl_scalar_type_1d_view_tpetra = typename impl_type::impl_scalar_type_1d_view_tpetra;
       /// vectorization
@@ -2795,16 +2808,26 @@ namespace Ifpack2 {
       using vector_type_4d_view = typename impl_type::vector_type_4d_view;
       using internal_vector_type_4d_view = typename impl_type::internal_vector_type_4d_view;
       using internal_vector_type_5d_view = typename impl_type::internal_vector_type_5d_view;
+      using btdm_scalar_type_2d_view = typename impl_type::btdm_scalar_type_2d_view;
+      using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
       using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
       using btdm_scalar_type_5d_view = typename impl_type::btdm_scalar_type_5d_view;
       using internal_vector_scratch_type_3d_view = Scratch<typename impl_type::internal_vector_type_3d_view>;
       using btdm_scalar_scratch_type_3d_view = Scratch<typename impl_type::btdm_scalar_type_3d_view>;
+      using tpetra_block_access_view_type = typename impl_type::tpetra_block_access_view_type; // block crs (layout right)
+      using local_crs_graph_type = typename impl_type::local_crs_graph_type;
+      using colinds_view = typename local_crs_graph_type::entries_type;
 
       using internal_vector_type = typename impl_type::internal_vector_type;
       static constexpr int vector_length = impl_type::vector_length;
       static constexpr int internal_vector_length = impl_type::internal_vector_length;
       static_assert(vector_length >= internal_vector_length, "Ifpack2 BlockTriDi Numeric: vector_length must be at least as large as internal_vector_length");
       static_assert(vector_length % internal_vector_length == 0, "Ifpack2 BlockTriDi Numeric: vector_length must be divisible by internal_vector_length");
+      // half_vector_length is used for block Jacobi factorization.
+      // Shared memory requirement is twice as large (per vector lane) as for general tridi factorization, so
+      // reducing vector length (if possible) keeps the shared requirement constant. This avoids the performance
+      // cliff of switching from level 0 to level 1 scratch.
+      static constexpr int half_vector_length = impl_type::half_vector_length;
 
       /// team policy member type
       using team_policy_type = Kokkos::TeamPolicy<execution_space>;
@@ -2827,6 +2850,8 @@ namespace Ifpack2 {
       const Unmanaged<internal_vector_type_5d_view> e_internal_vector_values;
       const Unmanaged<btdm_scalar_type_4d_view> scalar_values, scalar_values_schur;
       const Unmanaged<btdm_scalar_type_5d_view> e_scalar_values;
+      const Unmanaged<btdm_scalar_type_3d_view> d_inv;
+      const Unmanaged<size_type_1d_view> diag_offsets;
       // shared information
       const local_ordinal_type blocksize, blocksize_square;
       // diagonal safety
@@ -2888,6 +2913,8 @@ namespace Ifpack2 {
                       btdm_.e_values.extent(2),
                       btdm_.e_values.extent(3),
                       vector_length),
+        d_inv(btdm_.d_inv),
+        diag_offsets(btdm_.diag_offsets),
         blocksize(btdm_.values.extent(1)),
         blocksize_square(blocksize*blocksize),
         // diagonal weight to avoid zero pivots
@@ -3188,6 +3215,7 @@ namespace Ifpack2 {
     public:
 
       struct ExtractAndFactorizeSubLineTag {};
+      struct ExtractAndFactorizeFusedJacobiTag {};
       struct ExtractBCDTag {};
       struct ComputeETag {};
       struct ComputeSchurTag {};
@@ -3237,6 +3265,71 @@ namespace Ifpack2 {
         }
       }
 
+      KOKKOS_INLINE_FUNCTION
+      void
+      operator() (const ExtractAndFactorizeFusedJacobiTag&, const member_type &member) const {
+        using default_mode_and_algo_type = ExtractAndFactorizeTridiagsDefaultModeAndAlgo<typename execution_space::memory_space>;
+        using default_mode_type = typename default_mode_and_algo_type::mode_type;
+        using default_algo_type = typename default_mode_and_algo_type::algo_type;
+        // When fused block Jacobi can be used, the mapping between local rows and parts is trivial (i <-> i)
+        // We can simply pull the diagonal entry from A into d_inv
+        btdm_scalar_scratch_type_3d_view WW1(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        btdm_scalar_scratch_type_3d_view WW2(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        const auto one = Kokkos::ArithTraits<btdm_magnitude_type>::one();
+        const local_ordinal_type nrows = lclrow.extent(0);
+        Kokkos::parallel_for
+          (Kokkos::ThreadVectorRange(member, half_vector_length),
+	   [&](const local_ordinal_type &v) {
+            local_ordinal_type row = member.league_rank() * half_vector_length + v;
+            // diagEntry has index of diagonal within row
+            auto W1 = Kokkos::subview(WW1, v, Kokkos::ALL(), Kokkos::ALL());
+            auto W2 = Kokkos::subview(WW2, v, Kokkos::ALL(), Kokkos::ALL());
+            if(row < nrows) {
+              // View the diagonal block of A in row as 2D row-major
+              const impl_scalar_type* A_diag = A_values.data() + diag_offsets(row);
+              // Copy the diag into scratch slice W1
+              // (copying elements directly is better than KokkosBatched copy)
+              Kokkos::parallel_for(Kokkos::TeamThreadRange(member, blocksize * blocksize),
+                [&](int i)
+                {
+                  W1.data()[i] = A_diag[i];
+                });
+              // and set W2 to identity in preparation to invert with 2 x Trsm
+              KB::SetIdentity<member_type,default_mode_type>
+                ::invoke(member, W2);
+            }
+            else {
+              // if this vector lane has no block to invert, then set W1 to identity
+              // so that LU still has a matrix to work on. LU uses team barriers so
+              // having some lanes run it and some not will deadlock.
+              KB::SetIdentity<member_type,default_mode_type>
+                ::invoke(member, W1);
+            }
+            member.team_barrier();
+            // LU factorize in-place
+            KB::LU<member_type, default_mode_type,KB::Algo::LU::Unblocked>
+              ::invoke(member, W1, tiny);
+            member.team_barrier();
+            KB::Trsm<member_type,
+                     KB::Side::Left,KB::Uplo::Lower,KB::Trans::NoTranspose,KB::Diag::Unit,
+                     default_mode_type,default_algo_type>
+              ::invoke(member, one, W1, W2);
+            KB::Trsm<member_type,
+                     KB::Side::Left,KB::Uplo::Upper,KB::Trans::NoTranspose,KB::Diag::NonUnit,
+                     default_mode_type,default_algo_type>
+              ::invoke(member, one, W1, W2);
+            member.team_barrier();
+            if(row < nrows) {
+              Kokkos::parallel_for(Kokkos::TeamThreadRange(member, blocksize * blocksize),
+                [&](int i)
+                {
+                  auto d_inv_block = &d_inv(row, 0, 0);
+                  d_inv_block[i] = W2.data()[i];
+                });
+            }
+          });
+      }
+
       KOKKOS_INLINE_FUNCTION
       void
       operator() (const ExtractBCDTag &, const member_type &member) const {
@@ -3589,6 +3682,24 @@ namespace Ifpack2 {
         IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_END;
       }
 
+      void run_fused_jacobi() {
+        IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_BEGIN;
+        const local_ordinal_type team_size =
+          ExtractAndFactorizeTridiagsDefaultModeAndAlgo<typename execution_space::memory_space>::
+          recommended_team_size(blocksize, half_vector_length, 1);
+        const local_ordinal_type per_team_scratch =
+          btdm_scalar_scratch_type_3d_view::shmem_size(blocksize, blocksize, 2 * half_vector_length);
+        {
+          IFPACK2_BLOCKHELPER_TIMER("BlockTriDi::NumericPhase::ExtractAndFactorizeFusedJacobi", ExtractAndFactorizeFusedJacobiTag);
+          Kokkos::TeamPolicy<execution_space, ExtractAndFactorizeFusedJacobiTag>
+            policy((lclrow.extent(0) + half_vector_length - 1) / half_vector_length, team_size, half_vector_length);
+
+          policy.set_scratch_size(ScratchLevel, Kokkos::PerTeam(per_team_scratch));
+          Kokkos::parallel_for("ExtractAndFactorize::TeamPolicy::run<ExtractAndFactorizeFusedJacobiTag>",
+                              policy, *this);
+        }
+        IFPACK2_BLOCKTRIDICONTAINER_PROFILER_REGION_END;
+      }
     };
 
     ///
@@ -3600,29 +3711,46 @@ namespace Ifpack2 {
                         const Teuchos::RCP<const typename BlockHelperDetails::ImplType<MatrixType>::tpetra_crs_graph_type> &G,
                         const BlockHelperDetails::PartInterface<MatrixType> &interf,
                         BlockTridiags<MatrixType> &btdm,
-                        const typename BlockHelperDetails::ImplType<MatrixType>::magnitude_type tiny) {
+                        const typename BlockHelperDetails::ImplType<MatrixType>::magnitude_type tiny,
+                        bool use_fused_jacobi) {
       using impl_type = BlockHelperDetails::ImplType<MatrixType>;
       using execution_space = typename impl_type::execution_space;
       using team_policy_type = Kokkos::TeamPolicy<execution_space>;
       using internal_vector_scratch_type_3d_view = Scratch<typename impl_type::internal_vector_type_3d_view>;
+      using btdm_scalar_scratch_type_3d_view = Scratch<typename impl_type::btdm_scalar_type_3d_view>;
 
       IFPACK2_BLOCKHELPER_TIMER("BlockTriDi::NumericPhase", NumericPhase);
 
       int blocksize = btdm.values.extent(1);
       // Both Kokkos policy vector length and SIMD type vector length are hardcoded in KokkosBatched.
       // For large block sizes, have to fall back to level 1 scratch.
-      int scratch_required = internal_vector_scratch_type_3d_view::shmem_size(blocksize, blocksize, impl_type::vector_length / impl_type::internal_vector_length);
+      int scratch_required;
+      if(!use_fused_jacobi) {
+        // General path scratch requirement
+        scratch_required = internal_vector_scratch_type_3d_view::shmem_size(blocksize, blocksize, impl_type::vector_length / impl_type::internal_vector_length);
+      }
+      else {
+        // Block Jacobi scratch requirement: measured in scalars, and uses twice as much (in bytes) per vector lane as the general path.
+        scratch_required = btdm_scalar_scratch_type_3d_view::shmem_size(blocksize, blocksize, 2 * impl_type::half_vector_length);
+      }
+
       int max_scratch = team_policy_type::scratch_size_max(0);
 
       if(scratch_required < max_scratch) {
         // Can use level 0 scratch
         ExtractAndFactorizeTridiags<MatrixType, 0> function(btdm, interf, A, G, tiny);
-        function.run();
+        if(!use_fused_jacobi)
+          function.run();
+        else
+          function.run_fused_jacobi();
       }
       else {
         // Not enough level 0 scratch, so fall back to level 1
         ExtractAndFactorizeTridiags<MatrixType, 1> function(btdm, interf, A, G, tiny);
-        function.run();
+        if(!use_fused_jacobi)
+          function.run();
+        else
+          function.run_fused_jacobi();
       }
       IFPACK2_BLOCKHELPER_TIMER_FENCE(typename BlockHelperDetails::ImplType<MatrixType>::execution_space)
     }
@@ -4868,7 +4996,7 @@ namespace Ifpack2 {
     };
 
     ///
-    /// top level apply interface
+    /// top level apply interface (general case)
     ///
     template<typename MatrixType>
     int
@@ -5064,6 +5192,222 @@ namespace Ifpack2 {
       return sweep;
     }
 
+    // Implementation of fused block Jacobi for a specific block size,
+    // or (if B == 0) for a general block size.
+    template<typename MatrixType, int B>
+    int
+    applyFusedBlockJacobi_Impl(
+                       const Teuchos::RCP<const typename BlockHelperDetails::ImplType<MatrixType>::tpetra_import_type> &tpetra_importer,
+                       const Teuchos::RCP<AsyncableImport<MatrixType> > &async_importer,
+                       const bool overlap_communication_and_computation,
+                       // tpetra interface
+                       const typename BlockHelperDetails::ImplType<MatrixType>::tpetra_multivector_type &X,  // tpetra interface
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::tpetra_multivector_type &Y,  // tpetra interface
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type_1d_view &W, // temporary tpetra interface (diff)
+                       // local object interface
+                       const BlockHelperDetails::PartInterface<MatrixType> &interf, // mesh interface
+                       const BlockTridiags<MatrixType> &btdm, // packed block tridiagonal matrices
+                       const BlockHelperDetails::AmD<MatrixType> &amd, // R = A - D
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type_1d_view &work, // workspace
+                       /* */ BlockHelperDetails::NormManager<MatrixType> &norm_manager,
+                       // preconditioner parameters
+                       const typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type &damping_factor,
+                       /* */ bool is_y_zero,
+                       const int max_num_sweeps,
+                       const typename BlockHelperDetails::ImplType<MatrixType>::magnitude_type tol,
+                       const int check_tol_every) {
+      using impl_type = BlockHelperDetails::ImplType<MatrixType>;
+      using node_memory_space = typename impl_type::node_memory_space;
+      using local_ordinal_type = typename impl_type::local_ordinal_type;
+      using size_type = typename impl_type::size_type;
+      using impl_scalar_type = typename impl_type::impl_scalar_type;
+      using magnitude_type = typename impl_type::magnitude_type;
+      using local_ordinal_type_1d_view = typename impl_type::local_ordinal_type_1d_view;
+      using tpetra_multivector_type = typename impl_type::tpetra_multivector_type;
+      using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+      using impl_scalar_type_2d_view_tpetra = typename impl_type::impl_scalar_type_2d_view_tpetra;
+
+      // the tpetra importer and async importer can't both be active
+      TEUCHOS_TEST_FOR_EXCEPT_MSG(!tpetra_importer.is_null() && !async_importer.is_null(),
+                                  "Neither Tpetra importer nor Async importer is null.");
+      // max number of sweeps should be positive number
+      TEUCHOS_TEST_FOR_EXCEPT_MSG(max_num_sweeps <= 0,
+                                  "Maximum number of sweeps must be >= 1.");
+
+      // const parameters
+      const bool is_async_importer_active = !async_importer.is_null();
+      const bool is_norm_manager_active = tol > Kokkos::ArithTraits<magnitude_type>::zero();
+      const magnitude_type tolerance = tol*tol;
+      const local_ordinal_type blocksize = btdm.d_inv.extent(1);
+      const local_ordinal_type num_vectors = Y.getNumVectors();
+      const local_ordinal_type num_blockrows = interf.nparts;
+
+      typename impl_type::impl_scalar_type_2d_view_tpetra remote_multivector;
+      {
+        if (is_async_importer_active) {
+          // create comm data buffer and keep it here
+          async_importer->createDataBuffer(num_vectors);
+          remote_multivector = async_importer->getRemoteMultiVectorLocalView();
+        }
+      }
+
+      const auto XX = X.getLocalViewDevice(Tpetra::Access::ReadOnly);
+      const auto YY = Y.getLocalViewDevice(Tpetra::Access::ReadWrite);
+
+      const bool two_pass_residual =
+        overlap_communication_and_computation && is_async_importer_active;
+
+      // Calculate the required work size and reallocate it if not already big enough.
+      // Check that our assumptions about YY dimension are correct.
+      TEUCHOS_TEST_FOR_EXCEPT_MSG(
+          size_t(num_blockrows) * blocksize * num_vectors != YY.extent(0) * YY.extent(1),
+          "Local LHS vector (YY) has total size " << YY.extent(0) << "x" << YY.extent(1) <<
+          " = " << YY.extent(0) * YY.extent(1) << ",\n" <<
+          "but expected " << num_blockrows << "x" << blocksize << "x" << num_vectors <<
+          " = " << size_t(num_blockrows) * blocksize * num_vectors << '\n');
+      size_type work_required = size_type(num_blockrows) * blocksize * num_vectors;
+      if (work.extent(0) < work_required) {
+        work = impl_scalar_type_1d_view(do_not_initialize_tag("flat workspace 1d view"), work_required);
+      }
+
+      Unmanaged<impl_scalar_type_2d_view_tpetra> y_doublebuf(work.data(), num_blockrows * blocksize, num_vectors);
+
+      // construct W
+      if (W.extent(0) != size_t(num_blockrows))
+        W = impl_scalar_type_1d_view(do_not_initialize_tag("W"), num_blockrows);
+
+      // Create the required functors upfront (this is inexpensive - all shallow copies)
+      BlockHelperDetails::ComputeResidualAndSolve_SolveOnly<MatrixType, B>
+        functor_solve_only(amd, btdm.d_inv, W, blocksize, damping_factor);
+      BlockHelperDetails::ComputeResidualAndSolve_1Pass<MatrixType, B>
+        functor_1pass(amd, btdm.d_inv, W, blocksize, damping_factor);
+      BlockHelperDetails::ComputeResidualAndSolve_2Pass<MatrixType, B>
+        functor_2pass(amd, btdm.d_inv, W, blocksize, damping_factor);
+
+      // norm manager workspace resize
+      if (is_norm_manager_active)
+        norm_manager.setCheckFrequency(check_tol_every);
+
+      // For double-buffering.
+      //   yy_buffers[current_y] has the current iterate of y.
+      //   yy_buffers[1-current_y] has the next iterate of y.
+      Unmanaged<impl_scalar_type_2d_view_tpetra> y_buffers[2] = {YY, y_doublebuf};
+      int current_y = 0;
+
+      // iterate
+      int sweep = 0;
+      for (;sweep < max_num_sweeps; ++sweep) {
+        if (is_y_zero) {
+          // If y is initially zero, then we are just computing y := damping_factor * Dinv * x
+          functor_solve_only.run(XX, y_buffers[1-current_y]);
+        } else {
+          // real use case does not use overlap comp and comm
+          if (overlap_communication_and_computation || !is_async_importer_active) {
+            if (is_async_importer_active) async_importer->asyncSendRecv(y_buffers[current_y]);
+            if(two_pass_residual) {
+              // Pass 1 computes owned residual and stores into new y buffer,
+              // but doesn't apply Dinv or produce a norm yet
+              functor_2pass.run_pass1(XX, y_buffers[current_y], y_buffers[1-current_y]);
+            }
+            else {
+              // This case happens if running with single rank.
+              // There are no remote columns, so residual and solve can happen in one step.
+              functor_1pass.run(XX, y_buffers[current_y], remote_multivector, y_buffers[1-current_y]);
+            }
+            if (is_norm_manager_active && norm_manager.checkDone(sweep, tolerance)) {
+              if (is_async_importer_active) async_importer->cancel();
+              break;
+            }
+            if (is_async_importer_active) {
+              async_importer->syncRecv();
+              // Stage 2 finishes computing the residual, then applies Dinv and computes norm.
+              functor_2pass.run_pass2(y_buffers[current_y], remote_multivector, y_buffers[1-current_y]);
+            }
+          } else {
+            if (is_async_importer_active)
+              async_importer->syncExchange(y_buffers[current_y]);
+            if (is_norm_manager_active && norm_manager.checkDone(sweep, tolerance)) break;
+            // Full residual, Dinv apply, and norm in one kernel
+            functor_1pass.run(XX, y_buffers[current_y], remote_multivector, y_buffers[1-current_y]);
+          }
+        }
+
+        // Compute global norm.
+        if (is_norm_manager_active) {
+          BlockHelperDetails::reduceVector<MatrixType>(W, norm_manager.getBuffer());
+          if (sweep + 1 == max_num_sweeps) {
+            norm_manager.ireduce(sweep, true);
+            norm_manager.checkDone(sweep + 1, tolerance, true);
+          } else {
+            norm_manager.ireduce(sweep);
+          }
+        }
+        is_y_zero = false;
+        // flip y buffers for next iteration, or termination if we reached max_num_sweeps.
+        current_y = 1 - current_y;
+      }
+      if(current_y == 1) {
+        // We finished iterating with y in the double buffer, so copy it to the user's vector.
+        Kokkos::deep_copy(YY, y_doublebuf);
+      }
+
+      //sqrt the norms for the caller's use.
+      if (is_norm_manager_active) norm_manager.finalize();
+      return sweep;
+    }
+
+    ///
+    /// top level apply interface (fused block Jacobi)
+    ///
+    template<typename MatrixType>
+    int
+    applyFusedBlockJacobi(
+                       const Teuchos::RCP<const typename BlockHelperDetails::ImplType<MatrixType>::tpetra_import_type> &tpetra_importer,
+                       const Teuchos::RCP<AsyncableImport<MatrixType> > &async_importer,
+                       const bool overlap_communication_and_computation,
+                       // tpetra interface
+                       const typename BlockHelperDetails::ImplType<MatrixType>::tpetra_multivector_type &X,  // tpetra interface
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::tpetra_multivector_type &Y,  // tpetra interface
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type_1d_view &W, // temporary tpetra interface (diff)
+                       // local object interface
+                       const BlockHelperDetails::PartInterface<MatrixType> &interf, // mesh interface
+                       const BlockTridiags<MatrixType> &btdm, // packed block tridiagonal matrices
+                       const BlockHelperDetails::AmD<MatrixType> &amd, // R = A - D
+                       /* */ typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type_1d_view &work, // workspace
+                       /* */ BlockHelperDetails::NormManager<MatrixType> &norm_manager,
+                       // preconditioner parameters
+                       const typename BlockHelperDetails::ImplType<MatrixType>::impl_scalar_type &damping_factor,
+                       /* */ bool is_y_zero,
+                       const int max_num_sweeps,
+                       const typename BlockHelperDetails::ImplType<MatrixType>::magnitude_type tol,
+                       const int check_tol_every) {
+      IFPACK2_BLOCKHELPER_TIMER("BlockTriDi::ApplyFusedBlockJacobi", ApplyFusedBlockJacobi);
+      int blocksize = btdm.d_inv.extent(1);
+      int sweep = 0;
+#define BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(B) {                \
+        sweep = applyFusedBlockJacobi_Impl<MatrixType, B>( \
+            tpetra_importer, async_importer, overlap_communication_and_computation, \
+            X, Y, W, interf, btdm, amd, work, \
+            norm_manager, damping_factor, is_y_zero, \
+            max_num_sweeps, tol, check_tol_every); \
+      } break
+      switch (blocksize) {
+        case   3: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI( 3);
+        case   5: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI( 5);
+        case   7: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI( 7);
+        case   9: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI( 9);
+        case  10: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(10);
+        case  11: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(11);
+        case  16: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(16);
+        case  17: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(17);
+        case  18: BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI(18);
+        default : BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI( 0);
+      }
+#undef BLOCKTRIDICONTAINER_APPLY_FUSED_JACOBI
+
+      return sweep;
+    }
+
 
     template<typename MatrixType>
     struct ImplObject {
@@ -5089,7 +5433,14 @@ namespace Ifpack2 {
       part_interface_type part_interface;
       block_tridiags_type block_tridiags; // D
       amd_type a_minus_d; // R = A - D
-      mutable typename impl_type::vector_type_1d_view work; // right hand side workspace
+
+      // whether to use fused block Jacobi path
+      bool use_fused_jacobi;
+
+      // vector workspace is used for general block tridi case
+      mutable typename impl_type::vector_type_1d_view work; // right hand side workspace (1D view of vector)
+      // scalar workspace is used for fused block jacobi case
+      mutable typename impl_type::impl_scalar_type_1d_view work_flat; // right hand side workspace (1D view of scalar)
       mutable norm_manager_type norm_manager;
     };
 


Reviews:
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-02-27T21:18:09Z
user: login: lucbv
body: Looks good, just a few comments
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T14:00:43Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T14:55:54Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T14:57:05Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T15:02:18Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T15:09:18Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T15:17:18Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T16:22:15Z
user: login: brian-kelley
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T16:47:10Z
user: login: lucbv
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-05-13T23:21:45Z

Review comments:
diff_hunk: @@ -1180,29 +1181,21 @@ namespace Ifpack2 {
       local_ordinal_type pack_nrows_sub = 0;
       if (jacobi) {
         IFPACK2_BLOCKHELPER_TIMER("compute part indices (Jacobi)", Jacobi);
+        // Jacobi (all lines have length 1) means that A_n_lclrows == nparts,
path: packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
user: login: brian-kelley
body: The changes here are supposed to keep all the resulting views exactly the same as before. It's just simplifications based on the fact that ``ipnrows == 1`` in the Jacobi case. It was also helpful for convincing myself that the ``lclrow`` mapping is the identity in this case, since that fact simplifies the numeric and solve.
created_at: 2025-02-27T21:18:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: lucbv
body: This is fine but I think this is something we have already implemented in Kokkos Kernels?
created_at: 2025-05-13T13:30:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: lucbv
body: It's a bit strange to start by storing `b` into `local_Ax` as A*x does not require values of the right hand side... It makes more sense to compute the residual, maybe we can add a comment about this
created_at: 2025-05-13T13:39:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
+                           });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              int64_t remote_cutoff = blocksize * num_local_rows;
+              if (x_offset >= remote_cutoff)
+                xx = &x_remote(x_offset - remote_cutoff, col);
+              else
+                xx = &x(x_offset, col);
+
+              Kokkos::parallel_for(
+                  Kokkos::ThreadVectorRange(member, blocksize),
+                  [&](const local_ordinal_type& i) { local_x[i] = xx[i]; });
+
+              // matvec on block: local_Ax -= A_block_cst * local_x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const int k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_Ax + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Compute local_DinvAx = D^-1 * local_Ax
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, blocksize),
+          [&](const local_ordinal_type& k0) {
+            Kokkos::parallel_reduce(
+                Kokkos::ThreadVectorRange(member, blocksize),
+                [&](const local_ordinal_type& k1, impl_scalar_type& update) {
+                  update += d_inv(rowidx, k0, k1) * local_Ax[k1];
+                },
+                local_DinvAx[k0]);
+          });
+      member.team_barrier();
+      // local_DinvAx is fully computed. Now compute the
+      // squared y update norm and update y (using damping factor).
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type old_y    = x(row + k, col);
+            impl_scalar_type y_update = local_DinvAx[k] - old_y;
+            magnitude_type ydiff =
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: lucbv
body: We can probably skip computing the absolute value if we are computing the square right after?
created_at: 2025-05-13T13:46:57Z
author_association: CONTRIBUTOR
diff_hunk: @@ -3237,6 +3265,71 @@ namespace Ifpack2 {
         }
       }
 
+      KOKKOS_INLINE_FUNCTION
+      void
+      operator() (const ExtractAndFactorizeFusedJacobiTag&, const member_type &member) const {
+        using default_mode_and_algo_type = ExtractAndFactorizeTridiagsDefaultModeAndAlgo<typename execution_space::memory_space>;
+        using default_mode_type = typename default_mode_and_algo_type::mode_type;
+        using default_algo_type = typename default_mode_and_algo_type::algo_type;
+        // When fused block Jacobi can be used, the mapping between local rows and parts is trivial (i <-> i)
+        // We can simply pull the diagonal entry from A into d_inv
+        btdm_scalar_scratch_type_3d_view WW1(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        btdm_scalar_scratch_type_3d_view WW2(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        const auto one = Kokkos::ArithTraits<btdm_magnitude_type>::one();
+        const local_ordinal_type nrows = lclrow.extent(0);
+        Kokkos::parallel_for
+          (Kokkos::ThreadVectorRange(member, half_vector_length),
+	   [&](const local_ordinal_type &v) {
+            local_ordinal_type row = member.league_rank() * half_vector_length + v;
+            // diagEntry has index of diagonal within row
+            auto W1 = Kokkos::subview(WW1, v, Kokkos::ALL(), Kokkos::ALL());
+            auto W2 = Kokkos::subview(WW2, v, Kokkos::ALL(), Kokkos::ALL());
+            if(row < nrows) {
+              // View the diagonal block of A in row as 2D row-major
+              const impl_scalar_type* A_diag = A_values.data() + diag_offsets(row);
+              // Copy the diag into scratch slice W1
+              // (copying elements directly is better than KokkosBatched copy)
path: packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
user: login: lucbv
body: Any reason why that's the case? Are we adding overhead with checks or bad memory access for the row major layout?
created_at: 2025-05-13T13:58:56Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
+                           });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              int64_t remote_cutoff = blocksize * num_local_rows;
+              if (x_offset >= remote_cutoff)
+                xx = &x_remote(x_offset - remote_cutoff, col);
+              else
+                xx = &x(x_offset, col);
+
+              Kokkos::parallel_for(
+                  Kokkos::ThreadVectorRange(member, blocksize),
+                  [&](const local_ordinal_type& i) { local_x[i] = xx[i]; });
+
+              // matvec on block: local_Ax -= A_block_cst * local_x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const int k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_Ax + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Compute local_DinvAx = D^-1 * local_Ax
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, blocksize),
+          [&](const local_ordinal_type& k0) {
+            Kokkos::parallel_reduce(
+                Kokkos::ThreadVectorRange(member, blocksize),
+                [&](const local_ordinal_type& k1, impl_scalar_type& update) {
+                  update += d_inv(rowidx, k0, k1) * local_Ax[k1];
+                },
+                local_DinvAx[k0]);
+          });
+      member.team_barrier();
+      // local_DinvAx is fully computed. Now compute the
+      // squared y update norm and update y (using damping factor).
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type old_y    = x(row + k, col);
+            impl_scalar_type y_update = local_DinvAx[k] - old_y;
+            magnitude_type ydiff =
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: brian-kelley
body: Yes, you're definitely right for impl_scalar_type being real (which is the case we care about being performant).
created_at: 2025-05-13T14:55:54Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: brian-kelley
body: Yes I think this is just a bad naming. The meaning of local_Ax here is residual.
created_at: 2025-05-13T14:57:05Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: brian-kelley
body: KK does have a thing to extract the diagonal values, but here we just want the diagonal offsets within the block CRS values view (so it scales by blocksize^2). I didn't look that hard but I don't think KK has that
created_at: 2025-05-13T15:02:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -3237,6 +3265,71 @@ namespace Ifpack2 {
         }
       }
 
+      KOKKOS_INLINE_FUNCTION
+      void
+      operator() (const ExtractAndFactorizeFusedJacobiTag&, const member_type &member) const {
+        using default_mode_and_algo_type = ExtractAndFactorizeTridiagsDefaultModeAndAlgo<typename execution_space::memory_space>;
+        using default_mode_type = typename default_mode_and_algo_type::mode_type;
+        using default_algo_type = typename default_mode_and_algo_type::algo_type;
+        // When fused block Jacobi can be used, the mapping between local rows and parts is trivial (i <-> i)
+        // We can simply pull the diagonal entry from A into d_inv
+        btdm_scalar_scratch_type_3d_view WW1(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        btdm_scalar_scratch_type_3d_view WW2(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        const auto one = Kokkos::ArithTraits<btdm_magnitude_type>::one();
+        const local_ordinal_type nrows = lclrow.extent(0);
+        Kokkos::parallel_for
+          (Kokkos::ThreadVectorRange(member, half_vector_length),
+	   [&](const local_ordinal_type &v) {
+            local_ordinal_type row = member.league_rank() * half_vector_length + v;
+            // diagEntry has index of diagonal within row
+            auto W1 = Kokkos::subview(WW1, v, Kokkos::ALL(), Kokkos::ALL());
+            auto W2 = Kokkos::subview(WW2, v, Kokkos::ALL(), Kokkos::ALL());
+            if(row < nrows) {
+              // View the diagonal block of A in row as 2D row-major
+              const impl_scalar_type* A_diag = A_values.data() + diag_offsets(row);
+              // Copy the diag into scratch slice W1
+              // (copying elements directly is better than KokkosBatched copy)
path: packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
user: login: brian-kelley
body: If you look at TeamCopyInternal::invoke, it's not layout aware and it's sequential over one of the dimensions. If the input is square it's parallel over rows and sequential over columns, but this won't coalesce for these row-major blocks.

We also know that the blocks are contiguous here so a flat copy of blocksize * blocksize elements is what we want.
created_at: 2025-05-13T15:09:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -3237,6 +3265,71 @@ namespace Ifpack2 {
         }
       }
 
+      KOKKOS_INLINE_FUNCTION
+      void
+      operator() (const ExtractAndFactorizeFusedJacobiTag&, const member_type &member) const {
+        using default_mode_and_algo_type = ExtractAndFactorizeTridiagsDefaultModeAndAlgo<typename execution_space::memory_space>;
+        using default_mode_type = typename default_mode_and_algo_type::mode_type;
+        using default_algo_type = typename default_mode_and_algo_type::algo_type;
+        // When fused block Jacobi can be used, the mapping between local rows and parts is trivial (i <-> i)
+        // We can simply pull the diagonal entry from A into d_inv
+        btdm_scalar_scratch_type_3d_view WW1(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        btdm_scalar_scratch_type_3d_view WW2(member.team_scratch(ScratchLevel), half_vector_length, blocksize, blocksize);
+        const auto one = Kokkos::ArithTraits<btdm_magnitude_type>::one();
+        const local_ordinal_type nrows = lclrow.extent(0);
+        Kokkos::parallel_for
+          (Kokkos::ThreadVectorRange(member, half_vector_length),
+	   [&](const local_ordinal_type &v) {
+            local_ordinal_type row = member.league_rank() * half_vector_length + v;
+            // diagEntry has index of diagonal within row
+            auto W1 = Kokkos::subview(WW1, v, Kokkos::ALL(), Kokkos::ALL());
+            auto W2 = Kokkos::subview(WW2, v, Kokkos::ALL(), Kokkos::ALL());
+            if(row < nrows) {
+              // View the diagonal block of A in row as 2D row-major
+              const impl_scalar_type* A_diag = A_values.data() + diag_offsets(row);
+              // Copy the diag into scratch slice W1
+              // (copying elements directly is better than KokkosBatched copy)
path: packages/ifpack2/src/Ifpack2_BlockTriDiContainer_impl.hpp
user: login: brian-kelley
body: OK I just remembered that this is a TeamThread loop so coalescing isn't really possible if each ThreadVector iteration above is doing one of the blocks.

The main benefit over KB copy then is exposing more parallelism and having fewer idle threads.
created_at: 2025-05-13T15:17:18Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: brian-kelley
body: Renaming local_Ax -> local_residual and local_DinvAx -> local_Dinv_residual.
created_at: 2025-05-13T16:22:15Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,684 @@
+// @HEADER
+// *****************************************************************************
+//       Ifpack2: Templated Object-Oriented Algebraic Preconditioner Package
+//
+// Copyright 2009 NTESS and the Ifpack2 contributors.
+// SPDX-License-Identifier: BSD-3-Clause
+// *****************************************************************************
+// @HEADER
+
+#ifndef IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+#define IFPACK2_BLOCKCOMPUTERESAND_SOLVE_IMPL_HPP
+
+#include "Ifpack2_BlockHelper.hpp"
+#include "Ifpack2_BlockComputeResidualVector.hpp"
+
+namespace Ifpack2::BlockHelperDetails {
+
+template <typename ExecSpace, typename DiagOffsets, typename Rowptrs,
+          typename Entries>
+DiagOffsets findDiagOffsets(const Rowptrs& rowptrs, const Entries& entries,
+                            size_t nrows, int blocksize) {
+  DiagOffsets diag_offsets(do_not_initialize_tag("btdm.diag_offsets"), nrows);
+  int err = 0;
+  Kokkos::parallel_reduce(
+      Kokkos::RangePolicy<ExecSpace>(0, nrows),
+      KOKKOS_LAMBDA(size_t row, int& err) {
+        auto rowBegin = rowptrs(row);
+        auto rowEnd   = rowptrs(row + 1);
+        for (size_t j = rowBegin; j < rowEnd; j++) {
+          if (size_t(entries(j)) == row) {
+            diag_offsets(row) = j * blocksize * blocksize;
+            return;
+          }
+        }
+        err++;
+      },
+      err);
+  TEUCHOS_TEST_FOR_EXCEPT_MSG(
+      err, "Ifpack2 BTD: at least one row has no diagonal entry");
+  return diag_offsets;
+}
+
+template <typename MatrixType, int B>
+struct ComputeResidualAndSolve_1Pass {
+  using impl_type        = BlockHelperDetails::ImplType<MatrixType>;
+  using node_device_type = typename impl_type::node_device_type;
+  using execution_space  = typename impl_type::execution_space;
+  using memory_space     = typename impl_type::memory_space;
+
+  using local_ordinal_type = typename impl_type::local_ordinal_type;
+  using size_type          = typename impl_type::size_type;
+  using impl_scalar_type   = typename impl_type::impl_scalar_type;
+  using magnitude_type     = typename impl_type::magnitude_type;
+  /// views
+  using local_ordinal_type_1d_view =
+      typename impl_type::local_ordinal_type_1d_view;
+  using size_type_1d_view = typename impl_type::size_type_1d_view;
+  using tpetra_block_access_view_type =
+      typename impl_type::tpetra_block_access_view_type;  // block crs (layout
+                                                          // right)
+  using impl_scalar_type_1d_view = typename impl_type::impl_scalar_type_1d_view;
+  using impl_scalar_type_2d_view_tpetra =
+      typename impl_type::impl_scalar_type_2d_view_tpetra;  // block multivector
+                                                            // (layout left)
+  using btdm_scalar_type_3d_view = typename impl_type::btdm_scalar_type_3d_view;
+  using btdm_scalar_type_4d_view = typename impl_type::btdm_scalar_type_4d_view;
+  using i64_3d_view              = typename impl_type::i64_3d_view;
+
+  /// team policy member type (used in cuda)
+  using member_type = typename Kokkos::TeamPolicy<execution_space>::member_type;
+
+  // enum for max blocksize and vector length
+  enum : int { max_blocksize = 32 };
+
+ private:
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> b;
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x;  // x_owned
+  ConstUnmanaged<impl_scalar_type_2d_view_tpetra> x_remote;
+  Unmanaged<impl_scalar_type_2d_view_tpetra> y;
+
+  // AmD information
+  const ConstUnmanaged<impl_scalar_type_1d_view> tpetra_values;
+
+  // blocksize
+  const local_ordinal_type blocksize_requested;
+
+  // block offsets
+  const ConstUnmanaged<i64_3d_view> A_x_offsets;
+  const ConstUnmanaged<i64_3d_view> A_x_offsets_remote;
+
+  // diagonal block inverses
+  const ConstUnmanaged<btdm_scalar_type_3d_view> d_inv;
+
+  // squared update norms
+  const Unmanaged<impl_scalar_type_1d_view> W;
+
+  impl_scalar_type damping_factor;
+
+ public:
+  ComputeResidualAndSolve_1Pass(const AmD<MatrixType>& amd,
+                                const btdm_scalar_type_3d_view& d_inv_,
+                                const impl_scalar_type_1d_view& W_,
+                                const local_ordinal_type& blocksize_requested_,
+                                const impl_scalar_type& damping_factor_)
+      : tpetra_values(amd.tpetra_values),
+        blocksize_requested(blocksize_requested_),
+        A_x_offsets(amd.A_x_offsets),
+        A_x_offsets_remote(amd.A_x_offsets_remote),
+        d_inv(d_inv_),
+        W(W_),
+        damping_factor(damping_factor_) {}
+
+  KOKKOS_INLINE_FUNCTION
+  void operator()(const member_type& member) const {
+    const local_ordinal_type blocksize   = (B == 0 ? blocksize_requested : B);
+    const local_ordinal_type rowidx      = member.league_rank();
+    const local_ordinal_type row         = rowidx * blocksize;
+    const local_ordinal_type num_vectors = b.extent(1);
+    const local_ordinal_type num_local_rows = d_inv.extent(0);
+
+    const impl_scalar_type* xx;
+    auto A_block_cst = ConstUnmanaged<tpetra_block_access_view_type>(
+        NULL, blocksize, blocksize);
+
+    // Get shared allocation for a local copy of x, Ax, and A
+    impl_scalar_type* local_Ax = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_DinvAx = reinterpret_cast<impl_scalar_type*>(
+        member.team_scratch(0).get_shmem(blocksize * sizeof(impl_scalar_type)));
+    impl_scalar_type* local_x =
+        reinterpret_cast<impl_scalar_type*>(member.thread_scratch(0).get_shmem(
+            blocksize * sizeof(impl_scalar_type)));
+
+    magnitude_type norm = 0;
+    for (local_ordinal_type col = 0; col < num_vectors; ++col) {
+      if (col) member.team_barrier();
+      // y -= Rx
+      // Initialize accumulation arrays
+      Kokkos::parallel_for(Kokkos::TeamVectorRange(member, blocksize),
+                           [&](const local_ordinal_type& i) {
+                             local_DinvAx[i] = 0;
+                             local_Ax[i]     = b(row + i, col);
+                           });
+      member.team_barrier();
+
+      int numEntries = A_x_offsets.extent(2);
+
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, 0, numEntries), [&](const int k) {
+            int64_t A_offset = A_x_offsets(rowidx, 0, k);
+            int64_t x_offset = A_x_offsets(rowidx, 1, k);
+            if (A_offset != Kokkos::ArithTraits<int64_t>::min()) {
+              A_block_cst.assign_data(tpetra_values.data() + A_offset);
+              // Pull x into local memory
+              int64_t remote_cutoff = blocksize * num_local_rows;
+              if (x_offset >= remote_cutoff)
+                xx = &x_remote(x_offset - remote_cutoff, col);
+              else
+                xx = &x(x_offset, col);
+
+              Kokkos::parallel_for(
+                  Kokkos::ThreadVectorRange(member, blocksize),
+                  [&](const local_ordinal_type& i) { local_x[i] = xx[i]; });
+
+              // matvec on block: local_Ax -= A_block_cst * local_x
+              Kokkos::parallel_for(Kokkos::ThreadVectorRange(member, blocksize),
+                                   [&](const int k0) {
+                                     impl_scalar_type val = 0;
+                                     for (int k1 = 0; k1 < blocksize; k1++)
+                                       val += A_block_cst(k0, k1) * local_x[k1];
+                                     Kokkos::atomic_add(local_Ax + k0, -val);
+                                   });
+            }
+          });
+      member.team_barrier();
+      // Compute local_DinvAx = D^-1 * local_Ax
+      Kokkos::parallel_for(
+          Kokkos::TeamThreadRange(member, blocksize),
+          [&](const local_ordinal_type& k0) {
+            Kokkos::parallel_reduce(
+                Kokkos::ThreadVectorRange(member, blocksize),
+                [&](const local_ordinal_type& k1, impl_scalar_type& update) {
+                  update += d_inv(rowidx, k0, k1) * local_Ax[k1];
+                },
+                local_DinvAx[k0]);
+          });
+      member.team_barrier();
+      // local_DinvAx is fully computed. Now compute the
+      // squared y update norm and update y (using damping factor).
+      magnitude_type colNorm;
+      Kokkos::parallel_reduce(
+          Kokkos::TeamVectorRange(member, blocksize),
+          [&](const local_ordinal_type& k, magnitude_type& update) {
+            // Compute the change in y (assuming damping_factor == 1) for this
+            // entry.
+            impl_scalar_type old_y    = x(row + k, col);
+            impl_scalar_type y_update = local_DinvAx[k] - old_y;
+            magnitude_type ydiff =
path: packages/ifpack2/src/Ifpack2_BlockComputeResidualAndSolve.hpp
user: login: brian-kelley
body: I added a constexpr branch for the real case.
created_at: 2025-05-13T16:47:10Z
author_association: CONTRIBUTOR

PR comments:
user: login: trilinos-autotester
created_at: 2025-02-26T11:04:31Z
body: Status Flag 'Pre-Test Inspection' - Auto Inspected - Inspection is Not Necessary for this Pull Request.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T11:08:56Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1165</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1214</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1213</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1134</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1213</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 29fe44869216589d6a2a1c6d194720b4b33d1b43</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T14:48:16Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: 1 or more Jobs FAILED

Note: Testing will normally be attempted again in approx. 2 Hrs 30 Mins. If a change to the PR source branch occurs, the testing will be attempted again on next available autotester run.

<details>
<summary>
  <b>Pull Request Auto Testing has FAILED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1165</li>
  <li>Status: FAILED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1214</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1213</li>
  <li>Status: FAILED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1134</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1213</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>29fe44869216589d6a2a1c6d194720b4b33d1b43</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>8eca3f92363c2fc005bf9c402e6cb7b0dcb2341a</td>
  </tr>
</table>
</details>



<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>

<br>[Wiki: How to Reproduce PR Testing Builds and Errors.](https://github.com/trilinos/Trilinos/wiki/Reproducing-PR-Testing-Errors)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T18:29:49Z
body: Status Flag 'Pre-Test Inspection' - Auto Inspected - Inspection is Not Necessary for this Pull Request.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T18:35:06Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1168</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1219</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1217</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1137</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T19:37:38Z
body: Status Flag 'Pull Request AutoTester' - Error: Jenkins Jobs - A user has pushed a change to the PR before testing completed. NEW EVENT 'committed', ID C_kwDOAsJyMdoAKDkzYzBkMTFjMThjNGRkZmI5ZjA0MzVkNTA0NWJhY2ZjY2M0Zjc5MGQ... The Jenkins Jobs will be shutdown; Testing of this PR must occur again.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T19:38:01Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: 1 or more Jobs FAILED

Note: Testing will normally be attempted again in approx. 2 Hrs 30 Mins. If a change to the PR source branch occurs, the testing will be attempted again on next available autotester run.

<details>
<summary>
  <b>Pull Request Auto Testing has FAILED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1168</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1219</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1217</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1137</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1216</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>c1f0eb5e1d0af7a1b76ad029c03b224b34567f35</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>
</details>



<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>

<br>[Wiki: How to Reproduce PR Testing Builds and Errors.](https://github.com/trilinos/Trilinos/wiki/Reproducing-PR-Testing-Errors)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T19:45:44Z
body: Status Flag 'Pre-Test Inspection' - Auto Inspected - Inspection is Not Necessary for this Pull Request.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T19:50:10Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1170</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1221</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1219</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1218</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1139</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1218</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T20:51:13Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: all Jobs PASSED

<details>
<summary>
  <b>Pull Request Auto Testing has PASSED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1170</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi_debug</h3>
<ul>
  <li>Build Num: 1221</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-serial_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1219</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1218</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_intel</h3>
<ul>
  <li>Build Num: 1139</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-intel-2021.3-sems-openmpi-4.1.6_release-debug_shared_no-kokkos-arch_no-asan_no-complex_fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1218</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>93c0d11c18c4ddfb9f0435d5045bacfccc4f790d</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>22a10b2e128b4c9734929e489f2d99ae3c8523e4</td>
  </tr>
</table>
</details>


<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T20:51:30Z
body: Status Flag 'Pre-Merge Inspection' - - This Pull Request Requires Inspection... The code must be inspected by a member of the Team before Testing/Merging
           NO REVIEWS HAVE BEEN PERFORMED ON THIS PULL REQUEST!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-26T20:51:36Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-27T20:54:41Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-27T21:29:26Z
body: Status Flag 'Pre-Merge Inspection' - - This Pull Request Requires Inspection... The code must be inspected by a member of the Team before Testing/Merging
           THE LAST COMMIT TO THIS PULL REQUEST HAS BEEN REVIEWED, BUT NOT ACCEPTED OR REQUIRES CHANGES!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-27T21:29:32Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-02-28T21:49:19Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-01T22:09:08Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-02T22:09:10Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-03T22:13:26Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-05T03:05:01Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-06T03:19:04Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-07T04:18:57Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-08T14:09:16Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-09T14:28:48Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-10T14:29:13Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-11T14:58:00Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-12T15:33:40Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-13T15:49:07Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-14T16:08:57Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-15T16:28:51Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-16T16:48:48Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-17T16:58:17Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-18T17:16:34Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-19T17:28:43Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-20T17:48:33Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-21T17:48:39Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-22T18:08:19Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-23T18:08:24Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-24T18:27:10Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-25T18:28:48Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-26T18:48:30Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-27T18:48:32Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-28T19:08:28Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-29T19:28:31Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-30T22:26:43Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-03-31T22:28:27Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-01T23:52:44Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-03T00:08:14Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-04T00:08:20Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-05T00:34:50Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-06T00:48:21Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-07T00:48:21Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: jhux2
created_at: 2025-04-07T17:45:10Z
body: @brian-kelley Have you received feedback from SPARC on this?
author_association: MEMBER
user: login: brian-kelley
created_at: 2025-04-07T17:54:04Z
body: @jhux2 No, haven't heard anything from Victor. We could review and merge this now, and see how it affects the nightly performance builds.
author_association: CONTRIBUTOR
user: login: lucbv
created_at: 2025-04-07T19:08:27Z
body: I will have a look then, thanks for checking @jhux2 : )
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-08T01:35:55Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-09T03:10:26Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-10T03:51:02Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-11T04:18:29Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-12T13:08:54Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-13T13:28:29Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-14T13:28:38Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-15T15:28:44Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-16T16:40:29Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-17T16:48:20Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-18T17:08:20Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-19T17:28:13Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-20T17:48:11Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-21T19:55:04Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-22T20:05:36Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-23T20:08:44Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-24T20:08:45Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-25T20:28:17Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-26T20:48:09Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-27T20:48:12Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-28T20:49:24Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-29T21:08:25Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-04-30T21:08:45Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-01T21:28:33Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-02T21:28:49Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-03T21:48:26Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-04T22:08:26Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-05T22:08:34Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-06T22:28:31Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-07T22:28:37Z
body: All Jobs Finished; status = PASSED, However PR is now STALE, and must be retested.  Set the AT: RETEST Label to force retest....
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-09T12:26:09Z
body: Status Flag 'Pre-Test Inspection' - Auto Inspected - Inspection is Not Necessary for this Pull Request.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-09T12:30:16Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1506</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_aue_srn_at1</h3>
<ul>
  <li>Build Num: 236</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_python_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_no-mpi_no-pt_no-rdc_no-uvm_deprecated-on_pr-framework</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1553</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1552</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1552</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 7c1a57147381c3803a12cdd3ee662e130ed45674</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-10T01:05:35Z
body: Status Flag 'Pull Request AutoTester' - Error: Jenkins Jobs - Error: [Jenkins] Cannot retrieve build running status on build (FATAL: ERROR : [jwrap: build.is_good():799:/scratch/trilinos/jenkins/ascic166-at/workspace/Trilinos_autotester_driver_inst_1/autotester/support/jenkins_support.py] - General Exception: (503 Server Error: Service Unavailable for url: https://do.sandia.gov/trilinos-ci/job/PR_cuda/1552/api/python?depth=1&tree=building))
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-10T01:06:37Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: 1 or more Jobs FAILED

Note: Testing will normally be attempted again in approx. 2 Hrs 30 Mins. If a change to the PR source branch occurs, the testing will be attempted again on next available autotester run.

<details>
<summary>
  <b>Pull Request Auto Testing has FAILED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1506</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_aue_srn_at1</h3>
<ul>
  <li>Build Num: 236</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_python_debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_no-mpi_no-pt_no-rdc_no-uvm_deprecated-on_pr-framework</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1553</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1552</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1552</li>
  <li>Status: ERROR</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>
</details>



<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>

<br>[Wiki: How to Reproduce PR Testing Builds and Errors.](https://github.com/trilinos/Trilinos/wiki/Reproducing-PR-Testing-Errors)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T16:08:27Z
body: Status Flag 'Pull Request AutoTester' - User Requested Retest - Label AT: RETEST will be reset after testing.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T16:11:39Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1516</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1563</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1562</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1562</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 7c1a57147381c3803a12cdd3ee662e130ed45674</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T16:59:01Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: 1 or more Jobs FAILED

Note: Testing will normally be attempted again in approx. 2 Hrs 30 Mins. If a change to the PR source branch occurs, the testing will be attempted again on next available autotester run.

<details>
<summary>
  <b>Pull Request Auto Testing has FAILED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1516</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1563</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1562</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1562</li>
  <li>Status: FAILED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>
</details>



<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>

<br>[Wiki: How to Reproduce PR Testing Builds and Errors.](https://github.com/trilinos/Trilinos/wiki/Reproducing-PR-Testing-Errors)<br>
author_association: CONTRIBUTOR
user: login: brian-kelley
created_at: 2025-05-12T17:38:23Z
body: @trilinos/framework FYI it looks like one of the builds is trying to write to a directory it doesn't have access to (ascic0193, rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables)
```
ccache: error: Failed to create directory /fgs/trilinos/ccache/cache/c/7: Permission denied
```
author_association: CONTRIBUTOR
user: login: achauphan
created_at: 2025-05-12T19:53:35Z
body: > @trilinos/framework FYI it looks like one of the builds is trying to write to a directory it doesn't have access to (ascic0193, rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables)
> 
> ```
> ccache: error: Failed to create directory /fgs/trilinos/ccache/cache/c/7: Permission denied
> ```

@brian-kelley after looking into this, this is likely due to the on-going networked scratch disk issues being used on our CI machines. The last notice we've received about this was last Friday and that it was being worked on. From the [CDash data](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos#!#Pull+Request) seems like this issue affected a number of PRs around a similar time frame, however, it seems like recent PR tests have been able to go through on the same machines.

I will hope that this is just an intermittent issue and add the retest label for now.

EDIT: I missed status update @12:26pm MT, it seems like `/fgs` issues have been resolved now!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T20:13:36Z
body: Status Flag 'Pull Request AutoTester' - User Requested Retest - Label AT: RETEST will be reset after testing.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T20:16:43Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1521</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1568</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1567</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1567</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 7c1a57147381c3803a12cdd3ee662e130ed45674</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T21:06:24Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: all Jobs PASSED

<details>
<summary>
  <b>Pull Request Auto Testing has PASSED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1521</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1568</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1567</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1567</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;AT: RETEST;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>7c1a57147381c3803a12cdd3ee662e130ed45674</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>
</details>


<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T21:06:42Z
body: Status Flag 'Pre-Merge Inspection' - - This Pull Request Requires Inspection... The code must be inspected by a member of the Team before Testing/Merging
           THE LAST COMMIT TO THIS PULL REQUEST HAS NOT BEEN REVIEWED YET!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-12T21:06:49Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T14:06:24Z
body: Status Flag 'Pre-Merge Inspection' - - This Pull Request Requires Inspection... The code must be inspected by a member of the Team before Testing/Merging
           THE LAST COMMIT TO THIS PULL REQUEST HAS BEEN REVIEWED, BUT NOT ACCEPTED OR REQUIRES CHANGES!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T14:06:31Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: brian-kelley
created_at: 2025-05-13T16:48:08Z
body: @lucbv I updated a couple things based on your comments.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T16:48:32Z
body: Status Flag 'Pre-Test Inspection' - Auto Inspected - Inspection is Not Necessary for this Pull Request.
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T16:51:37Z
body: Status Flag 'Pull Request AutoTester' - Testing Jenkins Projects:

<details>
<summary>
  <b>Pull Request Auto Testing STARTING</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1528</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1575</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1574</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1574</li>
  <li>Status: STARTED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Using Repos:</h2>

<dl>
  <dt>Repo: TRILINOS (brian-kelley/Trilinos)</dt>
  <ul>
    <li>Branch: FusedBlockJacobiFinal</li>
    <li>SHA: 94b94fd4ff20b73267d5373dc2e42d318f4dbd74</li>
    <li>Mode: TEST_REPO</li>
  </ul>
</dl>

Pull Request Author: brian-kelley
</details>

author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T17:41:36Z
body: Status Flag 'Pull Request AutoTester' - Jenkins Testing: all Jobs PASSED

<details>
<summary>
  <b>Pull Request Auto Testing has PASSED</b> (click to expand)
</summary>

<h2>Build Information</h2>
<h3>Test Name: PR_gcc-openmpi-openmp</h3>
<ul>
  <li>Build Num: 1528</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-gnu-8.5.0-openmpi-4.1.6-openmp_release-debug_static_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_clang</h3>
<ul>
  <li>Build Num: 1575</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-clang-11.0.1-openmpi-4.0.5-serial_release-debug_shared_no-kokkos-arch_no-asan_no-complex_no-fpic_mpi_no-pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda</h3>
<ul>
  <li>Build Num: 1574</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>BLOCKING_BUILD</td>
    <td>false</td>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_no-uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8-gpu</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>

<h2>Build Information</h2>
<h3>Test Name: PR_cuda-uvm</h3>
<ul>
  <li>Build Num: 1574</li>
  <li>Status: PASSED</li>
</ul>

<h4>Jenkins Parameters</h4>
<table>
  <tr>
    <th>Parameter Name</th>
    <th>Value</th>
  </tr>

  <tr>
    <td>FORCE_CLEAN</td>
    <td>true</td>
  </tr>

  <tr>
    <td>GENCONFIG_BUILD_NAME</td>
    <td>rhel8_sems-cuda-11.4.2-gnu-10.1.0-openmpi-4.1.6_release_static_Volta70_no-asan_complex_no-fpic_mpi_pt_no-rdc_uvm_deprecated-on_no-package-enables</td>
  </tr>

  <tr>
    <td>PR_LABELS</td>
    <td>pkg: Ifpack2;impacting: performance;client: SPARC</td>
  </tr>

  <tr>
    <td>PULLREQUESTNUM</td>
    <td>13837</td>
  </tr>

  <tr>
    <td>PULLREQUEST_CDASH_TRACK</td>
    <td>Pull Request</td>
  </tr>

  <tr>
    <td>TEST_REPO_ALIAS</td>
    <td>TRILINOS</td>
  </tr>

  <tr>
    <td>TRILINOS_NODE_LABEL</td>
    <td>rhel8</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_REPO</td>
    <td>https://github.com/brian-kelley/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_SOURCE_SHA</td>
    <td>94b94fd4ff20b73267d5373dc2e42d318f4dbd74</td>
  </tr>

  <tr>
    <td>TRILINOS_SRN_CONFIG</td>
    <td>true</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_BRANCH</td>
    <td>develop</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_REPO</td>
    <td>https://github.com/trilinos/Trilinos</td>
  </tr>

  <tr>
    <td>TRILINOS_TARGET_SHA</td>
    <td>0a6e3e311b7b9b646fc8d67736237401c2c7dfd9</td>
  </tr>
</table>
</details>


<br>[CDash Test Results for PR# 13837.](https://trilinos-cdash.sandia.gov/index.php?project=Trilinos&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercombine=and&filtercount=2&showfilters=1&filtercombine=and&field1=buildname&compare1=63&value1=PR-13837-test&field2=buildstarttime&compare2=84&value2=NOW
)<br>
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T17:41:53Z
body: Status Flag 'Pre-Merge Inspection' - - This Pull Request Requires Inspection... The code must be inspected by a member of the Team before Testing/Merging
           THE LAST COMMIT TO THIS PULL REQUEST HAS NOT BEEN REVIEWED YET!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T17:42:00Z
body: All Jobs Finished; status = PASSED, However Inspection must be performed before merge can occur...
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T23:28:46Z
body: Status Flag 'Pre-Merge Inspection' - SUCCESS: The last commit to this Pull Request has been INSPECTED AND APPROVED by [ lucbv ]!
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T23:28:53Z
body: Status Flag 'Pull Request AutoTester' - Pull Request will be Automerged
author_association: CONTRIBUTOR
user: login: trilinos-autotester
created_at: 2025-05-13T23:29:06Z
body: Merge on Pull Request# 13837: IS A SUCCESS - Pull Request successfully merged
author_association: CONTRIBUTOR