cantera/Cantera/matlab/src/mixturemethods.cpp

176 lines
5.1 KiB
C++

/**
* @file mixturemethods.cpp
*/
/*
* $Id: mixturemethods.cpp,v 1.3 2009/07/11 16:43:12 hkmoffa Exp $
*/
#include "mex.h"
#include <cantera/clib/ctmultiphase.h>
#include <cantera/clib/ct.h>
#include "ctmatutils.h"
#include <iostream>
using namespace std;
void mixturemethods( int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[] )
{
int m, iok, n;
int job = getInt(prhs[1]);
int i = getInt(prhs[2]);
double r = Undef;
double v = Undef;
if (nrhs > 3 && job != 8 && job != 22 && job != 23)
v = getDouble(prhs[3]);
// constructor
if (job == 0) {
n = mix_new();
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
double *h = mxGetPr(plhs[0]);
*h = double(n);
if (n < 0) reportError();
return;
}
// options that do not return a value
double moles, err;
char *nmstr, *XY, *nm;
int maxiter, maxsteps, loglevel;
if (job < 15) {
switch (job) {
case 1:
iok = mix_del(i);
break;
case 2:
iok = mix_copy(i);
break;
case 3:
iok = mix_assign(i, int(v));
break;
case 4:
checkNArgs(5, nrhs);
moles = getDouble(prhs[4]);
iok = mix_addPhase(i, int(v), moles);
break;
case 5:
iok = mix_setTemperature(i, v);
break;
case 6:
iok = mix_setPressure(i, v);
break;
case 7:
checkNArgs(5, nrhs);
moles = getDouble(prhs[4]);
iok = mix_setPhaseMoles(i, int(v)-1, moles);
break;
case 8:
checkNArgs(4, nrhs);
nmstr = getString(prhs[3]);
iok = mix_setMolesByName(i, nmstr);
break;
default:
mexErrMsgTxt("unknown job parameter");
}
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
double *h = mxGetPr(plhs[0]);
*h = double(iok);
if (iok < 0) reportError();
return;
}
// options that return a value of type 'double'
else if (job < 40) {
switch (job) {
case 19:
r = mix_nPhases(i);
break;
case 21:
r = mix_nElements(i);
break;
case 22:
checkNArgs(4, nrhs);
nm = getString(prhs[3]);
r = mix_elementIndex(i, nm)+1;
break;
case 23:
checkNArgs(5, nrhs);
m = getInt(prhs[3]);
n = getInt(prhs[4]);
r = mix_speciesIndex(i, m-1, n-1)+1;
break;
case 24:
r = mix_nSpecies(i);
break;
case 25:
r = mix_temperature(i);
break;
case 26:
r = mix_pressure(i);
break;
case 27:
m = getInt(prhs[4]);
r = mix_nAtoms(i,int(v), m);
break;
case 28:
r = mix_phaseMoles(i, int(v)-1);
break;
case 29:
r = mix_speciesMoles(i, int(v)-1);
break;
case 30:
r = mix_elementMoles(i, int(v)-1);
break;
case 31:
checkNArgs(8, nrhs);
XY = getString(prhs[3]);
err = getDouble(prhs[4]);
maxsteps = getInt(prhs[5]);
maxiter = getInt(prhs[6]);
loglevel = getInt(prhs[7]);
r = mix_equilibrate(i, XY, err, maxsteps,
maxiter, loglevel);
break;
default:
mexErrMsgTxt("unknown job parameter");
}
plhs[0] = mxCreateNumericMatrix(1,1,mxDOUBLE_CLASS,mxREAL);
double *h = mxGetPr(plhs[0]);
*h = r;
if (r == Undef) reportError();
return;
}
// species properties
else if (job < 60) {
int iok = 0;
int nsp = mix_nSpecies(i);
double* x = new double[nsp];
switch (job) {
case 41:
iok = mix_getChemPotentials(i,nsp,x);
break;
default:
;
}
plhs[0] = mxCreateNumericMatrix(nsp,1,
mxDOUBLE_CLASS,mxREAL);
double *h = mxGetPr(plhs[0]);
if (iok >= 0) {
for (int i = 0; i < nsp; i++) h[i] = x[i];
delete x;
return;
}
else {
for (int i = 0; i < nsp; i++) h[i] = -999.99;
delete x;
mexErrMsgTxt("unknown attribute");
return;
}
}
}