1547d9b97Sjeremylt /// @file
2547d9b97Sjeremylt /// Test vector norms
3547d9b97Sjeremylt /// \test Test vector norms
4*b0976d5aSZach Atkins
5*b0976d5aSZach Atkins //TESTARGS(name="length 10") {ceed_resource} 10
6*b0976d5aSZach Atkins //TESTARGS(name="length 0") {ceed_resource} 0
7547d9b97Sjeremylt #include <ceed.h>
8547d9b97Sjeremylt #include <math.h>
949aac155SJeremy L Thompson #include <stdio.h>
10*b0976d5aSZach Atkins #include <stdlib.h>
11547d9b97Sjeremylt
main(int argc,char ** argv)12547d9b97Sjeremylt int main(int argc, char **argv) {
13547d9b97Sjeremylt Ceed ceed;
14547d9b97Sjeremylt CeedVector x;
154fee36f0SJeremy L Thompson CeedInt len = 10;
164fee36f0SJeremy L Thompson CeedScalar array[len];
17547d9b97Sjeremylt
18547d9b97Sjeremylt CeedInit(argv[1], &ceed);
19*b0976d5aSZach Atkins len = argc > 2 ? atoi(argv[2]) : len;
20547d9b97Sjeremylt
214fee36f0SJeremy L Thompson CeedVectorCreate(ceed, len, &x);
224fee36f0SJeremy L Thompson for (CeedInt i = 0; i < len; i++) array[i] = i * (i % 2 ? 1 : -1);
234fee36f0SJeremy L Thompson CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, array);
2416e0f512Sjeremylt {
2516e0f512Sjeremylt // Sync memtype to device for GPU backends
2616e0f512Sjeremylt CeedMemType type = CEED_MEM_HOST;
2716e0f512Sjeremylt CeedGetPreferredMemType(ceed, &type);
2816e0f512Sjeremylt CeedVectorSyncArray(x, type);
2916e0f512Sjeremylt }
30547d9b97Sjeremylt
31547d9b97Sjeremylt CeedScalar norm;
32547d9b97Sjeremylt CeedVectorNorm(x, CEED_NORM_1, &norm);
33*b0976d5aSZach Atkins if (len > 0 && fabs(norm - 45.) > 100. * CEED_EPSILON) printf("Error: L1 norm %f != 45.\n", norm);
34*b0976d5aSZach Atkins else if (len == 0 && fabs(norm) > CEED_EPSILON) printf("Error: L1 norm %f != 0.\n", norm);
35547d9b97Sjeremylt
36547d9b97Sjeremylt CeedVectorNorm(x, CEED_NORM_2, &norm);
37*b0976d5aSZach Atkins if (len > 0 && fabs(norm - sqrt(285.)) > 100. * CEED_EPSILON) printf("Error: L2 norm %f != sqrt(285.)\n", norm);
38*b0976d5aSZach Atkins else if (len == 0 && fabs(norm) > CEED_EPSILON) printf("Error: L2 norm %f != 0.\n", norm);
39547d9b97Sjeremylt
40547d9b97Sjeremylt CeedVectorNorm(x, CEED_NORM_MAX, &norm);
41*b0976d5aSZach Atkins if (len > 0 && fabs(norm - 9.) > 100. * CEED_EPSILON) printf("Error: Max norm %f != 9.\n", norm);
42*b0976d5aSZach Atkins else if (len == 0 && fabs(norm) > CEED_EPSILON) printf("Error: Max norm %f != 0.\n", norm);
43547d9b97Sjeremylt
44547d9b97Sjeremylt CeedVectorDestroy(&x);
45547d9b97Sjeremylt CeedDestroy(&ceed);
46547d9b97Sjeremylt return 0;
47547d9b97Sjeremylt }
48