Introduction
Introduction Statistics Contact Development Disclaimer Help
tvarious fixes, advection instability present - granular-channel-hydro - subgla…
git clone git://src.adamsgaard.dk/granular-channel-hydro
Log
Files
Refs
README
LICENSE
---
commit cdd2e02befacebb825dd8718658f44c28fe27e82
parent b927f7b0194424fbefffb922391b0d999459702a
Author: Anders Damsgaard Christensen <[email protected]>
Date: Wed, 1 Feb 2017 16:41:32 -0800
various fixes, advection instability present
Diffstat:
M 1d-test.py | 46 ++++++++++-------------------…
1 file changed, 14 insertions(+), 32 deletions(-)
---
diff --git a/1d-test.py b/1d-test.py
t@@ -39,8 +39,7 @@ m_dot = 5.79e-5
# Walder and Fowler 1994 sediment transport parameters
K_e = 0.1 # Erosion constant [-], disabled when 0.0
-#K_d = 6. # Deposition constant [-], disabled when 0.0
-K_d = 0.0 # Deposition constant [-], disabled when 0.0
+K_d = 6.0 # Deposition constant [-], disabled when 0.0
#D50 = 1e-3 # Median grain size [m]
#tau_c = 0.5*g*(rho_s - rho_i)*D50 # Critical shear stress for transport
d15 = 1e-3 # Characteristic grain size [m]
t@@ -62,21 +61,20 @@ c_2 = 4.60 # [m]
S_min = 1e-1
-
## Initialize model arrays
# Node positions, terminus at Ls
s = numpy.linspace(0., Ls, Ns)
ds = s[1:] - s[:-1]
# Ice thickness and bed topography
-#H = 6.*(numpy.sqrt(Ls - s + 5e3) - numpy.sqrt(5e3)) + 1.0
+H = 6.*(numpy.sqrt(Ls - s + 5e3) - numpy.sqrt(5e3)) + 1.0 # max: 1.5 km
+#H = 1.*(numpy.sqrt(Ls - s + 5e3) - numpy.sqrt(5e3)) + 1.0 # max: 255 m
#H = 0.6*(numpy.sqrt(Ls - s + 5e3) - numpy.sqrt(5e3)) + 1.0
-H = 1.*(numpy.sqrt(Ls - s + 5e3) - numpy.sqrt(5e3)) + 1.0
b = numpy.zeros_like(H)
N = H*0.1*rho_i*g # Initial effective stress [Pa]
-p_w = rho_i*g*H - N # Water pressure [Pa], here at floatation
-hydro_pot = rho_w*g*b + p_w # Hydraulic potential [Pa]
+p_w = rho_i*g*H - N # Initial guess of water pressure [Pa]
+hydro_pot = rho_w*g*b + p_w # Initial guess of hydraulic potential [Pa]
# Initialize arrays for channel segments between nodes
S = numpy.ones(len(s) - 1)*S_min # Cross-sectional area of channel segments[m^…
t@@ -131,12 +129,10 @@ def channel_deposition_rate(tau, c_bar, d_dot, Ns):
c_bar[ix] = 0.
d_dot[ix] = 0.
else:
- c_bar[ix] = (e_dot[ix - 1] - d_dot[ix - 1])*dt
+ c_bar[ix] = (e_dot[ix - 1] - d_dot[ix - 1])*dt # Net erosion upstr.
d_dot[ix] = channel_deposition_rate_kernel(tau, c_bar, ix)
-
return d_dot, c_bar
-
def channel_growth_rate(e_dot, d_dot, porosity, W):
# Damsgaard et al, in prep
return (e_dot - d_dot)/porosity*W
t@@ -206,9 +202,7 @@ def pressure_solver(psi, F, Q, S):
raise Exception('t = {}, step = {}:'.format(time, step) +
'Iterative solution not found for P_c')
it += 1
- #import ipdb; ipdb.set_trace()
- #import ipdb; ipdb.set_trace()
return P_c
def plot_state(step, time):
t@@ -219,7 +213,7 @@ def plot_state(step, time):
ax_Pa = plt.subplot(2, 1, 1) # axis with Pascals as y-axis unit
ax_Pa.plot(s_c/1000., P_c/1000., '--r', label='$P_c$')
- ax_m3s = ax_Pa.twinx() # axis with meters as y-axis unit
+ ax_m3s = ax_Pa.twinx() # axis with m3/s as y-axis unit
ax_m3s.plot(s_c/1000., Q, '-b', label='$Q$')
plt.title('Day: {:.3}'.format(time/(60.*60.*24.)))
t@@ -229,8 +223,10 @@ def plot_state(step, time):
ax_m3s.set_ylabel('[m$^3$/s]')
ax_m = plt.subplot(2, 1, 2, sharex=ax_Pa)
- ax_m.plot(s_c/1000., S, '-k', label='$S$')
- ax_m.plot(s_c/1000., S_max, '--k', label='$S_{max}$')
+ #ax_m.plot(s_c/1000., S, '-k', label='$S$')
+ #ax_m.plot(s_c/1000., S_max, '--k', label='$S_{max}$')
+ ax_m.semilogy(s_c/1000., S, '-k', label='$S$')
+ ax_m.semilogy(s_c/1000., S_max, '--k', label='$S_{max}$')
ax_ms = ax_m.twinx()
ax_ms.plot(s_c/1000., e_dot, '--r', label='$\dot{e}$')
t@@ -256,7 +252,8 @@ def find_new_timestep(ds, Q, S):
dt = safety*numpy.minimum(60.*60.*24., numpy.min(numpy.abs(ds/(Q*S))))
if dt < 1.0:
- raise Exception('Error: Time step less than 1 second at time '
+ raise Exception('Error: Time step less than 1 second at step '
+ + '{}, time '.format(step)
+ '{:.3} s/{:.3} d'.format(time, time/(60.*60.*24.)))
return dt
t@@ -268,28 +265,23 @@ def print_status_to_stdout(time, dt):
s_c = avg_midpoint(s) # Channel section midpoint coordinates [m]
-## Initialization
# Find gradient in hydraulic potential between the nodes
hydro_pot_grad = gradient(hydro_pot, s)
# Find field values at the middle of channel segments
N_c = avg_midpoint(N)
-#P_c = avg_midpoint(P)
H_c = avg_midpoint(N)
# Find fluxes in channel segments [m^3/s]
Q = channel_water_flux(S, hydro_pot_grad)
# Water-pressure gradient from geometry [Pa/m]
-#psi = -rho_i*g*gradient(H, s) - (rho_w - rho_i)*g*gradient(b, s)
psi = -rho_i*g*gradient(H, s) - (rho_w - rho_i)*g*gradient(b, s)
# Prepare figure object for plotting during the simulation
fig = plt.figure('channel')
plot_state(-1, 0.0)
-#import ipdb; ipdb.set_trace()
-
## Time loop
time = 0.; step = 0
t@@ -302,12 +294,9 @@ while time <= t_end:
# Find average shear stress from water flux for each channel segment
tau = channel_shear_stress(Q, S)
- # Find erosion rates for each channel segment
+ # Find sediment erosion and deposition rates for each channel segment
e_dot = channel_erosion_rate(tau)
- # TODO: erosion law smooth for now with tau_c = 0.
d_dot, c_bar = channel_deposition_rate(tau, c_bar, d_dot, Ns)
- # TODO: d_dot and c_bar values unreasonably high
- # Deposition disabled for now with K_d = 0.
# Determine change in channel size for each channel segment
dSdt = channel_growth_rate(e_dot, d_dot, porosity, W)
t@@ -320,21 +309,14 @@ while time <= t_end:
# meltwater production (m_dot)
Q = flux_solver(m_dot, ds)
- #import pdb; pdb.set_trace()
# Find new water pressures consistent with the flow law
P_c = pressure_solver(psi, F, Q, S)
# Find new effective pressure in channel segments
N_c = rho_i*g*H_c - P_c
- #import ipdb; ipdb.set_trace()
-
plot_state(step, time)
# Update time
time += dt
step += 1
- #print(step)
- #break
-
-print('')
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.