xref: /libCEED/python/tests/test-qfunctions.h (revision a0154adecfab8547cdc0febbbf40ac009dbe9d1d)
1 // Copyright (c) 2017-2022, 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 //------------------------------------------------------------------------------
9 // Setup 1D mass matrix
10 //------------------------------------------------------------------------------
11 CEED_QFUNCTION(setup_mass)(void *ctx, const CeedInt Q,
12                            const CeedScalar *const *in,
13                            CeedScalar *const *out) {
14   // in[0] is quadrature weights, size (Q)
15   // in[1] is Jacobians, size (Q)
16   const CeedScalar *w = in[0], *J = in[1];
17 
18   // out[0] is quadrature data, size (Q)
19   CeedScalar *qdata = out[0];
20 
21   // Quadrature point loop
22   CeedPragmaSIMD
23   for (CeedInt i=0; i<Q; i++) {
24     qdata[i] = J[i] * w[i];
25   }
26 
27   return 0;
28 }
29 
30 //------------------------------------------------------------------------------
31 // Setup 2D mass matrix
32 //------------------------------------------------------------------------------
33 CEED_QFUNCTION(setup_mass_2d)(void *ctx, const CeedInt Q,
34                               const CeedScalar *const *in,
35                               CeedScalar *const *out) {
36   // in[0] is quadrature weights, size (Q)
37   // in[1] is Jacobians with shape [2, nc=2, Q]
38   const CeedScalar *w = in[0], *J = in[1];
39 
40   // out[0] is quadrature data, size (Q)
41   CeedScalar *qdata = out[0];
42 
43   // Quadrature point loop
44   CeedPragmaSIMD
45   for (CeedInt i=0; i<Q; i++) {
46     qdata[i] = w[i] * (J[i+Q*0]*J[i+Q*3] - J[i+Q*1]*J[i+Q*2]);
47   }
48 
49   return 0;
50 }
51 
52 //------------------------------------------------------------------------------
53 // Apply mass matrix
54 //------------------------------------------------------------------------------
55 CEED_QFUNCTION(apply_mass)(void *ctx, const CeedInt Q,
56                            const CeedScalar *const *in,
57                            CeedScalar *const *out) {
58   // Get scaling factor, if set
59   const CeedScalar *scale_array = ctx ? (CeedScalar *)ctx : NULL;
60   const CeedScalar scale = ctx ? scale_array[4] : 1.;
61 
62   // in[0] is quadrature data, size (Q)
63   // in[1] is u, size (Q)
64   const CeedScalar *qdata = in[0], *u = in[1];
65 
66   // out[0] is v, size (Q)
67   CeedScalar *v = out[0];
68 
69   // Quadrature point loop
70   CeedPragmaSIMD
71   for (CeedInt i=0; i<Q; i++) {
72     v[i] = scale * qdata[i] * u[i];
73   }
74 
75   return 0;
76 }
77 
78 //------------------------------------------------------------------------------
79 // Apply mass matrix to two components
80 //------------------------------------------------------------------------------
81 CEED_QFUNCTION(apply_mass_two)(void *ctx, const CeedInt Q,
82                                const CeedScalar *const *in,
83                                CeedScalar *const *out) {
84   // in[0] is quadrature data, size (Q)
85   // in[1] is u, size (2*Q)
86   const CeedScalar *qdata = in[0], *u = in[1];
87 
88   // out[0] is v, size (2*Q)
89   CeedScalar *v = out[0];
90 
91   // Quadrature point loop
92   CeedPragmaSIMD
93   for (CeedInt i=0; i<Q; i++) {
94     v[i]   = qdata[i] * u[i];
95     v[Q+i] = qdata[i] * u[Q+i];
96   }
97 
98   return 0;
99 }
100 
101 //------------------------------------------------------------------------------
102