tAdded default values to parameters in init, added grid fitting functions - 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 5e1012c4c642e3a1e740547d141434bfebe3146d
(DIR) parent 9c3995cb20c289c1944874fb8371b84d805c9d59
(HTM) Author: Anders Damsgaard <adc@geo.au.dk>
Date: Fri, 12 Oct 2012 11:41:12 +0200
Added default values to parameters in init, added grid fitting functions
Diffstat:
M python/sphere.py | 67 +++++++++++++++++++++++++------
1 file changed, 55 insertions(+), 12 deletions(-)
---
(DIR) diff --git a/python/sphere.py b/python/sphere.py
t@@ -42,16 +42,16 @@ class Spherebin:
self.angpos = numpy.zeros(self.np*self.nd, dtype=numpy.float64).reshape(self.np,self.nd)
self.fixvel = numpy.zeros(self.np, dtype=numpy.float64)
self.xsum = numpy.zeros(self.np, dtype=numpy.float64)
- self.radius = numpy.zeros(self.np, dtype=numpy.float64)
- self.rho = numpy.zeros(self.np, dtype=numpy.float64)
- self.k_n = numpy.zeros(self.np, dtype=numpy.float64)
- self.k_t = numpy.zeros(self.np, dtype=numpy.float64)
+ self.radius = numpy.ones(self.np, dtype=numpy.float64)
+ self.rho = numpy.ones(self.np, dtype=numpy.float64)
+ self.k_n = numpy.ones(self.np, dtype=numpy.float64) * 1.16e9
+ self.k_t = numpy.ones(self.np, dtype=numpy.float64) * 1.16e9
self.k_r = numpy.zeros(self.np, dtype=numpy.float64)
self.gamma_n = numpy.zeros(self.np, dtype=numpy.float64)
self.gamma_t = numpy.zeros(self.np, dtype=numpy.float64)
self.gamma_r = numpy.zeros(self.np, dtype=numpy.float64)
- self.mu_s = numpy.zeros(self.np, dtype=numpy.float64)
- self.mu_d = numpy.zeros(self.np, dtype=numpy.float64)
+ self.mu_s = numpy.ones(self.np, dtype=numpy.float64)
+ self.mu_d = numpy.ones(self.np, dtype=numpy.float64)
self.mu_r = numpy.zeros(self.np, dtype=numpy.float64)
self.es_dot = numpy.zeros(self.np, dtype=numpy.float64)
self.ev_dot = numpy.zeros(self.np, dtype=numpy.float64)
t@@ -63,11 +63,11 @@ class Spherebin:
# Constant, single-value physical parameters
self.globalparams = numpy.zeros(1, dtype=numpy.int32)
- self.g = numpy.zeros(self.nd, dtype=numpy.float64)
+ self.g = numpy.array([0.0, 0.0, -9.80], dtype=numpy.float64)
self.kappa = numpy.zeros(1, dtype=numpy.float64)
self.db = numpy.zeros(1, dtype=numpy.float64)
self.V_b = numpy.zeros(1, dtype=numpy.float64)
- self.shearmodel = numpy.zeros(1, dtype=numpy.uint32)
+ self.shearmodel = numpy.ones(1, dtype=numpy.uint32)
# Wall data
self.nw = numpy.ones(1, dtype=numpy.uint32) * nw
t@@ -81,9 +81,9 @@ class Spherebin:
# x- and y-boundary behavior
self.periodic = numpy.zeros(1, dtype=numpy.uint32)
- self.gamma_wn = numpy.zeros(1, dtype=numpy.float64)
- self.gamma_ws = numpy.zeros(1, dtype=numpy.float64)
- self.gamma_wr = numpy.zeros(1, dtype=numpy.float64)
+ self.gamma_wn = numpy.ones(1, dtype=numpy.float64) * 1e3
+ self.gamma_ws = numpy.ones(1, dtype=numpy.float64) * 1e3
+ self.gamma_wr = numpy.ones(1, dtype=numpy.float64) * 1e3
# Read binary data
t@@ -400,6 +400,50 @@ class Spherebin:
#self.nw[0] = numpy.ones(1, dtype=numpy.uint32) * 1
self.nw = numpy.ones(1, dtype=numpy.uint32) * 1
+ # Fit cell number according to world dimensions
+ def fitNum(self):
+ """ Create cells. cellsize is increased from 2*r_max until it fits
+ the horizontal grid.
+ Call after setting self.L, self.num and self.radius
+ """
+ cellsize_min = 2.1 * numpy.amax(self.radius)
+ self.num[0] = numpy.ceil((self.L[0]-self.origo[0])/cellsize_min)
+ self.num[1] = numpy.ceil((self.L[1]-self.origo[1])/cellsize_min)
+ self.num[2] = numpy.ceil((self.L[2]-self.origo[2])/cellsize_min)
+
+
+ # Generate grid based on particle positions
+ def initGrid(self, g = numpy.array([0.0, 0.0, -9.80665]),
+ margin = numpy.array([2.0, 2.0, 2.0]),
+ periodic = 1,
+ shearmodel = 2):
+ """ Initialize grid suitable for the particle positions set previously.
+ The margin parameter adjusts the distance (in no. of max. radii)
+ from the particle boundaries.
+ """
+
+ self.g = g
+ self.periodic[0] = periodic
+
+ # Cell configuration
+ r_max = numpy.amax(self.radius)
+
+ # Max. and min. coordinates of world
+ self.origo = numpy.array([numpy.amin(self.x[:,0] - self.radius[:]),
+ numpy.amin(self.x[:,1] - self.radius[:]),
+ numpy.amin(self.x[:,2] - self.radius[:])]) \
+ - margin*r_max
+ self.L = numpy.array([numpy.amax(self.x[:,0] + self.radius[:]),
+ numpy.amax(self.x[:,1] + self.radius[:]),
+ numpy.amax(self.x[:,2] + self.radius[:])]) \
+ + margin*r_max
+
+ # Fit cell size to world dimensions
+ fitNum()
+
+ self.shearmodel[0] = shearmodel
+
+
# Initialize particle positions to regular, grid-like, non-overlapping configuration
def initGridPos(self, g = numpy.array([0.0, 0.0, -9.80665]),
gridnum = numpy.array([12, 12, 36]),
t@@ -522,7 +566,6 @@ class Spherebin:
x_max = numpy.max(self.x[:,0] + self.radius)
y_max = numpy.max(self.x[:,1] + self.radius)
z_max = numpy.max(self.x[:,2] + self.radius)
- cellsize = 2.1 * r_max
# Adjust size of world
self.num[0] = numpy.ceil(x_max/cellsize)
self.num[1] = numpy.ceil(y_max/cellsize)