33 #ifdef GRINS_HAVE_CANTERA
37 #ifdef GRINS_HAVE_ANTIOCH
42 #include "libmesh/composite_function.h"
43 #include "libmesh/const_function.h"
44 #include "libmesh/zero_function.h"
48 libMesh::UniquePtr<libMesh::FunctionBase<libMesh::Number> >
51 std::vector<std::string>& var_names,
52 const std::string& section )
54 libmesh_assert( !var_names.empty() );
57 libMesh::UniquePtr<libMesh::FunctionBase<libMesh::Number> > all_funcs;
64 std::set<std::string> vars_found;
66 std::vector<std::string> vars_to_search_for(var_names.size());
68 this->
check_for_vars(input,section,vars_to_search_for,&vars_found);
75 libMesh::libmesh_cast_ref<libMesh::CompositeFunction<libMesh::Number>&>(*(all_funcs.get()));
77 std::set<std::string> vars_added;
78 this->
add_found_vars(input, system, section, vars_found, composite_func, vars_added);
81 for( std::vector<std::string>::const_iterator var = var_names.begin();
82 var < var_names.end(); ++var )
84 if( vars_added.find(*var) == vars_added.end() )
86 std::vector<VariableIndex> var_idx(1,system.variable_number(*var));
87 composite_func.attach_subfunction( libMesh::ZeroFunction<libMesh::Number>(),var_idx);
96 const std::string& section,
97 const std::set<std::string>& vars_found,
99 std::set<std::string>& vars_added )
const
101 libMesh::Number invalid_num = std::numeric_limits<libMesh::Number>::max();
103 for( std::set<std::string>::const_iterator var = vars_found.begin();
104 var != vars_found.end(); ++var )
106 std::vector<VariableIndex> var_idx(1,system.variable_number(*var));
108 libMesh::Number value = input(section+
"/"+(*var),invalid_num);
110 libMesh::ConstFunction<libMesh::Number> const_func(value);
111 composite_func.attach_subfunction(const_func,var_idx);
114 vars_added = vars_found;
118 const std::string& prefix,
119 std::string& species_name )
const
121 std::vector<std::string> split_name;
126 libmesh_assert_equal_to(split_name.size(), 1);
128 species_name = split_name[0];
132 std::vector<std::string>&vars_to_search_for )
const
134 libmesh_assert_equal_to(var_names.size(),vars_to_search_for.size());
139 GRINSPrivate::VariableWarehouse::get_variable_subclass<SpeciesMassFractionsFEVariables>
142 const std::string& prefix = species_fe_var.
prefix();
143 for(
unsigned int v = 0; v < var_names.size(); v++ )
145 std::string species_name;
147 vars_to_search_for[v] =
"X_"+species_name;
152 #if defined(GRINS_HAVE_ANTIOCH) || defined(GRINS_HAVE_CANTERA)
155 const std::string& section,
156 const std::set<std::string>& vars_found,
158 std::set<std::string>& vars_added )
const
163 const std::set<std::string>& ,
165 std::set<std::string>& ) const
171 GRINSPrivate::VariableWarehouse::get_variable_subclass<SpeciesMassFractionsFEVariables>
174 const std::string& material = species_fe_var.
material();
176 std::string thermochem_input_str =
"Materials/"+material+
"/GasMixture/thermochemistry_library";
178 if( !input.have_variable(thermochem_input_str) )
179 libmesh_error_msg(
"ERROR: Could not find input option "+thermochem_input_str+
" !");
181 const std::string thermochem_lib = input(thermochem_input_str, std::string(
"DIE!") );
183 if( thermochem_lib ==
"cantera" )
185 #ifdef GRINS_HAVE_CANTERA
186 this->add_mole_frac_to_mass_frac<CanteraMixture>(input,section,vars_found,material,
187 species_fe_var,composite_func,vars_added);
189 libmesh_error_msg(
"Error: Cantera not enabled in this configuration. Reconfigure using --with-cantera option.");
192 else if( thermochem_lib ==
"antioch" )
194 #ifdef GRINS_HAVE_ANTIOCH
195 this->add_mole_frac_to_mass_frac<AntiochChemistry>(input,section,vars_found,material,
196 species_fe_var,composite_func,vars_added);
198 libmesh_error_msg(
"Error: Antioch not enabled in this configuration. Reconfigure using --with-antioch option.");
202 libmesh_error_msg(
"ERROR: Invalid thermochemistry library "+thermochem_lib+
"!");
205 template<
typename ChemistryType>
207 const std::string& section,
208 const std::set<std::string>& vars_found,
209 const std::string& material,
212 std::set<std::string>& vars_added)
const
214 unsigned int n_vars_found = vars_found.size();
217 std::vector<libMesh::Number> species_mole_fracs(n_vars_found);
218 libMesh::Number invalid_num = std::numeric_limits<libMesh::Number>::max();
220 unsigned int count = 0;
221 for(std::set<std::string>::const_iterator var = vars_found.begin();
222 var != vars_found.end(); ++var )
224 species_mole_fracs[count] = input(section+
"/"+(*var),invalid_num);
230 libMesh::Number sum = 0.0;
231 for(
unsigned int v = 0; v < n_vars_found; v++ )
232 sum += species_mole_fracs[v];
234 libMesh::Number tol = std::numeric_limits<libMesh::Number>::epsilon()*10;
235 if( std::abs(sum-1.0) > tol )
236 libmesh_error_msg(
"ERROR: Mole fractions do not sum to 1! Found sum = "+StringUtilities::T_to_string<libMesh::Number>(sum));
239 std::vector<std::string> species_names(n_vars_found);
241 unsigned int count = 0;
242 for(std::set<std::string>::const_iterator var = vars_found.begin();
243 var != vars_found.end(); ++var )
245 std::vector<std::string> split_name;
248 libmesh_assert_equal_to(split_name[0],std::string(
"X"));
249 libmesh_assert_equal_to(split_name.size(),2);
250 species_names[count] = split_name[1];
258 ChemistryType chem(input,material);
260 libMesh::Real M = 0.0;
261 for(
unsigned int v = 0; v < n_vars_found; v++ )
263 unsigned int s = chem.species_index(species_names[v]);
264 M += species_mole_fracs[v]*chem.M(s);
267 const std::string& prefix = species_fe_var.
prefix();
269 for(
unsigned int v = 0; v < n_vars_found; v++ )
272 unsigned int s = chem.species_index(species_names[v]);
273 libMesh::Number species_mass_fracs = species_mole_fracs[v]*chem.M(s)/M;
276 std::vector<VariableIndex> var_idx(1,species_fe_var.
species(s));
277 libMesh::ConstFunction<libMesh::Number> const_func(species_mass_fracs);
278 composite_func.attach_subfunction(const_func,var_idx);
281 vars_added.insert(prefix+species_names[v]);
286 #ifdef GRINS_HAVE_CANTERA
290 #ifdef GRINS_HAVE_ANTIOCH
291 template void MoleFractionsDirichletBCFactory::add_mole_frac_to_mass_frac<AntiochChemistry>(
const GetPot&,
const std::string&,
const std::set<std::string>&,
const std::string&,
const SpeciesMassFractionsFEVariables&,libMesh::CompositeFunction<libMesh::Number>&,std::set<std::string>& )
const;
virtual void set_vars_to_search_for(const std::vector< std::string > &var_names, std::vector< std::string > &vars_to_search_for) const
We'll search for mole fractions: X_.
virtual void add_found_vars(const GetPot &input, MultiphysicsSystem &system, const std::string §ion, const std::set< std::string > &vars_found, libMesh::CompositeFunction< libMesh::Number > &composite_func, std::set< std::string > &vars_added) const
Adds the vars_found to the composite_func.
const std::string & prefix() const
const std::string & material() const
void add_mole_frac_to_mass_frac(const GetPot &input, const std::string §ion, const std::set< std::string > &vars_found, const std::string &material, const SpeciesMassFractionsFEVariables &species_fe_var, libMesh::CompositeFunction< libMesh::Number > &composite_func, std::set< std::string > &vars_added) const
virtual void set_vars_to_search_for(const std::vector< std::string > &var_names, std::vector< std::string > &vars_to_search_for) const
Set the vars_to_search_for, based on var_names.
Constructs ConstFunction objects for Dirichlet boundary conditions.
void extract_species_name(const std::string &var_name, const std::string &prefix, std::string &species_name) const
libMesh::UniquePtr< libMesh::FunctionBase< libMesh::Number > > build_composite_func()
static std::string species_mass_fractions_section()
Parses mole fraction values and converts to mass fractions.
Interface with libMesh for solving Multiphysics problems.
void split_string(const std::string &input, const std::string &delimiter, std::vector< std::string > &results)
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 ConstantFunction objects for boundary conditions.
ConstantFunctionDirichletBCFactory grins_factory_constant_dirichlet("constant_dirichlet")
VariableIndex species(unsigned int species) const
void check_for_vars(const GetPot &input, const std::string §ion, const std::vector< std::string > &var_names, std::set< std::string > *vars_found=NULL)
Helper function.
ConstantFunctionDirichletBCFactory grins_factory_constant_displacement("constant_displacement")
ConstantFunctionDirichletBCFactory grins_factory_constant_isothermal("isothermal")
MoleFractionsDirichletBCFactory grins_factory_mole_fractions("mole_fractions")
virtual void add_found_vars(const GetPot &input, MultiphysicsSystem &system, const std::string §ion, const std::set< std::string > &vars_found, libMesh::CompositeFunction< libMesh::Number > &composite_func, std::set< std::string > &vars_added) const
Here, we're expected vars_found to correspond to mole fractions and we'll add mass fractions...