Nektar++
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. More...
 

Static Public Attributes

static std::string className
 Name of class. More...
 

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::ExpListSharedPtrm_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.

53  : PulseWaveBoundary(pVessel,pSession,pressureArea)
54  {
55  }
PulseWaveBoundary(Array< OneD, MultiRegions::ExpListSharedPtr > &pVessel, const LibUtilities::SessionReaderSharedPtr &pSession, PulseWavePressureAreaSharedPtr &pressureArea)
Nektar::QInflow::~QInflow ( )
virtual

Definition at line 60 of file QInflow.cpp.

61  {
62 
63  }

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.

References Nektar::MemoryManager< DataType >::AllocateSharedPtr().

58  {
59  return MemoryManager<QInflow>::AllocateSharedPtr(pVessel,pSession,pressureArea);
60  }
static boost::shared_ptr< DataType > AllocateSharedPtr()
Allocate a shared pointer from the memory pool.
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().

114  {
115  NekDouble W2 = 0.0;
116  NekDouble A_calc = 0.0;
117  NekDouble fa = 0.0;
118  NekDouble dfa = 0.0;
119  NekDouble delta_A_calc = 0.0;
120  NekDouble rho = m_rho;
121 
122  int proceed = 1;
123  int iter = 0;
124  int MAX_ITER = 200;
125 
126  // Tolerances for the algorithm
127  NekDouble Tol = 1.0e-10;
128 
129  // Riemann invariant \f$W_2(Ar,ur)\f$
130  W2 = u_r - 4*sqrt(beta/(2*rho))*sqrt(sqrt(A_r));
131 
132  // Newton Iteration (Area only)
133  A_calc = A_r;
134  while ((proceed) && (iter < MAX_ITER))
135  {
136  iter =iter+1;
137 
138  fa = Q - W2*A_calc - A_calc*4*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
139  dfa = -W2 - 5*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
140  delta_A_calc = fa/dfa;
141  A_calc = A_calc - delta_A_calc;
142 
143  if (sqrt(delta_A_calc*delta_A_calc) < Tol)
144  proceed = 0;
145  }
146 
147  // Obtain u_u and A_u
148  uu = W2+4*sqrt(beta/(2*rho))*sqrt(sqrt(A_calc));
149  Au = A_calc;
150  }
double NekDouble
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().

73  {
74  NekDouble Q, A_u, u_u;
75  NekDouble A_r, u_r, A_l, u_l;
77 
78  vessel[0] = m_vessels[2*omega];
79  vessel[1] = m_vessels[2*omega+1];
80 
81  vessel[0]->EvaluateBoundaryConditions(time);
82 
83  // Note: The Q value is contained in A in the
84  // inputfile, the value in u has to be 1.0
85  //ASSERTL0((vessel[1]->UpdateBndCondExpansion(n))->UpdatePhys()[0] == 1.0, "For the Q-inflow BC the value in u must be 1.0");
86 
87  // Get the values of all variables needed for the Riemann problem
88  Q = (vessel[0]->UpdateBndCondExpansion(n))->GetCoeffs()[0];
89 
90  A_r = inarray[0][offset];
91  u_r = inarray[1][offset];
92 
93  // Call the Q-inflow Riemann solver
94  Q_RiemannSolver(Q,A_r,u_r,A_0[omega][0],beta[omega][0],A_u,u_u);
95 
96  // Set the boundary conditions to prescribe
97  A_l=A_r;
98  u_l=2*u_u-u_r;
99 
100  // Store the updated values in the boundary condition
101  (vessel[0]->UpdateBndCondExpansion(n))->UpdatePhys()[0] = A_l;
102  (vessel[1]->UpdateBndCondExpansion(n))->UpdatePhys()[0] = u_l;
103  }
void Q_RiemannSolver(NekDouble Q, NekDouble A_r, NekDouble u_r, NekDouble A_0, NekDouble beta, NekDouble &Au, NekDouble &uu)
Definition: QInflow.cpp:112
Array< OneD, MultiRegions::ExpListSharedPtr > m_vessels
double NekDouble

Member Data Documentation

std::string Nektar::QInflow::className
static
Initial value:
"Q-inflow",
"Inflow boundary condition")

Name of class.

Definition at line 63 of file QInflow.h.