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,17 @@
function BF = Bpara(xb, yb)
n = length(xb);
BF = zeros(n, 7);
BF(:,3) = xb;
BF(:,4) = yb;
for i = 1 : n
if i == n
ip = 1;
else
ip = i + 1;
end
BF(i,1) = (xb(i) + xb(ip)) / 2;
BF(i,2) = (yb(i) + yb(ip)) / 2;
BF(i,5) = ((xb(i) - xb(ip))^2 + (yb(i) - yb(ip))^2)^0.5;
BF(i,6) = (yb(ip) - yb(i)) / BF(i,5);
BF(i,7) = (xb(i) - xb(ip)) / BF(i,5);
end
@@ -0,0 +1,14 @@
function FF = Fpara(xf, yf)
nf = length(xf)/2;
FF = zeros(nf, 7);
for i = 1 : nf
i1 = 2 * i - 1;
i2 = 2 * i;
FF(i,3) = xf(i1);
FF(i,4) = yf(i1);
FF(i,1) = (xf(i1) + xf(i2)) / 2;
FF(i,2) = (yf(i1) + yf(i2)) / 2;
FF(i,5) = ((xf(i1) - xf(i2))^2 + (yf(i1) - yf(i2))^2)^0.5;
FF(i,6) = (yf(i2) - yf(i1)) / FF(i,5);
FF(i,7) = (xf(i1) - xf(i2)) / FF(i,5);
end
@@ -0,0 +1,4 @@
function [x1, y1, ka] = anios(kx, ky, x, y)
ka = (kx*ky)^0.5;
x1 = x*(ka/kx)^0.5;
y1 = y*(ka/ky)^0.5;
@@ -0,0 +1,8 @@
function dG = finddg(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
dG = (lk / (2 * pi)) * quadgk(@(t)intdg(xs, ys, xk, yk, nkx, nky, lk, t), 0, 1);
% intg.m
function y = intdg(xs, ys, xk, yk, nkx, nky, lk, t)
y = (nkx*(xk - xs) + nky*(yk - ys))...
./((xk - t*lk*nky - xs).^2 + (yk + t*lk*nkx - ys).^2);
@@ -0,0 +1,15 @@
function dG = finddgAn(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
A = lk^2;
B = (-nky * (xk - xs) + nkx * (yk - ys)) * (2 * lk);
E = (xk - xs)^2 + (yk - ys)^2;
eps = 1e-9;
De = 4 * A * E - B^2;
if De <= eps
dG = 0;
else
dG = lk/pi * (nkx*(xk - xs)+nky*(yk - ys))/De^0.5 * ...
(atan((2*A+B)/De^0.5) - atan(B/De^0.5));
end
@@ -0,0 +1,7 @@
function G = findg(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
G = (1 / (4 * pi)) * quadgk(@(t)intg(xs, ys, xk, yk, nkx, nky, lk, t), 0, 1);
% intg.m
function y = intg(xs, ys, xk, yk, nkx, nky, lk, t)
y = log((xk - t*lk*nky - xs).^2 + (yk + t*lk*nkx - ys).^2);
@@ -0,0 +1,16 @@
function G = findgAn(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
A = lk^2;
B = (-nky * (xk - xs) + nkx * (yk - ys)) * (2 * lk);
E = (xk - xs)^2 + (yk - ys)^2;
eps = 1e-9;
De = 4 * A * E - B^2;
if De <= eps
G = lk/2/pi * (log(lk/2) - 1);
else
G = 1/4/pi * (2*(log(lk) - 1) - B/2/A*log(abs(E/A))...
+ (1 + B/2/A)*log(abs(1 + B/A + E/A)) + De^0.5/A...
*(atan((2*A + B)/De^0.5) - atan(B/De^0.5)));
end
@@ -0,0 +1,35 @@
function [qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, po, pw)
%po,pw均是定义的类数据
Ka = r.Ka;
M = r.M;
F2M = r.F2M;
MF_coef = r.MF_coef;
nfc = r.nfc;%
nc = r.nc; %
C = sparse((1 : nfc)' * [1 1], M, ones(nfc, 1) * [-1 1], nfc, nc);
grad = @(x) C * x;
faceUpstr = @(flag, x) faceUpstrb(flag, x, M, [nfc, nc]);
dpO = grad(po);
upc = (double(dpO)<=0);
mobO = faceUpstr(upc, krO./(BO.*muO));
% qomf = Ka .* r.h .* mobO .* (MF_coef * po);%
qomf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobO .* (MF_coef * po);%
% qomf = r.V(r.nmc+1:r.nc).*Ka .* mobO .* (MF_coef * po);
% qomf = Ka .* mobO .* (MF_coef * po);
qofm = -F2M * qomf;%
dpW = grad(pw);
upc = (double(dpW)<=0);
mobW = faceUpstr(upc, krW./(BW.*muW));
% qwmf = Ka .* r.h .* mobW .* (MF_coef * pw);
qwmf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobW .* (MF_coef * pw);
% qwmf = r.V(r.nmc+1:r.nc).*Ka .* mobW .* (MF_coef * pw);
% qwmf = Ka .* mobW .* (MF_coef * pw);
qwfm = -F2M * qwmf;
function xu = faceUpstrb(flag, x, N, sz)
flag = logical(flag);
upcell = N(:, 2);
upcell(flag) = N(flag, 1);
xu = sparse((1 : sz(1))', upcell, 1, sz(1), sz(2)) * x;
@@ -0,0 +1,115 @@
function [Ka, M, F2M , MF_coef,MF_deltt] = transFunc_aniso(nc,coordinates, nodes, connectmf,Ap,Apf , matrixvsfra,N,T , kx, ky,kz)
%[Ka, M, F2M , MF_coef,MF_deltt] = transFunc_aniso(nc,coordinates, nodes, connectmf,Ap,Apf ,Apmt,Apft, matrixvsfra,N,T , kx, ky,kz)
Ncell = size(connectmf, 1);%
nmc=size(matrixvsfra,1);
nfc=nc-nmc;
I = zeros(1, 1);
J = zeros(1, 1);
M = zeros(1, 2);
Ka = zeros(1, 1);
cou = 0;
for i = 1 : Ncell
ie = connectmf{i,1};%
% indxf = ConnecS{i, 3};%/
% order = reshape(ConnecS{i,2}',[],1);%
% xb = coordinates(nodes(ie,:),1);%x坐标
% yb = coordinates(nodes(ie,:),2);%y坐标
% xf = Linep(order,1);%x坐标
% yf = Linep(order,2);%y坐标
%
%
% [xb1, yb1, ka] = anios(kx(ie), ky(ie), xb, yb);
% [xf1, yf1, ~] = anios(kx(ie), ky(ie), xf, yf);
% BF = Bpara(xb1, yb1);
% FF = Fpara(xf1, yf1);
% [Ap, Apf] = transMF(BF, FF);
indxf=connectmf{i,2};
Api=Ap{i,1}; Apfi=Apf{i,1};
nlf = length(indxf);%
ind = ie;%
indf = indxf + nmc;%nc中的序号
m1 = repmat(ind, nlf, 1);
f1 = repmat(indf, nlf, 1);
Il = zeros(nlf, 1+nlf);
Jl = [m1 f1];
Vl = [Api Apfi];
for j = 1 : nlf
cou = cou + 1;
Il(j,:) = indxf(j);
I(cou) = ie;
J(cou) = indxf(j);%nfc中的序号
ka=(kx(ie)*ky(ie)*kz(ie))^(1/3);
Ka(cou) = ka;
M(cou, 1) = connectmf{i,1};
M(cou, 2) = indf(j);
end
Il = reshape(Il, [], 1);
Jl = reshape(Jl, [], 1);
Vl = reshape(Vl, [], 1);
if i == 1
I2 = Il;
J2 = Jl;
V2 = Vl;
else
I2 = [I2; Il];
J2 = [J2; Jl];
V2 = [V2; Vl];
end
end
V = ones(cou, 1);
F2M = sparse(I, J, V, nmc, nfc);
MF_coef = sparse(I2, J2, V2, nfc, nc);
% for i = 1 : Ncell
% ie = connectmf{i,1};%
% indxf = ConnecS{i, 3};%/
% order = reshape(ConnecS{i,2}',[],1);%
% xb = coordinates(nodes(ie,:),1);%x坐标
% yb = coordinates(nodes(ie,:),2);%y坐标
% xf = Linep(order,1);%x坐标
% yf = Linep(order,2);%y坐标
%
%
% [xb1, yb1, ka] = anios(kx(ie), ky(ie), xb, yb);
% [xf1, yf1, ~] = anios(kx(ie), ky(ie), xf, yf);
% BF = Bpara(xb1, yb1);
% FF = Fpara(xf1, yf1);
% [Ap, Apf] = transMF(BF, FF);
% indxf=connectmf{i,2};
% Apmti=Apmt{i,1}; Apfti=Apft{i,1};
% nlf = length(indxf);%
% ind = ie;%
% indf = indxf + nmc;%nc中的序号
% m1 = repmat(ind, nlf, 1);
% f1 = repmat(indf, nlf, 1);
% Il = zeros(nlf, 1+nlf);
% Jl = [m1 f1];
% Vl = [Apmti Apfti];
% for j = 1 : nlf
% cou = cou + 1;
% Il(j,:) = indxf(j);
% % I(cou) = ie;
% % J(cou) = indxf(j);%nfc中的序号
% % ka=(kx(ie)*ky(ie)*kz(ie))^(1/3);
% % Ka(cou) = ka;
% % M(cou, 1) = connectmf{i,1};
% % M(cou, 2) = indf(j);
% end
% Il = reshape(Il, [], 1);
% Jl = reshape(Jl, [], 1);
% Vl = reshape(Vl, [], 1);
% if i == 1
% I2 = Il;
% J2 = Jl;
% V2 = Vl;
% else
% I2 = [I2; Il];
% J2 = [J2; Jl];
% V2 = [V2; Vl];
% end
% end
% % V = ones(cou, 1);
% % F2M = sparse(I, J, V, nmc, nfc);
% MF_deltt = sparse(I2, J2, V2, nfc, nc);
% end
@@ -0,0 +1,29 @@
function [qomf, qofm] = transFuncdeltt(r, BO, muO, po,dt,pi)
%po,pw均是定义的类数据
Ka = r.Ka;
M = r.M;
F2M = r.F2M;
MF_coef = r.MF_coef;
nfc = r.nfc;%
nc = r.nc; %
C = sparse((1 : nfc)' * [1 1], M, ones(nfc, 1) * [-1 1], nfc, nc);
grad = @(x) C * x;
faceUpstr = @(flag, x) faceUpstrb(flag, x, M, [nfc, nc]);
dpO = grad(po);
upc = (double(dpO)<=0);
mobO = faceUpstr(upc, 1./(BO.*muO));
% qomf = Ka .* r.h .* mobO .* (MF_coef * po);%
qomf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobO .* (MF_coef * po)+1/dt*(r.cpor+0.1*r.co)*r.wf.*(r.MF_deltt*(po-pi));%
% qomf = r.V(r.nmc+1:r.nc)./r.wf.*(Ka' .* mobO .* (MF_coef * po));
% qomf = r.V(r.nmc+1:r.nc).*Ka .* mobO .* (MF_coef * po);
% qomf = Ka' .* mobO .* (MF_coef * po);
qofm = -F2M * qomf;%
function xu = faceUpstrb(flag, x, N, sz)
flag = logical(flag);
upcell = N(:, 2);
upcell(flag) = N(flag, 1);
xu = sparse((1 : sz(1))', upcell, 1, sz(1), sz(2)) * x;
@@ -0,0 +1,61 @@
function [Ap, Apf] = transMF(BF, FF)
[nb,~] = size(BF);
[nf,~] = size(FF);
Gb = zeros(nb);
dGb = zeros(nb);
Gmf = zeros(nb, nf);
Gf = zeros(nf, nb);
dGf = zeros(nf, nb);
Gff = zeros(nf);
xb = BF(:,1);
yb = BF(:,2);
xmk = BF(:,3);
ymk = BF(:,4);
lmk = BF(:,5);
nxmk = BF(:,6);
nymk = BF(:,7);
xf = FF(:,1);
yf = FF(:,2);
xfk = FF(:,3);
yfk = FF(:,4);
lfk = FF(:,5);
nxfk = FF(:,6);
nyfk = FF(:,7);
% boundary equation
for i = 1 : nb
for j = 1 : nb
if j == i
dGb(i, j) = 0.0;
Gb(i, j) = 1/(2*pi) * (log(lmk(j)/2) - 1.0);
else
Gb(i, j) = findg(xb(i), yb(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
dGb(i, j) = finddg(xb(i), yb(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
end
end
for j = 1 : nf
Gmf(i, j) = findg(xb(i), yb(i), xfk(j), yfk(j), nxfk(j), nyfk(j), lfk(j));
end
end
dGb = dGb - 0.5 * eye(nb);
% fracture equation
for i = 1 : nf
for j = 1 : nb
Gf(i, j) = findg(xf(i), yf(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
dGf(i, j) = finddg(xf(i), yf(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
end
for j = 1 : nf
if i == j
Gff(i, j) = 1/(2*pi) * (log(lfk(j)/2) - 1.0);
else
Gff(i, j) = findg(xf(i), yf(i), xfk(j), yfk(j), nxfk(j), nyfk(j), lfk(j));
end
end
end
Gbv = Gb^(-1);
Ap0 = dGf - Gf * Gbv * dGb;
Apf0 = Gf * Gbv * Gmf - Gff;
Apfv = Apf0^(-1);
Ap = Apfv * Ap0;
Ap = Ap * ones(nb,1);
Apf = -Apfv;