1 // SPDX-FileCopyrightText: Copyright (c) 2017-2024, HONEE contributors. 2 // SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause 3 4 #include <ceed/types.h> 5 #include "newtonian_state.h" 6 7 CEED_QFUNCTION_HELPER int MonitorTotalKineticEnergy(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out, 8 StateVariable state_var) { 9 const NewtonianIdealGasContext gas = (const NewtonianIdealGasContext)ctx; 10 const CeedScalar(*q)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; 11 const CeedScalar(*Grad_q) = in[1]; 12 const CeedScalar(*q_data) = in[2]; 13 CeedScalar(*v)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; 14 15 CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) { 16 const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]}; 17 const State s = StateFromQ(gas, qi, state_var); 18 CeedScalar wdetJ, dXdx[3][3], vorticity[3], kmstrain_rate[6], strain_rate[3][3]; 19 State grad_s[3]; 20 21 QdataUnpack_3D(Q, i, q_data, &wdetJ, dXdx); 22 StatePhysicalGradientFromReference(Q, i, gas, s, state_var, Grad_q, dXdx, grad_s); 23 24 v[0][i] = wdetJ * 0.5 * s.U.density * Dot3(s.Y.velocity, s.Y.velocity); 25 KMStrainRate_State(grad_s, kmstrain_rate); 26 { // See Kundu eq. 4.60 27 CeedScalar div_u = kmstrain_rate[0] + kmstrain_rate[1] + kmstrain_rate[2]; 28 KMUnpack(kmstrain_rate, strain_rate); 29 v[1][i] = wdetJ * -2 * gas->mu * DotN((CeedScalar *)strain_rate, (CeedScalar *)strain_rate, 9); 30 v[2][i] = wdetJ * -gas->lambda * gas->mu * Square(div_u); 31 v[3][i] = wdetJ * s.Y.pressure * div_u; 32 } 33 Vorticity(grad_s, vorticity); 34 v[4][i] = wdetJ * gas->mu * Dot3(vorticity, vorticity); 35 } 36 return 0; 37 } 38 39 CEED_QFUNCTION(MonitorTotalKineticEnergy_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 40 return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_CONSERVATIVE); 41 } 42 43 CEED_QFUNCTION(MonitorTotalKineticEnergy_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 44 return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_PRIMITIVE); 45 } 46 47 CEED_QFUNCTION(MonitorTotalKineticEnergy_Entropy)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { 48 return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_ENTROPY); 49 } 50