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 #include "AbstractCardiacCell.hpp"
00029
00030 #include <cassert>
00031 #include <iostream>
00032
00033 #include "HeartConfig.hpp"
00034 #include "Exception.hpp"
00035
00036 AbstractCardiacCell::AbstractCardiacCell(boost::shared_ptr<AbstractIvpOdeSolver> pOdeSolver,
00037 unsigned numberOfStateVariables,
00038 unsigned voltageIndex,
00039 boost::shared_ptr<AbstractStimulusFunction> pIntracellularStimulus)
00040 : AbstractCardiacCellInterface(pOdeSolver, voltageIndex, pIntracellularStimulus),
00041 AbstractOdeSystem(numberOfStateVariables),
00042 mDt(HeartConfig::Instance()->GetOdeTimeStep())
00043 {
00044
00045 assert(voltageIndex < mNumberOfStateVariables || mNumberOfStateVariables == 0);
00046 }
00047
00048 AbstractCardiacCell::~AbstractCardiacCell()
00049 {
00050 }
00051
00052 void AbstractCardiacCell::Init()
00053 {
00054 SetStateVariables(GetInitialConditions());
00055 mParameters.resize(rGetParameterNames().size());
00056 }
00057
00058 void AbstractCardiacCell::ResetToInitialConditions()
00059 {
00060 SetStateVariables(GetInitialConditions());
00061 }
00062
00063 OdeSolution AbstractCardiacCell::Compute(double tStart, double tEnd, double tSamp)
00064 {
00065 if (tSamp < mDt)
00066 {
00067 tSamp = mDt;
00068 }
00069 return mpOdeSolver->Solve(this, rGetStateVariables(), tStart, tEnd, mDt, tSamp);
00070 }
00071
00072
00073 void AbstractCardiacCell::ComputeExceptVoltage(double tStart, double tEnd)
00074 {
00075 double saved_voltage = GetVoltage();
00076
00077 mSetVoltageDerivativeToZero = true;
00078 mpOdeSolver->SolveAndUpdateStateVariable(this, tStart, tEnd, mDt);
00079 mSetVoltageDerivativeToZero = false;
00080
00081 SetVoltage(saved_voltage);
00082
00083 VerifyStateVariables();
00084 }
00085
00086 void AbstractCardiacCell::SetVoltage(double voltage)
00087 {
00088 rGetStateVariables()[mVoltageIndex] = voltage;
00089 }
00090
00091 double AbstractCardiacCell::GetVoltage()
00092 {
00093 return rGetStateVariables()[mVoltageIndex];
00094 }
00095
00096 double AbstractCardiacCell::GetIntracellularCalciumConcentration()
00097 {
00098 EXCEPTION("AbstractCardiacCell::GetIntracellularCalciumConcentration() called. Either model has no [Ca_i] or method has not been implemented yet");
00099 }
00100
00101
00102
00103 #include "LuoRudy1991.hpp"
00104 #include "LuoRudy1991BackwardEuler.hpp"
00105 void AbstractCardiacCell::CheckForArchiveFix()
00106 {
00107 if (dynamic_cast<CellLuoRudy1991FromCellML*>(this) || dynamic_cast<CellLuoRudy1991FromCellMLBackwardEuler*>(this))
00108 {
00109
00110
00111
00112 assert(GetNumberOfStateVariables() == 8);
00113 unsigned var_index_map[8] = {2, 3, 1, 7, 0, 4, 5, 6};
00114 std::vector<double> old_state(this->mStateVariables);
00115 for (unsigned i=0; i<8; i++)
00116 {
00117 this->mStateVariables[var_index_map[i]] = old_state[i];
00118 }
00119
00120 this->mParameters.resize(this->rGetParameterNames().size());
00121 assert(this->mParameters.size() == 1u);
00122 this->mParameters[0] = 23.0;
00123 }
00124 }
00125
00126
00127
00128
00129
00130 void AbstractCardiacCell::SetState(CellModelState state)
00131 {
00132 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00133 }
00134
00135 void AbstractCardiacCell::SetSlowValues(const std::vector<double> &rSlowValues)
00136 {
00137 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00138 }
00139
00140 void AbstractCardiacCell::GetSlowValues(std::vector<double>& rSlowValues)
00141 {
00142 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00143 }
00144
00145 bool AbstractCardiacCell::IsFastOnly()
00146 {
00147 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00148 }
00149
00150 unsigned AbstractCardiacCell::GetNumSlowValues()
00151 {
00152 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00153 }
00154
00155 void AbstractCardiacCell::AdjustOutOfRangeSlowValues(std::vector<double>& rSlowValues)
00156 {
00157 EXCEPTION("Non fast-slow cell model being used in a fast-slow problem.");
00158 }