| timprove internals plot - sphere - GPU-based 3D discrete element method algorit… | |
| git clone git://src.adamsgaard.dk/sphere | |
| Log | |
| Files | |
| Refs | |
| LICENSE | |
| --- | |
| commit fd4eb344b8af1b8de25c5a2c587c01f94fd9adb4 | |
| parent 9d9e5ba4f59c0dbafc66116261bd5766e48f380f | |
| Author: Anders Damsgaard <[email protected]> | |
| Date: Thu, 16 Apr 2015 11:48:55 +0200 | |
| improve internals plot | |
| Diffstat: | |
| M python/halfshear-darcy-internals.py | 373 +++++++++++++++++------------… | |
| M python/sphere.py | 9 +++++++-- | |
| 2 files changed, 207 insertions(+), 175 deletions(-) | |
| --- | |
| diff --git a/python/halfshear-darcy-internals.py b/python/halfshear-darcy-inter… | |
| t@@ -13,213 +13,240 @@ from permeabilitycalculator import * | |
| import matplotlib.pyplot as plt | |
| from matplotlib.ticker import MaxNLocator | |
| +import seaborn as sns | |
| +#sns.set(style='ticks', palette='Set2') | |
| +#sns.set(style='ticks', palette='colorblind') | |
| +#sns.set(style='ticks', palette='Set2') | |
| +sns.set(style='ticks', palette='Blues') | |
| + | |
| #sigma0 = float(sys.argv[1]) | |
| sigma0 = 20000.0 | |
| #k_c = 3.5e-13 | |
| -k_c = float(sys.argv[1]) | |
| - | |
| -if k_c == 3.5e-15: | |
| - steps = [1232, 1332, 1433, 1534, 1635] | |
| -elif k_c == 3.5e-13: | |
| - steps = [100, 200, 300, 410, 515] | |
| -else: | |
| - steps = [10, 50, 100, 1000, 1999] | |
| +#k_c = float(sys.argv[1]) | |
| +k_c_list = [3.5e-13, 3.5e-14, 3.5e-15] | |
| + | |
| +#if k_c == 3.5e-15: | |
| +# steps = [1232, 1332, 1433, 1534, 1635] | |
| +#elif k_c == 3.5e-13: | |
| +# steps = [100, 200, 300, 410, 515] | |
| +#else: | |
| +# steps = [10, 50, 100, 1000, 1999] | |
| nsteps_avg = 1 # no. of steps to average over | |
| #nsteps_avg = 100 # no. of steps to average over | |
| +steps = [1, 50, 100, 150, 200] | |
| -sid = 'halfshear-darcy-sigma0=' + str(sigma0) + '-k_c=' + str(k_c) + \ | |
| - '-mu=1.797e-06-velfac=1.0-shear' | |
| -sim = sphere.sim(sid, fluid=True) | |
| -sim.readfirst(verbose=False) | |
| +for k_c in k_c_list: | |
| -# particle z positions | |
| -zpos_p = numpy.zeros((len(steps), sim.np)) | |
| + sid = 'halfshear-darcy-sigma0=' + str(sigma0) + '-k_c=' + str(k_c) + \ | |
| + '-mu=1.797e-06-velfac=1.0-shear' | |
| + sim = sphere.sim(sid, fluid=True) | |
| + sim.readfirst(verbose=False) | |
| -# cell midpoint cell positions | |
| -zpos_c = numpy.zeros((len(steps), sim.num[2])) | |
| -dz = sim.L[2]/sim.num[2] | |
| -for i in numpy.arange(sim.num[2]): | |
| - zpos_c[:,i] = i*dz + 0.5*dz | |
| + # particle z positions | |
| + zpos_p = numpy.zeros((len(steps), sim.np)) | |
| -# particle x displacements | |
| -xdisp = numpy.zeros((len(steps), sim.np)) | |
| + # cell midpoint cell positions | |
| + zpos_c = numpy.zeros((len(steps), sim.num[2])) | |
| + dz = sim.L[2]/sim.num[2] | |
| + for i in numpy.arange(sim.num[2]): | |
| + zpos_c[:,i] = i*dz + 0.5*dz | |
| -# particle z velocity | |
| -v_z_p = numpy.zeros((len(steps), sim.np)) | |
| + # particle x displacements | |
| + xdisp = numpy.zeros((len(steps), sim.np)) | |
| -# fluid permeability | |
| -k = numpy.zeros((len(steps), sim.num[0], sim.num[1], sim.num[2])) | |
| -k_bar = numpy.zeros((len(steps), sim.num[2])) | |
| + # particle z velocity | |
| + v_z_p = numpy.zeros((len(steps), sim.np)) | |
| -# pressure | |
| -p = numpy.zeros((len(steps), sim.num[2])) | |
| + # fluid permeability | |
| + k = numpy.zeros((len(steps), sim.num[0], sim.num[1], sim.num[2])) | |
| + k_bar = numpy.zeros((len(steps), sim.num[2])) | |
| -# mean per-particle values | |
| -v_z_p_bar = numpy.zeros((len(steps), sim.num[2])) | |
| -v_z_f_bar = numpy.zeros((len(steps), sim.num[2])) | |
| + # pressure | |
| + p = numpy.zeros((len(steps), sim.num[2])) | |
| -# particle-fluid force per particle | |
| -f_pf = numpy.zeros_like(xdisp) | |
| + # mean per-particle values | |
| + v_z_p_bar = numpy.zeros((len(steps), sim.num[2])) | |
| + v_z_f_bar = numpy.zeros((len(steps), sim.num[2])) | |
| -# pressure - hydrostatic pressure | |
| -#dev_p = numpy.zeros((len(steps), sim.num[2])) | |
| + # particle-fluid force per particle | |
| + f_pf = numpy.zeros_like(xdisp) | |
| -# mean porosity | |
| -phi_bar = numpy.zeros((len(steps), sim.num[2])) | |
| + # pressure - hydrostatic pressure | |
| + #dev_p = numpy.zeros((len(steps), sim.num[2])) | |
| -# mean porosity change | |
| -dphi_bar = numpy.zeros((len(steps), sim.num[2])) | |
| + # mean porosity | |
| + phi_bar = numpy.zeros((len(steps), sim.num[2])) | |
| -# mean per-particle values | |
| -xdisp_mean = numpy.zeros((len(steps), sim.num[2])) | |
| -f_pf_mean = numpy.zeros((len(steps), sim.num[2])) | |
| + # mean porosity change | |
| + dphi_bar = numpy.zeros((len(steps), sim.num[2])) | |
| -shear_strain_start = numpy.zeros(len(steps)) | |
| -shear_strain_end = numpy.zeros(len(steps)) | |
| + # mean per-particle values | |
| + xdisp_mean = numpy.zeros((len(steps), sim.num[2])) | |
| + f_pf_mean = numpy.zeros((len(steps), sim.num[2])) | |
| -#fig = plt.figure(figsize=(8,4*(len(steps))+1)) | |
| -fig = plt.figure(figsize=(8,4.5)) | |
| -ax = [] | |
| -n = 4 | |
| -ax.append(plt.subplot(1, n, 1)) # 0: xdisp | |
| -ax.append(plt.subplot(1, n, 2, sharey=ax[0])) # 3: k | |
| -ax.append(plt.subplot(1, n, 3, sharey=ax[0])) # 5: p_f | |
| -ax.append(plt.subplot(1, n, 4, sharey=ax[0])) # 6: f_pf_z | |
| + shear_strain_start = numpy.zeros(len(steps)) | |
| + shear_strain_end = numpy.zeros(len(steps)) | |
| -s = 0 | |
| -for step_str in steps: | |
| + #fig = plt.figure(figsize=(8,4*(len(steps))+1)) | |
| + #fig = plt.figure(figsize=(8,4.5)) | |
| + fig = plt.figure(figsize=(3.74*2,4.5)) | |
| + ax = [] | |
| + n = 4 | |
| + ax.append(plt.subplot(1, n, 1)) # 0: xdisp | |
| + ax.append(plt.subplot(1, n, 2, sharey=ax[0])) # 3: k | |
| + ax.append(plt.subplot(1, n, 3, sharey=ax[0])) # 5: p_f | |
| + ax.append(plt.subplot(1, n, 4, sharey=ax[0])) # 6: f_pf_z | |
| - step = int(step_str) | |
| + s = 0 | |
| + for step_str in steps: | |
| - if os.path.isfile('../output/' + sid + '.status.dat'): | |
| + step = int(step_str) | |
| - for substep in numpy.arange(nsteps_avg): | |
| + if os.path.isfile('../output/' + sid + '.status.dat'): | |
| - if step + substep > sim.status(): | |
| - raise Exception( | |
| - 'Simulation step %d not available (sim.status = %d).' | |
| - % (step + substep, sim.status())) | |
| + for substep in numpy.arange(nsteps_avg): | |
| - sim.readstep(step + substep, verbose=False) | |
| + if step + substep > sim.status(): | |
| + raise Exception( | |
| + 'Simulation step %d not available (sim.status = %d… | |
| + % (step + substep, sim.status())) | |
| - zpos_p[s,:] += sim.x[:,2]/nsteps_avg | |
| + sim.readstep(step + substep, verbose=False) | |
| - xdisp[s,:] += sim.xyzsum[:,0]/nsteps_avg | |
| + zpos_p[s,:] += sim.x[:,2]/nsteps_avg | |
| - ''' | |
| - for i in numpy.arange(sim.np): | |
| - f_pf[s,i] += \ | |
| - sim.f_sum[i].dot(sim.f_sum[i])/nsteps_avg | |
| - ''' | |
| - f_pf[s,:] += sim.f_p[:,2] | |
| + xdisp[s,:] += sim.xyzsum[:,0]/nsteps_avg | |
| - dz = sim.L[2]/sim.num[2] | |
| - wall0_iz = int(sim.w_x[0]/dz) | |
| + ''' | |
| + for i in numpy.arange(sim.np): | |
| + f_pf[s,i] += \ | |
| + sim.f_sum[i].dot(sim.f_sum[i])/nsteps_avg | |
| + ''' | |
| + f_pf[s,:] += sim.f_p[:,2] | |
| - p[s,:] += numpy.average(numpy.average(sim.p_f[:,:,:], axis=0),\ | |
| - axis=0)/nsteps_avg | |
| + dz = sim.L[2]/sim.num[2] | |
| + wall0_iz = int(sim.w_x[0]/dz) | |
| - sim.findPermeabilities() | |
| - k[s,:] += sim.k[:,:,:]/nsteps_avg | |
| + p[s,:] += numpy.average(numpy.average(sim.p_f[:,:,:], axis=0),\ | |
| + axis=0)/nsteps_avg | |
| - k_bar[s,:] += \ | |
| - numpy.average(numpy.average(sim.k[:,:,:], axis=0), axis=0)\ | |
| - /nsteps_avg | |
| + sim.findPermeabilities() | |
| + k[s,:] += sim.k[:,:,:]/nsteps_avg | |
| - if substep == 0: | |
| - shear_strain_start[s] = sim.shearStrain() | |
| - else: | |
| - shear_strain_end[s] = sim.shearStrain() | |
| - | |
| - # calculate mean values of xdisp and f_pf | |
| - for iz in numpy.arange(sim.num[2]): | |
| - z_bot = iz*dz | |
| - z_top = (iz+1)*dz | |
| - I = numpy.nonzero((zpos_p[s,:] >= z_bot) & (zpos_p[s,:] < z_top)) | |
| - if len(I) > 0: | |
| - xdisp_mean[s,iz] = numpy.mean(xdisp[s,I]) | |
| - f_pf_mean[s,iz] = numpy.mean(f_pf[s,I]) | |
| + k_bar[s,:] += \ | |
| + numpy.average(numpy.average(sim.k[:,:,:], axis=0), axi… | |
| + /nsteps_avg | |
| - #ax[0].plot(xdisp[s], zpos_p[s], ',', color = '#888888') | |
| - ax[0].plot(xdisp_mean[s], zpos_c[s], label='$\gamma$ = %.2f' % | |
| - (shear_strain_start[s])) | |
| + if substep == 0: | |
| + shear_strain_start[s] = sim.shearStrain() | |
| + else: | |
| + shear_strain_end[s] = sim.shearStrain() | |
| + | |
| + # calculate mean values of xdisp and f_pf | |
| + for iz in numpy.arange(sim.num[2]): | |
| + z_bot = iz*dz | |
| + z_top = (iz+1)*dz | |
| + I = numpy.nonzero((zpos_p[s,:] >= z_bot) & (zpos_p[s,:] < z_to… | |
| + if len(I) > 0: | |
| + xdisp_mean[s,iz] = numpy.mean(xdisp[s,I]) | |
| + f_pf_mean[s,iz] = numpy.mean(f_pf[s,I]) | |
| - ax[1].semilogx(k_bar[s], zpos_c[s], label='$\gamma$ = %.2f' % | |
| - (shear_strain_start[s])) | |
| - | |
| - ax[2].plot(p[s]/1000.0, zpos_c[s], label='$\gamma$ = %.2f' % | |
| - (shear_strain_start[s])) | |
| - | |
| - # remove particles with 0.0 pressure force | |
| - I = numpy.nonzero(numpy.abs(f_pf[s]) > .01) | |
| - f_pf_nonzero = f_pf[s][I] | |
| - zpos_p_nonzero = zpos_p[s][I] | |
| - I = numpy.nonzero(numpy.abs(f_pf_mean[s]) > .01) | |
| - f_pf_mean_nonzero = f_pf_mean[s][I] | |
| - zpos_c_nonzero = zpos_c[s][I] | |
| - | |
| - #ax[3].plot(f_pf_nonzero, zpos_p_nonzero, ',', alpha=0.5, | |
| - #color='#888888') | |
| - ax[3].plot(f_pf_mean_nonzero, zpos_c_nonzero, label='$\gamma$ = %.2f' % | |
| - (shear_strain_start[s])) | |
| - | |
| - else: | |
| - print(sid + ' not found') | |
| - s += 1 | |
| - | |
| - | |
| - | |
| -max_z = numpy.max(zpos_p) | |
| -ax[0].set_ylim([0, max_z]) | |
| -ax[0].set_xlim([0, 0.5]) | |
| - | |
| -if k_c == 3.5e-15: | |
| - #ax[1].set_xlim([1e-14, 1e-12]) | |
| - ax[1].set_xlim([1e-16, 1e-14]) | |
| -elif k_c == 3.5e-13: | |
| - #ax[1].set_xlim([1e-12, 1e-10]) | |
| - ax[1].set_xlim([1e-14, 1e-12]) | |
| - | |
| -ax[0].set_ylabel('Vertical position $z$ [m]') | |
| -ax[0].set_xlabel('$\\bar{\\boldsymbol{x}}^x_\\text{p}$ [m]') | |
| -ax[1].set_xlabel('$\\bar{k}$ [m$^{2}$]') | |
| -ax[2].set_xlabel('$\\bar{p_\\text{f}}$ [kPa]') | |
| -ax[3].set_xlabel('$\\boldsymbol{f}^z_\\text{i}$ [N]') | |
| - | |
| -# align x labels | |
| -labely = -0.3 | |
| -ax[0].xaxis.set_label_coords(0.5, labely) | |
| -ax[1].xaxis.set_label_coords(0.5, labely) | |
| -ax[2].xaxis.set_label_coords(0.5, labely) | |
| -ax[3].xaxis.set_label_coords(0.5, labely) | |
| - | |
| -plt.setp(ax[1].get_yticklabels(), visible=False) | |
| -plt.setp(ax[2].get_yticklabels(), visible=False) | |
| -plt.setp(ax[3].get_yticklabels(), visible=False) | |
| - | |
| -plt.setp(ax[0].xaxis.get_majorticklabels(), rotation=90) | |
| -plt.setp(ax[1].xaxis.get_majorticklabels(), rotation=90) | |
| -plt.setp(ax[2].xaxis.get_majorticklabels(), rotation=90) | |
| -plt.setp(ax[3].xaxis.get_majorticklabels(), rotation=90) | |
| - | |
| -ax[0].grid() | |
| -ax[1].grid() | |
| -ax[2].grid() | |
| -ax[3].grid() | |
| - | |
| -legend_alpha=0.5 | |
| -ax[0].legend(loc='lower center', prop={'size':12}, fancybox=True, | |
| - framealpha=legend_alpha) | |
| - | |
| -#plt.subplots_adjust(wspace = .05) # doesn't work with tight_layout() | |
| -plt.tight_layout() | |
| -#plt.MaxNLocator(nbins=1) # doesn't work? | |
| -ax[0].locator_params(nbins=3) | |
| -ax[2].locator_params(nbins=3) | |
| -ax[3].locator_params(nbins=3) | |
| - | |
| -filename = 'halfshear-darcy-internals-k_c=%.0e.pdf' % (k_c) | |
| -plt.savefig(filename) | |
| -shutil.copyfile(filename, '/home/adc/articles/own/2/graphics/' + filename) | |
| -print(filename) | |
| + k_bar[s][0] = k_bar[s][1] | |
| + | |
| + | |
| + | |
| + #ax[0].plot(xdisp[s], zpos_p[s], ',', color = '#888888') | |
| + ax[0].plot(xdisp_mean[s], zpos_c[s], label='$\gamma$ = %.2f' % | |
| + (shear_strain_start[s])) | |
| + | |
| + ax[1].semilogx(k_bar[s], zpos_c[s], label='$\gamma$ = %.2f' % | |
| + (shear_strain_start[s])) | |
| + | |
| + ax[2].plot(p[s]/1000.0, zpos_c[s], label='$\gamma$ = %.2f' % | |
| + (shear_strain_start[s])) | |
| + | |
| + # remove particles with 0.0 pressure force | |
| + I = numpy.nonzero(numpy.abs(f_pf[s]) > .01) | |
| + f_pf_nonzero = f_pf[s][I] | |
| + zpos_p_nonzero = zpos_p[s][I] | |
| + I = numpy.nonzero(numpy.abs(f_pf_mean[s]) > .01) | |
| + f_pf_mean_nonzero = f_pf_mean[s][I] | |
| + zpos_c_nonzero = zpos_c[s][I] | |
| + | |
| + #ax[3].plot(f_pf_nonzero, zpos_p_nonzero, ',', alpha=0.5, | |
| + #color='#888888') | |
| + ax[3].plot(f_pf_mean_nonzero, zpos_c_nonzero, label='$\gamma$ = %.… | |
| + (shear_strain_start[s])) | |
| + | |
| + else: | |
| + print(sid + ' not found') | |
| + s += 1 | |
| + | |
| + | |
| + max_z = numpy.max(zpos_p) | |
| + ax[0].set_ylim([0, max_z]) | |
| + #ax[0].set_xlim([0, 0.5]) | |
| + ax[0].set_xlim([0, 0.05]) | |
| + | |
| + if k_c == 3.5e-15: | |
| + #ax[1].set_xlim([1e-14, 1e-12]) | |
| + ax[1].set_xlim([1e-16, 1e-14]) | |
| + elif k_c == 3.5e-14: | |
| + ax[1].set_xlim([1e-15, 1e-13]) | |
| + elif k_c == 3.5e-13: | |
| + #ax[1].set_xlim([1e-12, 1e-10]) | |
| + ax[1].set_xlim([1e-14, 1e-12]) | |
| + | |
| + ax[0].set_ylabel('Vertical position $z$ [m]') | |
| + ax[0].set_xlabel('$\\bar{\\boldsymbol{x}}^x_\\text{p}$ [m]') | |
| + ax[1].set_xlabel('$\\bar{k}$ [m$^{2}$]') | |
| + ax[2].set_xlabel('$\\bar{p_\\text{f}}$ [kPa]') | |
| + ax[3].set_xlabel('$\\boldsymbol{f}^z_\\text{i}$ [N]') | |
| + | |
| + # align x labels | |
| + labely = -0.3 | |
| + ax[0].xaxis.set_label_coords(0.5, labely) | |
| + ax[1].xaxis.set_label_coords(0.5, labely) | |
| + ax[2].xaxis.set_label_coords(0.5, labely) | |
| + ax[3].xaxis.set_label_coords(0.5, labely) | |
| + | |
| + plt.setp(ax[1].get_yticklabels(), visible=False) | |
| + plt.setp(ax[2].get_yticklabels(), visible=False) | |
| + plt.setp(ax[3].get_yticklabels(), visible=False) | |
| + | |
| + plt.setp(ax[0].xaxis.get_majorticklabels(), rotation=90) | |
| + plt.setp(ax[1].xaxis.get_majorticklabels(), rotation=90) | |
| + plt.setp(ax[2].xaxis.get_majorticklabels(), rotation=90) | |
| + plt.setp(ax[3].xaxis.get_majorticklabels(), rotation=90) | |
| + | |
| + ''' | |
| + ax[0].grid() | |
| + ax[1].grid() | |
| + ax[2].grid() | |
| + ax[3].grid() | |
| + ''' | |
| + | |
| + for i in range(4): | |
| + # vertical grid lines | |
| + ax[i].get_xaxis().grid(True, linestyle=':', linewidth=0.5) | |
| + # horizontal grid lines | |
| + ax[i].get_yaxis().grid(True, linestyle=':', linewidth=0.5) | |
| + | |
| + legend_alpha=0.5 | |
| + ax[0].legend(loc='lower center', prop={'size':12}, fancybox=True, | |
| + framealpha=legend_alpha) | |
| + | |
| + #plt.subplots_adjust(wspace = .05) # doesn't work with tight_layout() | |
| + plt.tight_layout() | |
| + #plt.MaxNLocator(nbins=1) # doesn't work? | |
| + ax[0].locator_params(nbins=5) | |
| + ax[2].locator_params(nbins=5) | |
| + ax[3].locator_params(nbins=5) | |
| + | |
| + sns.despine() # remove chartjunk | |
| + | |
| + filename = 'halfshear-darcy-internals-k_c=%.0e.pdf' % (k_c) | |
| + plt.savefig(filename) | |
| + shutil.copyfile(filename, '/home/adc/articles/own/2/graphics/' + filename) | |
| + print(filename) | |
| diff --git a/python/sphere.py b/python/sphere.py | |
| t@@ -6785,7 +6785,8 @@ class sim: | |
| i_max = sb.status() | |
| # use largest difference in p from 0 as +/- limit on colormap | |
| #print i_min, i_max | |
| - p_ext = numpy.max(numpy.abs(pres)) | |
| + #p_ext = numpy.max(numpy.abs(pres)) | |
| + p_ext = numpy.max(numpy.abs(pres[0:9,:])) # for article2 | |
| if sb.wmode[0] == 3: | |
| x = t | |
| t@@ -6803,7 +6804,8 @@ class sim: | |
| else: | |
| im1 = ax.pcolormesh( | |
| x, zpos_c, pres, | |
| - cmap=matplotlib.cm.get_cmap('bwr'), | |
| + #cmap=matplotlib.cm.get_cmap('bwr'), | |
| + cmap=matplotlib.cm.get_cmap('RdBu_r'), | |
| #cmap=matplotlib.cm.get_cmap('coolwarm'), | |
| vmin=-p_ext, vmax=p_ext, | |
| rasterized=True) | |
| t@@ -6824,6 +6826,9 @@ class sim: | |
| if xlim: | |
| ax.set_xlim([x[0], x[-1]]) | |
| + # for article2 | |
| + ax.set_ylim([zpos_c[0], zpos_c[9]]) | |
| + | |
| cb = plt.colorbar(im1) | |
| cb.set_label('$p_\\text{f}$ [kPa]') | |
| cb.solids.set_rasterized(True) |