xref: /libCEED/rust/libceed-sys/c-src/backends/ref/ceed-ref-vector.c (revision 1f9221fe62e2635d1a8dba99f0dac116b51a901d)
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 //------------------------------------------------------------------------------
239c774eddSJeremy L Thompson // Has Valid Array
249c774eddSJeremy L Thompson //------------------------------------------------------------------------------
259c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) {
269c774eddSJeremy L Thompson   int ierr;
279c774eddSJeremy L Thompson   CeedVector_Ref *impl;
289c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
299c774eddSJeremy L Thompson 
309c774eddSJeremy L Thompson   *has_valid_array = !!impl->array;
319c774eddSJeremy L Thompson 
329c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
339c774eddSJeremy L Thompson }
349c774eddSJeremy L Thompson 
359c774eddSJeremy L Thompson //------------------------------------------------------------------------------
369c774eddSJeremy L Thompson // Check if has borrowed array of given type
379c774eddSJeremy L Thompson //------------------------------------------------------------------------------
389c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec,
399c774eddSJeremy L Thompson     CeedMemType mem_type, bool *has_borrowed_array_of_type) {
409c774eddSJeremy L Thompson   int ierr;
419c774eddSJeremy L Thompson   CeedVector_Ref *impl;
429c774eddSJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
439c774eddSJeremy L Thompson   Ceed ceed;
449c774eddSJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
459c774eddSJeremy L Thompson 
469c774eddSJeremy L Thompson   switch (mem_type) {
479c774eddSJeremy L Thompson   case CEED_MEM_HOST:
489c774eddSJeremy L Thompson     *has_borrowed_array_of_type = !!impl->array_borrowed;
499c774eddSJeremy L Thompson     break;
509c774eddSJeremy L Thompson   default:
519c774eddSJeremy L Thompson     // LCOV_EXCL_START
529c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
539c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
549c774eddSJeremy L Thompson     // LCOV_EXCL_STOP
559c774eddSJeremy L Thompson     break;
569c774eddSJeremy L Thompson   }
579c774eddSJeremy L Thompson 
589c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
599c774eddSJeremy L Thompson }
609c774eddSJeremy L Thompson 
619c774eddSJeremy 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);
69*1f9221feSJeremy L Thompson   CeedSize 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
769c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
779c774eddSJeremy L Thompson                      "Can only set HOST memory for this backend");
780436c2adSjeremylt   // LCOV_EXCL_STOP
799c774eddSJeremy L Thompson 
80d1d35e2fSjeremylt   switch (copy_mode) {
810436c2adSjeremylt   case CEED_COPY_VALUES:
829c774eddSJeremy L Thompson     if (!impl->array_owned) {
839c774eddSJeremy L Thompson       ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr);
849c774eddSJeremy L Thompson     }
859c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
869c774eddSJeremy L Thompson     impl->array = impl->array_owned;
879c774eddSJeremy L Thompson     if (array)
889c774eddSJeremy L Thompson       memcpy(impl->array, array, length * sizeof(array[0]));
890436c2adSjeremylt     break;
900436c2adSjeremylt   case CEED_OWN_POINTER:
919c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
929c774eddSJeremy L Thompson     impl->array_owned = array;
939c774eddSJeremy L Thompson     impl->array_borrowed = NULL;
940436c2adSjeremylt     impl->array = array;
950436c2adSjeremylt     break;
960436c2adSjeremylt   case CEED_USE_POINTER:
979c774eddSJeremy L Thompson     ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr);
989c774eddSJeremy 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 
1159c774eddSJeremy L Thompson   (*array) = impl->array_borrowed;
1169c774eddSJeremy 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 //------------------------------------------------------------------------------
1259c774eddSJeremy 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
1359c774eddSJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND,
1369c774eddSJeremy L Thompson                      "Can only provide HOST memory for this backend");
1370436c2adSjeremylt   // LCOV_EXCL_STOP
1389c774eddSJeremy L Thompson 
1390436c2adSjeremylt   *array = impl->array;
1409c774eddSJeremy 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) {
1499c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1509c774eddSJeremy L Thompson }
1519c774eddSJeremy L Thompson 
1529c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1539c774eddSJeremy L Thompson // Vector Get Array
1549c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1559c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type,
1569c774eddSJeremy L Thompson                                   CeedScalar **array) {
1579c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, array);
1589c774eddSJeremy L Thompson }
1599c774eddSJeremy L Thompson 
1609c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1619c774eddSJeremy L Thompson // Vector Get Array Write
1629c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1639c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type,
1649c774eddSJeremy L Thompson                                        const CeedScalar **array) {
1650436c2adSjeremylt   int ierr;
1660436c2adSjeremylt   CeedVector_Ref *impl;
167e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1680436c2adSjeremylt 
1699c774eddSJeremy L Thompson   if (!impl->array) {
1709c774eddSJeremy L Thompson     if (!impl->array_owned && !impl->array_borrowed) {
1719c774eddSJeremy 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);
1749c774eddSJeremy L Thompson     } else {
1759c774eddSJeremy L Thompson       // Select dirty array for GetArrayWrite
1769c774eddSJeremy L Thompson       if (impl->array_borrowed)
1779c774eddSJeremy L Thompson         impl->array = impl->array_borrowed;
1789c774eddSJeremy L Thompson       else
1799c774eddSJeremy L Thompson         impl->array = impl->array_owned;
1800436c2adSjeremylt     }
1819c774eddSJeremy L Thompson   }
1829c774eddSJeremy L Thompson 
1839c774eddSJeremy 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 
2059c774eddSJeremy 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 //------------------------------------------------------------------------------
213*1f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) {
2140436c2adSjeremylt   int ierr;
2150436c2adSjeremylt   CeedVector_Ref *impl;
2160436c2adSjeremylt   Ceed ceed;
217e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
2180436c2adSjeremylt 
2199c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray",
2209c774eddSJeremy L Thompson                                 CeedVectorHasValidArray_Ref); CeedChkBackend(ierr);
2219c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType",
2229c774eddSJeremy L Thompson                                 CeedVectorHasBorrowedArrayOfType_Ref);
2239c774eddSJeremy 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);
2329c774eddSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite",
2339c774eddSJeremy 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);
2409c774eddSJeremy L Thompson 
241e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr);
242e15f9bd0SJeremy L Thompson   ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr);
2439c774eddSJeremy L Thompson 
244e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
2450436c2adSjeremylt }
246f10650afSjeremylt //------------------------------------------------------------------------------
247