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 "AbstractCorrectionTermAssembler.hpp"
00037 #include <typeinfo>
00038
00039 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00040 AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::AbstractCorrectionTermAssembler(
00041 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00042 AbstractCardiacTissue<ELEMENT_DIM,SPACE_DIM>* pTissue)
00043 : AbstractCardiacFeVolumeIntegralAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM,true,false,CARDIAC>(pMesh,pTissue)
00044 {
00045
00046 mElementsHasIdenticalCellModels.resize(pMesh->GetNumElements(), true);
00047 for (typename AbstractTetrahedralMesh<ELEMENT_DIM, SPACE_DIM>::ElementIterator iter = pMesh->GetElementIteratorBegin();
00048 iter != pMesh->GetElementIteratorEnd();
00049 ++iter)
00050 {
00051 Element<ELEMENT_DIM, SPACE_DIM>& r_element = *iter;
00052 if (r_element.GetOwnership())
00053 {
00054 unsigned node_zero = r_element.GetNodeGlobalIndex(0);
00055 AbstractCardiacCellInterface* p_cell_zero = this->mpCardiacTissue->GetCardiacCellOrHaloCell(node_zero);
00056 const std::type_info& r_zero_info = typeid(*p_cell_zero);
00057
00058 for (unsigned local_index=1; local_index<r_element.GetNumNodes(); local_index++)
00059 {
00060 unsigned global_index = r_element.GetNodeGlobalIndex(local_index);
00061 AbstractCardiacCellInterface* p_cell = this->mpCardiacTissue->GetCardiacCellOrHaloCell(global_index);
00062 const std::type_info& r_info = typeid(*p_cell);
00063 if (r_zero_info != r_info)
00064 {
00065 mElementsHasIdenticalCellModels[r_element.GetIndex()] = false;
00066 break;
00067 }
00068 }
00069 }
00070 }
00071
00072 }
00073
00074
00075 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00076 void AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::ResetInterpolatedQuantities()
00077 {
00078
00079 mIionicInterp = 0;
00080 for(unsigned i=0; i<mStateVariablesAtQuadPoint.size(); i++)
00081 {
00082 mStateVariablesAtQuadPoint[i] = 0;
00083 }
00084 }
00085
00086 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00087 void AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::IncrementInterpolatedQuantities(
00088 double phiI, const Node<SPACE_DIM>* pNode)
00089 {
00090
00091 unsigned node_global_index = pNode->GetIndex();
00092 mIionicInterp += phiI * this->mpCardiacTissue->rGetIionicCacheReplicated()[ node_global_index ];
00093
00094 std::vector<double> state_vars = this->mpCardiacTissue->GetCardiacCellOrHaloCell(node_global_index)->GetStdVecStateVariables();
00095 for (unsigned i=0; i<mStateVariablesAtQuadPoint.size(); i++)
00096 {
00097 mStateVariablesAtQuadPoint[i] += phiI * state_vars[i];
00098 }
00099 }
00100
00101
00102
00103 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00104 bool AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::ElementAssemblyCriterion(Element<ELEMENT_DIM,SPACE_DIM>& rElement)
00105 {
00106
00107 if (!mElementsHasIdenticalCellModels[rElement.GetIndex()])
00108 {
00109 return false;
00110 }
00111 double DELTA_IIONIC = 1;
00112
00113
00114 assert(this->mpCardiacTissue->GetDoCacheReplication());
00115 ReplicatableVector& r_cache = this->mpCardiacTissue->rGetIionicCacheReplicated();
00116
00117 double diionic = fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(1)]);
00118
00119 if (ELEMENT_DIM > 1)
00120 {
00121 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(2)]) );
00122 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(1)] - r_cache[rElement.GetNodeGlobalIndex(2)]) );
00123 }
00124
00125 if (ELEMENT_DIM > 2)
00126 {
00127 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00128 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(1)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00129 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(2)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00130 }
00131
00132 bool will_assemble = (diionic > DELTA_IIONIC);
00133
00134 if (will_assemble)
00135 {
00136 unsigned any_node = rElement.GetNodeGlobalIndex(0);
00137 mStateVariablesAtQuadPoint.resize(this->mpCardiacTissue->GetCardiacCellOrHaloCell(any_node)->GetNumberOfStateVariables() );
00138 }
00139
00140 return will_assemble;
00141 }
00142
00144
00146
00147 template class AbstractCorrectionTermAssembler<1,1,1>;
00148 template class AbstractCorrectionTermAssembler<1,2,1>;
00149 template class AbstractCorrectionTermAssembler<1,3,1>;
00150 template class AbstractCorrectionTermAssembler<2,2,1>;
00151 template class AbstractCorrectionTermAssembler<3,3,1>;
00152 template class AbstractCorrectionTermAssembler<1,1,2>;
00153 template class AbstractCorrectionTermAssembler<2,2,2>;
00154 template class AbstractCorrectionTermAssembler<3,3,2>;