Nektar++
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Static Public Member Functions | Static Public Attributes | Protected Member Functions | Private Member Functions | List of all members
Nektar::QInflow Class Reference

A global linear system. More...

#include <QInflow.h>

Inheritance diagram for Nektar::QInflow:
Inheritance graph
[legend]
Collaboration diagram for Nektar::QInflow:
Collaboration graph
[legend]

Public Member Functions

 QInflow (Array< OneD, MultiRegions::ExpListSharedPtr > pVessel, const LibUtilities::SessionReaderSharedPtr pSession, PulseWavePressureAreaSharedPtr pressureArea)
virtual ~QInflow ()
- Public Member Functions inherited from Nektar::PulseWaveBoundary
 PulseWaveBoundary (Array< OneD, MultiRegions::ExpListSharedPtr > &pVessel, const LibUtilities::SessionReaderSharedPtr &pSession, PulseWavePressureAreaSharedPtr &pressureArea)
virtual ~PulseWaveBoundary ()
void DoBoundary (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &A_0, Array< OneD, Array< OneD, NekDouble > > &beta, const NekDouble time, int omega, int offset, int n)

Static Public Member Functions

static PulseWaveBoundarySharedPtr create (Array< OneD, MultiRegions::ExpListSharedPtr > &pVessel, const LibUtilities::SessionReaderSharedPtr &pSession, PulseWavePressureAreaSharedPtr &pressureArea)
 Creates an instance of this class.

Static Public Attributes

static std::string className
 Name of class.

Protected Member Functions

virtual void v_DoBoundary (const Array< OneD, const Array< OneD, NekDouble > > &inarray, Array< OneD, Array< OneD, NekDouble > > &A_0, Array< OneD, Array< OneD, NekDouble > > &beta, const NekDouble time, int omega, int offset, int n)

Private Member Functions

void Q_RiemannSolver (NekDouble Q, NekDouble A_r, NekDouble u_r, NekDouble A_0, NekDouble beta, NekDouble &Au, NekDouble &uu)

Additional Inherited Members

- Protected Attributes inherited from Nektar::PulseWaveBoundary
Array< OneD,
MultiRegions::ExpListSharedPtr
m_vessels
LibUtilities::SessionReaderSharedPtr m_session
PulseWavePressureAreaSharedPtr m_pressureArea
NekDouble m_pext
NekDouble m_pout
NekDouble m_rho

Detailed Description

A global linear system.

Definition at line 51 of file QInflow.h.

Constructor & Destructor Documentation

Nektar::QInflow::QInflow ( Array< OneD, MultiRegions::ExpListSharedPtr pVessel,
const LibUtilities::SessionReaderSharedPtr  pSession,
PulseWavePressureAreaSharedPtr  pressureArea 
)

Definition at line 50 of file QInflow.cpp.

: PulseWaveBoundary(pVessel,pSession,pressureArea)
{
}
Nektar::QInflow::~QInflow ( )
virtual

Definition at line 60 of file QInflow.cpp.

{
}

Member Function Documentation

static PulseWaveBoundarySharedPtr Nektar::QInflow::create ( Array< OneD, MultiRegions::ExpListSharedPtr > &  pVessel,
const LibUtilities::SessionReaderSharedPtr pSession,
PulseWavePressureAreaSharedPtr pressureArea 
)
inlinestatic

Creates an instance of this class.

Definition at line 55 of file QInflow.h.

{
return MemoryManager<QInflow>::AllocateSharedPtr(pVessel,pSession,pressureArea);
}
void Nektar::QInflow::Q_RiemannSolver ( NekDouble  Q,
NekDouble  A_r,
NekDouble  u_r,
NekDouble  A_0,
NekDouble  beta,
NekDouble Au,
NekDouble uu 
)
private

Q-inflow Riemann solver for pulse wave propagation. This Riemann solver is called by DoOdeProjection in case of a Q-inflow boundary condition. It is based on the conservation of mass and total pressure and on the characteristic information. For further details see "Pulse wave propagation in the human vascular system", section 3.4.1 Returns the upwinded quantities $(A_u,u_u)$ and stores them into the boundary values

Definition at line 112 of file QInflow.cpp.

References Nektar::PulseWaveBoundary::m_rho.

Referenced by v_DoBoundary().

{
NekDouble W2 = 0.0;
NekDouble A_calc = 0.0;
NekDouble fa = 0.0;
NekDouble dfa = 0.0;
NekDouble delta_A_calc = 0.0;
NekDouble rho = m_rho;
int proceed = 1;
int iter = 0;
int MAX_ITER = 200;
// Tolerances for the algorithm
NekDouble Tol = 1.0e-10;
// Riemann invariant \f$W_2(Ar,ur)\f$
W2 = u_r - 4*sqrt(beta/(2*rho))*sqrt(sqrt(A_r));
// Newton Iteration (Area only)
A_calc = A_r;
while ((proceed) && (iter < MAX_ITER))
{
iter =iter+1;
fa = Q - W2*A_calc - A_calc*4*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
dfa = -W2 - 5*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
delta_A_calc = fa/dfa;
A_calc = A_calc - delta_A_calc;
if (sqrt(delta_A_calc*delta_A_calc) < Tol)
proceed = 0;
}
// Obtain u_u and A_u
uu = W2+4*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
Au = A_calc;
}
void Nektar::QInflow::v_DoBoundary ( const Array< OneD, const Array< OneD, NekDouble > > &  inarray,
Array< OneD, Array< OneD, NekDouble > > &  A_0,
Array< OneD, Array< OneD, NekDouble > > &  beta,
const NekDouble  time,
int  omega,
int  offset,
int  n 
)
protectedvirtual

Implements Nektar::PulseWaveBoundary.

Definition at line 65 of file QInflow.cpp.

References Nektar::PulseWaveBoundary::m_vessels, and Q_RiemannSolver().

{
NekDouble Q, A_u, u_u;
NekDouble A_r, u_r, A_l, u_l;
Array<OneD, MultiRegions::ExpListSharedPtr> vessel(2);
vessel[0] = m_vessels[2*omega];
vessel[1] = m_vessels[2*omega+1];
vessel[0]->EvaluateBoundaryConditions(time);
// Note: The Q value is contained in A in the
// inputfile, the value in u has to be 1.0
//ASSERTL0((vessel[1]->UpdateBndCondExpansion(n))->UpdatePhys()[0] == 1.0, "For the Q-inflow BC the value in u must be 1.0");
// Get the values of all variables needed for the Riemann problem
Q = (vessel[0]->UpdateBndCondExpansion(n))->GetCoeffs()[0];
A_r = inarray[0][offset];
u_r = inarray[1][offset];
// Call the Q-inflow Riemann solver
Q_RiemannSolver(Q,A_r,u_r,A_0[omega][0],beta[omega][0],A_u,u_u);
// Set the boundary conditions to prescribe
A_l=A_r;
u_l=2*u_u-u_r;
// Store the updated values in the boundary condition
(vessel[0]->UpdateBndCondExpansion(n))->UpdatePhys()[0] = A_l;
(vessel[1]->UpdateBndCondExpansion(n))->UpdatePhys()[0] = u_l;
}

Member Data Documentation

std::string Nektar::QInflow::className
static
Initial value:
"Qinflow",
"Inflow boundary condition")

Name of class.

Definition at line 63 of file QInflow.h.