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