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,149 @@
function [Awell, qwell] = WellEquation(r, f, p, sw, cs, cb, 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 = 4 * 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, cs, cb] = intADI(p, sw, cs, cb);
else
[p, sw, cs, cb, pwf] = intADI2(p, sw, cs, cb, pwf);
end
BW = f.Bw(p);
muW = f.muw(p);
Nc = f.Nc(cs);
krW = f.krw(sw, Nc);
BG = f.Bg(p);
muG = f.mug(p);
krG = f.krrg(sw, Nc);
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));
qcs = -Tr(j) .* cs(jperf).*Yw .*(pw(jperf) - pwf(ipwf));
qcb = -Tr(j) .* cb(jperf).*Yw .*(pw(jperf) - pwf(ipwf));
%nc行是水相方程
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(jperf) = qw.val;
%nc行是水相方程
Awell(r.nc + jperf, :) = [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4} qo.jac{5}];
qwell(r.nc + jperf) = qo.val;
%
Awell(2*r.nc + jperf, :) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4} qcs.jac{5}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, :) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4} qcb.jac{5}];
qwell(3*r.nc + jperf) = qcb.val;
%
% 使MR迭代收敛条件过高
Awell(4*r.nc + ipwf, :) = Awell(4*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}] + [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4} qo.jac{5}];
qwell(4*r.nc + ipwf) = qwell(4*r.nc + ipwf) + qw.val + qo.val;
end
qwell(4*r.nc + ipwf) = (qwell(4*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);
qcs = -Tr(j) .* cs(jperf).*Yw .*(pw(jperf) - pwfc);
qcb = -Tr(j) .* cb(jperf).*Yw .*(pw(jperf) - pwfc);
%
Awell(jperf, 1 : 4 * r.nc) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4}];
qwell(jperf) = qw.val;
%
Awell(r.nc + jperf, 1 : 4 * r.nc) = [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4}];
qwell(r.nc + jperf) = qo.val;
%
Awell(2*r.nc + jperf, 1 : 4 * r.nc) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, 1 : 4 * r.nc) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4}];
qwell(3*r.nc + jperf) = qcb.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));
qcs = qw*well_schedules_k{i,8};
qcb = qw*well_schedules_k{i,10};
%
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(jperf) = qw.val;
%
Awell(2*r.nc + jperf, :) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4} qcs.jac{5}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, :) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4} qcb.jac{5}];
qwell(3*r.nc + jperf) = qcb.val;
%
Awell(4*r.nc + ipwf, :) = Awell(4*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(4*r.nc + ipwf) = qwell(4*r.nc + ipwf) + qw.val;
end
qwell(4*r.nc + ipwf) = qwell(4*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);
qcs = qw*well_schedules_k{i,8};
qcb = qw*well_schedules_k{i,10};
Awell(jperf, 1 : 4*r.nc) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4}];
qwell(jperf) = qw.val;
%
Awell(2*r.nc + jperf, 1 : 4*r.nc) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, 1 : 4*r.nc) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4}];
qwell(3*r.nc + jperf) = qcb.val;
end
end
end
end
end
@@ -0,0 +1,58 @@
function Wellc0 = calcTrans(r, Wellc0)
% Wellcpara: welltype(1) nperf(2) index(3) rw/WI(4) protype(5) value(6)
% constraints(7) skin(8) Wellc(nWel, 6)
% welltype = 1 prod, welltype = 2 inj water, welltype = 3 inj gas
% protype = 1 const flowrate, protype = 2 const pwf
%
nwel = size(Wellc0, 1);%
for i = 1 : nwel
perf = Wellc0{i, 3};%
rw = Wellc0{i, 4};%
skin = Wellc0{i, 5};%
nperf = length(perf);%
WI = zeros(nperf,1);%
for j = 1 : nperf
ind = perf(j);
if ind <= r.nmc %
kmx = r.kx(ind);
kmy = r.ky(ind);
kmz = r.kz(ind);
dx = r.dxv(ind);
dy = r.dyv(ind);
dz = r.dzv(ind);
if Wellc0{i,6}==1%
% h = r.h;
ro = 0.28* (((kmy/kmx)^0.5*dx^2 + (kmx/kmy)^0.5*dy^2))^0.5...
/ ((kmy/kmx)^0.25 + (kmx/kmy)^0.25);%peaceman公式中的等效供给半径
ka = (kmx*kmy*kmz)^(1/3);%
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dz / (log(ro / rw) + skin);%
elseif Wellc0{i,6}==2%沿x方向的水平井
ro = 0.28* (((kmz/kmy)^0.5*dy^2 + (kmy/kmz)^0.5*dz^2))^0.5...
/ ((kmz/kmy)^0.25 + (kmy/kmz)^0.25);%peaceman公式中的等效供给半径
ka = (kmx*kmy*kmz)^(1/3);%
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dx / (log(ro / rw) + skin);%
elseif Wellc0{i,6}==3%沿y方向的水平井
ro = 0.28* (((kmz/kmx)^0.5*dx^2 + (kmx/kmz)^0.5*dz^2))^0.5...
/ ((kmz/kmx)^0.25 + (kmx/kmz)^0.25);
ka = (kmx*kmy*kmz)^(1/3);
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dy / (log(ro / rw) + skin);%
end
else % ,
I = ind - r.nmc;%
kf = r.kf(I);
wf = r.wf(I);
area=r.fcff{1,8}(I);
% lf = r.lf(I);
% h = r.h;
% h=1;lf=2;
%0.14
ro = 0.14 * (2*area)^0.5;
% ro = 0.14 * (10^2+10^2)^0.5;
WI(j) = r.cf * 2 * 3.1415 * kf * wf / (log(ro / rw) + skin);
end
end
Wellc0{i, 4} = WI;%
end
@@ -0,0 +1,100 @@
function [Wellpara, WelChg, Weladd] = calcWellequation(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')
qot = 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);
qot = qot + 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}.qo = abs(qot)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.qo = 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);
qot = qot + qwell(nc + jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*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);
qot = qot + 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}.qo = abs(qot)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.qo = 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
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);
qot = qot + qwell(nc + jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*86.4;
end
end
end
end
@@ -0,0 +1,32 @@
function perfnum = findWelloc(r, welloc)
% Linep = r.Linep;
% Fracp = r.Fracp;
corevsfra=r.fcff{1,4};%
% corevsfra = r.cell_mid_coordinates;
nfc = size(corevsfra,1);
% x = zeros(nfc, 1);
% y = zeros(nfc, 1);
% z = zeros(nfc, 1);
% for i = 1 : nf
% x = Linep(Fracp(i,:), 1);
% y = Linep(Fracp(i,:), 2);
% %
% xp(i) = mean(x);
% yp(i) = mean(y);
% end
x = corevsfra(:, 1);
y = corevsfra(:, 2);
z = corevsfra(:, 3);
% z = 5;
Nperf = size(welloc, 1);
perfnum = zeros(1, Nperf);
for i = 1 : Nperf
xw = welloc(i, 1);
yw = welloc(i, 2);
zw = welloc(i,3);
rp = (xw - x).^2 + (yw - y).^2+(zw-z).^2;
[~,I] = min(rp);
perfnum(i) = I + r.nmc;
% perfnum(i) = I;
end
@@ -0,0 +1,51 @@
function [Weladd, pwf] = initalSchedule(p, sw, Wellc, f)
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 Wellc{i,1} == 1 && Wellc{i,5} == 1%
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));%
Tnp = Tnp + Trans(j)*p(jperf(j));
Tn = Tn + Trans(j);
end
pwf(Weladd) = (Tnp - Wellc{i,6}/86.4) / Tn;%
elseif Wellc{i,1} == 2 && Wellc{i,5} == 1%
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 + Wellc{i,6}/86.4) / Tn;%
else
continue
end
end
pwf = pwf';
@@ -0,0 +1,8 @@
function welloc = wellperf(well, fracp)
n = size(fracp,1)/2;
welloc = zeros(n, 2);
for i = 1 : n
[xi,yi] = polyxpoly([fracp(2*i-1,1) fracp(2*i,1)],[fracp(2*i-1,2) fracp(2*i,2)],[well(1,1) well(2,1)],[well(1,2) well(2,2)]);
welloc(i,1) = xi;
welloc(i,2) = yi;
end