bugfix/tsuji1/dsuperlu to update FEI interface (#748)
* Fixing the FEI interface to SuperLU_Dist. This uses the same structs as src/parcsr_ls/dsuperlu.c. * Updates to the CMake build system and other spots to support SuperLU_Dist, SuperLU, and the FEI. Some Windows build bits. * Reverting this change, it's just in the comments. * Changes from Tim Dunn's FEI branch (feature/dunn13/tad220914-fei). This prevents the solver from exiting out with a failure even though the initial guess is the solution. There is also a fix to prevent a floating point exception. * Removing this #ifndef, as it is no longer necessary for our Windows build. * Only enable CXX if building the FEI.
This commit is contained in:
parent
6ca5cb542f
commit
247c168ee7
@ -93,6 +93,7 @@ option(HYPRE_ENABLE_FEI "Use FEI" OFF) # TODO: Add this cmake featu
|
|||||||
option(HYPRE_WITH_MPI "Compile with MPI" ON)
|
option(HYPRE_WITH_MPI "Compile with MPI" ON)
|
||||||
option(HYPRE_WITH_OPENMP "Use OpenMP" OFF)
|
option(HYPRE_WITH_OPENMP "Use OpenMP" OFF)
|
||||||
option(HYPRE_ENABLE_HOPSCOTCH "Use hopscotch hashing with OpenMP" OFF)
|
option(HYPRE_ENABLE_HOPSCOTCH "Use hopscotch hashing with OpenMP" OFF)
|
||||||
|
option(HYPRE_WITH_SUPERLU "Use TPL SuperLU" OFF)
|
||||||
option(HYPRE_WITH_DSUPERLU "Use TPL SuperLU_Dist" OFF)
|
option(HYPRE_WITH_DSUPERLU "Use TPL SuperLU_Dist" OFF)
|
||||||
option(HYPRE_WITH_CALIPER "Use Caliper" OFF) # TODO: Finish this cmake feature
|
option(HYPRE_WITH_CALIPER "Use Caliper" OFF) # TODO: Finish this cmake feature
|
||||||
option(HYPRE_PRINT_ERRORS "Print HYPRE errors" OFF)
|
option(HYPRE_PRINT_ERRORS "Print HYPRE errors" OFF)
|
||||||
@ -123,10 +124,13 @@ option(HYPRE_ENABLE_ONEMKLRAND "Use oneMKL rand" ON)
|
|||||||
set(HYPRE_SYCL_TARGET "" CACHE STRING "Target SYCL architecture, e.g. 'spir64_gen'.")
|
set(HYPRE_SYCL_TARGET "" CACHE STRING "Target SYCL architecture, e.g. 'spir64_gen'.")
|
||||||
set(HYPRE_SYCL_TARGET_BACKEND "" CACHE STRING "Additional SYCL backend options, e.g. '-device 12.1.0,12.4.0'.")
|
set(HYPRE_SYCL_TARGET_BACKEND "" CACHE STRING "Additional SYCL backend options, e.g. '-device 12.1.0,12.4.0'.")
|
||||||
|
|
||||||
|
option(TPL_SUPERLU_LIBRARIES "List of absolute paths to SuperLU link libraries [].")
|
||||||
|
option(TPL_SUPERLU_INCLUDE_DIRS "List of absolute paths to SuperLU include directories [].")
|
||||||
option(TPL_DSUPERLU_LIBRARIES "List of absolute paths to SuperLU_Dist link libraries [].")
|
option(TPL_DSUPERLU_LIBRARIES "List of absolute paths to SuperLU_Dist link libraries [].")
|
||||||
option(TPL_DSUPERLU_INCLUDE_DIRS "List of absolute paths to SuperLU_Dist include directories [].")
|
option(TPL_DSUPERLU_INCLUDE_DIRS "List of absolute paths to SuperLU_Dist include directories [].")
|
||||||
option(TPL_BLAS_LIBRARIES "Optional list of absolute paths to BLAS libraries, otherwise use FindBLAS to locate [].")
|
option(TPL_BLAS_LIBRARIES "Optional list of absolute paths to BLAS libraries, otherwise use FindBLAS to locate [].")
|
||||||
option(TPL_LAPACK_LIBRARIES "Optional list of absolute paths to LAPACK libraries, otherwise use FindLAPACK to locate [].")
|
option(TPL_LAPACK_LIBRARIES "Optional list of absolute paths to LAPACK libraries, otherwise use FindLAPACK to locate [].")
|
||||||
|
option(TPL_FEI_INCLUDE_DIRS "List of absolute paths to FEI include directories [].")
|
||||||
|
|
||||||
# Set config name values
|
# Set config name values
|
||||||
if (HYPRE_ENABLE_SHARED)
|
if (HYPRE_ENABLE_SHARED)
|
||||||
@ -184,6 +188,11 @@ if (HYPRE_ENABLE_HOPSCOTCH)
|
|||||||
set(HYPRE_HOPSCOTCH ON CACHE BOOL "" FORCE)
|
set(HYPRE_HOPSCOTCH ON CACHE BOOL "" FORCE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
if (HYPRE_WITH_SUPERLU)
|
||||||
|
set(HYPRE_USING_SUPERLU ON CACHE BOOL "" FORCE)
|
||||||
|
add_compile_definitions(HAVE_SUPERLU)
|
||||||
|
endif ()
|
||||||
|
|
||||||
if (HYPRE_WITH_DSUPERLU)
|
if (HYPRE_WITH_DSUPERLU)
|
||||||
set(HYPRE_USING_DSUPERLU ON CACHE BOOL "" FORCE)
|
set(HYPRE_USING_DSUPERLU ON CACHE BOOL "" FORCE)
|
||||||
set(HYPRE_USING_HYPRE_BLAS OFF CACHE BOOL "" FORCE)
|
set(HYPRE_USING_HYPRE_BLAS OFF CACHE BOOL "" FORCE)
|
||||||
@ -418,6 +427,32 @@ else ()
|
|||||||
endif ()
|
endif ()
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Find SUPERLU, if requested
|
||||||
|
if (HYPRE_USING_SUPERLU)
|
||||||
|
if (NOT TPL_SUPERLU_LIBRARIES)
|
||||||
|
message(FATAL_ERROR "TPL_SUPERLU_LIBRARIES option should be set for SuperLU support.")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT TPL_SUPERLU_INCLUDE_DIRS)
|
||||||
|
message(FATAL_ERROR "TPL_SUPERLU_INCLUDE_DIRS option be set for SuperLU support.")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
foreach (dir ${TPL_SUPERLU_INCLUDE_DIRS})
|
||||||
|
if (NOT EXISTS ${dir})
|
||||||
|
message(FATAL_ERROR "SuperLU include directory not found: ${dir}")
|
||||||
|
endif ()
|
||||||
|
set(CMAKE_C_FLAGS "-I${dir} ${CMAKE_C_FLAGS}")
|
||||||
|
endforeach ()
|
||||||
|
message(STATUS "Enabled support for using SUPERLU.")
|
||||||
|
set(SUPERLU_FOUND TRUE)
|
||||||
|
target_link_libraries(${PROJECT_NAME} PUBLIC ${TPL_SUPERLU_LIBRARIES} stdc++)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC ${TPL_SUPERLU_INCLUDE_DIRS})
|
||||||
|
endif (HYPRE_USING_SUPERLU)
|
||||||
|
|
||||||
|
if (SUPERLU_FOUND)
|
||||||
|
set(HYPRE_USING_SUPERLU TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
# Find DSUPERLU, if requested
|
# Find DSUPERLU, if requested
|
||||||
if (HYPRE_USING_DSUPERLU)
|
if (HYPRE_USING_DSUPERLU)
|
||||||
if (NOT TPL_DSUPERLU_LIBRARIES)
|
if (NOT TPL_DSUPERLU_LIBRARIES)
|
||||||
@ -444,6 +479,26 @@ if (DSUPERLU_FOUND)
|
|||||||
set(HYPRE_USING_DSUPERLU TRUE)
|
set(HYPRE_USING_DSUPERLU TRUE)
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
|
# Find FEI, if requested
|
||||||
|
if (HYPRE_USING_FEI)
|
||||||
|
enable_language(CXX)
|
||||||
|
|
||||||
|
if (NOT TPL_FEI_INCLUDE_DIRS)
|
||||||
|
message(FATAL_ERROR "TPL_FEI_INCLUDE_DIRS option should be set for FEI support.")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
foreach (dir ${TPL_FEI_INCLUDE_DIRS})
|
||||||
|
if (NOT EXISTS ${dir})
|
||||||
|
message(FATAL_ERROR "FEI include directory not found: ${dir}")
|
||||||
|
endif ()
|
||||||
|
set(CMAKE_C_FLAGS "-I${dir} ${CMAKE_C_FLAGS}")
|
||||||
|
set(CMAKE_CXX_FLAGS "-I${dir} ${CMAKE_CXX_FLAGS}")
|
||||||
|
endforeach ()
|
||||||
|
message(STATUS "Enabled support for using FEI.")
|
||||||
|
set(FEI_FOUND TRUE)
|
||||||
|
target_include_directories(${PROJECT_NAME} PUBLIC ${TPL_FEI_INCLUDE_DIRS})
|
||||||
|
endif(HYPRE_USING_FEI)
|
||||||
|
|
||||||
if (HYPRE_USING_CUDA)
|
if (HYPRE_USING_CUDA)
|
||||||
target_link_libraries(${PROJECT_NAME} PUBLIC "${EXPORT_INTERFACE_CUDA_LIBS}")
|
target_link_libraries(${PROJECT_NAME} PUBLIC "${EXPORT_INTERFACE_CUDA_LIBS}")
|
||||||
if (HYPRE_HAVE_MPI)
|
if (HYPRE_HAVE_MPI)
|
||||||
|
|||||||
@ -3,9 +3,6 @@
|
|||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
project(HYPRE_FEI C CXX)
|
|
||||||
|
|
||||||
include_directories(fei-hypre)
|
include_directories(fei-hypre)
|
||||||
|
|
||||||
# option(HYPRE_USING_SUPERLU "Use internal SuperLU routines" ON)
|
# option(HYPRE_USING_SUPERLU "Use internal SuperLU routines" ON)
|
||||||
@ -29,6 +26,3 @@ include_directories(fei-hypre)
|
|||||||
# endif()
|
# endif()
|
||||||
|
|
||||||
add_subdirectory(fei-hypre)
|
add_subdirectory(fei-hypre)
|
||||||
set(FEI_LIBS ${FEI_LIBS} $<TARGET_OBJECTS:HYPRE_fei>)
|
|
||||||
|
|
||||||
set(FEI_LIBS ${FEI_LIBS} PARENT_SCOPE)
|
|
||||||
|
|||||||
@ -62,6 +62,8 @@ set(HYPRE_fei_SRCS
|
|||||||
HYPRE_fei_vector.cxx
|
HYPRE_fei_vector.cxx
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(HYPRE_fei OBJECT ${HYPRE_fei_SRCS})
|
|
||||||
|
|
||||||
install (FILES ${HYPRE_fei_HEADERS} DESTINATION include)
|
install (FILES ${HYPRE_fei_HEADERS} DESTINATION include)
|
||||||
|
|
||||||
|
target_sources(${PROJECT_NAME}
|
||||||
|
PRIVATE ${HYPRE_fei_SRCS}
|
||||||
|
)
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
*-------------------------------------------------------------------------*/
|
*-------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifdef HYPRE_USING_DSUPERLU
|
#ifdef HYPRE_USING_DSUPERLU
|
||||||
|
#include "parcsr_ls/dsuperlu.h"
|
||||||
#include "superlu_ddefs.h"
|
#include "superlu_ddefs.h"
|
||||||
|
|
||||||
typedef struct HYPRE_LSI_DSuperLU_Struct
|
typedef struct HYPRE_LSI_DSuperLU_Struct
|
||||||
@ -34,10 +35,10 @@ typedef struct HYPRE_LSI_DSuperLU_Struct
|
|||||||
HYPRE_ParCSRMatrix Amat_;
|
HYPRE_ParCSRMatrix Amat_;
|
||||||
superlu_dist_options_t options_;
|
superlu_dist_options_t options_;
|
||||||
SuperMatrix sluAmat_;
|
SuperMatrix sluAmat_;
|
||||||
ScalePermstruct_t ScalePermstruct_;
|
dScalePermstruct_t ScalePermstruct_;
|
||||||
SuperLUStat_t stat_;
|
SuperLUStat_t stat_;
|
||||||
LUstruct_t LUstruct_;
|
dLUstruct_t LUstruct_;
|
||||||
SOLVEstruct_t SOLVEstruct_;
|
dSOLVEstruct_t SOLVEstruct_;
|
||||||
int globalNRows_;
|
int globalNRows_;
|
||||||
int localNRows_;
|
int localNRows_;
|
||||||
int startRow_;
|
int startRow_;
|
||||||
@ -56,18 +57,9 @@ int HYPRE_LSI_DSuperLUGenMatrix(HYPRE_Solver solver);
|
|||||||
|
|
||||||
int HYPRE_LSI_DSuperLUCreate( MPI_Comm comm, HYPRE_Solver *solver )
|
int HYPRE_LSI_DSuperLUCreate( MPI_Comm comm, HYPRE_Solver *solver )
|
||||||
{
|
{
|
||||||
HYPRE_LSI_DSuperLU *sluPtr;
|
hypre_DSLUData *dslu_data = NULL;
|
||||||
sluPtr = hypre_TAlloc(HYPRE_LSI_DSuperLU, 1, HYPRE_MEMORY_HOST);
|
dslu_data = hypre_CTAlloc(hypre_DSLUData, 1, HYPRE_MEMORY_HOST);
|
||||||
hypre_assert ( sluPtr != NULL );
|
*solver = (HYPRE_Solver) dslu_data;
|
||||||
sluPtr->comm_ = comm;
|
|
||||||
sluPtr->Amat_ = NULL;
|
|
||||||
sluPtr->localNRows_ = 0;
|
|
||||||
sluPtr->globalNRows_ = 0;
|
|
||||||
sluPtr->startRow_ = 0;
|
|
||||||
sluPtr->outputLevel_ = 0;
|
|
||||||
sluPtr->setupFlag_ = 0;
|
|
||||||
sluPtr->berr_ = hypre_TAlloc(double, 1, HYPRE_MEMORY_HOST);
|
|
||||||
*solver = (HYPRE_Solver) sluPtr;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,23 +69,21 @@ int HYPRE_LSI_DSuperLUCreate( MPI_Comm comm, HYPRE_Solver *solver )
|
|||||||
|
|
||||||
int HYPRE_LSI_DSuperLUDestroy( HYPRE_Solver solver )
|
int HYPRE_LSI_DSuperLUDestroy( HYPRE_Solver solver )
|
||||||
{
|
{
|
||||||
HYPRE_LSI_DSuperLU *sluPtr;
|
hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver;
|
||||||
sluPtr = (HYPRE_LSI_DSuperLU *) solver;
|
|
||||||
sluPtr->Amat_ = NULL;
|
PStatFree(&(dslu_data->dslu_data_stat));
|
||||||
if (sluPtr->setupFlag_ == 1)
|
Destroy_CompRowLoc_Matrix_dist(&(dslu_data->A_dslu));
|
||||||
|
dScalePermstructFree(&(dslu_data->dslu_ScalePermstruct));
|
||||||
|
dDestroy_LU(dslu_data->global_num_rows, &(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU));
|
||||||
|
dLUstructFree(&(dslu_data->dslu_data_LU));
|
||||||
|
if (dslu_data->dslu_options.SolveInitialized)
|
||||||
{
|
{
|
||||||
PStatFree(&(sluPtr->stat_));
|
dSolveFinalize(&(dslu_data->dslu_options), &(dslu_data->dslu_solve));
|
||||||
Destroy_CompRowLoc_Matrix_dist(&(sluPtr->sluAmat_));
|
|
||||||
ScalePermstructFree(&(sluPtr->ScalePermstruct_));
|
|
||||||
Destroy_LU(sluPtr->globalNRows_, &(sluPtr->sluGrid_), &(sluPtr->LUstruct_));
|
|
||||||
LUstructFree(&(sluPtr->LUstruct_));
|
|
||||||
if (sluPtr->options_.SolveInitialized)
|
|
||||||
dSolveFinalize(&(sluPtr->options_), &(sluPtr->SOLVEstruct_));
|
|
||||||
superlu_gridexit(&(sluPtr->sluGrid_));
|
|
||||||
}
|
}
|
||||||
hypre_TFree(sluPtr->berr_, HYPRE_MEMORY_HOST);
|
superlu_gridexit(&(dslu_data->dslu_data_grid));
|
||||||
hypre_TFree(sluPtr, HYPRE_MEMORY_HOST);
|
hypre_TFree(dslu_data->berr, HYPRE_MEMORY_HOST);
|
||||||
return 0;
|
hypre_TFree(dslu_data, HYPRE_MEMORY_HOST);
|
||||||
|
return hypre_error_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -114,94 +104,100 @@ int HYPRE_LSI_DSuperLUSetOutputLevel(HYPRE_Solver solver, int level)
|
|||||||
int HYPRE_LSI_DSuperLUSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr,
|
int HYPRE_LSI_DSuperLUSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr,
|
||||||
HYPRE_ParVector b, HYPRE_ParVector x )
|
HYPRE_ParVector b, HYPRE_ParVector x )
|
||||||
{
|
{
|
||||||
int nprocs, mypid, nprow, npcol, info, iZero=0;
|
/* Par Data Structure variables */
|
||||||
HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver;
|
HYPRE_BigInt global_num_rows = hypre_ParCSRMatrixGlobalNumRows(A_csr);
|
||||||
MPI_Comm mpiComm;
|
MPI_Comm comm = hypre_ParCSRMatrixComm(A_csr);
|
||||||
|
hypre_CSRMatrix *A_local;
|
||||||
|
HYPRE_Int num_rows;
|
||||||
|
HYPRE_Int num_procs, my_id;
|
||||||
|
HYPRE_Int pcols = 1, prows = 1;
|
||||||
|
HYPRE_BigInt *big_rowptr = NULL;
|
||||||
|
hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
HYPRE_Int info = 0;
|
||||||
/* get machine information */
|
HYPRE_Int nrhs = 0;
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
mpiComm = sluPtr->comm_;
|
hypre_MPI_Comm_size(comm, &num_procs);
|
||||||
MPI_Comm_size(mpiComm, &nprocs);
|
hypre_MPI_Comm_rank(comm, &my_id);
|
||||||
MPI_Comm_rank(mpiComm, &mypid);
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* Merge diag and offd into one matrix (global ids) */
|
||||||
/* compute grid information */
|
A_local = hypre_MergeDiagAndOffd(A_csr);
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
nprow = sluPtr->sluGrid_.nprow = 1;
|
num_rows = hypre_CSRMatrixNumRows(A_local);
|
||||||
npcol = sluPtr->sluGrid_.npcol = nprocs;
|
/* Now convert hypre matrix to a SuperMatrix */
|
||||||
superlu_gridinit(mpiComm, nprow, npcol, &(sluPtr->sluGrid_));
|
#ifdef HYPRE_MIXEDINT
|
||||||
if (mypid != sluPtr->sluGrid_.iam)
|
|
||||||
{
|
{
|
||||||
printf("DSuperLU ERROR: mismatched mypid and SuperLU iam.\n");
|
HYPRE_Int *rowptr = NULL;
|
||||||
exit(1);
|
HYPRE_Int i;
|
||||||
|
rowptr = hypre_CSRMatrixI(A_local);
|
||||||
|
big_rowptr = hypre_CTAlloc(HYPRE_BigInt, (num_rows + 1), HYPRE_MEMORY_HOST);
|
||||||
|
for (i = 0; i < (num_rows + 1); i++)
|
||||||
|
{
|
||||||
|
big_rowptr[i] = (HYPRE_BigInt)rowptr[i];
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
big_rowptr = hypre_CSRMatrixI(A_local);
|
||||||
|
#endif
|
||||||
|
dCreate_CompRowLoc_Matrix_dist(
|
||||||
|
&(dslu_data->A_dslu), global_num_rows, global_num_rows,
|
||||||
|
hypre_CSRMatrixNumNonzeros(A_local),
|
||||||
|
num_rows,
|
||||||
|
hypre_ParCSRMatrixFirstRowIndex(A_csr),
|
||||||
|
hypre_CSRMatrixData(A_local),
|
||||||
|
hypre_CSRMatrixBigJ(A_local), big_rowptr,
|
||||||
|
SLU_NR_loc, SLU_D, SLU_GE);
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
/* DOK: SuperLU frees assigned data, so set them to null before
|
||||||
/* get whole matrix and compose SuperLU matrix */
|
* calling hypre_CSRMatrixdestroy on A_local to avoid memory errors.
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
sluPtr->Amat_ = A_csr;
|
|
||||||
HYPRE_LSI_DSuperLUGenMatrix(solver);
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
/* set solver options */
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
set_default_options_dist(&(sluPtr->options_));
|
|
||||||
/* options->Fact = DOFACT (SamePattern,FACTORED}
|
|
||||||
options->Equil = YES (NO, ROW, COL, BOTH)
|
|
||||||
(YES not robust)
|
|
||||||
options->ParSymbFact = NO;
|
|
||||||
options->ColPerm = MMD_AT_PLUS_A (NATURAL, MMD_ATA,
|
|
||||||
METIS_AT_PLUS_A, PARMETIS, MY_PERMC}
|
|
||||||
(MMD_AT_PLUS_A the fastest, a factor
|
|
||||||
of 3+ better than MMD_ATA, which in
|
|
||||||
turn is 25% better than NATURAL)
|
|
||||||
options->RowPerm = LargeDiag (NOROWPERM, MY_PERMR)
|
|
||||||
options->ReplaceTinyPivot = YES (NO)
|
|
||||||
options->IterRefine = DOUBLE (NOREFINE, SINGLE, EXTRA)
|
|
||||||
(EXTRA not supported, DOUBLE more
|
|
||||||
accurate)
|
|
||||||
options->Trans = NOTRANS (TRANS, CONJ)
|
|
||||||
options->SolveInitialized = NO;
|
|
||||||
options->RefineInitialized = NO;
|
|
||||||
options->PrintStat = YES;
|
|
||||||
*/
|
*/
|
||||||
sluPtr->options_.Fact = DOFACT;
|
#ifndef HYPRE_MIXEDINT
|
||||||
sluPtr->options_.Equil = YES;
|
hypre_CSRMatrixI(A_local) = NULL;
|
||||||
sluPtr->options_.IterRefine = SLU_DOUBLE;
|
#endif
|
||||||
sluPtr->options_.ColPerm = MMD_AT_PLUS_A;
|
hypre_CSRMatrixData(A_local) = NULL;
|
||||||
sluPtr->options_.DiagPivotThresh = 1.0;
|
hypre_CSRMatrixBigJ(A_local) = NULL;
|
||||||
sluPtr->options_.ReplaceTinyPivot = NO;
|
hypre_CSRMatrixDestroy(A_local);
|
||||||
if (sluPtr->outputLevel_ < 2) sluPtr->options_.PrintStat = NO;
|
|
||||||
ScalePermstructInit(sluPtr->globalNRows_, sluPtr->globalNRows_,
|
|
||||||
&(sluPtr->ScalePermstruct_));
|
|
||||||
// LUstructInit(sluPtr->globalNRows_, sluPtr->globalNRows_,
|
|
||||||
// &(sluPtr->LUstruct_));
|
|
||||||
LUstructInit(sluPtr->globalNRows_, &(sluPtr->LUstruct_));
|
|
||||||
sluPtr->berr_[0] = 0.0;
|
|
||||||
PStatInit(&(sluPtr->stat_));
|
|
||||||
pdgssvx(&(sluPtr->options_), &(sluPtr->sluAmat_),
|
|
||||||
&(sluPtr->ScalePermstruct_), NULL, sluPtr->localNRows_, iZero,
|
|
||||||
&(sluPtr->sluGrid_), &(sluPtr->LUstruct_),
|
|
||||||
&(sluPtr->SOLVEstruct_), sluPtr->berr_, &(sluPtr->stat_), &info);
|
|
||||||
sluPtr->options_.Fact = FACTORED;
|
|
||||||
if (sluPtr->outputLevel_ >= 2)
|
|
||||||
PStatPrint(&(sluPtr->options_),&(sluPtr->stat_),&(sluPtr->sluGrid_));
|
|
||||||
|
|
||||||
sluPtr->setupFlag_ = 1;
|
/*Create process grid */
|
||||||
|
while (prows * pcols <= num_procs) { ++prows; }
|
||||||
if (mypid == 0 && sluPtr->outputLevel_ >=2)
|
--prows;
|
||||||
|
pcols = num_procs / prows;
|
||||||
|
while (prows * pcols != num_procs)
|
||||||
{
|
{
|
||||||
printf("DSuperLUSetup: diagScale = %d\n",
|
prows -= 1;
|
||||||
sluPtr->ScalePermstruct_.DiagScale);
|
pcols = num_procs / prows;
|
||||||
printf("DSuperLUSetup: berr = %e\n", sluPtr->berr_[0]);
|
|
||||||
printf("DSuperLUSetup: info = %d\n", info);
|
|
||||||
}
|
}
|
||||||
return 0;
|
//hypre_printf(" prows %d pcols %d\n", prows, pcols);
|
||||||
|
|
||||||
|
superlu_gridinit(comm, prows, pcols, &(dslu_data->dslu_data_grid));
|
||||||
|
|
||||||
|
set_default_options_dist(&(dslu_data->dslu_options));
|
||||||
|
|
||||||
|
dslu_data->dslu_options.Fact = DOFACT;
|
||||||
|
dslu_data->dslu_options.PrintStat = NO;
|
||||||
|
/*dslu_data->dslu_options.IterRefine = SLU_DOUBLE;
|
||||||
|
dslu_data->dslu_options.ColPerm = MMD_AT_PLUS_A;
|
||||||
|
dslu_data->dslu_options.DiagPivotThresh = 1.0;
|
||||||
|
dslu_data->dslu_options.ReplaceTinyPivot = NO; */
|
||||||
|
|
||||||
|
dScalePermstructInit(global_num_rows, global_num_rows, &(dslu_data->dslu_ScalePermstruct));
|
||||||
|
|
||||||
|
dLUstructInit(global_num_rows, &(dslu_data->dslu_data_LU));
|
||||||
|
|
||||||
|
PStatInit(&(dslu_data->dslu_data_stat));
|
||||||
|
|
||||||
|
dslu_data->global_num_rows = global_num_rows;
|
||||||
|
|
||||||
|
dslu_data->berr = hypre_CTAlloc(HYPRE_Real, 1, HYPRE_MEMORY_HOST);
|
||||||
|
dslu_data->berr[0] = 0.0;
|
||||||
|
|
||||||
|
pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu),
|
||||||
|
&(dslu_data->dslu_ScalePermstruct), NULL, num_rows, nrhs,
|
||||||
|
&(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU),
|
||||||
|
&(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &info);
|
||||||
|
|
||||||
|
dslu_data->dslu_options.Fact = FACTORED;
|
||||||
|
return hypre_error_flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
@ -211,40 +207,20 @@ int HYPRE_LSI_DSuperLUSetup(HYPRE_Solver solver, HYPRE_ParCSRMatrix A_csr,
|
|||||||
int HYPRE_LSI_DSuperLUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
|
int HYPRE_LSI_DSuperLUSolve( HYPRE_Solver solver, HYPRE_ParCSRMatrix A,
|
||||||
HYPRE_ParVector b, HYPRE_ParVector x )
|
HYPRE_ParVector b, HYPRE_ParVector x )
|
||||||
{
|
{
|
||||||
int localNRows, irow, iOne=1, info, mypid;
|
hypre_DSLUData *dslu_data = (hypre_DSLUData *) solver;
|
||||||
double *rhs, *soln;
|
HYPRE_Int info = 0;
|
||||||
HYPRE_LSI_DSuperLU *sluPtr = (HYPRE_LSI_DSuperLU *) solver;
|
HYPRE_Real *B = hypre_VectorData(hypre_ParVectorLocalVector(x));
|
||||||
|
HYPRE_Int size = hypre_VectorSize(hypre_ParVectorLocalVector(x));
|
||||||
|
HYPRE_Int nrhs = 1;
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
hypre_ParVectorCopy(b, x);
|
||||||
/* get machine, matrix, and vector information */
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
MPI_Comm_rank(sluPtr->comm_, &mypid);
|
pdgssvx(&(dslu_data->dslu_options), &(dslu_data->A_dslu),
|
||||||
localNRows = sluPtr->localNRows_;
|
&(dslu_data->dslu_ScalePermstruct), B, size, nrhs,
|
||||||
rhs = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) b));
|
&(dslu_data->dslu_data_grid), &(dslu_data->dslu_data_LU),
|
||||||
soln = hypre_VectorData(hypre_ParVectorLocalVector((hypre_ParVector *) x));
|
&(dslu_data->dslu_solve), dslu_data->berr, &(dslu_data->dslu_data_stat), &info);
|
||||||
for (irow = 0; irow < localNRows; irow++) soln[irow] = rhs[irow];
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
return hypre_error_flag;
|
||||||
/* solve */
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
pdgssvx(&(sluPtr->options_), &(sluPtr->sluAmat_),
|
|
||||||
&(sluPtr->ScalePermstruct_), soln, localNRows, iOne,
|
|
||||||
&(sluPtr->sluGrid_), &(sluPtr->LUstruct_),
|
|
||||||
&(sluPtr->SOLVEstruct_), sluPtr->berr_, &(sluPtr->stat_), &info);
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
/* diagnostics message */
|
|
||||||
/* ---------------------------------------------------------------- */
|
|
||||||
|
|
||||||
if (mypid == 0 && sluPtr->outputLevel_ >=2)
|
|
||||||
{
|
|
||||||
printf("DSuperLUSolve: info = %d\n", info);
|
|
||||||
printf("DSuperLUSolve: diagScale = %d\n",
|
|
||||||
sluPtr->ScalePermstruct_.DiagScale);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
|||||||
@ -4937,6 +4937,7 @@ int HYPRE_LinSysCore::launchSolver(int& solveStatus, int &iterations)
|
|||||||
|
|
||||||
MPI_Barrier(comm_);
|
MPI_Barrier(comm_);
|
||||||
status = 1;
|
status = 1;
|
||||||
|
solveStatus = status; //set for early return
|
||||||
stime = LSC_Wtime();
|
stime = LSC_Wtime();
|
||||||
ptime = stime;
|
ptime = stime;
|
||||||
|
|
||||||
|
|||||||
@ -491,6 +491,7 @@ hypre_GMRESSolve(void *gmres_vdata,
|
|||||||
if (rel_change) { hypre_TFreeF(rs_2, gmres_functions); }
|
if (rel_change) { hypre_TFreeF(rs_2, gmres_functions); }
|
||||||
for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], gmres_functions); }
|
for (i = 0; i < k_dim + 1; i++) { hypre_TFreeF(hh[i], gmres_functions); }
|
||||||
hypre_TFreeF(hh, gmres_functions);
|
hypre_TFreeF(hh, gmres_functions);
|
||||||
|
(gmres_data -> num_iterations) = iter;
|
||||||
HYPRE_ANNOTATE_FUNC_END;
|
HYPRE_ANNOTATE_FUNC_END;
|
||||||
|
|
||||||
return hypre_error_flag;
|
return hypre_error_flag;
|
||||||
|
|||||||
@ -278,8 +278,8 @@ hypre_BoomerAMGCGRelaxWt( void *amg_vdata,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
hypre_ParCSRMatrixMatvec(1.0, A, Ptemp, 0.0, Vtemp);
|
hypre_ParCSRMatrixMatvec(1.0, A, Ptemp, 0.0, Vtemp);
|
||||||
alpha = gamma / hypre_ParVectorInnerProd(Ptemp, Vtemp);
|
alpha = gamma / (hypre_ParVectorInnerProd(Ptemp, Vtemp) + 1.e-80);
|
||||||
alphinv = 1.0 / alpha;
|
alphinv = 1.0 / (alpha + 1.e-80);
|
||||||
tridiag[jj + 1] = alphinv;
|
tridiag[jj + 1] = alphinv;
|
||||||
tridiag[jj] *= beta;
|
tridiag[jj] *= beta;
|
||||||
tridiag[jj] += alphinv;
|
tridiag[jj] += alphinv;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user