init
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
function [eqs, qomf, qofm, qwmf, qwfm, Awell, qwell] = eqsOW_MB(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
[p, sw] = intADI(p, sw);
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw);
|
||||
pcOW = 0;
|
||||
if f.ifpcow
|
||||
pcOW = f.pcow(sw);
|
||||
end
|
||||
pw = p - pcOW;
|
||||
dpW = os.grad(pw);
|
||||
dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
upc = (double(dpW+dzw)<=0);
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW = -r.T .* mobW .* dpW;
|
||||
|
||||
% Oil Props
|
||||
BO = f.Bo(p);
|
||||
muO = f.muo(p);
|
||||
krO = f.kro(sw);
|
||||
dpO = os.grad(p);
|
||||
dzo=1e-6*9.8*f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
upc = (double(dpO+dzo)<=0);
|
||||
mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO));
|
||||
bOvO = -r.T .* mobO .* dpO;
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
dzo=1e-6*9.8*f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
% dzo=0.01*os.grad(z./BO); %油相位势梯度
|
||||
% dzw=0.01*os.grad(z./BW); %水相位势梯度
|
||||
bOvO = -r.T .* mobO .* (dpO+dzo);
|
||||
bWvW=-r.T .* mobW .* (dpW+dzw);
|
||||
|
||||
% transfer function (OW)
|
||||
[qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, p, pw);
|
||||
qomf=qomf*dt;
|
||||
qofm=qofm*dt;
|
||||
qwmf=qwmf*dt;
|
||||
qwfm=qwfm*dt;
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, Wellc, Weladd, pwf, WelChg);
|
||||
Awell=Awell*dt;
|
||||
qwell=qwell*dt;
|
||||
% Accumulation term
|
||||
PV = r.V .* r.por(p);
|
||||
PV0 = r.V .* r.por(p0);
|
||||
Ar_w = 1/dt .* (PV .* (sw ./ BW) - PV0 .* (sw0 ./ f.Bw(p0)));
|
||||
Ar_o = 1/dt .* (PV .* ((1 - sw) ./ BO) - PV0 .* ((1 - sw0) ./ f.Bo(p0)));
|
||||
|
||||
% Water Equation
|
||||
eqs{1} = (-os.div(bWvW) - Ar_w)*dt;
|
||||
% eqs{1} = -os.div(bWvW) - Ar_w;
|
||||
% Oil Equation
|
||||
eqs{2} = (-os.div(bOvO) - Ar_o)*dt;
|
||||
% eqs{2} = -os.div(bOvO) - Ar_o;
|
||||
|
||||
|
||||
% Rw = Ar_w.val - qwell(1 : r.nc);
|
||||
% Ro = Ar_o.val - qwell(r.nc+1 : 2*r.nc);
|
||||
% PVv = PV.val;
|
||||
% % PV_all = sum(PVv);
|
||||
% Bwa = mean(BW.val);
|
||||
% Boa = mean(BO.val);
|
||||
|
||||
% MBw = abs(Bwa * dt * (sum(Rw)/PV_all));
|
||||
% MBo = abs(Boa * dt * (sum(Ro)/PV_all));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,189 @@
|
||||
function [eqs, Awell, qwell,PVv, Bga, Bwa] = eqsOW_MB_2014(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules_k)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
cs = state.cs;
|
||||
cb = state.cb;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
cs0 = state0.cs;
|
||||
cb0 = state0.cb;
|
||||
[p, sw, cs, cb] = intADI(p, sw, cs, cb);
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
|
||||
% % % % 应力敏感系数
|
||||
% % % exp_paramter_1 = -0.04;
|
||||
% % % reference_pressure = 20;
|
||||
% % % stress_factor = exp(exp_paramter_1*(p-reference_pressure));
|
||||
Nc0 = f.Nc(cs0);
|
||||
Nc = f.Nc(cs);
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw, Nc);
|
||||
pcOW = 0;
|
||||
if f.ifpcgl
|
||||
pcOW = f.pcgl(sw);
|
||||
end
|
||||
pw = p - pcOW+f.chemistry_potential;
|
||||
dpW = os.grad(pw);
|
||||
% dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
dzw=0;
|
||||
dpW = dpW+dzw;
|
||||
upc = (double(dpW)<=0);%一定要是折算压力!
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));
|
||||
% mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW)) .* os.faceAvg(stress_factor);
|
||||
% 针对启动压力梯度的平滑处理
|
||||
if f.p_grad_threshold ~= 0
|
||||
pcOW0 = f.pcgl(sw0);
|
||||
pw0 = p0 - pcOW0+f.chemistry_potential;
|
||||
dpW0 = os.grad(pw0);
|
||||
dzw0=0;
|
||||
dpW0 = dpW0+dzw0;
|
||||
pW_grad = r.T.*dpW0./r.flowArea;
|
||||
ratio = smooth_relu_stable(pW_grad, f.p_grad_threshold);
|
||||
else
|
||||
ratio = 1;
|
||||
end
|
||||
bWvW = -r.T .* mobW .* (dpW).*ratio;
|
||||
|
||||
|
||||
% 孔隙度
|
||||
pore = r.por(p);
|
||||
% 表活剂
|
||||
mobW_s = os.faceUpstr(upc, krW.*cs) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_s = -r.T .* mobW_s .* dpW;
|
||||
dcs = os.grad(cs);
|
||||
upc_s = (double(dcs)<=0);
|
||||
mobW_s_diff = os.faceUpstr(upc_s, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_s = -r.T_diff .*mobW_s_diff .* dcs;
|
||||
|
||||
% 盐
|
||||
mobW_b = os.faceUpstr(upc, krW.*cb) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_b = -r.T .* mobW_b .* dpW;
|
||||
dcb = os.grad(cb);
|
||||
upc_b = (double(dcb)<=0);
|
||||
mobW_b_diff = os.faceUpstr(upc_b, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_b = -r.T_diff.*mobW_b_diff.*dcb;
|
||||
|
||||
% gas Props
|
||||
BG = f.Bg(p);
|
||||
muG = f.mug(p);
|
||||
krG = f.krrg(sw, Nc);
|
||||
dpG = os.grad(p);
|
||||
% dzg=1e-6*9.8*f.Dgsi*os.grad(z./BG); %油相位势梯度
|
||||
dzg=0;
|
||||
dpG = dpG+dzg;
|
||||
upc = (double(dpG)<=0);%一定要是折算压力,否则出错!
|
||||
mgbG = os.faceUpstr(upc, krG) .* os.faceAvg(1./(BG.*muG));
|
||||
% mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO)).* os.faceAvg(stress_factor);
|
||||
% 针对启动压力梯度的平滑处理
|
||||
if f.p_grad_threshold ~= 0
|
||||
dp0 = os.grad(p0);
|
||||
dzg0=0;
|
||||
dp0 = dp0+dzg0;
|
||||
pG_grad = r.T.*dpG./r.flowArea;
|
||||
pG_grad_new = smooth_relu_stable(pG_grad, f.p_grad_threshold);
|
||||
bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.* mgbG.* pG_grad_new.*r.flowArea ...
|
||||
-(1-r.matrixflag).* mgbG.* pG_grad_new.*r.flowArea; % Knudsen 扩散影响
|
||||
else
|
||||
bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.*r.T .* mgbG .* dpG ...
|
||||
-(1-r.matrixflag).*r.T .* mgbG .* dpG; % Knudsen 扩散影响
|
||||
end
|
||||
|
||||
% 非达西流发生仅发生在裂缝网格内
|
||||
% Forchheimer_factor = 1/(1+kf/mug*beta*density_g*v_gf)
|
||||
BG0 = f.Bg(p0);muG0 = f.mug(p0);krG0 = f.krrg(sw0,Nc0);dpG0 = os.grad(p0);
|
||||
dzg0=0;
|
||||
upc0 = (double(dpG0+dzg0)<=0);%一定要是折算压力,否则出错!
|
||||
mgbG0 = os.faceUpstr(upc0, krG0) .* os.faceAvg(1./(BG0.*muG0));
|
||||
% mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO)).* os.faceAvg(stress_factor);
|
||||
v_gf = -(1-r.matrixflag).*r.T .* mgbG0 .* dpG0./r.flowArea;
|
||||
density_g = f.Dgsi./BG0;
|
||||
Forchheimer_factor = 1./(1+(1-r.matrixflag).*r.perm./os.faceAvg(muG0).*f.gas_prop.beta_non_Darcy_flow.*os.faceAvg(density_g).*abs(v_gf));
|
||||
|
||||
% 分别有基质系统的应力敏感系数 和 裂缝系统的应力敏感系数
|
||||
stress_factor = r.matrixflag.*exp(f.gas_prop.stress_factor_matrix*(os.faceAvg(p0)-f.gas_prop.stress_factor_ref_pressure))...
|
||||
+(1-r.matrixflag).*exp(f.gas_prop.stress_factor_fracture*(os.faceAvg(p0)-f.gas_prop.stress_factor_ref_pressure));
|
||||
|
||||
% 采用简单的叠加处理
|
||||
bWvW = bWvW.*stress_factor.*Forchheimer_factor;
|
||||
bGvG = bGvG.*stress_factor.*Forchheimer_factor;
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
% z=r.z;
|
||||
% z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
% dzo=0.01*os.grad(z./BO); %油相位势梯度
|
||||
% dzw=0.01*os.grad(z./BW); %水相位势梯度
|
||||
% bOvO = -r.T .* mobO .* (dpO+dzo);
|
||||
% bWvW=-r.T .* mobW .* (dpW+dzw);
|
||||
|
||||
% transfer function (OW)
|
||||
% [qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, p, pw);
|
||||
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, cs.val, cb.val, Wellc, Weladd, pwf, WelChg, well_schedules_k);
|
||||
% Awell=dt*Awell;
|
||||
% qwell=dt*qwell;
|
||||
|
||||
% langmuir 等温吸附
|
||||
V_CH4=r.rpt.*r.V.*(1-r.por(p)).*r.rock_density.*f.gas_prop.VL.*p/f.gas_prop.PL./(1+p/f.gas_prop.PL);
|
||||
V_CH4_0=r.rpt.*r.V.*(1-r.por(p)).*r.rock_density.*f.gas_prop.VL.*p0/f.gas_prop.PL./(1+p0/f.gas_prop.PL);
|
||||
|
||||
% Accumulation term
|
||||
PV = r.V .* r.por(p);
|
||||
PV0 = r.V .* r.por(p0);
|
||||
RV = r.V .* (1-r.por(p));
|
||||
RV0 = r.V .* (1-r.por(p0));
|
||||
Ar_w = 1/dt*(PV .* (sw ./ BW) - PV0 .* (sw0 ./ f.Bw(p0)));
|
||||
Ar_g = 1/dt*(PV .* ((1 - sw) ./ BG) - PV0 .* ((1 - sw0) ./ f.Bg(p0)) + (V_CH4-V_CH4_0));
|
||||
Ar_w_s = 1/dt*(PV .* (sw.*cs./ BW) - PV0 .* (sw0.*cs./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cs_absorb(cs)-RV0.*f.cs_absorb(cs0)));
|
||||
Ar_w_b = 1/dt*(PV .* (sw.*cb./ BW) - PV0 .* (sw0.*cb0./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cb_absorb(cb)-RV0.*f.cb_absorb(cb0)));
|
||||
% Water Equation
|
||||
eqs{1} = (-os.div(bWvW) - Ar_w);
|
||||
% 使基质考虑重力,裂缝不考虑重力
|
||||
% eqs{1} = (-os.div(-r.T .* mobW .* dpW)-r.rpt.*os.div(-r.T .* mobW .* dzw) - Ar_w)*dt;
|
||||
% eqs{1} = (-os.div(-r.T .* mobW .* dpW) - Ar_w)*dt;
|
||||
% eqs{1} = -os.div(bWvW) - Ar_w;
|
||||
% Oil Equation
|
||||
eqs{2} = (-os.div(bGvG) - Ar_g);
|
||||
% eqs{2} = (-os.div(-r.T .* mobO .* dpO)-r.rpt.*os.div(-r.T .* mobO .* dzo) - Ar_o)*dt;
|
||||
% eqs{2} = (-os.div(-r.T .* mobO .* dpO) - Ar_o)*dt;
|
||||
eqs{3} = (-os.div(bWvW_s+diff_s) - Ar_w_s);
|
||||
eqs{4} = (-os.div(bWvW_b+diff_b) - Ar_w_b);
|
||||
%
|
||||
PVv = PV.val;
|
||||
Bwa = BW.val;
|
||||
Bga = BG.val;
|
||||
% eqs{2} = -os.div(bOvO) - Ar_o;
|
||||
|
||||
|
||||
% Rw = Ar_w.val - qwell(1 : r.nc);
|
||||
% Ro = Ar_o.val - qwell(r.nc+1 : 2*r.nc);
|
||||
% PVv = PV.val;
|
||||
% % PV_all = sum(PVv);
|
||||
% Bwa = mean(BW.val);
|
||||
% Boa = mean(BO.val);
|
||||
|
||||
% MBw = abs(Bwa * dt * (sum(Rw)/PV_all));
|
||||
% MBo = abs(Boa * dt * (sum(Ro)/PV_all));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,187 @@
|
||||
function [eqs, Awell, qwell,PVv, Bga, Bwa] = eqsOW_MB_2014(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules_k)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
cs = state.cs;
|
||||
cb = state.cb;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
cs0 = state0.cs;
|
||||
cb0 = state0.cb;
|
||||
[p, sw, cs, cb] = intADI(p, sw, cs, cb);
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
|
||||
% % % % 应力敏感系数
|
||||
% % % exp_paramter_1 = -0.04;
|
||||
% % % reference_pressure = 20;
|
||||
% % % stress_factor = exp(exp_paramter_1*(p-reference_pressure));
|
||||
Nc0 = f.Nc(cs0);
|
||||
Nc = f.Nc(cs);
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw, Nc);
|
||||
pcOW = 0;
|
||||
if f.ifpcgl
|
||||
pcOW = f.pcgl(sw);
|
||||
end
|
||||
pw = p - pcOW +f.chemistry_cof*log(cb0);
|
||||
dpW = os.grad(pw);
|
||||
% dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
dzw=0;
|
||||
dpW = dpW+dzw;
|
||||
upc = (double(dpW)<=0);%一定要是折算压力!
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));
|
||||
% mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW)) .* os.faceAvg(stress_factor);
|
||||
% 针对启动压力梯度的平滑处理
|
||||
if f.p_grad_threshold ~= 0
|
||||
pcOW0 = f.pcgl(sw0);
|
||||
pw0 = p0 - pcOW0+f.chemistry_cof*log(cb0);
|
||||
dpW0 = os.grad(pw0);
|
||||
dzw0=0;
|
||||
dpW0 = dpW0+dzw0;
|
||||
pW_grad0 = r.T_diff./r.flowArea.*dpW0;
|
||||
ratioW = smooth_relu_stable(pW_grad0, f.p_grad_threshold);
|
||||
else
|
||||
ratioW = 1;
|
||||
end
|
||||
bWvW = -r.T .* mobW .* (dpW).*ratioW;
|
||||
|
||||
% 孔隙度
|
||||
pore = r.por(p);
|
||||
% 表活剂
|
||||
mobW_s = os.faceUpstr(upc, krW.*cs) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_s = -r.T .* mobW_s .* dpW;
|
||||
dcs = os.grad(cs);
|
||||
upc_s = (double(dcs)<=0);
|
||||
mobW_s_diff = os.faceUpstr(upc_s, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_s = -r.T_diff .*mobW_s_diff .* dcs;
|
||||
|
||||
% 盐
|
||||
mobW_b = os.faceUpstr(upc, krW.*cb) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_b = -r.T .* mobW_b .* dpW;
|
||||
dcb = os.grad(cb);
|
||||
upc_b = (double(dcb)<=0);
|
||||
mobW_b_diff = os.faceUpstr(upc_b, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_b = -r.T_diff.*mobW_b_diff.*dcb;
|
||||
|
||||
% gas Props
|
||||
BG = f.Bg(p);
|
||||
muG = f.mug(p);
|
||||
krG = f.krrg(sw, Nc);
|
||||
dpG = os.grad(p);
|
||||
% dzg=1e-6*9.8*f.Dgsi*os.grad(z./BG); %油相位势梯度
|
||||
dzg=0;
|
||||
dpG = dpG+dzg;
|
||||
upc = (double(dpG)<=0);%一定要是折算压力,否则出错!
|
||||
mgbG = os.faceUpstr(upc, krG) .* os.faceAvg(1./(BG.*muG));
|
||||
% mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO)).* os.faceAvg(stress_factor);
|
||||
% 针对启动压力梯度的平滑处理
|
||||
if f.p_grad_threshold ~= 0
|
||||
dpG0 = os.grad(p0);
|
||||
dzg0=0;
|
||||
dpG0 = dpG0+dzg0;
|
||||
pG_grad0 = r.T_diff./r.flowArea.*dpG0;
|
||||
ratioG = smooth_relu_stable(pG_grad0, f.p_grad_threshold);
|
||||
else
|
||||
ratioG = 1;
|
||||
end
|
||||
% Knudsen 扩散影响
|
||||
bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.*r.T .* mgbG .* dpG.*ratioG ...
|
||||
-(1-r.matrixflag).*r.T .* mgbG .* dpG.*ratioG;
|
||||
% 非达西流发生仅发生在裂缝网格内
|
||||
% Forchheimer_factor = 1/(1+kf/mug*beta*density_g*v_gf)
|
||||
BG0 = f.Bg(p0);muG0 = f.mug(p0);krG0 = f.krrg(sw0,Nc0);dpG0 = os.grad(p0);
|
||||
dzg0=0;
|
||||
upc0 = (double(dpG0+dzg0)<=0);%一定要是折算压力,否则出错!
|
||||
mgbG0 = os.faceUpstr(upc0, krG0) .* os.faceAvg(1./(BG0.*muG0));
|
||||
% mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO)).* os.faceAvg(stress_factor);
|
||||
v_gf = -(1-r.matrixflag).*r.T .* mgbG0 .* dpG0./r.flowArea;
|
||||
density_g = f.Dgsi./BG0;
|
||||
Forchheimer_factor = 1./(1+(1-r.matrixflag).*r.perm./os.faceAvg(muG0).*f.gas_prop.beta_non_Darcy_flow.*os.faceAvg(density_g).*abs(v_gf));
|
||||
|
||||
% 分别有基质系统的应力敏感系数 和 裂缝系统的应力敏感系数
|
||||
stress_factor = r.matrixflag.*exp(r.stress_factor_matrix*(os.faceAvg(p0)-r.stress_factor_ref_pressure))...
|
||||
+(1-r.matrixflag).*exp(r.stress_factor_fracture*(os.faceAvg(p0)-r.stress_factor_ref_pressure));
|
||||
|
||||
% 采用简单的叠加处理
|
||||
bWvW = bWvW.*stress_factor.*Forchheimer_factor;
|
||||
bGvG = bGvG.*stress_factor.*Forchheimer_factor;
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
% z=r.z;
|
||||
% z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
% dzo=0.01*os.grad(z./BO); %油相位势梯度
|
||||
% dzw=0.01*os.grad(z./BW); %水相位势梯度
|
||||
% bOvO = -r.T .* mobO .* (dpO+dzo);
|
||||
% bWvW=-r.T .* mobW .* (dpW+dzw);
|
||||
|
||||
% transfer function (OW)
|
||||
% [qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, p, pw);
|
||||
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, cs.val, cb.val, Wellc, Weladd, pwf, WelChg, well_schedules_k);
|
||||
% Awell=dt*Awell;
|
||||
% qwell=dt*qwell;
|
||||
|
||||
% langmuir 等温吸附
|
||||
V_CH4=r.rpt.*r.V.*(1-r.por(p)).*r.rock_density.*f.gas_prop.VL.*p/f.gas_prop.PL./(1+p/f.gas_prop.PL);
|
||||
V_CH4_0=r.rpt.*r.V.*(1-r.por(p)).*r.rock_density.*f.gas_prop.VL.*p0/f.gas_prop.PL./(1+p0/f.gas_prop.PL);
|
||||
|
||||
% Accumulation term
|
||||
PV = r.V .* r.por(p);
|
||||
PV0 = r.V .* r.por(p0);
|
||||
RV = r.V .* (1-r.por(p));
|
||||
RV0 = r.V .* (1-r.por(p0));
|
||||
Ar_w = 1/dt*(PV .* (sw ./ BW) - PV0 .* (sw0 ./ f.Bw(p0)));
|
||||
Ar_g = 1/dt*(PV .* ((1 - sw) ./ BG) - PV0 .* ((1 - sw0) ./ f.Bg(p0)) + (V_CH4-V_CH4_0));
|
||||
Ar_w_s = 1/dt*(PV .* (sw.*cs./ BW) - PV0 .* (sw0.*cs./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cs_absorb(cs)-RV0.*f.cs_absorb(cs0)));
|
||||
Ar_w_b = 1/dt*(PV .* (sw.*cb./ BW) - PV0 .* (sw0.*cb0./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cb_absorb(cb)-RV0.*f.cb_absorb(cb0)));
|
||||
% Water Equation
|
||||
eqs{1} = (-os.div(bWvW) - Ar_w);
|
||||
% 使基质考虑重力,裂缝不考虑重力
|
||||
% eqs{1} = (-os.div(-r.T .* mobW .* dpW)-r.rpt.*os.div(-r.T .* mobW .* dzw) - Ar_w)*dt;
|
||||
% eqs{1} = (-os.div(-r.T .* mobW .* dpW) - Ar_w)*dt;
|
||||
% eqs{1} = -os.div(bWvW) - Ar_w;
|
||||
% Oil Equation
|
||||
eqs{2} = (-os.div(bGvG) - Ar_g);
|
||||
% eqs{2} = (-os.div(-r.T .* mobO .* dpO)-r.rpt.*os.div(-r.T .* mobO .* dzo) - Ar_o)*dt;
|
||||
% eqs{2} = (-os.div(-r.T .* mobO .* dpO) - Ar_o)*dt;
|
||||
eqs{3} = (-os.div(bWvW_s+diff_s) - Ar_w_s);
|
||||
eqs{4} = (-os.div(bWvW_b+diff_b) - Ar_w_b);
|
||||
%
|
||||
PVv = PV.val;
|
||||
Bwa = BW.val;
|
||||
Bga = BG.val;
|
||||
% eqs{2} = -os.div(bOvO) - Ar_o;
|
||||
|
||||
|
||||
% Rw = Ar_w.val - qwell(1 : r.nc);
|
||||
% Ro = Ar_o.val - qwell(r.nc+1 : 2*r.nc);
|
||||
% PVv = PV.val;
|
||||
% % PV_all = sum(PVv);
|
||||
% Bwa = mean(BW.val);
|
||||
% Boa = mean(BO.val);
|
||||
|
||||
% MBw = abs(Bwa * dt * (sum(Rw)/PV_all));
|
||||
% MBo = abs(Boa * dt * (sum(Ro)/PV_all));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
function [eqs, qomf, qofm, qwmf, qwfm, Awell, qwell] = equa_process(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg)
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
[p, sw] = intADI(p, sw);
|
||||
|
||||
% Water Props
|
||||
BW = f.Bw(p);%地层水体积系数
|
||||
muW = f.muw(p);%地层水粘度
|
||||
krW = f.krw(sw);%地层水相对渗透率
|
||||
pcOW = 0;%默认ifpcow=0,即默认忽略毛管力
|
||||
if f.ifpcow
|
||||
pcOW = f.pcow(sw);
|
||||
end
|
||||
pw = p - pcOW;%水相压力
|
||||
dpW = os.grad(pw);%水相压力梯度
|
||||
upc = (double(dpW)<=0);%作为迎风格式函数的flag
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));%按照迎风格式计算流度
|
||||
bWvW = -r.T .* mobW .* dpW;%传导系数*流度*压差
|
||||
|
||||
% Oil Props
|
||||
BO = f.Bo(p);%油组分体积系数
|
||||
muO = f.muo(p);%油相粘度
|
||||
krO = f.kro(sw);%油相相对渗透率
|
||||
dpO = os.grad(p);%油相压力梯度
|
||||
upc = (double(dpO)<=0);%迎风格式函数flag
|
||||
mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO));%计算流度
|
||||
bOvO = -r.T .* mobO .* dpO;
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
dzo=f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
dzw=f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
|
||||
|
||||
% transfer function (OW)
|
||||
[qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, p, pw);
|
||||
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, Wellc, Weladd, pwf, WelChg);
|
||||
|
||||
% 因为z的取法,故方程中是压力梯度加上位势梯度
|
||||
% Water Equation
|
||||
eqs{1} = -os.div(bWvW+dzo) - r.V/dt .* (r.por(p) .* (sw ./ BW) - r.por(p0) .* (sw0 ./ f.Bw(p0)));
|
||||
|
||||
% Oil Equation
|
||||
eqs{2} = -os.div(bOvO+dzw) - r.V/dt .* (r.por(p) .* ((1 - sw) ./ BO) - r.por(p0) .* ((1 - sw0) ./ f.Bo(p0)));
|
||||
|
||||
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user