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 19*f10650afSjeremylt //------------------------------------------------------------------------------ 20*f10650afSjeremylt // Vector Set Array 21*f10650afSjeremylt //------------------------------------------------------------------------------ 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 53*f10650afSjeremylt //------------------------------------------------------------------------------ 54*f10650afSjeremylt // Vector Get Array 55*f10650afSjeremylt //------------------------------------------------------------------------------ 560436c2adSjeremylt static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mtype, 570436c2adSjeremylt CeedScalar **array) { 580436c2adSjeremylt int ierr; 590436c2adSjeremylt CeedVector_Ref *impl; 600436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 610436c2adSjeremylt Ceed ceed; 620436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 630436c2adSjeremylt 640436c2adSjeremylt if (mtype != CEED_MEM_HOST) 650436c2adSjeremylt // LCOV_EXCL_START 660436c2adSjeremylt return CeedError(ceed, 1, "Can only provide to HOST memory"); 670436c2adSjeremylt // LCOV_EXCL_STOP 680436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 690436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 700436c2adSjeremylt CeedChk(ierr); 710436c2adSjeremylt } 720436c2adSjeremylt *array = impl->array; 730436c2adSjeremylt return 0; 740436c2adSjeremylt } 750436c2adSjeremylt 76*f10650afSjeremylt //------------------------------------------------------------------------------ 77*f10650afSjeremylt // Vector Get Array Read 78*f10650afSjeremylt //------------------------------------------------------------------------------ 790436c2adSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mtype, 800436c2adSjeremylt const 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 99*f10650afSjeremylt //------------------------------------------------------------------------------ 100*f10650afSjeremylt // Vector Restore Array 101*f10650afSjeremylt //------------------------------------------------------------------------------ 1020436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 1030436c2adSjeremylt return 0; 1040436c2adSjeremylt } 1050436c2adSjeremylt 1060436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 1070436c2adSjeremylt return 0; 1080436c2adSjeremylt } 1090436c2adSjeremylt 110*f10650afSjeremylt //------------------------------------------------------------------------------ 111*f10650afSjeremylt // Vector Destroy 112*f10650afSjeremylt //------------------------------------------------------------------------------ 1130436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 1140436c2adSjeremylt int ierr; 1150436c2adSjeremylt CeedVector_Ref *impl; 1160436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 1170436c2adSjeremylt 1180436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 1190436c2adSjeremylt ierr = CeedFree(&impl); CeedChk(ierr); 1200436c2adSjeremylt return 0; 1210436c2adSjeremylt } 1220436c2adSjeremylt 123*f10650afSjeremylt //------------------------------------------------------------------------------ 124*f10650afSjeremylt // Vector Create 125*f10650afSjeremylt //------------------------------------------------------------------------------ 1260436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) { 1270436c2adSjeremylt int ierr; 1280436c2adSjeremylt CeedVector_Ref *impl; 1290436c2adSjeremylt Ceed ceed; 1300436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 1310436c2adSjeremylt 1320436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 1330436c2adSjeremylt CeedVectorSetArray_Ref); CeedChk(ierr); 1340436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 1350436c2adSjeremylt CeedVectorGetArray_Ref); CeedChk(ierr); 1360436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 1370436c2adSjeremylt CeedVectorGetArrayRead_Ref); CeedChk(ierr); 1380436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 1390436c2adSjeremylt CeedVectorRestoreArray_Ref); CeedChk(ierr); 1400436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 1410436c2adSjeremylt CeedVectorRestoreArrayRead_Ref); CeedChk(ierr); 1420436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 1430436c2adSjeremylt CeedVectorDestroy_Ref); CeedChk(ierr); 1440436c2adSjeremylt ierr = CeedCalloc(1,&impl); CeedChk(ierr); 1450436c2adSjeremylt ierr = CeedVectorSetData(vec, (void *)&impl); CeedChk(ierr); 1460436c2adSjeremylt return 0; 1470436c2adSjeremylt } 148*f10650afSjeremylt //------------------------------------------------------------------------------ 149