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