A volume of 40x40x40 is small enough that you can do all kinds of things with it. One easy method is to interpolate the volume yourself with a higher interpolation order
data = Import["countour.wdx"];
ip = ListInterpolation[data, InterpolationOrder -> 3];
ContourPlot3D[ip[x, y, z], {x, 15, 25}, {y, 15, 25}, {z, 15, 25}]
This already smooths your volume
Another way from there is to resample parts of the volume from the interpolation function with a higher resolution and apply an additional smoothing filter. But this is for you to decide.
Edit
Is there anyway to still speed up the process? maybe cut the data based on my contours. I need to automate the script to work for hundreds of cube files!
Yes, there is. When we look on your data
Image[data[[10]]] // ImageAdjust
we see, that it is pretty smooth. I would not smooth it further artificially beyond what's happening during interpolation anyway. Therefore, let me give two additional advices:
Tune the parameters for the approach I have given
This includes to verify that an interpolation order of 3 is probably not required. Order 2 will be enough and an interpolation function with decreased order will be faster.
More important, you should specify PlotPoints
and MaxRecursion
of your ContourPlot3D
call so that it is smooth enough, but does not take unnecessary long.
Below you will find an animation that shows you the effect of both parameters. I suggest to use a recursion depth of 1 and use as many plot points as you can live with
Return to ListContourPlot3D
with a prior resampling
Another way is to restrict your data (you can do that with the first approach too!), because it seems to me that the fun is happening in the center of your volume.
Then you can use ArrayResample
to create a higher resolution and in the very same step ensure that the new volume is smooth by adjusting the resampling method. In the easiest case this looks like
ListContourPlot3D[
ArrayResample[data[[10 ;; 30, 10 ;; 30, 10 ;; 30]], {50, 50, 50},
Resampling -> "Gaussian"],
Contours -> {0.01}
]