[{"data":1,"prerenderedAt":1434},["ShallowReactive",2],{"page-\u002Futils\u002Fguides\u002Fpumping-tests":3,"navigation":1052},{"collection":4,"page":5},"docs_en",{"id":6,"title":7,"body":8,"description":1044,"extension":1045,"meta":1046,"navigation":116,"path":1047,"rawbody":1048,"seo":1049,"stem":1050,"__hash__":1051},"docs_en\u002Futils\u002F2.guides\u002F2.pumping-tests.md","Water levels and pumping tests",{"type":9,"value":10,"toc":1036},"minimark",[11,32,37,49,165,169,257,293,297,629,651,658,714,728,732,735,821,888,906,910,1012,1016,1032],[12,13,14,15,19,20,26,27,31],"p",{},"Water levels and pumping tests live in ",[16,17,18],"code",{},"hydrodynamic_events",", a ledger of field records (",[21,22,24],"a",{"href":23},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#hydrodynamic_events",[16,25,18],{},"). The file stores what was measured: levels, rates, elapsed times. Drawdown, specific capacity and the plots are computed from those readings, never stored (",[21,28,30],{"href":29},"\u002Fformat\u002Fspec\u002Fv2\u002Foverview#design-principles","design principles",").",[33,34,36],"h2",{"id":35},"corrections-come-first","Corrections come first",[12,38,39,40,43,44,48],{},"An event can retract an earlier one with ",[16,41,42],{},"corrects",". A retracted event stays in the file but must be left out of every derivation (",[21,45,47],{"href":46},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#corrections-since-v23","corrections","). Every function on this page already does that. If you iterate the events yourself, start from the effective list:",[50,51,56],"pre",{"className":52,"code":53,"language":54,"meta":55,"style":55},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import {\n  getEffectiveHydrodynamicEvents,\n  getRetractedEventIds,\n} from '@welldot\u002Futils';\n\nconst events = getEffectiveHydrodynamicEvents(well); \u002F\u002F every event not retracted\nconst retracted = getRetractedEventIds(well); \u002F\u002F Set of retracted ids, chains included\n","ts","",[16,57,58,71,81,89,111,118,145],{"__ignoreMap":55},[59,60,63,67],"span",{"class":61,"line":62},"line",1,[59,64,66],{"class":65},"s7zQu","import",[59,68,70],{"class":69},"sMK4o"," {\n",[59,72,74,78],{"class":61,"line":73},2,[59,75,77],{"class":76},"sTEyZ","  getEffectiveHydrodynamicEvents",[59,79,80],{"class":69},",\n",[59,82,84,87],{"class":61,"line":83},3,[59,85,86],{"class":76},"  getRetractedEventIds",[59,88,80],{"class":69},[59,90,92,95,98,101,105,108],{"class":61,"line":91},4,[59,93,94],{"class":69},"}",[59,96,97],{"class":65}," from",[59,99,100],{"class":69}," '",[59,102,104],{"class":103},"sfazB","@welldot\u002Futils",[59,106,107],{"class":69},"'",[59,109,110],{"class":69},";\n",[59,112,114],{"class":61,"line":113},5,[59,115,117],{"emptyLinePlaceholder":116},true,"\n",[59,119,121,125,128,131,135,138,141],{"class":61,"line":120},6,[59,122,124],{"class":123},"spNyl","const",[59,126,127],{"class":76}," events ",[59,129,130],{"class":69},"=",[59,132,134],{"class":133},"s2Zo4"," getEffectiveHydrodynamicEvents",[59,136,137],{"class":76},"(well)",[59,139,140],{"class":69},";",[59,142,144],{"class":143},"sHwdD"," \u002F\u002F every event not retracted\n",[59,146,148,150,153,155,158,160,162],{"class":61,"line":147},7,[59,149,124],{"class":123},[59,151,152],{"class":76}," retracted ",[59,154,130],{"class":69},[59,156,157],{"class":133}," getRetractedEventIds",[59,159,137],{"class":76},[59,161,140],{"class":69},[59,163,164],{"class":143}," \u002F\u002F Set of retracted ids, chains included\n",[33,166,168],{"id":167},"current-levels","Current levels",[50,170,172],{"className":52,"code":171,"language":54,"meta":55,"style":55},"import {\n  getLatestPumpingDynamicLevel,\n  getLatestStaticLevel,\n  isFlowingArtesian,\n} from '@welldot\u002Futils';\n\ngetLatestStaticLevel(well); \u002F\u002F 3.94: latest static level, by UTC instant\ngetLatestPumpingDynamicLevel(well); \u002F\u002F 52.75: latest level measured while pumping\nisFlowingArtesian(well); \u002F\u002F true when the latest static level is above ground\n",[16,173,174,180,187,194,201,215,219,231,244],{"__ignoreMap":55},[59,175,176,178],{"class":61,"line":62},[59,177,66],{"class":65},[59,179,70],{"class":69},[59,181,182,185],{"class":61,"line":73},[59,183,184],{"class":76},"  getLatestPumpingDynamicLevel",[59,186,80],{"class":69},[59,188,189,192],{"class":61,"line":83},[59,190,191],{"class":76},"  getLatestStaticLevel",[59,193,80],{"class":69},[59,195,196,199],{"class":61,"line":91},[59,197,198],{"class":76},"  isFlowingArtesian",[59,200,80],{"class":69},[59,202,203,205,207,209,211,213],{"class":61,"line":113},[59,204,94],{"class":69},[59,206,97],{"class":65},[59,208,100],{"class":69},[59,210,104],{"class":103},[59,212,107],{"class":69},[59,214,110],{"class":69},[59,216,217],{"class":61,"line":120},[59,218,117],{"emptyLinePlaceholder":116},[59,220,221,224,226,228],{"class":61,"line":147},[59,222,223],{"class":133},"getLatestStaticLevel",[59,225,137],{"class":76},[59,227,140],{"class":69},[59,229,230],{"class":143}," \u002F\u002F 3.94: latest static level, by UTC instant\n",[59,232,234,237,239,241],{"class":61,"line":233},8,[59,235,236],{"class":133},"getLatestPumpingDynamicLevel",[59,238,137],{"class":76},[59,240,140],{"class":69},[59,242,243],{"class":143}," \u002F\u002F 52.75: latest level measured while pumping\n",[59,245,247,250,252,254],{"class":61,"line":246},9,[59,248,249],{"class":133},"isFlowingArtesian",[59,251,137],{"class":76},[59,253,140],{"class":69},[59,255,256],{"class":143}," \u002F\u002F true when the latest static level is above ground\n",[258,259,260,270,279],"ul",{},[261,262,263,265,266,31],"li",{},[16,264,223],{}," compares events by absolute instant, not by their position in the array, as the spec requires (",[21,267,269],{"href":268},"\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#ordering-and-ties","ordering and ties",[261,271,272,274,275,278],{},[16,273,236],{}," skips air-lift events and falls back to a newer ",[16,276,277],{},"aquifer_analysis[].dynamic_level",".",[261,280,281,282,284,285,288,289,31],{},"A negative level is above ground. ",[16,283,249],{}," is the v2.1 way to detect a flowing well, replacing the deprecated ",[16,286,287],{},"well_type: \"artesian\""," (",[21,290,292],{"href":291},"\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#level-sign-convention","level sign convention",[33,294,296],{"id":295},"drawdown-and-specific-capacity","Drawdown and specific capacity",[50,298,300],{"className":52,"code":299,"language":54,"meta":55,"style":55},"import {\n  calculateDrawdown,\n  calculateSpecificCapacity,\n  calculateUnitDrawdown,\n  lastReading,\n} from '@welldot\u002Futils';\n\nconst test = events.find(e => e.type === 'constant_rate');\nif (test?.type === 'constant_rate' && test.static_level !== undefined) {\n  const end = lastReading(test); \u002F\u002F { elapsed: 1440, depth: 52.75 }\n  const rate = test.steps?.[0]?.rate; \u002F\u002F m³\u002Fh\n  if (end && rate) {\n    const s = calculateDrawdown(end.depth, test.static_level); \u002F\u002F 50.75 m\n    calculateSpecificCapacity(rate, s); \u002F\u002F 0.29 m²\u002Fh (Q\u002Fs)\n    calculateUnitDrawdown(s, rate); \u002F\u002F 3.44 h\u002Fm² (s\u002FQ)\n  }\n}\n",[16,301,302,308,315,322,329,336,350,354,404,448,476,515,534,574,595,617,623],{"__ignoreMap":55},[59,303,304,306],{"class":61,"line":62},[59,305,66],{"class":65},[59,307,70],{"class":69},[59,309,310,313],{"class":61,"line":73},[59,311,312],{"class":76},"  calculateDrawdown",[59,314,80],{"class":69},[59,316,317,320],{"class":61,"line":83},[59,318,319],{"class":76},"  calculateSpecificCapacity",[59,321,80],{"class":69},[59,323,324,327],{"class":61,"line":91},[59,325,326],{"class":76},"  calculateUnitDrawdown",[59,328,80],{"class":69},[59,330,331,334],{"class":61,"line":113},[59,332,333],{"class":76},"  lastReading",[59,335,80],{"class":69},[59,337,338,340,342,344,346,348],{"class":61,"line":120},[59,339,94],{"class":69},[59,341,97],{"class":65},[59,343,100],{"class":69},[59,345,104],{"class":103},[59,347,107],{"class":69},[59,349,110],{"class":69},[59,351,352],{"class":61,"line":147},[59,353,117],{"emptyLinePlaceholder":116},[59,355,356,358,361,363,366,368,371,374,378,381,384,386,389,392,394,397,399,402],{"class":61,"line":233},[59,357,124],{"class":123},[59,359,360],{"class":76}," test ",[59,362,130],{"class":69},[59,364,365],{"class":76}," events",[59,367,278],{"class":69},[59,369,370],{"class":133},"find",[59,372,373],{"class":76},"(",[59,375,377],{"class":376},"sHdIc","e",[59,379,380],{"class":123}," =>",[59,382,383],{"class":76}," e",[59,385,278],{"class":69},[59,387,388],{"class":76},"type ",[59,390,391],{"class":69},"===",[59,393,100],{"class":69},[59,395,396],{"class":103},"constant_rate",[59,398,107],{"class":69},[59,400,401],{"class":76},")",[59,403,110],{"class":69},[59,405,406,409,412,415,417,419,421,423,425,428,431,433,436,439,442,445],{"class":61,"line":246},[59,407,408],{"class":65},"if",[59,410,411],{"class":76}," (test",[59,413,414],{"class":69},"?.",[59,416,388],{"class":76},[59,418,391],{"class":69},[59,420,100],{"class":69},[59,422,396],{"class":103},[59,424,107],{"class":69},[59,426,427],{"class":69}," &&",[59,429,430],{"class":76}," test",[59,432,278],{"class":69},[59,434,435],{"class":76},"static_level ",[59,437,438],{"class":69},"!==",[59,440,441],{"class":69}," undefined",[59,443,444],{"class":76},") ",[59,446,447],{"class":69},"{\n",[59,449,451,454,457,460,463,466,469,471,473],{"class":61,"line":450},10,[59,452,453],{"class":123},"  const",[59,455,456],{"class":76}," end",[59,458,459],{"class":69}," =",[59,461,462],{"class":133}," lastReading",[59,464,373],{"class":465},"swJcz",[59,467,468],{"class":76},"test",[59,470,401],{"class":465},[59,472,140],{"class":69},[59,474,475],{"class":143}," \u002F\u002F { elapsed: 1440, depth: 52.75 }\n",[59,477,479,481,484,486,488,490,493,495,498,502,505,507,510,512],{"class":61,"line":478},11,[59,480,453],{"class":123},[59,482,483],{"class":76}," rate",[59,485,459],{"class":69},[59,487,430],{"class":76},[59,489,278],{"class":69},[59,491,492],{"class":76},"steps",[59,494,414],{"class":69},[59,496,497],{"class":465},"[",[59,499,501],{"class":500},"sbssI","0",[59,503,504],{"class":465},"]",[59,506,414],{"class":69},[59,508,509],{"class":76},"rate",[59,511,140],{"class":69},[59,513,514],{"class":143}," \u002F\u002F m³\u002Fh\n",[59,516,518,521,523,526,528,530,532],{"class":61,"line":517},12,[59,519,520],{"class":65},"  if",[59,522,288],{"class":465},[59,524,525],{"class":76},"end",[59,527,427],{"class":69},[59,529,483],{"class":76},[59,531,444],{"class":465},[59,533,447],{"class":69},[59,535,537,540,543,545,548,550,552,554,557,560,562,564,567,569,571],{"class":61,"line":536},13,[59,538,539],{"class":123},"    const",[59,541,542],{"class":76}," s",[59,544,459],{"class":69},[59,546,547],{"class":133}," calculateDrawdown",[59,549,373],{"class":465},[59,551,525],{"class":76},[59,553,278],{"class":69},[59,555,556],{"class":76},"depth",[59,558,559],{"class":69},",",[59,561,430],{"class":76},[59,563,278],{"class":69},[59,565,566],{"class":76},"static_level",[59,568,401],{"class":465},[59,570,140],{"class":69},[59,572,573],{"class":143}," \u002F\u002F 50.75 m\n",[59,575,577,580,582,584,586,588,590,592],{"class":61,"line":576},14,[59,578,579],{"class":133},"    calculateSpecificCapacity",[59,581,373],{"class":465},[59,583,509],{"class":76},[59,585,559],{"class":69},[59,587,542],{"class":76},[59,589,401],{"class":465},[59,591,140],{"class":69},[59,593,594],{"class":143}," \u002F\u002F 0.29 m²\u002Fh (Q\u002Fs)\n",[59,596,598,601,603,606,608,610,612,614],{"class":61,"line":597},15,[59,599,600],{"class":133},"    calculateUnitDrawdown",[59,602,373],{"class":465},[59,604,605],{"class":76},"s",[59,607,559],{"class":69},[59,609,483],{"class":76},[59,611,401],{"class":465},[59,613,140],{"class":69},[59,615,616],{"class":143}," \u002F\u002F 3.44 h\u002Fm² (s\u002FQ)\n",[59,618,620],{"class":61,"line":619},16,[59,621,622],{"class":69},"  }\n",[59,624,626],{"class":61,"line":625},17,[59,627,628],{"class":69},"}\n",[12,630,631,634,635,638,639,642,643,646,647,278],{},[16,632,633],{},"calculateSpecificCapacity"," and ",[16,636,637],{},"calculateUnitDrawdown"," throw a ",[16,640,641],{},"RangeError"," on a zero denominator instead of returning ",[16,644,645],{},"Infinity",". The spec lists the formulas these follow in ",[21,648,650],{"href":649},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#derived-parameters--computation-reference","Derived parameters",[12,652,653,654,657],{},"Interpreted values (transmissivity, storativity, Jacob coefficients) are not computed here; they are the analyst's result, stored in ",[16,655,656],{},"aquifer_analysis",". Read the latest one with:",[50,659,661],{"className":52,"code":660,"language":54,"meta":55,"style":55},"import { getLatestAquiferAnalysisField } from '@welldot\u002Futils';\n\ngetLatestAquiferAnalysisField(well, 'transmissivity'); \u002F\u002F m²\u002Fs, from the newest analysis that has it\n",[16,662,663,686,690],{"__ignoreMap":55},[59,664,665,667,670,673,676,678,680,682,684],{"class":61,"line":62},[59,666,66],{"class":65},[59,668,669],{"class":69}," {",[59,671,672],{"class":76}," getLatestAquiferAnalysisField",[59,674,675],{"class":69}," }",[59,677,97],{"class":65},[59,679,100],{"class":69},[59,681,104],{"class":103},[59,683,107],{"class":69},[59,685,110],{"class":69},[59,687,688],{"class":61,"line":73},[59,689,117],{"emptyLinePlaceholder":116},[59,691,692,695,698,700,702,705,707,709,711],{"class":61,"line":83},[59,693,694],{"class":133},"getLatestAquiferAnalysisField",[59,696,697],{"class":76},"(well",[59,699,559],{"class":69},[59,701,100],{"class":69},[59,703,704],{"class":103},"transmissivity",[59,706,107],{"class":69},[59,708,401],{"class":76},[59,710,140],{"class":69},[59,712,713],{"class":143}," \u002F\u002F m²\u002Fs, from the newest analysis that has it\n",[12,715,716,717,720,721,724,725,278],{},"And use them with ",[16,718,719],{},"calculateFormationLoss(jacobB, Q)"," (B·Q), ",[16,722,723],{},"calculateWellLoss(jacobC, Q)"," (C·Q²) and ",[16,726,727],{},"calculateHydraulicConductivity(T, thickness)",[33,729,731],{"id":730},"plotting-a-test","Plotting a test",[12,733,734],{},"The profiler's test charts are built from these series, and you can feed them to any chart library:",[736,737,738,751],"table",{},[739,740,741],"thead",{},[742,743,744,748],"tr",{},[745,746,747],"th",{},"Function",[745,749,750],{},"Returns",[752,753,754,778,791,801,811],"tbody",{},[742,755,756,762],{},[757,758,759],"td",{},[16,760,761],{},"availablePumpingCharts(event)",[757,763,764,765,768,769,768,772,768,775,278],{},"Which plots the event has data for: ",[16,766,767],{},"hydrograph",", ",[16,770,771],{},"semilog",[16,773,774],{},"recovery",[16,776,777],{},"stepTest",[742,779,780,785],{},[757,781,782],{},[16,783,784],{},"pumpingTimeline(event)",[757,786,787,788,278],{},"Every step and recovery reading on one test clock, with drawdown from the static level: ",[16,789,790],{},"{ staticLevel, steps, pumpingEnd, recovery }",[742,792,793,798],{},[757,794,795],{},[16,796,797],{},"semilogDrawdownSeries(event)",[757,799,800],{},"Drawdown against log time per step, for a Cooper-Jacob plot.",[742,802,803,808],{},[757,804,805],{},[16,806,807],{},"theisRecoverySeries(event)",[757,809,810],{},"Residual drawdown against t\u002Ft′, for a Theis recovery plot.",[742,812,813,818],{},[757,814,815],{},[16,816,817],{},"stepTestSeries(event)",[757,819,820],{},"Drawdown, s\u002FQ and Q\u002Fs at the end of each step, for a step-drawdown plot.",[50,822,824],{"className":52,"code":823,"language":54,"meta":55,"style":55},"import { availablePumpingCharts, semilogDrawdownSeries } from '@welldot\u002Futils';\n\navailablePumpingCharts(test); \u002F\u002F ['hydrograph', 'semilog', 'recovery']\nsemilogDrawdownSeries(test)[0];\n\u002F\u002F { step: 0, rate: 14.76, points: [{ elapsed: 1, drawdown: 27.91 }, …] }\n",[16,825,826,852,856,869,883],{"__ignoreMap":55},[59,827,828,830,832,835,837,840,842,844,846,848,850],{"class":61,"line":62},[59,829,66],{"class":65},[59,831,669],{"class":69},[59,833,834],{"class":76}," availablePumpingCharts",[59,836,559],{"class":69},[59,838,839],{"class":76}," semilogDrawdownSeries",[59,841,675],{"class":69},[59,843,97],{"class":65},[59,845,100],{"class":69},[59,847,104],{"class":103},[59,849,107],{"class":69},[59,851,110],{"class":69},[59,853,854],{"class":61,"line":73},[59,855,117],{"emptyLinePlaceholder":116},[59,857,858,861,864,866],{"class":61,"line":83},[59,859,860],{"class":133},"availablePumpingCharts",[59,862,863],{"class":76},"(test)",[59,865,140],{"class":69},[59,867,868],{"class":143}," \u002F\u002F ['hydrograph', 'semilog', 'recovery']\n",[59,870,871,874,877,879,881],{"class":61,"line":91},[59,872,873],{"class":133},"semilogDrawdownSeries",[59,875,876],{"class":76},"(test)[",[59,878,501],{"class":500},[59,880,504],{"class":76},[59,882,110],{"class":69},[59,884,885],{"class":61,"line":113},[59,886,887],{"class":143},"\u002F\u002F { step: 0, rate: 14.76, points: [{ elapsed: 1, drawdown: 27.91 }, …] }\n",[12,889,890,891,768,894,768,897,768,900,768,903,278],{},"Smaller helpers for tables: ",[16,892,893],{},"allStepReadings",[16,895,896],{},"stepRate",[16,898,899],{},"recoveryReadingsCount",[16,901,902],{},"stepHasReadings",[16,904,905],{},"derivedStepDuration",[33,907,909],{"id":908},"pumps-and-levels-together","Pumps and levels together",[50,911,913],{"className":52,"code":912,"language":54,"meta":55,"style":55},"import {\n  calculateSubmergence,\n  getCurrentPump,\n  getPumpInstalledAt,\n} from '@welldot\u002Futils';\n\ngetCurrentPump(well)?.intake_depth; \u002F\u002F the installation without removed_at\ngetPumpInstalledAt(well, '2019-05-20T08:00:00-03:00'); \u002F\u002F the pump in place at that instant\ncalculateSubmergence(well); \u002F\u002F intake depth minus dynamic level; negative = intake above water\n",[16,914,915,921,928,935,942,956,960,977,1000],{"__ignoreMap":55},[59,916,917,919],{"class":61,"line":62},[59,918,66],{"class":65},[59,920,70],{"class":69},[59,922,923,926],{"class":61,"line":73},[59,924,925],{"class":76},"  calculateSubmergence",[59,927,80],{"class":69},[59,929,930,933],{"class":61,"line":83},[59,931,932],{"class":76},"  getCurrentPump",[59,934,80],{"class":69},[59,936,937,940],{"class":61,"line":91},[59,938,939],{"class":76},"  getPumpInstalledAt",[59,941,80],{"class":69},[59,943,944,946,948,950,952,954],{"class":61,"line":113},[59,945,94],{"class":69},[59,947,97],{"class":65},[59,949,100],{"class":69},[59,951,104],{"class":103},[59,953,107],{"class":69},[59,955,110],{"class":69},[59,957,958],{"class":61,"line":120},[59,959,117],{"emptyLinePlaceholder":116},[59,961,962,965,967,969,972,974],{"class":61,"line":147},[59,963,964],{"class":133},"getCurrentPump",[59,966,137],{"class":76},[59,968,414],{"class":69},[59,970,971],{"class":76},"intake_depth",[59,973,140],{"class":69},[59,975,976],{"class":143}," \u002F\u002F the installation without removed_at\n",[59,978,979,982,984,986,988,991,993,995,997],{"class":61,"line":233},[59,980,981],{"class":133},"getPumpInstalledAt",[59,983,697],{"class":76},[59,985,559],{"class":69},[59,987,100],{"class":69},[59,989,990],{"class":103},"2019-05-20T08:00:00-03:00",[59,992,107],{"class":69},[59,994,401],{"class":76},[59,996,140],{"class":69},[59,998,999],{"class":143}," \u002F\u002F the pump in place at that instant\n",[59,1001,1002,1005,1007,1009],{"class":61,"line":246},[59,1003,1004],{"class":133},"calculateSubmergence",[59,1006,137],{"class":76},[59,1008,140],{"class":69},[59,1010,1011],{"class":143}," \u002F\u002F intake depth minus dynamic level; negative = intake above water\n",[33,1013,1015],{"id":1014},"data-logger-series","Data logger series",[12,1017,1018,1021,1022,1027,1028,278],{},[16,1019,1020],{},"logger_series"," events hold continuous sensor readings (",[21,1023,1025],{"href":1024},"\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#logger_series-since-v24",[16,1026,1020],{},"). They are neither tests nor static levels, so the functions above ignore them as sources of static or dynamic level. To import a logger export, see ",[21,1029,1031],{"href":1030},"\u002Futils\u002Fguides\u002Flogger-import","Logger import",[1033,1034,1035],"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 .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);}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}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}",{"title":55,"searchDepth":73,"depth":73,"links":1037},[1038,1039,1040,1041,1042,1043],{"id":35,"depth":73,"text":36},{"id":167,"depth":73,"text":168},{"id":295,"depth":73,"text":296},{"id":730,"depth":73,"text":731},{"id":908,"depth":73,"text":909},{"id":1014,"depth":73,"text":1015},"Read the current static and dynamic levels, compute drawdown and specific capacity, prepare pumping test plots and respect ledger corrections with @welldot\u002Futils.","md",{},"\u002Futils\u002Fguides\u002Fpumping-tests","---\ntitle: Water levels and pumping tests\ndescription: Read the current static and dynamic levels, compute drawdown and specific capacity, prepare pumping test plots and respect ledger corrections with @welldot\u002Futils.\n---\n\nWater levels and pumping tests live in `hydrodynamic_events`, a ledger of field records ([`hydrodynamic_events`](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#hydrodynamic_events)). The file stores what was measured: levels, rates, elapsed times. Drawdown, specific capacity and the plots are computed from those readings, never stored ([design principles](\u002Fformat\u002Fspec\u002Fv2\u002Foverview#design-principles)).\n\n## Corrections come first\n\nAn event can retract an earlier one with `corrects`. A retracted event stays in the file but must be left out of every derivation ([corrections](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#corrections-since-v23)). Every function on this page already does that. If you iterate the events yourself, start from the effective list:\n\n```ts\nimport {\n  getEffectiveHydrodynamicEvents,\n  getRetractedEventIds,\n} from '@welldot\u002Futils';\n\nconst events = getEffectiveHydrodynamicEvents(well); \u002F\u002F every event not retracted\nconst retracted = getRetractedEventIds(well); \u002F\u002F Set of retracted ids, chains included\n```\n\n## Current levels\n\n```ts\nimport {\n  getLatestPumpingDynamicLevel,\n  getLatestStaticLevel,\n  isFlowingArtesian,\n} from '@welldot\u002Futils';\n\ngetLatestStaticLevel(well); \u002F\u002F 3.94: latest static level, by UTC instant\ngetLatestPumpingDynamicLevel(well); \u002F\u002F 52.75: latest level measured while pumping\nisFlowingArtesian(well); \u002F\u002F true when the latest static level is above ground\n```\n\n- `getLatestStaticLevel` compares events by absolute instant, not by their position in the array, as the spec requires ([ordering and ties](\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#ordering-and-ties)).\n- `getLatestPumpingDynamicLevel` skips air-lift events and falls back to a newer `aquifer_analysis[].dynamic_level`.\n- A negative level is above ground. `isFlowingArtesian` is the v2.1 way to detect a flowing well, replacing the deprecated `well_type: \"artesian\"` ([level sign convention](\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference#level-sign-convention)).\n\n## Drawdown and specific capacity\n\n```ts\nimport {\n  calculateDrawdown,\n  calculateSpecificCapacity,\n  calculateUnitDrawdown,\n  lastReading,\n} from '@welldot\u002Futils';\n\nconst test = events.find(e => e.type === 'constant_rate');\nif (test?.type === 'constant_rate' && test.static_level !== undefined) {\n  const end = lastReading(test); \u002F\u002F { elapsed: 1440, depth: 52.75 }\n  const rate = test.steps?.[0]?.rate; \u002F\u002F m³\u002Fh\n  if (end && rate) {\n    const s = calculateDrawdown(end.depth, test.static_level); \u002F\u002F 50.75 m\n    calculateSpecificCapacity(rate, s); \u002F\u002F 0.29 m²\u002Fh (Q\u002Fs)\n    calculateUnitDrawdown(s, rate); \u002F\u002F 3.44 h\u002Fm² (s\u002FQ)\n  }\n}\n```\n\n`calculateSpecificCapacity` and `calculateUnitDrawdown` throw a `RangeError` on a zero denominator instead of returning `Infinity`. The spec lists the formulas these follow in [Derived parameters](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#derived-parameters--computation-reference).\n\nInterpreted values (transmissivity, storativity, Jacob coefficients) are not computed here; they are the analyst's result, stored in `aquifer_analysis`. Read the latest one with:\n\n```ts\nimport { getLatestAquiferAnalysisField } from '@welldot\u002Futils';\n\ngetLatestAquiferAnalysisField(well, 'transmissivity'); \u002F\u002F m²\u002Fs, from the newest analysis that has it\n```\n\nAnd use them with `calculateFormationLoss(jacobB, Q)` (B·Q), `calculateWellLoss(jacobC, Q)` (C·Q²) and `calculateHydraulicConductivity(T, thickness)`.\n\n## Plotting a test\n\nThe profiler's test charts are built from these series, and you can feed them to any chart library:\n\n| Function                        | Returns                                                                                                                                 |\n| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |\n| `availablePumpingCharts(event)` | Which plots the event has data for: `hydrograph`, `semilog`, `recovery`, `stepTest`.                                                    |\n| `pumpingTimeline(event)`        | Every step and recovery reading on one test clock, with drawdown from the static level: `{ staticLevel, steps, pumpingEnd, recovery }`. |\n| `semilogDrawdownSeries(event)`  | Drawdown against log time per step, for a Cooper-Jacob plot.                                                                            |\n| `theisRecoverySeries(event)`    | Residual drawdown against t\u002Ft′, for a Theis recovery plot.                                                                              |\n| `stepTestSeries(event)`         | Drawdown, s\u002FQ and Q\u002Fs at the end of each step, for a step-drawdown plot.                                                                |\n\n```ts\nimport { availablePumpingCharts, semilogDrawdownSeries } from '@welldot\u002Futils';\n\navailablePumpingCharts(test); \u002F\u002F ['hydrograph', 'semilog', 'recovery']\nsemilogDrawdownSeries(test)[0];\n\u002F\u002F { step: 0, rate: 14.76, points: [{ elapsed: 1, drawdown: 27.91 }, …] }\n```\n\nSmaller helpers for tables: `allStepReadings`, `stepRate`, `recoveryReadingsCount`, `stepHasReadings`, `derivedStepDuration`.\n\n## Pumps and levels together\n\n```ts\nimport {\n  calculateSubmergence,\n  getCurrentPump,\n  getPumpInstalledAt,\n} from '@welldot\u002Futils';\n\ngetCurrentPump(well)?.intake_depth; \u002F\u002F the installation without removed_at\ngetPumpInstalledAt(well, '2019-05-20T08:00:00-03:00'); \u002F\u002F the pump in place at that instant\ncalculateSubmergence(well); \u002F\u002F intake depth minus dynamic level; negative = intake above water\n```\n\n## Data logger series\n\n`logger_series` events hold continuous sensor readings ([`logger_series`](\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas#logger_series-since-v24)). They are neither tests nor static levels, so the functions above ignore them as sources of static or dynamic level. To import a logger export, see [Logger import](\u002Futils\u002Fguides\u002Flogger-import).\n",{"title":7,"description":1044},"utils\u002F2.guides\u002F2.pumping-tests","dXx05JJfPCAKJUCE7t3EEVv6wDUlnk6jlM_A27entx0",{"docs_en":1053,"spec":1366,"changelogs":1416},[1054,1074,1093,1149,1259,1313],{"title":1055,"path":1056,"stem":1057,"children":1058},"Ai","\u002Fai","ai",[1059,1062,1066,1070],{"title":1060,"path":1056,"stem":1061},"Introduction","ai\u002Findex",{"title":1063,"path":1064,"stem":1065},"Converting reports with an assistant","\u002Fai\u002Fconversion-skill","ai\u002Fconversion-skill",{"title":1067,"path":1068,"stem":1069},"llms.txt and Markdown pages","\u002Fai\u002Fllms","ai\u002Fllms",{"title":1071,"path":1072,"stem":1073},"MCP server","\u002Fai\u002Fmcp","ai\u002Fmcp",{"title":1075,"path":1076,"stem":1077,"children":1078},"Contributing","\u002Fcontributing","contributing",[1079,1081,1085,1089],{"title":1060,"path":1076,"stem":1080},"contributing\u002Findex",{"title":1082,"path":1083,"stem":1084},"Writing docs","\u002Fcontributing\u002Fwriting-docs","contributing\u002F1.writing-docs",{"title":1086,"path":1087,"stem":1088},"Update rules","\u002Fcontributing\u002Fupdate-rules","contributing\u002F2.update-rules",{"title":1090,"path":1091,"stem":1092},"Content components","\u002Fcontributing\u002Fcomponents","contributing\u002Fcomponents",{"title":1094,"path":1095,"stem":1096,"children":1097},"Core","\u002Fcore","core",[1098,1100,1114,1143],{"title":1060,"path":1095,"stem":1099},"core\u002Findex",{"title":1101,"path":1102,"stem":1103,"children":1104,"page":1113},"Getting Started","\u002Fcore\u002Fgetting-started","core\u002F1.getting-started",[1105,1109],{"title":1106,"path":1107,"stem":1108},"Installation","\u002Fcore\u002Fgetting-started\u002Finstallation","core\u002F1.getting-started\u002F1.installation",{"title":1110,"path":1111,"stem":1112},"First use","\u002Fcore\u002Fgetting-started\u002Ffirst-use","core\u002F1.getting-started\u002F2.first-use",false,{"title":1115,"path":1116,"stem":1117,"children":1118,"page":1113},"Guides","\u002Fcore\u002Fguides","core\u002F2.guides",[1119,1123,1127,1131,1135,1139],{"title":1120,"path":1121,"stem":1122},"Parsing and validating","\u002Fcore\u002Fguides\u002Fparsing-and-validating","core\u002F2.guides\u002F1.parsing-and-validating",{"title":1124,"path":1125,"stem":1126},"Serializing and sharing","\u002Fcore\u002Fguides\u002Fserializing-and-sharing","core\u002F2.guides\u002F2.serializing-and-sharing",{"title":1128,"path":1129,"stem":1130},"Unit conversion","\u002Fcore\u002Fguides\u002Funit-conversion","core\u002F2.guides\u002F3.unit-conversion",{"title":1132,"path":1133,"stem":1134},"Vocabularies and textures","\u002Fcore\u002Fguides\u002Fvocabularies-and-textures","core\u002F2.guides\u002F4.vocabularies-and-textures",{"title":1136,"path":1137,"stem":1138},"Water quality vocabulary","\u002Fcore\u002Fguides\u002Fwater-quality-vocabulary","core\u002F2.guides\u002F5.water-quality-vocabulary",{"title":1140,"path":1141,"stem":1142},"Versions and time zones","\u002Fcore\u002Fguides\u002Fversions-and-time-zones","core\u002F2.guides\u002F6.versions-and-time-zones",{"title":1144,"path":1145,"stem":1146,"children":1147},"API reference","\u002Fcore\u002Fapi","core\u002Fapi\u002Findex",[1148],{"title":1144,"path":1145,"stem":1146},{"title":1150,"path":1151,"stem":1152,"children":1153},"Format","\u002Fformat","format",[1154,1156,1176,1205,1229,1249,1255],{"title":1060,"path":1151,"stem":1155},"format\u002Findex",{"title":1101,"path":1157,"stem":1158,"children":1159,"page":1113},"\u002Fformat\u002Fgetting-started","format\u002F1.getting-started",[1160,1164,1168,1172],{"title":1161,"path":1162,"stem":1163},"What is .well?","\u002Fformat\u002Fgetting-started\u002Fwhat-is-well","format\u002F1.getting-started\u002F1.what-is-well",{"title":1165,"path":1166,"stem":1167},"For geologists","\u002Fformat\u002Fgetting-started\u002Ffor-geologists","format\u002F1.getting-started\u002F2.for-geologists",{"title":1169,"path":1170,"stem":1171},"For developers","\u002Fformat\u002Fgetting-started\u002Ffor-developers","format\u002F1.getting-started\u002F3.for-developers",{"title":1173,"path":1174,"stem":1175},"Your first .well file","\u002Fformat\u002Fgetting-started\u002Ffirst-well-file","format\u002F1.getting-started\u002F4.first-well-file",{"title":1177,"path":1178,"stem":1179,"children":1180,"page":1113},"Concepts","\u002Fformat\u002Fconcepts","format\u002F2.concepts",[1181,1185,1189,1193,1197,1201],{"title":1182,"path":1183,"stem":1184},"Depths and intervals","\u002Fformat\u002Fconcepts\u002Fdepths-and-intervals","format\u002F2.concepts\u002F1.depths-and-intervals",{"title":1186,"path":1187,"stem":1188},"Units and precision","\u002Fformat\u002Fconcepts\u002Funits-and-precision","format\u002F2.concepts\u002F2.units-and-precision",{"title":1190,"path":1191,"stem":1192},"Vocabularies","\u002Fformat\u002Fconcepts\u002Fvocabularies","format\u002F2.concepts\u002F3.vocabularies",{"title":1194,"path":1195,"stem":1196},"Profiles","\u002Fformat\u002Fconcepts\u002Fprofiles","format\u002F2.concepts\u002F4.profiles",{"title":1198,"path":1199,"stem":1200},"Versions and deprecation","\u002Fformat\u002Fconcepts\u002Fversions-and-deprecation","format\u002F2.concepts\u002F5.versions-and-deprecation",{"title":1202,"path":1203,"stem":1204},"Extensibility","\u002Fformat\u002Fconcepts\u002Fextensibility","format\u002F2.concepts\u002F6.extensibility",{"title":1115,"path":1206,"stem":1207,"children":1208,"page":1113},"\u002Fformat\u002Fguides","format\u002F3.guides",[1209,1213,1217,1221,1225],{"title":1210,"path":1211,"stem":1212},"Writing a .well by hand","\u002Fformat\u002Fguides\u002Fwriting-by-hand","format\u002F3.guides\u002F1.writing-by-hand",{"title":1214,"path":1215,"stem":1216},"Converting a report","\u002Fformat\u002Fguides\u002Fconverting-a-report","format\u002F3.guides\u002F2.converting-a-report",{"title":1218,"path":1219,"stem":1220},"Validating","\u002Fformat\u002Fguides\u002Fvalidating","format\u002F3.guides\u002F3.validating",{"title":1222,"path":1223,"stem":1224},"Extending for your own needs","\u002Fformat\u002Fguides\u002Fextending","format\u002F3.guides\u002F4.extending",{"title":1226,"path":1227,"stem":1228},"Building an editor or database on .well","\u002Fformat\u002Fguides\u002Fbuilding-on-well","format\u002F3.guides\u002F5.building-on-well",{"title":1230,"path":1231,"stem":1232,"children":1233},"Overview","\u002Fformat\u002Freference","format\u002F4.reference\u002Findex",[1234,1235,1239,1243],{"title":1230,"path":1231,"stem":1232},{"title":1236,"path":1237,"stem":1238},"JSON Schema","\u002Fformat\u002Freference\u002Fjson-schema","format\u002F4.reference\u002F1.json-schema",{"title":1240,"path":1241,"stem":1242},"Example wells","\u002Fformat\u002Freference\u002Fexamples","format\u002F4.reference\u002F2.examples",{"title":1244,"path":1245,"stem":1246,"children":1247},"Object reference","\u002Fformat\u002Freference\u002Fobjects","format\u002Freference\u002Fobjects\u002Findex",[1248],{"title":1244,"path":1245,"stem":1246},{"title":1250,"path":1251,"stem":1252,"children":1253},"About the spec","\u002Fformat\u002Fspec","format\u002F5.spec\u002Findex",[1254],{"title":1250,"path":1251,"stem":1252},{"title":1256,"path":1257,"stem":1258},"Changelog","\u002Fformat\u002Fchangelog","format\u002F6.changelog",{"title":1260,"path":1261,"stem":1262,"children":1263},"Render","\u002Frender","render",[1264,1266,1276,1308],{"title":1060,"path":1261,"stem":1265},"render\u002Findex",{"title":1101,"path":1267,"stem":1268,"children":1269,"page":1113},"\u002Frender\u002Fgetting-started","render\u002F1.getting-started",[1270,1273],{"title":1106,"path":1271,"stem":1272},"\u002Frender\u002Fgetting-started\u002Finstallation","render\u002F1.getting-started\u002F1.installation",{"title":1110,"path":1274,"stem":1275},"\u002Frender\u002Fgetting-started\u002Ffirst-use","render\u002F1.getting-started\u002F2.first-use",{"title":1115,"path":1277,"stem":1278,"children":1279,"page":1113},"\u002Frender\u002Fguides","render\u002F2.guides",[1280,1284,1288,1292,1296,1300,1304],{"title":1281,"path":1282,"stem":1283},"Panels and layout","\u002Frender\u002Fguides\u002Fpanels-and-layout","render\u002F2.guides\u002F1.panels-and-layout",{"title":1285,"path":1286,"stem":1287},"Layers and labels","\u002Frender\u002Fguides\u002Flayers-and-labels","render\u002F2.guides\u002F2.layers-and-labels",{"title":1289,"path":1290,"stem":1291},"Theming","\u002Frender\u002Fguides\u002Ftheming","render\u002F2.guides\u002F3.theming",{"title":1293,"path":1294,"stem":1295},"Locale and units","\u002Frender\u002Fguides\u002Flocale-and-units","render\u002F2.guides\u002F4.locale-and-units",{"title":1297,"path":1298,"stem":1299},"Legends","\u002Frender\u002Fguides\u002Flegends","render\u002F2.guides\u002F5.legends",{"title":1301,"path":1302,"stem":1303},"Zoom, pan and highlights","\u002Frender\u002Fguides\u002Finteraction","render\u002F2.guides\u002F6.interaction",{"title":1305,"path":1306,"stem":1307},"Using it in a framework","\u002Frender\u002Fguides\u002Fframeworks","render\u002F2.guides\u002F7.frameworks",{"title":1144,"path":1309,"stem":1310,"children":1311},"\u002Frender\u002Fapi","render\u002Fapi\u002Findex",[1312],{"title":1144,"path":1309,"stem":1310},{"title":1314,"path":1315,"stem":1316,"children":1317},"Utils","\u002Futils","utils",[1318,1320,1330,1361],{"title":1060,"path":1315,"stem":1319},"utils\u002Findex",{"title":1101,"path":1321,"stem":1322,"children":1323,"page":1113},"\u002Futils\u002Fgetting-started","utils\u002F1.getting-started",[1324,1327],{"title":1106,"path":1325,"stem":1326},"\u002Futils\u002Fgetting-started\u002Finstallation","utils\u002F1.getting-started\u002F1.installation",{"title":1110,"path":1328,"stem":1329},"\u002Futils\u002Fgetting-started\u002Ffirst-use","utils\u002F1.getting-started\u002F2.first-use",{"title":1115,"path":1331,"stem":1332,"children":1333,"page":1113},"\u002Futils\u002Fguides","utils\u002F2.guides",[1334,1338,1339,1343,1347,1351,1353,1357],{"title":1335,"path":1336,"stem":1337},"Geometry and volumes","\u002Futils\u002Fguides\u002Fgeometry-and-volumes","utils\u002F2.guides\u002F1.geometry-and-volumes",{"title":7,"path":1047,"stem":1050},{"title":1340,"path":1341,"stem":1342},"Permits","\u002Futils\u002Fguides\u002Fpermits","utils\u002F2.guides\u002F3.permits",{"title":1344,"path":1345,"stem":1346},"Operation and production","\u002Futils\u002Fguides\u002Foperation","utils\u002F2.guides\u002F4.operation",{"title":1348,"path":1349,"stem":1350},"Water quality","\u002Futils\u002Fguides\u002Fwater-quality","utils\u002F2.guides\u002F5.water-quality",{"title":1031,"path":1030,"stem":1352},"utils\u002F2.guides\u002F6.logger-import",{"title":1354,"path":1355,"stem":1356},"SIAGAS import","\u002Futils\u002Fguides\u002Fsiagas-import","utils\u002F2.guides\u002F7.siagas-import",{"title":1358,"path":1359,"stem":1360},"Formatting","\u002Futils\u002Fguides\u002Fformatting","utils\u002F2.guides\u002F8.formatting",{"title":1144,"path":1362,"stem":1363,"children":1364},"\u002Futils\u002Fapi","utils\u002Fapi\u002Findex",[1365],{"title":1144,"path":1362,"stem":1363},[1367],{"title":1150,"path":1151,"stem":1152,"children":1368,"page":1113},[1369],{"title":1370,"path":1251,"stem":1371,"children":1372,"page":1113},"Spec","format\u002Fspec",[1373,1382,1391],{"title":1374,"path":1375,"stem":1376,"children":1377,"page":1113},"Reference","\u002Fformat\u002Fspec\u002Freference","format\u002Fspec\u002Freference",[1378],{"title":1379,"path":1380,"stem":1381},"FGDC Texture Patterns Reference","\u002Fformat\u002Fspec\u002Freference\u002Ffgdc-textures","format\u002Fspec\u002Freference\u002Ffgdc-textures",{"title":1383,"path":1384,"stem":1385,"children":1386,"page":1113},"V1","\u002Fformat\u002Fspec\u002Fv1","format\u002Fspec\u002Fv1",[1387],{"title":1388,"path":1389,"stem":1390},".well File Format Specification","\u002Fformat\u002Fspec\u002Fv1\u002Fwell-format","format\u002Fspec\u002Fv1\u002Fwell-format",{"title":1392,"path":1393,"stem":1394,"children":1395,"page":1113},"V2","\u002Fformat\u002Fspec\u002Fv2","format\u002Fspec\u002Fv2",[1396,1400,1404,1408,1412],{"title":1397,"path":1398,"stem":1399},".well File Format Specification — Version 2.4: Format Reference","\u002Fformat\u002Fspec\u002Fv2\u002Fformat-reference","format\u002Fspec\u002Fv2\u002Fformat-reference",{"title":1401,"path":1402,"stem":1403},".well File Format Specification — Version 2.4: Interoperability","\u002Fformat\u002Fspec\u002Fv2\u002Finteroperability","format\u002Fspec\u002Fv2\u002Finteroperability",{"title":1405,"path":1406,"stem":1407},".well File Format Specification — Version 2.4: Object Schemas","\u002Fformat\u002Fspec\u002Fv2\u002Fobject-schemas","format\u002Fspec\u002Fv2\u002Fobject-schemas",{"title":1409,"path":1410,"stem":1411},".well File Format Specification — Version 2.4: Overview","\u002Fformat\u002Fspec\u002Fv2\u002Foverview","format\u002Fspec\u002Fv2\u002Foverview",{"title":1413,"path":1414,"stem":1415},".well File Format Specification — Version 2.4: Water Quality","\u002Fformat\u002Fspec\u002Fv2\u002Fwater-quality","format\u002Fspec\u002Fv2\u002Fwater-quality",[1417,1423,1429],{"title":1094,"path":1095,"stem":1096,"children":1418,"page":1113},[1419],{"title":1420,"path":1421,"stem":1422},"@welldot\u002Fcore","\u002Fcore\u002Fchangelog","core\u002FCHANGELOG",{"title":1260,"path":1261,"stem":1262,"children":1424,"page":1113},[1425],{"title":1426,"path":1427,"stem":1428},"@welldot\u002Frender","\u002Frender\u002Fchangelog","render\u002FCHANGELOG",{"title":1314,"path":1315,"stem":1316,"children":1430,"page":1113},[1431],{"title":104,"path":1432,"stem":1433},"\u002Futils\u002Fchangelog","utils\u002FCHANGELOG",1793050495136]