xref: /libCEED/backends/ref/ceed-ref-qfunctioncontext.c (revision d4cc18453651bd0f94c1a2e078b2646a92dafdcc)
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