I keep getting 0 mD when calculating the absolute permeability. #2939
Unanswered
je-ha-jung
asked this question in
Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
Respected Professor,
Thanks to the solution you provided, I was able to successfully create the pore network model. However, I am facing difficulties in calculating the absolute permeability, as I keep getting a result of 0 mD. Could you kindly provide guidance on whether I might have missed something in the process?
I used a 300x300x300 Ventheimer sandstone binary image as the input data, setting the top as the inlet and the bottom as the outlet. I applied boundary conditions of 0 on the sides to allow flow from top to bottom, and I assigned nitrogen as the fluid.
The final result was 0 mD, as if no fluid was flowing. However, the pore network contains 1917 pores and 3632 throats, so it doesn't seem possible that fluid wouldn’t flow. I am unsure what I might be missing. I have followed the process in the attached PDF for reference.
Thank you, Professor.
(this is my code)
import openpnm as op
import numpy as np
voxel_size = 0.0581e-3
shape = (300, 300, 300)
spacing = (voxel_size, voxel_size, voxel_size)
net = op.network.Cubic(shape=shape, spacing=spacing, name='adjusted_network')
print(f"해상도 (m/pixel): {voxel_size}")
resolution = 5.81e-05
name = 'bentheimer'
import os
from skimage import io
folder_path = r"C:/Users/user/Desktop/lab/포어 네트워크 모델/bentheimer_binary_image_cut_300_tif_invert"
image_files = [f for f in os.listdir(folder_path) if f.endswith('.tif')]
if len(image_files) == 0:
print("폴더에 tif 이미지 파일이 없습니다.")
else:
# 첫 번째 이미지 파일 경로 설정
image_path = os.path.join(folder_path, image_files[0])
import porespy as ps
import openpnm as op
import imageio.v2 as imageio
import os
import scipy.ndimage as spim
import numpy as np
folder_path = r"C:/Users/user/Desktop/lab/포어 네트워크 모델/bentheimer_binary_image_cut_300_tif_invert"
file_names = [f for f in os.listdir(folder_path) if f.endswith('.tif')]
if len(file_names) == 0:
print("폴더에 tif 이미지 파일이 없습니다.")
else:
# 첫 번째 이미지 파일 경로 설정 및 읽기
binary_image_path = os.path.join(folder_path, file_names[0])
binary_image = imageio.imread(binary_image_path)
import openpnm as op
pn.add_model_collection(op.models.collections.geometry.spheres_and_cylinders)
pn.regenerate_models()
phase = op.phase.Phase(network=pn)
phase['pore.viscosity'] = 0.00001787
phase['pore.density'] = 1.165
phase.add_model_collection(op.models.collections.physics.basic)
phase.regenerate_models()
import openpnm as op
import numpy as np
coords = pn['pore.coords']
inlet = coords[:, 1] >= np.percentile(coords[:, 1], 99)
pn.set_label('top', pores=np.where(inlet)[0])
outlet = coords[:, 1] <= np.percentile(coords[:, 1], 1)
pn.set_label('bottom', pores=np.where(outlet)[0])
pore_mask = np.ones(pn.Np, dtype=bool)
clustering = op.topotools.find_clusters(network=pn, mask=pore_mask)
pore_clusters = clustering.pore_labels
print(f"pore_clusters: {pore_clusters}")
if not isinstance(pore_clusters, np.ndarray):
raise ValueError(f"pore_clusters는 배열이 아닙니다. 현재 타입: {type(pore_clusters)}")
elif pore_clusters.ndim != 1:
raise ValueError("pore_clusters 배열이 1차원이 아닙니다.")
largest_cluster = np.argmax(np.bincount(pore_clusters))
connected_pores = np.where(pore_clusters == largest_cluster)[0]
op.topotools.trim(network=pn, pores=np.where(pore_clusters != largest_cluster)[0])
flow = op.algorithms.StokesFlow(network=pn, phase=phase)
flow.set_value_BC(pores=pn.pores('top'), values=1)
flow.set_value_BC(pores=pn.pores('bottom'), values=0)
flow.run()
phase.update(flow.soln)
import numpy as np
import openpnm as op
flow = op.algorithms.StokesFlow(network=pn, phase=phase)
flow.set_value_BC(pores=pn.pores('top'), values=1)
flow.set_value_BC(pores=pn.pores('bottom'), values=0)
coords = pn['pore.coords']
left_pores = np.where(coords[:, 0] <= np.percentile(coords[:, 0], 5))[0]
right_pores = np.where(coords[:, 0] >= np.percentile(coords[:, 0], 95))[0]
flow.set_rate_BC(pores=left_pores, rates=0)
flow.set_rate_BC(pores=right_pores, rates=0)
flow.run()
phase.update(flow.soln)
import numpy as np
import openpnm as op
coords = pn['pore.coords']
inlet = coords[:, 1] >= np.percentile(coords[:, 1], 99)
outlet = coords[:, 1] <= np.percentile(coords[:, 1], 1)
pn.set_label('top', pores=np.where(inlet)[0])
pn.set_label('bottom', pores=np.where(outlet)[0])
Q = flow.rate(pores=pn.pores('top'), mode='group')[0]
A = (300 * 300) * resolution**2
L = 300 * resolution
Delta_P = 1
mu = 0.00001787
K = Q * L * mu / (A * Delta_P)
print(f'The value of K is: {K/0.98e-12*1000:.2f} mD')
Berea-Copy.pdf
bentheimer_binary_image_cut_300_tif_invert.zip
Beta Was this translation helpful? Give feedback.
All reactions