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