1dae7673aSJames Wright // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors. 2dae7673aSJames Wright // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause 3dae7673aSJames Wright #include <ceed/types.h> 4dae7673aSJames Wright 5dae7673aSJames Wright #include "../newtonian_state.h" 6dae7673aSJames Wright #include "../utils.h" 7dae7673aSJames Wright 83367f3eeSJames Wright enum TurbComponent { 93367f3eeSJames Wright TURB_MEAN_DENSITY, 103367f3eeSJames Wright TURB_MEAN_PRESSURE, 113367f3eeSJames Wright TURB_MEAN_PRESSURE_SQUARED, 123367f3eeSJames Wright TURB_MEAN_PRESSURE_VELOCITY_X, 133367f3eeSJames Wright TURB_MEAN_PRESSURE_VELOCITY_Y, 143367f3eeSJames Wright TURB_MEAN_PRESSURE_VELOCITY_Z, 153367f3eeSJames Wright TURB_MEAN_DENSITY_TEMPERATURE, 163367f3eeSJames Wright TURB_MEAN_DENSITY_TEMPERATURE_FLUX_X, 173367f3eeSJames Wright TURB_MEAN_DENSITY_TEMPERATURE_FLUX_Y, 183367f3eeSJames Wright TURB_MEAN_DENSITY_TEMPERATURE_FLUX_Z, 193367f3eeSJames Wright TURB_MEAN_MOMENTUM_X, 203367f3eeSJames Wright TURB_MEAN_MOMENTUM_Y, 213367f3eeSJames Wright TURB_MEAN_MOMENTUM_Z, 223367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_XX, 233367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_YY, 243367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_ZZ, 253367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_YZ, 263367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_XZ, 273367f3eeSJames Wright TURB_MEAN_MOMENTUMFLUX_XY, 283367f3eeSJames Wright TURB_MEAN_VELOCITY_X, 293367f3eeSJames Wright TURB_MEAN_VELOCITY_Y, 303367f3eeSJames Wright TURB_MEAN_VELOCITY_Z, 313367f3eeSJames Wright TURB_NUM_COMPONENTS, 323367f3eeSJames Wright }; 333367f3eeSJames Wright 343367f3eeSJames Wright typedef struct Turbulence_SpanStatsContext_ *Turbulence_SpanStatsContext; 353367f3eeSJames Wright struct Turbulence_SpanStatsContext_ { 363367f3eeSJames Wright CeedScalar solution_time; 373367f3eeSJames Wright CeedScalar previous_time; 38*cde3d787SJames Wright struct NewtonianIdealGasContext_ newt_ctx; 393367f3eeSJames Wright }; 403367f3eeSJames Wright 41dae7673aSJames Wright CEED_QFUNCTION_HELPER int ChildStatsCollection(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateVariable state_var) { 42dae7673aSJames Wright const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; 43dae7673aSJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[1]; 44dae7673aSJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 45dae7673aSJames Wright 46dae7673aSJames Wright Turbulence_SpanStatsContext context = (Turbulence_SpanStatsContext)ctx; 47*cde3d787SJames Wright NewtonianIGProperties gas = context->newt_ctx.gas; 48dae7673aSJames Wright CeedScalar delta_t = context->solution_time - context->previous_time; 49dae7673aSJames Wright 50dae7673aSJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 51dae7673aSJames Wright const CeedScalar wdetJ = q_data[0][i] * delta_t; 52dae7673aSJames Wright 53dae7673aSJames Wright const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]}; 54dae7673aSJames Wright const State s = StateFromQ(gas, qi, state_var); 55dae7673aSJames Wright 56dae7673aSJames Wright v[TURB_MEAN_DENSITY][i] = wdetJ * s.U.density; 57dae7673aSJames Wright v[TURB_MEAN_PRESSURE][i] = wdetJ * s.Y.pressure; 58dae7673aSJames Wright v[TURB_MEAN_PRESSURE_SQUARED][i] = wdetJ * Square(s.Y.pressure); 59dae7673aSJames Wright v[TURB_MEAN_PRESSURE_VELOCITY_X][i] = wdetJ * s.Y.pressure * s.Y.velocity[0]; 60dae7673aSJames Wright v[TURB_MEAN_PRESSURE_VELOCITY_Y][i] = wdetJ * s.Y.pressure * s.Y.velocity[1]; 61dae7673aSJames Wright v[TURB_MEAN_PRESSURE_VELOCITY_Z][i] = wdetJ * s.Y.pressure * s.Y.velocity[2]; 62dae7673aSJames Wright v[TURB_MEAN_DENSITY_TEMPERATURE][i] = wdetJ * s.U.density * s.Y.temperature; 63dae7673aSJames Wright v[TURB_MEAN_DENSITY_TEMPERATURE_FLUX_X][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[0]; 64dae7673aSJames Wright v[TURB_MEAN_DENSITY_TEMPERATURE_FLUX_Y][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[1]; 65dae7673aSJames Wright v[TURB_MEAN_DENSITY_TEMPERATURE_FLUX_Z][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[2]; 66dae7673aSJames Wright v[TURB_MEAN_MOMENTUM_X][i] = wdetJ * s.U.momentum[0]; 67dae7673aSJames Wright v[TURB_MEAN_MOMENTUM_Y][i] = wdetJ * s.U.momentum[1]; 68dae7673aSJames Wright v[TURB_MEAN_MOMENTUM_Z][i] = wdetJ * s.U.momentum[2]; 69dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_XX][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[0]; 70dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_YY][i] = wdetJ * s.U.momentum[1] * s.Y.velocity[1]; 71dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_ZZ][i] = wdetJ * s.U.momentum[2] * s.Y.velocity[2]; 72dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_YZ][i] = wdetJ * s.U.momentum[1] * s.Y.velocity[2]; 73dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_XZ][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[2]; 74dae7673aSJames Wright v[TURB_MEAN_MOMENTUMFLUX_XY][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[1]; 75dae7673aSJames Wright v[TURB_MEAN_VELOCITY_X][i] = wdetJ * s.Y.velocity[0]; 76dae7673aSJames Wright v[TURB_MEAN_VELOCITY_Y][i] = wdetJ * s.Y.velocity[1]; 77dae7673aSJames Wright v[TURB_MEAN_VELOCITY_Z][i] = wdetJ * s.Y.velocity[2]; 78dae7673aSJames Wright } 79dae7673aSJames Wright return 0; 80dae7673aSJames Wright } 81dae7673aSJames Wright 82dae7673aSJames Wright CEED_QFUNCTION(ChildStatsCollection_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 83dae7673aSJames Wright return ChildStatsCollection(ctx, Q, in, out, STATEVAR_CONSERVATIVE); 84dae7673aSJames Wright } 85dae7673aSJames Wright 86dae7673aSJames Wright CEED_QFUNCTION(ChildStatsCollection_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 87dae7673aSJames Wright return ChildStatsCollection(ctx, Q, in, out, STATEVAR_PRIMITIVE); 88dae7673aSJames Wright } 89dae7673aSJames Wright 90dae7673aSJames Wright CEED_QFUNCTION(ChildStatsCollection_Entropy)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 91dae7673aSJames Wright return ChildStatsCollection(ctx, Q, in, out, STATEVAR_ENTROPY); 92dae7673aSJames Wright } 93dae7673aSJames Wright 94dae7673aSJames Wright // QFunctions for testing 95dae7673aSJames Wright CEED_QFUNCTION_HELPER CeedScalar ChildStatsCollectionTest_Exact(const CeedScalar x_i[3]) { return x_i[0] + Square(x_i[1]); } 96dae7673aSJames Wright 97dae7673aSJames Wright CEED_QFUNCTION(ChildStatsCollectionMMSTest)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 98dae7673aSJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[1]; 99dae7673aSJames Wright const CeedScalar(*x)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[2]; 100dae7673aSJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 101dae7673aSJames Wright 102dae7673aSJames Wright NewtonianIdealGasContext context = (NewtonianIdealGasContext)ctx; 103dae7673aSJames Wright const CeedScalar t = context->time; 104dae7673aSJames Wright 105dae7673aSJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 106dae7673aSJames Wright const CeedScalar wdetJ = q_data[0][i]; 107dae7673aSJames Wright const CeedScalar x_i[3] = {x[0][i], x[1][i], x[2][i]}; 108dae7673aSJames Wright 109dae7673aSJames Wright // set spanwise domain to [0,1] and integrate from t \in [0,1] to recover exact solution 110dae7673aSJames Wright v[0][i] = wdetJ * (ChildStatsCollectionTest_Exact(x_i) + t - 0.5) * 4 * Cube(x_i[2]); 111dae7673aSJames Wright for (int j = 1; j < 22; j++) v[j][i] = 0; 112dae7673aSJames Wright } 113dae7673aSJames Wright return 0; 114dae7673aSJames Wright } 115dae7673aSJames Wright 116dae7673aSJames Wright CEED_QFUNCTION(ChildStatsCollectionMMSTest_Error)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 117dae7673aSJames Wright const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; 118dae7673aSJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[1]; 119dae7673aSJames Wright const CeedScalar(*x)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[2]; 120dae7673aSJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 121dae7673aSJames Wright 122dae7673aSJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 123dae7673aSJames Wright const CeedScalar wdetJ = q_data[0][i]; 124dae7673aSJames Wright const CeedScalar x_i[3] = {x[0][i], x[1][i], x[2][i]}; 125dae7673aSJames Wright 126dae7673aSJames Wright v[0][i] = wdetJ * Square(ChildStatsCollectionTest_Exact(x_i) - q[0][i]); 127dae7673aSJames Wright } 128dae7673aSJames Wright return 0; 129dae7673aSJames Wright } 130