151 lines
7.3 KiB
C
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
|