Diana
0.8.3
|
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