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