Beispiel #1
0
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;
}
Beispiel #2
0
  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;
  }