ODT
Loading...
Searching...
No Matches
cvodeDriver.cc
Go to the documentation of this file.
1
6#include <cstdlib>
7
8#include "cvodeDriver.h"
9#include "domain.h"
10
11using namespace std;
12
14// Declare the global function prototypes so they can be used in this source file
15
16static int RHSF(double t, N_Vector y, N_Vector ydot, void* f_data);
17
19
23void cvodeDriver::init(domain *p_domn, bool p_LincludeRhsMix) {
24
25 //---------- set pointers
26
27 domn = p_domn;
28 LincludeRhsMix = p_LincludeRhsMix;
29
30 //----------
31
32 if(domn->pram->Lsolver=="EXPLICIT")
33 return;
34
35 Ldestruct = true;
36
37 //---------- set some CVode params
38
39 atol = domn->pram->cvode_atol; // 1.0E-10;
40 rtol = domn->pram->cvode_rtol; // 1.0E-4;
41
42 //---------- set the number of equations to solve, and the variable map
43
44 neq = domn->nTrans;
45 for(int i=0, k=0; i<domn->v.size(); i++)
46 if(domn->v.at(i)->L_transported)
47 tVarMap[k++] = domn->v.at(i);
48
49 //---------- initialize the dependent variable
50
51 var = N_VNew_Serial(neq);
52
53 //---------- set the CVode object
54
55 int flag;
56
57 cvode_mem = CVodeCreate(CV_BDF, CV_NEWTON);
58
59 if(!cvode_mem) {
60 cout << endl << "ERROR INITIALIZING CVODE MEMORY" << endl;
61 exit(0);
62 }
63
64 flag = CVodeMalloc(cvode_mem, RHSF, 0.0, var, CV_SS, rtol, &atol);
65 testCVflag(flag, "CVodeMalloc");
66 flag = CVDense(cvode_mem, neq);
67 testCVflag(flag, "CVDense");
68
69 flag = CVodeSetFdata(cvode_mem, this);
70 testCVflag(flag, "CVodeSetFdata");
71
72 flag = CVodeSetMaxNumSteps(cvode_mem, 2000);
73 testCVflag(flag, "CVodeSetMaxNumSteps");
74}
75
77
79 if(Ldestruct) {
80 N_VDestroy_Serial(var);
81 CVodeFree(&cvode_mem);
82 }
83}
84
86
90void cvodeDriver::integrateCell(int p_iC, double tres) {
91
92
93 iC = p_iC;
94
95 //---------- Initialize the Dependent Variable
96
97 for(int k=0; k<neq; k++)
98 NV_Ith_S(var, k) = tVarMap[k]->d.at(iC);
99
100 //---------- Reset CVode for the new cell
101
102 int flag = CVodeReInit(cvode_mem, RHSF, 0.0, var, CV_SS, rtol, &atol);
103 testCVflag(flag, "CVodeReInit");
104
105 //---------- Integrate the solution
106
107 double t;
108 flag = CVodeSetStopTime(cvode_mem, tres); testCVflag(flag, "CVodeSetStopTime");
109 flag = CVode(cvode_mem, tres, var, &t, CV_NORMAL); testCVflag(flag, "CVode");
110
111 //----------- Recover the solution
112
113 for(int k=0; k<neq; k++)
114 tVarMap[k]->d.at(iC) = NV_Ith_S(var,k);
115
116}
117
119
128static int RHSF(double t, N_Vector y, N_Vector ydot, void* f_data) {
129
130 cvodeDriver *cvd;
131 cvd = static_cast<cvodeDriver*>(f_data);
132
133 for(int k=0; k<cvd->neq; k++) // set the transported vars on the domain
134 cvd->tVarMap[k]->d.at(cvd->iC) = NV_Ith_S(y,k);
135
137
138 for(int k=0; k<cvd->neq; k++) // set the transported var souce terms
139 cvd->tVarMap[k]->getRhsSrc(cvd->iC);
140
141 for(int k=0; k < cvd->neq; k++) {
142 NV_Ith_S(ydot,k) = cvd->tVarMap[k]->rhsSrc.at(cvd->iC);
143 if(cvd->LincludeRhsMix) // do this for SEMI-IMPLICIT, not STRANG
144 NV_Ith_S(ydot,k) += cvd->tVarMap.at(k)->rhsMix.at(cvd->iC);
145 }
146
147 return 0;
148}
149
151
156void cvodeDriver::testCVflag(int flag, std::string func) {
157 if(flag != CV_SUCCESS) {
158 cout << endl << "ERROR in " << func << endl;
159 exit(0);
160 }
161}
162
bool LincludeRhsMix
if true, mixing term is included in integration
Definition cvodeDriver.h:47
void init(domain *p_domn, const bool p_LincludeRhsMix)
domain * domn
pointer to main domain object
Definition cvodeDriver.h:39
bool Ldestruct
true if we setup cvode and can therefore destruct
Definition cvodeDriver.h:52
double rtol
CVODE tol.
Definition cvodeDriver.h:45
void testCVflag(int flag, string func)
void * cvode_mem
CVode memory.
Definition cvodeDriver.h:51
map< int, dv * > tVarMap
map to transported variables. (Domain vars in any order, but here, solve transported).
Definition cvodeDriver.h:42
void integrateCell(int p_iC, double tres)
int iC
which cell are we integrating
Definition cvodeDriver.h:43
double atol
CVODE tol.
Definition cvodeDriver.h:44
int neq
number of eqns solved
Definition cvodeDriver.h:40
N_Vector var
vector of variables being solved for CVode
Definition cvodeDriver.h:41
domaincase * domc
domaincase class: set specific vars...
Definition domain.h:84
int nTrans
number of transported variables on the domain.
Definition domain.h:82
vector< dv * > v
All domain variables are stored in here.
Definition domain.h:45
param * pram
pointer to the parameters object
Definition domain.h:73
virtual void setCaseSpecificVars_cvode(const int &ipt)
Definition domaincase.h:36
double cvode_atol
absolute tolerace atol for cvode
Definition param.h:50
string Lsolver
EXPLICIT, SEMI-IMPLICIT, or STRANG.
Definition param.h:60
double cvode_rtol
relative tolerace rtol for cvode
Definition param.h:51
Header file for class cvodeDriver.h.
Header file for class domain.