init
This commit is contained in:
@@ -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%若为0,则毛管力为0
|
||||
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
|
||||
Reference in New Issue
Block a user