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