pykrige 1.7.3 | pyvista 0.49.2 | numpy 2.5.4 | python-ags4 1.2.0 === Step 1: logs to model units === CP217: 16 intervals above 19.1 m (a repeated Lias sequence) counted with the landslide mass 132 holes from items 173984, 173975; 126 have at least one classified interval holes whose model units step back to a younger unit: none === Step 2: pick the contacts, and what the other holes say === contacts seen in the logs (holes): {'rockhead': 109, 'top_io': 11, 'base_io': 24, 'base_bds': 5} one-sided checks from holes that miss a surface: kind above below deeper than surface rockhead 0 0 17 top_io 75 23 0 base_io 24 61 0 base_bds 24 80 0 LOCA_ID E N GL surface depth z camber DSRC301 393184.6 215961.8 234.20 base_bds 38.70 195.50 False DSRC109 393208.0 215995.1 233.00 base_bds 39.10 193.90 False DSRCOH304 393248.8 216080.1 231.85 base_bds 43.10 188.75 False DSRC319 393406.8 216148.4 231.60 base_bds 45.30 186.30 False DSRC408 393605.0 216240.0 232.50 base_bds 46.40 186.10 False DSRC418 393131.8 216418.8 272.25 base_io 58.85 213.40 False DSRC301 393184.6 215961.8 234.20 base_io 22.40 211.80 False DSRC404 393207.0 215566.0 269.00 base_io 34.90 234.10 False DSRC109 393208.0 215995.1 233.00 base_io 20.95 212.05 False DSRC419 393213.0 215564.0 268.90 base_io 35.10 233.80 False DSRCOH304 393248.8 216080.1 231.85 base_io 26.05 205.80 False RC507 393259.0 215967.0 235.20 base_io 37.30 197.90 True DSRC302 393329.0 216018.0 234.50 base_io 26.75 207.75 False DSRC325 393329.2 216103.9 233.25 base_io 25.65 207.60 False RC508 393347.0 216033.0 234.50 base_io 40.40 194.10 True DSRC303 393383.0 216045.0 236.25 base_io 30.95 205.30 False DSRC406 393384.0 216009.0 238.65 base_io 33.80 204.85 False RC509 393397.0 216035.0 238.20 base_io 48.05 190.15 True DSRC319 393406.8 216148.4 231.60 base_io 20.50 211.10 False DSRC110 393441.0 216054.0 240.00 base_io 34.25 205.75 False DSRCOH414 393481.8 215560.7 274.60 base_io 60.30 214.30 False DSRCOH410 393585.9 215975.2 253.90 base_io 45.30 208.60 False DSRC408 393605.0 216240.0 232.50 base_io 18.30 214.20 False DSRCOH306 393776.9 216048.1 264.75 base_io 53.15 211.60 False OH411 393819.0 215306.0 280.50 base_io 86.25 194.25 False DSRCOH308 393999.2 215766.9 271.35 base_io 59.45 211.90 False OH417 394178.0 214888.9 275.65 base_io 71.80 203.85 False DSRC315 394194.0 215201.1 246.90 base_io 53.40 193.50 False DSRCOH400 394666.1 213848.1 267.95 base_io 77.30 190.65 False DSRC415 393527.0 213994.0 287.20 top_io 19.70 267.50 False RC520 393706.2 215209.8 283.90 top_io 22.55 261.35 False OH411 393819.0 215306.0 280.50 top_io 22.00 258.50 False RC516 393921.4 215527.5 277.35 top_io 2.60 274.75 False DSRC420 393950.0 213950.0 277.10 top_io 20.75 256.35 False OH417 394178.0 214888.9 275.65 top_io 5.35 270.30 False DSRCOH412 394240.9 215146.1 250.30 top_io 13.20 237.10 False OH413 394312.1 214960.1 270.65 top_io 39.20 231.45 False DSRC220 394379.0 214500.9 278.85 top_io 21.95 256.90 False DSRCOH400 394666.1 213848.1 267.95 top_io 13.40 254.55 False DSRC329 394740.0 213921.1 270.60 top_io 5.25 265.35 False === Step 3: LIDAR ground and the model grid === grid 400 x 400 cells of 10 m; 52,600 cells (5.26 km²) lie within 300 m of one of the 126 logged holes logged ground level minus LIDAR at the holes: median -0.10 m, 90% within 0.75 m === Step 4: rockhead = LIDAR ground minus kriged superficial thickness === variogram: spherical, partial sill 46.3 m², range 1439 m, nugget 0.0 m² 108 thicknesses (after averaging repeat holes): median 1.00 m, max 20.70 m (CP208) one-sided checks: the first pass broke 3 of 17; 3 holes added at their limits; now broken: 0 === Step 5: base of the Inferior Oolite: regional dip plus kriged residuals === 21 holes (RC507-RC509 held back). Fitted plane dips 1.33° (23.3 m per km) towards 76°; residuals -11.8 to +15.7 m variogram: spherical, partial sill 82.7 m², range 571 m, nugget 0.0 m² one-sided checks: the first pass broke 1 of 85; 1 holes added at their limits; now broken: 0 added: OH413 RC507-RC509 against the surface built from the other holes: LOCA_ID z regional sd offset RC507 197.90 210.34 3.97 -12.44 RC508 194.10 206.59 2.46 -12.49 RC509 190.15 205.07 2.20 -14.92 kriging them in with the rest instead: LOOCV RMSE at the other 21 holes 7.33 m (without them 7.01 m); the variogram nugget rises from 0.0 to 13.9 m² low block: 114 cells (1.1 ha) lowered by 12.4 to 14.9 m === Step 6: top of the Inferior Oolite and base of the Bridport Sand from thicknesses === Inferior Oolite thickness = top seen in the log minus the base (seen if the hole goes through, else modelled) LOCA_ID z base_here thick through DSRC220 256.90 195.25 61.65 False DSRC329 265.35 188.04 77.31 False DSRC415 267.50 222.11 45.39 False DSRC420 256.35 210.33 46.02 False DSRCOH400 254.55 190.65 63.90 True DSRCOH412 237.10 187.87 49.23 False OH411 258.50 194.25 64.25 True OH413 231.45 170.49 60.96 False OH417 270.30 203.85 66.45 True RC516 274.75 201.98 72.77 False RC520 261.35 201.87 59.48 False variogram: spherical, partial sill 121.5 m², range 1535 m, nugget 18.5 m² one-sided checks: the first pass broke 15 of 98; 15 holes added at their limits; now broken: 0 Bridport Sand, 5 complete penetrations: DSRC109 18.2 m, DSRC301 16.3 m, DSRC319 24.8 m, DSRC408 28.1 m, DSRCOH304 17.0 m variogram: spherical, partial sill 27.6 m², range 571 m, nugget 0.0 m² one-sided checks: the first pass broke 5 of 104; 5 holes added at their limits; now broken: 0 added (holes that end in Bridport Sand below the first model): DSRC110, DSRC315, DSRC406, DSRC419, DSRCOH414 modelled Bridport Sand thickness 16.4 to 37.1 m === Step 7: does the model hold together? === leave-one-out cross-validation (prediction minus log, m; standardised errors should average 0, variance 1): n RMSE mean_error MAE mean_SE var_SE Superficial thickness 108.0 3.09 -0.01 1.67 0.01 2.33 Base of Inferior Oolite 21.0 7.01 -1.56 4.40 -0.21 0.79 Top of Inferior Oolite 11.0 7.51 -0.96 6.60 -0.21 1.13 Base of Bridport Sand 5.0 2.40 -1.08 1.81 -0.38 0.65 no-crossing: top minus base of Inferior Oolite 44.3 to 70.7 m (0 cells cross); base of Inferior Oolite minus base of Bridport Sand 16.4 to 37.1 m; rockhead minus ground 0.0 m at most holes that miss a surface: does the model agree with them? holes agree worst_m surface kind rockhead deeper than 17 16 -0.9 top_io above 75 71 -2.1 below 23 18 -4.2 base_io above 24 24 26.6 below 61 61 -0.5 base_bds above 24 23 -0.6 below 80 80 -0.1 disagreements: LOCA_ID surface kind z model margin CP104A rockhead deeper than 131.2 132.2 -0.9 DSRC218 top_io below 260.6 262.6 -2.0 DSRC224 base_bds above 207.5 206.9 -0.6 DSRC312 top_io below 257.0 258.9 -1.9 DSRC314 top_io above 292.8 292.1 -0.7 DSRC317 top_io below 244.9 249.0 -4.1 DSRC403 top_io below 227.6 231.9 -4.2 RC506 top_io above 274.1 272.6 -1.5 TP602 top_io above 273.9 272.9 -1.0 TP605 top_io below 248.0 251.1 -3.1 TP613 top_io above 292.0 289.9 -2.1 model base 80 m OD. Share of the model footprint where each unit is present: Superficial deposits 94%, Great Oolite Group 50%, Inferior Oolite Group 81%, Bridport Sand Formation 84%, Lias mudstones 100% === Step 8: write the surfaces === wrote base_bridport_sand_mOD.tif, base_inferior_oolite_mOD.tif, ground_mOD.tif, low_block.tif, model.json, rockhead_mOD.tif, sd_base_bridport_sand_mOD.tif, sd_base_inferior_oolite_mOD.tif, sd_rockhead_mOD.tif, sd_top_inferior_oolite_mOD.tif, top_inferior_oolite_mOD.tif and loocv.csv === Step 9: figures === wrote 01-ground-model-3d.png, 02-borehole-data-map.png, 03-variograms-cross-validation.png, 04-surfaces-and-uncertainty.png, 05-low-block.png, 06-thickness-and-checks.png, 07-section.png