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