[{"data":1,"prerenderedAt":1205},["ShallowReactive",2],{"page-\u002Futils\u002Fguides\u002Fgeometry-and-volumes":3,"navigation":824},{"collection":4,"page":5},"docs_en",{"id":6,"title":7,"body":8,"description":816,"extension":817,"meta":818,"navigation":81,"path":819,"rawbody":820,"seo":821,"stem":822,"__hash__":823},"docs_en\u002Futils\u002F2.guides\u002F1.geometry-and-volumes.md","Geometry and volumes",{"type":9,"value":10,"toc":809},"minimark",[11,20,25,237,265,271,410,416,420,426,499,502,506,515,571,593,597,674,695,699,711,802,805],[12,13,14,15,19],"p",{},"Construction intervals give everything needed to estimate materials: how much gravel to order, how much grout to mix, how wide the drawing must be. These functions read the construction blocks of a ",[16,17,18],"code",{},"Well"," in the format's units, meters for depth and millimeters for diameter, and return cubic meters.",[21,22,24],"h2",{"id":23},"gravel-pack-and-seal","Gravel pack and seal",[26,27,32],"pre",{"className":28,"code":29,"language":30,"meta":31,"style":31},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { calculateHoleFillVolume, formatNumber } from '@welldot\u002Futils';\n\nconst gravel = calculateHoleFillVolume('gravel_pack', well);\nconst seal = calculateHoleFillVolume('seal', well);\n\nformatNumber(gravel, { fractionDigits: 2, suffix: 'm³' }); \u002F\u002F '1.88 m³'\nformatNumber(seal, { fractionDigits: 2, suffix: 'm³' }); \u002F\u002F '0.39 m³'\n","ts","",[16,33,34,76,83,116,143,148,198],{"__ignoreMap":31},[35,36,39,43,47,51,54,57,60,63,66,70,73],"span",{"class":37,"line":38},"line",1,[35,40,42],{"class":41},"s7zQu","import",[35,44,46],{"class":45},"sMK4o"," {",[35,48,50],{"class":49},"sTEyZ"," calculateHoleFillVolume",[35,52,53],{"class":45},",",[35,55,56],{"class":49}," formatNumber",[35,58,59],{"class":45}," }",[35,61,62],{"class":41}," from",[35,64,65],{"class":45}," '",[35,67,69],{"class":68},"sfazB","@welldot\u002Futils",[35,71,72],{"class":45},"'",[35,74,75],{"class":45},";\n",[35,77,79],{"class":37,"line":78},2,[35,80,82],{"emptyLinePlaceholder":81},true,"\n",[35,84,86,90,93,96,99,102,104,107,109,111,114],{"class":37,"line":85},3,[35,87,89],{"class":88},"spNyl","const",[35,91,92],{"class":49}," gravel ",[35,94,95],{"class":45},"=",[35,97,50],{"class":98},"s2Zo4",[35,100,101],{"class":49},"(",[35,103,72],{"class":45},[35,105,106],{"class":68},"gravel_pack",[35,108,72],{"class":45},[35,110,53],{"class":45},[35,112,113],{"class":49}," well)",[35,115,75],{"class":45},[35,117,119,121,124,126,128,130,132,135,137,139,141],{"class":37,"line":118},4,[35,120,89],{"class":88},[35,122,123],{"class":49}," seal ",[35,125,95],{"class":45},[35,127,50],{"class":98},[35,129,101],{"class":49},[35,131,72],{"class":45},[35,133,134],{"class":68},"seal",[35,136,72],{"class":45},[35,138,53],{"class":45},[35,140,113],{"class":49},[35,142,75],{"class":45},[35,144,146],{"class":37,"line":145},5,[35,147,82],{"emptyLinePlaceholder":81},[35,149,151,154,157,159,161,165,168,172,174,177,179,181,184,186,188,191,194],{"class":37,"line":150},6,[35,152,153],{"class":98},"formatNumber",[35,155,156],{"class":49},"(gravel",[35,158,53],{"class":45},[35,160,46],{"class":45},[35,162,164],{"class":163},"swJcz"," fractionDigits",[35,166,167],{"class":45},":",[35,169,171],{"class":170},"sbssI"," 2",[35,173,53],{"class":45},[35,175,176],{"class":163}," suffix",[35,178,167],{"class":45},[35,180,65],{"class":45},[35,182,183],{"class":68},"m³",[35,185,72],{"class":45},[35,187,59],{"class":45},[35,189,190],{"class":49},")",[35,192,193],{"class":45},";",[35,195,197],{"class":196},"sHwdD"," \u002F\u002F '1.88 m³'\n",[35,199,201,203,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234],{"class":37,"line":200},7,[35,202,153],{"class":98},[35,204,205],{"class":49},"(seal",[35,207,53],{"class":45},[35,209,46],{"class":45},[35,211,164],{"class":163},[35,213,167],{"class":45},[35,215,171],{"class":170},[35,217,53],{"class":45},[35,219,176],{"class":163},[35,221,167],{"class":45},[35,223,65],{"class":45},[35,225,183],{"class":68},[35,227,72],{"class":45},[35,229,59],{"class":45},[35,231,190],{"class":49},[35,233,193],{"class":45},[35,235,236],{"class":196}," \u002F\u002F '0.39 m³'\n",[12,238,239,242,243,246,247,250,251,254,255,260,261,264],{},[16,240,241],{},"calculateHoleFillVolume(type, well)"," adds up every ",[16,244,245],{},"hole_fill"," interval of that type (",[16,248,249],{},"'gravel_pack'"," or ",[16,252,253],{},"'seal'",", the two values of the closed vocabulary in ",[256,257,259],"a",{"href":258},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#holefill--hole_fill","HoleFill","). For each interval it takes the annulus at the fill's ",[16,262,263],{},"diameter"," and subtracts any casing or screen that overlaps it, so the result is the net volume of material.",[12,266,267,268,167],{},"For one interval, use ",[16,269,270],{},"calculateHoleFillSegmentVolume(holeFill, well)",[26,272,274],{"className":28,"code":273,"language":30,"meta":31,"style":31},"import { calculateHoleFillSegmentVolume } from '@welldot\u002Futils';\n\nfor (const fill of well.hole_fill) {\n  console.log(\n    fill.type,\n    fill.from,\n    fill.to,\n    calculateHoleFillSegmentVolume(fill, well),\n  );\n}\n",[16,275,276,297,301,329,342,355,366,377,396,404],{"__ignoreMap":31},[35,277,278,280,282,285,287,289,291,293,295],{"class":37,"line":38},[35,279,42],{"class":41},[35,281,46],{"class":45},[35,283,284],{"class":49}," calculateHoleFillSegmentVolume",[35,286,59],{"class":45},[35,288,62],{"class":41},[35,290,65],{"class":45},[35,292,69],{"class":68},[35,294,72],{"class":45},[35,296,75],{"class":45},[35,298,299],{"class":37,"line":78},[35,300,82],{"emptyLinePlaceholder":81},[35,302,303,306,309,311,314,317,320,323,326],{"class":37,"line":85},[35,304,305],{"class":41},"for",[35,307,308],{"class":49}," (",[35,310,89],{"class":88},[35,312,313],{"class":49}," fill ",[35,315,316],{"class":45},"of",[35,318,319],{"class":49}," well",[35,321,322],{"class":45},".",[35,324,325],{"class":49},"hole_fill) ",[35,327,328],{"class":45},"{\n",[35,330,331,334,336,339],{"class":37,"line":118},[35,332,333],{"class":49},"  console",[35,335,322],{"class":45},[35,337,338],{"class":98},"log",[35,340,341],{"class":163},"(\n",[35,343,344,347,349,352],{"class":37,"line":145},[35,345,346],{"class":49},"    fill",[35,348,322],{"class":45},[35,350,351],{"class":49},"type",[35,353,354],{"class":45},",\n",[35,356,357,359,361,364],{"class":37,"line":150},[35,358,346],{"class":49},[35,360,322],{"class":45},[35,362,363],{"class":49},"from",[35,365,354],{"class":45},[35,367,368,370,372,375],{"class":37,"line":200},[35,369,346],{"class":49},[35,371,322],{"class":45},[35,373,374],{"class":49},"to",[35,376,354],{"class":45},[35,378,380,383,385,388,390,392,394],{"class":37,"line":379},8,[35,381,382],{"class":98},"    calculateHoleFillSegmentVolume",[35,384,101],{"class":163},[35,386,387],{"class":49},"fill",[35,389,53],{"class":45},[35,391,319],{"class":49},[35,393,190],{"class":163},[35,395,354],{"class":45},[35,397,399,402],{"class":37,"line":398},9,[35,400,401],{"class":163},"  )",[35,403,75],{"class":45},[35,405,407],{"class":37,"line":406},10,[35,408,409],{"class":45},"}\n",[411,412,413],"note",{},[12,414,415],{},"These are geometric volumes of a perfect cylinder. Real holes are wider than the bit, and drillers add a margin (often 20 to 50 %) for washouts and losses. Apply your own factor; the library does not guess one.",[21,417,419],{"id":418},"cylinders","Cylinders",[12,421,422,425],{},[16,423,424],{},"calculateCylindricVolume(diameter, height)"," is the volume in m³ of a cylinder with a diameter in millimeters and a height in meters:",[26,427,429],{"className":28,"code":428,"language":30,"meta":31,"style":31},"import { calculateCylindricVolume } from '@welldot\u002Futils';\n\ncalculateCylindricVolume(254, 60); \u002F\u002F 3.04 m³: a 10 in hole, 60 m deep\ncalculateCylindricVolume(168.3, 1); \u002F\u002F 0.022 m³ per meter of 6 in casing\n",[16,430,431,452,456,478],{"__ignoreMap":31},[35,432,433,435,437,440,442,444,446,448,450],{"class":37,"line":38},[35,434,42],{"class":41},[35,436,46],{"class":45},[35,438,439],{"class":49}," calculateCylindricVolume",[35,441,59],{"class":45},[35,443,62],{"class":41},[35,445,65],{"class":45},[35,447,69],{"class":68},[35,449,72],{"class":45},[35,451,75],{"class":45},[35,453,454],{"class":37,"line":78},[35,455,82],{"emptyLinePlaceholder":81},[35,457,458,461,463,466,468,471,473,475],{"class":37,"line":85},[35,459,460],{"class":98},"calculateCylindricVolume",[35,462,101],{"class":49},[35,464,465],{"class":170},"254",[35,467,53],{"class":45},[35,469,470],{"class":170}," 60",[35,472,190],{"class":49},[35,474,193],{"class":45},[35,476,477],{"class":196}," \u002F\u002F 3.04 m³: a 10 in hole, 60 m deep\n",[35,479,480,482,484,487,489,492,494,496],{"class":37,"line":118},[35,481,460],{"class":98},[35,483,101],{"class":49},[35,485,486],{"class":170},"168.3",[35,488,53],{"class":45},[35,490,491],{"class":170}," 1",[35,493,190],{"class":49},[35,495,193],{"class":45},[35,497,498],{"class":196}," \u002F\u002F 0.022 m³ per meter of 6 in casing\n",[12,500,501],{},"Useful for drilling fluid volumes, well disinfection doses or the water stored in the casing.",[21,503,505],{"id":504},"depths","Depths",[12,507,508,511,512,322],{},[16,509,510],{},"getProfileLastItemsDepths(well)"," returns the deepest point of each block, in a fixed order: lithology, fractures, caves, bore hole, hole fill, reduction, surface case, well case, well screen. An empty block gives ",[16,513,514],{},"0",[26,516,518],{"className":28,"code":517,"language":30,"meta":31,"style":31},"import { getProfileLastItemsDepths } from '@welldot\u002Futils';\n\nMath.max(...getProfileLastItemsDepths(well)); \u002F\u002F the deepest recorded point, geology included\n",[16,519,520,541,545],{"__ignoreMap":31},[35,521,522,524,526,529,531,533,535,537,539],{"class":37,"line":38},[35,523,42],{"class":41},[35,525,46],{"class":45},[35,527,528],{"class":49}," getProfileLastItemsDepths",[35,530,59],{"class":45},[35,532,62],{"class":41},[35,534,65],{"class":45},[35,536,69],{"class":68},[35,538,72],{"class":45},[35,540,75],{"class":45},[35,542,543],{"class":37,"line":78},[35,544,82],{"emptyLinePlaceholder":81},[35,546,547,550,552,555,557,560,563,566,568],{"class":37,"line":85},[35,548,549],{"class":49},"Math",[35,551,322],{"class":45},[35,553,554],{"class":98},"max",[35,556,101],{"class":49},[35,558,559],{"class":45},"...",[35,561,562],{"class":98},"getProfileLastItemsDepths",[35,564,565],{"class":49},"(well))",[35,567,193],{"class":45},[35,569,570],{"class":196}," \u002F\u002F the deepest recorded point, geology included\n",[12,572,573,574,577,578,584,585,589,590,322],{},"For the drilled depth from construction only, use ",[16,575,576],{},"calculatedWellDepth"," from ",[256,579,581],{"href":580},"\u002Fcore\u002Fapi\u002Ffunctions\u002FcalculatedWellDepth",[16,582,583],{},"@welldot\u002Fcore",". The difference matters when a lithology log goes deeper than the finished well. ",[256,586,588],{"href":587},"\u002Fformat\u002Fconcepts\u002Fdepths-and-intervals","Depths and intervals"," explains ",[16,591,592],{},"well_depth",[21,594,596],{"id":595},"diameters","Diameters",[26,598,600],{"className":28,"code":599,"language":30,"meta":31,"style":31},"import { getProfileDiamValues } from '@welldot\u002Futils';\n\nconst diameters = getProfileDiamValues(well); \u002F\u002F every diameter in mm, both ends of each reduction\nconst widest = Math.max(...diameters); \u002F\u002F to scale a cross-section\n",[16,601,602,623,627,646],{"__ignoreMap":31},[35,603,604,606,608,611,613,615,617,619,621],{"class":37,"line":38},[35,605,42],{"class":41},[35,607,46],{"class":45},[35,609,610],{"class":49}," getProfileDiamValues",[35,612,59],{"class":45},[35,614,62],{"class":41},[35,616,65],{"class":45},[35,618,69],{"class":68},[35,620,72],{"class":45},[35,622,75],{"class":45},[35,624,625],{"class":37,"line":78},[35,626,82],{"emptyLinePlaceholder":81},[35,628,629,631,634,636,638,641,643],{"class":37,"line":85},[35,630,89],{"class":88},[35,632,633],{"class":49}," diameters ",[35,635,95],{"class":45},[35,637,610],{"class":98},[35,639,640],{"class":49},"(well)",[35,642,193],{"class":45},[35,644,645],{"class":196}," \u002F\u002F every diameter in mm, both ends of each reduction\n",[35,647,648,650,653,655,658,660,662,664,666,669,671],{"class":37,"line":118},[35,649,89],{"class":88},[35,651,652],{"class":49}," widest ",[35,654,95],{"class":45},[35,656,657],{"class":49}," Math",[35,659,322],{"class":45},[35,661,554],{"class":98},[35,663,101],{"class":49},[35,665,559],{"class":45},[35,667,668],{"class":49},"diameters)",[35,670,193],{"class":45},[35,672,673],{"class":196}," \u002F\u002F to scale a cross-section\n",[12,675,676,679,680,683,684,686,687,690,691,694],{},[16,677,678],{},"getProfileDiamValues"," accepts any object with the construction arrays (the ",[16,681,682],{},"Constructive"," type), and a ",[16,685,18],{}," is one. ",[16,688,689],{},"getConstructivePropertySummary(well, property)"," is the general form: one named property pulled from every construction component, ",[16,692,693],{},"undefined"," where a component has no such field.",[21,696,698],{"id":697},"centralizers","Centralizers",[12,700,701,702,706,707,710],{},"The spec stores centralizers as an interval and a spacing, and forbids storing their count (",[256,703,705],{"href":704},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#centralizer--centralizers-since-v21","Centralizer","). ",[16,708,709],{},"getCentralizerDepths"," derives the positions:",[26,712,714],{"className":28,"code":713,"language":30,"meta":31,"style":31},"import { getCentralizerDepths } from '@welldot\u002Futils';\n\ngetCentralizerDepths({ from: 10, to: 58, spacing: 12, type: 'spring_bow' });\n\u002F\u002F [10, 22, 34, 46, 58]\n",[16,715,716,737,741,797],{"__ignoreMap":31},[35,717,718,720,722,725,727,729,731,733,735],{"class":37,"line":38},[35,719,42],{"class":41},[35,721,46],{"class":45},[35,723,724],{"class":49}," getCentralizerDepths",[35,726,59],{"class":45},[35,728,62],{"class":41},[35,730,65],{"class":45},[35,732,69],{"class":68},[35,734,72],{"class":45},[35,736,75],{"class":45},[35,738,739],{"class":37,"line":78},[35,740,82],{"emptyLinePlaceholder":81},[35,742,743,745,747,750,752,754,757,759,762,764,767,769,772,774,777,779,782,784,786,789,791,793,795],{"class":37,"line":85},[35,744,709],{"class":98},[35,746,101],{"class":49},[35,748,749],{"class":45},"{",[35,751,62],{"class":163},[35,753,167],{"class":45},[35,755,756],{"class":170}," 10",[35,758,53],{"class":45},[35,760,761],{"class":163}," to",[35,763,167],{"class":45},[35,765,766],{"class":170}," 58",[35,768,53],{"class":45},[35,770,771],{"class":163}," spacing",[35,773,167],{"class":45},[35,775,776],{"class":170}," 12",[35,778,53],{"class":45},[35,780,781],{"class":163}," type",[35,783,167],{"class":45},[35,785,65],{"class":45},[35,787,788],{"class":68},"spring_bow",[35,790,72],{"class":45},[35,792,59],{"class":45},[35,794,190],{"class":49},[35,796,75],{"class":45},[35,798,799],{"class":37,"line":118},[35,800,801],{"class":196},"\u002F\u002F [10, 22, 34, 46, 58]\n",[12,803,804],{},"Without a spacing it returns only the two ends.",[806,807,808],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":31,"searchDepth":78,"depth":78,"links":810},[811,812,813,814,815],{"id":23,"depth":78,"text":24},{"id":418,"depth":78,"text":419},{"id":504,"depth":78,"text":505},{"id":595,"depth":78,"text":596},{"id":697,"depth":78,"text":698},"Estimate gravel pack and seal volumes, compute cylindrical and annular volumes, and read depths and diameters from a well's construction with @welldot\u002Futils.","md",{},"\u002Futils\u002Fguides\u002Fgeometry-and-volumes","---\ntitle: Geometry and volumes\ndescription: Estimate gravel pack and seal volumes, compute cylindrical and annular volumes, and read depths and diameters from a well's construction with @welldot\u002Futils.\n---\n\nConstruction intervals give everything needed to estimate materials: how much gravel to order, how much grout to mix, how wide the drawing must be. These functions read the construction blocks of a `Well` in the format's units, meters for depth and millimeters for diameter, and return cubic meters.\n\n## Gravel pack and seal\n\n```ts\nimport { calculateHoleFillVolume, formatNumber } from '@welldot\u002Futils';\n\nconst gravel = calculateHoleFillVolume('gravel_pack', well);\nconst seal = calculateHoleFillVolume('seal', well);\n\nformatNumber(gravel, { fractionDigits: 2, suffix: 'm³' }); \u002F\u002F '1.88 m³'\nformatNumber(seal, { fractionDigits: 2, suffix: 'm³' }); \u002F\u002F '0.39 m³'\n```\n\n`calculateHoleFillVolume(type, well)` adds up every `hole_fill` interval of that type (`'gravel_pack'` or `'seal'`, the two values of the closed vocabulary in [HoleFill](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#holefill--hole_fill)). For each interval it takes the annulus at the fill's `diameter` and subtracts any casing or screen that overlaps it, so the result is the net volume of material.\n\nFor one interval, use `calculateHoleFillSegmentVolume(holeFill, well)`:\n\n```ts\nimport { calculateHoleFillSegmentVolume } from '@welldot\u002Futils';\n\nfor (const fill of well.hole_fill) {\n  console.log(\n    fill.type,\n    fill.from,\n    fill.to,\n    calculateHoleFillSegmentVolume(fill, well),\n  );\n}\n```\n\n::note\nThese are geometric volumes of a perfect cylinder. Real holes are wider than the bit, and drillers add a margin (often 20 to 50 %) for washouts and losses. Apply your own factor; the library does not guess one.\n::\n\n## Cylinders\n\n`calculateCylindricVolume(diameter, height)` is the volume in m³ of a cylinder with a diameter in millimeters and a height in meters:\n\n```ts\nimport { calculateCylindricVolume } from '@welldot\u002Futils';\n\ncalculateCylindricVolume(254, 60); \u002F\u002F 3.04 m³: a 10 in hole, 60 m deep\ncalculateCylindricVolume(168.3, 1); \u002F\u002F 0.022 m³ per meter of 6 in casing\n```\n\nUseful for drilling fluid volumes, well disinfection doses or the water stored in the casing.\n\n## Depths\n\n`getProfileLastItemsDepths(well)` returns the deepest point of each block, in a fixed order: lithology, fractures, caves, bore hole, hole fill, reduction, surface case, well case, well screen. An empty block gives `0`.\n\n```ts\nimport { getProfileLastItemsDepths } from '@welldot\u002Futils';\n\nMath.max(...getProfileLastItemsDepths(well)); \u002F\u002F the deepest recorded point, geology included\n```\n\nFor the drilled depth from construction only, use `calculatedWellDepth` from [`@welldot\u002Fcore`](\u002Fcore\u002Fapi\u002Ffunctions\u002FcalculatedWellDepth). The difference matters when a lithology log goes deeper than the finished well. [Depths and intervals](\u002Fformat\u002Fconcepts\u002Fdepths-and-intervals) explains `well_depth`.\n\n## Diameters\n\n```ts\nimport { getProfileDiamValues } from '@welldot\u002Futils';\n\nconst diameters = getProfileDiamValues(well); \u002F\u002F every diameter in mm, both ends of each reduction\nconst widest = Math.max(...diameters); \u002F\u002F to scale a cross-section\n```\n\n`getProfileDiamValues` accepts any object with the construction arrays (the `Constructive` type), and a `Well` is one. `getConstructivePropertySummary(well, property)` is the general form: one named property pulled from every construction component, `undefined` where a component has no such field.\n\n## Centralizers\n\nThe spec stores centralizers as an interval and a spacing, and forbids storing their count ([Centralizer](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#centralizer--centralizers-since-v21)). `getCentralizerDepths` derives the positions:\n\n```ts\nimport { getCentralizerDepths } from '@welldot\u002Futils';\n\ngetCentralizerDepths({ from: 10, to: 58, spacing: 12, type: 'spring_bow' });\n\u002F\u002F [10, 22, 34, 46, 58]\n```\n\nWithout a spacing it returns only the two ends.\n",{"title":7,"description":816},"utils\u002F2.guides\u002F1.geometry-and-volumes","wr4xYNgSizIi5BPn4kthC1SRjso1XobT9mtm-QNnClU",{"docs_en":825,"spec":1138,"changelogs":1188},[826,846,865,921,1029,1083],{"title":827,"path":828,"stem":829,"children":830},"Ai","\u002Fai","ai",[831,834,838,842],{"title":832,"path":828,"stem":833},"Introduction","ai\u002Findex",{"title":835,"path":836,"stem":837},"Converting reports with an assistant","\u002Fai\u002Fconversion-skill","ai\u002Fconversion-skill",{"title":839,"path":840,"stem":841},"llms.txt and Markdown pages","\u002Fai\u002Fllms","ai\u002Fllms",{"title":843,"path":844,"stem":845},"MCP server","\u002Fai\u002Fmcp","ai\u002Fmcp",{"title":847,"path":848,"stem":849,"children":850},"Contributing","\u002Fcontributing","contributing",[851,853,857,861],{"title":832,"path":848,"stem":852},"contributing\u002Findex",{"title":854,"path":855,"stem":856},"Writing docs","\u002Fcontributing\u002Fwriting-docs","contributing\u002F1.writing-docs",{"title":858,"path":859,"stem":860},"Update rules","\u002Fcontributing\u002Fupdate-rules","contributing\u002F2.update-rules",{"title":862,"path":863,"stem":864},"Content components","\u002Fcontributing\u002Fcomponents","contributing\u002Fcomponents",{"title":866,"path":867,"stem":868,"children":869},"Core","\u002Fcore","core",[870,872,886,915],{"title":832,"path":867,"stem":871},"core\u002Findex",{"title":873,"path":874,"stem":875,"children":876,"page":885},"Getting Started","\u002Fcore\u002Fgetting-started","core\u002F1.getting-started",[877,881],{"title":878,"path":879,"stem":880},"Installation","\u002Fcore\u002Fgetting-started\u002Finstallation","core\u002F1.getting-started\u002F1.installation",{"title":882,"path":883,"stem":884},"First use","\u002Fcore\u002Fgetting-started\u002Ffirst-use","core\u002F1.getting-started\u002F2.first-use",false,{"title":887,"path":888,"stem":889,"children":890,"page":885},"Guides","\u002Fcore\u002Fguides","core\u002F2.guides",[891,895,899,903,907,911],{"title":892,"path":893,"stem":894},"Parsing and validating","\u002Fcore\u002Fguides\u002Fparsing-and-validating","core\u002F2.guides\u002F1.parsing-and-validating",{"title":896,"path":897,"stem":898},"Serializing and sharing","\u002Fcore\u002Fguides\u002Fserializing-and-sharing","core\u002F2.guides\u002F2.serializing-and-sharing",{"title":900,"path":901,"stem":902},"Unit conversion","\u002Fcore\u002Fguides\u002Funit-conversion","core\u002F2.guides\u002F3.unit-conversion",{"title":904,"path":905,"stem":906},"Vocabularies and textures","\u002Fcore\u002Fguides\u002Fvocabularies-and-textures","core\u002F2.guides\u002F4.vocabularies-and-textures",{"title":908,"path":909,"stem":910},"Water quality vocabulary","\u002Fcore\u002Fguides\u002Fwater-quality-vocabulary","core\u002F2.guides\u002F5.water-quality-vocabulary",{"title":912,"path":913,"stem":914},"Versions and time zones","\u002Fcore\u002Fguides\u002Fversions-and-time-zones","core\u002F2.guides\u002F6.versions-and-time-zones",{"title":916,"path":917,"stem":918,"children":919},"API reference","\u002Fcore\u002Fapi","core\u002Fapi\u002Findex",[920],{"title":916,"path":917,"stem":918},{"title":922,"path":923,"stem":924,"children":925},"Format","\u002Fformat","format",[926,928,948,975,999,1019,1025],{"title":832,"path":923,"stem":927},"format\u002Findex",{"title":873,"path":929,"stem":930,"children":931,"page":885},"\u002Fformat\u002Fgetting-started","format\u002F1.getting-started",[932,936,940,944],{"title":933,"path":934,"stem":935},"What is .well?","\u002Fformat\u002Fgetting-started\u002Fwhat-is-well","format\u002F1.getting-started\u002F1.what-is-well",{"title":937,"path":938,"stem":939},"For geologists","\u002Fformat\u002Fgetting-started\u002Ffor-geologists","format\u002F1.getting-started\u002F2.for-geologists",{"title":941,"path":942,"stem":943},"For developers","\u002Fformat\u002Fgetting-started\u002Ffor-developers","format\u002F1.getting-started\u002F3.for-developers",{"title":945,"path":946,"stem":947},"Your first .well file","\u002Fformat\u002Fgetting-started\u002Ffirst-well-file","format\u002F1.getting-started\u002F4.first-well-file",{"title":949,"path":950,"stem":951,"children":952,"page":885},"Concepts","\u002Fformat\u002Fconcepts","format\u002F2.concepts",[953,955,959,963,967,971],{"title":588,"path":587,"stem":954},"format\u002F2.concepts\u002F1.depths-and-intervals",{"title":956,"path":957,"stem":958},"Units and precision","\u002Fformat\u002Fconcepts\u002Funits-and-precision","format\u002F2.concepts\u002F2.units-and-precision",{"title":960,"path":961,"stem":962},"Vocabularies","\u002Fformat\u002Fconcepts\u002Fvocabularies","format\u002F2.concepts\u002F3.vocabularies",{"title":964,"path":965,"stem":966},"Profiles","\u002Fformat\u002Fconcepts\u002Fprofiles","format\u002F2.concepts\u002F4.profiles",{"title":968,"path":969,"stem":970},"Versions and deprecation","\u002Fformat\u002Fconcepts\u002Fversions-and-deprecation","format\u002F2.concepts\u002F5.versions-and-deprecation",{"title":972,"path":973,"stem":974},"Extensibility","\u002Fformat\u002Fconcepts\u002Fextensibility","format\u002F2.concepts\u002F6.extensibility",{"title":887,"path":976,"stem":977,"children":978,"page":885},"\u002Fformat\u002Fguides","format\u002F3.guides",[979,983,987,991,995],{"title":980,"path":981,"stem":982},"Writing a .well by hand","\u002Fformat\u002Fguides\u002Fwriting-by-hand","format\u002F3.guides\u002F1.writing-by-hand",{"title":984,"path":985,"stem":986},"Converting a report","\u002Fformat\u002Fguides\u002Fconverting-a-report","format\u002F3.guides\u002F2.converting-a-report",{"title":988,"path":989,"stem":990},"Validating","\u002Fformat\u002Fguides\u002Fvalidating","format\u002F3.guides\u002F3.validating",{"title":992,"path":993,"stem":994},"Extending for your own needs","\u002Fformat\u002Fguides\u002Fextending","format\u002F3.guides\u002F4.extending",{"title":996,"path":997,"stem":998},"Building an editor or database on .well","\u002Fformat\u002Fguides\u002Fbuilding-on-well","format\u002F3.guides\u002F5.building-on-well",{"title":1000,"path":1001,"stem":1002,"children":1003},"Overview","\u002Fformat\u002Freference","format\u002F4.reference\u002Findex",[1004,1005,1009,1013],{"title":1000,"path":1001,"stem":1002},{"title":1006,"path":1007,"stem":1008},"JSON Schema","\u002Fformat\u002Freference\u002Fjson-schema","format\u002F4.reference\u002F1.json-schema",{"title":1010,"path":1011,"stem":1012},"Example wells","\u002Fformat\u002Freference\u002Fexamples","format\u002F4.reference\u002F2.examples",{"title":1014,"path":1015,"stem":1016,"children":1017},"Object reference","\u002Fformat\u002Freference\u002Fobjects","format\u002Freference\u002Fobjects\u002Findex",[1018],{"title":1014,"path":1015,"stem":1016},{"title":1020,"path":1021,"stem":1022,"children":1023},"About the spec","\u002Fformat\u002Fspec","format\u002F5.spec\u002Findex",[1024],{"title":1020,"path":1021,"stem":1022},{"title":1026,"path":1027,"stem":1028},"Changelog","\u002Fformat\u002Fchangelog","format\u002F6.changelog",{"title":1030,"path":1031,"stem":1032,"children":1033},"Render","\u002Frender","render",[1034,1036,1046,1078],{"title":832,"path":1031,"stem":1035},"render\u002Findex",{"title":873,"path":1037,"stem":1038,"children":1039,"page":885},"\u002Frender\u002Fgetting-started","render\u002F1.getting-started",[1040,1043],{"title":878,"path":1041,"stem":1042},"\u002Frender\u002Fgetting-started\u002Finstallation","render\u002F1.getting-started\u002F1.installation",{"title":882,"path":1044,"stem":1045},"\u002Frender\u002Fgetting-started\u002Ffirst-use","render\u002F1.getting-started\u002F2.first-use",{"title":887,"path":1047,"stem":1048,"children":1049,"page":885},"\u002Frender\u002Fguides","render\u002F2.guides",[1050,1054,1058,1062,1066,1070,1074],{"title":1051,"path":1052,"stem":1053},"Panels and layout","\u002Frender\u002Fguides\u002Fpanels-and-layout","render\u002F2.guides\u002F1.panels-and-layout",{"title":1055,"path":1056,"stem":1057},"Layers and labels","\u002Frender\u002Fguides\u002Flayers-and-labels","render\u002F2.guides\u002F2.layers-and-labels",{"title":1059,"path":1060,"stem":1061},"Theming","\u002Frender\u002Fguides\u002Ftheming","render\u002F2.guides\u002F3.theming",{"title":1063,"path":1064,"stem":1065},"Locale and units","\u002Frender\u002Fguides\u002Flocale-and-units","render\u002F2.guides\u002F4.locale-and-units",{"title":1067,"path":1068,"stem":1069},"Legends","\u002Frender\u002Fguides\u002Flegends","render\u002F2.guides\u002F5.legends",{"title":1071,"path":1072,"stem":1073},"Zoom, pan and highlights","\u002Frender\u002Fguides\u002Finteraction","render\u002F2.guides\u002F6.interaction",{"title":1075,"path":1076,"stem":1077},"Using it in a framework","\u002Frender\u002Fguides\u002Fframeworks","render\u002F2.guides\u002F7.frameworks",{"title":916,"path":1079,"stem":1080,"children":1081},"\u002Frender\u002Fapi","render\u002Fapi\u002Findex",[1082],{"title":916,"path":1079,"stem":1080},{"title":1084,"path":1085,"stem":1086,"children":1087},"Utils","\u002Futils","utils",[1088,1090,1100,1133],{"title":832,"path":1085,"stem":1089},"utils\u002Findex",{"title":873,"path":1091,"stem":1092,"children":1093,"page":885},"\u002Futils\u002Fgetting-started","utils\u002F1.getting-started",[1094,1097],{"title":878,"path":1095,"stem":1096},"\u002Futils\u002Fgetting-started\u002Finstallation","utils\u002F1.getting-started\u002F1.installation",{"title":882,"path":1098,"stem":1099},"\u002Futils\u002Fgetting-started\u002Ffirst-use","utils\u002F1.getting-started\u002F2.first-use",{"title":887,"path":1101,"stem":1102,"children":1103,"page":885},"\u002Futils\u002Fguides","utils\u002F2.guides",[1104,1105,1109,1113,1117,1121,1125,1129],{"title":7,"path":819,"stem":822},{"title":1106,"path":1107,"stem":1108},"Water levels and pumping tests","\u002Futils\u002Fguides\u002Fpumping-tests","utils\u002F2.guides\u002F2.pumping-tests",{"title":1110,"path":1111,"stem":1112},"Permits","\u002Futils\u002Fguides\u002Fpermits","utils\u002F2.guides\u002F3.permits",{"title":1114,"path":1115,"stem":1116},"Operation and production","\u002Futils\u002Fguides\u002Foperation","utils\u002F2.guides\u002F4.operation",{"title":1118,"path":1119,"stem":1120},"Water quality","\u002Futils\u002Fguides\u002Fwater-quality","utils\u002F2.guides\u002F5.water-quality",{"title":1122,"path":1123,"stem":1124},"Logger import","\u002Futils\u002Fguides\u002Flogger-import","utils\u002F2.guides\u002F6.logger-import",{"title":1126,"path":1127,"stem":1128},"SIAGAS import","\u002Futils\u002Fguides\u002Fsiagas-import","utils\u002F2.guides\u002F7.siagas-import",{"title":1130,"path":1131,"stem":1132},"Formatting","\u002Futils\u002Fguides\u002Fformatting","utils\u002F2.guides\u002F8.formatting",{"title":916,"path":1134,"stem":1135,"children":1136},"\u002Futils\u002Fapi","utils\u002Fapi\u002Findex",[1137],{"title":916,"path":1134,"stem":1135},[1139],{"title":922,"path":923,"stem":924,"children":1140,"page":885},[1141],{"title":1142,"path":1021,"stem":1143,"children":1144,"page":885},"Spec","format\u002Fspec",[1145,1154,1163],{"title":1146,"path":1147,"stem":1148,"children":1149,"page":885},"Reference","\u002Fformat\u002Fspec\u002Freference","format\u002Fspec\u002Freference",[1150],{"title":1151,"path":1152,"stem":1153},"FGDC Texture Patterns Reference","\u002Fformat\u002Fspec\u002Freference\u002Ffgdc-textures","format\u002Fspec\u002Freference\u002Ffgdc-textures",{"title":1155,"path":1156,"stem":1157,"children":1158,"page":885},"V1","\u002Fformat\u002Fspec\u002Fv1","format\u002Fspec\u002Fv1",[1159],{"title":1160,"path":1161,"stem":1162},".well File Format Specification","\u002Fformat\u002Fspec\u002Fv1\u002Fwell-format","format\u002Fspec\u002Fv1\u002Fwell-format",{"title":1164,"path":1165,"stem":1166,"children":1167,"page":885},"V2","\u002Fformat\u002Fspec\u002Fv2","format\u002Fspec\u002Fv2",[1168,1172,1176,1180,1184],{"title":1169,"path":1170,"stem":1171},".well File Format Specification — Version 2.4: Format Reference","\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference","format\u002Fspec\u002Fv2\u002Fformat-reference",{"title":1173,"path":1174,"stem":1175},".well File Format Specification — Version 2.4: Interoperability","\u002Fformat\u002Fspec\u002Fv2\u002Finteroperability","format\u002Fspec\u002Fv2\u002Finteroperability",{"title":1177,"path":1178,"stem":1179},".well File Format Specification — Version 2.4: Object Schemas","\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas","format\u002Fspec\u002Fv2\u002Fobject-schemas",{"title":1181,"path":1182,"stem":1183},".well File Format Specification — Version 2.4: Overview","\u002Fformat\u002Fspec\u002Fv2\u002Foverview","format\u002Fspec\u002Fv2\u002Foverview",{"title":1185,"path":1186,"stem":1187},".well File Format Specification — Version 2.4: Water Quality","\u002Fformat\u002Fspec\u002Fv2\u002Fwater-quality","format\u002Fspec\u002Fv2\u002Fwater-quality",[1189,1194,1200],{"title":866,"path":867,"stem":868,"children":1190,"page":885},[1191],{"title":583,"path":1192,"stem":1193},"\u002Fcore\u002Fchangelog","core\u002FCHANGELOG",{"title":1030,"path":1031,"stem":1032,"children":1195,"page":885},[1196],{"title":1197,"path":1198,"stem":1199},"@welldot\u002Frender","\u002Frender\u002Fchangelog","render\u002FCHANGELOG",{"title":1084,"path":1085,"stem":1086,"children":1201,"page":885},[1202],{"title":69,"path":1203,"stem":1204},"\u002Futils\u002Fchangelog","utils\u002FCHANGELOG",1793050495131]