xref: /libCEED/examples/deal.II/bps-qfunctions.h (revision 8c81f8b02f3c08cdd9dd48147f6804f3e275d73f)
1*8c81f8b0SPeter Munch // ---------------------------------------------------------------------
2*8c81f8b0SPeter Munch //
3*8c81f8b0SPeter Munch // Copyright (C) 2023 by the deal.II authors
4*8c81f8b0SPeter Munch //
5*8c81f8b0SPeter Munch // This file is part of the deal.II library.
6*8c81f8b0SPeter Munch //
7*8c81f8b0SPeter Munch // The deal.II library is free software; you can use it, redistribute
8*8c81f8b0SPeter Munch // it, and/or modify it under the terms of the GNU Lesser General
9*8c81f8b0SPeter Munch // Public License as published by the Free Software Foundation; either
10*8c81f8b0SPeter Munch // version 2.1 of the License, or (at your option) any later version.
11*8c81f8b0SPeter Munch // The full text of the license can be found in the file LICENSE.md at
12*8c81f8b0SPeter Munch // the top level directory of deal.II.
13*8c81f8b0SPeter Munch //
14*8c81f8b0SPeter Munch //  Authors: Peter Munch, Martin Kronbichler
15*8c81f8b0SPeter Munch //
16*8c81f8b0SPeter Munch // ---------------------------------------------------------------------
17*8c81f8b0SPeter Munch 
18*8c81f8b0SPeter Munch #include <ceed.h>
19*8c81f8b0SPeter Munch 
20*8c81f8b0SPeter Munch 
21*8c81f8b0SPeter Munch 
22*8c81f8b0SPeter Munch /**
23*8c81f8b0SPeter Munch  * Context passed to libCEED Q-function.
24*8c81f8b0SPeter Munch  */
25*8c81f8b0SPeter Munch struct BuildContext
26*8c81f8b0SPeter Munch {
27*8c81f8b0SPeter Munch   CeedInt dim, space_dim;
28*8c81f8b0SPeter Munch };
29*8c81f8b0SPeter Munch 
30*8c81f8b0SPeter Munch 
31*8c81f8b0SPeter Munch 
32*8c81f8b0SPeter Munch /**
33*8c81f8b0SPeter Munch  * libCEED Q-function for building quadrature data for a mass operator
34*8c81f8b0SPeter Munch  */
35*8c81f8b0SPeter Munch CEED_QFUNCTION(f_build_mass)
36*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
37*8c81f8b0SPeter Munch {
38*8c81f8b0SPeter Munch   BuildContext     *bc = (BuildContext *)ctx;
39*8c81f8b0SPeter Munch   const CeedScalar *J = in[0], *w = in[1];
40*8c81f8b0SPeter Munch   CeedScalar       *qdata = out[0];
41*8c81f8b0SPeter Munch 
42*8c81f8b0SPeter Munch   switch (bc->dim + 10 * bc->space_dim)
43*8c81f8b0SPeter Munch     {
44*8c81f8b0SPeter Munch       case 11:
45*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
46*8c81f8b0SPeter Munch         {
47*8c81f8b0SPeter Munch           qdata[i] = J[i] * w[i];
48*8c81f8b0SPeter Munch         }
49*8c81f8b0SPeter Munch         break;
50*8c81f8b0SPeter Munch       case 22:
51*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
52*8c81f8b0SPeter Munch         {
53*8c81f8b0SPeter Munch           qdata[i] = (J[i + Q * 0] * J[i + Q * 3] - J[i + Q * 1] * J[i + Q * 2]) * w[i];
54*8c81f8b0SPeter Munch         }
55*8c81f8b0SPeter Munch         break;
56*8c81f8b0SPeter Munch       case 33:
57*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
58*8c81f8b0SPeter Munch         {
59*8c81f8b0SPeter Munch           qdata[i] = (J[i + Q * 0] * (J[i + Q * 4] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 7]) -
60*8c81f8b0SPeter Munch                       J[i + Q * 1] * (J[i + Q * 3] * J[i + Q * 8] - J[i + Q * 5] * J[i + Q * 6]) +
61*8c81f8b0SPeter Munch                       J[i + Q * 2] * (J[i + Q * 3] * J[i + Q * 7] - J[i + Q * 4] * J[i + Q * 6])) *
62*8c81f8b0SPeter Munch                      w[i];
63*8c81f8b0SPeter Munch         }
64*8c81f8b0SPeter Munch         break;
65*8c81f8b0SPeter Munch     }
66*8c81f8b0SPeter Munch   return 0;
67*8c81f8b0SPeter Munch }
68*8c81f8b0SPeter Munch 
69*8c81f8b0SPeter Munch 
70*8c81f8b0SPeter Munch 
71*8c81f8b0SPeter Munch /**
72*8c81f8b0SPeter Munch  * libCEED Q-function for applying a mass operator
73*8c81f8b0SPeter Munch  */
74*8c81f8b0SPeter Munch CEED_QFUNCTION(f_apply_mass)
75*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
76*8c81f8b0SPeter Munch {
77*8c81f8b0SPeter Munch   (void)ctx;
78*8c81f8b0SPeter Munch 
79*8c81f8b0SPeter Munch   const CeedScalar *u   = in[0];
80*8c81f8b0SPeter Munch   const CeedScalar *JxW = in[1];
81*8c81f8b0SPeter Munch   CeedScalar       *v   = out[0];
82*8c81f8b0SPeter Munch 
83*8c81f8b0SPeter Munch   CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
84*8c81f8b0SPeter Munch   {
85*8c81f8b0SPeter Munch     v[i] = JxW[i] * u[i];
86*8c81f8b0SPeter Munch   }
87*8c81f8b0SPeter Munch   return 0;
88*8c81f8b0SPeter Munch }
89*8c81f8b0SPeter Munch 
90*8c81f8b0SPeter Munch 
91*8c81f8b0SPeter Munch 
92*8c81f8b0SPeter Munch /**
93*8c81f8b0SPeter Munch  * libCEED Q-function for applying a vector mass operator
94*8c81f8b0SPeter Munch  */
95*8c81f8b0SPeter Munch CEED_QFUNCTION(f_apply_mass_vec)
96*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
97*8c81f8b0SPeter Munch {
98*8c81f8b0SPeter Munch   BuildContext *bc = (BuildContext *)ctx;
99*8c81f8b0SPeter Munch 
100*8c81f8b0SPeter Munch   const CeedScalar *u   = in[0];
101*8c81f8b0SPeter Munch   const CeedScalar *JxW = in[1];
102*8c81f8b0SPeter Munch   CeedScalar       *v   = out[0];
103*8c81f8b0SPeter Munch 
104*8c81f8b0SPeter Munch   switch (bc->dim + 10 * bc->space_dim)
105*8c81f8b0SPeter Munch     {
106*8c81f8b0SPeter Munch       case 11:
107*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
108*8c81f8b0SPeter Munch         {
109*8c81f8b0SPeter Munch           v[i + Q * 0] = JxW[i] * u[i + Q * 0];
110*8c81f8b0SPeter Munch         }
111*8c81f8b0SPeter Munch         break;
112*8c81f8b0SPeter Munch       case 22:
113*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
114*8c81f8b0SPeter Munch         {
115*8c81f8b0SPeter Munch           v[i + Q * 0] = JxW[i] * u[i + Q * 0];
116*8c81f8b0SPeter Munch           v[i + Q * 1] = JxW[i] * u[i + Q * 1];
117*8c81f8b0SPeter Munch         }
118*8c81f8b0SPeter Munch         break;
119*8c81f8b0SPeter Munch       case 33:
120*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; ++i)
121*8c81f8b0SPeter Munch         {
122*8c81f8b0SPeter Munch           v[i + Q * 0] = JxW[i] * u[i + Q * 0];
123*8c81f8b0SPeter Munch           v[i + Q * 1] = JxW[i] * u[i + Q * 1];
124*8c81f8b0SPeter Munch           v[i + Q * 2] = JxW[i] * u[i + Q * 2];
125*8c81f8b0SPeter Munch         }
126*8c81f8b0SPeter Munch         break;
127*8c81f8b0SPeter Munch     }
128*8c81f8b0SPeter Munch   return 0;
129*8c81f8b0SPeter Munch }
130*8c81f8b0SPeter Munch 
131*8c81f8b0SPeter Munch 
132*8c81f8b0SPeter Munch 
133*8c81f8b0SPeter Munch /**
134*8c81f8b0SPeter Munch  * libCEED Q-function for building quadrature data for a Poisson operator
135*8c81f8b0SPeter Munch  */
136*8c81f8b0SPeter Munch CEED_QFUNCTION(f_build_poisson)
137*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
138*8c81f8b0SPeter Munch {
139*8c81f8b0SPeter Munch   BuildContext     *bc = (BuildContext *)ctx;
140*8c81f8b0SPeter Munch   const CeedScalar *J = in[0], *w = in[1];
141*8c81f8b0SPeter Munch   CeedScalar       *qdata = out[0];
142*8c81f8b0SPeter Munch 
143*8c81f8b0SPeter Munch   switch (bc->dim + 10 * bc->space_dim)
144*8c81f8b0SPeter Munch     {
145*8c81f8b0SPeter Munch       case 11:
146*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
147*8c81f8b0SPeter Munch         {
148*8c81f8b0SPeter Munch           qdata[i] = w[i] / J[i];
149*8c81f8b0SPeter Munch         }
150*8c81f8b0SPeter Munch         break;
151*8c81f8b0SPeter Munch       case 22:
152*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
153*8c81f8b0SPeter Munch         {
154*8c81f8b0SPeter Munch           const CeedScalar J11 = J[i + Q * 0];
155*8c81f8b0SPeter Munch           const CeedScalar J21 = J[i + Q * 1];
156*8c81f8b0SPeter Munch           const CeedScalar J12 = J[i + Q * 2];
157*8c81f8b0SPeter Munch           const CeedScalar J22 = J[i + Q * 3];
158*8c81f8b0SPeter Munch           const CeedScalar qw  = w[i] / (J11 * J22 - J21 * J12);
159*8c81f8b0SPeter Munch           qdata[i + Q * 0]     = qw * (J12 * J12 + J22 * J22);
160*8c81f8b0SPeter Munch           qdata[i + Q * 1]     = qw * (J11 * J11 + J21 * J21);
161*8c81f8b0SPeter Munch           qdata[i + Q * 2]     = -qw * (J11 * J12 + J21 * J22);
162*8c81f8b0SPeter Munch         }
163*8c81f8b0SPeter Munch         break;
164*8c81f8b0SPeter Munch       case 33:
165*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
166*8c81f8b0SPeter Munch         {
167*8c81f8b0SPeter Munch           const CeedScalar J11 = J[i + Q * 0];
168*8c81f8b0SPeter Munch           const CeedScalar J21 = J[i + Q * 1];
169*8c81f8b0SPeter Munch           const CeedScalar J31 = J[i + Q * 2];
170*8c81f8b0SPeter Munch           const CeedScalar J12 = J[i + Q * 3];
171*8c81f8b0SPeter Munch           const CeedScalar J22 = J[i + Q * 4];
172*8c81f8b0SPeter Munch           const CeedScalar J32 = J[i + Q * 5];
173*8c81f8b0SPeter Munch           const CeedScalar J13 = J[i + Q * 6];
174*8c81f8b0SPeter Munch           const CeedScalar J23 = J[i + Q * 7];
175*8c81f8b0SPeter Munch           const CeedScalar J33 = J[i + Q * 8];
176*8c81f8b0SPeter Munch           const CeedScalar A11 = J22 * J33 - J23 * J32;
177*8c81f8b0SPeter Munch           const CeedScalar A12 = J13 * J32 - J12 * J33;
178*8c81f8b0SPeter Munch           const CeedScalar A13 = J12 * J23 - J13 * J22;
179*8c81f8b0SPeter Munch           const CeedScalar A21 = J23 * J31 - J21 * J33;
180*8c81f8b0SPeter Munch           const CeedScalar A22 = J11 * J33 - J13 * J31;
181*8c81f8b0SPeter Munch           const CeedScalar A23 = J13 * J21 - J11 * J23;
182*8c81f8b0SPeter Munch           const CeedScalar A31 = J21 * J32 - J22 * J31;
183*8c81f8b0SPeter Munch           const CeedScalar A32 = J12 * J31 - J11 * J32;
184*8c81f8b0SPeter Munch           const CeedScalar A33 = J11 * J22 - J12 * J21;
185*8c81f8b0SPeter Munch           const CeedScalar qw  = w[i] / (J11 * A11 + J21 * A12 + J31 * A13);
186*8c81f8b0SPeter Munch           qdata[i + Q * 0]     = qw * (A11 * A11 + A12 * A12 + A13 * A13);
187*8c81f8b0SPeter Munch           qdata[i + Q * 1]     = qw * (A21 * A21 + A22 * A22 + A23 * A23);
188*8c81f8b0SPeter Munch           qdata[i + Q * 2]     = qw * (A31 * A31 + A32 * A32 + A33 * A33);
189*8c81f8b0SPeter Munch           qdata[i + Q * 3]     = qw * (A21 * A31 + A22 * A32 + A23 * A33);
190*8c81f8b0SPeter Munch           qdata[i + Q * 4]     = qw * (A11 * A31 + A12 * A32 + A13 * A33);
191*8c81f8b0SPeter Munch           qdata[i + Q * 5]     = qw * (A11 * A21 + A12 * A22 + A13 * A23);
192*8c81f8b0SPeter Munch         }
193*8c81f8b0SPeter Munch         break;
194*8c81f8b0SPeter Munch     }
195*8c81f8b0SPeter Munch   return 0;
196*8c81f8b0SPeter Munch }
197*8c81f8b0SPeter Munch 
198*8c81f8b0SPeter Munch 
199*8c81f8b0SPeter Munch 
200*8c81f8b0SPeter Munch /**
201*8c81f8b0SPeter Munch  * libCEED Q-function for applying a Poisson operator
202*8c81f8b0SPeter Munch  */
203*8c81f8b0SPeter Munch CEED_QFUNCTION(f_apply_poisson)
204*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
205*8c81f8b0SPeter Munch {
206*8c81f8b0SPeter Munch   BuildContext     *bc = (BuildContext *)ctx;
207*8c81f8b0SPeter Munch   const CeedScalar *ug = in[0], *qdata = in[1];
208*8c81f8b0SPeter Munch   CeedScalar       *vg = out[0];
209*8c81f8b0SPeter Munch 
210*8c81f8b0SPeter Munch   switch (bc->dim)
211*8c81f8b0SPeter Munch     {
212*8c81f8b0SPeter Munch       case 1:
213*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
214*8c81f8b0SPeter Munch         {
215*8c81f8b0SPeter Munch           vg[i] = ug[i] * qdata[i];
216*8c81f8b0SPeter Munch         }
217*8c81f8b0SPeter Munch         break;
218*8c81f8b0SPeter Munch       case 2:
219*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
220*8c81f8b0SPeter Munch         {
221*8c81f8b0SPeter Munch           const CeedScalar ug0 = ug[i + Q * 0];
222*8c81f8b0SPeter Munch           const CeedScalar ug1 = ug[i + Q * 1];
223*8c81f8b0SPeter Munch           vg[i + Q * 0]        = qdata[i + Q * 0] * ug0 + qdata[i + Q * 2] * ug1;
224*8c81f8b0SPeter Munch           vg[i + Q * 1]        = qdata[i + Q * 2] * ug0 + qdata[i + Q * 1] * ug1;
225*8c81f8b0SPeter Munch         }
226*8c81f8b0SPeter Munch         break;
227*8c81f8b0SPeter Munch       case 3:
228*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
229*8c81f8b0SPeter Munch         {
230*8c81f8b0SPeter Munch           const CeedScalar ug0 = ug[i + Q * 0];
231*8c81f8b0SPeter Munch           const CeedScalar ug1 = ug[i + Q * 1];
232*8c81f8b0SPeter Munch           const CeedScalar ug2 = ug[i + Q * 2];
233*8c81f8b0SPeter Munch           vg[i + Q * 0] = qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
234*8c81f8b0SPeter Munch           vg[i + Q * 1] = qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
235*8c81f8b0SPeter Munch           vg[i + Q * 2] = qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
236*8c81f8b0SPeter Munch         }
237*8c81f8b0SPeter Munch         break;
238*8c81f8b0SPeter Munch     }
239*8c81f8b0SPeter Munch   return 0;
240*8c81f8b0SPeter Munch }
241*8c81f8b0SPeter Munch 
242*8c81f8b0SPeter Munch 
243*8c81f8b0SPeter Munch 
244*8c81f8b0SPeter Munch /**
245*8c81f8b0SPeter Munch  *libCEED Q-function for applying a vector Poisson operator
246*8c81f8b0SPeter Munch  */
247*8c81f8b0SPeter Munch CEED_QFUNCTION(f_apply_poisson_vec)
248*8c81f8b0SPeter Munch (void *ctx, const CeedInt Q, const CeedScalar *const *in, CeedScalar *const *out)
249*8c81f8b0SPeter Munch {
250*8c81f8b0SPeter Munch   BuildContext     *bc = (BuildContext *)ctx;
251*8c81f8b0SPeter Munch   const CeedScalar *ug = in[0], *qdata = in[1];
252*8c81f8b0SPeter Munch   CeedScalar       *vg = out[0];
253*8c81f8b0SPeter Munch 
254*8c81f8b0SPeter Munch   switch (bc->dim)
255*8c81f8b0SPeter Munch     {
256*8c81f8b0SPeter Munch       case 1:
257*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
258*8c81f8b0SPeter Munch         {
259*8c81f8b0SPeter Munch           vg[i] = ug[i] * qdata[i];
260*8c81f8b0SPeter Munch         }
261*8c81f8b0SPeter Munch         break;
262*8c81f8b0SPeter Munch       case 2:
263*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
264*8c81f8b0SPeter Munch         {
265*8c81f8b0SPeter Munch           {
266*8c81f8b0SPeter Munch             const CeedScalar ug0      = ug[i + Q * 0 + Q * 2 * 0];
267*8c81f8b0SPeter Munch             const CeedScalar ug1      = ug[i + Q * 1 + Q * 2 * 0];
268*8c81f8b0SPeter Munch             vg[i + Q * 0 + Q * 2 * 0] = qdata[i + Q * 0] * ug0 + qdata[i + Q * 2] * ug1;
269*8c81f8b0SPeter Munch             vg[i + Q * 1 + Q * 2 * 0] = qdata[i + Q * 2] * ug0 + qdata[i + Q * 1] * ug1;
270*8c81f8b0SPeter Munch           }
271*8c81f8b0SPeter Munch           {
272*8c81f8b0SPeter Munch             const CeedScalar ug0      = ug[i + Q * 0 + Q * 2 * 1];
273*8c81f8b0SPeter Munch             const CeedScalar ug1      = ug[i + Q * 1 + Q * 2 * 1];
274*8c81f8b0SPeter Munch             vg[i + Q * 0 + Q * 2 * 1] = qdata[i + Q * 0] * ug0 + qdata[i + Q * 2] * ug1;
275*8c81f8b0SPeter Munch             vg[i + Q * 1 + Q * 2 * 1] = qdata[i + Q * 2] * ug0 + qdata[i + Q * 1] * ug1;
276*8c81f8b0SPeter Munch           }
277*8c81f8b0SPeter Munch         }
278*8c81f8b0SPeter Munch         break;
279*8c81f8b0SPeter Munch       case 3:
280*8c81f8b0SPeter Munch         CeedPragmaSIMD for (CeedInt i = 0; i < Q; i++)
281*8c81f8b0SPeter Munch         {
282*8c81f8b0SPeter Munch           {
283*8c81f8b0SPeter Munch             const CeedScalar ug0 = ug[i + Q * 0 + Q * 3 * 0];
284*8c81f8b0SPeter Munch             const CeedScalar ug1 = ug[i + Q * 1 + Q * 3 * 0];
285*8c81f8b0SPeter Munch             const CeedScalar ug2 = ug[i + Q * 2 + Q * 3 * 0];
286*8c81f8b0SPeter Munch             vg[i + Q * 0 + Q * 3 * 0] =
287*8c81f8b0SPeter Munch               qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
288*8c81f8b0SPeter Munch             vg[i + Q * 1 + Q * 3 * 0] =
289*8c81f8b0SPeter Munch               qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
290*8c81f8b0SPeter Munch             vg[i + Q * 2 + Q * 3 * 0] =
291*8c81f8b0SPeter Munch               qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
292*8c81f8b0SPeter Munch           }
293*8c81f8b0SPeter Munch           {
294*8c81f8b0SPeter Munch             const CeedScalar ug0 = ug[i + Q * 0 + Q * 3 * 1];
295*8c81f8b0SPeter Munch             const CeedScalar ug1 = ug[i + Q * 1 + Q * 3 * 1];
296*8c81f8b0SPeter Munch             const CeedScalar ug2 = ug[i + Q * 2 + Q * 3 * 1];
297*8c81f8b0SPeter Munch             vg[i + Q * 0 + Q * 3 * 1] =
298*8c81f8b0SPeter Munch               qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
299*8c81f8b0SPeter Munch             vg[i + Q * 1 + Q * 3 * 1] =
300*8c81f8b0SPeter Munch               qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
301*8c81f8b0SPeter Munch             vg[i + Q * 2 + Q * 3 * 1] =
302*8c81f8b0SPeter Munch               qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
303*8c81f8b0SPeter Munch           }
304*8c81f8b0SPeter Munch           {
305*8c81f8b0SPeter Munch             const CeedScalar ug0 = ug[i + Q * 0 + Q * 3 * 2];
306*8c81f8b0SPeter Munch             const CeedScalar ug1 = ug[i + Q * 1 + Q * 3 * 2];
307*8c81f8b0SPeter Munch             const CeedScalar ug2 = ug[i + Q * 2 + Q * 3 * 2];
308*8c81f8b0SPeter Munch             vg[i + Q * 0 + Q * 3 * 2] =
309*8c81f8b0SPeter Munch               qdata[i + Q * 0] * ug0 + qdata[i + Q * 5] * ug1 + qdata[i + Q * 4] * ug2;
310*8c81f8b0SPeter Munch             vg[i + Q * 1 + Q * 3 * 2] =
311*8c81f8b0SPeter Munch               qdata[i + Q * 5] * ug0 + qdata[i + Q * 1] * ug1 + qdata[i + Q * 3] * ug2;
312*8c81f8b0SPeter Munch             vg[i + Q * 2 + Q * 3 * 2] =
313*8c81f8b0SPeter Munch               qdata[i + Q * 4] * ug0 + qdata[i + Q * 3] * ug1 + qdata[i + Q * 2] * ug2;
314*8c81f8b0SPeter Munch           }
315*8c81f8b0SPeter Munch         }
316*8c81f8b0SPeter Munch         break;
317*8c81f8b0SPeter Munch     }
318*8c81f8b0SPeter Munch   return 0;
319*8c81f8b0SPeter Munch }
320