xref: /libCEED/python/tests/test-qfunctions.h (revision 3d8e882215d238700cdceb37404f76ca7fa24eaa)
1*3d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2*3d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
30ef72598Sjeremylt //
4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
50ef72598Sjeremylt //
6*3d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
70ef72598Sjeremylt 
80ef72598Sjeremylt //------------------------------------------------------------------------------
90ef72598Sjeremylt // Setup 1D mass matrix
100ef72598Sjeremylt //------------------------------------------------------------------------------
110ef72598Sjeremylt CEED_QFUNCTION(setup_mass)(void *ctx, const CeedInt Q,
120ef72598Sjeremylt                            const CeedScalar *const *in,
130ef72598Sjeremylt                            CeedScalar *const *out) {
140ef72598Sjeremylt   // in[0] is quadrature weights, size (Q)
150ef72598Sjeremylt   // in[1] is Jacobians, size (Q)
160ef72598Sjeremylt   const CeedScalar *w = in[0], *J = in[1];
170ef72598Sjeremylt 
180ef72598Sjeremylt   // out[0] is quadrature data, size (Q)
190ef72598Sjeremylt   CeedScalar *qdata = out[0];
200ef72598Sjeremylt 
210ef72598Sjeremylt   // Quadrature point loop
220ef72598Sjeremylt   CeedPragmaSIMD
230ef72598Sjeremylt   for (CeedInt i=0; i<Q; i++) {
240ef72598Sjeremylt     qdata[i] = J[i] * w[i];
250ef72598Sjeremylt   }
260ef72598Sjeremylt 
270ef72598Sjeremylt   return 0;
280ef72598Sjeremylt }
290ef72598Sjeremylt 
300ef72598Sjeremylt //------------------------------------------------------------------------------
310ef72598Sjeremylt // Setup 2D mass matrix
320ef72598Sjeremylt //------------------------------------------------------------------------------
330ef72598Sjeremylt CEED_QFUNCTION(setup_mass_2d)(void *ctx, const CeedInt Q,
340ef72598Sjeremylt                               const CeedScalar *const *in,
350ef72598Sjeremylt                               CeedScalar *const *out) {
360ef72598Sjeremylt   // in[0] is quadrature weights, size (Q)
370ef72598Sjeremylt   // in[1] is Jacobians with shape [2, nc=2, Q]
380ef72598Sjeremylt   const CeedScalar *w = in[0], *J = in[1];
390ef72598Sjeremylt 
400ef72598Sjeremylt   // out[0] is quadrature data, size (Q)
410ef72598Sjeremylt   CeedScalar *qdata = out[0];
420ef72598Sjeremylt 
430ef72598Sjeremylt   // Quadrature point loop
440ef72598Sjeremylt   CeedPragmaSIMD
450ef72598Sjeremylt   for (CeedInt i=0; i<Q; i++) {
460ef72598Sjeremylt     qdata[i] = w[i] * (J[i+Q*0]*J[i+Q*3] - J[i+Q*1]*J[i+Q*2]);
470ef72598Sjeremylt   }
480ef72598Sjeremylt 
490ef72598Sjeremylt   return 0;
500ef72598Sjeremylt }
510ef72598Sjeremylt 
520ef72598Sjeremylt //------------------------------------------------------------------------------
530ef72598Sjeremylt // Apply mass matrix
540ef72598Sjeremylt //------------------------------------------------------------------------------
550ef72598Sjeremylt CEED_QFUNCTION(apply_mass)(void *ctx, const CeedInt Q,
560ef72598Sjeremylt                            const CeedScalar *const *in,
570ef72598Sjeremylt                            CeedScalar *const *out) {
580ef72598Sjeremylt   // Get scaling factor, if set
590ef72598Sjeremylt   const CeedScalar *scale_array = ctx ? (CeedScalar *)ctx : NULL;
600ef72598Sjeremylt   const CeedScalar scale = ctx ? scale_array[4] : 1.;
610ef72598Sjeremylt 
620ef72598Sjeremylt   // in[0] is quadrature data, size (Q)
630ef72598Sjeremylt   // in[1] is u, size (Q)
640ef72598Sjeremylt   const CeedScalar *qdata = in[0], *u = in[1];
650ef72598Sjeremylt 
660ef72598Sjeremylt   // out[0] is v, size (Q)
670ef72598Sjeremylt   CeedScalar *v = out[0];
680ef72598Sjeremylt 
690ef72598Sjeremylt   // Quadrature point loop
700ef72598Sjeremylt   CeedPragmaSIMD
710ef72598Sjeremylt   for (CeedInt i=0; i<Q; i++) {
720ef72598Sjeremylt     v[i] = scale * qdata[i] * u[i];
730ef72598Sjeremylt   }
740ef72598Sjeremylt 
750ef72598Sjeremylt   return 0;
760ef72598Sjeremylt }
770ef72598Sjeremylt 
780ef72598Sjeremylt //------------------------------------------------------------------------------
790ef72598Sjeremylt // Apply mass matrix to two components
800ef72598Sjeremylt //------------------------------------------------------------------------------
810ef72598Sjeremylt CEED_QFUNCTION(apply_mass_two)(void *ctx, const CeedInt Q,
820ef72598Sjeremylt                                const CeedScalar *const *in,
830ef72598Sjeremylt                                CeedScalar *const *out) {
840ef72598Sjeremylt   // in[0] is quadrature data, size (Q)
850ef72598Sjeremylt   // in[1] is u, size (2*Q)
860ef72598Sjeremylt   const CeedScalar *qdata = in[0], *u = in[1];
870ef72598Sjeremylt 
880ef72598Sjeremylt   // out[0] is v, size (2*Q)
890ef72598Sjeremylt   CeedScalar *v = out[0];
900ef72598Sjeremylt 
910ef72598Sjeremylt   // Quadrature point loop
920ef72598Sjeremylt   CeedPragmaSIMD
930ef72598Sjeremylt   for (CeedInt i=0; i<Q; i++) {
940ef72598Sjeremylt     v[i]   = qdata[i] * u[i];
950ef72598Sjeremylt     v[Q+i] = qdata[i] * u[Q+i];
960ef72598Sjeremylt   }
970ef72598Sjeremylt 
980ef72598Sjeremylt   return 0;
990ef72598Sjeremylt }
1000ef72598Sjeremylt 
1010ef72598Sjeremylt //------------------------------------------------------------------------------
102