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