// Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. // // SPDX-License-Identifier: BSD-2-Clause // // This file is part of CEED: http://github.com/ceed #include #include #include #include #include "ceed-memcheck.h" //------------------------------------------------------------------------------ // QFunction Apply //------------------------------------------------------------------------------ static int CeedQFunctionApply_Memcheck(CeedQFunction qf, CeedInt Q, CeedVector *U, CeedVector *V) { int ierr; CeedQFunction_Memcheck *impl; ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr); void *ctx_data = NULL; ierr = CeedQFunctionGetContextData(qf, CEED_MEM_HOST, &ctx_data); CeedChkBackend(ierr); CeedQFunctionUser f = NULL; ierr = CeedQFunctionGetUserFunction(qf, &f); CeedChkBackend(ierr); CeedInt num_in, num_out; ierr = CeedQFunctionGetNumArgs(qf, &num_in, &num_out); CeedChkBackend(ierr); for (CeedInt i = 0; iinputs[i]); CeedChkBackend(ierr); } int mem_block_ids[num_out]; for (CeedInt i = 0; ioutputs[i]); CeedChkBackend(ierr); ierr = CeedVectorGetLength(V[i], &len); CeedChkBackend(ierr); VALGRIND_MAKE_MEM_UNDEFINED(impl->outputs[i], len); snprintf(name, 30, "'QFunction output %" CeedInt_FMT "'", i); mem_block_ids[i] = VALGRIND_CREATE_BLOCK(impl->outputs[i], len, name); } ierr = f(ctx_data, Q, impl->inputs, impl->outputs); CeedChkBackend(ierr); for (CeedInt i = 0; iinputs[i]); CeedChkBackend(ierr); } for (CeedInt i = 0; ioutputs[i]); CeedChkBackend(ierr); VALGRIND_DISCARD(mem_block_ids[i]); } ierr = CeedQFunctionRestoreContextData(qf, &ctx_data); CeedChkBackend(ierr); return CEED_ERROR_SUCCESS; } //------------------------------------------------------------------------------ // QFunction Destroy //------------------------------------------------------------------------------ static int CeedQFunctionDestroy_Memcheck(CeedQFunction qf) { int ierr; CeedQFunction_Memcheck *impl; ierr = CeedQFunctionGetData(qf, (void *)&impl); CeedChkBackend(ierr); ierr = CeedFree(&impl->inputs); CeedChkBackend(ierr); ierr = CeedFree(&impl->outputs); CeedChkBackend(ierr); ierr = CeedFree(&impl); CeedChkBackend(ierr); return CEED_ERROR_SUCCESS; } //------------------------------------------------------------------------------ // QFunction Create //------------------------------------------------------------------------------ int CeedQFunctionCreate_Memcheck(CeedQFunction qf) { int ierr; Ceed ceed; ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChkBackend(ierr); CeedQFunction_Memcheck *impl; ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); ierr = CeedCalloc(CEED_FIELD_MAX, &impl->inputs); CeedChkBackend(ierr); ierr = CeedCalloc(CEED_FIELD_MAX, &impl->outputs); CeedChkBackend(ierr); ierr = CeedQFunctionSetData(qf, impl); CeedChkBackend(ierr); ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply", CeedQFunctionApply_Memcheck); CeedChkBackend(ierr); ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy", CeedQFunctionDestroy_Memcheck); CeedChkBackend(ierr); return CEED_ERROR_SUCCESS; } //------------------------------------------------------------------------------