cantera/ext/cvode/include/cvbandpre.h

151 lines
7.3 KiB
C

/******************************************************************
* *
* File : cvbandpre.h *
* Programmers : Michael Wittman and Alan C. Hindmarsh @ LLNL *
* Version of : 23 March 2000 *
*----------------------------------------------------------------*
* This is the header file for the CVBANDPRE module, which *
* provides a banded difference quotient Jacobian-based *
* preconditioner and solver routines for use with CVSPGMR. *
* *
* Summary: *
* These routines provide a band matrix preconditioner based on *
* difference quotients of the ODE right-hand side function f. *
* The user supplies parameters *
* mu = upper half-bandwidth (number of super-diagonals) *
* ml = lower half-bandwidth (number of sub-diagonals) *
* The routines generate a band matrix of bandwidth ml + mu + 1 *
* and use this to form a preconditioner for use with the Krylov *
* linear solver in CVSPGMR. Although this matrix is intended *
* to approximate the Jacobian df/dy, it may be a very crude *
* approximation. The true Jacobian need not be banded, or its *
* true bandwith may be larger than ml + mu + 1, as long as the *
* banded approximation generated here is sufficiently accurate *
* to speed convergence as a preconditioner. *
* *
* Usage: *
* The following is a summary of the usage of this module. *
* Details of the calls to CVodeMalloc, CVSpgmr, and CVode are *
* available in the CVODE User Guide. *
* To use these routines, the sequence of calls in the user *
* main program should be as follows: *
* *
* CVBandPreData bp_data; *
* ... *
* bp_data = CVBandPreAlloc(N, f, f_data, mu, ml); *
* ... *
* cvode_mem = CVodeMalloc(...); *
* ... *
* CVSpgmr(cvode_mem, pretype, gstype, maxl, delt, *
* CVBandPrecond, CVBandPSolve, bp_data); *
* ... *
* flag = CVode(...); *
* ... *
* CVBandPreFree(bp_data); *
* ... *
* CVodeFree(cvode_mem); *
* *
* Notes: *
* (1) Include this file for the CVBandPreData type definition. *
* (2) In the CVBandPreAlloc call, the arguments N, f, and f_data *
* are the same as in the call to CVodeMalloc. *
* (3) In the CVSpgmr call, the user is free to specify the inputs*
* pretype and gstype, and the optional inputs maxl and delt. *
* But the last three arguments must be as shown, with the *
* last argument being the pointer returned by CVBandPreAlloc.*
* (4) The CVBandPrecond and CVBandPSolve functions are never *
* called by the user explicitly; they are simply passed to *
* the CVSpgmr function. *
* *
******************************************************************/
#ifdef __cplusplus /* wrapper to enable C++ usage */
extern "C" {
#endif
#ifndef _cvbandpre_h
#define _cvbandpre_h
#include "cvode.h"
#include "llnltyps.h"
#include "nvector.h"
#include "band.h"
/************* CVBandPreData type definition ************/
typedef struct {
/* Data set by user in CVBandPreAlloc: */
RhsFn f;
void *f_data;
integer ml, mu;
/* Data set by CVBandPrecond: */
BandMat savedJ;
BandMat savedP;
integer *pivots;
} *CVBandPreData;
/******************************************************************
* *
* Function : CVBandPreAlloc *
*----------------------------------------------------------------*
* CVBandPreAlloc allocates and initializes a CVBandPreData *
* structure to be passed to CVSpgmr (and subsequently used by *
* CVBandPrecond and CVBandPSolve). *
* *
* The parameters of CVBandPreAlloc are as follows: *
* *
* N is the length of all vector arguments. *
* *
* f is the right hand side function. *
* *
* f_data is a pointer to the optional extra data for f. *
* *
* mu is the upper half bandwidth. *
* *
* ml is the lower half bandwidth. *
* *
* CVBandPreAlloc returns the storage pointer (type CVBandPreData)*
* or NULL if the request for storage cannot be satisfied. *
* *
******************************************************************/
CVBandPreData CVBandPreAlloc(integer N, RhsFn f, void *f_data,
integer mu, integer ml);
/******************************************************************
* *
* Function : CVBandPreFree *
*----------------------------------------------------------------*
* CVBandPreFree frees the memory allocated by CVBandPreAlloc in *
* the argument pdata. *
* *
******************************************************************/
void CVBandPreFree(CVBandPreData pdata);
/* Prototypes of CVBandPrecond and CVBandPSolve */
int CVBandPrecond(integer N, real t, N_Vector y, N_Vector fy, boole jok,
boole *jcurPtr, real gamma, N_Vector ewt, real h,
real uround, long int *nfePtr, void *bp_data,
N_Vector vtemp1, N_Vector vtemp2, N_Vector vtemp3);
int CVBandPSolve(integer N, real t, N_Vector y, N_Vector fy, N_Vector vtemp,
real gamma, N_Vector ewt, real delta, long int *nfePtr,
N_Vector r, int lr, void *bp_data, N_Vector z);
#endif
#ifdef __cplusplus
}
#endif