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