35 #ifdef GRINS_HAVE_CANTERA
39 #ifdef GRINS_HAVE_ANTIOCH
44 #include "libmesh/composite_function.h"
45 #include "libmesh/const_function.h"
49 libMesh::UniquePtr<libMesh::FunctionBase<libMesh::Number> >
52 std::vector<std::string>& var_names,
53 const std::string& section )
57 std::string bc_id_string = StringUtilities::T_to_string<BoundaryID>( *(
_bc_ids->begin()) );
61 std::string input_string = section+
"/"+var_input_string+
"_"+bc_id_string;
63 unsigned int n_comps = input.vector_variable_size(input_string);
65 if( var_names.size() > n_comps )
66 libmesh_error_msg(
"ERROR: Insufficient number of variable components in "+input_string+
"!");
68 libMesh::UniquePtr<libMesh::CompositeFunction<libMesh::Number> >
71 this->
add_funcs(input,system,input_string,var_names,*(remapped_func.get()));
73 return libMesh::UniquePtr<libMesh::FunctionBase<libMesh::Number> >(remapped_func.release());
78 const std::string& input_string,
79 const std::vector<std::string>& var_names,
82 for(
unsigned int n = 0; n < var_names.size(); n++ )
84 std::vector<VariableIndex> dbc_vars(1,system.variable_number(var_names[n]));
85 libMesh::Number value = input(input_string, 0.0, n);
86 libMesh::ConstFunction<libMesh::Number> const_func(value);
87 composite_func.attach_subfunction(const_func, dbc_vars);
92 #if defined(GRINS_HAVE_ANTIOCH) || defined(GRINS_HAVE_CANTERA)
95 const std::string& input_string,
96 const std::vector<std::string>& var_names,
101 const std::string& input_string,
102 const std::vector<std::string>& var_names,
106 const unsigned int n_vars = var_names.size();
109 std::vector<libMesh::Number> species_mole_fracs(n_vars);
110 libMesh::Number invalid_num = std::numeric_limits<libMesh::Number>::max();
112 if( input.vector_variable_size(input_string) != n_vars )
113 libmesh_error_msg(
"ERROR: Expected "+StringUtilities::T_to_string<unsigned int>(n_vars)+
" components in "+input_string);
115 for(
unsigned int v = 0; v < n_vars; v++ )
116 species_mole_fracs[v] = input(input_string,invalid_num,v);
119 libMesh::Number sum = 0.0;
120 for(
unsigned int v = 0; v < n_vars; v++ )
121 sum += species_mole_fracs[v];
123 libMesh::Number tol = std::numeric_limits<libMesh::Number>::epsilon()*10;
124 if( std::abs(sum-1.0) > tol )
125 libmesh_error_msg(
"ERROR: Mole fractions do not sum to 1! Found sum = "+StringUtilities::T_to_string<libMesh::Number>(sum));
129 #if defined(GRINS_HAVE_ANTIOCH) || defined(GRINS_HAVE_CANTERA)
133 GRINSPrivate::VariableWarehouse::get_variable_subclass<SpeciesMassFractionsFEVariables>
137 std::string thermochem_lib;
142 if( thermochem_lib ==
"cantera" )
144 #ifdef GRINS_HAVE_CANTERA
145 this->convert_mole_fracs_and_add_to_func<CanteraMixture>(input,
150 libmesh_error_msg(
"Error: Cantera not enabled in this configuration. Reconfigure using --with-cantera option.");
153 else if( thermochem_lib ==
"antioch" )
155 #ifdef GRINS_HAVE_ANTIOCH
156 this->convert_mole_fracs_and_add_to_func<AntiochChemistry>(input,
161 libmesh_error_msg(
"Error: Antioch not enabled in this configuration. Reconfigure using --with-antioch option.");
165 libmesh_error_msg(
"ERROR: Invalid thermochemistry library "+thermochem_lib+
"!");
168 template<
typename ChemistryType>
171 (
const GetPot& input,
const std::vector<libMesh::Number>& species_mole_fracs,
175 const std::string& material = species_fe_var.
material();
179 ChemistryType chem(input,material);
181 const unsigned int n_vars = species_mole_fracs.size();
183 libMesh::Real M = 0.0;
184 for(
unsigned int s = 0; s < n_vars; s++ )
185 M += species_mole_fracs[s]*chem.M(s);
188 for(
unsigned int s = 0; s < n_vars; s++ )
190 libMesh::Number species_mass_fracs =species_mole_fracs[s]*chem.M(s)/M;
192 std::vector<VariableIndex> var_idx(1,species_fe_var.
species(s));
194 libMesh::ConstFunction<libMesh::Number> const_func(species_mass_fracs);
195 composite_func.attach_subfunction(const_func,var_idx);
200 #ifdef GRINS_HAVE_CANTERA
204 #ifdef GRINS_HAVE_ANTIOCH
205 template void PrescribedMoleFractionsDirichletOldStyleBCFactory::convert_mole_fracs_and_add_to_func<AntiochChemistry>(
const GetPot&,
const std::vector<libMesh::Number>&,
const SpeciesMassFractionsFEVariables&,
libMesh::CompositeFunction<libMesh::Number>& )
const;
virtual void add_funcs(const GetPot &input, MultiphysicsSystem &system, const std::string &input_string, const std::vector< std::string > &var_names, libMesh::CompositeFunction< libMesh::Number > &composite_func) const
static void parse_thermochemistry_model(const GetPot &input, const std::string &physics, std::string &model)
Determine thermochemistry model type.
PrescribedDispDirichletOldStyleBCFactory grins_factory_constant_displacement_old_style("constant_displacement_old_style")
PrescribedVelDirichletOldStyleBCFactory grins_factory_prescribed_vel_old_style("prescribed_vel_old_style")
static PhysicsName reacting_low_mach_navier_stokes()
const std::string & material() const
static const std::set< BoundaryID > * _bc_ids
BoundaryID for constructing a particular boundary condition.
void convert_mole_fracs_and_add_to_func(const GetPot &input, const std::vector< libMesh::Number > &species_mole_fracs, const SpeciesMassFractionsFEVariables &species_fe_var, libMesh::CompositeFunction< libMesh::Number > &composite_func) const
static std::string species_mass_fractions_section()
Interface with libMesh for solving Multiphysics problems.
VariableIndex species(unsigned int species) const
virtual libMesh::UniquePtr< libMesh::FunctionBase< libMesh::Number > > build_func(const GetPot &input, MultiphysicsSystem &system, std::vector< std::string > &var_names, const std::string §ion)
Builds the FunctionBase object for boundary condition.
virtual std::string var_input_string()=0
PrescribedMoleFractionsDirichletOldStyleBCFactory grins_factory_prescribed_mole_fraccs_old_style("prescribed_mole_fracs_old_style")
virtual void add_funcs(const GetPot &input, MultiphysicsSystem &system, const std::string &input_string, const std::vector< std::string > &var_names, libMesh::CompositeFunction< libMesh::Number > &composite_func) const
PrescribedSpeciesDirichletOldStyleBCFactory grins_factory_prescribed_species_old_style("prescribed_species_old_style")