27 #ifndef MONODOMAIN_FHN_DG_HPP_
28 #define MONODOMAIN_FHN_DG_HPP_
35 #include "../source/DUBValues.hpp"
36 #include "../source/DUB_FEM_handler.hpp"
37 #include "../source/assemble_DG.hpp"
38 #include "../source/face_handler_DG.hpp"
39 #include "../source/model_DG.hpp"
40 #include "../source/model_DG_t.hpp"
41 #include "../source/volume_handler_DG.hpp"
42 #include "source/core_model.hpp"
43 #include "source/geometry/mesh_handler.hpp"
44 #include "source/init.hpp"
45 #include "source/io/data_writer.hpp"
46 #include "source/numerics/bc_handler.hpp"
47 #include "source/numerics/linear_solver_handler.hpp"
48 #include "source/numerics/preconditioner_handler.hpp"
49 #include "source/numerics/tools.hpp"
53 namespace monodomain_fhn_DG
63 : lifex::utils::FunctionDirichlet()
68 value(
const dealii::Point<lifex::dim> &p,
69 const unsigned int = 0)
const override
72 return std::sin(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
73 std::exp(-5 * this->get_time());
75 return std::sin(2 * M_PI * p[0] + M_PI / 4) *
76 std::sin(2 * M_PI * p[1] + M_PI / 4) *
77 std::sin(2 * M_PI * p[2] + M_PI / 4) *
78 std::exp(-5 * this->get_time());
118 : lifex::Function<lifex::dim>()
130 value(
const dealii::Point<lifex::dim> &p,
131 const unsigned int = 0)
const override
134 return std::sin(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
135 std::exp(-5 * this->get_time()) *
138 (std::sin(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
139 std::exp(-5 * this->get_time()) -
141 (std::sin(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
142 std::exp(-5 * this->get_time()) -
146 return std::sin(2 * M_PI * p[0] + M_PI / 4) *
147 std::sin(2 * M_PI * p[1] + M_PI / 4) *
148 std::sin(2 * M_PI * p[2] + M_PI / 4) *
149 std::exp(-5 * this->get_time()) *
152 (std::sin(2 * M_PI * p[0] + M_PI / 4) *
153 std::sin(2 * M_PI * p[1] + M_PI / 4) *
154 std::sin(2 * M_PI * p[2] + M_PI / 4) *
155 std::exp(-5 * this->get_time()) -
157 (std::sin(2 * M_PI * p[0] + M_PI / 4) *
158 std::sin(2 * M_PI * p[1] + M_PI / 4) *
159 std::sin(2 * M_PI * p[2] + M_PI / 4) *
160 std::exp(-5 * this->get_time()) -
178 : lifex::Function<lifex::dim>()
184 value(
const dealii::Point<lifex::dim> &p,
185 const unsigned int = 0)
const override
189 (-2 * M_PI * std::sin(2 * M_PI * p[0]) *
190 std::cos(2 * M_PI * p[1]) *
191 std::exp(-5 * this->get_time()) * (std::abs(p[1]) < 1e-10) +
192 2 * M_PI * std::cos(2 * M_PI * p[0]) *
193 std::sin(2 * M_PI * p[1]) *
194 std::exp(-5 * this->get_time()) *
195 (std::abs(p[0] - 1) < 1e-10) +
196 2 * M_PI * std::sin(2 * M_PI * p[0]) *
197 std::cos(2 * M_PI * p[1]) *
198 std::exp(-5 * this->get_time()) *
199 (std::abs(p[1] - 1) < 1e-10) -
200 2 * M_PI * std::cos(2 * M_PI * p[0]) *
201 std::sin(2 * M_PI * p[1]) *
202 std::exp(-5 * this->get_time()) * (std::abs(p[0]) < 1e-10));
205 (2 * M_PI * std::cos(2 * M_PI * p[0] + M_PI / 4) *
206 std::sin(2 * M_PI * p[1] + M_PI / 4) *
207 std::sin(2 * M_PI * p[2] + M_PI / 4) *
208 std::exp(-5 * this->get_time()) *
209 (std::abs(p[0] - 1) < 1e-10) -
210 2 * M_PI * std::cos(2 * M_PI * p[0] + M_PI / 4) *
211 std::sin(2 * M_PI * p[1] + M_PI / 4) *
212 std::sin(2 * M_PI * p[2] + M_PI / 4) *
213 std::exp(-5 * this->get_time()) * (std::abs(p[0]) < 1e-10) +
214 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
215 std::cos(2 * M_PI * p[1] + M_PI / 4) *
216 std::sin(2 * M_PI * p[2] + M_PI / 4) *
217 std::exp(-5 * this->get_time()) *
218 (std::abs(p[1] - 1) < 1e-10) -
219 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
220 std::cos(2 * M_PI * p[1] + M_PI / 4) *
221 std::sin(2 * M_PI * p[2] + M_PI / 4) *
222 std::exp(-5 * this->get_time()) * (std::abs(p[1]) < 1e-10) +
223 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
224 std::sin(2 * M_PI * p[1] + M_PI / 4) *
225 std::cos(2 * M_PI * p[2] + M_PI / 4) *
226 std::exp(-5 * this->get_time()) *
227 (std::abs(p[2] - 1) < 1e-10) -
228 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
229 std::sin(2 * M_PI * p[1] + M_PI / 4) *
230 std::cos(2 * M_PI * p[2] + M_PI / 4) *
231 std::exp(-5 * this->get_time()) * (std::abs(p[2]) < 1e-10));
243 : lifex::Function<lifex::dim>()
248 value(
const dealii::Point<lifex::dim> &p,
249 const unsigned int component = 0)
const override
254 return 2 * M_PI * std::cos(2 * M_PI * p[0]) *
255 std::sin(2 * M_PI * p[1]) *
256 std::exp(-5 * this->get_time());
258 return 2 * M_PI * std::sin(2 * M_PI * p[0]) *
259 std::cos(2 * M_PI * p[1]) *
260 std::exp(-5 * this->get_time());
265 return 2 * M_PI * std::cos(2 * M_PI * p[0] + M_PI / 4) *
266 std::sin(2 * M_PI * p[1] + M_PI / 4) *
267 std::sin(2 * M_PI * p[2] + M_PI / 4) *
268 std::exp(-5 * this->get_time());
270 return 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
271 std::cos(2 * M_PI * p[1] + M_PI / 4) *
272 std::sin(2 * M_PI * p[2] + M_PI / 4) *
273 std::exp(-5 * this->get_time());
275 return 2 * M_PI * std::sin(2 * M_PI * p[0] + M_PI / 4) *
276 std::sin(2 * M_PI * p[1] + M_PI / 4) *
277 std::cos(2 * M_PI * p[2] + M_PI / 4) *
278 std::exp(-5 * this->get_time());
298 : lifex::utils::FunctionDirichlet()
305 value(
const dealii::Point<lifex::dim> &p,
306 const unsigned int = 0)
const override
310 std::sin(2 * M_PI * p[1]) * std::exp(-5 * this->get_time());
313 std::sin(2 * M_PI * p[1]) * std::sin(2 * M_PI * p[2]) *
314 std::exp(-5 * this->get_time());
333 : lifex::Function<lifex::dim>()
340 value(
const dealii::Point<lifex::dim> &p,
341 const unsigned int component = 0)
const override
347 std::cos(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
348 std::exp(-5 * this->get_time());
351 std::sin(2 * M_PI * p[0]) * std::cos(2 * M_PI * p[1]) *
352 std::exp(-5 * this->get_time());
358 std::cos(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
359 std::sin(2 * M_PI * p[2]) *
360 std::exp(-5 * this->get_time());
363 std::sin(2 * M_PI * p[0]) * std::cos(2 * M_PI * p[1]) *
364 std::sin(2 * M_PI * p[2]) *
365 std::exp(-5 * this->get_time());
368 std::sin(2 * M_PI * p[0]) * std::sin(2 * M_PI * p[1]) *
369 std::cos(2 * M_PI * p[2]) *
370 std::exp(-5 * this->get_time());
445 template <
class basis>
478 std::shared_ptr<lifex::utils::FunctionDirichlet>
w_ex;
480 std::shared_ptr<dealii::Function<lifex::dim>>
grad_w_ex;
516 template <
class basis>
521 this->linear_solver.declare_parameters(params);
522 this->preconditioner.declare_parameters(params);
525 params.enter_subsection(
"Mesh and space discretization");
527 params.declare_entry(
528 "Number of refinements",
530 dealii::Patterns::Integer(0),
531 "Number of global mesh refinement steps applied to initial grid.");
532 params.declare_entry(
"FE space degree",
534 dealii::Patterns::Integer(1),
535 "Degree of the FE space.");
537 params.leave_subsection();
539 params.enter_subsection(
"Discontinuous Galerkin");
541 params.declare_entry(
542 "Penalty coefficient",
544 dealii::Patterns::Double(-1, 1),
545 "Penalty coefficient in the Discontinuous Galerkin formulation.");
546 params.declare_entry(
547 "Stability coefficient",
549 dealii::Patterns::Double(0),
550 "Stabilization term in the Discontinuous Galerkin formulation.");
552 params.leave_subsection();
554 params.enter_subsection(
"Time solver");
556 params.declare_entry(
"Initial time",
558 dealii::Patterns::Double(0),
560 params.declare_entry(
"Final time",
562 dealii::Patterns::Double(0),
564 params.declare_entry(
"Time step",
566 dealii::Patterns::Double(0),
568 params.declare_entry(
"BDF order",
570 dealii::Patterns::Integer(1, 3),
571 "BDF order: 1, 2, 3.");
573 params.leave_subsection();
575 params.enter_subsection(
"Parameters of the model");
577 params.declare_entry(
"ChiM",
579 dealii::Patterns::Double(0),
580 "Surface-to-volume ratio of cells parameter.");
581 params.declare_entry(
"Cm",
583 dealii::Patterns::Double(0),
584 "Membrane capacity.");
585 params.declare_entry(
"Sigma",
587 dealii::Patterns::Double(0),
588 "Diffusion parameter in the principal directions.");
589 params.declare_entry(
592 dealii::Patterns::Double(0),
593 "Factor for the nonlinear reaction in Fitzhugh Nagumo model.");
594 params.declare_entry(
"epsilon",
596 dealii::Patterns::Double(0),
597 "Parameter for Fitzhugh Nagumo model.");
598 params.declare_entry(
"gamma",
600 dealii::Patterns::Double(0),
601 "Parameter for Fitzhugh Nagumo model.");
602 params.declare_entry(
"a",
604 dealii::Patterns::Double(0),
605 "Parameter for Fitzhugh Nagumo model.");
607 params.leave_subsection();
610 template <
class basis>
617 this->linear_solver.parse_parameters(params);
618 this->preconditioner.parse_parameters(params);
621 params.enter_subsection(
"Mesh and space discretization");
622 this->prm_n_refinements = params.get_integer(
"Number of refinements");
623 this->prm_fe_degree = params.get_integer(
"FE space degree");
624 params.leave_subsection();
626 params.enter_subsection(
"Discontinuous Galerkin");
627 this->prm_penalty_coeff = params.get_double(
"Penalty coefficient");
629 this->prm_penalty_coeff == 1. || this->prm_penalty_coeff == 0. ||
630 this->prm_penalty_coeff == -1.,
631 dealii::StandardExceptions::ExcMessage(
632 "Penalty coefficient must be 1 (SIP method) or 0 (IIP method) "
633 "or -1 (NIP method)."));
635 this->prm_stability_coeff = params.get_double(
"Stability coefficient");
636 params.leave_subsection();
638 params.enter_subsection(
"Time solver");
639 this->prm_time_init = params.get_double(
"Initial time");
640 this->prm_time_final = params.get_double(
"Final time");
641 AssertThrow(this->prm_time_final > this->prm_time_init,
642 dealii::StandardExceptions::ExcMessage(
643 "Final time must be greater than initial time."));
645 this->prm_time_step = params.get_double(
"Time step");
646 this->prm_bdf_order = params.get_integer(
"BDF order");
647 params.leave_subsection();
649 params.enter_subsection(
"Parameters of the model");
650 ChiM = params.get_double(
"ChiM");
651 Cm = params.get_double(
"Cm");
652 Sigma = params.get_double(
"Sigma");
653 kappa = params.get_double(
"kappa");
654 epsilon = params.get_double(
"epsilon");
655 gamma = params.get_double(
"gamma");
656 a = params.get_double(
"a");
657 params.leave_subsection();
660 template <
class basis>
665 this->setup_system();
667 this->initialize_solution(this->solution_owned, this->solution);
668 this->initialize_solution(this->solution_ex_owned, this->solution_ex);
669 this->initialize_solution(this->solution_owned_w, this->solution_w);
670 this->initialize_solution(this->solution_ex_owned_w, this->solution_ex_w);
672 time_initialization();
674 while (this->time < this->prm_time_final)
676 this->time += this->prm_time_step;
677 ++this->timestep_number;
679 pcout <<
"Time step " << std::setw(6) << this->timestep_number
680 <<
" at t = " << std::setw(8) << std::fixed
681 << std::setprecision(6) << this->time << std::endl;
684 this->solution_ext = this->bdf_handler.get_sol_extrapolation();
686 this->assemble_system();
689 this->solution_owned = this->solution_ext;
690 this->solve_system();
692 this->intermediate_error_print(this->solution_owned,
693 this->solution_ex_owned,
696 this->intermediate_error_print(this->solution_owned_w,
697 this->solution_ex_owned_w,
703 this->compute_errors(this->solution_owned,
704 this->solution_ex_owned,
708 this->compute_errors(this->solution_owned_w,
709 this->solution_ex_owned_w,
715 this->solution_ex = this->solution_ex_owned;
716 this->conversion_to_fem(this->solution_ex);
717 this->solution = this->solution_owned;
718 this->conversion_to_fem(this->solution);
719 this->output_results();
722 template <
class basis>
726 this->u_ex->set_time(this->time);
727 this->f_ex->set_time(this->time);
728 this->g_n->set_time(this->time);
729 this->grad_u_ex->set_time(this->time);
731 w_ex->set_time(this->time);
732 grad_w_ex->set_time(this->time);
734 this->bdf_handler.time_advance(this->solution_owned,
true);
735 this->solution_bdf = this->bdf_handler.get_sol_bdf();
736 bdf_handler_w.time_advance(solution_owned_w,
true);
737 solution_bdf_w = this->bdf_handler_w.get_sol_bdf();
740 this->discretize_analytical_solution(this->u_ex, this->solution_ex_owned);
741 this->discretize_analytical_solution(this->w_ex, this->solution_ex_owned_w);
744 template <
class basis>
748 this->u_ex = std::make_shared<monodomain_fhn_DG::ExactSolution>();
749 this->grad_u_ex = std::make_shared<monodomain_fhn_DG::GradExactSolution>();
750 this->f_ex = std::make_shared<monodomain_fhn_DG::RightHandSide>(
751 ChiM, Sigma, Cm, kappa, epsilon, gamma, a);
752 this->g_n = std::make_shared<monodomain_fhn_DG::BCNeumann>(Sigma);
753 w_ex = std::make_shared<monodomain_fhn_DG::ExactSolution_w>(epsilon, gamma);
755 std::make_shared<monodomain_fhn_DG::GradExactSolution_w>(epsilon, gamma);
757 this->u_ex->set_time(this->prm_time_init);
758 this->discretize_analytical_solution(this->u_ex, this->solution_ex_owned);
759 this->solution_ex = this->solution_ex_owned;
760 this->solution = this->solution_owned = this->solution_ex_owned;
762 w_ex->set_time(this->prm_time_init);
763 this->discretize_analytical_solution(this->w_ex, this->solution_ex_owned_w);
764 solution_ex_w = solution_ex_owned_w;
765 solution_w = solution_owned_w = solution_ex_owned_w;
767 const std::vector<lifex::LinAlg::MPI::Vector> sol_init(
768 this->prm_bdf_order, this->solution_owned);
770 this->bdf_handler.initialize(this->prm_bdf_order, sol_init);
772 const std::vector<lifex::LinAlg::MPI::Vector> sol_init_w(
773 this->prm_bdf_order, solution_owned_w);
775 bdf_handler_w.initialize(this->prm_bdf_order, sol_init_w);
778 template <
class basis>
782 const double &alpha_bdf = this->bdf_handler.get_alpha();
784 solution_owned_w *= -gamma;
785 solution_owned_w.add(1, this->solution_owned);
786 solution_owned_w *= epsilon;
787 solution_owned_w.add(1 / this->prm_time_step, this->solution_bdf_w);
788 solution_owned_w *= this->prm_time_step / alpha_bdf;
790 solution_w = solution_owned_w;
802 dealii::FullMatrix<double> C(this->dofs_per_cell, this->dofs_per_cell);
803 dealii::Vector<double> cell_rhs(this->dofs_per_cell);
804 dealii::Vector<double> cell_rhs_edge(this->dofs_per_cell);
805 dealii::Vector<double> u0_rhs(this->dofs_per_cell);
806 dealii::Vector<double> w0_rhs(this->dofs_per_cell);
807 std::vector<lifex::types::global_dof_index> dof_indices(
808 this->dofs_per_cell);
810 dealii::IndexSet owned_dofs = this->dof_handler.locally_owned_dofs();
815 if (this->timestep_number == 1)
817 this->matrix_t0.reinit(this->matrix);
820 dealii::FullMatrix<double> V(this->dofs_per_cell, this->dofs_per_cell);
822 dealii::FullMatrix<double> M(this->dofs_per_cell, this->dofs_per_cell);
824 dealii::FullMatrix<double> SC(this->dofs_per_cell, this->dofs_per_cell);
826 dealii::FullMatrix<double> IC(this->dofs_per_cell, this->dofs_per_cell);
828 dealii::FullMatrix<double> IC_t(this->dofs_per_cell,
829 this->dofs_per_cell);
831 dealii::FullMatrix<double> IN(this->dofs_per_cell, this->dofs_per_cell);
833 dealii::FullMatrix<double> IN_t(this->dofs_per_cell,
834 this->dofs_per_cell);
836 dealii::FullMatrix<double> SN(this->dofs_per_cell, this->dofs_per_cell);
838 for (
const auto &cell : this->dof_handler.active_cell_iterators())
840 if (cell->is_locally_owned())
842 this->assemble->reinit(cell);
843 dof_indices = this->dof_handler.get_dof_indices(cell);
845 V = this->assemble->local_V();
847 M = this->assemble->local_M();
848 M /= this->prm_time_step;
853 this->matrix_t0.add(dof_indices, V);
854 this->matrix_t0.add(dof_indices, M);
856 for (
const auto &edge : cell->face_indices())
858 this->assemble->reinit(cell, edge);
859 std::vector<lifex::types::global_dof_index>
860 dof_indices_neigh(this->dofs_per_cell);
862 if (!cell->at_boundary(edge))
865 this->assemble->local_SC(this->prm_stability_coeff);
868 this->assemble->local_IC(this->prm_penalty_coeff);
871 this->matrix_t0.add(dof_indices, SC);
872 this->matrix_t0.add(dof_indices, IC);
873 this->matrix_t0.add(dof_indices, IC_t);
875 const auto neighcell = cell->neighbor(edge);
877 this->dof_handler.get_dof_indices(neighcell);
880 this->assemble->local_IN(this->prm_penalty_coeff);
884 this->assemble->local_SN(this->prm_stability_coeff);
887 this->matrix_t0.add(dof_indices, dof_indices_neigh, IN);
888 this->matrix_t0.add(dof_indices_neigh,
891 this->matrix_t0.add(dof_indices, dof_indices_neigh, SN);
896 this->matrix_t0.compress(lifex::VectorOperation::add);
901 this->matrix.copy_from(this->matrix_t0);
903 for (
const auto &cell : this->dof_handler.active_cell_iterators())
905 if (cell->is_locally_owned())
907 this->assemble->reinit(cell);
908 dof_indices = this->dof_handler.get_dof_indices(cell);
910 C = this->assemble->local_non_linear_fitzhugh(this->solution_owned,
915 cell_rhs = this->assemble->local_rhs(this->f_ex);
918 this->assemble->local_u0_M_rhs(this->solution_bdf, dof_indices);
919 u0_rhs *= Cm * ChiM / this->prm_time_step;
922 this->assemble->local_w0_M_rhs(solution_owned_w, dof_indices);
925 if (cell->at_boundary())
927 for (
const auto &edge : cell->face_indices())
929 if (cell->at_boundary(edge))
931 this->assemble->reinit(cell, edge);
933 this->assemble->local_rhs_edge_neumann(this->g_n);
934 this->rhs.add(dof_indices, cell_rhs_edge);
939 this->matrix.add(dof_indices, C);
940 this->rhs.add(dof_indices, cell_rhs);
941 this->rhs.add(dof_indices, u0_rhs);
942 this->rhs.add(dof_indices, w0_rhs);
946 this->matrix.compress(lifex::VectorOperation::add);
947 this->rhs.compress(lifex::VectorOperation::add);
Class to solve the monodomain equation with Fitzhugh-Nagumo ionic model for the cardiac electrophysio...
lifex::LinAlg::MPI::Vector solution_bdf_w
BDF solution, with ghost entries.
lifex::LinAlg::MPI::Vector solution_ex_owned_w
Solution exact gating variable, without ghost entries.
double kappa
Factor for the nonlinear reaction in Fitzhugh Nagumo model.
double Cm
Membrane capacity.
std::shared_ptr< dealii::Function< lifex::dim > > grad_w_ex
dealii::Pointer to exact gradient solution Function gating variable
double gamma
ODE parameter.
std::shared_ptr< lifex::utils::FunctionDirichlet > w_ex
dealii::Pointer to exact solution function gating variable.
virtual void declare_parameters(lifex::ParamHandler ¶ms) const override
Override for declaration of additional parameters.
lifex::LinAlg::MPI::Vector solution_ex_w
Solution exact gating variable, without ghost entries.
void run() override
Override for the simulation run.
lifex::LinAlg::MPI::Vector solution_owned_w
Solution gating variable, without ghost entries.
void time_initialization() override
Override to initialize both u and w.
lifex::utils::BDFHandler< lifex::LinAlg::MPI::Vector > bdf_handler_w
BDF time advancing handler.
void update_time() override
Override to update time for both u and w.
lifex::LinAlg::MPI::Vector solution_w
Solution gating variable, with ghost entries.
lifex::LinAlg::MPI::Vector solution_ext_w
BDF extrapolated solution, with ghost entries.
double epsilon
ODE parameter.
double Sigma
Diffusion scalar parameter.
void assemble_system() override
Assembly of the Monodomain system.
double ChiM
Monodomain equation parameter.
virtual void parse_parameters(lifex::ParamHandler ¶ms) override
Override to parse additional parameters.
lifex::LinAlg::MPI::SparseMatrix matrix_t0
Component of the system matrix that does not depend on time.
Neumann boundary condition of the trans-membrane potential.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int=0) const override
Evaluate the Neumann boundary condition function in a point.
BCNeumann(double Sigma)
Constrcutor.
double Sigma
Diffusion scalar parameter.
Exact solution of the gating variable.
double epsilon
Parameter ODE.
ExactSolution_w(double epsilon, double gamma)
Constructor.
double gamma
Parameter ODE.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int=0) const override
Evaluate the exact solution in a point.
Exact solution of the trans-membrane potential.
ExactSolution()
Constructor.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int=0) const override
Evaluate the exact solution in a point.
Gradient of the gating variable.
GradExactSolution_w(double epsilon, double gamma)
Constructor.
double gamma
Parameter ODE.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int component=0) const override
Evaluate the gradient of the exact solution in a point.
double epsilon
Parameter ODE.
Gradient of the trans-membrane potential.
GradExactSolution()
Constructor.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int component=0) const override
Evaluate the gradient of the exact solution in a point.
Source term: applied current.
double epsilon
Parameter ODE.
RightHandSide(double ChiM, double Sigma, double Cm, double kappa, double epsilon, double gamma, double a)
Constructor.
double gamma
Parameter ODE.
double Cm
Membrane capacity.
double kappa
Factor for the nonlinear reaction in Fitzhugh Nagumo model.
double ChiM
Parameter monodomain equation.
virtual double value(const dealii::Point< lifex::dim > &p, const unsigned int=0) const override
Evaluate the source term in a point.
double Sigma
Diffusion scalar parameter.
Class representing the resolution of time-dependent problems using discontinuous Galerkin methods.