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

Ask DeepWiki PyPI Downloads

Chinês Inglês

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ímboloSignificadoUnidade
$K$Permeabilidadem²
$L$Espessura da amostra ao longo da direção do fluxom
$\mu$Viscosidade dinâmica do fluidoPa·s
$\phi$Porosidade do meio porosoadimensional
$t$Tempo para o fluido penetrar completamente a amostras
$\Delta P$Diferença de pressão constante através da amostraPa
$z$Posição da frente de infiltraçãom
$p_c$Pressão capilarPa
$\gamma$Tensão superficial do líquidoN/m
$\theta$Ângulo de contato (ângulo de molhamento)Graus
$r$Raio de poro equivalentem

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:

FerramentaDescrição
calculate_permeability_by_seepage_distanceCalcular $K$ (opcionalmente com correção capilar via $p_c$)
calculate_infiltration_timeCalcular $t$ (opcionalmente com correção capilar via $p_c$)
calculate_infiltration_front_positionCalcular $z(t)$ (opcionalmente com correção capilar via $p_c$)
calculate_infiltration_front_position4multiple_timesCalcular $z(t)$ para múltiplos pontos de tempo (opcionalmente com correção capilar via $p_c$)
calculate_capillary_pressureCalcular $p_c = 2\gamma\cos(\theta),/,r$ (equação de Young-Laplace)
calculate_pressure_differenceCalcular $\Delta P$ (opcionalmente com correção capilar via $p_c$)
darcy_m2_converterConverter Darcy para m² e/ou m² para Darcy (bidirecional)
calculate_darcy_flux_toolCalcular 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_toolAnalisar 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âmetroTipoDescrição
LfloatComprimento/espessura da amostra ao longo da direção do fluxo (m)
mufloatViscosidade dinâmica do fluido (Pa·s)
phifloatPorosidade do meio poroso ($0 < \phi \le 1$)
tfloatTempo total para o fluido penetrar completamente a amostra (s)
dPfloatDiferença de pressão constante através da amostra (Pa)
p_cfloat, opcionalPressã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âmetroTipoDescrição
LfloatComprimento/espessura da amostra ao longo da direção do fluxo (m)
mufloatViscosidade dinâmica do fluido (Pa·s)
phifloatPorosidade do meio poroso ($0 < \phi \le 1$)
KfloatPermeabilidade (m²)
dPfloatDiferença de pressão constante através da amostra (Pa)
p_cfloat, opcionalPressã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âmetroTipoDescrição
KfloatPermeabilidade (m²)
mufloatViscosidade dinâmica do fluido (Pa·s)
phifloatPorosidade do meio poroso ($0 < \phi \le 1$)
dPfloatDiferença de pressão constante através da amostra (Pa)
tfloatTempo decorrido (s)
p_cfloat, opcionalPressã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âmetroTipoDescrição
KfloatPermeabilidade (m²)
mufloatViscosidade dinâmica do fluido (Pa·s)
phifloatPorosidade do meio poroso ($0 < \phi \le 1$)
dPfloatDiferença de pressão constante através da amostra (Pa)
tnumpy.ndarrayMatriz de valores de tempo (s)
p_cfloat, opcionalPressã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âmetroTipoDescrição
LfloatComprimento/espessura da amostra ao longo da direção do fluxo (m)
mufloatViscosidade dinâmica do fluido (Pa·s)
phifloatPorosidade do meio poroso ($0 < \phi \le 1$)
KfloatPermeabilidade (m²)
tfloatTempo total para o fluido penetrar completamente a amostra (s)
p_cfloat, opcionalPressã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âmetroTipoDescrição
gammafloatTensão superficial do líquido (N/m)
thetafloatÂngulo de contato / ângulo de molhamento (Graus)
rfloatRaio de poro equivalente (m)

Retorna: float — Pressão capilar $p_c$ (Pa)


darcy2m2(darcyK)

Converte permeabilidade de Darcy para m².

ParâmetroTipoDescrição
darcyKfloatPermeabilidade em Darcy

Retorna: float — Permeabilidade em m²


m22darcy(m2K)

Converte permeabilidade de m² para Darcy.

ParâmetroTipoDescrição
m2KfloatPermeabilidade 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âmetroTipoDescrição
KxfloatPermeabilidade na direção x (direção do urdume/fibra) (m²)
KyfloatPermeabilidade na direção y (direção da trama) (m²)
KzfloatPermeabilidade 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

PropriedadeTipo de RetornoDescrição
tensornumpy.ndarrayMatriz completa do tensor diagonal 3x3
in_plane_averagefloatPermeabilidade média no plano $(K_x + K_y),/,2$ (m²)
anisotropy_ratiofloatRazão de anisotropia $\beta = \text{média_no_plano},/,K_z$
degree_of_anisotropyfloatGrau 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âmetroTipoDescrição
grad_pnumpy.ndarrayVetor de gradiente de pressão (Pa/m), forma (3,)
mufloatViscosidade 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âmetroTipoDescrição
directionstr, opcionalUm de 'x', 'y', 'z', 'xy' (no plano), ou 'avg'
direction_vectornumpy.ndarray, opcionalVetor 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âmetroTipoDescrição
Rnumpy.ndarrayMatriz 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âmetroTipoDescrição
matrixnumpy.ndarrayMatriz do tensor simétrico completo 3x3

Propriedades

PropriedadeTipo de RetornoDescrição
principal_valuestupleValores de permeabilidade principal $(K_1, K_2, K_3)$, em ordem decrescente
principal_directionsnumpy.ndarrayDireçõ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âmetroTipoDescrição
tensorPermeabilityTensorTensor de permeabilidade anisotrópico
grad_pnumpy.ndarrayVetor de gradiente de pressão (Pa/m)
mufloatViscosidade dinâmica (Pa·s)
area_normalnumpy.ndarray, opcionalVetor normal unitário da área de seção transversal para cálculo do fluxo

Retorna: dict com chaves:

ChaveDescrição
darcy_velocityVetor de velocidade de Darcy (m/s)
flux_magnitudeMagnitude da velocidade de Darcy (m/s)
velocity_angle_from_gradP_degÂngulo entre velocidade e gradiente de pressão (graus)
area_fluxFluxo 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âmetroTipoDescrição
K_valuesnumpy.ndarrayMatriz 2D onde cada linha é $[K_x, K_y, K_z]$ para um ciclo de PIP, forma (n, 3)
cyclesnumpy.ndarrayMatriz 1D de números de ciclos de PIP, forma (n,)

Retorna: dict com chaves:

ChaveDescrição
tensorsLista de objetos PermeabilityTensor para cada ciclo
cyclesMatriz de números de ciclos
anisotropy_ratiosMatriz de razões de anisotropia $\beta$ para cada ciclo
degrees_of_anisotropyMatriz de grau de anisotropia $\delta$ para cada ciclo
anisotropy_reductionReduçã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.