xref: /libCEED/backends/memcheck/ceed-memcheck-qfunction.c (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.
3fc7cf9a0Sjeremylt //
4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
5fc7cf9a0Sjeremylt //
6*3d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
7fc7cf9a0Sjeremylt 
8ec3da8bcSJed Brown #include <ceed/ceed.h>
9ec3da8bcSJed Brown #include <ceed/backend.h>
103d576824SJeremy L Thompson #include <valgrind/memcheck.h>
11fc7cf9a0Sjeremylt #include "ceed-memcheck.h"
12fc7cf9a0Sjeremylt 
13f10650afSjeremylt //------------------------------------------------------------------------------
14f10650afSjeremylt // QFunction Apply
15f10650afSjeremylt //------------------------------------------------------------------------------
16fc7cf9a0Sjeremylt static int CeedQFunctionApply_Memcheck(CeedQFunction qf, CeedInt Q,
17fc7cf9a0Sjeremylt                                        CeedVector *U, CeedVector *V) {
18fc7cf9a0Sjeremylt   int ierr;
19fc7cf9a0Sjeremylt   CeedQFunction_Memcheck *impl;
20e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr);
21fc7cf9a0Sjeremylt 
22777ff853SJeremy L Thompson   CeedQFunctionContext ctx;
23e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionGetContext(qf, &ctx); CeedChkBackend(ierr);
24777ff853SJeremy L Thompson   void *ctxData = NULL;
25777ff853SJeremy L Thompson   if (ctx) {
26777ff853SJeremy L Thompson     ierr = CeedQFunctionContextGetData(ctx, CEED_MEM_HOST, &ctxData);
27e15f9bd0SJeremy L Thompson     CeedChkBackend(ierr);
28777ff853SJeremy L Thompson   }
29fc7cf9a0Sjeremylt 
30692c2638Sjeremylt   CeedQFunctionUser f = NULL;
31e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionGetUserFunction(qf, &f); CeedChkBackend(ierr);
32fc7cf9a0Sjeremylt 
33d1d35e2fSjeremylt   CeedInt num_in, num_out;
34d1d35e2fSjeremylt   ierr = CeedQFunctionGetNumArgs(qf, &num_in, &num_out); CeedChkBackend(ierr);
35fc7cf9a0Sjeremylt 
36d1d35e2fSjeremylt   for (int i = 0; i<num_in; i++) {
37fc7cf9a0Sjeremylt     ierr = CeedVectorGetArrayRead(U[i], CEED_MEM_HOST, &impl->inputs[i]);
38e15f9bd0SJeremy L Thompson     CeedChkBackend(ierr);
39fc7cf9a0Sjeremylt   }
40d1d35e2fSjeremylt   for (int i = 0; i<num_out; i++) {
419c774eddSJeremy L Thompson     ierr = CeedVectorGetArrayWrite(V[i], CEED_MEM_HOST, &impl->outputs[i]);
42e15f9bd0SJeremy L Thompson     CeedChkBackend(ierr);
431f9221feSJeremy L Thompson     CeedSize len;
44e15f9bd0SJeremy L Thompson     ierr = CeedVectorGetLength(V[i], &len); CeedChkBackend(ierr);
45fc7cf9a0Sjeremylt     VALGRIND_MAKE_MEM_UNDEFINED(impl->outputs[i], len);
46fc7cf9a0Sjeremylt   }
47fc7cf9a0Sjeremylt 
48e15f9bd0SJeremy L Thompson   ierr = f(ctxData, Q, impl->inputs, impl->outputs); CeedChkBackend(ierr);
49fc7cf9a0Sjeremylt 
50d1d35e2fSjeremylt   for (int i = 0; i<num_in; i++) {
51e15f9bd0SJeremy L Thompson     ierr = CeedVectorRestoreArrayRead(U[i], &impl->inputs[i]); CeedChkBackend(ierr);
52fc7cf9a0Sjeremylt   }
53d1d35e2fSjeremylt   for (int i = 0; i<num_out; i++) {
54e15f9bd0SJeremy L Thompson     ierr = CeedVectorRestoreArray(V[i], &impl->outputs[i]); CeedChkBackend(ierr);
55fc7cf9a0Sjeremylt   }
56777ff853SJeremy L Thompson   if (ctx) {
57e15f9bd0SJeremy L Thompson     ierr = CeedQFunctionContextRestoreData(ctx, &ctxData); CeedChkBackend(ierr);
58777ff853SJeremy L Thompson   }
59fc7cf9a0Sjeremylt 
60e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
61fc7cf9a0Sjeremylt }
62fc7cf9a0Sjeremylt 
63f10650afSjeremylt //------------------------------------------------------------------------------
64f10650afSjeremylt // QFunction Destroy
65f10650afSjeremylt //------------------------------------------------------------------------------
66fc7cf9a0Sjeremylt static int CeedQFunctionDestroy_Memcheck(CeedQFunction qf) {
67fc7cf9a0Sjeremylt   int ierr;
68fc7cf9a0Sjeremylt   CeedQFunction_Memcheck *impl;
69e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionGetData(qf, (void *)&impl); CeedChkBackend(ierr);
70fc7cf9a0Sjeremylt 
71e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl->inputs); CeedChkBackend(ierr);
72e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl->outputs); CeedChkBackend(ierr);
73e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl); CeedChkBackend(ierr);
74fc7cf9a0Sjeremylt 
75e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
76fc7cf9a0Sjeremylt }
77fc7cf9a0Sjeremylt 
78f10650afSjeremylt //------------------------------------------------------------------------------
79f10650afSjeremylt // QFunction Create
80f10650afSjeremylt //------------------------------------------------------------------------------
81fc7cf9a0Sjeremylt int CeedQFunctionCreate_Memcheck(CeedQFunction qf) {
82fc7cf9a0Sjeremylt   int ierr;
83fc7cf9a0Sjeremylt   Ceed ceed;
84e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChkBackend(ierr);
85fc7cf9a0Sjeremylt 
86fc7cf9a0Sjeremylt   CeedQFunction_Memcheck *impl;
87e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
88bf4cb664SJeremy L Thompson   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->inputs); CeedChkBackend(ierr);
89bf4cb664SJeremy L Thompson   ierr = CeedCalloc(CEED_FIELD_MAX, &impl->outputs); CeedChkBackend(ierr);
90e15f9bd0SJeremy L Thompson   ierr = CeedQFunctionSetData(qf, impl); CeedChkBackend(ierr);
91fc7cf9a0Sjeremylt 
92fc7cf9a0Sjeremylt   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply",
93e15f9bd0SJeremy L Thompson                                 CeedQFunctionApply_Memcheck); CeedChkBackend(ierr);
94fc7cf9a0Sjeremylt   ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy",
95e15f9bd0SJeremy L Thompson                                 CeedQFunctionDestroy_Memcheck); CeedChkBackend(ierr);
96fc7cf9a0Sjeremylt 
97e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
98fc7cf9a0Sjeremylt }
99f10650afSjeremylt //------------------------------------------------------------------------------
100