Gets limited slopes for the primitive variables in the 1-D direction.
264{
265 mooseAssert(x_neighbor.size() == W_neighbor.size(),
266 "Neighbor positions size must equal neighbor solutions size.");
267
268 using std::abs, std::min, std::max;
269
270
271 const unsigned int n_slopes = W_elem.size();
272
273
274 std::vector<std::vector<GenericReal<is_ad>>> slopes_one_sided;
275 for (unsigned int i = 0; i < W_neighbor.size(); i++)
276 {
277 const Real dx = (x_elem - x_neighbor[i]) * dir;
278
279 std::vector<GenericReal<is_ad>> slopes(n_slopes, 0.0);
280 for (unsigned int m = 0; m < n_slopes; m++)
281 slopes[m] = (W_elem[m] - W_neighbor[i][m]) / dx;
282
283 slopes_one_sided.push_back(slopes);
284 }
285
286
287 std::vector<GenericReal<is_ad>> slopes_central(n_slopes, 0.0);
288 if (W_neighbor.size() == 2)
289 {
290 const Real dx = (x_neighbor[0] - x_neighbor[1]) * dir;
291 for (unsigned int m = 0; m < n_slopes; m++)
292 slopes_central[m] = (W_neighbor[0][m] - W_neighbor[1][m]) / dx;
293 }
294 else if (W_neighbor.size() == 1)
295 {
296 slopes_one_sided.push_back(slopes_one_sided[0]);
297 slopes_central = slopes_one_sided[0];
298 }
299 else
300 {
301 slopes_one_sided.push_back(slopes_central);
302 slopes_one_sided.push_back(slopes_central);
303 }
304
305
306 std::vector<GenericReal<is_ad>> slopes_limited(n_slopes, 0.0);
307
308
310 {
311
313 break;
314
315
317
318 slopes_limited = slopes_central;
319 break;
320
321
323
324 for (unsigned int m = 0; m < n_slopes; m++)
325 {
326 if ((slopes_one_sided[0][m] * slopes_one_sided[1][m]) > 0.0)
327 {
328 if (
abs(slopes_one_sided[0][m]) <
abs(slopes_one_sided[1][m]))
329 slopes_limited[m] = slopes_one_sided[0][m];
330 else
331 slopes_limited[m] = slopes_one_sided[1][m];
332 }
333 }
334 break;
335
336
338
339 for (unsigned int m = 0; m < n_slopes; m++)
340 {
341 if (slopes_central[m] > 0.0 && slopes_one_sided[0][m] > 0.0 && slopes_one_sided[1][m] > 0.0)
342 slopes_limited[m] =
343 min(slopes_central[m], 2.0 *
min(slopes_one_sided[0][m], slopes_one_sided[1][m]));
344 else if (slopes_central[m] < 0.0 && slopes_one_sided[0][m] < 0.0 &&
345 slopes_one_sided[1][m] < 0.0)
346 slopes_limited[m] =
347 max(slopes_central[m], 2.0 *
max(slopes_one_sided[0][m], slopes_one_sided[1][m]));
348 }
349 break;
350
351
353
354 for (unsigned int m = 0; m < n_slopes; m++)
355 {
358
359
360 if (slopes_one_sided[1][m] > 0.0 && slopes_one_sided[0][m] > 0.0)
361 slope1 =
min(slopes_one_sided[1][m], 2.0 * slopes_one_sided[0][m]);
362 else if (slopes_one_sided[1][m] < 0.0 && slopes_one_sided[0][m] < 0.0)
363 slope1 =
max(slopes_one_sided[1][m], 2.0 * slopes_one_sided[0][m]);
364
365
366 if (slopes_one_sided[1][m] > 0.0 && slopes_one_sided[0][m] > 0.0)
367 slope2 =
min(2.0 * slopes_one_sided[1][m], slopes_one_sided[0][m]);
368 else if (slopes_one_sided[1][m] < 0.0 && slopes_one_sided[0][m] < 0.0)
369 slope2 =
max(2.0 * slopes_one_sided[1][m], slopes_one_sided[0][m]);
370
371
372 if (slope1 > 0.0 && slope2 > 0.0)
373 slopes_limited[m] =
max(slope1, slope2);
374 else if (slope1 < 0.0 && slope2 < 0.0)
375 slopes_limited[m] =
min(slope1, slope2);
376 }
377 break;
378
379 default:
380 mooseError(
"Unknown slope reconstruction scheme");
381 break;
382 }
383 return slopes_limited;
384}
void mooseError(Args &&... args)
Moose::GenericType< Real, is_ad > GenericReal
auto max(const L &left, const R &right)
auto min(const L &left, const R &right)
MetaPhysicL::DualNumber< V, D, asd > abs(const MetaPhysicL::DualNumber< V, D, asd > &a)
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real