311 lines
6.3 KiB
C++
311 lines
6.3 KiB
C++
|
|
static PyObject*
|
|
ct_newThermoFromXML(PyObject* self, PyObject* args)
|
|
{
|
|
int mxml;
|
|
//char* id;
|
|
if (!PyArg_ParseTuple(args, "i:ct_newThermoFromXML", &mxml)) {
|
|
return NULL;
|
|
}
|
|
int n = int(newThermoFromXML(mxml));
|
|
if (n < 0) {
|
|
return reportCanteraError();
|
|
}
|
|
return Py_BuildValue("i",n);
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_delete(PyObject* self, PyObject* args)
|
|
{
|
|
int th;
|
|
if (!PyArg_ParseTuple(args, "i:thermo_delete", &th)) {
|
|
return NULL;
|
|
}
|
|
delThermo(th);
|
|
return Py_BuildValue("i",0);
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_refpressure(PyObject* self, PyObject* args)
|
|
{
|
|
int th;
|
|
if (!PyArg_ParseTuple(args, "i:refpressure", &th)) {
|
|
return NULL;
|
|
}
|
|
return Py_BuildValue("d",th_refPressure(th));
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_mintemp(PyObject* self, PyObject* args)
|
|
{
|
|
int th, k;
|
|
if (!PyArg_ParseTuple(args, "ii:mintemp", &th, &k)) {
|
|
return NULL;
|
|
}
|
|
return Py_BuildValue("d",th_minTemp(th,k));
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_maxtemp(PyObject* self, PyObject* args)
|
|
{
|
|
int th, k;
|
|
if (!PyArg_ParseTuple(args, "ii:maxtemp", &th, &k)) {
|
|
return NULL;
|
|
}
|
|
return Py_BuildValue("d",th_maxTemp(th,k));
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_import(PyObject* self, PyObject* args)
|
|
{
|
|
int n, mxml;
|
|
char* id;
|
|
if (!PyArg_ParseTuple(args, "iis:import", &n, &mxml, &id)) {
|
|
return NULL;
|
|
}
|
|
int iok = import_phase(n, mxml, id);
|
|
if (iok < 0) {
|
|
return reportError(iok);
|
|
}
|
|
return Py_BuildValue("i",0);
|
|
}
|
|
|
|
|
|
static PyObject*
|
|
thermo_getfp(PyObject* self, PyObject* args)
|
|
{
|
|
double vv = -999.999;
|
|
bool ok = true;
|
|
int th;
|
|
int job;
|
|
|
|
if (!PyArg_ParseTuple(args, "ii:thermo_getfp", &th, &job)) {
|
|
return NULL;
|
|
}
|
|
|
|
// try {
|
|
|
|
// floating-point attributes
|
|
switch (job) {
|
|
case 1:
|
|
vv = th_enthalpy_mole(th);
|
|
break;
|
|
case 2:
|
|
vv = th_intEnergy_mole(th);
|
|
break;
|
|
case 3:
|
|
vv = th_entropy_mole(th);
|
|
break;
|
|
case 4:
|
|
vv = th_gibbs_mole(th);
|
|
break;
|
|
case 5:
|
|
vv = th_cp_mole(th);
|
|
break;
|
|
case 6:
|
|
vv = th_cv_mole(th);
|
|
break;
|
|
case 7:
|
|
vv = th_pressure(th);
|
|
break;
|
|
case 8:
|
|
vv = th_enthalpy_mass(th);
|
|
break;
|
|
case 9:
|
|
vv = th_intEnergy_mass(th);
|
|
break;
|
|
case 10:
|
|
vv = th_entropy_mass(th);
|
|
break;
|
|
case 11:
|
|
vv = th_gibbs_mass(th);
|
|
break;
|
|
case 12:
|
|
vv = th_cp_mass(th);
|
|
break;
|
|
case 13:
|
|
vv = th_cv_mass(th);
|
|
break;
|
|
case 25:
|
|
vv = th_electricPotential(th);
|
|
break;
|
|
case 50:
|
|
vv = th_critTemperature(th);
|
|
break;
|
|
case 51:
|
|
vv = th_critPressure(th);
|
|
break;
|
|
case 52:
|
|
vv = th_critDensity(th);
|
|
break;
|
|
case 53:
|
|
vv = th_vaporFraction(th);
|
|
break;
|
|
|
|
default:
|
|
ok = false;
|
|
}
|
|
if (ok) {
|
|
if (vv == -999.999) {
|
|
return reportCanteraError();
|
|
}
|
|
return Py_BuildValue("d",vv);
|
|
} else {
|
|
PyErr_SetString(ErrorObject,"Unknown floating-point attribute");
|
|
return NULL;
|
|
}
|
|
//}
|
|
//catch (CanteraError) {
|
|
// return reportCanteraError();
|
|
//}
|
|
}
|
|
|
|
static PyObject*
|
|
thermo_setfp(PyObject* self, PyObject* args)
|
|
{
|
|
double v1 = -1.0, v2 = -1.0;
|
|
int iok = -2;
|
|
int th;
|
|
int job;
|
|
|
|
if (!PyArg_ParseTuple(args, "iidd:thermo_setfp", &th, &job, &v1, &v2)) {
|
|
return NULL;
|
|
}
|
|
|
|
//vector_fp v(2);
|
|
double v[2];
|
|
v[0] = v1;
|
|
v[1] = v2;
|
|
// set floating-point attributes
|
|
switch (job) {
|
|
case 1:
|
|
iok = th_setPressure(th, v1);
|
|
break;
|
|
case 2:
|
|
iok = th_set_HP(th, v);
|
|
break;
|
|
case 3:
|
|
iok = th_set_UV(th, v);
|
|
break;
|
|
case 4:
|
|
iok = th_set_SV(th, v);
|
|
break;
|
|
case 5:
|
|
iok = th_set_SP(th, v);
|
|
break;
|
|
case 6:
|
|
iok = th_setElectricPotential(th, v[0]);
|
|
break;
|
|
case 7:
|
|
iok = th_setState_Tsat(th, v1, v2);
|
|
break;
|
|
case 8:
|
|
iok = th_setState_Psat(th, v1, v2);
|
|
break;
|
|
default:
|
|
iok = -10;
|
|
}
|
|
//delete v;
|
|
if (iok >= 0) {
|
|
return Py_BuildValue("i",iok);
|
|
}
|
|
if (iok == -1) {
|
|
return reportCanteraError();
|
|
} else {
|
|
PyErr_SetString(ErrorObject,"Error in thermo_setfp");
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static PyObject*
|
|
thermo_getarray(PyObject* self, PyObject* args)
|
|
{
|
|
int th;
|
|
int job;
|
|
|
|
if (!PyArg_ParseTuple(args, "ii:thermo_getarray", &th, &job)) {
|
|
return NULL;
|
|
}
|
|
|
|
size_t nsp = th_nSpecies(th);
|
|
size_t nel = phase_nElements(th);
|
|
size_t xlen = (job == 21 ? nel : nsp);
|
|
|
|
// array attributes
|
|
int iok = -22;
|
|
|
|
#ifdef HAS_NUMPY
|
|
npy_intp nnn = xlen;
|
|
PyArrayObject* x =
|
|
(PyArrayObject*)PyArray_SimpleNew(1, &nnn, PyArray_DOUBLE);
|
|
#else
|
|
int nnn = int(xlen);
|
|
PyArrayObject* x =
|
|
(PyArrayObject*)PyArray_FromDims(1, &nnn, PyArray_DOUBLE);
|
|
#endif
|
|
double* xd = (double*)x->data;
|
|
switch (job) {
|
|
case 20:
|
|
iok = th_chemPotentials(th,nsp,xd);
|
|
break;
|
|
case 21:
|
|
iok = th_elementPotentials(th,nel,xd);
|
|
break;
|
|
case 23:
|
|
iok = th_getEnthalpies_RT(th,nsp,xd);
|
|
break;
|
|
case 24:
|
|
iok = th_getEntropies_R(th,nsp,xd);
|
|
break;
|
|
case 25:
|
|
iok = th_getCp_R(th,nsp,xd);
|
|
break;
|
|
|
|
default:
|
|
;
|
|
}
|
|
if (iok >= 0) {
|
|
return PyArray_Return(x);
|
|
} else if (iok == -1) {
|
|
return reportCanteraError();
|
|
} else {
|
|
PyErr_SetString(ErrorObject,"Unknown array attribute");
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
static PyObject*
|
|
thermo_equil(PyObject* self, PyObject* args)
|
|
{
|
|
int iok = -2;
|
|
int th;
|
|
char* XY;
|
|
int solver;
|
|
double rtol;
|
|
int maxsteps;
|
|
int maxiter;
|
|
int loglevel;
|
|
|
|
if (!PyArg_ParseTuple(args, "isidiii:thermo_equil", &th, &XY,
|
|
&solver, &rtol, &maxsteps, &maxiter, &loglevel)) {
|
|
return NULL;
|
|
}
|
|
|
|
iok = th_equil(th, XY, solver, rtol, maxsteps, maxiter, loglevel);
|
|
if (iok >= 0) {
|
|
return Py_BuildValue("i",iok);
|
|
}
|
|
if (iok == -1) {
|
|
return reportCanteraError();
|
|
} else {
|
|
PyErr_SetString(ErrorObject,"Error in thermo_equil");
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|