xref: /libCEED/backends/ref/ceed-ref-qfunctioncontext.c (revision 547dbd6f5071ad3a6569362aeaf8c427ad429b62)
1 // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC.
2 // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707.
3 // All Rights reserved. See files LICENSE and NOTICE for details.
4 //
5 // This file is part of CEED, a collection of benchmarks, miniapps, software
6 // libraries and APIs for efficient high-order finite element and spectral
7 // element discretizations for exascale applications. For more information and
8 // source code availability see http://github.com/ceed.
9 //
10 // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
11 // a collaborative effort of two U.S. Department of Energy organizations (Office
12 // of Science and the National Nuclear Security Administration) responsible for
13 // the planning and preparation of a capable exascale ecosystem, including
14 // software, applications, hardware, advanced system engineering and early
15 // testbed platforms, in support of the nation's exascale computing imperative.
16 
17 #include <ceed/ceed.h>
18 #include <ceed/backend.h>
19 #include <string.h>
20 #include "ceed-ref.h"
21 
22 //------------------------------------------------------------------------------
23 // QFunctionContext has valid data
24 //------------------------------------------------------------------------------
25 static int CeedQFunctionContextHasValidData_Ref(CeedQFunctionContext ctx,
26     bool *has_valid_data) {
27   int ierr;
28   CeedQFunctionContext_Ref *impl;
29   ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl);
30   CeedChkBackend(ierr);
31 
32   *has_valid_data = !!impl->data;
33 
34   return CEED_ERROR_SUCCESS;
35 }
36 
37 //------------------------------------------------------------------------------
38 // QFunctionContext has borrowed data
39 //------------------------------------------------------------------------------
40 static int CeedQFunctionContextHasBorrowedDataOfType_Ref(
41   CeedQFunctionContext ctx, CeedMemType mem_type,
42   bool *has_borrowed_data_of_type) {
43   int ierr;
44   CeedQFunctionContext_Ref *impl;
45   ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl);
46   CeedChkBackend(ierr);
47   Ceed ceed;
48   ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr);
49 
50   switch (mem_type) {
51   case CEED_MEM_HOST:
52     *has_borrowed_data_of_type = !!impl->data_borrowed;
53     break;
54   default:
55     // LCOV_EXCL_START
56     return CeedError(ceed, CEED_ERROR_BACKEND,
57                      "Can only set HOST memory for this backend");
58     // LCOV_EXCL_STOP
59     break;
60   }
61 
62   return CEED_ERROR_SUCCESS;
63 }
64 
65 //------------------------------------------------------------------------------
66 // QFunctionContext Set Data
67 //------------------------------------------------------------------------------
68 static int CeedQFunctionContextSetData_Ref(CeedQFunctionContext ctx,
69     CeedMemType mem_type, CeedCopyMode copy_mode, void *data) {
70   int ierr;
71   CeedQFunctionContext_Ref *impl;
72   ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl);
73   CeedChkBackend(ierr);
74   size_t ctx_size;
75   ierr = CeedQFunctionContextGetContextSize(ctx, &ctx_size); CeedChkBackend(ierr);
76   Ceed ceed;
77   ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr);
78 
79   if (mem_type != CEED_MEM_HOST)
80     // LCOV_EXCL_START
81     return CeedError(ceed, CEED_ERROR_BACKEND,
82                      "Can only set HOST memory for this backend");
83   // LCOV_EXCL_STOP
84 
85   ierr = CeedFree(&impl->data_owned); CeedChkBackend(ierr);
86   switch (copy_mode) {
87   case CEED_COPY_VALUES:
88     ierr = CeedMallocArray(1, ctx_size, &impl->data_owned); CeedChkBackend(ierr);
89     impl->data_borrowed = NULL;
90     impl->data = impl->data_owned;
91     memcpy(impl->data, data, ctx_size);
92     break;
93   case CEED_OWN_POINTER:
94     impl->data_owned = data;
95     impl->data_borrowed = NULL;
96     impl->data = data;
97     break;
98   case CEED_USE_POINTER:
99     impl->data_borrowed = data;
100     impl->data = data;
101   }
102   return CEED_ERROR_SUCCESS;
103 }
104 
105 //------------------------------------------------------------------------------
106 // QFunctionContext Take Data
107 //------------------------------------------------------------------------------
108 static int CeedQFunctionContextTakeData_Ref(CeedQFunctionContext ctx,
109     CeedMemType mem_type, void *data) {
110   int ierr;
111   CeedQFunctionContext_Ref *impl;
112   ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl);
113   CeedChkBackend(ierr);
114   Ceed ceed;
115   ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr);
116 
117   if (mem_type != CEED_MEM_HOST)
118     // LCOV_EXCL_START
119     return CeedError(ceed, CEED_ERROR_BACKEND,
120                      "Can only provide HOST memory for this backend");
121   // LCOV_EXCL_STOP
122 
123   *(void **)data = impl->data;
124   impl->data_borrowed = NULL;
125   impl->data = NULL;
126 
127   return CEED_ERROR_SUCCESS;
128 }
129 
130 //------------------------------------------------------------------------------
131 // QFunctionContext Get Data
132 //------------------------------------------------------------------------------
133 static int CeedQFunctionContextGetData_Ref(CeedQFunctionContext ctx,
134     CeedMemType mem_type, void *data) {
135   int ierr;
136   CeedQFunctionContext_Ref *impl;
137   ierr = CeedQFunctionContextGetBackendData(ctx, (void *)&impl);
138   CeedChkBackend(ierr);
139   Ceed ceed;
140   ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr);
141 
142   if (mem_type != CEED_MEM_HOST)
143     // LCOV_EXCL_START
144     return CeedError(ceed, CEED_ERROR_BACKEND,
145                      "Can only provide HOST memory for this backend");
146   // LCOV_EXCL_STOP
147 
148   *(void **)data = impl->data;
149 
150   return CEED_ERROR_SUCCESS;
151 }
152 
153 //------------------------------------------------------------------------------
154 // QFunctionContext Restore Data
155 //------------------------------------------------------------------------------
156 static int CeedQFunctionContextRestoreData_Ref(CeedQFunctionContext ctx) {
157   return CEED_ERROR_SUCCESS;
158 }
159 
160 //------------------------------------------------------------------------------
161 // QFunctionContext Destroy
162 //------------------------------------------------------------------------------
163 static int CeedQFunctionContextDestroy_Ref(CeedQFunctionContext ctx) {
164   int ierr;
165   CeedQFunctionContext_Ref *impl;
166   ierr = CeedQFunctionContextGetBackendData(ctx, &impl); CeedChkBackend(ierr);
167 
168   ierr = CeedFree(&impl->data_owned); CeedChkBackend(ierr);
169   ierr = CeedFree(&impl); CeedChkBackend(ierr);
170   return CEED_ERROR_SUCCESS;
171 }
172 
173 //------------------------------------------------------------------------------
174 // QFunctionContext Create
175 //------------------------------------------------------------------------------
176 int CeedQFunctionContextCreate_Ref(CeedQFunctionContext ctx) {
177   int ierr;
178   CeedQFunctionContext_Ref *impl;
179   Ceed ceed;
180   ierr = CeedQFunctionContextGetCeed(ctx, &ceed); CeedChkBackend(ierr);
181 
182   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "HasValidData",
183                                 CeedQFunctionContextHasValidData_Ref);
184   CeedChkBackend(ierr);
185   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx,
186                                 "HasBorrowedDataOfType",
187                                 CeedQFunctionContextHasBorrowedDataOfType_Ref);
188   CeedChkBackend(ierr);
189   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "SetData",
190                                 CeedQFunctionContextSetData_Ref); CeedChkBackend(ierr);
191   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "TakeData",
192                                 CeedQFunctionContextTakeData_Ref); CeedChkBackend(ierr);
193   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "GetData",
194                                 CeedQFunctionContextGetData_Ref); CeedChkBackend(ierr);
195   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "RestoreData",
196                                 CeedQFunctionContextRestoreData_Ref); CeedChkBackend(ierr);
197   ierr = CeedSetBackendFunction(ceed, "QFunctionContext", ctx, "Destroy",
198                                 CeedQFunctionContextDestroy_Ref); CeedChkBackend(ierr);
199 
200   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
201   ierr = CeedQFunctionContextSetBackendData(ctx, impl); CeedChkBackend(ierr);
202 
203   return CEED_ERROR_SUCCESS;
204 }
205 //------------------------------------------------------------------------------
206