xref: /libCEED/examples/fluids/qfunctions/utils.h (revision 530ad8c4fcac036810a1c230b0a577d30882de6e)
113fa47b2SJames Wright // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
213fa47b2SJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
313fa47b2SJames Wright //
413fa47b2SJames Wright // SPDX-License-Identifier: BSD-2-Clause
513fa47b2SJames Wright //
613fa47b2SJames Wright // This file is part of CEED:  http://github.com/ceed
713fa47b2SJames Wright 
813fa47b2SJames Wright #ifndef utils_h
913fa47b2SJames Wright #define utils_h
1013fa47b2SJames Wright 
1113fa47b2SJames Wright #include <ceed.h>
12c9c2c079SJeremy L Thompson #include <math.h>
1313fa47b2SJames Wright 
1413fa47b2SJames Wright #ifndef M_PI
1513fa47b2SJames Wright #define M_PI 3.14159265358979323846
1613fa47b2SJames Wright #endif
1713fa47b2SJames Wright 
1813fa47b2SJames Wright CEED_QFUNCTION_HELPER CeedScalar Max(CeedScalar a, CeedScalar b) { return a < b ? b : a; }
1913fa47b2SJames Wright CEED_QFUNCTION_HELPER CeedScalar Min(CeedScalar a, CeedScalar b) { return a < b ? a : b; }
2013fa47b2SJames Wright 
2113fa47b2SJames Wright CEED_QFUNCTION_HELPER CeedScalar Square(CeedScalar x) { return x * x; }
2213fa47b2SJames Wright CEED_QFUNCTION_HELPER CeedScalar Cube(CeedScalar x) { return x * x * x; }
2313fa47b2SJames Wright 
24*530ad8c4SKenneth E. Jansen // @brief Scale vector of length N by scalar alpha
25*530ad8c4SKenneth E. Jansen CEED_QFUNCTION_HELPER void ScaleN(CeedScalar *u, const CeedScalar alpha, const CeedInt N) {
26*530ad8c4SKenneth E. Jansen   CeedPragmaSIMD for (CeedInt i = 0; i < N; i++) { u[i] *= alpha; }
27*530ad8c4SKenneth E. Jansen }
28*530ad8c4SKenneth E. Jansen 
2913fa47b2SJames Wright // @brief Dot product of 3 element vectors
302b730f8bSJeremy L Thompson CEED_QFUNCTION_HELPER CeedScalar Dot3(const CeedScalar u[3], const CeedScalar v[3]) { return u[0] * v[0] + u[1] * v[1] + u[2] * v[2]; }
3113fa47b2SJames Wright 
3213fa47b2SJames Wright // @brief Unpack Kelvin-Mandel notation symmetric tensor into full tensor
3313fa47b2SJames Wright CEED_QFUNCTION_HELPER void KMUnpack(const CeedScalar v[6], CeedScalar A[3][3]) {
3413fa47b2SJames Wright   const CeedScalar weight = 1 / sqrt(2.);
3513fa47b2SJames Wright   A[0][0]                 = v[0];
3613fa47b2SJames Wright   A[1][1]                 = v[1];
3713fa47b2SJames Wright   A[2][2]                 = v[2];
3813fa47b2SJames Wright   A[2][1] = A[1][2] = weight * v[3];
3913fa47b2SJames Wright   A[2][0] = A[0][2] = weight * v[4];
4013fa47b2SJames Wright   A[1][0] = A[0][1] = weight * v[5];
4113fa47b2SJames Wright }
4213fa47b2SJames Wright 
43*530ad8c4SKenneth E. Jansen // @brief Linear ramp evaluation
44*530ad8c4SKenneth E. Jansen CEED_QFUNCTION_HELPER CeedScalar LinearRampCoefficient(CeedScalar amplitude, CeedScalar length, CeedScalar start, CeedScalar x) {
45*530ad8c4SKenneth E. Jansen   if (x < start) {
46*530ad8c4SKenneth E. Jansen     return amplitude;
47*530ad8c4SKenneth E. Jansen   } else if (x < start + length) {
48*530ad8c4SKenneth E. Jansen     return amplitude * ((x - start) * (-1 / length) + 1);
49*530ad8c4SKenneth E. Jansen   } else {
50*530ad8c4SKenneth E. Jansen     return 0;
51*530ad8c4SKenneth E. Jansen   }
52*530ad8c4SKenneth E. Jansen }
53*530ad8c4SKenneth E. Jansen 
5413fa47b2SJames Wright #endif  // utils_h
55