tadded forcechainsRose visualization method - sphere - GPU-based 3D discrete el… | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit e86480db55360ef61f8cb441c0160817fec8689a | |
parent b62c9479b44eeba854093a26b5ad4c19325ae6a8 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Tue, 12 Mar 2013 05:53:29 +0100 | |
added forcechainsRose visualization method | |
Diffstat: | |
M python/sphere.py | 64 +++++++++++++++++++++++++++++… | |
1 file changed, 64 insertions(+), 0 deletions(-) | |
--- | |
diff --git a/python/sphere.py b/python/sphere.py | |
t@@ -1234,6 +1234,70 @@ class Spherebin: | |
subprocess.call("cd .. && ./forcechains " + nd + "-f " + outformat + "… | |
subprocess.call("gnuplot tmp.gp && rm tmp.bin && rm tmp.gp", shell=Tru… | |
+ def forcechainsRose(self): | |
+ ''' Visualize strike- and dip angles of the strongest force chains in a | |
+ rose plot. | |
+ ''' | |
+ self.writebin() | |
+ | |
+ subprocess.call("cd .. && ./forcechains -f txt input/" + self.sid + ".… | |
+ | |
+ # data will have the shape (numcontacts, 7) | |
+ data = numpy.loadtxt("fc-tmp.txt", skiprows=1) | |
+ | |
+ # find the max. value of the normal force | |
+ f_n_max = numpy.amax(data[:,6]) | |
+ | |
+ # specify the lower limit of force chains to do statistics on | |
+ f_n_lim = 0.25 * f_n_max * 0.6 | |
+ | |
+ # find the indexes of these contacts | |
+ I = numpy.nonzero(data[:,6] > f_n_lim) | |
+ | |
+ # loop through these contacts and find the strike and dip of the conta… | |
+ strikelist = [] # strike direction of the normal vector, [0:360[ | |
+ diplist = [] # dip of the normal vector, [0:90] | |
+ for i in I[0]: | |
+ | |
+ x1 = data[i,0] | |
+ y1 = data[i,1] | |
+ z1 = data[i,2] | |
+ x2 = data[i,3] | |
+ y2 = data[i,4] | |
+ z2 = data[i,5] | |
+ | |
+ if (z1 < z2): | |
+ xlower = x1; ylower = y1; zlower = z1 | |
+ xupper = x2; yupper = y2; zupper = z2 | |
+ else : | |
+ xlower = x2; ylower = y2; zlower = z2 | |
+ xupper = x1; yupper = y1; zupper = z1 | |
+ | |
+ # Vector pointing downwards | |
+ dx = xlower - xupper | |
+ dy = ylower - yupper | |
+ dz = zlower - zupper | |
+ dhoriz = numpy.sqrt(dx**2 + dy**2) | |
+ | |
+ # Find dip angle | |
+ diplist.append(math.degrees(math.atan((zupper - zlower)/dhoriz))) | |
+ | |
+ # Find strike angle | |
+ if (ylower >= yupper): # in first two quadrants | |
+ strikelist.append(math.acos(dx/dhoriz)) | |
+ else : | |
+ strikelist.append(2.0*numpy.pi - math.acos(dx/dhoriz)) | |
+ | |
+ | |
+ plt.figure(figsize=[4,4]) | |
+ ax = plt.subplot(111, polar=True, axisbg="w") | |
+ ax.scatter(strikelist, diplist, c='k', marker='+') | |
+ ax.set_rmax(90) | |
+ ax.set_rticks([]) | |
+ plt.savefig("fc-" + self.sid + "-rose.pdf", transparent=True) | |
+ | |
+ subprocess.call("rm fc-tmp.txt", shell=True) | |
+ | |
def thinsection_x1x3(self, | |
x2 = 'center', |