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