#include <AbstractBidomainSolver.hpp>
Inherits AbstractDynamicLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, 2 >.
Inherited by BidomainSolver< ELEMENT_DIM, SPACE_DIM >, and BidomainSolver< 3, 3 >.
Abstract Bidomain class containing some common functionality Inherits from AbstractDynamicLinearPdeSolver so child classes must implement SetupLinearSystem()
Definition at line 42 of file AbstractBidomainSolver.hpp.
AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver | ( | bool | bathSimulation, | |
AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM > * | pMesh, | |||
BidomainTissue< SPACE_DIM > * | pTissue, | |||
BoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, 2 > * | pBoundaryConditions, | |||
unsigned | numQuadPoints = 2 | |||
) | [inline] |
Constructor
bathSimulation | whether the simulation has a perfusing bath | |
pMesh | pointer to the mesh | |
pTissue | pointer to the tissue | |
pBoundaryConditions | pointer to the boundary conditions container | |
numQuadPoints | number of Gaussian quadrature points in each dimension |
Definition at line 254 of file AbstractBidomainSolver.cpp.
References HeartConfig::Instance(), AbstractDynamicLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, 2 >::mMatrixIsConstant, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mNullSpaceCreated, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpConfig, and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed.
AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::~AbstractBidomainSolver | ( | ) | [inline, virtual] |
Destructor
Definition at line 279 of file AbstractBidomainSolver.cpp.
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::CheckCompatibilityCondition | ( | ) | [inline, protected, virtual] |
Checks whether the linear system will have a solution (if so, infinite solutions) instead of zero solutions. The condition is, if the linear system is Ax=b, that sum b_i over for all the PHI_E components (ie i=1,3,5,..) is zero.
This check is not made if running in parallel, or in debug mode.
The reason why the sum must be zero: the Fredholm alternative states that a singular system Ax=b has a solution if and only if v.b=0 for all v in ker(A) (ie all v such that Av=b). The nullspace ker(A) is one dimensional with basis vector v = (0,1,0,1....,0,1), so v.b = sum_{i=1,3,5..} b_i.
Definition at line 217 of file AbstractBidomainSolver.cpp.
References DistributedVector::Begin(), DistributedVector::End(), EXCEPTION, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GetBoundaryConditions(), AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpLinearSystem, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpMesh, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed, and LinearSystem::rGetRhsVector().
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem().
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseForBath | ( | bool | computeMatrix, | |
bool | computeVector | |||
) | [inline, protected] |
Apply any changes needed to the linear system for problems that include a bath. Checks the voltage-voltage block of the matrix at bath-nodes is zero, and puts a 1 on the diagonal.
Precondition: This method requires the system matrix to be in assembled state. Call FinaliseLhsMatrix() on your linear system if required.
computeMatrix | Whether the LHS matrix of the linear system has been computed | |
computeVector | Whether the RHS vector of the linear system has been computed |
Definition at line 329 of file AbstractBidomainSolver.cpp.
References LinearSystem::GetLhsMatrix(), LinearSystem::GetMatrixElement(), LinearSystem::GetOwnershipRange(), LinearSystem::GetSize(), HeartRegionCode::IsRegionBath(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mBathSimulation, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpLinearSystem, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpMesh, LinearSystem::rGetLhsMatrix(), LinearSystem::rGetRhsVector(), PetscVecTools::SetElement(), and PetscMatTools::SetElement().
Referenced by BidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem | ( | Vec | existingSolution | ) | [inline, protected, virtual] |
FinaliseAssembleSystem
Called at the end of SetupLinearSystem(), before the system is solved.
If no dirichlet boundary conditions (i) Check compatibility condition to check we are solving a linear system that can be solved Then either: (a) If not setting average(phi)=0, we are solving a singular system, so set up a null space. (b) Apply average(phi)=0 constraint by altering the last row, to get a non-singular system
existingSolution | Solution at current time |
Reimplemented from AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >.
Definition at line 149 of file AbstractBidomainSolver.cpp.
References AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::CheckCompatibilityCondition(), LinearSystem::FinaliseLhsMatrix(), LinearSystem::FinaliseRhsVector(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GenerateNullBasis(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GetBoundaryConditions(), LinearSystem::GetSize(), AbstractDynamicLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, 2 >::mMatrixIsAssembled, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mNullSpaceCreated, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpConfig, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpLinearSystem, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed, HeartConfig::SetKSPSolver(), LinearSystem::SetKspType(), LinearSystem::SetMatrixElement(), LinearSystem::SetNullBasis(), LinearSystem::SetRhsVectorElement(), and LinearSystem::ZeroMatrixRowsWithValueOnDiagonal().
Vec AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GenerateNullBasis | ( | ) | const [inline, protected, virtual] |
GenerateNullBasis
Called by FinaliseAssembleSystem to get the null basis to use for the particular formulation of the bidomain equations used.
Definition at line 124 of file AbstractBidomainSolver.cpp.
References DistributedVector::Begin(), DistributedVectorFactory::CreateDistributedVector(), DistributedVectorFactory::CreateVec(), DistributedVector::End(), AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpMesh, and DistributedVector::Restore().
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem().
BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,2>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GetBoundaryConditions | ( | ) | [inline] |
Get the boundary conditions being used
Definition at line 193 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::CheckCompatibilityCondition(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetFixedExtracellularPotentialNodes().
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseForSolve | ( | Vec | initialSolution | ) | [inline, protected, virtual] |
Create the linear system object if it hasn't been already. Can use an initial solution as PETSc template, or base it on the mesh size.
initialSolution | an initial guess |
Reimplemented from AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >.
Reimplemented in BidomainSolver< ELEMENT_DIM, SPACE_DIM >, and BidomainSolver< 3, 3 >.
Definition at line 37 of file AbstractBidomainSolver.cpp.
References PetscTools::AmMaster(), HeartConfig::GetAbsoluteTolerance(), HeartConfig::GetRelativeTolerance(), HeartConfig::Instance(), HeartRegionCode::IsRegionBath(), PetscTools::IsSequential(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpConfig, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpLinearSystem, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpMesh, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed, LinearSystem::SetAbsoluteTolerance(), LinearSystem::SetKspType(), LinearSystem::SetMatrixIsSymmetric(), LinearSystem::SetPcType(), LinearSystem::SetRelativeTolerance(), LinearSystem::SetUseFixedNumberIterations(), and TERMINATE.
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::PrepareForSetupLinearSystem | ( | Vec | existingSolution | ) | [inline, protected, virtual] |
PrepareForSetupLinearSystem
Called at the beginning of SetupLinearSystem(). Here, used to integrate cell model odes.
existingSolution | is the voltage to feed into the cell models |
Reimplemented from AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >.
Definition at line 116 of file AbstractBidomainSolver.cpp.
References PdeSimulationTime::GetPdeTimeStep(), PdeSimulationTime::GetTime(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBidomainTissue.
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::ResetBoundaryConditionsContainer | ( | BoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, 2 > * | pBcc | ) | [inline] |
Reset the boundary conditions being used. The caller should deal with deleting the old bcc pointer.
pBcc | The new boundary conditions container. |
Definition at line 203 of file AbstractBidomainSolver.hpp.
Referenced by BidomainProblem< DIM >::AtBeginningOfTimestep(), and BidomainProblem< DIM >::OnEndOfTimestep().
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetFixedExtracellularPotentialNodes | ( | std::vector< unsigned > | fixedExtracellularPotentialNodes | ) | [inline] |
Set the nodes at which phi_e (the extracellular potential) is fixed to zero. This does not necessarily have to be called. If it is not, phi_e is only defined up to a constant.
fixedExtracellularPotentialNodes | the nodes to be fixed. |
Definition at line 284 of file AbstractBidomainSolver.cpp.
References BoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::AddDirichletBoundaryCondition(), EXCEPTION, AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GetBoundaryConditions(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mFixedExtracellularPotentialNodes, AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::mpMesh, and AbstractBoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::ResetDirichletCommunication().
Referenced by BidomainProblem< DIM >::CreateSolver().
void AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetRowForAverageOfPhiZeroed | ( | unsigned | rowMeanPhiEZero | ) | [inline] |
Used when removing a single row to resolve singularity and replacing it with a constraint on the average phi_e being zero. It is set from the problem class.
rowMeanPhiEZero | indicates the row of the matrix to be replaced. Ought to be an odd number... |
Definition at line 317 of file AbstractBidomainSolver.cpp.
References EXCEPTION, and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed.
Referenced by BidomainProblem< DIM >::CreateSolver().
bool AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mBathSimulation [protected] |
Whether the simulation involves a perfusing bath
Definition at line 46 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseForBath(), and BidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
std::vector<unsigned> AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mFixedExtracellularPotentialNodes [protected] |
Used when pinning nodes to resolve singularity. This vector indicates the global indices of the nodes to be pinned
Definition at line 69 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetFixedExtracellularPotentialNodes().
bool AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mNullSpaceCreated [protected] |
Used when intialising null-space solver to resolve singularity
Definition at line 61 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem().
unsigned AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mNumQuadPoints [protected] |
Number of quadrature points per dimension (only saved so it can be passed to the assembler)
Definition at line 58 of file AbstractBidomainSolver.hpp.
Referenced by BidomainSolver< ELEMENT_DIM, SPACE_DIM >::BidomainSolver().
BidomainTissue<SPACE_DIM>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBidomainTissue [protected] |
The PDE to be solved.
Definition at line 49 of file AbstractBidomainSolver.hpp.
Referenced by BidomainSolver< ELEMENT_DIM, SPACE_DIM >::BidomainSolver(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::PrepareForSetupLinearSystem(), and BidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,2>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBoundaryConditions [protected] |
Boundary conditions
Definition at line 52 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< DIM, DIM >::GetBoundaryConditions(), AbstractBidomainSolver< DIM, DIM >::ResetBoundaryConditionsContainer(), and BidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
HeartConfig* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpConfig [protected] |
Local cache of the configuration singleton instance
Definition at line 64 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseForSolve().
unsigned AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed [protected] |
Used when removing a single row to resolve singularity and replacing it with a constraint on the average phi_e being zero. This number indicates the row of the matrix to be replaced. This is INT_MAX if unset. It is set from the problem class.
Definition at line 76 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::CheckCompatibilityCondition(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseForSolve(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetRowForAverageOfPhiZeroed().