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 mElementsCanDoSvi.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 element_index = r_element.GetIndex();
00055
00056 if ( HeartRegionCode::IsRegionBath(r_element.GetUnsignedAttribute()) )
00057 {
00058 mElementsCanDoSvi[element_index] = false;
00059 continue;
00060 }
00061
00062 unsigned node_zero = r_element.GetNodeGlobalIndex(0);
00063 AbstractCardiacCellInterface* p_cell_zero = this->mpCardiacTissue->GetCardiacCellOrHaloCell(node_zero);
00064 const std::type_info& r_zero_info = typeid(*p_cell_zero);
00065
00066 for (unsigned local_index=1; local_index<r_element.GetNumNodes(); local_index++)
00067 {
00068 unsigned global_index = r_element.GetNodeGlobalIndex(local_index);
00069 AbstractCardiacCellInterface* p_cell = this->mpCardiacTissue->GetCardiacCellOrHaloCell(global_index);
00070 const std::type_info& r_info = typeid(*p_cell);
00071 if (r_zero_info != r_info)
00072 {
00073 mElementsCanDoSvi[element_index] = false;
00074 break;
00075 }
00076 }
00077 }
00078 }
00079
00080 }
00081
00082
00083 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00084 void AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::ResetInterpolatedQuantities()
00085 {
00086
00087 mIionicInterp = 0;
00088 for(unsigned i=0; i<mStateVariablesAtQuadPoint.size(); i++)
00089 {
00090 mStateVariablesAtQuadPoint[i] = 0;
00091 }
00092 }
00093
00094 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00095 void AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::IncrementInterpolatedQuantities(
00096 double phiI, const Node<SPACE_DIM>* pNode)
00097 {
00098
00099 unsigned node_global_index = pNode->GetIndex();
00100 mIionicInterp += phiI * this->mpCardiacTissue->rGetIionicCacheReplicated()[ node_global_index ];
00101
00102 std::vector<double> state_vars = this->mpCardiacTissue->GetCardiacCellOrHaloCell(node_global_index)->GetStdVecStateVariables();
00103 for (unsigned i=0; i<mStateVariablesAtQuadPoint.size(); i++)
00104 {
00105 mStateVariablesAtQuadPoint[i] += phiI * state_vars[i];
00106 }
00107 }
00108
00109
00110
00111 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM, unsigned PROBLEM_DIM>
00112 bool AbstractCorrectionTermAssembler<ELEMENT_DIM,SPACE_DIM,PROBLEM_DIM>::ElementAssemblyCriterion(Element<ELEMENT_DIM,SPACE_DIM>& rElement)
00113 {
00114
00115 if (!mElementsCanDoSvi[rElement.GetIndex()])
00116 {
00117 return false;
00118 }
00119 double DELTA_IIONIC = 1;
00120
00121
00122 assert(this->mpCardiacTissue->GetDoCacheReplication());
00123 ReplicatableVector& r_cache = this->mpCardiacTissue->rGetIionicCacheReplicated();
00124
00125 double diionic = fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(1)]);
00126
00127 if (ELEMENT_DIM > 1)
00128 {
00129 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(2)]) );
00130 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(1)] - r_cache[rElement.GetNodeGlobalIndex(2)]) );
00131 }
00132
00133 if (ELEMENT_DIM > 2)
00134 {
00135 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(0)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00136 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(1)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00137 diionic = std::max(diionic, fabs(r_cache[rElement.GetNodeGlobalIndex(2)] - r_cache[rElement.GetNodeGlobalIndex(3)]) );
00138 }
00139
00140 bool will_assemble = (diionic > DELTA_IIONIC);
00141
00142 if (will_assemble)
00143 {
00144 unsigned any_node = rElement.GetNodeGlobalIndex(0);
00145 mStateVariablesAtQuadPoint.resize(this->mpCardiacTissue->GetCardiacCellOrHaloCell(any_node)->GetNumberOfStateVariables() );
00146 }
00147
00148 return will_assemble;
00149 }
00150
00152
00154
00155 template class AbstractCorrectionTermAssembler<1,1,1>;
00156 template class AbstractCorrectionTermAssembler<1,2,1>;
00157 template class AbstractCorrectionTermAssembler<1,3,1>;
00158 template class AbstractCorrectionTermAssembler<2,2,1>;
00159 template class AbstractCorrectionTermAssembler<3,3,1>;
00160 template class AbstractCorrectionTermAssembler<1,1,2>;
00161 template class AbstractCorrectionTermAssembler<2,2,2>;
00162 template class AbstractCorrectionTermAssembler<3,3,2>;