Chaste Release::3.1
|
#include <AbstractCardiacMechanicsSolver.hpp>
Public Member Functions | |
AbstractCardiacMechanicsSolver (QuadraticMesh< DIM > &rQuadMesh, ContractionModelName contractionModelName, ElectroMechanicsProblemDefinition< DIM > &rProblemDefinition, std::string outputDirectory) | |
~AbstractCardiacMechanicsSolver () | |
void | SetFineCoarseMeshPair (FineCoarseMeshPair< DIM > *pMeshPair) |
unsigned | GetTotalNumQuadPoints () |
virtual GaussianQuadratureRule < DIM > * | GetQuadratureRule () |
std::map< unsigned, DataAtQuadraturePoint > & | rGetQuadPointToDataAtQuadPointMap () |
void | SetConstantFibreSheetDirections (const c_matrix< double, DIM, DIM > &rFibreSheetMatrix) |
void | SetVariableFibreSheetDirections (const FileFinder &rOrthoFile, bool definedPerQuadraturePoint) |
void | SetCalciumAndVoltage (std::vector< double > &rCalciumConcentrations, std::vector< double > &rVoltages) |
virtual void | Solve (double time, double nextTime, double odeTimestep)=0 |
void | ComputeDeformationGradientAndStretchInEachElement (std::vector< c_matrix< double, DIM, DIM > > &rDeformationGradients, std::vector< double > &rStretches) |
Protected Member Functions | |
virtual bool | IsImplicitSolver ()=0 |
void | AddActiveStressAndStressDerivative (c_matrix< double, DIM, DIM > &rC, unsigned elementIndex, unsigned currentQuadPointGlobalIndex, c_matrix< double, DIM, DIM > &rT, FourthOrderTensor< DIM, DIM, DIM, DIM > &rDTdE, bool addToDTdE) |
void | SetupChangeOfBasisMatrix (unsigned elementIndex, unsigned currentQuadPointGlobalIndex) |
void | Initialise () |
virtual void | InitialiseContractionModels (ContractionModelName contractionModelName)=0 |
virtual void | GetActiveTensionAndTensionDerivs (double currentFibreStretch, unsigned currentQuadPointGlobalIndex, bool assembleJacobian, double &rActiveTension, double &rDerivActiveTensionWrtLambda, double &rDerivActiveTensionWrtDLambdaDt)=0 |
Protected Attributes | |
std::map< unsigned, DataAtQuadraturePoint > | mQuadPointToDataAtQuadPointMap |
std::map< unsigned, DataAtQuadraturePoint > ::iterator | mMapIterator |
ContractionModelName | mContractionModelName |
FineCoarseMeshPair< DIM > * | mpMeshPair |
unsigned | mTotalQuadPoints |
double | mCurrentTime |
double | mNextTime |
double | mOdeTimestep |
c_matrix< double, DIM, DIM > | mConstantFibreSheetDirections |
std::vector< c_matrix< double, DIM, DIM > > * | mpVariableFibreSheetDirections |
bool | mFibreSheetDirectionsDefinedByQuadraturePoint |
c_vector< double, DIM > | mCurrentElementFibreDirection |
c_vector< double, DIM > | mCurrentElementSheetDirection |
c_vector< double, DIM > | mCurrentElementSheetNormalDirection |
ElectroMechanicsProblemDefinition < DIM > & | mrElectroMechanicsProblemDefinition |
Static Protected Attributes | |
static const unsigned | NUM_VERTICES_PER_ELEMENT = ELASTICITY_SOLVER::NUM_VERTICES_PER_ELEMENT |
AbstractCardiacMechanicsSolver
Base class to implicit and explicit cardiac mechanics solvers. Inherits from IncompressibleNonlinearElasticitySolver or CompressibleNonlinearElasticityAssembler (depending on what the template parameter ELASTICITY_SOLVER is), and also from AbstractCardiacMechanicsSolverInterface which just declares this classes main public methods.
Overloads AddActiveStressAndStressDerivative() which adds on the active tension term to the stress. The child classes hold the contraction models and need to implement a method for getting the active tension from the model.
Definition at line 81 of file AbstractCardiacMechanicsSolver.hpp.
AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::AbstractCardiacMechanicsSolver | ( | QuadraticMesh< DIM > & | rQuadMesh, |
ContractionModelName | contractionModelName, | ||
ElectroMechanicsProblemDefinition< DIM > & | rProblemDefinition, | ||
std::string | outputDirectory | ||
) |
Constructor
rQuadMesh | A reference to the mesh. |
contractionModelName | the name of the contraction model to be used |
rProblemDefinition | Object defining body force and boundary conditions |
outputDirectory | The output directory, relative to TEST_OUTPUT |
Definition at line 342 of file AbstractCardiacMechanicsSolver.hpp.
AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::~AbstractCardiacMechanicsSolver | ( | ) |
Destructor
Definition at line 427 of file AbstractCardiacMechanicsSolver.hpp.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::AddActiveStressAndStressDerivative | ( | c_matrix< double, DIM, DIM > & | rC, |
unsigned | elementIndex, | ||
unsigned | currentQuadPointGlobalIndex, | ||
c_matrix< double, DIM, DIM > & | rT, | ||
FourthOrderTensor< DIM, DIM, DIM, DIM > & | rDTdE, | ||
bool | addToDTdE | ||
) | [protected] |
Overloaded AddActiveStressAndStressDerivative(), which calls on the contraction model to get the active stress and add it on to the stress tensor
rC | The Lagrangian deformation tensor (F^T F) |
elementIndex | Index of the current element |
currentQuadPointGlobalIndex | The index (assuming an outer loop over elements and an inner loop over quadrature points), of the current quadrature point. |
rT | The stress to be added to |
rDTdE | the stress derivative to be added to, assuming the final parameter is true |
addToDTdE | A boolean flag saying whether the stress derivative is required or not. |
Definition at line 490 of file AbstractCardiacMechanicsSolver.hpp.
References Determinant(), and Inverse().
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::ComputeDeformationGradientAndStretchInEachElement | ( | std::vector< c_matrix< double, DIM, DIM > > & | rDeformationGradients, |
std::vector< double > & | rStretches | ||
) | [virtual] |
Compute the deformation gradient, and stretch in the fibre direction, for each element in the mesh. Note: using quadratic interpolation for position, the deformation gradients and stretches actually vary linearly in each element. However, for computational efficiency reasons, when computing deformation gradients and stretches to pass back to the electrophysiology solver, we just assume they are constant in each element (ie ignoring the quadratic correction to the displacement). This means that the (const) deformation gradient and stretch for each element can be computed in advance and stored, and we don't have to worry about interpolation onto the precise location of the cell-model (electrics-mesh) node, just which element it is in, and ditto the electric mesh element centroid.
To compute this (elementwise-)constant F (and from it the constant stretch), we just have to compute F using the deformed positions at the vertices only, with linear bases, rather than all the nodes and quadratic bases.
rDeformationGradients | A reference of a std::vector in which the deformation gradient in each element will be returned. Must be allocated prior to being passed in. |
rStretches | A reference of a std::vector in which the stretch in each element will be returned. Must be allocated prior to being passed in. |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 661 of file AbstractCardiacMechanicsSolver.hpp.
References LinearBasisFunction< ELEMENT_DIM >::ComputeTransformedBasisFunctionDerivatives(), and AbstractElement< ELEMENT_DIM, SPACE_DIM >::GetNodeGlobalIndex().
virtual void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::GetActiveTensionAndTensionDerivs | ( | double | currentFibreStretch, |
unsigned | currentQuadPointGlobalIndex, | ||
bool | assembleJacobian, | ||
double & | rActiveTension, | ||
double & | rDerivActiveTensionWrtLambda, | ||
double & | rDerivActiveTensionWrtDLambdaDt | ||
) | [protected, pure virtual] |
Pure method called in AbstractCardiacMechanicsSolver::AddActiveStressAndStressDerivative(), which needs to provide the active tension (and other info if implicit (if the contraction model depends on stretch or stretch rate)) at a particular quadrature point. Takes in the current fibre stretch.
currentFibreStretch | The stretch in the fibre direction |
currentQuadPointGlobalIndex | quadrature point the integrand is currently being evaluated at in AssembleOnElement |
assembleJacobian | A bool stating whether to assemble the Jacobian matrix. |
rActiveTension | The returned active tension |
rDerivActiveTensionWrtLambda | The returned dT_dLam, derivative of active tension wrt stretch. Only should be set in implicit solvers |
rDerivActiveTensionWrtDLambdaDt | The returned dT_dLamDot, derivative of active tension wrt stretch rate. Only should be set in implicit solver |
Implemented in ExplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >, and ImplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >.
virtual GaussianQuadratureRule<DIM>* AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::GetQuadratureRule | ( | ) | [inline, virtual] |
Get the quadrature rule used in the elements.
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 256 of file AbstractCardiacMechanicsSolver.hpp.
unsigned AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::GetTotalNumQuadPoints | ( | ) | [inline, virtual] |
Get the total number of quad points in the mesh. Pure, implemented in concrete solver
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 250 of file AbstractCardiacMechanicsSolver.hpp.
References AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mTotalQuadPoints.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::Initialise | ( | ) | [protected, virtual] |
Sets relevant data at all quad points, including whether it is an active region or not. The contraction model is set to NULL. At the end, it calls InitialiseContractionModels in the child class to assign a proper model.
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 360 of file AbstractCardiacMechanicsSolver.hpp.
References DataAtQuadraturePoint_::Active, DataAtQuadraturePoint_::ContractionModel, AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM >::GetElementIteratorBegin(), AbstractElement< ELEMENT_DIM, SPACE_DIM >::GetIndex(), AbstractElement< ELEMENT_DIM, SPACE_DIM >::GetOwnership(), HeartRegionCode::GetValidBathId(), DataAtQuadraturePoint_::Stretch, and DataAtQuadraturePoint_::StretchLastTimeStep.
virtual void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::InitialiseContractionModels | ( | ContractionModelName | contractionModelName | ) | [protected, pure virtual] |
Must assign a contraction model at each quad point. It has to assign fake-bath models to non-active regions
contractionModelName | the name of the contraction model. |
Implemented in ExplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >, and ImplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >.
virtual bool AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::IsImplicitSolver | ( | ) | [protected, pure virtual] |
Whether the solver is implicit or not (ie whether the contraction model depends on lambda (and depends on lambda at the current time)). For whether dTa_dLam dependent terms need to be added to the Jacbobian
Implemented in ExplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >, and ImplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >.
std::map<unsigned,DataAtQuadraturePoint>& AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::rGetQuadPointToDataAtQuadPointMap | ( | ) | [inline] |
Access mQuadPointToDataAtQuadPointMap. See doxygen for this variable
Definition at line 264 of file AbstractCardiacMechanicsSolver.hpp.
References AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mQuadPointToDataAtQuadPointMap.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetCalciumAndVoltage | ( | std::vector< double > & | rCalciumConcentrations, |
std::vector< double > & | rVoltages | ||
) | [virtual] |
Set the intracellular Calcium concentrations and voltages at each quad point. Pure.
Implicit solvers (for contraction models which are functions of stretch (and maybe stretch rate) would integrate the contraction model with this Ca/V/t using the current stretch (ie inside AssembleOnElement, ie inside GetActiveTensionAndTensionDerivs). Explicit solvers (for contraction models which are NOT functions of stretch can immediately integrate the contraction models to get the active tension.
rCalciumConcentrations | Reference to a vector of intracellular calcium concentrations at each quadrature point |
rVoltages | Reference to a vector of voltages at each quadrature point |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 445 of file AbstractCardiacMechanicsSolver.hpp.
References ContractionModelInputParameters_::intracellularCalciumConcentration.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetConstantFibreSheetDirections | ( | const c_matrix< double, DIM, DIM > & | rFibreSheetMatrix | ) | [virtual] |
Set a constant fibre-sheet-normal direction (a matrix) to something other than the default (fibres in X-direction, sheet in the XY plane)
rFibreSheetMatrix | The fibre-sheet-normal matrix (fibre dir the first column, normal-to-fibre-in sheet in second column, sheet-normal in third column). |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 764 of file AbstractCardiacMechanicsSolver.hpp.
References EXCEPTION.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetFineCoarseMeshPair | ( | FineCoarseMeshPair< DIM > * | pMeshPair | ) | [virtual] |
Sets the fine-coarse mesh pair object so that the solver knows about electrics too. It checks that the coarse mesh of the fine-mesh pair has the same number of elements as the quad mesh of this object and throws an exception otherwise.
pMeshPair | the FineCoarseMeshPair object to be set |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 416 of file AbstractCardiacMechanicsSolver.hpp.
References EXCEPTION, FineCoarseMeshPair< DIM >::GetCoarseMesh(), and AbstractTetrahedralMesh< ELEMENT_DIM, SPACE_DIM >::GetNumElements().
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetupChangeOfBasisMatrix | ( | unsigned | elementIndex, |
unsigned | currentQuadPointGlobalIndex | ||
) | [protected] |
Over-ridden method which sets up an internal variable in the parent class, using the provided fibre-sheet direction information.
elementIndex | element global index |
currentQuadPointGlobalIndex | quad point global index |
Definition at line 470 of file AbstractCardiacMechanicsSolver.hpp.
void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::SetVariableFibreSheetDirections | ( | const FileFinder & | rOrthoFile, |
bool | definedPerQuadraturePoint | ||
) | [virtual] |
Set a variable fibre-sheet-normal direction (matrices), from file. If the second parameter is false, there should be one fibre-sheet definition for each element; otherwise there should be one fibre-sheet definition for each *quadrature point* in the mesh. In the first case, the file should be a .ortho file (ie each line has the fibre dir, sheet dir, normal dir for that element), in the second it should have .orthoquad as the format.
rOrthoFile | the file containing the fibre/sheet directions |
definedPerQuadraturePoint | whether the fibre-sheet definitions are for each quadrature point in the mesh (if not, one for each element is assumed). |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Definition at line 732 of file AbstractCardiacMechanicsSolver.hpp.
References EXCEPTION, FileFinder::GetAbsolutePath(), FibreReader< DIM >::GetFibreSheetAndNormalMatrix(), and FibreReader< DIM >::GetNumLinesOfData().
virtual void AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::Solve | ( | double | time, |
double | nextTime, | ||
double | odeTimestep | ||
) | [pure virtual] |
Solve for the deformation, integrating the contraction model ODEs.
time | the current time |
nextTime | the next time |
odeTimestep | the ODE timestep |
Implements AbstractCardiacMechanicsSolverInterface< DIM >.
Implemented in ExplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >, and ImplicitCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >.
c_matrix<double,DIM,DIM> AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mConstantFibreSheetDirections [protected] |
The fibre-sheet-normal directions (in a matrix), if constant (defaults to the identity, ie fibres in the X-direction, sheet in the XY plane)
Definition at line 121 of file AbstractCardiacMechanicsSolver.hpp.
ContractionModelName AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mContractionModelName [protected] |
The name of the contraction model to be used in all active quad points
Definition at line 105 of file AbstractCardiacMechanicsSolver.hpp.
c_vector<double,DIM> AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mCurrentElementFibreDirection [protected] |
The fibre direction for the current element being assembled on
Definition at line 136 of file AbstractCardiacMechanicsSolver.hpp.
c_vector<double,DIM> AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mCurrentElementSheetDirection [protected] |
The sheet direction for the current element being assembled on
Definition at line 139 of file AbstractCardiacMechanicsSolver.hpp.
c_vector<double,DIM> AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mCurrentElementSheetNormalDirection [protected] |
The sheet normal direction for the current element being assembled on
Definition at line 142 of file AbstractCardiacMechanicsSolver.hpp.
double AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mCurrentTime [protected] |
Current time
Definition at line 114 of file AbstractCardiacMechanicsSolver.hpp.
bool AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mFibreSheetDirectionsDefinedByQuadraturePoint [protected] |
Whether the fibre-sheet directions that where read in where define per element or per quadrature point. Only valid if mpVariableFibreSheetDirections!=NULL
Definition at line 133 of file AbstractCardiacMechanicsSolver.hpp.
std::map<unsigned,DataAtQuadraturePoint>::iterator AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mMapIterator [protected] |
An iterator to the map, used to avoid having to repeatedly search the map.
Definition at line 102 of file AbstractCardiacMechanicsSolver.hpp.
double AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mNextTime [protected] |
Time to which the solver has been asked to solve to
Definition at line 116 of file AbstractCardiacMechanicsSolver.hpp.
double AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mOdeTimestep [protected] |
Time used to integrate the contraction model
Definition at line 118 of file AbstractCardiacMechanicsSolver.hpp.
FineCoarseMeshPair<DIM>* AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mpMeshPair [protected] |
A mesh pair object that can be set by the user to inform the solver about the electrics mesh.
Definition at line 108 of file AbstractCardiacMechanicsSolver.hpp.
std::vector<c_matrix<double,DIM,DIM> >* AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mpVariableFibreSheetDirections [protected] |
The fibre-sheet-normal directions (matrices), one for each element. Only non-NULL if SetVariableFibreSheetDirections() is called, if not mConstantFibreSheetDirections is used instead
Definition at line 127 of file AbstractCardiacMechanicsSolver.hpp.
std::map<unsigned,DataAtQuadraturePoint> AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mQuadPointToDataAtQuadPointMap [protected] |
A map from the index of a quadrature point to the data (contraction model, stretch, stretch at the last time-step) at that quad point. Note that there is no vector of all the quadrature points of the mesh; the quad point index is the index that would be obtained by looping over elements and then looping over quad points.
DISTRIBUTED - only holds data for the quad points within elements owned by this process.
Definition at line 97 of file AbstractCardiacMechanicsSolver.hpp.
Referenced by AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::rGetQuadPointToDataAtQuadPointMap().
ElectroMechanicsProblemDefinition<DIM>& AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mrElectroMechanicsProblemDefinition [protected] |
This class contains all the information about the electro mechanics problem (except the material law)
Definition at line 148 of file AbstractCardiacMechanicsSolver.hpp.
unsigned AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::mTotalQuadPoints [protected] |
Total number of quad points in the (mechanics) mesh
Definition at line 111 of file AbstractCardiacMechanicsSolver.hpp.
Referenced by AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::GetTotalNumQuadPoints().
const unsigned AbstractCardiacMechanicsSolver< ELASTICITY_SOLVER, DIM >::NUM_VERTICES_PER_ELEMENT = ELASTICITY_SOLVER::NUM_VERTICES_PER_ELEMENT [static, protected] |
Useful const from base class
Definition at line 84 of file AbstractCardiacMechanicsSolver.hpp.