ODT
Loading...
Searching...
No Matches
dv_ygas.cc
Go to the documentation of this file.
1
7#include "dv_ygas.h"
8#include "domain.h"
9#include <cstdlib>
10#include <cmath>
11
13// Setup static members
14
16
18// Declare the global function prototype so it can be used in this source file
19
20void getProblemSpecificRR(double rho, double temp, double pres, double *yi, double *rr);
21
23
30 const string s,
31 const bool Lt,
32 const bool Lo) {
33
34 domn = line;
35 var_name = s;
36 L_transported = Lt;
37 L_output = Lo;
38 d = vector<double>(domn->ngrd, 0.0);
39
40 nspc = domn->gas->nSpecies();
41
42 string spName(var_name.begin()+2, var_name.end()); // var_name is like y_O2. Just want the O2 part.
43 kMe = domn->gas->speciesIndex(spName);
44
45 aP = domn->io->params["aP"] ? domn->io->params["aP"].as<double>() : 1.0;
46 //aP_x = domn->io->params["aP_x"] ? domn->io->params["aP_x"].as<double>()/4.6 : 1.0E-10;
47 aP_x = domn->io->params["aP_x"] ? domn->io->params["aP_x"].as<double>() : 1.0E-10;
48
49}
50
52
57void dv_ygas::getRhsSrc(const int ipt) {
58
59 if(!L_transported)
60 return;
61
62 rhsSrc.resize(domn->ngrd, 0.0);
63
64 static vector<vector<double> > rrSpc(nspc); // [nspc][ngrd]
65 static vector<double> yi(nspc); // [nspc]
66 static vector<double> rr(nspc); // [nspc]
67
68 int iS, iE;
69 if(ipt==-1) {
70 iS = 0;
71 iE = domn->ngrd-1;
72 }
73 else {
74 iS = ipt;
75 iE = ipt;
76 }
77
78 if(kMe==0) { // to save cost, compute needed terms for all dv_ygas objects using this one.
79
80 for(int k=0; k<nspc; k++)
81 rrSpc.at(k).resize(domn->ngrd);
82
83 for(int i=iS; i<=iE; i++) {
84#ifdef PROBLEMSPECIFICRR
85 // make sure rho and T are set first (though it should be for the diffuser at least).
86 for(int k=0; k<nspc; k++)
87 yi.at(k) = domn->ysp[k]->d.at(i);
88 getProblemSpecificRR(domn->rho->d.at(i), domn->temp->d.at(i), domn->pram->pres, &yi.at(0), &rr.at(0));
89#else
91 domn->gas->getNetProductionRates(&rr.at(0));
92#endif
93 for(int k=0; k<nspc; k++)
94 rrSpc.at(k).at(i) = rr.at(k) * domn->gas->molecularWeight(k) / domn->rho->d.at(i); // kmol/(m³ s)*(kg/kmol)*(kg/m3) = 1/s
95 }
96
97 }
98
99 for(int i=iS; i<=iE; i++)
100 rhsSrc.at(i) = rrSpc.at(kMe).at(i) *
101 (domn->mimx->time < aP_x ? aP : 1.0 ); //doldb this domain
102 //(1.0+(aP-1.0)*exp(-domn->mimx->time/aP_x)); //doldb this domain
103
104 if(domn->pram->Lspatial)
105 for(int i=iS; i<=iE; i++)
106 rhsSrc.at(i) /= domn->uvel->d.at(i);
107}
108
110
117void dv_ygas::getRhsMix(const vector<double> &gf,
118 const vector<double> &dxc){
119
120 if(!L_transported) return;
121
122 rhsMix.resize(domn->ngrd, 0.0);
123
124 setFlux(gf, dxc);
125
126 //------------------ Compute the mixing term
127
128 for(int i=0,ip=1; i<domn->ngrd; i++, ip++)
129 rhsMix.at(i) = -domn->pram->cCoord / (domn->rho->d.at(i) * dxc.at(i)) *
130 (flux.at(ip) * pow(abs(domn->posf->d.at(ip)), domn->pram->cCoord-1) -
131 flux.at(i) * pow(abs(domn->posf->d.at(i) ), domn->pram->cCoord-1));
132
133 if(domn->pram->Lspatial)
134 for(int i=0; i<domn->ngrd; i++)
135 rhsMix.at(i) /= domn->uvel->d.at(i);
136
137}
138
140
145void dv_ygas::setFlux(const vector<double> &gf,
146 const vector<double> &dxc){
147
148 static vector<vector<double> > rhoD(nspc);
149 static vector<vector<double> > rhoD_f(nspc);
150 static vector<vector<double> > rhoDYinvM(nspc);
151 static vector<vector<double> > rhoDYinvM_f(nspc);
152 static vector<vector<double> > ysp_f(nspc);
153 static vector<double> Di(nspc);
154 static vector<double> dMdx;
155 static vector<double> MMw;
156
157 if(kMe==0) { // to save cost, compute needed terms for all dv_ygas objects using this one.
158
159 MMw.resize(domn->ngrd);
160 dMdx.resize(domn->ngrdf);
161 for(int k=0; k<nspc; k++) {
162 rhoD.at(k).resize(domn->ngrd);
163 rhoD_f.at(k).resize(domn->ngrdf);
164 rhoDYinvM.at(k).resize(domn->ngrd);
165 rhoDYinvM_f.at(k).resize(domn->ngrdf);
166 ysp_f.at(k).resize(domn->ngrdf);
167 domn->ysp[k]->flux.resize(domn->ngrdf);
168 }
169 for(int i=0; i<domn->ngrd; i++) {
171 MMw.at(i) = domn->gas->meanMolecularWeight();
172 domn->tran->getMixDiffCoeffs(&Di.at(0));
173 for (int k=0; k<nspc; k++) {
174 rhoD.at(k).at(i) = domn->rho->d.at(i)*Di.at(k);
175 rhoDYinvM.at(k).at(i) = rhoD.at(k).at(i)*domn->ysp[k]->d.at(i)/MMw.at(i);
176 }
177 }
178 //for (int k=0; k<nspc; k++) { // this breaks sometimes due to division issues, use linear instead (below)
179 // interpVarToFacesHarmonic(rhoD.at(k), rhoD_f.at(k));
180 // interpVarToFacesHarmonic(rhoDYinvM.at(k), rhoDYinvM_f.at(k));
181 //}
182
183 for (int k=0; k<nspc; k++) { // linear interpolation.
184 for(int i=0; i<domn->ngrdf; i++){
185 rhoD_f.at(k).at(i) = linearInterpToFace(i, rhoD.at(k));
186 rhoDYinvM_f.at(k).at(i) = linearInterpToFace(i, rhoDYinvM.at(k));
187 ysp_f.at(k).at(i) = linearInterpToFace(i, domn->ysp[k]->d);
188 }
189 }
190
191 dMdx.at(0) = 0.0;
192 dMdx.at(domn->ngrd) = 0.0;
193 for (int i=1, im=0; i < domn->ngrd; i++, im++)
194 dMdx.at(i) = gf.at(i) * (MMw.at(i) - MMw.at(im));
195
196 //==========================
197
198 //---------- Interior faces
199
200 double jstar; // correction flux so that all fluxes sum to zero. This is equal to using a correction velocity
201 // j_i_corrected = j_i - Yi*jstar; jstar = sum(j_i).
202 // the previous approch just made j_last = -sum(j_all_but_last), where N2 was last.
203 for (int i=1, im=0; i < domn->ngrd; i++, im++) {
204 jstar = 0.0;
205 for(int k=0; k<nspc; k++) {
206 domn->ysp[k]->flux.at(i) = -rhoD_f.at(k).at(i)*gf.at(i)*(domn->ysp[k]->d.at(i) - domn->ysp[k]->d.at(im))
207 -rhoDYinvM_f.at(k).at(i)*dMdx.at(i);
208 jstar += domn->ysp[k]->flux.at(i);
209 }
210 for(int k=0; k<nspc; k++)
211 domn->ysp[k]->flux.at(i) -= ysp_f.at(k).at(i) * jstar;
212 }
213
214 //---------- Boundary faces
215
216 for(int k=0; k<nspc; k++) {
217 domn->ysp[k]->flux.at(0) = 0.0; // for wall or outflow; todo: wall flame specifics
218 domn->ysp[k]->flux.at(domn->ngrd) = 0.0;
219 }
220 }
221}
222
int ngrd
number of grid cells
Definition domain.h:42
domaincase * domc
domaincase class: set specific vars...
Definition domain.h:84
IdealGasPhase * gas
pointer to cantera thermochemistry object (reaction rates, Cp, etc.)
Definition domain.h:69
dv * uvel
Definition domain.h:51
Transport * tran
pointer to cantera transport object (viscosity, diffusivity, etc.)
Definition domain.h:70
dv * posf
access as: posf->d[i], or posf->var_name, etc.
Definition domain.h:48
int ngrdf
number of grid cell faces = ngrd+1
Definition domain.h:43
inputoutput * io
pointer to input/output object
Definition domain.h:72
micromixer * mimx
pointer to micromixer for diffusion, reaction, domain evolution.
Definition domain.h:74
vector< dv * >::iterator ysp
access as: ysp=v.begin(), (*ysp)->d[i] or (*(ysp+k))->d[i], or ysp[k]->d[i].
Definition domain.h:63
param * pram
pointer to the parameters object
Definition domain.h:73
dv * rho
Definition domain.h:49
dv * temp
Definition domain.h:58
virtual void setGasStateAtPt(const int &ipt)
Definition domaincase.h:34
double aP
Definition dv_ygas.h:34
virtual void getRhsSrc(const int ipt=-1)
Definition dv_ygas.cc:57
static int nspc
number of gas species
Definition dv_ygas.h:30
void setFlux(const vector< double > &gf, const vector< double > &dxc)
Definition dv_ygas.cc:145
dv_ygas()
Definition dv_ygas.h:55
virtual void getRhsMix(const vector< double > &gf, const vector< double > &dxc)
Definition dv_ygas.cc:117
double aP_x
Definition dv_ygas.h:35
int kMe
index of this spc in list: 0 to nspc-1; set from var_name
Definition dv_ygas.h:32
vector< double > d
the data
Definition dv.h:30
bool L_transported
flag true if var is transported
Definition dv.h:31
string var_name
name of variable
Definition dv.h:29
bool L_output
flag true if included in output
Definition dv.h:32
vector< double > rhsMix
the data
Definition dv.h:38
virtual double linearInterpToFace(const int &iface, const vector< double > &vec)
Definition dv.cc:136
vector< double > flux
Definition dv.h:40
domain * domn
pointer to domain object (parent)
Definition dv.h:35
vector< double > rhsSrc
the data
Definition dv.h:37
YAML::Node params
yaml sub node
Definition inputoutput.h:40
double time
current time
Definition micromixer.h:33
int cCoord
1 = planar, 2 = cylindrical, 3 = spherical
Definition param.h:68
bool Lspatial
spatial formulation if true
Definition param.h:62
double pres
initial pressure (Pa)
Definition param.h:40
Header file for class domain.
void getProblemSpecificRR(double rho, double temp, double pres, double *yi, double *rr)
Definition simple_dlr.cc:13
void getProblemSpecificRR(double rho, double temp, double pres, double *yi, double *rr)
Definition simple_dlr.cc:13
Header file for class dv_ygas.