10f7fd0f8Sjeremylt /// @file 243840b09Sjeremylt /// Test pointwise muliplication of a pair of vectors 343840b09Sjeremylt /// \test Test pointwise muliplication 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; 100f7fd0f8Sjeremylt CeedInt n; 110f7fd0f8Sjeremylt CeedScalar a[10]; 120f7fd0f8Sjeremylt const CeedScalar *b; 130f7fd0f8Sjeremylt 140f7fd0f8Sjeremylt CeedInit(argv[1], &ceed); 150f7fd0f8Sjeremylt 160f7fd0f8Sjeremylt n = 10; 170f7fd0f8Sjeremylt CeedVectorCreate(ceed, n, &x); 180f7fd0f8Sjeremylt CeedVectorCreate(ceed, n, &y); 190f7fd0f8Sjeremylt CeedVectorCreate(ceed, n, &w); 20*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < n; i++) a[i] = i; 210f7fd0f8Sjeremylt CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, a); 220f7fd0f8Sjeremylt CeedVectorSetArray(y, CEED_MEM_HOST, CEED_COPY_VALUES, a); 230f7fd0f8Sjeremylt 240f7fd0f8Sjeremylt // Test multiplying two vectors into third 250f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, y); 260f7fd0f8Sjeremylt CeedVectorGetArrayRead(w, CEED_MEM_HOST, &b); 27*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < n; i++) { 28*2b730f8bSJeremy L Thompson if (fabs(b[i] - i * i) > 1e-14) { 290f7fd0f8Sjeremylt // LCOV_EXCL_START 30*2b730f8bSJeremy L Thompson printf("Error in w = x .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, b[i], 1.0 * i * i); 310f7fd0f8Sjeremylt // LCOV_EXCL_STOP 32*2b730f8bSJeremy L Thompson } 33*2b730f8bSJeremy L Thompson } 340f7fd0f8Sjeremylt CeedVectorRestoreArrayRead(w, &b); 350f7fd0f8Sjeremylt 360f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 370f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, w, y); 380f7fd0f8Sjeremylt CeedVectorGetArrayRead(w, CEED_MEM_HOST, &b); 39*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < n; i++) { 40*2b730f8bSJeremy L Thompson if (fabs(b[i] - i * i * i) > 1e-14) { 410f7fd0f8Sjeremylt // LCOV_EXCL_START 42*2b730f8bSJeremy L Thompson printf("Error in w = w .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, b[i], 1.0 * i * i * i); 430f7fd0f8Sjeremylt // LCOV_EXCL_STOP 44*2b730f8bSJeremy L Thompson } 45*2b730f8bSJeremy L Thompson } 460f7fd0f8Sjeremylt CeedVectorRestoreArrayRead(w, &b); 470f7fd0f8Sjeremylt 480f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 490f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, w); 500f7fd0f8Sjeremylt CeedVectorGetArrayRead(w, CEED_MEM_HOST, &b); 51*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < n; i++) { 52*2b730f8bSJeremy L Thompson if (fabs(b[i] - i * i * i * i) > 1e-14) { 530f7fd0f8Sjeremylt // LCOV_EXCL_START 54*2b730f8bSJeremy L Thompson printf("Error in w = x .* w at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, b[i], 1.0 * i * i * i * i); 550f7fd0f8Sjeremylt // LCOV_EXCL_STOP 56*2b730f8bSJeremy L Thompson } 57*2b730f8bSJeremy L Thompson } 580f7fd0f8Sjeremylt CeedVectorRestoreArrayRead(w, &b); 590f7fd0f8Sjeremylt 600f7fd0f8Sjeremylt // Test multiplying vector by itself and putting product into self 6116e0f512Sjeremylt { 6216e0f512Sjeremylt // Sync memtype to device for GPU backends 6316e0f512Sjeremylt CeedMemType type = CEED_MEM_HOST; 6416e0f512Sjeremylt CeedGetPreferredMemType(ceed, &type); 6516e0f512Sjeremylt CeedVectorSyncArray(y, type); 6616e0f512Sjeremylt } 670f7fd0f8Sjeremylt CeedVectorPointwiseMult(y, y, y); 680f7fd0f8Sjeremylt CeedVectorGetArrayRead(y, CEED_MEM_HOST, &b); 69*2b730f8bSJeremy L Thompson for (CeedInt i = 0; i < n; i++) { 70*2b730f8bSJeremy L Thompson if (fabs(b[i] - i * i) > 1e-14) { 710f7fd0f8Sjeremylt // LCOV_EXCL_START 72*2b730f8bSJeremy L Thompson printf("Error in y = y .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, b[i], 1.0 * i * i); 730f7fd0f8Sjeremylt // LCOV_EXCL_STOP 74*2b730f8bSJeremy L Thompson } 75*2b730f8bSJeremy L Thompson } 760f7fd0f8Sjeremylt CeedVectorRestoreArrayRead(y, &b); 770f7fd0f8Sjeremylt 780f7fd0f8Sjeremylt CeedVectorDestroy(&x); 790f7fd0f8Sjeremylt CeedVectorDestroy(&y); 800f7fd0f8Sjeremylt CeedVectorDestroy(&w); 810f7fd0f8Sjeremylt CeedDestroy(&ceed); 820f7fd0f8Sjeremylt return 0; 830f7fd0f8Sjeremylt } 84