xref: /libCEED/backends/ref/ceed-ref-qfunction.c (revision aedaa0e5fd3a3e03ad33ad8a6308ac527f4f900e)
121617c04Sjeremylt // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC.
221617c04Sjeremylt // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707.
321617c04Sjeremylt // All Rights reserved. See files LICENSE and NOTICE for details.
421617c04Sjeremylt //
521617c04Sjeremylt // This file is part of CEED, a collection of benchmarks, miniapps, software
621617c04Sjeremylt // libraries and APIs for efficient high-order finite element and spectral
721617c04Sjeremylt // element discretizations for exascale applications. For more information and
821617c04Sjeremylt // source code availability see http://github.com/ceed.
921617c04Sjeremylt //
1021617c04Sjeremylt // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
1121617c04Sjeremylt // a collaborative effort of two U.S. Department of Energy organizations (Office
1221617c04Sjeremylt // of Science and the National Nuclear Security Administration) responsible for
1321617c04Sjeremylt // the planning and preparation of a capable exascale ecosystem, including
1421617c04Sjeremylt // software, applications, hardware, advanced system engineering and early
1521617c04Sjeremylt // testbed platforms, in support of the nation's exascale computing imperative.
1621617c04Sjeremylt 
1721617c04Sjeremylt #include <string.h>
1821617c04Sjeremylt #include "ceed-ref.h"
1921617c04Sjeremylt 
206ddacda3Sjeremylt static int CeedQFunctionApply_Ref(CeedQFunction qf, CeedInt Q,
21*aedaa0e5Sjeremylt                                   CeedVector *U, CeedVector *V) {
2221617c04Sjeremylt   int ierr;
23*aedaa0e5Sjeremylt   CeedQFunction_Ref *impl;
24*aedaa0e5Sjeremylt   ierr = CeedQFunctionGetData(qf, (void*)&impl); CeedChk(ierr);
25*aedaa0e5Sjeremylt 
264ce2993fSjeremylt   void *ctx;
274ce2993fSjeremylt   ierr = CeedQFunctionGetContext(qf, &ctx); CeedChk(ierr);
28*aedaa0e5Sjeremylt 
29fe2413ffSjeremylt   int (*f)() = NULL;
3028d161eeSjeremylt   ierr = CeedQFunctionGetUserFunction(qf, (int (**)())&f); CeedChk(ierr);
31*aedaa0e5Sjeremylt 
32*aedaa0e5Sjeremylt   CeedInt nIn, nOut;
33*aedaa0e5Sjeremylt   ierr = CeedQFunctionGetNumArgs(qf, &nIn, &nOut); CeedChk(ierr);
34*aedaa0e5Sjeremylt 
35*aedaa0e5Sjeremylt   for (int i = 0; i<nIn; i++) {
36*aedaa0e5Sjeremylt     if (U[i]) {
37*aedaa0e5Sjeremylt       ierr = CeedVectorGetArrayRead(U[i], CEED_MEM_HOST, &impl->inputs[i]);
38*aedaa0e5Sjeremylt       CeedChk(ierr);
39*aedaa0e5Sjeremylt     }
40*aedaa0e5Sjeremylt   }
41*aedaa0e5Sjeremylt   for (int i = 0; i<nOut; i++) {
42*aedaa0e5Sjeremylt     if (U[i]) {
43*aedaa0e5Sjeremylt       ierr = CeedVectorGetArray(V[i], CEED_MEM_HOST, &impl->outputs[i]);
44*aedaa0e5Sjeremylt       CeedChk(ierr);
45*aedaa0e5Sjeremylt     }
46*aedaa0e5Sjeremylt   }
47*aedaa0e5Sjeremylt 
48*aedaa0e5Sjeremylt   ierr = f(ctx, Q, impl->inputs, impl->outputs); CeedChk(ierr);
49*aedaa0e5Sjeremylt 
50*aedaa0e5Sjeremylt   for (int i = 0; i<nIn; i++) {
51*aedaa0e5Sjeremylt     if (U[i]) {
52*aedaa0e5Sjeremylt       ierr = CeedVectorRestoreArrayRead(U[i], &impl->inputs[i]); CeedChk(ierr);
53*aedaa0e5Sjeremylt     }
54*aedaa0e5Sjeremylt   }
55*aedaa0e5Sjeremylt   for (int i = 0; i<nOut; i++) {
56*aedaa0e5Sjeremylt     if (U[i]) {
57*aedaa0e5Sjeremylt       ierr = CeedVectorRestoreArray(V[i], &impl->outputs[i]); CeedChk(ierr);
58*aedaa0e5Sjeremylt     }
59*aedaa0e5Sjeremylt   }
60*aedaa0e5Sjeremylt 
6121617c04Sjeremylt   return 0;
6221617c04Sjeremylt }
6321617c04Sjeremylt 
6421617c04Sjeremylt static int CeedQFunctionDestroy_Ref(CeedQFunction qf) {
65*aedaa0e5Sjeremylt   int ierr;
66*aedaa0e5Sjeremylt   CeedQFunction_Ref *impl;
67*aedaa0e5Sjeremylt   ierr = CeedQFunctionGetData(qf, (void*)&impl); CeedChk(ierr);
68*aedaa0e5Sjeremylt 
69*aedaa0e5Sjeremylt   ierr = CeedFree(&impl->inputs); CeedChk(ierr);
70*aedaa0e5Sjeremylt   ierr = CeedFree(&impl->outputs); CeedChk(ierr);
71*aedaa0e5Sjeremylt   ierr = CeedFree(&impl); CeedChk(ierr);
72*aedaa0e5Sjeremylt 
7321617c04Sjeremylt   return 0;
7421617c04Sjeremylt }
7521617c04Sjeremylt 
7621617c04Sjeremylt int CeedQFunctionCreate_Ref(CeedQFunction qf) {
77fe2413ffSjeremylt   int ierr;
78fe2413ffSjeremylt   Ceed ceed;
79fe2413ffSjeremylt   ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChk(ierr);
80fe2413ffSjeremylt 
81*aedaa0e5Sjeremylt   CeedQFunction_Ref *impl;
82*aedaa0e5Sjeremylt   ierr = CeedCalloc(1, &impl); CeedChk(ierr);
83*aedaa0e5Sjeremylt   ierr = CeedCalloc(16, &impl->inputs); CeedChk(ierr);
84*aedaa0e5Sjeremylt   ierr = CeedCalloc(16, &impl->outputs); CeedChk(ierr);
85*aedaa0e5Sjeremylt   ierr = CeedQFunctionSetData(qf, (void*)&impl); CeedChk(ierr);
86*aedaa0e5Sjeremylt 
87fe2413ffSjeremylt   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply",
88fe2413ffSjeremylt                                 CeedQFunctionApply_Ref); CeedChk(ierr);
89fe2413ffSjeremylt   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy",
90fe2413ffSjeremylt                                 CeedQFunctionDestroy_Ref); CeedChk(ierr);
91*aedaa0e5Sjeremylt 
9221617c04Sjeremylt   return 0;
9321617c04Sjeremylt }
94