xref: /honee/qfunctions/monitor_totalkineticenergy.h (revision cde3d787254b08959b09942e5479b240fd3e38f4)
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 newt_ctx = (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   const NewtonianIGProperties gas = newt_ctx->gas;
16   CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++) {
17     const CeedScalar qi[5] = {q[0][i], q[1][i], q[2][i], q[3][i], q[4][i]};
18     const State      s     = StateFromQ(gas, qi, state_var);
19     CeedScalar       wdetJ, dXdx[3][3], vorticity[3], kmstrain_rate[6], strain_rate[3][3];
20     State            grad_s[3];
21 
22     QdataUnpack_3D(Q, i, q_data, &wdetJ, dXdx);
23     StatePhysicalGradientFromReference(Q, i, gas, s, state_var, Grad_q, dXdx, grad_s);
24 
25     v[0][i] = wdetJ * 0.5 * s.U.density * Dot3(s.Y.velocity, s.Y.velocity);
26     KMStrainRate_State(grad_s, kmstrain_rate);
27     {  // See Kundu eq. 4.60
28       CeedScalar div_u = kmstrain_rate[0] + kmstrain_rate[1] + kmstrain_rate[2];
29       KMUnpack(kmstrain_rate, strain_rate);
30       v[1][i] = wdetJ * -2 * gas.mu * DotN((CeedScalar *)strain_rate, (CeedScalar *)strain_rate, 9);
31       v[2][i] = wdetJ * -gas.lambda * gas.mu * Square(div_u);
32       v[3][i] = wdetJ * s.Y.pressure * div_u;
33     }
34     Vorticity(grad_s, vorticity);
35     v[4][i] = wdetJ * gas.mu * Dot3(vorticity, vorticity);
36   }
37   return 0;
38 }
39 
40 CEED_QFUNCTION(MonitorTotalKineticEnergy_Conserv)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
41   return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_CONSERVATIVE);
42 }
43 
44 CEED_QFUNCTION(MonitorTotalKineticEnergy_Prim)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
45   return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_PRIMITIVE);
46 }
47 
48 CEED_QFUNCTION(MonitorTotalKineticEnergy_Entropy)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) {
49   return MonitorTotalKineticEnergy(ctx, Q, in, out, STATEVAR_ENTROPY);
50 }
51