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
00030
00031
00032
00033
00034
00035
00036 #include "MonodomainProblem.hpp"
00037
00038 #include "Exception.hpp"
00039 #include "ReplicatableVector.hpp"
00040 #include "MonodomainSolver.hpp"
00041 #include "OperatorSplittingMonodomainSolver.hpp"
00042
00043
00044 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00045 AbstractCardiacTissue<ELEMENT_DIM,SPACE_DIM>* MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::CreateCardiacTissue()
00046 {
00047 mpMonodomainTissue = new MonodomainTissue<ELEMENT_DIM,SPACE_DIM>(this->mpCellFactory, HeartConfig::Instance()->GetUseStateVariableInterpolation());
00048 return mpMonodomainTissue;
00049 }
00050
00051 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00052 AbstractDynamicLinearPdeSolver<ELEMENT_DIM, SPACE_DIM, 1>* MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::CreateSolver()
00053 {
00054 assert(mpMonodomainTissue);
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065 if (HeartConfig::Instance()->GetUseReactionDiffusionOperatorSplitting())
00066 {
00067 return new OperatorSplittingMonodomainSolver<ELEMENT_DIM,SPACE_DIM>(this->mpMesh,
00068 mpMonodomainTissue,
00069 this->mpBoundaryConditionsContainer.get());
00070 }
00071 else
00072 {
00073 return new MonodomainSolver<ELEMENT_DIM,SPACE_DIM>(this->mpMesh,
00074 mpMonodomainTissue,
00075 this->mpBoundaryConditionsContainer.get());
00076 }
00077 }
00078
00079 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00080 MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::MonodomainProblem(AbstractCardiacCellFactory<ELEMENT_DIM,SPACE_DIM>* pCellFactory)
00081 : AbstractCardiacProblem<ELEMENT_DIM, SPACE_DIM, 1>(pCellFactory),
00082 mpMonodomainTissue(NULL)
00083 {
00084 }
00085
00086 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00087 MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::MonodomainProblem()
00088 : AbstractCardiacProblem<ELEMENT_DIM, SPACE_DIM, 1>(),
00089 mpMonodomainTissue(NULL)
00090 {
00091 }
00092
00093 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00094 MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::~MonodomainProblem()
00095 {
00096 }
00097
00098 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00099 MonodomainTissue<ELEMENT_DIM,SPACE_DIM> * MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::GetMonodomainTissue()
00100 {
00101 assert(mpMonodomainTissue != NULL);
00102 return mpMonodomainTissue;
00103 }
00104
00105 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00106 void MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::WriteInfo(double time)
00107 {
00108 if (PetscTools::AmMaster())
00109 {
00110 std::cout << "Solved to time " << time << "\n" << std::flush;
00111 }
00112
00113 double v_max, v_min;
00114
00115 VecMax( this->mSolution, PETSC_NULL, &v_max );
00116 VecMin( this->mSolution, PETSC_NULL, &v_min );
00117
00118 if (PetscTools::AmMaster())
00119 {
00120 std::cout << " V = " << "[" <<v_min << ", " << v_max << "]" << "\n" << std::flush;
00121 }
00122 }
00123
00124 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00125 void MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::DefineWriterColumns(bool extending)
00126 {
00127 AbstractCardiacProblem<ELEMENT_DIM,SPACE_DIM,1>::DefineWriterColumns(extending);
00128 AbstractCardiacProblem<ELEMENT_DIM,SPACE_DIM,1>::DefineExtraVariablesWriterColumns(extending);
00129 }
00130
00131 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00132 void MonodomainProblem<ELEMENT_DIM, SPACE_DIM>::WriteOneStep(double time, Vec voltageVec)
00133 {
00134 this->mpWriter->PutUnlimitedVariable(time);
00135 this->mpWriter->PutVector(this->mVoltageColumnId, voltageVec);
00136 AbstractCardiacProblem<ELEMENT_DIM,SPACE_DIM,1>::WriteExtraVariablesOneStep();
00137 }
00138
00139
00141
00143
00144 template class MonodomainProblem<1,1>;
00145 template class MonodomainProblem<1,2>;
00146 template class MonodomainProblem<1,3>;
00147 template class MonodomainProblem<2,2>;
00148 template class MonodomainProblem<3,3>;
00149
00150
00151
00152
00153 #include "SerializationExportWrapperForCpp.hpp"
00154 EXPORT_TEMPLATE_CLASS2(MonodomainProblem, 1, 1)
00155 EXPORT_TEMPLATE_CLASS2(MonodomainProblem, 1, 2)
00156 EXPORT_TEMPLATE_CLASS2(MonodomainProblem, 1, 3)
00157 EXPORT_TEMPLATE_CLASS2(MonodomainProblem, 2, 2)
00158 EXPORT_TEMPLATE_CLASS2(MonodomainProblem, 3, 3)