SmartSmooth: A linear time convexity preserving smoothing algorithm for numerically convex data with application to VLSI design