xref: /libCEED/tests/t108-vector.c (revision 49aac155e7a09736f56fb3abac0f57dab29f7cbf)
1547d9b97Sjeremylt /// @file
2547d9b97Sjeremylt /// Test vector norms
3547d9b97Sjeremylt /// \test Test vector norms
4547d9b97Sjeremylt #include <ceed.h>
5547d9b97Sjeremylt #include <math.h>
6*49aac155SJeremy L Thompson #include <stdio.h>
7547d9b97Sjeremylt 
8547d9b97Sjeremylt int main(int argc, char **argv) {
9547d9b97Sjeremylt   Ceed       ceed;
10547d9b97Sjeremylt   CeedVector x;
114fee36f0SJeremy L Thompson   CeedInt    len = 10;
124fee36f0SJeremy L Thompson   CeedScalar array[len];
13547d9b97Sjeremylt 
14547d9b97Sjeremylt   CeedInit(argv[1], &ceed);
15547d9b97Sjeremylt 
164fee36f0SJeremy L Thompson   CeedVectorCreate(ceed, len, &x);
174fee36f0SJeremy L Thompson   for (CeedInt i = 0; i < len; i++) array[i] = i * (i % 2 ? 1 : -1);
184fee36f0SJeremy L Thompson   CeedVectorSetArray(x, CEED_MEM_HOST, CEED_USE_POINTER, array);
1916e0f512Sjeremylt   {
2016e0f512Sjeremylt     // Sync memtype to device for GPU backends
2116e0f512Sjeremylt     CeedMemType type = CEED_MEM_HOST;
2216e0f512Sjeremylt     CeedGetPreferredMemType(ceed, &type);
2316e0f512Sjeremylt     CeedVectorSyncArray(x, type);
2416e0f512Sjeremylt   }
25547d9b97Sjeremylt 
26547d9b97Sjeremylt   CeedScalar norm;
27547d9b97Sjeremylt   CeedVectorNorm(x, CEED_NORM_1, &norm);
282b730f8bSJeremy L Thompson   if (fabs(norm - 45.) > 100. * CEED_EPSILON) printf("Error: L1 norm %f != 45.\n", norm);
29547d9b97Sjeremylt 
30547d9b97Sjeremylt   CeedVectorNorm(x, CEED_NORM_2, &norm);
312b730f8bSJeremy L Thompson   if (fabs(norm - sqrt(285.)) > 100. * CEED_EPSILON) printf("Error: L2 norm %f != sqrt(285.)\n", norm);
32547d9b97Sjeremylt 
33547d9b97Sjeremylt   CeedVectorNorm(x, CEED_NORM_MAX, &norm);
342b730f8bSJeremy L Thompson   if (fabs(norm - 9.) > 100. * CEED_EPSILON) printf("Error: Max norm %f != 9.\n", norm);
35547d9b97Sjeremylt 
36547d9b97Sjeremylt   CeedVectorDestroy(&x);
37547d9b97Sjeremylt   CeedDestroy(&ceed);
38547d9b97Sjeremylt   return 0;
39547d9b97Sjeremylt }
40