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