tbonds implemented - sphere - GPU-based 3D discrete element method algorithm wi… | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 8867571c13d59a247c6d0d25952de35c6c76780e | |
parent 5faec4ff3c0ddf053fb718331e0e4de1f6492537 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Fri, 25 Jan 2013 15:32:16 +0100 | |
bonds implemented | |
Diffstat: | |
M python/sphere.py | 48 ++++++++++++++++++++++++-----… | |
1 file changed, 37 insertions(+), 11 deletions(-) | |
--- | |
diff --git a/python/sphere.py b/python/sphere.py | |
t@@ -99,6 +99,8 @@ class Spherebin: | |
self.w_force = numpy.zeros(self.nw, dtype=numpy.float64) | |
self.w_devs = numpy.zeros(self.nw, dtype=numpy.float64) | |
+ self.nb0 = numpy.zeros(1, dtype=numpy.uint32) | |
+ | |
def __cmp__(self, other): | |
""" Called when to Spherebin objects are compared. | |
Returns 0 if the values are identical """ | |
t@@ -152,7 +154,8 @@ class Spherebin: | |
(self.w_force == other.w_force).all() and\ | |
(self.w_devs == other.w_devs).all() and\ | |
self.gamma_wn == other.gamma_wn and\ | |
- self.gamma_wt == other.gamma_wt\ | |
+ self.gamma_wt == other.gamma_wt and\ | |
+ self.nb0 == other.nb0\ | |
).all() == True): | |
return 0 # All equal | |
else : | |
t@@ -174,9 +177,9 @@ class Spherebin: | |
self.np = numpy.fromfile(fh, dtype=numpy.uint32, count=1) | |
# Read the time variables | |
- self.time_dt = numpy.fromfile(fh, dtype=numpy.float64, coun… | |
+ self.time_dt = numpy.fromfile(fh, dtype=numpy.float64, cou… | |
self.time_current = numpy.fromfile(fh, dtype=numpy.float64, cou… | |
- self.time_total = numpy.fromfile(fh, dtype=numpy.float64, c… | |
+ self.time_total = numpy.fromfile(fh, dtype=numpy.float64, cou… | |
self.time_file_dt = numpy.fromfile(fh, dtype=numpy.float64, cou… | |
self.time_step_count = numpy.fromfile(fh, dtype=numpy.uint32, coun… | |
t@@ -191,9 +194,9 @@ class Spherebin: | |
self.angvel = numpy.zeros(self.np*self.nd, dtype=numpy.float64).r… | |
self.torque = numpy.zeros(self.np*self.nd, dtype=numpy.float64).r… | |
self.es_dot = numpy.zeros(self.np, dtype=numpy.float64) | |
- self.es = numpy.zeros(self.np, dtype=numpy.float64) | |
+ self.es = numpy.zeros(self.np, dtype=numpy.float64) | |
self.ev_dot = numpy.zeros(self.np, dtype=numpy.float64) | |
- self.ev = numpy.zeros(self.np, dtype=numpy.float64) | |
+ self.ev = numpy.zeros(self.np, dtype=numpy.float64) | |
self.p = numpy.zeros(self.np, dtype=numpy.float64) | |
# Read remaining data from binary | |
t@@ -267,8 +270,12 @@ class Spherebin: | |
self.w_force[i] = numpy.fromfile(fh, dtype=numpy.float64, coun… | |
self.w_devs[i] = numpy.fromfile(fh, dtype=numpy.float64, coun… | |
- | |
- fh.close() | |
+ # Inter-particle bonds | |
+ self.nb0 = numpy.fromfile(fh, dtype=numpy.uint32, count=1) | |
+ self.bonds = numpy.zeros((self.nb0, 2), dtype=numpy.uint32) | |
+ for i in range(self.nb0): | |
+ self.bonds[i,0] = numpy.fromfile(fh, dtype=numpy.uint32, count… | |
+ self.bonds[i,1] = numpy.fromfile(fh, dtype=numpy.uint32, count… | |
finally: | |
if fh is not None: | |
t@@ -359,7 +366,10 @@ class Spherebin: | |
fh.write(self.w_force[i].astype(numpy.float64)) | |
fh.write(self.w_devs[i].astype(numpy.float64)) | |
- fh.close() | |
+ fh.write(self.nb0.astype(numpy.uint32)) | |
+ for i in range(self.nb0): | |
+ fh.write(self.bonds[i,0].astype(numpy.uint32)) | |
+ fh.write(self.bonds[i,1].astype(numpy.uint32)) | |
finally: | |
if fh is not None: | |
t@@ -453,7 +463,6 @@ class Spherebin: | |
from the particle boundaries. | |
""" | |
- | |
# Cell configuration | |
cellsize_min = 2.1 * numpy.amax(self.radius) | |
self.num[0] = numpy.ceil((self.L[0]-self.origo[0])/cellsize_min) | |
t@@ -471,7 +480,7 @@ class Spherebin: | |
# Generate grid based on particle positions | |
def initGridAndWorldsize(self, g = numpy.array([0.0, 0.0, -9.80665]), | |
- margin = numpy.array([2.0, 2.0, 2.0]), | |
+ margin = 2.0, | |
periodic = 1, | |
contactmodel = 2): | |
""" Initialize grid suitable for the particle positions set previously. | |
t@@ -505,6 +514,10 @@ class Spherebin: | |
self.contactmodel[0] = contactmodel | |
+ # Put upper wall at top boundary | |
+ if (self.nw > 0): | |
+ self.w_x[0] = self.L[0] | |
+ | |
# Initialize particle positions to regular, grid-like, non-overlapping con… | |
def initGridPos(self, g = numpy.array([0.0, 0.0, -9.80665]), | |
t@@ -753,7 +766,7 @@ class Spherebin: | |
def initTemporal(self, total, | |
current = 0.0, | |
- file_dt = 0.01, | |
+ file_dt = 0.05, | |
step_count = 0): | |
""" Set temporal parameters for the simulation. | |
Particle radii and physical parameters need to be set | |
t@@ -854,6 +867,19 @@ class Spherebin: | |
# Debonding distance | |
self.db[0] = (1.0 + theta/2.0) * self.V_b**(1.0/3.0) | |
+ | |
+ def bond(self, i, j): | |
+ """ Create a bond between particles i and j """ | |
+ | |
+ if (hasattr(self, 'bonds') == False): | |
+ self.bonds = numpy.array([[i,j]], dtype=numpy.uint32) | |
+ else : | |
+ self.bonds = numpy.vstack((bonds, [i,j])) | |
+ | |
+ # Increment the number of bonds with one | |
+ self.nb0 += 1 | |
+ | |
+ | |
def energy(self, method): | |
""" Calculate the sum of the energy components of all particles. | |
""" |