xref: /libCEED/backends/memcheck/ceed-memcheck-qfunction.c (revision 3d8e882215d238700cdceb37404f76ca7fa24eaa)
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 #include <ceed/ceed.h>
9 #include <ceed/backend.h>
10 #include <valgrind/memcheck.h>
11 #include "ceed-memcheck.h"
12 
13 //------------------------------------------------------------------------------
14 // QFunction Apply
15 //------------------------------------------------------------------------------
16 static int CeedQFunctionApply_Memcheck(CeedQFunction qf, CeedInt Q,
17                                        CeedVector *U, CeedVector *V) {
18   int ierr;
19   CeedQFunction_Memcheck *impl;
20   ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr);
21 
22   CeedQFunctionContext ctx;
23   ierr = CeedQFunctionGetContext(qf, &ctx); CeedChkBackend(ierr);
24   void *ctxData = NULL;
25   if (ctx) {
26     ierr = CeedQFunctionContextGetData(ctx, CEED_MEM_HOST, &ctxData);
27     CeedChkBackend(ierr);
28   }
29 
30   CeedQFunctionUser f = NULL;
31   ierr = CeedQFunctionGetUserFunction(qf, &f); CeedChkBackend(ierr);
32 
33   CeedInt num_in, num_out;
34   ierr = CeedQFunctionGetNumArgs(qf, &num_in, &num_out); CeedChkBackend(ierr);
35 
36   for (int i = 0; i<num_in; i++) {
37     ierr = CeedVectorGetArrayRead(U[i], CEED_MEM_HOST, &impl->inputs[i]);
38     CeedChkBackend(ierr);
39   }
40   for (int i = 0; i<num_out; i++) {
41     ierr = CeedVectorGetArrayWrite(V[i], CEED_MEM_HOST, &impl->outputs[i]);
42     CeedChkBackend(ierr);
43     CeedSize len;
44     ierr = CeedVectorGetLength(V[i], &len); CeedChkBackend(ierr);
45     VALGRIND_MAKE_MEM_UNDEFINED(impl->outputs[i], len);
46   }
47 
48   ierr = f(ctxData, Q, impl->inputs, impl->outputs); CeedChkBackend(ierr);
49 
50   for (int i = 0; i<num_in; i++) {
51     ierr = CeedVectorRestoreArrayRead(U[i], &impl->inputs[i]); CeedChkBackend(ierr);
52   }
53   for (int i = 0; i<num_out; i++) {
54     ierr = CeedVectorRestoreArray(V[i], &impl->outputs[i]); CeedChkBackend(ierr);
55   }
56   if (ctx) {
57     ierr = CeedQFunctionContextRestoreData(ctx, &ctxData); CeedChkBackend(ierr);
58   }
59 
60   return CEED_ERROR_SUCCESS;
61 }
62 
63 //------------------------------------------------------------------------------
64 // QFunction Destroy
65 //------------------------------------------------------------------------------
66 static int CeedQFunctionDestroy_Memcheck(CeedQFunction qf) {
67   int ierr;
68   CeedQFunction_Memcheck *impl;
69   ierr = CeedQFunctionGetData(qf, (void *)&impl); CeedChkBackend(ierr);
70 
71   ierr = CeedFree(&impl->inputs); CeedChkBackend(ierr);
72   ierr = CeedFree(&impl->outputs); CeedChkBackend(ierr);
73   ierr = CeedFree(&impl); CeedChkBackend(ierr);
74 
75   return CEED_ERROR_SUCCESS;
76 }
77 
78 //------------------------------------------------------------------------------
79 // QFunction Create
80 //------------------------------------------------------------------------------
81 int CeedQFunctionCreate_Memcheck(CeedQFunction qf) {
82   int ierr;
83   Ceed ceed;
84   ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChkBackend(ierr);
85 
86   CeedQFunction_Memcheck *impl;
87   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
88   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->inputs); CeedChkBackend(ierr);
89   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->outputs); CeedChkBackend(ierr);
90   ierr = CeedQFunctionSetData(qf, impl); CeedChkBackend(ierr);
91 
92   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply",
93                                 CeedQFunctionApply_Memcheck); CeedChkBackend(ierr);
94   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy",
95                                 CeedQFunctionDestroy_Memcheck); CeedChkBackend(ierr);
96 
97   return CEED_ERROR_SUCCESS;
98 }
99 //------------------------------------------------------------------------------
100