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