xref: /honee/qfunctions/gaussianwave.h (revision edcfef1b6f4e32859128041f533d18dbf23dee67)
1e7754af5SKenneth E. Jansen // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2e7754af5SKenneth E. Jansen // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3e7754af5SKenneth E. Jansen //
4e7754af5SKenneth E. Jansen // SPDX-License-Identifier: BSD-2-Clause
5e7754af5SKenneth E. Jansen //
6e7754af5SKenneth E. Jansen // This file is part of CEED:  http://github.com/ceed
7e7754af5SKenneth E. Jansen 
8e7754af5SKenneth E. Jansen /// @file
9e7754af5SKenneth E. Jansen /// Thermodynamic wave propogation for testing freestream/non-reflecting boundary conditions. Proposed in Mengaldo et. al. 2014
10e7754af5SKenneth E. Jansen 
11e7754af5SKenneth E. Jansen #include <ceed.h>
12e7754af5SKenneth E. Jansen #include <math.h>
13e7754af5SKenneth E. Jansen 
14e7754af5SKenneth E. Jansen #include "newtonian_state.h"
15e7754af5SKenneth E. Jansen #include "utils.h"
16e7754af5SKenneth E. Jansen 
17e7754af5SKenneth E. Jansen typedef struct GaussianWaveContext_ *GaussianWaveContext;
18e7754af5SKenneth E. Jansen struct GaussianWaveContext_ {
19e7754af5SKenneth E. Jansen   CeedScalar                       epicenter[3];  // Location of the perturbation
20e7754af5SKenneth E. Jansen   CeedScalar                       width;         // Controls width of the perturbation
21e7754af5SKenneth E. Jansen   CeedScalar                       amplitude;     // Amplitude of the perturbation
22e7754af5SKenneth E. Jansen   State                            S_infty;       // Flow state at infinity
23e7754af5SKenneth E. Jansen   struct NewtonianIdealGasContext_ newt_ctx;
24e7754af5SKenneth E. Jansen };
25e7754af5SKenneth E. Jansen 
268fff8293SJames Wright CEED_QFUNCTION_HELPER int IC_GaussianWave(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateVariable state_var) {
27e7754af5SKenneth E. Jansen   const CeedScalar(*X)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0];
28e7754af5SKenneth E. Jansen 
29e7754af5SKenneth E. Jansen   CeedScalar(*q0)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0];
30e7754af5SKenneth E. Jansen 
31e7754af5SKenneth E. Jansen   const GaussianWaveContext      context  = (GaussianWaveContext)ctx;
32e7754af5SKenneth E. Jansen   const NewtonianIdealGasContext newt_ctx = &context->newt_ctx;
33e7754af5SKenneth E. Jansen 
34e7754af5SKenneth E. Jansen   const CeedScalar amplitude = context->amplitude;
35e7754af5SKenneth E. Jansen   const CeedScalar width     = context->width;
36e7754af5SKenneth E. Jansen   const State      S_infty   = context->S_infty;
37e7754af5SKenneth E. Jansen   const CeedScalar xc        = context->epicenter[0];
38e7754af5SKenneth E. Jansen   const CeedScalar yc        = context->epicenter[1];
39e7754af5SKenneth E. Jansen 
40e7754af5SKenneth E. Jansen   const CeedScalar gamma = HeatCapacityRatio(newt_ctx);
41e7754af5SKenneth E. Jansen 
42e7754af5SKenneth E. Jansen   CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) {
43e7754af5SKenneth E. Jansen     CeedScalar       U[5] = {0.}, qi[5] = {0.};
44e7754af5SKenneth E. Jansen     const CeedScalar x[3]      = {X[0][i], X[1][i], X[2][i]};
45e7754af5SKenneth E. Jansen     const CeedScalar x0        = x[0] - xc;
46e7754af5SKenneth E. Jansen     const CeedScalar y0        = x[1] - yc;
47e7754af5SKenneth E. Jansen     const CeedScalar e_kinetic = 0.5 * S_infty.U.density * Dot3(S_infty.Y.velocity, S_infty.Y.velocity);
48e7754af5SKenneth E. Jansen 
49e7754af5SKenneth E. Jansen     const CeedScalar perturbation = 1 + amplitude * exp(-(Square(x0) + Square(y0)) / (2 * Square(width)));
50e7754af5SKenneth E. Jansen 
51e7754af5SKenneth E. Jansen     U[0] = S_infty.U.density * perturbation;
52e7754af5SKenneth E. Jansen     U[1] = S_infty.Y.velocity[0] * U[0];
53e7754af5SKenneth E. Jansen     U[2] = S_infty.Y.velocity[1] * U[0];
54e7754af5SKenneth E. Jansen     U[3] = S_infty.Y.velocity[2] * U[0];
55e7754af5SKenneth E. Jansen     U[4] = S_infty.Y.pressure / (gamma - 1) * perturbation + e_kinetic;
56e7754af5SKenneth E. Jansen 
57*edcfef1bSKenneth E. Jansen     State initCond = StateFromU(newt_ctx, U);
588fff8293SJames Wright     StateToQ(newt_ctx, initCond, qi, state_var);
59e7754af5SKenneth E. Jansen 
60e7754af5SKenneth E. Jansen     for (CeedInt j = 0; j < 5; j++) q0[j][i] = qi[j];
61e7754af5SKenneth E. Jansen   }
62e7754af5SKenneth E. Jansen 
63e7754af5SKenneth E. Jansen   return 0;
64e7754af5SKenneth E. Jansen }
65e7754af5SKenneth E. Jansen 
66e7754af5SKenneth E. Jansen CEED_QFUNCTION(IC_GaussianWave_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
678fff8293SJames Wright   return IC_GaussianWave(ctx, Q, in, out, STATEVAR_CONSERVATIVE);
68e7754af5SKenneth E. Jansen }
69e7754af5SKenneth E. Jansen 
70e7754af5SKenneth E. Jansen CEED_QFUNCTION(IC_GaussianWave_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
718fff8293SJames Wright   return IC_GaussianWave(ctx, Q, in, out, STATEVAR_PRIMITIVE);
72e7754af5SKenneth E. Jansen }
73