/*BHEADER********************************************************************** * Copyright (c) 2008, Lawrence Livermore National Security, LLC. * Produced at the Lawrence Livermore National Laboratory. * This file is part of HYPRE. See file COPYRIGHT for details. * * HYPRE is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License (as published by the Free * Software Foundation) version 2.1 dated February 1999. * * $Revision: 2.4 $ ***********************************************************************EHEADER*/ /****************************************************************************** * * GMRES gmres * *****************************************************************************/ #ifndef HYPRE_KRYLOV_GMRES_HEADER #define HYPRE_KRYLOV_GMRES_HEADER /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /** * @name Generic GMRES Interface * * A general description of the interface goes here... * * @memo A generic GMRES linear solver interface * @version 0.1 * @author Jeffrey F. Painter **/ /*@{*/ /*-------------------------------------------------------------------------- *--------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------- * hypre_GMRESData and hypre_GMRESFunctions *--------------------------------------------------------------------------*/ /** * @name GMRES structs * * Description... **/ /*@{*/ /** * The {\tt hypre\_GMRESFunctions} object ... **/ typedef struct { char * (*CAlloc) ( int count, int elt_size ); int (*Free) ( char *ptr ); int (*CommInfo) ( void *A, int *my_id, int *num_procs ); void * (*CreateVector) ( void *vector ); void * (*CreateVectorArray) ( int size, void *vectors ); int (*DestroyVector) ( void *vector ); void * (*MatvecCreate) ( void *A, void *x ); int (*Matvec) ( void *matvec_data, double alpha, void *A, void *x, double beta, void *y ); int (*MatvecDestroy) ( void *matvec_data ); double (*InnerProd) ( void *x, void *y ); int (*CopyVector) ( void *x, void *y ); int (*ClearVector) ( void *x ); int (*ScaleVector) ( double alpha, void *x ); int (*Axpy) ( double alpha, void *x, void *y ); int (*precond)(void *vdata, void *A, void *b, void *x ); int (*precond_setup)(void *vdata, void *A, void *b, void *x ); } hypre_GMRESFunctions; /** * The {\tt hypre\_GMRESData} object ... **/ /* rel_change!=0 means: if pass the other stopping criteria, also check the relative change in the solution x. stop_crit!=0 means: absolute error tolerance rather than the usual relative error tolerance on the residual. Never applies if rel_change!=0. */ typedef struct { int k_dim; int min_iter; int max_iter; int rel_change; int stop_crit; int converged; double tol; int cf_tol; double rel_residual_norm; void *A; void *r; void *w; void **p; void *matvec_data; void *precond_data; hypre_GMRESFunctions * functions; /* log info (always logged) */ int num_iterations; int print_level; /* printing when print_level>0 */ int logging; /* extra computations for logging when logging>0 */ double *norms; char *log_file_name; } hypre_GMRESData; #ifdef __cplusplus extern "C" { #endif /** * @name generic GMRES Solver * * Description... **/ /*@{*/ /** * Description... * * @param param [IN] ... **/ hypre_GMRESFunctions * hypre_GMRESFunctionsCreate( char * (*CAlloc) ( int count, int elt_size ), int (*Free) ( char *ptr ), int (*CommInfo) ( void *A, int *my_id, int *num_procs ), void * (*CreateVector) ( void *vector ), void * (*CreateVectorArray) ( int size, void *vectors ), int (*DestroyVector) ( void *vector ), void * (*MatvecCreate) ( void *A, void *x ), int (*Matvec) ( void *matvec_data, double alpha, void *A, void *x, double beta, void *y ), int (*MatvecDestroy) ( void *matvec_data ), double (*InnerProd) ( void *x, void *y ), int (*CopyVector) ( void *x, void *y ), int (*ClearVector) ( void *x ), int (*ScaleVector) ( double alpha, void *x ), int (*Axpy) ( double alpha, void *x, void *y ), int (*PrecondSetup) ( void *vdata, void *A, void *b, void *x ), int (*Precond) ( void *vdata, void *A, void *b, void *x ) ); /** * Description... * * @param param [IN] ... **/ void * hypre_GMRESCreate( hypre_GMRESFunctions *gmres_functions ); #ifdef __cplusplus } #endif #endif