xref: /libCEED/tests/t319-basis.h (revision 681d0ea73ee05192cf73f31e6e4a886b41175395)
1 // Copyright (c) 2017-2024, Lawrence Livermore National Security, LLC and other CEED contributors.
2 // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
3 //
4 // SPDX-License-Identifier: BSD-2-Clause
5 //
6 // This file is part of CEED:  http://github.com/ceed
7 
8 #include <ceed.h>
9 
10 // Interpolation matrices for cell-to-face of Q1 hexahedral element onto it's "5" face (in PETSc)
11 // Nodes are at Gauss-Lobatto points and quadrature points are Gauss, all over [-1,1] domain range
12 const CeedScalar Q1_interp_gauss[4][8] = {
13     {0.62200846792814612,  0, 0.16666666666666669,  0, 0.16666666666666669,  0, 0.044658198738520463, 0},
14     {0.16666666666666669,  0, 0.62200846792814612,  0, 0.044658198738520463, 0, 0.16666666666666669,  0},
15     {0.16666666666666669,  0, 0.044658198738520463, 0, 0.62200846792814612,  0, 0.16666666666666669,  0},
16     {0.044658198738520463, 0, 0.16666666666666669,  0, 0.16666666666666669,  0, 0.62200846792814612,  0}
17 };
18 const CeedScalar Q1_grad_gauss[3][4][8] = {
19     {{-0.31100423396407312, 0.31100423396407312, -0.083333333333333343, 0.083333333333333343, -0.083333333333333343, 0.083333333333333343,
20       -0.022329099369260232, 0.022329099369260232},
21      {-0.083333333333333343, 0.083333333333333343, -0.31100423396407312, 0.31100423396407312, -0.022329099369260232, 0.022329099369260232,
22       -0.083333333333333343, 0.083333333333333343},
23      {-0.083333333333333343, 0.083333333333333343, -0.022329099369260232, 0.022329099369260232, -0.31100423396407312, 0.31100423396407312,
24       -0.083333333333333343, 0.083333333333333343},
25      {-0.022329099369260232, 0.022329099369260232, -0.083333333333333343, 0.083333333333333343, -0.083333333333333343, 0.083333333333333343,
26       -0.31100423396407312, 0.31100423396407312}                                                       },
27     {{-0.39433756729740643, 0, 0.39433756729740643, 0, -0.10566243270259357, 0, 0.10566243270259357, 0},
28      {-0.39433756729740643, 0, 0.39433756729740643, 0, -0.10566243270259357, 0, 0.10566243270259357, 0},
29      {-0.10566243270259357, 0, 0.10566243270259357, 0, -0.39433756729740643, 0, 0.39433756729740643, 0},
30      {-0.10566243270259357, 0, 0.10566243270259357, 0, -0.39433756729740643, 0, 0.39433756729740643, 0}},
31     {{-0.39433756729740643, 0, -0.10566243270259357, 0, 0.39433756729740643, 0, 0.10566243270259357, 0},
32      {-0.10566243270259357, 0, -0.39433756729740643, 0, 0.10566243270259357, 0, 0.39433756729740643, 0},
33      {-0.39433756729740643, 0, -0.10566243270259357, 0, 0.39433756729740643, 0, 0.10566243270259357, 0},
34      {-0.10566243270259357, 0, -0.39433756729740643, 0, 0.10566243270259357, 0, 0.39433756729740643, 0}}
35 };
36 
37 const CeedScalar Q1_interp_gauss_lobatto[4][8] = {
38     {1, 0, 0, 0, 0, 0, 0, 0},
39     {0, 0, 1, 0, 0, 0, 0, 0},
40     {0, 0, 0, 0, 1, 0, 0, 0},
41     {0, 0, 0, 0, 0, 0, 1, 0}
42 };
43 /* clang-format off */
44 const CeedScalar Q1_grad_gauss_lobatto[3][4][8] = {
45     {{-0.5,  0.5, 0,    0,   0,    0,   0,    0},
46       {0,    0,   -0.5, 0.5, 0,    0,   0,    0},
47       {0,    0,   0,    0,   -0.5, 0.5, 0,    0},
48       {0,    0,   0,    0,   0,    0,   -0.5, 0.5}},
49     {{-0.5,  0,   0.5,  0,   0,    0,   0,    0},
50       {-0.5, 0,   0.5,  0,   0,    0,   0,    0},
51       {0,    0,   0,    0,   -0.5, 0,   0.5,  0},
52       {0,    0,   0,    0,   -0.5, 0,   0.5,  0}},
53     {{-0.5,  0,   0,    0,   0.5,  0,   0,    0},
54       {0,    0,   -0.5, 0,   0,    0,   0.5,  0},
55       {-0.5, 0,   0,    0,   0.5,  0,   0,    0},
56       {0,    0,   -0.5, 0,   0,    0,   0.5,  0}}
57 };
58 /* clang-format on */
59 
60 static void GetCellToFaceTabulation(CeedQuadMode quad_mode, CeedInt *P, CeedInt *Q, const CeedScalar **interp, const CeedScalar **grad) {
61   if (P) *P = 8;
62   if (Q) *Q = 4;
63 
64   if (quad_mode == CEED_GAUSS) {
65     *interp = (const CeedScalar *)Q1_interp_gauss;
66     *grad   = (const CeedScalar *)Q1_grad_gauss;
67   }
68   if (quad_mode == CEED_GAUSS_LOBATTO) {
69     *interp = (const CeedScalar *)Q1_interp_gauss_lobatto;
70     *grad   = (const CeedScalar *)Q1_grad_gauss_lobatto;
71   }
72 }
73