xref: /libCEED/tests/t131-vector.c (revision 1095a7a656d3f4e8a8262fa04dbb365f06d73bb3)
1*021a32ddSZach Atkins /// @file
2*021a32ddSZach Atkins /// Test clearing work vectors
3*021a32ddSZach Atkins /// \test Test clearing work vectors
4*021a32ddSZach Atkins 
5*021a32ddSZach Atkins #include <ceed.h>
6*021a32ddSZach Atkins #include <ceed/backend.h>
7*021a32ddSZach Atkins #include <math.h>
8*021a32ddSZach Atkins #include <stdio.h>
9*021a32ddSZach Atkins 
expected_usage(CeedSize length)10*021a32ddSZach Atkins static CeedScalar expected_usage(CeedSize length) { return length * sizeof(CeedScalar) * 1e-6; }
11*021a32ddSZach Atkins 
main(int argc,char ** argv)12*021a32ddSZach Atkins int main(int argc, char **argv) {
13*021a32ddSZach Atkins   Ceed       ceed;
14*021a32ddSZach Atkins   CeedVector x, y, z;
15*021a32ddSZach Atkins   CeedScalar usage_mb;
16*021a32ddSZach Atkins 
17*021a32ddSZach Atkins   CeedInit(argv[1], &ceed);
18*021a32ddSZach Atkins 
19*021a32ddSZach Atkins   // Add work vectors of different lengths
20*021a32ddSZach Atkins   CeedGetWorkVector(ceed, 10, &x);
21*021a32ddSZach Atkins   CeedGetWorkVector(ceed, 20, &y);
22*021a32ddSZach Atkins   CeedGetWorkVector(ceed, 30, &z);
23*021a32ddSZach Atkins 
24*021a32ddSZach Atkins   // Check memory usage, should be 60 * sizeof(CeedScalar)
25*021a32ddSZach Atkins   CeedGetWorkVectorMemoryUsage(ceed, &usage_mb);
26*021a32ddSZach Atkins   if (fabs(usage_mb - expected_usage(60)) > 100. * CEED_EPSILON) printf("Wrong usage: %0.8g MB != %0.8g MB\n", usage_mb, expected_usage(60));
27*021a32ddSZach Atkins 
28*021a32ddSZach Atkins   // Restore x and z
29*021a32ddSZach Atkins   CeedRestoreWorkVector(ceed, &x);
30*021a32ddSZach Atkins   CeedRestoreWorkVector(ceed, &z);
31*021a32ddSZach Atkins 
32*021a32ddSZach Atkins   // Clear work vectors with length < 30. This should:
33*021a32ddSZach Atkins   //  - Remove x
34*021a32ddSZach Atkins   //  - Leave y, since it is still in use
35*021a32ddSZach Atkins   //  - Leave z, since it is length 30
36*021a32ddSZach Atkins   CeedClearWorkVectors(ceed, 30);
37*021a32ddSZach Atkins   CeedGetWorkVectorMemoryUsage(ceed, &usage_mb);
38*021a32ddSZach Atkins   if (fabs(usage_mb - expected_usage(50)) > 100. * CEED_EPSILON) printf("Wrong usage: %0.8g MB != %0.8g MB\n", usage_mb, expected_usage(50));
39*021a32ddSZach Atkins 
40*021a32ddSZach Atkins   // Clear work vectors with length < 31. This should:
41*021a32ddSZach Atkins   //  - Leave y, since it is still in use
42*021a32ddSZach Atkins   //  - Remove z
43*021a32ddSZach Atkins   CeedClearWorkVectors(ceed, 31);
44*021a32ddSZach Atkins   CeedGetWorkVectorMemoryUsage(ceed, &usage_mb);
45*021a32ddSZach Atkins   if (fabs(usage_mb - expected_usage(20)) > 100. * CEED_EPSILON) printf("Wrong usage: %0.8g MB != %0.8g MB\n", usage_mb, expected_usage(20));
46*021a32ddSZach Atkins 
47*021a32ddSZach Atkins   // Restore y
48*021a32ddSZach Atkins   CeedRestoreWorkVector(ceed, &y);
49*021a32ddSZach Atkins 
50*021a32ddSZach Atkins   // Make sure we can still get back y without allocating a new work vector
51*021a32ddSZach Atkins   CeedGetWorkVector(ceed, 20, &y);
52*021a32ddSZach Atkins   CeedGetWorkVectorMemoryUsage(ceed, &usage_mb);
53*021a32ddSZach Atkins   if (fabs(usage_mb - expected_usage(20)) > 100. * CEED_EPSILON) printf("Wrong usage: %0.8g MB != %0.8g MB\n", usage_mb, expected_usage(20));
54*021a32ddSZach Atkins   CeedRestoreWorkVector(ceed, &y);
55*021a32ddSZach Atkins 
56*021a32ddSZach Atkins   CeedDestroy(&ceed);
57*021a32ddSZach Atkins   return 0;
58*021a32ddSZach Atkins }
59