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