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 "CellBasedPdeSolver.hpp"
00037 #include "TetrahedralMesh.hpp"
00038 #include "SimpleLinearEllipticSolver.hpp"
00039
00040 template<unsigned DIM>
00041 CellBasedPdeSolver<DIM>::CellBasedPdeSolver(TetrahedralMesh<DIM,DIM>* pMesh,
00042 AbstractLinearEllipticPde<DIM,DIM>* pPde,
00043 BoundaryConditionsContainer<DIM,DIM,1>* pBoundaryConditions)
00044 : SimpleLinearEllipticSolver<DIM, DIM>(pMesh, pPde, pBoundaryConditions)
00045 {
00046 }
00047
00048 template<unsigned DIM>
00049 CellBasedPdeSolver<DIM>::~CellBasedPdeSolver()
00050 {
00051 }
00052
00053 template<unsigned DIM>
00054 c_vector<double, 1*(DIM+1)> CellBasedPdeSolver<DIM>::ComputeVectorTerm(
00055 c_vector<double, DIM+1>& rPhi,
00056 c_matrix<double, DIM, DIM+1>& rGradPhi,
00057 ChastePoint<DIM>& rX,
00058 c_vector<double, 1>& rU,
00059 c_matrix<double, 1, DIM>& rGradU ,
00060 Element<DIM, DIM>* pElement)
00061 {
00062 return mConstantInUSourceTerm * rPhi;
00063 }
00064
00065 template<unsigned DIM>
00066 c_matrix<double, 1*(DIM+1), 1*(DIM+1)> CellBasedPdeSolver<DIM>::ComputeMatrixTerm(
00067 c_vector<double, DIM+1>& rPhi,
00068 c_matrix<double, DIM, DIM+1>& rGradPhi,
00069 ChastePoint<DIM>& rX,
00070 c_vector<double, 1>& rU,
00071 c_matrix<double, 1, DIM>& rGradU,
00072 Element<DIM, DIM>* pElement)
00073 {
00074 c_matrix<double, DIM, DIM> pde_diffusion_term = this->mpEllipticPde->ComputeDiffusionTerm(rX);
00075
00076
00077 if (mLinearInUCoeffInSourceTerm != 0)
00078 {
00079 return prod( trans(rGradPhi), c_matrix<double, DIM, DIM+1>(prod(pde_diffusion_term, rGradPhi)) )
00080 - mLinearInUCoeffInSourceTerm * outer_prod(rPhi,rPhi);
00081 }
00082 else
00083 {
00084 return prod( trans(rGradPhi), c_matrix<double, DIM, DIM+1>(prod(pde_diffusion_term, rGradPhi)) );
00085 }
00086 }
00087
00088 template<unsigned DIM>
00089 void CellBasedPdeSolver<DIM>::ResetInterpolatedQuantities()
00090 {
00091 mConstantInUSourceTerm = 0;
00092 mLinearInUCoeffInSourceTerm = 0;
00093 }
00094
00095 template<unsigned DIM>
00096 void CellBasedPdeSolver<DIM>::IncrementInterpolatedQuantities(double phiI, const Node<DIM>* pNode)
00097 {
00098 mConstantInUSourceTerm += phiI * this->mpEllipticPde->ComputeConstantInUSourceTermAtNode(*pNode);
00099 mLinearInUCoeffInSourceTerm += phiI * this->mpEllipticPde->ComputeLinearInUCoeffInSourceTermAtNode(*pNode);
00100 }
00101
00102 template<unsigned DIM>
00103 void CellBasedPdeSolver<DIM>::InitialiseForSolve(Vec initialSolution)
00104 {
00105
00106 SimpleLinearEllipticSolver<DIM,DIM>::InitialiseForSolve(initialSolution);
00107
00108 this->mpLinearSystem->SetMatrixIsSymmetric(true);
00109 }
00110
00112
00114
00115 template class CellBasedPdeSolver<1>;
00116 template class CellBasedPdeSolver<2>;
00117 template class CellBasedPdeSolver<3>;