43 std::string BetaPressureArea::className =
 
   45         "Beta", BetaPressureArea::create,
 
   46         "Beta law pressure area relationship for the arterial system");
 
   48 BetaPressureArea::BetaPressureArea(
 
  111     GetC(c,  beta, 
A,  A0);
 
  112     GetC(c0, beta, A0, A0);
 
  131     if (type == 
"Bifurcation")
 
  137         for (
int i = 0; i < 3; ++i)
 
  139             GetC(c[i], beta[i], Au[i], A0[i], alpha[i]);
 
  142         k = c[0] * Au[1] * c[2] + Au[0] * c[2] * c[1] + Au[2] * c[0] * c[1];
 
  143         K[0] = (c[0] - uu[0]) * k;
 
  144         K[1] = (c[1] + uu[1]) * k;
 
  145         K[2] = (c[2] + uu[2]) * k;
 
  147         invJ.SetValue(0, 0, (-c[1] * uu[0] * c[2] * Au[0] + Au[2] * c[1] * c[0]
 
  148                                    * c[0] + Au[1] * c[0] * c[0] * c[2]) / K[0]);
 
  149         invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[0]);
 
  150         invJ.SetValue(0, 2, Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[0]);
 
  151         invJ.SetValue(0, 3, c[0] * c[1] * c[2] / K[0]);
 
  152         invJ.SetValue(0, 4, -0.5 * c[0] * Au[1] * c[2] / K[0]);
 
  153         invJ.SetValue(0, 5, -0.5 * Au[2] * c[0] * c[1] / K[0]);
 
  155         invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[1]);
 
  156         invJ.SetValue(1, 1, (c[0] * uu[1] * c[2] * Au[1] + Au[2] * c[0] * c[1]
 
  157                                    * c[1] + c[2] * c[1] * c[1] * Au[0]) / K[1]);
 
  158         invJ.SetValue(1, 2, -Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[1]);
 
  159         invJ.SetValue(1, 3, -c[0] * c[1] * c[2] / K[1]);
 
  160         invJ.SetValue(1, 4, -0.5 * (c[0] * Au[2] + Au[0] * c[2]) * c[1] / K[1]);
 
  161         invJ.SetValue(1, 5, 0.5 * Au[2] * c[0] * c[1] / K[1]);
 
  163         invJ.SetValue(2, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[2]);
 
  164         invJ.SetValue(2, 1, -Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[2]);
 
  165         invJ.SetValue(2, 2, (c[0] * c[1] * uu[2] * Au[2] + c[0] * Au[1] * c[2]
 
  166                                    * c[2] + c[1] * c[2] * c[2] * Au[0]) / K[2]);
 
  167         invJ.SetValue(2, 3, -c[0] * c[1] * c[2] / K[2]);
 
  168         invJ.SetValue(2, 4, 0.5 * c[0] * Au[1] * c[2] / K[2]);
 
  169         invJ.SetValue(2, 5, -0.5 * (Au[1] * c[0] + c[1] * Au[0]) * c[2] / K[2]);
 
  171         invJ.SetValue(3, 0, Au[0] * (Au[0] * c[2] * c[1] - uu[0] * c[2] * Au[1]
 
  172                                                 - uu[0] * c[1] * Au[2]) / K[0]);
 
  173         invJ.SetValue(3, 1, -Au[0] * Au[1] * (c[1] - uu[1]) * c[2] / K[0]);
 
  174         invJ.SetValue(3, 2, -Au[0] * Au[2] * (c[2] - uu[2]) * c[1] / K[0]);
 
  175         invJ.SetValue(3, 3, -Au[0] * c[2] * c[1] / K[0]);
 
  176         invJ.SetValue(3, 4, 0.5 * Au[0] * Au[1] * c[2] / K[0]);
 
  177         invJ.SetValue(3, 5, 0.5 * Au[0] * c[1] * Au[2] / K[0]);
 
  179         invJ.SetValue(4, 0, Au[0] * Au[1] * (c[0] + uu[0]) * c[2] / K[1]);
 
  180         invJ.SetValue(4, 1, -Au[1] * (c[0] * Au[1] * c[2] + c[0] * uu[1] * Au[2]
 
  181                                                 + c[2] * uu[1] * Au[0]) / K[1]);
 
  182         invJ.SetValue(4, 2, -Au[2] * Au[1] * (c[2] - uu[2]) * c[0] / K[1]);
 
  183         invJ.SetValue(4, 3, -c[0] * Au[1] * c[2] / K[1]);
 
  184         invJ.SetValue(4, 4, -0.5 * Au[1] * (c[0] * Au[2] + Au[0] * c[2]) / K[1]);
 
  185         invJ.SetValue(4, 5, 0.5 * Au[2] * Au[1] * c[0] / K[1]);
 
  187         invJ.SetValue(5, 0, Au[0] * Au[2] * (c[0] + uu[0]) * c[1] / K[2]);
 
  188         invJ.SetValue(5, 1, -Au[2] * Au[1] * (c[1] - uu[1]) * c[0] / K[2]);
 
  189         invJ.SetValue(5, 2, -Au[2] * (Au[2] * c[0] * c[1] + c[0] * uu[2] * Au[1]
 
  190                                                 + c[1] * uu[2] * Au[0]) / K[2]);
 
  191         invJ.SetValue(5, 3, -Au[2] * c[0] * c[1] / K[2]);
 
  192         invJ.SetValue(5, 4, 0.5 * Au[2] * Au[1] * c[0] / K[2]);
 
  193         invJ.SetValue(5, 5, -0.5 * Au[2] * (Au[1] * c[0] + c[1] * Au[0]) / K[2]);
 
  195     else if (type == 
"Merge")
 
  201         for (
int i = 0; i < 3; ++i)
 
  203             GetC(c[i], beta[i], Au[i], A0[i], alpha[i]);
 
  206         k = c[0] * Au[1] * c[2] + Au[0] * c[2] * c[1] + Au[2] * c[0] * c[1];
 
  207         K[0] = (c[0] - uu[0]) * k;
 
  208         K[1] = (c[1] + uu[1]) * k;
 
  209         K[2] = (c[2] + uu[2]) * k;
 
  211         invJ.SetValue(0, 0, (-c[1] * uu[0] * c[2] * Au[0] + Au[2] * c[1] * c[0]
 
  212                                    * c[0] + Au[1] * c[0] * c[0] * c[2]) / K[0]);
 
  213         invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] * c[2] / K[0]);
 
  214         invJ.SetValue(0, 2, Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[0]);
 
  215         invJ.SetValue(0, 3, c[0] * c[1] * c[2] / K[0]);
 
  216         invJ.SetValue(0, 4, -0.5 * c[0] * Au[1] * c[2] / K[0]);
 
  217         invJ.SetValue(0, 5, -0.5 * Au[2] * c[0] * c[1] / K[0]);
 
  219         invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] * c[2] / K[1]);
 
  220         invJ.SetValue(1, 1, (c[0] * uu[1] * c[2] * Au[1] + Au[2] * c[0] * c[1]
 
  221                                    * c[1] + c[2] * c[1] * c[1] * Au[0]) / K[1]);
 
  222         invJ.SetValue(1, 2, -Au[2] * (c[2] - uu[2]) * c[0] * c[1] / K[1]);
 
  223         invJ.SetValue(1, 3, -c[0] * c[1] * c[2] / K[1]);
 
  224         invJ.SetValue(1, 4, -0.5 * (c[0] * Au[2] + Au[0] * c[2]) * c[1] / K[1]);
 
  225         invJ.SetValue(1, 5, 0.5 * Au[2] * c[0] * c[1] / K[1]);
 
  227         invJ.SetValue(2, 0, Au[0] * (c[0] - uu[0]) * c[1] * c[2] / K[2]);
 
  228         invJ.SetValue(2, 1, -Au[1] * (c[1] + uu[1]) * c[0] * c[2] / K[2]);
 
  229         invJ.SetValue(2, 2, -(c[0] * uu[2] * c[1] * Au[2] - Au[1] * c[0] *
 
  230                               c[2] * c[2] - c[1] * c[2] * c[2] * Au[0]) / K[2]);
 
  231         invJ.SetValue(2, 3, -c[0] * c[1] * c[2] / K[2]);
 
  232         invJ.SetValue(2, 4, -0.5 * Au[1] * c[0] * c[2] / K[2]);
 
  233         invJ.SetValue(2, 5, 0.5 * (Au[1] * c[0] + Au[0] * c[1]) * c[2] / K[2]);
 
  235         invJ.SetValue(3, 0, -Au[0] * (Au[0] * c[2] * c[1] + uu[0] * c[2] *
 
  236                                          Au[1] + uu[0] * c[1] * Au[2]) / K[0]);
 
  237         invJ.SetValue(3, 1, Au[0] * Au[1] * (c[1] + uu[1]) * c[2] / K[0]);
 
  239         invJ.SetValue(3, 2, -Au[0] * Au[2] * (c[2] - uu[2]) * c[1] / K[0]);
 
  240         invJ.SetValue(3, 3, -Au[0] * c[2] * c[1] / K[0]);
 
  241         invJ.SetValue(3, 4, 0.5 * Au[0] * Au[1] * c[2] / K[0]);
 
  242         invJ.SetValue(3, 5, 0.5 * Au[0] * c[1] * Au[2] / K[0]);
 
  244         invJ.SetValue(4, 0, Au[0] * Au[1] * (c[0] + uu[0]) * c[2] / K[1]);
 
  245         invJ.SetValue(4, 1, -Au[1] * (c[0] * Au[1] * c[2] + c[0] * uu[1] * Au[2]
 
  246                                                 + c[2] * uu[1] * Au[0]) / K[1]);
 
  247         invJ.SetValue(4, 2, -Au[2] * Au[1] * (c[2] - uu[2]) * c[0] / K[1]);
 
  248         invJ.SetValue(4, 3, -c[0] * Au[1] * c[2] / K[1]);
 
  249         invJ.SetValue(4, 4, -0.5 * Au[1] * (c[0] * Au[2] + Au[0] * c[2]) / K[1]);
 
  250         invJ.SetValue(4, 5, 0.5 * Au[2] * Au[1] * c[0] / K[1]);
 
  252         invJ.SetValue(5, 0, Au[0] * Au[2] * (c[0] + uu[0]) * c[1] / K[2]);
 
  253         invJ.SetValue(5, 1, -Au[2] * Au[1] * (c[1] - uu[1]) * c[0] / K[2]);
 
  254         invJ.SetValue(5, 2, -Au[2] * (Au[2] * c[0] * c[1] + c[0] * uu[2] * Au[1]
 
  255                                                 + c[1] * uu[2] * Au[0]) / K[2]);
 
  256         invJ.SetValue(5, 3, -Au[2] * c[0] * c[1] / K[2]);
 
  257         invJ.SetValue(5, 4, 0.5 * Au[2] * Au[1] * c[0] / K[2]);
 
  258         invJ.SetValue(5, 5, -0.5 * Au[2] * (Au[1] * c[0] + c[1] * Au[0]) / K[2]);
 
  260     else if (type == 
"Junction")
 
  266         for (
int i = 0; i < 2; ++i)
 
  268             GetC(c[i], beta[i], Au[i], A0[i], alpha[i]);
 
  271         k = (c[0] * Au[1] + Au[0] * c[1]);
 
  272         K[0] = (c[0] + uu[0]) * k;
 
  273         K[1] = (c[1] + uu[1]) * k;
 
  275         invJ.SetValue(0, 0, (Au[1] * c[0] * c[0] - c[1] * uu[0] * Au[0]) / K[0]);
 
  276         invJ.SetValue(0, 1, Au[1] * (c[1] - uu[1]) * c[0] / K[0]);
 
  277         invJ.SetValue(0, 2, c[0] * c[1] / K[0]);
 
  278         invJ.SetValue(0, 3, -0.5 * c[0] * Au[1] / K[0]);
 
  280         invJ.SetValue(1, 0, Au[0] * (c[0] + uu[0]) * c[1] / K[1]);
 
  281         invJ.SetValue(1, 1, (c[0] * uu[1] * Au[1] + c[1] * c[1] * Au[0]) / K[1]);
 
  282         invJ.SetValue(1, 2, -c[0] * c[1] / K[1]);
 
  283         invJ.SetValue(1, 3, -0.5 * Au[0] * c[1] / K[1]);
 
  285         invJ.SetValue(2, 0, Au[0] * (Au[0] * c[1] - uu[0] * Au[1]) / K[0]);
 
  286         invJ.SetValue(2, 1, -Au[0] * Au[1] * (c[1] - uu[1]) / K[0]);
 
  287         invJ.SetValue(2, 2, -Au[0] * c[1] / K[0]);
 
  288         invJ.SetValue(2, 3, 0.5 * Au[1] * Au[0] / K[0]);
 
  290         invJ.SetValue(3, 0, Au[0] * Au[1] * (c[0] + uu[0]) / K[1]);
 
  291         invJ.SetValue(3, 1, -Au[1] * (c[0] * Au[1] + uu[1] * Au[0]) / K[1]);
 
  292         invJ.SetValue(3, 2, -c[0] * Au[1] / K[1]);
 
  293         invJ.SetValue(3, 3, -0.5 * Au[1] * Au[0] / K[1]);
 
virtual void v_GetW1(NekDouble &W1, const NekDouble &u, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
virtual ~BetaPressureArea()
virtual void v_GetC(NekDouble &c, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
virtual void v_GetW2(NekDouble &W2, const NekDouble &u, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
virtual void v_GetCharIntegral(NekDouble &I, const NekDouble &beta, const NekDouble &A, const NekDouble &A0, const NekDouble &alpha=0.5)
virtual void v_GetUFromChars(NekDouble &u, const NekDouble &W1, const NekDouble &W2)
virtual void v_GetAFromChars(NekDouble &A, const NekDouble &W1, const NekDouble &W2, const NekDouble &beta, const NekDouble &A0, const NekDouble &alpha=0.5)
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)
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)
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
The above copyright notice and this permission notice shall be included.
PressureAreaFactory & GetPressureAreaFactory()
scalarT< T > sqrt(scalarT< T > in)