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