Material_H2 class
This class defines the material properties and behavior for a porous medium involving liquid and gas phases. It includes methods for computing relative permeabilities, saturation degrees, permeability matrices, and compressibility coefficients for the liquid and gas phases.
Contents
Methods
- saturationDegree: Computes the liquid saturation degree based on the capillary pressure pc.
- permeabilityMtrcs: Computes the permeability matrices for the liquid and gas phases based on the liquid saturation degree Sl, liquid pressure pl, and gas pressure pg.
- permeabilityMtrcsPgPc: Computes the permeability matrices for the liquid and gas phases considering the gas-to-liquid density ratio.
- compressibilityCoeffs: Computes the compressibility coefficients for the liquid and gas phases based on the liquid saturation degree Sl, liquid pressure pl, and gas pressure pg.
- compressibilityCoeffsPgPc: Computes the compressibility coefficients considering the gas-to-liquid density ratio.
- derivativeGasDensityWrtGasPressure: Computes the derivative of the gas density with respect to the gas pressure Pg.
Author
Danilo Cavalcanti
Version History
Version 1.00.
Class definition
classdef Material_H2 < handle
Public attributes
properties (SetAccess = public, GetAccess = public)
liqRelativePermeability = [];
gasRelativePermeability = [];
capillaryPressure = [];
liquidFluid = Fluid();
gasFluid = Fluid();
porousMedia = PorousMedia();
end
Constructor method
methods %------------------------------------------------------------------ function this = Material_H2(matData) this.liquidFluid = matData.liquidFluid; this.gasFluid = matData.gasFluid; this.porousMedia = matData.porousMedia; % Liquid phase relative permeability function if strcmp('BrooksCorey',matData.porousMedia.liqRelPermeability) this.liqRelativePermeability = RelativePermeabilityBrooksCoreyLiquid(); elseif strcmp('Liakopoulos',matData.porousMedia.liqRelPermeability) this.liqRelativePermeability = RelativePermeabilityLiakopoulosLiquid(); elseif strcmp('PolynomialLiquid',matData.porousMedia.liqRelPermeability) this.liqRelativePermeability = RelativePermeabilityPolynomialLiquid(); elseif strcmp('UMAT',matData.porousMedia.liqRelPermeability) curve = matData.porousMedia.klr_umat; this.liqRelativePermeability = RelativePermeabilityUMAT(curve(:,1),curve(:,2)); end % Gas phase relative permeability function if strcmp('BrooksCorey',matData.porousMedia.gasRelPermeability) this.gasRelativePermeability = RelativePermeabilityBrooksCoreyGas(); elseif strcmp('PolynomialGas',matData.porousMedia.gasRelPermeability) this.gasRelativePermeability = RelativePermeabilityPolynomialGas(); elseif strcmp('UMAT',matData.porousMedia.gasRelPermeability) curve = matData.porousMedia.kgr_umat; this.gasRelativePermeability = RelativePermeabilityUMAT(curve(:,1),curve(:,2)); end % Saturation degree function if strcmp('BrooksCorey',matData.porousMedia.capillaryPressure) this.capillaryPressure = CapillaryPressureBrooksCorey(); elseif strcmp('UMAT',matData.porousMedia.capillaryPressure) curve = matData.porousMedia.SlPc_umat; this.capillaryPressure = CapillaryPressureUMAT(curve(:,1),curve(:,2)); elseif strcmp('Liakopoulos',matData.porousMedia.capillaryPressure) this.capillaryPressure = CapillaryPressureLiakopoulos(); end end end
Public methods
methods %------------------------------------------------------------------ % Get the liquid saturation degree function Sl = saturationDegree(this,pc) Sl = this.capillaryPressure.saturationDegree(pc, this.porousMedia); end %------------------------------------------------------------------ % Compute the permeability matrices function [Kll, Klg, Kgl, Kgg] = permeabilityMtrcs(this,Sl,pl,pg) K = this.porousMedia.intrinsicPermeabilityMatrix(); % Get fluids dynamic viscosity mul = this.liquidFluid.mu; mug = this.gasFluid.mu; % Compute relative permeability coefficients klr = this.liqRelativePermeability.calculate(Sl, this.porousMedia); kgr = this.gasRelativePermeability.calculate(Sl, this.porousMedia); % Permeability matrices Kll = K * klr / mul; Klg = zeros(2); Kgl = zeros(2); Kgg = K * kgr / mug; end %------------------------------------------------------------------ % Compute the permeability matrices function [Kll, Klg, Kgl, Kgg] = permeabilityMtrcsPgPc(this,Sl,pl,pg) K = this.porousMedia.intrinsicPermeabilityMatrix(); % Get fluids dynamic viscosity mul = this.liquidFluid.mu; mug = this.gasFluid.mu; % Get fluid densities rhol = this.liquidFluid.getDensity(pl); rhog = this.gasFluid.getDensity(pg); % Compute relative permeability coefficients klr = this.liqRelativePermeability.calculate(Sl, this.porousMedia); kgr = this.gasRelativePermeability.calculate(Sl, this.porousMedia); % Permeability matrices Kll = - K * klr / mul; Klg = K * klr / mul; Kgl = zeros(2); Kgg = K * kgr / mug * (rhog / rhol); end %------------------------------------------------------------------ % Compute the compressibility coefficients function [cll, clg, cgl, cgg] = compressibilityCoeffs(this,Sl,pl,pg) % Get porous media parameters biot = this.porousMedia.biot; phi = this.porousMedia.phi; Ks = this.porousMedia.Ks; % Get the fluids bulk modulus Klb = this.liquidFluid.K; Kgb = this.gasFluid.K; % Gas saturation degree Sg = 1.0 - Sl; % Capillary pressure pc = pg - pl; % Derivative of the liquid saturation degree wrt pc dSldpc = this.capillaryPressure.derivativeSaturationDegree(pc, this.porousMedia); % Compressibility coefficients cll = Sl * ((biot - phi) / Ks) * (Sl + dSldpc * pc) - phi * dSldpc + phi * Sl / Klb; clg = Sl * ((biot - phi) / Ks) * (Sg - dSldpc * pc) + phi * dSldpc; cgl = Sg * ((biot - phi) / Ks) * (Sl + dSldpc * pc) + phi * dSldpc; cgg = Sg * ((biot - phi) / Ks) * (Sg - dSldpc * pc) - phi * dSldpc + phi * Sg / Kgb; end %------------------------------------------------------------------ % Compute the compressibility coefficients function [ccc, ccg, cgc,cgg] = compressibilityCoeffsPgPc(this,Sl,pl,pg) % Get porous media parameters phi = this.porousMedia.phi; % Get fluid densities rhol = this.liquidFluid.getDensity(pl); rhog = this.gasFluid.getDensity(pg); % Capillary pressure pc = pg - pl; % Derivative of the liquid saturation degree wrt pc dSldpc = this.capillaryPressure.derivativeSaturationDegree(pc, this.porousMedia); % Derivative of the gas density wrt to pg drhogdpg = this.derivativeGasDensityWrtGasPressure(rhog,pg); % Compressibility coefficients ccc = phi * dSldpc; ccg = 0.0; cgc = -phi * dSldpc * (rhog / rhol); cgg = phi * (1.0 - Sl) * drhogdpg / rhol; end %------------------------------------------------------------------ % Compute the derivative of the gas density wrt to the gas pressure function drhogdpg = derivativeGasDensityWrtGasPressure(this,rhog,pg) % Pertubation value pert = sqrt(eps); % Compute the gas density given a pertubation at the gas pressure rhogPert = this.gasFluid.getDensity(pg + pert); % Compute the derivative drhogdpg = (rhogPert - rhog)/(pert); end end
end