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