From 01bc55e1bb72d0c2958bfe70efffca014b1ecf15 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Thu, 7 Mar 2013 18:51:23 +0000 Subject: [PATCH] [1D] Refactored Domain1D::save and Domain1D::restore Derived class implementations now call the parent class method to save/restore information represented in the parent class. --- include/cantera/oneD/Domain1D.h | 26 +++++++++----- include/cantera/oneD/Inlet1D.h | 14 ++++---- include/cantera/oneD/StFlow.h | 2 +- src/oneD/Domain1D.cpp | 12 +++++++ src/oneD/StFlow.cpp | 10 +++--- src/oneD/boundaries1D.cpp | 63 +++++++++++++++------------------ 6 files changed, 70 insertions(+), 57 deletions(-) diff --git a/include/cantera/oneD/Domain1D.h b/include/cantera/oneD/Domain1D.h index 76d30f2ac..0e426ffb1 100644 --- a/include/cantera/oneD/Domain1D.h +++ b/include/cantera/oneD/Domain1D.h @@ -389,18 +389,30 @@ public: //! Save the current solution for this domain into an XML_Node /*! - * Base class version of the general domain1D save function. This - * base class version will throw an error condition. Inherited classes - * will know how to save the solution vector. + * Base class version of the general domain1D save function. Derived + * classes should call the base class method in addition to saving their + * own data. * * @param o XML_Node to save the solution to. * @param sol Current value of the solution vector. * The object will pick out which part of the solution * vector pertains to this object. + * @return XML_Node created to represent this domain */ - virtual void save(XML_Node& o, const doublereal* const sol) { - throw CanteraError("Domain1D::save","base class method called"); - } + virtual XML_Node& save(XML_Node& o, const doublereal* const sol); + + //! Restore the solution for this domain from an XML_Node + /*! + * Base class version of the general Domain1D restore function. Derived + * classes should call the base class method in addition to restoring + * their own data. + * + * @param o XML_Node for this domain + * @param soln Current value of the solution vector, local to this object. + * @param loglevel 0 to suppress all output; 1 to show warnings; 2 for + * verbose output + */ + virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); size_t size() const { return m_nv*m_points; @@ -531,8 +543,6 @@ public: virtual void showSolution_s(std::ostream& s, const doublereal* x) {} virtual void showSolution(const doublereal* x); - virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel) {} - doublereal z(size_t jlocal) const { return m_z[jlocal]; } diff --git a/include/cantera/oneD/Inlet1D.h b/include/cantera/oneD/Inlet1D.h index 5a8952c48..1c621b15e 100644 --- a/include/cantera/oneD/Inlet1D.h +++ b/include/cantera/oneD/Inlet1D.h @@ -186,7 +186,7 @@ public: virtual void init(); virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); protected: @@ -221,7 +221,7 @@ public: virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); virtual void _finalize(const doublereal* x) {} virtual void _getInitialSoln(doublereal* x) { @@ -253,7 +253,7 @@ public: virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); virtual void _finalize(const doublereal* x) { ; //m_temp = x[0]; @@ -286,7 +286,7 @@ public: virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); virtual void _finalize(const doublereal* x) { ; //m_temp = x[0]; @@ -340,7 +340,7 @@ public: virtual void init(); virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); protected: @@ -375,7 +375,7 @@ public: virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); virtual void _getInitialSoln(doublereal* x) { @@ -438,7 +438,7 @@ public: virtual void eval(size_t jg, doublereal* xg, doublereal* rg, integer* diagg, doublereal rdt); - virtual void save(XML_Node& o, const doublereal* const soln); + virtual XML_Node& save(XML_Node& o, const doublereal* const soln); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); virtual void _getInitialSoln(doublereal* x) { diff --git a/include/cantera/oneD/StFlow.h b/include/cantera/oneD/StFlow.h index c4bf49f03..7ddec0d66 100644 --- a/include/cantera/oneD/StFlow.h +++ b/include/cantera/oneD/StFlow.h @@ -190,7 +190,7 @@ public: * The object will pick out which part of the solution * vector pertains to this object. */ - virtual void save(XML_Node& o, const doublereal* const sol); + virtual XML_Node& save(XML_Node& o, const doublereal* const sol); virtual void restore(const XML_Node& dom, doublereal* soln, int loglevel); diff --git a/src/oneD/Domain1D.cpp b/src/oneD/Domain1D.cpp index 0629905d4..b3da6b2ab 100644 --- a/src/oneD/Domain1D.cpp +++ b/src/oneD/Domain1D.cpp @@ -122,6 +122,18 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } } +XML_Node& Domain1D::save(XML_Node& o, const doublereal* const sol) +{ + XML_Node& d = o.addChild("domain"); + d.addAttribute("points", nPoints()); + d.addAttribute("components", nComponents()); + d.addAttribute("id", id()); + return d; +} + +void Domain1D::restore(const XML_Node& dom, doublereal* soln, int loglevel) +{ +} // called to set up initial grid, and after grid refinement void Domain1D::setupGrid(size_t n, const doublereal* z) diff --git a/src/oneD/StFlow.cpp b/src/oneD/StFlow.cpp index 1a2b7551d..5e2b085ad 100644 --- a/src/oneD/StFlow.cpp +++ b/src/oneD/StFlow.cpp @@ -754,7 +754,7 @@ size_t StFlow::componentIndex(const std::string& name) const void StFlow::restore(const XML_Node& dom, doublereal* soln, int loglevel) { - + Domain1D::restore(dom, soln, loglevel); vector ignored; size_t nsp = m_thermo->nSpecies(); vector_int did_species(nsp, 0); @@ -891,17 +891,14 @@ void StFlow::restore(const XML_Node& dom, doublereal* soln, int loglevel) -void StFlow::save(XML_Node& o, const doublereal* const sol) +XML_Node& StFlow::save(XML_Node& o, const doublereal* const sol) { size_t k; Array2D soln(m_nv, m_points, sol + loc()); - XML_Node& flow = (XML_Node&)o.addChild("domain"); + XML_Node& flow = Domain1D::save(o, sol); flow.addAttribute("type",flowType()); - flow.addAttribute("id",m_id); - flow.addAttribute("points", double(m_points)); - flow.addAttribute("components", double(m_nv)); if (m_desc != "") { addString(flow,"description",m_desc); @@ -936,6 +933,7 @@ void StFlow::save(XML_Node& o, const doublereal* const sol) addFloatArray(gv,m_thermo->speciesName(k), x.size(),DATA_PTR(x),"","massFraction",0.0,1.0); } + return flow; } void StFlow::setJac(MultiJac* jac) diff --git a/src/oneD/boundaries1D.cpp b/src/oneD/boundaries1D.cpp index 4c32eec27..044f9d110 100644 --- a/src/oneD/boundaries1D.cpp +++ b/src/oneD/boundaries1D.cpp @@ -238,15 +238,12 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } -void Inlet1D:: +XML_Node& Inlet1D:: save(XML_Node& o, const doublereal* const soln) { const doublereal* s = soln + loc(); - XML_Node& inlt = o.addChild("domain"); - inlt.addAttribute("id",id()); - inlt.addAttribute("points",1); + XML_Node& inlt = Domain1D::save(o, soln); inlt.addAttribute("type","inlet"); - inlt.addAttribute("components", double(nComponents())); for (size_t k = 0; k < nComponents(); k++) { ctml::addFloat(inlt, componentName(k), s[k], "", "",lowerBound(k), upperBound(k)); } @@ -254,11 +251,13 @@ save(XML_Node& o, const doublereal* const soln) ctml::addFloat(inlt, "massFraction", m_yin[k], "", m_flow->phase().speciesName(k)); } + return inlt; } void Inlet1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); soln[0] = m_mdot = ctml::getFloat(dom, "mdot", "massflowrate"); soln[1] = m_temp = ctml::getFloat(dom, "temperature", "temperature"); @@ -325,19 +324,18 @@ eval(size_t jg, doublereal* xg, doublereal* rg, diag[0] = 0; } -void Empty1D:: +XML_Node& Empty1D:: save(XML_Node& o, const doublereal* const soln) { - XML_Node& symm = o.addChild("domain"); - symm.addAttribute("id",id()); - symm.addAttribute("points",1); + XML_Node& symm = Domain1D::save(o, soln); symm.addAttribute("type","empty"); - symm.addAttribute("components", double(nComponents())); + return symm; } void Empty1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); resize(1,1); } @@ -416,19 +414,18 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } -void Symm1D:: +XML_Node& Symm1D:: save(XML_Node& o, const doublereal* const soln) { - XML_Node& symm = o.addChild("domain"); - symm.addAttribute("id",id()); - symm.addAttribute("points",1); + XML_Node& symm = Domain1D::save(o, soln); symm.addAttribute("type","symmetry"); - symm.addAttribute("components", double(nComponents())); + return symm; } void Symm1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); resize(1,1); } @@ -526,19 +523,18 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } -void Outlet1D:: +XML_Node& Outlet1D:: save(XML_Node& o, const doublereal* const soln) { - XML_Node& outlt = o.addChild("domain"); - outlt.addAttribute("id",id()); - outlt.addAttribute("points",1); + XML_Node& outlt = Domain1D::save(o, soln); outlt.addAttribute("type","outlet"); - outlt.addAttribute("components", double(nComponents())); + return outlt; } void Outlet1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); resize(1,1); } @@ -675,24 +671,23 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } -void OutletRes1D:: +XML_Node& OutletRes1D:: save(XML_Node& o, const doublereal* const soln) { - XML_Node& outlt = o.addChild("domain"); - outlt.addAttribute("id",id()); - outlt.addAttribute("points",1); + XML_Node& outlt = Domain1D::save(o, soln); outlt.addAttribute("type","outletres"); - outlt.addAttribute("components", double(nComponents())); ctml::addFloat(outlt, "temperature", m_temp, "K"); for (size_t k=0; k < m_nsp; k++) { ctml::addFloat(outlt, "massFraction", m_yres[k], "", m_flow->phase().speciesName(k)); } + return outlt; } void OutletRes1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); m_temp = ctml::getFloat(dom, "temperature"); m_yres.assign(m_nsp, 0.0); @@ -777,24 +772,23 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } } -void Surf1D:: +XML_Node& Surf1D:: save(XML_Node& o, const doublereal* const soln) { const doublereal* s = soln + loc(); //XML_Node& inlt = o.addChild("inlet"); - XML_Node& inlt = o.addChild("domain"); - inlt.addAttribute("id",id()); - inlt.addAttribute("points",1); + XML_Node& inlt = Domain1D::save(o, soln); inlt.addAttribute("type","surface"); - inlt.addAttribute("components", double(nComponents())); for (size_t k = 0; k < nComponents(); k++) { ctml::addFloat(inlt, componentName(k), s[k], "", "",0.0, 1.0); } + return inlt; } void Surf1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); soln[0] = m_temp = ctml::getFloat(dom, "temperature", "temperature"); resize(1,1); } @@ -938,25 +932,24 @@ eval(size_t jg, doublereal* xg, doublereal* rg, } } -void ReactingSurf1D:: +XML_Node& ReactingSurf1D:: save(XML_Node& o, const doublereal* const soln) { const doublereal* s = soln + loc(); - XML_Node& dom = o.addChild("domain"); - dom.addAttribute("id",id()); - dom.addAttribute("points",1); + XML_Node& dom = Domain1D::save(o, soln); dom.addAttribute("type","surface"); - dom.addAttribute("components", double(nComponents())); ctml::addFloat(dom, "temperature", s[0], "K"); for (size_t k=0; k < m_nsp; k++) { ctml::addFloat(dom, "coverage", s[k+1], "", m_sphase->speciesName(k)); } + return dom; } void ReactingSurf1D:: restore(const XML_Node& dom, doublereal* soln, int loglevel) { + Domain1D::restore(dom, soln, loglevel); soln[0] = m_temp = ctml::getFloat(dom, "temperature"); m_fixed_cov.assign(m_nsp, 0.0);