#include "cs_defs.h"
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <bft_error.h>
#include <bft_mem.h>
#include <bft_printf.h>
#include "cs_fp_exception.h"
#include "cs_log.h"
#include "cs_multigrid.h"
#include "cs_sles.h"
#include "cs_sles_petsc.h"
#include "cs_sles_hypre.h"
#include "cs_param_sles.h"
Functions | |
static bool | _system_should_be_sym (cs_param_itsol_type_t solver) |
Return true if the prescribed solver implies a symmetric linear system. | |
static void | _petsc_cmd (bool use_prefix, const char *prefix, const char *keyword, const char *keyval) |
Set the command line option for PETSc. | |
static void | _petsc_bilu0_hook (const char *prefix) |
Predefined settings for a block ILU(0) with PETSc. | |
static void | _petsc_bicc0_hook (const char *prefix) |
Predefined settings for a block ICC(0) with PETSc. | |
static void | _petsc_bssor_hook (const char *prefix) |
Predefined settings for a block SSOR with PETSc. | |
static void | _petsc_pcgamg_hook (const char *prefix, const cs_param_sles_t *slesp, bool is_symm, PC pc) |
Predefined settings for GAMG as a preconditioner even if another settings have been defined. One assumes that one really wants to use GAMG (may be HYPRE is not available) | |
static void | _petsc_pchypre_hook (const char *prefix, const cs_param_sles_t *slesp, bool is_symm, PC pc) |
Predefined settings for BoomerAMG in HYPRE as a preconditioner. | |
static void | _petsc_set_pc_type (cs_param_sles_t *slesp, KSP ksp) |
Set command line options for PC according to the kind of preconditionner. | |
static void | _petsc_set_krylov_solver (cs_param_sles_t *slesp, KSP ksp) |
Set PETSc solver. | |
static void | _petsc_setup_hook (void *context, void *ksp_struct) |
Set PETSc solver and preconditioner. | |
static void | _petsc_common_block_hook (const cs_param_sles_t *slesp, KSP ksp) |
Common settings for block preconditioning (when a system is split according to the Cartesian components: x,y,z) | |
static void | _petsc_amg_block_gamg_hook (void *context, void *ksp_struct) |
Function pointer: setup hook for setting PETSc solver and preconditioner. Case of multiplicative AMG block preconditioner for a CG with GAMG as AMG type. | |
static void | _petsc_block_hook (void *context, void *ksp_struct) |
Function pointer: setup hook for setting PETSc solver and preconditioner. Case of block preconditioner. | |
static void | _check_settings (cs_param_sles_t *slesp) |
Check if the settings are consitent. Can apply minor modifications. | |
static int | _get_poly_degree (const cs_param_sles_t *slesp) |
Retrieve the value of the polynomial degree to consider according to the settings. Only for in-house solvers. | |
static void | _set_saturne_sles (bool use_field_id, cs_param_sles_t *slesp) |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of saturne's own solvers. | |
static void | _set_mumps_sles (bool use_field_id, cs_param_sles_t *slesp) |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of MUMPS's own solvers. | |
static void | _set_petsc_hypre_sles (bool use_field_id, cs_param_sles_t *slesp) |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of PETSc and Hypre families of solvers. | |
static HYPRE_Solver | _set_hypre_solver (cs_param_sles_t *slesp, HYPRE_Solver hs) |
Set the solver when HYPRE is used Check HYPRE documentation for available options: https://hypre.readthedocs.io/en/latest/index.html. | |
static void | _hypre_boomeramg_hook (int verbosity, void *context, void *solver_p) |
Setup hook function for a Hypre KSP solver with preconditioner This function is called at the end of the setup stage for a KSP solver. | |
static void | _hypre_generic_pc_hook (int verbosity, void *context, void *solver_p) |
Setup hook function for a Hypre solver with preconditioner This function is called at the end of the setup stage for a solver. | |
static void | _set_hypre_sles (bool use_field_id, cs_param_sles_t *slesp) |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of Hypre families of solvers. | |
cs_param_sles_saddle_t * | cs_param_sles_saddle_create (void) |
Create a cs_param_sles_saddle_t structure and assign a minimalist default settings. | |
void | cs_param_sles_saddle_init_schur (const char *basename, cs_param_sles_saddle_t *saddlep) |
Initialize a cs_param_sles_t structure for the Schur approximation nested inside a ref cs_param_sles_saddle_t structure. By default, this member is not allocated. Do nothing if the related structure is already allocated. | |
void | cs_param_sles_saddle_copy (const cs_param_sles_saddle_t *ref, cs_param_sles_saddle_t *dest) |
Copy a cs_param_sles_saddle_t structure from ref to dest. | |
void | cs_param_sles_saddle_free (cs_param_sles_saddle_t **p_saddlep) |
Free the structure storing the parameter settings for a saddle-point system. | |
cs_param_sles_t * | cs_param_sles_create (int field_id, const char *system_name) |
Create a cs_param_sles_t structure and assign a default settings. | |
void | cs_param_sles_free (cs_param_sles_t **p_slesp) |
Free a cs_param_sles_t structure. | |
void | cs_param_sles_log (cs_param_sles_t *slesp) |
Log information related to the linear settings stored in the structure. | |
void | cs_param_sles_copy_from (cs_param_sles_t *src, cs_param_sles_t *dst) |
Copy a cs_param_sles_t structure from src to dst. | |
int | cs_param_sles_set (bool use_field_id, cs_param_sles_t *slesp) |
Define cs_sles_t structure in accordance with the settings of a cs_param_sles_t structure (SLES = Sparse Linear Equation Solver) | |
void | cs_param_sles_update_cvg_settings (bool use_field_id, const cs_param_sles_t *slesp) |
Update the settings associated to a cs_sles_t structure and apply those defined in the given cs_param_sles_t structure. This function is used only when a first setup has been performed. | |
cs_param_sles_class_t | cs_param_sles_get_class_from_amg (cs_param_amg_type_t amg_type) |
Retrieve the related solver class from the amg type. | |
cs_param_sles_class_t | cs_param_sles_check_class (cs_param_sles_class_t wanted_class) |
Check the availability of a solver library and return the requested one if this is possible or an alternative or CS_PARAM_SLES_N_CLASSES if no alternative is available. | |
void | cs_param_sles_check_amg (cs_param_sles_t *slesp) |
Check if the setting related to the AMG is consistent with the solver class. | |
void | cs_param_sles_petsc_cmd (bool use_prefix, const char *prefix, const char *keyword, const char *keyval) |
Set the command line option for PETSc. |
|
static |
Check if the settings are consitent. Can apply minor modifications.
[in,out] | slesp | pointer to a cs_param_sles_t structure |
|
static |
Retrieve the value of the polynomial degree to consider according to the settings. Only for in-house solvers.
[in] | slesp | pointer to a cs_param_sles_t structure |
|
static |
Setup hook function for a Hypre KSP solver with preconditioner This function is called at the end of the setup stage for a KSP solver.
Note: if the context pointer is non-NULL, it must point to valid data when the selection function is called so that value or structure should not be temporary (i.e. local);
Check HYPRE documentation for available options: https://hypre.readthedocs.io/en/latest/index.html
[in] | verbosity | verbosity level |
[in,out] | context | pointer to optional (untyped) value or structure |
[in,out] | solver_p | pointer to a HYPRE solver (cast ont-the-fly) |
|
static |
Setup hook function for a Hypre solver with preconditioner This function is called at the end of the setup stage for a solver.
Check HYPRE documentation for available options: https://hypre.readthedocs.io/en/latest/index.html
[in] | verbosity | verbosity level |
[in,out] | context | pointer to optional (untyped) value or structure |
[in,out] | solver_p | pointer to a HYPRE solver (cast ont-the-fly) |
|
static |
Function pointer: setup hook for setting PETSc solver and preconditioner. Case of multiplicative AMG block preconditioner for a CG with GAMG as AMG type.
[in,out] | context | pointer to optional (untyped) value or structure |
[in,out] | ksp_struct | pointer to PETSc KSP context |
|
inlinestatic |
Predefined settings for a block ICC(0) with PETSc.
[in] | prefix | prefix name associated to the current SLES |
|
inlinestatic |
Predefined settings for a block ILU(0) with PETSc.
[in] | prefix | prefix name associated to the current SLES |
|
static |
Function pointer: setup hook for setting PETSc solver and preconditioner. Case of block preconditioner.
[in,out] | context | pointer to optional (untyped) value or structure |
[in,out] | ksp_struct | pointer to PETSc KSP context |
|
inlinestatic |
Predefined settings for a block SSOR with PETSc.
[in] | prefix | prefix name associated to the current SLES |
|
inlinestatic |
Set the command line option for PETSc.
[in] | use_prefix | need a prefix |
[in] | prefix | optional prefix |
[in] | keyword | command keyword |
[in] | keyval | command value |
|
static |
Common settings for block preconditioning (when a system is split according to the Cartesian components: x,y,z)
[in] | slesp | pointer to the SLES parameter settings |
[in,out] | ksp | pointer to PETSc KSP structure (solver) |
|
inlinestatic |
Predefined settings for GAMG as a preconditioner even if another settings have been defined. One assumes that one really wants to use GAMG (may be HYPRE is not available)
[in] | prefix | prefix name associated to the current SLES |
[in] | slesp | pointer to a set of SLES parameters |
[in] | is_symm | the linear system to solve is symmetric |
[in,out] | pc | pointer to a PETSc preconditioner |
|
inlinestatic |
Predefined settings for BoomerAMG in HYPRE as a preconditioner.
[in] | prefix | prefix name associated to the current SLES |
[in] | slesp | pointer to a set of SLES parameters |
[in] | is_symm | the linear system to solve is symmetric |
[in,out] | pc | pointer to a PETSc preconditioner |
|
static |
Set PETSc solver.
[in] | slesp | pointer to SLES parameters |
[in,out] | ksp | pointer to PETSc KSP context |
|
static |
Set command line options for PC according to the kind of preconditionner.
[in,out] | slesp | set of parameters for the linear algebra |
[in,out] | ksp | PETSc solver structure |
|
static |
Set PETSc solver and preconditioner.
[in,out] | context | pointer to optional (untyped) value or structure |
[in,out] | ksp_struct | pointer to PETSc KSP context |
|
static |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of Hypre families of solvers.
Check HYPRE documentation for available options: https://hypre.readthedocs.io/en/latest/index.html
[in] | use_field_id | if false use system name |
[in,out] | slesp | pointer to a cs_param_sles_t structure |
|
static |
Set the solver when HYPRE is used Check HYPRE documentation for available options: https://hypre.readthedocs.io/en/latest/index.html.
[in] | slesp | pointer to a set of SLES parameters |
[in,out] | hs | pointer to the HYPRE solver structure |
|
static |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of MUMPS's own solvers.
[in] | use_field_id | if false use system name |
[in,out] | slesp | pointer to a cs_param_sles_t structure |
|
static |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of PETSc and Hypre families of solvers.
[in] | use_field_id | if false use system name |
[in,out] | slesp | pointer to a cs_param_sles_t structure |
|
static |
Set parameters for initializing SLES structures used for the resolution of the linear system. Case of saturne's own solvers.
[in] | use_field_id | if false use system name |
[in,out] | slesp | pointer to a cs_param_sles_t structure |
|
inlinestatic |
Return true if the prescribed solver implies a symmetric linear system.
void cs_param_sles_check_amg | ( | cs_param_sles_t * | slesp | ) |
Check if the setting related to the AMG is consistent with the solver class.
[in,out] | slesp | pointer to a cs_pparam_sles_t structure |
cs_param_sles_class_t cs_param_sles_check_class | ( | cs_param_sles_class_t | wanted_class | ) |
Check the availability of a solver library and return the requested one if this is possible or an alternative or CS_PARAM_SLES_N_CLASSES if no alternative is available.
[in] | wanted_class | requested class of solvers |
void cs_param_sles_copy_from | ( | cs_param_sles_t * | src, |
cs_param_sles_t * | dst ) |
Copy a cs_param_sles_t structure from src to dst.
[in] | src | reference cs_param_sles_t structure to copy |
[in,out] | dst | copy of the reference at exit |
cs_param_sles_t * cs_param_sles_create | ( | int | field_id, |
const char * | system_name ) |
Create a cs_param_sles_t structure and assign a default settings.
[in] | field_id | id related to to the variable field or -1 |
[in] | system_name | name of the system to solve or NULL |
void cs_param_sles_free | ( | cs_param_sles_t ** | p_slesp | ) |
Free a cs_param_sles_t structure.
[in,out] | slesp | pointer to a \cs_param_sles_t structure to free |
cs_param_sles_class_t cs_param_sles_get_class_from_amg | ( | cs_param_amg_type_t | amg_type | ) |
Retrieve the related solver class from the amg type.
[in] | amg_type | type of AMG to consider |
void cs_param_sles_log | ( | cs_param_sles_t * | slesp | ) |
Log information related to the linear settings stored in the structure.
[in] | slesp | pointer to a cs_param_sles_log |
void cs_param_sles_petsc_cmd | ( | bool | use_prefix, |
const char * | prefix, | ||
const char * | keyword, | ||
const char * | keyval ) |
Set the command line option for PETSc.
[in] | use_prefix | need a prefix |
[in] | prefix | optional prefix |
[in] | keyword | command keyword |
[in] | keyval | command value |
void cs_param_sles_saddle_copy | ( | const cs_param_sles_saddle_t * | ref, |
cs_param_sles_saddle_t * | dest ) |
Copy a cs_param_sles_saddle_t structure from ref to dest.
[in] | ref | reference structure to be copied |
[in,out] | dest | destination structure |
cs_param_sles_saddle_t * cs_param_sles_saddle_create | ( | void | ) |
Create a cs_param_sles_saddle_t structure and assign a minimalist default settings.
void cs_param_sles_saddle_free | ( | cs_param_sles_saddle_t ** | p_saddlep | ) |
Free the structure storing the parameter settings for a saddle-point system.
[in,out] | p_saddlep | double pointer to the structure to free |
void cs_param_sles_saddle_init_schur | ( | const char * | basename, |
cs_param_sles_saddle_t * | saddlep ) |
Initialize a cs_param_sles_t structure for the Schur approximation nested inside a ref cs_param_sles_saddle_t structure. By default, this member is not allocated. Do nothing if the related structure is already allocated.
[in] | basename | prefix for the naming of the Schur system |
[in,out] | saddlep | pointer to the structure to update |
int cs_param_sles_set | ( | bool | use_field_id, |
cs_param_sles_t * | slesp ) |
Define cs_sles_t structure in accordance with the settings of a cs_param_sles_t structure (SLES = Sparse Linear Equation Solver)
[in] | use_field_id | if false use system name to define a SLES |
[in,out] | slesp | pointer to a cs_param_sles_t structure |
void cs_param_sles_update_cvg_settings | ( | bool | use_field_id, |
const cs_param_sles_t * | slesp ) |
Update the settings associated to a cs_sles_t structure and apply those defined in the given cs_param_sles_t structure. This function is used only when a first setup has been performed.
One modifies only some specific options like the max. number of iterations or the relative tolerance
[in] | use_field_id | if false use a name to retrieve the cs_sles_t struc. |
[in] | slesp | pointer to a cs_param_sles_t structure |