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