xref: /libCEED/rust/libceed-sys/c-src/backends/ref/ceed-ref-vector.c (revision 6e536b992ff6bc401c55631f1bc4464446496b52)
13d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors.
23d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details.
30436c2adSjeremylt //
43d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause
50436c2adSjeremylt //
63d8e8822SJeremy L Thompson // This file is part of CEED:  http://github.com/ceed
70436c2adSjeremylt 
849aac155SJeremy L Thompson #include <ceed.h>
9ec3da8bcSJed Brown #include <ceed/backend.h>
1049aac155SJeremy L Thompson #include <stdbool.h>
113d576824SJeremy L Thompson #include <string.h>
122b730f8bSJeremy L Thompson 
130436c2adSjeremylt #include "ceed-ref.h"
140436c2adSjeremylt 
15f10650afSjeremylt //------------------------------------------------------------------------------
169c774eddSJeremy L Thompson // Has Valid Array
179c774eddSJeremy L Thompson //------------------------------------------------------------------------------
189c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) {
199c774eddSJeremy L Thompson   CeedVector_Ref *impl;
20ad70ee2cSJeremy L Thompson 
212b730f8bSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
229c774eddSJeremy L Thompson 
231c66c397SJeremy L Thompson   *has_valid_array = impl->array;
249c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
259c774eddSJeremy L Thompson }
269c774eddSJeremy L Thompson 
279c774eddSJeremy L Thompson //------------------------------------------------------------------------------
289c774eddSJeremy L Thompson // Check if has borrowed array of given type
299c774eddSJeremy L Thompson //------------------------------------------------------------------------------
302b730f8bSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec, CeedMemType mem_type, bool *has_borrowed_array_of_type) {
31ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
32ad70ee2cSJeremy L Thompson 
33ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
34*6e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only set HOST memory for this backend");
351c66c397SJeremy L Thompson   *has_borrowed_array_of_type = impl->array_borrowed;
369c774eddSJeremy L Thompson   return CEED_ERROR_SUCCESS;
379c774eddSJeremy L Thompson }
389c774eddSJeremy L Thompson 
399c774eddSJeremy L Thompson //------------------------------------------------------------------------------
40f10650afSjeremylt // Vector Set Array
41f10650afSjeremylt //------------------------------------------------------------------------------
422b730f8bSJeremy L Thompson static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mem_type, CeedCopyMode copy_mode, CeedScalar *array) {
43ad70ee2cSJeremy L Thompson   CeedSize        length;
44ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
45ad70ee2cSJeremy L Thompson 
46ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
47ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetLength(vec, &length));
480436c2adSjeremylt 
49*6e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only set HOST memory for this backend");
509c774eddSJeremy L Thompson 
51d1d35e2fSjeremylt   switch (copy_mode) {
520436c2adSjeremylt     case CEED_COPY_VALUES:
539c774eddSJeremy L Thompson       if (!impl->array_owned) {
542b730f8bSJeremy L Thompson         CeedCallBackend(CeedCalloc(length, &impl->array_owned));
559c774eddSJeremy L Thompson       }
569c774eddSJeremy L Thompson       impl->array_borrowed = NULL;
579c774eddSJeremy L Thompson       impl->array          = impl->array_owned;
582b730f8bSJeremy L Thompson       if (array) memcpy(impl->array, array, length * sizeof(array[0]));
590436c2adSjeremylt       break;
600436c2adSjeremylt     case CEED_OWN_POINTER:
612b730f8bSJeremy L Thompson       CeedCallBackend(CeedFree(&impl->array_owned));
629c774eddSJeremy L Thompson       impl->array_owned    = array;
639c774eddSJeremy L Thompson       impl->array_borrowed = NULL;
640436c2adSjeremylt       impl->array          = array;
650436c2adSjeremylt       break;
660436c2adSjeremylt     case CEED_USE_POINTER:
672b730f8bSJeremy L Thompson       CeedCallBackend(CeedFree(&impl->array_owned));
689c774eddSJeremy L Thompson       impl->array_borrowed = array;
690436c2adSjeremylt       impl->array          = array;
700436c2adSjeremylt   }
71e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
720436c2adSjeremylt }
730436c2adSjeremylt 
74f10650afSjeremylt //------------------------------------------------------------------------------
756a6c615bSJeremy L Thompson // Vector Take Array
766a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
772b730f8bSJeremy L Thompson static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
78ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
79ad70ee2cSJeremy L Thompson 
80ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
816a6c615bSJeremy L Thompson 
82*6e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend");
839798701eSJeremy L Thompson 
849c774eddSJeremy L Thompson   (*array)             = impl->array_borrowed;
859c774eddSJeremy L Thompson   impl->array_borrowed = NULL;
866a6c615bSJeremy L Thompson   impl->array          = NULL;
87e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
886a6c615bSJeremy L Thompson }
896a6c615bSJeremy L Thompson 
906a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
91f10650afSjeremylt // Vector Get Array
92f10650afSjeremylt //------------------------------------------------------------------------------
932b730f8bSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
94ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
95ad70ee2cSJeremy L Thompson 
96ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
970436c2adSjeremylt 
98*6e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend");
999c774eddSJeremy L Thompson 
1000436c2adSjeremylt   *array = impl->array;
101e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1020436c2adSjeremylt }
1030436c2adSjeremylt 
104f10650afSjeremylt //------------------------------------------------------------------------------
105f10650afSjeremylt // Vector Get Array Read
106f10650afSjeremylt //------------------------------------------------------------------------------
1072b730f8bSJeremy L Thompson static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type, const CeedScalar **array) {
1089c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1099c774eddSJeremy L Thompson }
1109c774eddSJeremy L Thompson 
1119c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1129c774eddSJeremy L Thompson // Vector Get Array
1139c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1142b730f8bSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
1159c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, array);
1169c774eddSJeremy L Thompson }
1179c774eddSJeremy L Thompson 
1189c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1199c774eddSJeremy L Thompson // Vector Get Array Write
1209c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1210836ce8dSSebastian Grimberg static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
1220436c2adSjeremylt   CeedVector_Ref *impl;
123ad70ee2cSJeremy L Thompson 
1242b730f8bSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
1250436c2adSjeremylt 
1269c774eddSJeremy L Thompson   if (!impl->array) {
1279c774eddSJeremy L Thompson     if (!impl->array_owned && !impl->array_borrowed) {
1289c774eddSJeremy L Thompson       // Allocate if array is not yet allocated
1292b730f8bSJeremy L Thompson       CeedCallBackend(CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL));
1309c774eddSJeremy L Thompson     } else {
1319c774eddSJeremy L Thompson       // Select dirty array for GetArrayWrite
1322b730f8bSJeremy L Thompson       if (impl->array_borrowed) impl->array = impl->array_borrowed;
1332b730f8bSJeremy L Thompson       else impl->array = impl->array_owned;
1340436c2adSjeremylt     }
1359c774eddSJeremy L Thompson   }
1369c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1370436c2adSjeremylt }
1380436c2adSjeremylt 
139f10650afSjeremylt //------------------------------------------------------------------------------
140f10650afSjeremylt // Vector Restore Array
141f10650afSjeremylt //------------------------------------------------------------------------------
1422b730f8bSJeremy L Thompson static int CeedVectorRestoreArray_Ref(CeedVector vec) { return CEED_ERROR_SUCCESS; }
1430436c2adSjeremylt 
144b2165e7aSSebastian Grimberg //------------------------------------------------------------------------------
145b2165e7aSSebastian Grimberg // Vector Restore Array Read
146b2165e7aSSebastian Grimberg //------------------------------------------------------------------------------
1472b730f8bSJeremy L Thompson static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { return CEED_ERROR_SUCCESS; }
1480436c2adSjeremylt 
149f10650afSjeremylt //------------------------------------------------------------------------------
150f10650afSjeremylt // Vector Destroy
151f10650afSjeremylt //------------------------------------------------------------------------------
1520436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) {
1530436c2adSjeremylt   CeedVector_Ref *impl;
1540436c2adSjeremylt 
155ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
1562b730f8bSJeremy L Thompson   CeedCallBackend(CeedFree(&impl->array_owned));
1572b730f8bSJeremy L Thompson   CeedCallBackend(CeedFree(&impl));
158e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1590436c2adSjeremylt }
1600436c2adSjeremylt 
161f10650afSjeremylt //------------------------------------------------------------------------------
162f10650afSjeremylt // Vector Create
163f10650afSjeremylt //------------------------------------------------------------------------------
1641f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) {
1650436c2adSjeremylt   Ceed            ceed;
166ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
1670436c2adSjeremylt 
168ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetCeed(vec, &ceed));
1692b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray", CeedVectorHasValidArray_Ref));
1702b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType", CeedVectorHasBorrowedArrayOfType_Ref));
1712b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", CeedVectorSetArray_Ref));
1722b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", CeedVectorTakeArray_Ref));
1732b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", CeedVectorGetArray_Ref));
1742b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", CeedVectorGetArrayRead_Ref));
1752b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite", CeedVectorGetArrayWrite_Ref));
1762b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", CeedVectorRestoreArray_Ref));
1772b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", CeedVectorRestoreArrayRead_Ref));
1782b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", CeedVectorDestroy_Ref));
1792b730f8bSJeremy L Thompson   CeedCallBackend(CeedCalloc(1, &impl));
1802b730f8bSJeremy L Thompson   CeedCallBackend(CeedVectorSetData(vec, impl));
181e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1820436c2adSjeremylt }
1832a86cc9dSSebastian Grimberg 
184f10650afSjeremylt //------------------------------------------------------------------------------
185