1 // Copyright (c) 2017-2024, 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.h> 9 #include <ceed/backend.h> 10 #include <stdbool.h> 11 #include <string.h> 12 13 #include "ceed-ref.h" 14 15 //------------------------------------------------------------------------------ 16 // QFunctionContext has valid data 17 //------------------------------------------------------------------------------ 18 static int CeedQFunctionContextHasValidData_Ref(CeedQFunctionContext ctx, bool *has_valid_data) { 19 CeedQFunctionContext_Ref *impl; 20 21 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 22 *has_valid_data = impl->data; 23 return CEED_ERROR_SUCCESS; 24 } 25 26 //------------------------------------------------------------------------------ 27 // QFunctionContext has borrowed data 28 //------------------------------------------------------------------------------ 29 static int CeedQFunctionContextHasBorrowedDataOfType_Ref(CeedQFunctionContext ctx, CeedMemType mem_type, bool *has_borrowed_data_of_type) { 30 CeedQFunctionContext_Ref *impl; 31 32 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 33 CeedCheck(mem_type == CEED_MEM_HOST, CeedQFunctionContextReturnCeed(ctx), CEED_ERROR_BACKEND, "Can only set HOST memory for this backend"); 34 *has_borrowed_data_of_type = impl->data_borrowed; 35 return CEED_ERROR_SUCCESS; 36 } 37 38 //------------------------------------------------------------------------------ 39 // QFunctionContext Set Data 40 //------------------------------------------------------------------------------ 41 static int CeedQFunctionContextSetData_Ref(CeedQFunctionContext ctx, CeedMemType mem_type, CeedCopyMode copy_mode, void *data) { 42 size_t ctx_size; 43 CeedQFunctionContext_Ref *impl; 44 45 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 46 CeedCallBackend(CeedQFunctionContextGetContextSize(ctx, &ctx_size)); 47 48 CeedCheck(mem_type == CEED_MEM_HOST, CeedQFunctionContextReturnCeed(ctx), CEED_ERROR_BACKEND, "Can only set HOST memory for this backend"); 49 50 CeedCallBackend(CeedFree(&impl->data_owned)); 51 switch (copy_mode) { 52 case CEED_COPY_VALUES: 53 CeedCallBackend(CeedMallocArray(1, ctx_size, &impl->data_owned)); 54 impl->data_borrowed = NULL; 55 impl->data = impl->data_owned; 56 memcpy(impl->data, data, ctx_size); 57 break; 58 case CEED_OWN_POINTER: 59 impl->data_owned = data; 60 impl->data_borrowed = NULL; 61 impl->data = data; 62 break; 63 case CEED_USE_POINTER: 64 impl->data_borrowed = data; 65 impl->data = data; 66 } 67 return CEED_ERROR_SUCCESS; 68 } 69 70 //------------------------------------------------------------------------------ 71 // QFunctionContext Take Data 72 //------------------------------------------------------------------------------ 73 static int CeedQFunctionContextTakeData_Ref(CeedQFunctionContext ctx, CeedMemType mem_type, void *data) { 74 CeedQFunctionContext_Ref *impl; 75 76 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 77 78 CeedCheck(mem_type == CEED_MEM_HOST, CeedQFunctionContextReturnCeed(ctx), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend"); 79 80 *(void **)data = impl->data; 81 impl->data_borrowed = NULL; 82 impl->data = NULL; 83 return CEED_ERROR_SUCCESS; 84 } 85 86 //------------------------------------------------------------------------------ 87 // QFunctionContext Get Data 88 //------------------------------------------------------------------------------ 89 static int CeedQFunctionContextGetData_Ref(CeedQFunctionContext ctx, CeedMemType mem_type, void *data) { 90 CeedQFunctionContext_Ref *impl; 91 92 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 93 94 CeedCheck(mem_type == CEED_MEM_HOST, CeedQFunctionContextReturnCeed(ctx), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend"); 95 96 *(void **)data = impl->data; 97 return CEED_ERROR_SUCCESS; 98 } 99 100 //------------------------------------------------------------------------------ 101 // QFunctionContext Restore Data 102 //------------------------------------------------------------------------------ 103 static int CeedQFunctionContextRestoreData_Ref(CeedQFunctionContext ctx) { return CEED_ERROR_SUCCESS; } 104 105 //------------------------------------------------------------------------------ 106 // QFunctionContext Destroy 107 //------------------------------------------------------------------------------ 108 static int CeedQFunctionContextDestroy_Ref(CeedQFunctionContext ctx) { 109 CeedQFunctionContext_Ref *impl; 110 111 CeedCallBackend(CeedQFunctionContextGetBackendData(ctx, &impl)); 112 CeedCallBackend(CeedFree(&impl->data_owned)); 113 CeedCallBackend(CeedFree(&impl)); 114 return CEED_ERROR_SUCCESS; 115 } 116 117 //------------------------------------------------------------------------------ 118 // QFunctionContext Create 119 //------------------------------------------------------------------------------ 120 int CeedQFunctionContextCreate_Ref(CeedQFunctionContext ctx) { 121 Ceed ceed; 122 CeedQFunctionContext_Ref *impl; 123 124 CeedCallBackend(CeedQFunctionContextGetCeed(ctx, &ceed)); 125 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasValidData", CeedQFunctionContextHasValidData_Ref)); 126 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasBorrowedDataOfType", CeedQFunctionContextHasBorrowedDataOfType_Ref)); 127 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "SetData", CeedQFunctionContextSetData_Ref)); 128 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "TakeData", CeedQFunctionContextTakeData_Ref)); 129 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetData", CeedQFunctionContextGetData_Ref)); 130 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetDataRead", CeedQFunctionContextGetData_Ref)); 131 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "RestoreData", CeedQFunctionContextRestoreData_Ref)); 132 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "RestoreDataRead", CeedQFunctionContextRestoreData_Ref)); 133 CeedCallBackend(CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "Destroy", CeedQFunctionContextDestroy_Ref)); 134 CeedCallBackend(CeedDestroy(&ceed)); 135 CeedCallBackend(CeedCalloc(1, &impl)); 136 CeedCallBackend(CeedQFunctionContextSetBackendData(ctx, impl)); 137 return CEED_ERROR_SUCCESS; 138 } 139 140 //------------------------------------------------------------------------------ 141