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 //------------------------------------------------------------------------------ 23*9c774eddSJeremy L Thompson // Has Valid Array 24*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 25*9c774eddSJeremy L Thompson static int CeedVectorHasValidArray_Ref(CeedVector vec, bool *has_valid_array) { 26*9c774eddSJeremy L Thompson int ierr; 27*9c774eddSJeremy L Thompson CeedVector_Ref *impl; 28*9c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 29*9c774eddSJeremy L Thompson 30*9c774eddSJeremy L Thompson *has_valid_array = !!impl->array; 31*9c774eddSJeremy L Thompson 32*9c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 33*9c774eddSJeremy L Thompson } 34*9c774eddSJeremy L Thompson 35*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 36*9c774eddSJeremy L Thompson // Check if has borrowed array of given type 37*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 38*9c774eddSJeremy L Thompson static inline int CeedVectorHasBorrowedArrayOfType_Ref(const CeedVector vec, 39*9c774eddSJeremy L Thompson CeedMemType mem_type, bool *has_borrowed_array_of_type) { 40*9c774eddSJeremy L Thompson int ierr; 41*9c774eddSJeremy L Thompson CeedVector_Ref *impl; 42*9c774eddSJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 43*9c774eddSJeremy L Thompson Ceed ceed; 44*9c774eddSJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 45*9c774eddSJeremy L Thompson 46*9c774eddSJeremy L Thompson switch (mem_type) { 47*9c774eddSJeremy L Thompson case CEED_MEM_HOST: 48*9c774eddSJeremy L Thompson *has_borrowed_array_of_type = !!impl->array_borrowed; 49*9c774eddSJeremy L Thompson break; 50*9c774eddSJeremy L Thompson default: 51*9c774eddSJeremy L Thompson // LCOV_EXCL_START 52*9c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 53*9c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 54*9c774eddSJeremy L Thompson // LCOV_EXCL_STOP 55*9c774eddSJeremy L Thompson break; 56*9c774eddSJeremy L Thompson } 57*9c774eddSJeremy L Thompson 58*9c774eddSJeremy L Thompson return CEED_ERROR_SUCCESS; 59*9c774eddSJeremy L Thompson } 60*9c774eddSJeremy L Thompson 61*9c774eddSJeremy 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); 690436c2adSjeremylt CeedInt 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 76*9c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 77*9c774eddSJeremy L Thompson "Can only set HOST memory for this backend"); 780436c2adSjeremylt // LCOV_EXCL_STOP 79*9c774eddSJeremy L Thompson 80d1d35e2fSjeremylt switch (copy_mode) { 810436c2adSjeremylt case CEED_COPY_VALUES: 82*9c774eddSJeremy L Thompson if (!impl->array_owned) { 83*9c774eddSJeremy L Thompson ierr = CeedCalloc(length, &impl->array_owned); CeedChkBackend(ierr); 84*9c774eddSJeremy L Thompson } 85*9c774eddSJeremy L Thompson impl->array_borrowed = NULL; 86*9c774eddSJeremy L Thompson impl->array = impl->array_owned; 87*9c774eddSJeremy L Thompson if (array) 88*9c774eddSJeremy L Thompson memcpy(impl->array, array, length * sizeof(array[0])); 890436c2adSjeremylt break; 900436c2adSjeremylt case CEED_OWN_POINTER: 91*9c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 92*9c774eddSJeremy L Thompson impl->array_owned = array; 93*9c774eddSJeremy L Thompson impl->array_borrowed = NULL; 940436c2adSjeremylt impl->array = array; 950436c2adSjeremylt break; 960436c2adSjeremylt case CEED_USE_POINTER: 97*9c774eddSJeremy L Thompson ierr = CeedFree(&impl->array_owned); CeedChkBackend(ierr); 98*9c774eddSJeremy 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 115*9c774eddSJeremy L Thompson (*array) = impl->array_borrowed; 116*9c774eddSJeremy 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 //------------------------------------------------------------------------------ 125*9c774eddSJeremy 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 135*9c774eddSJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, 136*9c774eddSJeremy L Thompson "Can only provide HOST memory for this backend"); 1370436c2adSjeremylt // LCOV_EXCL_STOP 138*9c774eddSJeremy L Thompson 1390436c2adSjeremylt *array = impl->array; 140*9c774eddSJeremy 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) { 149*9c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, (CeedScalar **)array); 150*9c774eddSJeremy L Thompson } 151*9c774eddSJeremy L Thompson 152*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 153*9c774eddSJeremy L Thompson // Vector Get Array 154*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 155*9c774eddSJeremy L Thompson static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mem_type, 156*9c774eddSJeremy L Thompson CeedScalar **array) { 157*9c774eddSJeremy L Thompson return CeedVectorGetArrayCore_Ref(vec, mem_type, array); 158*9c774eddSJeremy L Thompson } 159*9c774eddSJeremy L Thompson 160*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 161*9c774eddSJeremy L Thompson // Vector Get Array Write 162*9c774eddSJeremy L Thompson //------------------------------------------------------------------------------ 163*9c774eddSJeremy L Thompson static int CeedVectorGetArrayWrite_Ref(CeedVector vec, CeedMemType mem_type, 164*9c774eddSJeremy L Thompson const CeedScalar **array) { 1650436c2adSjeremylt int ierr; 1660436c2adSjeremylt CeedVector_Ref *impl; 167e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1680436c2adSjeremylt 169*9c774eddSJeremy L Thompson if (!impl->array) { 170*9c774eddSJeremy L Thompson if (!impl->array_owned && !impl->array_borrowed) { 171*9c774eddSJeremy 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); 174*9c774eddSJeremy L Thompson } else { 175*9c774eddSJeremy L Thompson // Select dirty array for GetArrayWrite 176*9c774eddSJeremy L Thompson if (impl->array_borrowed) 177*9c774eddSJeremy L Thompson impl->array = impl->array_borrowed; 178*9c774eddSJeremy L Thompson else 179*9c774eddSJeremy L Thompson impl->array = impl->array_owned; 1800436c2adSjeremylt } 181*9c774eddSJeremy L Thompson } 182*9c774eddSJeremy L Thompson 183*9c774eddSJeremy 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 205*9c774eddSJeremy 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 //------------------------------------------------------------------------------ 2130436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) { 2140436c2adSjeremylt int ierr; 2150436c2adSjeremylt CeedVector_Ref *impl; 2160436c2adSjeremylt Ceed ceed; 217e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 2180436c2adSjeremylt 219*9c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasValidArray", 220*9c774eddSJeremy L Thompson CeedVectorHasValidArray_Ref); CeedChkBackend(ierr); 221*9c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "HasBorrowedArrayOfType", 222*9c774eddSJeremy L Thompson CeedVectorHasBorrowedArrayOfType_Ref); 223*9c774eddSJeremy 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); 232*9c774eddSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayWrite", 233*9c774eddSJeremy 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); 240*9c774eddSJeremy L Thompson 241e15f9bd0SJeremy L Thompson ierr = CeedCalloc(1, &impl); CeedChkBackend(ierr); 242e15f9bd0SJeremy L Thompson ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr); 243*9c774eddSJeremy L Thompson 244e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 2450436c2adSjeremylt } 246f10650afSjeremylt //------------------------------------------------------------------------------ 247