3 :synopsis: Generates PFLOTRAN or FEHM input from octree refined continuum mesh
4 .. moduleauthor:: Matthew Sweeney <msweeney2796@lanl.gov>
21 def upscale(self, mat_perm, mat_por, path='../'):
22 """ Generate permeabilities and porosities based on output of map2continuum.
29 Matrix permeability (in m^2)
35 perm_fehm.dat : text file
36 Contains permeability data for FEHM input
37 rock_fehm.dat : text file
38 Contains rock properties data for FEHM input
39 mesh_permeability.h5 : h5 file
40 Contains permeabilites at each node for PFLOTRAN input
41 mesh_porosity.h5 : h5 file
42 Contains porosities at each node for PFLOTRAN input
51 print(
"Generating permeability and porosity for octree mesh: Starting")
56 os.symlink(path +
'params.txt',
'params.txt')
59 num_poly, _, _, _, domain = mh.parse_params_file(quiet=
True)
61 aperture = np.genfromtxt(path +
'aperture.dat', skip_header=1)[:, -1]
62 normal_vectors = np.genfromtxt(path +
'normal_vectors.dat', delimiter=
' ')
64 if self.flow_solver ==
"FEHM":
65 with open(
"perm_fehm.dat",
"w")
as f:
67 with open(
"rock_fehm.dat",
"w")
as g:
71 for i
in range(1, num_poly + 1):
73 with open(
'frac1.inp',
'r')
as f:
74 line = f.readline().strip().split()
75 num_nodes = int(float(line[0]))
76 num_cells = int(float(line[1]))
78 perm_var = np.zeros(num_nodes,
'float')
79 por_var = np.zeros(num_nodes,
'float')
80 cv_vol = np.zeros(num_nodes,
'float')
81 iarray = np.zeros(num_nodes,
'=i4')
82 frac_vol = np.zeros(num_nodes,
'float')
83 permX = np.zeros(num_nodes,
'float')
84 permY = np.zeros(num_nodes,
'float')
85 permZ = np.zeros(num_nodes,
'float')
87 with open(
'frac{0}.inp'.format(i),
'r')
as f:
88 with open(
'area_sum{0}.inp'.format(i),
'r')
as g:
89 for j
in range(num_nodes):
94 for j
in range(num_cells):
107 for j
in range(num_nodes):
108 fline = f.readline().strip().split()
109 gline = g.readline().strip().split()
110 iarray[j] = int(float(gline[0]))
111 if int(float(gline[1])) != (num_poly + 1)
and float(
113 f_dict.setdefault(j + 1, []).append(
114 (i, float(gline[6])))
118 p_out = open(
"connections.p",
"wb")
119 pickle.dump(f_dict, p_out)
122 with open(
'full_mesh.uge',
'r')
as f:
124 for j
in range(num_nodes):
125 fline = f.readline().strip().split()
126 cv_vol[j] = float(fline[4])
130 for i
in range(1, num_nodes + 1):
134 for j
in range(len(f_dict[i])):
137 1] += aperture[f_dict[i][j][0] - 1] * f_dict[i][j][1]
138 por_var[i - 1] = frac_vol[i - 1] / cv_vol[i - 1]
139 if por_var[i - 1] == 0:
140 por_var[i - 1] = mat_por
141 if por_var[i - 1] > 1.0:
145 perm_tensor = np.zeros([3, 3])
147 for j
in range(len(f_dict[i])):
148 phi = (aperture[f_dict[i][j][0] - 1] *
149 f_dict[i][j][1]) / cv_vol[i - 1]
155 b = aperture[f_dict[i][j][0] - 1]
157 Omega = np.zeros([3, 3])
158 n1 = normal_vectors[f_dict[i][j][0] - 1][0]
159 n2 = normal_vectors[f_dict[i][j][0] - 1][1]
160 n3 = normal_vectors[f_dict[i][j][0] - 1][2]
161 Omega[0][0] = (n2)**2 + (n3)**2
162 Omega[0][1] = -n1 * n2
163 Omega[0][2] = -n3 * n1
164 Omega[1][0] = -n1 * n2
165 Omega[1][1] = (n3)**2 + (n1)**2
166 Omega[1][2] = -n2 * n3
167 Omega[2][0] = -n3 * n1
168 Omega[2][1] = -n2 * n3
169 Omega[2][2] = (n1)**2 + (n2)**2
170 perm_tensor += (phi * (b)**2 * Omega)
171 perm_tensor *= 1. / 12
174 permX[i - 1] = np.linalg.eigvals(perm_tensor)[0]
175 permY[i - 1] = np.linalg.eigvals(perm_tensor)[1]
176 permZ[i - 1] = np.linalg.eigvals(perm_tensor)[2]
179 permX[i - 1] += (1 - phi_sum) * mat_perm
180 permY[i - 1] += (1 - phi_sum) * mat_perm
181 permZ[i - 1] += (1 - phi_sum) * mat_perm
191 for j
in range(len(f_dict[i])):
192 n1_temp = normal_vectors[f_dict[i][j][0] - 1][0]
193 theta1_t = m.degrees(m.acos(n1_temp)) % 90
194 if abs(theta1_t - 45) <= min_n1:
197 n2_temp = normal_vectors[f_dict[i][j][0] - 1][1]
198 theta2_t = m.degrees(m.acos(n2_temp)) % 90
199 if abs(theta2_t - 45) <= min_n2:
202 n3_temp = normal_vectors[f_dict[i][j][0] - 1][2]
203 theta3_t = m.degrees(m.acos(n3_temp)) % 90
204 if abs(theta3_t - 45) <= min_n3:
208 sl = (2 * 2**(1. / 2) - 1) / -45.0
211 cf_x = sl * abs(theta1 - 45) + b
212 cf_y = sl * abs(theta2 - 45) + b
213 cf_z = sl * abs(theta3 - 45) + b
222 if permX[i - 1] == 0:
223 permX[i - 1] += mat_perm
224 if permY[i - 1] == 0:
225 permY[i - 1] += mat_perm
226 if permZ[i - 1] == 0:
227 permZ[i - 1] += mat_perm
228 perm_var[i - 1] = max(permX[i - 1], permY[i - 1], permZ[i - 1])
231 por_var[i - 1] = mat_por
232 perm_var[i - 1] = mat_perm
235 permX[i - 1] = mat_perm
236 permY[i - 1] = mat_perm
237 permZ[i - 1] = mat_perm
239 if self.flow_solver ==
"FEHM":
240 with open(
"perm_fehm.dat",
"a")
as f:
242 str(i) +
" " + str(i) +
" " +
"1" +
" " +
243 str(perm_var[i - 1]) +
" " + str(perm_var[i - 1]) +
" " +
244 str(perm_var[i - 1]) +
"\n")
245 with open(
"rock_fehm.dat",
"a")
as g:
247 str(i) +
" " + str(i) +
" " +
"1" +
" " +
"2165." +
" " +
248 "931." +
" " + str(por_var[i - 1]) +
"\n")
251 if self.flow_solver ==
"FEHM":
252 with open(
"perm_fehm.dat",
"a")
as f:
254 with open(
"rock_fehm.dat",
"a")
as g:
257 if self.flow_solver ==
"PFLOTRAN":
258 perm_filename =
'mesh_permeability.h5'
259 poros_filename =
'mesh_porosity.h5'
261 h5file = h5py.File(perm_filename, mode=
'w')
262 dataset_name =
'Cell Ids'
263 h5dset = h5file.create_dataset(dataset_name, data=iarray)
265 dataset_name =
'Permeability'
266 h5dset = h5file.create_dataset(dataset_name, data=perm_var)
278 h5file = h5py.File(poros_filename, mode=
'w')
279 dataset_name =
'Cell Ids'
280 h5dset = h5file.create_dataset(dataset_name, data=iarray)
282 dataset_name =
'Porosity'
283 h5dset = h5file.create_dataset(dataset_name, data=por_var)
289 tag = perm_var > mat_perm
291 np.savetxt(
"tag_frac.dat", tag,
'%d', delimiter=
",")
296 "area*",
"build*",
"driver*",
"ex*",
"frac*",
"hex*",
"intersect*",
297 "log*",
"out*",
"parame*",
"remove*",
"time*",
"tmp*"
299 for name
in files_to_remove:
300 for fl
in glob.glob(name):
def upscale(self, mat_perm, mat_por, path='../')