// Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. // // SPDX-License-Identifier: BSD-2-Clause // // This file is part of CEED: http://github.com/ceed /// @file /// Operator for Navier-Stokes example using PETSc #ifndef channel_h #define channel_h #include #include #include "newtonian_types.h" #include "utils.h" typedef struct ChannelContext_ *ChannelContext; struct ChannelContext_ { bool implicit; // !< Using implicit timesteping or not CeedScalar theta0; // !< Reference temperature CeedScalar P0; // !< Reference Pressure CeedScalar umax; // !< Centerline velocity CeedScalar center; // !< Y Coordinate for center of channel CeedScalar H; // !< Channel half-height CeedScalar B; // !< Body-force driving the flow struct NewtonianIdealGasContext_ newtonian_ctx; }; CEED_QFUNCTION_HELPER CeedInt Exact_Channel(CeedInt dim, CeedScalar time, const CeedScalar X[], CeedInt Nf, CeedScalar q[], void *ctx) { const ChannelContext context = (ChannelContext)ctx; const CeedScalar theta0 = context->theta0; const CeedScalar P0 = context->P0; const CeedScalar umax = context->umax; const CeedScalar center = context->center; const CeedScalar H = context->H; const CeedScalar cv = context->newtonian_ctx.cv; const CeedScalar cp = context->newtonian_ctx.cp; const CeedScalar Rd = cp - cv; const CeedScalar mu = context->newtonian_ctx.mu; const CeedScalar k = context->newtonian_ctx.k; const CeedScalar y=X[1]; const CeedScalar Pr = mu / (cp*k); const CeedScalar Ec = (umax*umax) / (cp*theta0); const CeedScalar theta = theta0*(1 + (Pr*Ec/3) * (1 - Square(Square((y-center)/H)))); const CeedScalar p = P0; const CeedScalar rho = p / (Rd*theta); q[0] = rho; q[1] = rho * umax*(1 - Square((y-center)/H)); q[2] = 0; q[3] = 0; q[4] = rho * (cv*theta) + .5 * (q[1]*q[1] + q[2]*q[2] + q[3]*q[3]) / rho; return 0; } // ***************************************************************************** // This QFunction sets the initial condition // ***************************************************************************** CEED_QFUNCTION(ICsChannel)(void *ctx, CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out) { // Inputs const CeedScalar (*X)[CEED_Q_VLA] = (const CeedScalar(*)[CEED_Q_VLA])in[0]; // Outputs CeedScalar (*q0)[CEED_Q_VLA] = (CeedScalar(*)[CEED_Q_VLA])out[0]; // Quadrature Point Loop CeedPragmaSIMD for (CeedInt i=0; iimplicit; const CeedScalar cv = context->newtonian_ctx.cv; const CeedScalar cp = context->newtonian_ctx.cp; const CeedScalar gamma = cp/cv; CeedPragmaSIMD // Quadrature Point Loop for (CeedInt i=0; iimplicit; const CeedScalar P0 = context->P0; CeedPragmaSIMD // Quadrature Point Loop for (CeedInt i=0; i