1 //-----------------------------------------------------------------------bl- 2 //-------------------------------------------------------------------------- 3 // 4 // Antioch - A Gas Dynamics Thermochemistry Library 5 // 6 // Copyright (C) 2014-2016 Paul T. Bauman, Benjamin S. Kirk, 7 // Sylvain Plessis, Roy H. Stonger 8 // 9 // Copyright (C) 2013 The PECOS Development Team 10 // 11 // This library is free software; you can redistribute it and/or 12 // modify it under the terms of the Version 2.1 GNU Lesser General 13 // Public License as published by the Free Software Foundation. 14 // 15 // This library is distributed in the hope that it will be useful, 16 // but WITHOUT ANY WARRANTY; without even the implied warranty of 17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 // Lesser General Public License for more details. 19 // 20 // You should have received a copy of the GNU Lesser General Public 21 // License along with this library; if not, write to the Free Software 22 // Foundation, Inc. 51 Franklin Street, Fifth Floor, 23 // Boston, MA 02110-1301 USA 24 // 25 //-----------------------------------------------------------------------el- 26 27 // This class 28 #include "antioch/chemical_mixture.h" 29 30 // Antioch 31 #include "antioch/antioch_numeric_type_instantiate_macro.h" 32 #include "antioch/ascii_parser.h" 33 #include "antioch/species_parsing.h" 34 35 namespace Antioch 36 { 37 template<typename CoeffType> ChemicalMixture(const std::string & filename,const bool verbose,const std::string & species_data,const std::string & vibration_data,const std::string & electronic_data)38 ChemicalMixture<CoeffType>::ChemicalMixture(const std::string & filename, const bool verbose, 39 const std::string & species_data, 40 const std::string & vibration_data, 41 const std::string & electronic_data) 42 { 43 ASCIIParser<CoeffType> parser(filename,verbose); 44 45 read_chemical_species_composition<CoeffType>(static_cast<ParserBase<CoeffType> *> (&parser), *this); 46 47 parser.change_file(species_data); 48 this->read_species_characteristics(&parser,species_data,vibration_data,electronic_data); 49 50 return; 51 } 52 53 template<typename CoeffType> ChemicalMixture(ParserBase<CoeffType> * parser,const std::string & species_data,const std::string & vibration_data,const std::string & electronic_data)54 ChemicalMixture<CoeffType>::ChemicalMixture(ParserBase<CoeffType> * parser, 55 const std::string & species_data, 56 const std::string & vibration_data, 57 const std::string & electronic_data) 58 { 59 read_chemical_species_composition<CoeffType>(parser, *this); 60 61 this->read_species_characteristics(parser,species_data,vibration_data,electronic_data); 62 63 return; 64 } 65 66 template<typename CoeffType> ChemicalMixture(const std::vector<std::string> & species_list,const bool verbose,const std::string & species_data,const std::string & vibration_data,const std::string & electronic_data)67 ChemicalMixture<CoeffType>::ChemicalMixture(const std::vector<std::string>& species_list, 68 const bool verbose, 69 const std::string & species_data, 70 const std::string & vibration_data, 71 const std::string & electronic_data) 72 { 73 this->initialize_species(species_list); 74 75 Antioch::ASCIIParser<CoeffType> parser(species_data,verbose); 76 77 this->read_species_characteristics(static_cast<ParserBase<CoeffType> *>(&parser),species_data,vibration_data,electronic_data); 78 79 return; 80 } 81 82 template<typename CoeffType> ~ChemicalMixture()83 ChemicalMixture<CoeffType>::~ChemicalMixture() 84 { 85 // Clean up all the ChemicalSpecies we stored 86 for( typename std::vector<ChemicalSpecies<CoeffType>* >::iterator it = _chemical_species.begin(); 87 it < _chemical_species.end(); ++it ) 88 { 89 delete (*it); 90 } 91 92 return; 93 } 94 95 template<typename CoeffType> read_species_characteristics(ParserBase<CoeffType> * parser,const std::string &,const std::string & vibration_data,const std::string & electronic_data)96 void ChemicalMixture<CoeffType>::read_species_characteristics(ParserBase<CoeffType> * parser, 97 const std::string & /*species_data*/, 98 const std::string & vibration_data, 99 const std::string & electronic_data) 100 { 101 // species file is already in parser object 102 this->read_species_mandatory_characteristics(parser); 103 104 //... and any vibrational data 105 parser->change_file(vibration_data); 106 this->read_species_vibrational_characteristics(parser); 107 108 //... and any electronic data 109 parser->change_file(electronic_data); 110 this->read_species_electronic_characteristics(parser); 111 } 112 113 template<typename CoeffType> initialize_species(const std::vector<std::string> & species_list)114 void ChemicalMixture<CoeffType>::initialize_species( const std::vector<std::string>& species_list ) 115 { 116 _chemical_species.resize( species_list.size(), NULL ); 117 // Build up name map for all possible species 118 this->init_species_name_map(species_list); 119 120 // Build up inverse name map 121 this->build_inverse_name_map(); 122 123 // Populate species list for requested species 124 _species_list.reserve( species_list.size() ); 125 for( unsigned int s = 0; s < species_list.size(); s++ ) 126 { 127 if( _species_name_map.find( species_list[s] ) == _species_name_map.end() ) 128 { 129 std::cerr << "Error in ChemicalMixture: Unknown species " << species_list[s] << std::endl; 130 antioch_error(); 131 } 132 133 _species_list.push_back( _species_name_map.find( species_list[s] )->second ); 134 } 135 } 136 137 template<typename CoeffType> init_species_name_map(const std::vector<std::string> & species_list)138 void ChemicalMixture<CoeffType>::init_species_name_map(const std::vector<std::string> & species_list) 139 { 140 _species_name_map.clear(); 141 for(unsigned int s = 0; s < species_list.size(); s++) 142 { 143 _species_name_map[species_list[s]] = s; 144 } 145 } 146 147 template<typename CoeffType> build_inverse_name_map()148 void ChemicalMixture<CoeffType>::build_inverse_name_map() 149 { 150 for( std::map<std::string,Species>::const_iterator it = _species_name_map.begin(); 151 it != _species_name_map.end(); ++it ) 152 { 153 _species_inv_name_map.insert( std::make_pair( it->second, it->first ) ); 154 } 155 156 return; 157 } 158 159 template <typename CoeffType> read_species_mandatory_characteristics(ParserBase<CoeffType> * parser)160 void ChemicalMixture<CoeffType>::read_species_mandatory_characteristics(ParserBase<CoeffType> * parser) 161 { 162 read_species_data<CoeffType>(parser, *this); 163 } 164 165 template <typename CoeffType> read_species_vibrational_characteristics(ParserBase<CoeffType> * parser)166 void ChemicalMixture<CoeffType>::read_species_vibrational_characteristics(ParserBase<CoeffType> * parser) 167 { 168 read_species_vibrational_data<CoeffType>(parser, *this); 169 } 170 171 template <typename CoeffType> read_species_electronic_characteristics(ParserBase<CoeffType> * parser)172 void ChemicalMixture<CoeffType>::read_species_electronic_characteristics(ParserBase<CoeffType> * parser) 173 { 174 read_species_electronic_data<CoeffType>(parser, *this); 175 } 176 177 template<typename CoeffType> add_species(const unsigned int index,const std::string & name,CoeffType mol_wght,CoeffType h_form,CoeffType n_tr_dofs,int charge)178 void ChemicalMixture<CoeffType>::add_species( const unsigned int index, 179 const std::string& name, 180 CoeffType mol_wght, 181 CoeffType h_form, 182 CoeffType n_tr_dofs, int charge) 183 { 184 _chemical_species[index] = 185 new ChemicalSpecies<CoeffType>(name, mol_wght, h_form, n_tr_dofs, charge); 186 } 187 188 template<typename CoeffType> add_species_vibrational_data(const unsigned int index,const CoeffType theta_v,const unsigned int ndg_v)189 void ChemicalMixture<CoeffType>::add_species_vibrational_data( const unsigned int index, 190 const CoeffType theta_v, 191 const unsigned int ndg_v ) 192 { 193 (_chemical_species[index])->add_vibrational_data(theta_v, ndg_v); 194 } 195 196 template<typename CoeffType> add_species_electronic_data(const unsigned int index,const CoeffType theta_e,const unsigned int ndg_e)197 void ChemicalMixture<CoeffType>::add_species_electronic_data( const unsigned int index, 198 const CoeffType theta_e, 199 const unsigned int ndg_e ) 200 { 201 (_chemical_species[index])->add_electronic_data(theta_e, ndg_e); 202 } 203 204 } // end namespace Antioch 205 206 // Instantiate 207 ANTIOCH_NUMERIC_TYPE_CLASS_INSTANTIATE(Antioch::ChemicalMixture); 208