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