00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "RungeKutta4IvpOdeSolver.hpp"
00030
00031 void RungeKutta4IvpOdeSolver::CalculateNextYValue(AbstractOdeSystem* pAbstractOdeSystem,
00032 double timeStep,
00033 double time,
00034 std::vector<double>& rCurrentYValues,
00035 std::vector<double>& rNextYValues)
00036 {
00037
00038
00039
00040
00041
00042
00043 const unsigned num_equations = pAbstractOdeSystem->GetNumberOfStateVariables();
00044
00045 if (num_equations != k1.size())
00046 {
00047 k1.resize(num_equations);
00048 k2.resize(num_equations);
00049 k3.resize(num_equations);
00050 k4.resize(num_equations);
00051 yki.resize(num_equations);
00052 }
00053
00054 std::vector<double>& dy = rNextYValues;
00055
00056 pAbstractOdeSystem->EvaluateYDerivatives(time, rCurrentYValues, dy);
00057 for (unsigned i=0; i<num_equations; i++)
00058 {
00059 k1[i] = timeStep*dy[i];
00060 yki[i] = rCurrentYValues[i] + 0.5*k1[i];
00061 }
00062
00063 pAbstractOdeSystem->EvaluateYDerivatives(time+0.5*timeStep, yki, dy);
00064 for (unsigned i=0; i<num_equations; i++)
00065 {
00066 k2[i] = timeStep*dy[i];
00067 yki[i] = rCurrentYValues[i] + 0.5*k2[i];
00068 }
00069
00070 pAbstractOdeSystem->EvaluateYDerivatives(time+0.5*timeStep, yki, dy);
00071 for (unsigned i=0; i<num_equations; i++)
00072 {
00073 k3[i] = timeStep*dy[i];
00074 yki[i] = rCurrentYValues[i] + k3[i];
00075 }
00076
00077 pAbstractOdeSystem->EvaluateYDerivatives(time+timeStep, yki, dy);
00078 for (unsigned i=0; i<num_equations; i++)
00079 {
00080 k4[i] = timeStep*dy[i];
00081 rNextYValues[i] = rCurrentYValues[i] + (k1[i]+2*k2[i]+2*k3[i]+k4[i])/6.0;
00082 }
00083 }
00084
00085
00086
00087 #include "SerializationExportWrapperForCpp.hpp"
00088 CHASTE_CLASS_EXPORT(RungeKutta4IvpOdeSolver)