Introduction
Introduction Statistics Contact Development Disclaimer Help
tmodify plotContacts to optional data output, add creep dynamics plot - sphere …
git clone git://src.adamsgaard.dk/sphere
Log
Files
Refs
LICENSE
---
commit bc291003152a18b8628c5c600e6ae61a1a5ddcee
parent cd17a179736874baf8385287c4cfdf074e99d12c
Author: Anders Damsgaard <[email protected]>
Date: Fri, 15 May 2015 20:35:31 +0200
modify plotContacts to optional data output, add creep dynamics plot
Diffstat:
A python/halfshear-darcy-creep-dynam… | 482 +++++++++++++++++++++++++++…
M python/sphere.py | 13 +++++++------
2 files changed, 489 insertions(+), 6 deletions(-)
---
diff --git a/python/halfshear-darcy-creep-dynamics.py b/python/halfshear-darcy-…
t@@ -0,0 +1,482 @@
+#!/usr/bin/env python
+import matplotlib
+matplotlib.use('Agg')
+import shutil
+
+import os
+import sys
+import numpy
+import sphere
+import matplotlib.pyplot as plt
+import matplotlib.patches
+import matplotlib.colors
+import matplotlib.ticker
+import matplotlib.cm
+
+matplotlib.rcParams.update({'font.size': 7, 'font.family': 'sans-serif'})
+matplotlib.rc('text', usetex=True)
+matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]
+
+#import seaborn as sns
+#sns.set(style='ticks', palette='Set2')
+#sns.set(style='ticks', palette='colorblind')
+#sns.set(style='ticks', palette='muted')
+#sns.set(style='ticks', palette='pastel')
+#sns.set(style='ticks', palette='pastel')
+#sns.set(style='ticks')
+#sns.despine() # remove right and top spines
+
+outformat='pdf'
+
+
+sids = ['halfshear-darcy-sigma0=10000.0-k_c=2e-16-mu=2.08e-07-ss=2000.0-A=4000…
+timescalings=[1.157e-4]
+
+steps = numpy.arange(1625, 1875)
+plotsteps = numpy.array([1670,1750,1850]) # slow creep, fast creep, slip
+#plotsteps = numpy.array([1670])
+contactfigs = []
+contactidx = []
+
+datalists = [[], [], []]
+strikelists = [[], [], []]
+diplists = [[], [], []]
+forcemagnitudes = [[], [], []]
+alphas = [[], [], []]
+f_n_maxs = [[], [], []]
+taus = [[], [], []]
+ts = [[], [], []]
+Ns = [[], [], []]
+
+#f_min = 1.0
+#f_max = 1.0e16
+lower_limit = 0.3
+upper_limit = 0.5
+f_n_max = 50 # for force chain plots
+
+N = numpy.zeros_like(steps, dtype=numpy.float64)
+t = numpy.zeros_like(steps, dtype=numpy.float64)
+
+
+s=0
+for sid in sids:
+
+ sim = sphere.sim(sid, fluid=True)
+ t_DEM_to_t_real = timescalings[s]
+
+ i=0
+ i_scatter = 0
+ for step in steps:
+
+ sim.readstep(step, verbose=False)
+ if i == 0:
+ L = sim.L
+
+ N[i] = sim.currentNormalStress('defined')
+ t[i] = sim.currentTime()
+ #sim.plotContacts(outfolder='../img_out/')
+
+ if (step == plotsteps).any():
+ #contactdata.append(sim.plotContacts(return_data=True))
+ datalists[i_scatter], strikelists[i_scatter], diplists[i_scatter],\
+ forcemagnitudes[i_scatter], alphas[i_scatter], \
+ f_n_maxs[i_scatter] = sim.plotContacts(return_data=True,
+ lower_limit=lower_limit,
+ upper_limit=upper_limit)
+ #f_min=f_min,
+ #f_max=f_max)
+ #contactfigs.append(
+ #sim.plotContacts(return_fig=True,
+ #f_min=f_min,
+ #f_max=f_max))
+ #datalists.append(data)
+ #strikelists.append(strikelist)
+ #diplists.append(diplist)
+ #forcemagnitudes.append(forcemagnitude)
+ #alphas.append(alpha)
+ #f_n_maxs.append(f_n_max)
+ ts[i_scatter] = t[i]
+ Ns[i_scatter] = N[i]
+ #taus.append(sim.shearStress('defined'))
+ taus[i_scatter] = sim.shearStress('defined')
+
+ #contactidx.append(step)
+ i_scatter += 1
+
+
+ i += 1
+ s += 1
+
+
+
+ ## PLOTTING ######################################################
+
+ # Time in days
+ scalingfactor = 1./t_DEM_to_t_real / (24.*3600.)
+ t_scaled = t*scalingfactor
+
+
+ ## Normal stress plot
+ fig = plt.figure(figsize=[3.5, 3.5])
+
+ ax1 = plt.subplot(1, 1, 1)
+
+ ax1.plot(t_scaled, N/1000., '-k', label='$N$', clip_on=False)
+ ax1.plot([0,10],[taus[0]/.3/1000., taus[0]/.3/1000.], '--', color='gray')
+ ax1.set_xlabel('Time [d]')
+ ax1.set_ylabel('Effective normal stress $N$ [kPa]')
+
+ ax1.spines['right'].set_visible(False)
+ ax1.spines['top'].set_visible(False)
+ # Only show ticks on the left and bottom spines
+ ax1.yaxis.set_ticks_position('left')
+ ax1.xaxis.set_ticks_position('bottom')
+
+ ax1.set_xlim([numpy.min(t_scaled), numpy.max(t_scaled)])
+ #ax1.locator_params(axis='x', nbins=5)
+ ax1.locator_params(axis='y', nbins=4)
+
+ ## Contact scatter plots
+ dx=.23; dy=.23
+
+ # Scatter plot 1
+ sc=0
+ Lx=.17; Ly=.3;
+ #xytext=(Lx+.5*dx, Ly+.5*dy)
+ xytext=(Lx+.15*dx, Ly+dy+.07)
+ xy=(ts[0]*scalingfactor, Ns[0]/1000.)
+ #print xytext
+ #print xy
+ ax1.annotate('',
+ xytext=xytext, textcoords='axes fraction',
+ xy=xy, xycoords='data',
+ arrowprops=dict(arrowstyle='->', connectionstyle='arc3'))
+
+ axsc1 = fig.add_axes([Lx, Ly, dx, dy], polar=True)
+ cs = axsc1.scatter(strikelists[sc], 90. - diplists[sc], marker='o',
+ c=forcemagnitudes[sc],
+ s=forcemagnitudes[sc]/f_n_maxs[sc]*5.,
+ alpha=alphas[sc],
+ edgecolors='none',
+ vmin=f_n_maxs[sc]*lower_limit,
+ vmax=f_n_maxs[sc]*upper_limit,
+ cmap=matplotlib.cm.get_cmap('afmhot_r'))#,
+ #norm=matplotlib.colors.LogNorm())
+ # tick locations
+ #thetaticks = numpy.arange(0,360,90)
+ # set ticklabels location at 1.3 times the axes' radius
+ #ax.set_thetagrids(thetaticks, frac=1.3)
+ axsc1.set_xticklabels([])
+ axsc1.set_yticklabels([])
+
+ axsc1.set_title('\\textbf{Slow creep}', fontsize=7)
+ if upper_limit < 1.0:
+ cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04)
+ else:
+ cbar = plt.colorbar(cs, fraction=0.045, pad=0.04)
+ #cbar.set_label('$||\\boldsymbol{f}_n||$')
+ cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]')
+ cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4)
+ cbar.update_ticks()
+
+ # plot defined max compressive stress from tau/N ratio
+ axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='+', c='none', edgecolor='red', s=100)
+ axsc1.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='o', c='none', edgecolor='red', s=100)
+ '''
+ ax.sc1scatter(0., # actual stress
+ numpy.degrees(numpy.arctan(
+ self.shearStress('effective')/
+ self.currentNormalStress('effective'))),
+ marker='+', color='blue', s=300)
+ '''
+
+ axsc1.set_rmax(90)
+ axsc1.set_rticks([])
+ #axsc1.grid(False)
+
+ # force chain plot
+
+ axfc1 = fig.add_axes([Lx-0.007, Ly-0.7*dy, dx, dy*0.7])
+
+ data = datalists[sc]
+
+ # 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 = lower_limit * f_n_max
+
+ # find the indexes of these contacts
+ I = numpy.nonzero(data[:,6] >= f_n_lim)
+
+ #color = matplotlib.cm.spectral(data[:,6]/f_n_max)
+ 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]
+ f_n = data[i,6]
+
+ lw_max = 1.0
+ if f_n >= f_n_max:
+ lw = lw_max
+ else:
+ lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max
+
+ #print lw
+ axfc1.plot([x1,x2], [z1,z2], '-k', linewidth=lw)
+ #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes…
+ #axfc1.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color)
+
+ axfc1.spines['right'].set_visible(False)
+ axfc1.spines['left'].set_visible(False)
+ # Only show ticks on the left and bottom spines
+ axfc1.xaxis.set_ticks_position('none')
+ axfc1.yaxis.set_ticks_position('none')
+ axfc1.set_xticklabels([])
+ axfc1.set_yticklabels([])
+ axfc1.set_xlim([numpy.min(data[I[0],0]), numpy.max(data[I[0],0])])
+ axfc1.set_ylim([numpy.min(data[I[0],2]), numpy.max(data[I[0],2])])
+ axfc1.set_aspect('equal')
+
+
+
+ # Scatter plot 2
+ sc=1
+ Lx=.37; Ly=.7;
+ #xytext=(Lx+.5*dx, Ly+.5*dy)
+ xytext=(Lx+.5*dx, Ly+.05)
+ xy=(ts[sc]*scalingfactor, Ns[sc]/1000.)
+ #print xytext
+ #print xy
+ ax1.annotate('',
+ xytext=xytext, textcoords='axes fraction',
+ xy=xy, xycoords='data',
+ arrowprops=dict(arrowstyle='->', connectionstyle='arc3'))
+
+ axsc2 = fig.add_axes([Lx, Ly, dx, dy], polar=True)
+
+ cs = axsc2.scatter(strikelists[sc], 90. - diplists[sc], marker='o',
+ c=forcemagnitudes[sc],
+ s=forcemagnitudes[sc]/f_n_max*5.,
+ alpha=alphas[sc],
+ edgecolors='none',
+ vmin=f_n_maxs[sc]*lower_limit,
+ vmax=f_n_maxs[sc]*upper_limit,
+ cmap=matplotlib.cm.get_cmap('afmhot_r'))#,
+ #norm=matplotlib.colors.LogNorm())
+ # tick locations
+ #thetaticks = numpy.arange(0,360,90)
+ # set ticklabels location at 1.3 times the axes' radius
+ #ax.set_thetagrids(thetaticks, frac=1.3)
+ axsc2.set_xticklabels([])
+ axsc2.set_yticklabels([])
+
+ axsc2.set_title('\\textbf{Fast creep}', fontsize=7)
+ if upper_limit < 1.0:
+ cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04)
+ else:
+ cbar = plt.colorbar(cs, fraction=0.045, pad=0.04)
+ cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]')
+ #cbar.set_label('Contact force [N]')
+ cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4)
+ cbar.update_ticks()
+
+ # plot defined max compressive stress from tau/N ratio
+ axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='+', c='none', edgecolor='red', s=100)
+ axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='o', c='none', edgecolor='red', s=100)
+ '''
+ ax.sc2scatter(0., # actual stress
+ numpy.degrees(numpy.arctan(
+ self.shearStress('effective')/
+ self.currentNormalStress('effective'))),
+ marker='+', color='blue', s=300)
+ '''
+
+ axsc2.set_rmax(90)
+ axsc2.set_rticks([])
+ #axsc2.grid(False)
+
+ # force chain plot
+
+ #axfc2 = fig.add_axes([Lx+dx+0.05, Ly+0.03, dx, dy*0.7])
+ axfc2 = fig.add_axes([Lx+dx+0.10, Ly+0.03, dx, dy*0.7])
+
+ data = datalists[sc]
+
+ # 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 = lower_limit * f_n_max
+
+ # find the indexes of these contacts
+ I = numpy.nonzero(data[:,6] >= f_n_lim)
+
+ #color = matplotlib.cm.spectral(data[:,6]/f_n_max)
+ 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]
+ f_n = data[i,6]
+
+ lw_max = 1.0
+ if f_n >= f_n_max:
+ lw = lw_max
+ else:
+ lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max
+
+ #print lw
+ axfc2.plot([x1,x2], [z1,z2], '-k', linewidth=lw)
+ #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes…
+ #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color)
+
+ axfc2.spines['right'].set_visible(False)
+ axfc2.spines['left'].set_visible(False)
+ # Only show ticks on the left and bottom spines
+ axfc2.xaxis.set_ticks_position('none')
+ axfc2.yaxis.set_ticks_position('none')
+ axfc2.set_xticklabels([])
+ axfc2.set_yticklabels([])
+ axfc2.set_xlim([numpy.min(data[I[0],0]), numpy.max(data[I[0],0])])
+ axfc2.set_ylim([numpy.min(data[I[0],2]), numpy.max(data[I[0],2])])
+ axfc2.set_aspect('equal')
+
+
+
+
+ # Scatter plot 3
+ sc=2
+ #Lx=.50; Ly=.40;
+ Lx=.65; Ly=.40;
+ #xytext=(Lx+.5*dx, Ly+.5*dy)
+ #xytext=(Lx+1.75*dx, Ly+0.01)
+ xytext=(Lx+1.15*dx, 0.2)
+ xy=(ts[sc]*scalingfactor, Ns[sc]/1000.)
+ #print xytext
+ #print xy
+ ax1.annotate('',
+ xytext=xytext, textcoords='axes fraction',
+ xy=xy, xycoords='data',
+ arrowprops=dict(arrowstyle='->', connectionstyle='arc3'))
+
+ axsc2 = fig.add_axes([Lx, Ly, dx, dy], polar=True)
+
+ cs = axsc2.scatter(strikelists[sc], 90. - diplists[sc], marker='o',
+ c=forcemagnitudes[sc],
+ s=forcemagnitudes[sc]/f_n_max*5.,
+ alpha=alphas[sc],
+ edgecolors='none',
+ vmin=f_n_maxs[sc]*lower_limit,
+ vmax=f_n_maxs[sc]*upper_limit,
+ cmap=matplotlib.cm.get_cmap('afmhot_r'))#,
+ #norm=matplotlib.colors.LogNorm())
+ # tick locations
+ #thetaticks = numpy.arange(0,360,90)
+ # set ticklabels location at 1.3 times the axes' radius
+ #ax.set_thetagrids(thetaticks, frac=1.3)
+ axsc2.set_xticklabels([])
+ axsc2.set_yticklabels([])
+
+ axsc2.set_title('\\textbf{Slip}', fontsize=7)
+ if upper_limit < 1.0:
+ cbar = plt.colorbar(cs, extend='max', fraction=0.035, pad=0.04)
+ else:
+ cbar = plt.colorbar(cs, fraction=0.045, pad=0.04)
+ cbar.set_label('$\\boldsymbol{f}_\\text{n}$ [N]')
+ #cbar.set_label('Contact force [N]')
+ cbar.locator = matplotlib.ticker.MaxNLocator(nbins=4)
+ cbar.update_ticks()
+
+ # plot defined max compressive stress from tau/N ratio
+ axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='+', c='none', edgecolor='red', s=100)
+ axsc2.scatter(0., numpy.degrees(numpy.arctan(taus[sc]/Ns[sc])),
+ marker='o', c='none', edgecolor='red', s=100)
+ '''
+ ax.sc2scatter(0., # actual stress
+ numpy.degrees(numpy.arctan(
+ self.shearStress('effective')/
+ self.currentNormalStress('effective'))),
+ marker='+', color='blue', s=300)
+ '''
+
+ axsc2.set_rmax(90)
+ axsc2.set_rticks([])
+ #axsc2.grid(False)
+
+ # force chain plot
+
+ axfc2 = fig.add_axes([Lx-0.007, Ly-0.7*dy, dx, dy*0.7])
+ #axfc2 = fig.add_axes([Lx+dx+0.05, Ly+0.03, dx, dy*0.7])
+
+ data = datalists[sc]
+
+ # 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 = lower_limit * f_n_max
+
+ # find the indexes of these contacts
+ I = numpy.nonzero(data[:,6] >= f_n_lim)
+
+ #color = matplotlib.cm.spectral(data[:,6]/f_n_max)
+ 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]
+ f_n = data[i,6]
+
+ lw_max = 1.0
+ if f_n >= f_n_max:
+ lw = lw_max
+ else:
+ lw = (f_n - f_n_lim)/(f_n_max - f_n_lim)*lw_max
+
+ #print lw
+ axfc2.plot([x1,x2], [z1,z2], '-k', linewidth=lw)
+ #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=forcemagnitudes…
+ #axfc2.plot([x1,x2], [z1,z2], '-', linewidth=lw, color=color)
+
+ axfc2.spines['right'].set_visible(False)
+ axfc2.spines['left'].set_visible(False)
+ # Only show ticks on the left and bottom spines
+ axfc2.xaxis.set_ticks_position('none')
+ axfc2.yaxis.set_ticks_position('none')
+ axfc2.set_xticklabels([])
+ axfc2.set_yticklabels([])
+ axfc2.set_xlim([numpy.min(data[:,0]), numpy.max(data[:,0])])
+ axfc2.set_ylim([numpy.min(data[:,2]), numpy.max(data[:,2])])
+ axfc2.set_aspect('equal')
+
+
+
+
+
+
+
+ #fig.tight_layout()
+ #plt.subplots_adjust(hspace=0.05)
+ plt.subplots_adjust(right=0.82)
+
+ filename = sid + '-creep-dynamics.' + outformat
+ plt.savefig(filename)
+ plt.close()
+ shutil.copyfile(filename, '/home/adc/articles/own/3/graphics/' + filename)
+ print(filename)
diff --git a/python/sphere.py b/python/sphere.py
t@@ -5248,9 +5248,9 @@ class sim:
fig.clf()
def plotContacts(self, graphics_format = 'png', figsize=[6,6], title=None,
- lower_limit = 0.0, upper_limit = 1.0, alpha=1.0, return_data=False,
- outfolder='.',
- f_min = None, f_max = None):
+ lower_limit = 0.0, upper_limit = 1.0, alpha=1.0,
+ return_data=False, outfolder='.',
+ f_min = None, f_max = None):
'''
Plot current contact orientations on polar plot
t@@ -5329,7 +5329,7 @@ class sim:
fig = plt.figure(figsize=figsize)
ax = plt.subplot(111, polar=True, axisbg='white')
- cs = ax.scatter(strikelist, 90. - diplist, marker='o',
+ cs = ax.scatter(strikelist, 90. - diplist, marker='o',
c=forcemagnitude,
s=forcemagnitude/f_n_max*40.,
alpha=alpha,
t@@ -5360,7 +5360,8 @@ class sim:
plt.title('t = {:.2f} s'.format(self.currentTime()))
#plt.tight_layout()
- plt.savefig(outfolder + '/' + self.sid + '-contacts.' + \
+ plt.savefig(outfolder + '/' + self.sid + '-' + \
+ str(self.time_step_count[0]) + '-contacts.' + \
graphics_format,\
transparent=False)
t@@ -5370,7 +5371,7 @@ class sim:
plt.close()
if return_data:
- return data
+ return data, strikelist, diplist, forcemagnitude, alpha, f_n_max
def plotFluidPressuresY(self, y = -1, graphics_format = 'png'):
'''
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.