Chaste Release::3.1
|
00001 00002 /* 00003 00004 Copyright (c) 2005-2012, University of Oxford. 00005 All rights reserved. 00006 00007 University of Oxford means the Chancellor, Masters and Scholars of the 00008 University of Oxford, having an administrative office at Wellington 00009 Square, Oxford OX1 2JD, UK. 00010 00011 This file is part of Chaste. 00012 00013 Redistribution and use in source and binary forms, with or without 00014 modification, are permitted provided that the following conditions are met: 00015 * Redistributions of source code must retain the above copyright notice, 00016 this list of conditions and the following disclaimer. 00017 * Redistributions in binary form must reproduce the above copyright notice, 00018 this list of conditions and the following disclaimer in the documentation 00019 and/or other materials provided with the distribution. 00020 * Neither the name of the University of Oxford nor the names of its 00021 contributors may be used to endorse or promote products derived from this 00022 software without specific prior written permission. 00023 00024 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00027 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 00028 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00029 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 00030 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 00031 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 00032 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00033 OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 00035 */ 00036 00037 #include "BidomainAssembler.hpp" 00038 #include "PdeSimulationTime.hpp" 00039 #include "UblasIncludes.hpp" 00040 #include <boost/numeric/ublas/vector_proxy.hpp> 00041 00042 00043 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM> 00044 c_matrix<double,2*(ELEMENT_DIM+1),2*(ELEMENT_DIM+1)> 00045 BidomainAssembler<ELEMENT_DIM,SPACE_DIM>::ComputeMatrixTerm( 00046 c_vector<double, ELEMENT_DIM+1> &rPhi, 00047 c_matrix<double, SPACE_DIM, ELEMENT_DIM+1> &rGradPhi, 00048 ChastePoint<SPACE_DIM> &rX, 00049 c_vector<double,2> &rU, 00050 c_matrix<double, 2, SPACE_DIM> &rGradU /* not used */, 00051 Element<ELEMENT_DIM,SPACE_DIM>* pElement) 00052 { 00053 // get bidomain parameters 00054 double Am = mpConfig->GetSurfaceAreaToVolumeRatio(); 00055 double Cm = mpConfig->GetCapacitance(); 00056 00057 const c_matrix<double, SPACE_DIM, SPACE_DIM>& sigma_i = this->mpCardiacTissue->rGetIntracellularConductivityTensor(pElement->GetIndex()); 00058 const c_matrix<double, SPACE_DIM, SPACE_DIM>& sigma_e = this->mpCardiacTissue->rGetExtracellularConductivityTensor(pElement->GetIndex()); 00059 00060 00061 c_matrix<double, SPACE_DIM, ELEMENT_DIM+1> temp = prod(sigma_i, rGradPhi); 00062 c_matrix<double, ELEMENT_DIM+1, ELEMENT_DIM+1> grad_phi_sigma_i_grad_phi = 00063 prod(trans(rGradPhi), temp); 00064 00065 c_matrix<double, ELEMENT_DIM+1, ELEMENT_DIM+1> basis_outer_prod = 00066 outer_prod(rPhi, rPhi); 00067 00068 c_matrix<double, SPACE_DIM, ELEMENT_DIM+1> temp2 = prod(sigma_e, rGradPhi); 00069 c_matrix<double, ELEMENT_DIM+1, ELEMENT_DIM+1> grad_phi_sigma_e_grad_phi = 00070 prod(trans(rGradPhi), temp2); 00071 00072 00073 c_matrix<double,2*(ELEMENT_DIM+1),2*(ELEMENT_DIM+1)> ret; 00074 00075 // even rows, even columns 00076 matrix_slice<c_matrix<double, 2*ELEMENT_DIM+2, 2*ELEMENT_DIM+2> > 00077 slice00(ret, slice (0, 2, ELEMENT_DIM+1), slice (0, 2, ELEMENT_DIM+1)); 00078 slice00 = (Am*Cm*PdeSimulationTime::GetPdeTimeStepInverse())*basis_outer_prod + grad_phi_sigma_i_grad_phi; 00079 00080 // odd rows, even columns 00081 matrix_slice<c_matrix<double, 2*ELEMENT_DIM+2, 2*ELEMENT_DIM+2> > 00082 slice10(ret, slice (1, 2, ELEMENT_DIM+1), slice (0, 2, ELEMENT_DIM+1)); 00083 slice10 = grad_phi_sigma_i_grad_phi; 00084 00085 // even rows, odd columns 00086 matrix_slice<c_matrix<double, 2*ELEMENT_DIM+2, 2*ELEMENT_DIM+2> > 00087 slice01(ret, slice (0, 2, ELEMENT_DIM+1), slice (1, 2, ELEMENT_DIM+1)); 00088 slice01 = grad_phi_sigma_i_grad_phi; 00089 00090 // odd rows, odd columns 00091 matrix_slice<c_matrix<double, 2*ELEMENT_DIM+2, 2*ELEMENT_DIM+2> > 00092 slice11(ret, slice (1, 2, ELEMENT_DIM+1), slice (1, 2, ELEMENT_DIM+1)); 00093 slice11 = grad_phi_sigma_i_grad_phi + grad_phi_sigma_e_grad_phi; 00094 00095 return ret; 00096 } 00097 00098 00099 00100 00101 template<unsigned ELEMENT_DIM, unsigned SPACE_DIM> 00102 BidomainAssembler<ELEMENT_DIM,SPACE_DIM>::BidomainAssembler( 00103 AbstractTetrahedralMesh<ELEMENT_DIM,SPACE_DIM>* pMesh, 00104 BidomainTissue<SPACE_DIM>* pTissue, 00105 unsigned numQuadPoints) 00106 : AbstractCardiacFeVolumeIntegralAssembler<ELEMENT_DIM,SPACE_DIM,2,false,true,CARDIAC>(pMesh,pTissue,numQuadPoints) 00107 { 00108 assert(pTissue != NULL); 00109 mpConfig = HeartConfig::Instance(); 00110 } 00111 00112 00113 00115 // explicit instantiation 00117 00118 template class BidomainAssembler<1,1>; 00119 template class BidomainAssembler<2,2>; 00120 template class BidomainAssembler<3,3>;