1"""Render actual library mesh exterior triangles, colored by region ID."""
2from pathlib
import Path
3from collections
import defaultdict
4from itertools
import combinations
8import matplotlib.pyplot
as plt
9from mpl_toolkits.mplot3d.art3d
import Poly3DCollection
10root=Path(__file__).resolve().parents[1]
11items=[(
'unitCube24.msh',
'(a) Cube'),(
'unitCylinderAR2_2828.msh',
'(b) Cylinder'),(
'bicrystal_48.msh',
'(c) Bicrystal'),(
'poly10_periodicXYZ.msh',
'(d) Periodic polycrystal')]
12fig=plt.figure(figsize=(10,7.4));plt.rcParams.update({
'font.family':
'DejaVu Sans',
'pdf.fonttype':42})
13for panel,(name,title)
in enumerate(items,1):
14 lines=(root.parent/
'Library/Meshes'/name).read_text().splitlines()
15 k=lines.index(
'$Nodes');n=int(lines[k+1]);pts={int(t[0]):np.array(t[1:4],float)
for t
in (l.split()
for l
in lines[k+2:k+2+n])}
16 k=lines.index(
'$Elements');tets=[]
17 for l
in lines[k+2:k+2+int(lines[k+1])]:
18 a=list(map(int,l.split()))
19 if a[1]
in (4,11):tets.append((a[3+a[2]:3+a[2]+4],a[4]))
20 faces=defaultdict(list)
22 for f
in combinations(tet,3):faces[tuple(sorted(f))].append(gid)
23 ids=sorted(set(g
for _,g
in tets));palette=plt.get_cmap(
'tab10')
24 xyz=np.array(list(pts.values()));center=(xyz.min(0)+xyz.max(0))/2;scale=np.max(np.ptp(xyz,axis=0))
25 triangles=[];colors=[]
26 for f,regions
in faces.items():
28 triangles.append([(pts[v]-center)/scale
for v
in f]);colors.append(palette(ids.index(regions[0])%10))
29 ax=fig.add_subplot(2,2,panel,projection=
'3d')
30 ax.add_collection3d(Poly3DCollection(triangles,facecolors=colors,edgecolors=
'#253e50',linewidths=.22))
31 ax.set(xlim=(-.55,.55),ylim=(-.55,.55),zlim=(-.55,.55));ax.set_box_aspect((1,1,1),zoom=1.2)
32 ax.view_init(22,-55);ax.set_proj_type(
'ortho');ax.set_axis_off();ax.set_title(title,fontsize=12,pad=0)
33 ax.text2D(.5,-.01,name,transform=ax.transAxes,ha=
'center',fontsize=9)
34 ax.text2D(.5,-.08,f
'{len(ids)} region'+(
's' if len(ids)>1
else '')+f
' | {len(tets):,} tetrahedra',transform=ax.transAxes,ha=
'center',fontsize=9,color=
'#203547')
35 print(name,len(ids),len(tets))
36fig.subplots_adjust(left=0,right=1,top=.95,bottom=.08,wspace=.02,hspace=.25)
37for ext
in [
'pdf',
'png']:fig.savefig(root/
'figures'/f
'mesh_library_examples.{ext}',bbox_inches=
'tight',dpi=170)