xref: /libCEED/rust/libceed-sys/c-src/backends/ref/ceed-ref-vector.c (revision 3d8e882215d238700cdceb37404f76ca7fa24eaa)
1*3d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
2*3d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
30436c2adSjeremylt //
4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
50436c2adSjeremylt //
6*3d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
70436c2adSjeremylt 
8ec3da8bcSJed Brown #include <ceed/ceed.h>
9ec3da8bcSJed Brown #include <ceed/backend.h>
103d576824SJeremy L Thompson #include <string.h>
110436c2adSjeremylt #include "ceed-ref.h"
120436c2adSjeremylt 
13f10650afSjeremylt //------------------------------------------------------------------------------
149c774eddSJeremy L Thompson // Has Valid Array
159c774eddSJeremy L Thompson //------------------------------------------------------------------------------
169c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) {
179c774eddSJeremy L Thompson   int ierr;
189c774eddSJeremy L Thompson   CeedVector_Ref *impl;
199c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
209c774eddSJeremy L Thompson 
219c774eddSJeremy L Thompson   *has_valid_array = !!impl->array;
229c774eddSJeremy L Thompson 
239c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
249c774eddSJeremy L Thompson }
259c774eddSJeremy L Thompson 
269c774eddSJeremy L Thompson //------------------------------------------------------------------------------
279c774eddSJeremy L Thompson // Check if has borrowed array of given type
289c774eddSJeremy L Thompson //------------------------------------------------------------------------------
299c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec,
309c774eddSJeremy L Thompson     CeedMemType mem_type, bool *has_borrowed_array_of_type) {
319c774eddSJeremy L Thompson   int ierr;
329c774eddSJeremy L Thompson   CeedVector_Ref *impl;
339c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
349c774eddSJeremy L Thompson   Ceed ceed;
359c774eddSJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
369c774eddSJeremy L Thompson 
379c774eddSJeremy L Thompson   switch (mem_type) {
389c774eddSJeremy L Thompson   case CEED_MEM_HOST:
399c774eddSJeremy L Thompson     *has_borrowed_array_of_type = !!impl->array_borrowed;
409c774eddSJeremy L Thompson     break;
419c774eddSJeremy L Thompson   default:
429c774eddSJeremy L Thompson     // LCOV_EXCL_START
439c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
449c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
459c774eddSJeremy L Thompson     // LCOV_EXCL_STOP
469c774eddSJeremy L Thompson     break;
479c774eddSJeremy L Thompson   }
489c774eddSJeremy L Thompson 
499c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
509c774eddSJeremy L Thompson }
519c774eddSJeremy L Thompson 
529c774eddSJeremy L Thompson //------------------------------------------------------------------------------
53f10650afSjeremylt // Vector Set Array
54f10650afSjeremylt //------------------------------------------------------------------------------
55d1d35e2fSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mem_type,
56d1d35e2fSjeremylt                                   CeedCopyMode copy_mode, CeedScalar *array) {
570436c2adSjeremylt   int ierr;
580436c2adSjeremylt   CeedVector_Ref *impl;
59e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
601f9221feSJeremy L Thompson   CeedSize length;
61e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr);
620436c2adSjeremylt   Ceed ceed;
63e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
640436c2adSjeremylt 
65d1d35e2fSjeremylt   if (mem_type != CEED_MEM_HOST)
660436c2adSjeremylt     // LCOV_EXCL_START
679c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
689c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
690436c2adSjeremylt   // LCOV_EXCL_STOP
709c774eddSJeremy L Thompson 
71d1d35e2fSjeremylt   switch (copy_mode) {
720436c2adSjeremylt   case CEED_COPY_VALUES:
739c774eddSJeremy L Thompson     if (!impl->array_owned) {
749c774eddSJeremy L Thompson       ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr);
759c774eddSJeremy L Thompson     }
769c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
779c774eddSJeremy L Thompson     impl->array = impl->array_owned;
789c774eddSJeremy L Thompson     if (array)
799c774eddSJeremy L Thompson       memcpy(impl->array, array, length * sizeof(array[0]));
800436c2adSjeremylt     break;
810436c2adSjeremylt   case CEED_OWN_POINTER:
829c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
839c774eddSJeremy L Thompson     impl->array_owned = array;
849c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
850436c2adSjeremylt     impl->array = array;
860436c2adSjeremylt     break;
870436c2adSjeremylt   case CEED_USE_POINTER:
889c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
899c774eddSJeremy L Thompson     impl->array_borrowed = array;
900436c2adSjeremylt     impl->array = array;
910436c2adSjeremylt   }
92e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
930436c2adSjeremylt }
940436c2adSjeremylt 
95f10650afSjeremylt //------------------------------------------------------------------------------
966a6c615bSJeremy L Thompson // Vector Take Array
976a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
98d1d35e2fSjeremylt static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type,
996a6c615bSJeremy L Thompson                                    CeedScalar **array) {
1006a6c615bSJeremy L Thompson   int ierr;
1016a6c615bSJeremy L Thompson   CeedVector_Ref *impl;
102e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1036a6c615bSJeremy L Thompson   Ceed ceed;
104e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1056a6c615bSJeremy L Thompson 
1069c774eddSJeremy L Thompson   (*array) = impl->array_borrowed;
1079c774eddSJeremy L Thompson   impl->array_borrowed = NULL;
1086a6c615bSJeremy L Thompson   impl->array = NULL;
1096a6c615bSJeremy L Thompson 
110e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1116a6c615bSJeremy L Thompson }
1126a6c615bSJeremy L Thompson 
1136a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
114f10650afSjeremylt // Vector Get Array
115f10650afSjeremylt //------------------------------------------------------------------------------
1169c774eddSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type,
1170436c2adSjeremylt                                       CeedScalar **array) {
1180436c2adSjeremylt   int ierr;
1190436c2adSjeremylt   CeedVector_Ref *impl;
120e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1210436c2adSjeremylt   Ceed ceed;
122e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1230436c2adSjeremylt 
124d1d35e2fSjeremylt   if (mem_type != CEED_MEM_HOST)
1250436c2adSjeremylt     // LCOV_EXCL_START
1269c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
1279c774eddSJeremy L Thompson                      "Can only provide HOST memory for this backend");
1280436c2adSjeremylt   // LCOV_EXCL_STOP
1299c774eddSJeremy L Thompson 
1300436c2adSjeremylt   *array = impl->array;
1319c774eddSJeremy L Thompson 
132e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1330436c2adSjeremylt }
1340436c2adSjeremylt 
135f10650afSjeremylt //------------------------------------------------------------------------------
136f10650afSjeremylt // Vector Get Array Read
137f10650afSjeremylt //------------------------------------------------------------------------------
138d1d35e2fSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type,
1390436c2adSjeremylt                                       const CeedScalar **array) {
1409c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1419c774eddSJeremy L Thompson }
1429c774eddSJeremy L Thompson 
1439c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1449c774eddSJeremy L Thompson // Vector Get Array
1459c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1469c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type,
1479c774eddSJeremy L Thompson                                   CeedScalar **array) {
1489c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, array);
1499c774eddSJeremy L Thompson }
1509c774eddSJeremy L Thompson 
1519c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1529c774eddSJeremy L Thompson // Vector Get Array Write
1539c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1549c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type,
1559c774eddSJeremy L Thompson                                        const CeedScalar **array) {
1560436c2adSjeremylt   int ierr;
1570436c2adSjeremylt   CeedVector_Ref *impl;
158e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1590436c2adSjeremylt 
1609c774eddSJeremy L Thompson   if (!impl->array) {
1619c774eddSJeremy L Thompson     if (!impl->array_owned && !impl->array_borrowed) {
1629c774eddSJeremy L Thompson       // Allocate if array is not yet allocated
1630436c2adSjeremylt       ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL);
164e15f9bd0SJeremy L Thompson       CeedChkBackend(ierr);
1659c774eddSJeremy L Thompson     } else {
1669c774eddSJeremy L Thompson       // Select dirty array for GetArrayWrite
1679c774eddSJeremy L Thompson       if (impl->array_borrowed)
1689c774eddSJeremy L Thompson         impl->array = impl->array_borrowed;
1699c774eddSJeremy L Thompson       else
1709c774eddSJeremy L Thompson         impl->array = impl->array_owned;
1710436c2adSjeremylt     }
1729c774eddSJeremy L Thompson   }
1739c774eddSJeremy L Thompson 
1749c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1750436c2adSjeremylt }
1760436c2adSjeremylt 
177f10650afSjeremylt //------------------------------------------------------------------------------
178f10650afSjeremylt // Vector Restore Array
179f10650afSjeremylt //------------------------------------------------------------------------------
1800436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) {
181e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1820436c2adSjeremylt }
1830436c2adSjeremylt 
1840436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) {
185e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1860436c2adSjeremylt }
1870436c2adSjeremylt 
188f10650afSjeremylt //------------------------------------------------------------------------------
189f10650afSjeremylt // Vector Destroy
190f10650afSjeremylt //------------------------------------------------------------------------------
1910436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) {
1920436c2adSjeremylt   int ierr;
1930436c2adSjeremylt   CeedVector_Ref *impl;
194e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1950436c2adSjeremylt 
1969c774eddSJeremy L Thompson   ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
197e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl); CeedChkBackend(ierr);
198e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1990436c2adSjeremylt }
2000436c2adSjeremylt 
201f10650afSjeremylt //------------------------------------------------------------------------------
202f10650afSjeremylt // Vector Create
203f10650afSjeremylt //------------------------------------------------------------------------------
2041f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) {
2050436c2adSjeremylt   int ierr;
2060436c2adSjeremylt   CeedVector_Ref *impl;
2070436c2adSjeremylt   Ceed ceed;
208e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
2090436c2adSjeremylt 
2109c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray",
2119c774eddSJeremy L Thompson                                 CeedVectorHasValidArray_Ref); CeedChkBackend(ierr);
2129c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType",
2139c774eddSJeremy L Thompson                                 CeedVectorHasBorrowedArrayOfType_Ref);
2149c774eddSJeremy L Thompson   CeedChkBackend(ierr);
2150436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray",
216e15f9bd0SJeremy L Thompson                                 CeedVectorSetArray_Ref); CeedChkBackend(ierr);
2176a6c615bSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray",
218e15f9bd0SJeremy L Thompson                                 CeedVectorTakeArray_Ref); CeedChkBackend(ierr);
2190436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray",
220e15f9bd0SJeremy L Thompson                                 CeedVectorGetArray_Ref); CeedChkBackend(ierr);
2210436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead",
222e15f9bd0SJeremy L Thompson                                 CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr);
2239c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite",
2249c774eddSJeremy L Thompson                                 CeedVectorGetArrayWrite_Ref); CeedChkBackend(ierr);
2250436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray",
226e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArray_Ref); CeedChkBackend(ierr);
2270436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead",
228e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr);
2290436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy",
230e15f9bd0SJeremy L Thompson                                 CeedVectorDestroy_Ref); CeedChkBackend(ierr);
2319c774eddSJeremy L Thompson 
232e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
233e15f9bd0SJeremy L Thompson   ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr);
2349c774eddSJeremy L Thompson 
235e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
2360436c2adSjeremylt }
237f10650afSjeremylt //------------------------------------------------------------------------------
238