CEPS  24.01
Cardiac ElectroPhysiology Simulator
LaplacianProblem.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 
34 : AbstractStaticPdeProblem (g,p), m_k(k)
35 {
36  setProblemName("Laplacian");
37 
38  if (m_parameters)
40 }
41 
43 {
44 }
45 
46 void
48 {
49  CepsVector<CepsString> words = ceps::split(m_parameters->getString("stiffness tensor",""));
50  if (not words.empty())
51  m_k = ceps::toMathTensor(words);
52  return;
53 }
54 
55 void
57 {
58  // A single spatial unknown defined everywhere
59  addUnknown("u");
60 }
61 
64 {
65  return m_k;
66 }
67 
68 void
70 {
71 
72  if (ceps::isProfiling())
73  getProfiler()->start("whole","solving the PDE");
74 
76 
78  LaplacianSolver solver(this);
79 
80  solver.solve();
81 
82  if (hasAnalyticSolution())
83  m_errors = solver.getErrors();
84 
85  if (ceps::isProfiling())
86  getProfiler()->stop("whole");
87 
88 }
89 
90 
91 
92 
93 
#define CEPS_SEPARATOR
Writes a separator in the debug log and in the terminal.
Eigen::Matrix< CepsScalar, 3, 3 > CepsMathTensor
Tensor, eigen format.
Definition: CepsTypes.hpp:137
std::vector< _Type, _Alloc > CepsVector
C++ vector.
Definition: CepsTypes.hpp:155
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.
InputParameters * m_parameters
Input file data.
Astract Problem which does not depend on time.
void initializeEquation() override
Initializes equations (unknowns, bc, source term) and creates the spatial discretization This method ...
CepsArray2< CepsArray3< CepsReal > > m_errors
Will store Linf, L1 and L2 relative errors.
void solve() override
Solves the whole PDE in time.
CepsArray2< CepsArray3< CepsReal > > getErrors() const
Gets the currently computed errors. First index selects absolute(0) orrelative(1) second index is L-i...
Profiler * getProfiler() const
Access to profiler.
Definition: CepsObject.cpp:46
Encapsulates all the geometrical data.
Definition: Geometry.hpp:50
Reads and stores simulation configuration.
CepsString getString(const keyType &key) const
Reads a CepsString from configuration.
LaplacianProblem(Geometry *g, InputParameters *p=nullptr, const CepsMathTensor &k=CepsMathTensor::Identity())
Constructor from geometry and optional input file.
CepsMathTensor m_k
Diffusion tensor.
void run() override
Run does nothing. The tests call directly a LaplacianSolver solve method.
~LaplacianProblem() override
Destructor.
void setupWithParameters(InputParameters *p) override
Sets the diffusion tensor.
CepsMathTensor getDiffusionTensor(Unknown *u=nullptr) const
Diffusion tensor.
void defineUnknowns() override
Lists the unknowns of the problem (one here)
Solve laplacian equation with backward Euler, constant time step, using Finite Elements.
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
CepsMathTensor toMathTensor(const CepsVector< CepsString > &vec)
Cast a CepsVector of CepsString to CepsMathTensor.
Definition: CepsString.cpp:237
CepsVector< CepsString > split(const CepsString &s, const CepsString &delimiters=CepsString(" \t"))
Splits a string using mulitple delimiters in a single string.
Definition: CepsString.cpp:38
CepsBool isProfiling()
Check if we are currently profiling on the master proc (always false on slave procs).
Definition: CepsFlags.cpp:257