1*0436c2adSjeremylt // Copyright (c) 2017-2018, Lawrence Livermore National Security, LLC. 2*0436c2adSjeremylt // Produced at the Lawrence Livermore National Laboratory. LLNL-CODE-734707. 3*0436c2adSjeremylt // All Rights reserved. See files LICENSE and NOTICE for details. 4*0436c2adSjeremylt // 5*0436c2adSjeremylt // This file is part of CEED, a collection of benchmarks, miniapps, software 6*0436c2adSjeremylt // libraries and APIs for efficient high-order finite element and spectral 7*0436c2adSjeremylt // element discretizations for exascale applications. For more information and 8*0436c2adSjeremylt // source code availability see http://github.com/ceed. 9*0436c2adSjeremylt // 10*0436c2adSjeremylt // The CEED research is supported by the Exascale Computing Project 17-SC-20-SC, 11*0436c2adSjeremylt // a collaborative effort of two U.S. Department of Energy organizations (Office 12*0436c2adSjeremylt // of Science and the National Nuclear Security Administration) responsible for 13*0436c2adSjeremylt // the planning and preparation of a capable exascale ecosystem, including 14*0436c2adSjeremylt // software, applications, hardware, advanced system engineering and early 15*0436c2adSjeremylt // testbed platforms, in support of the nation's exascale computing imperative. 16*0436c2adSjeremylt 17*0436c2adSjeremylt #include "ceed-ref.h" 18*0436c2adSjeremylt 19*0436c2adSjeremylt static int CeedVectorSetArray_Ref(CeedVector vec, CeedMemType mtype, 20*0436c2adSjeremylt CeedCopyMode cmode, CeedScalar *array) { 21*0436c2adSjeremylt int ierr; 22*0436c2adSjeremylt CeedVector_Ref *impl; 23*0436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 24*0436c2adSjeremylt CeedInt length; 25*0436c2adSjeremylt ierr = CeedVectorGetLength(vec, &length); CeedChk(ierr); 26*0436c2adSjeremylt Ceed ceed; 27*0436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 28*0436c2adSjeremylt 29*0436c2adSjeremylt if (mtype != CEED_MEM_HOST) 30*0436c2adSjeremylt // LCOV_EXCL_START 31*0436c2adSjeremylt return CeedError(ceed, 1, "Only MemType = HOST supported"); 32*0436c2adSjeremylt // LCOV_EXCL_STOP 33*0436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 34*0436c2adSjeremylt switch (cmode) { 35*0436c2adSjeremylt case CEED_COPY_VALUES: 36*0436c2adSjeremylt ierr = CeedMalloc(length, &impl->array_allocated); CeedChk(ierr); 37*0436c2adSjeremylt impl->array = impl->array_allocated; 38*0436c2adSjeremylt if (array) memcpy(impl->array, array, length * sizeof(array[0])); 39*0436c2adSjeremylt break; 40*0436c2adSjeremylt case CEED_OWN_POINTER: 41*0436c2adSjeremylt impl->array_allocated = array; 42*0436c2adSjeremylt impl->array = array; 43*0436c2adSjeremylt break; 44*0436c2adSjeremylt case CEED_USE_POINTER: 45*0436c2adSjeremylt impl->array = array; 46*0436c2adSjeremylt } 47*0436c2adSjeremylt return 0; 48*0436c2adSjeremylt } 49*0436c2adSjeremylt 50*0436c2adSjeremylt static int CeedVectorGetArray_Ref(CeedVector vec, CeedMemType mtype, 51*0436c2adSjeremylt CeedScalar **array) { 52*0436c2adSjeremylt int ierr; 53*0436c2adSjeremylt CeedVector_Ref *impl; 54*0436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 55*0436c2adSjeremylt Ceed ceed; 56*0436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 57*0436c2adSjeremylt 58*0436c2adSjeremylt if (mtype != CEED_MEM_HOST) 59*0436c2adSjeremylt // LCOV_EXCL_START 60*0436c2adSjeremylt return CeedError(ceed, 1, "Can only provide to HOST memory"); 61*0436c2adSjeremylt // LCOV_EXCL_STOP 62*0436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 63*0436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 64*0436c2adSjeremylt CeedChk(ierr); 65*0436c2adSjeremylt } 66*0436c2adSjeremylt *array = impl->array; 67*0436c2adSjeremylt return 0; 68*0436c2adSjeremylt } 69*0436c2adSjeremylt 70*0436c2adSjeremylt static int CeedVectorGetArrayRead_Ref(CeedVector vec, CeedMemType mtype, 71*0436c2adSjeremylt const CeedScalar **array) { 72*0436c2adSjeremylt int ierr; 73*0436c2adSjeremylt CeedVector_Ref *impl; 74*0436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 75*0436c2adSjeremylt Ceed ceed; 76*0436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 77*0436c2adSjeremylt 78*0436c2adSjeremylt if (mtype != CEED_MEM_HOST) 79*0436c2adSjeremylt // LCOV_EXCL_START 80*0436c2adSjeremylt return CeedError(ceed, 1, "Can only provide to HOST memory"); 81*0436c2adSjeremylt // LCOV_EXCL_STOP 82*0436c2adSjeremylt if (!impl->array) { // Allocate if array is not yet allocated 83*0436c2adSjeremylt ierr = CeedVectorSetArray(vec, CEED_MEM_HOST, CEED_COPY_VALUES, NULL); 84*0436c2adSjeremylt CeedChk(ierr); 85*0436c2adSjeremylt } 86*0436c2adSjeremylt *array = impl->array; 87*0436c2adSjeremylt return 0; 88*0436c2adSjeremylt } 89*0436c2adSjeremylt 90*0436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 91*0436c2adSjeremylt return 0; 92*0436c2adSjeremylt } 93*0436c2adSjeremylt 94*0436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 95*0436c2adSjeremylt return 0; 96*0436c2adSjeremylt } 97*0436c2adSjeremylt 98*0436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 99*0436c2adSjeremylt int ierr; 100*0436c2adSjeremylt CeedVector_Ref *impl; 101*0436c2adSjeremylt ierr = CeedVectorGetData(vec, (void *)&impl); CeedChk(ierr); 102*0436c2adSjeremylt 103*0436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 104*0436c2adSjeremylt ierr = CeedFree(&impl); CeedChk(ierr); 105*0436c2adSjeremylt return 0; 106*0436c2adSjeremylt } 107*0436c2adSjeremylt 108*0436c2adSjeremylt int CeedVectorCreate_Ref(CeedInt n, CeedVector vec) { 109*0436c2adSjeremylt int ierr; 110*0436c2adSjeremylt CeedVector_Ref *impl; 111*0436c2adSjeremylt Ceed ceed; 112*0436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 113*0436c2adSjeremylt 114*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 115*0436c2adSjeremylt CeedVectorSetArray_Ref); CeedChk(ierr); 116*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 117*0436c2adSjeremylt CeedVectorGetArray_Ref); CeedChk(ierr); 118*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 119*0436c2adSjeremylt CeedVectorGetArrayRead_Ref); CeedChk(ierr); 120*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 121*0436c2adSjeremylt CeedVectorRestoreArray_Ref); CeedChk(ierr); 122*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 123*0436c2adSjeremylt CeedVectorRestoreArrayRead_Ref); CeedChk(ierr); 124*0436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 125*0436c2adSjeremylt CeedVectorDestroy_Ref); CeedChk(ierr); 126*0436c2adSjeremylt ierr = CeedCalloc(1,&impl); CeedChk(ierr); 127*0436c2adSjeremylt ierr = CeedVectorSetData(vec, (void *)&impl); CeedChk(ierr); 128*0436c2adSjeremylt return 0; 129*0436c2adSjeremylt } 130