10436c2adSjeremylt // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC. 20436c2adSjeremylt // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707. 30436c2adSjeremylt // All Rights reserved. See files LICENSE and NOTICE for details. 40436c2adSjeremylt // 50436c2adSjeremylt // This file is part of CEED, a collection of benchmarks, miniapps, software 60436c2adSjeremylt // libraries and APIs for efficient high-order finite element and spectral 70436c2adSjeremylt // element discretizations for exascale applications. For more information and 80436c2adSjeremylt // source code availability see http://github.com/ceed. 90436c2adSjeremylt // 100436c2adSjeremylt // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 110436c2adSjeremylt // a collaborative effort of two U.S. Department of Energy organizations (Office 120436c2adSjeremylt // of Science and the National Nuclear Security Administration) responsible for 130436c2adSjeremylt // the planning and preparation of a capable exascale ecosystem, including 140436c2adSjeremylt // software, applications, hardware, advanced system engineering and early 150436c2adSjeremylt // testbed platforms, in support of the nation's exascale computing imperative. 160436c2adSjeremylt 17ec3da8bcSJed Brown #include <ceed/ceed.h> 18ec3da8bcSJed Brown #include <ceed/backend.h> 193d576824SJeremy L Thompson #include <string.h> 200436c2adSjeremylt #include "ceed-ref.h" 210436c2adSjeremylt 22f10650afSjeremylt //------------------------------------------------------------------------------ 239c774eddSJeremy L Thompson // Has Valid Array 249c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 259c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) { 269c774eddSJeremy L Thompson int ierr; 279c774eddSJeremy L Thompson CeedVector_Ref *impl; 289c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 299c774eddSJeremy L Thompson 309c774eddSJeremy L Thompson *has_valid_array = !!impl->array; 319c774eddSJeremy L Thompson 329c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 339c774eddSJeremy L Thompson } 349c774eddSJeremy L Thompson 359c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 369c774eddSJeremy L Thompson // Check if has borrowed array of given type 379c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 389c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec, 399c774eddSJeremy L Thompson CeedMemType mem_type, bool *has_borrowed_array_of_type) { 409c774eddSJeremy L Thompson int ierr; 419c774eddSJeremy L Thompson CeedVector_Ref *impl; 429c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 439c774eddSJeremy L Thompson Ceed ceed; 449c774eddSJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 459c774eddSJeremy L Thompson 469c774eddSJeremy L Thompson switch (mem_type) { 479c774eddSJeremy L Thompson case CEED_MEM_HOST: 489c774eddSJeremy L Thompson *has_borrowed_array_of_type = !!impl->array_borrowed; 499c774eddSJeremy L Thompson break; 509c774eddSJeremy L Thompson default: 519c774eddSJeremy L Thompson // LCOV_EXCL_START 529c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 539c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 549c774eddSJeremy L Thompson // LCOV_EXCL_STOP 559c774eddSJeremy L Thompson break; 569c774eddSJeremy L Thompson } 579c774eddSJeremy L Thompson 589c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 599c774eddSJeremy L Thompson } 609c774eddSJeremy L Thompson 619c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 62f10650afSjeremylt // Vector Set Array 63f10650afSjeremylt //------------------------------------------------------------------------------ 64d1d35e2fSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mem_type, 65d1d35e2fSjeremylt CeedCopyMode copy_mode, CeedScalar *array) { 660436c2adSjeremylt int ierr; 670436c2adSjeremylt CeedVector_Ref *impl; 68e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 69*1f9221feSJeremy L Thompson CeedSize length; 70e15f9bd0SJeremy L Thompson ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr); 710436c2adSjeremylt Ceed ceed; 72e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 730436c2adSjeremylt 74d1d35e2fSjeremylt if (mem_type != CEED_MEM_HOST) 750436c2adSjeremylt // LCOV_EXCL_START 769c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 779c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 780436c2adSjeremylt // LCOV_EXCL_STOP 799c774eddSJeremy L Thompson 80d1d35e2fSjeremylt switch (copy_mode) { 810436c2adSjeremylt case CEED_COPY_VALUES: 829c774eddSJeremy L Thompson if (!impl->array_owned) { 839c774eddSJeremy L Thompson ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr); 849c774eddSJeremy L Thompson } 859c774eddSJeremy L Thompson impl->array_borrowed = NULL; 869c774eddSJeremy L Thompson impl->array = impl->array_owned; 879c774eddSJeremy L Thompson if (array) 889c774eddSJeremy L Thompson memcpy(impl->array, array, length * sizeof(array[0])); 890436c2adSjeremylt break; 900436c2adSjeremylt case CEED_OWN_POINTER: 919c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 929c774eddSJeremy L Thompson impl->array_owned = array; 939c774eddSJeremy L Thompson impl->array_borrowed = NULL; 940436c2adSjeremylt impl->array = array; 950436c2adSjeremylt break; 960436c2adSjeremylt case CEED_USE_POINTER: 979c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 989c774eddSJeremy L Thompson impl->array_borrowed = array; 990436c2adSjeremylt impl->array = array; 1000436c2adSjeremylt } 101e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1020436c2adSjeremylt } 1030436c2adSjeremylt 104f10650afSjeremylt //------------------------------------------------------------------------------ 1056a6c615bSJeremy L Thompson // Vector Take Array 1066a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 107d1d35e2fSjeremylt static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mem_type, 1086a6c615bSJeremy L Thompson CeedScalar **array) { 1096a6c615bSJeremy L Thompson int ierr; 1106a6c615bSJeremy L Thompson CeedVector_Ref *impl; 111e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1126a6c615bSJeremy L Thompson Ceed ceed; 113e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1146a6c615bSJeremy L Thompson 1159c774eddSJeremy L Thompson (*array) = impl->array_borrowed; 1169c774eddSJeremy L Thompson impl->array_borrowed = NULL; 1176a6c615bSJeremy L Thompson impl->array = NULL; 1186a6c615bSJeremy L Thompson 119e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1206a6c615bSJeremy L Thompson } 1216a6c615bSJeremy L Thompson 1226a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 123f10650afSjeremylt // Vector Get Array 124f10650afSjeremylt //------------------------------------------------------------------------------ 1259c774eddSJeremy L Thompson static int CeedVectorGetArrayCore_Ref(CeedVector vec, CeedMemType mem_type, 1260436c2adSjeremylt CeedScalar **array) { 1270436c2adSjeremylt int ierr; 1280436c2adSjeremylt CeedVector_Ref *impl; 129e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1300436c2adSjeremylt Ceed ceed; 131e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1320436c2adSjeremylt 133d1d35e2fSjeremylt if (mem_type != CEED_MEM_HOST) 1340436c2adSjeremylt // LCOV_EXCL_START 1359c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 1369c774eddSJeremy L Thompson "Can only provide HOST memory for this backend"); 1370436c2adSjeremylt // LCOV_EXCL_STOP 1389c774eddSJeremy L Thompson 1390436c2adSjeremylt *array = impl->array; 1409c774eddSJeremy L Thompson 141e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1420436c2adSjeremylt } 1430436c2adSjeremylt 144f10650afSjeremylt //------------------------------------------------------------------------------ 145f10650afSjeremylt // Vector Get Array Read 146f10650afSjeremylt //------------------------------------------------------------------------------ 147d1d35e2fSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mem_type, 1480436c2adSjeremylt const CeedScalar **array) { 1499c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array); 1509c774eddSJeremy L Thompson } 1519c774eddSJeremy L Thompson 1529c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1539c774eddSJeremy L Thompson // Vector Get Array 1549c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1559c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type, 1569c774eddSJeremy L Thompson CeedScalar **array) { 1579c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, array); 1589c774eddSJeremy L Thompson } 1599c774eddSJeremy L Thompson 1609c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1619c774eddSJeremy L Thompson // Vector Get Array Write 1629c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 1639c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type, 1649c774eddSJeremy L Thompson const CeedScalar **array) { 1650436c2adSjeremylt int ierr; 1660436c2adSjeremylt CeedVector_Ref *impl; 167e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1680436c2adSjeremylt 1699c774eddSJeremy L Thompson if (!impl->array) { 1709c774eddSJeremy L Thompson if (!impl->array_owned && !impl->array_borrowed) { 1719c774eddSJeremy L Thompson // Allocate if array is not yet allocated 1720436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 173e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 1749c774eddSJeremy L Thompson } else { 1759c774eddSJeremy L Thompson // Select dirty array for GetArrayWrite 1769c774eddSJeremy L Thompson if (impl->array_borrowed) 1779c774eddSJeremy L Thompson impl->array = impl->array_borrowed; 1789c774eddSJeremy L Thompson else 1799c774eddSJeremy L Thompson impl->array = impl->array_owned; 1800436c2adSjeremylt } 1819c774eddSJeremy L Thompson } 1829c774eddSJeremy L Thompson 1839c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array); 1840436c2adSjeremylt } 1850436c2adSjeremylt 186f10650afSjeremylt //------------------------------------------------------------------------------ 187f10650afSjeremylt // Vector Restore Array 188f10650afSjeremylt //------------------------------------------------------------------------------ 1890436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 190e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1910436c2adSjeremylt } 1920436c2adSjeremylt 1930436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 194e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1950436c2adSjeremylt } 1960436c2adSjeremylt 197f10650afSjeremylt //------------------------------------------------------------------------------ 198f10650afSjeremylt // Vector Destroy 199f10650afSjeremylt //------------------------------------------------------------------------------ 2000436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 2010436c2adSjeremylt int ierr; 2020436c2adSjeremylt CeedVector_Ref *impl; 203e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 2040436c2adSjeremylt 2059c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 206e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl); CeedChkBackend(ierr); 207e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2080436c2adSjeremylt } 2090436c2adSjeremylt 210f10650afSjeremylt //------------------------------------------------------------------------------ 211f10650afSjeremylt // Vector Create 212f10650afSjeremylt //------------------------------------------------------------------------------ 213*1f9221feSJeremy L Thompson int CeedVectorCreate_Ref(CeedSize n, CeedVector vec) { 2140436c2adSjeremylt int ierr; 2150436c2adSjeremylt CeedVector_Ref *impl; 2160436c2adSjeremylt Ceed ceed; 217e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 2180436c2adSjeremylt 2199c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray", 2209c774eddSJeremy L Thompson CeedVectorHasValidArray_Ref); CeedChkBackend(ierr); 2219c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType", 2229c774eddSJeremy L Thompson CeedVectorHasBorrowedArrayOfType_Ref); 2239c774eddSJeremy L Thompson CeedChkBackend(ierr); 2240436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 225e15f9bd0SJeremy L Thompson CeedVectorSetArray_Ref); CeedChkBackend(ierr); 2266a6c615bSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", 227e15f9bd0SJeremy L Thompson CeedVectorTakeArray_Ref); CeedChkBackend(ierr); 2280436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 229e15f9bd0SJeremy L Thompson CeedVectorGetArray_Ref); CeedChkBackend(ierr); 2300436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 231e15f9bd0SJeremy L Thompson CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr); 2329c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite", 2339c774eddSJeremy L Thompson CeedVectorGetArrayWrite_Ref); CeedChkBackend(ierr); 2340436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 235e15f9bd0SJeremy L Thompson CeedVectorRestoreArray_Ref); CeedChkBackend(ierr); 2360436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 237e15f9bd0SJeremy L Thompson CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr); 2380436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 239e15f9bd0SJeremy L Thompson CeedVectorDestroy_Ref); CeedChkBackend(ierr); 2409c774eddSJeremy L Thompson 241e15f9bd0SJeremy L Thompson ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); 242e15f9bd0SJeremy L Thompson ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr); 2439c774eddSJeremy L Thompson 244e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2450436c2adSjeremylt } 246f10650afSjeremylt //------------------------------------------------------------------------------ 247