31def read_SFC(file_path, domain_offset, domain_size):
32 with open(file_path,
"r")
as f:
36 patch_pattern = re.compile(
37 r'begin patch.*?offset ([\d.eE+\-]+ [\d.eE+\-]+ [\d.eE+\-]+).*?'
38 r'size ([\d.eE+\-]+ [\d.eE+\-]+ [\d.eE+\-]+)',
44 for match
in patch_pattern.findall(content):
47 size_tuple = tuple(map(float, size.split()))
48 offset_tuple = tuple(map(float, offset.split()))
50 index_entry[0]=int( math.log( int(
round_sig(domain_size[0]/size_tuple[0],1)), 3) )
51 for i
in range(len(offset_tuple)):
52 index_entry[i+1]=round((offset_tuple[i]-domain_offset[i])/size_tuple[i])
54 index_map.append(index_entry)
73 datafiles = [f
for f
in os.listdir(folder_path)
if f.startswith(prefix)]
76 size_groups = defaultdict(list)
77 for file_path
in datafiles:
80 for size, offsets
in size_groups.items():
81 print(f
"Size: {size} -> Count: {len(offsets)}")
89 for size
in size_groups.keys():
90 size_tuple = tuple(map(float, size.split()))
91 if size_tuple[0]>max_size:
92 max_size=size_tuple[0]
96 leftmost_offset=[999,999,999]
97 for offset
in size_groups[max_size_key]:
98 offset_tuple = tuple(map(float, offset.split()))
100 for m
in range(dimension):
101 if offset_tuple[m]<leftmost_offset[m]:
102 leftmost_offset[m]=offset_tuple[m]
103 leftmost_offset_key=offset
106 domain_offset = tuple(leftmost_offset)
107 domain_size = tuple(map(float, max_size_key.split()))
108 domain_size = tuple(
round_sig(x * 3,5)
for x
in domain_size)
110 print(domain_offset, domain_size)
113 total_level=len(size_groups.keys())
116 tree_matrix=[
None]*total_level
117 tree_patches=[
None]*total_level
121 for size, offsets
in size_groups.items():
122 size_tuple = tuple(map(float, size.split()))
123 level=int( math.log( int(
round_sig(domain_size[0]/size_tuple[0],1)), 3) )
124 matrix_size=(3**level)
127 matrix=np.zeros((matrix_size, matrix_size, matrix_size), dtype=np.ubyte)
128 for offset
in offsets:
129 offset_tuple = tuple(map(float, offset.split()))
131 for i
in range(len(offset_tuple)):
132 index[i]=round((offset_tuple[i]-domain_offset[i])/size_tuple[i])
133 matrix[tuple(index)]=1
134 tree_matrix[level-1]=matrix
135 tree_patches[level-1]=len(offsets)
137 for i
in range(total_level):
138 print(
"level "+str(i)+
":",tree_matrix[i].shape)
143 for level
in range(total_level):
144 for i
in range(3**(level+1)):
145 for j
in range(3**(level+1)):
146 for k
in range(3**(level+1)):
147 if tree_matrix[level][i][j][k]==1:
148 if level == total_level-1:
149 leaves_count=leaves_count+1
150 tree_matrix[level][i][j][k]=255
151 elif tree_matrix[level+1][3*i][3*j][3*k]==0:
152 leaves_count=leaves_count+1
153 tree_matrix[level][i][j][k]=255
156 print(
"Total leaves:", leaves_count)
157 target_size=int(leaves_count/subtree_number)
158 print(
"Subtree number:", subtree_number,
"Expected subtree size:",target_size)
160 index_map=
read_SFC(folder_path+
'/'+file_path, domain_offset, domain_size)
163 for i in range(len(index_map)):
164 print(index_map[i], end=' ')
165 if (i<len(index_map)-1):
166 if index_map[i][0] != index_map[i+1][0]:
170 current_subtree_label=2
171 current_subtree_size=0
172 for current_node
in index_map:
173 current_node_flag=tree_matrix[current_node[0]-1][current_node[1]][current_node[2]][current_node[3]]
174 if current_node_flag==1:
175 tree_matrix[current_node[0]-1][current_node[1]][current_node[2]][current_node[3]]=current_subtree_label
176 elif current_node_flag==255:
177 tree_matrix[current_node[0]-1][current_node[1]][current_node[2]][current_node[3]]=current_subtree_label
178 current_subtree_size=current_subtree_size+1
180 if current_subtree_size >= target_size:
181 current_subtree_label=current_subtree_label+1