Peano
Loading...
Searching...
No Matches
TreeReader.py
Go to the documentation of this file.
1import numpy as np
2import matplotlib.pyplot as plt
3from scipy import io
4import os
5import math
6
7import re
8from collections import defaultdict
9
10def round_sig(x, sig):
11 return float(np.format_float_positional(x, precision=sig, unique=False, trim='k'))
12
13def read_patches(file_path, size_groups):
14 with open(file_path, "r") as f:
15 content = f.read()
16
17 # Regular expression to extract offset and size
18 patch_pattern = re.compile(
19 r'begin patch.*?offset ([\d.eE+\-]+ [\d.eE+\-]+ [\d.eE+\-]+).*?'
20 r'size ([\d.eE+\-]+ [\d.eE+\-]+ [\d.eE+\-]+)',
21 re.DOTALL
22 )
23
24 # Find all matches
25 for match in patch_pattern.findall(content):
26 offset, size = match
27 size_groups[size].append(offset) # Group offsets by size
28
29 return size_groups
30
31
32def main():
33 #main start here
34 #input parameters
35 #python3 ccz4.py -impl fd4-rk1-adaptive -s gauge -maxh 0.05 -minh 0.02 -ps 3 -plt 0.1 -et 0.05 -exn test --domain_r 0.5 --ReSwi 1 -cfl 0.1 --KOSigma 8.0
36
37 folder_path = 'case2'
38 prefix = 'grid-'
39 # List all files in the folder with the specified prefix
40 datafiles = [f for f in os.listdir(folder_path) if f.startswith(prefix)]
41
42 dimension=3
43
44 #extract grid infomation
45 size_groups = defaultdict(list) # Dictionary to store {size: [offsets]}
46 for file_path in datafiles:
47 read_patches(folder_path+'/'+file_path, size_groups)
48
49 for size, offsets in size_groups.items():
50 print(f"Size: {size} -> Count: {len(offsets)}")
51 #print("Offsets:")
52 #for offset in offsets:
53 # print(f" {offset}")
54 #print("-" * 40)
55
56 #find the domain info directly from grid plot
57 max_size=0
58 for size in size_groups.keys():
59 size_tuple = tuple(map(float, size.split()))
60 if size_tuple[0]>max_size:
61 max_size=size_tuple[0]
62 max_size_key=size
63 #print(max_size)
64
65 leftmost_offset=[999,999,999]
66 for offset in size_groups[max_size_key]:
67 offset_tuple = tuple(map(float, offset.split()))
68 #print(offset_tuple)
69 for m in range(dimension):
70 if offset_tuple[m]<leftmost_offset[m]:
71 leftmost_offset[m]=offset_tuple[m]
72 leftmost_offset_key=offset
73 #print(leftmost_offset, leftmost_offset_key)
74
75 domain_offset = tuple(leftmost_offset)#tuple(map(float, leftmost_offset_key.split()))
76 domain_size = tuple(map(float, max_size_key.split()))
77 domain_size = tuple( round_sig(x * 3,5) for x in domain_size)
78
79 print(domain_offset, domain_size)
80
81 #preparing tree matrices
82 total_level=len(size_groups.keys())
83 #for i in range(total_level):
84 # print("level "+str(i)+" Matrix total entries:", (3*(3**i))**dimension,"size: "+str(domain_size[0]/3/3**i))
85 tree_matrix=[None]*total_level
86 tree_patches=[None]*total_level
87 #print(tree_matrix)
88
89 #calculate the tree matrices
90 for size, offsets in size_groups.items():
91 size_tuple = tuple(map(float, size.split()))
92 level=int( math.log( int(round_sig(domain_size[0]/size_tuple[0],1)), 3) )
93 matrix_size=(3**level)
94 #print(level, matrix_size)
95
96 matrix=np.zeros((matrix_size, matrix_size, matrix_size), dtype=bool)
97 for offset in offsets:
98 offset_tuple = tuple(map(float, offset.split()))
99 index=[-1,-1,-1]
100 for i in range(len(offset_tuple)):
101 index[i]=round((offset_tuple[i]-domain_offset[i])/size_tuple[i])
102 matrix[tuple(index)]=1
103 tree_matrix[level-1]=matrix
104 tree_patches[level-1]=len(offsets)
105
106 for i in range(total_level):
107 print("level "+str(i)+":",tree_matrix[i].shape)
108
109
110 #plotting stuff
111 fig = plt.figure(figsize=(12, 4))
112
113 for i in range(total_level):
114 ax = fig.add_subplot(1,total_level,i+1, projection='3d')
115 x, y, z = np.where(tree_matrix[i])
116 ax.scatter(x, y, z, c='black', marker='s',s=50*27/3**(1+i)) # 'c' controls color, 'marker' controls shape
117
118 # Set labels
119 ax.set_xlabel("X"); ax.set_ylabel("Y"); ax.set_zlabel("Z")
120 ax.set_xlim([0,3**(1+i)-1]); ax.set_ylim([0,3**(1+i)-1]); ax.set_zlim([0,3**(1+i)-1]);
121 ax.set_title("Level="+str(i)+", Entries="+str(tree_patches[i]))
122
123 # Show the 3D plot
124 plt.show()
125 plt.savefig("TreeStructure.pdf")
126 plt.savefig("TreeStrucutre.png")
127
128
129if __name__ == "__main__":
130 main()
round_sig(x, sig)
Definition TreeReader.py:10
read_patches(file_path, size_groups)
Definition TreeReader.py:13