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