WARPXM v1.10.0
Loading...
Searching...
No Matches
5-moment_base.h
Go to the documentation of this file.
1#pragma once
2
3// wxm includes
4#include "warpxm/warpxm_config.h" // for variable macros
5#include "apps/wmapplication.h" // for pSV
8
9// STL includes
10#include <limits>
11
17{
19 real mass = 1.;
20 real density_min = std::numeric_limits<real>::epsilon();
21 real pressure_min = std::numeric_limits<real>::epsilon();
22 bool entropy_fix = true;
23};
24
25namespace wxm
26{
27namespace apps
28{
29namespace five_moment
30{
31
47 const real rho_min = std::numeric_limits<real>::epsilon());
48
70 const real gas_gamma,
71 const real rho_min = std::numeric_limits<real>::epsilon(),
72 const real press_min = std::numeric_limits<real>::epsilon());
73
99 const real gas_gamma,
100 const real A = 1.0,
101 const real rho_min = std::numeric_limits<real>::epsilon(),
102 const real press_min = std::numeric_limits<real>::epsilon());
103
109void NCtoC(const constants_5moment_t* pC, const real QNC[5], real QC[5]);
110
119 const real QC[5],
120 real QNC[5],
121 const real rho_min = std::numeric_limits<real>::epsilon(),
122 const real press_min = std::numeric_limits<real>::epsilon());
123
127 const real QNC_center[5],
128 const real dQNC[5],
129 const real QC_center[5],
130 real dQC[5]);
131
138void rotateVector(const real v[5], const solverVariables_t* pSV, real Rv[5]);
139
146void antirotateVector(const real Rv[5], const solverVariables_t* pSV, real v[5]);
147
148// -----------------------------------------------------------------------------------
149// Flux functions
150// -----------------------------------------------------------------------------------
151
161 const real QC[5],
162 real flux[5],
163 const real rho_min = std::numeric_limits<real>::epsilon(),
164 const real press_min = std::numeric_limits<real>::epsilon());
165
177 const real QC_l[5],
178 const real QC_r[5],
179 real* s,
180 real amdq[5],
181 real apdq[5],
182 const real rho_min = std::numeric_limits<real>::epsilon(),
183 const real press_min = std::numeric_limits<real>::epsilon());
184
186 const real ql[5],
187 const real qr[5],
188 const real& pl,
189 const real& pr,
190 real& rho,
191 real& u,
192 real& v,
193 real& w,
194 real& enth,
195 real& a,
196 const real rho_min = std::numeric_limits<real>::epsilon());
197
199 const real ql[5],
200 const real qr[5],
201 const real s[3],
202 const real wave[][3],
203 real amdq[5],
204 real apdq[5],
205 const real rho_min = std::numeric_limits<real>::epsilon(),
206 const real press_min = std::numeric_limits<real>::epsilon());
207
219 const real QC_l[5],
220 const real QC_r[5],
221 void (*numerical_flux_scheme)(const constants_5moment_t* pC,
222 const real QC_l[5],
223 const real QC_r[5],
224 real* s,
225 real amdq[5],
226 real apdq[5],
227 const real rho_min,
228 const real press_min),
229 real flux[5],
230 const real rho_min = std::numeric_limits<real>::epsilon(),
231 const real press_min = std::numeric_limits<real>::epsilon());
232
246 const solverVariables_t* pSV,
247 const real QC_l[5],
248 const real QC_r[5],
249 void (*numerical_flux_scheme)(const constants_5moment_t* pC,
250 const real QC_l[5],
251 const real QC_r[5],
252 real* s,
253 real amdq[5],
254 real apdq[5],
255 const real rho_min,
256 const real press_min),
257 real numericalFlux[5],
258 const real rho_min = std::numeric_limits<real>::epsilon(),
259 const real press_min = std::numeric_limits<real>::epsilon());
260
272 const real QC_l[5],
273 const real QC_r[5],
274 real* s,
275 real amdq[5],
276 real apdq[5],
277 const real rho_min = std::numeric_limits<real>::epsilon(),
278 const real press_min = std::numeric_limits<real>::epsilon());
279
281 const real QC_l[5],
282 const real QC_r[5],
283 real* s,
284 real amdq[5],
285 real apdq[5],
286 const real rho_min = std::numeric_limits<real>::epsilon(),
287 const real press_min = std::numeric_limits<real>::epsilon());
288
299 const solverVariables_t* pSV,
300 const real QC_l[5],
301 const real QC_r[5],
302 real numericalFlux[5],
303 const real rho_min = std::numeric_limits<real>::epsilon(),
304 const real press_min = std::numeric_limits<real>::epsilon());
305
315 const solverVariables_t* pSV,
316 const real QC[5],
317 std::vector<std::vector<real>>& internalFlux,
318 const real rho_min = std::numeric_limits<real>::epsilon(),
319 const real press_min = std::numeric_limits<real>::epsilon());
320
322 const real* q,
323 const real* grad_rho,
324 const real* grad_p[3],
325 real pi[3][3]);
326
328 const solverVariables_t* pSV,
329 const real pi[][3],
330 const real h[3],
331 std::vector<std::vector<real>>& flux_tensor);
332
334 const constants_5moment_t* pC,
335 const solverVariables_t* pSV,
336 const real mu,
337 const real k,
338 const real* q,
339 const real u[3],
340 const real* grad_u[3],
341 const real div_u,
342 const real grad_T[3],
343 std::vector<std::vector<real>>& internal_flux,
344 const real rho_min = std::numeric_limits<real>::epsilon());
345
346// dont use this anymore->remove when navier_stokes app updated
349 const solverVariables_t* pSV,
350 const real viscosity,
351 const real thermal_conductivity,
352 const real* q_l,
353 const real* q_r,
354 const real* aux_l,
355 const real* aux_r,
356 real* numerical_flux,
357 const real rho_min = std::numeric_limits<real>::epsilon(),
358 const real press_min = std::numeric_limits<real>::epsilon());
359
361 const constants_5moment_t* pC_a,
362 const constants_5moment_t* pC_b,
363 const real* q_a,
364 const real* q_b,
365 real* source,
366 const real rho_min = std::numeric_limits<real>::epsilon(),
367 const real press_min = std::numeric_limits<real>::epsilon());
368
379 const real* q,
380 const real* aux,
381 const real* grad_u,
382 real* grad_T,
383 const real rho_min = std::numeric_limits<real>::epsilon(),
384 const real press_min = std::numeric_limits<real>::epsilon());
385
387 const real* aux,
388 const real rho_min = std::numeric_limits<real>::epsilon());
389
390void calcGradU(const real* q,
391 const real* aux,
392 real* grad_u[3],
393 const real rho_min = std::numeric_limits<real>::epsilon());
394
396 const real* q,
397 const bool is_neutral,
398 const real collision_coefficient,
399 const real minimum_frequency,
400 const real diffusivity_min,
401 const real diffusivity_max,
402 const bool is_const_mu,
403 const real const_mu,
404 const bool is_const_k,
405 const real const_k,
406 real& mu,
407 real& k,
408 const real rho_min = std::numeric_limits<real>::epsilon(),
409 const real press_min = std::numeric_limits<real>::epsilon());
410
439 const real* q,
440 const real* dqdt,
441 real lambda,
442 const real rho_min = std::numeric_limits<real>::epsilon());
443
444// -----------------------------------------------------------------------------------
445// Boundary condition functions
446// -----------------------------------------------------------------------------------
447namespace bc
448{
450 const solverVariables_t* pSV,
451 const real* QC,
452 const real vx_w,
453 const real vy_w,
454 const real vz_w,
455 real* QC_w,
456 const real rho_min = std::numeric_limits<real>::epsilon(),
457 const real press_min = std::numeric_limits<real>::epsilon());
458
460 const constants_5moment_t* pC,
461 const solverVariables_t* pSV,
462 const real* QC,
463 real* QC_w,
464 const real rho_min = std::numeric_limits<real>::epsilon(),
465 const real press_min = std::numeric_limits<real>::epsilon());
466
467void freeslipWallCondition(const solverVariables_t* pSV, const real* QC, real* QC_w);
468
470 const constants_5moment_t* pC,
471 const solverVariables_t* pSV,
472 const real* QC,
473 // const real vx_w,
474 // const real vy_w,
475 // const real vz_w,
476 real* QC_w,
477 const real rho_min = std::numeric_limits<real>::epsilon(),
478 const real press_min = std::numeric_limits<real>::epsilon());
479
481 const constants_5moment_t* pC,
482 const solverVariables_t* pSV,
483 const real* QC,
484 real* QC_w,
485 const real rho_min = std::numeric_limits<real>::epsilon(),
486 const real press_min = std::numeric_limits<real>::epsilon());
487
488void copyoutBoundaryCondition(const real* QC, real* QC_w);
489
491 const solverVariables_t* pSV,
492 const real* QC,
493 real* QC_w,
494 const real rho_min = std::numeric_limits<real>::epsilon(),
495 const real press_min = std::numeric_limits<real>::epsilon());
496
498 const constants_5moment_t* pC,
499 const solverVariables_t* pSV,
500 const real* QC,
501 real* QC_w,
502 const real rho_min = std::numeric_limits<real>::epsilon(),
503 const real press_min = std::numeric_limits<real>::epsilon());
504
506 const solverVariables_t* pSV,
507 real Aa,
508 real Ab,
509 real Za,
510 real Zb,
511 real ztheta_ba,
512 real skin_depth_norm,
513 real* QC_w);
514
516 const solverVariables_t* pSV,
517 real Ai,
518 real Ae,
519 real Zi,
520 real Ze,
521 real ztheta_ba,
522 real skin_depth_norm,
523 real* QC_w);
524} // namespace bc
525} // namespace five_moment
526} // namespace apps
527} // namespace wxm
void axisBoundaryCondition(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void freeslipWallCondition(const solverVariables_t *pSV, const real *QC, real *QC_w)
void noslipWallCondition_gradients(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void noslipWallCondition(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, const real vx_w, const real vy_w, const real vz_w, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void axisBoundaryCondition_gradients(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void imhd_to_twofluid_consistent_assumption(const real *QC, const solverVariables_t *pSV, real Ai, real Ae, real Zi, real Ze, real ztheta_ba, real skin_depth_norm, real *QC_w)
void copyoutBoundaryCondition(const real *QC, real *QC_w)
void freeslipWallCondition_yu(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void freeslipWallCondition_gradients_yu(const constants_5moment_t *pC, const solverVariables_t *pSV, const real *QC, real *QC_w, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void imhd_to_twofluid_bc(const real *QC, const solverVariables_t *pSV, real Aa, real Ab, real Za, real Zb, real ztheta_ba, real skin_depth_norm, real *QC_w)
void navier_stokes_viscous_flux_tensor(const real *q, const solverVariables_t *pSV, const real pi[][3], const real h[3], std::vector< std::vector< real > > &flux_tensor)
void navier_stokes_anisotropic_pressure_tensor(const real viscosity, const real *q, const real *grad_rho, const real *grad_p[3], real pi[3][3])
real eulerNumericalFlux(const constants_5moment_t *pC, const solverVariables_t *pSV, const real QC_l[5], const real QC_r[5], void(*numerical_flux_scheme)(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], real *s, real amdq[5], real apdq[5], const real rho_min, const real press_min), real numericalFlux[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Calculates the Numerical Flux for the Euler fluid equations using Roe's Method as given by Leveque in...
void eulerRoeAverages(const constants_5moment_t *pC, const real ql[5], const real qr[5], const real &pl, const real &pr, real &rho, real &u, real &v, real &w, real &enth, real &a, const real rho_min=std::numeric_limits< real >::epsilon())
real navier_stokes_numerical_flux(constants_5moment_t *pC, const solverVariables_t *pSV, const real viscosity, const real thermal_conductivity, const real *q_l, const real *q_r, const real *aux_l, const real *aux_r, real *numerical_flux, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
real getTemperatureFloored(const real *q, const real gas_gamma, const real A=1.0, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Get the temperature from Euler (5-moment) variables using floors for pressure and density.
void eulerHLLEFluxSolver(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], real *s, real amdq[5], real apdq[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Calculates the HLLE flux for the Euler fluid equations.
void antirotateVector(const real Rv[5], const solverVariables_t *pSV, real v[5])
Rotates a 5-moment variable set from local frame to world frame.
real eulerNumericalFlux_x(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], void(*numerical_flux_scheme)(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], real *s, real amdq[5], real apdq[5], const real rho_min, const real press_min), real flux[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Calculates the Euler Numerical flux given a scheme along the x-axis which is to be used as a numerica...
void calcGradT(const constants_5moment_t *pC, const real *q, const real *aux, const real *grad_u, real *grad_T, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Computes temperature gradients from 5 moment conserved variable gradients/values.
void NCtoC(const constants_5moment_t *pC, const real QNC[5], real QC[5])
Converts nonconserved (primitive) variables to conserved variables.
real getRhoFloored(const real *q, const real rho_min=std::numeric_limits< real >::epsilon())
Get the floored mass density.
real positivity_preserving_source_dt(const real *q, const real *dqdt, real lambda, const real rho_min=std::numeric_limits< real >::epsilon())
Computes the maximum allowable dt for a source term to preserve positivity for the positivity-preserv...
void calcGradU(const real *q, const real *aux, real *grad_u[3], const real rho_min=std::numeric_limits< real >::epsilon())
void eulerFlux(const constants_5moment_t *pC, const real QC[5], real flux[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Flux along x-axis for Euler fluid equations using conserved variables.
void CtoNC(const constants_5moment_t *pC, const real QC[5], real QNC[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Converts conserved variables to nonconserved (primitive) variables.
real eulerRusanovFlux(const constants_5moment_t *pC, const solverVariables_t *pSV, const real QC_l[5], const real QC_r[5], real numericalFlux[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Calculates the Rusanov flux for the Euler fluid equations directly.
void navier_stokes_internal_flux(const constants_5moment_t *pC, const solverVariables_t *pSV, const real mu, const real k, const real *q, const real u[3], const real *grad_u[3], const real div_u, const real grad_T[3], std::vector< std::vector< real > > &internal_flux, const real rho_min=std::numeric_limits< real >::epsilon())
void hartenHymanEntropyFix(const constants_5moment_t *pC, const real ql[5], const real qr[5], const real s[3], const real wave[][3], real amdq[5], real apdq[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void eulerRoeFluxSolver(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], real *s, real amdq[5], real apdq[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Solves the full Roe decomposition for the euler fluid problem using conserved variables - assumes an ...
void get_mu_and_k(const constants_5moment_t *pC, const real *q, const bool is_neutral, const real collision_coefficient, const real minimum_frequency, const real diffusivity_min, const real diffusivity_max, const bool is_const_mu, const real const_mu, const bool is_const_k, const real const_k, real &mu, real &k, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
real interspeciesCollisions(const real nu_ab, const constants_5moment_t *pC_a, const constants_5moment_t *pC_b, const real *q_a, const real *q_b, real *source, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
real eulerInternalFlux(const constants_5moment_t *pC, const solverVariables_t *pSV, const real QC[5], std::vector< std::vector< real > > &internalFlux, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Calculates the internal euler flux at a given point.
real getPressureFloored(const real *q, const real gas_gamma, const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
Get the pressure from Euler (5-moment) variables using floors for pressure and density.
real calcDivU(const real *q, const real *aux, const real rho_min=std::numeric_limits< real >::epsilon())
void rotateVector(const real v[5], const solverVariables_t *pSV, real Rv[5])
Rotates a 5-moment variable set from world frame to local frame.
void eulerHLLECFluxSolver(const constants_5moment_t *pC, const real QC_l[5], const real QC_r[5], real *s, real amdq[5], real apdq[5], const real rho_min=std::numeric_limits< real >::epsilon(), const real press_min=std::numeric_limits< real >::epsilon())
void NCtoCDifferential(const constants_5moment_t *pC, const real QNC_center[5], const real dQNC[5], const real QC_center[5], real dQC[5])
This currently isn't used anywhere.
Base namespace for everything not included in the global namespace.
Definition: field_source.h:8
Structure for holding constants used in the 5moment solvers.
Definition: 5-moment_base.h:17
real gas_gamma
Definition: 5-moment_base.h:18
real density_min
Definition: 5-moment_base.h:20
real mass
Definition: 5-moment_base.h:19
real pressure_min
Definition: 5-moment_base.h:21
bool entropy_fix
Definition: 5-moment_base.h:22
Definition: wmapplication.h:38
#define real
Definition: wmoclunstructuredreconstruction.h:11