Permeability
Calcular a permeabilidade de meios porosos usando o método da distância de percolação, derivado da fórmula baseada na lei de Darcy
Documentação
permeability
Um pacote Python para calcular a permeabilidade de meios porosos usando o método da distância de infiltração, derivado da fórmula baseada na lei de Darcy, com correção de pressão capilar via equação de Young-Laplace:
$$ K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot \Delta P} $$
$$ t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot \Delta P} $$
$$ z(t) = \sqrt{\frac{2 \cdot K \cdot \Delta P \cdot t}{\mu \cdot \phi}} $$
$$ p_c = \frac{2 \cdot \gamma \cdot \cos(\theta)}{r} $$
Formas com Correção Capilar
Quando a pressão capilar $p_c$ é considerada, $\Delta P$ é substituído por $(\Delta P + p_c)$:
$$ K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot (\Delta P + p_c)} $$
$$ t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot (\Delta P + p_c)} $$
$$ z(t) = \sqrt{\frac{2 \cdot K \cdot (\Delta P + p_c) \cdot t}{\mu \cdot \phi}} $$
$$ \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} $$
$$ \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} - p_c $$
Tensor de Permeabilidade Anisotrópica
Para meios ortotrópicos (ex.: compósitos tecidos), a permeabilidade é representada como um tensor diagonal:
$$ K = \begin{bmatrix} K_x & 0 & 0 \ 0 & K_y & 0 \ 0 & 0 & K_z \end{bmatrix} $$
A velocidade de Darcy em meios anisotrópicos é:
$$ v = -\frac{1}{\mu} \cdot K \cdot \nabla p $$
Após a rotação de coordenadas, o tensor se transforma como:
$$ K' = R \cdot K \cdot R^T $$
A permeabilidade efetiva em uma direção arbitrária (vetor unitário $n$) é:
$$ K_{\text{eff}} = n^T \cdot K \cdot n $$
As principais grandezas derivadas incluem a média no plano, a razão de anisotropia e o grau de anisotropia:
$$ K_{\text{in-plane}} = \frac{K_x + K_y}{2}, \qquad \beta = \frac{K_{\text{in-plane}}}{K_z}, \qquad \delta = 1 - \frac{\min(K_x, K_y, K_z)}{\max(K_x, K_y, K_z)} $$
Para um tensor simétrico completo $K$ (com componentes fora da diagonal), os valores de permeabilidade principal são seus autovalores $K_1 \ge K_2 \ge K_3$, e as direções principais são os autovetores correspondentes, obtidos via decomposição em autovalores:
$$ K \cdot \phi_i = K_i \cdot \phi_i $$
| Símbolo | Significado | Unidade |
|---|---|---|
| $K$ | Permeabilidade | m² |
| $L$ | Espessura da amostra ao longo da direção do fluxo | m |
| $\mu$ | Viscosidade dinâmica do fluido | Pa·s |
| $\phi$ | Porosidade do meio poroso | adimensional |
| $t$ | Tempo para o fluido penetrar completamente a amostra | s |
| $\Delta P$ | Diferença de pressão constante através da amostra | Pa |
| $z$ | Posição da frente de infiltração | m |
| $p_c$ | Pressão capilar | Pa |
| $\gamma$ | Tensão superficial do líquido | N/m |
| $\theta$ | Ângulo de contato (ângulo de molhamento) | Graus |
| $r$ | Raio de poro equivalente | m |
Este pacote também fornece um servidor MCP que expõe esses cálculos como ferramentas para assistentes de IA como o Claude.
Instalação
Usando pip
pip install permeability
Usando uv (recomendado)
uv add permeability
Início Rápido
Calcular Permeabilidade a partir de Dados Experimentais
from permeability.permeability import Seepage
# Experimental parameters
K = Seepage.calculate_permeability(
L=0.003, # Sample thickness: 3 mm
mu=0.192, # Fluid viscosity: 0.192 Pa·s
phi=0.445, # Porosity: 0.445
t=100, # Penetration time: 100 s
dP=1e4 # Pressure difference: 10,000 Pa
)
print(f"Permeability: {K:.3e} m²") # ~3.84e-13 m²
Prever o Tempo de Infiltração
t = Seepage.calculate_infiltration_time(
L=0.003,
mu=0.192,
phi=0.445,
K=3.8448e-13,
dP=1e4
)
print(f"Infiltration time: {t:.2f} s") # ~100.00 s
Calcular a Posição da Frente de Infiltração
# Single time point
z = Seepage.calculate_infiltration_front_position(
K=1.284e-13,
mu=0.192,
phi=0.642,
dP=1e5,
t=120
)
print(f"Front position: {z:.4f} m") # ~0.0050 m
# Multiple time points (for graphing)
import numpy as np
z_array = Seepage.calculate_infiltration_front_position_with_multiple_time(
K=1.284e-13,
mu=0.192,
phi=0.642,
dP=1e5,
t=np.array([0, 30, 120])
)
print(f"Front positions: {z_array}") # [0.0, 0.0025, 0.005]
Calcular a Pressão Capilar
from permeability.permeability.Capillary import calculate_capillary_pressure
# Capillary pressure via Young-Laplace equation
p_c = calculate_capillary_pressure(
gamma=0.072, # Surface tension of water: 0.072 N/m
theta=30, # Contact angle: 30 degrees
r=1e-6 # Pore radius: 1 µm
)
print(f"Capillary pressure: {p_c:.2f} Pa") # ~124.71 Pa
Permeabilidade com Correção Capilar
# Calculate permeability considering capillary pressure
K_corrected = Seepage.calculate_permeability(
L=0.003,
mu=0.192,
phi=0.445,
t=100,
dP=1e4,
p_c=124.71 # Capillary pressure (Pa)
)
print(f"Corrected permeability: {K_corrected:.3e} m²")
Calcular a Diferença de Pressão
# Calculate the pressure difference applied across the sample
dP = Seepage.calculate_pressure_difference(
L=0.003,
mu=0.192,
phi=0.445,
K=3.8448e-13,
t=100
)
print(f"Pressure difference: {dP:.2f} Pa") # ~10000.00 Pa
# With capillary correction
dP_corrected = Seepage.calculate_pressure_difference(
L=0.003,
mu=0.192,
phi=0.445,
K=3.8448e-13,
t=100,
p_c=124.71 # Capillary pressure (Pa)
)
print(f"Corrected pressure difference: {dP_corrected:.2f} Pa")
Conversão de Unidades
from permeability.utils.UnitConverter import darcy2m2, m22darcy
# Convert m² to Darcy
darcy = m22darcy(m2K=3.8448e-13)
print(f"Permeability: {darcy:.3f} Darcy") # ~0.390 Darcy
# Convert Darcy to m²
m2 = darcy2m2(darcyK=0.3896)
print(f"Permeability: {m2:.3e} m²") # ~3.845e-13 m²
Tensor de Permeabilidade Anisotrópica
Para materiais ortotrópicos (ex.: compósitos tecidos), a classe PermeabilityTensor representa um tensor de permeabilidade diagonal $K = \text{diag}(K_x, K_y, K_z)$.
from permeability.permeability.AnisotropicTensor import PermeabilityTensor
# Construct from principal values (orthotropic)
tensor = PermeabilityTensor.from_principal_values(
Kx=1e-12, # Warp/fiber direction (m²)
Ky=5e-13, # Weft direction (m²)
Kz=1e-13 # Through-thickness direction (m²)
)
# Isotropic tensor
iso_tensor = PermeabilityTensor.from_isotopic(K=1e-12)
# Transversely isotropic (e.g., unidirectional fiber bundles)
trans_tensor = PermeabilityTensor.from_transversely_isotropic(
K_in_plane=1e-12,
K_out_plane=1e-13
)
Propriedades do Tensor
# 3x3 diagonal matrix
print(tensor.tensor)
# Average in-plane permeability (Kx + Ky) / 2
print(f"In-plane avg: {tensor.in_plane_average:.3e} m²")
# Anisotropy ratio β = in_plane_avg / Kz
print(f"Anisotropy ratio: {tensor.anisotropy_ratio:.2f}")
# Degree of anisotropy (0 = isotropic, 1 = fully anisotropic)
print(f"Degree of anisotropy: {tensor.degree_of_anisotropy:.3f}")
# Export to dictionary
print(tensor.to_dict())
Velocidade de Darcy em Meios Anisotrópicos
import numpy as np
# Darcy velocity: v = -(1/μ) · K · ∇p
grad_p = np.array([1000, 500, 100]) # Pressure gradient (Pa/m)
v = tensor.darcy_velocity(grad_p=grad_p, mu=0.192)
print(f"Darcy velocity: {v} m/s")
Permeabilidade Efetiva em uma Direção
# Along principal axes
print(tensor.effective_permeability_in_direction(direction='x'))
print(tensor.effective_permeability_in_direction(direction='xy')) # in-plane avg
# In an arbitrary direction
n = np.array([1, 1, 0]) # arbitrary direction vector
print(tensor.effective_permeability_in_direction(direction_vector=n))
Fluxo de Darcy Anisotrópico
A função anisotropic_darcy_flux calcula o fluxo de Darcy e grandezas relacionadas em meios anisotrópicos.
from permeability.permeability.AnisotropicTensor import (
PermeabilityTensor,
anisotropic_darcy_flux
)
tensor = PermeabilityTensor.from_principal_values(
Kx=1e-12, Ky=5e-13, Kz=1e-13
)
result = anisotropic_darcy_flux(
tensor=tensor,
grad_p=np.array([1000, 500, 100]), # Pa/m
mu=0.192, # Pa·s
area_normal=np.array([1, 0, 0]) # Optional: unit normal of cross-section
)
print(f"Darcy velocity: {result['darcy_velocity']} m/s")
print(f"Flux magnitude: {result['flux_magnitude']:.3e} m/s")
print(f"Velocity angle from gradP: {result['velocity_angle_from_gradP_deg']:.2f}°")
print(f"Area flux: {result['area_flux']:.3e} m³/s per m²")
Evolução da Anisotropia ao Longo de Ciclos de PIP
A função anisotropy_evolution analisa como a anisotropia da permeabilidade evolui ao longo de múltiplos ciclos de PIP (Infiltração e Pirólise de Polímero), o que é crítico para entender o processo de densificação de compósitos de matriz cerâmica (CMCs).
$$ K_i = \begin{bmatrix} K_{x,i} & 0 & 0 \ 0 & K_{y,i} & 0 \ 0 & 0 & K_{z,i} \end{bmatrix} ,\qquad \beta_i = \frac{K_{\text{in-plane},i}}{K_{z,i}} ,\qquad \delta_i = 1 - \frac{\min(K_{x,i}, K_{y,i}, K_{z,i})}{\max(K_{x,i}, K_{y,i}, K_{z,i})} $$
$$ \text{Anisotropy Reduction} = \frac{\beta_0 - \beta_n}{\beta_0} \times 100% $$
from permeability.permeability.AnisotropicTensor import anisotropy_evolution
import numpy as np
# Permeability data across PIP cycles: each row = [Kx, Ky, Kz]
K_data = np.array([
[1.0e-12, 5.0e-13, 1.0e-13], # Cycle 0 (as-processed)
[8.0e-13, 4.5e-13, 1.5e-13], # Cycle 1
[6.0e-13, 4.0e-13, 2.0e-13], # Cycle 2
[4.5e-13, 3.5e-13, 2.5e-13], # Cycle 3
])
cycles = np.array([0, 1, 2, 3])
result = anisotropy_evolution(K_values=K_data, cycles=cycles)
# Access results
for i, cycle in enumerate(result['cycles']):
print(f"Cycle {cycle}: β = {result['anisotropy_ratios'][i]:.2f}, "
f"δ = {result['degrees_of_anisotropy'][i]:.3f}")
print(f"Anisotropy reduction: {result['anisotropy_reduction']:.1f}%")
Servidor MCP
O pacote inclui um servidor de Protocolo de Contexto de Modelo (MCP) que expõe cálculos de permeabilidade como ferramentas acessíveis por IA. Após instalar o pacote, inicie o servidor com:
Iniciando o Servidor
Uma vez instalado, basta executar:
# Default port 8000 (HTTP/SSE transport)
permeability_mcp
# Custom port
permeability_mcp --port 8080
O servidor inicia via transporte HTTP/SSE (http://localhost:8000 por padrão).
Se preferir testar sem instalar, você também pode usar:
uvx --from permeability permeability_mcp
Transporte HTTP Streamable
Para clientes que suportam o transporte moderno Streamable HTTP (especificação MCP), o servidor pode ser configurado para usar comunicação baseada em HTTP POST em vez de SSE:
permeability_mcp --port 8000
# Then connect via Streamable HTTP at http://localhost:8000/mcp
Configuração do Claude Desktop usando Streamable HTTP (claude_desktop_config.json):
{
"mcpServers": {
"permeability": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}
Configuração do Cline (extensão do VS Code) usando Streamable HTTP:
{
"mcpServers": {
"permeability": {
"type": "http",
"url": "http://localhost:8000/mcp"
}
}
}
Nota: O transporte Streamable HTTP requer um cliente que suporte a especificação MCP Streamable HTTP. O servidor executa a mesma implementação subjacente — apenas o protocolo de transporte difere da conexão padrão baseada em SSE.
Ferramentas Disponíveis
Quando o servidor MCP estiver em execução, assistentes de IA podem chamar:
| Ferramenta | Descrição |
|---|---|
calculate_permeability_by_seepage_distance | Calcular $K$ (opcionalmente com correção capilar via $p_c$) |
calculate_infiltration_time | Calcular $t$ (opcionalmente com correção capilar via $p_c$) |
calculate_infiltration_front_position | Calcular $z(t)$ (opcionalmente com correção capilar via $p_c$) |
calculate_infiltration_front_position4multiple_times | Calcular $z(t)$ para múltiplos pontos de tempo (opcionalmente com correção capilar via $p_c$) |
calculate_capillary_pressure | Calcular $p_c = 2\gamma\cos(\theta),/,r$ (equação de Young-Laplace) |
calculate_pressure_difference | Calcular $\Delta P$ (opcionalmente com correção capilar via $p_c$) |
darcy_m2_converter | Converter Darcy para m² e/ou m² para Darcy (bidirecional) |
calculate_darcy_flux_tool | Calcular o fluxo de Darcy em meios anisotrópicos; aceita tensor de permeabilidade a partir de valores principais, isotrópico ou transversalmente isotrópico |
calculate_anisotropy_evolution_tool | Analisar a evolução da anisotropia ao longo de ciclos de PIP; retorna tensores, razões de anisotropia e dados ciclo a ciclo |
Cada ferramenta aceita os mesmos parâmetros da API Python.
Referência da API
Seepage.calculate_permeability(L, mu, phi, t, dP, p_c=None)
Calcula a permeabilidade a partir de dados experimentais de distância de infiltração. Quando $p_c$ é fornecido, a forma com correção capilar é usada.
$$ K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot \Delta P} \qquad\text{ou}\qquad K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot (\Delta P + p_c)} $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
L | float | Comprimento/espessura da amostra ao longo da direção do fluxo (m) |
mu | float | Viscosidade dinâmica do fluido (Pa·s) |
phi | float | Porosidade do meio poroso ($0 < \phi \le 1$) |
t | float | Tempo total para o fluido penetrar completamente a amostra (s) |
dP | float | Diferença de pressão constante através da amostra (Pa) |
p_c | float, opcional | Pressão capilar para correção (Pa) |
Retorna: float — Permeabilidade $K$ (m²)
Seepage.calculate_infiltration_time(L, mu, phi, K, dP, p_c=None)
Prevê o tempo necessário para o fluido penetrar completamente uma amostra. Quando $p_c$ é fornecido, a forma com correção capilar é usada.
$$ t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot \Delta P} \qquad\text{ou}\qquad t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot (\Delta P + p_c)} $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
L | float | Comprimento/espessura da amostra ao longo da direção do fluxo (m) |
mu | float | Viscosidade dinâmica do fluido (Pa·s) |
phi | float | Porosidade do meio poroso ($0 < \phi \le 1$) |
K | float | Permeabilidade (m²) |
dP | float | Diferença de pressão constante através da amostra (Pa) |
p_c | float, opcional | Pressão capilar para correção (Pa) |
Retorna: float — Tempo de infiltração $t$ (s)
Seepage.calculate_infiltration_front_position(K, mu, phi, dP, t, p_c=None)
Calcula a posição da frente de infiltração em um determinado tempo. Quando $p_c$ é fornecido, a forma com correção capilar é usada.
$$ z(t) = \sqrt{\frac{2 \cdot K \cdot \Delta P \cdot t}{\mu \cdot \phi}} \qquad\text{ou}\qquad z(t) = \sqrt{\frac{2 \cdot K \cdot (\Delta P + p_c) \cdot t}{\mu \cdot \phi}} $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
K | float | Permeabilidade (m²) |
mu | float | Viscosidade dinâmica do fluido (Pa·s) |
phi | float | Porosidade do meio poroso ($0 < \phi \le 1$) |
dP | float | Diferença de pressão constante através da amostra (Pa) |
t | float | Tempo decorrido (s) |
p_c | float, opcional | Pressão capilar para correção (Pa) |
Retorna: float — Posição da frente de infiltração $z$ (m)
Seepage.calculate_infiltration_front_position_with_multiple_time(K, mu, phi, dP, t, p_c=None)
Calcula a posição da frente de infiltração em múltiplos pontos de tempo (útil para plotagem). Quando $p_c$ é fornecido, a forma com correção capilar é usada.
$$ z(t) = \sqrt{\frac{2 \cdot K \cdot \Delta P \cdot t}{\mu \cdot \phi}} \qquad\text{ou}\qquad z(t) = \sqrt{\frac{2 \cdot K \cdot (\Delta P + p_c) \cdot t}{\mu \cdot \phi}} $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
K | float | Permeabilidade (m²) |
mu | float | Viscosidade dinâmica do fluido (Pa·s) |
phi | float | Porosidade do meio poroso ($0 < \phi \le 1$) |
dP | float | Diferença de pressão constante através da amostra (Pa) |
t | numpy.ndarray | Matriz de valores de tempo (s) |
p_c | float, opcional | Pressão capilar para correção (Pa) |
Retorna: numpy.ndarray — Matriz de posições da frente de infiltração $z$ (m)
Seepage.calculate_pressure_difference(L, mu, phi, K, t, p_c=None)
Calcula a diferença de pressão através de uma amostra. Quando $p_c$ é fornecido, a forma com correção capilar é usada.
$$ \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} \qquad\text{ou}\qquad \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} - p_c $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
L | float | Comprimento/espessura da amostra ao longo da direção do fluxo (m) |
mu | float | Viscosidade dinâmica do fluido (Pa·s) |
phi | float | Porosidade do meio poroso ($0 < \phi \le 1$) |
K | float | Permeabilidade (m²) |
t | float | Tempo total para o fluido penetrar completamente a amostra (s) |
p_c | float, opcional | Pressão capilar para correção (Pa) |
Retorna: float — Diferença de pressão $\Delta P$ (Pa)
calculate_capillary_pressure(gamma, theta, r)
Calcula a pressão capilar usando a equação de Young-Laplace.
$$ p_c = \frac{2 \cdot \gamma \cdot \cos(\theta)}{r} $$
| Parâmetro | Tipo | Descrição |
|---|---|---|
gamma | float | Tensão superficial do líquido (N/m) |
theta | float | Ângulo de contato / ângulo de molhamento (Graus) |
r | float | Raio de poro equivalente (m) |
Retorna: float — Pressão capilar $p_c$ (Pa)
darcy2m2(darcyK)
Converte permeabilidade de Darcy para m².
| Parâmetro | Tipo | Descrição |
|---|---|---|
darcyK | float | Permeabilidade em Darcy |
Retorna: float — Permeabilidade em m²
m22darcy(m2K)
Converte permeabilidade de m² para Darcy.
| Parâmetro | Tipo | Descrição |
|---|---|---|
m2K | float | Permeabilidade em m² |
Retorna: float — Permeabilidade em Darcy
PermeabilityTensor(Kx, Ky, Kz)
Tensor de permeabilidade anisotrópico para compósitos tecidos 2D. Representa um tensor de permeabilidade diagonal $K = \text{diag}(K_x, K_y, K_z)$.
| Parâmetro | Tipo | Descrição |
|---|---|---|
Kx | float | Permeabilidade na direção x (direção do urdume/fibra) (m²) |
Ky | float | Permeabilidade na direção y (direção da trama) (m²) |
Kz | float | Permeabilidade na direção z (através da espessura) (m²) |
Métodos da Classe
PermeabilityTensor.from_principal_values(Kx, Ky, Kz)
Constrói tensor a partir de permeabilidades nas direções principais (materiais ortotrópicos).
PermeabilityTensor.from_isotopic(K)
Constrói um tensor de permeabilidade isotrópico onde $K_x = K_y = K_z = K$.
PermeabilityTensor.from_transversely_isotropic(K_in_plane, K_out_plane)
Constrói um tensor de permeabilidade transversalmente isotrópico onde $K_x = K_y = K_\text{no plano}$, $K_z = K_\text{fora do plano}$ (adequado para feixes de fibras unidirecionais).
Propriedades
| Propriedade | Tipo de Retorno | Descrição |
|---|---|---|
tensor | numpy.ndarray | Matriz completa do tensor diagonal 3x3 |
in_plane_average | float | Permeabilidade média no plano $(K_x + K_y),/,2$ (m²) |
anisotropy_ratio | float | Razão de anisotropia $\beta = \text{média_no_plano},/,K_z$ |
degree_of_anisotropy | float | Grau de anisotropia (0 = isotrópico, 1 = totalmente anisotrópico) |
Métodos
darcy_velocity(grad_p, mu)
Calcula o vetor de velocidade de Darcy $v = -(1/\mu) \cdot K \cdot \nabla p$.
| Parâmetro | Tipo | Descrição |
|---|---|---|
grad_p | numpy.ndarray | Vetor de gradiente de pressão (Pa/m), forma (3,) |
mu | float | Viscosidade dinâmica (Pa·s) |
Retorna: numpy.ndarray — Vetor de velocidade de Darcy (m/s), forma (3,)
effective_permeability_in_direction(direction=None, direction_vector=None)
Calcula a permeabilidade efetiva em uma direção especificada. Para um vetor unitário de direção $n$, $K_\text{ef} = n^T \cdot K \cdot n$.
| Parâmetro | Tipo | Descrição |
|---|---|---|
direction | str, opcional | Um de 'x', 'y', 'z', 'xy' (no plano), ou 'avg' |
direction_vector | numpy.ndarray, opcional | Vetor unitário arbitrário de forma (3,) |
Retorna: float — Permeabilidade efetiva na direção especificada (m²)
rotate(R)
Rotaciona o tensor de permeabilidade pela matriz de rotação $R$: $K' = R \cdot K \cdot R^T$.
| Parâmetro | Tipo | Descrição |
|---|---|---|
R | numpy.ndarray | Matriz de rotação ortogonal (3x3) |
Retorna: PermeabilityTensor ou FullTensor — Tensor rotacionado (diagonal se os termos fora da diagonal forem desprezíveis)
to_dict()
Exporta os dados do tensor como um dicionário com chaves: Kx, Ky, Kz, in_plane_average, anisotropy_ratio, degree_of_anisotropy.
Retorna: dict
FullTensor(matrix)
Tensor de permeabilidade simétrico completo 3x3 com componentes fora da diagonal, usado após rotação de coordenadas.
| Parâmetro | Tipo | Descrição |
|---|---|---|
matrix | numpy.ndarray | Matriz do tensor simétrico completo 3x3 |
Propriedades
| Propriedade | Tipo de Retorno | Descrição |
|---|---|---|
principal_values | tuple | Valores de permeabilidade principal $(K_1, K_2, K_3)$, em ordem decrescente |
principal_directions | numpy.ndarray | Direções de permeabilidade principal (autovetores), forma (3, 3) |
Métodos
to_principal_tensor()
Converte para PermeabilityTensor diagonal no sistema de coordenadas principal usando autovalores.
Retorna: PermeabilityTensor
anisotropic_darcy_flux(tensor, grad_p, mu, area_normal=None)
Calcula o fluxo de Darcy e quantidades relacionadas para meios anisotrópicos.
| Parâmetro | Tipo | Descrição |
|---|---|---|
tensor | PermeabilityTensor | Tensor de permeabilidade anisotrópico |
grad_p | numpy.ndarray | Vetor de gradiente de pressão (Pa/m) |
mu | float | Viscosidade dinâmica (Pa·s) |
area_normal | numpy.ndarray, opcional | Vetor normal unitário da área de seção transversal para cálculo do fluxo |
Retorna: dict com chaves:
| Chave | Descrição |
|---|---|
darcy_velocity | Vetor de velocidade de Darcy (m/s) |
flux_magnitude | Magnitude da velocidade de Darcy (m/s) |
velocity_angle_from_gradP_deg | Ângulo entre velocidade e gradiente de pressão (graus) |
area_flux | Fluxo volumétrico por unidade de área (m³/s por m²), somente se area_normal for fornecido |
anisotropy_evolution(K_values, cycles)
Analisa a evolução da anisotropia de permeabilidade ao longo dos ciclos de PIP (Infiltração e Pirólise de Polímero).
| Parâmetro | Tipo | Descrição |
|---|---|---|
K_values | numpy.ndarray | Matriz 2D onde cada linha é $[K_x, K_y, K_z]$ para um ciclo de PIP, forma (n, 3) |
cycles | numpy.ndarray | Matriz 1D de números de ciclos de PIP, forma (n,) |
Retorna: dict com chaves:
| Chave | Descrição |
|---|---|
tensors | Lista de objetos PermeabilityTensor para cada ciclo |
cycles | Matriz de números de ciclos |
anisotropy_ratios | Matriz de razões de anisotropia $\beta$ para cada ciclo |
degrees_of_anisotropy | Matriz de grau de anisotropia $\delta$ para cada ciclo |
anisotropy_reduction | Redução percentual na anisotropia do primeiro ao último ciclo (%) |
Desenvolvimento
Configuração
git clone https://github.com/1Vewton/permeability.git
cd permeability
uv sync
Executando Testes
uv run pytest
Estilo de Código
uv run flake8
Licença
Este projeto é licenciado sob a GNU General Public License v3.0. Consulte o arquivo LICENSE para obter detalhes.