|
| 1 | +""" |
| 2 | +Impact of roughness on effective drawdown on anti-persistent fields |
| 3 | +=================================================================== |
| 4 | +
|
| 5 | +When the field roughness approaches zero, the drawdown approaches |
| 6 | +the homogeneous solution for the geometric mean transmissivity. |
| 7 | +""" |
| 8 | + |
| 9 | +import numpy as np |
| 10 | +from matplotlib import pyplot as plt |
| 11 | + |
| 12 | +import anaflow as af |
| 13 | + |
| 14 | +min_s = 60 |
| 15 | +hour_s = min_s * 60 |
| 16 | +day_s = hour_s * 24 |
| 17 | + |
| 18 | + |
| 19 | +def dashes(i=1, max_n=12, width=1): |
| 20 | + return i * [width, width] + [max_n * 2 * width - 2 * i * width, width] |
| 21 | + |
| 22 | + |
| 23 | +time_labels = ["10 s", "30 min", "steady\nshape"] |
| 24 | +time = [10, 30 * min_s, 10 * day_s] # 10s, 30min, 10d |
| 25 | +rad = np.geomspace(0.05, 4) # radius from the pumping well in [0, 4] |
| 26 | + |
| 27 | +TG = 1e-4 # the geometric mean of the transmissivity |
| 28 | +var = 2.25 # variance of the log-transmissivity |
| 29 | +len_scale = 10 # correlation length of the log-transmissivity |
| 30 | + |
| 31 | +# different roughness values from very rough to very smooth |
| 32 | +rough = [0.01, 0.1, 0.25, 0.5, 1.0] |
| 33 | +S = 1e-4 # storativity |
| 34 | +rate = -1e-4 # pumping rate |
| 35 | +heads = [] |
| 36 | +hom_theis = af.theis(time, rad, S, TG, rate=rate) |
| 37 | +ext_theis = af.ext_theis_2d( |
| 38 | + time, rad, S, TG, var, len_scale / np.sqrt(np.pi) * 2, rate=rate |
| 39 | +) |
| 40 | + |
| 41 | +for roughness in rough: |
| 42 | + # rescale to constant integral scale |
| 43 | + ln = len_scale / (roughness * np.sqrt(np.pi) / (2 * roughness + 2.0)) |
| 44 | + # ln = len_scale |
| 45 | + heads.append( |
| 46 | + af.ext_theis_int(time, rad, S, TG, var, ln, roughness, rate=rate, parts=50) |
| 47 | + ) |
| 48 | + |
| 49 | +time_ticks = [] |
| 50 | +for i, step in enumerate(time): |
| 51 | + for j, roughness in enumerate(rough): |
| 52 | + label = ( |
| 53 | + r"Theis$^{Int}_{CG}(\nu=" + f"{roughness:.4})$" |
| 54 | + if i == len(time) - 1 |
| 55 | + else None |
| 56 | + ) |
| 57 | + plt.plot( |
| 58 | + rad, |
| 59 | + heads[j][i], |
| 60 | + label=label, |
| 61 | + color=f"C0", |
| 62 | + dashes=dashes(j), |
| 63 | + alpha=(1 + i) / len(time), |
| 64 | + ) |
| 65 | + time_ticks.append(hom_theis[i][-1]) |
| 66 | + label = "Theis($T_G$)" if i == len(time) - 1 else None |
| 67 | + plt.plot(rad, hom_theis[i], label=label, color="k") # , dashes=dashes(1)) |
| 68 | + |
| 69 | + |
| 70 | +plt.title( |
| 71 | + f"$T_G=1$ cm²/s, $\\sigma^2={var}$, $\\ell={len_scale}$ m, $S={S}$, $Q={-rate*1000}$ L/s" |
| 72 | +) |
| 73 | +plt.xlabel("r / m") |
| 74 | +plt.ylabel("h / m") |
| 75 | +plt.grid() |
| 76 | +plt.legend() |
| 77 | +plt.gca().locator_params(tight=True, nbins=5) |
| 78 | +plt.gca().set_ylim([-3.2, 0.1]) |
| 79 | +plt.gca().set_xlim([0, rad[-1]]) |
| 80 | +ylim = plt.gca().get_ylim() |
| 81 | +ax2 = plt.gca().twinx() |
| 82 | +ax2.set_yticks(time_ticks) |
| 83 | +ax2.set_yticklabels(time_labels) |
| 84 | +ax2.set_ylim(ylim) |
| 85 | +plt.tight_layout() |
| 86 | +plt.show() |
0 commit comments