26 m_do_multicomponent(false),
27 m_do_radiation(false),
53 m_nv = c_offset_Y + m_nsp;
56 m_do_species.resize(m_nsp,
true);
59 m_do_energy.resize(m_points,
false);
61 m_diff.resize(m_nsp*m_points);
62 m_multidiff.resize(m_nsp*m_nsp*m_points);
63 m_flux.
resize(m_nsp,m_points);
64 m_wdot.
resize(m_nsp,m_points, 0.0);
69 setBounds(0, -1e20, 1e20);
70 setBounds(1, -1e20, 1e20);
71 setBounds(2, 200.0, 2*m_thermo->
maxTemp());
72 setBounds(3, -1e20, 1e20);
75 for (
size_t k = 0; k < m_nsp; k++) {
76 setBounds(c_offset_Y+k, -1.0e-7, 1.0e5);
80 m_refiner->setActive(c_offset_U,
false);
81 m_refiner->setActive(c_offset_V,
false);
82 m_refiner->setActive(c_offset_T,
false);
83 m_refiner->setActive(c_offset_L,
false);
86 for (
size_t ng = 0; ng < m_points; ng++) {
87 gr.push_back(1.0*ng/m_points);
100 m_rho.resize(m_points, 0.0);
101 m_wtm.resize(m_points, 0.0);
102 m_cp.resize(m_points, 0.0);
103 m_visc.resize(m_points, 0.0);
104 m_tcon.resize(m_points, 0.0);
106 m_diff.resize(m_nsp*m_points);
107 if (m_do_multicomponent) {
108 m_multidiff.resize(m_nsp*m_nsp*m_points);
109 m_dthermal.
resize(m_nsp, m_points, 0.0);
111 m_flux.
resize(m_nsp,m_points);
112 m_wdot.
resize(m_nsp,m_points, 0.0);
113 m_do_energy.resize(m_points,
false);
115 m_fixedtemp.resize(m_points);
117 m_dz.resize(m_points-1);
118 m_z.resize(m_points);
126 for (
size_t j = 1; j < m_points; j++) {
127 if (z[j] <= z[j-1]) {
129 "grid points must be monotonically increasing");
132 m_dz[j-1] = m_z[j] - m_z[j-1];
138 double* x = xg +
loc();
139 for (
size_t j = 0; j < m_points; j++) {
140 double* Y = x + m_nv*j + c_offset_Y;
151 m_diff.resize(m_nsp*m_points);
152 if (m_do_multicomponent) {
153 m_multidiff.resize(m_nsp*m_nsp*m_points);
154 m_dthermal.
resize(m_nsp, m_points, 0.0);
160 for (
size_t j = 0; j < m_points; j++) {
169 const doublereal* yy = x + m_nv*j + c_offset_Y;
177 const doublereal* yyj = x + m_nv*j + c_offset_Y;
178 const doublereal* yyjp = x + m_nv*(j+1) + c_offset_Y;
179 for (
size_t k = 0; k < m_nsp; k++) {
180 m_ybar[k] = 0.5*(yyj[k] + yyjp[k]);
188 if (!m_do_multicomponent && m_do_soret) {
190 "Thermal diffusion (the Soret effect) is enabled, and requires " 191 "using a multicomponent transport model.");
194 size_t nz = m_zfix.size();
195 bool e = m_do_energy[0];
196 for (
size_t j = 0; j < m_points; j++) {
198 m_fixedtemp[j] = T(x, j);
200 double zz = (z(j) - z(0))/(z(m_points - 1) - z(0));
214 for (
size_t j = 0; j < m_points; j++) {
220 for (
size_t j = 0; j < m_points - 1; j++) {
234 doublereal* rg, integer* diagg, doublereal rdt)
248 doublereal* x = xg +
loc();
249 doublereal* rsd = rg +
loc();
250 integer* diag = diagg +
loc();
257 size_t jpt = (jg == 0) ? 0 : jg -
firstPoint();
258 jmin = std::max<size_t>(jpt, 1) - 1;
259 jmax = std::min(jpt+1,m_points-1);
269 size_t j0 = std::max<size_t>(jmin, 1) - 1;
270 size_t j1 = std::min(jmax+1,m_points-1);
273 if (jg ==
npos || m_force_full_update) {
279 double* Yleft = x + index(c_offset_Y, jmin);
280 m_kExcessLeft = distance(Yleft, max_element(Yleft, Yleft + m_nsp));
281 double* Yright = x + index(c_offset_Y, jmax);
282 m_kExcessRight = distance(Yright, max_element(Yright, Yright + m_nsp));
291 double rdt,
size_t jmin,
size_t jmax)
316 doublereal k_P_ref = 1.0*
OneAtm;
319 const doublereal c_H2O[6] = {-0.23093, -1.12390, 9.41530, -2.99880,
320 0.51382, -1.86840e-5};
321 const doublereal c_CO2[6] = {18.741, -121.310, 273.500, -194.050,
325 double boundary_Rad_left = m_epsilon_left *
StefanBoltz * pow(T(x, 0), 4);
326 double boundary_Rad_right = m_epsilon_right *
StefanBoltz * pow(T(x, m_points - 1), 4);
329 for (
size_t j = jmin; j < jmax; j++) {
331 double radiative_heat_loss = 0;
338 for (
size_t n = 0; n <= 5; n++) {
339 k_P_H2O += c_H2O[n] * pow(1000 / T(x, j), (
double) n);
347 for (
size_t n = 0; n <= 5; n++) {
348 k_P_CO2 += c_CO2[n] * pow(1000 / T(x, j), (
double) n);
355 radiative_heat_loss = 2 * k_P *(2 *
StefanBoltz * pow(T(x, j), 4)
356 - boundary_Rad_left - boundary_Rad_right);
363 for (
size_t j = jmin; j <= jmax; j++) {
374 rsd[index(c_offset_U,0)] =
375 -(rho_u(x,1) - rho_u(x,0))/m_dz[0]
376 -(density(1)*V(x,1) + density(0)*V(x,0));
382 rsd[index(c_offset_V,0)] = V(x,0);
384 rsd[index(c_offset_T,0)] = T(x,0);
386 rsd[index(c_offset_T,0)] = T(x,0) -
T_fixed(0);
388 rsd[index(c_offset_L,0)] = -rho_u(x,0);
393 for (
size_t k = 0; k < m_nsp; k++) {
395 rsd[index(c_offset_Y + k, 0)] =
396 -(m_flux(k,0) + rho_u(x,0)* Y(x,k,0));
401 rsd[index(c_offset_E, 0)] = x[index(c_offset_E, j)];
402 }
else if (j == m_points - 1) {
405 rsd[index(c_offset_E, j)] = x[index(c_offset_E, j)];
409 rsd[index(c_offset_E, j)] = x[index(c_offset_E, j)];
417 rsd[index(c_offset_V,j)]
418 = (shear(x,j) - lambda(x,j) - rho_u(x,j)*dVdz(x,j)
419 - m_rho[j]*V(x,j)*V(x,j))/m_rho[j]
420 - rdt*(V(x,j) - V_prev(j));
421 diag[index(c_offset_V, j)] = 1;
430 for (
size_t k = 0; k < m_nsp; k++) {
431 double convec = rho_u(x,j)*dYdz(x,k,j);
432 double diffus = 2.0*(m_flux(k,j) - m_flux(k,j-1))
434 rsd[index(c_offset_Y + k, j)]
435 = (m_wt[k]*(wdot(k,j))
436 - convec - diffus)/m_rho[j]
437 - rdt*(Y(x,k,j) - Y_prev(k,j));
438 diag[index(c_offset_Y + k, j)] = 1;
449 if (m_do_energy[j]) {
457 for (
size_t k = 0; k < m_nsp; k++) {
458 double flxk = 0.5*(m_flux(k,j-1) + m_flux(k,j));
459 sum += wdot(k,j)*h_RT[k];
460 sum2 += flxk*cp_R[k]/m_wt[k];
463 double dtdzj = dTdz(x,j);
466 rsd[index(c_offset_T, j)] = - m_cp[j]*rho_u(x,j)*dtdzj
467 - divHeatFlux(x,j) - sum - sum2;
468 rsd[index(c_offset_T, j)] /= (m_rho[j]*m_cp[j]);
469 rsd[index(c_offset_T, j)] -= rdt*(T(x,j) - T_prev(j));
470 rsd[index(c_offset_T, j)] -= (
m_qdotRadiation[j] / (m_rho[j] * m_cp[j]));
471 diag[index(c_offset_T, j)] = 1;
474 rsd[index(c_offset_T, j)] = T(x,j) -
T_fixed(j);
475 diag[index(c_offset_T, j)] = 0;
478 rsd[index(c_offset_L, j)] = lambda(x,j) - lambda(x,j-1);
479 diag[index(c_offset_L, j)] = 0;
486 if (m_do_multicomponent) {
487 for (
size_t j = j0; j < j1; j++) {
490 doublereal rho = m_thermo->
density();
491 m_visc[j] = (m_dovisc ? m_trans->
viscosity() : 0.0);
495 for (
size_t k = 0; k < m_nsp; k++) {
496 m_diff[k+j*m_nsp] = m_wt[k] * rho / (wtm*wtm);
505 for (
size_t j = j0; j < j1; j++) {
507 m_visc[j] = (m_dovisc ? m_trans->
viscosity() : 0.0);
516 writelog(
" Pressure: {:10.4g} Pa\n", m_press);
521 writeline(
'-', 79,
false,
true);
522 writelog(
"\n z radiative heat loss");
523 writeline(
'-', 79,
false,
true);
524 for (
size_t j = 0; j < m_points; j++) {
533 if (m_do_multicomponent) {
534 for (
size_t j = j0; j < j1; j++) {
535 double dz = z(j+1) - z(j);
536 for (
size_t k = 0; k < m_nsp; k++) {
537 doublereal sum = 0.0;
538 for (
size_t m = 0; m < m_nsp; m++) {
539 sum += m_wt[m] * m_multidiff[mindex(k,m,j)] * (X(x,m,j+1)-X(x,m,j));
541 m_flux(k,j) = sum * m_diff[k+j*m_nsp] / dz;
545 for (
size_t j = j0; j < j1; j++) {
547 double wtm = m_wtm[j];
548 double rho = density(j);
549 double dz = z(j+1) - z(j);
550 for (
size_t k = 0; k < m_nsp; k++) {
551 m_flux(k,j) = m_wt[k]*(rho*m_diff[k+m_nsp*j]/wtm);
552 m_flux(k,j) *= (X(x,k,j) - X(x,k,j+1))/dz;
556 for (
size_t k = 0; k < m_nsp; k++) {
557 m_flux(k,j) += sum*Y(x,k,j);
563 for (
size_t m = j0; m < j1; m++) {
564 double gradlogT = 2.0 * (T(x,m+1) - T(x,m)) /
565 ((T(x,m+1) + T(x,m)) * (z(m+1) - z(m)));
566 for (
size_t k = 0; k < m_nsp; k++) {
567 m_flux(k,m) -= m_dthermal(k,m)*gradlogT;
587 if (n >= c_offset_Y && n < (c_offset_Y + m_nsp)) {
595 size_t StFlow::componentIndex(
const std::string& name)
const 599 }
else if (name==
"V") {
601 }
else if (name==
"T") {
603 }
else if (name==
"lambda") {
605 }
else if (name ==
"eField") {
608 for (
size_t n=c_offset_Y; n<m_nsp+c_offset_Y; n++) {
620 vector<string> ignored;
625 for (
size_t istr = 0; istr < str.size(); istr++) {
630 double pp =
getFloat(dom,
"pressure",
"pressure");
635 bool readgrid =
false, wrote_header =
false;
636 for (
size_t n = 0; n < d.size(); n++) {
638 string nm = fa[
"title"];
643 writelog(
"Grid contains {} points.\n", np);
651 "domain contains no grid points.");
654 debuglog(
"Importing datasets:\n", loglevel >= 2);
655 for (
size_t n = 0; n < d.size(); n++) {
657 string nm = fa[
"title"];
660 debuglog(
"axial velocity ", loglevel >= 2);
661 if (x.size() != np) {
663 "axial velocity array size error");
665 for (
size_t j = 0; j < np; j++) {
666 soln[index(c_offset_U,j)] = x[j];
668 }
else if (nm ==
"z") {
670 }
else if (nm ==
"V") {
671 debuglog(
"radial velocity ", loglevel >= 2);
672 if (x.size() != np) {
674 "radial velocity array size error");
676 for (
size_t j = 0; j < np; j++) {
677 soln[index(c_offset_V,j)] = x[j];
679 }
else if (nm ==
"T") {
680 debuglog(
"temperature ", loglevel >= 2);
681 if (x.size() != np) {
683 "temperature array size error");
685 for (
size_t j = 0; j < np; j++) {
686 soln[index(c_offset_T,j)] = x[j];
693 for (
size_t jj = 0; jj < np; jj++) {
694 zz[jj] = (grid(jj) - zmin())/(zmax() - zmin());
697 }
else if (nm ==
"L") {
699 if (x.size() != np) {
701 "lambda arary size error");
703 for (
size_t j = 0; j < np; j++) {
704 soln[index(c_offset_L,j)] = x[j];
708 if (x.size() == np) {
711 for (
size_t j = 0; j < np; j++) {
712 soln[index(k+c_offset_Y,j)] = x[j];
716 ignored.push_back(nm);
720 if (loglevel >=2 && !ignored.empty()) {
723 size_t nn = ignored.size();
724 for (
size_t n = 0; n < nn; n++) {
730 for (
size_t ks = 0; ks < nsp; ks++) {
731 if (did_species[ks] == 0) {
733 writelog(
"Missing data for species:\n");
741 if (dom.
hasChild(
"energy_enabled")) {
744 for (
size_t i = 0; i < x.size(); i++) {
745 m_do_energy[i] = (x[i] != 0);
747 }
else if (!x.empty()) {
748 throw CanteraError(
"StFlow::restore",
"energy_enabled is length {}" 749 "but should be length {}", x.size(),
nPoints());
753 if (dom.
hasChild(
"species_enabled")) {
755 if (x.size() == m_nsp) {
756 for (
size_t i = 0; i < x.size(); i++) {
757 m_do_species[i] = (x[i] != 0);
759 }
else if (!x.empty()) {
763 writelog(
"\nWarning: StFlow::restore: species_enabled is " 764 "length {} but should be length {}. Enabling all species " 765 "equations by default.", x.size(), m_nsp);
767 m_do_species.assign(m_nsp,
true);
771 if (dom.
hasChild(
"refine_criteria")) {
793 XML_Node& gv = flow.addChild(
"grid_data");
794 addFloat(flow,
"pressure", m_press,
"Pa",
"pressure");
800 soln.
getRow(c_offset_U, x.data());
803 soln.
getRow(c_offset_V, x.data());
806 soln.
getRow(c_offset_T, x.data());
809 soln.
getRow(c_offset_L, x.data());
812 for (
size_t k = 0; k < m_nsp; k++) {
813 soln.
getRow(c_offset_Y+k, x.data());
815 x.size(),x.data(),
"",
"massFraction");
822 for (
size_t i = 0; i <
nPoints(); i++) {
823 values[i] = m_do_energy[i];
827 values.resize(m_nsp);
828 for (
size_t i = 0; i < m_nsp; i++) {
829 values[i] = m_do_species[i];
833 XML_Node& ref = flow.addChild(
"refine_criteria");
846 void StFlow::solveEnergyEqn(
size_t j)
848 bool changed =
false;
850 for (
size_t i = 0; i < m_points; i++) {
851 if (!m_do_energy[i]) {
854 m_do_energy[i] =
true;
857 if (!m_do_energy[j]) {
860 m_do_energy[j] =
true;
862 m_refiner->setActive(c_offset_U,
true);
863 m_refiner->setActive(c_offset_V,
true);
864 m_refiner->setActive(c_offset_T,
true);
872 if (e_left < 0 || e_left > 1) {
874 "The left boundary emissivity must be between 0.0 and 1.0!");
875 }
else if (e_right < 0 || e_right > 1) {
877 "The right boundary emissivity must be between 0.0 and 1.0!");
879 m_epsilon_left = e_left;
880 m_epsilon_right = e_right;
884 void StFlow::fixTemperature(
size_t j)
886 bool changed =
false;
888 for (
size_t i = 0; i < m_points; i++) {
889 if (m_do_energy[i]) {
892 m_do_energy[i] =
false;
895 if (m_do_energy[j]) {
898 m_do_energy[j] =
false;
900 m_refiner->setActive(c_offset_U,
false);
901 m_refiner->setActive(c_offset_V,
false);
902 m_refiner->setActive(c_offset_T,
false);
910 size_t j = m_points - 1;
916 rsd[index(c_offset_V,j)] = V(x,j);
917 doublereal sum = 0.0;
918 rsd[index(c_offset_L, j)] = lambda(x,j) - lambda(x,j-1);
919 diag[index(c_offset_L, j)] = 0;
920 for (
size_t k = 0; k < m_nsp; k++) {
922 rsd[index(k+c_offset_Y,j)] = m_flux(k,j-1) + rho_u(x,j)*Y(x,k,j);
926 if (
domainType() == cAxisymmetricStagnationFlow) {
927 rsd[index(c_offset_U,j)] = rho_u(x,j);
928 if (m_do_energy[j]) {
929 rsd[index(c_offset_T,j)] = T(x,j);
931 rsd[index(c_offset_T, j)] = T(x,j) -
T_fixed(j);
934 rsd[index(c_offset_U,j)] = rho_u(x,j) - rho_u(x,j-1);
935 rsd[index(c_offset_T,j)] = T(x,j) - T(x,j-1);
942 diag[index(c_offset_U, j)] = 0;
948 if (
domainType() == cAxisymmetricStagnationFlow) {
952 rsd[index(c_offset_U,j)] =
953 -(rho_u(x,j+1) - rho_u(x,j))/m_dz[j]
954 -(density(j+1)*V(x,j+1) + density(j)*V(x,j));
957 rsd[index(c_offset_U,j)] =
958 - (rho_u(x,j) - rho_u(x,j-1))/m_dz[j-1]
959 - (density(j-1)*V(x,j-1) + density(j)*V(x,j));
961 if (m_do_energy[j]) {
962 rsd[index(c_offset_U,j)] = (T(x,j) -
m_tfixed);
964 rsd[index(c_offset_U,j)] = (rho_u(x,j)
968 rsd[index(c_offset_U,j)] =
969 - (rho_u(x,j+1) - rho_u(x,j))/m_dz[j]
970 - (density(j+1)*V(x,j+1) + density(j)*V(x,j));
void addFloatArray(XML_Node &node, const std::string &title, const size_t n, const doublereal *const vals, const std::string &units, const std::string &type, const doublereal minval, const doublereal maxval)
This function adds a child node with the name, "floatArray", with a value consisting of a comma separ...
const vector_fp & molecularWeights() const
Return a const reference to the internal vector of molecular weights.
std::vector< XML_Node * > getChildren(const std::string &name) const
Get a vector of pointers to XML_Node containing all of the children of the current node which match t...
virtual std::string componentName(size_t n) const
Name of the nth component. May be overloaded.
virtual void evalContinuity(size_t j, double *x, double *r, int *diag, double rdt)
Evaluate the residual corresponding to the continuity equation at all interior grid points...
void updateThermo(const doublereal *x, size_t j0, size_t j1)
Update the thermodynamic properties from point j0 to point j1 (inclusive), based on solution x...
CTML ("Cantera Markup Language") is the variant of XML that Cantera uses to store data...
bool m_do_radiation
flag for the radiative heat loss
void getMassFractions(doublereal *const y) const
Get the species mass fractions.
const doublereal StefanBoltz
Stefan-Boltzmann constant.
const doublereal OneAtm
One atmosphere [Pa].
size_t leftExcessSpecies() const
Index of the species on the left boundary with the largest mass fraction.
doublereal temperature() const
Temperature (K).
void resize(size_t n, size_t m, doublereal v=0.0)
Resize the array, and fill the new entries with 'v'.
void addNamedFloatArray(XML_Node &node, const std::string &name, const size_t n, const doublereal *const vals, const std::string units, const std::string type, const doublereal minval, const doublereal maxval)
This function adds a child node with the name given by the first parameter with a value consisting of...
size_t getFloatArray(const XML_Node &node, vector_fp &v, const bool convert, const std::string &unitsString, const std::string &nodeName)
This function reads the current node or a child node of the current node with the default name...
size_t speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
Class IdealGasPhase represents low-density gases that obey the ideal gas equation of state...
const size_t npos
index returned by functions to indicate "no position"
virtual void _finalize(const doublereal *x)
In some cases, a domain may need to set parameters that depend on the initial solution estimate...
size_t firstPoint() const
The index of the first (i.e., left-most) grid point belonging to this domain.
void addString(XML_Node &node, const std::string &titleString, const std::string &valueString, const std::string &typeString)
This function adds a child node with the name string with a string value to the current node...
Headers for the Transport object, which is the virtual base class for all transport property evaluato...
virtual void evalRightBoundary(double *x, double *res, int *diag, double rdt)
Evaluate all residual components at the right boundary.
void writelog(const std::string &fmt, const Args &... args)
Write a formatted message to the screen.
Class XML_Node is a tree-based representation of the contents of an XML file.
Base class for transport property managers.
size_t nSpecies() const
Returns the number of species in the phase.
void setPressure(doublereal p)
Set the pressure.
virtual doublereal density() const
Density (kg/m^3).
virtual void restore(const XML_Node &dom, doublereal *soln, int loglevel)
Restore the solution for this domain from an XML_Node.
doublereal * ptrColumn(size_t j)
Return a pointer to the top of column j, columns are contiguous in memory.
virtual void updateProperties(size_t jg, double *x, size_t jmin, size_t jmax)
Update the properties (thermo, transport, and diffusion flux).
const vector_fp & cp_R_ref() const
Returns a reference to the dimensionless reference state Heat Capacity vector.
const doublereal Undef
Fairly random number to be used to initialize variables against to see if they are subsequently defin...
A class for 2D arrays stored in column-major (Fortran-compatible) form.
virtual XML_Node & save(XML_Node &o, const doublereal *const sol)
Save the current solution for this domain into an XML_Node.
virtual void restore(const XML_Node &dom, doublereal *soln, int loglevel)
Restore the solution for this domain from an XML_Node.
std::vector< int > vector_int
Vector of ints.
Base class for one-dimensional domains.
virtual void evalResidual(double *x, double *rsd, int *diag, double rdt, size_t jmin, size_t jmax)
Evaluate the residual function.
size_t lastPoint() const
The index of the last (i.e., right-most) grid point belonging to this domain.
virtual void resize(size_t nv, size_t np)
void setCriteria(doublereal ratio=10.0, doublereal slope=0.8, doublereal curve=0.8, doublereal prune=-0.1)
Set grid refinement criteria.
vector_fp m_qdotRadiation
radiative heat loss vector
std::string speciesName(size_t k) const
Name of the species with index k.
void setFixedTempProfile(vector_fp &zfixed, vector_fp &tfixed)
Sometimes it is desired to carry out the simulation using a specified temperature profile...
void setTransport(Transport &trans)
set the transport manager
virtual void showSolution(const doublereal *x)
Print the solution.
virtual void resetBadValues(double *xg)
Base class for exceptions thrown by Cantera classes.
std::string value() const
Return the value of an XML node as a string.
virtual doublereal thermalConductivity()
Returns the mixture thermal conductivity in W/m/K.
virtual doublereal viscosity()
std::vector< size_t > m_kRadiating
Indices within the ThermoPhase of the radiating species.
void setGridMin(double gridmin)
Set the minimum allowable spacing between adjacent grid points [m].
void addAttribute(const std::string &attrib, const std::string &value)
Add or modify an attribute of the current node.
Refiner & refiner()
Return a reference to the grid refiner.
void getWdot(doublereal *x, size_t j)
Write the net production rates at point j into array m_wdot
virtual void setMassFractions_NoNorm(const doublereal *const y)
Set the mass fractions to the specified values without normalizing.
int domainType()
Domain type flag.
bool hasChild(const std::string &ch) const
Tests whether the current node has a child node with a particular name.
void debuglog(const std::string &msg, int loglevel)
Write a message to the log only if loglevel > 0.
XML_Node & child(const size_t n) const
Return a changeable reference to the n'th child of the current node.
virtual std::string flowType()
Return the type of flow domain being represented, either "Free Flame" or "Axisymmetric Stagnation"...
virtual void getMultiDiffCoeffs(const size_t ld, doublereal *const d)
Return the Multicomponent diffusion coefficients. Units: [m^2/s].
void setGas(const doublereal *x, size_t j)
Set the gas object state to be consistent with the solution at point j.
virtual void showSolution(const doublereal *x)
Print the solution.
void addFloat(XML_Node &node, const std::string &title, const doublereal val, const std::string &units, const std::string &type, const doublereal minval, const doublereal maxval)
This function adds a child node with the name, "float", with a value consisting of a single floating ...
virtual void updateTransport(doublereal *x, size_t j0, size_t j1)
Update the transport properties at grid points in the range from j0 to j1, based on solution x...
double m_tfixed
Temperature at the point used to fix the flame location.
virtual void getMixDiffCoeffs(doublereal *const d)
Returns a vector of mixture averaged diffusion coefficients.
virtual void setupGrid(size_t n, const doublereal *z)
called to set up initial grid, and after grid refinement
std::vector< double > vector_fp
Turn on the use of stl vectors for the basic array type within cantera Vector of doubles.
void setGasAtMidpoint(const doublereal *x, size_t j)
Set the gas state to be consistent with the solution at the midpoint between j and j + 1...
doublereal meanMolecularWeight() const
The mean molecular weight. Units: (kg/kmol)
virtual void setTemperature(const doublereal temp)
Set the internally stored temperature of the phase (K).
const vector_fp & enthalpy_RT_ref() const
Returns a reference to the dimensionless reference state enthalpy vector.
const doublereal GasConstant
Universal Gas Constant. [J/kmol/K].
virtual std::string transportType() const
Identifies the Transport object type.
doublereal getFloat(const XML_Node &parent, const std::string &name, const std::string &type)
Get a floating-point value from a child element.
virtual void updateDiffFluxes(const doublereal *x, size_t j0, size_t j1)
Update the diffusive mass fluxes.
doublereal T_fixed(size_t j) const
The fixed temperature value at point j.
size_t rightExcessSpecies() const
Index of the species on the right boundary with the largest mass fraction.
virtual void setMassFractions(const doublereal *const y)
Set the mass fractions to the specified values and normalize them.
size_t m_kExcessLeft
Index of species with a large mass fraction at each boundary, for which the mass fraction may be calc...
virtual void getThermalDiffCoeffs(doublereal *const dt)
Return a vector of Thermal diffusion coefficients [kg/m/sec].
virtual void _getInitialSoln(double *x)
Write the initial solution estimate into array x.
void getRow(size_t n, doublereal *const rw)
Get the nth row and return it in a vector.
virtual void resize(size_t components, size_t points)
Change the grid size. Called after grid refinement.
size_t nPoints() const
Number of grid points in this domain.
Namespace for the Cantera kernel.
double m_zfixed
Location of the point where temperature is fixed.
virtual doublereal maxTemp(size_t k=npos) const
Maximum temperature for which the thermodynamic data for the species are valid.
Header for a file containing miscellaneous numerical functions.
void setBoundaryEmissivities(doublereal e_left, doublereal e_right)
Set the emissivities for the boundary values.
virtual void eval(size_t j, doublereal *x, doublereal *r, integer *mask, doublereal rdt)
size_t nColumns() const
Number of columns.
virtual size_t loc(size_t j=0) const
Location of the start of the local solution vector in the global solution vector,.
doublereal linearInterp(doublereal x, const vector_fp &xpts, const vector_fp &fpts)
Linearly interpolate a function defined on a discrete grid.
virtual XML_Node & save(XML_Node &o, const doublereal *const sol)
Save the current solution for this domain into an XML_Node.
virtual void setPressure(doublereal p)
Set the pressure at constant temperature and composition.
bool getOptionalFloat(const XML_Node &parent, const std::string &name, doublereal &fltRtn, const std::string &type)
Get an optional floating-point value from a child element.