Hello Qing,
I have a suspicion. The tile you are creating are just above the threshold where LAStools switches into "on-disk" buffering.
D:\LAStools\bin>more 41121D8410_tile_593000_4585500_chm_00.hdr
nrows 2322
ncols 2322
nbands 1
nbits 32
layout bil
nodata -9999
byteorder I
ulxmap 592959.875000
ulymap 4586040.125000
xdim 0.25
ydim 0.25
pixeltype float
D:\LAStools\bin>more 41121D8410_tile_593000_4585500_chm_ground.hdr
nrows 2320
ncols 2320
nbands 1
nbits 32
layout bil
nodata -9999
byteorder I
ulxmap 592960.125000
ulymap 4586039.875000
xdim 0.25
ydim 0.25
pixeltype float
Here is the corresponding piece in my code where the switch is made:
// for large rasters use a disk buffer
if (nrows * ncols > 2048*2048)
{
srwriter->set_buffer(new SRbufferRowBands()); // GIS 2006 paper
}
else
{
srwriter->set_buffer(new SRbufferInMemory()); // for small images
}
When on-disk buffering is used a temporary file name is needed. All my temporry filenames include the process ID that is formed like this:
sprintf(base, "temp.%d", GetCurrentProcessId());
I assume that under Linux the Window's construct GetCurrentProcessId() does not work properly and always 0 (or so) is returned. Hence the temp files of the different processes over-write another. As a quick fix you can try the following: Add the command '-buffer inmemory' to your command string. Then no on-disk buffering is used.
By the way. I noticed that your input seems to be a tile but that you do not use any buffers around the tile edges (different kind of buffering) as described here.
I first noticed that when I saw that your BIL rasters are slightly different in size.
Finally ... here is the pit-free CHM LAStools command sequence that Qing is using:
las2dem.exe -i input.laz -o chm_ground.bil -drop_z_above 0.1 -step 0.25 -v
lasthin.exe -i input.laz -o temp_25.laz -subcircle 0.1 -step 0.125 -highest -olaz -v
las2dem.exe -i temp_25.laz -o chm_00.bil -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_02.bil -drop_z_below 2 -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_05.bil -drop_z_below 5 -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_10.bil -drop_z_below 10 -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_15.bil -drop_z_below 15 -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_20.bil -drop_z_below 20 -step 0.25 -kill 1.0 -v
las2dem.exe -i temp_25.laz -o chm_25.bil -drop_z_below 25 -step 0.25 -kill 1.0 -v
I am curious. Do you like the result that the pit-free CHM algorithm currently produces? What were you using before to create CHMs? Does the absence of pits improve your subsequent analysis? I am asking in part because we have something new for all pit-free CHM fans this Silvilaser 2015 that happens at the end of September in France. I hope you are coming ... (-:
Martin