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