10f7fd0f8Sjeremylt /// @file 2*ceac335aSJeremy L Thompson /// Test pointwise multiplication of a pair of vectors 3*ceac335aSJeremy L Thompson /// \test Test pointwise multiplication of a pair of vectors 40f7fd0f8Sjeremylt #include <ceed.h> 50f7fd0f8Sjeremylt #include <math.h> 60f7fd0f8Sjeremylt 70f7fd0f8Sjeremylt int main(int argc, char **argv) { 80f7fd0f8Sjeremylt Ceed ceed; 90f7fd0f8Sjeremylt CeedVector x, y, w; 104fee36f0SJeremy L Thompson CeedInt len = 10; 114fee36f0SJeremy L Thompson const CeedScalar *read_array; 120f7fd0f8Sjeremylt 130f7fd0f8Sjeremylt CeedInit(argv[1], &ceed); 140f7fd0f8Sjeremylt 154fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &x); 164fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &y); 174fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &w); 184fee36f0SJeremy L Thompson { 194fee36f0SJeremy L Thompson CeedScalar array[len]; 204fee36f0SJeremy L Thompson 214fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) array[i] = i; 224fee36f0SJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, array); 234fee36f0SJeremy L Thompson CeedVectorSetArray(y, CEED_MEM_HOST, CEED_COPY_VALUES, array); 244fee36f0SJeremy L Thompson } 250f7fd0f8Sjeremylt 260f7fd0f8Sjeremylt // Test multiplying two vectors into third 270f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, y); 284fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 294fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 304fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i) > 1e-14) { 310f7fd0f8Sjeremylt // LCOV_EXCL_START 324fee36f0SJeremy 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); 330f7fd0f8Sjeremylt // LCOV_EXCL_STOP 342b730f8bSJeremy L Thompson } 352b730f8bSJeremy L Thompson } 364fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(w, &read_array); 370f7fd0f8Sjeremylt 380f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 390f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, w, y); 404fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 414fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 424fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i * i) > 1e-14) { 430f7fd0f8Sjeremylt // LCOV_EXCL_START 444fee36f0SJeremy 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); 450f7fd0f8Sjeremylt // LCOV_EXCL_STOP 462b730f8bSJeremy L Thompson } 472b730f8bSJeremy L Thompson } 484fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(w, &read_array); 490f7fd0f8Sjeremylt 500f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 510f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, w); 524fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 534fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 544fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i * i * i) > 1e-14) { 550f7fd0f8Sjeremylt // LCOV_EXCL_START 564fee36f0SJeremy 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); 570f7fd0f8Sjeremylt // LCOV_EXCL_STOP 582b730f8bSJeremy L Thompson } 592b730f8bSJeremy L Thompson } 604fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(w, &read_array); 610f7fd0f8Sjeremylt 620f7fd0f8Sjeremylt // Test multiplying vector by itself and putting product into self 6316e0f512Sjeremylt { 6416e0f512Sjeremylt // Sync memtype to device for GPU backends 6516e0f512Sjeremylt CeedMemType type = CEED_MEM_HOST; 6616e0f512Sjeremylt CeedGetPreferredMemType(ceed, &type); 6716e0f512Sjeremylt CeedVectorSyncArray(y, type); 6816e0f512Sjeremylt } 690f7fd0f8Sjeremylt CeedVectorPointwiseMult(y, y, y); 704fee36f0SJeremy L Thompson CeedVectorGetArrayRead(y, CEED_MEM_HOST, &read_array); 714fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 724fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i) > 1e-14) { 730f7fd0f8Sjeremylt // LCOV_EXCL_START 744fee36f0SJeremy 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); 750f7fd0f8Sjeremylt // LCOV_EXCL_STOP 762b730f8bSJeremy L Thompson } 772b730f8bSJeremy L Thompson } 784fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(y, &read_array); 790f7fd0f8Sjeremylt 800f7fd0f8Sjeremylt CeedVectorDestroy(&x); 810f7fd0f8Sjeremylt CeedVectorDestroy(&y); 820f7fd0f8Sjeremylt CeedVectorDestroy(&w); 830f7fd0f8Sjeremylt CeedDestroy(&ceed); 840f7fd0f8Sjeremylt return 0; 850f7fd0f8Sjeremylt } 86