svMultiPhysics
Loading...
Searching...
No Matches
ActiveStressNashPanfilov.h
1// SPDX-FileCopyrightText: Copyright (c) Stanford University, The Regents of the
2// University of California, and others. SPDX-License-Identifier: BSD-3-Clause
3
4#ifndef ACTIVE_STRESS_NASH_PANFILOV_H
5#define ACTIVE_STRESS_NASH_PANFILOV_H
6
7#include "ActiveStressODE.h"
8
9/**
10 * @brief Nash-Panfilov active stress model.
11 *
12 * This class implements the Nash-Panfilov active stress model [1], with the
13 * modifications introduced by Goktepe and Kuhl [2].
14 *
15 * The model equations are the following:
16 * @f[ \begin{aligned}
17 * \dv{\Tact}{t} &= \varepsilon(\calcium)(
18 * \eta_\text{T} (\calcium - \calcium_\text{rest}) - \Tact)\;, \\
19 * \varepsilon(\calcium) &=
20 * \varepsilon_0 + (\varepsilon_i - \varepsilon_0)
21 * \exp(-\exp(-\xi_T (\calcium - \calcium_\text{crit})))\;,
22 * \end{aligned} @f]
23 * where @f$\eta_\text{T}@f$, @f$\calcium_\text{rest}@f$,
24 * @f$\calcium_\text{crit}@f$, @f$\varepsilon_0@f$, @f$\varepsilon_i@f$ and
25 * @f$\xi_T@f$ are user-defined model parameters. The function
26 * @f$\varepsilon(\calcium)@f$ is a sigmoidal-shaped calcium-dependent time
27 * constant (see Figure 3 in [2] for more details).
28 *
29 * @note The published formulations [1,2] are driven by transmembrane
30 * potential. This implementation substitutes intracellular calcium, with
31 * @f$\eta_T@f$, @f$\calcium_\text{rest}@f$, @f$\xi_T@f$, and
32 * @f$\calcium_\text{crit}@f$ corresponding to @f$k_\sigma@f$,
33 * @f$\Phi_r@f$, @f$\xi@f$, and @f$\bar{\Phi}@f$ in [2], respectively.
34 *
35 * @note The sensitivity of the model to calcium is controlled by the paramter
36 * @f$\eta_\text{T}@f$, which has the same units of active tension over calcium.
37 * Therefore, if the ionic model providing the calcium is phenomenological (see
38 * @ref IonicModel) and calcium is non-dimensional, this parameter may need to
39 * be rescaled as well. Similar considerations apply to @f$\xi_T@f$.
40 *
41 * **References**:
42 * 1. [Nash, Panfilov (2004)](https://doi.org/10.1016/j.pbiomolbio.2004.01.016)
43 * 2. [Goktepe, Kuhl (2009)](https://doi.org/10.1007/s00466-009-0434-z)
44 */
46public:
47 /// Model label.
48 static inline const std::string label = "NashPanfilov";
49
50 /// Model parameters class.
52 public:
54 constexpr bool required = true;
55
56 add_parameter("epsilon_0", 1.0, required);
57 add_parameter("epsilon_i", 1.0, required);
58 add_parameter("xi_T", 1.0, required);
59 add_parameter("calcium_rest", 1.0, required);
60 add_parameter("calcium_crit", 1.0, required);
61 add_parameter("eta_T", 1.0, required);
62 }
63 };
64
65 /**
66 * @brief Constructor.
67 */
69 : ActiveStressODE(/* n_state_variables = */ 1,
70 /* needs_fiber_stretch = */ false,
71 /* needs_fiber_stretch_rate = */ false) {}
72
73 /**
74 * @brief Construct an instance of model parameters.
75 */
76 virtual std::unique_ptr<ActiveStressModelParameters>
77 get_parameters() const override {
78 return std::make_unique<Parameters>();
79 }
80
81protected:
82 /**
83 * @brief Read model parameters from a parameter object.
84 */
86 const ActiveStressModelParameters &params) override;
87
88 /**
89 * @brief Distribute model parameters to all parallel processes.
90 */
91 virtual void distribute_model_specific_parameters(const CmMod &cm_mod,
92 const cmType &cm) override;
93
94 /**
95 * @brief Initialize the state vector for a single node.
96 *
97 * @param[out] state State vector for a single node, to be initialized by
98 * this function.
99 */
100 virtual void init_local(Vector<double> &state) const override;
101
102 /**
103 * @brief Compute the rate of change in the state variables.
104 */
105 virtual Vector<double> getf(const double t, const Vector<double> &state,
106 const double calcium, const double fiber_stretch,
107 const double fiber_stretch_rate) const override;
108
109 /**
110 * @brief Compute the active tension for a single node.
111 */
112 virtual double
114 const double fiber_stretch) const override;
115
116 /// @name Model parameters.
117 /// @{
118
119 /// Minimum time constant @f$\varepsilon_0@f$. The unit of measure for this
120 /// parameter must be the inverse of the unit of measure for time.
121 double epsilon_0;
122
123 /// Maximum time constant @f$\varepsilon_i@f$. The unit of measure for this
124 /// parameter must be the inverse of the unit of measure for time.
125 double epsilon_i;
126
127 /// Sigmoidal function steepness @f$\xi_T@f$. The unit of measure for this
128 /// parameter must be the inverse of the unit of measure for calcium
129 /// concentration.
130 double xi_T;
131
132 /// Resting calcium value. Active tension will increase if calcium is above
133 /// this value.
135
136 /// Critical calcium value, i.e. the threshold value for switching between
137 /// minimum and maximum time constant.
139
140 /// @f$\eta_T@f$. The unit of measure for this parameter must be the ratio of
141 /// the unit for tension and the unit for calcium concentration.
142 double eta_T;
143
144 /// @}
145};
146
147#endif
Parameters for a generic active stress model.
Definition Parameters.h:1444
void add_parameter(const std::string &label, double default_value, bool required)
Add a new parameter to this object.
Definition Parameters.h:1490
Model parameters class.
Definition ActiveStressNashPanfilov.h:51
Nash-Panfilov active stress model.
Definition ActiveStressNashPanfilov.h:45
double calcium_crit
Definition ActiveStressNashPanfilov.h:138
static const std::string label
Model label.
Definition ActiveStressNashPanfilov.h:48
double epsilon_0
Definition ActiveStressNashPanfilov.h:121
double eta_T
Definition ActiveStressNashPanfilov.h:142
virtual double compute_active_tension_local(const Vector< double > &state, const double fiber_stretch) const override
Compute the active tension for a single node.
Definition ActiveStressNashPanfilov.cpp:49
virtual void distribute_model_specific_parameters(const CmMod &cm_mod, const cmType &cm) override
Distribute model parameters to all parallel processes.
Definition ActiveStressNashPanfilov.cpp:18
double epsilon_i
Definition ActiveStressNashPanfilov.h:125
double calcium_rest
Definition ActiveStressNashPanfilov.h:134
virtual void read_model_specific_parameters(const ActiveStressModelParameters &params) override
Read model parameters from a parameter object.
Definition ActiveStressNashPanfilov.cpp:6
virtual void init_local(Vector< double > &state) const override
Initialize the state vector for a single node.
Definition ActiveStressNashPanfilov.cpp:30
double xi_T
Definition ActiveStressNashPanfilov.h:130
virtual Vector< double > getf(const double t, const Vector< double > &state, const double calcium, const double fiber_stretch, const double fiber_stretch_rate) const override
Compute the rate of change in the state variables.
Definition ActiveStressNashPanfilov.cpp:35
virtual std::unique_ptr< ActiveStressModelParameters > get_parameters() const override
Construct an instance of model parameters.
Definition ActiveStressNashPanfilov.h:77
ActiveStressNashPanfilov()
Constructor.
Definition ActiveStressNashPanfilov.h:68
Model parameters class.
Definition ActiveStressODE.h:82
Abstract ODE-based active stress model.
Definition ActiveStressODE.h:51
The CmMod class duplicates the data structures in the Fortran CMMOD module defined in COMU....
Definition CmMod.h:36
The Vector template class is used for storing int and double data.
Definition Vector.h:26
The cmType class stores data and defines methods used for mpi communication.
Definition CmMod.h:56