libMesh::CompositeFunction<libMesh::Number>& composite_func ) const #else void PrescribedMoleFractionsDirichletOldStyleBCFactory::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 #endif { const unsigned int n_vars = var_names.size(); // Parse in all the species mole fracs that are in the input std::vector<libMesh::Number> species_mole_fracs(n_vars); libMesh::Number invalid_num = std::numeric_limits<libMesh::Number>::max(); if( input.vector_variable_size(input_string) != n_vars ) libmesh_error_msg("ERROR: Expected "+StringUtilities::T_to_string<unsigned int>(n_vars)+" components in "+input_string); for(unsigned int v = 0; v < n_vars; v++ ) species_mole_fracs[v] = input(input_string,invalid_num,v); // Make sure mole fracs sum to 1 libMesh::Number sum = 0.0; for(unsigned int v = 0; v < n_vars; v++ ) sum += species_mole_fracs[v]; libMesh::Number tol = std::numeric_limits<libMesh::Number>::epsilon()*10; if( std::abs(sum-1.0) > tol ) libmesh_error_msg("ERROR: Mole fractions do not sum to 1! Found sum = "+StringUtilities::T_to_string<libMesh::Number>(sum)); // To avoid compiler warnings without GRINS or Cantera #if defined(GRINS_HAVE_ANTIOCH) || defined(GRINS_HAVE_CANTERA) // This only makes sense for SpeciesMassFractionsVariable in the // VariableWarehouse. This call will error out if it's not there. const SpeciesMassFractionsVariable& species_fe_var = GRINSPrivate::VariableWarehouse::get_variable_subclass<SpeciesMassFractionsVariable> (VariablesParsing::species_mass_fractions_section()); #endif std::string thermochem_lib; MaterialsParsing::thermochemistry_lib( input, PhysicsNaming::reacting_low_mach_navier_stokes(), thermochem_lib ); if( thermochem_lib == "cantera" ) { #ifdef GRINS_HAVE_CANTERA this->convert_mole_fracs_and_add_to_func<CanteraMixture>(input, species_mole_fracs, species_fe_var, composite_func); #else libmesh_error_msg("Error: Cantera not enabled in this configuration. Reconfigure using --with-cantera option."); #endif } else if( thermochem_lib == "antioch" ) { #ifdef GRINS_HAVE_ANTIOCH this->convert_mole_fracs_and_add_to_func<AntiochChemistry>(input, species_mole_fracs, species_fe_var, composite_func); #else libmesh_error_msg("Error: Antioch not enabled in this configuration. Reconfigure using --with-antioch option."); #endif } else libmesh_error_msg("ERROR: Invalid thermochemistry library "+thermochem_lib+"!"); }
void MoleFractionsDirichletBCFactory::add_mole_frac_to_mass_frac(const GetPot& input, const std::string& section, const std::set<std::string>& vars_found, const std::string& material, const SpeciesMassFractionsVariable& species_fe_var, libMesh::CompositeFunction<libMesh::Number>& composite_func, std::set<std::string>& vars_added) const { unsigned int n_vars_found = vars_found.size(); // Parse in all the species mole fracs that are in the input (it is assumed non-specified are 0) std::vector<libMesh::Number> species_mole_fracs(n_vars_found); libMesh::Number invalid_num = std::numeric_limits<libMesh::Number>::max(); { unsigned int count = 0; for(std::set<std::string>::const_iterator var = vars_found.begin(); var != vars_found.end(); ++var ) { species_mole_fracs[count] = input(section+"/"+(*var),invalid_num); count++; } } // Make sure mole fracs sum to 1 libMesh::Number sum = 0.0; for(unsigned int v = 0; v < n_vars_found; v++ ) sum += species_mole_fracs[v]; libMesh::Number tol = std::numeric_limits<libMesh::Number>::epsilon()*10; if( std::abs(sum-1.0) > tol ) libmesh_error_msg("ERROR: Mole fractions do not sum to 1! Found sum = "+StringUtilities::T_to_string<libMesh::Number>(sum)); // Extract species names std::vector<std::string> species_names(n_vars_found); { unsigned int count = 0; for(std::set<std::string>::const_iterator var = vars_found.begin(); var != vars_found.end(); ++var ) { std::vector<std::string> split_name; // vars_found should have the form "X_<species name>" StringUtilities::split_string((*var),"_",split_name); libmesh_assert_equal_to(split_name[0],std::string("X")); libmesh_assert_equal_to(split_name.size(),2); species_names[count] = split_name[1]; count++; } } // Now convert to mass frac and add to composite function /*! \todo We should have a ChemsitryWarehouse or something to just grab this from one place instead of rebuilding. */ ChemistryType chem(input,material); libMesh::Real M = 0.0; for(unsigned int v = 0; v < n_vars_found; v++ ) { unsigned int s = chem.species_index(species_names[v]); M += species_mole_fracs[v]*chem.M(s); } const std::string& prefix = species_fe_var.prefix(); for(unsigned int v = 0; v < n_vars_found; v++ ) { // Finish computing species mass fraction unsigned int s = chem.species_index(species_names[v]); libMesh::Number species_mass_fracs = species_mole_fracs[v]*chem.M(s)/M; // Add the function std::vector<VariableIndex> var_idx(1,species_fe_var.species(s)); libMesh::ConstFunction<libMesh::Number> const_func(species_mass_fracs); composite_func.attach_subfunction(const_func,var_idx); // Log that we added this variable vars_added.insert(prefix+species_names[v]); } }