tadd script to show and fit stress-strain data - 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 946bd41fa7800255c8e5a2e5d80492d413f5e2f2
(DIR) parent de478f3c62a6324db6df9f9d75598d18601955e9
(HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
Date: Wed, 25 Feb 2015 10:50:34 +0100
add script to show and fit stress-strain data
Diffstat:
A python/halfshear-darcy-rate-depend… | 139 ++++++++++++++++++++++++++++++
1 file changed, 139 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/python/halfshear-darcy-rate-dependence.py b/python/halfshear-darcy-rate-dependence.py
t@@ -0,0 +1,139 @@
+#!/usr/bin/env python
+import matplotlib
+matplotlib.use('Agg')
+#matplotlib.rcParams.update({'font.size': 18, 'font.family': 'serif'})
+matplotlib.rcParams.update({'font.size': 7, 'font.family': 'sans-serif'})
+matplotlib.rc('text', usetex=True)
+matplotlib.rcParams['text.latex.preamble']=[r"\usepackage{amsmath}"]
+import shutil
+
+import os
+import sys
+import numpy
+import sphere
+import matplotlib.pyplot as plt
+import scipy.optimize
+
+sids =\
+ ['halfshear-darcy-sigma0=80000.0-k_c=3.5e-13-mu=1.04e-07-ss=10000.0-A=70000.0-f=0.2']
+ #['halfshear-darcy-sigma0=80000.0-k_c=3.5e-13-mu=1.797e-06-ss=10000.0-A=70000.0-f=0.2']
+outformat = 'pdf'
+fluid = True
+#threshold = 100.0 # [N]
+
+
+def creep_rheology(friction, n):
+ ''' return strain rate from friction (tau/N) value '''
+ return friction**n
+
+
+for sid in sids:
+
+ sim = sphere.sim(sid, fluid=fluid)
+
+ #nsteps = 2
+ #nsteps = 10
+ nsteps = sim.status()
+
+ t = numpy.empty(nsteps)
+
+ tau = numpy.empty(sim.status())
+ N = numpy.empty(sim.status())
+ #v = numpy.empty(sim.status())
+ shearstrainrate = numpy.empty(sim.status())
+ shearstrain = numpy.empty(sim.status())
+ for i in numpy.arange(sim.status()):
+ sim.readstep(i+1, verbose=False)
+ #tau = sim.shearStress()
+ tau[i] = sim.w_tau_x # defined shear stress
+ #tau[i] = sim.shearStress()[0] # measured shear stress along x
+ N[i] = sim.currentNormalStress() # defined normal stress
+ #v[i] = sim.shearVel()
+ shearstrainrate[i] = sim.shearStrainRate()
+ shearstrain[i] = sim.shearStrain()
+ t[i] = sim.currentTime()
+
+ # remove nonzero sliding velocities and their associated values
+ #idx = numpy.nonzero(v)
+ idx = numpy.nonzero(shearstrainrate)
+ #v_nonzero = v[idx]
+ shearstrainrate_nonzero = shearstrainrate[idx]
+ tau_nonzero = tau[idx]
+ N_nonzero = N[idx]
+ shearstrain_nonzero = shearstrain[idx]
+ t_nonzero = t[idx]
+
+ # The algorithm uses the Levenberg-Marquardt algorithm through leastsq
+ idxfit = numpy.nonzero((tau_nonzero/N_nonzero < 0.38) &
+ (shearstrainrate_nonzero < 0.1) &
+ (((t_nonzero > 6.0) & (t_nonzero < 8.0)) |
+ ((t_nonzero > 11.0) & (t_nonzero < 13.0)) |
+ ((t_nonzero > 16.0) & (t_nonzero < 18.0))))
+ #popt, pvoc = scipy.optimize.curve_fit(
+ #creep_rheology, tau/N, shearstrainrate)
+ popt, pvoc = scipy.optimize.curve_fit(
+ creep_rheology, tau_nonzero[idxfit]/N_nonzero[idxfit],
+ shearstrainrate_nonzero[idxfit])
+ print popt
+ print pvoc
+ n = popt[0] # stress exponent
+
+ friction = tau_nonzero/N_nonzero
+ x_min = numpy.floor(numpy.min(friction))
+ x_max = numpy.ceil(numpy.max(friction)) + 0.05
+ friction_fit =\
+ numpy.linspace(numpy.min(tau_nonzero[idxfit]/N_nonzero[idxfit]),
+ numpy.max(tau_nonzero[idxfit]/N_nonzero[idxfit]),
+ 100)
+ strainrate_fit = friction_fit**n
+
+ fig = plt.figure(figsize=(3.5,2.5))
+ ax1 = plt.subplot(111)
+ #ax1.semilogy(N/1000., v)
+ #ax1.semilogy(tau_nonzero/N_nonzero, v_nonzero, '+k')
+ #ax1.plot(tau/N, v, '.')
+ #CS = ax1.scatter(friction, v_nonzero, c=shearstrain_nonzero,
+ #linewidth=0)
+ CS = ax1.scatter(friction, shearstrainrate_nonzero,
+ #c=t_nonzero, linewidth=0.2,
+ c=shearstrain_nonzero, linewidth=0.05,
+ cmap=matplotlib.cm.get_cmap('afmhot'))
+ #CS = ax1.scatter(friction[idxfit], shearstrainrate_nonzero[idxfit],
+ #c=shearstrain_nonzero[idxfit], linewidth=0.2,
+ #cmap=matplotlib.cm.get_cmap('afmhot'))
+
+ ax1.plot(friction_fit, strainrate_fit)
+
+ ax1.annotate('$\\dot{\\gamma} = (\\tau/N)^{6.40}$',
+ xy = (friction_fit[40], strainrate_fit[40]),
+ xytext = (0.32, 2.0e-7),
+ arrowprops=dict(facecolor='blue', edgecolor='blue', shrink=0.05,
+ width=1, headwidth=4, frac=0.2),)
+ #xytext = (friction_fit[50]+0.15, strainrate_fit[50]-1.0e-5))#,
+ #arrowprops=dict(facecolor='black', shrink=0.05),)
+
+ ax1.set_yscale('log')
+ ax1.set_xlim([x_min, x_max])
+ #y_min = numpy.min(v_nonzero)*0.5
+ #y_max = numpy.max(v_nonzero)*2.0
+ y_min = numpy.min(shearstrainrate_nonzero)*0.5
+ y_max = numpy.max(shearstrainrate_nonzero)*2.0
+ ax1.set_ylim([y_min, y_max])
+ #ax1.set_xlim([friction_fit[0], friction_fit[-1]])
+ #ax1.set_ylim([strainrate_fit[0], strainrate_fit[-1]])
+
+ cb = plt.colorbar(CS)
+ cb.set_label('Shear strain $\\gamma$ [-]')
+
+ #ax1.set_xlabel('Effective normal stress [kPa]')
+ ax1.set_xlabel('Friction $\\tau/N$ [-]')
+ #ax1.set_ylabel('Shear velocity [m/s]')
+ ax1.set_ylabel('Shear strain rate $\\dot{\\gamma}$ [s$^{-1}$]')
+
+
+ plt.tight_layout()
+ filename = sid + '-rate-dependence.' + outformat
+ plt.savefig(filename)
+ plt.close()
+ shutil.copyfile(filename, '/home/adc/articles/own/3/graphics/' + filename)
+ print(filename)