Chaste Release::3.1
|
00001 /* 00002 00003 Copyright (c) 2005-2012, University of Oxford. 00004 All rights reserved. 00005 00006 University of Oxford means the Chancellor, Masters and Scholars of the 00007 University of Oxford, having an administrative office at Wellington 00008 Square, Oxford OX1 2JD, UK. 00009 00010 This file is part of Chaste. 00011 00012 Redistribution and use in source and binary forms, with or without 00013 modification, are permitted provided that the following conditions are met: 00014 * Redistributions of source code must retain the above copyright notice, 00015 this list of conditions and the following disclaimer. 00016 * Redistributions in binary form must reproduce the above copyright notice, 00017 this list of conditions and the following disclaimer in the documentation 00018 and/or other materials provided with the distribution. 00019 * Neither the name of the University of Oxford nor the names of its 00020 contributors may be used to endorse or promote products derived from this 00021 software without specific prior written permission. 00022 00023 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00024 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00025 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00026 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 00027 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00028 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00029 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00030 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00031 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00032 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00033 00034 */ 00035 00036 #include "TysonNovakCellCycleModel.hpp" 00037 00038 TysonNovakCellCycleModel::TysonNovakCellCycleModel(boost::shared_ptr<AbstractCellCycleModelOdeSolver> pOdeSolver) 00039 : AbstractOdeBasedCellCycleModel(SimulationTime::Instance()->GetTime(), pOdeSolver) 00040 { 00041 if (!mpOdeSolver) 00042 { 00043 #ifdef CHASTE_CVODE 00044 mpOdeSolver = CellCycleModelOdeSolver<TysonNovakCellCycleModel, CvodeAdaptor>::Instance(); 00045 mpOdeSolver->Initialise(); 00046 // Chaste solvers always check for stopping events, CVODE needs to be instructed to do so 00047 mpOdeSolver->CheckForStoppingEvents(); 00048 mpOdeSolver->SetMaxSteps(10000); 00049 mpOdeSolver->SetTolerances(1e-6, 1e-8); 00050 #else 00051 mpOdeSolver = CellCycleModelOdeSolver<TysonNovakCellCycleModel, BackwardEulerIvpOdeSolver>::Instance(); 00052 mpOdeSolver->SetSizeOfOdeSystem(6); 00053 mpOdeSolver->Initialise(); 00054 SetDt(0.1/60.0); 00055 #endif //CHASTE_CVODE 00056 } 00057 } 00058 00059 void TysonNovakCellCycleModel::Initialise() 00060 { 00061 assert(mpOdeSystem == NULL); 00062 mpOdeSystem = new TysonNovak2001OdeSystem; 00063 mpOdeSystem->SetStateVariables(mpOdeSystem->GetInitialConditions()); 00064 00065 AbstractCellCycleModel::Initialise(); 00066 } 00067 00068 void TysonNovakCellCycleModel::ResetForDivision() 00069 { 00070 AbstractOdeBasedCellCycleModel::ResetForDivision(); 00071 00072 assert(mpOdeSystem != NULL); 00073 00086 #ifdef CHASTE_CVODE 00087 mpOdeSystem->rGetStateVariables()[5] = 0.5*mpOdeSystem->rGetStateVariables()[5]; 00088 #else 00089 mpOdeSystem->SetStateVariables(mpOdeSystem->GetInitialConditions()); 00090 #endif //CHASTE_CVODE 00091 } 00092 00093 void TysonNovakCellCycleModel::InitialiseDaughterCell() 00094 { 00095 if (mpCell->GetCellProliferativeType() == STEM) 00096 { 00097 mpCell->SetCellProliferativeType(TRANSIT); 00098 } 00099 } 00100 00101 AbstractCellCycleModel* TysonNovakCellCycleModel::CreateCellCycleModel() 00102 { 00103 // Create a new cell-cycle model 00104 TysonNovakCellCycleModel* p_model = new TysonNovakCellCycleModel(mpOdeSolver); 00105 00106 /* 00107 * Set each member variable of the new cell-cycle model that inherits 00108 * its value from the parent. 00109 * 00110 * Note 1: some of the new cell-cycle model's member variables (namely 00111 * mBirthTime, mCurrentCellCyclePhase, mReadyToDivide, mDt, mpOdeSolver) 00112 * will already have been correctly initialized in its constructor. 00113 * 00114 * Note 2: one or more of the new cell-cycle model's member variables 00115 * may be set/overwritten as soon as InitialiseDaughterCell() is called on 00116 * the new cell-cycle model. 00117 * 00118 * Note 3: the member variable mDimension remains unset, since this cell-cycle 00119 * model does not need to know the spatial dimension, so if we were to call 00120 * SetDimension() on the new cell-cycle model an exception would be triggered; 00121 * hence we do not set this member variable. 00122 */ 00123 p_model->SetBirthTime(mBirthTime); 00124 p_model->SetMinimumGapDuration(mMinimumGapDuration); 00125 p_model->SetStemCellG1Duration(mStemCellG1Duration); 00126 p_model->SetTransitCellG1Duration(mTransitCellG1Duration); 00127 p_model->SetSDuration(mSDuration); 00128 p_model->SetG2Duration(mG2Duration); 00129 p_model->SetMDuration(mMDuration); 00130 p_model->SetDivideTime(mDivideTime); 00131 p_model->SetFinishedRunningOdes(mFinishedRunningOdes); 00132 p_model->SetG2PhaseStartTime(mG2PhaseStartTime); 00133 p_model->SetLastTime(mLastTime); 00134 00135 /* 00136 * Create the new cell-cycle model's ODE system and use the current values 00137 * of the state variables in mpOdeSystem as an initial condition. 00138 */ 00139 assert(mpOdeSystem); 00140 p_model->SetOdeSystem(new TysonNovak2001OdeSystem); 00141 p_model->SetStateVariables(mpOdeSystem->rGetStateVariables()); 00142 00143 return p_model; 00144 } 00145 00146 double TysonNovakCellCycleModel::GetSDuration() 00147 { 00153 return 0.0; 00154 } 00155 00156 double TysonNovakCellCycleModel::GetG2Duration() 00157 { 00163 return 0.0; 00164 } 00165 00166 double TysonNovakCellCycleModel::GetMDuration() 00167 { 00173 return 0.0; 00174 } 00175 00176 double TysonNovakCellCycleModel::GetAverageTransitCellCycleTime() 00177 { 00178 return 1.25; 00179 } 00180 00181 double TysonNovakCellCycleModel::GetAverageStemCellCycleTime() 00182 { 00183 return 1.25; 00184 } 00185 00186 bool TysonNovakCellCycleModel::CanCellTerminallyDifferentiate() 00187 { 00188 return false; 00189 } 00190 00191 void TysonNovakCellCycleModel::OutputCellCycleModelParameters(out_stream& rParamsFile) 00192 { 00193 // No new parameters to output, so just call method on direct parent class 00194 AbstractOdeBasedCellCycleModel::OutputCellCycleModelParameters(rParamsFile); 00195 } 00196 00197 // Serialization for Boost >= 1.36 00198 #include "SerializationExportWrapperForCpp.hpp" 00199 CHASTE_CLASS_EXPORT(TysonNovakCellCycleModel) 00200 #include "CellCycleModelOdeSolverExportWrapper.hpp" 00201 EXPORT_CELL_CYCLE_MODEL_ODE_SOLVER(TysonNovakCellCycleModel)