#include <AbstractBidomainSolver.hpp>
Public Member Functions | |
AbstractBidomainSolver (bool bathSimulation, AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM > *pMesh, BidomainTissue< SPACE_DIM > *pTissue, BoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, 2 > *pBoundaryConditions, unsigned numQuadPoints=2) | |
virtual | ~AbstractBidomainSolver () |
void | SetFixedExtracellularPotentialNodes (std::vector< unsigned > fixedExtracellularPotentialNodes) |
void | SetRowForAverageOfPhiZeroed (unsigned rowMeanPhiEZero) |
BoundaryConditionsContainer < ELEMENT_DIM, SPACE_DIM, 2 > * | GetBoundaryConditions () |
void | ResetBoundaryConditionsContainer (BoundaryConditionsContainer< ELEMENT_DIM, SPACE_DIM, 2 > *pBcc) |
Protected Member Functions | |
void | InitialiseForSolve (Vec initialSolution) |
virtual void | CheckCompatibilityCondition () |
void | PrepareForSetupLinearSystem (Vec existingSolution) |
virtual void | FinaliseLinearSystem (Vec existingSolution) |
virtual Vec | GenerateNullBasis () const |
void | FinaliseForBath (bool computeMatrix, bool computeVector) |
Protected Attributes | |
bool | mBathSimulation |
BidomainTissue< SPACE_DIM > * | mpBidomainTissue |
BoundaryConditionsContainer < ELEMENT_DIM, SPACE_DIM, 2 > * | mpBoundaryConditions |
BidomainAssembler< ELEMENT_DIM, SPACE_DIM > * | mpBidomainAssembler |
unsigned | mNumQuadPoints |
bool | mNullSpaceCreated |
HeartConfig * | mpConfig |
std::vector< unsigned > | mFixedExtracellularPotentialNodes |
unsigned | mRowForAverageOfPhiZeroed |
Definition at line 43 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 >::mpBidomainAssembler, 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 281 of file AbstractBidomainSolver.cpp.
References AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBidomainAssembler.
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 MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >.
Definition at line 37 of file AbstractBidomainSolver.cpp.
References PetscTools::AmMaster(), HeartConfig::GetAbsoluteTolerance(), HeartConfig::GetRelativeTolerance(), AbstractLinearPdeSolver< ELEMENT_DIM, SPACE_DIM, PROBLEM_DIM >::InitialiseForSolve(), 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.
Referenced by MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseForSolve().
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 >::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 >::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 LinearSystem::AssembleFinalLhsMatrix(), LinearSystem::AssembleRhsVector(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::CheckCompatibilityCondition(), 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().
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 AssembleFinalLhsMatrix() 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 335 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 MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem(), and BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
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 290 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 323 of file AbstractBidomainSolver.cpp.
References EXCEPTION, and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mRowForAverageOfPhiZeroed.
Referenced by BidomainProblem< DIM >::CreateSolver().
BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,2>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::GetBoundaryConditions | ( | ) | [inline] |
Get the boundary conditions being used
Definition at line 201 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 >::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 211 of file AbstractBidomainSolver.hpp.
Referenced by BidomainProblem< DIM >::AtBeginningOfTimestep(), and BidomainProblem< DIM >::OnEndOfTimestep().
bool AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mBathSimulation [protected] |
Whether the simulation involves a perfusing bath
Definition at line 47 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseForBath(), BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseAssembler(), MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem(), and BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
BidomainTissue<SPACE_DIM>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBidomainTissue [protected] |
The PDE to be solved.
Definition at line 50 of file AbstractBidomainSolver.hpp.
Referenced by BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseAssembler(), MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::MatrixBasedBidomainSolver(), AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::PrepareForSetupLinearSystem(), and MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
BoundaryConditionsContainer<ELEMENT_DIM,SPACE_DIM,2>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBoundaryConditions [protected] |
Boundary conditions
Definition at line 53 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< DIM, DIM >::GetBoundaryConditions(), AbstractBidomainSolver< DIM, DIM >::ResetBoundaryConditionsContainer(), MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem(), and BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
BidomainAssembler<ELEMENT_DIM,SPACE_DIM>* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpBidomainAssembler [protected] |
The bidomain assembler, used to set up the LHS matrix, (and also used to set up the RHS vector in the BasicBidomainSolver, but not in the MatrixBasedBidomainSolver)
Definition at line 60 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver(), BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseAssembler(), MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem(), BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::~AbstractBidomainSolver().
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 66 of file AbstractBidomainSolver.hpp.
Referenced by BasicBidomainSolver< ELEMENT_DIM, SPACE_DIM >::InitialiseAssembler(), MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::MatrixBasedBidomainSolver(), and MatrixBasedBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetupLinearSystem().
bool AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mNullSpaceCreated [protected] |
Used when intialising null-space solver to resolve singularity
Definition at line 69 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::AbstractBidomainSolver(), and AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::FinaliseLinearSystem().
HeartConfig* AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::mpConfig [protected] |
Local cache of the configuration singleton instance
Definition at line 72 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().
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 77 of file AbstractBidomainSolver.hpp.
Referenced by AbstractBidomainSolver< ELEMENT_DIM, SPACE_DIM >::SetFixedExtracellularPotentialNodes().
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 84 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().