Introduction
Introduction Statistics Contact Development Disclaimer Help
tAdded porosity() - sphere - GPU-based 3D discrete element method algorithm wit…
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit 8beff2a2d52be189c0cb1e51acdb0dfe4b560f54
parent fb36d7268c42f65243717141868a98060bbcddb2
Author: Anders Damsgaard <[email protected]>
Date: Thu, 6 Sep 2012 08:28:16 +0200
Added porosity()
Diffstat:
M python/sphere.py | 76 +++++++++++++++++++++++++++++…
1 file changed, 76 insertions(+), 0 deletions(-)
---
diff --git a/python/sphere.py b/python/sphere.py
t@@ -777,6 +777,82 @@ class Spherebin:
e = (V_t - V_s)/V_s
return e
+
+ def porosity(self, lower_corner,
+ upper_corner,
+ grid = numpy.array([10,10,10]),
+ precisionfactor = 10):
+ """ Calculate the porosity inside each grid cell.
+ Specify the lower and upper corners of the volume to evaluate.
+ A good starting point for the grid vector is self.num.
+ The precision factor determines how much precise the grid porosity is.
+ A larger value will result in better precision, but more computations …
+ """
+
+ # Cell size length
+ csl = numpy.array([(upper_corner[0]-lower_corner[0]) / grid[0], \
+ (upper_corner[1]-lower_corner[1]) / grid[1], \
+ (upper_corner[2]-lower_corner[2]) / grid[2] ])
+
+ # Create 3d vector of porosity values
+ porosity_grid = numpy.ones((grid[0], grid[1], grid[2]), float) * csl[0]*cs…
+
+ # Fine grid, to be interpolated to porosity_grid. The fine cells are
+ # assumed to be either completely solid- (True), or void space (False).
+ fine_grid = numpy.zeros((grid[0]*precisionfactor, \
+ grid[1]*precisionfactor, \
+ grid[2]*precisionfactor), bool)
+
+ # Side length of fine grid cells
+ csl_fine = numpy.array([(upper_corner[0]-lower_corner[0]) / fine_grid[0], \
+ (upper_corner[1]-lower_corner[1]) / fine_grid[1], \
+ (upper_corner[2]-lower_corner[2]) / fine_grid[2] ])
+
+ # Volume of fine grid vells
+ Vc_fine = csl_fine[0] * csl_fine[1] * csl_fine[2]
+
+
+
+ # Iterate over fine grid cells
+ for ix in range(fine_grid[0]):
+ for iy in range(fine_grid[1]):
+ for iz in range(fine_grid[2]):
+
+ # Coordinates of cell centre
+ cpos = numpy.array([ix*csl_fine[0] + 0.5*csl_fine[0], \
+ iy*csl_fine[1] + 0.5*csl_fine[1], \
+ iz*csl_fine[2] + 0.5*csl_fine[2] ])
+
+
+ # Find out if the cell centre lies within a particle
+ for i in range(self.np):
+ p = self.x[i,:] # Particle position
+ r = self.radius[i] # Particle radius
+
+ delta = numpy.linalg.norm(cpos - p) - r
+
+ if (delta < 0.0): # Cell lies within a particle
+ fine_grid[ix,iy,iz] = True
+ break # No need to check more particles
+
+ fine_grid[ix,iy,iz] = False
+
+ # Interpolate fine grid to coarse grid by looping
+ # over the fine grid, and subtracting the fine cell volume
+ # if it is marked as inside a particle
+ for ix in range(fine_grid[0]):
+ for iy in range(fine_grid[1]):
+ for iz in range(fine_grid[2]):
+ if (fine_grid[ix,iy,iz] == True):
+ porosity_grid[floor(ix/precisionfactor), \
+ floor(iy/precisionfactor), \
+ floor(iz/precisionfactor) ] -= Vc_fine
+
+
+ return porosity_grid
+
+
+
def render(binary,
out = '~/img_out/rt-out',
graphicsformat = 'jpg',
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.