22 for (
auto& dom : domains) {
31 for (
size_t n = 0; n <
m_dom.size(); n++) {
32 if (
domain(n).
id() == name) {
36 throw CanteraError(
"OneDim::domainIndex",
"Domain '{}' not found", name);
49 const auto& [dom, pt, comp] =
component(i);
50 return fmt::format(
"domain {}, component {} at point {}", dom, comp, pt);
55 return {
"",
"Domain Pt. Component"};
60 const auto& [dom, pt, comp] =
component(i);
61 return fmt::format(
"{:8s} {:3d} {:<12s}", dom, pt, comp);
82 size_t n =
m_dom.size();
84 m_dom.back()->append(d.get());
97 d->setContainer(
this,
m_dom.size()-1);
104 const double* x =
m_state->data();
106 for (
size_t n = 0; n < nd; n++) {
111 size_t dstart =
start(n);
113 for (
size_t i = 0; i < nv; i++) {
115 for (
size_t j = 0; j < np; j++) {
116 esum += fabs(x[dstart + nv*j + i]);
118 double ewt = dom.
rtol(i)*esum/np + dom.
atol(i);
119 for (
size_t j = 0; j < np; j++) {
120 double f = step[dstart + nv*j + i]/ewt;
126 return sqrt(sum /
size());
132 "Replaced by linearSolver(). To be removed after Cantera 3.2.");
133 auto multijac = dynamic_pointer_cast<MultiJac>(
m_jac);
137 throw CanteraError(
"OneDim::jacobian",
"Active Jacobian is not a MultiJac");
144 writelog(
"\nStatistics:\n\n Grid Timesteps Functions Time Jacobians Time\n");
146 for (
size_t i = 0; i < n; i++) {
148 writelog(
"{:5d} {:5d} {:6d} {:9.4f} {:5d} {:9.4f}\n",
152 writelog(
"{:5d} {:5d} {:6d} NA {:5d} NA\n",
161 int nev =
m_jac->nEvals();
200 for (
size_t i = 0; i <
nDomains(); i++) {
201 const auto& d =
m_dom[i];
203 size_t np = d->nPoints();
204 size_t nv = d->nComponents();
205 for (
size_t n = 0; n < np; n++) {
210 for (
size_t k = 0; k < nv; k++) {
218 size_t bw1 = d->bandwidth();
220 bw1 = std::max<size_t>(2*d->nComponents(), 1) - 1;
227 size_t bw2 =
m_dom[i-1]->bandwidth();
229 bw2 =
m_dom[i-1]->nComponents();
231 bw2 += d->nComponents() - 1;
234 m_size = d->loc() + d->size();
254void OneDim::eval(
size_t j,
double* x,
double* r,
double rdt,
int count)
256 clock_t t0 = clock();
269 for (
const auto& d :
m_bulk) {
280 clock_t t1 = clock();
289 clock_t t0 = clock();
291 m_work2.resize(
size());
294 for (
size_t j = 0; j <
points(); j++) {
295 size_t nv =
nVars(j);
296 for (
size_t n = 0; n < nv; n++) {
298 double xsave = x0[ipt];
303 x0[ipt] = xsave + dx;
304 double rdx = 1.0 / (x0[ipt] - xsave);
307 eval(j, x0, m_work2.data(), 0.0, 0);
310 for (
size_t i = j - 1; i != j+2; i++) {
312 size_t mv =
nVars(i);
313 size_t iloc =
loc(i);
314 for (
size_t m = 0; m < mv; m++) {
315 double delta = m_work2[m+iloc] -
m_work1[m+iloc];
317 m_jac->setValue(m + iloc, ipt, delta * rdx);
327 m_jac->updateElapsed(
double(clock() - t0) / CLOCKS_PER_SEC);
328 m_jac->incrementEvals();
371 for (
auto dom :
m_dom) {
372 dom->resetBadValues(x);
Base class for exceptions thrown by Cantera classes.
Base class for one-dimensional domains.
size_t nComponents() const
Number of components at each grid point.
double rtol(size_t n)
Relative tolerance of the nth component.
Domain1D * left() const
Return a pointer to the left neighbor.
string id() const
Returns the identifying tag for this domain.
size_t nPoints() const
Number of grid points in this domain.
double lowerBound(size_t n) const
Lower bound on the nth component.
double upperBound(size_t n) const
Upper bound on the nth component.
Domain1D * right() const
Return a pointer to the right neighbor.
virtual string componentName(size_t n) const
Name of component n. May be overloaded.
virtual void init()
Initialize.
double atol(size_t n)
Absolute tolerance of the nth component.
void initTimeInteg(double dt, const double *x0)
Performs the setup required before starting a time-stepping solution.
void setSteadyMode()
Set the internally-stored reciprocal of the time step to 0.0, which is used to indicate that the prob...
virtual size_t loc(size_t j=0) const
Location of the start of the local solution vector in the global solution vector.
virtual double eval(double t) const
Evaluate the function.
An array index is out of range.
Class MultiJac evaluates the Jacobian of a system of equations defined by a residual function supplie...
size_t start(size_t i) const
The index of the start of domain i in the solution vector.
void init()
Initialize all domains.
double weightedNorm(const double *step) const override
Compute the weighted norm of a step vector.
void resize() override
Call to set the size of internal data structures after first defining the system or if the problem si...
string componentName(size_t i) const override
Get the name of the i-th component of the state vector.
void saveStats()
Save statistics on function and Jacobian evaluation, and reset the counters.
pair< string, string > componentTableHeader() const override
Get header lines describing the column names included in a component label.
size_t loc(size_t jg)
Location in the solution vector of the first component of global point jg.
double upperBound(size_t i) const override
Get the upper bound for global component i in the state vector.
void eval(size_t j, double *x, double *r, double rdt=-1.0, int count=1)
Evaluate the multi-domain residual function.
void addDomain(shared_ptr< Domain1D > d)
Add a domain. Domains are added left-to-right.
string componentTableLabel(size_t i) const override
Get elements of the component name, aligned with the column headings given by componentTableHeader().
size_t nDomains() const
Number of domains.
vector< double > m_jacElapsed
Time [s] spent evaluating Jacobians on this grid.
Domain1D * right()
Pointer to right-most domain (last added).
size_t domainIndex(const string &name) const
Get the index of the domain named name.
OneDim()=default
Default constructor.
void setSteadyMode() override
Prepare to solve the steady-state problem.
vector< double > m_funcElapsed
Time [s] spent on residual function evaluations on this grid (not counting evaluations used to constr...
vector< shared_ptr< Domain1D > > m_connect
All connector and boundary domains.
vector< std::tuple< size_t, size_t, size_t > > m_componentInfo
Domain, grid point, and component indices for each element of the global state vector.
vector< shared_ptr< Domain1D > > m_bulk
All bulk/flow domains.
vector< int > m_funcEvals
Number of residual function evaluations on this grid (not counting evaluations used to construct Jaco...
vector< size_t > m_loc
Location in the state vector of the first component of each point, across all domains.
void evalJacobian(double *x0) override
Evaluates the Jacobian at x0 using finite differences.
double m_evaltime
Total time [s] spent in eval()
size_t nVars(size_t jg)
Number of solution components at global point jg.
std::tuple< string, size_t, string > component(size_t i) const
Return the domain, local point index, and component name for the i-th component of the global solutio...
Domain1D * pointDomain(size_t i)
Return a pointer to the domain global point i belongs to.
void resetBadValues(double *x) override
Reset values such as negative species concentrations.
vector< size_t > m_gridpts
Number of grid points in this grid.
size_t points()
Total number of points.
vector< size_t > m_nvars
Number of variables at each point, across all domains.
int m_nevals
Number of calls to eval()
bool m_init
Indicates whether one-time initialization for each domain has been completed.
void writeStats(int printTime=1)
Write statistics about the number of iterations and Jacobians at each grid level.
void clearStats()
Clear saved statistics.
size_t m_pts
Total number of points.
vector< int > m_jacEvals
Number of Jacobian evaluations on this grid.
void initTimeInteg(double dt, double *x) override
Prepare for time stepping beginning with solution x and timestep dt.
vector< int > m_timeSteps
Number of time steps taken in each call to solve() (for example, for each successive grid refinement)
Domain1D & domain(size_t i) const
Return a reference to domain i.
vector< shared_ptr< Domain1D > > m_dom
All domains comprising the system.
Domain1D * left()
Pointer to left-most domain (first added).
double lowerBound(size_t i) const override
Get the lower bound for global component i in the state vector.
int m_nsteps
Number of time steps taken in the current call to solve()
size_t m_size
Solution vector size
virtual void resize()
Call to set the size of internal data structures after first defining the system or if the problem si...
double m_jacobianAbsPerturb
Absolute perturbation of each component in finite difference Jacobian.
size_t size() const
Total solution vector length;.
double rdt() const
Reciprocal of the time step.
virtual void initTimeInteg(double dt, double *x)
Prepare for time stepping beginning with solution x and timestep dt.
double m_rdt
Reciprocal of time step.
double m_jacobianThreshold
Threshold for ignoring small elements in Jacobian.
shared_ptr< SystemJacobian > m_jac
Jacobian evaluator.
shared_ptr< vector< double > > m_state
Solution vector.
vector< int > m_mask
Transient mask.
Func1 * m_interrupt
Function called at the start of every call to eval.
size_t m_bw
Jacobian bandwidth.
virtual void setSteadyMode()
Prepare to solve the steady-state problem.
double m_jacobianRelPerturb
Relative perturbation of each component in finite difference Jacobian.
vector< double > m_work1
Work arrays used during Jacobian evaluation.
MultiJac & jacobian()
Return a reference to the Jacobian evaluator of an OneDim object.
void writelog(const string &fmt, const Args &... args)
Write a formatted message to the screen.
Namespace for the Cantera kernel.
const size_t npos
index returned by functions to indicate "no position"
shared_ptr< SystemJacobian > newSystemJacobian(const string &type)
Create a SystemJacobian object of the specified type.
void warn_deprecated(const string &source, const AnyBase &node, const string &message)
A deprecation warning for syntax in an input file.