xref: /libCEED/tests/t109-vector.c (revision 4fee36f0a30516a0b5ad51bf7eb3b32d83efd623)
19d488d03SJeremy L Thompson /// @file
29d488d03SJeremy L Thompson /// Test CeedVectorSetArray to remove array access
39d488d03SJeremy L Thompson /// \test Test CeedVectorSetArray to remove array access
49d488d03SJeremy L Thompson #include <ceed.h>
59d488d03SJeremy L Thompson #include <math.h>
69d488d03SJeremy L Thompson 
79d488d03SJeremy L Thompson int main(int argc, char **argv) {
89d488d03SJeremy L Thompson   Ceed          ceed;
99d488d03SJeremy L Thompson   CeedVector    x;
10*4fee36f0SJeremy L Thompson   const CeedInt len = 10;
11*4fee36f0SJeremy L Thompson   CeedScalar    array[len];
129d488d03SJeremy L Thompson 
139d488d03SJeremy L Thompson   CeedInit(argv[1], &ceed);
149d488d03SJeremy L Thompson 
15*4fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &x);
16*4fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) array[i] = 0;
17*4fee36f0SJeremy L Thompson   array[3] = -3.14;
18*4fee36f0SJeremy L Thompson   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, array);
199d488d03SJeremy L Thompson 
209d488d03SJeremy L Thompson   // Taking array should return a
21*4fee36f0SJeremy L Thompson   {
22*4fee36f0SJeremy L Thompson     CeedScalar *array;
23*4fee36f0SJeremy L Thompson 
24*4fee36f0SJeremy L Thompson     CeedVectorTakeArray(x, CEED_MEM_HOST, &array);
25*4fee36f0SJeremy L Thompson     if (fabs(array[3] + 3.14) > 10. * CEED_EPSILON) printf("Error taking array, array[3] = %f\n", (CeedScalar)array[3]);
26*4fee36f0SJeremy L Thompson   }
279d488d03SJeremy L Thompson 
289d488d03SJeremy L Thompson   // Getting array should not modify a
29*4fee36f0SJeremy L Thompson   {
30*4fee36f0SJeremy L Thompson     CeedScalar *writable_array;
319d488d03SJeremy L Thompson 
32*4fee36f0SJeremy L Thompson     CeedVectorGetArrayWrite(x, CEED_MEM_HOST, &writable_array);
33*4fee36f0SJeremy L Thompson     writable_array[5] = -3.14;
34*4fee36f0SJeremy L Thompson     CeedVectorRestoreArray(x, &writable_array);
35*4fee36f0SJeremy L Thompson   }
36*4fee36f0SJeremy L Thompson   if (fabs(array[5] + 3.14) < 10. * CEED_EPSILON) printf("Error protecting array, array[3] = %f\n", (CeedScalar)array[3]);
379d488d03SJeremy L Thompson 
389d488d03SJeremy L Thompson   CeedVectorDestroy(&x);
39e076c219SJed Brown 
40e076c219SJed Brown   // Test with a size zero vector
41e076c219SJed Brown   CeedVectorCreate(ceed, 0, &x);
42e076c219SJed Brown   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, NULL);
43*4fee36f0SJeremy L Thompson   {
44*4fee36f0SJeremy L Thompson     const CeedScalar *read_array;
45*4fee36f0SJeremy L Thompson 
46*4fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &read_array);
47*4fee36f0SJeremy L Thompson     if (read_array) printf("CeedVectorGetArrayRead returned non-NULL for zero-sized Vector\n");
48*4fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(x, &read_array);
49*4fee36f0SJeremy L Thompson   }
50*4fee36f0SJeremy L Thompson   {
51*4fee36f0SJeremy L Thompson     CeedScalar *array;
52*4fee36f0SJeremy L Thompson 
53*4fee36f0SJeremy L Thompson     CeedVectorTakeArray(x, CEED_MEM_HOST, &array);
54*4fee36f0SJeremy L Thompson     if (array) printf("CeedVectorTakeArray returned non-NULL for zero-sized Vector\n");
55*4fee36f0SJeremy L Thompson   }
56e076c219SJed Brown   CeedVectorDestroy(&x);
57e076c219SJed Brown 
589d488d03SJeremy L Thompson   CeedDestroy(&ceed);
599d488d03SJeremy L Thompson   return 0;
609d488d03SJeremy L Thompson }
61