Permeability

Calcula la permeabilidad de medios porosos utilizando el método de distancia de filtración, derivado de la fórmula basada en la ley de Darcy.

Documentación

permeability

Ask DeepWiki PyPI Downloads

中文 English

Un paquete de Python para calcular la permeabilidad de medios porosos utilizando el método de distancia de filtración, derivado de la fórmula basada en la ley de Darcy, con corrección por presión capilar mediante la ecuación 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 con Corrección Capilar

Cuando se considera la presión capilar $p_c$, $\Delta P$ se reemplaza 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 Permeabilidad Anisotrópica

Para medios ortotrópicos (por ejemplo, compuestos tejidos), la permeabilidad se representa como un tensor diagonal:

$$ K = \begin{bmatrix} K_x & 0 & 0 \ 0 & K_y & 0 \ 0 & 0 & K_z \end{bmatrix} $$

La velocidad de Darcy en medios anisotrópicos es:

$$ v = -\frac{1}{\mu} \cdot K \cdot \nabla p $$

Después de la rotación de coordenadas, el tensor se transforma como:

$$ K' = R \cdot K \cdot R^T $$

La permeabilidad efectiva en una dirección arbitraria (vector unitario $n$) es:

$$ K_{\text{eff}} = n^T \cdot K \cdot n $$

Las cantidades derivadas clave incluyen el promedio en el plano, la relación de anisotropía y el grado de anisotropía:

$$ 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 un tensor simétrico completo $K$ (con componentes fuera de la diagonal), los valores de permeabilidad principal son sus valores propios $K_1 \ge K_2 \ge K_3$, y las direcciones principales son los vectores propios correspondientes, obtenidos mediante descomposición de valores propios:

$$ K \cdot \phi_i = K_i \cdot \phi_i $$

SímboloSignificadoUnidad
$K$Permeabilidadm²
$L$Espesor de la muestra a lo largo de la dirección del flujom
$\mu$Viscosidad dinámica del fluidoPa·s
$\phi$Porosidad del medio porosoadimensional
$t$Tiempo para que el fluido penetre completamente la muestras
$\Delta P$Diferencia de presión constante a través de la muestraPa
$z$Posición del frente de infiltraciónm
$p_c$Presión capilarPa
$\gamma$Tensión superficial del líquidoN/m
$\theta$Ángulo de contacto (ángulo de mojado)Grados
$r$Radio de poro equivalentem

Este paquete también proporciona un servidor MCP que expone estos cálculos como herramientas para asistentes de IA como Claude.


Instalación

Usando pip

pip install permeability

Usando uv (recomendado)

uv add permeability

Inicio Rápido

Calcular Permeabilidad a partir de Datos Experimentales

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²

Predecir el Tiempo de Infiltración

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 la Posición del Frente de Infiltración

# 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 la Presión 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

Permeabilidad con Corrección 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 la Diferencia de Presión

# 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")

Conversión 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 Permeabilidad Anisotrópica

Para materiales ortotrópicos (por ejemplo, compuestos tejidos), la clase PermeabilityTensor representa un tensor de permeabilidad 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
)

Propiedades del 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())

Velocidad de Darcy en Medios 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")

Permeabilidad Efectiva en una Dirección

# 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))

Flujo de Darcy Anisotrópico

La función anisotropic_darcy_flux calcula el flujo de Darcy y cantidades relacionadas en medios 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²")

Evolución de la Anisotropía a lo Largo de Ciclos PIP

La función anisotropy_evolution analiza cómo evoluciona la anisotropía de la permeabilidad a lo largo de múltiples ciclos PIP (infiltración y pirólisis de polímeros), lo cual es crítico para comprender el proceso de densificación de compuestos 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{Reducción de Anisotropía} = \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

El paquete incluye un servidor de Protocolo de Contexto de Modelo (MCP) que expone los cálculos de permeabilidad como herramientas accesibles para IA. Después de instalar el paquete, inicie el servidor con:

Iniciando el Servidor

Una vez instalado, simplemente ejecute:

# Default port 8000 (HTTP/SSE transport)
permeability_mcp

# Custom port
permeability_mcp --port 8080

El servidor se inicia mediante transporte HTTP/SSE (http://localhost:8000 por defecto).

Si prefiere probarlo sin instalar, también puede usar:

uvx --from permeability permeability_mcp

Transporte HTTP Transmisible

Para clientes que admiten el transporte moderno HTTP Transmisible (especificación MCP), el servidor se puede configurar para usar comunicación basada en HTTP POST en lugar de SSE:

permeability_mcp --port 8000
# Then connect via Streamable HTTP at http://localhost:8000/mcp

Configuración de Claude Desktop usando HTTP Transmisible (claude_desktop_config.json):

{
  "mcpServers": {
    "permeability": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Configuración de Cline (extensión de VS Code) usando HTTP Transmisible:

{
  "mcpServers": {
    "permeability": {
      "type": "http",
      "url": "http://localhost:8000/mcp"
    }
  }
}

Nota: El transporte HTTP Transmisible requiere un cliente que admita la especificación MCP Streamable HTTP. El servidor ejecuta la misma implementación subyacente — solo el protocolo de transporte difiere de la conexión predeterminada basada en SSE.

Herramientas Disponibles

Una vez que el servidor MCP está en ejecución, los asistentes de IA pueden llamar:

HerramientaDescripción
calculate_permeability_by_seepage_distanceCalcular $K$ (opcionalmente con corrección capilar mediante $p_c$)
calculate_infiltration_timeCalcular $t$ (opcionalmente con corrección capilar mediante $p_c$)
calculate_infiltration_front_positionCalcular $z(t)$ (opcionalmente con corrección capilar mediante $p_c$)
calculate_infiltration_front_position4multiple_timesCalcular $z(t)$ para múltiples puntos de tiempo (opcionalmente con corrección capilar mediante $p_c$)
calculate_capillary_pressureCalcular $p_c = 2\gamma\cos(\theta),/,r$ (ecuación de Young-Laplace)
calculate_pressure_differenceCalcular $\Delta P$ (opcionalmente con corrección capilar mediante $p_c$)
darcy_m2_converterConvertir Darcy a m² y/o m² a Darcy (bidireccional)
calculate_darcy_flux_toolCalcular el flujo de Darcy en medios anisotrópicos; acepta tensor de permeabilidad a partir de valores principales, isotrópico o transversalmente isotrópico
calculate_anisotropy_evolution_toolAnalizar la evolución de la anisotropía a lo largo de ciclos PIP; devuelve tensores, relaciones de anisotropía y datos ciclo por ciclo

Cada herramienta acepta los mismos parámetros que la API de Python.

Referencia de la API

Seepage.calculate_permeability(L, mu, phi, t, dP, p_c=None)

Calcular la permeabilidad a partir de datos de experimentos de distancia de filtración. Cuando se proporciona $p_c$, se utiliza la forma con corrección capilar.

$$ K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot \Delta P} \qquad\text{o}\qquad K = \frac{L^2 \cdot \mu \cdot \phi}{2 \cdot t \cdot (\Delta P + p_c)} $$

ParámetroTipoDescripción
LfloatLongitud/espesor de la muestra a lo largo de la dirección del flujo (m)
mufloatViscosidad dinámica del fluido (Pa·s)
phifloatPorosidad del medio poroso ($0 < \phi \le 1$)
tfloatTiempo total para que el fluido penetre completamente la muestra (s)
dPfloatDiferencia de presión constante a través de la muestra (Pa)
p_cfloat, opcionalPresión capilar para corrección (Pa)

Devuelve: float — Permeabilidad $K$ (m²)


Seepage.calculate_infiltration_time(L, mu, phi, K, dP, p_c=None)

Predecir el tiempo requerido para que el fluido penetre completamente una muestra. Cuando se proporciona $p_c$, se utiliza la forma con corrección capilar.

$$ t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot \Delta P} \qquad\text{o}\qquad t = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot (\Delta P + p_c)} $$

ParámetroTipoDescripción
LfloatLongitud/espesor de la muestra a lo largo de la dirección del flujo (m)
mufloatViscosidad dinámica del fluido (Pa·s)
phifloatPorosidad del medio poroso ($0 < \phi \le 1$)
KfloatPermeabilidad (m²)
dPfloatDiferencia de presión constante a través de la muestra (Pa)
p_cfloat, opcionalPresión capilar para corrección (Pa)

Devuelve: float — Tiempo de infiltración $t$ (s)


Seepage.calculate_infiltration_front_position(K, mu, phi, dP, t, p_c=None)

Calcular la posición del frente de infiltración en un momento dado. Cuando se proporciona $p_c$, se utiliza la forma con corrección capilar.

$$ z(t) = \sqrt{\frac{2 \cdot K \cdot \Delta P \cdot t}{\mu \cdot \phi}} \qquad\text{o}\qquad z(t) = \sqrt{\frac{2 \cdot K \cdot (\Delta P + p_c) \cdot t}{\mu \cdot \phi}} $$

ParámetroTipoDescripción
KfloatPermeabilidad (m²)
mufloatViscosidad dinámica del fluido (Pa·s)
phifloatPorosidad del medio poroso ($0 < \phi \le 1$)
dPfloatDiferencia de presión constante a través de la muestra (Pa)
tfloatTiempo transcurrido (s)
p_cfloat, opcionalPresión capilar para corrección (Pa)

Devuelve: float — Posición del frente de infiltración $z$ (m)


Seepage.calculate_infiltration_front_position_with_multiple_time(K, mu, phi, dP, t, p_c=None)

Calcular la posición del frente de infiltración en múltiples puntos de tiempo (útil para graficar). Cuando se proporciona $p_c$, se utiliza la forma con corrección capilar.

$$ z(t) = \sqrt{\frac{2 \cdot K \cdot \Delta P \cdot t}{\mu \cdot \phi}} \qquad\text{o}\qquad z(t) = \sqrt{\frac{2 \cdot K \cdot (\Delta P + p_c) \cdot t}{\mu \cdot \phi}} $$

ParámetroTipoDescripción
KfloatPermeabilidad (m²)
mufloatViscosidad dinámica del fluido (Pa·s)
phifloatPorosidad del medio poroso ($0 < \phi \le 1$)
dPfloatDiferencia de presión constante a través de la muestra (Pa)
tnumpy.ndarrayMatriz de valores de tiempo (s)
p_cfloat, opcionalPresión capilar para corrección (Pa)

Devuelve: numpy.ndarray — Matriz de posiciones del frente de infiltración $z$ (m)


Seepage.calculate_pressure_difference(L, mu, phi, K, t, p_c=None)

Calcular la diferencia de presión a través de una muestra. Cuando se proporciona $p_c$, se utiliza la forma con corrección capilar.

$$ \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} \qquad\text{o}\qquad \Delta P = \frac{\mu \cdot \phi \cdot L^2}{2 \cdot K \cdot t} - p_c $$

ParámetroTipoDescripción
LfloatLongitud/espesor de la muestra a lo largo de la dirección del flujo (m)
mufloatViscosidad dinámica del fluido (Pa·s)
phifloatPorosidad del medio poroso ($0 < \phi \le 1$)
KfloatPermeabilidad (m²)
tfloatTiempo total para que el fluido penetre completamente la muestra (s)
p_cfloat, opcionalPresión capilar para corrección (Pa)

Devuelve: float — Diferencia de presión $\Delta P$ (Pa)


calculate_capillary_pressure(gamma, theta, r)

Calcular la presión capilar usando la ecuación de Young-Laplace.

$$ p_c = \frac{2 \cdot \gamma \cdot \cos(\theta)}{r} $$

ParámetroTipoDescripción
gammafloatTensión superficial del líquido (N/m)
thetafloatÁngulo de contacto / ángulo de mojado (Grados)
rfloatRadio de poro equivalente (m)

Devuelve: float — Presión capilar $p_c$ (Pa)


darcy2m2(darcyK)

Convertir permeabilidad de Darcy a m².

ParámetroTipoDescripción
darcyKfloatPermeabilidad en Darcy

Devuelve: float — Permeabilidad en m²


m22darcy(m2K)

Convertir la permeabilidad de m² a Darcy.

ParámetroTipoDescripción
m2KfloatPermeabilidad en m²

Devuelve: float — Permeabilidad en Darcy


PermeabilityTensor(Kx, Ky, Kz)

Tensor de permeabilidad anisotrópico para compuestos tejidos 2D. Representa un tensor de permeabilidad diagonal $K = \text{diag}(K_x, K_y, K_z)$.

ParámetroTipoDescripción
KxfloatPermeabilidad en la dirección x (dirección de urdimbre/fibra) (m²)
KyfloatPermeabilidad en la dirección y (dirección de trama) (m²)
KzfloatPermeabilidad en la dirección z (a través del espesor) (m²)

Métodos de clase

PermeabilityTensor.from_principal_values(Kx, Ky, Kz)

Construye un tensor a partir de permeabilidades en direcciones principales (materiales ortótropos).

PermeabilityTensor.from_isotopic(K)

Construye un tensor de permeabilidad isotrópico donde $K_x = K_y = K_z = K$.

PermeabilityTensor.from_transversely_isotropic(K_in_plane, K_out_plane)

Construye un tensor de permeabilidad transversalmente isotrópico donde $K_x = K_y = K_\text{in-plane}$, $K_z = K_\text{out-plane}$ (adecuado para haces de fibras unidireccionales).

Propiedades

PropiedadTipo de retornoDescripción
tensornumpy.ndarrayMatriz de tensor diagonal 3x3 completa
in_plane_averagefloatPermeabilidad promedio en el plano $(K_x + K_y),/,2$ (m²)
anisotropy_ratiofloatRelación de anisotropía $\beta = \text{in_plane_avg},/,K_z$
degree_of_anisotropyfloatGrado de anisotropía (0 = isotrópico, 1 = totalmente anisotrópico)

Métodos

darcy_velocity(grad_p, mu)

Calcula el vector de velocidad de Darcy $v = -(1/\mu) \cdot K \cdot \nabla p$.

ParámetroTipoDescripción
grad_pnumpy.ndarrayVector de gradiente de presión (Pa/m), forma (3,)
mufloatViscosidad dinámica (Pa·s)

Devuelve: numpy.ndarray — Vector de velocidad de Darcy (m/s), forma (3,)

effective_permeability_in_direction(direction=None, direction_vector=None)

Calcula la permeabilidad efectiva en una dirección especificada. Para un vector unitario de dirección $n$, $K_\text{eff} = n^T \cdot K \cdot n$.

ParámetroTipoDescripción
directionstr, opcionalUno de 'x', 'y', 'z', 'xy' (en el plano), o 'avg'
direction_vectornumpy.ndarray, opcionalVector unitario arbitrario de forma (3,)

Devuelve: float — Permeabilidad efectiva en la dirección especificada (m²)

rotate(R)

Rota el tensor de permeabilidad mediante la matriz de rotación $R$: $K' = R \cdot K \cdot R^T$.

ParámetroTipoDescripción
Rnumpy.ndarrayMatriz de rotación ortogonal (3x3)

Devuelve: PermeabilityTensor o FullTensor — Tensor rotado (diagonal si los términos fuera de la diagonal son despreciables)

to_dict()

Exporta los datos del tensor como un diccionario con claves: Kx, Ky, Kz, in_plane_average, anisotropy_ratio, degree_of_anisotropy.

Devuelve: dict


FullTensor(matrix)

Tensor de permeabilidad simétrico 3x3 completo con componentes fuera de la diagonal, utilizado después de la rotación de coordenadas.

ParámetroTipoDescripción
matrixnumpy.ndarrayMatriz de tensor simétrico 3x3 completa

Propiedades

PropiedadTipo de retornoDescripción
principal_valuestupleValores de permeabilidad principal $(K_1, K_2, K_3)$, en orden descendente
principal_directionsnumpy.ndarrayDirecciones de permeabilidad principal (vectores propios), forma (3, 3)

Métodos

to_principal_tensor()

Convierte a PermeabilityTensor diagonal en el sistema de coordenadas principal utilizando valores propios.

Devuelve: PermeabilityTensor


anisotropic_darcy_flux(tensor, grad_p, mu, area_normal=None)

Calcula el flujo de Darcy y cantidades relacionadas para medios anisotrópicos.

ParámetroTipoDescripción
tensorPermeabilityTensorTensor de permeabilidad anisotrópico
grad_pnumpy.ndarrayVector de gradiente de presión (Pa/m)
mufloatViscosidad dinámica (Pa·s)
area_normalnumpy.ndarray, opcionalVector normal unitario del área de sección transversal para el cálculo del flujo

Devuelve: dict con claves:

ClaveDescripción
darcy_velocityVector de velocidad de Darcy (m/s)
flux_magnitudeMagnitud de la velocidad de Darcy (m/s)
velocity_angle_from_gradP_degÁngulo entre la velocidad y el gradiente de presión (grados)
area_fluxFlujo volumétrico por unidad de área (m³/s por m²), solo si se proporciona area_normal

anisotropy_evolution(K_values, cycles)

Analiza la evolución de la anisotropía de permeabilidad a lo largo de los ciclos de PIP (infiltración de polímero y pirólisis).

ParámetroTipoDescripción
K_valuesnumpy.ndarrayArreglo 2D donde cada fila es $[K_x, K_y, K_z]$ para un ciclo de PIP, forma (n, 3)
cyclesnumpy.ndarrayArreglo 1D de números de ciclo de PIP, forma (n,)

Devuelve: dict con claves:

ClaveDescripción
tensorsLista de objetos PermeabilityTensor para cada ciclo
cyclesArreglo de números de ciclo
anisotropy_ratiosArreglo de relaciones de anisotropía $\beta$ para cada ciclo
degrees_of_anisotropyArreglo del grado de anisotropía $\delta$ para cada ciclo
anisotropy_reductionReducción porcentual de la anisotropía del primer al último ciclo (%)

Desarrollo

Configuración

git clone https://github.com/1Vewton/permeability.git
cd permeability
uv sync

Ejecutar pruebas

uv run pytest

Estilo de código

uv run flake8

Licencia

Este proyecto está licenciado bajo la GNU General Public License v3.0. Consulte el archivo LICENSE para más detalles.