26 m_do_multicomponent(false),
27 m_do_radiation(false),
51 m_nv = c_offset_Y + m_nsp;
54 m_do_species.resize(m_nsp,
true);
57 m_do_energy.resize(m_points,
false);
59 m_diff.resize(m_nsp*m_points);
60 m_multidiff.resize(m_nsp*m_nsp*m_points);
61 m_flux.
resize(m_nsp,m_points);
62 m_wdot.
resize(m_nsp,m_points, 0.0);
67 setBounds(0, -1e20, 1e20);
68 setBounds(1, -1e20, 1e20);
69 setBounds(2, 200.0, 1e9);
70 setBounds(3, -1e20, 1e20);
73 for (
size_t k = 0; k < m_nsp; k++) {
74 setBounds(c_offset_Y+k, -1.0e-7, 1.0e5);
78 m_refiner->setActive(0,
false);
79 m_refiner->setActive(1,
false);
80 m_refiner->setActive(2,
false);
81 m_refiner->setActive(3,
false);
84 for (
size_t ng = 0; ng < m_points; ng++) {
85 gr.push_back(1.0*ng/m_points);
88 setID(
"stagnation flow");
99 m_rho.resize(m_points, 0.0);
100 m_wtm.resize(m_points, 0.0);
101 m_cp.resize(m_points, 0.0);
102 m_visc.resize(m_points, 0.0);
103 m_tcon.resize(m_points, 0.0);
105 m_diff.resize(m_nsp*m_points);
106 if (m_do_multicomponent) {
107 m_multidiff.resize(m_nsp*m_nsp*m_points);
108 m_dthermal.
resize(m_nsp, m_points, 0.0);
110 m_flux.
resize(m_nsp,m_points);
111 m_wdot.
resize(m_nsp,m_points, 0.0);
112 m_do_energy.resize(m_points,
false);
114 m_fixedtemp.resize(m_points);
116 m_dz.resize(m_points-1);
117 m_z.resize(m_points);
125 for (
size_t j = 1; j < m_points; j++) {
126 if (z[j] <= z[j-1]) {
128 "grid points must be monotonically increasing");
131 m_dz[j-1] = m_z[j] - m_z[j-1];
136 double* x = xg +
loc();
137 for (
size_t j = 0; j < m_points; j++) {
138 double* Y = x + m_nv*j + c_offset_Y;
147 m_do_soret = withSoret;
150 m_diff.resize(m_nsp*m_points);
151 if (m_do_multicomponent) {
152 m_multidiff.resize(m_nsp*m_nsp*m_points);
153 m_dthermal.
resize(m_nsp, m_points, 0.0);
154 }
else if (withSoret) {
156 "Thermal diffusion (the Soret effect) " 157 "requires using a multicomponent transport model.");
160 warn_deprecated(
"setTransport(Transport& trans, bool withSoret = false)",
161 "The withSoret argument is deprecated and unused. Use " 162 "the form of setTransport with signature setTransport(Transport& trans)." 163 "To be removed after Cantera 2.3.");
171 m_diff.resize(m_nsp*m_points);
172 if (m_do_multicomponent) {
173 m_multidiff.resize(m_nsp*m_nsp*m_points);
174 m_dthermal.
resize(m_nsp, m_points, 0.0);
178 void StFlow::enableSoret(
bool withSoret)
180 if (m_do_multicomponent) {
181 m_do_soret = withSoret;
183 throw CanteraError(
"setTransport",
184 "Thermal diffusion (the Soret effect) " 185 "requires using a multicomponent transport model.");
191 for (
size_t j = 0; j < m_points; j++) {
200 const doublereal* yy = x + m_nv*j + c_offset_Y;
208 const doublereal* yyj = x + m_nv*j + c_offset_Y;
209 const doublereal* yyjp = x + m_nv*(j+1) + c_offset_Y;
210 for (
size_t k = 0; k < m_nsp; k++) {
211 m_ybar[k] = 0.5*(yyj[k] + yyjp[k]);
219 size_t nz = m_zfix.size();
220 bool e = m_do_energy[0];
221 for (
size_t j = 0; j < m_points; j++) {
223 m_fixedtemp[j] = T(x, j);
225 double zz = (z(j) - z(0))/(z(m_points - 1) - z(0));
236 doublereal* rg, integer* diagg, doublereal rdt)
250 doublereal* x = xg +
loc();
251 doublereal* rsd = rg +
loc();
252 integer* diag = diagg +
loc();
259 size_t jpt = (jg == 0) ? 0 : jg -
firstPoint();
260 jmin = std::max<size_t>(jpt, 1) - 1;
261 jmax = std::min(jpt+1,m_points-1);
265 size_t j0 = std::max<size_t>(jmin, 1) - 1;
266 size_t j1 = std::min(jmax+1,m_points-1);
271 if (jg ==
npos || m_force_full_update) {
277 double* Yleft = x + index(c_offset_Y, jmin);
278 m_kExcessLeft = distance(Yleft, max_element(Yleft, Yleft + m_nsp));
279 double* Yright = x + index(c_offset_Y, jmax);
280 m_kExcessRight = distance(Yright, max_element(Yright, Yright + m_nsp));
310 doublereal k_P_ref = 1.0*
OneAtm;
313 const doublereal c_H2O[6] = {-0.23093, -1.12390, 9.41530, -2.99880,
314 0.51382, -1.86840e-5};
315 const doublereal c_CO2[6] = {18.741, -121.310, 273.500, -194.050,
319 double boundary_Rad_left = m_epsilon_left *
StefanBoltz * pow(T(x, 0), 4);
320 double boundary_Rad_right = m_epsilon_right *
StefanBoltz * pow(T(x, m_points - 1), 4);
323 for (
size_t j = jmin; j < jmax; j++) {
325 double radiative_heat_loss = 0;
332 for (
size_t n = 0; n <= 5; n++) {
333 k_P_H2O += c_H2O[n] * pow(1000 / T(x, j), (
double) n);
341 for (
size_t n = 0; n <= 5; n++) {
342 k_P_CO2 += c_CO2[n] * pow(1000 / T(x, j), (
double) n);
349 radiative_heat_loss = 2 * k_P *(2 *
StefanBoltz * pow(T(x, j), 4)
350 - boundary_Rad_left - boundary_Rad_right);
357 for (
size_t j = jmin; j <= jmax; j++) {
368 rsd[index(c_offset_U,0)] =
369 -(rho_u(x,1) - rho_u(x,0))/m_dz[0]
370 -(density(1)*V(x,1) + density(0)*V(x,0));
376 rsd[index(c_offset_V,0)] = V(x,0);
377 rsd[index(c_offset_T,0)] = T(x,0);
378 rsd[index(c_offset_L,0)] = -rho_u(x,0);
383 for (
size_t k = 0; k < m_nsp; k++) {
385 rsd[index(c_offset_Y + k, 0)] =
386 -(m_flux(k,0) + rho_u(x,0)* Y(x,k,0));
389 }
else if (j == m_points - 1) {
400 rsd[index(c_offset_V,j)]
401 = (shear(x,j) - lambda(x,j) - rho_u(x,j)*dVdz(x,j)
402 - m_rho[j]*V(x,j)*V(x,j))/m_rho[j]
403 - rdt*(V(x,j) - V_prev(j));
404 diag[index(c_offset_V, j)] = 1;
413 for (
size_t k = 0; k < m_nsp; k++) {
414 double convec = rho_u(x,j)*dYdz(x,k,j);
415 double diffus = 2.0*(m_flux(k,j) - m_flux(k,j-1))
417 rsd[index(c_offset_Y + k, j)]
418 = (m_wt[k]*(wdot(k,j))
419 - convec - diffus)/m_rho[j]
420 - rdt*(Y(x,k,j) - Y_prev(k,j));
421 diag[index(c_offset_Y + k, j)] = 1;
432 if (m_do_energy[j]) {
440 for (
size_t k = 0; k < m_nsp; k++) {
441 double flxk = 0.5*(m_flux(k,j-1) + m_flux(k,j));
442 sum += wdot(k,j)*h_RT[k];
443 sum2 += flxk*cp_R[k]/m_wt[k];
446 double dtdzj = dTdz(x,j);
449 rsd[index(c_offset_T, j)] = - m_cp[j]*rho_u(x,j)*dtdzj
450 - divHeatFlux(x,j) - sum - sum2;
451 rsd[index(c_offset_T, j)] /= (m_rho[j]*m_cp[j]);
452 rsd[index(c_offset_T, j)] -= rdt*(T(x,j) - T_prev(j));
453 rsd[index(c_offset_T, j)] -= (
m_qdotRadiation[j] / (m_rho[j] * m_cp[j]));
454 diag[index(c_offset_T, j)] = 1;
457 rsd[index(c_offset_T, j)] = T(x,j) -
T_fixed(j);
458 diag[index(c_offset_T, j)] = 0;
461 rsd[index(c_offset_L, j)] = lambda(x,j) - lambda(x,j-1);
462 diag[index(c_offset_L, j)] = 0;
469 if (m_do_multicomponent) {
470 for (
size_t j = j0; j < j1; j++) {
473 doublereal rho = m_thermo->
density();
474 m_visc[j] = (m_dovisc ? m_trans->
viscosity() : 0.0);
478 for (
size_t k = 0; k < m_nsp; k++) {
479 m_diff[k+j*m_nsp] = m_wt[k] * rho / (wtm*wtm);
488 for (
size_t j = j0; j < j1; j++) {
490 m_visc[j] = (m_dovisc ? m_trans->
viscosity() : 0.0);
499 writelog(
" Pressure: {:10.4g} Pa\n", m_press);
504 writeline(
'-', 79,
false,
true);
505 writelog(
"\n z radiative heat loss");
506 writeline(
'-', 79,
false,
true);
507 for (
size_t j = 0; j < m_points; j++) {
516 if (m_do_multicomponent) {
517 for (
size_t j = j0; j < j1; j++) {
518 double dz = z(j+1) - z(j);
519 for (
size_t k = 0; k < m_nsp; k++) {
520 doublereal sum = 0.0;
521 for (
size_t m = 0; m < m_nsp; m++) {
522 sum += m_wt[m] * m_multidiff[mindex(k,m,j)] * (X(x,m,j+1)-X(x,m,j));
524 m_flux(k,j) = sum * m_diff[k+j*m_nsp] / dz;
528 for (
size_t j = j0; j < j1; j++) {
530 double wtm = m_wtm[j];
531 double rho = density(j);
532 double dz = z(j+1) - z(j);
533 for (
size_t k = 0; k < m_nsp; k++) {
534 m_flux(k,j) = m_wt[k]*(rho*m_diff[k+m_nsp*j]/wtm);
535 m_flux(k,j) *= (X(x,k,j) - X(x,k,j+1))/dz;
539 for (
size_t k = 0; k < m_nsp; k++) {
540 m_flux(k,j) += sum*Y(x,k,j);
546 for (
size_t m = j0; m < j1; m++) {
547 double gradlogT = 2.0 * (T(x,m+1) - T(x,m)) /
548 ((T(x,m+1) + T(x,m)) * (z(m+1) - z(m)));
549 for (
size_t k = 0; k < m_nsp; k++) {
550 m_flux(k,m) -= m_dthermal(k,m)*gradlogT;
568 if (n >= c_offset_Y && n < (c_offset_Y + m_nsp)) {
576 size_t StFlow::componentIndex(
const std::string& name)
const 580 }
else if (name==
"V") {
582 }
else if (name==
"T") {
584 }
else if (name==
"lambda") {
587 for (
size_t n=c_offset_Y; n<m_nsp+c_offset_Y; n++) {
599 vector<string> ignored;
604 for (
size_t istr = 0; istr < str.size(); istr++) {
609 double pp =
getFloat(dom,
"pressure",
"pressure");
614 bool readgrid =
false, wrote_header =
false;
615 for (
size_t n = 0; n < d.size(); n++) {
617 string nm = fa[
"title"];
622 writelog(
"Grid contains {} points.\n", np);
630 "domain contains no grid points.");
633 debuglog(
"Importing datasets:\n", loglevel >= 2);
634 for (
size_t n = 0; n < d.size(); n++) {
636 string nm = fa[
"title"];
639 debuglog(
"axial velocity ", loglevel >= 2);
640 if (x.size() != np) {
642 "axial velocity array size error");
644 for (
size_t j = 0; j < np; j++) {
645 soln[index(0,j)] = x[j];
647 }
else if (nm ==
"z") {
649 }
else if (nm ==
"V") {
650 debuglog(
"radial velocity ", loglevel >= 2);
651 if (x.size() != np) {
653 "radial velocity array size error");
655 for (
size_t j = 0; j < np; j++) {
656 soln[index(1,j)] = x[j];
658 }
else if (nm ==
"T") {
659 debuglog(
"temperature ", loglevel >= 2);
660 if (x.size() != np) {
662 "temperature array size error");
664 for (
size_t j = 0; j < np; j++) {
665 soln[index(2,j)] = x[j];
672 for (
size_t jj = 0; jj < np; jj++) {
673 zz[jj] = (grid(jj) - zmin())/(zmax() - zmin());
676 }
else if (nm ==
"L") {
678 if (x.size() != np) {
680 "lambda arary size error");
682 for (
size_t j = 0; j < np; j++) {
683 soln[index(3,j)] = x[j];
687 if (x.size() == np) {
690 for (
size_t j = 0; j < np; j++) {
691 soln[index(k+c_offset_Y,j)] = x[j];
695 ignored.push_back(nm);
699 if (loglevel >=2 && !ignored.empty()) {
702 size_t nn = ignored.size();
703 for (
size_t n = 0; n < nn; n++) {
709 for (
size_t ks = 0; ks < nsp; ks++) {
710 if (did_species[ks] == 0) {
712 writelog(
"Missing data for species:\n");
720 if (dom.
hasChild(
"energy_enabled")) {
723 for (
size_t i = 0; i < x.size(); i++) {
724 m_do_energy[i] = (x[i] != 0);
726 }
else if (!x.empty()) {
727 throw CanteraError(
"StFlow::restore",
"energy_enabled is length {}" 728 "but should be length {}", x.size(),
nPoints());
732 if (dom.
hasChild(
"species_enabled")) {
734 if (x.size() == m_nsp) {
735 for (
size_t i = 0; i < x.size(); i++) {
736 m_do_species[i] = (x[i] != 0);
738 }
else if (!x.empty()) {
742 writelog(
"\nWarning: StFlow::restore: species_enabled is " 743 "length {} but should be length {}. Enabling all species " 744 "equations by default.", x.size(), m_nsp);
746 m_do_species.assign(m_nsp,
true);
750 if (dom.
hasChild(
"refine_criteria")) {
767 XML_Node& gv = flow.addChild(
"grid_data");
768 addFloat(flow,
"pressure", m_press,
"Pa",
"pressure");
786 for (
size_t k = 0; k < m_nsp; k++) {
787 soln.
getRow(c_offset_Y+k, x.data());
789 x.size(),x.data(),
"",
"massFraction");
796 for (
size_t i = 0; i <
nPoints(); i++) {
797 values[i] = m_do_energy[i];
801 values.resize(m_nsp);
802 for (
size_t i = 0; i < m_nsp; i++) {
803 values[i] = m_do_species[i];
807 XML_Node& ref = flow.addChild(
"refine_criteria");
816 void StFlow::solveEnergyEqn(
size_t j)
818 bool changed =
false;
820 for (
size_t i = 0; i < m_points; i++) {
821 if (!m_do_energy[i]) {
824 m_do_energy[i] =
true;
827 if (!m_do_energy[j]) {
830 m_do_energy[j] =
true;
832 m_refiner->setActive(0,
true);
833 m_refiner->setActive(1,
true);
834 m_refiner->setActive(2,
true);
842 if (e_left < 0 || e_left > 1) {
844 "The left boundary emissivity must be between 0.0 and 1.0!");
845 }
else if (e_right < 0 || e_right > 1) {
847 "The right boundary emissivity must be between 0.0 and 1.0!");
849 m_epsilon_left = e_left;
850 m_epsilon_right = e_right;
854 void StFlow::fixTemperature(
size_t j)
856 bool changed =
false;
858 for (
size_t i = 0; i < m_points; i++) {
859 if (m_do_energy[i]) {
862 m_do_energy[i] =
false;
865 if (m_do_energy[j]) {
868 m_do_energy[j] =
false;
870 m_refiner->setActive(0,
false);
871 m_refiner->setActive(1,
false);
872 m_refiner->setActive(2,
false);
879 integer* diag, doublereal rdt)
881 size_t j = m_points - 1;
885 rsd[index(0,j)] = rho_u(x,j);
886 rsd[index(1,j)] = V(x,j);
887 rsd[index(2,j)] = T(x,j);
888 rsd[index(c_offset_L, j)] = lambda(x,j) - lambda(x,j-1);
889 diag[index(c_offset_L, j)] = 0;
890 doublereal sum = 0.0;
891 for (
size_t k = 0; k < m_nsp; k++) {
893 rsd[index(k+c_offset_Y,j)] = m_flux(k,j-1) + rho_u(x,j)*Y(x,k,j);
900 integer* diag, doublereal rdt)
911 rsd[index(c_offset_U,j)] =
912 -(rho_u(x,j+1) - rho_u(x,j))/m_dz[j]
913 -(density(j+1)*V(x,j+1) + density(j)*V(x,j));
916 diag[index(c_offset_U, j)] = 0;
919 FreeFlame::FreeFlame(
IdealGasPhase* ph,
size_t nsp,
size_t points) :
929 integer* diag, doublereal rdt)
931 size_t j = m_points - 1;
938 rsd[index(0,j)] = rho_u(x,j) - rho_u(x,j-1);
939 rsd[index(1,j)] = V(x,j);
940 rsd[index(2,j)] = T(x,j) - T(x,j-1);
941 doublereal sum = 0.0;
942 rsd[index(c_offset_L, j)] = lambda(x,j) - lambda(x,j-1);
943 diag[index(c_offset_L, j)] = 0;
944 for (
size_t k = 0; k < m_nsp; k++) {
946 rsd[index(k+c_offset_Y,j)] = m_flux(k,j-1) + rho_u(x,j)*Y(x,k,j);
953 integer* diag, doublereal rdt)
961 rsd[index(c_offset_U,j)] =
962 - (rho_u(x,j) - rho_u(x,j-1))/m_dz[j-1]
963 - (density(j-1)*V(x,j-1) + density(j)*V(x,j));
965 if (m_do_energy[j]) {
966 rsd[index(c_offset_U,j)] = (T(x,j) -
m_tfixed);
968 rsd[index(c_offset_U,j)] = (rho_u(x,j)
972 rsd[index(c_offset_U,j)] =
973 - (rho_u(x,j+1) - rho_u(x,j))/m_dz[j]
974 - (density(j+1)*V(x,j+1) + density(j)*V(x,j));
977 diag[index(c_offset_U, j)] = 0;
987 for (
size_t j = 0; j < m_points; j++) {
993 for (
size_t j = 0; j < m_points - 1; 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...
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...
virtual std::string componentName(size_t n) const
Name of the nth component. May be overloaded.
virtual void _finalize(const doublereal *x)
In some cases, a domain may need to set parameters that depend on the initial solution estimate...
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...
virtual void evalRightBoundary(doublereal *x, doublereal *res, integer *diag, doublereal rdt)=0
Evaluate all residual components at the right boundary.
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.
This class represents 1D flow domains that satisfy the one-dimensional similarity solution for chemic...
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 speciesIndex(const std::string &name) const
Returns the index of a species named 'name' within the Phase object.
virtual void evalRightBoundary(doublereal *x, doublereal *res, integer *diag, doublereal rdt)
Evaluate all residual components at the right boundary.
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 restore(const XML_Node &dom, doublereal *soln, int loglevel)
Restore the solution for this domain from an XML_Node.
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.
virtual void evalContinuity(size_t j, doublereal *x, doublereal *r, integer *diag, doublereal rdt)
Evaluate the residual corresponding to the continuity equation at all interior grid points...
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...
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.
virtual XML_Node & save(XML_Node &o, const doublereal *const sol)
Save the current solution for this domain into an XML_Node.
Base class for transport property managers.
void warn_deprecated(const std::string &method, const std::string &extra)
Print a warning indicating that method is deprecated.
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 evalContinuity(size_t j, doublereal *x, doublereal *r, integer *diag, doublereal rdt)=0
Evaluate the residual corresponding to the continuity equation at all interior grid points...
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.
doublereal m_tfixed
Temperature at the point used to fix the flame location.
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.
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.
void setID(const std::string &s)
Specify an identifying tag for this domain.
vector_fp m_qdotRadiation
radiative heat loss vector
virtual void evalRightBoundary(doublereal *x, doublereal *res, integer *diag, doublereal rdt)
Evaluate all residual components at the right boundary.
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.
doublereal m_zfixed
Location of the point where temperature is fixed.
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.
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 void evalContinuity(size_t j, doublereal *x, doublereal *r, integer *diag, doublereal rdt)
Evaluate the residual corresponding to the continuity equation at all interior grid points...
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 ...
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...
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.
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.
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.
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.