/** * @file ctreactor.cpp */ // This file is part of Cantera. See License.txt in the top-level directory or // at http://www.cantera.org/license.txt for license and copyright information. #define CANTERA_USE_INTERNAL #include "cantera/clib/ctreactor.h" // Cantera includes #include "cantera/zeroD/Reactor.h" #include "cantera/zeroD/FlowReactor.h" #include "cantera/zeroD/ReactorNet.h" #include "cantera/zeroD/ReactorFactory.h" #include "cantera/zeroD/Wall.h" #include "cantera/zeroD/flowControllers.h" #include "Cabinet.h" using namespace Cantera; using namespace std; typedef Cabinet ReactorCabinet; typedef Cabinet NetworkCabinet; typedef Cabinet FlowDeviceCabinet; typedef Cabinet WallCabinet; typedef Cabinet FuncCabinet; typedef Cabinet ThermoCabinet; typedef Cabinet KineticsCabinet; typedef Cabinet ReactorSurfaceCabinet; template<> ReactorCabinet* ReactorCabinet::s_storage = 0; template<> NetworkCabinet* NetworkCabinet::s_storage = 0; template<> FlowDeviceCabinet* FlowDeviceCabinet::s_storage = 0; template<> WallCabinet* WallCabinet::s_storage = 0; template<> ReactorSurfaceCabinet* ReactorSurfaceCabinet::s_storage = 0; extern "C" { // reactor int reactor_new(int type) { try { ReactorBase* r = ReactorFactory::factory()->newReactor(type); return ReactorCabinet::add(r); } catch (...) { return handleAllExceptions(-1, ERR); } } int reactor_del(int i) { try { ReactorCabinet::del(i); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactor_setInitialVolume(int i, double v) { try { ReactorCabinet::item(i).setInitialVolume(v); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactor_setThermoMgr(int i, int n) { try { ReactorCabinet::item(i).setThermoMgr(ThermoCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactor_setKineticsMgr(int i, int n) { try { // @todo This should not fail silently if (ReactorCabinet::item(i).type() >= ReactorType) { ReactorCabinet::get(i).setKineticsMgr(KineticsCabinet::item(n)); } return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } double reactor_mass(int i) { try { return ReactorCabinet::item(i).mass(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_volume(int i) { try { return ReactorCabinet::item(i).volume(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_density(int i) { try { return ReactorCabinet::item(i).density(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_temperature(int i) { try { return ReactorCabinet::item(i).temperature(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_enthalpy_mass(int i) { try { return ReactorCabinet::item(i).enthalpy_mass(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_intEnergy_mass(int i) { try { return ReactorCabinet::item(i).intEnergy_mass(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_pressure(int i) { try { return ReactorCabinet::item(i).pressure(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactor_massFraction(int i, int k) { try { return ReactorCabinet::item(i).massFraction(k); } catch (...) { return handleAllExceptions(DERR, DERR); } } int reactor_setChemistry(int i, int cflag) { try { // @todo This should not fail silently if (ReactorCabinet::item(i).type() >= ReactorType) { ReactorCabinet::get(i).setChemistry(cflag != 0); } return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactor_setEnergy(int i, int eflag) { try { // @todo This should not fail silently if (ReactorCabinet::item(i).type() >= ReactorType) { ReactorCabinet::get(i).setEnergy(eflag); } return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int flowReactor_setMassFlowRate(int i, double mdot) { try { ReactorCabinet::get(i).setMassFlowRate(mdot); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } size_t reactor_nSensParams(int i) { try { return ReactorCabinet::get(i).nSensParams(); } catch (...) { return handleAllExceptions(npos, npos); } } int reactor_addSensitivityReaction(int i, int rxn) { try { ReactorCabinet::get(i).addSensitivityReaction(rxn); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } // reactor networks int reactornet_new() { try { return NetworkCabinet::add(new ReactorNet()); } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_del(int i) { try { NetworkCabinet::del(i); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_setInitialTime(int i, double t) { try { NetworkCabinet::item(i).setInitialTime(t); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_setMaxTimeStep(int i, double maxstep) { try { NetworkCabinet::item(i).setMaxTimeStep(maxstep); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_setTolerances(int i, double rtol, double atol) { try { NetworkCabinet::item(i).setTolerances(rtol, atol); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_setSensitivityTolerances(int i, double rtol, double atol) { try { NetworkCabinet::item(i).setSensitivityTolerances(rtol, atol); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_addreactor(int i, int n) { try { NetworkCabinet::item(i).addReactor( dynamic_cast(ReactorCabinet::item(n))); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactornet_advance(int i, double t) { try { NetworkCabinet::item(i).advance(t); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } double reactornet_step(int i) { try { return NetworkCabinet::item(i).step(); } catch (...) { return handleAllExceptions(DERR, DERR); } } double reactornet_time(int i) { try { return NetworkCabinet::item(i).time(); } catch (...) { return handleAllExceptions(-1, ERR); } } double reactornet_rtol(int i) { try { return NetworkCabinet::item(i).rtol(); } catch (...) { return handleAllExceptions(-1, ERR); } } double reactornet_atol(int i) { try { return NetworkCabinet::item(i).atol(); } catch (...) { return handleAllExceptions(-1, ERR); } } double reactornet_sensitivity(int i, const char* v, int p, int r) { try { return NetworkCabinet::item(i).sensitivity(v, p, r); } catch (...) { return handleAllExceptions(-1, ERR); } } // flow devices int flowdev_new(int type) { try { FlowDevice* r; switch (type) { case MFC_Type: r = new MassFlowController(); break; case PressureController_Type: r = new PressureController(); break; case Valve_Type: r = new Valve(); break; default: r = new FlowDevice(); } return FlowDeviceCabinet::add(r); } catch (...) { return handleAllExceptions(-1, ERR); } } int flowdev_del(int i) { try { FlowDeviceCabinet::del(i); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int flowdev_install(int i, int n, int m) { try { bool ok = FlowDeviceCabinet::item(i).install(ReactorCabinet::item(n), ReactorCabinet::item(m)); if (!ok) { throw CanteraError("install","Could not install flow device."); } return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int flowdev_setMaster(int i, int n) { try { FlowDeviceCabinet::get(i).setMaster( &FlowDeviceCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } double flowdev_massFlowRate(int i, double time) { try { return FlowDeviceCabinet::item(i).massFlowRate(time); } catch (...) { return handleAllExceptions(DERR, DERR); } } int flowdev_setMassFlowRate(int i, double mdot) { try { FlowDeviceCabinet::item(i).setMassFlowRate(mdot); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int flowdev_setParameters(int i, int n, const double* v) { try { FlowDeviceCabinet::item(i).setParameters(n, v); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int flowdev_setFunction(int i, int n) { try { FlowDeviceCabinet::item(i).setFunction(&FuncCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } ///////////// Walls /////////////////////// int wall_new(int type) { try { return WallCabinet::add(new Wall()); } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_del(int i) { try { WallCabinet::del(i); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_install(int i, int n, int m) { try { WallCabinet::item(i).install(ReactorCabinet::item(n), ReactorCabinet::item(m)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } double wall_vdot(int i, double t) { try { return WallCabinet::item(i).vdot(t); } catch (...) { return handleAllExceptions(DERR, DERR); } } double wall_Q(int i, double t) { try { return WallCabinet::item(i).Q(t); } catch (...) { return handleAllExceptions(DERR, DERR); } } double wall_area(int i) { try { return WallCabinet::item(i).area(); } catch (...) { return handleAllExceptions(DERR, DERR); } } int wall_setArea(int i, double v) { try { WallCabinet::item(i).setArea(v); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setThermalResistance(int i, double rth) { try { WallCabinet::item(i).setThermalResistance(rth); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setHeatTransferCoeff(int i, double u) { try { WallCabinet::item(i).setHeatTransferCoeff(u); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setHeatFlux(int i, int n) { try { WallCabinet::item(i).setHeatFlux(&FuncCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setExpansionRateCoeff(int i, double k) { try { WallCabinet::item(i).setExpansionRateCoeff(k); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setVelocity(int i, int n) { try { WallCabinet::item(i).setVelocity(&FuncCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_setEmissivity(int i, double epsilon) { try { WallCabinet::item(i).setEmissivity(epsilon); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int wall_ready(int i) { try { return int(WallCabinet::item(i).ready()); } catch (...) { return handleAllExceptions(-1, ERR); } } // ReactorSurface int reactorsurface_new(int type) { try { return ReactorSurfaceCabinet::add(new ReactorSurface()); } catch (...) { return handleAllExceptions(-1, ERR); } } int reactorsurface_del(int i) { try { ReactorSurfaceCabinet::del(i); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactorsurface_install(int i, int n) { try { ReactorCabinet::item(n).addSurface(&ReactorSurfaceCabinet::item(i)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactorsurface_setkinetics(int i, int n) { try { ReactorSurfaceCabinet::item(i).setKinetics(&KineticsCabinet::item(n)); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } double reactorsurface_area(int i) { try { return ReactorSurfaceCabinet::item(i).area(); } catch (...) { return handleAllExceptions(DERR, DERR); } } int reactorsurface_setArea(int i, double v) { try { ReactorSurfaceCabinet::item(i).setArea(v); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int reactorsurface_addSensitivityReaction(int i, int rxn) { try { ReactorSurfaceCabinet::item(i).addSensitivityReaction(rxn); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } int ct_clearReactors() { try { ReactorCabinet::clear(); NetworkCabinet::clear(); FlowDeviceCabinet::clear(); WallCabinet::clear(); ReactorSurfaceCabinet::clear(); return 0; } catch (...) { return handleAllExceptions(-1, ERR); } } }