xref: /libCEED/backends/ref/ceed-ref-vector.c (revision 6a6c615b31508fbb9571bc7a279f860841ca2097)
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