xref: /libCEED/tests/t131-vector.c (revision 9ba83ac0e4b1fca39d6fa6737a318a9f0cbc172d)
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 
10 static CeedScalar expected_usage(CeedSize length) { return length * sizeof(CeedScalar) * 1e-6; }
11 
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