xref: /libCEED/tests/t122-vector.c (revision 49aac155e7a09736f56fb3abac0f57dab29f7cbf)
10f7fd0f8Sjeremylt /// @file
2ceac335aSJeremy L Thompson /// Test pointwise multiplication of a pair of vectors
3ceac335aSJeremy L Thompson /// \test Test pointwise multiplication of a pair of vectors
40f7fd0f8Sjeremylt #include <ceed.h>
50f7fd0f8Sjeremylt #include <math.h>
6*49aac155SJeremy L Thompson #include <stdio.h>
70f7fd0f8Sjeremylt 
80f7fd0f8Sjeremylt int main(int argc, char **argv) {
90f7fd0f8Sjeremylt   Ceed              ceed;
100f7fd0f8Sjeremylt   CeedVector        x, y, w;
114fee36f0SJeremy L Thompson   CeedInt           len = 10;
124fee36f0SJeremy L Thompson   const CeedScalar *read_array;
130f7fd0f8Sjeremylt 
140f7fd0f8Sjeremylt   CeedInit(argv[1], &ceed);
150f7fd0f8Sjeremylt 
164fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &x);
174fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &y);
184fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &w);
194fee36f0SJeremy L Thompson   {
204fee36f0SJeremy L Thompson     CeedScalar array[len];
214fee36f0SJeremy L Thompson 
224fee36f0SJeremy L Thompson     for (CeedInt i = 0; i < len; i++) array[i] = i;
234fee36f0SJeremy L Thompson     CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, array);
244fee36f0SJeremy L Thompson     CeedVectorSetArray(y, CEED_MEM_HOST, CEED_COPY_VALUES, array);
254fee36f0SJeremy L Thompson   }
260f7fd0f8Sjeremylt 
270f7fd0f8Sjeremylt   // Test multiplying two vectors into third
280f7fd0f8Sjeremylt   CeedVectorPointwiseMult(w, x, y);
294fee36f0SJeremy L Thompson   CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
304fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) {
314fee36f0SJeremy L Thompson     if (fabs(read_array[i] - i * i) > 1e-14) {
320f7fd0f8Sjeremylt       // LCOV_EXCL_START
334fee36f0SJeremy L Thompson       printf("Error in w = x .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i);
340f7fd0f8Sjeremylt       // LCOV_EXCL_STOP
352b730f8bSJeremy L Thompson     }
362b730f8bSJeremy L Thompson   }
374fee36f0SJeremy L Thompson   CeedVectorRestoreArrayRead(w, &read_array);
380f7fd0f8Sjeremylt 
390f7fd0f8Sjeremylt   // Test multiplying two vectors into one of the two
400f7fd0f8Sjeremylt   CeedVectorPointwiseMult(w, w, y);
414fee36f0SJeremy L Thompson   CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
424fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) {
434fee36f0SJeremy L Thompson     if (fabs(read_array[i] - i * i * i) > 1e-14) {
440f7fd0f8Sjeremylt       // LCOV_EXCL_START
454fee36f0SJeremy L Thompson       printf("Error in w = w .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i * i);
460f7fd0f8Sjeremylt       // LCOV_EXCL_STOP
472b730f8bSJeremy L Thompson     }
482b730f8bSJeremy L Thompson   }
494fee36f0SJeremy L Thompson   CeedVectorRestoreArrayRead(w, &read_array);
500f7fd0f8Sjeremylt 
510f7fd0f8Sjeremylt   // Test multiplying two vectors into one of the two
520f7fd0f8Sjeremylt   CeedVectorPointwiseMult(w, x, w);
534fee36f0SJeremy L Thompson   CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
544fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) {
554fee36f0SJeremy L Thompson     if (fabs(read_array[i] - i * i * i * i) > 1e-14) {
560f7fd0f8Sjeremylt       // LCOV_EXCL_START
574fee36f0SJeremy L Thompson       printf("Error in w = x .* w at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i * i * i);
580f7fd0f8Sjeremylt       // LCOV_EXCL_STOP
592b730f8bSJeremy L Thompson     }
602b730f8bSJeremy L Thompson   }
614fee36f0SJeremy L Thompson   CeedVectorRestoreArrayRead(w, &read_array);
620f7fd0f8Sjeremylt 
630f7fd0f8Sjeremylt   // Test multiplying vector by itself and putting product into self
6416e0f512Sjeremylt   {
6516e0f512Sjeremylt     // Sync memtype to device for GPU backends
6616e0f512Sjeremylt     CeedMemType type = CEED_MEM_HOST;
6716e0f512Sjeremylt     CeedGetPreferredMemType(ceed, &type);
6816e0f512Sjeremylt     CeedVectorSyncArray(y, type);
6916e0f512Sjeremylt   }
700f7fd0f8Sjeremylt   CeedVectorPointwiseMult(y, y, y);
714fee36f0SJeremy L Thompson   CeedVectorGetArrayRead(y, CEED_MEM_HOST, &read_array);
724fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) {
734fee36f0SJeremy L Thompson     if (fabs(read_array[i] - i * i) > 1e-14) {
740f7fd0f8Sjeremylt       // LCOV_EXCL_START
754fee36f0SJeremy L Thompson       printf("Error in y = y .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i);
760f7fd0f8Sjeremylt       // LCOV_EXCL_STOP
772b730f8bSJeremy L Thompson     }
782b730f8bSJeremy L Thompson   }
794fee36f0SJeremy L Thompson   CeedVectorRestoreArrayRead(y, &read_array);
800f7fd0f8Sjeremylt 
810f7fd0f8Sjeremylt   CeedVectorDestroy(&x);
820f7fd0f8Sjeremylt   CeedVectorDestroy(&y);
830f7fd0f8Sjeremylt   CeedVectorDestroy(&w);
840f7fd0f8Sjeremylt   CeedDestroy(&ceed);
850f7fd0f8Sjeremylt   return 0;
860f7fd0f8Sjeremylt }
87