ExtendedBidomainNeumannSurfaceTermAssembler.hpp
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 #ifndef EXTENDEDBIDOMAINNEUMANNSURFACETERMASSEMBLER_HPP_
00030 #define EXTENDEDBIDOMAINNEUMANNSURFACETERMASSEMBLER_HPP_
00031
00032 #include "AbstractFeSurfaceIntegralAssembler.hpp"
00033
00034
00042 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00043 class ExtendedBidomainNeumannSurfaceTermAssembler : public AbstractFeSurfaceIntegralAssembler<ELEMENT_DIM,SPACE_DIM,3>
00044 {
00045 protected:
00063 virtual c_vector<double, 3*ELEMENT_DIM> ComputeVectorSurfaceTerm(
00064 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM> &rSurfaceElement,
00065 c_vector<double,ELEMENT_DIM> &rPhi,
00066 ChastePoint<SPACE_DIM> &rX);
00067
00068 public:
00076 ExtendedBidomainNeumannSurfaceTermAssembler(AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh,
00077 BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,3>* pBoundaryConditions,
00078 unsigned numQuadPoints = 2)
00079 : AbstractFeSurfaceIntegralAssembler<ELEMENT_DIM,SPACE_DIM,3>(pMesh, pBoundaryConditions, numQuadPoints)
00080 {
00081 }
00082 };
00083
00084
00085 #define COVERAGE_IGNORE //no non-zero Neumann BC allowed at the moment in extended bidomain problems
00086 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM>
00087 c_vector<double, 3*ELEMENT_DIM> ExtendedBidomainNeumannSurfaceTermAssembler<ELEMENT_DIM,SPACE_DIM>::ComputeVectorSurfaceTerm(
00088 const BoundaryElement<ELEMENT_DIM-1,SPACE_DIM> &rSurfaceElement,
00089 c_vector<double,ELEMENT_DIM> &rPhi,
00090 ChastePoint<SPACE_DIM> &rX)
00091 {
00092
00093 double sigma_i_times_grad_phi_i_first_cell_dot_n = this->mpBoundaryConditions->GetNeumannBCValue(&rSurfaceElement, rX, 0);
00094 double sigma_i_times_grad_phi_i_second_cell_dot_n = this->mpBoundaryConditions->GetNeumannBCValue(&rSurfaceElement, rX, 1);
00095 double sigma_e_times_grad_phi_e_dot_n = this->mpBoundaryConditions->GetNeumannBCValue(&rSurfaceElement, rX, 2);
00096
00097 c_vector<double, 3*ELEMENT_DIM> ret;
00098
00099 for (unsigned i=0; i<3*ELEMENT_DIM; i = i + 3)
00100 {
00101 ret(i) = rPhi(i)*sigma_i_times_grad_phi_i_first_cell_dot_n;
00102 ret(i+1) = rPhi(i)*sigma_i_times_grad_phi_i_second_cell_dot_n;
00103 ret(i+2) = rPhi(i)*(sigma_i_times_grad_phi_i_first_cell_dot_n + sigma_i_times_grad_phi_i_second_cell_dot_n + sigma_e_times_grad_phi_e_dot_n);
00104 }
00105 return ret;
00106 }
00107 #undef COVERAGE_IGNORE
00108
00109 #endif // EXTENDEDBIDOMAINNEUMANNSURFACETERMASSEMBLER_HPP_