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