1*729f4e9bSJames Wright // Copyright (c) 2017-2023, Lawrence Livermore National Security, LLC and other CEED contributors. 2*729f4e9bSJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3*729f4e9bSJames Wright // 4*729f4e9bSJames Wright // SPDX-License-Identifier: BSD-2-Clause 5*729f4e9bSJames Wright // 6*729f4e9bSJames Wright // This file is part of CEED: http://github.com/ceed 7*729f4e9bSJames Wright 8*729f4e9bSJames Wright #include <ceed.h> 9*729f4e9bSJames Wright 10*729f4e9bSJames Wright #include "newtonian_state.h" 11*729f4e9bSJames Wright #include "utils.h" 12*729f4e9bSJames Wright 13*729f4e9bSJames Wright CEED_QFUNCTION_HELPER int ChildStatsCollection(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, StateFromQi_t StateFromQi, 14*729f4e9bSJames Wright StateFromQi_fwd_t StateFromQi_fwd) { 15*729f4e9bSJames Wright const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; 16*729f4e9bSJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[1]; 17*729f4e9bSJames Wright const CeedScalar(*x)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[2]; 18*729f4e9bSJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 19*729f4e9bSJames Wright 20*729f4e9bSJames Wright NewtonianIdealGasContext context = (NewtonianIdealGasContext)ctx; 21*729f4e9bSJames Wright 22*729f4e9bSJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 23*729f4e9bSJames Wright const CeedScalar wdetJ = q_data[0][i]; 24*729f4e9bSJames Wright 25*729f4e9bSJames Wright const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]}; 26*729f4e9bSJames Wright const CeedScalar x_i[3] = {x[0][i], x[1][i], x[2][i]}; 27*729f4e9bSJames Wright const State s = StateFromQi(context, qi, x_i); 28*729f4e9bSJames Wright 29*729f4e9bSJames Wright v[0][i] = wdetJ * s.U.density; 30*729f4e9bSJames Wright v[1][i] = wdetJ * s.Y.pressure; 31*729f4e9bSJames Wright v[2][i] = wdetJ * Square(s.Y.pressure); 32*729f4e9bSJames Wright v[3][i] = wdetJ * s.Y.pressure * s.Y.velocity[0]; 33*729f4e9bSJames Wright v[4][i] = wdetJ * s.Y.pressure * s.Y.velocity[1]; 34*729f4e9bSJames Wright v[5][i] = wdetJ * s.Y.pressure * s.Y.velocity[2]; 35*729f4e9bSJames Wright v[6][i] = wdetJ * s.U.density * s.Y.temperature; 36*729f4e9bSJames Wright v[7][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[0]; 37*729f4e9bSJames Wright v[8][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[1]; 38*729f4e9bSJames Wright v[9][i] = wdetJ * s.U.density * s.Y.temperature * s.Y.velocity[2]; 39*729f4e9bSJames Wright v[10][i] = wdetJ * s.U.momentum[0]; 40*729f4e9bSJames Wright v[11][i] = wdetJ * s.U.momentum[1]; 41*729f4e9bSJames Wright v[12][i] = wdetJ * s.U.momentum[2]; 42*729f4e9bSJames Wright v[13][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[0]; 43*729f4e9bSJames Wright v[14][i] = wdetJ * s.U.momentum[1] * s.Y.velocity[1]; 44*729f4e9bSJames Wright v[15][i] = wdetJ * s.U.momentum[2] * s.Y.velocity[2]; 45*729f4e9bSJames Wright v[16][i] = wdetJ * s.U.momentum[1] * s.Y.velocity[2]; 46*729f4e9bSJames Wright v[17][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[2]; 47*729f4e9bSJames Wright v[18][i] = wdetJ * s.U.momentum[0] * s.Y.velocity[1]; 48*729f4e9bSJames Wright v[19][i] = wdetJ * s.Y.velocity[0]; 49*729f4e9bSJames Wright v[20][i] = wdetJ * s.Y.velocity[1]; 50*729f4e9bSJames Wright v[21][i] = wdetJ * s.Y.velocity[2]; 51*729f4e9bSJames Wright } 52*729f4e9bSJames Wright return 0; 53*729f4e9bSJames Wright } 54*729f4e9bSJames Wright 55*729f4e9bSJames Wright CEED_QFUNCTION(ChildStatsCollection_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 56*729f4e9bSJames Wright return ChildStatsCollection(ctx, Q, in, out, StateFromU, StateFromU_fwd); 57*729f4e9bSJames Wright } 58*729f4e9bSJames Wright 59*729f4e9bSJames Wright CEED_QFUNCTION(ChildStatsCollection_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 60*729f4e9bSJames Wright return ChildStatsCollection(ctx, Q, in, out, StateFromY, StateFromY_fwd); 61*729f4e9bSJames Wright } 62*729f4e9bSJames Wright 63*729f4e9bSJames Wright CEED_QFUNCTION(ChildStatsCollectionTest)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 64*729f4e9bSJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[1]; 65*729f4e9bSJames Wright const CeedScalar(*x)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[2]; 66*729f4e9bSJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 67*729f4e9bSJames Wright 68*729f4e9bSJames Wright NewtonianIdealGasContext context = (NewtonianIdealGasContext)ctx; 69*729f4e9bSJames Wright const CeedScalar t = context->time; 70*729f4e9bSJames Wright 71*729f4e9bSJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 72*729f4e9bSJames Wright const CeedScalar wdetJ = q_data[0][i]; 73*729f4e9bSJames Wright const CeedScalar x_i[3] = {x[0][i], x[1][i], x[2][i]}; 74*729f4e9bSJames Wright 75*729f4e9bSJames Wright v[0][i] = wdetJ * ((x_i[0] + Square(x_i[1]) + t - 0.5) * 4 * Cube(x_i[2])); 76*729f4e9bSJames Wright } 77*729f4e9bSJames Wright return 0; 78*729f4e9bSJames Wright } 79