copasi API
0.1
|
00001 /* Begin CVS Header 00002 $Source: /fs/turing/cvs/copasi_dev/copasi/odepack++/common.h,v $ 00003 $Revision: 1.6 $ 00004 $Name: Build-33 $ 00005 $Author: shoops $ 00006 $Date: 2009/05/22 19:57:18 $ 00007 End CVS Header */ 00008 00009 // Copyright (C) 2008 by Pedro Mendes, Virginia Tech Intellectual 00010 // Properties, Inc., EML Research, gGmbH, University of Heidelberg, 00011 // and The University of Manchester. 00012 // All rights reserved. 00013 00014 // Copyright (C) 2001 - 2007 by Pedro Mendes, Virginia Tech Intellectual 00015 // Properties, Inc. and EML Research, gGmbH. 00016 // All rights reserved. 00017 // 00018 // This C++ code is based on an f2c conversion of the Fortran 00019 // library ODEPACK available at: http://www.netlib.org/odepack/ 00020 00021 #ifndef ODEPACK_common 00022 #define ODEPACK_common 00023 00024 typedef void (*evalF)(const C_INT*, const double*, const double*, double*); 00025 typedef void (*evalJ)(C_INT*, double*, double*, C_INT*, 00026 C_INT*, double*, C_INT*); 00027 typedef void (*evalG)(const C_INT*, const double*, const double*, 00028 const C_INT*, double *); 00029 00030 union dls001 00031 { 00032 struct 00033 { 00034 double rowns[209], ccmax, el0, h__, hmin, hmxi, hu, rc, tn, 00035 uround; 00036 C_INT iownd[6], iowns[6], icf, ierpj, iersl, jcur, jstart, kflag, l, 00037 lyh, lewt, lacor, lsavf, lwm, liwm, meth, miter, maxord, 00038 maxcor, msbp, mxncf, n, nq, nst, nfe, nje, nqu; 00039 } 00040 _1; 00041 struct 00042 { 00043 double rls[218]; 00044 C_INT ils[37]; 00045 } 00046 _2; 00047 struct 00048 { 00049 double conit, crate, el[13], elco[156] /* was [13][12] */, 00050 hold, rmax, tesco[36] /* was [3][12] */, ccmax, el0, h__, 00051 hmin, hmxi, hu, rc, tn, uround; 00052 C_INT iownd[6], ialth, ipup, lmax, meo, nqnyh, nslp, icf, ierpj, 00053 iersl, jcur, jstart, kflag, l, lyh, lewt, lacor, lsavf, lwm, 00054 liwm, meth, miter, maxord, maxcor, msbp, mxncf, n, nq, nst, 00055 nfe, nje, nqu; 00056 } 00057 _3; 00058 struct 00059 { 00060 double rowns[209], ccmax, el0, h__, hmin, hmxi, hu, rc, tn, uround; 00061 C_INT init, mxstep, mxhnil, nhnil, nslast, nyh, iowns[6], icf, ierpj, 00062 iersl, jcur, jstart, kflag, l, lyh, lewt, lacor, lsavf, lwm, liwm, 00063 meth, miter, maxord, maxcor, msbp, mxncf, n, nq, nst, nfe, nje, 00064 nqu; 00065 } 00066 lsoda; 00067 }; 00068 00069 union dlsa01 00070 { 00071 struct 00072 { 00073 double rownd2, cm1[12], cm2[5], pdest, pdlast, ratio, pdnorm; 00074 C_INT iownd2[3], icount, irflag, jtyp, mused, mxordn, mxords; 00075 } 00076 _1; 00077 struct 00078 { 00079 double rownd2, rowns2[20], pdnorm; 00080 C_INT iownd2[3], iowns2[2], jtyp, mused, mxordn, mxords; 00081 } 00082 _2; 00083 struct 00084 { 00085 double rlsa[22]; 00086 C_INT ilsa[9]; 00087 } 00088 _3; 00089 struct 00090 { 00091 double tsw, rowns2[20], pdnorm; 00092 C_INT insufr, insufi, ixpr, iowns2[2], jtyp, mused, mxordn, mxords; 00093 } 00094 lsoda; 00095 }; 00096 00097 union dlsr01 00098 { 00099 struct 00100 { 00101 double rownr3[2], t0, tlast, toutc; 00102 C_INT iownd3[3], iownr3[2], irfnd, itaskc, ngc, nge; 00103 } 00104 _1; 00105 struct 00106 { 00107 double alpha, x2, rdum3[3]; 00108 C_INT iownd3[3], imax, last, idum3[4]; 00109 } 00110 _2; 00111 struct 00112 { 00113 double rlsr[5]; 00114 C_INT ilsr[9]; 00115 } 00116 _3; 00117 struct 00118 { 00119 double rownr3[2], t0, tlast, toutc; 00120 C_INT lg0, lg1, lgx, iownr3[2], irfnd, itaskc, ngc, nge; 00121 } 00122 lsodar; 00123 }; 00124 00125 class PJAC 00126 { 00127 public: 00128 PJAC(C_INT(*pMethod)(C_INT *neq, double *y, double *yh, 00129 C_INT *nyh, double *ewt, double *ftem, 00130 double *savf, double *wm, C_INT *iwm, 00131 evalF f, evalJ jac)); 00132 00133 virtual ~PJAC(); 00134 00135 virtual C_INT operator()(C_INT *neq, double *y, double *yh, 00136 C_INT *nyh, double *ewt, double *ftem, 00137 double *savf, double *wm, C_INT *iwm, 00138 evalF f, evalJ jac); 00139 00140 protected: 00141 PJAC(); 00142 00143 private: 00144 C_INT(*mpMethod)(C_INT *neq, double *y, double *yh, 00145 C_INT *nyh, double *ewt, double *ftem, 00146 double *savf, double *wm, C_INT *iwm, 00147 evalF f, evalJ jac); 00148 }; 00149 00150 template <typename CType> class PJACFunctor : public PJAC 00151 { 00152 public: 00153 PJACFunctor(CType * pType, 00154 C_INT(CType::*pMethod)(C_INT *neq, double *y, double *yh, 00155 C_INT *nyh, double *ewt, double *ftem, 00156 double *savf, double *wm, C_INT *iwm, 00157 evalF f, evalJ jac)): 00158 PJAC(), 00159 mpType(pType), 00160 mpMethod(pMethod) 00161 {} 00162 00163 virtual ~PJACFunctor() {} 00164 00165 virtual C_INT operator()(C_INT *neq, double *y, double *yh, 00166 C_INT *nyh, double *ewt, double *ftem, 00167 double *savf, double *wm, C_INT *iwm, 00168 evalF f, evalJ jac) 00169 { 00170 return (*mpType.*mpMethod)(neq, y, yh, nyh, ewt, ftem, savf, wm, 00171 iwm, f, jac); 00172 } 00173 00174 protected: 00175 PJACFunctor() : PJAC(), mpType(NULL), mpMethod(NULL) {} 00176 00177 private: 00178 CType * mpType; 00179 C_INT(CType::*mpMethod)(C_INT *neq, double *y, double *yh, 00180 C_INT *nyh, double *ewt, double *ftem, 00181 double *savf, double *wm, C_INT *iwm, 00182 evalF f, evalJ jac); 00183 }; 00184 00185 class SLVS 00186 { 00187 public: 00188 SLVS(C_INT(*pMethod)(double *wm, C_INT *iwm, double *x, double *tem)); 00189 00190 virtual ~SLVS(); 00191 00192 virtual C_INT operator()(double *wm, C_INT *iwm, double *x, double *tem); 00193 00194 protected: 00195 SLVS(); 00196 00197 private: 00198 C_INT(*mpMethod)(double *wm, C_INT *iwm, double *x, double *tem); 00199 }; 00200 00201 template <typename CType> class SLVSFunctor : public SLVS 00202 { 00203 public: 00204 SLVSFunctor(CType * pType, 00205 C_INT(CType::*pMethod)(double *wm, C_INT *iwm, double *x, 00206 double *tem)): 00207 SLVS(), 00208 mpType(pType), 00209 mpMethod(pMethod) 00210 {} 00211 00212 virtual ~SLVSFunctor() {} 00213 00214 virtual C_INT operator()(double *wm, C_INT *iwm, double *x, 00215 double *tem) 00216 {return (*mpType.*mpMethod)(wm, iwm, x, tem);} 00217 00218 protected: 00219 SLVSFunctor() : SLVS(), mpType(NULL), mpMethod(NULL) {} 00220 00221 private: 00222 CType * mpType; 00223 C_INT(CType::*mpMethod)(double *wm, C_INT *iwm, double *x, 00224 double *tem); 00225 }; 00226 00227 #endif // ODEPACK_common