xref: /libCEED/backends/ref/ceed-ref-qfunctioncontext.c (revision 5a526491291e2ef13670ec99232a2cb0069702e5)
1 // Copyright (c) 2017-2025, 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 
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 //------------------------------------------------------------------------------
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 //------------------------------------------------------------------------------
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 //------------------------------------------------------------------------------
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 //------------------------------------------------------------------------------
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 //------------------------------------------------------------------------------
103 static int CeedQFunctionContextRestoreData_Ref(CeedQFunctionContext ctx) { return CEED_ERROR_SUCCESS; }
104 
105 //------------------------------------------------------------------------------
106 // QFunctionContext Destroy
107 //------------------------------------------------------------------------------
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 //------------------------------------------------------------------------------
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