1ae2b091fSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors.
2ae2b091fSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause
3e7754af5SKenneth E. Jansen
4e7754af5SKenneth E. Jansen /// @file
5e7754af5SKenneth E. Jansen /// Thermodynamic wave propogation for testing freestream/non-reflecting boundary conditions. Proposed in Mengaldo et. al. 2014
63e17a7a1SJames Wright #include <ceed/types.h>
7e7754af5SKenneth E. Jansen
8e7754af5SKenneth E. Jansen #include "newtonian_state.h"
9e7754af5SKenneth E. Jansen #include "utils.h"
10e7754af5SKenneth E. Jansen
11e7754af5SKenneth E. Jansen typedef struct GaussianWaveContext_ *GaussianWaveContext;
12e7754af5SKenneth E. Jansen struct GaussianWaveContext_ {
13e7754af5SKenneth E. Jansen CeedScalar epicenter[3]; // Location of the perturbation
14e7754af5SKenneth E. Jansen CeedScalar width; // Controls width of the perturbation
15e7754af5SKenneth E. Jansen CeedScalar amplitude; // Amplitude of the perturbation
16e7754af5SKenneth E. Jansen State S_infty; // Flow state at infinity
17e7754af5SKenneth E. Jansen struct NewtonianIdealGasContext_ newt_ctx;
18e7754af5SKenneth E. Jansen };
19e7754af5SKenneth E. Jansen
IC_GaussianWave(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out,StateVariable state_var)208fff8293SJames Wright CEED_QFUNCTION_HELPER int IC_GaussianWave(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateVariable state_var) {
21e7754af5SKenneth E. Jansen const CeedScalar(*X)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0];
22e7754af5SKenneth E. Jansen
23e7754af5SKenneth E. Jansen CeedScalar(*q0)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0];
24e7754af5SKenneth E. Jansen
25e7754af5SKenneth E. Jansen const GaussianWaveContext context = (GaussianWaveContext)ctx;
26e7754af5SKenneth E. Jansen const NewtonianIdealGasContext newt_ctx = &context->newt_ctx;
27*cde3d787SJames Wright const NewtonianIGProperties gas = newt_ctx->gas;
28e7754af5SKenneth E. Jansen
29e7754af5SKenneth E. Jansen const CeedScalar amplitude = context->amplitude;
30e7754af5SKenneth E. Jansen const CeedScalar width = context->width;
31e7754af5SKenneth E. Jansen const State S_infty = context->S_infty;
32e7754af5SKenneth E. Jansen const CeedScalar xc = context->epicenter[0];
33e7754af5SKenneth E. Jansen const CeedScalar yc = context->epicenter[1];
34e7754af5SKenneth E. Jansen
35*cde3d787SJames Wright const CeedScalar gamma = HeatCapacityRatio(gas);
36e7754af5SKenneth E. Jansen
37e7754af5SKenneth E. Jansen CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) {
38a541e550SJames Wright CeedScalar U[5], qi[5];
39e7754af5SKenneth E. Jansen const CeedScalar x[3] = {X[0][i], X[1][i], X[2][i]};
40e7754af5SKenneth E. Jansen const CeedScalar x0 = x[0] - xc;
41e7754af5SKenneth E. Jansen const CeedScalar y0 = x[1] - yc;
42e7754af5SKenneth E. Jansen const CeedScalar e_kinetic = 0.5 * S_infty.U.density * Dot3(S_infty.Y.velocity, S_infty.Y.velocity);
43e7754af5SKenneth E. Jansen
44e7754af5SKenneth E. Jansen const CeedScalar perturbation = 1 + amplitude * exp(-(Square(x0) + Square(y0)) / (2 * Square(width)));
45e7754af5SKenneth E. Jansen
46e7754af5SKenneth E. Jansen U[0] = S_infty.U.density * perturbation;
47e7754af5SKenneth E. Jansen U[1] = S_infty.Y.velocity[0] * U[0];
48e7754af5SKenneth E. Jansen U[2] = S_infty.Y.velocity[1] * U[0];
49e7754af5SKenneth E. Jansen U[3] = S_infty.Y.velocity[2] * U[0];
50e7754af5SKenneth E. Jansen U[4] = S_infty.Y.pressure / (gamma - 1) * perturbation + e_kinetic;
51e7754af5SKenneth E. Jansen
52*cde3d787SJames Wright State initCond = StateFromU(gas, U);
53*cde3d787SJames Wright StateToQ(gas, initCond, qi, state_var);
54e7754af5SKenneth E. Jansen
55e7754af5SKenneth E. Jansen for (CeedInt j = 0; j < 5; j++) q0[j][i] = qi[j];
56e7754af5SKenneth E. Jansen }
57e7754af5SKenneth E. Jansen
58e7754af5SKenneth E. Jansen return 0;
59e7754af5SKenneth E. Jansen }
60e7754af5SKenneth E. Jansen
IC_GaussianWave_Conserv(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)61e7754af5SKenneth E. Jansen CEED_QFUNCTION(IC_GaussianWave_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
628fff8293SJames Wright return IC_GaussianWave(ctx, Q, in, out, STATEVAR_CONSERVATIVE);
63e7754af5SKenneth E. Jansen }
64e7754af5SKenneth E. Jansen
IC_GaussianWave_Prim(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)65e7754af5SKenneth E. Jansen CEED_QFUNCTION(IC_GaussianWave_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
668fff8293SJames Wright return IC_GaussianWave(ctx, Q, in, out, STATEVAR_PRIMITIVE);
67e7754af5SKenneth E. Jansen }
689b103f75SJames Wright
IC_GaussianWave_Entropy(void * ctx,CeedInt Q,const CeedScalar * const * in,CeedScalar * const * out)699b103f75SJames Wright CEED_QFUNCTION(IC_GaussianWave_Entropy)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
709b103f75SJames Wright return IC_GaussianWave(ctx, Q, in, out, STATEVAR_ENTROPY);
719b103f75SJames Wright }
72