62 "Bidomain", Bidomain::create,
63 "Bidomain model of cardiac electrophysiology with 3D diffusion.");
80 std::string vCellModel;
81 m_session->LoadSolverInfo(
"CELLMODEL", vCellModel,
"");
83 ASSERTL0(vCellModel !=
"",
"Cell Model not specified.");
94 std::string varName[3] = {
"AnisotropicConductivityX",
95 "AnisotropicConductivityY",
96 "AnisotropicConductivityZ"};
98 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
99 m_session->DefinesFunction(
"ExtracellularConductivity"))
118 m_session->GetFunction(
"IntracellularConductivity", varName[i]);
120 m_session->GetFunction(
"ExtracellularConductivity", varName[i]);
121 for (
int j = 0; j < nq; j++)
123 tmp1[i][j] = ifunc1->Evaluate(x0[j], x1[j], x2[j], 0.0);
124 tmp2[i][j] = ifunc2->Evaluate(x0[j], x1[j], x2[j], 0.0);
132 if (
m_session->DefinesParameter(
"StimulusDuration"))
135 "Stimulus function not defined.");
147 if (x.first ==
"CheckpointCellModel")
149 std::shared_ptr<FilterCheckpointCellModel> c =
150 std::dynamic_pointer_cast<FilterCheckpointCellModel>(x.second);
180 int nvariables = inarray.size();
191 for (
int i = 0; i < nvariables; ++i)
196 Vmath::Vcopy(nq, &inarray[i][0], 1, &outarray[i][0], 1);
207 m_fields[i]->PhysDeriv(inarray[1], ggrad0);
209 m_fields[i]->PhysDeriv(0, ggrad0, ggrad0);
211 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
212 m_session->DefinesFunction(
"ExtracellularConductivity"))
228 m_fields[i]->UpdateCoeffs(), factors);
233 outarray[i] =
m_fields[i]->GetPhys();
239 m_fields[i]->PhysDeriv(inarray[1], ggrad0, ggrad1);
241 m_fields[i]->PhysDeriv(0, ggrad0, ggrad0);
242 m_fields[i]->PhysDeriv(1, ggrad1, ggrad1);
244 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
245 m_session->DefinesFunction(
"ExtracellularConductivity"))
263 m_fields[i]->UpdateCoeffs(), factors,
269 outarray[i] =
m_fields[i]->GetPhys();
275 m_fields[i]->PhysDeriv(inarray[1], ggrad0, ggrad1, ggrad2);
277 m_fields[i]->PhysDeriv(0, ggrad0, ggrad0);
278 m_fields[i]->PhysDeriv(1, ggrad1, ggrad1);
279 m_fields[i]->PhysDeriv(2, ggrad2, ggrad2);
281 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
282 m_session->DefinesFunction(
"ExtracellularConductivity"))
303 m_fields[i]->UpdateCoeffs(), factors,
309 outarray[i] =
m_fields[i]->GetPhys();
321 m_fields[i]->PhysDeriv(0, grad0, grad0);
323 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
324 m_session->DefinesFunction(
"ExtracellularConductivity"))
332 (-1.0 *
m_session->GetParameter(
"sigmaix")) /
339 m_fields[i]->UpdateCoeffs(), factors);
344 outarray[i] =
m_fields[i]->GetPhys();
352 m_fields[i]->PhysDeriv(0, grad0, grad0);
353 m_fields[i]->PhysDeriv(1, grad1, grad1);
355 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
356 m_session->DefinesFunction(
"ExtracellularConductivity"))
369 m_fields[i]->UpdateCoeffs(), factors,
375 outarray[i] =
m_fields[i]->GetPhys();
384 m_fields[i]->PhysDeriv(0, grad0, grad0);
385 m_fields[i]->PhysDeriv(1, grad1, grad1);
386 m_fields[i]->PhysDeriv(2, grad2, grad2);
388 if (
m_session->DefinesFunction(
"IntracellularConductivity") &&
389 m_session->DefinesFunction(
"ExtracellularConductivity"))
405 m_fields[i]->UpdateCoeffs(), factors,
411 outarray[i] =
m_fields[i]->GetPhys();
422 m_cell->TimeIntegrate(inarray, outarray, time);
435 ifunc->Evaluate(x0, x1, x2, time, result);
437 Vmath::Vadd(nq, outarray[0], 1, result, 1, outarray[0], 1);
443 bool dumpInitialConditions,
459 ASSERTL0(
false,
"Update the generate summary");
529 m_cell->GenerateSummary(s);
#define ASSERTL0(condition, msg)
void DoImplicitSolve(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, NekDouble time, NekDouble lambda)
Solve for the diffusion term.
Array< OneD, Array< OneD, NekDouble > > tmp3
Array< OneD, Array< OneD, NekDouble > > tmp2
StdRegions::VarCoeffMap m_vardiffi
Array< OneD, Array< OneD, NekDouble > > tmp1
virtual ~Bidomain()
Desctructor.
CellModelSharedPtr m_cell
Cell model.
virtual void v_SetInitialConditions(NekDouble initialtime, bool dumpInitialConditions, const int domain)
Sets a custom initial condition.
StdRegions::VarCoeffMap m_vardiffie
NekDouble m_stimDuration
Stimulus current.
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble >> &inarray, Array< OneD, Array< OneD, NekDouble >> &outarray, const NekDouble time)
Computes the reaction terms and .
virtual void v_InitObject()
virtual void v_GenerateSummary(SummaryList &s)
Prints a summary of the model parameters.
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
tBaseSharedPtr CreateInstance(tKey idKey, tParam... args)
Create an instance of the class referred to by idKey.
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void DefineImplicitSolve(FuncPointerT func, ObjectPointerT obj)
int m_spacedim
Spatial dimension (>= expansion dim).
virtual SOLVER_UTILS_EXPORT void v_SetInitialConditions(NekDouble initialtime=0.0, bool dumpInitialConditions=true, const int domain=0)
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
Base class for unsteady solvers.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
std::vector< std::pair< std::string, FilterSharedPtr > > m_filters
bool m_explicitDiffusion
Indicates if explicit or implicit treatment of diffusion is used.
virtual SOLVER_UTILS_EXPORT void v_InitObject(bool DeclareField=true)
Init object for UnsteadySystem class.
virtual SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s)
Print a summary of time stepping parameters.
std::vector< int > m_intVariables
std::shared_ptr< SessionReader > SessionReaderSharedPtr
std::shared_ptr< Equation > EquationSharedPtr
std::vector< std::pair< std::string, std::string > > SummaryList
EquationSystemFactory & GetEquationSystemFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
std::map< ConstFactorType, NekDouble > ConstFactorMap
The above copyright notice and this permission notice shall be included.
CellModelFactory & GetCellModelFactory()
void Vadd(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Add vector z = x+y.
void Smul(int n, const T alpha, const T *x, const int incx, T *y, const int incy)
Scalar multiply y = alpha*x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)