1 /** 2 * @file ctmultiphase.cpp 3 */ 4 5 // This file is part of Cantera. See License.txt in the top-level directory or 6 // at https://cantera.org/license.txt for license and copyright information. 7 8 #define CANTERA_USE_INTERNAL 9 #include "cantera/clib/ctmultiphase.h" 10 11 // Cantera includes 12 #include "cantera/equil/MultiPhase.h" 13 #include "cantera/thermo/ThermoPhase.h" 14 #include "Cabinet.h" 15 16 using namespace std; 17 using namespace Cantera; 18 19 typedef Cabinet<MultiPhase> mixCabinet; 20 template<> mixCabinet* mixCabinet::s_storage = 0; 21 22 extern "C" { 23 mix_new()24 int mix_new() 25 { 26 try { 27 MultiPhase* m = new MultiPhase; 28 return mixCabinet::add(m); 29 } catch (...) { 30 return handleAllExceptions(-1, ERR); 31 } 32 } 33 mix_del(int i)34 int mix_del(int i) 35 { 36 try { 37 mixCabinet::del(i); 38 return 0; 39 } catch (...) { 40 return handleAllExceptions(-1, ERR); 41 } 42 } 43 ct_clearMix()44 int ct_clearMix() 45 { 46 try { 47 mixCabinet::clear(); 48 return 0; 49 } catch (...) { 50 return handleAllExceptions(-1, ERR); 51 } 52 } 53 mix_addPhase(int i,int j,double moles)54 int mix_addPhase(int i, int j, double moles) 55 { 56 try { 57 mixCabinet::item(i).addPhase(&Cabinet<ThermoPhase>::item(j), moles); 58 return 0; 59 } catch (...) { 60 return handleAllExceptions(-1, ERR); 61 } 62 } 63 mix_init(int i)64 int mix_init(int i) 65 { 66 try { 67 mixCabinet::item(i).init(); 68 return 0; 69 } catch (...) { 70 return handleAllExceptions(-1, ERR); 71 } 72 } 73 mix_updatePhases(int i)74 int mix_updatePhases(int i) 75 { 76 try { 77 mixCabinet::item(i).updatePhases(); 78 return 0; 79 } catch (...) { 80 return handleAllExceptions(-1, ERR); 81 } 82 } 83 mix_nElements(int i)84 size_t mix_nElements(int i) 85 { 86 try { 87 return mixCabinet::item(i).nElements(); 88 } catch (...) { 89 return handleAllExceptions(npos, npos); 90 } 91 } 92 mix_elementIndex(int i,const char * name)93 size_t mix_elementIndex(int i, const char* name) 94 { 95 try { 96 return mixCabinet::item(i).elementIndex(name); 97 } catch (...) { 98 return handleAllExceptions(npos, npos); 99 } 100 } 101 mix_nSpecies(int i)102 size_t mix_nSpecies(int i) 103 { 104 try { 105 return mixCabinet::item(i).nSpecies(); 106 } catch (...) { 107 return handleAllExceptions(npos, npos); 108 } 109 } 110 mix_speciesIndex(int i,int k,int p)111 size_t mix_speciesIndex(int i, int k, int p) 112 { 113 try { 114 MultiPhase& mix = mixCabinet::item(i); 115 mix.checkPhaseIndex(p); 116 mix.checkSpeciesIndex(k); 117 return mix.speciesIndex(k, p); 118 } catch (...) { 119 return handleAllExceptions(npos, npos); 120 } 121 } 122 mix_nAtoms(int i,int k,int m)123 doublereal mix_nAtoms(int i, int k, int m) 124 { 125 try { 126 MultiPhase& mix = mixCabinet::item(i); 127 mix.checkSpeciesIndex(k); 128 mix.checkElementIndex(m); 129 return mixCabinet::item(i).nAtoms(k,m); 130 } catch (...) { 131 return handleAllExceptions(DERR, DERR); 132 } 133 } 134 mix_nPhases(int i)135 size_t mix_nPhases(int i) 136 { 137 try { 138 return mixCabinet::item(i).nPhases(); 139 } catch (...) { 140 return handleAllExceptions(npos, npos); 141 } 142 } 143 mix_phaseMoles(int i,int n)144 doublereal mix_phaseMoles(int i, int n) 145 { 146 try { 147 MultiPhase& mix = mixCabinet::item(i); 148 mix.checkPhaseIndex(n); 149 return mix.phaseMoles(n); 150 } catch (...) { 151 return handleAllExceptions(DERR, DERR); 152 } 153 } 154 mix_setPhaseMoles(int i,int n,double v)155 int mix_setPhaseMoles(int i, int n, double v) 156 { 157 try { 158 MultiPhase& mix = mixCabinet::item(i); 159 mix.checkPhaseIndex(n); 160 if (v < 0.0) { 161 throw CanteraError("mix_setPhaseMoles", 162 "Mole number must be non-negative."); 163 } 164 mix.setPhaseMoles(n, v); 165 return 0; 166 } catch (...) { 167 return handleAllExceptions(-1, ERR); 168 } 169 } 170 mix_setMoles(int i,size_t nlen,const double * n)171 int mix_setMoles(int i, size_t nlen, const double* n) 172 { 173 try { 174 MultiPhase& mix = mixCabinet::item(i); 175 mix.checkSpeciesArraySize(nlen); 176 mix.setMoles(n); 177 return 0; 178 } catch (...) { 179 return handleAllExceptions(-1, ERR); 180 } 181 } 182 183 mix_setMolesByName(int i,const char * n)184 int mix_setMolesByName(int i, const char* n) 185 { 186 try { 187 mixCabinet::item(i).setMolesByName(n); 188 return 0; 189 } catch (...) { 190 return handleAllExceptions(-1, ERR); 191 } 192 } 193 mix_setTemperature(int i,double t)194 int mix_setTemperature(int i, double t) 195 { 196 try { 197 if (t < 0.0) { 198 throw CanteraError("mix_setTemperature", 199 "Temperature must be positive."); 200 } 201 mixCabinet::item(i).setTemperature(t); 202 return 0; 203 } catch (...) { 204 return handleAllExceptions(-1, ERR); 205 } 206 } 207 mix_temperature(int i)208 doublereal mix_temperature(int i) 209 { 210 try { 211 return mixCabinet::item(i).temperature(); 212 } catch (...) { 213 return handleAllExceptions(DERR, DERR); 214 } 215 } 216 mix_minTemp(int i)217 doublereal mix_minTemp(int i) 218 { 219 try { 220 return mixCabinet::item(i).minTemp(); 221 } catch (...) { 222 return handleAllExceptions(DERR, DERR); 223 } 224 } 225 mix_maxTemp(int i)226 doublereal mix_maxTemp(int i) 227 { 228 try { 229 return mixCabinet::item(i).maxTemp(); 230 } catch (...) { 231 return handleAllExceptions(DERR, DERR); 232 } 233 } 234 mix_charge(int i)235 doublereal mix_charge(int i) 236 { 237 try { 238 return mixCabinet::item(i).charge(); 239 } catch (...) { 240 return handleAllExceptions(DERR, DERR); 241 } 242 } 243 mix_phaseCharge(int i,int p)244 doublereal mix_phaseCharge(int i, int p) 245 { 246 try { 247 MultiPhase& mix = mixCabinet::item(i); 248 mix.checkPhaseIndex(p); 249 return mix.phaseCharge(p); 250 } catch (...) { 251 return handleAllExceptions(DERR, DERR); 252 } 253 } 254 mix_setPressure(int i,double p)255 int mix_setPressure(int i, double p) 256 { 257 try { 258 if (p < 0.0) { 259 throw CanteraError("mix_setPressure", 260 "Pressure must be positive."); 261 } 262 mixCabinet::item(i).setPressure(p); 263 return 0; 264 } catch (...) { 265 return handleAllExceptions(-1, ERR); 266 } 267 } 268 mix_pressure(int i)269 doublereal mix_pressure(int i) 270 { 271 try { 272 return mixCabinet::item(i).pressure(); 273 } catch (...) { 274 return handleAllExceptions(DERR, DERR); 275 } 276 } 277 mix_speciesMoles(int i,int k)278 doublereal mix_speciesMoles(int i, int k) 279 { 280 try { 281 MultiPhase& mix = mixCabinet::item(i); 282 mix.checkSpeciesIndex(k); 283 return mix.speciesMoles(k); 284 } catch (...) { 285 return handleAllExceptions(DERR, DERR); 286 } 287 } 288 mix_elementMoles(int i,int m)289 doublereal mix_elementMoles(int i, int m) 290 { 291 try { 292 MultiPhase& mix = mixCabinet::item(i); 293 mix.checkElementIndex(m); 294 return mix.elementMoles(m); 295 } catch (...) { 296 return handleAllExceptions(DERR, DERR); 297 } 298 } 299 mix_equilibrate(int i,const char * XY,doublereal rtol,int maxsteps,int maxiter,int loglevel)300 doublereal mix_equilibrate(int i, const char* XY, doublereal rtol, 301 int maxsteps, int maxiter, int loglevel) 302 { 303 try { 304 mixCabinet::item(i).equilibrate(XY, "auto", rtol, maxsteps, maxiter, 305 0, loglevel); 306 return 0; 307 } catch (...) { 308 return handleAllExceptions(DERR, DERR); 309 } 310 } 311 mix_getChemPotentials(int i,size_t lenmu,double * mu)312 int mix_getChemPotentials(int i, size_t lenmu, double* mu) 313 { 314 try { 315 MultiPhase& mix = mixCabinet::item(i); 316 mix.checkSpeciesArraySize(lenmu); 317 mix.getChemPotentials(mu); 318 return 0; 319 } catch (...) { 320 return handleAllExceptions(-1, ERR); 321 } 322 } 323 mix_enthalpy(int i)324 double mix_enthalpy(int i) 325 { 326 try { 327 return mixCabinet::item(i).enthalpy(); 328 } catch (...) { 329 return handleAllExceptions(DERR, DERR); 330 } 331 } 332 mix_entropy(int i)333 double mix_entropy(int i) 334 { 335 try { 336 return mixCabinet::item(i).entropy(); 337 } catch (...) { 338 return handleAllExceptions(DERR, DERR); 339 } 340 } 341 mix_gibbs(int i)342 double mix_gibbs(int i) 343 { 344 try { 345 return mixCabinet::item(i).gibbs(); 346 } catch (...) { 347 return handleAllExceptions(DERR, DERR); 348 } 349 } 350 mix_cp(int i)351 double mix_cp(int i) 352 { 353 try { 354 return mixCabinet::item(i).cp(); 355 } catch (...) { 356 return handleAllExceptions(DERR, DERR); 357 } 358 } 359 mix_volume(int i)360 double mix_volume(int i) 361 { 362 try { 363 return mixCabinet::item(i).volume(); 364 } catch (...) { 365 return handleAllExceptions(DERR, DERR); 366 } 367 } 368 mix_speciesPhaseIndex(int i,int k)369 size_t mix_speciesPhaseIndex(int i, int k) 370 { 371 try { 372 MultiPhase& mix = mixCabinet::item(i); 373 mix.checkSpeciesIndex(k); 374 return mix.speciesPhaseIndex(k); 375 } catch (...) { 376 return handleAllExceptions(npos, npos); 377 } 378 } 379 mix_moleFraction(int i,int k)380 double mix_moleFraction(int i, int k) 381 { 382 try { 383 MultiPhase& mix = mixCabinet::item(i); 384 mix.checkSpeciesIndex(k); 385 return mix.moleFraction(k); 386 } catch (...) { 387 return handleAllExceptions(DERR, DERR); 388 } 389 } 390 } 391