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