void ReactorNet::initialize() { size_t n, nv; char buf[100]; m_nv = 0; m_reactors.clear(); m_nreactors = 0; writelog("Initializing reactor network.\n", m_verbose); if (m_nr == 0) throw CanteraError("ReactorNet::initialize", "no reactors in network!"); size_t sensParamNumber = 0; for (n = 0; n < m_nr; n++) { if (m_r[n]->type() >= ReactorType) { m_r[n]->initialize(m_time); Reactor* r = (Reactor*)m_r[n]; m_reactors.push_back(r); nv = r->neq(); m_size.push_back(nv); m_nparams.push_back(r->nSensParams()); std::vector<std::pair<void*, int> > sens_objs = r->getSensitivityOrder(); for (size_t i = 0; i < sens_objs.size(); i++) { std::map<size_t, size_t>& s = m_sensOrder[sens_objs[i]]; for (std::map<size_t, size_t>::iterator iter = s.begin(); iter != s.end(); ++iter) { m_sensIndex.resize(std::max(iter->second + 1, m_sensIndex.size())); m_sensIndex[iter->second] = sensParamNumber++; } } m_nv += nv; m_nreactors++; if (m_verbose) { sprintf(buf,"Reactor %s: %s variables.\n", int2str(n).c_str(), int2str(nv).c_str()); writelog(buf); sprintf(buf," %s sensitivity params.\n", int2str(r->nSensParams()).c_str()); writelog(buf); } if (m_r[n]->type() == FlowReactorType && m_nr > 1) { throw CanteraError("ReactorNet::initialize", "FlowReactors must be used alone."); } } } m_connect.resize(m_nr*m_nr,0); m_ydot.resize(m_nv,0.0); size_t i, j, nin, nout, nw; ReactorBase* r, *rj; for (i = 0; i < m_nr; i++) { r = m_reactors[i]; for (j = 0; j < m_nr; j++) { if (i == j) { connect(i,j); } else { rj = m_reactors[j]; nin = rj->nInlets(); for (n = 0; n < nin; n++) { if (&rj->inlet(n).out() == r) { connect(i,j); } } nout = rj->nOutlets(); for (n = 0; n < nout; n++) { if (&rj->outlet(n).in() == r) { connect(i,j); } } nw = rj->nWalls(); for (n = 0; n < nw; n++) { if (&rj->wall(n).left() == rj && &rj->wall(n).right() == r) { connect(i,j); } else if (&rj->wall(n).left() == r && &rj->wall(n).right() == rj) { connect(i,j); } } } } } m_atol.resize(neq()); fill(m_atol.begin(), m_atol.end(), m_atols); m_integ->setTolerances(m_rtol, neq(), DATA_PTR(m_atol)); m_integ->setSensitivityTolerances(m_rtolsens, m_atolsens); m_integ->setMaxStepSize(m_maxstep); m_integ->setMaxErrTestFails(m_maxErrTestFails); if (m_verbose) { sprintf(buf, "Number of equations: %s\n", int2str(neq()).c_str()); writelog(buf); sprintf(buf, "Maximum time step: %14.6g\n", m_maxstep); writelog(buf); } m_integ->initialize(m_time, *this); m_init = true; }
void ReactorNet::initialize(doublereal t0) { int n, nv; char buf[100]; m_nv = 0; m_reactors.clear(); m_nreactors = 0; if (m_verbose) { writelog("Initializing reactor network.\n"); } if (m_nr == 0) throw CanteraError("ReactorNet::initialize", "no reactors in network!"); for (n = 0; n < m_nr; n++) { if (m_r[n]->type() >= ReactorType) { m_r[n]->initialize(t0); Reactor* r = (Reactor*)m_r[n]; m_reactors.push_back(r); nv = r->neq(); m_size.push_back(nv); m_nparams.push_back(r->nSensParams()); m_ntotpar += r->nSensParams(); m_nv += nv; m_nreactors++; if (m_verbose) { sprintf(buf,"Reactor %d: %d variables.\n",n,nv); writelog(buf); sprintf(buf," %d sensitivity params.\n", r->nSensParams()); writelog(buf); } if (m_r[n]->type() == FlowReactorType && m_nr > 1) { throw CanteraError("ReactorNet::initialize", "FlowReactors must be used alone."); } } } m_connect.resize(m_nr*m_nr,0); m_ydot.resize(m_nv,0.0); int i, j, nin, nout, nw; ReactorBase *r, *rj; for (i = 0; i < m_nr; i++) { r = m_reactors[i]; for (j = 0; j < m_nr; j++) { if (i == j) connect(i,j); else { rj = m_reactors[j]; nin = rj->nInlets(); for (n = 0; n < nin; n++) { if (&rj->inlet(n).out() == r) connect(i,j); } nout = rj->nOutlets(); for (n = 0; n < nout; n++) { if (&rj->outlet(n).in() == r) connect(i,j); } nw = rj->nWalls(); for (n = 0; n < nw; n++) { if (&rj->wall(n).left() == rj && &rj->wall(n).right() == r) connect(i,j); else if (&rj->wall(n).left() == r && &rj->wall(n).right() == rj) connect(i,j); } } } } m_atol.resize(neq()); fill(m_atol.begin(), m_atol.end(), m_atols); m_integ->setTolerances(m_rtol, neq(), DATA_PTR(m_atol)); m_integ->setSensitivityTolerances(m_rtolsens, m_atolsens); m_integ->setMaxStepSize(m_maxstep); if (m_verbose) { sprintf(buf, "Number of equations: %d\n", neq()); writelog(buf); sprintf(buf, "Maximum time step: %14.6g\n", m_maxstep); writelog(buf); } m_integ->initialize(t0, *this); m_init = true; }