timprove time step computing functionality - sphere - GPU-based 3D discrete element method algorithm with optional fluid coupling
(HTM) git clone git://src.adamsgaard.dk/sphere
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) LICENSE
---
(DIR) commit ee64f1bd2468ca535b33b83acdc78b83eacf615b
(DIR) parent 76aef1aad86deca7d2cb55dd3967abdc91ac30ba
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
Date: Thu, 6 Nov 2014 10:15:05 +0100
improve time step computing functionality
Diffstat:
M python/halfshear-darcy-starter.py | 9 +++++++--
M python/sphere.py | 37 ++++++-------------------------
2 files changed, 14 insertions(+), 32 deletions(-)
---
(DIR) diff --git a/python/halfshear-darcy-starter.py b/python/halfshear-darcy-starter.py
t@@ -34,7 +34,7 @@ sim.cleanup()
sim.adjustUpperWall()
sim.zeroKinematics()
-sim.shear(1.0/20.0)
+#sim.shear(0.0/20.0)
if fluid:
#sim.num[2] *= 2
t@@ -49,13 +49,18 @@ if fluid:
sim.beta_f[0] = mu
sim.k_c[0] = k_c
-sim.initTemporal(total = 20.0, file_dt = 0.01, epsilon=0.07)
sim.w_devs[0] = sigma0
sim.w_m[0] = numpy.abs(sigma0*sim.L[0]*sim.L[1]/sim.g[2])
+
+sim.setStiffnessNormal(36.4e9)
+sim.setStiffnessTangential(36.4e9/3.0)
sim.mu_s[0] = 0.5
sim.mu_d[0] = 0.5
sim.setDampingNormal(0.0)
sim.setDampingTangential(0.0)
+sim.deleteAllParticles()
+
+sim.initTemporal(total = 20.0, file_dt = 0.01, epsilon=0.07)
# Fix lowermost particles
#dz = sim.L[2]/sim.num[2]
(DIR) diff --git a/python/sphere.py b/python/sphere.py
t@@ -2886,7 +2886,9 @@ class sim:
if (self.np[0] > 0):
print("Warning: Manually specifying the time step length when "
+ "simulating particles may produce instabilities.")
- else:
+
+ elif self.np[0] > 0:
+
r_min = numpy.min(self.radius)
m_min = self.rho * 4.0/3.0*numpy.pi*r_min**3
k_max = numpy.max([self.k_n[:], self.k_t[:]])
t@@ -2902,36 +2904,11 @@ class sim:
# Check numerical stability of the fluid phase, by criteria derived by
# von Neumann stability analysis of the diffusion and advection terms
- if self.fluid:
+ elif self.fluid:
+ self.time_dt[0] = self.largestFluidTimeStep(safety = 0.5)
- # Cell spacing
- dx = numpy.amin((\
- self.L[0]/self.num[0],\
- self.L[1]/self.num[1],\
- self.L[2]/self.num[2]))
-
- # Diffusion term
- if (self.mu[0]*self.time_dt[0]/(dx**2) > 0.5):
- raise Exception("Error: The time step is too large to ensure "
- + "stability in the diffusive term of the fluid "
- + "momentum equation.")
-
- # Normalized velocities
- v_norm = numpy.empty(self.num[0]*self.num[1]*self.num[2])
- idx = 0
- for x in numpy.arange(self.num[0]):
- for y in numpy.arange(self.num[1]):
- for z in numpy.arange(self.num[2]):
- v_norm[idx] = numpy.sqrt(self.v_f[x,y,z,:].dot(\
- self.v_f[x,y,z,:]))
- idx += 1
-
- # Advection term. This term has to be reevaluated during the
- # computations, as the fluid velocity changes.
- if (numpy.amax(v_norm)*self.time_dt[0]/dx > 1.0):
- raise Exception("Error: The time step is too large to ensure "
- + "stability in the advective term of the fluid "
- + "momentum equation.")
+ else:
+ raise Exception('Error: Could not automatically set a time step.')
# Time at start
self.time_current[0] = current