1*3d8e8822SJeremy L Thompson // Copyright (c) 2017-2022, Lawrence Livermore National Security, LLC and other CEED contributors. 2*3d8e8822SJeremy L Thompson // All Rights Reserved. See the top-level LICENSE and NOTICE files for details. 30436c2adSjeremylt // 4*3d8e8822SJeremy L Thompson // SPDX-License-Identifier: BSD-2-Clause 50436c2adSjeremylt // 6*3d8e8822SJeremy L Thompson // This file is part of CEED: http://github.com/ceed 70436c2adSjeremylt 8ec3da8bcSJed Brown #include <ceed/ceed.h> 9ec3da8bcSJed Brown #include <ceed/backend.h> 103d576824SJeremy L Thompson #include <string.h> 110436c2adSjeremylt #include "ceed-ref.h" 120436c2adSjeremylt 13f10650afSjeremylt //------------------------------------------------------------------------------ 149c774eddSJeremy L Thompson // Has Valid Array 159c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 169c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) { 179c774eddSJeremy L Thompson int ierr; 189c774eddSJeremy L Thompson CeedVector_Ref *impl; 199c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 209c774eddSJeremy L Thompson 219c774eddSJeremy L Thompson *has_valid_array = !!impl->array; 229c774eddSJeremy L Thompson 239c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 249c774eddSJeremy L Thompson } 259c774eddSJeremy L Thompson 269c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 279c774eddSJeremy L Thompson // Check if has borrowed array of given type 289c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 299c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec, 309c774eddSJeremy L Thompson CeedMemType mem_type, bool *has_borrowed_array_of_type) { 319c774eddSJeremy L Thompson int ierr; 329c774eddSJeremy L Thompson CeedVector_Ref *impl; 339c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 349c774eddSJeremy L Thompson Ceed ceed; 359c774eddSJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 369c774eddSJeremy L Thompson 379c774eddSJeremy L Thompson switch (mem_type) { 389c774eddSJeremy L Thompson case CEED_MEM_HOST: 399c774eddSJeremy L Thompson *has_borrowed_array_of_type = !!impl->array_borrowed; 409c774eddSJeremy L Thompson break; 419c774eddSJeremy L Thompson default: 429c774eddSJeremy L Thompson // LCOV_EXCL_START 439c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 449c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 459c774eddSJeremy L Thompson // LCOV_EXCL_STOP 469c774eddSJeremy L Thompson break; 479c774eddSJeremy L Thompson } 489c774eddSJeremy L Thompson 499c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 509c774eddSJeremy L Thompson } 519c774eddSJeremy L Thompson 529c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 53f10650afSjeremylt // Vector Set Array 54f10650afSjeremylt //------------------------------------------------------------------------------ 55d1d35e2fSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mem_type, 56d1d35e2fSjeremylt CeedCopyMode copy_mode, CeedScalar *array) { 570436c2adSjeremylt int ierr; 580436c2adSjeremylt CeedVector_Ref *impl; 59e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 601f9221feSJeremy L Thompson CeedSize length; 61e15f9bd0SJeremy L Thompson ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr); 620436c2adSjeremylt Ceed ceed; 63e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 640436c2adSjeremylt 65d1d35e2fSjeremylt if (mem_type != CEED_MEM_HOST) 660436c2adSjeremylt // LCOV_EXCL_START 679c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 689c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 690436c2adSjeremylt // LCOV_EXCL_STOP 709c774eddSJeremy L Thompson 71d1d35e2fSjeremylt switch (copy_mode) { 720436c2adSjeremylt case CEED_COPY_VALUES: 739c774eddSJeremy L Thompson if (!impl->array_owned) { 749c774eddSJeremy L Thompson ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr); 759c774eddSJeremy L Thompson } 769c774eddSJeremy L Thompson impl->array_borrowed = NULL; 779c774eddSJeremy L Thompson impl->array = impl->array_owned; 789c774eddSJeremy L Thompson if (array) 799c774eddSJeremy L Thompson memcpy(impl->array, array, length * sizeof(array[0])); 800436c2adSjeremylt break; 810436c2adSjeremylt case CEED_OWN_POINTER: 829c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 839c774eddSJeremy L Thompson impl->array_owned = array; 849c774eddSJeremy L Thompson impl->array_borrowed = NULL; 850436c2adSjeremylt impl->array = array; 860436c2adSjeremylt break; 870436c2adSjeremylt case CEED_USE_POINTER: 889c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 899c774eddSJeremy L Thompson impl->array_borrowed = array; 900436c2adSjeremylt impl->array = array; 910436c2adSjeremylt } 92e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 930436c2adSjeremylt } 940436c2adSjeremylt 95f10650afSjeremylt //------------------------------------------------------------------------------ 966a6c615bSJeremy L Thompson // Vector Take Array 976a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 98d1d35e2fSjeremylt static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type, 996a6c615bSJeremy L Thompson CeedScalar **array) { 1006a6c615bSJeremy L Thompson int ierr; 1016a6c615bSJeremy L Thompson CeedVector_Ref *impl; 102e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1036a6c615bSJeremy L Thompson Ceed ceed; 104e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1056a6c615bSJeremy L Thompson 1069c774eddSJeremy L Thompson (*array) = impl->array_borrowed; 1079c774eddSJeremy L Thompson impl->array_borrowed = NULL; 1086a6c615bSJeremy L Thompson impl->array = NULL; 1096a6c615bSJeremy L Thompson 110e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1116a6c615bSJeremy L Thompson } 1126a6c615bSJeremy L Thompson 1136a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 114f10650afSjeremylt // Vector Get Array 115f10650afSjeremylt //------------------------------------------------------------------------------ 1169c774eddSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type, 1170436c2adSjeremylt CeedScalar **array) { 1180436c2adSjeremylt int ierr; 1190436c2adSjeremylt CeedVector_Ref *impl; 120e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1210436c2adSjeremylt Ceed ceed; 122e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1230436c2adSjeremylt 124d1d35e2fSjeremylt if (mem_type != CEED_MEM_HOST) 1250436c2adSjeremylt // LCOV_EXCL_START 1269c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 1279c774eddSJeremy L Thompson "Can only provide HOST memory for this backend"); 1280436c2adSjeremylt // LCOV_EXCL_STOP 1299c774eddSJeremy L Thompson 1300436c2adSjeremylt *array = impl->array; 1319c774eddSJeremy L Thompson 132e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1330436c2adSjeremylt } 1340436c2adSjeremylt 135f10650afSjeremylt //------------------------------------------------------------------------------ 136f10650afSjeremylt // Vector Get Array Read 137f10650afSjeremylt //------------------------------------------------------------------------------ 138d1d35e2fSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type, 1390436c2adSjeremylt const CeedScalar **array) { 1409c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array); 1419c774eddSJeremy L Thompson } 1429c774eddSJeremy L Thompson 1439c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1449c774eddSJeremy L Thompson // Vector Get Array 1459c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1469c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type, 1479c774eddSJeremy L Thompson CeedScalar **array) { 1489c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, array); 1499c774eddSJeremy L Thompson } 1509c774eddSJeremy L Thompson 1519c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1529c774eddSJeremy L Thompson // Vector Get Array Write 1539c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1549c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type, 1559c774eddSJeremy L Thompson const CeedScalar **array) { 1560436c2adSjeremylt int ierr; 1570436c2adSjeremylt CeedVector_Ref *impl; 158e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1590436c2adSjeremylt 1609c774eddSJeremy L Thompson if (!impl->array) { 1619c774eddSJeremy L Thompson if (!impl->array_owned && !impl->array_borrowed) { 1629c774eddSJeremy L Thompson // Allocate if array is not yet allocated 1630436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 164e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 1659c774eddSJeremy L Thompson } else { 1669c774eddSJeremy L Thompson // Select dirty array for GetArrayWrite 1679c774eddSJeremy L Thompson if (impl->array_borrowed) 1689c774eddSJeremy L Thompson impl->array = impl->array_borrowed; 1699c774eddSJeremy L Thompson else 1709c774eddSJeremy L Thompson impl->array = impl->array_owned; 1710436c2adSjeremylt } 1729c774eddSJeremy L Thompson } 1739c774eddSJeremy L Thompson 1749c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array); 1750436c2adSjeremylt } 1760436c2adSjeremylt 177f10650afSjeremylt //------------------------------------------------------------------------------ 178f10650afSjeremylt // Vector Restore Array 179f10650afSjeremylt //------------------------------------------------------------------------------ 1800436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 181e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1820436c2adSjeremylt } 1830436c2adSjeremylt 1840436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 185e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1860436c2adSjeremylt } 1870436c2adSjeremylt 188f10650afSjeremylt //------------------------------------------------------------------------------ 189f10650afSjeremylt // Vector Destroy 190f10650afSjeremylt //------------------------------------------------------------------------------ 1910436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 1920436c2adSjeremylt int ierr; 1930436c2adSjeremylt CeedVector_Ref *impl; 194e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1950436c2adSjeremylt 1969c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 197e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl); CeedChkBackend(ierr); 198e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1990436c2adSjeremylt } 2000436c2adSjeremylt 201f10650afSjeremylt //------------------------------------------------------------------------------ 202f10650afSjeremylt // Vector Create 203f10650afSjeremylt //------------------------------------------------------------------------------ 2041f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) { 2050436c2adSjeremylt int ierr; 2060436c2adSjeremylt CeedVector_Ref *impl; 2070436c2adSjeremylt Ceed ceed; 208e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 2090436c2adSjeremylt 2109c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray", 2119c774eddSJeremy L Thompson CeedVectorHasValidArray_Ref); CeedChkBackend(ierr); 2129c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType", 2139c774eddSJeremy L Thompson CeedVectorHasBorrowedArrayOfType_Ref); 2149c774eddSJeremy L Thompson CeedChkBackend(ierr); 2150436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 216e15f9bd0SJeremy L Thompson CeedVectorSetArray_Ref); CeedChkBackend(ierr); 2176a6c615bSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", 218e15f9bd0SJeremy L Thompson CeedVectorTakeArray_Ref); CeedChkBackend(ierr); 2190436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 220e15f9bd0SJeremy L Thompson CeedVectorGetArray_Ref); CeedChkBackend(ierr); 2210436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 222e15f9bd0SJeremy L Thompson CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr); 2239c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite", 2249c774eddSJeremy L Thompson CeedVectorGetArrayWrite_Ref); CeedChkBackend(ierr); 2250436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 226e15f9bd0SJeremy L Thompson CeedVectorRestoreArray_Ref); CeedChkBackend(ierr); 2270436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 228e15f9bd0SJeremy L Thompson CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr); 2290436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 230e15f9bd0SJeremy L Thompson CeedVectorDestroy_Ref); CeedChkBackend(ierr); 2319c774eddSJeremy L Thompson 232e15f9bd0SJeremy L Thompson ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); 233e15f9bd0SJeremy L Thompson ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr); 2349c774eddSJeremy L Thompson 235e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2360436c2adSjeremylt } 237f10650afSjeremylt //------------------------------------------------------------------------------ 238