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 170436c2adSjeremylt #include "ceed-ref.h" 180436c2adSjeremylt 19f10650afSjeremylt //------------------------------------------------------------------------------ 20f10650afSjeremylt // Vector Set Array 21f10650afSjeremylt //------------------------------------------------------------------------------ 220436c2adSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mtype, 230436c2adSjeremylt CeedCopyMode cmode, CeedScalar *array) { 240436c2adSjeremylt int ierr; 250436c2adSjeremylt CeedVector_Ref *impl; 260436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 270436c2adSjeremylt CeedInt length; 280436c2adSjeremylt ierr = CeedVectorGetLength(vec, &length); CeedChk(ierr); 290436c2adSjeremylt Ceed ceed; 300436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 310436c2adSjeremylt 320436c2adSjeremylt if (mtype != CEED_MEM_HOST) 330436c2adSjeremylt // LCOV_EXCL_START 340436c2adSjeremylt return CeedError(ceed, 1, "Only MemType = HOST supported"); 350436c2adSjeremylt // LCOV_EXCL_STOP 360436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 370436c2adSjeremylt switch (cmode) { 380436c2adSjeremylt case CEED_COPY_VALUES: 390436c2adSjeremylt ierr = CeedMalloc(length, &impl->array_allocated); CeedChk(ierr); 400436c2adSjeremylt impl->array = impl->array_allocated; 410436c2adSjeremylt if (array) memcpy(impl->array, array, length * sizeof(array[0])); 420436c2adSjeremylt break; 430436c2adSjeremylt case CEED_OWN_POINTER: 440436c2adSjeremylt impl->array_allocated = array; 450436c2adSjeremylt impl->array = array; 460436c2adSjeremylt break; 470436c2adSjeremylt case CEED_USE_POINTER: 480436c2adSjeremylt impl->array = array; 490436c2adSjeremylt } 500436c2adSjeremylt return 0; 510436c2adSjeremylt } 520436c2adSjeremylt 53f10650afSjeremylt //------------------------------------------------------------------------------ 54*6a6c615bSJeremy L Thompson // Vector Take Array 55*6a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 56*6a6c615bSJeremy L Thompson static int CeedVectorTakeArray_Ref(CeedVector vec, CeedMemType mtype, 57*6a6c615bSJeremy L Thompson CeedScalar **array) { 58*6a6c615bSJeremy L Thompson int ierr; 59*6a6c615bSJeremy L Thompson CeedVector_Ref *impl; 60*6a6c615bSJeremy L Thompson ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 61*6a6c615bSJeremy L Thompson Ceed ceed; 62*6a6c615bSJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 63*6a6c615bSJeremy L Thompson 64*6a6c615bSJeremy L Thompson if (mtype != CEED_MEM_HOST) 65*6a6c615bSJeremy L Thompson // LCOV_EXCL_START 66*6a6c615bSJeremy L Thompson return CeedError(ceed, 1, "Only MemType = HOST supported"); 67*6a6c615bSJeremy L Thompson // LCOV_EXCL_STOP 68*6a6c615bSJeremy L Thompson 69*6a6c615bSJeremy L Thompson (*array) = impl->array; 70*6a6c615bSJeremy L Thompson impl->array = NULL; 71*6a6c615bSJeremy L Thompson impl->array_allocated = NULL; 72*6a6c615bSJeremy L Thompson 73*6a6c615bSJeremy L Thompson return 0; 74*6a6c615bSJeremy L Thompson } 75*6a6c615bSJeremy L Thompson 76*6a6c615bSJeremy L Thompson //------------------------------------------------------------------------------ 77f10650afSjeremylt // Vector Get Array 78f10650afSjeremylt //------------------------------------------------------------------------------ 790436c2adSjeremylt static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mtype, 800436c2adSjeremylt CeedScalar **array) { 810436c2adSjeremylt int ierr; 820436c2adSjeremylt CeedVector_Ref *impl; 830436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 840436c2adSjeremylt Ceed ceed; 850436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 860436c2adSjeremylt 870436c2adSjeremylt if (mtype != CEED_MEM_HOST) 880436c2adSjeremylt // LCOV_EXCL_START 890436c2adSjeremylt return CeedError(ceed, 1, "Can only provide to HOST memory"); 900436c2adSjeremylt // LCOV_EXCL_STOP 910436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 920436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 930436c2adSjeremylt CeedChk(ierr); 940436c2adSjeremylt } 950436c2adSjeremylt *array = impl->array; 960436c2adSjeremylt return 0; 970436c2adSjeremylt } 980436c2adSjeremylt 99f10650afSjeremylt //------------------------------------------------------------------------------ 100f10650afSjeremylt // Vector Get Array Read 101f10650afSjeremylt //------------------------------------------------------------------------------ 1020436c2adSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mtype, 1030436c2adSjeremylt const CeedScalar **array) { 1040436c2adSjeremylt int ierr; 1050436c2adSjeremylt CeedVector_Ref *impl; 1060436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 1070436c2adSjeremylt Ceed ceed; 1080436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 1090436c2adSjeremylt 1100436c2adSjeremylt if (mtype != CEED_MEM_HOST) 1110436c2adSjeremylt // LCOV_EXCL_START 1120436c2adSjeremylt return CeedError(ceed, 1, "Can only provide to HOST memory"); 1130436c2adSjeremylt // LCOV_EXCL_STOP 1140436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 1150436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 1160436c2adSjeremylt CeedChk(ierr); 1170436c2adSjeremylt } 1180436c2adSjeremylt *array = impl->array; 1190436c2adSjeremylt return 0; 1200436c2adSjeremylt } 1210436c2adSjeremylt 122f10650afSjeremylt //------------------------------------------------------------------------------ 123f10650afSjeremylt // Vector Restore Array 124f10650afSjeremylt //------------------------------------------------------------------------------ 1250436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 1260436c2adSjeremylt return 0; 1270436c2adSjeremylt } 1280436c2adSjeremylt 1290436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 1300436c2adSjeremylt return 0; 1310436c2adSjeremylt } 1320436c2adSjeremylt 133f10650afSjeremylt //------------------------------------------------------------------------------ 134f10650afSjeremylt // Vector Destroy 135f10650afSjeremylt //------------------------------------------------------------------------------ 1360436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 1370436c2adSjeremylt int ierr; 1380436c2adSjeremylt CeedVector_Ref *impl; 1390436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 1400436c2adSjeremylt 1410436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 1420436c2adSjeremylt ierr = CeedFree(&impl); CeedChk(ierr); 1430436c2adSjeremylt return 0; 1440436c2adSjeremylt } 1450436c2adSjeremylt 146f10650afSjeremylt //------------------------------------------------------------------------------ 147f10650afSjeremylt // Vector Create 148f10650afSjeremylt //------------------------------------------------------------------------------ 1490436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) { 1500436c2adSjeremylt int ierr; 1510436c2adSjeremylt CeedVector_Ref *impl; 1520436c2adSjeremylt Ceed ceed; 1530436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 1540436c2adSjeremylt 1550436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 1560436c2adSjeremylt CeedVectorSetArray_Ref); CeedChk(ierr); 157*6a6c615bSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", 158*6a6c615bSJeremy L Thompson CeedVectorTakeArray_Ref); CeedChk(ierr); 1590436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 1600436c2adSjeremylt CeedVectorGetArray_Ref); CeedChk(ierr); 1610436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 1620436c2adSjeremylt CeedVectorGetArrayRead_Ref); CeedChk(ierr); 1630436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 1640436c2adSjeremylt CeedVectorRestoreArray_Ref); CeedChk(ierr); 1650436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 1660436c2adSjeremylt CeedVectorRestoreArrayRead_Ref); CeedChk(ierr); 1670436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 1680436c2adSjeremylt CeedVectorDestroy_Ref); CeedChk(ierr); 1690436c2adSjeremylt ierr = CeedCalloc(1,&impl); CeedChk(ierr); 1700436c2adSjeremylt ierr = CeedVectorSetData(vec, (void *)&impl); CeedChk(ierr); 1710436c2adSjeremylt return 0; 1720436c2adSjeremylt } 173f10650afSjeremylt //------------------------------------------------------------------------------ 174