xref: /libCEED/tests/t101-vector.c (revision fdf20d1507041ae081eb23cdb7397fbed40ecb8b)
10436c2adSjeremylt /// @file
2*ac5aa7bcSJeremy L Thompson /// Test setting single value for full CeedVector
3*ac5aa7bcSJeremy L Thompson /// \test Test setting single value for full CeedVector
4b0976d5aSZach Atkins 
5b0976d5aSZach Atkins //TESTARGS(name="length 10") {ceed_resource} 10
6b0976d5aSZach Atkins //TESTARGS(name="length 0") {ceed_resource} 0
70436c2adSjeremylt #include <ceed.h>
849aac155SJeremy L Thompson #include <stdio.h>
9b0976d5aSZach Atkins #include <stdlib.h>
102b730f8bSJeremy L Thompson 
CheckValues(Ceed ceed,CeedVector x,CeedScalar value)110436c2adSjeremylt static int CheckValues(Ceed ceed, CeedVector x, CeedScalar value) {
124fee36f0SJeremy L Thompson   const CeedScalar *read_array;
134fee36f0SJeremy L Thompson   CeedSize          len;
144fee36f0SJeremy L Thompson 
154fee36f0SJeremy L Thompson   CeedVectorGetLength(x, &len);
164fee36f0SJeremy L Thompson   CeedVectorGetArrayRead(x, CEED_MEM_HOST, &read_array);
174fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) {
184fee36f0SJeremy L Thompson     if (read_array[i] != value) printf("Error reading array[%" CeedInt_FMT "] = %f", i, (CeedScalar)read_array[i]);
190436c2adSjeremylt   }
204fee36f0SJeremy L Thompson   CeedVectorRestoreArrayRead(x, &read_array);
210436c2adSjeremylt   return 0;
220436c2adSjeremylt }
230436c2adSjeremylt 
main(int argc,char ** argv)240436c2adSjeremylt int main(int argc, char **argv) {
250436c2adSjeremylt   Ceed       ceed;
260436c2adSjeremylt   CeedVector x;
274fee36f0SJeremy L Thompson   CeedInt    len = 10;
280436c2adSjeremylt 
290436c2adSjeremylt   CeedInit(argv[1], &ceed);
30b0976d5aSZach Atkins   len = argc > 2 ? atoi(argv[2]) : len;
314fee36f0SJeremy L Thompson 
3216e0f512Sjeremylt   {
334fee36f0SJeremy L Thompson     CeedScalar array[len];
344fee36f0SJeremy L Thompson 
354fee36f0SJeremy L Thompson     CeedVectorCreate(ceed, len, &x);
364fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < len; i++) array[i] = len + i;
374fee36f0SJeremy L Thompson     CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, array);
384fee36f0SJeremy L Thompson   }
394fee36f0SJeremy L Thompson 
4016e0f512Sjeremylt   // Sync memtype to device for GPU backends
414fee36f0SJeremy L Thompson   {
4216e0f512Sjeremylt     CeedMemType type = CEED_MEM_HOST;
434fee36f0SJeremy L Thompson 
4416e0f512Sjeremylt     CeedGetPreferredMemType(ceed, &type);
4516e0f512Sjeremylt     CeedVectorSyncArray(x, type);
4616e0f512Sjeremylt   }
470436c2adSjeremylt 
484fee36f0SJeremy L Thompson   {
494fee36f0SJeremy L Thompson     const CeedScalar *read_array;
500436c2adSjeremylt 
514fee36f0SJeremy L Thompson     CeedVectorGetArrayRead(x, CEED_MEM_HOST, &read_array);
524fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < len; i++) {
534fee36f0SJeremy L Thompson       if (read_array[i] != len + i) printf("Error reading array[%" CeedInt_FMT "] = %f\n", i, (CeedScalar)read_array[i]);
544fee36f0SJeremy L Thompson     }
554fee36f0SJeremy L Thompson     CeedVectorRestoreArrayRead(x, &read_array);
564fee36f0SJeremy L Thompson   }
574fee36f0SJeremy L Thompson 
584fee36f0SJeremy L Thompson   // Set all entries to same value and check
590436c2adSjeremylt   CeedVectorSetValue(x, 3.0);
600436c2adSjeremylt   CheckValues(ceed, x, 3.0);
610436c2adSjeremylt   CeedVectorDestroy(&x);
620436c2adSjeremylt 
630436c2adSjeremylt   // Set value before setting or getting the array
644fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &x);
650436c2adSjeremylt   CeedVectorSetValue(x, 5.0);
660436c2adSjeremylt   CheckValues(ceed, x, 5.0);
670436c2adSjeremylt   CeedVectorDestroy(&x);
680436c2adSjeremylt 
690436c2adSjeremylt   CeedDestroy(&ceed);
700436c2adSjeremylt   return 0;
710436c2adSjeremylt }
72