xref: /libCEED/backends/ref/ceed-ref-vector.c (revision f5d1e50421556545666f89e18ad21fef6dcea5ba)
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));
346e536b99SJeremy 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 
496e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only set HOST memory for this backend");
509c774eddSJeremy L Thompson 
51*f5d1e504SJeremy L Thompson   CeedCallBackend(CeedSetHostCeedScalarArray(array, copy_mode, length, (const CeedScalar **)&impl->array_owned,
52*f5d1e504SJeremy L Thompson                                              (const CeedScalar **)&impl->array_borrowed, (const CeedScalar **)&impl->array));
53e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
540436c2adSjeremylt }
550436c2adSjeremylt 
56f10650afSjeremylt //------------------------------------------------------------------------------
576a6c615bSJeremy L Thompson // Vector Take Array
586a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
592b730f8bSJeremy L Thompson static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
60ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
61ad70ee2cSJeremy L Thompson 
62ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
636a6c615bSJeremy L Thompson 
646e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend");
659798701eSJeremy L Thompson 
669c774eddSJeremy L Thompson   (*array)             = impl->array_borrowed;
679c774eddSJeremy L Thompson   impl->array_borrowed = NULL;
686a6c615bSJeremy L Thompson   impl->array          = NULL;
69e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
706a6c615bSJeremy L Thompson }
716a6c615bSJeremy L Thompson 
726a6c615bSJeremy L Thompson //------------------------------------------------------------------------------
73f10650afSjeremylt // Vector Get Array
74f10650afSjeremylt //------------------------------------------------------------------------------
752b730f8bSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
76ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
77ad70ee2cSJeremy L Thompson 
78ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
790436c2adSjeremylt 
806e536b99SJeremy L Thompson   CeedCheck(mem_type == CEED_MEM_HOST, CeedVectorReturnCeed(vec), CEED_ERROR_BACKEND, "Can only provide HOST memory for this backend");
819c774eddSJeremy L Thompson 
820436c2adSjeremylt   *array = impl->array;
83e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
840436c2adSjeremylt }
850436c2adSjeremylt 
86f10650afSjeremylt //------------------------------------------------------------------------------
87f10650afSjeremylt // Vector Get Array Read
88f10650afSjeremylt //------------------------------------------------------------------------------
892b730f8bSJeremy L Thompson static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type, const CeedScalar **array) {
909c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
919c774eddSJeremy L Thompson }
929c774eddSJeremy L Thompson 
939c774eddSJeremy L Thompson //------------------------------------------------------------------------------
949c774eddSJeremy L Thompson // Vector Get Array
959c774eddSJeremy L Thompson //------------------------------------------------------------------------------
962b730f8bSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
979c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, array);
989c774eddSJeremy L Thompson }
999c774eddSJeremy L Thompson 
1009c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1019c774eddSJeremy L Thompson // Vector Get Array Write
1029c774eddSJeremy L Thompson //------------------------------------------------------------------------------
1030836ce8dSSebastian Grimberg static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type, CeedScalar **array) {
1040436c2adSjeremylt   CeedVector_Ref *impl;
105ad70ee2cSJeremy L Thompson 
1062b730f8bSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
1070436c2adSjeremylt 
1083fad321eSJeremy L Thompson   if (!impl->array) CeedCallBackend(CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL));
1099c774eddSJeremy L Thompson   return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array);
1100436c2adSjeremylt }
1110436c2adSjeremylt 
112f10650afSjeremylt //------------------------------------------------------------------------------
113f10650afSjeremylt // Vector Restore Array
114f10650afSjeremylt //------------------------------------------------------------------------------
1152b730f8bSJeremy L Thompson static int CeedVectorRestoreArray_Ref(CeedVector vec) { return CEED_ERROR_SUCCESS; }
1160436c2adSjeremylt 
117b2165e7aSSebastian Grimberg //------------------------------------------------------------------------------
118b2165e7aSSebastian Grimberg // Vector Restore Array Read
119b2165e7aSSebastian Grimberg //------------------------------------------------------------------------------
1202b730f8bSJeremy L Thompson static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { return CEED_ERROR_SUCCESS; }
1210436c2adSjeremylt 
122f10650afSjeremylt //------------------------------------------------------------------------------
123f10650afSjeremylt // Vector Destroy
124f10650afSjeremylt //------------------------------------------------------------------------------
1250436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) {
1260436c2adSjeremylt   CeedVector_Ref *impl;
1270436c2adSjeremylt 
128ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetData(vec, &impl));
1292b730f8bSJeremy L Thompson   CeedCallBackend(CeedFree(&impl->array_owned));
1302b730f8bSJeremy L Thompson   CeedCallBackend(CeedFree(&impl));
131e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1320436c2adSjeremylt }
1330436c2adSjeremylt 
134f10650afSjeremylt //------------------------------------------------------------------------------
135f10650afSjeremylt // Vector Create
136f10650afSjeremylt //------------------------------------------------------------------------------
1371f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) {
1380436c2adSjeremylt   Ceed            ceed;
139ad70ee2cSJeremy L Thompson   CeedVector_Ref *impl;
1400436c2adSjeremylt 
141ad70ee2cSJeremy L Thompson   CeedCallBackend(CeedVectorGetCeed(vec, &ceed));
1422b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray", CeedVectorHasValidArray_Ref));
1432b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType", CeedVectorHasBorrowedArrayOfType_Ref));
1442b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", CeedVectorSetArray_Ref));
1452b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", CeedVectorTakeArray_Ref));
1462b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", CeedVectorGetArray_Ref));
1472b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", CeedVectorGetArrayRead_Ref));
1482b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite", CeedVectorGetArrayWrite_Ref));
1492b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", CeedVectorRestoreArray_Ref));
1502b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", CeedVectorRestoreArrayRead_Ref));
1512b730f8bSJeremy L Thompson   CeedCallBackend(CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", CeedVectorDestroy_Ref));
1522b730f8bSJeremy L Thompson   CeedCallBackend(CeedCalloc(1, &impl));
1532b730f8bSJeremy L Thompson   CeedCallBackend(CeedVectorSetData(vec, impl));
154e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1550436c2adSjeremylt }
1562a86cc9dSSebastian Grimberg 
157f10650afSjeremylt //------------------------------------------------------------------------------
158