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 17*3d576824SJeremy L Thompson #include <ceed.h> 18*3d576824SJeremy L Thompson #include <ceed-backend.h> 19*3d576824SJeremy 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; 29777ff853SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChk(ierr); 300436c2adSjeremylt CeedInt length; 310436c2adSjeremylt ierr = CeedVectorGetLength(vec, &length); CeedChk(ierr); 320436c2adSjeremylt Ceed ceed; 330436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 340436c2adSjeremylt 350436c2adSjeremylt if (mtype != CEED_MEM_HOST) 360436c2adSjeremylt // LCOV_EXCL_START 370436c2adSjeremylt return CeedError(ceed, 1, "Only MemType = HOST supported"); 380436c2adSjeremylt // LCOV_EXCL_STOP 390436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 400436c2adSjeremylt switch (cmode) { 410436c2adSjeremylt case CEED_COPY_VALUES: 420436c2adSjeremylt ierr = CeedMalloc(length, &impl->array_allocated); CeedChk(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 } 530436c2adSjeremylt return 0; 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; 63777ff853SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChk(ierr); 646a6c615bSJeremy L Thompson Ceed ceed; 656a6c615bSJeremy L Thompson ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 666a6c615bSJeremy L Thompson 676a6c615bSJeremy L Thompson if (mtype != CEED_MEM_HOST) 686a6c615bSJeremy L Thompson // LCOV_EXCL_START 696a6c615bSJeremy L Thompson return CeedError(ceed, 1, "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 766a6c615bSJeremy L Thompson return 0; 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; 86777ff853SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChk(ierr); 870436c2adSjeremylt Ceed ceed; 880436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 890436c2adSjeremylt 900436c2adSjeremylt if (mtype != CEED_MEM_HOST) 910436c2adSjeremylt // LCOV_EXCL_START 920436c2adSjeremylt return CeedError(ceed, 1, "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); 960436c2adSjeremylt CeedChk(ierr); 970436c2adSjeremylt } 980436c2adSjeremylt *array = impl->array; 990436c2adSjeremylt return 0; 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; 109777ff853SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChk(ierr); 1100436c2adSjeremylt Ceed ceed; 1110436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 1120436c2adSjeremylt 1130436c2adSjeremylt if (mtype != CEED_MEM_HOST) 1140436c2adSjeremylt // LCOV_EXCL_START 1150436c2adSjeremylt return CeedError(ceed, 1, "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); 1190436c2adSjeremylt CeedChk(ierr); 1200436c2adSjeremylt } 1210436c2adSjeremylt *array = impl->array; 1220436c2adSjeremylt return 0; 1230436c2adSjeremylt } 1240436c2adSjeremylt 125f10650afSjeremylt //------------------------------------------------------------------------------ 126f10650afSjeremylt // Vector Restore Array 127f10650afSjeremylt //------------------------------------------------------------------------------ 1280436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) { 1290436c2adSjeremylt return 0; 1300436c2adSjeremylt } 1310436c2adSjeremylt 1320436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) { 1330436c2adSjeremylt return 0; 1340436c2adSjeremylt } 1350436c2adSjeremylt 136f10650afSjeremylt //------------------------------------------------------------------------------ 137f10650afSjeremylt // Vector Destroy 138f10650afSjeremylt //------------------------------------------------------------------------------ 1390436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) { 1400436c2adSjeremylt int ierr; 1410436c2adSjeremylt CeedVector_Ref *impl; 142777ff853SJeremy L Thompson ierr = CeedVectorGetData(vec, &impl); CeedChk(ierr); 1430436c2adSjeremylt 1440436c2adSjeremylt ierr = CeedFree(&impl->array_allocated); CeedChk(ierr); 1450436c2adSjeremylt ierr = CeedFree(&impl); CeedChk(ierr); 1460436c2adSjeremylt return 0; 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; 1560436c2adSjeremylt ierr = CeedVectorGetCeed(vec, &ceed); CeedChk(ierr); 1570436c2adSjeremylt 1580436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray", 1590436c2adSjeremylt CeedVectorSetArray_Ref); CeedChk(ierr); 1606a6c615bSJeremy L Thompson ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray", 1616a6c615bSJeremy L Thompson CeedVectorTakeArray_Ref); CeedChk(ierr); 1620436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray", 1630436c2adSjeremylt CeedVectorGetArray_Ref); CeedChk(ierr); 1640436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead", 1650436c2adSjeremylt CeedVectorGetArrayRead_Ref); CeedChk(ierr); 1660436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray", 1670436c2adSjeremylt CeedVectorRestoreArray_Ref); CeedChk(ierr); 1680436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead", 1690436c2adSjeremylt CeedVectorRestoreArrayRead_Ref); CeedChk(ierr); 1700436c2adSjeremylt ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy", 1710436c2adSjeremylt CeedVectorDestroy_Ref); CeedChk(ierr); 1720436c2adSjeremylt ierr = CeedCalloc(1,&impl); CeedChk(ierr); 173777ff853SJeremy L Thompson ierr = CeedVectorSetData(vec, impl); CeedChk(ierr); 1740436c2adSjeremylt return 0; 1750436c2adSjeremylt } 176f10650afSjeremylt //------------------------------------------------------------------------------ 177