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