xref: /libCEED/tests/t127-vector.c (revision e6cb4fca5f98bfb30d17a8599499ec279b90b048)
10b8f3c4eSJeremy L Thompson /// @file
20b8f3c4eSJeremy L Thompson /// Test strided setting and copying of vectors
30b8f3c4eSJeremy L Thompson /// \test Test strided setting and copying of vectors
40b8f3c4eSJeremy L Thompson #include <ceed.h>
50b8f3c4eSJeremy L Thompson #include <stdio.h>
60b8f3c4eSJeremy L Thompson 
main(int argc,char ** argv)70b8f3c4eSJeremy L Thompson int main(int argc, char **argv) {
80b8f3c4eSJeremy L Thompson   Ceed       ceed;
90b8f3c4eSJeremy L Thompson   CeedSize   start = 2, step = 3;
100b8f3c4eSJeremy L Thompson   CeedVector x, y;
110b8f3c4eSJeremy L Thompson   CeedInt    len = 10;
120b8f3c4eSJeremy L Thompson 
130b8f3c4eSJeremy L Thompson   CeedInit(argv[1], &ceed);
140b8f3c4eSJeremy L Thompson 
150b8f3c4eSJeremy L Thompson   CeedVectorCreate(ceed, len, &x);
160b8f3c4eSJeremy L Thompson   CeedVectorCreate(ceed, len, &y);
170b8f3c4eSJeremy L Thompson 
180b8f3c4eSJeremy L Thompson   // Set strided
190b8f3c4eSJeremy L Thompson   CeedVectorSetValue(x, 1.0);
20ff90b007SJeremy L Thompson   CeedVectorSetValueStrided(x, start, -1, step, 42.0);
210b8f3c4eSJeremy L Thompson   {
220b8f3c4eSJeremy L Thompson     const CeedScalar *read_array;
230b8f3c4eSJeremy L Thompson 
240b8f3c4eSJeremy L Thompson     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &read_array);
250b8f3c4eSJeremy L Thompson     for (CeedInt i = 0; i < len; i++) {
260b8f3c4eSJeremy L Thompson       CeedScalar value = (i - start) % step == 0 ? 42.0 : 1.0;
270b8f3c4eSJeremy L Thompson 
280b8f3c4eSJeremy L Thompson       if (read_array[i] != value) {
290b8f3c4eSJeremy L Thompson         // LCOV_EXCL_START
300b8f3c4eSJeremy L Thompson         printf("Error in setting value in x at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], value);
310b8f3c4eSJeremy L Thompson         // LCOV_EXCL_STOP
320b8f3c4eSJeremy L Thompson       }
330b8f3c4eSJeremy L Thompson     }
340b8f3c4eSJeremy L Thompson     CeedVectorRestoreArrayRead(x, &read_array);
350b8f3c4eSJeremy L Thompson   }
360b8f3c4eSJeremy L Thompson 
370b8f3c4eSJeremy L Thompson   // Copy strided
380b8f3c4eSJeremy L Thompson   CeedVectorSetValue(y, 0.0);
39*832a6d73SJeremy L Thompson   CeedVectorCopyStrided(x, start, -1, step, y);
400b8f3c4eSJeremy L Thompson   {
410b8f3c4eSJeremy L Thompson     const CeedScalar *read_array;
420b8f3c4eSJeremy L Thompson 
430b8f3c4eSJeremy L Thompson     CeedVectorGetArrayRead(y, CEED_MEM_HOST, &read_array);
440b8f3c4eSJeremy L Thompson     for (CeedInt i = 0; i < len; i++) {
450b8f3c4eSJeremy L Thompson       CeedScalar value = (i - start) % step == 0 ? 42.0 : 0.0;
460b8f3c4eSJeremy L Thompson 
470b8f3c4eSJeremy L Thompson       if (read_array[i] != value) {
480b8f3c4eSJeremy L Thompson         // LCOV_EXCL_START
490b8f3c4eSJeremy L Thompson         printf("Error in copying value to y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], value);
500b8f3c4eSJeremy L Thompson         // LCOV_EXCL_STOP
510b8f3c4eSJeremy L Thompson       }
520b8f3c4eSJeremy L Thompson     }
530b8f3c4eSJeremy L Thompson     CeedVectorRestoreArrayRead(y, &read_array);
540b8f3c4eSJeremy L Thompson   }
550b8f3c4eSJeremy L Thompson 
560b8f3c4eSJeremy L Thompson   CeedVectorDestroy(&x);
570b8f3c4eSJeremy L Thompson   CeedVectorDestroy(&y);
580b8f3c4eSJeremy L Thompson   CeedDestroy(&ceed);
590b8f3c4eSJeremy L Thompson   return 0;
600b8f3c4eSJeremy L Thompson }
61