1 // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC. 2 // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707. 3 // All Rights reserved. See files LICENSE and NOTICE for details. 4 // 5 // This file is part of CEED, a collection of benchmarks, miniapps, software 6 // libraries and APIs for efficient high-order finite element and spectral 7 // element discretizations for exascale applications. For more information and 8 // source code availability see http://github.com/ceed. 9 // 10 // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 11 // a collaborative effort of two U.S. Department of Energy organizations (Office 12 // of Science and the National Nuclear Security Administration) responsible for 13 // the planning and preparation of a capable exascale ecosystem, including 14 // software, applications, hardware, advanced system engineering and early 15 // testbed platforms, in support of the nation's exascale computing imperative. 16 17 #include <ceed/ceed.h> 18 #include <ceed/backend.h> 19 #include <string.h> 20 #include "ceed-ref.h" 21 22 //------------------------------------------------------------------------------ 23 // QFunctionContext has valid data 24 //------------------------------------------------------------------------------ 25 static int CeedQFunctionContextHasValidData_Ref(CeedQFunctionContext ctx, 26 bool *has_valid_data) { 27 int ierr; 28 CeedQFunctionContext_Ref *impl; 29 ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl); 30 CeedChkBackend(ierr); 31 32 *has_valid_data = !!impl->data; 33 34 return CEED_ERROR_SUCCESS; 35 } 36 37 //------------------------------------------------------------------------------ 38 // QFunctionContext has borrowed data 39 //------------------------------------------------------------------------------ 40 static int CeedQFunctionContextHasBorrowedDataOfType_Ref( 41 CeedQFunctionContext ctx, CeedMemType mem_type, 42 bool *has_borrowed_data_of_type) { 43 int ierr; 44 CeedQFunctionContext_Ref *impl; 45 ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl); 46 CeedChkBackend(ierr); 47 Ceed ceed; 48 ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr); 49 50 switch (mem_type) { 51 case CEED_MEM_HOST: 52 *has_borrowed_data_of_type = !!impl->data_borrowed; 53 break; 54 default: 55 // LCOV_EXCL_START 56 return CeedError(ceed, CEED_ERROR_BACKEND, 57 "Can only set HOST memory for this backend"); 58 // LCOV_EXCL_STOP 59 break; 60 } 61 62 return CEED_ERROR_SUCCESS; 63 } 64 65 //------------------------------------------------------------------------------ 66 // QFunctionContext Set Data 67 //------------------------------------------------------------------------------ 68 static int CeedQFunctionContextSetData_Ref(CeedQFunctionContext ctx, 69 CeedMemType mem_type, CeedCopyMode copy_mode, void *data) { 70 int ierr; 71 CeedQFunctionContext_Ref *impl; 72 ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl); 73 CeedChkBackend(ierr); 74 size_t ctx_size; 75 ierr = CeedQFunctionContextGetContextSize(ctx, &ctx_size); CeedChkBackend(ierr); 76 Ceed ceed; 77 ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr); 78 79 if (mem_type != CEED_MEM_HOST) 80 // LCOV_EXCL_START 81 return CeedError(ceed, CEED_ERROR_BACKEND, 82 "Can only set HOST memory for this backend"); 83 // LCOV_EXCL_STOP 84 85 ierr = CeedFree(&impl->data_owned); CeedChkBackend(ierr); 86 switch (copy_mode) { 87 case CEED_COPY_VALUES: 88 ierr = CeedMallocArray(1, ctx_size, &impl->data_owned); CeedChkBackend(ierr); 89 impl->data_borrowed = NULL; 90 impl->data = impl->data_owned; 91 memcpy(impl->data, data, ctx_size); 92 break; 93 case CEED_OWN_POINTER: 94 impl->data_owned = data; 95 impl->data_borrowed = NULL; 96 impl->data = data; 97 break; 98 case CEED_USE_POINTER: 99 impl->data_borrowed = data; 100 impl->data = data; 101 } 102 return CEED_ERROR_SUCCESS; 103 } 104 105 //------------------------------------------------------------------------------ 106 // QFunctionContext Take Data 107 //------------------------------------------------------------------------------ 108 static int CeedQFunctionContextTakeData_Ref(CeedQFunctionContext ctx, 109 CeedMemType mem_type, void *data) { 110 int ierr; 111 CeedQFunctionContext_Ref *impl; 112 ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl); 113 CeedChkBackend(ierr); 114 Ceed ceed; 115 ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr); 116 117 if (mem_type != CEED_MEM_HOST) 118 // LCOV_EXCL_START 119 return CeedError(ceed, CEED_ERROR_BACKEND, 120 "Can only provide HOST memory for this backend"); 121 // LCOV_EXCL_STOP 122 123 *(void **)data = impl->data; 124 impl->data_borrowed = NULL; 125 impl->data = NULL; 126 127 return CEED_ERROR_SUCCESS; 128 } 129 130 //------------------------------------------------------------------------------ 131 // QFunctionContext Get Data 132 //------------------------------------------------------------------------------ 133 static int CeedQFunctionContextGetData_Ref(CeedQFunctionContext ctx, 134 CeedMemType mem_type, void *data) { 135 int ierr; 136 CeedQFunctionContext_Ref *impl; 137 ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl); 138 CeedChkBackend(ierr); 139 Ceed ceed; 140 ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr); 141 142 if (mem_type != CEED_MEM_HOST) 143 // LCOV_EXCL_START 144 return CeedError(ceed, CEED_ERROR_BACKEND, 145 "Can only provide HOST memory for this backend"); 146 // LCOV_EXCL_STOP 147 148 *(void **)data = impl->data; 149 150 return CEED_ERROR_SUCCESS; 151 } 152 153 //------------------------------------------------------------------------------ 154 // QFunctionContext Restore Data 155 //------------------------------------------------------------------------------ 156 static int CeedQFunctionContextRestoreData_Ref(CeedQFunctionContext ctx) { 157 return CEED_ERROR_SUCCESS; 158 } 159 160 //------------------------------------------------------------------------------ 161 // QFunctionContext Destroy 162 //------------------------------------------------------------------------------ 163 static int CeedQFunctionContextDestroy_Ref(CeedQFunctionContext ctx) { 164 int ierr; 165 CeedQFunctionContext_Ref *impl; 166 ierr = CeedQFunctionContextGetBackendData(ctx, &impl); CeedChkBackend(ierr); 167 168 ierr = CeedFree(&impl->data_owned); CeedChkBackend(ierr); 169 ierr = CeedFree(&impl); CeedChkBackend(ierr); 170 return CEED_ERROR_SUCCESS; 171 } 172 173 //------------------------------------------------------------------------------ 174 // QFunctionContext Create 175 //------------------------------------------------------------------------------ 176 int CeedQFunctionContextCreate_Ref(CeedQFunctionContext ctx) { 177 int ierr; 178 CeedQFunctionContext_Ref *impl; 179 Ceed ceed; 180 ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr); 181 182 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasValidData", 183 CeedQFunctionContextHasValidData_Ref); 184 CeedChkBackend(ierr); 185 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, 186 "HasBorrowedDataOfType", 187 CeedQFunctionContextHasBorrowedDataOfType_Ref); 188 CeedChkBackend(ierr); 189 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "SetData", 190 CeedQFunctionContextSetData_Ref); CeedChkBackend(ierr); 191 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "TakeData", 192 CeedQFunctionContextTakeData_Ref); CeedChkBackend(ierr); 193 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetData", 194 CeedQFunctionContextGetData_Ref); CeedChkBackend(ierr); 195 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetDataRead", 196 CeedQFunctionContextGetData_Ref); CeedChkBackend(ierr); 197 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "RestoreData", 198 CeedQFunctionContextRestoreData_Ref); CeedChkBackend(ierr); 199 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "RestoreDataRead", 200 CeedQFunctionContextRestoreData_Ref); CeedChkBackend(ierr); 201 ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "Destroy", 202 CeedQFunctionContextDestroy_Ref); CeedChkBackend(ierr); 203 204 ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); 205 ierr = CeedQFunctionContextSetBackendData(ctx, impl); CeedChkBackend(ierr); 206 207 return CEED_ERROR_SUCCESS; 208 } 209 //------------------------------------------------------------------------------ 210