copasi API  0.1
copasi/odepack++/common.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines