1df1a6dc8SJames Wright // Copyright (c) 2017-2023, Lawrence Livermore National Security, LLC and other CEED contributors. 2df1a6dc8SJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 3df1a6dc8SJames Wright // 4df1a6dc8SJames Wright // SPDX-License-Identifier: BSD-2-Clause 5df1a6dc8SJames Wright // 6df1a6dc8SJames Wright // This file is part of CEED: http://github.com/ceed 7df1a6dc8SJames Wright 8df1a6dc8SJames Wright #ifndef velocity_gradient_projection_h 9df1a6dc8SJames Wright #define velocity_gradient_projection_h 10df1a6dc8SJames Wright 11df1a6dc8SJames Wright #include <ceed.h> 12df1a6dc8SJames Wright 13df1a6dc8SJames Wright #include "newtonian_state.h" 14df1a6dc8SJames Wright #include "newtonian_types.h" 15df1a6dc8SJames Wright #include "utils.h" 16df1a6dc8SJames Wright 17df1a6dc8SJames Wright CEED_QFUNCTION_HELPER int VelocityGradientProjectionRHS(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, 18*be91e165SJames Wright StateVariable state_var) { 19df1a6dc8SJames Wright const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; 20df1a6dc8SJames Wright const CeedScalar(*Grad_q)[5][CEED_Q_VLA] = (const CeedScalar(*)[5][CEED_Q_VLA])in[1]; 21df1a6dc8SJames Wright const CeedScalar(*q_data)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[2]; 22df1a6dc8SJames Wright const CeedScalar(*x)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[3]; 23df1a6dc8SJames Wright CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 24df1a6dc8SJames Wright 25df1a6dc8SJames Wright NewtonianIdealGasContext context = (NewtonianIdealGasContext)ctx; 26df1a6dc8SJames Wright 27df1a6dc8SJames Wright CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 28df1a6dc8SJames Wright const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]}; 29df1a6dc8SJames Wright const CeedScalar x_i[3] = {x[0][i], x[1][i], x[2][i]}; 30df1a6dc8SJames Wright const CeedScalar wdetJ = q_data[0][i]; 31df1a6dc8SJames Wright const CeedScalar dXdx[3][3] = { 32df1a6dc8SJames Wright {q_data[1][i], q_data[2][i], q_data[3][i]}, 33df1a6dc8SJames Wright {q_data[4][i], q_data[5][i], q_data[6][i]}, 34df1a6dc8SJames Wright {q_data[7][i], q_data[8][i], q_data[9][i]} 35df1a6dc8SJames Wright }; 36df1a6dc8SJames Wright 37*be91e165SJames Wright const State s = StateFromQ(context, qi, x_i, state_var); 38df1a6dc8SJames Wright State grad_s[3]; 39df1a6dc8SJames Wright for (CeedInt j = 0; j < 3; j++) { 40df1a6dc8SJames Wright CeedScalar dx_i[3] = {0}, dqi[5]; 41df1a6dc8SJames Wright for (CeedInt k = 0; k < 5; k++) { 42df1a6dc8SJames Wright dqi[k] = Grad_q[0][k][i] * dXdx[0][j] + Grad_q[1][k][i] * dXdx[1][j] + Grad_q[2][k][i] * dXdx[2][j]; 43df1a6dc8SJames Wright } 44df1a6dc8SJames Wright dx_i[j] = 1.; 45*be91e165SJames Wright grad_s[j] = StateFromQ_fwd(context, s, dqi, x_i, dx_i, state_var); 46df1a6dc8SJames Wright } 47df1a6dc8SJames Wright 48df1a6dc8SJames Wright CeedScalar grad_velocity[3][3]; 49df1a6dc8SJames Wright VelocityGradient(grad_s, grad_velocity); 50df1a6dc8SJames Wright 51df1a6dc8SJames Wright for (CeedInt j = 0; j < 3; j++) { 52df1a6dc8SJames Wright for (CeedInt k = 0; k < 3; k++) { 53df1a6dc8SJames Wright v[j * 3 + k][i] = wdetJ * grad_velocity[j][k]; 54df1a6dc8SJames Wright } 55df1a6dc8SJames Wright } 56df1a6dc8SJames Wright } 57df1a6dc8SJames Wright return 0; 58df1a6dc8SJames Wright } 59df1a6dc8SJames Wright 60df1a6dc8SJames Wright CEED_QFUNCTION(VelocityGradientProjectionRHS_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 61*be91e165SJames Wright return VelocityGradientProjectionRHS(ctx, Q, in, out, STATEVAR_CONSERVATIVE); 62df1a6dc8SJames Wright } 63df1a6dc8SJames Wright 64df1a6dc8SJames Wright CEED_QFUNCTION(VelocityGradientProjectionRHS_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 65*be91e165SJames Wright return VelocityGradientProjectionRHS(ctx, Q, in, out, STATEVAR_PRIMITIVE); 66df1a6dc8SJames Wright } 67df1a6dc8SJames Wright #endif // velocity_gradient_projection_h 68