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)