xref: /honee/qfunctions/bc_freestream.h (revision 475f0cac5d40259768f4556cf888e8f2448554cb)
1ae2b091fSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2ae2b091fSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
39ed3d70dSJames Wright 
49ed3d70dSJames Wright /// @file
59ed3d70dSJames Wright /// QFunctions for the `bc_freestream` and `bc_outflow` boundary conditions
69ed3d70dSJames Wright #include "bc_freestream_type.h"
79ed3d70dSJames Wright #include "newtonian_state.h"
89ed3d70dSJames Wright #include "newtonian_types.h"
99ed3d70dSJames Wright #include "riemann_solver.h"
109ed3d70dSJames Wright 
119ed3d70dSJames Wright // *****************************************************************************
129ed3d70dSJames Wright // Freestream Boundary Condition
139ed3d70dSJames Wright // *****************************************************************************
Freestream(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out,StateVariable state_var,RiemannFluxType flux_type)149ed3d70dSJames Wright CEED_QFUNCTION_HELPER int Freestream(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateVariable state_var,
159ed3d70dSJames Wright                                      RiemannFluxType flux_type) {
164b96a86bSJames Wright   const FreestreamContext context  = (FreestreamContext)ctx;
179ed3d70dSJames Wright   const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0];
189ed3d70dSJames Wright   const CeedScalar(*q_data_sur)    = in[2];
199ed3d70dSJames Wright   CeedScalar(*v)[CEED_Q_VLA]       = (CeedScalar(*)[CEED_Q_VLA])out[0];
20*cde3d787SJames Wright   CeedScalar(*jac_data_sur)        = context->newt_ctx.is_implicit ? out[1] : NULL;
219ed3d70dSJames Wright 
22*cde3d787SJames Wright   const NewtonianIGProperties gas         = context->newt_ctx.gas;
23*cde3d787SJames Wright   const bool                  is_implicit = context->newt_ctx.is_implicit;
249ed3d70dSJames Wright 
259ed3d70dSJames Wright   CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) {
269ed3d70dSJames Wright     const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]};
27*cde3d787SJames Wright     const State      s     = StateFromQ(gas, qi, state_var);
289ed3d70dSJames Wright 
29feb491a7SJames Wright     CeedScalar wdetJb, normal[3];
30feb491a7SJames Wright     QdataBoundaryUnpack_3D(Q, i, q_data_sur, &wdetJb, NULL, normal);
319ed3d70dSJames Wright     wdetJb *= is_implicit ? -1. : 1.;
329ed3d70dSJames Wright 
339ed3d70dSJames Wright     StateConservative flux;
349ed3d70dSJames Wright     switch (flux_type) {
359ed3d70dSJames Wright       case RIEMANN_HLL:
36*cde3d787SJames Wright         flux = RiemannFlux_HLL(gas, s, context->S_infty, normal);
379ed3d70dSJames Wright         break;
389ed3d70dSJames Wright       case RIEMANN_HLLC:
39*cde3d787SJames Wright         flux = RiemannFlux_HLLC(gas, s, context->S_infty, normal);
409ed3d70dSJames Wright         break;
419ed3d70dSJames Wright     }
429ed3d70dSJames Wright     CeedScalar Flux[5];
439ed3d70dSJames Wright     UnpackState_U(flux, Flux);
449ed3d70dSJames Wright     for (CeedInt j = 0; j < 5; j++) v[j][i] = -wdetJb * Flux[j];
459ed3d70dSJames Wright 
46ea091b8eSJames Wright     if (is_implicit) StoredValuesPack(Q, i, 0, 5, qi, jac_data_sur);
474b96a86bSJames Wright   }
489ed3d70dSJames Wright   return 0;
499ed3d70dSJames Wright }
509ed3d70dSJames Wright 
Freestream_Conserv_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)519ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Conserv_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
529ed3d70dSJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_CONSERVATIVE, RIEMANN_HLL);
539ed3d70dSJames Wright }
549ed3d70dSJames Wright 
Freestream_Prim_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)559ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Prim_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
569ed3d70dSJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_PRIMITIVE, RIEMANN_HLL);
579ed3d70dSJames Wright }
589ed3d70dSJames Wright 
Freestream_Entropy_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)599b103f75SJames Wright CEED_QFUNCTION(Freestream_Entropy_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
609b103f75SJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_ENTROPY, RIEMANN_HLL);
619b103f75SJames Wright }
629b103f75SJames Wright 
Freestream_Conserv_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)639ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Conserv_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
649ed3d70dSJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_CONSERVATIVE, RIEMANN_HLLC);
659ed3d70dSJames Wright }
669ed3d70dSJames Wright 
Freestream_Prim_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)679ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Prim_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
689ed3d70dSJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_PRIMITIVE, RIEMANN_HLLC);
699ed3d70dSJames Wright }
709ed3d70dSJames Wright 
Freestream_Entropy_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)719b103f75SJames Wright CEED_QFUNCTION(Freestream_Entropy_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
729b103f75SJames Wright   return Freestream(ctx, Q, in, out, STATEVAR_ENTROPY, RIEMANN_HLLC);
739b103f75SJames Wright }
749b103f75SJames Wright 
Freestream_Jacobian(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out,StateVariable state_var,RiemannFluxType flux_type)759ed3d70dSJames Wright CEED_QFUNCTION_HELPER int Freestream_Jacobian(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateVariable state_var,
769ed3d70dSJames Wright                                               RiemannFluxType flux_type) {
779ed3d70dSJames Wright   const CeedScalar(*dq)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0];
789ed3d70dSJames Wright   const CeedScalar(*q_data_sur)     = in[2];
799ed3d70dSJames Wright   const CeedScalar(*jac_data_sur)   = in[4];
809ed3d70dSJames Wright 
819ed3d70dSJames Wright   CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0];
829ed3d70dSJames Wright 
839ed3d70dSJames Wright   const FreestreamContext     context     = (FreestreamContext)ctx;
84*cde3d787SJames Wright   const NewtonianIGProperties gas         = context->newt_ctx.gas;
85*cde3d787SJames Wright   const bool                  is_implicit = context->newt_ctx.is_implicit;
869ed3d70dSJames Wright   const State                 dS_infty    = {0};
879ed3d70dSJames Wright 
889ed3d70dSJames Wright   CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) {
89feb491a7SJames Wright     CeedScalar wdetJb, normal[3];
90feb491a7SJames Wright     QdataBoundaryUnpack_3D(Q, i, q_data_sur, &wdetJb, NULL, normal);
919ed3d70dSJames Wright     wdetJb *= is_implicit ? -1. : 1.;
929ed3d70dSJames Wright 
939ed3d70dSJames Wright     CeedScalar qi[5], dqi[5];
949ed3d70dSJames Wright     StoredValuesUnpack(Q, i, 0, 5, jac_data_sur, qi);
959ed3d70dSJames Wright     for (int j = 0; j < 5; j++) dqi[j] = dq[j][i];
96*cde3d787SJames Wright     State s  = StateFromQ(gas, qi, state_var);
97*cde3d787SJames Wright     State ds = StateFromQ_fwd(gas, s, dqi, state_var);
989ed3d70dSJames Wright 
999ed3d70dSJames Wright     StateConservative dflux;
1009ed3d70dSJames Wright     switch (flux_type) {
1019ed3d70dSJames Wright       case RIEMANN_HLL:
102*cde3d787SJames Wright         dflux = RiemannFlux_HLL_fwd(gas, s, ds, context->S_infty, dS_infty, normal);
1039ed3d70dSJames Wright         break;
1049ed3d70dSJames Wright       case RIEMANN_HLLC:
105*cde3d787SJames Wright         dflux = RiemannFlux_HLLC_fwd(gas, s, ds, context->S_infty, dS_infty, normal);
1069ed3d70dSJames Wright         break;
1079ed3d70dSJames Wright     }
1089ed3d70dSJames Wright     CeedScalar dFlux[5];
1099ed3d70dSJames Wright     UnpackState_U(dflux, dFlux);
1109ed3d70dSJames Wright     for (CeedInt j = 0; j < 5; j++) v[j][i] = -wdetJb * dFlux[j];
1119ed3d70dSJames Wright   }
1129ed3d70dSJames Wright   return 0;
1139ed3d70dSJames Wright }
1149ed3d70dSJames Wright 
Freestream_Jacobian_Conserv_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1159ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Jacobian_Conserv_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1169ed3d70dSJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_CONSERVATIVE, RIEMANN_HLL);
1179ed3d70dSJames Wright }
1189ed3d70dSJames Wright 
Freestream_Jacobian_Prim_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1199ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Jacobian_Prim_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1209ed3d70dSJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_PRIMITIVE, RIEMANN_HLL);
1219ed3d70dSJames Wright }
1229ed3d70dSJames Wright 
Freestream_Jacobian_Entropy_HLL(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1239b103f75SJames Wright CEED_QFUNCTION(Freestream_Jacobian_Entropy_HLL)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1249b103f75SJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_ENTROPY, RIEMANN_HLL);
1259b103f75SJames Wright }
1269b103f75SJames Wright 
Freestream_Jacobian_Conserv_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1279ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Jacobian_Conserv_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1289ed3d70dSJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_CONSERVATIVE, RIEMANN_HLLC);
1299ed3d70dSJames Wright }
1309ed3d70dSJames Wright 
Freestream_Jacobian_Prim_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1319ed3d70dSJames Wright CEED_QFUNCTION(Freestream_Jacobian_Prim_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1329ed3d70dSJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_PRIMITIVE, RIEMANN_HLLC);
1339ed3d70dSJames Wright }
1349ed3d70dSJames Wright 
Freestream_Jacobian_Entropy_HLLC(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)1359b103f75SJames Wright CEED_QFUNCTION(Freestream_Jacobian_Entropy_HLLC)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
1369b103f75SJames Wright   return Freestream_Jacobian(ctx, Q, in, out, STATEVAR_ENTROPY, RIEMANN_HLLC);
1379b103f75SJames Wright }
138