From c5323bacfc084d54297c719fd94f50ad7f668c68 Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Thu, 18 Dec 2025 14:02:59 -0800 Subject: [PATCH 1/8] Adding reference counting to ParCSRMatrix --- src/parcsr_mv/_hypre_parcsr_mv.h | 4 + src/parcsr_mv/_hypre_parcsr_mv_mup.h | 7 ++ src/parcsr_mv/_hypre_parcsr_mv_mup_def.h | 1 + src/parcsr_mv/_hypre_parcsr_mv_mup_undef.h | 1 + src/parcsr_mv/mup.fixed | 1 + src/parcsr_mv/mup_fixed.c | 8 ++ src/parcsr_mv/par_csr_matrix.c | 111 ++++++++++++--------- src/parcsr_mv/par_csr_matrix.h | 3 + src/parcsr_mv/protos.h | 1 + 9 files changed, 90 insertions(+), 47 deletions(-) diff --git a/src/parcsr_mv/_hypre_parcsr_mv.h b/src/parcsr_mv/_hypre_parcsr_mv.h index 2574611e4c..82bf54ff91 100644 --- a/src/parcsr_mv/_hypre_parcsr_mv.h +++ b/src/parcsr_mv/_hypre_parcsr_mv.h @@ -378,6 +378,8 @@ typedef struct hypre_ParCSRMatrix_struct HYPRE_Complex *bdiaginv; hypre_ParCSRCommPkg *bdiaginv_comm_pkg; + HYPRE_Int ref_count; /* Reference counter */ + #if defined(HYPRE_USING_GPU) /* these two arrays are reserveed for SoC matrices on GPUs to help build interpolation */ HYPRE_Int *soc_diag_j; @@ -421,6 +423,7 @@ typedef struct hypre_ParCSRMatrix_struct #define hypre_ParCSRMatrixAssumedPartition(matrix) ((matrix) -> assumed_partition) #define hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ((matrix) -> owns_assumed_partition) #define hypre_ParCSRMatrixProcOrdering(matrix) ((matrix) -> proc_ordering) +#define hypre_ParCSRMatrixRefCount(matrix) ((matrix) -> ref_count) #if defined(HYPRE_USING_GPU) #define hypre_ParCSRMatrixSocDiagJ(matrix) ((matrix) -> soc_diag_j) #define hypre_ParCSRMatrixSocOffdJ(matrix) ((matrix) -> soc_offd_j) @@ -1091,6 +1094,7 @@ hypre_ParCSRMatrix *hypre_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt globa HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); +hypre_ParCSRMatrix *hypre_ParCSRMatrixRef( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixDestroy ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); diff --git a/src/parcsr_mv/_hypre_parcsr_mv_mup.h b/src/parcsr_mv/_hypre_parcsr_mv_mup.h index 39b5e788af..f8ee8b1e5c 100644 --- a/src/parcsr_mv/_hypre_parcsr_mv_mup.h +++ b/src/parcsr_mv/_hypre_parcsr_mv_mup.h @@ -923,6 +923,13 @@ hypre_ParCSRMatrixReadIJ_dbl( MPI_Comm comm, const char *filename, HYPRE_Int *ba HYPRE_Int hypre_ParCSRMatrixReadIJ_long_dbl( MPI_Comm comm, const char *filename, HYPRE_Int *base_i_ptr, HYPRE_Int *base_j_ptr, hypre_ParCSRMatrix **matrix_ptr ); +hypre_ParCSRMatrix * +hypre_ParCSRMatrixRef_flt( hypre_ParCSRMatrix *matrix ); +hypre_ParCSRMatrix * +hypre_ParCSRMatrixRef_dbl( hypre_ParCSRMatrix *matrix ); +hypre_ParCSRMatrix * +hypre_ParCSRMatrixRef_long_dbl( hypre_ParCSRMatrix *matrix ); + HYPRE_Int hypre_ParCSRMatrixReorder_flt( hypre_ParCSRMatrix *A ); HYPRE_Int diff --git a/src/parcsr_mv/_hypre_parcsr_mv_mup_def.h b/src/parcsr_mv/_hypre_parcsr_mv_mup_def.h index aee2731ee1..0863b0b593 100644 --- a/src/parcsr_mv/_hypre_parcsr_mv_mup_def.h +++ b/src/parcsr_mv/_hypre_parcsr_mv_mup_def.h @@ -194,6 +194,7 @@ #define hypre_ParCSRMatrixRAPKTHost HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixRAPKTHost ) #define hypre_ParCSRMatrixRead HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixRead ) #define hypre_ParCSRMatrixReadIJ HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixReadIJ ) +#define hypre_ParCSRMatrixRef HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixRef ) #define hypre_ParCSRMatrixReorder HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixReorder ) #define hypre_ParCSRMatrixRestoreRow HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixRestoreRow ) #define hypre_ParCSRMatrixScale HYPRE_FIXEDPRECISION_FUNC ( hypre_ParCSRMatrixScale ) diff --git a/src/parcsr_mv/_hypre_parcsr_mv_mup_undef.h b/src/parcsr_mv/_hypre_parcsr_mv_mup_undef.h index 52b29bf8d8..7f9aa3906c 100644 --- a/src/parcsr_mv/_hypre_parcsr_mv_mup_undef.h +++ b/src/parcsr_mv/_hypre_parcsr_mv_mup_undef.h @@ -191,6 +191,7 @@ #undef hypre_ParCSRMatrixRAPKTHost #undef hypre_ParCSRMatrixRead #undef hypre_ParCSRMatrixReadIJ +#undef hypre_ParCSRMatrixRef #undef hypre_ParCSRMatrixReorder #undef hypre_ParCSRMatrixRestoreRow #undef hypre_ParCSRMatrixScale diff --git a/src/parcsr_mv/mup.fixed b/src/parcsr_mv/mup.fixed index 6cb8d48548..e26fcfd8e0 100644 --- a/src/parcsr_mv/mup.fixed +++ b/src/parcsr_mv/mup.fixed @@ -136,6 +136,7 @@ hypre_ParCSRMatrixRAPKT hypre_ParCSRMatrixRAPKTHost hypre_ParCSRMatrixRead hypre_ParCSRMatrixReadIJ +hypre_ParCSRMatrixRef hypre_ParCSRMatrixReorder hypre_ParCSRMatrixRestoreRow hypre_ParCSRMatrixScale diff --git a/src/parcsr_mv/mup_fixed.c b/src/parcsr_mv/mup_fixed.c index 237924b933..53a37d5e31 100644 --- a/src/parcsr_mv/mup_fixed.c +++ b/src/parcsr_mv/mup_fixed.c @@ -1048,6 +1048,14 @@ hypre_ParCSRMatrixReadIJ( MPI_Comm comm, const char *filename, HYPRE_Int *base_i /*--------------------------------------------------------------------------*/ +hypre_ParCSRMatrix * +hypre_ParCSRMatrixRef( hypre_ParCSRMatrix *matrix ) +{ + return HYPRE_CURRENTPRECISION_FUNC(hypre_ParCSRMatrixRef)( matrix ); +} + +/*--------------------------------------------------------------------------*/ + HYPRE_Int hypre_ParCSRMatrixReorder( hypre_ParCSRMatrix *A ) { diff --git a/src/parcsr_mv/par_csr_matrix.c b/src/parcsr_mv/par_csr_matrix.c index 199c2338ce..b6d174eecd 100644 --- a/src/parcsr_mv/par_csr_matrix.c +++ b/src/parcsr_mv/par_csr_matrix.c @@ -125,6 +125,8 @@ hypre_ParCSRMatrixCreate( MPI_Comm comm, matrix->bdiaginv_comm_pkg = NULL; matrix->bdiag_size = -1; + hypre_ParCSRMatrixRefCount(matrix) = 1; + #if defined(HYPRE_USING_GPU) hypre_ParCSRMatrixSocDiagJ(matrix) = NULL; hypre_ParCSRMatrixSocOffdJ(matrix) = NULL; @@ -137,6 +139,17 @@ hypre_ParCSRMatrixCreate( MPI_Comm comm, return matrix; } +/*-------------------------------------------------------------------------- + *--------------------------------------------------------------------------*/ + +hypre_ParCSRMatrix * +hypre_ParCSRMatrixRef( hypre_ParCSRMatrix *matrix ) +{ + hypre_ParCSRMatrixRefCount(matrix) ++; + + return matrix; +} + /*-------------------------------------------------------------------------- * Destroys a ParCSR matrix object *--------------------------------------------------------------------------*/ @@ -146,72 +159,76 @@ hypre_ParCSRMatrixDestroy( hypre_ParCSRMatrix *matrix ) { if (matrix) { - HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(matrix); - - if ( hypre_ParCSRMatrixOwnsData(matrix) ) + hypre_ParCSRMatrixRefCount(matrix) --; + if (hypre_ParCSRMatrixRefCount(matrix) == 0) { - hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix)); - hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix)); + HYPRE_MemoryLocation memory_location = hypre_ParCSRMatrixMemoryLocation(matrix); - if ( hypre_ParCSRMatrixDiagT(matrix) ) + if ( hypre_ParCSRMatrixOwnsData(matrix) ) { - hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiagT(matrix)); - } + hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiag(matrix)); + hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffd(matrix)); - if ( hypre_ParCSRMatrixOffdT(matrix) ) - { - hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffdT(matrix)); - } + if ( hypre_ParCSRMatrixDiagT(matrix) ) + { + hypre_CSRMatrixDestroy(hypre_ParCSRMatrixDiagT(matrix)); + } - if (hypre_ParCSRMatrixColMapOffd(matrix)) - { - hypre_TFree(hypre_ParCSRMatrixColMapOffd(matrix), HYPRE_MEMORY_HOST); + if ( hypre_ParCSRMatrixOffdT(matrix) ) + { + hypre_CSRMatrixDestroy(hypre_ParCSRMatrixOffdT(matrix)); + } + + if (hypre_ParCSRMatrixColMapOffd(matrix)) + { + hypre_TFree(hypre_ParCSRMatrixColMapOffd(matrix), HYPRE_MEMORY_HOST); + } + + if (hypre_ParCSRMatrixDeviceColMapOffd(matrix)) + { + hypre_TFree(hypre_ParCSRMatrixDeviceColMapOffd(matrix), HYPRE_MEMORY_DEVICE); + } + + if (hypre_ParCSRMatrixCommPkg(matrix)) + { + hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkg(matrix)); + } + + if (hypre_ParCSRMatrixCommPkgT(matrix)) + { + hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkgT(matrix)); + } } - if (hypre_ParCSRMatrixDeviceColMapOffd(matrix)) + /* RL: this is actually not correct since the memory_location may have been changed after allocation + * put them in containers TODO */ + hypre_TFree(hypre_ParCSRMatrixRowindices(matrix), memory_location); + hypre_TFree(hypre_ParCSRMatrixRowvalues(matrix), memory_location); + + if ( hypre_ParCSRMatrixAssumedPartition(matrix) && + hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ) { - hypre_TFree(hypre_ParCSRMatrixDeviceColMapOffd(matrix), HYPRE_MEMORY_DEVICE); + hypre_AssumedPartitionDestroy(hypre_ParCSRMatrixAssumedPartition(matrix)); } - if (hypre_ParCSRMatrixCommPkg(matrix)) + if ( hypre_ParCSRMatrixProcOrdering(matrix) ) { - hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkg(matrix)); + hypre_TFree(hypre_ParCSRMatrixProcOrdering(matrix), HYPRE_MEMORY_HOST); } - if (hypre_ParCSRMatrixCommPkgT(matrix)) + hypre_TFree(matrix->bdiaginv, HYPRE_MEMORY_HOST); + if (matrix->bdiaginv_comm_pkg) { - hypre_MatvecCommPkgDestroy(hypre_ParCSRMatrixCommPkgT(matrix)); + hypre_MatvecCommPkgDestroy(matrix->bdiaginv_comm_pkg); } - } - - /* RL: this is actually not correct since the memory_location may have been changed after allocation - * put them in containers TODO */ - hypre_TFree(hypre_ParCSRMatrixRowindices(matrix), memory_location); - hypre_TFree(hypre_ParCSRMatrixRowvalues(matrix), memory_location); - - if ( hypre_ParCSRMatrixAssumedPartition(matrix) && - hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ) - { - hypre_AssumedPartitionDestroy(hypre_ParCSRMatrixAssumedPartition(matrix)); - } - - if ( hypre_ParCSRMatrixProcOrdering(matrix) ) - { - hypre_TFree(hypre_ParCSRMatrixProcOrdering(matrix), HYPRE_MEMORY_HOST); - } - - hypre_TFree(matrix->bdiaginv, HYPRE_MEMORY_HOST); - if (matrix->bdiaginv_comm_pkg) - { - hypre_MatvecCommPkgDestroy(matrix->bdiaginv_comm_pkg); - } #if defined(HYPRE_USING_GPU) - hypre_TFree(hypre_ParCSRMatrixSocDiagJ(matrix), HYPRE_MEMORY_DEVICE); - hypre_TFree(hypre_ParCSRMatrixSocOffdJ(matrix), HYPRE_MEMORY_DEVICE); + hypre_TFree(hypre_ParCSRMatrixSocDiagJ(matrix), HYPRE_MEMORY_DEVICE); + hypre_TFree(hypre_ParCSRMatrixSocOffdJ(matrix), HYPRE_MEMORY_DEVICE); #endif - hypre_TFree(matrix, HYPRE_MEMORY_HOST); + hypre_TFree(matrix, HYPRE_MEMORY_HOST); + } } return hypre_error_flag; diff --git a/src/parcsr_mv/par_csr_matrix.h b/src/parcsr_mv/par_csr_matrix.h index b4b2701fe3..6463acac0a 100644 --- a/src/parcsr_mv/par_csr_matrix.h +++ b/src/parcsr_mv/par_csr_matrix.h @@ -77,6 +77,8 @@ typedef struct hypre_ParCSRMatrix_struct HYPRE_Complex *bdiaginv; hypre_ParCSRCommPkg *bdiaginv_comm_pkg; + HYPRE_Int ref_count; /* Reference counter */ + #if defined(HYPRE_USING_GPU) /* these two arrays are reserveed for SoC matrices on GPUs to help build interpolation */ HYPRE_Int *soc_diag_j; @@ -120,6 +122,7 @@ typedef struct hypre_ParCSRMatrix_struct #define hypre_ParCSRMatrixAssumedPartition(matrix) ((matrix) -> assumed_partition) #define hypre_ParCSRMatrixOwnsAssumedPartition(matrix) ((matrix) -> owns_assumed_partition) #define hypre_ParCSRMatrixProcOrdering(matrix) ((matrix) -> proc_ordering) +#define hypre_ParCSRMatrixRefCount(matrix) ((matrix) -> ref_count) #if defined(HYPRE_USING_GPU) #define hypre_ParCSRMatrixSocDiagJ(matrix) ((matrix) -> soc_diag_j) #define hypre_ParCSRMatrixSocOffdJ(matrix) ((matrix) -> soc_offd_j) diff --git a/src/parcsr_mv/protos.h b/src/parcsr_mv/protos.h index 85e47d57a3..99907e3ad5 100644 --- a/src/parcsr_mv/protos.h +++ b/src/parcsr_mv/protos.h @@ -408,6 +408,7 @@ hypre_ParCSRMatrix *hypre_ParCSRMatrixCreate ( MPI_Comm comm, HYPRE_BigInt globa HYPRE_Int num_cols_offd, HYPRE_Int num_nonzeros_diag, HYPRE_Int num_nonzeros_offd ); +hypre_ParCSRMatrix *hypre_ParCSRMatrixRef( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixDestroy ( hypre_ParCSRMatrix *matrix ); HYPRE_Int hypre_ParCSRMatrixInitialize_v2( hypre_ParCSRMatrix *matrix, HYPRE_MemoryLocation memory_location ); From e448284966dbcaa9f673c3b30b5599affc77647a Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Fri, 19 Dec 2025 09:01:01 -0800 Subject: [PATCH 2/8] Preliminary logic changes to pcg.c before implementing reference counter --- src/krylov/pcg.c | 60 +++++++++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/krylov/pcg.c b/src/krylov/pcg.c index 1123245478..fcf6a3490f 100644 --- a/src/krylov/pcg.c +++ b/src/krylov/pcg.c @@ -29,23 +29,21 @@ hypre_PCGFunctions * hypre_PCGFunctionsCreate( - void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), - HYPRE_Int (*Free) ( void *ptr ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCAlloc CAlloc, + hypre_KrylovPtrToFree Free, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_PCGFunctions * pcg_functions; @@ -214,22 +212,21 @@ hypre_PCGSetup( void *pcg_vdata, HYPRE_Real rtol = (pcg_data -> rtol); HYPRE_Int two_norm = (pcg_data -> two_norm); HYPRE_Int flex = (pcg_data -> flex); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (pcg_functions -> precond_setup); void *precond_data = (pcg_data -> precond_data); - void *precond_Mat = (pcg_data -> precond_Mat); + void *precond_Mat = (pcg_data -> precond_Mat); + hypre_KrylovPtrToPrecondSetup precond_setup = (pcg_functions -> precond_setup); HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("PCG-Setup"); - //set preconditioning matrix - if ((pcg_data -> precond_Mat) == NULL) + (pcg_data -> A) = A; + + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) { - (pcg_data -> precond_Mat) = A; - precond_Mat = (pcg_data -> precond_Mat) ; + precond_Mat = A; } - (pcg_data -> A) = A; - /*-------------------------------------------------- * The arguments for CreateVector are important to * maintain consistency between the setup and @@ -362,14 +359,13 @@ hypre_PCGSolve( void *pcg_vdata, void *r_old = (pcg_data -> r_old); void *v = (pcg_data -> v); void *matvec_data = (pcg_data -> matvec_data); - HYPRE_Int (*precond)(void*, void*, void*, void*) = (pcg_functions -> precond); void *precond_data = (pcg_data -> precond_data); - // preconditioning matrix - void *precond_Mat = (pcg_data -> precond_Mat) ; + void *precond_Mat = (pcg_data -> precond_Mat) ; // preconditioning matrix HYPRE_Int print_level = (pcg_data -> print_level); HYPRE_Int logging = (pcg_data -> logging); HYPRE_Real *norms = (pcg_data -> norms); HYPRE_Real *rel_norms = (pcg_data -> rel_norms); + hypre_KrylovPtrToPrecond precond = (pcg_functions -> precond); HYPRE_Real alpha, beta; HYPRE_Real delta = 0.0; @@ -395,6 +391,12 @@ hypre_PCGSolve( void *pcg_vdata, HYPRE_ANNOTATE_FUNC_BEGIN; hypre_GpuProfilingPushRange("PCG-Solve"); + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) + { + precond_Mat = A; + } + (pcg_data -> converged) = 0; (*(pcg_functions->CommInfo))(A, &my_id, &num_procs); @@ -1419,7 +1421,7 @@ HYPRE_Int hypre_PCGSetPrecondMatrix( void *pcg_vdata, void *precond_matrix ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; - (pcg_data -> precond_Mat) = precond_matrix; + (pcg_data -> precond_Mat) = precond_matrix; return hypre_error_flag; } From 6123cff6ecc084c55abe3f0d9a4d3f4a45fd51ca Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Fri, 26 Dec 2025 09:08:55 -0800 Subject: [PATCH 3/8] This fixes a couple of memory leaks due to refcount update --- src/parcsr_ls/par_add_cycle.c | 2 +- src/parcsr_mv/par_csr_matop.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/parcsr_ls/par_add_cycle.c b/src/parcsr_ls/par_add_cycle.c index 265adbbd35..fb76eb3754 100644 --- a/src/parcsr_ls/par_add_cycle.c +++ b/src/parcsr_ls/par_add_cycle.c @@ -1003,7 +1003,7 @@ HYPRE_Int hypre_CreateLambda(void *amg_vdata) hypre_ParAMGDataAtilde(amg_data) = Atilde; } - hypre_ParAMGDataLambda(amg_data) = Lambda; + hypre_ParAMGDataLambda(amg_data) = hypre_ParCSRMatrixRef(Lambda); hypre_ParAMGDataRtilde(amg_data) = Rtilde; hypre_ParAMGDataXtilde(amg_data) = Xtilde; diff --git a/src/parcsr_mv/par_csr_matop.c b/src/parcsr_mv/par_csr_matop.c index 8b354ddf79..d93b4cd72e 100644 --- a/src/parcsr_mv/par_csr_matop.c +++ b/src/parcsr_mv/par_csr_matop.c @@ -4165,7 +4165,7 @@ hypre_ParTMatmul( hypre_ParCSRMatrix *A, HYPRE_ANNOTATE_FUNC_END; - return C; + return hypre_ParCSRMatrixRef(C); } /*-------------------------------------------------------------------------- From bc1dfaf61c6a4cea04f5e968a2f3daeb8b66dc7b Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Fri, 26 Dec 2025 09:47:54 -0800 Subject: [PATCH 4/8] Fixed more memory leak issues related to refcount (should be all of them) --- src/parcsr_ls/par_add_cycle.c | 3 ++- src/parcsr_mv/par_csr_matop.c | 4 +++- src/parcsr_mv/par_csr_matrix.c | 2 ++ src/test/runtest.sh | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/parcsr_ls/par_add_cycle.c b/src/parcsr_ls/par_add_cycle.c index fb76eb3754..f31e8a2824 100644 --- a/src/parcsr_ls/par_add_cycle.c +++ b/src/parcsr_ls/par_add_cycle.c @@ -986,6 +986,7 @@ HYPRE_Int hypre_CreateLambda(void *amg_vdata) &L_comm_pkg); Lambda = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); + hypre_ParCSRMatrixRefCount(Lambda) = 1; hypre_ParCSRMatrixDiag(Lambda) = L_diag; hypre_ParCSRMatrixOffd(Lambda) = L_offd; hypre_ParCSRMatrixCommPkg(Lambda) = L_comm_pkg; @@ -1003,7 +1004,7 @@ HYPRE_Int hypre_CreateLambda(void *amg_vdata) hypre_ParAMGDataAtilde(amg_data) = Atilde; } - hypre_ParAMGDataLambda(amg_data) = hypre_ParCSRMatrixRef(Lambda); + hypre_ParAMGDataLambda(amg_data) = Lambda; hypre_ParAMGDataRtilde(amg_data) = Rtilde; hypre_ParAMGDataXtilde(amg_data) = Xtilde; diff --git a/src/parcsr_mv/par_csr_matop.c b/src/parcsr_mv/par_csr_matop.c index d93b4cd72e..15bedf1b9f 100644 --- a/src/parcsr_mv/par_csr_matop.c +++ b/src/parcsr_mv/par_csr_matop.c @@ -2130,6 +2130,7 @@ hypre_ParCSRMatrixTransposeHost( hypre_ParCSRMatrix *A, local_num_cols_AT = (HYPRE_Int)(col_starts_AT[1] - first_col_diag_AT); AT = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); + hypre_ParCSRMatrixRefCount(AT) = 1; hypre_ParCSRMatrixComm(AT) = comm; hypre_ParCSRMatrixDiag(AT) = AT_diag; hypre_ParCSRMatrixOffd(AT) = AT_offd; @@ -4021,6 +4022,7 @@ hypre_ParTMatmul( hypre_ParCSRMatrix *A, local_num_cols = (HYPRE_Int)(col_starts_B[1] - first_col_diag); C = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); + hypre_ParCSRMatrixRefCount(C) = 1; hypre_ParCSRMatrixComm(C) = comm; hypre_ParCSRMatrixGlobalNumRows(C) = ncols_A; hypre_ParCSRMatrixGlobalNumCols(C) = ncols_B; @@ -4165,7 +4167,7 @@ hypre_ParTMatmul( hypre_ParCSRMatrix *A, HYPRE_ANNOTATE_FUNC_END; - return hypre_ParCSRMatrixRef(C); + return C; } /*-------------------------------------------------------------------------- diff --git a/src/parcsr_mv/par_csr_matrix.c b/src/parcsr_mv/par_csr_matrix.c index b6d174eecd..9834d50225 100644 --- a/src/parcsr_mv/par_csr_matrix.c +++ b/src/parcsr_mv/par_csr_matrix.c @@ -824,6 +824,7 @@ hypre_ParCSRMatrixRead( MPI_Comm comm, } matrix = hypre_CTAlloc(hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); + hypre_ParCSRMatrixRefCount(matrix) = 1; hypre_ParCSRMatrixComm(matrix) = comm; hypre_ParCSRMatrixGlobalNumRows(matrix) = global_num_rows; @@ -2870,6 +2871,7 @@ hypre_ParCSRMatrixUnion( hypre_ParCSRMatrix *A, hypre_MPI_Comm_rank(comm, &my_id); C = hypre_CTAlloc( hypre_ParCSRMatrix, 1, HYPRE_MEMORY_HOST); + hypre_ParCSRMatrixRefCount(C) = 1; hypre_ParCSRMatrixComm( C ) = hypre_ParCSRMatrixComm( A ); hypre_ParCSRMatrixGlobalNumRows( C ) = hypre_ParCSRMatrixGlobalNumRows( A ); hypre_ParCSRMatrixGlobalNumCols( C ) = hypre_ParCSRMatrixGlobalNumCols( A ); diff --git a/src/test/runtest.sh b/src/test/runtest.sh index 974a32f688..3357eeee73 100755 --- a/src/test/runtest.sh +++ b/src/test/runtest.sh @@ -514,7 +514,7 @@ do ;; -valgrind) shift - Valgrind="valgrind -q --suppressions=`pwd`/runtest.valgrind --track-origins=yes --leak-check=full --show-leak-kinds=all" + Valgrind="valgrind -q --suppressions=`pwd`/runtest.valgrind --leak-check=full --track-origins=yes --show-reachable=yes" ;; -cudamemcheck) shift From bac319920c7defb5009914cf5ba7c460878af6b9 Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Fri, 26 Dec 2025 16:13:01 -0600 Subject: [PATCH 5/8] Made remaining precond_Mat changes and cleaned up krylov solvers --- src/krylov/_hypre_krylov.h | 8 ++--- src/krylov/_hypre_krylov_mup.h | 12 +++---- src/krylov/bicgstab.c | 54 +++++++++++++++--------------- src/krylov/bicgstab.h | 4 +-- src/krylov/cgnr.c | 45 ++++++++++++------------- src/krylov/cogmres.c | 52 ++++++++++++++--------------- src/krylov/flexgmres.c | 46 +++++++++++++------------- src/krylov/gmres.c | 60 ++++++++++++++++++---------------- src/krylov/gmres.h | 4 +-- src/krylov/lgmres.c | 42 ++++++++++++------------ src/krylov/mup_fixed.c | 8 ++--- src/krylov/pcg.c | 10 +++--- 12 files changed, 168 insertions(+), 177 deletions(-) diff --git a/src/krylov/_hypre_krylov.h b/src/krylov/_hypre_krylov.h index b6c7cc47c0..308acd07e3 100644 --- a/src/krylov/_hypre_krylov.h +++ b/src/krylov/_hypre_krylov.h @@ -211,8 +211,8 @@ hypre_BiCGSTABFunctionsCreate( hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, - hypre_KrylovPtrToPrecond Precond, - hypre_KrylovPtrToPrecondSetup PrecondSetup + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ); /** @@ -518,8 +518,8 @@ hypre_GMRESFunctionsCreate( hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, - hypre_KrylovPtrToPrecond Precond, - hypre_KrylovPtrToPrecondSetup PrecondSetup + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ); /** diff --git a/src/krylov/_hypre_krylov_mup.h b/src/krylov/_hypre_krylov_mup.h index 15cb6a9abd..5f2617e734 100644 --- a/src/krylov/_hypre_krylov_mup.h +++ b/src/krylov/_hypre_krylov_mup.h @@ -35,11 +35,11 @@ HYPRE_Int hypre_BiCGSTABDestroy_long_dbl( void *bicgstab_vdata ); hypre_BiCGSTABFunctions * -hypre_BiCGSTABFunctionsCreate_flt( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_BiCGSTABFunctionsCreate_flt( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); hypre_BiCGSTABFunctions * -hypre_BiCGSTABFunctionsCreate_dbl( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_BiCGSTABFunctionsCreate_dbl( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); hypre_BiCGSTABFunctions * -hypre_BiCGSTABFunctionsCreate_long_dbl( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_BiCGSTABFunctionsCreate_long_dbl( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); HYPRE_Int hypre_BiCGSTABGetConverged_flt( void *bicgstab_vdata, HYPRE_Int *converged ); @@ -756,11 +756,11 @@ HYPRE_Int hypre_GMRESDestroy_long_dbl( void *gmres_vdata ); hypre_GMRESFunctions * -hypre_GMRESFunctionsCreate_flt( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_GMRESFunctionsCreate_flt( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); hypre_GMRESFunctions * -hypre_GMRESFunctionsCreate_dbl( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_GMRESFunctionsCreate_dbl( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); hypre_GMRESFunctions * -hypre_GMRESFunctionsCreate_long_dbl( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ); +hypre_GMRESFunctionsCreate_long_dbl( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ); HYPRE_Int hypre_GMRESGetAbsoluteTol_flt( void *gmres_vdata, hypre_float *a_tol ); diff --git a/src/krylov/bicgstab.c b/src/krylov/bicgstab.c index 79e57c6ce9..29fc9e14f1 100644 --- a/src/krylov/bicgstab.c +++ b/src/krylov/bicgstab.c @@ -20,21 +20,19 @@ hypre_BiCGSTABFunctions * hypre_BiCGSTABFunctionsCreate( - void * (*CreateVector) ( void *vvector ), - HYPRE_Int (*DestroyVector) ( void *vvector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_BiCGSTABFunctions * bicgstab_functions; @@ -149,22 +147,20 @@ hypre_BiCGSTABSetup( void *bicgstab_vdata, hypre_BiCGSTABFunctions *bicgstab_functions = bicgstab_data->functions; HYPRE_Int max_iter = (bicgstab_data -> max_iter); - HYPRE_Int (*precond_setup)(void*, void*, void*, - void*) = (bicgstab_functions -> precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (bicgstab_functions -> precond_setup); void *precond_data = (bicgstab_data -> precond_data); void *precond_Mat = (bicgstab_data -> precond_Mat); HYPRE_ANNOTATE_FUNC_BEGIN; - //set preconditioning matrix - if ((bicgstab_data -> precond_Mat) == NULL) + (bicgstab_data -> A) = A; + + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) { - (bicgstab_data -> precond_Mat) = A; - precond_Mat = (bicgstab_data -> precond_Mat) ; + precond_Mat = A; } - (bicgstab_data -> A) = A; - /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and @@ -258,7 +254,7 @@ hypre_BiCGSTABSolve(void *bicgstab_vdata, void *p = (bicgstab_data -> p); void *q = (bicgstab_data -> q); - HYPRE_Int (*precond)(void*, void*, void*, void*) = (bicgstab_functions -> precond); + hypre_KrylovPtrToPrecond precond = (bicgstab_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(bicgstab_data -> precond_data); // preconditioning matrix void *precond_Mat = (bicgstab_data -> precond_Mat) ; @@ -285,6 +281,12 @@ hypre_BiCGSTABSolve(void *bicgstab_vdata, HYPRE_ANNOTATE_FUNC_BEGIN; + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) + { + precond_Mat = A; + } + (bicgstab_data -> converged) = 0; (*(bicgstab_functions->CommInfo))(A, &my_id, &num_procs); @@ -683,8 +685,8 @@ hypre_BiCGSTABSetStopCrit( void *bicgstab_vdata, HYPRE_Int hypre_BiCGSTABSetPrecond( void *bicgstab_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_BiCGSTABData *bicgstab_data = (hypre_BiCGSTABData *)bicgstab_vdata; diff --git a/src/krylov/bicgstab.h b/src/krylov/bicgstab.h index a161acc747..ab38ccf2a8 100644 --- a/src/krylov/bicgstab.h +++ b/src/krylov/bicgstab.h @@ -138,8 +138,8 @@ hypre_BiCGSTABFunctionsCreate( hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, - hypre_KrylovPtrToPrecond Precond, - hypre_KrylovPtrToPrecondSetup PrecondSetup + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ); /** diff --git a/src/krylov/cgnr.c b/src/krylov/cgnr.c index 599fed2e66..8f10c42200 100644 --- a/src/krylov/cgnr.c +++ b/src/krylov/cgnr.c @@ -20,24 +20,21 @@ hypre_CGNRFunctions * hypre_CGNRFunctionsCreate( - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecT) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*PrecondT) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecT MatvecT, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond, + hypre_KrylovPtrToPrecondT PrecondT ) { hypre_CGNRFunctions * cgnr_functions; @@ -144,7 +141,7 @@ hypre_CGNRSetup(void *cgnr_vdata, hypre_CGNRFunctions *cgnr_functions = cgnr_data->functions; HYPRE_Int max_iter = (cgnr_data -> max_iter); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (cgnr_functions -> precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (cgnr_functions -> precond_setup); void *precond_data = (cgnr_data -> precond_data); HYPRE_Int ierr = 0; @@ -203,8 +200,8 @@ hypre_CGNRSolve(void *cgnr_vdata, void *r = (cgnr_data -> r); void *t = (cgnr_data -> t); void *matvec_data = (cgnr_data -> matvec_data); - HYPRE_Int (*precond)(void*, void*, void*, void*) = (cgnr_functions -> precond); - HYPRE_Int (*precondT)(void*, void*, void*, void*) = (cgnr_functions -> precondT); + hypre_KrylovPtrToPrecond precond = (cgnr_functions -> precond); + hypre_KrylovPtrToPrecondT precondT = (cgnr_functions -> precondT); void *precond_data = (cgnr_data -> precond_data); HYPRE_Int logging = (cgnr_data -> logging); HYPRE_Real *norms = (cgnr_data -> norms); @@ -523,9 +520,9 @@ hypre_CGNRSetStopCrit( void *cgnr_vdata, HYPRE_Int hypre_CGNRSetPrecond(void *cgnr_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precondT)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondT precondT, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_CGNRData *cgnr_data = (hypre_CGNRData *)cgnr_vdata; diff --git a/src/krylov/cogmres.c b/src/krylov/cogmres.c index 38639a0453..c514298d92 100644 --- a/src/krylov/cogmres.c +++ b/src/krylov/cogmres.c @@ -20,29 +20,25 @@ hypre_COGMRESFunctions * hypre_COGMRESFunctionsCreate( - void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), - HYPRE_Int (*Free) ( void *ptr ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*MassInnerProd) (void *x, void **y, HYPRE_Int k, HYPRE_Int unroll, void *result), - HYPRE_Int (*MassDotpTwo) (void *x, void *y, void **z, HYPRE_Int k, HYPRE_Int unroll, - void *result_x, void *result_y), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*MassAxpy) ( HYPRE_Complex *alpha, void **x, void *y, HYPRE_Int k, - HYPRE_Int unroll), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCAlloc CAlloc, + hypre_KrylovPtrToFree Free, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToCreateVectorArray CreateVectorArray, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToMassInnerProd MassInnerProd, + hypre_KrylovPtrToMassDotpTwo MassDotpTwo, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToMassAxpy MassAxpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_COGMRESFunctions * cogmres_functions; @@ -203,7 +199,7 @@ hypre_COGMRESSetup( void *cogmres_vdata, HYPRE_Int k_dim = (cogmres_data -> k_dim); HYPRE_Int max_iter = (cogmres_data -> max_iter); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (cogmres_functions->precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (cogmres_functions->precond_setup); void *precond_data = (cogmres_data -> precond_data); HYPRE_Int rel_change = (cogmres_data -> rel_change); @@ -302,7 +298,7 @@ hypre_COGMRESSolve(void *cogmres_vdata, void **p = (cogmres_data -> p); - HYPRE_Int (*precond)(void*, void*, void*, void*) = (cogmres_functions -> precond); + hypre_KrylovPtrToPrecond precond = (cogmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(cogmres_data -> precond_data); HYPRE_Int print_level = (cogmres_data -> print_level); @@ -1138,8 +1134,8 @@ hypre_COGMRESGetSkipRealResidualCheck( void *cogmres_vdata, HYPRE_Int hypre_COGMRESSetPrecond( void *cogmres_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; @@ -1249,7 +1245,7 @@ hypre_COGMRESGetFinalRelativeResidualNorm( void *cogmres_vdata, HYPRE_Int hypre_COGMRESSetModifyPC(void *cogmres_vdata, - HYPRE_Int (*modify_pc)(void *precond_data, HYPRE_Int iteration, HYPRE_Real rel_residual_norm)) + hypre_KrylovPtrToModifyPC modify_pc) { hypre_COGMRESData *cogmres_data = (hypre_COGMRESData *)cogmres_vdata; hypre_COGMRESFunctions *cogmres_functions = cogmres_data->functions; diff --git a/src/krylov/flexgmres.c b/src/krylov/flexgmres.c index 062cc368f7..0a08d42b44 100644 --- a/src/krylov/flexgmres.c +++ b/src/krylov/flexgmres.c @@ -20,24 +20,22 @@ hypre_FlexGMRESFunctions * hypre_FlexGMRESFunctionsCreate( - void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), - HYPRE_Int (*Free) ( void *ptr ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCAlloc CAlloc, + hypre_KrylovPtrToFree Free, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToCreateVectorArray CreateVectorArray, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_FlexGMRESFunctions * fgmres_functions; @@ -210,7 +208,7 @@ hypre_FlexGMRESSetup( void *fgmres_vdata, HYPRE_Int k_dim = (fgmres_data -> k_dim); HYPRE_Int max_iter = (fgmres_data -> max_iter); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (fgmres_functions->precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (fgmres_functions->precond_setup); void *precond_data = (fgmres_data -> precond_data); HYPRE_Int rel_change = (fgmres_data -> rel_change); @@ -311,7 +309,7 @@ hypre_FlexGMRESSolve(void *fgmres_vdata, void **pre_vecs = (fgmres_data ->pre_vecs); /*---*/ - HYPRE_Int (*precond)(void*, void*, void*, void*) = (fgmres_functions -> precond); + hypre_KrylovPtrToPrecond precond = (fgmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(fgmres_data -> precond_data); HYPRE_Int print_level = (fgmres_data -> print_level); @@ -334,7 +332,7 @@ hypre_FlexGMRESSolve(void *fgmres_vdata, HYPRE_Real weight; HYPRE_Real r_norm_0; - HYPRE_Int (*modify_pc)(void*, HYPRE_Int, HYPRE_Real) = (fgmres_functions -> modify_pc); + hypre_KrylovPtrToModifyPC modify_pc = (fgmres_functions -> modify_pc); /* We are not checking rel. change for now... */ @@ -961,8 +959,8 @@ hypre_FlexGMRESGetStopCrit( void *fgmres_vdata, HYPRE_Int hypre_FlexGMRESSetPrecond( void *fgmres_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; @@ -1101,7 +1099,7 @@ hypre_FlexGMRESGetFinalRelativeResidualNorm( void *fgmres_vdata, HYPRE_Int hypre_FlexGMRESSetModifyPC(void *fgmres_vdata, - HYPRE_Int (*modify_pc)(void*, HYPRE_Int, HYPRE_Real)) + hypre_KrylovPtrToModifyPC modify_pc) { hypre_FlexGMRESData *fgmres_data = (hypre_FlexGMRESData *)fgmres_vdata; hypre_FlexGMRESFunctions *fgmres_functions = fgmres_data->functions; diff --git a/src/krylov/gmres.c b/src/krylov/gmres.c index fcae92fd2e..f3a92105bb 100644 --- a/src/krylov/gmres.c +++ b/src/krylov/gmres.c @@ -20,25 +20,22 @@ hypre_GMRESFunctions * hypre_GMRESFunctionsCreate( - void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), - HYPRE_Int (*Free) ( void *ptr ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Int (*InnerProd) ( void *x, void *y, HYPRE_Int *num_tags_ptr, - HYPRE_Complex **iprod_ptr ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCAlloc CAlloc, + hypre_KrylovPtrToFree Free, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToCreateVectorArray CreateVectorArray, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProdTagged InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_GMRESFunctions * gmres_functions; @@ -195,19 +192,18 @@ hypre_GMRESSetup( void *gmres_vdata, void *precond_Mat = (gmres_data -> precond_Mat); HYPRE_Int rel_change = (gmres_data -> rel_change); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (gmres_functions->precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (gmres_functions->precond_setup); HYPRE_ANNOTATE_FUNC_BEGIN; - //set preconditioning matrix - if ((gmres_data -> precond_Mat) == NULL) + (gmres_data -> A) = A; + + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) { - (gmres_data -> precond_Mat) = A; - precond_Mat = (gmres_data -> precond_Mat) ; + precond_Mat = A; } - (gmres_data -> A) = A; - /*-------------------------------------------------- * The arguments for NewVector are important to * maintain consistency between the setup and @@ -314,7 +310,7 @@ hypre_GMRESSolve(void *gmres_vdata, void *w_3 = (gmres_data -> w_3); void **p = (gmres_data -> p); - HYPRE_Int (*precond)(void*, void*, void*, void*) = (gmres_functions -> precond); + hypre_KrylovPtrToPrecond precond = (gmres_functions -> precond); void *precond_data = (gmres_data -> precond_data); // preconditioning matrix void *precond_Mat = (gmres_data -> precond_Mat) ; @@ -351,6 +347,12 @@ hypre_GMRESSolve(void *gmres_vdata, HYPRE_ANNOTATE_FUNC_BEGIN; + // if a preconditioning matrix has not been set, use A + if (precond_Mat == NULL) + { + precond_Mat = A; + } + (gmres_data -> converged) = 0; /*----------------------------------------------------------------------- * With relative change convergence test on, it is possible to attempt @@ -1454,8 +1456,8 @@ hypre_GMRESGetStopCrit( void *gmres_vdata, HYPRE_Int hypre_GMRESSetPrecond( void *gmres_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_GMRESData *gmres_data = (hypre_GMRESData *)gmres_vdata; diff --git a/src/krylov/gmres.h b/src/krylov/gmres.h index a5f22dc320..5646e38419 100644 --- a/src/krylov/gmres.h +++ b/src/krylov/gmres.h @@ -143,8 +143,8 @@ hypre_GMRESFunctionsCreate( hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, - hypre_KrylovPtrToPrecond Precond, - hypre_KrylovPtrToPrecondSetup PrecondSetup + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ); /** diff --git a/src/krylov/lgmres.c b/src/krylov/lgmres.c index c0f5349144..259b5d7a22 100644 --- a/src/krylov/lgmres.c +++ b/src/krylov/lgmres.c @@ -20,24 +20,22 @@ hypre_LGMRESFunctions * hypre_LGMRESFunctionsCreate( - void * (*CAlloc) ( size_t count, size_t elt_size, HYPRE_MemoryLocation location ), - HYPRE_Int (*Free) ( void *ptr ), - HYPRE_Int (*CommInfo) ( void *A, HYPRE_Int *my_id, - HYPRE_Int *num_procs ), - void * (*CreateVector) ( void *vector ), - void * (*CreateVectorArray) ( HYPRE_Int size, void *vectors ), - HYPRE_Int (*DestroyVector) ( void *vector ), - void * (*MatvecCreate) ( void *A, void *x ), - HYPRE_Int (*Matvec) ( void *matvec_data, HYPRE_Complex alpha, void *A, - void *x, HYPRE_Complex beta, void *y ), - HYPRE_Int (*MatvecDestroy) ( void *matvec_data ), - HYPRE_Real (*InnerProd) ( void *x, void *y ), - HYPRE_Int (*CopyVector) ( void *x, void *y ), - HYPRE_Int (*ClearVector) ( void *x ), - HYPRE_Int (*ScaleVector) ( HYPRE_Complex alpha, void *x ), - HYPRE_Int (*Axpy) ( HYPRE_Complex alpha, void *x, void *y ), - HYPRE_Int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), - HYPRE_Int (*Precond) ( void *vdata, void *A, void *b, void *x ) + hypre_KrylovPtrToCAlloc CAlloc, + hypre_KrylovPtrToFree Free, + hypre_KrylovPtrToCommInfo CommInfo, + hypre_KrylovPtrToCreateVector CreateVector, + hypre_KrylovPtrToCreateVectorArray CreateVectorArray, + hypre_KrylovPtrToDestroyVector DestroyVector, + hypre_KrylovPtrToMatvecCreate MatvecCreate, + hypre_KrylovPtrToMatvec Matvec, + hypre_KrylovPtrToMatvecDestroy MatvecDestroy, + hypre_KrylovPtrToInnerProd InnerProd, + hypre_KrylovPtrToCopyVector CopyVector, + hypre_KrylovPtrToClearVector ClearVector, + hypre_KrylovPtrToScaleVector ScaleVector, + hypre_KrylovPtrToAxpy Axpy, + hypre_KrylovPtrToPrecondSetup PrecondSetup, + hypre_KrylovPtrToPrecond Precond ) { hypre_LGMRESFunctions * lgmres_functions; @@ -227,7 +225,7 @@ hypre_LGMRESSetup( void *lgmres_vdata, HYPRE_Int k_dim = (lgmres_data -> k_dim); HYPRE_Int max_iter = (lgmres_data -> max_iter); - HYPRE_Int (*precond_setup)(void*, void*, void*, void*) = (lgmres_functions->precond_setup); + hypre_KrylovPtrToPrecondSetup precond_setup = (lgmres_functions->precond_setup); void *precond_data = (lgmres_data -> precond_data); HYPRE_Int rel_change = (lgmres_data -> rel_change); @@ -356,7 +354,7 @@ hypre_LGMRESSolve(void *lgmres_vdata, HYPRE_Real tmp_norm, r_norm_last; /*---*/ - HYPRE_Int (*precond)(void*, void*, void*, void*) = (lgmres_functions -> precond); + hypre_KrylovPtrToPrecond precond = (lgmres_functions -> precond); HYPRE_Int *precond_data = (HYPRE_Int*)(lgmres_data -> precond_data); HYPRE_Int print_level = (lgmres_data -> print_level); @@ -1174,8 +1172,8 @@ hypre_LGMRESGetStopCrit( void *lgmres_vdata, HYPRE_Int hypre_LGMRESSetPrecond( void *lgmres_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_LGMRESData *lgmres_data = (hypre_LGMRESData *)lgmres_vdata; diff --git a/src/krylov/mup_fixed.c b/src/krylov/mup_fixed.c index c4bc74a5b3..32fd963e1f 100644 --- a/src/krylov/mup_fixed.c +++ b/src/krylov/mup_fixed.c @@ -33,9 +33,9 @@ hypre_BiCGSTABDestroy( void *bicgstab_vdata ) /*--------------------------------------------------------------------------*/ hypre_BiCGSTABFunctions * -hypre_BiCGSTABFunctionsCreate( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ) +hypre_BiCGSTABFunctionsCreate( hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProd InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ) { - return HYPRE_CURRENTPRECISION_FUNC(hypre_BiCGSTABFunctionsCreate)( CreateVector, DestroyVector, MatvecCreate, Matvec, MatvecDestroy, InnerProd, CopyVector, ClearVector, ScaleVector, Axpy, CommInfo, Precond, PrecondSetup ); + return HYPRE_CURRENTPRECISION_FUNC(hypre_BiCGSTABFunctionsCreate)( CreateVector, DestroyVector, MatvecCreate, Matvec, MatvecDestroy, InnerProd, CopyVector, ClearVector, ScaleVector, Axpy, CommInfo, PrecondSetup, Precond ); } /*--------------------------------------------------------------------------*/ @@ -857,9 +857,9 @@ hypre_GMRESDestroy( void *gmres_vdata ) /*--------------------------------------------------------------------------*/ hypre_GMRESFunctions * -hypre_GMRESFunctionsCreate( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecond Precond, hypre_KrylovPtrToPrecondSetup PrecondSetup ) +hypre_GMRESFunctionsCreate( hypre_KrylovPtrToCAlloc CAlloc, hypre_KrylovPtrToFree Free, hypre_KrylovPtrToCommInfo CommInfo, hypre_KrylovPtrToCreateVector CreateVector, hypre_KrylovPtrToCreateVectorArray CreateVectorArray, hypre_KrylovPtrToDestroyVector DestroyVector, hypre_KrylovPtrToMatvecCreate MatvecCreate, hypre_KrylovPtrToMatvec Matvec, hypre_KrylovPtrToMatvecDestroy MatvecDestroy, hypre_KrylovPtrToInnerProdTagged InnerProd, hypre_KrylovPtrToCopyVector CopyVector, hypre_KrylovPtrToClearVector ClearVector, hypre_KrylovPtrToScaleVector ScaleVector, hypre_KrylovPtrToAxpy Axpy, hypre_KrylovPtrToPrecondSetup PrecondSetup, hypre_KrylovPtrToPrecond Precond ) { - return HYPRE_CURRENTPRECISION_FUNC(hypre_GMRESFunctionsCreate)( CAlloc, Free, CommInfo, CreateVector, CreateVectorArray, DestroyVector, MatvecCreate, Matvec, MatvecDestroy, InnerProd, CopyVector, ClearVector, ScaleVector, Axpy, Precond, PrecondSetup ); + return HYPRE_CURRENTPRECISION_FUNC(hypre_GMRESFunctionsCreate)( CAlloc, Free, CommInfo, CreateVector, CreateVectorArray, DestroyVector, MatvecCreate, Matvec, MatvecDestroy, InnerProd, CopyVector, ClearVector, ScaleVector, Axpy, PrecondSetup, Precond ); } /*--------------------------------------------------------------------------*/ diff --git a/src/krylov/pcg.c b/src/krylov/pcg.c index fcf6a3490f..698ef828f1 100644 --- a/src/krylov/pcg.c +++ b/src/krylov/pcg.c @@ -1399,8 +1399,8 @@ hypre_PCGGetPrecond( void *pcg_vdata, HYPRE_Int hypre_PCGSetPrecond( void *pcg_vdata, - HYPRE_Int (*precond)(void*, void*, void*, void*), - HYPRE_Int (*precond_setup)(void*, void*, void*, void*), + hypre_KrylovPtrToPrecond precond, + hypre_KrylovPtrToPrecondSetup precond_setup, void *precond_data ) { hypre_PCGData *pcg_data = (hypre_PCGData *)pcg_vdata; @@ -1451,10 +1451,8 @@ hypre_PCGSetPreconditioner(void *pcg_vdata, (pcg_data -> precond_data) = precond_data; - (pcg_functions -> precond) = (HYPRE_Int (*)(void*, void*, void*, - void*)) hypre_SolverSolve(base); - (pcg_functions -> precond_setup) = (HYPRE_Int (*)(void*, void*, void*, - void*)) hypre_SolverSetup(base); + (pcg_functions -> precond) = (hypre_KrylovPtrToPrecond) hypre_SolverSolve(base); + (pcg_functions -> precond_setup) = (hypre_KrylovPtrToPrecondSetup) hypre_SolverSetup(base); return hypre_error_flag; } From 132ad942ddc67607530fec620d397dea2ebc24a0 Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Fri, 26 Dec 2025 18:12:36 -0800 Subject: [PATCH 6/8] Updating TEST_error/error.sh saved file --- src/test/TEST_error/error.saved | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/test/TEST_error/error.saved b/src/test/TEST_error/error.saved index 971724535c..7db9530335 100644 --- a/src/test/TEST_error/error.saved +++ b/src/test/TEST_error/error.saved @@ -80,13 +80,13 @@ Iters ||r||_2 conv.rate ||r||_2/||b||_2 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 0: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors -0: hypre error in file "pcg.c", line 1010, error code = 256 - Reached max iterations 2 in PCG before convergence -0: hypre error in file "pcg.c", line 1010, error code = 256 - Reached max iterations 2 in PCG before convergence -0: hypre error in file "pcg.c", line 1010, error code = 256 - Reached max iterations 2 in PCG before convergence -0: hypre error in file "pcg.c", line 1010, error code = 256 - Reached max iterations 2 in PCG before convergence -0: hypre error in file "pcg.c", line 869, error code = 256 - Negative or zero gamma value in PCG -0: hypre error in file "pcg.c", line 869, error code = 256 - Negative or zero gamma value in PCG -0: hypre error in file "pcg.c", line 869, error code = 256 - Negative or zero gamma value in PCG +0: hypre error in file "pcg.c", line 1012, error code = 256 - Reached max iterations 2 in PCG before convergence +0: hypre error in file "pcg.c", line 1012, error code = 256 - Reached max iterations 2 in PCG before convergence +0: hypre error in file "pcg.c", line 1012, error code = 256 - Reached max iterations 2 in PCG before convergence +0: hypre error in file "pcg.c", line 1012, error code = 256 - Reached max iterations 2 in PCG before convergence +0: hypre error in file "pcg.c", line 871, error code = 256 - Negative or zero gamma value in PCG +0: hypre error in file "pcg.c", line 871, error code = 256 - Negative or zero gamma value in PCG +0: hypre error in file "pcg.c", line 871, error code = 256 - Negative or zero gamma value in PCG 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors 1: hypre error in file "par_relax.c", line 753, error code = 1 - Hybrid GS relaxation doesn't support multicomponent vectors From 776b5fd366ca3aa9540a0ccaf9624179d5b48e1d Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Tue, 30 Dec 2025 13:31:13 -0600 Subject: [PATCH 7/8] Calling internal routines for AMSFEI functions (not supporting the external functions) --- src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx | 11 +++++------ src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx | 2 +- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx b/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx index 02cb71cd4b..f21b06af93 100644 --- a/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx +++ b/src/FEI_mv/fei-hypre/HYPRE_LSC_aux.cxx @@ -4288,20 +4288,19 @@ void HYPRE_LinSysCore::setupPreconAMS() HYPRE_IJVectorGetObject(currX_, (void **) &x_csr); if( amsG_ == NULL ) { - //Old way of doing things //only works for 1 domain per processor (in ALE3D) //not compatible with contact - HYPRE_AMSFEISetup(HYPrecon_, + hypre_AMSFEISetup(HYPrecon_, A_csr, b_csr, x_csr, - AMSData_.EdgeNodeList_, + AMSData_.numNodes_, + AMSData_.numLocalNodes_, AMSData_.NodeNumbers_, + AMSData_.NodalCoord_, AMSData_.numEdges_, - AMSData_.numLocalNodes_, - AMSData_.numNodes_, - AMSData_.NodalCoord_); + AMSData_.EdgeNodeList_); } else { //New Code// HYPRE_ParCSRMatrix G_csr; diff --git a/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx b/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx index 769d6f3d58..38850f08dc 100644 --- a/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx +++ b/src/FEI_mv/fei-hypre/HYPRE_LinSysCore.cxx @@ -553,7 +553,7 @@ HYPRE_LinSysCore::~HYPRE_LinSysCore() // Destroy G and coordinate vectors // OLD WAY if( amsG_ == NULL ) { - HYPRE_AMSFEIDestroy( HYPrecon_ ); + hypre_AMSFEIDestroy( HYPrecon_ ); } HYPRE_AMSDestroy( HYPrecon_ ); } From fd8d2f3d4814d412a4a5a604906c9987ad488c4b Mon Sep 17 00:00:00 2001 From: Rob Falgout Date: Mon, 5 Jan 2026 08:30:02 -0600 Subject: [PATCH 8/8] Changed 'diagscale.c' to 'diag_scale.c' to avoid filename conflicts with Visual Studio --- src/struct_ls/CMakeLists.txt | 6 +++--- src/struct_ls/Makefile | 2 +- src/struct_ls/_hypre_struct_ls.h | 2 +- src/struct_ls/{diagscale.c => diag_scale.c} | 0 src/struct_ls/protos.h | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) rename src/struct_ls/{diagscale.c => diag_scale.c} (100%) diff --git a/src/struct_ls/CMakeLists.txt b/src/struct_ls/CMakeLists.txt index 32e7014aaa..322cc3216b 100644 --- a/src/struct_ls/CMakeLists.txt +++ b/src/struct_ls/CMakeLists.txt @@ -22,7 +22,7 @@ endif() # Regular sources set(REGULAR_SRCS cyclic_reduction.c - diagscale.c + diag_scale.c F90_HYPRE_struct_bicgstab.c F90_HYPRE_struct_cycred.c F90_HYPRE_struct_flexgmres.c @@ -61,7 +61,7 @@ set(REGULAR_SRCS smg_setup_restrict.c smg_solve.c cyclic_reduction.c - diagscale.c + diag_scale.c HYPRE_struct_int.c HYPRE_struct_pcg.c pfmg2_setup_rap.c @@ -105,7 +105,7 @@ endif() if (HYPRE_USING_GPU) set(GPU_SRCS cyclic_reduction.c - diagscale.c + diag_scale.c jacobi.c HYPRE_struct_int.c HYPRE_struct_pcg.c diff --git a/src/struct_ls/Makefile b/src/struct_ls/Makefile index 19a530b08f..55002f555b 100644 --- a/src/struct_ls/Makefile +++ b/src/struct_ls/Makefile @@ -62,7 +62,7 @@ CUFILES =\ HYPRE_struct_int.c\ HYPRE_struct_pcg.c\ cyclic_reduction.c\ - diagscale.c\ + diag_scale.c\ jacobi.c\ pfmg2_setup_rap.c\ pfmg3_setup_rap.c\ diff --git a/src/struct_ls/_hypre_struct_ls.h b/src/struct_ls/_hypre_struct_ls.h index 954add4607..55516553dc 100644 --- a/src/struct_ls/_hypre_struct_ls.h +++ b/src/struct_ls/_hypre_struct_ls.h @@ -73,7 +73,7 @@ HYPRE_Int hypre_HybridSetup ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_S HYPRE_Int hypre_HybridSolve ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); -/* diagscale.c */ +/* diag_scale.c */ HYPRE_Int hypre_StructDiagScale( hypre_StructMatrix *A, hypre_StructVector *y, hypre_StructVector *x ); diff --git a/src/struct_ls/diagscale.c b/src/struct_ls/diag_scale.c similarity index 100% rename from src/struct_ls/diagscale.c rename to src/struct_ls/diag_scale.c diff --git a/src/struct_ls/protos.h b/src/struct_ls/protos.h index c32fefc0e3..dedaab9298 100644 --- a/src/struct_ls/protos.h +++ b/src/struct_ls/protos.h @@ -51,7 +51,7 @@ HYPRE_Int hypre_HybridSetup ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_S HYPRE_Int hypre_HybridSolve ( void *hybrid_vdata, hypre_StructMatrix *A, hypre_StructVector *b, hypre_StructVector *x ); -/* diagscale.c */ +/* diag_scale.c */ HYPRE_Int hypre_StructDiagScale( hypre_StructMatrix *A, hypre_StructVector *y, hypre_StructVector *x );