[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    playground/edu/step/stepcore
From:       Vladimir Kuznetsov <ks.vladimir () gmail ! com>
Date:       2007-08-24 14:31:25
Message-ID: 1187965885.670001.13391.nullmailer () svn ! kde ! org
[Download RAW message or body]

SVN commit 704274 by ksvladimir:

Fixed crash when using GslSolver.


 M  +9 -5      gslsolver.cc  
 M  +1 -0      gslsolver.h  


--- trunk/playground/edu/step/stepcore/gslsolver.cc #704273:704274
@@ -72,6 +72,7 @@
 
 void GslGenericSolver::init()
 {
+    _yerr = new double[_dimension];
     _ytemp = new double[_dimension];
     _ydiff = new double[_dimension];
     _dydt_in  = new double[_dimension];
@@ -98,11 +99,14 @@
 
 void GslGenericSolver::fini()
 {
-    delete[] _ytemp; delete[] _ydiff;
-    delete[] _dydt_in; delete[] _dydt_out;
     if(_gslStep != NULL) gsl_odeiv_step_free(_gslStep);
     if(_gslControl != NULL) gsl_odeiv_control_free(_gslControl);
     if(_gslEvolve != NULL) gsl_odeiv_evolve_free(_gslEvolve);
+    delete[] _dydt_out;
+    delete[] _dydt_in;
+    delete[] _ydiff;
+    delete[] _ytemp;
+    delete[] _yerr;
 }
 
 int GslGenericSolver::gslFunction(double t, const double* y, double* f, void* params)
@@ -150,11 +154,11 @@
             gsl_odeiv_evolve_reset(_gslEvolve); // XXX
             gsl_result = gsl_odeiv_evolve_apply(_gslEvolve, _gslControl, _gslStep, &_gslSystem,
                                             &tt, t1, &_stepSize, _ytemp);
-            std::memcpy(yvar, _gslEvolve->yerr, _dimension*sizeof(*yvar));
+            std::memcpy(_yerr, _gslEvolve->yerr, _dimension*sizeof(*_yerr));
         } else {
             STEPCORE_ASSERT_NOABORT(t1-tt > _stepSize/100);
             gsl_result = gsl_odeiv_step_apply(_gslStep, tt, (_stepSize < t1-tt ? _stepSize : t1-tt),
-                                                _ytemp, yvar, _dydt_in, _dydt_out, &_gslSystem);
+                                                _ytemp, _yerr, _dydt_in, _dydt_out, &_gslSystem);
             tt = _stepSize < t1-tt ? tt + _stepSize : t1;
         }
         if(gsl_result != 0) return gsl_result;
@@ -163,7 +167,7 @@
         _localError = 0;
         _localErrorRatio = 0;
         for(int i=0; i<_dimension; ++i) {
-            double error = fabs(yvar[i]);
+            double error = fabs(_yerr[i]);
             if(error > _localError) _localError = error;
             double errorRatio = error / (_toleranceAbs + _toleranceRel * fabs(_ytemp[i]));
             if(errorRatio > _localErrorRatio) _localErrorRatio = errorRatio;
--- trunk/playground/edu/step/stepcore/gslsolver.h #704273:704274
@@ -78,6 +78,7 @@
 
     //gsl_odeiv_control*  _gslControl;
     //gsl_odeiv_evolve*   _gslEvolve;
+    double* _yerr;
     double* _ytemp;
     double* _ydiff;
     double* _dydt_in;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic