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