CEPS  24.01
Cardiac ElectroPhysiology Simulator
BidomainProblem.cpp
Go to the documentation of this file.
1 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2  This file is part of CEPS.
3 
4  CEPS is free software: you can redistribute it and/or modify
5  it under the terms of the GNU General Public License as published by
6  the Free Software Foundation, either version 3 of the License, or
7  (at your option) any later version.
8 
9  CEPS is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  GNU General Public License for more details.
13 
14  You should have received a copy of the GNU General Public License
15  along with CEPS (see file LICENSE at root of project).
16  If not, see <https://www.gnu.org/licenses/>.
17 
18 
19  Copyright 2019-2024 Inria, Universite de Bordeaux
20 
21  Authors, in alphabetical order:
22 
23  Pierre-Elliott BECUE, Florian CARO, Yves COUDIERE(*), Andjela DAVIDOVIC,
24  Charlie DOUANLA-LONTSI, Marc FUENTES, Mehdi JUHOOR, Michael LEGUEBE(*),
25  Pauline MIGERDITICHAN, Valentin PANNETIER(*), Nejib ZEMZEMI.
26  * : currently active authors
27 
28 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
32 
33 
34 
37  : CardiacProblem(g,params)
38 {
39  setProblemName("Bidomain");
40 }
41 
42 void
44 {
48 }
49 
52 {
53  return {getTMVUnknown()};
54 }
55 
58 {
59  return {getTMVUnknown(), getUeUnknown()};
60 }
61 
62 Unknown*
64 {
66 }
67 
68 Unknown*
70 {
72 }
73 
74 void
76 {
78  // vm->getLocalData();
79  // CepsReal v = 0.;
80  // if (ceps::isMaster())
81  // v = (*vm)[0];
82  // MPI_Bcast(&v,1,CEPS_MPI_REAL,0,ceps::getCommunicator());
83  // for (auto toParse: {m_discr->getOwnedDofs(),m_discr->getHaloDofs()})
84  // for (DegreeOfFreedom* dof: toParse)
85  // (*vm)[dof->getGlobalIndex()] = v;
86  // vm->releaseLocalData();
87 }
88 
89 void
91 {
92  if (ceps::isProfiling())
93  getProfiler()->start("whole","solving the bidomain problem");
94 
96 
97  BidomainSolver solver(this);
98 
99  solver.solve();
100 
101  if (hasAnalyticSolution())
102  m_errors = solver.getErrors();
103 
104  if (ceps::isProfiling())
105  getProfiler()->stop("whole");
106 
107 }
108 
109 
110 
111 
std::vector< _Type, _Alloc > CepsVector
C++ vector.
Definition: CepsTypes.hpp:155
std::shared_ptr< DistributedHaloVector > DHVecPtr
Typedef for pointer on Distributed Halo CepsVector.
CepsBool hasAnalyticSolution() const
Tells if there is an analytic or reference solution.
void setProblemName(const CepsString &name)
Set the name of the problem.
void addUnknown(const CepsString &label, CepsSet< CepsAttribute > attrs={}, CepsLocationFlag flag=CepsLocationFlag::Point, const CepsString &unit="")
Register a new unknown.
void addUnknownInteraction(CepsString label1, CepsString label2, CepsSet< CepsAttribute > attrs={})
Register interaction between unknowns. Also sets the interaction within Unknown instances label1 and ...
Unknown * getUnknown(const CepsString &label) const
Get an unknown by its name.
CepsArray2< CepsArray3< CepsArray3< CepsReal > > > m_errors
Will store Linf, L1 and L2 relative errors.
CepsArray2< CepsArray3< CepsArray3< CepsReal > > > getErrors() const
Gets the currently computed errors. First index selects absolute(0) or relative(1) second index selec...
void defineUnknowns() override
Transmembrane voltage and extracellular potential.
CepsVector< Unknown * > getCardiacUnknowns() const override
Returns a vector containing all unknowns that are cardiac unknowns (eg. vm, ui or ue)
Unknown * getUeUnknown() const
Link to the single unknown of the problem.
void run() override
Run the simulation.
Unknown * getTMVUnknown() const
Link to the single unknown of the problem.
void getInitialCondition(DHVecPtr v) const override
asks each ionic model to fill the parts of the Vm vector with its initial value, fill ue with same va...
BidomainProblem(Geometry *g, InputParameters *=nullptr)
Constructor with input strings and geometry.
CepsVector< Unknown * > getTMVUnknowns() const override
Returns a vector containing all unknowns that are a TMV (especially useful for bilayer)
Solves bidomain problem with FBE, SBDF RK or CN schemes.
A abstract class that regroups common parameters of cardiac problems.
void getInitialCondition(DHVecPtr v) const override
Zero + asks each ionic model to fill the parts of the Vm vector with its initial value.
const CepsSet< CepsAttribute > & getTissueAttributes() const
All attributes that localize tissue.
void initializeEquation() override
Initializes all the elements of the PDE from options.
void solve() override
Performs all iterations of the PDE solver.
Profiler * getProfiler() const
Access to profiler.
Definition: CepsObject.cpp:46
Encapsulates all the geometrical data.
Definition: Geometry.hpp:50
Reads and stores simulation configuration.
void stop(CepsString lbl)
Stops the measure of a labeled chronometer.
void start(CepsString lbl, CepsString dspl="")
Creates or continue a labeled chronometer.
A class used to defined an unknown of a PDE problem The unknown can be defined on a specific region,...
Definition: Unknown.hpp:45
CepsBool isProfiling()
Check if we are currently profiling on the master proc (always false on slave procs).
Definition: CepsFlags.cpp:257
static constexpr const char * ue
Extracellular and extracardiac potential.
static constexpr const char * vm
Transmembrane voltage.