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 173d576824SJeremy L Thompson #include <ceed.h> 183d576824SJeremy L Thompson #include <ceed-backend.h> 193d576824SJeremy L Thompson #include <string.h> 200436c2adSjeremylt #include "ceed-ref.h" 210436c2adSjeremylt 22f10650afSjeremylt //------------------------------------------------------------------------------ 23f10650afSjeremylt // Vector Set Array 24f10650afSjeremylt //------------------------------------------------------------------------------ 250436c2adSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mtype, 260436c2adSjeremylt CeedCopyMode cmode, CeedScalar *array) { 270436c2adSjeremylt int ierr; 280436c2adSjeremylt CeedVector_Ref *impl; 29*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 300436c2adSjeremylt CeedInt length; 31*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr); 320436c2adSjeremylt Ceed ceed; 33*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 340436c2adSjeremylt 350436c2adSjeremylt if (mtype != CEED_MEM_HOST) 360436c2adSjeremylt // LCOV_EXCL_START 37*e15f9bd0SJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, "Only MemType = HOST supported"); 380436c2adSjeremylt // LCOV_EXCL_STOP 39*e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl->array_allocated); CeedChkBackend(ierr); 400436c2adSjeremylt switch (cmode) { 410436c2adSjeremylt case CEED_COPY_VALUES: 42*e15f9bd0SJeremy L Thompson ierr = CeedMalloc(length, &impl->array_allocated); CeedChkBackend(ierr); 430436c2adSjeremylt impl->array = impl->array_allocated; 440436c2adSjeremylt if (array) memcpy(impl->array, array, length * sizeof(array[0])); 450436c2adSjeremylt break; 460436c2adSjeremylt case CEED_OWN_POINTER: 470436c2adSjeremylt impl->array_allocated = array; 480436c2adSjeremylt impl->array = array; 490436c2adSjeremylt break; 500436c2adSjeremylt case CEED_USE_POINTER: 510436c2adSjeremylt impl->array = array; 520436c2adSjeremylt } 53*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 540436c2adSjeremylt } 550436c2adSjeremylt 56f10650afSjeremylt //------------------------------------------------------------------------------ 576a6c615bSJeremy L Thompson // Vector Take Array 586a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 596a6c615bSJeremy L Thompson static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mtype, 606a6c615bSJeremy L Thompson CeedScalar **array) { 616a6c615bSJeremy L Thompson int ierr; 626a6c615bSJeremy L Thompson CeedVector_Ref *impl; 63*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 646a6c615bSJeremy L Thompson Ceed ceed; 65*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 666a6c615bSJeremy L Thompson 676a6c615bSJeremy L Thompson if (mtype != CEED_MEM_HOST) 686a6c615bSJeremy L Thompson // LCOV_EXCL_START 69*e15f9bd0SJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, "Only MemType = HOST supported"); 706a6c615bSJeremy L Thompson // LCOV_EXCL_STOP 716a6c615bSJeremy L Thompson 726a6c615bSJeremy L Thompson (*array) = impl->array; 736a6c615bSJeremy L Thompson impl->array = NULL; 746a6c615bSJeremy L Thompson impl->array_allocated = NULL; 756a6c615bSJeremy L Thompson 76*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 776a6c615bSJeremy L Thompson } 786a6c615bSJeremy L Thompson 796a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 80f10650afSjeremylt // Vector Get Array 81f10650afSjeremylt //------------------------------------------------------------------------------ 820436c2adSjeremylt static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mtype, 830436c2adSjeremylt CeedScalar **array) { 840436c2adSjeremylt int ierr; 850436c2adSjeremylt CeedVector_Ref *impl; 86*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 870436c2adSjeremylt Ceed ceed; 88*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 890436c2adSjeremylt 900436c2adSjeremylt if (mtype != CEED_MEM_HOST) 910436c2adSjeremylt // LCOV_EXCL_START 92*e15f9bd0SJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, "Can only provide to HOST memory"); 930436c2adSjeremylt // LCOV_EXCL_STOP 940436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 950436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 96*e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 970436c2adSjeremylt } 980436c2adSjeremylt *array = impl->array; 99*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1000436c2adSjeremylt } 1010436c2adSjeremylt 102f10650afSjeremylt //------------------------------------------------------------------------------ 103f10650afSjeremylt // Vector Get Array Read 104f10650afSjeremylt //------------------------------------------------------------------------------ 1050436c2adSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mtype, 1060436c2adSjeremylt const CeedScalar **array) { 1070436c2adSjeremylt int ierr; 1080436c2adSjeremylt CeedVector_Ref *impl; 109*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1100436c2adSjeremylt Ceed ceed; 111*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1120436c2adSjeremylt 1130436c2adSjeremylt if (mtype != CEED_MEM_HOST) 1140436c2adSjeremylt // LCOV_EXCL_START 115*e15f9bd0SJeremy L Thompson return CeedError(ceed, CEED_ERROR_BACKEND, "Can only provide to HOST memory"); 1160436c2adSjeremylt // LCOV_EXCL_STOP 1170436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 1180436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 119*e15f9bd0SJeremy L Thompson CeedChkBackend(ierr); 1200436c2adSjeremylt } 1210436c2adSjeremylt *array = impl->array; 122*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1230436c2adSjeremylt } 1240436c2adSjeremylt 125f10650afSjeremylt //------------------------------------------------------------------------------ 126f10650afSjeremylt // Vector Restore Array 127f10650afSjeremylt //------------------------------------------------------------------------------ 1280436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 129*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1300436c2adSjeremylt } 1310436c2adSjeremylt 1320436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 133*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1340436c2adSjeremylt } 1350436c2adSjeremylt 136f10650afSjeremylt //------------------------------------------------------------------------------ 137f10650afSjeremylt // Vector Destroy 138f10650afSjeremylt //------------------------------------------------------------------------------ 1390436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 1400436c2adSjeremylt int ierr; 1410436c2adSjeremylt CeedVector_Ref *impl; 142*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr); 1430436c2adSjeremylt 144*e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl->array_allocated); CeedChkBackend(ierr); 145*e15f9bd0SJeremy L Thompson ierr = CeedFree(&impl); CeedChkBackend(ierr); 146*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1470436c2adSjeremylt } 1480436c2adSjeremylt 149f10650afSjeremylt //------------------------------------------------------------------------------ 150f10650afSjeremylt // Vector Create 151f10650afSjeremylt //------------------------------------------------------------------------------ 1520436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) { 1530436c2adSjeremylt int ierr; 1540436c2adSjeremylt CeedVector_Ref *impl; 1550436c2adSjeremylt Ceed ceed; 156*e15f9bd0SJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr); 1570436c2adSjeremylt 1580436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 159*e15f9bd0SJeremy L Thompson CeedVectorSetArray_Ref); CeedChkBackend(ierr); 1606a6c615bSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", 161*e15f9bd0SJeremy L Thompson CeedVectorTakeArray_Ref); CeedChkBackend(ierr); 1620436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 163*e15f9bd0SJeremy L Thompson CeedVectorGetArray_Ref); CeedChkBackend(ierr); 1640436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 165*e15f9bd0SJeremy L Thompson CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr); 1660436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 167*e15f9bd0SJeremy L Thompson CeedVectorRestoreArray_Ref); CeedChkBackend(ierr); 1680436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 169*e15f9bd0SJeremy L Thompson CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr); 1700436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 171*e15f9bd0SJeremy L Thompson CeedVectorDestroy_Ref); CeedChkBackend(ierr); 172*e15f9bd0SJeremy L Thompson ierr = CeedCalloc(1,&impl); CeedChkBackend(ierr); 173*e15f9bd0SJeremy L Thompson ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr); 174*e15f9bd0SJeremy L Thompson return CEED_ERROR_SUCCESS; 1750436c2adSjeremylt } 176f10650afSjeremylt //------------------------------------------------------------------------------ 177