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. 321617c04Sjeremylt // 4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 521617c04Sjeremylt // 6*3d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 721617c04Sjeremylt 8ec3da8bcSJed Brown #include <ceed/ceed.h> 9ec3da8bcSJed Brown #include <ceed/backend.h> 103d576824SJeremy L Thompson #include <stddef.h> 1121617c04Sjeremylt #include "ceed-ref.h" 1221617c04Sjeremylt 13f10650afSjeremylt //------------------------------------------------------------------------------ 14f10650afSjeremylt // QFunction Apply 15f10650afSjeremylt //------------------------------------------------------------------------------ 166ddacda3Sjeremylt static int CeedQFunctionApply_Ref(CeedQFunction qf, CeedInt Q, 17aedaa0e5Sjeremylt CeedVector *U, CeedVector *V) { 1821617c04Sjeremylt int ierr; 19aedaa0e5Sjeremylt CeedQFunction_Ref *impl; 20e15f9bd0SJeremy L Thompson ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr); 21aedaa0e5Sjeremylt 22441428dfSJeremy L Thompson void *ctx_data = NULL; 23441428dfSJeremy L Thompson ierr = CeedQFunctionGetContextData(qf, CEED_MEM_HOST, &ctx_data); 24e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 25aedaa0e5Sjeremylt 26692c2638Sjeremylt CeedQFunctionUser f = NULL; 27e15f9bd0SJeremy L Thompson ierr = CeedQFunctionGetUserFunction(qf, &f); CeedChkBackend(ierr); 28aedaa0e5Sjeremylt 29d1d35e2fSjeremylt CeedInt num_in, num_out; 30d1d35e2fSjeremylt ierr = CeedQFunctionGetNumArgs(qf, &num_in, &num_out); CeedChkBackend(ierr); 31aedaa0e5Sjeremylt 32d1d35e2fSjeremylt for (int i = 0; i<num_in; i++) { 33aedaa0e5Sjeremylt ierr = CeedVectorGetArrayRead(U[i], CEED_MEM_HOST, &impl->inputs[i]); 34e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 35aedaa0e5Sjeremylt } 36d1d35e2fSjeremylt for (int i = 0; i<num_out; i++) { 379c774eddSJeremy L Thompson ierr = CeedVectorGetArrayWrite(V[i], CEED_MEM_HOST, &impl->outputs[i]); 38e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 39aedaa0e5Sjeremylt } 40aedaa0e5Sjeremylt 41441428dfSJeremy L Thompson ierr = f(ctx_data, Q, impl->inputs, impl->outputs); CeedChkBackend(ierr); 42aedaa0e5Sjeremylt 43d1d35e2fSjeremylt for (int i = 0; i<num_in; i++) { 44e15f9bd0SJeremy L Thompson ierr = CeedVectorRestoreArrayRead(U[i], &impl->inputs[i]); CeedChkBackend(ierr); 45aedaa0e5Sjeremylt } 46d1d35e2fSjeremylt for (int i = 0; i<num_out; i++) { 47e15f9bd0SJeremy L Thompson ierr = CeedVectorRestoreArray(V[i], &impl->outputs[i]); CeedChkBackend(ierr); 48aedaa0e5Sjeremylt } 49441428dfSJeremy L Thompson ierr = CeedQFunctionRestoreContextData(qf, &ctx_data); CeedChkBackend(ierr); 50aedaa0e5Sjeremylt 51e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 5221617c04Sjeremylt } 5321617c04Sjeremylt 54f10650afSjeremylt //------------------------------------------------------------------------------ 55f10650afSjeremylt // QFunction Destroy 56f10650afSjeremylt //------------------------------------------------------------------------------ 5721617c04Sjeremylt static int CeedQFunctionDestroy_Ref(CeedQFunction qf) { 58aedaa0e5Sjeremylt int ierr; 59aedaa0e5Sjeremylt CeedQFunction_Ref *impl; 60e15f9bd0SJeremy L Thompson ierr = CeedQFunctionGetData(qf, &impl); CeedChkBackend(ierr); 61aedaa0e5Sjeremylt 62e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl->inputs); CeedChkBackend(ierr); 63e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl->outputs); CeedChkBackend(ierr); 64e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl); CeedChkBackend(ierr); 65aedaa0e5Sjeremylt 66e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 6721617c04Sjeremylt } 6821617c04Sjeremylt 69f10650afSjeremylt //------------------------------------------------------------------------------ 70f10650afSjeremylt // QFunction Create 71f10650afSjeremylt //------------------------------------------------------------------------------ 7221617c04Sjeremylt int CeedQFunctionCreate_Ref(CeedQFunction qf) { 73fe2413ffSjeremylt int ierr; 74fe2413ffSjeremylt Ceed ceed; 75e15f9bd0SJeremy L Thompson ierr = CeedQFunctionGetCeed(qf, &ceed); CeedChkBackend(ierr); 76fe2413ffSjeremylt 77aedaa0e5Sjeremylt CeedQFunction_Ref *impl; 78e15f9bd0SJeremy L Thompson ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); 79bf4cb664SJeremy L Thompson ierr = CeedCalloc(CEED_FIELD_MAX, &impl->inputs); CeedChkBackend(ierr); 80bf4cb664SJeremy L Thompson ierr = CeedCalloc(CEED_FIELD_MAX, &impl->outputs); CeedChkBackend(ierr); 81e15f9bd0SJeremy L Thompson ierr = CeedQFunctionSetData(qf, impl); CeedChkBackend(ierr); 82aedaa0e5Sjeremylt 83fe2413ffSjeremylt ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Apply", 84e15f9bd0SJeremy L Thompson CeedQFunctionApply_Ref); CeedChkBackend(ierr); 85fe2413ffSjeremylt ierr = CeedSetBackendFunction(ceed, "QFunction", qf, "Destroy", 86e15f9bd0SJeremy L Thompson CeedQFunctionDestroy_Ref); CeedChkBackend(ierr); 87aedaa0e5Sjeremylt 88e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 8921617c04Sjeremylt } 90f10650afSjeremylt //------------------------------------------------------------------------------ 91