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; 10*4fee36f0SJeremy L Thompson CeedInt len = 10; 11*4fee36f0SJeremy L Thompson const CeedScalar *read_array; 120f7fd0f8Sjeremylt 130f7fd0f8Sjeremylt CeedInit(argv[1], &ceed); 140f7fd0f8Sjeremylt 15*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &x); 16*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &y); 17*4fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &w); 18*4fee36f0SJeremy L Thompson { 19*4fee36f0SJeremy L Thompson CeedScalar array[len]; 20*4fee36f0SJeremy L Thompson 21*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) array[i] = i; 22*4fee36f0SJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, array); 23*4fee36f0SJeremy L Thompson CeedVectorSetArray(y, CEED_MEM_HOST, CEED_COPY_VALUES, array); 24*4fee36f0SJeremy L Thompson } 250f7fd0f8Sjeremylt 260f7fd0f8Sjeremylt // Test multiplying two vectors into third 270f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, y); 28*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 29*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 30*4fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i) > 1e-14) { 310f7fd0f8Sjeremylt // LCOV_EXCL_START 32*4fee36f0SJeremy 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 } 36*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(w, &read_array); 370f7fd0f8Sjeremylt 380f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 390f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, w, y); 40*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 41*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 42*4fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i * i) > 1e-14) { 430f7fd0f8Sjeremylt // LCOV_EXCL_START 44*4fee36f0SJeremy 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 } 48*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(w, &read_array); 490f7fd0f8Sjeremylt 500f7fd0f8Sjeremylt // Test multiplying two vectors into one of the two 510f7fd0f8Sjeremylt CeedVectorPointwiseMult(w, x, w); 52*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array); 53*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 54*4fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i * i * i) > 1e-14) { 550f7fd0f8Sjeremylt // LCOV_EXCL_START 56*4fee36f0SJeremy 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 } 60*4fee36f0SJeremy 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); 70*4fee36f0SJeremy L Thompson CeedVectorGetArrayRead(y, CEED_MEM_HOST, &read_array); 71*4fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) { 72*4fee36f0SJeremy L Thompson if (fabs(read_array[i] - i * i) > 1e-14) { 730f7fd0f8Sjeremylt // LCOV_EXCL_START 74*4fee36f0SJeremy 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 } 78*4fee36f0SJeremy L Thompson CeedVectorRestoreArrayRead(y, &read_array); 790f7fd0f8Sjeremylt 800f7fd0f8Sjeremylt CeedVectorDestroy(&x); 810f7fd0f8Sjeremylt CeedVectorDestroy(&y); 820f7fd0f8Sjeremylt CeedVectorDestroy(&w); 830f7fd0f8Sjeremylt CeedDestroy(&ceed); 840f7fd0f8Sjeremylt return 0; 850f7fd0f8Sjeremylt } 86