Mechanics of Defect Evolution Library
Loading...
Searching...
No Matches
create_mesh_library_figure.py
Go to the documentation of this file.
1"""Render actual library mesh exterior triangles, colored by region ID."""
2from pathlib import Path
3from collections import defaultdict
4from itertools import combinations
5import numpy as np
6import matplotlib
7matplotlib.use('Agg')
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)
21 for tet,gid in tets:
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():
27 if len(regions)==1:
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)