Skip to content

Commit

Permalink
[OneD] Introduce Solution manager to OneD
Browse files Browse the repository at this point in the history
  • Loading branch information
ischoegl authored and bryanwweber committed Sep 5, 2022
1 parent d03c0d6 commit 79c0a79
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 3 deletions.
10 changes: 10 additions & 0 deletions include/cantera/oneD/Domain1D.h
Expand Up @@ -28,6 +28,7 @@ class MultiJac;
class OneDim;
class Refiner;
class AnyMap;
class Solution;

/**
* Base class for one-dimensional domains.
Expand Down Expand Up @@ -323,6 +324,12 @@ class Domain1D
*/
virtual void restore(const AnyMap& state, double* soln, int loglevel);

//! Return reference to thermo/kinetics/transport manager
//! @since New in Cantera 3.0.
shared_ptr<Solution> sol() const {
return m_sol;
}

size_t size() const {
return m_nv*m_points;
}
Expand Down Expand Up @@ -498,6 +505,9 @@ class Domain1D
std::vector<std::string> m_name;
int m_bw;
bool m_force_full_update;

//! Composite thermo/kinetics/transport handler
std::shared_ptr<Solution> m_sol;
};
}

Expand Down
5 changes: 4 additions & 1 deletion include/cantera/oneD/IonFlow.h
Expand Up @@ -31,7 +31,10 @@ namespace Cantera
class IonFlow : public StFlow
{
public:
IonFlow(IdealGasPhase* ph = 0, size_t nsp = 1, size_t points = 1);
IonFlow(ThermoPhase* ph = 0, size_t nsp = 1, size_t points = 1);

IonFlow(shared_ptr<Solution> sol, size_t nsp = 1, size_t points = 1);

//! set the solving stage
virtual void setSolvingStage(const size_t phase);

Expand Down
16 changes: 15 additions & 1 deletion include/cantera/oneD/StFlow.h
Expand Up @@ -8,6 +8,7 @@

#include "Domain1D.h"
#include "cantera/base/Array.h"
#include "cantera/base/Solution.h"
#include "cantera/thermo/IdealGasPhase.h"
#include "cantera/kinetics/Kinetics.h"

Expand Down Expand Up @@ -52,6 +53,8 @@ class StFlow : public Domain1D
StFlow(th.get(), nsp, points) {
}

StFlow(shared_ptr<Solution> sol, size_t nsp = 1, size_t points = 1);

//! @name Problem Specification
//! @{

Expand Down Expand Up @@ -80,9 +83,17 @@ class StFlow : public Domain1D
m_kin = &kin;
}

//! set the transport manager
//! Set the transport manager directly
void setTransport(Transport& trans);

//! Set the transport model
//! @since New in Cantera 3.0.
void setTransportModel(const std::string& trans);

//! Retrieve transport model
//! @since New in Cantera 3.0.
std::string transportModel() const;

//! Enable thermal diffusion, also known as Soret diffusion.
//! Requires that multicomponent transport properties be
//! enabled to carry out calculations.
Expand Down Expand Up @@ -427,6 +438,9 @@ class StFlow : public Domain1D
Kinetics* m_kin;
Transport* m_trans;

// keep smart pointer to prevent garbage collection when transport model changes
std::shared_ptr<Transport> m_trans_shared;

// boundary emissivities for the radiation calculations
doublereal m_epsilon_left;
doublereal m_epsilon_right;
Expand Down
20 changes: 19 additions & 1 deletion src/oneD/IonFlow.cpp
Expand Up @@ -10,13 +10,14 @@
#include "cantera/numerics/funcs.h"
#include "cantera/numerics/polyfit.h"
#include "cantera/base/utilities.h"
#include "cantera/base/global.h"

using namespace std;

namespace Cantera
{

IonFlow::IonFlow(IdealGasPhase* ph, size_t nsp, size_t points) :
IonFlow::IonFlow(ThermoPhase* ph, size_t nsp, size_t points) :
StFlow(ph, nsp, points),
m_import_electron_transport(false),
m_stage(1),
Expand Down Expand Up @@ -57,6 +58,23 @@ IonFlow::IonFlow(IdealGasPhase* ph, size_t nsp, size_t points) :
m_do_electric_field.resize(m_points,false);
}

IonFlow::IonFlow(shared_ptr<Solution> sol, size_t nsp, size_t points) :
IonFlow(sol->thermo().get(), nsp, points)
{
m_sol = sol;
m_kin = m_sol->kinetics().get();
m_trans_shared = m_sol->transport();
m_trans = m_trans_shared.get();
if (m_trans->transportType() == "None") {
// @deprecated
warn_deprecated("IonFlow",
"An appropriate transport model\nshould be set when instantiating the "
"Solution ('gas') object.\nImplicit setting of the transport model "
"is deprecated and\nwill be removed after Cantera 3.0.");
setTransportModel("Ion");
}
}

void IonFlow::resize(size_t components, size_t points){
StFlow::resize(components, points);
m_mobility.resize(m_nsp*m_points);
Expand Down
41 changes: 41 additions & 0 deletions src/oneD/StFlow.cpp
Expand Up @@ -103,6 +103,23 @@ StFlow::StFlow(ThermoPhase* ph, size_t nsp, size_t points) :
m_kRadiating[1] = m_thermo->speciesIndex("H2O");
}

StFlow::StFlow(std::shared_ptr<Solution> sol, size_t nsp, size_t points) :
StFlow(sol->thermo().get(), nsp, points)
{
m_sol = sol;
m_kin = m_sol->kinetics().get();
m_trans_shared = m_sol->transport();
m_trans = m_trans_shared.get();
if (m_trans->transportType() == "None") {
// @deprecated
warn_deprecated("StFlow",
"An appropriate transport model\nshould be set when instantiating the "
"Solution ('gas') object.\nImplicit setting of the transport model "
"is deprecated and\nwill be removed after Cantera 3.0.");
setTransportModel("Mix");
}
}

void StFlow::setThermo(IdealGasPhase& th) {
warn_deprecated("StFlow::setThermo", "To be removed after Cantera 3.0.");
m_thermo = &th;
Expand Down Expand Up @@ -157,9 +174,30 @@ void StFlow::resetBadValues(double* xg)
}
}

void StFlow::setTransportModel(const std::string& trans)
{
if (!m_sol) {
throw CanteraError("StFlow::setTransport",
"Unable to set Transport manager by name as object was not initialized\n"
"from a Solution manager: set Transport object directly instead.");
}
m_sol->setTransport(trans);
m_trans_shared = m_sol->transport();
m_trans = m_trans_shared.get();
setTransport(*m_trans);
}

std::string StFlow::transportModel() const {
return m_trans->transportType();
}

void StFlow::setTransport(Transport& trans)
{
m_trans = &trans;
if (m_trans->transportType() == "None") {
throw CanteraError("StFlow::setTransport",
"Invalid Transport model 'None'.");
}
m_do_multicomponent = (m_trans->transportType() == "Multi" || m_trans->transportType() == "CK_Multi");

m_diff.resize(m_nsp*m_points);
Expand Down Expand Up @@ -643,6 +681,7 @@ AnyMap StFlow::serialize(const double* soln) const
AnyMap state = Domain1D::serialize(soln);
state["type"] = flowType();
state["pressure"] = m_press;
state["transport-model"] = m_trans->transportType();

state["phase"]["name"] = m_thermo->name();
AnyValue source = m_thermo->input().getMetadata("filename");
Expand Down Expand Up @@ -731,6 +770,8 @@ void StFlow::restore(const AnyMap& state, double* soln, int loglevel)
}
}

setTransportModel(state.getString("transport-model", "Mix"));

if (state.hasKey("Soret-enabled")) {
m_do_soret = state["Soret-enabled"].asBool();
}
Expand Down

0 comments on commit 79c0a79

Please sign in to comment.