-
Notifications
You must be signed in to change notification settings - Fork 0
/
cvode_direct_impl.h
111 lines (85 loc) · 4.1 KB
/
cvode_direct_impl.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/*
* -----------------------------------------------------------------
* $Revision: 1.1 $
* $Date: 2010/03/10 08:51:37 $
* -----------------------------------------------------------------
* Programmer: Radu Serban @ LLNL
* -----------------------------------------------------------------
* Copyright (c) 2006, The Regents of the University of California.
* Produced at the Lawrence Livermore National Laboratory.
* All rights reserved.
* For details, see the LICENSE file.
* -----------------------------------------------------------------
* Common implementation header file for the CVDLS linear solvers.
* -----------------------------------------------------------------
*/
#ifndef _CVDLS_IMPL_H
#define _CVDLS_IMPL_H
#ifdef __cplusplus /* wrapper to enable C++ usage */
extern "C" {
#endif
#include <cvode/cvode_direct.h>
/*
* -----------------------------------------------------------------
* CVDLS solver constants
* -----------------------------------------------------------------
* CVD_MSBJ maximum number of steps between Jacobian evaluations
* CVD_DGMAX maximum change in gamma between Jacobian evaluations
* -----------------------------------------------------------------
*/
#define CVD_MSBJ 50
#define CVD_DGMAX RCONST(0.2)
/*
* -----------------------------------------------------------------
* Types : CVDlsMemRec, CVDlsMem
* -----------------------------------------------------------------
* CVDlsMem is pointer to a CVDlsMemRec structure.
* -----------------------------------------------------------------
*/
typedef struct CVDlsMemRec {
int d_type; /* SUNDIALS_DENSE or SUNDIALS_BAND */
int d_n; /* problem dimension */
int d_ml; /* lower bandwidth of Jacobian */
int d_mu; /* upper bandwidth of Jacobian */
int d_smu; /* upper bandwith of M = MIN(N-1,d_mu+d_ml) */
booleantype d_jacDQ; /* TRUE if using internal DQ Jacobian approx. */
CVDlsDenseJacFn d_djac; /* dense Jacobian routine to be called */
CVDlsBandJacFn d_bjac; /* band Jacobian routine to be called */
void *d_J_data; /* user data is passed to djac or bjac */
DlsMat d_M; /* M = I - gamma * df/dy */
DlsMat d_savedJ; /* savedJ = old Jacobian */
int *d_pivots; /* pivots = pivot array for PM = LU */
long int d_nstlj; /* nstlj = nst at last Jacobian eval. */
long int d_nje; /* nje = no. of calls to jac */
long int d_nfeDQ; /* no. of calls to f due to DQ Jacobian approx. */
int d_last_flag; /* last error return flag */
} *CVDlsMem;
/*
* -----------------------------------------------------------------
* Prototypes of internal functions
* -----------------------------------------------------------------
*/
SUNDIALS_EXPORT int cvDlsDenseDQJac(int N, realtype t,
N_Vector y,
N_Vector fy,
DlsMat Jac, void *data,
N_Vector tmp1, N_Vector tmp2, N_Vector tmp3);
SUNDIALS_EXPORT int cvDlsBandDQJac(int N, int mupper, int mlower,
realtype t, N_Vector y, N_Vector fy,
DlsMat Jac, void *data,
N_Vector tmp1, N_Vector tmp2, N_Vector tmp3);
/*
* -----------------------------------------------------------------
* Error Messages
* -----------------------------------------------------------------
*/
#define MSGD_CVMEM_NULL "Integrator memory is NULL."
#define MSGD_BAD_NVECTOR "A required vector operation is not implemented."
#define MSGD_BAD_SIZES "Illegal bandwidth parameter(s). Must have 0 <= ml, mu <= N-1."
#define MSGD_MEM_FAIL "A memory request failed."
#define MSGD_LMEM_NULL "Linear solver memory is NULL."
#define MSGD_JACFUNC_FAILED "The Jacobian routine failed in an unrecoverable manner."
#ifdef __cplusplus
}
#endif
#endif