50 "Pulse Wave Propagation equation.");
81 if (
m_session->DefinesSolverInfo(
"PressureArea"))
99 ASSERTL0(
false,
"Implicit Pulse Wave Propagation not set up.");
110 riemName =
"UpwindPulse";
115 ASSERTL0(
false,
"populate switch statement for upwind flux");
171 for (
size_t omega = 0; omega <
m_nDomains; ++omega)
180 physarray[i] = inarray[i] + cnt;
181 out[i] = outarray[i] + cnt;
207 if (inarray != outarray)
211 Vmath::Vcopy(inarray[i].size(), inarray[i], 1, outarray[i], 1);
243 for (
size_t j = 0; j < 2; ++j)
247 if (j < vessel[0]->GetBndConditions().size())
249 BCType = vessel[0]->GetBndConditions()[j]->GetUserDefined();
253 if (BCType.empty() || BCType ==
"Interface")
255 BCType =
"NoUserDefined";
262 if (BCType ==
"Q-inflow")
264 vessel[0]->GetBndConditions()[j]->SetIsTimeDependent(
true);
266 else if (BCType ==
"A-inflow")
268 vessel[0]->GetBndConditions()[j]->SetIsTimeDependent(
true);
270 else if (BCType ==
"U-inflow")
272 vessel[1]->GetBndConditions()[j]->SetIsTimeDependent(
true);
274 else if (BCType ==
"RCR-terminal")
276 vessel[0]->GetBndConditions()[j]->SetIsTimeDependent(
true);
289 for (
size_t n = 0; n < 2; ++n)
295 offset +=
m_vessels[2 * omega]->GetTotPoints();
322 for (
size_t j = 0; j < nq; ++j)
325 flux[0][0][j] = physfield[0][j] * physfield[1][j];
331 m_fields[0]->PhysDeriv(flux[0][0], dAUdx);
333 for (
size_t j = 0; j < nq; ++j)
335 if ((j == 0) || (j == nq - 1))
337 viscoelasticGradient = dAUdx[j];
341 viscoelasticGradient = (dAUdx[j] + dAUdx[j + 1]) / 2;
345 physfield[0][j],
m_A_0[domain][j],
346 viscoelasticGradient,
m_gamma[domain][j],
349 flux[1][0][j] = physfield[1][j] * physfield[1][j] / 2 +
369 for (
size_t j = 0; j < nq; ++j)
372 physfield[0][counter + j],
m_A_0[domain][j],
375 m_beta[domain][j], physfield[0][counter + j],
378 m_beta[domain][j], physfield[0][counter + j],
#define ASSERTL0(condition, msg)
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 DefineProjection(FuncPointerT func, ObjectPointerT obj)
void DefineOdeRhs(FuncPointerT func, ObjectPointerT obj)
void AccumulateRegion(std::string, int iolevel=0)
Accumulate elapsed time for a region.
Array< OneD, NekDouble > & GetAlpha()
void v_InitObject(bool DeclareField=false) override
Init object for UnsteadySystem class.
SolverUtils::RiemannSolverSharedPtr m_riemannSolver
PulseWavePropagation(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
~PulseWavePropagation() override
SolverUtils::AdvectionSharedPtr m_advObject
void SetPulseWaveBoundaryConditions(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
void DoOdeProjection(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Array< OneD, PulseWaveBoundarySharedPtr > m_Boundary
Array< OneD, NekDouble > & GetN()
Array< OneD, NekDouble > & GetA0()
void GetFluxVector(const Array< OneD, Array< OneD, NekDouble > > &physfield, Array< OneD, Array< OneD, Array< OneD, NekDouble > > > &flux)
DG Pulse Wave Propagation routines:
void v_GenerateSummary(SolverUtils::SummaryList &s) override
void DoOdeRhs(const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &outarray, const NekDouble time)
Array< OneD, NekDouble > & GetBeta()
static std::string className
Name of class.
static EquationSystemSharedPtr create(const LibUtilities::SessionReaderSharedPtr &pSession, const SpatialDomains::MeshGraphSharedPtr &pGraph)
Creates an instance of this class.
Base class for unsteady solvers.
Array< OneD, Array< OneD, NekDouble > > m_A_0
Array< OneD, Array< OneD, NekDouble > > m_beta_trace
Array< OneD, Array< OneD, NekDouble > > m_W2
Array< OneD, Array< OneD, NekDouble > > m_trace_fwd_normal
PulseWavePressureAreaSharedPtr m_pressureArea
Array< OneD, Array< OneD, NekDouble > > m_W1
void v_InitObject(bool DeclareField=false) override
Array< OneD, Array< OneD, NekDouble > > m_alpha_trace
UpwindTypePulse m_upwindTypePulse
Array< OneD, Array< OneD, NekDouble > > m_A_0_trace
Array< OneD, Array< OneD, NekDouble > > m_pressure
Array< OneD, Array< OneD, NekDouble > > m_gamma
Array< OneD, Array< OneD, NekDouble > > m_alpha
Array< OneD, Array< OneD, NekDouble > > m_PWV
Array< OneD, MultiRegions::ExpListSharedPtr > m_vessels
void EnforceInterfaceConditions(const Array< OneD, const Array< OneD, NekDouble > > &fields)
Array< OneD, Array< OneD, NekDouble > > m_beta
int m_spacedim
Spatial dimension (>= expansion dim).
Array< OneD, MultiRegions::ExpListSharedPtr > m_fields
Array holding all dependent variables.
LibUtilities::SessionReaderSharedPtr m_session
The session reader.
SOLVER_UTILS_EXPORT void SetBoundaryConditions(NekDouble time)
Evaluates the boundary conditions at the given time.
LibUtilities::TimeIntegrationSchemeOperators m_ode
The time integration scheme operators to use.
bool m_explicitAdvection
Indicates if explicit or implicit treatment of advection is used.
SOLVER_UTILS_EXPORT void v_GenerateSummary(SummaryList &s) override
Print a summary of time stepping parameters.
std::shared_ptr< SessionReader > SessionReaderSharedPtr
AdvectionFactory & GetAdvectionFactory()
Gets the factory for initialising advection objects.
std::vector< std::pair< std::string, std::string > > SummaryList
EquationSystemFactory & GetEquationSystemFactory()
RiemannSolverFactory & GetRiemannSolverFactory()
std::shared_ptr< MeshGraph > MeshGraphSharedPtr
PressureAreaFactory & GetPressureAreaFactory()
@ eUpwindPulse
simple upwinding scheme
BoundaryFactory & GetBoundaryFactory()
void Neg(int n, T *x, const int incx)
Negate x = -x.
void Vcopy(int n, const T *x, const int incx, T *y, const int incy)