xref: /libCEED/backends/ref/ceed-ref-vector.c (revision ec3da8bcb94d9f0073544b37b5081a06981a86f7)
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*ec3da8bcSJed Brown #include <ceed/ceed.h>
18*ec3da8bcSJed Brown #include <ceed/backend.h>
193d576824SJeremy 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;
29e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
300436c2adSjeremylt   CeedInt length;
31e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetLength(vec, &length); CeedChkBackend(ierr);
320436c2adSjeremylt   Ceed ceed;
33e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
340436c2adSjeremylt 
350436c2adSjeremylt   if (mtype != CEED_MEM_HOST)
360436c2adSjeremylt     // LCOV_EXCL_START
37e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "Only MemType = HOST supported");
380436c2adSjeremylt   // LCOV_EXCL_STOP
39e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl->array_allocated); CeedChkBackend(ierr);
400436c2adSjeremylt   switch (cmode) {
410436c2adSjeremylt   case CEED_COPY_VALUES:
42e15f9bd0SJeremy L Thompson     ierr = CeedMalloc(length, &impl->array_allocated); CeedChkBackend(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   }
53e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
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;
63e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
646a6c615bSJeremy L Thompson   Ceed ceed;
65e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
666a6c615bSJeremy L Thompson 
676a6c615bSJeremy L Thompson   if (mtype != CEED_MEM_HOST)
686a6c615bSJeremy L Thompson     // LCOV_EXCL_START
69e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "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 
76e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
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;
86e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
870436c2adSjeremylt   Ceed ceed;
88e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
890436c2adSjeremylt 
900436c2adSjeremylt   if (mtype != CEED_MEM_HOST)
910436c2adSjeremylt     // LCOV_EXCL_START
92e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "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);
96e15f9bd0SJeremy L Thompson     CeedChkBackend(ierr);
970436c2adSjeremylt   }
980436c2adSjeremylt   *array = impl->array;
99e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
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;
109e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1100436c2adSjeremylt   Ceed ceed;
111e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1120436c2adSjeremylt 
1130436c2adSjeremylt   if (mtype != CEED_MEM_HOST)
1140436c2adSjeremylt     // LCOV_EXCL_START
115e15f9bd0SJeremy L Thompson     return CeedError(ceed, CEED_ERROR_BACKEND, "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);
119e15f9bd0SJeremy L Thompson     CeedChkBackend(ierr);
1200436c2adSjeremylt   }
1210436c2adSjeremylt   *array = impl->array;
122e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1230436c2adSjeremylt }
1240436c2adSjeremylt 
125f10650afSjeremylt //------------------------------------------------------------------------------
126f10650afSjeremylt // Vector Restore Array
127f10650afSjeremylt //------------------------------------------------------------------------------
1280436c2adSjeremylt static int CeedVectorRestoreArray_Ref(CeedVector vec) {
129e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1300436c2adSjeremylt }
1310436c2adSjeremylt 
1320436c2adSjeremylt static int CeedVectorRestoreArrayRead_Ref(CeedVector vec) {
133e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1340436c2adSjeremylt }
1350436c2adSjeremylt 
136f10650afSjeremylt //------------------------------------------------------------------------------
137f10650afSjeremylt // Vector Destroy
138f10650afSjeremylt //------------------------------------------------------------------------------
1390436c2adSjeremylt static int CeedVectorDestroy_Ref(CeedVector vec) {
1400436c2adSjeremylt   int ierr;
1410436c2adSjeremylt   CeedVector_Ref *impl;
142e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetData(vec, &impl); CeedChkBackend(ierr);
1430436c2adSjeremylt 
144e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl->array_allocated); CeedChkBackend(ierr);
145e15f9bd0SJeremy L Thompson   ierr = CeedFree(&impl); CeedChkBackend(ierr);
146e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
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;
156e15f9bd0SJeremy L Thompson   ierr = CeedVectorGetCeed(vec, &ceed); CeedChkBackend(ierr);
1570436c2adSjeremylt 
1580436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "SetArray",
159e15f9bd0SJeremy L Thompson                                 CeedVectorSetArray_Ref); CeedChkBackend(ierr);
1606a6c615bSJeremy L Thompson   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "TakeArray",
161e15f9bd0SJeremy L Thompson                                 CeedVectorTakeArray_Ref); CeedChkBackend(ierr);
1620436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArray",
163e15f9bd0SJeremy L Thompson                                 CeedVectorGetArray_Ref); CeedChkBackend(ierr);
1640436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "GetArrayRead",
165e15f9bd0SJeremy L Thompson                                 CeedVectorGetArrayRead_Ref); CeedChkBackend(ierr);
1660436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArray",
167e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArray_Ref); CeedChkBackend(ierr);
1680436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "RestoreArrayRead",
169e15f9bd0SJeremy L Thompson                                 CeedVectorRestoreArrayRead_Ref); CeedChkBackend(ierr);
1700436c2adSjeremylt   ierr = CeedSetBackendFunction(ceed, "Vector", vec, "Destroy",
171e15f9bd0SJeremy L Thompson                                 CeedVectorDestroy_Ref); CeedChkBackend(ierr);
172e15f9bd0SJeremy L Thompson   ierr = CeedCalloc(1,&impl); CeedChkBackend(ierr);
173e15f9bd0SJeremy L Thompson   ierr = CeedVectorSetData(vec, impl); CeedChkBackend(ierr);
174e15f9bd0SJeremy L Thompson   return CEED_ERROR_SUCCESS;
1750436c2adSjeremylt }
176f10650afSjeremylt //------------------------------------------------------------------------------
177