tMatplotlib works as optional dependency, fix plotting calls, add verbose optio… | |
git clone git://src.adamsgaard.dk/sphere | |
Log | |
Files | |
Refs | |
LICENSE | |
--- | |
commit 3b2239705ebb3dff84425256a5d90456ba28fe5a | |
parent 6ec51c0ddd515f3381c79c72e4d0666da6231197 | |
Author: Anders Damsgaard <[email protected]> | |
Date: Mon, 2 Sep 2019 06:06:55 +0200 | |
Matplotlib works as optional dependency, fix plotting calls, add verbose option | |
Diffstat: | |
M python/sphere.py | 216 +++++++++++++++++++++++------… | |
1 file changed, 162 insertions(+), 54 deletions(-) | |
--- | |
diff --git a/python/sphere.py b/python/sphere.py | |
t@@ -1,25 +1,30 @@ | |
#!/usr/bin/env python | |
import math | |
import numpy | |
-import matplotlib | |
-matplotlib.use('Agg') | |
-import matplotlib.pyplot as plt | |
-import matplotlib.collections | |
-matplotlib.rcParams.update({'font.size': 7, 'font.family': 'serif'}) | |
-matplotlib.rc('text', usetex=True) | |
-matplotlib.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"] | |
-from matplotlib.font_manager import FontProperties | |
+try: | |
+ import matplotlib | |
+ matplotlib.use('Agg') | |
+ import matplotlib.pyplot as plt | |
+ import matplotlib.collections | |
+ matplotlib.rcParams.update({'font.size': 7, 'font.family': 'serif'}) | |
+ matplotlib.rc('text', usetex=True) | |
+ matplotlib.rcParams['text.latex.preamble'] = [r"\usepackage{amsmath}"] | |
+ from matplotlib.font_manager import FontProperties | |
+ py_mpl = True | |
+except ImportError: | |
+ print('Info: Could not find "matplotlib" python module. ' + | |
+ 'Plotting functionality will be unavailable') | |
+ py_mpl = False | |
import subprocess | |
import pickle as pl | |
try: | |
import vtk | |
+ py_vtk = True | |
except ImportError: | |
- print('Warning: Could not find "vtk" python module. ' + | |
+ print('Info: Could not find "vtk" python module. ' + | |
'Fluid VTK calls will be unavailable') | |
print('Consider installing with `pip install --user vtk`') | |
py_vtk = False | |
-else: | |
- py_vtk = True | |
numpy.seterr(all='warn', over='raise') | |
t@@ -1931,7 +1936,7 @@ class sim: | |
:type verbose: bool | |
''' | |
- if py_vtk == False: | |
+ if not py_vtk: | |
print('Error: vtk module not found, cannot writeVTKforces.') | |
return | |
t@@ -2051,7 +2056,7 @@ class sim: | |
:param verbose: Show diagnostic information (default = True) | |
:type verbose: bool | |
''' | |
- if py_vtk == False: | |
+ if not py_vtk: | |
print('Error: vtk module not found, cannot writeFluidVTK.') | |
return | |
t@@ -2202,7 +2207,7 @@ class sim: | |
:type resolution: int | |
''' | |
- if py_vtk == False: | |
+ if not py_vtk: | |
print('Error: vtk module not found, cannot show scene.') | |
return | |
t@@ -2398,7 +2403,7 @@ class sim: | |
+ str(psd) + '). Valid values are \'uni\' or \'logn\'') | |
# Show radii as histogram | |
- if histogram: | |
+ if histogram and py_mpl: | |
fig = plt.figure(figsize=(8,8)) | |
figtitle = 'Particle size distribution, {0} particles'.format(\ | |
self.np) | |
t@@ -4672,7 +4677,7 @@ class sim: | |
fh.write('module load cuda/6.0\n') | |
fh.write('module load python/2.7.4\n') | |
fh.write('module load numpy/1.7.1/python.2.7.4\n') | |
- fh.write('module load matplotlib/1.7.1/python.2.7.4\n') | |
+ #fh.write('module load matplotlib/1.7.1/python.2.7.4\n') | |
fh.write('echo "`whoami`@`hostname`\n') | |
fh.write('echo "Start at `date`\n') | |
fh.write('nvidia-smi\n') | |
t@@ -5113,7 +5118,7 @@ class sim: | |
plt.figure(figsize=[4,4]) | |
- ax = plt.subplot(111, polar=True, axisbg='w') | |
+ ax = plt.subplot(111, polar=True) | |
ax.scatter(strikelist, diplist, c='k', marker='+') | |
ax.set_rmax(90) | |
ax.set_rticks([]) | |
t@@ -5131,6 +5136,9 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found, cannot bondsRose.') | |
+ return | |
# loop through these contacts and find the strike and dip of the | |
# contacts | |
strikelist = [] # strike direction of the normal vector, [0:360[ | |
t@@ -5170,7 +5178,7 @@ class sim: | |
strikelist.append(2.0*numpy.pi - math.acos(dx/dhoriz)) | |
plt.figure(figsize=[4,4]) | |
- ax = plt.subplot(111, polar=True, axisbg='w') | |
+ ax = plt.subplot(111, polar=True) | |
ax.scatter(strikelist, diplist, c='k', marker='+') | |
ax.set_rmax(90) | |
ax.set_rticks([]) | |
t@@ -5219,6 +5227,9 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found, cannot sheardisp.') | |
+ return | |
# Bin data and error bars for alternative visualization | |
h_total = numpy.max(self.x[:,2]) - numpy.min(self.x[:,2]) | |
t@@ -5267,6 +5278,10 @@ class sim: | |
the porosity in | |
:type zslices: int | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found, cannot sheardisp.') | |
+ return | |
+ | |
porosity, depth = self.porosity(zslices) | |
plt.figure(figsize=[4, 4]) | |
t@@ -5318,6 +5333,10 @@ class sim: | |
:type verbose: bool | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (thinsection_x1x3).') | |
+ return | |
+ | |
if x2 == 'center' : | |
x2 = (self.L[1] - self.origo[1]) / 2.0 | |
t@@ -5597,8 +5616,12 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
''' | |
- self.writebin(verbose=False) | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotContacts).') | |
+ return | |
+ | |
+ self.writebin(verbose=False) | |
subprocess.call("cd .. && ./forcechains -f txt input/" + self.sid \ | |
+ ".bin > python/contacts-tmp.txt", shell=True) | |
t@@ -5662,7 +5685,7 @@ class sim: | |
j += 1 | |
fig = plt.figure(figsize=figsize) | |
- ax = plt.subplot(111, polar=True, axisbg='white') | |
+ ax = plt.subplot(111, polar=True) | |
cs = ax.scatter(strikelist, 90. - diplist, marker='o', | |
c=forcemagnitude, | |
s=forcemagnitude/f_n_max*40., | |
t@@ -5779,14 +5802,13 @@ class sim: | |
graphics_format,\ | |
transparent=False) | |
- | |
- | |
plt.close() | |
if return_data: | |
return data, strikelist, diplist, forcemagnitude, alpha, f_n_max | |
- def plotFluidPressuresY(self, y = -1, graphics_format = 'png'): | |
+ def plotFluidPressuresY(self, y = -1, graphics_format = 'png', | |
+ verbose = True): | |
''' | |
Plot fluid pressures in a plane normal to the second axis. | |
The plot is saved in the current folder with the format | |
t@@ -5797,26 +5819,37 @@ class sim: | |
:type y: int | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
See also: :func:`writeFluidVTK()` and :func:`plotFluidPressuresZ()` | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotFluidPressuresY).') | |
+ return | |
+ | |
if y == -1: | |
y = self.num[1]/2 | |
plt.figure(figsize=[8,8]) | |
plt.title('Fluid pressures') | |
- imgplt = plt.imshow(self.f_rho[:,y,:].T, origin='lower') | |
+ imgplt = plt.imshow(self.p_f[:,y,:].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
plt.xlabel('$x_1$') | |
plt.ylabel('$x_3$') | |
plt.colorbar() | |
- plt.savefig('p_f-' + self.sid + \ | |
- '-y' + str(y) + '.' + graphics_format, transparent=False) | |
+ filename = 'p_f-' + self.sid + '-y' + str(y) + '.' + graphics_format | |
+ plt.savefig(filename, transparent=False) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
+ plt.clf() | |
+ plt.close() | |
- def plotFluidPressuresZ(self, z = -1, graphics_format = 'png'): | |
+ def plotFluidPressuresZ(self, z = -1, graphics_format = 'png', | |
+ verbose = True): | |
''' | |
Plot fluid pressures in a plane normal to the third axis. | |
The plot is saved in the current folder with the format | |
t@@ -5827,26 +5860,37 @@ class sim: | |
:type z: int | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
See also: :func:`writeFluidVTK()` and :func:`plotFluidPressuresY()` | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotFluidPressuresZ).') | |
+ return | |
+ | |
if z == -1: | |
z = self.num[2]/2 | |
plt.figure(figsize=[8,8]) | |
plt.title('Fluid pressures') | |
- imgplt = plt.imshow(self.f_rho[:,:,z].T, origin='lower') | |
+ imgplt = plt.imshow(self.p_f[:,:,z].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
plt.xlabel('$x_1$') | |
plt.ylabel('$x_2$') | |
plt.colorbar() | |
- plt.savefig('p_f-' + self.sid + \ | |
- '-z' + str(z) + '.' + graphics_format, transparent=False) | |
+ filename = 'p_f-' + self.sid + '-z' + str(z) + '.' + graphics_format | |
+ plt.savefig(filename, transparent=False) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
+ plt.clf() | |
+ plt.close() | |
- def plotFluidVelocitiesY(self, y = -1, graphics_format = 'png'): | |
+ def plotFluidVelocitiesY(self, y = -1, graphics_format = 'png', | |
+ verbose = True): | |
''' | |
Plot fluid velocities in a plane normal to the second axis. | |
The plot is saved in the current folder with the format | |
t@@ -5857,10 +5901,16 @@ class sim: | |
:type y: int | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
See also: :func:`writeFluidVTK()` and :func:`plotFluidVelocitiesZ()` | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotFluidVelocitiesY).') | |
+ return | |
+ | |
if y == -1: | |
y = self.num[1]/2 | |
t@@ -5868,7 +5918,7 @@ class sim: | |
plt.figure(figsize=[8,8]) | |
plt.subplot(131) | |
- imgplt = plt.imshow(self.f_v[:,y,:,0].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,y,:,0].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5878,7 +5928,7 @@ class sim: | |
plt.colorbar(orientation = 'horizontal') | |
plt.subplot(132) | |
- imgplt = plt.imshow(self.f_v[:,y,:,1].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,y,:,1].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5888,7 +5938,7 @@ class sim: | |
plt.colorbar(orientation = 'horizontal') | |
plt.subplot(133) | |
- imgplt = plt.imshow(self.f_v[:,y,:,2].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,y,:,2].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5897,10 +5947,15 @@ class sim: | |
plt.ylabel('$x_3$') | |
plt.colorbar(orientation = 'horizontal') | |
- plt.savefig('v_f-' + self.sid + \ | |
- '-y' + str(y) + '.' + graphics_format, transparent=False) | |
+ filename = 'v_f-' + self.sid + '-y' + str(y) + '.' + graphics_format | |
+ plt.savefig(filename, transparent=False) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
+ plt.clf() | |
+ plt.close() | |
- def plotFluidVelocitiesZ(self, z = -1, graphics_format = 'png'): | |
+ def plotFluidVelocitiesZ(self, z = -1, graphics_format = 'png', | |
+ verbose = True): | |
''' | |
Plot fluid velocities in a plane normal to the third axis. | |
The plot is saved in the current folder with the format | |
t@@ -5911,9 +5966,14 @@ class sim: | |
:type z: int | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
See also: :func:`writeFluidVTK()` and :func:`plotFluidVelocitiesY()` | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotFluidVelocitiesZ).') | |
+ return | |
if z == -1: | |
z = self.num[2]/2 | |
t@@ -5922,7 +5982,7 @@ class sim: | |
plt.figure(figsize=[8,8]) | |
plt.subplot(131) | |
- imgplt = plt.imshow(self.f_v[:,:,z,0].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,:,z,0].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5932,7 +5992,7 @@ class sim: | |
plt.colorbar(orientation = 'horizontal') | |
plt.subplot(132) | |
- imgplt = plt.imshow(self.f_v[:,:,z,1].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,:,z,1].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5942,7 +6002,7 @@ class sim: | |
plt.colorbar(orientation = 'horizontal') | |
plt.subplot(133) | |
- imgplt = plt.imshow(self.f_v[:,:,z,2].T, origin='lower') | |
+ imgplt = plt.imshow(self.v_f[:,:,z,2].T, origin='lower') | |
imgplt.set_interpolation('nearest') | |
#imgplt.set_interpolation('bicubic') | |
#imgplt.set_cmap('hot') | |
t@@ -5951,11 +6011,14 @@ class sim: | |
plt.ylabel('$x_2$') | |
plt.colorbar(orientation = 'horizontal') | |
- plt.savefig('v_f-' + self.sid + \ | |
- '-z' + str(z) + '.' + graphics_format, transparent=False) | |
- | |
+ filename = 'v_f-' + self.sid + '-z' + str(z) + '.' + graphics_format | |
+ plt.savefig(filename, transparent=False) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
+ plt.clf() | |
+ plt.close() | |
- def plotFluidDiffAdvPresZ(self, graphics_format = 'png'): | |
+ def plotFluidDiffAdvPresZ(self, graphics_format = 'png', verbose = True): | |
''' | |
Compare contributions to the velocity from diffusion and advection, | |
assuming the flow is 1D along the z-axis, phi = 1, and dphi = 0. This | |
t@@ -5966,7 +6029,12 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotFluidDiffAdvPresZ).… | |
+ return | |
# The v_z values are read from self.v_f[0,0,:,2] | |
dz = self.L[2]/self.num[2] | |
t@@ -6016,8 +6084,11 @@ class sim: | |
plt.grid() | |
plt.tight_layout() | |
- plt.savefig('../output/{}-diff_adv-t={:.2e}s-mu={:.2e}Pa-s.{}'.format(\ | |
- self.sid, self.time_current[0], self.mu[0], graphics_format)) | |
+ filename = '../output/{}-diff_adv-t={:.2e}s-mu={:.2e}Pa-s.{}'.format( | |
+ self.sid, self.time_current[0], self.mu[0], graphics_format) | |
+ plt.savefig(filename) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
plt.clf() | |
plt.close(fig) | |
t@@ -6042,7 +6113,7 @@ class sim: | |
1.0e-16) | |
return self.Re | |
- def plotLoadCurve(self, graphics_format='png'): | |
+ def plotLoadCurve(self, graphics_format='png', verbose=True): | |
''' | |
Plot the load curve (log time vs. upper wall movement). The plot is | |
saved in the current folder with the file name | |
t@@ -6054,7 +6125,13 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotLoadCurve).') | |
+ return | |
+ | |
t = numpy.empty(self.status()) | |
H = numpy.empty_like(t) | |
sb = sim(self.sid, fluid=self.fluid) | |
t@@ -6105,7 +6182,10 @@ class sim: | |
plt.axhline(y = self.H100, color='gray') | |
plt.axvline(x = self.t50, color='red') | |
plt.grid() | |
- plt.savefig(self.sid + '-loadcurve.' + graphics_format) | |
+ filename = self.sid + '-loadcurve.' + graphics_format | |
+ plt.savefig(filename) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
plt.clf() | |
plt.close(fig) | |
t@@ -6120,7 +6200,7 @@ class sim: | |
self.conv = numpy.loadtxt('../output/' + self.sid + '-conv.log', | |
dtype=numpy.int32) | |
- def plotConvergence(self, graphics_format='png'): | |
+ def plotConvergence(self, graphics_format='png', verbose=True): | |
''' | |
Plot the convergence evolution in the CFD solver. The plot is saved | |
in the output folder with the file name | |
t@@ -6128,9 +6208,15 @@ class sim: | |
:param graphics_format: Save the plot in this format | |
:type graphics_format: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
See also: :func:`convergence()` | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotConvergence).') | |
+ return | |
+ | |
fig = plt.figure() | |
self.convergence() | |
t@@ -6139,7 +6225,10 @@ class sim: | |
plt.ylabel('Jacobi iterations') | |
plt.plot(self.conv[:,0], self.conv[:,1]) | |
plt.grid() | |
- plt.savefig(self.sid + '-conv.' + graphics_format) | |
+ filename = self.sid + '-conv.' + graphics_format | |
+ plt.savefig(filename) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
plt.clf() | |
plt.close(fig) | |
t@@ -6169,7 +6258,13 @@ class sim: | |
:type plotstyle: str | |
:param outformat: File format of the output plot | |
:type outformat: str | |
+ :param verbose: Print output filename after saving | |
+ :type verbose: bool | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (plotSinFunction).') | |
+ return | |
+ | |
fig = plt.figure(figsize=[8,6]) | |
steps_left = (self.time_total[0] - self.time_current[0]) \ | |
/self.time_file_dt[0] | |
t@@ -6182,7 +6277,8 @@ class sim: | |
plt.tight_layout() | |
filename = self.sid + '-sin.' + outformat | |
plt.savefig(filename) | |
- print(filename) | |
+ if verbose: | |
+ print(filename) | |
plt.clf() | |
plt.close(fig) | |
t@@ -6204,7 +6300,7 @@ class sim: | |
self.w_sigma0_A[0] = A | |
self.w_sigma0_f[0] = f | |
- if plot: | |
+ if plot and py_mpl: | |
self.plotSinFunction(self.w_sigma0[0], A, f, phi=0.0, | |
xlabel='$t$ [s]', ylabel='$\\sigma_0$ [Pa]') | |
t@@ -6251,13 +6347,18 @@ class sim: | |
''' | |
self.setFluidPressureModulation(A = 0.0, f = 0.0) | |
- def plotPrescribedFluidPressures(self, graphics_format='png'): | |
+ def plotPrescribedFluidPressures(self, graphics_format='png', | |
+ verbose=True): | |
''' | |
Plot the prescribed fluid pressures through time that may be | |
modulated through the class parameters p_mod_A, p_mod_f, and p_mod_phi. | |
The plot is saved in the output folder with the file name | |
'<simulation id>-pres.<graphics_format>'. | |
''' | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found ' + | |
+ '(plotPrescribedFluidPressures).') | |
+ return | |
fig = plt.figure() | |
conv = numpy.loadtxt('../output/' + self.sid + '-conv.log') | |
t@@ -6272,7 +6373,10 @@ class sim: | |
numpy.sin(2.0*numpy.pi*self.p_mod_f*t + self.p_mod_phi) | |
plt.plot(t, p, '.-') | |
plt.grid() | |
- plt.savefig('../output/' + self.sid + '-pres.' + graphics_format) | |
+ filename = '../output/' + self.sid + '-pres.' + graphics_format | |
+ plt.savefig(filename) | |
+ if verbose: | |
+ print('saved to ' + filename) | |
plt.clf() | |
plt.close(fig) | |
t@@ -6480,6 +6584,10 @@ class sim: | |
lastfile = self.status() | |
sb = sim(sid = self.sid, np = self.np, nw = self.nw, fluid = self.flui… | |
+ if not py_mpl: | |
+ print('Error: matplotlib module not found (visualize).') | |
+ return | |
+ | |
### Plotting | |
if outformat != 'txt': | |
if figsize: |