This commit is contained in:
xinxiao
2026-03-13 11:24:41 +08:00
commit 04e2bb29c7
238 changed files with 29102 additions and 0 deletions
@@ -0,0 +1,3 @@
function h = Bg_gw(p, BG, Ppr)
h = interptable(Ppr, BG, p);
end
@@ -0,0 +1,2 @@
function h = Bw_gw(p, Bwi, prw, cw)
h = Bwi * (1 - cw * (p - prw));
@@ -0,0 +1,112 @@
function [Awell, qwell] = WellEquation_gas_water_flow(r, f, p, sw, Wellc, Weladd, pwf, WelChg, well_schedules_k)
nWel = size(Wellc, 1);%
% Wellcpara: welltype(1) nperf(2) index(3) Tr(j)ans(4) protype(5) value(6) consTr(j)ain(7) Wellc(nWel, 6)
% welltype = 1 prod, welltype = 2 inj
% protype = 1 const flowrate, protype = 2 const pwf
nmatr = 2 * r.nc + Weladd;%
nzw = 10 * nWel;
% Awell = spalloc(nmatr,nmatr,nzw);
Awell = spalloc(nmatr,nmatr,nzw);
qwell = spalloc(nmatr,1,nzw);
% Dimensionless_wellflow=[];
if Weladd == 0 %%0
[p, sw] = intADI_gas_water_flow(p, sw);
else
[p, sw, pwf] = intADI2_gas_water_flow(p, sw, pwf);
end
BW = f.Bw(p);
muW = f.muw(p);
krW = f.krw(sw);
BG = f.Bg(p);
muG = f.mug(p);
krG = f.krrg(sw);
Ygt = krG ./ (muG .* BG);
Ywt = krW ./ (muW .* BW);
Ygj = krG ./ muG;
Ywj = krW ./ muW;
pcOW = 0;
if f.ifpcgl%00
pcOW = f.pcgl(sw);
end
pw = p - pcOW;
ipwf = 0;
for i = 1 : nWel
if strcmp(well_schedules_k{i,2},'open')
jperfall = Wellc{i,3};%
if strcmp(well_schedules_k{i,3},'pro') % prod
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygt(jperf);
Yw = Ywt(jperf);
qo = -Tr(j) .* Yo .*(p(jperf) - pwf(ipwf));
qw = -Tr(j) .* Yw .*(pw(jperf) - pwf(ipwf));
%nc行是水相方程
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3}];
qwell(jperf) = qw.val;
%nc行是水相方程
Awell(r.nc + jperf, :) = [qo.jac{1} qo.jac{2} qo.jac{3}];
qwell(r.nc + jperf) = qo.val;
%
% 使MR迭代收敛条件过高
Awell(2*r.nc + ipwf, :) = Awell(2*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3}] + [qo.jac{1} qo.jac{2} qo.jac{3}];
qwell(2*r.nc + ipwf) = qwell(2*r.nc + ipwf) + qw.val + qo.val;
end
qwell(2*r.nc + ipwf) = (qwell(2*r.nc + ipwf) + well_schedules_k{i,5}/86.4);
else % const pwf
if ~WelChg(i)
pwfc = well_schedules_k{i,5};
else
pwfc = well_schedules_k{i,6};
end
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygt(jperf);
Yw = Ywt(jperf);
qo = -Tr(j) .* Yo .*(p(jperf) - pwfc);
qw = -Tr(j) .* Yw .*(pw(jperf) - pwfc);
Awell(jperf, 1 : 2 * r.nc) = [qw.jac{1} qw.jac{2}];
qwell(jperf) = qw.val;
Awell(r.nc + jperf, 1 : 2 * r.nc) = [qo.jac{1} qo.jac{2}];
qwell(r.nc + jperf) = qo.val;
end
end
else %
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygj(jperf);
Yw = Ywj(jperf);
qw = -Tr(j) ./ BW(jperf) .* (Yo + Yw) .* (pw(jperf) - pwf(ipwf));
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3}];
qwell(jperf) = qw.val;
Awell(2*r.nc + ipwf, :) = Awell(2*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3}];
qwell(2*r.nc + ipwf) = qwell(2*r.nc + ipwf) + qw.val;
end
qwell(2*r.nc + ipwf) = qwell(2*r.nc + ipwf) - well_schedules_k{i,5}/86.4;
else %
if ~WelChg(i)
pwfc = well_schedules_k{i,5};
else
pwfc = well_schedules_k{i,6};
end
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygj(jperf);
Yw = Ywj(jperf);
qw =- Tr(j) ./ BW(jperf) .* (Yo + Yw) .* (pw(jperf) - pwfc);
Awell(jperf, 1 : 2 * r.nc) = [qw.jac{1} qw.jac{2}];
qwell(jperf) = qw.val;
end
end
end
end
end
@@ -0,0 +1,98 @@
function [Wellpara, WelChg, Weladd] = calcWellequation_gas_water_flow(Weladd, Wellc, WelChg, well_schedules_k, nc, qwell, state)
%Weladd表示定流量井的数量Wellc表示井参数
% Wellcpara: welltype(1) nperf(2) index(3) Tr(j)ans(4) protype(5) value(6) consTr(j)ain(7) Wellc(nWel, 6)
% welltype = 1 prod, welltype = 2 inj
% protype = 1 const flowrate, protype = 2 const pwf
nWel = size(Wellc, 1);%
Wellpara = cell(1, nWel);
if Weladd > 0 %
pwf = state.pwf;
end
ipwf = 0;
for i = 1 : nWel
if strcmp(well_schedules_k{i,2},'open')
qgt = 0;
qwt = 0;
jperfall = Wellc{i,3};
if strcmp(well_schedules_k{i,3},'pro') % prod
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
%
qwt = qwt + qwell(jperf);
qgt = qgt + qwell(nc + jperf);
end
if well_schedules_k{i,5} ~= 0
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qg = abs(qgt)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.qg = 0;
Wellpara{1,i}.pwf = pwf(ipwf);
end
% if pwf(ipwf)<= Wellc{i,7} %
% WelChg(i) = 1;
% Weladd = Weladd - 1;
% else
% WelChg(i) = 0;
% end
else % const pwf
if ~WelChg(i)
Wellpara{1,i}.pwf = well_schedules_k{i,5};
else
Wellpara{1,i}.pwf = well_schedules_k{i,6};
end
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
qgt = qgt + qwell(nc + jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qg = abs(qgt)*86.4;
end
else %
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
end
if well_schedules_k{i,5} ~= 0
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
Wellpara{1,i}.qg = 0;
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.pwf = pwf(ipwf);
Wellpara{1,i}.qg = 0;
end
% if pwf(ipwf) >= Wellc{i,7} %
% WelChg(i) = 1;
% Weladd = Weladd - 1;
% else
% WelChg(i) = 0;
% end
else
if ~WelChg(i)
Wellpara{1,i}.pwf = well_schedules_k{i,5};
else
Wellpara{1,i}.pwf = well_schedules_k{i,6};
end
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qg = 0;
end
end
end
end
@@ -0,0 +1,159 @@
function [eqs, Awell, qwell,PVv, Bga, Bwa] = eqsOW_MB_gas_water_flow(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules_k)
p = state.p;
sw = state.sw;
p0 = state0.p;
sw0 = state0.sw;
[p, sw] = intADI_gas_water_flow(p, sw);
% 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));
% Water Props
BW = f.Bw(p);
muW = f.muw(p);
krW = f.krw(sw);
pcOW = 0;
if f.ifpcgl
pcOW = f.pcgl(sw);
end
pw = p - pcOW;
dpW = os.grad(pw);
% dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %
dzw=0;
upc = (double(dpW+dzw)<=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;
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;
% bWvW = -r.T .* mobW .* dpW;
% gas Props
BG = f.Bg(p);
muG = f.mug(p);
krG = f.krrg(sw);
dpG = os.grad(p);
% dzg=1e-6*9.8*f.Dgsi*os.grad(z./BG); %
dzg=0;
upc = (double(dpG+dzg)<=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;
% Knudsen
% bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.*r.T .* mgbG .* dpG ...
% -(1-r.matrixflag).*r.T .* mgbG .* dpG;
% 西
% Forchheimer_factor = 1/(1+kf/mug*beta*density_g*v_gf)
BG0 = f.Bg(p0);muG0 = f.mug(p0);krG0 = f.krrg(sw0);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.density_g_sc./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_gas_water_flow(r, f, p.val, sw.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.density_rock.*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.density_rock.*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);
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));
% 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;
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,16 @@
function f = fluidPVT_gas_water_flow(Ppr, BG, MUG, Bwi, prw, cw, vwi, cvw, SW, KRG, KRW, PCGL, SWF, KRGF, KRWF, PCGLF, density_g_sc, ifpcgl, rpt)
% f = fluidPVT(Bopb, pb, co, Bwi, prw, cw, vwi, cvw, visopb, cvo, SW, KRO, KRW, PCOW, ifpcow, SWF, KROF, KRWF, PCOWF, rpt,Dosi,Dwsi)
f.Bw = @(p) Bw_gw(p, Bwi, prw, cw);
f.Bg = @(p) Bg_gw(p, BG, Ppr);
f.muw = @(p) muw_gw(p, vwi, prw, cvw);
f.mug = @(p) mug_gw(p, MUG, Ppr);
f.krrg = @(sw) krrg_gw(sw, SW, KRG, SWF, KRGF, rpt);
f.krw = @(sw) krw_gw(sw, SW, KRW, SWF, KRWF, rpt);
f.pcgl = @(sw) pc_gw(sw, SW, PCGL, SWF, PCGLF, rpt);
f.density_g_sc = density_g_sc;
f.ifpcgl = ifpcgl;
% f.Dosi=Dosi;
% f.Dwsi=Dwsi;
@@ -0,0 +1,53 @@
function [Weladd, pwf] = initalSchedule_gas_water_flow(p, sw, Wellc, f, well_schedules_k)
nWel = size(Wellc, 1);%
Weladd = 0;
pwf = zeros(1);
BW = f.Bw(p);
muW = f.muw(p);
krW = f.krw(sw);
BG = f.Bg(p);
muG = f.mug(p);
krG = f.krrg(sw);
Ygt = krG ./ (muG .* BG);%mu代表黏度
Ygj = krG ./ muG;
Ywt = krW ./ (muW .* BW);%mu代表黏度
Ywj = krW ./ muW;
for i = 1 : nWel
if strcmp(well_schedules_k{i,2},'open')
if strcmp(well_schedules_k{i,3},'pro') && strcmp(well_schedules_k{i,4},'const_q') %
Weladd = Weladd + 1;
nper = Wellc{i,2}; %
jperf = zeros(nper,1);
Trans = zeros(nper,1);
Tnp = 0;
Tn = 0;
for j = 1 : nper
jperf(j) = Wellc{i,3}(j);%
Tr = Wellc{i,4}(j);%
Trans(j) = Tr * (Ygt(jperf(j)) + Ywt(jperf(j)));%
Tnp = Tnp + Trans(j)*p(jperf(j));
Tn = Tn + Trans(j);
end
pwf(Weladd) = (Tnp - well_schedules_k{i,5}/86.4) / Tn;%
elseif strcmp(well_schedules_k{i,3},'inj') && strcmp(well_schedules_k{i,4},'const_q') %
Weladd = Weladd + 1;
nper = Wellc{i,2};
jperf = zeros(nper,1);
Trans = zeros(nper,1);
Tnp = 0;
Tn = 0;
for j = 1 : nper
jperf(j) = Wellc{i,3}(j);
Tr = Wellc{i,4}(j);
Trans(j) = Tr / BW(jperf(j)) * (Ygj(jperf(j)) + Ywj(jperf(j)));%
Tnp = Tnp + Trans(j)*p(jperf(j));
Tn = Tn + Trans(j);
end
pwf(Weladd) = (Tnp + well_schedules_k{i,5}/86.4) / Tn;%
else
continue
end
end
end
pwf = pwf';
@@ -0,0 +1,3 @@
function state = initialRS_gas_water_flow(P, Sw)
state.p = P;
state.sw = Sw;
@@ -0,0 +1,18 @@
function [P, Sw, Pwf] = intADI2_gas_water_flow(p, sw, pwf)
n = length(p);
npwf = length(pwf);
Jp = cell(1,3);
Jsw = cell(1,3);
Jpwf = cell(1,3);
Jp{1} = sparse(1:n, 1:n, ones(n,1), n, n);
Jp{2} = sparse(n,n);
Jp{3} = sparse(n,npwf);
Jsw{1} = sparse(n,n);
Jsw{2} = sparse(1:n, 1:n, ones(n,1), n, n);
Jsw{3} = sparse(n,npwf);
Jpwf{1} = sparse(npwf,n);
Jpwf{2} = sparse(npwf,n);
Jpwf{3} = sparse(1:npwf, 1:npwf, ones(npwf,1), npwf, npwf);
P = ADI(p, Jp);
Sw = ADI(sw, Jsw);
Pwf = ADI(pwf, Jpwf);
@@ -0,0 +1,10 @@
function [P, Sw] = intADI_gas_water_flow(p, sw)
n = length(p);
Jp = cell(1,2);
Jsw = cell(1,2);
Jp{1} = sparse(1:n, 1:n, ones(n,1), n, n);
Jp{2} = sparse(n,n);
Jsw{1} = sparse(n,n);
Jsw{2} = sparse(1:n, 1:n, ones(n,1), n, n);
P = ADI(p, Jp);
Sw = ADI(sw, Jsw);
@@ -0,0 +1,14 @@
function h = krrg_gw(sw, SW, KRO, varargin)
n = numel(varargin);%
if n == 0
h = interptable(SW, KRO, sw);
else
SWF = varargin{1};
KROF = varargin{2};
rpt = varargin{3};
hm = interptable(SW, KRO, sw);
hf = interptable(SWF, KROF, sw);
h = rpt .* hm + ~rpt .* hf;%
end
% h=sw+(1-sw);
end
@@ -0,0 +1,15 @@
function h = krw_gw(sw, SW, KRW, varargin)
n = numel(varargin);
if n == 0
h = interptable(SW, KRW, sw);
else
SWF = varargin{1};
KRWF = varargin{2};
rpt = varargin{3};
hm = interptable(SW, KRW, sw);
hf = interptable(SWF, KRWF, sw);
h = rpt .* hm + ~rpt .* hf;
end
% h=sw-sw;
end
@@ -0,0 +1,153 @@
function [Times, OutputRs, Wellpara, trun] = mainRS_MB_gas_water_flow(r, f, os, w, state0)
t_start = clock;
dtmin = w.dtmin;
dtmax = w.dtmax;
Nmax = w.Nmax;
epsave = w.epsave;
epsmax = w.epsmax;
yitap = w.yitap;
yitas = w.yitas;
omega = w.omega;
Wellc = w.Wellc;
time = w.time;
well_schedules = w.well_schedules;
% WelChg = w.WelChg;
% tend = w.tend;
count = 0;
t = 0;
state = state0;
OutputRs = cell(2,1);
Wellpara = cell(2,1);
Times = zeros(2,1);
% h0 = waitbar(0,'Please wait...');
for k = 1:size(well_schedules,1)
dt=dtmin(k);
[Weladd, pwf] = initalSchedule_gas_water_flow(state0.p, state0.sw, Wellc, f, well_schedules{k,1});
% [Weladd, pwf] = initalSchedule(state0.p, state0.sw, Wellc, f);
WelChg = zeros(size(well_schedules{k,1},1),1); %
repi = 0;
Newton_step = 0;
cons_Jacob = 0;
leqs_solve_time = 0;
Newtons_vs_time = [0, 0];
tend = sum(time(1:k),1);
while t < tend
for i = 1 : Nmax
dtc = dt * 86.4;
tic;
[eqs, Awell, qwell, Pvv, Boa, Bwa] = ...
eqsOW_MB_gas_water_flow(state, state0, dtc, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules{k,1});
Jacob = Awell;
Ris = qwell;
Jacob(1 : r.nc,1 : 2 * r.nc) = Jacob(1 : r.nc,1 : 2 * r.nc) + [eqs{1}.jac{1} eqs{1}.jac{2}];
Jacob(r.nc + 1 : 2 * r.nc,1 : 2 * r.nc) = Jacob(r.nc + 1 : 2 * r.nc,1 : 2 * r.nc) + [eqs{2}.jac{1} eqs{2}.jac{2}];
Ris(1 : r.nc) = Ris(1 : r.nc) + eqs{1}.val ;
Ris(r.nc + 1: 2 * r.nc) = Ris(r.nc + 1: 2 * r.nc) + eqs{2}.val ;
%
Dimensionless_Ris = Ris(1: 2 * r.nc)./ [Pvv;Pvv] .* [Bwa;Boa] .* dtc;
cons_Jacob_lo=toc;
cons_Jacob=cons_Jacob+cons_Jacob_lo;
% PVall = sum(Pvv);
% MBw = Bwa*dtc*abs(sum(Ris(1:r.nc))/PVall);
% MBo = Boa*dtc*abs(sum(Ris(r.nc+1:2*r.nc))/PVall);
% CNVw = max(Bwa*dtc*abs(Ris(1:r.nc)./Pvv));
% CNVo = max(Boa*dtc*abs(Ris(r.nc+1:2*r.nc)./Pvv));
% [L,U] = ilu(-Jacob);
% tol = 1e-6;
% maxit = 50;
% [X, ~] = bicgstab(-Jacob,Ris,tol,maxit,L,U);
tic;
% tol = 1e-12;
% maxit = 200;
% [X0,fl0,rr0,it0,rv0] = gmres(-Jacob,Ris,[],tol,maxit);
% [L,U] = ilu(-Jacob,struct('type','ilutp','droptol',1e-6));
% [X1,fl1,rr1,it1,rv1] = gmres(-Jacob,Ris,[],tol,maxit,L,U);
X = -Jacob \ Ris;
leqs_time=toc;
leqs_solve_time=leqs_solve_time+leqs_time;
Newton_step=Newton_step+1;
dsw = X(r.nc + 1 : 2*r.nc);
dp = X(1 : r.nc);
state.p = state.p + dp;
state.sw = state.sw + dsw;
% deltp=state.p-state0.p;
% deltsw=state.sw-state0.sw;
if Weladd > 0
dpwf = X(2 * r.nc + 1 : end);
pwf = pwf + dpwf;
state.pwf = pwf;
end
% if MBw <= epsave && MBo <= epsave && CNVw <= epsmax && CNVo <=epsmax && max(dsw)<=0.02 && max(dp)<=1
% break
% end
% Ris无因次化
if mean(abs(Dimensionless_Ris)) <= epsave && max(abs(Dimensionless_Ris)) <=epsmax
break
end
% [L,U] = ilu(-Jacob);
% tol = 1e-6;
% maxit = 50;
% [X, ~] = bicgstab(-Jacob,Ris,tol,maxit,L,U);
% raodai=condest(Jacob);
% if condest(Jacob)>50000
% dt = dt / 2;
% else
end
if i == Nmax
repi = repi + 1;
if repi == 5
error('too many iter')
end
if repi == 1
dt = dt / 2;
elseif repi == 2
dt = dt / 3;
else
dt = dt / 10;
end
% dt = max(dt, w.dtmin);
state = state0;
else
repi = 0;
t = t + dt;
count = count + 1;
Times(count) = t;
OutputRs{count} = state;
Newtons_vs_time = [Newtons_vs_time; t, Newton_step];
% qwell=qwell/dtc;%
[Wellpara_t, WelChg, Weladd] = calcWellequation_gas_water_flow(Weladd, Wellc, WelChg, well_schedules{k,1}, r.nc, qwell, state);
Wellpara{count} = Wellpara_t;
state0 = state;
tm = ADtimestep(yitap, yitas, omega, dp, dsw);
% tm=1;
dt = dt * tm;
if t + dt > tend
dt = tend - t;
end
if dt >= dtmax(k)
dt = dtmax(k);
end
if i ~= Nmax
% waitbar(t / tend);
% disp(t);
fprintf('%.4f/%.4f\n', t, sum(time));
end
if t>300
flag = 1;
end
end
end
end
trun.cons_Jacob=cons_Jacob;
trun.leqs_solve_time=leqs_solve_time;
trun.total_simulation_time = etime(clock,t_start);
trun.Newton_step=Newton_step;
trun.Newtons_vs_time=Newtons_vs_time;
fprintf('');
% close(h0);
@@ -0,0 +1,3 @@
function h = mug_gw(p, MUG, Ppr)
h = interptable(Ppr, MUG, p);
end
@@ -0,0 +1,2 @@
function h = muw_gw(p, vwi, prw, cvw)
h = vwi + cvw * (p - prw);
@@ -0,0 +1,16 @@
function h = pc_gw(sw, SW, PCOW, varargin)
n = numel(varargin);
if PCOW == 0
h = 0;
else
if n == 0
h = interptable(SW, PCOW, sw);
else
SWF = varargin{1};
PCOWF = varargin{2};
rpt = varargin{3};
hm = interptable(SW, PCOW, sw);
hf = interptable(SWF, PCOWF, sw);
h = rpt .* hm + ~rpt .* hf;
end
end