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 10*021a32ddSZach Atkins static CeedScalar expected_usage(CeedSize length) { return length * sizeof(CeedScalar) * 1e-6; } 11*021a32ddSZach Atkins 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