Chaste Release::3.1
CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM > Class Template Reference

#include <CardiacElectroMechanicsProblem.hpp>

Inheritance diagram for CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >:
Collaboration diagram for CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >:

List of all members.

Public Member Functions

 CardiacElectroMechanicsProblem (CompressibilityType compressibilityType, ElectricsProblemType electricsProblemType, TetrahedralMesh< DIM, DIM > *pElectricsMesh, QuadraticMesh< DIM > *pMechanicsMesh, AbstractCardiacCellFactory< DIM > *pCellFactory, ElectroMechanicsProblemDefinition< DIM > *pProblemDefinition, std::string outputDirectory)
virtual ~CardiacElectroMechanicsProblem ()
void Initialise ()
void Solve ()
double Max (std::vector< double > &vec)
void SetNoElectricsOutput ()
void SetWatchedPosition (c_vector< double, DIM > watchedLocation)
void SetOutputDeformationGradientsAndStress (double timestep)
std::vector< c_vector< double,
DIM > > & 
rGetDeformedPosition ()
c_matrix< double, DIM, DIM > & rGetModifiedConductivityTensor (unsigned elementIndex, const c_matrix< double, DIM, DIM > &rOriginalConductivity)
virtual void PrepareForSolve ()
virtual void OnEndOfTimeStep (unsigned counter)

Protected Member Functions

void DetermineWatchedNodes ()
void WriteWatchedLocationData (double time, Vec voltage)

Protected Attributes

CompressibilityType mCompressibilityType
AbstractCardiacProblem< DIM,
DIM, ELEC_PROB_DIM > * 
mpElectricsProblem
AbstractCardiacMechanicsSolverInterface
< DIM > * 
mpCardiacMechSolver
AbstractNonlinearElasticitySolver
< DIM > * 
mpMechanicsSolver
unsigned mNumElecTimestepsPerMechTimestep
std::vector< doublemInterpolatedCalciumConcs
std::vector< doublemInterpolatedVoltages
TetrahedralMesh< DIM, DIM > * mpElectricsMesh
QuadraticMesh< DIM > * mpMechanicsMesh
ElectroMechanicsProblemDefinition
< DIM > * 
mpProblemDefinition
bool mHasBath
FineCoarseMeshPair< DIM > * mpMeshPair
std::string mOutputDirectory
std::string mDeformationOutputDirectory
bool mWriteOutput
bool mNoElectricsOutput
bool mIsWatchedLocation
c_vector< double, DIM > mWatchedLocation
unsigned mWatchedElectricsNodeIndex
unsigned mWatchedMechanicsNodeIndex
out_stream mpWatchedLocationFile
unsigned mNumTimestepsToOutputDeformationGradientsAndStress
std::vector< doublemStretchesForEachMechanicsElement
std::vector< c_matrix< double,
DIM, DIM > > 
mDeformationGradientsForEachMechanicsElement
std::pair< unsigned, c_matrix
< double, DIM, DIM > > 
mLastModifiedConductivity

Static Protected Attributes

static const int WRITE_EVERY_NTH_TIME = 1

Friends

class TestCardiacElectroMechanicsProblem
class TestCardiacElectroMechanicsFurtherFunctionality

Detailed Description

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
class CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >

CardiacElectroMechanicsProblem

For solving full electro-mechanical problems.

Solves a monodomain problem (diffusion plus cell models) on a (fine) electrics mesh, and a mechanics problem (finite elasticity plus contraction model) on a coarse mesh. An implicit scheme (Jon Whiteley's algorithm) be be used.

For solving problems on regular grids use CardiacElectroMechProbRegularGeom

The implicit algorithm:

Store the position in the electrics mesh of each quad point in the mechanics mesh For every time: Solve the monodomain problem (ie integrate ODEs, solve PDE) Get intracellular [Ca] at each electrics node and interpolate on each mechanics quad point Set [Ca] on each contraction model (one for each point) Solve static finite elasticity problem implicity

  • guess solution
  • this gives the fibre stretch and stretch rate to be set on contraction models
  • integrate contraction models (implicitly if NHS) to get for active tension
  • use this active tension in computing the stress for that guess of the deformation end

Definition at line 94 of file CardiacElectroMechanicsProblem.hpp.


Constructor & Destructor Documentation

template<unsigned DIM, unsigned ELEC_PROB_DIM>
CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::CardiacElectroMechanicsProblem ( CompressibilityType  compressibilityType,
ElectricsProblemType  electricsProblemType,
TetrahedralMesh< DIM, DIM > *  pElectricsMesh,
QuadraticMesh< DIM > *  pMechanicsMesh,
AbstractCardiacCellFactory< DIM > *  pCellFactory,
ElectroMechanicsProblemDefinition< DIM > *  pProblemDefinition,
std::string  outputDirectory = "" 
)
template<unsigned DIM, unsigned ELEC_PROB_DIM>
CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::~CardiacElectroMechanicsProblem ( ) [virtual]

Delete allocated memory and close the watched location file

NOTE if SetWatchedLocation but not Initialise has been called, mpWatchedLocationFile will be uninitialised and using it will cause a seg fault. Hence the mpMechanicsMesh!=NULL it is true if Initialise has been called.

Definition at line 338 of file CardiacElectroMechanicsProblem.cpp.

References LogFile::Close().


Member Function Documentation

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::DetermineWatchedNodes ( ) [protected]

Determine which node is closest to the watched location

Definition at line 61 of file CardiacElectroMechanicsProblem.cpp.

References NEVER_REACHED, OutputFileHandler::OpenOutputFile(), and UNSIGNED_UNSET.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::Initialise ( )

Initialise the class. Initialises the MonodomainProblem and sets up the electrics mesh to mechanics mesh data.

Todo:
This is fragile: check how the TimeStepper does it, and possibly refactor the behaviour there into a static helper method if it isn't already.

Definition at line 356 of file CardiacElectroMechanicsProblem.cpp.

References EXCEPTION, HeartConfig::GetPdeTimeStep(), LogFile::Instance(), HeartConfig::Instance(), LogFile::Set(), FineCoarseMeshPair< DIM >::SetUpBoxesOnFineMesh(), AbstractTetrahedralMeshWriter< ELEMENT_DIM, SPACE_DIM >::WriteFilesUsingMesh(), and LogFile::WriteHeader().

template<unsigned DIM, unsigned ELEC_PROB_DIM>
double CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::Max ( std::vector< double > &  vec)

Short helper function - the max of a std::vector

Parameters:
veca vector of doubles

Definition at line 966 of file CardiacElectroMechanicsProblem.cpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
virtual void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::OnEndOfTimeStep ( unsigned  counter) [inline, virtual]

Called in Solve() at the end of every time step

Parameters:
countertime step

Definition at line 291 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
virtual void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::PrepareForSolve ( ) [inline, virtual]

Called in Solve() before the time loop

Definition at line 285 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
std::vector< c_vector< double, DIM > > & CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::rGetDeformedPosition ( )
Returns:
the current deformed position of the nodes

Definition at line 1001 of file CardiacElectroMechanicsProblem.cpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
c_matrix< double, DIM, DIM > & CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::rGetModifiedConductivityTensor ( unsigned  elementIndex,
const c_matrix< double, DIM, DIM > &  rOriginalConductivity 
)

The implementation of the pure method defined in the base class AbstractConductivityModifier. The tissue class will call this method.

Parameters:
elementIndexIndex of current element
rOriginalConductivityReference to the original (for example, undeformed) conductivity tensor
Returns:
Reference to a modified conductivity tensor.

Definition at line 170 of file CardiacElectroMechanicsProblem.cpp.

References Inverse().

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::SetNoElectricsOutput ( )

Call to not write out voltages

Definition at line 977 of file CardiacElectroMechanicsProblem.cpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::SetOutputDeformationGradientsAndStress ( double  timestep)

Call this for a files containing the deformation gradients (F), evaluated at the centroids of element, and the 2nd PK stress for each element (averaged over the values at the quadrature points of that element), to be written,

Parameters:
timestephow often to write this. Must be a multiple of the mechanics timestep.

Definition at line 990 of file CardiacElectroMechanicsProblem.cpp.

References EXCEPTION.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::SetWatchedPosition ( c_vector< double, DIM >  watchedLocation)

Set a location to be watched - for which lots of output is given. Should correspond to nodes in both meshes.

The watched file will have rows that look like: time x_pos y_pos [z_pos] voltage Ca_i_conc.

NOTE: for the Calcium - assumes LUO_RUDY IS USED

Parameters:
watchedLocationlocation (x,y,z) in space. Watched node is the closest to this point.

Definition at line 983 of file CardiacElectroMechanicsProblem.cpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM>
void CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::WriteWatchedLocationData ( double  time,
Vec  voltage 
) [protected]

Write info (x, y, [z], V) for the watched node.

Parameters:
timeTime-step now, to write out
voltageVm vector (this is Monodomain)

Todo:
Improve efficiency of this method?

Definition at line 145 of file CardiacElectroMechanicsProblem.cpp.


Member Data Documentation

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
CompressibilityType CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mCompressibilityType [protected]

Either COMPRESSIBLE or INCOMPRESSIBLE

Definition at line 104 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::vector<c_matrix<double,DIM,DIM> > CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mDeformationGradientsForEachMechanicsElement [protected]

A vector of deformation gradients (each entry a matrix), one for each element in the mechanics mesh

Definition at line 174 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::string CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mDeformationOutputDirectory [protected]
template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
bool CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mHasBath [protected]

Whether the mesh has a bath (non-active) region or not. False by default.

Definition at line 140 of file CardiacElectroMechanicsProblem.hpp.

Referenced by CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::CardiacElectroMechanicsProblem().

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::vector<double> CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mInterpolatedCalciumConcs [protected]

A cache for the interpolated calcium concentrations from electrics to mechanics mesh. Memory is allocated within Initialise(). Filled in during Solve() and passed on to the mechanics solver

Definition at line 123 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::vector<double> CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mInterpolatedVoltages [protected]

A cache for the interpolated voltages from electrics to mechanics mesh. Memory is allocated within Initialise(). Filled in during Solve() and passed on to the mechanics solver

Definition at line 129 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
bool CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mIsWatchedLocation [protected]

Whether any location has been set to be watched (lots of output for that location

Definition at line 158 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::pair<unsigned, c_matrix<double,DIM,DIM> > CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mLastModifiedConductivity [protected]

A pair of (element_index, deformed_conductivity) for the last element on which the deformed conductivity sigma_def = F^{-1} sigma_undef F^{-T} has been computed. Used in rGetModifiedConductivityTensor().

Definition at line 179 of file CardiacElectroMechanicsProblem.hpp.

Referenced by CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::CardiacElectroMechanicsProblem().

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
bool CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mNoElectricsOutput [protected]

Whether to not write out voltages

Definition at line 152 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
unsigned CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mNumElecTimestepsPerMechTimestep [protected]

The number of electrics timesteps per mechanics timestep

Definition at line 117 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
unsigned CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mNumTimestepsToOutputDeformationGradientsAndStress [protected]

How often to print the deformation gradients and stress to file (if ever)

Definition at line 169 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::string CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mOutputDirectory [protected]

Output directory, relative to TEST_OUTPUT

Definition at line 146 of file CardiacElectroMechanicsProblem.hpp.

Referenced by CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::CardiacElectroMechanicsProblem().

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
AbstractCardiacMechanicsSolverInterface<DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpCardiacMechSolver [protected]

The mechanics solver - a pointer to the part that sees the cardiac mechanics interface bit. (Object pointed to is the same as with mpMechanicsSolver)

Definition at line 111 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
TetrahedralMesh<DIM,DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpElectricsMesh [protected]

The mesh for the electrics

Definition at line 132 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
AbstractCardiacProblem<DIM,DIM,ELEC_PROB_DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpElectricsProblem [protected]
template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
QuadraticMesh<DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpMechanicsMesh [protected]

The mesh for the mechanics

Definition at line 134 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
AbstractNonlinearElasticitySolver<DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpMechanicsSolver [protected]

The mechanics solver - a pointer to the part that sees the solid mechanics solver (Object pointed to is the same as with mpCardiacMechSolver)

Definition at line 114 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
FineCoarseMeshPair<DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpMeshPair [protected]

Class wrapping both meshes, useful for transferring information

Definition at line 143 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
ElectroMechanicsProblemDefinition<DIM>* CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpProblemDefinition [protected]

Object containing information about the problem to be solved

Definition at line 137 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
out_stream CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mpWatchedLocationFile [protected]

File where watched location info is written

Definition at line 166 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
std::vector<double> CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mStretchesForEachMechanicsElement [protected]

A vector of stretches (in the fibre direction), one for each element in the mechanics mesh

Definition at line 172 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
unsigned CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mWatchedElectricsNodeIndex [protected]

The node in the electrics mesh corresponding to the watched location

Definition at line 162 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
c_vector<double,DIM> CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mWatchedLocation [protected]

The watched location if there is one

Definition at line 160 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
unsigned CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mWatchedMechanicsNodeIndex [protected]

The node in the mechanics mesh corresponding to the watched location

Definition at line 164 of file CardiacElectroMechanicsProblem.hpp.

template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
bool CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::mWriteOutput [protected]
template<unsigned DIM, unsigned ELEC_PROB_DIM = 1>
const int CardiacElectroMechanicsProblem< DIM, ELEC_PROB_DIM >::WRITE_EVERY_NTH_TIME = 1 [static, protected]

when to write output

Definition at line 155 of file CardiacElectroMechanicsProblem.hpp.


The documentation for this class was generated from the following files: