ODT
Loading...
Searching...
No Matches
domain.cc
Go to the documentation of this file.
1
6#include "domain.h"
7#include "processor.h"
8#include "dv.h"
9#include "dv_uvw.h"
10#include "dv_pos.h"
11#include "dv_posf.h"
12#include "dv_rho.h"
13#include "dv_dvisc.h"
14#include "dv_sca.h"
15#include "dv_aDL.h"
24#include "domaincase_odt_RT.h"
25#include <cmath>
26#include <iomanip>
27
28extern processor proc;
29
31
34domain::domain(domain *p_domn, param *p_pram) {
35
36 domn = p_domn;
37 pram = p_pram;
38 domc = 0; // initialize for destruction of eddy domains
39
40 }
41
43
47 meshManager *p_mesher,
48 streams *p_strm,
49 IdealGasPhase *p_gas,
50 Transport *p_tran,
51 micromixer *p_mimx,
52 eddy *p_ed,
53 domain *p_eddl,
54 solver *p_solv,
55 randomGenerator *p_rand,
56 bool LisEddyDomain) {
57
58 //----------------------
59
60 io = p_io;
61 mesher = p_mesher;
62 gas = p_gas;
63 tran = p_tran;
64 strm = p_strm;
65 mimx = p_mimx;
66 ed = p_ed;
67 eddl = p_eddl;
68 solv = p_solv;
69 rand = p_rand;
70
71 //----------------------
72
73 ngrd = pram->ngrd0;
74 ngrdf = ngrd + 1;
75
76 //----------------------
77
78 if(LisEddyDomain) { // eddy domain needs less data
80 return;
81 }
82
83 //----------------------
84 io->init(this);
85 pram->init(this);
86 ed->init(this, eddl);
87 solv->init(this);
88 // mesher is init below in caseinit for phi
89 // strm is init below in caseinit (domc), (if needed)
90 // mimx is init below since it needs v[] set for cvode
91
92 //---------------------- Continue setting up the case using the case_somecase class.
93 // Adds to the above variable list, and initializes solution for the run
94
95 if(pram->probType == "CHANNEL")
96 domc = new domaincase_odt_channel(); // cold channel flow
97
98 else if(pram->probType == "CHANNEL_SCALAR")
99 domc = new domaincase_odt_channelScalar(); // cold channel flow with passive scalar
100
101 else if(pram->probType == "JETMIXL_RXN")
102 domc = new domaincase_odt_jetMixlRxn(); // jet, wake, mixing layer with gaseous reaction
103
104 else if(pram->probType == "COLDPROPANEJET")
105 domc = new domaincase_odt_coldPropaneJet(); // TNF jet
106
107 else if(pram->probType == "COLDJET")
108 domc = new domaincase_odt_coldJet(); // Hussein 1994
109
110 else if(pram->probType == "JETFLAME")
111 domc = new domaincase_odt_jetFlame(); // Shaddix jet
112
113 else if(pram->probType == "MF_JETFLAME")
114 domc = new domaincase_odt_MFjetFlame(); // jet flame w/ mixt frac density profile
115
116 else if(pram->probType == "ISOTHERMAL_WALL")
117 domc = new domaincase_odt_isothermalWall(); // isothermal wall
118
119 else if(pram->probType == "RT")
120 domc = new domaincase_odt_RT(); // simple Rayleigh Taylor flow
121
122 else {
123 cout << endl << "ERROR, probType UNKNOWN" << endl;
124 exit(0);
125 }
126
127 domc->init(this);
128
129 //----------------------
130
131 for(int k=0; k<v.size(); k++)
132 varMap[v.at(k)->var_name] = v.at(k);
133
134 nTrans = 0;
135 for(int k=0; k<v.size(); k++)
136 if(v.at(k)->L_transported)
137 nTrans++;
138
139 //----------------------
140
141 mimx->init(this);
142
143 //----------------------
144
145 if(pram->Lrestart) {
148 }
149
150}
151
153
157 return posf->d.at(ngrd) - posf->d.at(0);
158}
159
161
168
169 v.push_back(new dv_pos( this, "pos", false, true));
170 v.push_back(new dv_posf( this, "posf", false, true));
171 v.push_back(new dv_uvw( this, "uvel", true, true)); // last are: L_transported, L_output
172 v.push_back(new dv_uvw( this, "vvel", true, true));
173 v.push_back(new dv_uvw( this, "wvel", true, true));
174 v.push_back(new dv_rho( this, "rho", false, false));
175 v.push_back(new dv_dvisc(this, "dvisc", false, false));
176 if(domn->pram->LdoDL)
177 v.push_back(new dv_aDL(this, "aDL", false, false));
178
179 int k = 0;
180 pos = v.at(k++);
181 posf = v.at(k++);
182 uvel = v.at(k++);
183 vvel = v.at(k++);
184 wvel = v.at(k++);
185 rho = v.at(k++);
186 dvisc = v.at(k++);
187 if(domn->pram->LdoDL)
188 aDL = v.at(k++);
189
190}
191
193
207void domain::setDomainFromRegion(const int i1, const int i2) {
208
209 ngrd = i2-i1+1;
210 ngrdf = ngrd+1;
211
212 for(int k=0; k<v.size(); k++)
213 v.at(k)->setDvFromRegion(i1,i2);
214}
215
217
234int domain::domainPositionToIndex(double position, const bool LowSide, int dbg) {
235
236 if(abs(position-posf->d.at(0)) < 1.0E-14)
237 return 0;
238 if(abs(position-posf->d.at(ngrd)) < 1.0E-14)
239 return ngrd-1;
240
241 //if(position < posf->d.at(0)) // for periodic (from eddies only)
242 // position += Ldomain();
243 //if(position > posf->d.at(ngrd))
244 // position -= Ldomain();
245
246 if(position < posf->d.at(0) || position > posf->d.at(ngrd)) {
247 *io->ostrm << "\ndbg = " << dbg << endl; //doldb
248 *io->ostrm << scientific;
249 *io->ostrm << setprecision(14);
250 *io->ostrm << "\n ERROR odt_grid::domainPositionToIndex position < posf->d.at(0) or > posf->d.at(ngrd) \n"
251 " and at processor's id---> " << proc.myid
252 <<" Value of position is---> "<<position << " and values of posf->d.at(0) and posf->d.at(ngrd) are "
253 <<posf->d.at(0)<< " and "<<posf->d.at(ngrd) <<" respectively "<< endl;
254 //io->outputProperties("dbg.dat", 0.0); //doldb
255 exit(0);
256 }
257
258 int i;
259 int ipos = static_cast<int>((position-posf->d.at(0))/Ldomain()*ngrd);
260
261 if(posf->d.at(ipos+1) > position) { // case 1: grd skewed more pts on right half
262 for(i=ipos+1; i>=0; i--) {
263 if(posf->d.at(i) <= position) {
264 if(position == posf->d.at(i)) {
265 if(LowSide)
266 return i;
267 else
268 return i-1;
269 }
270 else
271 return i;
272 }
273 }
274 }
275
276 else { // case 2: grd skewed more pts on left half
277 for(i=ipos+1; i<=ngrdf; i++) {
278 if(posf->d.at(i) >= position) {
279 if(position == posf->d.at(i)) {
280 if(LowSide)
281 return i;
282 else
283 return i-1;
284 }
285 else
286 return i-1;
287 }
288 }
289 }
290
291 *io->ostrm << "\n\n******** ERROR IN odt_grid::domainPositionToIndex "
292 << position << '\t' << posf->d.at(0) << '\t' << posf->d.at(ngrd) << '\t' << endl << endl;
293
294 return -1;
295}
296
298
304double domain::cyclePeriodicDomain(const int icycle) {
305
306 double cycleDistance = posf->d.at(icycle+1)-posf->d.at(0);
307
308 for(int k=0; k<v.size(); k++) {
309 if (v.at(k)->var_name=="pos" || v.at(k)->var_name=="posf")
310 continue;
311 v.at(k)->d.insert(v.at(k)->d.end(), v.at(k)->d.begin(), v.at(k)->d.begin()+icycle+1);
312 v.at(k)->d.erase( v.at(k)->d.begin(), v.at(k)->d.begin()+icycle+1);
313 }
314
315 //---------- now do posf, and pos
316
317 double xend = posf->d.at(ngrd);
318 for(int i=1; i<=icycle+1; i++)
319 posf->d.push_back(xend+(posf->d.at(i)-posf->d.at(0)));
320 posf->d.erase(posf->d.begin(), posf->d.begin()+icycle+1);
321
322 pos->setVar(); // does a little extra work (whole domain) but doesn't happen that often
323 // only when periodic eddies are accepted.
324
325 return cycleDistance;
326}
327
329
336void domain::backCyclePeriodicDomain(const double backCycleDistance) {
337
338 double xend = posf->d.at(ngrd) - backCycleDistance; // end loc.
339 double icycle = domainPositionToIndex(xend, true, 1); // cycle cells greater than this to beginning
340
341 //------------ split the cell where the back cycle happens
342
343 vector<double> interPos(3);
344 if(abs(posf->d.at(icycle) - xend) > 1.0e-15) {
345 interPos.at(0) = posf->d.at(icycle);
346 interPos.at(1) = xend;
347 interPos.at(0) = posf->d.at(icycle+1);
348 mesher->splitCell(icycle, 1, interPos);
349 icycle++;
350 }
351
352 //------------ now move the cells
353
354 int nmove = ngrd-icycle+1;
355
356 for(int k=0; k<v.size(); k++) {
357 if (v.at(k)->var_name=="pos" || v.at(k)->var_name=="posf")
358 continue;
359 v.at(k)->d.insert(v.at(k)->d.begin(), v.at(k)->d.begin()+icycle, v.at(k)->d.end());
360 v.at(k)->d.erase( v.at(k)->d.begin()+icycle+nmove, v.at(k)->d.end() );
361 }
362
363 //---------- now do posf, and pos
364
365 double xstart_orig = posf->d.at(0);
366
367 posf->d.insert(posf->d.begin(), nmove, 0.0);
368 icycle += nmove;
369 for(int i=0; i<nmove; i++)
370 posf->d.at(i) = xstart_orig - (posf->d.at(posf->d.size()-1-i) - xend);
371
372 posf->d.erase(posf->d.begin()+icycle+1, posf->d.end());
373
374 pos->setVar(); // does a little extra work (whole domain) but doesn't happen that often
375 // only when periodic eddies are accepted.
376}
377
int ngrd
number of grid cells
Definition domain.h:42
domain * eddl
pointer to eddyline object
Definition domain.h:76
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
int domainPositionToIndex(double position, const bool LowSide, int dbg)
Definition domain.cc:234
int nTrans
number of transported variables on the domain.
Definition domain.h:82
void init(inputoutput *p_io, meshManager *p_mesher, streams *p_strm, IdealGasPhase *p_gas, Transport *p_tran, micromixer *p_mimx, eddy *p_ed, domain *p_eddl, solver *p_solv, randomGenerator *p_rand, bool LisEddyDomain=false)
Definition domain.cc:46
dv * uvel
Definition domain.h:51
double Ldomain()
Definition domain.cc:156
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
domain(domain *p_domn, param *p_pram)
Definition domain.cc:34
double cyclePeriodicDomain(const int icycle)
Definition domain.cc:304
dv * vvel
Definition domain.h:52
dv * wvel
Definition domain.h:53
dv * aDL
Definition domain.h:62
void initEddyDomain()
Definition domain.cc:167
map< string, dv * > varMap
Definition domain.h:67
void setDomainFromRegion(const int i1, const int i2)
Definition domain.cc:207
dv * pos
pointers to gas properties
Definition domain.h:47
int ngrdf
number of grid cell faces = ngrd+1
Definition domain.h:43
void backCyclePeriodicDomain(const double backCycleDistance)
Definition domain.cc:336
meshManager * mesher
pointer to mesh manager object
Definition domain.h:78
inputoutput * io
pointer to input/output object
Definition domain.h:72
randomGenerator * rand
Definition domain.h:80
eddy * ed
pointer to object for eddy operations
Definition domain.h:75
dv * dvisc
Definition domain.h:50
micromixer * mimx
pointer to micromixer for diffusion, reaction, domain evolution.
Definition domain.h:74
streams * strm
pointer to gas stream properties
Definition domain.h:71
vector< dv * > v
All domain variables are stored in here.
Definition domain.h:45
solver * solv
pointer to solver object
Definition domain.h:77
domain * domn
(for one domain to point to another (eddl))
Definition domain.h:40
param * pram
pointer to the parameters object
Definition domain.h:73
dv * rho
Definition domain.h:49
Class implementing child domaincase_odt_channel of parent domaincase object.
virtual void init(domain *p_domn)
Definition domaincase.h:46
vector< double > d
the data
Definition dv.h:30
virtual void setVar(const int ipt=-1)
Definition dv.h:44
Definition eddy.h:21
void init(domain *p_domn, domain *p_eddl)
Definition eddy.cc:19
void set_iNextDumpTime(double time)
void loadVarsFromRestartFile()
ostream * ostrm
Runtime: points to cout or to a file.
Definition inputoutput.h:33
void init(domain *p_domn)
void splitCell(const int isplt, const int nsplt, const vector< double > &cellFaces)
Class implementing micromixer object.
Definition micromixer.h:23
void init(domain *p_domn)
Definition micromixer.cc:30
Definition param.h:23
string probType
problem type: CHANNEL, CHANNEL_SCALAR, JETMIXL_RXN, COUETTE
Definition param.h:42
double trst
restart time (from restart file), default is 0.0;
Definition param.h:108
int ngrd0
initial grid points
Definition param.h:35
bool Lrestart
true to restart from file, else false
Definition param.h:106
bool LdoDL
flag to do the DL energy from the DL instability
Definition param.h:54
void init(domain *p_domn)
Definition param.cc:14
int myid
Process ID.
Definition processor.h:32
virtual void init(domain *p_domn)
Definition solver.cc:19
processor proc
Definition main.cc:28
Header file for class domain.
Header file for class domaincase_odt_MFjetFlame.
Header file for class domaincase_odt_RT.
Header file for class domaincase_odt_channel.
Header file for class domaincase_odt_channelScalar.
Header file for class domaincase_odt_coldJet.
Header file for class domaincase_odt_coldPropaneJet.
Header file for class domaincase_odt_isothermalWall.
Header file for class domaincase_odt_jetFlame.
Header file for class domaincase_odt_jetMixlRxn.
Header file for class dv.
Header file for class dv_aDL.
Header file for class dv_dvisc.
Header file for class dv_pos.
Header file for class dv_posf.
Header file for class dv_rho.
Header file for class dv_sca.
Header file for class dv_uvw.
Header file for class processor.