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
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ímbolo | Significado | Unidad |
|---|---|---|
| $K$ | Permeabilidad | m² |
| $L$ | Espesor de la muestra a lo largo de la dirección del flujo | m |
| $\mu$ | Viscosidad dinámica del fluido | Pa·s |
| $\phi$ | Porosidad del medio poroso | adimensional |
| $t$ | Tiempo para que el fluido penetre completamente la muestra | s |
| $\Delta P$ | Diferencia de presión constante a través de la muestra | Pa |
| $z$ | Posición del frente de infiltración | m |
| $p_c$ | Presión capilar | Pa |
| $\gamma$ | Tensión superficial del líquido | N/m |
| $\theta$ | Ángulo de contacto (ángulo de mojado) | Grados |
| $r$ | Radio de poro equivalente | m |
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:
| Herramienta | Descripción |
|---|---|
calculate_permeability_by_seepage_distance | Calcular $K$ (opcionalmente con corrección capilar mediante $p_c$) |
calculate_infiltration_time | Calcular $t$ (opcionalmente con corrección capilar mediante $p_c$) |
calculate_infiltration_front_position | Calcular $z(t)$ (opcionalmente con corrección capilar mediante $p_c$) |
calculate_infiltration_front_position4multiple_times | Calcular $z(t)$ para múltiples puntos de tiempo (opcionalmente con corrección capilar mediante $p_c$) |
calculate_capillary_pressure | Calcular $p_c = 2\gamma\cos(\theta),/,r$ (ecuación de Young-Laplace) |
calculate_pressure_difference | Calcular $\Delta P$ (opcionalmente con corrección capilar mediante $p_c$) |
darcy_m2_converter | Convertir Darcy a m² y/o m² a Darcy (bidireccional) |
calculate_darcy_flux_tool | Calcular 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_tool | Analizar 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ámetro | Tipo | Descripción |
|---|---|---|
L | float | Longitud/espesor de la muestra a lo largo de la dirección del flujo (m) |
mu | float | Viscosidad dinámica del fluido (Pa·s) |
phi | float | Porosidad del medio poroso ($0 < \phi \le 1$) |
t | float | Tiempo total para que el fluido penetre completamente la muestra (s) |
dP | float | Diferencia de presión constante a través de la muestra (Pa) |
p_c | float, opcional | Presió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ámetro | Tipo | Descripción |
|---|---|---|
L | float | Longitud/espesor de la muestra a lo largo de la dirección del flujo (m) |
mu | float | Viscosidad dinámica del fluido (Pa·s) |
phi | float | Porosidad del medio poroso ($0 < \phi \le 1$) |
K | float | Permeabilidad (m²) |
dP | float | Diferencia de presión constante a través de la muestra (Pa) |
p_c | float, opcional | Presió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ámetro | Tipo | Descripción |
|---|---|---|
K | float | Permeabilidad (m²) |
mu | float | Viscosidad dinámica del fluido (Pa·s) |
phi | float | Porosidad del medio poroso ($0 < \phi \le 1$) |
dP | float | Diferencia de presión constante a través de la muestra (Pa) |
t | float | Tiempo transcurrido (s) |
p_c | float, opcional | Presió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ámetro | Tipo | Descripción |
|---|---|---|
K | float | Permeabilidad (m²) |
mu | float | Viscosidad dinámica del fluido (Pa·s) |
phi | float | Porosidad del medio poroso ($0 < \phi \le 1$) |
dP | float | Diferencia de presión constante a través de la muestra (Pa) |
t | numpy.ndarray | Matriz de valores de tiempo (s) |
p_c | float, opcional | Presió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ámetro | Tipo | Descripción |
|---|---|---|
L | float | Longitud/espesor de la muestra a lo largo de la dirección del flujo (m) |
mu | float | Viscosidad dinámica del fluido (Pa·s) |
phi | float | Porosidad del medio poroso ($0 < \phi \le 1$) |
K | float | Permeabilidad (m²) |
t | float | Tiempo total para que el fluido penetre completamente la muestra (s) |
p_c | float, opcional | Presió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ámetro | Tipo | Descripción |
|---|---|---|
gamma | float | Tensión superficial del líquido (N/m) |
theta | float | Ángulo de contacto / ángulo de mojado (Grados) |
r | float | Radio de poro equivalente (m) |
Devuelve: float — Presión capilar $p_c$ (Pa)
darcy2m2(darcyK)
Convertir permeabilidad de Darcy a m².
| Parámetro | Tipo | Descripción |
|---|---|---|
darcyK | float | Permeabilidad en Darcy |
Devuelve: float — Permeabilidad en m²
m22darcy(m2K)
Convertir la permeabilidad de m² a Darcy.
| Parámetro | Tipo | Descripción |
|---|---|---|
m2K | float | Permeabilidad 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ámetro | Tipo | Descripción |
|---|---|---|
Kx | float | Permeabilidad en la dirección x (dirección de urdimbre/fibra) (m²) |
Ky | float | Permeabilidad en la dirección y (dirección de trama) (m²) |
Kz | float | Permeabilidad 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
| Propiedad | Tipo de retorno | Descripción |
|---|---|---|
tensor | numpy.ndarray | Matriz de tensor diagonal 3x3 completa |
in_plane_average | float | Permeabilidad promedio en el plano $(K_x + K_y),/,2$ (m²) |
anisotropy_ratio | float | Relación de anisotropía $\beta = \text{in_plane_avg},/,K_z$ |
degree_of_anisotropy | float | Grado 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ámetro | Tipo | Descripción |
|---|---|---|
grad_p | numpy.ndarray | Vector de gradiente de presión (Pa/m), forma (3,) |
mu | float | Viscosidad 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ámetro | Tipo | Descripción |
|---|---|---|
direction | str, opcional | Uno de 'x', 'y', 'z', 'xy' (en el plano), o 'avg' |
direction_vector | numpy.ndarray, opcional | Vector 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ámetro | Tipo | Descripción |
|---|---|---|
R | numpy.ndarray | Matriz 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ámetro | Tipo | Descripción |
|---|---|---|
matrix | numpy.ndarray | Matriz de tensor simétrico 3x3 completa |
Propiedades
| Propiedad | Tipo de retorno | Descripción |
|---|---|---|
principal_values | tuple | Valores de permeabilidad principal $(K_1, K_2, K_3)$, en orden descendente |
principal_directions | numpy.ndarray | Direcciones 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ámetro | Tipo | Descripción |
|---|---|---|
tensor | PermeabilityTensor | Tensor de permeabilidad anisotrópico |
grad_p | numpy.ndarray | Vector de gradiente de presión (Pa/m) |
mu | float | Viscosidad dinámica (Pa·s) |
area_normal | numpy.ndarray, opcional | Vector normal unitario del área de sección transversal para el cálculo del flujo |
Devuelve: dict con claves:
| Clave | Descripción |
|---|---|
darcy_velocity | Vector de velocidad de Darcy (m/s) |
flux_magnitude | Magnitud de la velocidad de Darcy (m/s) |
velocity_angle_from_gradP_deg | Ángulo entre la velocidad y el gradiente de presión (grados) |
area_flux | Flujo 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ámetro | Tipo | Descripción |
|---|---|---|
K_values | numpy.ndarray | Arreglo 2D donde cada fila es $[K_x, K_y, K_z]$ para un ciclo de PIP, forma (n, 3) |
cycles | numpy.ndarray | Arreglo 1D de números de ciclo de PIP, forma (n,) |
Devuelve: dict con claves:
| Clave | Descripción |
|---|---|
tensors | Lista de objetos PermeabilityTensor para cada ciclo |
cycles | Arreglo de números de ciclo |
anisotropy_ratios | Arreglo de relaciones de anisotropía $\beta$ para cada ciclo |
degrees_of_anisotropy | Arreglo del grado de anisotropía $\delta$ para cada ciclo |
anisotropy_reduction | Reducció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.