15aed82e4SJeremy L Thompson // Copyright (c) 2017-2024, 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 51f5d1e504SJeremy L Thompson CeedCallBackend(CeedSetHostCeedScalarArray(array, copy_mode, length, (const CeedScalar **)&impl->array_owned, 52f5d1e504SJeremy 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)); 152*9bc66399SJeremy L Thompson CeedCallBackend(CeedDestroy(&ceed)); 1532b730f8bSJeremy L Thompson CeedCallBackend(CeedCalloc(1, &impl)); 1542b730f8bSJeremy L Thompson CeedCallBackend(CeedVectorSetData(vec, impl)); 155e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1560436c2adSjeremylt } 1572a86cc9dSSebastian Grimberg 158f10650afSjeremylt //------------------------------------------------------------------------------ 159