diff --git a/Cantera/SConscript b/Cantera/SConscript new file mode 100644 index 000000000..7c4f8fc67 --- /dev/null +++ b/Cantera/SConscript @@ -0,0 +1,14 @@ +from buildutils import * + +Import('env', 'build') + +# (subdir, library name, (file extensions)) +libs = [LibOpts('cxx/src', 'ctcxx'), + LibOpts('clib/src', 'clib')] + +print os.getcwd() +for lib in libs: + localenv = env.Clone() + localenv.Library(pjoin('../lib', lib.name), + source=mglob(localenv, lib.subdir, *lib.extensions)) + diff --git a/Cantera/clib/src/ctbdry.cpp b/Cantera/clib/src/ctbdry.cpp index 76a4e188b..b362384a1 100755 --- a/Cantera/clib/src/ctbdry.cpp +++ b/Cantera/clib/src/ctbdry.cpp @@ -27,7 +27,7 @@ using namespace std; using namespace Cantera; -Cabinet* Cabinet::__storage = 0; +template<> Cabinet* Cabinet::__storage = 0; inline Bdry1D* _bndry(int i) { return Cabinet::cabinet()->item(i); diff --git a/Cantera/clib/src/ctnum.cpp b/Cantera/clib/src/ctnum.cpp deleted file mode 100755 index b3ad3650d..000000000 --- a/Cantera/clib/src/ctnum.cpp +++ /dev/null @@ -1,183 +0,0 @@ - -// Cantera includes -#include "numerics.h" -#include "Cabinet.h" -inline DenseMatrix* _matrix(int i) { - return Cabinet::cabinet()->item(i); -} - -inline BandMatrix* _bmatrix(int i) { - return Cabinet::cabinet()->item(i); -} - -// Build as a DLL under Windows -#ifdef WIN32 -#ifdef NO_DLL_BUILD -#define DLL_EXPORT -#else -#define DLL_EXPORT __declspec(dllexport) -#endif -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#else -#define DLL_EXPORT -#endif - -// Values returned for error conditions -#define ERR -999 -#define DERR -999.999 - -Cabinet* Cabinet::__storage = 0; -Cabinet* Cabinet::__storage = 0; - -extern "C" { - - - ///// Matrix ////// - - int DLL_EXPORT newMatrix(int m, int n) { - DenseMatrix* x = new DenseMatrix(m,n); - return Cabinet::cabinet()->add(x); - } - - int DLL_EXPORT delMatrix(int i) { - Cabinet::cabinet()->del(i); - return 0; - } - - int DLL_EXPORT matrix_copy(int i) { - return Cabinet::cabinet()->newCopy(i); - } - - int DLL_EXPORT matrix_assign(int i, int j) { - return Cabinet::cabinet()->assign(i,j); - } - - int DLL_EXPORT matrix_nRows(int i) { - return _matrix(i)->nRows(); - } - - int DLL_EXPORT matrix_nColumns(int i) { - return _matrix(i)->nColumns(); - } - - int DLL_EXPORT matrix_resize(int i, int m, int n, double v) { - _matrix(i)->resize(m,n,v); - return 0; - } - - int DLL_EXPORT matrix_appendColumn(int i, double* c) { - _matrix(i)->appendColumn(c); - return 0; - } - - double DLL_EXPORT matrix_value(int i, int m, int n) { - return _matrix(i)->value(m,n); - } - - double DLL_EXPORT matrix_setvalue(int i, int m, int n, double v) { - _matrix(i)->value(m,n) = v; - return v; - } - - int DLL_EXPORT matrix_solve(int i1, int i2) { - try { - int info = solve(*_matrix(i1), *_matrix(i2)); - return info; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - - int DLL_EXPORT matrix_multiply(int ma, int mb, int mp) { - try { - DenseMatrix* a = _matrix(ma); - DenseMatrix* b = _matrix(mb); - DenseMatrix* p = _matrix(mp); - multiply(*a, b->begin(), p->begin()); - return 0; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - - int DLL_EXPORT matrix_invert(int ma) { - try { - invert(*_matrix(ma)); - return 0; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - - - ///////////////// BandMatrix ////////////////////// - - - int DLL_EXPORT bmatrix_new(int n, int kl, int ku) { - BandMatrix* x = new BandMatrix(n, kl, ku); - return Cabinet::cabinet()->add(x); - } - - int DLL_EXPORT bmatrix_del(int i) { - Cabinet::cabinet()->del(i); - return 0; - } - - int DLL_EXPORT bmatrix_copy(int i) { - return Cabinet::cabinet()->newCopy(i); - } - - int DLL_EXPORT bmatrix_assign(int i, int j) { - return Cabinet::cabinet()->assign(i,j); - } - - int DLL_EXPORT bmatrix_nRows(int i) { - return _bmatrix(i)->rows(); - } - - int DLL_EXPORT bmatrix_nColumns(int i) { - return _bmatrix(i)->columns(); - } - - int DLL_EXPORT bmatrix_resize(int i, int m, int n, double v) { - _bmatrix(i)->resize(m,n,v); - return 0; - } - - double DLL_EXPORT bmatrix_value(int i, int m, int n) { - return _bmatrix(i)->value(m,n); - } - - double DLL_EXPORT bmatrix_setvalue(int i, int m, int n, double v) { - try { - _bmatrix(i)->value(m,n) = v; - return v; - } - catch (...) { return ERR; } - } - - int DLL_EXPORT bmatrix_solve(int ma, int mb) { - try { - int n = _bmatrix(ma)->nColumns(); - _bmatrix(ma)->solve(n, - _matrix(mb)->begin()); - return 0; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - - int DLL_EXPORT bmatrix_multiply(int ma, int mb, int mp) { - try { - BandMatrix* a = _bmatrix(ma); - DenseMatrix* b = _matrix(mb); - DenseMatrix* p = _matrix(mp); - a->mult(b->begin(), p->begin()); - return 0; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - -} diff --git a/Cantera/clib/src/ctnum.h b/Cantera/clib/src/ctnum.h deleted file mode 100755 index 791a302bf..000000000 --- a/Cantera/clib/src/ctnum.h +++ /dev/null @@ -1,44 +0,0 @@ -/** - * @file ctnum.h - */ -/* - * $Id$ - */ - -#ifndef CTC_CTNUM_H -#define CTC_CTNUM_H - -#include "clib_defs.h" - -extern "C" { - - EEXXTT int DLL_CPREFIX newMatrix(int m, int n); - EEXXTT int DLL_CPREFIX delMatrix(int i); - EEXXTT int DLL_CPREFIX matrix_copy(int i); - EEXXTT int DLL_CPREFIX matrix_assign(int i, int j); - EEXXTT int DLL_CPREFIX matrix_nRows(int i); - EEXXTT int DLL_CPREFIX matrix_nColumns(int i); - EEXXTT int DLL_CPREFIX matrix_resize(int i, int m, int n, double v); - EEXXTT int DLL_CPREFIX matrix_appendColumn(int i, double* c); - EEXXTT double DLL_CPREFIX matrix_value(int i, int m, int n); - EEXXTT double DLL_CPREFIX matrix_setvalue(int i, int m, int n, double v); - EEXXTT int DLL_CPREFIX matrix_solve(int i1, int i2); - EEXXTT int DLL_CPREFIX matrix_multiply(int ma, int mb, int mp); - EEXXTT int DLL_CPREFIX matrix_invert(int ma); - - EEXXTT int DLL_CPREFIX bmatrix_new(int n, int kl, int ku); - EEXXTT int DLL_CPREFIX bmatrix_del(int i); - EEXXTT int DLL_CPREFIX bmatrix_copy(int i); - EEXXTT int DLL_CPREFIX bmatrix_assign(int i, int j); - EEXXTT int DLL_CPREFIX bmatrix_nRows(int i); - EEXXTT int DLL_CPREFIX bmatrix_nColumns(int i); - EEXXTT int DLL_CPREFIX bmatrix_resize(int i, int m, int n, double v); - EEXXTT double DLL_CPREFIX bmatrix_value(int i, int m, int n); - EEXXTT double DLL_CPREFIX bmatrix_setvalue(int i, int m, int n, double v); - EEXXTT int DLL_CPREFIX bmatrix_solve(int ma, int mb); - EEXXTT int DLL_CPREFIX bmatrix_multiply(int ma, int mb, int mp); - - -} - -#endif diff --git a/Cantera/clib/src/ctstagn.cpp b/Cantera/clib/src/ctstagn.cpp deleted file mode 100755 index f7bd67846..000000000 --- a/Cantera/clib/src/ctstagn.cpp +++ /dev/null @@ -1,456 +0,0 @@ - -// Cantera includes -#include "oneD/OneDim.h" -#include "oneD/StFlow.h" -#include "oneD/Inlet1D.h" -#include "oneD/MultiNewton.h" -#include "DenseMatrix.h" -#include "Cabinet.h" -#include "Storage.h" - -// Build as a DLL under Windows -#ifdef WIN32 -#ifdef NO_DLL_BUILD -#define DLL_EXPORT -#else -#define DLL_EXPORT __declspec(dllexport) -#endif -#pragma warning(disable:4786) -#pragma warning(disable:4503) -#else -#define DLL_EXPORT -#endif - -// Values returned for error conditions -#define ERR -999 -#define DERR -999.999 - -using namespace FlowBdry; - -Cabinet* Cabinet::__storage = 0; -Cabinet* Cabinet::__storage = 0; -Cabinet* Cabinet::__storage = 0; -//Cabinet* Cabinet::__storage = 0; - -inline OneDim* _onedim(int i) { - return Cabinet::cabinet()->item(i); -} - -inline StFlow* _flow(int i) { - return Cabinet::cabinet()->item(i); -} - -inline Boundary* _boundary(int i) { - return Cabinet::cabinet()->item(i); -} - -inline Bdry1D* _bndry(int i) { - return Cabinet::cabinet()->item(i); -} - -//inline SurfKinetics* _surfkin(int i) { -// return Cabinet::cabinet()->item(i); -//} - -//inline Surf1D* _surface(int i) { -// return Cabinet::cabinet()->item(i); -//} - -inline DenseMatrix* _matrix(int i) { - return Cabinet::cabinet()->item(i); -} - -inline ThermoPhase* _phase(int n) { - return Storage::__storage->__thtable[n]; -} - -inline Kinetics* _kinetics(int n) { - return Storage::__storage->__ktable[n]; -} - -inline ThermoPhase* _thermo(int n) { - return Storage::__storage->__thtable[n]; -} - -inline Transport* _transport(int n) { - return Storage::__storage->__trtable[n]; -} - - -extern "C" { - - int DLL_EXPORT flow_new(int type, int iph, int np) { - IdealGasPhase* ph = (IdealGasPhase*)_thermo(iph); - StFlow* x; - try { - switch (type) { - case 0: - x = new AxiStagnFlow(ph, ph->nSpecies(), np); break; - case 1: - x = new OneDFlow(ph, ph->nSpecies(), np); break; - default: - return -2; - } - return Cabinet::cabinet()->add(x); - } - catch (CanteraError) { return -1; } - } - - - int DLL_EXPORT flow_del(int i) { - Cabinet::cabinet()->del(i); - return 0; - } - - int DLL_EXPORT flow_copy(int i) { - return Cabinet::cabinet()->newCopy(i); - } - - int DLL_EXPORT flow_assign(int i, int j) { - return Cabinet::cabinet()->assign(i,j); - } - -// int DLL_EXPORT flow_readinputs(int i, char* infile) { -// try { -// ifstream f(infile); -// if (!f) throw CanteraError("flow_readinputs", -// "error opening input file"); -// // _flow(i)->readInputs(f); -// f.close(); -// return 0; -// } -// catch (CanteraError) { return -1; } -// catch (...) { return ERR; } -// } - - int DLL_EXPORT flow_setupgrid(int i, int npts, double* grid) { - try { - _flow(i)->setupGrid(npts, grid); - return 0; - } - catch (CanteraError) { return -1; } - //catch (...) { return ERR; } - } - - int DLL_EXPORT flow_setthermo(int i, int k) { - IdealGasPhase* th = (IdealGasPhase*)_thermo(k); - _flow(i)->setThermo(*th); - return 0; - } - - int DLL_EXPORT flow_setkinetics(int i, int k) { - Kinetics* kin = _kinetics(k); - _flow(i)->setKinetics(*kin); - return 0; - } - - int DLL_EXPORT flow_settransport(int i, int k, int soret) { - try { - Transport* tr = _transport(k); - bool withSoret = (soret == 1); - _flow(i)->setTransport(*tr, withSoret); - return 0; - } - catch (CanteraError) { return -1; } - } - - int DLL_EXPORT flow_settemperature(int i, int j, double t) { - _flow(i)->setTemperature(j, t); - return 0; - } - - int DLL_EXPORT flow_setmassfraction(int i, int j, int k, double t) { - _flow(i)->setMassFraction(j, k, t); - return 0; - } - - int DLL_EXPORT flow_setpressure(int i, double p) { - _flow(i)->setPressure(p); - return 0; - } - - int DLL_EXPORT flow_showsolution(int i, char* fname, double* soln) { - string fn = string(fname); - if (fn == "-") - _flow(i)->showSolution(cout, soln); - else { - ofstream fout(fname); - _flow(i)->showSolution(fout, soln); - fout.close(); - } - return 0; - } - - int DLL_EXPORT flow_outputtec(int i, doublereal* x, - char* fname, char* title, int zone) { - ofstream f(fname); - //DenseMatrix* mat = _matrix(m); - _flow(i)->outputTEC(f, x, string(title), zone); - return 0; - } - - - // solve / fix - - int DLL_EXPORT flow_solveenergyeqn(int i, int j) { - _flow(i)->solveEnergyEqn(j); - return 0; - } - - int DLL_EXPORT flow_fixtemperature(int i, int j) { - _flow(i)->fixTemperature(j); - return 0; - } - - int DLL_EXPORT flow_setenergyfactor(int i, double e) { - _flow(i)->setEnergyFactor(e); - return 0; - } - - int DLL_EXPORT flow_fixspecies(int i, int j) { - _flow(i)->fixSpecies(j); - return 0; - } - - int DLL_EXPORT flow_solvespecies(int i, int j) { - _flow(i)->solveSpecies(j); - return 0; - } - - int DLL_EXPORT flow_resize(int i, int points) { - _flow(i)->resize(points); - return 0; - } - -// int DLL_EXPORT flow_integratechem(int i, doublereal* x, double dt) { -// try{ -// _flow(i)->integrateChem(x, dt); -// return 0; -// } -// catch (CanteraError) { return -1; } -// } - - int DLL_EXPORT flow_settolerances(int i, int nr, - doublereal* rtol, int na, doublereal* atol) { - try { - _flow(i)->setTolerances(nr, rtol, na, atol); - return 0; - } - catch (CanteraError) { return -1; } - //catch (...) { return ERR; } - } - - int DLL_EXPORT flow_eval(int i, int j, doublereal* x, doublereal* r, integer* m) { - try { - _flow(i)->eval(j, x, r, m); - return 0; - } - catch (CanteraError) { return -1; } - } - - int DLL_EXPORT flow_restore(int i, int job, char* fname, char* id, - int& size_z, doublereal* z, int& size_soln, doublereal* soln) { - try { - _flow(i)->restore(job, fname, string(id), size_z, z, - size_soln, soln); - return 0; - } - catch (CanteraError) { return -1; } - catch (...) { return ERR; } - } - - int DLL_EXPORT flow_setfixedpoint(int i, int j0, doublereal t0) { - _flow(i)->setFixedPoint(j0, t0); - return 0; - } - - - int DLL_EXPORT flow_setboundaries(int i, int nleft, int nright) { - Boundary *left=0, *right=0; - if (nleft > 0) left = _boundary(nleft); - if (nright > 0) right = _boundary(nright); - _flow(i)->setBoundaries(left, right); - return 0; - } - - - //========================================================== - - int DLL_EXPORT bdry_new(int type, int iph, int kin) { - Boundary* x=0; - //const doublereal* wt = _phase(iph)->molecularWeights().begin(); - int nsp = _phase(iph)->nSpecies(); - switch (type) { - case 0: - x = new Inlet(nsp); break; - case 1: - x = new Outlet(nsp); break; - //case 2: - //if (kin > 0) - // x = new Surface(nsp, _surfkin(kin)); - //else - // x = new Surface(nsp, 0); - //break; - case 3: - x = new SymmPlane(nsp); break; - default: - return -2; - } - return Cabinet::cabinet()->add(x); - } - - - int DLL_EXPORT bdry_del(int i) { - Cabinet::cabinet()->del(i); - return 0; - } - - int DLL_EXPORT bdry_copy(int i) { - return Cabinet::cabinet()->newCopy(i); - } - - int DLL_EXPORT bdry_assign(int i, int j) { - return Cabinet::cabinet()->assign(i,j); - } - - int DLL_EXPORT bdry_set(int i, int n, doublereal* v) { - switch (n) { - case 1: - _boundary(i)->set_mdot(*v); break; - case 2: - _boundary(i)->set_V(*v); break; - case 3: - _boundary(i)->set_T(*v); break; - case 4: - _boundary(i)->set_Y(v); break; - default: - throw CanteraError("bdry_set","unknown option"); - } - return 0; - } - - //========================================================= - - - int DLL_EXPORT onedim_new(int nd, int* domains, int* types) { - int i; - vector doms; - for (i = 0; i < nd; i++) { - switch (types[i]) { - case 0: - doms.push_back(_flow(domains[i])); break; - //case 1: - //doms.push_back(_surface(domains[i])); break; - case 2: - doms.push_back(_bndry(domains[i])); break; - default: - throw CanteraError("onedim_new", "unknown domain type"); - } - } - try { - OneDim* x = new OneDim(doms); - return Cabinet::cabinet()->add(x); - } - catch (CanteraError) { return -1; } - } - - - int DLL_EXPORT onedim_del(int i) { - Cabinet::cabinet()->del(i); - return 0; - } - - int DLL_EXPORT onedim_addFlow(int i, int n) { - try { - _onedim(i)->addDomain(_flow(n)); - return 0; - } - catch (CanteraError) { return -1; } - // catch (...) { return ERR; } - } - -// int DLL_EXPORT onedim_addSurf(int i, int n) { -// try { -// _onedim(i)->addDomain(_surface(n)); -// return 0; -// } -// catch (CanteraError) { return -1; } -// } - - int DLL_EXPORT onedim_eval(int i, doublereal* x0, doublereal* r) { - try { - _onedim(i)->eval(-1, x0, r, 0.0); - return 0; - } - catch (CanteraError) { return -1; } - // catch (...) { return ERR; } - } - - int DLL_EXPORT onedim_solve(int i, doublereal* x0, doublereal* x1, - int loglevel) { - try { - int m = _onedim(i)->solve(x0, x1, loglevel); - return m; - } - catch (CanteraError) { return -1; } - //catch (...) { return ERR; } - } - - double DLL_EXPORT onedim_ssnorm(int i, doublereal* x0, doublereal* x1) { - return _onedim(i)->ssnorm(x0, x1); - } - - int DLL_EXPORT onedim_setsteadymode(int i) { - if (_onedim(i)->transient()) { - _onedim(i)->setSteadyMode(); - //_onedim(i)->jacobian().setAge(10000); - return 1; - } - return 0; - } - - int DLL_EXPORT onedim_settransientmode(int i, doublereal dt, doublereal* x) { - _onedim(i)->initTimeInteg(dt, x); - double rr = fabs(_onedim(i)->rdt()*dt - 1.0); - if ((rr > 1.e-5) || _onedim(i)->steady()) { - //_onedim(i)->jacobian().setAge(10000); - return 1; - } - return 0; - } - - int DLL_EXPORT onedim_setnewtonoptions(int i, int maxage) { - _onedim(i)->newton().setOptions(maxage); - return 0; - } - - int DLL_EXPORT onedim_resize(int i) { - _onedim(i)->resize(); - return 0; - } - - int DLL_EXPORT onedim_writeStats(int i) { - _onedim(i)->writeStats(); - return 0; - } - - double DLL_EXPORT onedim_timestep(int i, int nsteps, doublereal dt, - doublereal* x, doublereal* xnew, int loglevel) { - try { - return _onedim(i)->timeStep(nsteps, dt, x, xnew, loglevel); - } - catch (CanteraError) { return -1.0; } - } - - int DLL_EXPORT onedim_save(int i, char* fname, char* id, - char* desc, doublereal* soln) { - try { - _onedim(i)->save(string(fname), string(id), string(desc), soln); - return 0; - } - catch (CanteraError) { return -1; } - //catch (...) { return ERR; } - } - - -} diff --git a/Cantera/clib/src/ctstagn.h b/Cantera/clib/src/ctstagn.h deleted file mode 100755 index 4b4b721bf..000000000 --- a/Cantera/clib/src/ctstagn.h +++ /dev/null @@ -1,78 +0,0 @@ -/** - * @file ctstagn.h - */ -/* - * $Id$ - */ - -#ifndef CTC_STAGN_H -#define CTC_STAGN_H - -// Cantera includes -//#include "stagn.h" - -//#include "Cabinet.h" -//#include "Storage.h" -#include "clib_defs.h" - -//inline StFlow* _flow(int i) { -// return Cabinet::cabinet()->item(i); -//} - -extern "C" { - - int DLL_IMPORT flow_new(int type, int iph, int np); - int DLL_IMPORT flow_del(int i); - int DLL_IMPORT flow_copy(int i); - int DLL_IMPORT flow_assign(int i, int j); - int DLL_IMPORT flow_setupgrid(int i, int npts, double* grid); - int DLL_EXPORT flow_setthermo(int i, int k); - int DLL_IMPORT flow_setkinetics(int i, int k); - int DLL_IMPORT flow_settransport(int i, int k, int soret); - int DLL_IMPORT flow_solveenergyeqn(int i, int j); - int DLL_IMPORT flow_fixtemperature(int i, int j); - int DLL_IMPORT flow_setenergyfactor(int i, double e); - int DLL_IMPORT flow_fixspecies(int i, int j); - int DLL_IMPORT flow_solvespecies(int i, int j); - // int DLL_IMPORT flow_integratechem(int i, double* x, double dt); - int DLL_IMPORT flow_settemperature(int i, int j, double t); - int DLL_IMPORT flow_setpressure(int i, double p); - int DLL_IMPORT flow_setmassfraction(int i, int j, int k, double t); - int DLL_IMPORT flow_outputtec(int i, double* x, char* fname, - char* title, int zone); - int DLL_IMPORT flow_showsolution(int i, char* fname, double* x); - int DLL_IMPORT flow_settolerances(int i, int nr, - double* rtol, int na, double* atol); - int DLL_IMPORT flow_resize(int i, int points); - int DLL_IMPORT flow_setsteadymode(int i); - int DLL_IMPORT flow_settransientmode(int i, double dt, double* x); - - int DLL_IMPORT flow_restore(int i, int job, char* fname, char* id, - int& size_z, double* z, int& size_soln, double* soln); - int DLL_IMPORT flow_setfixedpoint(int i, int j0, double t0); - int DLL_IMPORT flow_setboundaries(int i, int nleft, int nright); - int DLL_IMPORT bdry_new(int type, int iph, int kin); - int DLL_IMPORT bdry_del(int i); - int DLL_IMPORT bdry_copy(int i); - int DLL_IMPORT bdry_assign(int i, int j); - int DLL_IMPORT bdry_set(int i, int n, double* v); - - int DLL_IMPORT onedim_new(int nd, int* domains, int* types); - int DLL_IMPORT onedim_del(int i); - int DLL_IMPORT onedim_addFlow(int i, int n); - //int DLL_IMPORT onedim_addSurf(int i, int n); - int DLL_EXPORT onedim_eval(int i, double* x0, double* r); - int DLL_IMPORT onedim_solve(int i, double* x0, double* x1, int loglevel); - double DLL_IMPORT onedim_ssnorm(int i, double* x0, double* x1); - int DLL_IMPORT onedim_setsteadymode(int i); - int DLL_IMPORT onedim_settransientmode(int i, double dt, double* x); - int DLL_IMPORT onedim_setnewtonoptions(int i, int maxage); - int DLL_IMPORT onedim_resize(int i); - int DLL_IMPORT onedim_writeStats(int i); - double DLL_IMPORT onedim_timestep(int i, int nsteps, double dt, - double* x, double* xnew, int loglevel); - int DLL_IMPORT onedim_save(int i, char* fname, char* id, char* desc, double* soln); - -} - -#endif diff --git a/Cantera/clib/src/genpy.py b/Cantera/clib/src/genpy.py deleted file mode 100644 index 2ddff6f1f..000000000 --- a/Cantera/clib/src/genpy.py +++ /dev/null @@ -1,198 +0,0 @@ -""" Python script to generate a Python extension module from a clib -header file. """ - -import sys - -_class = '' -_newclass = 1 - -def getargs(line): - """Get the function name and arguments.""" - i1 = line.find('(') - i2 = line.find(')') - if (i1 < 0 or i2 < 0): - raise 'syntax error: missing open or close quote' - nm = line[:i1].split() - nm = nm[-1] - argline = line[i1+1:i2] - args = argline.split(',') - for n in range(len(args)): args[n] = args[n].split() - v = [] - for a in args: - if len(a) == 2: v.append(a) - return nm, v - -_itype = {'int':'i', 'double':'d', 'char*':'s', 'double*':'O', 'int*':'O'} - - -def isoutput(name): - if len(name) >= 3 and name[-3:] == 'out': - return 1 - else: - return 0 - -def writepyfunc(rtype, name, args): - """Write the Python extension module function.""" - - print """ -static PyObject * -py_"""+name+"""(PyObject *self, PyObject *args) -{ - """+rtype+""" _val;""" - - global _class, _newclass - toks = name.split('_') - cls = toks[0] - if len(toks) == 2: - func = toks[1] - else: - func = toks[1] + toks[2] - - if cls != _class: - _class = cls - _newclass = 1 - else: - _newclass = 0 - - na = len(args) - ain = [] - output = [] - if na > 0: - vtype = [] - for a in args: - # if the argument is an array, then the previous argument - # must have been the array size. The Python argument list - # will not include the size - if a[0] == 'double*' or a[0] == 'int*': - if not isoutput(a[1]): - vtype[-1] = 'PyObject*' - ain[-1] = a - else: - output.append(a) - elif a[0] == 'char*' and isoutput(a[1]): - output.append(a) - ain.pop() - else: - vtype.append(a[0]) - ain.append(a) - for n in range(len(ain)): - print ' ',vtype[n],ain[n][1]+';' - print ' if (!PyArg_ParseTuple(args,', - s = '"' - for a in ain: - s += _itype[a[0]] - s += ':'+name+'",' - for a in ain: - s += ' &'+a[1]+',' - s = s[:-1]+'))' - print s, - print """ - return NULL; - """ - v = [] - for a in output: - if a[0] == 'char*': - print ' int '+a[1]+'_sz = 80;' - print ' char* '+a[1]+' = new char['+a[1]+'_sz];' - print - - for a in args: - if a[0] == 'double*' or a[0] == 'int*': - v[-1] = a[1]+'_len' - v.append(a[1]+'_data') - array = a[1]+'_array' - print - print ' PyArrayObject* '+array+' = (PyArrayObject*)'+a[1]+';' - print ' '+a[0]+' '+a[1]+'_data = ('+a[0]+')'+array+'->data;' - print ' int '+a[1]+'_len = '+array+'->dimensions[0];' - print - elif a[0] == 'char*' and isoutput(a[1]): - v[-1] = a[1]+'_sz' - v.append(a[1]) - else: - v.append(a[1]) - - s = ' _val = '+name+'(' - for a in v: - s += a+',' - if s[-1] == ',': s = s[:-1] - s += ');' - print s, - if (output): - print '\n PyObject* _ret = Py_BuildValue("'+_itype[output[0][0]]+'",'+output[0][1]+');' - print ' delete '+output[0][1]+';' - print ' if (int(_val) == -1) return reportCanteraError();' - print """ return _ret;\n -} -""" - else: - print """ - if (int(_val) == -1) return reportCanteraError(); - """+'return Py_BuildValue("'+_itype[rtype]+'",_val);'+""" -} -""" - return ain - - -def writepyclass(f, name, args): - global _newclass - if _newclass == 1: - f.write("class "+_class.capitalize()+":\n") - f.write(" def __init__(self):\n") - f.write(" pass\n"); - _newclass = 0 - - toks = name.split('_') - cls = toks[0] - if len(toks) == 2: - nm = toks[1] - else: - nm = toks[1] + toks[2] - - f.write(' def '+nm+'(self') - for a in args[1:]: - f.write(', '+a[1]) - f.write('):\n') - f.write(' return _cantera.'+name+'(self._index') - for a in args[1:]: - f.write(', '+a[1]) - f.write(')\n') - -fname = sys.argv[1] -base, ext = fname.split('.') -mfile = 'py'+base+'_methods.h' -pfile = base+'.py' - -_rtypes = ['int', 'double'] - -f = open(fname,'r') -fm = open(mfile,'w') -fp = open(pfile,'w') - -lines = f.readlines() -f.close() - -infunc = 0 -funcline = '' -for line in lines: - toks = line.split() - if len(toks) > 0: - if not infunc and toks[0] in _rtypes: - infunc = 1 - funcline = line - elif infunc: - funcline += line - last = toks[-1] - if last[-1] == ';': - infunc = 0 - name, args = getargs(funcline) - toks = funcline.split() - a = writepyfunc(toks[0], name, args) - writepyclass(fp, name, a) - fm.write(' {"'+name+'", py_'+name+', METH_VARARGS},\n') - funcline = '' - -fm.close() -fp.close() - - diff --git a/Cantera/fortran/SConscript b/Cantera/fortran/SConscript new file mode 100644 index 000000000..329d3df2f --- /dev/null +++ b/Cantera/fortran/SConscript @@ -0,0 +1,13 @@ +from buildutils import * + +Import('env', 'build') + +localenv = env.Clone() + +localenv.Library(target=pjoin('..','..','lib','fct'), + source=mglob(localenv, 'src', 'f90', 'cpp')) + +# Copy the mod files to the include directory +for mod in mglob(localenv, 'src', 'mod'): + env.Command('../../include/cantera/%s' % mod.name, mod, + Copy('$TARGET', '$SOURCE')) diff --git a/Cantera/fortran/src/fct.cpp b/Cantera/fortran/src/fct.cpp index d6d7145b1..e74946f63 100644 --- a/Cantera/fortran/src/fct.cpp +++ b/Cantera/fortran/src/fct.cpp @@ -23,8 +23,8 @@ #include "ThermoFactory.h" #include "ctml.h" #include "importKinetics.h" -#include "../../clib/src/Storage.h" -#include "../../clib/src/Cabinet.h" +#include "clib/Storage.h" +#include "clib/Cabinet.h" #include "InterfaceKinetics.h" #include "PureFluidPhase.h" diff --git a/Cantera/fortran/src/fctxml.cpp b/Cantera/fortran/src/fctxml.cpp index 17c96f165..b745f9190 100644 --- a/Cantera/fortran/src/fctxml.cpp +++ b/Cantera/fortran/src/fctxml.cpp @@ -20,7 +20,7 @@ using namespace ctml; using namespace std; -#include "../../clib/src/Cabinet.h" +#include "clib/Cabinet.h" // Assign storage for the templated classes static member template<> Cabinet * Cabinet::__storage = 0; diff --git a/Cantera/fortran/src/flib_defs.h b/Cantera/fortran/src/flib_defs.h index 3da47e4a9..43501532d 100644 --- a/Cantera/fortran/src/flib_defs.h +++ b/Cantera/fortran/src/flib_defs.h @@ -16,7 +16,7 @@ #define ERR -999 #define DERR -999.999 -#include "../../src/base/config.h" +#include "config.h" typedef integer status_t; diff --git a/SConstruct b/SConstruct index 9f1a04bd8..59f7f74f4 100644 --- a/SConstruct +++ b/SConstruct @@ -129,20 +129,16 @@ opts.Save('cantera.conf', env) # ******************************************** env['OS'] = platform.system() -#def ArithCheck(context): -# context.Message('Trying to generate arith.h\n') -# exitStatus = context.TryLink(file('ext/f2c_libs/arithchk.c').read(), '.c') -# print exitStatus -# exitStatus, output = context.TryRun(file('ext/f2c_libs/arithchk.c').read(), '.c') -# print exitStatus, output -# context.Result(output) -# return exitStatus +if env['F90'] == 'gfortran': + env['FORTRANMODDIRPREFIX'] = '-J' +elif env['F90'] == 'g95': + env['FORTRANMODDIRPREFIX'] = '-fmod=' + +env['FORTRANMODDIR'] = '${TARGET.dir}' conf = Configure(env) -#conf = Configure(env, custom_tests = {'ArithCheck':ArithCheck}) env['HAS_SSTREAM'] = conf.CheckCXXHeader('sstream', '<>') -#conf.ArithCheck() env = conf.Finish() @@ -223,9 +219,23 @@ if env['use_sundials'] == 'y' and env['sundials_include']: # ********************* # *** Build Cantera *** # ********************* + +# Put headers in place +for header in mglob(env, 'Cantera/cxx/include', 'h'): + env.Command('build/include/cantera/%s' % header.name, header, + Copy('$TARGET', '$SOURCE')) + +for header in mglob(env, 'Cantera/clib/src', 'h'): + env.Command('build/include/cantera/clib/%s' % header.name, header, + Copy('$TARGET', '$SOURCE')) + + build = 'build' env.SConsignFile() -env.Append(CPPPATH=[Dir(os.getcwd()), Dir('build/include/cantera/kernel/')]) +env.Append(CPPPATH=[Dir(os.getcwd()), + Dir('build/include/cantera/kernel'), + Dir('build/include/cantera')]) + Export('env', 'build') VariantDir('build/ext', 'ext', duplicate=0) @@ -233,3 +243,9 @@ SConscript('build/ext/SConscript') VariantDir('build/kernel', 'Cantera/src', duplicate=0) SConscript('build/kernel/SConscript') + +VariantDir('build/interfaces/', 'Cantera', duplicate=0) +SConscript('build/interfaces/SConscript') + +VariantDir('build/interfaces/fortran/', 'Cantera/fortran', duplicate=1) +SConscript('build/interfaces/fortran/SConscript') diff --git a/buildutils.py b/buildutils.py index 63d66490d..9db4c86d7 100644 --- a/buildutils.py +++ b/buildutils.py @@ -63,6 +63,14 @@ class CopyNoPrefix(object): shutil.copyfile(str(source[0]), pjoin(*targetpath[depth:])) +class LibOpts(object): + def __init__(self, subdir, name, exts=('cpp',), **kwargs): + self.subdir = subdir + self.name = name + self.extensions = exts + self.linklibs = kwargs.get('libs', []) + + def quoted(s): return '"%s"' % s