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 #ifndef SIMPLEBATHPROBLEMSETUP_HPP_
00029 #define SIMPLEBATHPROBLEMSETUP_HPP_
00030
00037 #include "AbstractCardiacCellFactory.hpp"
00038 #include "SimpleStimulus.hpp"
00039 #include "LuoRudy1991.hpp"
00040 #include "HeartRegionCodes.hpp"
00041
00046 template<unsigned DIM, class CELLTYPE=CellLuoRudy1991FromCellML>
00047 class BathCellFactory : public AbstractCardiacCellFactory<DIM>
00048 {
00049 private:
00051 boost::shared_ptr<SimpleStimulus> mpStimulus;
00053 c_vector<double,DIM> mStimulatedPoint;
00054
00055 public:
00062 BathCellFactory(double stimulusMagnitude, c_vector<double,DIM> stimulatedPoint)
00063 : AbstractCardiacCellFactory<DIM>(),
00064 mpStimulus(new SimpleStimulus(stimulusMagnitude, 0.5)),
00065 mStimulatedPoint(stimulatedPoint)
00066 {
00067 }
00068
00073 AbstractCardiacCell* CreateCardiacCellForTissueNode(unsigned node)
00074 {
00075
00076 assert(HeartRegionCode::IsRegionTissue( this->GetMesh()->GetNode(node)->GetRegion() ));
00077
00078
00079 bool is_centre;
00080
00081 if (DIM==1)
00082 {
00083 is_centre = (fabs(this->GetMesh()->GetNode(node)->GetPoint()[0]-mStimulatedPoint(0)) < 1e-6);
00084 }
00085 else if (DIM==2)
00086 {
00087 is_centre = ( (fabs(this->GetMesh()->GetNode(node)->GetPoint()[0]-mStimulatedPoint(0)) < 1e-6)
00088 && (fabs(this->GetMesh()->GetNode(node)->GetPoint()[1]-mStimulatedPoint(1)) < 1e-6) );
00089 }
00090 else
00091 {
00092 is_centre = ( (fabs(this->GetMesh()->GetNode(node)->GetPoint()[0]-mStimulatedPoint(0)) < 1e-6)
00093 && (fabs(this->GetMesh()->GetNode(node)->GetPoint()[1]-mStimulatedPoint(1)) < 1e-6)
00094 && (fabs(this->GetMesh()->GetNode(node)->GetPoint()[2]-mStimulatedPoint(2)) < 1e-6) );
00095 }
00096
00097 if (is_centre)
00098 {
00099 return new CELLTYPE(this->mpSolver, mpStimulus);
00100 }
00101 else
00102 {
00103 return new CELLTYPE(this->mpSolver, this->mpZeroStimulus);
00104 }
00105 }
00106 };
00107
00116 template<class MeshType>
00117 void SetCircularTissueIn2dMesh(MeshType* pMesh,
00118 double centreX, double centreY, double radius)
00119 {
00120 for (typename MeshType::ElementIterator it = pMesh->GetElementIteratorBegin();
00121 it != pMesh->GetElementIteratorEnd();
00122 ++it)
00123 {
00124 double x = it->CalculateCentroid()[0];
00125 double y = it->CalculateCentroid()[1];
00126 if ( (x-centreX)*(x-centreX) + (y-centreY)*(y-centreY) > radius*radius )
00127 {
00128 it->SetRegion(HeartRegionCode::GetValidBathId());
00129 }
00130 }
00131 pMesh->SetMeshHasChangedSinceLoading();
00132 }
00133
00142 template<class MeshType>
00143 MeshType* Load2dMeshAndSetCircularTissue(const std::string& rMeshPath,
00144 double centreX, double centreY, double radius)
00145 {
00146 TrianglesMeshReader<2,2> reader(rMeshPath);
00147 MeshType* p_mesh = new MeshType;
00148 p_mesh->ConstructFromMeshReader(reader);
00149
00150 SetCircularTissueIn2dMesh(p_mesh, centreX, centreY, radius);
00151
00152 return p_mesh;
00153 }
00154
00163 template<>
00164 DistributedTetrahedralMesh<2,2>* Load2dMeshAndSetCircularTissue(const std::string& rMeshPath,
00165 double centreX, double centreY, double radius)
00166 {
00167 TrianglesMeshReader<2,2> reader(rMeshPath);
00168
00169 DistributedTetrahedralMesh<2,2>* p_mesh = new DistributedTetrahedralMesh<2,2>(DistributedTetrahedralMeshPartitionType::DUMB);
00170 p_mesh->ConstructFromMeshReader(reader);
00171
00172 SetCircularTissueIn2dMesh(p_mesh, centreX, centreY, radius);
00173
00174 return p_mesh;
00175 }
00176
00177 #endif