xref: /libCEED/rust/libceed-sys/c-src/backends/ref/ceed-ref-vector.c (revision 9c774eddf8c0b4f5416196d32c5355c9591a7190)
10436c2adSjeremylt // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC.
20436c2adSjeremylt // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707.
30436c2adSjeremylt // All Rights reserved. See files LICENSE and NOTICE for details.
40436c2adSjeremylt //
50436c2adSjeremylt // This file is part of CEED, a collection of benchmarks, miniapps, software
60436c2adSjeremylt // libraries and APIs for efficient high-order finite element and spectral
70436c2adSjeremylt // element discretizations for exascale applications. For more information and
80436c2adSjeremylt // source code availability see http://github.com/ceed.
90436c2adSjeremylt //
100436c2adSjeremylt // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC,
110436c2adSjeremylt // a collaborative effort of two U.S. Department of Energy organizations (Office
120436c2adSjeremylt // of Science and the National Nuclear Security Administration) responsible for
130436c2adSjeremylt // the planning and preparation of a capable exascale ecosystem, including
140436c2adSjeremylt // software, applications, hardware, advanced system engineering and early
150436c2adSjeremylt // testbed platforms, in support of the nation's exascale computing imperative.
160436c2adSjeremylt 
17ec3da8bcSJed Brown #include <ceed/ceed.h>
18ec3da8bcSJed Brown #include <ceed/backend.h>
193d576824SJeremy L Thompson #include <string.h>
200436c2adSjeremylt #include "ceed-ref.h"
210436c2adSjeremylt 
22f10650afSjeremylt //------------------------------------------------------------------------------
23*9c774eddSJeremy L Thompson // Has Valid Array
24*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
25*9c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) {
26*9c774eddSJeremy L Thompson   int ierr;
27*9c774eddSJeremy L Thompson   CeedVector_Ref *impl;
28*9c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
29*9c774eddSJeremy L Thompson 
30*9c774eddSJeremy L Thompson   *has_valid_array = !!impl->array;
31*9c774eddSJeremy L Thompson 
32*9c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
33*9c774eddSJeremy L Thompson }
34*9c774eddSJeremy L Thompson 
35*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
36*9c774eddSJeremy L Thompson // Check if has borrowed array of given type
37*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
38*9c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec,
39*9c774eddSJeremy L Thompson     CeedMemType mem_type, bool *has_borrowed_array_of_type) {
40*9c774eddSJeremy L Thompson   int ierr;
41*9c774eddSJeremy L Thompson   CeedVector_Ref *impl;
42*9c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
43*9c774eddSJeremy L Thompson   Ceed ceed;
44*9c774eddSJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
45*9c774eddSJeremy L Thompson 
46*9c774eddSJeremy L Thompson   switch (mem_type) {
47*9c774eddSJeremy L Thompson   case CEED_MEM_HOST:
48*9c774eddSJeremy L Thompson     *has_borrowed_array_of_type = !!impl->array_borrowed;
49*9c774eddSJeremy L Thompson     break;
50*9c774eddSJeremy L Thompson   default:
51*9c774eddSJeremy L Thompson     // LCOV_EXCL_START
52*9c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
53*9c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
54*9c774eddSJeremy L Thompson     // LCOV_EXCL_STOP
55*9c774eddSJeremy L Thompson     break;
56*9c774eddSJeremy L Thompson   }
57*9c774eddSJeremy L Thompson 
58*9c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
59*9c774eddSJeremy L Thompson }
60*9c774eddSJeremy L Thompson 
61*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
62f10650afSjeremylt // Vector Set Array
63f10650afSjeremylt //------------------------------------------------------------------------------
64d1d35e2fSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mem_type,
65d1d35e2fSjeremylt                                   CeedCopyMode copy_mode, CeedScalar *array) {
660436c2adSjeremylt   int ierr;
670436c2adSjeremylt   CeedVector_Ref *impl;
68e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
690436c2adSjeremylt   CeedInt length;
70e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr);
710436c2adSjeremylt   Ceed ceed;
72e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
730436c2adSjeremylt 
74d1d35e2fSjeremylt   if (mem_type != CEED_MEM_HOST)
750436c2adSjeremylt     // LCOV_EXCL_START
76*9c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
77*9c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
780436c2adSjeremylt   // LCOV_EXCL_STOP
79*9c774eddSJeremy L Thompson 
80d1d35e2fSjeremylt   switch (copy_mode) {
810436c2adSjeremylt   case CEED_COPY_VALUES:
82*9c774eddSJeremy L Thompson     if (!impl->array_owned) {
83*9c774eddSJeremy L Thompson       ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr);
84*9c774eddSJeremy L Thompson     }
85*9c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
86*9c774eddSJeremy L Thompson     impl->array = impl->array_owned;
87*9c774eddSJeremy L Thompson     if (array)
88*9c774eddSJeremy L Thompson       memcpy(impl->array, array, length * sizeof(array[0]));
890436c2adSjeremylt     break;
900436c2adSjeremylt   case CEED_OWN_POINTER:
91*9c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
92*9c774eddSJeremy L Thompson     impl->array_owned = array;
93*9c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
940436c2adSjeremylt     impl->array = array;
950436c2adSjeremylt     break;
960436c2adSjeremylt   case CEED_USE_POINTER:
97*9c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
98*9c774eddSJeremy L Thompson     impl->array_borrowed = array;
990436c2adSjeremylt     impl->array = array;
1000436c2adSjeremylt   }
101e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1020436c2adSjeremylt }
1030436c2adSjeremylt 
104f10650afSjeremylt //------------------------------------------------------------------------------
1056a6c615bSJeremy L Thompson // Vector Take Array
1066a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
107d1d35e2fSjeremylt static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type,
1086a6c615bSJeremy L Thompson                                    CeedScalar **array) {
1096a6c615bSJeremy L Thompson   int ierr;
1106a6c615bSJeremy L Thompson   CeedVector_Ref *impl;
111e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1126a6c615bSJeremy L Thompson   Ceed ceed;
113e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1146a6c615bSJeremy L Thompson 
115*9c774eddSJeremy L Thompson   (*array) = impl->array_borrowed;
116*9c774eddSJeremy L Thompson   impl->array_borrowed = NULL;
1176a6c615bSJeremy L Thompson   impl->array = NULL;
1186a6c615bSJeremy L Thompson 
119e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1206a6c615bSJeremy L Thompson }
1216a6c615bSJeremy L Thompson 
1226a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
123f10650afSjeremylt // Vector Get Array
124f10650afSjeremylt //------------------------------------------------------------------------------
125*9c774eddSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type,
1260436c2adSjeremylt                                       CeedScalar **array) {
1270436c2adSjeremylt   int ierr;
1280436c2adSjeremylt   CeedVector_Ref *impl;
129e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1300436c2adSjeremylt   Ceed ceed;
131e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1320436c2adSjeremylt 
133d1d35e2fSjeremylt   if (mem_type != CEED_MEM_HOST)
1340436c2adSjeremylt     // LCOV_EXCL_START
135*9c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
136*9c774eddSJeremy L Thompson                      "Can only provide HOST memory for this backend");
1370436c2adSjeremylt   // LCOV_EXCL_STOP
138*9c774eddSJeremy L Thompson 
1390436c2adSjeremylt   *array = impl->array;
140*9c774eddSJeremy L Thompson 
141e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1420436c2adSjeremylt }
1430436c2adSjeremylt 
144f10650afSjeremylt //------------------------------------------------------------------------------
145f10650afSjeremylt // Vector Get Array Read
146f10650afSjeremylt //------------------------------------------------------------------------------
147d1d35e2fSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type,
1480436c2adSjeremylt                                       const CeedScalar **array) {
149*9c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
150*9c774eddSJeremy L Thompson }
151*9c774eddSJeremy L Thompson 
152*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
153*9c774eddSJeremy L Thompson // Vector Get Array
154*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
155*9c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type,
156*9c774eddSJeremy L Thompson                                   CeedScalar **array) {
157*9c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, array);
158*9c774eddSJeremy L Thompson }
159*9c774eddSJeremy L Thompson 
160*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
161*9c774eddSJeremy L Thompson // Vector Get Array Write
162*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------
163*9c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type,
164*9c774eddSJeremy L Thompson                                        const CeedScalar **array) {
1650436c2adSjeremylt   int ierr;
1660436c2adSjeremylt   CeedVector_Ref *impl;
167e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1680436c2adSjeremylt 
169*9c774eddSJeremy L Thompson   if (!impl->array) {
170*9c774eddSJeremy L Thompson     if (!impl->array_owned && !impl->array_borrowed) {
171*9c774eddSJeremy L Thompson       // Allocate if array is not yet allocated
1720436c2adSjeremylt       ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL);
173e15f9bd0SJeremy L Thompson       CeedChkBackend(ierr);
174*9c774eddSJeremy L Thompson     } else {
175*9c774eddSJeremy L Thompson       // Select dirty array for GetArrayWrite
176*9c774eddSJeremy L Thompson       if (impl->array_borrowed)
177*9c774eddSJeremy L Thompson         impl->array = impl->array_borrowed;
178*9c774eddSJeremy L Thompson       else
179*9c774eddSJeremy L Thompson         impl->array = impl->array_owned;
1800436c2adSjeremylt     }
181*9c774eddSJeremy L Thompson   }
182*9c774eddSJeremy L Thompson 
183*9c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1840436c2adSjeremylt }
1850436c2adSjeremylt 
186f10650afSjeremylt //------------------------------------------------------------------------------
187f10650afSjeremylt // Vector Restore Array
188f10650afSjeremylt //------------------------------------------------------------------------------
1890436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) {
190e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1910436c2adSjeremylt }
1920436c2adSjeremylt 
1930436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) {
194e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1950436c2adSjeremylt }
1960436c2adSjeremylt 
197f10650afSjeremylt //------------------------------------------------------------------------------
198f10650afSjeremylt // Vector Destroy
199f10650afSjeremylt //------------------------------------------------------------------------------
2000436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) {
2010436c2adSjeremylt   int ierr;
2020436c2adSjeremylt   CeedVector_Ref *impl;
203e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
2040436c2adSjeremylt 
205*9c774eddSJeremy L Thompson   ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
206e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl); CeedChkBackend(ierr);
207e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
2080436c2adSjeremylt }
2090436c2adSjeremylt 
210f10650afSjeremylt //------------------------------------------------------------------------------
211f10650afSjeremylt // Vector Create
212f10650afSjeremylt //------------------------------------------------------------------------------
2130436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) {
2140436c2adSjeremylt   int ierr;
2150436c2adSjeremylt   CeedVector_Ref *impl;
2160436c2adSjeremylt   Ceed ceed;
217e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
2180436c2adSjeremylt 
219*9c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray",
220*9c774eddSJeremy L Thompson                                 CeedVectorHasValidArray_Ref); CeedChkBackend(ierr);
221*9c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType",
222*9c774eddSJeremy L Thompson                                 CeedVectorHasBorrowedArrayOfType_Ref);
223*9c774eddSJeremy L Thompson   CeedChkBackend(ierr);
2240436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray",
225e15f9bd0SJeremy L Thompson                                 CeedVectorSetArray_Ref); CeedChkBackend(ierr);
2266a6c615bSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray",
227e15f9bd0SJeremy L Thompson                                 CeedVectorTakeArray_Ref); CeedChkBackend(ierr);
2280436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray",
229e15f9bd0SJeremy L Thompson                                 CeedVectorGetArray_Ref); CeedChkBackend(ierr);
2300436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead",
231e15f9bd0SJeremy L Thompson                                 CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr);
232*9c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite",
233*9c774eddSJeremy L Thompson                                 CeedVectorGetArrayWrite_Ref); CeedChkBackend(ierr);
2340436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray",
235e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArray_Ref); CeedChkBackend(ierr);
2360436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead",
237e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr);
2380436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy",
239e15f9bd0SJeremy L Thompson                                 CeedVectorDestroy_Ref); CeedChkBackend(ierr);
240*9c774eddSJeremy L Thompson 
241e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
242e15f9bd0SJeremy L Thompson   ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr);
243*9c774eddSJeremy L Thompson 
244e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
2450436c2adSjeremylt }
246f10650afSjeremylt //------------------------------------------------------------------------------
247