AveragedSourcePde.cpp
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 #include "AveragedSourcePde.hpp"
00030 #include "ApoptoticCellProperty.hpp"
00031 #include "PetscTools.hpp"
00032
00033 template<unsigned DIM>
00034 AveragedSourcePde<DIM>::AveragedSourcePde(AbstractCellPopulation<DIM>& rCellPopulation, double coefficient)
00035 : mrCellPopulation(rCellPopulation),
00036 mCoefficient(coefficient)
00037 {
00038 }
00039
00040 template<unsigned DIM>
00041 const AbstractCellPopulation<DIM>& AveragedSourcePde<DIM>::rGetCellPopulation() const
00042 {
00043 return mrCellPopulation;
00044 }
00045
00046 template<unsigned DIM>
00047 double AveragedSourcePde<DIM>::GetCoefficient() const
00048 {
00049 return mCoefficient;
00050 }
00051
00052 template<unsigned DIM>
00053 void AveragedSourcePde<DIM>::SetupSourceTerms(TetrahedralMesh<DIM,DIM>& rCoarseMesh, std::map< CellPtr, unsigned >* pCellPdeElementMap)
00054 {
00055
00056 mCellDensityOnCoarseElements.resize(rCoarseMesh.GetNumElements());
00057 for (unsigned elem_index=0; elem_index<mCellDensityOnCoarseElements.size(); elem_index++)
00058 {
00059 mCellDensityOnCoarseElements[elem_index] = 0.0;
00060 }
00061
00062
00063 for (typename AbstractCellPopulation<DIM>::Iterator cell_iter = mrCellPopulation.Begin();
00064 cell_iter != mrCellPopulation.End();
00065 ++cell_iter)
00066 {
00067 unsigned elem_index = 0;
00068 const ChastePoint<DIM>& r_position_of_cell = mrCellPopulation.GetLocationOfCellCentre(*cell_iter);
00069
00070 if (pCellPdeElementMap != NULL)
00071 {
00072 elem_index = (*pCellPdeElementMap)[*cell_iter];
00073 }
00074 else
00075 {
00076 elem_index = rCoarseMesh.GetContainingElementIndex(r_position_of_cell);
00077 }
00078
00079
00080 bool cell_is_apoptotic = cell_iter->template HasCellProperty<ApoptoticCellProperty>();
00081
00082 if (!cell_is_apoptotic)
00083 {
00084 mCellDensityOnCoarseElements[elem_index] += 1.0;
00085 }
00086 }
00087
00088
00089 c_matrix<double, DIM, DIM> jacobian;
00090 double det;
00091 for (unsigned elem_index=0; elem_index<mCellDensityOnCoarseElements.size(); elem_index++)
00092 {
00093 rCoarseMesh.GetElement(elem_index)->CalculateJacobian(jacobian, det);
00094 mCellDensityOnCoarseElements[elem_index] /= rCoarseMesh.GetElement(elem_index)->GetVolume(det);
00095 }
00096 }
00097
00098 template<unsigned DIM>
00099 double AveragedSourcePde<DIM>::ComputeConstantInUSourceTerm(const ChastePoint<DIM>& rX, Element<DIM,DIM>* pElement)
00100 {
00101 return 0.0;
00102 }
00103
00104 template<unsigned DIM>
00105 double AveragedSourcePde<DIM>::ComputeLinearInUCoeffInSourceTerm(const ChastePoint<DIM>& rX, Element<DIM,DIM>* pElement)
00106 {
00107 assert(!mCellDensityOnCoarseElements.empty());
00108 return mCoefficient * mCellDensityOnCoarseElements[pElement->GetIndex()];
00109 }
00110
00111 template<unsigned DIM>
00112 c_matrix<double,DIM,DIM> AveragedSourcePde<DIM>::ComputeDiffusionTerm(const ChastePoint<DIM>& rX)
00113 {
00114 return identity_matrix<double>(DIM);
00115 }
00116
00117 template<unsigned DIM>
00118 double AveragedSourcePde<DIM>::GetUptakeRateForElement(unsigned elementIndex)
00119 {
00120 return this->mCellDensityOnCoarseElements[elementIndex];
00121 }
00122
00124
00126
00127 template class AveragedSourcePde<1>;
00128 template class AveragedSourcePde<2>;
00129 template class AveragedSourcePde<3>;
00130
00131
00132 #include "SerializationExportWrapperForCpp.hpp"
00133 EXPORT_TEMPLATE_CLASS_SAME_DIMS(AveragedSourcePde)