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