46 "Beta law pressure area relationship for the arterial system");
65 boost::ignore_unused(alpha);
68 gamma * dAUdx /
sqrt(
A);
75 boost::ignore_unused(A0, alpha);
84 boost::ignore_unused(alpha);
96 boost::ignore_unused(alpha);
110 boost::ignore_unused(alpha);
126 boost::ignore_unused(alpha);
143 const std::string &type)
154 if (type ==
"Bifurcation")
160 for (
int i = 0; i < 3; ++i)
162 GetC(c[i],
beta[i], Au[i], A0[i], alpha[i]);
165 k = c[0] * Au[1] * c[2] + Au[0] * c[2] * c[1] + Au[2] * c[0] * c[1];
166 K[0] = (c[0] - uu[0]) * k;
167 K[1] = (c[1] + uu[1]) * k;
168 K[2] = (c[2] + uu[2]) * k;
171 (-c[1] * uu[0] * c[2] * Au[0] +
172 Au[2] * c[1] * c[0] * c[0] +
173 Au[1] * c[0] * c[0] * c[2]) /
175 invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[0]);
176 invJ.SetValue(0, 2, Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[0]);
177 invJ.SetValue(0, 3, c[0] * c[1] * c[2] / K[0]);
178 invJ.SetValue(0, 4, -0.5 * c[0] * Au[1] * c[2] / K[0]);
179 invJ.SetValue(0, 5, -0.5 * Au[2] * c[0] * c[1] / K[0]);
181 invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[1]);
183 (c[0] * uu[1] * c[2] * Au[1] +
184 Au[2] * c[0] * c[1] * c[1] +
185 c[2] * c[1] * c[1] * Au[0]) /
187 invJ.SetValue(1, 2, -Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[1]);
188 invJ.SetValue(1, 3, -c[0] * c[1] * c[2] / K[1]);
189 invJ.SetValue(1, 4, -0.5 * (c[0] * Au[2] + Au[0] * c[2]) * c[1] / K[1]);
190 invJ.SetValue(1, 5, 0.5 * Au[2] * c[0] * c[1] / K[1]);
192 invJ.SetValue(2, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[2]);
193 invJ.SetValue(2, 1, -Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[2]);
195 (c[0] * c[1] * uu[2] * Au[2] +
196 c[0] * Au[1] * c[2] * c[2] +
197 c[1] * c[2] * c[2] * Au[0]) /
199 invJ.SetValue(2, 3, -c[0] * c[1] * c[2] / K[2]);
200 invJ.SetValue(2, 4, 0.5 * c[0] * Au[1] * c[2] / K[2]);
201 invJ.SetValue(2, 5, -0.5 * (Au[1] * c[0] + c[1] * Au[0]) * c[2] / K[2]);
205 (Au[0] * c[2] * c[1] - uu[0] * c[2] * Au[1] -
206 uu[0] * c[1] * Au[2]) /
208 invJ.SetValue(3, 1, -Au[0] * Au[1] * (c[1] - uu[1]) * c[2] / K[0]);
209 invJ.SetValue(3, 2, -Au[0] * Au[2] * (c[2] - uu[2]) * c[1] / K[0]);
210 invJ.SetValue(3, 3, -Au[0] * c[2] * c[1] / K[0]);
211 invJ.SetValue(3, 4, 0.5 * Au[0] * Au[1] * c[2] / K[0]);
212 invJ.SetValue(3, 5, 0.5 * Au[0] * c[1] * Au[2] / K[0]);
214 invJ.SetValue(4, 0, Au[0] * Au[1] * (c[0] + uu[0]) * c[2] / K[1]);
217 (c[0] * Au[1] * c[2] + c[0] * uu[1] * Au[2] +
218 c[2] * uu[1] * Au[0]) /
220 invJ.SetValue(4, 2, -Au[2] * Au[1] * (c[2] - uu[2]) * c[0] / K[1]);
221 invJ.SetValue(4, 3, -c[0] * Au[1] * c[2] / K[1]);
223 -0.5 * Au[1] * (c[0] * Au[2] + Au[0] * c[2]) / K[1]);
224 invJ.SetValue(4, 5, 0.5 * Au[2] * Au[1] * c[0] / K[1]);
226 invJ.SetValue(5, 0, Au[0] * Au[2] * (c[0] + uu[0]) * c[1] / K[2]);
227 invJ.SetValue(5, 1, -Au[2] * Au[1] * (c[1] - uu[1]) * c[0] / K[2]);
230 (Au[2] * c[0] * c[1] + c[0] * uu[2] * Au[1] +
231 c[1] * uu[2] * Au[0]) /
233 invJ.SetValue(5, 3, -Au[2] * c[0] * c[1] / K[2]);
234 invJ.SetValue(5, 4, 0.5 * Au[2] * Au[1] * c[0] / K[2]);
236 -0.5 * Au[2] * (Au[1] * c[0] + c[1] * Au[0]) / K[2]);
238 else if (type ==
"Merge")
244 for (
int i = 0; i < 3; ++i)
246 GetC(c[i],
beta[i], Au[i], A0[i], alpha[i]);
249 k = c[0] * Au[1] * c[2] + Au[0] * c[2] * c[1] + Au[2] * c[0] * c[1];
250 K[0] = (c[0] - uu[0]) * k;
251 K[1] = (c[1] + uu[1]) * k;
252 K[2] = (c[2] + uu[2]) * k;
255 (-c[1] * uu[0] * c[2] * Au[0] +
256 Au[2] * c[1] * c[0] * c[0] +
257 Au[1] * c[0] * c[0] * c[2]) /
259 invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[0]);
260 invJ.SetValue(0, 2, Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[0]);
261 invJ.SetValue(0, 3, c[0] * c[1] * c[2] / K[0]);
262 invJ.SetValue(0, 4, -0.5 * c[0] * Au[1] * c[2] / K[0]);
263 invJ.SetValue(0, 5, -0.5 * Au[2] * c[0] * c[1] / K[0]);
265 invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[1]);
267 (c[0] * uu[1] * c[2] * Au[1] +
268 Au[2] * c[0] * c[1] * c[1] +
269 c[2] * c[1] * c[1] * Au[0]) /
271 invJ.SetValue(1, 2, -Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[1]);
272 invJ.SetValue(1, 3, -c[0] * c[1] * c[2] / K[1]);
273 invJ.SetValue(1, 4, -0.5 * (c[0] * Au[2] + Au[0] * c[2]) * c[1] / K[1]);
274 invJ.SetValue(1, 5, 0.5 * Au[2] * c[0] * c[1] / K[1]);
276 invJ.SetValue(2, 0, Au[0] * (c[0] - uu[0]) * c[1] * c[2] / K[2]);
277 invJ.SetValue(2, 1, -Au[1] * (c[1] + uu[1]) * c[0] * c[2] / K[2]);
279 -(c[0] * uu[2] * c[1] * Au[2] -
280 Au[1] * c[0] * c[2] * c[2] -
281 c[1] * c[2] * c[2] * Au[0]) /
283 invJ.SetValue(2, 3, -c[0] * c[1] * c[2] / K[2]);
284 invJ.SetValue(2, 4, -0.5 * Au[1] * c[0] * c[2] / K[2]);
285 invJ.SetValue(2, 5, 0.5 * (Au[1] * c[0] + Au[0] * c[1]) * c[2] / K[2]);
289 (Au[0] * c[2] * c[1] + uu[0] * c[2] * Au[1] +
290 uu[0] * c[1] * Au[2]) /
292 invJ.SetValue(3, 1, Au[0] * Au[1] * (c[1] + uu[1]) * c[2] / K[0]);
294 invJ.SetValue(3, 2, -Au[0] * Au[2] * (c[2] - uu[2]) * c[1] / K[0]);
295 invJ.SetValue(3, 3, -Au[0] * c[2] * c[1] / K[0]);
296 invJ.SetValue(3, 4, 0.5 * Au[0] * Au[1] * c[2] / K[0]);
297 invJ.SetValue(3, 5, 0.5 * Au[0] * c[1] * Au[2] / K[0]);
299 invJ.SetValue(4, 0, Au[0] * Au[1] * (c[0] + uu[0]) * c[2] / K[1]);
302 (c[0] * Au[1] * c[2] + c[0] * uu[1] * Au[2] +
303 c[2] * uu[1] * Au[0]) /
305 invJ.SetValue(4, 2, -Au[2] * Au[1] * (c[2] - uu[2]) * c[0] / K[1]);
306 invJ.SetValue(4, 3, -c[0] * Au[1] * c[2] / K[1]);
308 -0.5 * Au[1] * (c[0] * Au[2] + Au[0] * c[2]) / K[1]);
309 invJ.SetValue(4, 5, 0.5 * Au[2] * Au[1] * c[0] / K[1]);
311 invJ.SetValue(5, 0, Au[0] * Au[2] * (c[0] + uu[0]) * c[1] / K[2]);
312 invJ.SetValue(5, 1, -Au[2] * Au[1] * (c[1] - uu[1]) * c[0] / K[2]);
315 (Au[2] * c[0] * c[1] + c[0] * uu[2] * Au[1] +
316 c[1] * uu[2] * Au[0]) /
318 invJ.SetValue(5, 3, -Au[2] * c[0] * c[1] / K[2]);
319 invJ.SetValue(5, 4, 0.5 * Au[2] * Au[1] * c[0] / K[2]);
321 -0.5 * Au[2] * (Au[1] * c[0] + c[1] * Au[0]) / K[2]);
323 else if (type ==
"Interface")
329 for (
int i = 0; i < 2; ++i)
331 GetC(c[i],
beta[i], Au[i], A0[i], alpha[i]);
334 k = (c[0] * Au[1] + Au[0] * c[1]);
335 K[0] = (c[0] + uu[0]) * k;
336 K[1] = (c[1] + uu[1]) * k;
339 (Au[1] * c[0] * c[0] - c[1] * uu[0] * Au[0]) / K[0]);
340 invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] / K[0]);
341 invJ.SetValue(0, 2, c[0] * c[1] / K[0]);
342 invJ.SetValue(0, 3, -0.5 * c[0] * Au[1] / K[0]);
344 invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] / K[1]);
346 (c[0] * uu[1] * Au[1] + c[1] * c[1] * Au[0]) / K[1]);
347 invJ.SetValue(1, 2, -c[0] * c[1] / K[1]);
348 invJ.SetValue(1, 3, -0.5 * Au[0] * c[1] / K[1]);
350 invJ.SetValue(2, 0, Au[0] * (Au[0] * c[1] - uu[0] * Au[1]) / K[0]);
351 invJ.SetValue(2, 1, -Au[0] * Au[1] * (c[1] - uu[1]) / K[0]);
352 invJ.SetValue(2, 2, -Au[0] * c[1] / K[0]);
353 invJ.SetValue(2, 3, 0.5 * Au[1] * Au[0] / K[0]);
355 invJ.SetValue(3, 0, Au[0] * Au[1] * (c[0] + uu[0]) / K[1]);
356 invJ.SetValue(3, 1, -Au[1] * (c[0] * Au[1] + uu[1] * Au[0]) / K[1]);
357 invJ.SetValue(3, 2, -c[0] * Au[1] / K[1]);
358 invJ.SetValue(3, 3, -0.5 * Au[1] * Au[0] / K[1]);
virtual ~BetaPressureArea()
BetaPressureArea(Array< OneD, MultiRegions::ExpListSharedPtr > pVessel, const LibUtilities::SessionReaderSharedPtr pSession)
virtual void v_GetPressure(NekDouble &P, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &dAUdx, const NekDouble &gamma=0, const NekDouble &alpha=0.5) override
virtual void v_GetCharIntegral(NekDouble &I, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5) override
static PulseWavePressureAreaSharedPtr create(Array< OneD, MultiRegions::ExpListSharedPtr > &pVessel, const LibUtilities::SessionReaderSharedPtr &pSession)
static std::string className
virtual void v_GetW2(NekDouble &W2, const NekDouble &u, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5) override
virtual void v_GetUFromChars(NekDouble &u, const NekDouble &W1, const NekDouble &W2) override
virtual void v_GetC(NekDouble &c, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5) override
virtual void v_GetJacobianInverse(NekMatrix< NekDouble > &invJ, const Array< OneD, NekDouble > &Au, const Array< OneD, NekDouble > &uu, const Array< OneD, NekDouble > &beta, const Array< OneD, NekDouble > &A0, const Array< OneD, NekDouble > &alpha, const std::string &type) override
virtual void v_GetW1(NekDouble &W1, const NekDouble &u, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5) override
virtual void v_GetAFromChars(NekDouble &A, const NekDouble &W1, const NekDouble &W2, const NekDouble &beta, const NekDouble &A0, const NekDouble &alpha=0.5) override
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
void GetCharIntegral(NekDouble &I, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
void GetC(NekDouble &c, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
std::shared_ptr< SessionReader > SessionReaderSharedPtr
@ beta
Gauss Radau pinned at x=-1,.
@ P
Monomial polynomials .
The above copyright notice and this permission notice shall be included.
PressureAreaFactory & GetPressureAreaFactory()
scalarT< T > sqrt(scalarT< T > in)