xref: /honee/qfunctions/utils.h (revision bfa7851aa6f3080b85c093b9ccc227f7e9f9bc6b)
1704b8bbeSJames Wright // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2704b8bbeSJames Wright // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3704b8bbeSJames Wright //
4704b8bbeSJames Wright // SPDX-License-Identifier: BSD-2-Clause
5704b8bbeSJames Wright //
6704b8bbeSJames Wright // This file is part of CEED:  http://github.com/ceed
7704b8bbeSJames Wright 
8704b8bbeSJames Wright #ifndef utils_h
9704b8bbeSJames Wright #define utils_h
10704b8bbeSJames Wright 
11704b8bbeSJames Wright #include <ceed.h>
12d0cce58aSJeremy L Thompson #include <math.h>
13704b8bbeSJames Wright 
14704b8bbeSJames Wright #ifndef M_PI
15704b8bbeSJames Wright #define M_PI 3.14159265358979323846
16704b8bbeSJames Wright #endif
17704b8bbeSJames Wright 
18704b8bbeSJames Wright CEED_QFUNCTION_HELPER CeedScalar Max(CeedScalar a, CeedScalar b) { return a < b ? b : a; }
19704b8bbeSJames Wright CEED_QFUNCTION_HELPER CeedScalar Min(CeedScalar a, CeedScalar b) { return a < b ? a : b; }
20704b8bbeSJames Wright 
21*bfa7851aSJames Wright CEED_QFUNCTION_HELPER void SwapScalar(CeedScalar *a, CeedScalar *b) {
22*bfa7851aSJames Wright   CeedScalar temp = *a;
23*bfa7851aSJames Wright   *a              = *b;
24*bfa7851aSJames Wright   *b              = temp;
25*bfa7851aSJames Wright }
26*bfa7851aSJames Wright 
27704b8bbeSJames Wright CEED_QFUNCTION_HELPER CeedScalar Square(CeedScalar x) { return x * x; }
28704b8bbeSJames Wright CEED_QFUNCTION_HELPER CeedScalar Cube(CeedScalar x) { return x * x * x; }
29704b8bbeSJames Wright 
30e7754af5SKenneth E. Jansen // @brief Scale vector of length N by scalar alpha
31e7754af5SKenneth E. Jansen CEED_QFUNCTION_HELPER void ScaleN(CeedScalar *u, const CeedScalar alpha, const CeedInt N) {
32e7754af5SKenneth E. Jansen   CeedPragmaSIMD for (CeedInt i = 0; i < N; i++) { u[i] *= alpha; }
33e7754af5SKenneth E. Jansen }
34e7754af5SKenneth E. Jansen 
35704b8bbeSJames Wright // @brief Dot product of 3 element vectors
362b916ea7SJeremy 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]; }
37704b8bbeSJames Wright 
38704b8bbeSJames Wright // @brief Unpack Kelvin-Mandel notation symmetric tensor into full tensor
39704b8bbeSJames Wright CEED_QFUNCTION_HELPER void KMUnpack(const CeedScalar v[6], CeedScalar A[3][3]) {
40704b8bbeSJames Wright   const CeedScalar weight = 1 / sqrt(2.);
41704b8bbeSJames Wright   A[0][0]                 = v[0];
42704b8bbeSJames Wright   A[1][1]                 = v[1];
43704b8bbeSJames Wright   A[2][2]                 = v[2];
44704b8bbeSJames Wright   A[2][1] = A[1][2] = weight * v[3];
45704b8bbeSJames Wright   A[2][0] = A[0][2] = weight * v[4];
46704b8bbeSJames Wright   A[1][0] = A[0][1] = weight * v[5];
47704b8bbeSJames Wright }
48704b8bbeSJames Wright 
49e7754af5SKenneth E. Jansen // @brief Linear ramp evaluation
50e7754af5SKenneth E. Jansen CEED_QFUNCTION_HELPER CeedScalar LinearRampCoefficient(CeedScalar amplitude, CeedScalar length, CeedScalar start, CeedScalar x) {
51e7754af5SKenneth E. Jansen   if (x < start) {
52e7754af5SKenneth E. Jansen     return amplitude;
53e7754af5SKenneth E. Jansen   } else if (x < start + length) {
54e7754af5SKenneth E. Jansen     return amplitude * ((x - start) * (-1 / length) + 1);
55e7754af5SKenneth E. Jansen   } else {
56e7754af5SKenneth E. Jansen     return 0;
57e7754af5SKenneth E. Jansen   }
58e7754af5SKenneth E. Jansen }
59e7754af5SKenneth E. Jansen 
60704b8bbeSJames Wright #endif  // utils_h
61