1 /// @file
2 /// Test pointwise multiplication of a pair of vectors
3 /// \test Test pointwise multiplication of a pair of vectors
4
5 //TESTARGS(name="length 10") {ceed_resource} 10
6 //TESTARGS(name="length 0") {ceed_resource} 0
7 #include <ceed.h>
8 #include <math.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11
main(int argc,char ** argv)12 int main(int argc, char **argv) {
13 Ceed ceed;
14 CeedVector x, y, w;
15 CeedInt len = 10;
16 const CeedScalar *read_array;
17
18 CeedInit(argv[1], &ceed);
19 len = argc > 2 ? atoi(argv[2]) : len;
20
21 CeedVectorCreate(ceed, len, &x);
22 CeedVectorCreate(ceed, len, &y);
23 CeedVectorCreate(ceed, len, &w);
24 {
25 CeedScalar array[len];
26
27 for (CeedInt i = 0; i < len; i++) array[i] = i;
28 CeedVectorSetArray(x, CEED_MEM_HOST, CEED_COPY_VALUES, array);
29 CeedVectorSetArray(y, CEED_MEM_HOST, CEED_COPY_VALUES, array);
30 }
31
32 // Test multiplying two vectors into third
33 CeedVectorPointwiseMult(w, x, y);
34 CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
35 for (CeedInt i = 0; i < len; i++) {
36 if (fabs(read_array[i] - i * i) > 1e-14) {
37 // LCOV_EXCL_START
38 printf("Error in w = x .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i);
39 // LCOV_EXCL_STOP
40 }
41 }
42 CeedVectorRestoreArrayRead(w, &read_array);
43
44 // Test multiplying two vectors into one of the two
45 CeedVectorPointwiseMult(w, w, y);
46 CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
47 for (CeedInt i = 0; i < len; i++) {
48 if (fabs(read_array[i] - i * i * i) > 1e-14) {
49 // LCOV_EXCL_START
50 printf("Error in w = w .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i * i);
51 // LCOV_EXCL_STOP
52 }
53 }
54 CeedVectorRestoreArrayRead(w, &read_array);
55
56 // Test multiplying two vectors into one of the two
57 CeedVectorPointwiseMult(w, x, w);
58 CeedVectorGetArrayRead(w, CEED_MEM_HOST, &read_array);
59 for (CeedInt i = 0; i < len; i++) {
60 if (fabs(read_array[i] - i * i * i * i) > 1e-14) {
61 // LCOV_EXCL_START
62 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);
63 // LCOV_EXCL_STOP
64 }
65 }
66 CeedVectorRestoreArrayRead(w, &read_array);
67
68 // Test multiplying vector by itself and putting product into self
69 {
70 // Sync memtype to device for GPU backends
71 CeedMemType type = CEED_MEM_HOST;
72 CeedGetPreferredMemType(ceed, &type);
73 CeedVectorSyncArray(y, type);
74 }
75 CeedVectorPointwiseMult(y, y, y);
76 CeedVectorGetArrayRead(y, CEED_MEM_HOST, &read_array);
77 for (CeedInt i = 0; i < len; i++) {
78 if (fabs(read_array[i] - i * i) > 1e-14) {
79 // LCOV_EXCL_START
80 printf("Error in y = y .* y at index %" CeedInt_FMT ", computed: %f actual: %f\n", i, read_array[i], 1.0 * i * i);
81 // LCOV_EXCL_STOP
82 }
83 }
84 CeedVectorRestoreArrayRead(y, &read_array);
85
86 CeedVectorDestroy(&x);
87 CeedVectorDestroy(&y);
88 CeedVectorDestroy(&w);
89 CeedDestroy(&ceed);
90 return 0;
91 }
92