source: issm/trunk/src/m/plot/plot_icefront.py@ 24313

Last change on this file since 24313 was 24313, checked in by Mathieu Morlighem, 5 years ago

merged trunk-jpl and trunk for revision 24310

File size: 2.6 KB
Line 
1import numpy as np
2from processmesh import processmesh
3from mpl_toolkits.mplot3d.art3d import Line3DCollection
4from mpl_toolkits.axes_grid1.inset_locator import inset_axes
5from mpl_toolkits.mplot3d import Axes3D
6
7
8def plot_icefront(md, options, fig, ax):
9 #PLOT_ICEFRONT - plot segment on neumann BC
10 #
11 # Usage:
12 # plot_icefront(md, options, width, i)
13 #
14 # See also: PLOTMODEL
15 #process mesh and data
16 x, y, z, elements, is2d, isplanet = processmesh(md, [], options)
17
18 icenodes = md.mask.ice_levelset < 0
19 iceelement = np.sum(icenodes[elements], axis=1)
20
21 if options.exist('layer'):
22 nodes_per_elt = np.shape(md.mesh.elements2d)[1]
23 else:
24 nodes_per_elt = np.shape(md.mesh.elements)[1]
25 #icefront check
26 icefront = np.where(np.logical_and(iceelement != nodes_per_elt, iceelement != 0))
27
28 #plot mesh
29 if is2d:
30 ax.triplot(x, y, elements)
31
32 #highlight elements on neumann
33 if len(icefront[0]) > 0:
34 colors = np.asarray([0.5 for element in elements[icefront]])
35 ax.tripcolor(x, y, elements[icefront], facecolors=colors, alpha=0.5, label='elements on ice front')
36 else:
37 ax = inset_axes(ax, width='100%', height='100%', loc=3, borderpad=0, axes_class=Axes3D)
38
39 AB = elements[:, 0:2]
40 BC = elements[:, 1:3]
41 CA = np.vstack((elements[:, 2], elements[:, 0])).T
42 DE = elements[:, 3:5]
43 EF = elements[:, 4:]
44 FD = np.vstack((elements[:, 5], elements[:, 3])).T
45 AD = np.vstack((elements[:, 0], elements[:, 3])).T
46 BE = np.vstack((elements[:, 1], elements[:, 4])).T
47 CF = np.vstack((elements[:, 2], elements[:, 5])).T
48
49 tmpa = np.vstack((AB, BC, CA, DE, EF, FD, AD, BE, CF))
50 #deleting segments that appear multiple times
51 tmpb = np.ascontiguousarray(tmpa).view(np.dtype((np.void, tmpa.dtype.itemsize * tmpa.shape[1])))
52 _, idx = np.unique(tmpb, return_index=True)
53 triel = tmpa[idx]
54
55 for t, triangle in enumerate(triel):
56 tri = list(zip(x[triangle], y[triangle], z[triangle]))
57 facecolor = [0, 0, 0]
58 if t in icefront:
59 facecolor = [0.5, 0.5, 0.5]
60 pl3 = Line3DCollection([tri], edgecolor='r', facecolor=facecolor)
61 ax.add_collection3d(pl3)
62
63 ax.set_xlim([min(x), max(x)])
64 ax.set_ylim([min(y), max(y)])
65 ax.set_zlim([min(z), max(z)])
66 #highlight elements on neumann
67
68 #apply options
69 options.addfielddefault('title', 'Neumann boundary conditions')
70 options.addfielddefault('colorbar', 'off')
Note: See TracBrowser for help on using the repository browser.