init
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user