Neuman sloution Moench et al. 2001#6
Neuman sloution Moench et al. 2001#6JarnoHerr wants to merge 9 commits intoGeoStat-Framework:mainfrom
Conversation
anaflow/flow/Neuman.py
Outdated
| __all__ = [] | ||
|
|
||
|
|
||
| def neuman( |
There was a problem hiding this comment.
rename to neuman_unconfined_laplace
anaflow/flow/Neuman.py
Outdated
| return res | ||
|
|
||
|
|
||
| def neuman_from_laplace( |
anaflow/flow/Neuman.py
Outdated
| Parameters | ||
| ---------- | ||
| s : :class:`numpy.ndarray` | ||
| Array with all time-points where the function should be evaluated in the Laplace space. |
There was a problem hiding this comment.
"Laplace-space-points" not "time-points"
anaflow/flow/Neuman.py
Outdated
| kz : :class:`float`, optional | ||
| Hydraulic conductivity in the vertical direction | ||
| kr : :class:`float`, optional | ||
| Hydraulic conductivity in the horizontal direction |
There was a problem hiding this comment.
actually we don't need these two values but rather a single anis (in line with other solutions) value for the anisotropy ratio kz/kr. This is named kd in the Moench paper.
anaflow/flow/Neuman.py
Outdated
| l : :class:`float`, optional | ||
| Vertical distance from initial water table to bottom | ||
| of pumped well screen |
There was a problem hiding this comment.
would rename to well_depth to be in line with welltestpy.
anaflow/flow/Neuman.py
Outdated
| d : :class:`float`, optional | ||
| Vertical distance from initial water table to top of | ||
| pumped well screen |
There was a problem hiding this comment.
Would use screen_size instead and calculate d = well_depth - screen_size to be in line with GeoStat-Framework/welltestpy#18
anaflow/flow/Neuman.py
Outdated
| rw : :class:`float`, optional | ||
| Outside radius of the pumped well screen |
There was a problem hiding this comment.
I would use the solution from Moench 1993, where infinitely small wells are assumed. I think we will run into numerical problems, that we don't have the time to solve. So I would vote for leaving rw out for now.
anaflow/flow/Neuman.py
Outdated
| Hydraulic conductivity in the vertical direction | ||
| kr : :class:`float`, optional | ||
| Hydraulic conductivity in the horizontal direction | ||
| Ss : :class:`float`, optional |
There was a problem hiding this comment.
would rename to specific_storage to be more explicit.
anaflow/flow/Neuman.py
Outdated
| time = [10, 600, 36000] # 10s, 10min, 10h | ||
| rad = np.geomspace(0.1, 10) | ||
| # default parameters | ||
| T = 1e-4 | ||
| S = 1e-4 | ||
| Q = -1e-4 | ||
|
|
||
| neu = neuman_from_laplace(time, rad, storage=S, transmissivity=T) | ||
| for i in range(len(time)): | ||
| plt.plot(rad, neu[i, :], color="C0", linestyle=":", linewidth=4) |
There was a problem hiding this comment.
Don't forget to remove this after testing.
|
Here a proposal for an even better root finder for from scipy.optimize import root_scalar
def get_f_df_df2(value=0):
"""Get target function and its first two derivatives."""
if value < 0:
raise ValueError("Neuman: epsilon for root finding needs to be >0.")
def _f_df_df2(x):
return (
np.subtract(np.multiply(x, np.tan(x)), value),
np.tan(x) + np.divide(x, np.cos(x) ** 2),
2 * (np.multiply(x, np.tan(x)) + 1.0) * np.cos(x) ** -2,
)
return _f_df_df2
def nth_root(n, v):
"""Get n-th root of x*tan(x) = v."""
x0 = np.sqrt(v) if (v < 1 and n < 1) else np.arctan(v) + n * np.pi
f = get_f_df_df2(v)
sol = root_scalar(f, x0=x0, fprime=True, fprime2=True)
if not sol.converged:
raise ValueError(f"Neuman: couldn't find {n}-th root for eps={v}")
return sol.root |
|
@JarnoHerr do you still have interest and/or time to finish this, or should I take over? Greetings! |
|
@MuellerSeb the interest is still there, but time is a bit limited at this time and I really don't want to halt the progress of the package, so you can take over. I look forward to the progress that will be made. Best Regards! |
No description provided.