00001 #pragma once
00002
00003 #ifdef _WIN32
00004 #include <mkl.h>
00005 #else
00006 #include "lapack.h"
00007 using namespace std;
00008 #define __min min
00009 #define __max max
00010 #endif
00011
00012 #include "DifferentialEquationMover.h"
00013 #include <cmath>
00014 #include <stdlib.h>
00015 #include <iomanip>
00016
00017
00018 class CStiffBulirschStoerMover : public CDifferentialEquationMover
00019 {
00020 public:
00021 CStiffBulirschStoerMover(double frequency, double stepSize, double eps=1.0e-05);
00022 virtual ~CStiffBulirschStoerMover(void);
00023 void StiffBSStep(int nRHS, double *y, double *dydt);
00024 void SemiImplicitMidpoint(int nRHS, double *y, double *dydt, double **dfdy, int nStep, double *yout);
00025 void PolynomialExtrapolation(int nRHS, int iest, double xest, double *yest, double *yz, double *dy, double *x, double **d);
00026 void LUSolveLinearSystem(int nRHS, double **a, double *b);
00027 virtual void Move(double xInitial, double xFinal, ReactionNetwork *pReactionNetwork);
00028 protected:
00029 double *m_pdError;
00030 double *m_pdScale;
00031 double m_dEps;
00032 double m_dLastStep,m_dNextStep,m_dInitialStepSize;
00033 static const double m_scdTINY;
00034 static const int m_sciIMAXX;
00035 static const int m_sciKMAXX;
00036 static const double m_scdSAFE1;
00037 static const double m_scdSAFE2;
00038 static const double m_scdREDMAX;
00039 static const double m_scdREDMIN;
00040 static const double m_scdSCALMX;
00041 };