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