FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
/******************************************************************************
|
2022-04-06 07:19:51 +08:00
|
|
|
* Copyright (c) 1998 Lawrence Livermore National Security, LLC and other
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
* HYPRE Project Developers. See the top-level COPYRIGHT file for details.
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
|
*******************************************************************************/
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
|
*
|
|
|
|
|
* FSAI solve routine
|
|
|
|
|
*
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "_hypre_parcsr_ls.h"
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
|
|
* hypre_FSAISolve
|
|
|
|
|
*--------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
HYPRE_Int
|
|
|
|
|
hypre_FSAISolve( void *fsai_vdata,
|
|
|
|
|
hypre_ParCSRMatrix *A,
|
|
|
|
|
hypre_ParVector *b,
|
|
|
|
|
hypre_ParVector *x )
|
|
|
|
|
{
|
|
|
|
|
MPI_Comm comm = hypre_ParCSRMatrixComm(A);
|
|
|
|
|
hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata;
|
|
|
|
|
|
|
|
|
|
/* Data structure variables */
|
|
|
|
|
hypre_ParVector *r_work = hypre_ParFSAIDataRWork(fsai_data);
|
2023-05-11 06:45:16 +08:00
|
|
|
HYPRE_Real tol = hypre_ParFSAIDataTolerance(fsai_data);
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
HYPRE_Int zero_guess = hypre_ParFSAIDataZeroGuess(fsai_data);
|
|
|
|
|
HYPRE_Int max_iter = hypre_ParFSAIDataMaxIterations(fsai_data);
|
|
|
|
|
HYPRE_Int print_level = hypre_ParFSAIDataPrintLevel(fsai_data);
|
|
|
|
|
HYPRE_Int logging = hypre_ParFSAIDataLogging(fsai_data);
|
|
|
|
|
|
|
|
|
|
/* Local variables */
|
|
|
|
|
HYPRE_Int iter, my_id;
|
|
|
|
|
HYPRE_Real old_resnorm, resnorm, rel_resnorm;
|
2023-07-21 00:34:53 +08:00
|
|
|
HYPRE_Complex one = 1.0;
|
|
|
|
|
HYPRE_Complex neg_one = -1.0;
|
|
|
|
|
HYPRE_Complex zero = 0.0;
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
|
2023-05-11 06:45:16 +08:00
|
|
|
/* Sanity check */
|
|
|
|
|
if (hypre_ParVectorNumVectors(b) > 1)
|
|
|
|
|
{
|
|
|
|
|
hypre_error_w_msg(HYPRE_ERROR_GENERIC, "FSAI doesn't support multicomponent vectors");
|
|
|
|
|
return hypre_error_flag;
|
|
|
|
|
}
|
|
|
|
|
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
HYPRE_ANNOTATE_FUNC_BEGIN;
|
2023-07-21 00:34:53 +08:00
|
|
|
hypre_GpuProfilingPushRange("FSAISolve");
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
|
|
|
|
|
hypre_MPI_Comm_rank(comm, &my_id);
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------
|
|
|
|
|
* Preconditioned Richardson - Main solver loop
|
|
|
|
|
* x(k+1) = x(k) + omega * (G^T*G) * (b - A*x(k))
|
|
|
|
|
* ----------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
if (my_id == 0 && print_level > 1)
|
|
|
|
|
{
|
|
|
|
|
hypre_printf("\n\n FSAI SOLVER SOLUTION INFO:\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
iter = 0;
|
2023-10-10 20:28:24 +08:00
|
|
|
rel_resnorm = resnorm = 1.0;
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
|
|
|
|
|
if (my_id == 0 && print_level > 1)
|
|
|
|
|
{
|
|
|
|
|
hypre_printf(" new relative\n");
|
|
|
|
|
hypre_printf(" iter # res norm res norm\n");
|
|
|
|
|
hypre_printf(" -------- -------- --------\n");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (max_iter > 0)
|
|
|
|
|
{
|
|
|
|
|
/* First iteration */
|
|
|
|
|
if (zero_guess)
|
|
|
|
|
{
|
|
|
|
|
/* Compute: x(k+1) = omega*G^T*G*b */
|
2023-07-21 00:34:53 +08:00
|
|
|
hypre_FSAIApply(fsai_vdata, zero, b, x);
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
2023-07-21 00:34:53 +08:00
|
|
|
/* Compute: x(k+1) = x(k) + omega*G^T*G*(b - A*x(k)) */
|
|
|
|
|
hypre_ParCSRMatrixMatvecOutOfPlace(neg_one, A, x, one, b, r_work);
|
|
|
|
|
hypre_FSAIApply(fsai_vdata, one, r_work, x);
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Update iteration count */
|
|
|
|
|
iter++;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
hypre_ParVectorCopy(b, x);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Apply remaining iterations */
|
|
|
|
|
for (; iter < max_iter; iter++)
|
|
|
|
|
{
|
|
|
|
|
/* Update residual */
|
2023-07-21 00:34:53 +08:00
|
|
|
hypre_ParCSRMatrixMatvecOutOfPlace(neg_one, A, x, one, b, r_work);
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
|
|
|
|
|
if (tol > 0.0)
|
|
|
|
|
{
|
|
|
|
|
old_resnorm = resnorm;
|
|
|
|
|
resnorm = hypre_ParVectorInnerProd(r_work, r_work);
|
|
|
|
|
|
|
|
|
|
/* Compute rel_resnorm */
|
|
|
|
|
rel_resnorm = resnorm / old_resnorm;
|
|
|
|
|
|
|
|
|
|
if (my_id == 0 && print_level > 1)
|
|
|
|
|
{
|
|
|
|
|
hypre_printf(" %e %e %e\n", iter, resnorm, rel_resnorm);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Exit if convergence tolerance has been achieved */
|
|
|
|
|
if (rel_resnorm >= tol)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-21 00:34:53 +08:00
|
|
|
/* Compute: x(k+1) = x(k) + omega*inv(M)*r */
|
|
|
|
|
hypre_FSAIApply(fsai_vdata, one, r_work, x);
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (logging > 1)
|
|
|
|
|
{
|
|
|
|
|
hypre_ParFSAIDataNumIterations(fsai_data) = iter;
|
|
|
|
|
hypre_ParFSAIDataRelResNorm(fsai_data) = rel_resnorm;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
hypre_ParFSAIDataNumIterations(fsai_data) = 0;
|
|
|
|
|
hypre_ParFSAIDataRelResNorm(fsai_data) = 0.0;
|
|
|
|
|
}
|
|
|
|
|
|
2023-07-21 00:34:53 +08:00
|
|
|
hypre_GpuProfilingPopRange();
|
|
|
|
|
HYPRE_ANNOTATE_FUNC_END;
|
|
|
|
|
|
|
|
|
|
return hypre_error_flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
|
|
* hypre_FSAIApply
|
|
|
|
|
*
|
|
|
|
|
* Computes x(k+1) = alpha*x(k) + omega*G^T*G*b
|
|
|
|
|
*--------------------------------------------------------------------*/
|
|
|
|
|
|
|
|
|
|
HYPRE_Int
|
|
|
|
|
hypre_FSAIApply( void *fsai_vdata,
|
|
|
|
|
HYPRE_Complex alpha,
|
|
|
|
|
hypre_ParVector *b,
|
|
|
|
|
hypre_ParVector *x )
|
|
|
|
|
{
|
|
|
|
|
hypre_ParFSAIData *fsai_data = (hypre_ParFSAIData*) fsai_vdata;
|
|
|
|
|
|
|
|
|
|
/* Data structure variables */
|
|
|
|
|
hypre_ParCSRMatrix *G = hypre_ParFSAIDataGmat(fsai_data);
|
|
|
|
|
hypre_ParCSRMatrix *GT = hypre_ParFSAIDataGTmat(fsai_data);
|
|
|
|
|
hypre_ParVector *z_work = hypre_ParFSAIDataZWork(fsai_data);
|
|
|
|
|
HYPRE_Real omega = hypre_ParFSAIDataOmega(fsai_data);
|
|
|
|
|
|
|
|
|
|
HYPRE_Complex one = 1.0;
|
|
|
|
|
HYPRE_Complex zero = 0.0;
|
|
|
|
|
|
|
|
|
|
HYPRE_ANNOTATE_FUNC_BEGIN;
|
|
|
|
|
hypre_GpuProfilingPushRange("FSAIApply");
|
|
|
|
|
|
|
|
|
|
hypre_ParCSRMatrixMatvec(one, G, b, zero, z_work);
|
|
|
|
|
hypre_ParCSRMatrixMatvec(omega, GT, z_work, alpha, x);
|
|
|
|
|
|
|
|
|
|
hypre_GpuProfilingPopRange();
|
FSAI implementation on CPUs (#610)
Thir PR adds a factorized sparse approximate inverse (FSAI) implementation on hypre, which can be used as a standalone solver, preconditioner to Krylov methods, or complex smoother to BoomerAMG. Particularly, we consider the adaptive algorithm version, where the sparsity pattern of the lower triangular factor G is built dynamically, i.e., during an iterative procedure that tries to find the best nonzero positions for a given row of G. This implementation was performed on top of the IJ interface. It uses the diagonal portion of A for constructing G, i.e., it's a block-Jacobi method in the MPI sense. List of additional changes:
* Add caliper instrumentation to FSAI.
* Add ZeroGuess option to FSAI.
* Performance optimizations.
* Add OpenMP support to FSAI.
* Make internal BLAS/LAPACK functions thread-safe.
* Update CMake build.
* Add new test cases: beam_tet_dof459_np1, beam_hex_dof459_np2, and beam_tet_dof2475_np4.
* Add documentation for FSAI.
Co-authored-by: Heather Switzer <switzer4@lassen36.coral.llnl.gov>
Co-authored-by: heatherms27 <hmswitzer@email.wm.edu>
Co-authored-by: Sarah Osborn <30503782+osborn9@users.noreply.github.com>
2022-04-06 02:18:39 +08:00
|
|
|
HYPRE_ANNOTATE_FUNC_END;
|
|
|
|
|
|
|
|
|
|
return hypre_error_flag;
|
|
|
|
|
}
|