Diana  0.8.3
DiffitModel.hpp
00001 #ifndef __MODELPUB_H__
00002 #define __MODELPUB_H__
00003 
00015 //#include "nr.hpp"
00016 //#include "def.hpp"
00017 
00018 #include <CapeOpen.hpp>
00019 #include <Basic/DianaBasic.hpp>
00020 #include <Diana/DianaDAESO.hpp>
00021 #include <Basic/DianaArray.hpp>
00022 #include <Diana.hpp>
00023 #include <Basic/CapeModel.hpp>
00024 //#include "DianaSensDAESO.hpp"
00025 #include <string>
00026 #include <math.h>
00027 #include <vector>
00028 
00029 
00030 
00031 using namespace Numeric::Solvers::Model;
00032 
00033 class Glob;
00034 
00035 using namespace std;
00036 
00042 class ExperimentSystem
00043 {
00044 public:
00045 
00046     ExperimentSystem(const long _nvar, const long _npar, const long _nobs);
00047     ExperimentSystem(const ExperimentSystem& ex);
00048     virtual ~ExperimentSystem();
00049 
00050     void updateResidualsFrom(const  ExperimentSystem& _sys);
00051     int * y0fix;
00052     int * doP;
00053 
00055   long nobs;
00060   long nvar;    
00065   long npar;    
00066 
00067   // the actual data
00069   long nMeasure;
00074   double *xMeasure;
00079   double **sigma;
00081   double fitstart, fitend; 
00083   long firstMeasure;
00085   long lastMeasure;
00086   // multiple shooting data
00091   long nPoints;
00096   double *mesh;   
00098   long me;
00100   long mg;
00101   
00102   // data obtained by integration
00104   double objF;
00105 
00106 
00112   double **h;
00113 
00119   double **residues;
00120 
00125   double *r2;
00126 
00131   double *r3;
00132 
00138   double ***dyds;
00139 
00145   double ***dydp;
00151   double ***dmds;
00157   double ***dmdp;
00163   double ***dR2ds;
00169   double **dR2dp;
00175   double ***dR3ds;
00181   double **dR3dp;
00186   double *ua,**Ea,**Pa;
00191   double *ue,**Ee,**Pe;
00196   double *ug,**Eg,**Pg;
00202     double *par;
00206   double **dS;
00210   double *dP;
00211 
00216   double *y0;
00217 
00222   double **yComp;
00223 
00228   double **yPred;
00229 
00234     double **yTry;//,**yTrySave; 
00235 
00241   double **yMeasure;
00242 
00243 
00245   char *fileName;
00248   string *splineFile;
00250   double **splineNodes;
00252   double **splineY;
00254   double **splineGam;
00256   unsigned long *nNodes;
00258   int splinesDefined;
00259     long NSPLINES;
00260 
00261 
00262 };
00263 
00264 
00265 
00270 typedef ExperimentSystem GlobExp;
00271 typedef std::vector<ExperimentSystem> ExperimentVector;
00272 
00273 
00274 #ifndef TRUE
00275 #define TRUE 1
00276 #define FALSE 0
00277 #endif
00278 
00279 class Glob{
00280 public:
00281   //flags
00282     long nvar;
00284   int noGnu;
00285   int noMeasurements;
00287   int wait;
00289   int usesig;
00291   int odessa;
00296   int stiff;
00298   int nowait;
00300   int reg;
00302   int simInit;
00304   int nodamp;
00305   //all the rest
00307   long npar;
00309   long maxit;
00311   long nIter;
00313   int nrExp;
00322   int *doP;
00327   double **covar;
00329   double chisq;
00331   double eps;
00333   long rkqs_ign;
00335   int maxstp;
00337   double minimp;
00342   double elastic;
00343   double epsilon;
00344   double lambda;
00346   double dt;
00348   double sig;
00350   double pert;
00358   int *y0fix;
00359   //damping section
00361   double wquer;
00362 
00363   //GNUplot
00365   FILE **gnuFp;
00367   long ngnu;
00369   long gnuindex;
00370 
00371     long maxPoints;
00372 
00373     long maxVar;
00374     Glob();
00375     virtual ~Glob();
00376 
00377 };
00378 
00379 
00380 
00381 namespace Diana {
00386   class DiffitESO : public DianaDAESO {
00387   protected:
00388       CapeBoolean           bInitialized;
00389       CapeBoolean           bSymbolicJacobian;
00390       virtual DianaDAESO*   createClone(const DianaDAESO& org);
00391   public:
00392 
00393       //DiffitESO();
00394 
00396     DiffitESO(const Common::Types::CapeString& _name,
00397               const Common::Types::CapeString& _description,
00398               Common::Types::CapeLong          _nVars,
00399               Common::Types::CapeLong          _nEqns,
00400               Common::Types::CapeLong          _nRealParams
00401               );
00403     DiffitESO(const DiffitESO& org);
00404 
00406     virtual ~DiffitESO();
00407 
00420     void Initialize()
00421             throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00422              Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00423              Common::Error::ECapeBadInvOrder);
00428       const Diana::DianaSparseArray& GetAllDiffJacobianValues()
00429           throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00430  
00431 
00432     
00433 protected:
00434 
00439     virtual void calculateResiduals();
00440 
00441   };
00442 
00443 }
00444 
00449 class SimpleModel{
00450 
00451 protected:
00452     virtual void ode (double t, double *y, double *f, double *p)=0;    
00453 
00454 public:
00455 
00456     virtual void ode_replace(double t, double *y, double *f, double *p)=0;
00457 };
00458 //using namespace Common::Parameter;
00459 
00460 
00461 
00462 
00467 class DiffitModel : public Diana::DiffitESO //,public SimpleModel
00468 {
00469 protected:
00470 const int NEQNS;       // number of ODEs    
00471 const int NPARAMS;     // number of parameters
00472 const char *DefModelDescription;
00473 const double *DefParameters;
00474 const double * DefYValues;
00475 string * ParameterNames;
00476 string * VariableNames;
00477 
00478 public:
00479     //DiffitModel();
00480 /* CTOR */
00481     DiffitModel(const char* description,
00482                 const int NEQNS,
00483                 //const int NOBS,
00484                 const int NPARAMS,
00485                 //const int NCONDS,
00486                 const double * DefParameters,
00487                 const double * MinParameters,
00488                 const double * MaxParameters,
00489                 const double * DefYValues,
00490                 const double * MinYValues,
00491                 const double * MaxYValues,
00492                 const char ** _ParameterNames,
00493                 const char ** _VariableNames
00494         );
00496     DiffitModel(const DiffitModel& org);
00497 
00498 
00499     virtual ~DiffitModel();
00503     virtual void Initialize()throw (Common::Error::ECapeBadInvOrder, Common::Error::ECapeLicenceError, Common::Error::ECapeOutOfResources, Common::Error::ECapeFailedInitialisation, Common::Error::ECapeUnknown);
00504     virtual void calculateResiduals();
00505 
00506 
00513     const Diana::DianaSparseArray& GetAllJacobianValues()
00514             throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00515 
00520     const Diana::DianaSparseArray& GetAllParJacobianValues(const Common::Types::CapeArrayLong * parIndices=NULL)
00521         throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00522 
00533 virtual int observation (Glob *globs,ExperimentSystem *ex,double t, double *y,double *gy, double *p, double **dgdy,double **dgdp)=0;
00534 
00535 
00537 //virtual void initInt(Glob *globs,ExperimentSystem *ex)=0;
00538 
00539 /*
00540 protected:
00541     long ode_fkmax,ode_fkount,ode_kmax,ode_kount,rkqs_ign;
00542     double ode_dxsav,*ode_fxp,*ode_xp,**ode_yp;
00543 */
00544 protected:
00545 
00546     Diana::DianaDAESO* createClone();
00547 
00557 virtual void jacobi (double t, double *y, double **jac, double *p)=0;
00575 virtual void inhomo (double t, double *y, double **inh, double *p)=0;
00586 virtual void inhomo1 (double t, double *y, double *inh1, double *p, int &jp)=0;
00587 
00588 
00589 
00590 /* constraints */
00591 
00593 //virtual void setNrConstraints(ExperimentSystem *data, int nP, double *parameters)=0;
00594 
00596     virtual void R2(Glob *globs,ExperimentSystem *ex,int computeDerivs)=0;
00597 
00599     virtual void R3(Glob *globs,ExperimentSystem *ex,int computeDerivs)=0;
00600 
00601     virtual void ode (double t, double *y, double *f, double *p)=0;        
00602 
00603 
00604     const DianaSparseArray& GuessJacobianStructure();
00605    
00606 };
00607 
00608 
00609 
00610 
00611 
00612 
00613 #endif
00614