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;
|
||||
|
||||
@@ -0,0 +1,324 @@
|
||||
classdef ADI
|
||||
% ADI class: simple implementation of automatic differentiation for easy construction of jacobian matrices.
|
||||
%
|
||||
% SYNOPSIS:
|
||||
% x = ADI(value, jacobian)
|
||||
%
|
||||
% PARAMETERS:
|
||||
% value - The numerical value of the object
|
||||
%
|
||||
% jacobian - The Jacobian of the object.
|
||||
%
|
||||
% RETURNS:
|
||||
% ADI object.
|
||||
%
|
||||
% COMMENTS:
|
||||
% This class is typically instansiated for a set of different variables
|
||||
% using initVariablesADI. The file contains a worked example demonstrating
|
||||
% the usage for several variables.
|
||||
%
|
||||
% SEE ALSO:
|
||||
% initVariablesADI
|
||||
|
||||
%{
|
||||
Copyright 2009-2014 SINTEF ICT, Applied Mathematics.
|
||||
|
||||
This file is part of The MATLAB Reservoir Simulation Toolbox (MRST).
|
||||
|
||||
MRST is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
MRST is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with MRST. If not, see <http://www.gnu.org/licenses/>.
|
||||
%}
|
||||
|
||||
|
||||
properties
|
||||
val %function value
|
||||
jac %list of sparse jacobian matrices
|
||||
end
|
||||
|
||||
methods
|
||||
function obj = ADI(a,b)
|
||||
%ADI class constructor
|
||||
if nargin == 0 % empty constructor
|
||||
obj.val = [];
|
||||
obj.jac = {};
|
||||
elseif nargin == 1 %
|
||||
if isa(a, 'ADI')
|
||||
obj = a;
|
||||
else
|
||||
error('Contructor requires 2 inputs')
|
||||
end
|
||||
elseif nargin == 2 % values + jacobians
|
||||
obj.val = a; % value
|
||||
if ~iscell(b)
|
||||
b = {b};
|
||||
end
|
||||
obj.jac = b; % jacobian or list of jacobians
|
||||
else
|
||||
error('Input to constructor not valid')
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
function h = numval(u)
|
||||
h = numel(u.val);
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
function h = double(u)
|
||||
h = u.val;
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = ge(u, v)
|
||||
h = ge(double(u), double(v));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = gt(u, v)
|
||||
h = gt(double(u), double(v));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = le(u, v)
|
||||
h = le(double(u), double(v));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = lt(u, v)
|
||||
h = lt(double(u), double(v));
|
||||
end
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = uplus(u)
|
||||
h = u;
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = uminus(u)
|
||||
h = ADI(-u.val, uminusJac(u.jac));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
% function h = plus(u,v)
|
||||
% if ~isa(u,'ADI') %u is a vector/scalar
|
||||
% h = ADI(u+v.val, v.jac);
|
||||
% elseif ~isa(v,'ADI') %v is a vector/scalar
|
||||
% h = ADI(u.val + v, u.jac);
|
||||
% else
|
||||
% h = ADI(u.val+v.val, plusJac(u.jac, v.jac) );
|
||||
% end
|
||||
% end
|
||||
|
||||
function h = plus(u,v)
|
||||
if ~isa(u,'ADI') %u is a vector/scalar
|
||||
if numel(u) <= numel(v.val)
|
||||
h = ADI(u+v.val, v.jac);
|
||||
elseif numel(v.val) == 1
|
||||
h = plus(u, repmat(v,[numel(u), 1]));
|
||||
else
|
||||
error('Vectors have different lengths')
|
||||
end
|
||||
elseif ~isa(v,'ADI') %v is a vector/scalar
|
||||
if numel(v) <= numel(u.val)
|
||||
h = ADI(u.val + v, u.jac);
|
||||
elseif numel(u.val) == 1
|
||||
h = plus(repmat(u,[numel(v), 1]), v);
|
||||
else
|
||||
error('Vectors have different lengths')
|
||||
end
|
||||
else
|
||||
if numel(u.val) == numel(v.val)
|
||||
h = ADI(u.val+v.val, plusJac(u.jac, v.jac) );
|
||||
elseif numel(u.val) == 1
|
||||
h = plus(repmat(u, [numel(v.val), 1]), v);
|
||||
elseif numel(v.val) == 1
|
||||
h = plus(u, repmat(v, [numel(u.val), 1]));
|
||||
else
|
||||
error('Vectors have different lengths')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = minus(u,v)
|
||||
h = plus(u, uminus(v));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = mtimes(u,v)% '*'
|
||||
if ~isa(u,'ADI') %u is a scalar/matrix
|
||||
h = ADI(u*v.val, mtimesJac(u, v.jac));
|
||||
elseif ~isa(v,'ADI') %v is a scalar
|
||||
h = mtimes(v,u);
|
||||
else % special case where either u or v has single value
|
||||
if numel(u.val) == 1
|
||||
h = times(repmat(u, [numel(v.val), 1]), v);
|
||||
elseif numel(v.val) == 1
|
||||
h = times(u, repmat(v, [numel(u.val), 1]));
|
||||
else
|
||||
error('Operation not supported');
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = times(u,v)% '.*'
|
||||
if ~isa(u,'ADI') %u is a scalar/vector
|
||||
if numel(u)==numel(v.val)
|
||||
h = ADI(u.*v.val, lMultDiag(u, v.jac));
|
||||
else
|
||||
h = mtimes(u,v);
|
||||
end
|
||||
elseif ~isa(v,'ADI') %v is a scalar/vector
|
||||
h = times(v,u);
|
||||
else
|
||||
if numel(u.val)==numel(v.val)
|
||||
h = ADI(u.val.*v.val, timesJac(u.val, v.val, u.jac, v.jac));
|
||||
elseif numel(v.val)==1||numel(u.val)==1
|
||||
h = mtimes(u,v);
|
||||
else
|
||||
error('Operation not supported');
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = mrdivide(u,v)% '/'
|
||||
if ~isa(v,'ADI') %v is a scalar
|
||||
h = mtimes(u, 1/v);
|
||||
else
|
||||
error('Operation not supported');
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = subsref(u,s)
|
||||
switch s(1).type
|
||||
case '.'
|
||||
h = builtin('subsref',u,s);
|
||||
case '()'
|
||||
assert(numel(s(1).subs) == 1, ...
|
||||
'Expected single index, got %d', numel(s(1).subs))
|
||||
subs = s(1).subs{1};
|
||||
if ischar(s) && strcmp(subs, ':'),
|
||||
h = u;
|
||||
else
|
||||
if islogical(subs), subs = find(subs); end
|
||||
h = ADI(u.val(subs), subsrefJac(u.jac, subs));
|
||||
end
|
||||
if numel(s) > 1
|
||||
% Recursively handle next operation
|
||||
h = subsref(h, s(2:end));
|
||||
end
|
||||
case '{}'
|
||||
error('Operation not supported');
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = power(u,v)% '.^'
|
||||
h = ADI(u.val.^v, lMultDiag(v.*u.val.^(v-1), u.jac));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = rdivide(u,v)% './'
|
||||
h = times(u, power(v, -1));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = exp(u)
|
||||
eu = exp(u.val);
|
||||
h = ADI(eu, lMultDiag(eu, u.jac));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = log(u)
|
||||
logu = log(u.val);
|
||||
h = ADI(logu, lMultDiag(1./u.val, u.jac));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
|
||||
function h = interptable(X, Y, u)
|
||||
y = interptable(X, Y, u.val);
|
||||
dydx = dinterptable(X, Y, u.val);
|
||||
h = ADI(y,lMultDiag(dydx, u.jac));
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------
|
||||
end
|
||||
end
|
||||
|
||||
%**************************************************************************
|
||||
%-------- Helper functions involving Jacobians ---------------------------
|
||||
%**************************************************************************
|
||||
function J = uminusJac(J1)
|
||||
J = cellfun(@uminus, J1, 'UniformOutput', false);
|
||||
end
|
||||
|
||||
function J = plusJac(J1, J2)
|
||||
J = cellfun(@plus, J1, J2, 'UniformOutput', false);
|
||||
end
|
||||
|
||||
function J = mtimesJac(M, J1)
|
||||
J = cell(1, numel(J1));
|
||||
for k = 1:numel(J)
|
||||
J{k} = M*J1{k};
|
||||
end
|
||||
end
|
||||
|
||||
function J = lMultDiag(d, J1)
|
||||
n = numel(d);
|
||||
D = sparse((1:n)', (1:n)', d, n, n);
|
||||
J = cell(1, numel(J1));
|
||||
for k = 1:numel(J)
|
||||
J{k} = D*J1{k};
|
||||
end
|
||||
end
|
||||
|
||||
function J = timesJac(v1, v2, J1, J2)
|
||||
n = numel(v1);
|
||||
D1 = sparse((1:n)', (1:n)', v1, n, n);
|
||||
D2 = sparse((1:n)', (1:n)', v2, n, n);
|
||||
J = cell(1, numel(J1));
|
||||
for k = 1:numel(J)
|
||||
J{k} = D1*J2{k} + D2*J1{k};
|
||||
end
|
||||
end
|
||||
|
||||
function J = subsrefJac(J1, subs)
|
||||
J = cell(1, numel(J1));
|
||||
for k = 1:numel(J)
|
||||
J{k} = J1{k}(subs,:);
|
||||
end
|
||||
end
|
||||
|
||||
%--------------------------------------------------------------------------
|
||||
%--------------------------------------------------------------------------
|
||||
%--------------------------------------------------------------------------
|
||||
@@ -0,0 +1,6 @@
|
||||
function tm = ADtimestep(yitap, yitas, omega, dp, ds)
|
||||
dp = abs(dp);
|
||||
ds = abs(ds);
|
||||
tm1 = (1 + omega) * yitap ./ (dp + omega * yitap);
|
||||
tm2 = (1 + omega) * yitas ./ (ds + omega * yitas);
|
||||
tm = min(min(tm1),min(tm2));
|
||||
@@ -0,0 +1,24 @@
|
||||
function os = OperatorRS(N, nex, nc)
|
||||
%向量化编程体现
|
||||
%nex是网格之间具有流体交换的总数
|
||||
%nc 是网格总数
|
||||
%N 矩阵每一行对应着有着流体交换的基质单元之间、裂缝单元之间
|
||||
% Avg of face property
|
||||
M = sparse((1 : nex)' * [1 1], N, 0.5 * ones(nex, 2), nex, nc);
|
||||
os.faceAvg = @(x) M * x;
|
||||
% Harm of face property
|
||||
M = sparse((1 : nex)' * [1 1], N, ones(nex, 2), nex, nc);
|
||||
os.faceHarm = @(x) 1./ (M * (1 ./ x));
|
||||
% Div and grad
|
||||
C = sparse((1 : nex)' * [1 1], N, ones(nex, 1) * [-1 1], nex, nc);
|
||||
os.grad = @(x) C * x;
|
||||
os.div = @(x) -C' * x;
|
||||
% Upstream weighting
|
||||
os.faceUpstr = @(flag, x) faceUpstr(flag, x, N, [nex, nc]);
|
||||
|
||||
function xu = faceUpstr(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,13 @@
|
||||
function h = dinterptable(X, Y, u)
|
||||
% n = length(X);
|
||||
% DYDX = diff(Y) ./ diff(X);
|
||||
% DYDX = DYDX([1, 1:end, end]);
|
||||
% [~, b] = histc(u, [-inf;X;inf]);
|
||||
% b = b - 1;
|
||||
% b(b == 0) = 1;
|
||||
% b(b == n) = n - 1;
|
||||
% h = DYDX(b);
|
||||
DYDX = diff(Y) ./ diff(X);
|
||||
DYDX = DYDX([1, 1:end, end]);
|
||||
[~, b] = histc(u, [-inf;X;inf]);
|
||||
h = reshape(DYDX(b), [], 1);
|
||||
@@ -0,0 +1,17 @@
|
||||
function f = fluidPVT(Bopb, pb, co, Bwi, prw, cw, vwi, cvw, visopb, cvo, SW, KRO, KRW, PCOW, ifpcow, SWF, KROF, KRWF, PCOWF, rpt,Dosi, Dwsi, cs_data, csa_data, cb_data, cba_data)
|
||||
f.Bw = @(p) Bw(p, Bwi, prw, cw);
|
||||
f.Bo = @(p) Bo(p, Bopb, pb, co);
|
||||
f.muw = @(p) muw(p, vwi, prw, cvw);
|
||||
f.muo = @(p) muo(p, visopb, pb, cvo);
|
||||
f.kro = @(sw) kro(sw, SW, KRO, SWF, KROF, rpt);
|
||||
f.krw = @(sw) krw(sw, SW, KRW, SWF, KRWF, rpt);
|
||||
f.pcow = @(sw) pcow(sw, SW, PCOW, SWF, PCOWF, rpt);
|
||||
f.krow = @(sw) kro(sw, SWF, KROF);
|
||||
f.krww = @(sw) krw(sw, SWF, KRWF);
|
||||
f.pcoww = @(sw) pcow(sw, SWF, PCOWF);
|
||||
f.cs_absorb = @(sw) cs_absorb_f(cs, cs_data, csa_data);
|
||||
f.cb_absorb = @(sw) cb_absorb_f(cb, cb_data, cba_data);
|
||||
f.ifpcow = ifpcow;
|
||||
f.Dosi = Dosi;
|
||||
f.Dwsi = Dwsi;
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
function state = initialRS(P, Sw, Cs, Cb)
|
||||
state.p = P;
|
||||
state.sw = Sw;
|
||||
state.cs = Cs;
|
||||
state.cb = Cb;
|
||||
@@ -0,0 +1,31 @@
|
||||
function [P, Sw, Cs, Cb] = intADI(p, sw, cs, cb)
|
||||
n = length(p);
|
||||
Jp = cell(1,4);
|
||||
Jsw = cell(1,4);
|
||||
Jcs = cell(1,4);
|
||||
Jcb = cell(1,4);
|
||||
|
||||
Jp{1} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jp{2} = sparse(n,n);
|
||||
Jp{3} = sparse(n,n);
|
||||
Jp{4} = sparse(n,n);
|
||||
|
||||
Jsw{1} = sparse(n,n);
|
||||
Jsw{2} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jsw{3} = sparse(n,n);
|
||||
Jsw{4} = sparse(n,n);
|
||||
|
||||
Jcs{1} = sparse(n,n);
|
||||
Jcs{2} = sparse(n,n);
|
||||
Jcs{3} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jcs{4} = sparse(n,n);
|
||||
|
||||
Jcb{1} = sparse(n,n);
|
||||
Jcb{2} = sparse(n,n);
|
||||
Jcb{3} = sparse(n,n);
|
||||
Jcb{4} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
|
||||
P = ADI(p, Jp);
|
||||
Sw = ADI(sw, Jsw);
|
||||
Cs = ADI(cs, Jcs);
|
||||
Cb = ADI(cb, Jcb);
|
||||
@@ -0,0 +1,44 @@
|
||||
function [P, Sw, Cs, Cb, Pwf] = intADI2(p, sw, cs, cb, pwf)
|
||||
n = length(p);
|
||||
npwf = length(pwf);
|
||||
Jp = cell(1,5);
|
||||
Jsw = cell(1,5);
|
||||
Jcs = cell(1,5);
|
||||
Jcb = cell(1,5);
|
||||
Jpwf = cell(1,5);
|
||||
|
||||
Jp{1} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jp{2} = sparse(n,n);
|
||||
Jp{3} = sparse(n,n);
|
||||
Jp{4} = sparse(n,n);
|
||||
Jp{5} = sparse(n,npwf);
|
||||
|
||||
Jsw{1} = sparse(n,n);
|
||||
Jsw{2} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jsw{3} = sparse(n,n);
|
||||
Jsw{4} = sparse(n,n);
|
||||
Jsw{5} = sparse(n,npwf);
|
||||
|
||||
Jcs{1} = sparse(n,n);
|
||||
Jcs{2} = sparse(n,n);
|
||||
Jcs{3} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jcs{4} = sparse(n,n);
|
||||
Jcs{5} = sparse(n,npwf);
|
||||
|
||||
Jcb{1} = sparse(n,n);
|
||||
Jcb{2} = sparse(n,n);
|
||||
Jcb{3} = sparse(n,n);
|
||||
Jcb{4} = sparse(1:n, 1:n, ones(n,1), n, n);
|
||||
Jcb{5} = sparse(n,npwf);
|
||||
|
||||
Jpwf{1} = sparse(npwf,n);
|
||||
Jpwf{2} = sparse(npwf,n);
|
||||
Jpwf{3} = sparse(npwf,n);
|
||||
Jpwf{4} = sparse(npwf,n);
|
||||
Jpwf{5} = sparse(1:npwf, 1:npwf, ones(npwf,1), npwf, npwf);
|
||||
|
||||
P = ADI(p, Jp);
|
||||
Sw = ADI(sw, Jsw);
|
||||
Cs = ADI(cs, Jcs);
|
||||
Cb = ADI(cb, Jcb);
|
||||
Pwf = ADI(pwf, Jpwf);
|
||||
@@ -0,0 +1,6 @@
|
||||
function [z] = intADIz(z)
|
||||
n = length(z);
|
||||
Jz = cell(1,2);
|
||||
Jz{1} = sparse( n, n);%对压力
|
||||
Jz{2} = sparse(n,n);%对饱和度
|
||||
z = ADI(z, Jz);
|
||||
@@ -0,0 +1,2 @@
|
||||
function h = interptable(X, Y, u)
|
||||
h = interp1(X, Y, u, 'linear', 'extrap');
|
||||
@@ -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
|
||||
@@ -0,0 +1,96 @@
|
||||
function [eqs, qomf, qofm, qwmf, qwfm, Awell, qwell] = eqsOW_MB(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
[p, sw] = intADI(p, sw);
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw);
|
||||
pcOW = 0;
|
||||
if f.ifpcow
|
||||
pcOW = f.pcow(sw);
|
||||
end
|
||||
pw = p - pcOW;
|
||||
dpW = os.grad(pw);
|
||||
dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
upc = (double(dpW+dzw)<=0);
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW = -r.T .* mobW .* dpW;
|
||||
|
||||
% Oil Props
|
||||
BO = f.Bo(p);
|
||||
muO = f.muo(p);
|
||||
krO = f.kro(sw);
|
||||
dpO = os.grad(p);
|
||||
dzo=1e-6*9.8*f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
upc = (double(dpO+dzo)<=0);
|
||||
mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO));
|
||||
bOvO = -r.T .* mobO .* dpO;
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
dzo=1e-6*9.8*f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
% 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);
|
||||
qomf=qomf*dt;
|
||||
qofm=qofm*dt;
|
||||
qwmf=qwmf*dt;
|
||||
qwfm=qwfm*dt;
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, Wellc, Weladd, pwf, WelChg);
|
||||
Awell=Awell*dt;
|
||||
qwell=qwell*dt;
|
||||
% 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_o = 1/dt .* (PV .* ((1 - sw) ./ BO) - PV0 .* ((1 - sw0) ./ f.Bo(p0)));
|
||||
|
||||
% Water Equation
|
||||
eqs{1} = (-os.div(bWvW) - Ar_w)*dt;
|
||||
% eqs{1} = -os.div(bWvW) - Ar_w;
|
||||
% Oil Equation
|
||||
eqs{2} = (-os.div(bOvO) - Ar_o)*dt;
|
||||
% 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,189 @@
|
||||
function [eqs, Awell, qwell,PVv, Bga, Bwa] = eqsOW_MB_2014(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules_k)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
cs = state.cs;
|
||||
cb = state.cb;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
cs0 = state0.cs;
|
||||
cb0 = state0.cb;
|
||||
[p, sw, cs, cb] = intADI(p, sw, cs, cb);
|
||||
|
||||
% 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));
|
||||
Nc0 = f.Nc(cs0);
|
||||
Nc = f.Nc(cs);
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw, Nc);
|
||||
pcOW = 0;
|
||||
if f.ifpcgl
|
||||
pcOW = f.pcgl(sw);
|
||||
end
|
||||
pw = p - pcOW+f.chemistry_potential;
|
||||
dpW = os.grad(pw);
|
||||
% dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
dzw=0;
|
||||
dpW = dpW+dzw;
|
||||
upc = (double(dpW)<=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+f.chemistry_potential;
|
||||
dpW0 = os.grad(pw0);
|
||||
dzw0=0;
|
||||
dpW0 = dpW0+dzw0;
|
||||
pW_grad = r.T.*dpW0./r.flowArea;
|
||||
ratio = smooth_relu_stable(pW_grad, f.p_grad_threshold);
|
||||
else
|
||||
ratio = 1;
|
||||
end
|
||||
bWvW = -r.T .* mobW .* (dpW).*ratio;
|
||||
|
||||
|
||||
% 孔隙度
|
||||
pore = r.por(p);
|
||||
% 表活剂
|
||||
mobW_s = os.faceUpstr(upc, krW.*cs) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_s = -r.T .* mobW_s .* dpW;
|
||||
dcs = os.grad(cs);
|
||||
upc_s = (double(dcs)<=0);
|
||||
mobW_s_diff = os.faceUpstr(upc_s, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_s = -r.T_diff .*mobW_s_diff .* dcs;
|
||||
|
||||
% 盐
|
||||
mobW_b = os.faceUpstr(upc, krW.*cb) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_b = -r.T .* mobW_b .* dpW;
|
||||
dcb = os.grad(cb);
|
||||
upc_b = (double(dcb)<=0);
|
||||
mobW_b_diff = os.faceUpstr(upc_b, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_b = -r.T_diff.*mobW_b_diff.*dcb;
|
||||
|
||||
% gas Props
|
||||
BG = f.Bg(p);
|
||||
muG = f.mug(p);
|
||||
krG = f.krrg(sw, Nc);
|
||||
dpG = os.grad(p);
|
||||
% dzg=1e-6*9.8*f.Dgsi*os.grad(z./BG); %油相位势梯度
|
||||
dzg=0;
|
||||
dpG = dpG+dzg;
|
||||
upc = (double(dpG)<=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
|
||||
dp0 = os.grad(p0);
|
||||
dzg0=0;
|
||||
dp0 = dp0+dzg0;
|
||||
pG_grad = r.T.*dpG./r.flowArea;
|
||||
pG_grad_new = smooth_relu_stable(pG_grad, f.p_grad_threshold);
|
||||
bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.* mgbG.* pG_grad_new.*r.flowArea ...
|
||||
-(1-r.matrixflag).* mgbG.* pG_grad_new.*r.flowArea; % Knudsen 扩散影响
|
||||
else
|
||||
bGvG = -r.matrixflag.*f.gas_prop.Kn_modified_factor.*r.T .* mgbG .* dpG ...
|
||||
-(1-r.matrixflag).*r.T .* mgbG .* dpG; % Knudsen 扩散影响
|
||||
end
|
||||
|
||||
% 非达西流发生仅发生在裂缝网格内
|
||||
% Forchheimer_factor = 1/(1+kf/mug*beta*density_g*v_gf)
|
||||
BG0 = f.Bg(p0);muG0 = f.mug(p0);krG0 = f.krrg(sw0,Nc0);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.Dgsi./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(f.gas_prop.stress_factor_matrix*(os.faceAvg(p0)-f.gas_prop.stress_factor_ref_pressure))...
|
||||
+(1-r.matrixflag).*exp(f.gas_prop.stress_factor_fracture*(os.faceAvg(p0)-f.gas_prop.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(r, f, p.val, sw.val, cs.val, cb.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.rock_density.*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.rock_density.*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);
|
||||
RV = r.V .* (1-r.por(p));
|
||||
RV0 = r.V .* (1-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));
|
||||
Ar_w_s = 1/dt*(PV .* (sw.*cs./ BW) - PV0 .* (sw0.*cs./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cs_absorb(cs)-RV0.*f.cs_absorb(cs0)));
|
||||
Ar_w_b = 1/dt*(PV .* (sw.*cb./ BW) - PV0 .* (sw0.*cb0./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cb_absorb(cb)-RV0.*f.cb_absorb(cb0)));
|
||||
% 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;
|
||||
eqs{3} = (-os.div(bWvW_s+diff_s) - Ar_w_s);
|
||||
eqs{4} = (-os.div(bWvW_b+diff_b) - Ar_w_b);
|
||||
%
|
||||
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,187 @@
|
||||
function [eqs, Awell, qwell,PVv, Bga, Bwa] = eqsOW_MB_2014(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg, well_schedules_k)
|
||||
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
cs = state.cs;
|
||||
cb = state.cb;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
cs0 = state0.cs;
|
||||
cb0 = state0.cb;
|
||||
[p, sw, cs, cb] = intADI(p, sw, cs, cb);
|
||||
|
||||
% 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));
|
||||
Nc0 = f.Nc(cs0);
|
||||
Nc = f.Nc(cs);
|
||||
% Water Props
|
||||
BW = f.Bw(p);
|
||||
muW = f.muw(p);
|
||||
krW = f.krw(sw, Nc);
|
||||
pcOW = 0;
|
||||
if f.ifpcgl
|
||||
pcOW = f.pcgl(sw);
|
||||
end
|
||||
pw = p - pcOW +f.chemistry_cof*log(cb0);
|
||||
dpW = os.grad(pw);
|
||||
% dzw=1e-6*9.8*f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
dzw=0;
|
||||
dpW = dpW+dzw;
|
||||
upc = (double(dpW)<=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+f.chemistry_cof*log(cb0);
|
||||
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;
|
||||
|
||||
% 孔隙度
|
||||
pore = r.por(p);
|
||||
% 表活剂
|
||||
mobW_s = os.faceUpstr(upc, krW.*cs) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_s = -r.T .* mobW_s .* dpW;
|
||||
dcs = os.grad(cs);
|
||||
upc_s = (double(dcs)<=0);
|
||||
mobW_s_diff = os.faceUpstr(upc_s, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_s = -r.T_diff .*mobW_s_diff .* dcs;
|
||||
|
||||
% 盐
|
||||
mobW_b = os.faceUpstr(upc, krW.*cb) .* os.faceAvg(1./(BW.*muW));
|
||||
bWvW_b = -r.T .* mobW_b .* dpW;
|
||||
dcb = os.grad(cb);
|
||||
upc_b = (double(dcb)<=0);
|
||||
mobW_b_diff = os.faceUpstr(upc_b, pore.*sw) .* os.faceAvg(1./(BW));
|
||||
diff_b = -r.T_diff.*mobW_b_diff.*dcb;
|
||||
|
||||
% gas Props
|
||||
BG = f.Bg(p);
|
||||
muG = f.mug(p);
|
||||
krG = f.krrg(sw, Nc);
|
||||
dpG = os.grad(p);
|
||||
% dzg=1e-6*9.8*f.Dgsi*os.grad(z./BG); %油相位势梯度
|
||||
dzg=0;
|
||||
dpG = dpG+dzg;
|
||||
upc = (double(dpG)<=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;
|
||||
% 非达西流发生仅发生在裂缝网格内
|
||||
% Forchheimer_factor = 1/(1+kf/mug*beta*density_g*v_gf)
|
||||
BG0 = f.Bg(p0);muG0 = f.mug(p0);krG0 = f.krrg(sw0,Nc0);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.Dgsi./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(r, f, p.val, sw.val, cs.val, cb.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.rock_density.*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.rock_density.*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);
|
||||
RV = r.V .* (1-r.por(p));
|
||||
RV0 = r.V .* (1-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));
|
||||
Ar_w_s = 1/dt*(PV .* (sw.*cs./ BW) - PV0 .* (sw0.*cs./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cs_absorb(cs)-RV0.*f.cs_absorb(cs0)));
|
||||
Ar_w_b = 1/dt*(PV .* (sw.*cb./ BW) - PV0 .* (sw0.*cb0./ f.Bw(p0))+...
|
||||
r.rock_density*(RV.*f.cb_absorb(cb)-RV0.*f.cb_absorb(cb0)));
|
||||
% 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;
|
||||
eqs{3} = (-os.div(bWvW_s+diff_s) - Ar_w_s);
|
||||
eqs{4} = (-os.div(bWvW_b+diff_b) - Ar_w_b);
|
||||
%
|
||||
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,56 @@
|
||||
function [eqs, qomf, qofm, qwmf, qwfm, Awell, qwell] = equa_process(state, state0, dt, r, f, os, Wellc, Weladd, pwf, WelChg)
|
||||
p = state.p;
|
||||
sw = state.sw;
|
||||
p0 = state0.p;
|
||||
sw0 = state0.sw;
|
||||
[p, sw] = intADI(p, sw);
|
||||
|
||||
% Water Props
|
||||
BW = f.Bw(p);%地层水体积系数
|
||||
muW = f.muw(p);%地层水粘度
|
||||
krW = f.krw(sw);%地层水相对渗透率
|
||||
pcOW = 0;%默认ifpcow=0,即默认忽略毛管力
|
||||
if f.ifpcow
|
||||
pcOW = f.pcow(sw);
|
||||
end
|
||||
pw = p - pcOW;%水相压力
|
||||
dpW = os.grad(pw);%水相压力梯度
|
||||
upc = (double(dpW)<=0);%作为迎风格式函数的flag
|
||||
mobW = os.faceUpstr(upc, krW) .* os.faceAvg(1./(BW.*muW));%按照迎风格式计算流度
|
||||
bWvW = -r.T .* mobW .* dpW;%传导系数*流度*压差
|
||||
|
||||
% Oil Props
|
||||
BO = f.Bo(p);%油组分体积系数
|
||||
muO = f.muo(p);%油相粘度
|
||||
krO = f.kro(sw);%油相相对渗透率
|
||||
dpO = os.grad(p);%油相压力梯度
|
||||
upc = (double(dpO)<=0);%迎风格式函数flag
|
||||
mobO = os.faceUpstr(upc, krO) .* os.faceAvg(1./(BO.*muO));%计算流度
|
||||
bOvO = -r.T .* mobO .* dpO;
|
||||
|
||||
% z方向上的位势
|
||||
% 由于当深度发生变化时,流体的密度也会发生变化,因此不能简单得处理成折算压力的情况计算
|
||||
%对位势z进行处理
|
||||
z=r.z;
|
||||
z = intADIz(z);
|
||||
% Dosi是地面标况下测得的油相密度,Dwsi是地面标况下测得的水相密度
|
||||
dzo=f.Dosi*os.grad(z./BO); %油相位势梯度
|
||||
dzw=f.Dwsi*os.grad(z./BW); %水相位势梯度
|
||||
|
||||
|
||||
% transfer function (OW)
|
||||
[qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, p, pw);
|
||||
|
||||
% well equation
|
||||
[Awell, qwell] = WellEquation(r, f, p.val, sw.val, Wellc, Weladd, pwf, WelChg);
|
||||
|
||||
% 因为z的取法,故方程中是压力梯度加上位势梯度
|
||||
% Water Equation
|
||||
eqs{1} = -os.div(bWvW+dzo) - r.V/dt .* (r.por(p) .* (sw ./ BW) - r.por(p0) .* (sw0 ./ f.Bw(p0)));
|
||||
|
||||
% Oil Equation
|
||||
eqs{2} = -os.div(bOvO+dzw) - r.V/dt .* (r.por(p) .* ((1 - sw) ./ BO) - r.por(p0) .* ((1 - sw0) ./ f.Bo(p0)));
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
function [coordinates, nodes, nP, nE, dxv, dyv,dzv,zm,vm,xrao,yrao,zrao,cell_mid_coordinates] = GenerateNode_final(dx, dy,dz ,nx,ny,nz,NTG)
|
||||
% coordinates xy cordinate,即每个节点的x,y坐标
|
||||
% nodes connection,即每个子区域对应的八个节点数
|
||||
% nP numbers of point,即节点数量
|
||||
% nE numbers of element,即子区域数量
|
||||
nP = (nx + 1) * (ny + 1)*(nz+1);%计算节点数量
|
||||
nE = nx * ny*nz;%子区域数量计算
|
||||
% dx=dx*ones(nx,1);%此处是为了暂时妥协
|
||||
% dy=dy*ones(nx,1);
|
||||
% dz=dz*ones(nx,1);
|
||||
dxv = zeros(nE, 1);%每个子区域x方向上尺寸矩阵
|
||||
dyv = zeros(nE, 1);%每个子区域y方向上尺寸矩阵
|
||||
dzv = zeros(nE, 1);
|
||||
zm=zeros(nE, 1);%基质网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
xm=zeros(nE, 1);
|
||||
ym=zeros(nE, 1);
|
||||
%给每个子区域的x方向和y方向赋尺寸
|
||||
vm=zeros(nE, 1);%基质网格体积
|
||||
for k=1:nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
dxv(i+(j-1)*nx+nx*ny*(k-1)) = dx(i);
|
||||
dyv(i+(j-1)*nx+nx*ny*(k-1)) = dy(j);
|
||||
dzv(i+(j-1)*nx+nx*ny*(k-1))= dz(k);
|
||||
vm(i+(j-1)*nx+nx*ny*(k-1))=dx(i)*dy(j)*dz(k)*NTG(i+(j-1)*nx+nx*ny*(k-1));
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
coordinates = zeros(nP, 3);%初始化每个节点的x,y坐标矩阵
|
||||
nodes = zeros(nE, 8);%初始化每个子区域对应的八个节点数的矩阵
|
||||
%计算每个节点的坐标
|
||||
x0 = zeros(nx+1,1);
|
||||
y0 = zeros(ny+1,1);
|
||||
z0=zeros(nz+1,1);
|
||||
sumx = 0;
|
||||
sumy = 0;
|
||||
sumz=0;
|
||||
for i = 1 : nx
|
||||
sumx = sumx+dx(i);
|
||||
x0(i+1) = sumx;
|
||||
end
|
||||
for i = 1 : ny
|
||||
sumy = sumy+dy(i);
|
||||
y0(i+1) = sumy;
|
||||
end
|
||||
for i = 1 : nz
|
||||
sumz = sumz+dz(i);
|
||||
z0(i+1) = sumz;
|
||||
end
|
||||
for k=1:nz+1
|
||||
for j = 1 : ny + 1
|
||||
for i = 1 : nx + 1
|
||||
coordinates(i + (j - 1) * (nx + 1)+(nx+1)*(ny+1)*(k-1), 1) = x0(i);%(i,j)节点的x坐标赋值
|
||||
coordinates(i + (j - 1) * (nx + 1)+(nx+1)*(ny+1)*(k-1), 2) = y0(j);%(i,j)节点的y坐标赋值
|
||||
coordinates(i + (j - 1) * (nx + 1)+(nx+1)*(ny+1)*(k-1), 3) = z0(k);
|
||||
end
|
||||
end
|
||||
end
|
||||
%计算每个子区域的八个顶点(节点)对应的节点编号
|
||||
for k=1:nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 1) = i + (j - 1) * (nx + 1)+(k-1)*(nx+1)*(ny+1);
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 2) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 1) + 1;
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 3) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 1) + nx + 1;
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 4) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 1) + nx + 2;
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 5) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 1)+(nx+1)*(ny+1);
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 6) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 5) + 1;
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 7) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 5) + nx + 1;
|
||||
nodes(i + (j - 1) * nx+nx*ny*(k-1), 8) = nodes(i + (j - 1) * nx+nx*ny*(k-1), 5) + nx + 2;
|
||||
zm(i+(j-1)*nx+nx*ny*(k-1))=sum(coordinates(nodes(i + (j - 1) * nx+nx*ny*(k-1), :),3))/8;
|
||||
xm(i+(j-1)*nx+nx*ny*(k-1))=sum(coordinates(nodes(i + (j - 1) * nx+nx*ny*(k-1), :),1))/8;
|
||||
ym(i+(j-1)*nx+nx*ny*(k-1))=sum(coordinates(nodes(i + (j - 1) * nx+nx*ny*(k-1), :),2))/8;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
cell_mid_coordinates = [xm,ym,zm];
|
||||
|
||||
xrao=[0];
|
||||
for i=1:nx
|
||||
xxiang=sum(dx(1,1:i));
|
||||
xrao=[xrao xxiang];
|
||||
end
|
||||
yrao=[0];
|
||||
for i=1:ny
|
||||
yxiang=sum(dy(1,1:i));
|
||||
yrao=[yrao yxiang];
|
||||
end
|
||||
zrao=[0];
|
||||
for i=1:nz
|
||||
zxiang=sum(dz(1,1:i));
|
||||
zrao=[zrao zxiang];
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,175 @@
|
||||
function r = GridProplpr(nx, ny, nz, dx, dy, dz , kx, ky, kz, nf,f, Kf, Wf, pori, prpor, cpor, Porf, prporf, cporf, cf, ca)
|
||||
%% 基质网格参数及网格参数计算、存储
|
||||
r.nx = nx;
|
||||
r.ny = ny;
|
||||
r.nz = nz;
|
||||
r.dx = dx;
|
||||
r.dy = dy;
|
||||
r.dz = dz;
|
||||
r.kx = kx;
|
||||
r.ky = ky;
|
||||
r.kz = kz;
|
||||
r.Kf = Kf;%裂缝面对应的渗透率,非裂缝单元
|
||||
r.Wf = Wf;%裂缝面对应的缝宽,非裂缝单元
|
||||
r.cf = cf;
|
||||
r.ca = ca;
|
||||
% r.h = h;
|
||||
% [coordinates, nodes, ~, nmc, Dxv, Dyv] = GenerateNode_final(Dx, Dy, nx, ny);
|
||||
[coordinates, nodes, nP, nE, dxv, dyv,dzv,zm,vm] = GenerateNode_final(dx, dy,dz ,nx,ny,nz);
|
||||
r.coordinates = coordinates;
|
||||
r.nodes = nodes;
|
||||
nmc=nE;
|
||||
r.nmc =nmc;
|
||||
r.dxv = dxv;
|
||||
r.dyv = dyv;
|
||||
r.dzv = dyv;
|
||||
r.vm=vm;
|
||||
|
||||
%% 求解裂缝与基质网格连接情况
|
||||
%% 关键参数矩阵初始化
|
||||
m=size(f,1);nf=m/5;%裂缝条数
|
||||
r.nf=nf;
|
||||
%d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
raopoint=cell(m,2);%利用元胞数组存储每条裂缝与基质网格线的交点,
|
||||
%第一列是三维坐标形式,即d3intersection
|
||||
%第二列是裂缝面参数形式,即anothersection
|
||||
pointvsregion=cell(m,3);%利用元胞数组存储interarea函数的结果numofmesh, numvspoint,numofregion
|
||||
fracrossfra=cell(m,m-1);%判断裂缝之间两交点坐标
|
||||
fratmaxfra=zeros(m,m-1);%判断裂缝之间交线参数的最大值
|
||||
fratminfra=zeros(m,m-1);%判断裂缝之间交线参数的最小值
|
||||
fracturemesh=cell(nf,1);%每一行是一条裂缝面上的网格剖分情况
|
||||
% [Linep, ConnecS, Fracp, ~, FracConf2] = Edfm_preprocess_final(coordinates, nodes, Lines, NF);
|
||||
% r.Linep = Linep;
|
||||
% r.ConnecS = ConnecS;
|
||||
% r.Fracp = Fracp;
|
||||
% r.FracConf2 = FracConf2;
|
||||
%% 计算裂缝与基质网格相交情况
|
||||
for i=1:nf
|
||||
raopoint{i,1}= intersectionsolve(f((5*i-4):(5*i),:),dx,dy,dz,nx,ny,nz );
|
||||
raopoint{i,2}= anosection( f((5*i-4):(5*i),:),raopoint{i,1} );
|
||||
[ pointvsregion{i,1},pointvsregion{i,2} ,pointvsregion{i,3}] = interarea( raopoint{i,1},dx,dy,dz,nx,ny,nz );
|
||||
end
|
||||
%% 计算裂缝之间相交线情况
|
||||
for i=1:nf
|
||||
for j=1:nf
|
||||
[ cross,tmax,tmin ]=frac_cross_frac( f((5*i-4):(5*i),:),f((5*j-4):(5*j),:) );
|
||||
fracrossfra{i,j}=cross;fratmaxfra(i,j)=tmax;fratminfra(i,j)=tmin;
|
||||
end
|
||||
end
|
||||
%% 计算裂缝被基质网格、其它裂缝与之相交后的网格分布情况,绘制二维裂缝平面参数坐标系上的网格分布情况
|
||||
figure(1);
|
||||
for i=1:nf
|
||||
d3intersection=raopoint{i,1};anothersection=raopoint{i,2};
|
||||
[ mesh ] = frac_mat_mesh( d3intersection,anothersection,pointvsregion{i,2},pointvsregion{i,1} );
|
||||
for j=1:nf
|
||||
[ mesh,d3intersection,anothersection ]= frac_frac_mesh(mesh,f(5*i-4,:),f(5*i-3,:),f(5*i-2,:),fracrossfra{i,j},fratmaxfra(i,j),fratminfra(i,j),d3intersection,anothersection,pointvsregion{i,2},pointvsregion{i,1} );
|
||||
end
|
||||
raopoint{i,1}=d3intersection;raopoint{i,2}=anothersection;%由原来裂缝与网格的交点不断更新加入其它裂缝与该裂缝的交点
|
||||
fracturemesh{i,1}=mesh;subplot(nf,1,i);plotmesh2D(mesh,raopoint{i,2});
|
||||
end
|
||||
|
||||
%% 绘制三维背景网格(基质网格)及裂缝网格分布
|
||||
%figure(2)
|
||||
%network3D(dx,dy,dz,nx,ny,nz );
|
||||
%hold on;
|
||||
figure(2);
|
||||
for i=1:nf
|
||||
plotmesh3D( fracturemesh{i,1},raopoint{i,1} );hold on;
|
||||
end
|
||||
hold off;
|
||||
%% 确定裂缝编号及连接情况,计算传导系数
|
||||
[ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac, N,T,zf,fcinff,vf,porf,fcff ] = connections( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,Kf,Wf,Porf,dxv,dyv,dzv );
|
||||
nfc=size(fracnumber,1);
|
||||
nex=size(T,1);
|
||||
r.nfc=nfc;
|
||||
nc=nfc+nmc;
|
||||
r.nc=nc;%基质网格和裂缝单元总数
|
||||
r.nex=nex;%具有流体交换的总数
|
||||
kf=Kf(fcinff);
|
||||
wf=Wf(fcinff);
|
||||
r.kf=kf;%裂缝单元对应的渗透率
|
||||
r.wf=wf;%裂缝单元对应的缝宽
|
||||
r.N=N;
|
||||
r.T=T;
|
||||
r.vf=vf;
|
||||
r.V=[vm;vf];
|
||||
r.porf=porf;
|
||||
r.fcff=fcff;
|
||||
%% 计算传导系数
|
||||
% dxvector=ones(1,nx);dyvector=ones(1,ny);dzvector=ones(1,nz);
|
||||
% [ transmatrix,transfracture ] = trans(dxvector,dyvector,dzvector ,nx,ny,nz,nf,fracnumber,lengthvsfra,disvsfra,fracstart,connect_infrac,corevsfra,matrixvsfra,raopoint,f );
|
||||
%% 计算基质与裂缝之间窜流的相关系数
|
||||
% [ channelfrac ] = cuanliu( matrixvsfra,fracstart,fracnumber,raopoint,f,nodes,coordinates,nf );%Gf矩阵
|
||||
% [ G ] = cuanliumatrix(dx,dy,dz );%G矩阵
|
||||
[ G,Gfm,Gff,Gf,Ap,Apf ]=lpr(dx,dy,dz,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coordinates,nf,corevsfra );
|
||||
%%
|
||||
[Ka, M, F2M , MF_coef] = transFunc_aniso(nc,coordinates, nodes, connectmf,Ap,Apf, matrixvsfra,N,T,kx, ky,kz);
|
||||
r.Ka = Ka;
|
||||
r.M = M;
|
||||
r.F2M = F2M;
|
||||
r.MF_coef = MF_coef;
|
||||
%% 计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
z=[zm;zf];
|
||||
r.z=z;
|
||||
|
||||
% nfc = length(Fracp);
|
||||
% r.nfc = nfc;
|
||||
% [kf, wf, porf] = FracProp(Kf, Wf, Porf, ConnecS);
|
||||
% r.kf = kf;
|
||||
% r.wf = wf;
|
||||
% [Nff, Vf, lf] = FracConnec(Linep, Fracp, FracConf2, kf, wf, h);
|
||||
% r.lf = lf;
|
||||
% [nff, ~] = size(Nff);
|
||||
% nc = nmc + nfc;
|
||||
% r.nc = nc;
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
r.rpt = rpt;
|
||||
r.Porf = Porf;
|
||||
pori = [pori; porf];
|
||||
r.pori = pori;
|
||||
r.por = @(p)por(p, prpor, pori, cpor, prporf, cporf, r.rpt);
|
||||
% nmf = 2 * nx * ny - nx - ny;
|
||||
% r.nf = nmf + nff;
|
||||
% N = zeros(nmf, 2);
|
||||
% T = zeros(nmf, 1);
|
||||
% c = 0;
|
||||
% for j = 1 : ny
|
||||
% for i = 1 : nx - 1
|
||||
% c = c + 1;
|
||||
% index = i + (j - 1) * nx;
|
||||
% indexn = index + 1;
|
||||
% N(c, :) = [index, index + 1;];
|
||||
% T(c) = 2 * Dyv(index)*h*Kx(index)*Kx(indexn)/(Kx(index)*Dxv(indexn) + Kx(indexn)*Dxv(index));
|
||||
% end
|
||||
% end
|
||||
% for i = 1 : nx
|
||||
% for j = 1 : ny - 1
|
||||
% c = c + 1;
|
||||
% index = i + (j - 1) * nx;
|
||||
% indexn = index + nx;
|
||||
% N(c, :) = [index, index + nx];
|
||||
% T(c) = 2 * Dxv(index)*h*Ky(index)*Ky(indexn)/(Ky(index)*Dyv(indexn) + Ky(indexn)*Dyv(index));
|
||||
% end
|
||||
% end
|
||||
% r.N = [N; Nff(:, 1:2)+nmc];
|
||||
% r.T = [T; Nff(:, 3)];
|
||||
% r.cf = cf;
|
||||
% r.ca = ca;
|
||||
% r.Kx = Kx;
|
||||
% r.Ky = Ky;
|
||||
% r.Kf = Kf;
|
||||
% r.Wf = Wf;
|
||||
% r.Porf = Porf;
|
||||
% r.lf = lf;
|
||||
% Vm = Dxv .* Dyv .* h;
|
||||
% r.V = [Vm; Vf];
|
||||
% pori = [pori; porf];
|
||||
% r.pori = pori;
|
||||
% rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
% r.por = @(p)por(p, prpor, pori, cpor, prporf, cporf, r.rpt);
|
||||
% [Ka, M, F2M , MF_coef] = transFunc_aniso(coordinates, nodes, Linep, ConnecS, nmc, nfc, nc, Kx, Ky);
|
||||
% r.Ka = Ka;
|
||||
% r.M = M;
|
||||
% r.F2M = F2M;
|
||||
% r.MF_coef = MF_coef;
|
||||
@@ -0,0 +1,7 @@
|
||||
function [ output_args ] = LGR3D( input_args )
|
||||
%LGR3D 此处显示有关此函数的摘要
|
||||
% 此处显示详细说明
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
function [ anothersection ] = anosection( fracture,d3intersection )
|
||||
%为了适用于delaunay函数,求得裂缝平面网格的面积,并有效得给裂缝平面网格编号
|
||||
%将裂缝平面上点的三维欧氏空间左边转换为裂缝面上的参数坐标,可见在确定裂缝形状给出
|
||||
%的正交向量必须取幺正标架
|
||||
%示例:[ anothersection ] = anothersection([0.5,0,0],[1,1,0],[0,0,1],d3intersection )
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
n=size(d3intersection,1);
|
||||
b=[t0(1);t0(2);t0(3)];
|
||||
B=d3intersection'-repmat(b,1,n);
|
||||
C=A\B;
|
||||
m=size(C,2);
|
||||
% for i=1:1:m
|
||||
% if((C(1,i)>umax)||(C(1,i)<umin)||(C(2,i)>vmax)||(C(2,i)<vmin))
|
||||
|
||||
anothersection=C;
|
||||
x=anothersection(1,:)';
|
||||
y=anothersection(2,:)';
|
||||
dt=DelaunayTri(x,y);
|
||||
%triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
k = convexHull(dt);
|
||||
% plot(x,y, '.', 'markersize',10); hold on;
|
||||
% plot(x(k),y(k), 'r'); hold off;
|
||||
anothersection=anothersection';
|
||||
end
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
function [ area ] = area( P,v1,v2 )
|
||||
% 该函数用以计算裂缝面上的面积
|
||||
% P是输入点的参数矩阵,每一行是每个点的u,v坐标
|
||||
% v1,v2是面上的两个基向量
|
||||
%n=cross(v1,v2);
|
||||
%cosangle=abs(dot(n,[0,0,1])/norm(n));
|
||||
dt=DelaunayTri(P(:,1),P(:,2));
|
||||
[~,area]=convexHull(dt);
|
||||
%area=area/cosangle;
|
||||
% area=area*norm(v1,2)*norm(v2,2);%这是当取正交基底的时候,但对于非正交基底,会有角度余弦影响
|
||||
area=area*norm(cross(v1,v2));
|
||||
end
|
||||
|
||||
@@ -0,0 +1,286 @@
|
||||
function [ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac,N,T,zf,fcinff,vf,porf,fcff] = connections( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,kf,wf,Porf,dxv,dyv,dzv,coord,nodes )
|
||||
% 该函数用以给裂缝面网格编号,并存储网格间的连接关系及传导率,是前处理的关键步骤
|
||||
% 不同于二维嵌入式离散裂缝模型,三维模型中,裂缝是二维平面,网格之间连接关系复杂,
|
||||
%不能简单得从基质网格来判定,若所处基质网格不相邻,则裂缝网格必不相邻,若所处基质网格相邻,裂缝网格却不一定相邻
|
||||
%上述原则无助于我们去确定connections,故拟采取以下方案:
|
||||
%第一步:按照xink矩阵去掉零行后,按照行数依次给某裂缝面网格编号,同时存储裂缝网格所在的基质网格序号
|
||||
%第二步:存储每个裂缝网格的面积,边界,边界长度,中心点坐标,中心点到各边界的距离,为后续操作做准备
|
||||
%第三步:按照裂缝网格序号顺序,按照边界进行搜索,如果有相同的边界,则两个裂缝网格是相邻的
|
||||
%matrixvsfra矩阵代表基质网格中包含裂缝网格编号的情况
|
||||
%fracnumber矩阵,行序号表示该裂缝网格编号,行内容表示该网格包含的点序号
|
||||
%areavsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的面积
|
||||
%每相邻两列是一条边,然后将顺序反过来,又是两列一条边
|
||||
%lengthvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的各边长度
|
||||
%corevsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心坐标
|
||||
%disvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心到各边的距离
|
||||
matrixvsfra=zeros(nx*ny*nz,10);%为了减少该矩阵的大小,考虑实际情况,一个基质网格中,一般不会有超过10个裂缝网格
|
||||
fracnumber=zeros(1000,20);%根据实际情况,裂缝网格一般不会超过1000个,也可根据实际情况改变
|
||||
%m=size(xink,1);
|
||||
rownum=zeros(nf,1);
|
||||
for i=1:nf
|
||||
rownum(i)=size(fracturemesh{i,1},1);
|
||||
end
|
||||
%% 将所有裂缝面网格连起来一起编号,并将编号扔给相应的基质网格
|
||||
q=1;
|
||||
fracstart=zeros(nf+1,1);%这个表示在总编号中,每条裂缝起始的号码
|
||||
for j=1:nf
|
||||
fracstart(j)=q;
|
||||
numofmesh=pointvsregion{j,1};
|
||||
for i=1:1:rownum(j)
|
||||
if(norm(fracturemesh{j,1}(i,:))~=0)
|
||||
raoindice=size(fracturemesh{j,1}(i,:),2);
|
||||
fracnumber(q,1:raoindice)=fracturemesh{j,1}(i,:);%q即是该裂缝编号
|
||||
m=floor((i+(2^nf)-1)/(2^nf));
|
||||
indice=find(matrixvsfra(numofmesh(m),:)~=0);
|
||||
if (size(indice,2)==0) xiang=1;
|
||||
else
|
||||
rao=max(indice');
|
||||
xiang=rao(1)+1;
|
||||
end
|
||||
matrixvsfra(numofmesh(m),xiang)=q;%将裂缝编号附给相应的基质网格
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
fracstart(nf+1)=q;%裂缝网格总数量+1
|
||||
fracnumber(q:1000,:)=[];
|
||||
|
||||
|
||||
%% 将包含有裂缝单元的基质网格筛选出来,并进行处理
|
||||
m=size(matrixvsfra,1);
|
||||
connectmf=cell(1,4);
|
||||
% for i=1:m
|
||||
% if (norm(matrixvsfra(i,:))~=0)
|
||||
% ConnecS = cell(1,4);
|
||||
cc = 0;
|
||||
cl = 1;
|
||||
for i = 1 : m
|
||||
%筛选出包含裂缝的基质网格
|
||||
% if ~isempty(matrixvsfra(i,:))
|
||||
if (norm(matrixvsfra(i,:)))~=0
|
||||
cc = cc + 1;
|
||||
%存储该基质网格编号
|
||||
connectmf{cc,1} = i;
|
||||
%给这些裂缝点/裂缝单元按顺序编号
|
||||
A=matrixvsfra(i,:);
|
||||
A(A==0)=[];
|
||||
connectmf{cc,2} =A;
|
||||
end
|
||||
end
|
||||
|
||||
%% 一条条裂缝计算裂缝网格面积、边界等等
|
||||
% edgevsfra=cell(nf,1);
|
||||
normalvec=zeros(q-1,3);%unit 法向量
|
||||
areavsfra=zeros(q-1,1);%q-1即裂缝网格总数
|
||||
lengthvsfra=zeros(q-1,10);
|
||||
Kf=zeros(q-1,10);%裂缝网格渗透率
|
||||
corevsfra=zeros(q-1,3);
|
||||
disvsfra=zeros(q-1,10);
|
||||
tran=zeros(q-1,10);
|
||||
avtran=zeros(q-1,1);%裂缝网格平均传导,用于后续的简化计算
|
||||
fcinff=zeros(q-1,1);%表示裂缝单元所在的裂缝面序号
|
||||
zf=zeros(q-1,1);%裂缝单元高度(以下表面为基准)
|
||||
vf=zeros(q-1,1);%裂缝单元的体积
|
||||
porf=zeros(q-1,1);%裂缝单元的孔隙度
|
||||
for i=1:1:q-1 %对裂缝网格进行操作
|
||||
if(norm(fracnumber(i,:))==0) break;
|
||||
else
|
||||
for k=2:(nf+1)
|
||||
if(i<fracstart(k)) fcinff(i)=k-1; break;%判断该点处在哪个裂缝平面上,k-1号裂缝面
|
||||
end
|
||||
end
|
||||
d3intersection=raopoint{k-1,1};
|
||||
anothersection=raopoint{k-1,2};
|
||||
fraindice=find(fracnumber(i,:)~=0);
|
||||
rx=size(fraindice,2);
|
||||
for j=1:1:(rx-1)
|
||||
%edgevsfra(i,(4*j-3):(4*j))=[fracnumber(i,j),fracnumber(i,j+1),fracnumber(i,j+1),fracnumber(i,j)];%完成对edgevsfra矩阵赋值
|
||||
%%因为是凸多边形,因此只要代表裂缝网格的两个行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格;如果小于两个,则没有共有的边线
|
||||
normalvec(i,:)=cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:))/norm(cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:)));
|
||||
areavsfra(i)=area(anothersection(fracnumber(i,1:(rx-1))',:) ,f(5*(k-1)-3,:),f(5*(k-1)-2,:) );%计算出每个裂缝网格的面积
|
||||
vf(i)=areavsfra(i)*wf(k-1);
|
||||
porf(i)=Porf(k-1);
|
||||
Kf(i,1)=kf(k-1);
|
||||
lengthvsfra(i,j)=norm(d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:));%计算裂缝网格每条边的长度
|
||||
corevsfra(i,:)=1/(rx-1)*d3intersection(fracnumber(i,j),:)+corevsfra(i,:);%计算每个裂缝网格重心的坐标
|
||||
zf(i)=corevsfra(i,3);%裂缝网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
rao1=corevsfra(i,:)-d3intersection(fracnumber(i,j),:);
|
||||
rao2=d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:);
|
||||
disvsfra(i,j)=norm(cross(rao1',rao2'))/norm(rao2);%计算出每个裂缝网格重心到每条边的距离
|
||||
tran(i,j)=kf(k-1)*wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
end
|
||||
avtran(i)=sum(tran(i,:))/(rx-1);
|
||||
end
|
||||
end
|
||||
|
||||
%% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
fcff=cell(1,8);
|
||||
fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
|
||||
%% 裂缝单元的连接情况
|
||||
|
||||
%% 在同一裂缝面上,裂缝单元的连接情况及传导率计算(不包含在同一基质网格中的相邻裂缝单元)
|
||||
connect_infrac=cell(nf,1);
|
||||
Nff=zeros(1,2); %记录同一裂缝面上的网格相邻情况,第一列和第二列分别是相邻网格的编号
|
||||
Tff=zeros(1,1); %记录相应的传导系数
|
||||
for i=1:nf
|
||||
p=1;
|
||||
raoconnect=zeros(fracstart(i+1)-fracstart(i),10);%一般来说,裂缝网格不超过10条边
|
||||
d3intersection=raopoint{i,1};
|
||||
anothersection=raopoint{i,2};
|
||||
for j=fracstart(i):((fracstart(i+1)-1)-1)%第i条裂缝的编号范围
|
||||
q=1;
|
||||
for k=j:(fracstart(i+1)-1)
|
||||
A=fracnumber(j,:);
|
||||
B=fracnumber(k,:);
|
||||
%将两个向量很可能都有的0去掉,这个0没有什么意义
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
[a,~]=find(matrixvsfra==j); [b,~]=find(matrixvsfra==k);
|
||||
raoflag=intersect(A,B);
|
||||
if((size(raoflag,2)>2)||((size(raoflag,2)<2))) continue;%因为是凸多边形,因此只要代表裂缝网格的行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格,因为如果不是,则必有一个是凹多边形,矛盾,证毕;如果小于两个,则没有共有的边线
|
||||
else if (a==b) continue; %说明这两个裂缝单元在同一个基质网格中,因此不应该算在此类中
|
||||
else
|
||||
raoconnect(p,q)=k;q=q+1;
|
||||
length=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));%计算裂缝单元公共边长度
|
||||
rao1k=corevsfra(k,:)-d3intersection(raoflag(1),:);
|
||||
rao1j=corevsfra(j,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
%分别计算两裂缝单元中心到公共边的距离
|
||||
disk=norm(cross(rao1k',rao2'))/norm(rao2);
|
||||
disj=norm(cross(rao1j',rao2'))/norm(rao2);
|
||||
tran1=kf(i)*wf(i)*length/disk;
|
||||
tran2=kf(i)*wf(i)*length/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均
|
||||
hartran=tran1*tran2/(tran1+tran2);
|
||||
Nff=[Nff; j,k];
|
||||
Tff=[Tff;hartran];
|
||||
%计算出每个裂缝网格重心到每条边的距离
|
||||
end
|
||||
end
|
||||
p=p+1;
|
||||
end
|
||||
connect_infrac{i,1}=raoconnect;
|
||||
end
|
||||
end
|
||||
Nff(1,:)=[]; %去除第一行的零行
|
||||
Tff(1,:)=[];
|
||||
%% 在同一基质网格中的裂缝单元连接情况及传导率计算
|
||||
nmc=size(matrixvsfra,1);
|
||||
Nmff=zeros(1,2);
|
||||
Tmff=zeros(1,1);
|
||||
for i=1:nmc
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>1) %此时表明要采取下述的简化算法
|
||||
% lengthvsfra(matrixvsfra(i,indice))./disvsfra(matrixvsfra(i,indice))
|
||||
for j=1:n-1
|
||||
for k=j:n
|
||||
Nmff=[Nmff;matrixvsfra(i,indice(j)), matrixvsfra(i,indice(k))];
|
||||
% 此时的计算方式是先求每个裂缝网格的算术平均,再算包含在该基质网格中的所有裂缝单元的算术平均
|
||||
fc1=matrixvsfra(i,indice(j)); fc2=matrixvsfra(i,indice(k));
|
||||
allfc=matrixvsfra(i,1:n); sumtran=sum(fcff{1,7}(allfc));
|
||||
Tmff=[Tmff; fcff{1,7}(fc1)*fcff{1,7}(fc2)/sumtran];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Nmff(1,:)=[]; %去掉开头的零行
|
||||
Tmff(1,:)=[];
|
||||
% N = [N; Nmff+nmc];
|
||||
% T = [T; Tmff];
|
||||
|
||||
%% 基质网格的连接情况及传导系数计算
|
||||
nmc=nx * ny*nz;%基质网格数目
|
||||
nfc=size(fracnumber,1);%裂缝单元数目
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
nmm = (nx-1)*ny*nz+(ny-1)*nx*nz+(nz-1)*nx*ny;%nmm是基质网格之间存在流体交换的总数
|
||||
% r.nf = nmm + nff;%nff是裂缝单元之间存在流体交换的总数
|
||||
Kx=kx.*ones(nmc,1);
|
||||
Ky=ky.*ones(nmc,1);
|
||||
Kz=kz.*ones(nmc,1);
|
||||
N = zeros(nmm, 2);%存储基质网格之间存在流体交换的网格编号
|
||||
T = zeros(nmm, 1);%存储对应与N矩阵的传导系数
|
||||
c = 0;
|
||||
for k= 1 : nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + 1;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)/(Kx(index)*dxv(indexn) + Kx(indexn)*dxv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k= 1 : nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dxv(index)*Ky(index)*Ky(indexn)/(Ky(index)*dyv(indexn) + Ky(indexn)*dyv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
for k= 1: nz-1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx * ny;
|
||||
N(c, :) = [index, index + nx*ny];
|
||||
T(c) = 2 * dxv(index)*dyv(index)*Kz(index)*Kz(indexn)/(Kz(index)*dzv(indexn) + Kz(indexn)*dzv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
syms x y z;
|
||||
Ninterflow=[];
|
||||
Tinterflow=[];
|
||||
for i=1:nx*ny*nz %基质网格编号
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
Knnc=2*kcell*Kf(matrixvsfra(i,j))/(kcell+Kf(matrixvsfra(i,j)));
|
||||
Annc=areavsfra(matrixvsfra(i,j));
|
||||
fracore=corevsfra(matrixvsfra(i,j));
|
||||
matnodes=nodes(i,:);
|
||||
verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
matcore=mean(verco);d0=matcore-fracore;
|
||||
dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% dn=abs(dn);%影响数值积分效率
|
||||
dn=sqrt(dn^2);
|
||||
dn=matlabFunction(dn);
|
||||
if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)/2,dzv(i)/2)/(dxv(i)*dyv(i)*dzv(i));
|
||||
else if norvec(1)~=0 && norvec(2)~=0
|
||||
Dn=dzv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i));
|
||||
else if norvec(1)~=0 && norvec(3)~=0
|
||||
Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)/2,dzv(i)/2)/(dxv(i)*dyv(i)*dzv(i));
|
||||
else if norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)/2,dzv(i)/2)/(dxv(i)*dyv(i)*dzv(i));
|
||||
else if norvec(1)~=0
|
||||
Dn=dyv(i)*dzv(i)*integral(dn,-dxv(i)/2,dxv(i)/2);
|
||||
else if norvec(2)~=0
|
||||
|
||||
raoT=Knnc*Annc/Dn;
|
||||
Tinterflow=[Tinterflow;raoT];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 把上述三种情况的矩阵分别叠加起来
|
||||
N = [N; Nmff+nmc; Nff+nmc;Ninterflow];
|
||||
T = [T; Tmff; Tff;Tinterflow];
|
||||
nex=size(N,1);
|
||||
end
|
||||
@@ -0,0 +1,247 @@
|
||||
function [ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac,N,T,zf,fcinff,vf,porf,fcff] = connections( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,kf,wf,Porf,dxv,dyv,dzv )
|
||||
% 该函数用以给裂缝面网格编号,并存储网格间的连接关系及传导率,是前处理的关键步骤
|
||||
% 不同于二维嵌入式离散裂缝模型,三维模型中,裂缝是二维平面,网格之间连接关系复杂,
|
||||
%不能简单得从基质网格来判定,若所处基质网格不相邻,则裂缝网格必不相邻,若所处基质网格相邻,裂缝网格却不一定相邻
|
||||
%上述原则无助于我们去确定connections,故拟采取以下方案:
|
||||
%第一步:按照xink矩阵去掉零行后,按照行数依次给某裂缝面网格编号,同时存储裂缝网格所在的基质网格序号
|
||||
%第二步:存储每个裂缝网格的面积,边界,边界长度,中心点坐标,中心点到各边界的距离,为后续操作做准备
|
||||
%第三步:按照裂缝网格序号顺序,按照边界进行搜索,如果有相同的边界,则两个裂缝网格是相邻的
|
||||
%matrixvsfra矩阵代表基质网格中包含裂缝网格编号的情况
|
||||
%fracnumber矩阵,行序号表示该裂缝网格编号,行内容表示该网格包含的点序号
|
||||
%areavsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的面积
|
||||
%每相邻两列是一条边,然后将顺序反过来,又是两列一条边
|
||||
%lengthvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的各边长度
|
||||
%corevsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心坐标
|
||||
%disvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心到各边的距离
|
||||
matrixvsfra=zeros(nx*ny*nz,10);%为了减少该矩阵的大小,考虑实际情况,一个基质网格中,一般不会有超过10个裂缝网格
|
||||
fracnumber=zeros(1000,20);%根据实际情况,裂缝网格一般不会超过1000个,也可根据实际情况改变
|
||||
%m=size(xink,1);
|
||||
rownum=zeros(nf,1);
|
||||
for i=1:nf
|
||||
rownum(i)=size(fracturemesh{i,1},1);
|
||||
end
|
||||
%% 将所有裂缝面网格连起来一起编号,并将编号扔给相应的基质网格
|
||||
q=1;
|
||||
fracstart=zeros(nf+1,1);%这个表示在总编号中,每条裂缝起始的号码
|
||||
for j=1:nf
|
||||
fracstart(j)=q;
|
||||
numofmesh=pointvsregion{j,1};
|
||||
for i=1:1:rownum(j)
|
||||
if(norm(fracturemesh{j,1}(i,:))~=0)
|
||||
raoindice=size(fracturemesh{j,1}(i,:),2);
|
||||
fracnumber(q,1:raoindice)=fracturemesh{j,1}(i,:);%q即是该裂缝编号
|
||||
% m=floor((i+(2^nf)-1)/(2^nf));
|
||||
% indice=find(matrixvsfra(numofmesh(m),:)~=0);
|
||||
indice=find(matrixvsfra(numofmesh(i),:)~=0);
|
||||
if (size(indice,2)==0) xiang=1;
|
||||
else
|
||||
rao=max(indice');
|
||||
xiang=rao(1)+1;
|
||||
end
|
||||
matrixvsfra(numofmesh(i),xiang)=q;%将裂缝编号附给相应的基质网格
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
fracstart(nf+1)=q;%裂缝网格总数量+1
|
||||
fracnumber(q:1000,:)=[];
|
||||
|
||||
|
||||
%% 将包含有裂缝单元的基质网格筛选出来,并进行处理
|
||||
m=size(matrixvsfra,1);
|
||||
connectmf=cell(1,4);
|
||||
% for i=1:m
|
||||
% if (norm(matrixvsfra(i,:))~=0)
|
||||
% ConnecS = cell(1,4);
|
||||
cc = 0;
|
||||
cl = 1;
|
||||
for i = 1 : m
|
||||
%筛选出包含裂缝的基质网格
|
||||
% if ~isempty(matrixvsfra(i,:))
|
||||
if (norm(matrixvsfra(i,:)))~=0
|
||||
cc = cc + 1;
|
||||
%存储该基质网格编号
|
||||
connectmf{cc,1} = i;
|
||||
%给这些裂缝点/裂缝单元按顺序编号
|
||||
A=matrixvsfra(i,:);
|
||||
A(A==0)=[];
|
||||
connectmf{cc,2} =A;
|
||||
end
|
||||
end
|
||||
|
||||
%% 一条条裂缝计算裂缝网格面积、边界等等
|
||||
% edgevsfra=cell(nf,1);
|
||||
areavsfra=zeros(q-1,1);%q-1即裂缝网格总数
|
||||
lengthvsfra=zeros(q-1,10);
|
||||
corevsfra=zeros(q-1,3);
|
||||
disvsfra=zeros(q-1,10);
|
||||
tran=zeros(q-1,10);
|
||||
avtran=zeros(q-1,1);%裂缝网格平均传导,用于后续的简化计算
|
||||
fcinff=zeros(q-1,1);%表示裂缝单元所在的裂缝面序号
|
||||
zf=zeros(q-1,1);%裂缝单元高度(以下表面为基准)
|
||||
vf=zeros(q-1,1);%裂缝单元的体积
|
||||
porf=zeros(q-1,1);%裂缝单元的孔隙度
|
||||
for i=1:1:q-1 %对裂缝网格进行操作
|
||||
if(norm(fracnumber(i,:))==0) break;
|
||||
else
|
||||
for k=2:(nf+1)
|
||||
if(i<fracstart(k)) fcinff(i)=k-1; break;%判断该点处在哪个裂缝平面上,k-1号裂缝面
|
||||
end
|
||||
end
|
||||
d3intersection=raopoint{k-1,1};
|
||||
anothersection=raopoint{k-1,2};
|
||||
fraindice=find(fracnumber(i,:)~=0);
|
||||
rx=size(fraindice,2);
|
||||
for j=1:1:(rx-1)
|
||||
%edgevsfra(i,(4*j-3):(4*j))=[fracnumber(i,j),fracnumber(i,j+1),fracnumber(i,j+1),fracnumber(i,j)];%完成对edgevsfra矩阵赋值
|
||||
%%因为是凸多边形,因此只要代表裂缝网格的两个行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格;如果小于两个,则没有共有的边线
|
||||
areavsfra(i)=area(anothersection(fracnumber(i,1:(rx-1))',:) ,f(5*(k-1)-3,:),f(5*(k-1)-2,:) );%计算出每个裂缝网格的面积
|
||||
vf(i)=areavsfra(i)*wf(k-1);
|
||||
porf(i)=Porf(k-1);
|
||||
lengthvsfra(i,j)=norm(d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:));%计算裂缝网格每条边的长度
|
||||
corevsfra(i,:)=1/(rx-1)*d3intersection(fracnumber(i,j),:)+corevsfra(i,:);%计算每个裂缝网格重心的坐标
|
||||
zf(i)=corevsfra(i,3);%裂缝网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
rao1=corevsfra(i,:)-d3intersection(fracnumber(i,j),:);
|
||||
rao2=d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:);
|
||||
disvsfra(i,j)=norm(cross(rao1',rao2'))/norm(rao2);%计算出每个裂缝网格重心到每条边的距离
|
||||
tran(i,j)=kf(k-1)*wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
end
|
||||
avtran(i)=sum(tran(i,:))/(rx-1);
|
||||
end
|
||||
end
|
||||
|
||||
%% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
fcff=cell(1,8);
|
||||
fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
|
||||
%% 裂缝单元的连接情况
|
||||
|
||||
%% 在同一裂缝面上,裂缝单元的连接情况及传导率计算(不包含在同一基质网格中的相邻裂缝单元)
|
||||
connect_infrac=cell(nf,1);
|
||||
Nff=zeros(1,2); %记录同一裂缝面上的网格相邻情况,第一列和第二列分别是相邻网格的编号
|
||||
Tff=zeros(1,1); %记录相应的传导系数
|
||||
for i=1:nf
|
||||
p=1;
|
||||
raoconnect=zeros(fracstart(i+1)-fracstart(i),10);%一般来说,裂缝网格不超过10条边
|
||||
d3intersection=raopoint{i,1};
|
||||
anothersection=raopoint{i,2};
|
||||
for j=fracstart(i):((fracstart(i+1)-1)-1)%第i条裂缝的编号范围
|
||||
q=1;
|
||||
for k=(j+1):(fracstart(i+1)-1)
|
||||
A=fracnumber(j,:);
|
||||
B=fracnumber(k,:);
|
||||
%将两个向量很可能都有的0去掉,这个0没有什么意义
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
[a,~]=find(matrixvsfra==j); [b,~]=find(matrixvsfra==k);
|
||||
raoflag=intersect(A,B);
|
||||
if((size(raoflag,2)>2)||((size(raoflag,2)<2))) continue;%因为是凸多边形,因此只要代表裂缝网格的行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格,因为如果不是,则必有一个是凹多边形,矛盾,证毕;如果小于两个,则没有共有的边线
|
||||
else if (a==b) continue; %说明这两个裂缝单元在同一个基质网格中,因此不应该算在此类中
|
||||
else
|
||||
raoconnect(p,q)=k;q=q+1;
|
||||
length=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));%计算裂缝单元公共边长度
|
||||
rao1k=corevsfra(k,:)-d3intersection(raoflag(1),:);
|
||||
rao1j=corevsfra(j,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
%分别计算两裂缝单元中心到公共边的距离
|
||||
disk=norm(cross(rao1k',rao2'))/norm(rao2);
|
||||
disj=norm(cross(rao1j',rao2'))/norm(rao2);
|
||||
tran1=kf(i)*wf(i)*length/disk;
|
||||
tran2=kf(i)*wf(i)*length/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均
|
||||
hartran=tran1*tran2/(tran1+tran2);
|
||||
Nff=[Nff; j,k];
|
||||
Tff=[Tff;hartran];
|
||||
%计算出每个裂缝网格重心到每条边的距离
|
||||
end
|
||||
end
|
||||
p=p+1;
|
||||
end
|
||||
connect_infrac{i,1}=raoconnect;
|
||||
end
|
||||
end
|
||||
Nff(1,:)=[]; %去除第一行的零行
|
||||
Tff(1,:)=[];
|
||||
%% 在同一基质网格中的裂缝单元连接情况及传导率计算
|
||||
nmc=size(matrixvsfra,1);
|
||||
Nmff=zeros(1,2);
|
||||
Tmff=zeros(1,1);
|
||||
for i=1:nmc
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>1) %此时表明要采取下述的简化算法
|
||||
% lengthvsfra(matrixvsfra(i,indice))./disvsfra(matrixvsfra(i,indice))
|
||||
for j=1:n-1
|
||||
for k=j:n
|
||||
Nmff=[Nmff;matrixvsfra(i,indice(j)), matrixvsfra(i,indice(k))];
|
||||
% 此时的计算方式是先求每个裂缝网格的算术平均,再算包含在该基质网格中的所有裂缝单元的算术平均
|
||||
fc1=matrixvsfra(i,indice(j)); fc2=matrixvsfra(i,indice(k));
|
||||
allfc=matrixvsfra(i,1:n); sumtran=sum(fcff{1,7}(allfc));
|
||||
Tmff=[Tmff; fcff{1,7}(fc1)*fcff{1,7}(fc2)/sumtran];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Nmff(1,:)=[]; %去掉开头的零行
|
||||
Tmff(1,:)=[];
|
||||
% N = [N; Nmff+nmc];
|
||||
% T = [T; Tmff];
|
||||
|
||||
%% 基质网格的连接情况及传导系数计算
|
||||
nmc=nx * ny*nz;%基质网格数目
|
||||
nfc=size(fracnumber,1);%裂缝单元数目
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
nmm = (nx-1)*ny*nz+(ny-1)*nx*nz+(nz-1)*nx*ny;%nmm是基质网格之间存在流体交换的总数
|
||||
% r.nf = nmm + nff;%nff是裂缝单元之间存在流体交换的总数
|
||||
Kx=kx.*ones(nmc,1);
|
||||
Ky=ky.*ones(nmc,1);
|
||||
Kz=kz.*ones(nmc,1);
|
||||
N = zeros(nmm, 2);%存储基质网格之间存在流体交换的网格编号
|
||||
T = zeros(nmm, 1);%存储对应与N矩阵的传导系数
|
||||
c = 0;
|
||||
for k= 1 : nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + 1;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)/(Kx(index)*dxv(indexn) + Kx(indexn)*dxv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k= 1 : nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dxv(index)*Ky(index)*Ky(indexn)/(Ky(index)*dyv(indexn) + Ky(indexn)*dyv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
for k= 1: nz-1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx * ny;
|
||||
N(c, :) = [index, index + nx*ny];
|
||||
T(c) = 2 * dxv(index)*dyv(index)*Kz(index)*Kz(indexn)/(Kz(index)*dzv(indexn) + Kz(indexn)*dzv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 把上述三种情况的矩阵分别叠加起来
|
||||
N = [N; Nmff+nmc; Nff+nmc];
|
||||
T = [T; Tmff; Tff];
|
||||
nex=size(N,1);
|
||||
end
|
||||
@@ -0,0 +1,529 @@
|
||||
function [ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac,N,T,zf,fcinff,vf,porf,fcff,T_convection,mat_frac,cell_divided_by_fracture_flag, flowArea, perm, matrixflag,T_diff] = connections_2014( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,pori,kf,wf,Porf,dxv,dyv,dzv,coord,nodes,NTG,addflag,invalid_grids )
|
||||
% 该函数用以给裂缝面网格编号,并存储网格间的连接关系及传导率,是前处理的关键步骤
|
||||
% 不同于二维嵌入式离散裂缝模型,三维模型中,裂缝是二维平面,网格之间连接关系复杂,
|
||||
%不能简单得从基质网格来判定,若所处基质网格不相邻,则裂缝网格必不相邻,若所处基质网格相邻,裂缝网格却不一定相邻
|
||||
%上述原则无助于我们去确定connections,故拟采取以下方案:
|
||||
%第一步:按照xink矩阵去掉零行后,按照行数依次给某裂缝面网格编号,同时存储裂缝网格所在的基质网格序号
|
||||
%第二步:存储每个裂缝网格的面积,边界,边界长度,中心点坐标,中心点到各边界的距离,为后续操作做准备
|
||||
%第三步:按照裂缝网格序号顺序,按照边界进行搜索,如果有相同的边界,则两个裂缝网格是相邻的
|
||||
%matrixvsfra矩阵代表基质网格中包含裂缝网格编号的情况
|
||||
%fracnumber矩阵,行序号表示该裂缝网格编号,行内容表示该网格包含的点序号
|
||||
%areavsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的面积
|
||||
%每相邻两列是一条边,然后将顺序反过来,又是两列一条边
|
||||
%lengthvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的各边长度
|
||||
%corevsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心坐标
|
||||
%disvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心到各边的距离
|
||||
matrixvsfra=zeros(nx*ny*nz,10);%为了减少该矩阵的大小,考虑实际情况,一个基质网格中,一般不会有超过10个裂缝网格
|
||||
fracnumber=zeros(1000,20);%根据实际情况,裂缝网格一般不会超过1000个,也可根据实际情况改变
|
||||
%m=size(xink,1);
|
||||
rownum=zeros(nf,1);
|
||||
for i=1:nf
|
||||
rownum(i)=size(fracturemesh{i,1},1);
|
||||
end
|
||||
%% 将所有裂缝面网格连起来一起编号,并将编号扔给相应的基质网格
|
||||
q=1;
|
||||
fracstart=zeros(nf+1,1);%这个表示在总编号中,每条裂缝起始的号码
|
||||
for j=1:nf
|
||||
fracstart(j)=q;
|
||||
numofmesh=pointvsregion{j,1};
|
||||
for i=1:1:rownum(j)
|
||||
if(norm(fracturemesh{j,1}(i,:))~=0)
|
||||
raoindice=size(fracturemesh{j,1}(i,:),2);
|
||||
fracnumber(q,1:raoindice)=fracturemesh{j,1}(i,:);%q即是该裂缝编号
|
||||
% m=floor((i+(2^nf)-1)/(2^nf));
|
||||
m=floor((i+(2^addflag(j)-1))/(2^addflag(j)));
|
||||
indice=find(matrixvsfra(numofmesh(m),:)~=0);
|
||||
% indice=find(matrixvsfra(numofmesh(i),:)~=0);
|
||||
if (size(indice,2)==0) xiang=1;
|
||||
else
|
||||
rao=max(indice');
|
||||
xiang=rao(1)+1;
|
||||
end
|
||||
matrixvsfra(numofmesh(m),xiang)=q;%将裂缝编号附给相应的基质网格
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
fracstart(nf+1)=q;%裂缝网格总数量+1
|
||||
fracnumber(q:1000,:)=[];
|
||||
|
||||
%% 将包含有裂缝单元的基质网格筛选出来,并进行处理
|
||||
m=size(matrixvsfra,1);
|
||||
mat_frac=[];
|
||||
connectmf=cell(1,4);
|
||||
% for i=1:m
|
||||
% if (norm(matrixvsfra(i,:))~=0)
|
||||
% ConnecS = cell(1,4);
|
||||
cc = 0;
|
||||
cl = 1;
|
||||
for i = 1 : m
|
||||
%筛选出包含裂缝的基质网格
|
||||
% if ~isempty(matrixvsfra(i,:))
|
||||
if (norm(matrixvsfra(i,:)))~=0
|
||||
cc = cc + 1;
|
||||
%存储该基质网格编号
|
||||
connectmf{cc,1} = i;
|
||||
mat_frac=[mat_frac;i];
|
||||
%给这些裂缝点/裂缝单元按顺序编号
|
||||
A=matrixvsfra(i,:);
|
||||
A(A==0)=[];
|
||||
connectmf{cc,2} =A;
|
||||
end
|
||||
end
|
||||
|
||||
%% 一条条裂缝计算裂缝网格面积、边界等等
|
||||
% edgevsfra=cell(nf,1);
|
||||
% Kffl=funtion_data.Kffl;
|
||||
% Dffl=funtion_data.Dffl;
|
||||
% kffl=zeros(q-1,1);
|
||||
% dffl=zeros(q-1,1);
|
||||
normalvec=zeros(q-1,3);%unit 法向量
|
||||
areavsfra=zeros(q-1,1);%q-1即裂缝网格总数
|
||||
lengthvsfra=zeros(q-1,10);
|
||||
Kf=zeros(q-1,1);%裂缝网格渗透率
|
||||
Wf=zeros(q-1,1);%裂缝单元缝宽
|
||||
corevsfra=zeros(q-1,3);
|
||||
disvsfra=zeros(q-1,10);
|
||||
tran=zeros(q-1,10);
|
||||
tran_no_perm=zeros(q-1,10);
|
||||
avtran=zeros(q-1,1);%裂缝网格平均传导,用于后续的简化计算
|
||||
ave_disvsfra=zeros(q-1,1);
|
||||
fcinff=zeros(q-1,1);%表示裂缝单元所在的裂缝面序号
|
||||
zf=zeros(q-1,1);%裂缝单元高度(以下表面为基准)
|
||||
vf=zeros(q-1,1);%裂缝单元的体积
|
||||
porf=zeros(q-1,1);%裂缝单元的孔隙度
|
||||
avfracFaceArea = zeros(q-1,1);
|
||||
for i=1:1:q-1 %对裂缝网格进行操作
|
||||
if(norm(fracnumber(i,:))==0) break;
|
||||
else
|
||||
for k=2:(nf+1)
|
||||
if(i<fracstart(k)) fcinff(i)=k-1; break;%判断该点处在哪个裂缝平面上,k-1号裂缝面
|
||||
end
|
||||
end
|
||||
d3intersection=raopoint{k-1,1};
|
||||
anothersection=raopoint{k-1,2};
|
||||
fraindice=find(fracnumber(i,:)~=0);
|
||||
rx=size(fraindice,2);
|
||||
for j = 1:rx-1
|
||||
corevsfra(i,:)=1/(rx-1)*d3intersection(fracnumber(i,j),:)+corevsfra(i,:);%计算每个裂缝网格重心的坐标
|
||||
end
|
||||
for j=1:1:(rx-1)
|
||||
%edgevsfra(i,(4*j-3):(4*j))=[fracnumber(i,j),fracnumber(i,j+1),fracnumber(i,j+1),fracnumber(i,j)];%完成对edgevsfra矩阵赋值
|
||||
%%因为是凸多边形,因此只要代表裂缝网格的两个行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格;如果小于两个,则没有共有的边线
|
||||
normalvec(i,:)=cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:))/norm(cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:)));
|
||||
areavsfra(i)=area(anothersection(fracnumber(i,1:(rx-1))',:) ,f(5*(k-1)-3,:),f(5*(k-1)-2,:) );%计算出每个裂缝网格的面积
|
||||
vf(i)=areavsfra(i)*wf(k-1);
|
||||
porf(i)=Porf(k-1);
|
||||
Kf(i,1)=kf(k-1);
|
||||
Wf(i,1)=wf(k-1);
|
||||
% kffl(i,1)=Kffl(k-1);
|
||||
% dffl(i,1)=Dffl(k-1);
|
||||
lengthvsfra(i,j)=norm(d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:));%计算裂缝网格每条边的长度
|
||||
zf(i)=corevsfra(i,3);%裂缝网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
rao1=corevsfra(i,:)-d3intersection(fracnumber(i,j),:);
|
||||
rao2=d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:);
|
||||
disvsfra(i,j)=norm(cross(rao1',rao2'))/norm(rao2);%计算出每个裂缝网格重心到每条边的距离
|
||||
tran(i,j)=kf(k-1)*wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
tran_no_perm(i,j)=wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
fracFaceArea(i,j)=wf(k-1)*lengthvsfra(i,j);
|
||||
end
|
||||
avtran(i)=sum(tran(i,:))/(rx-1);
|
||||
ave_disvsfra(i)=sum(disvsfra(i,:))/(rx-1);
|
||||
avfracFaceArea(i)=sum(fracFaceArea(i,:))/(rx-1);
|
||||
end
|
||||
end
|
||||
|
||||
% %% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
% fcff=cell(1,8);
|
||||
% fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
%% 为了防止出现某裂缝网格面积相对过小,引起计算出错,故将面积很小的裂缝网格给去掉
|
||||
maxarea=max(areavsfra,2);
|
||||
% minlength=min(lengthvsfra,[],2);
|
||||
% maxlength=max(lengthvsfra,[],2);
|
||||
newnum=zeros(q-1,1);
|
||||
[deindex1,~]=find(areavsfra<0*maxarea);
|
||||
deindex2=[];
|
||||
for i=1:(q-1)
|
||||
zeroindex=find(lengthvsfra(i,:)~=0);
|
||||
minlength=min(lengthvsfra(i,zeroindex));
|
||||
maxlength=max(lengthvsfra(i,:));
|
||||
if minlength<0*maxlength
|
||||
deindex2=[deindex2;i];
|
||||
end
|
||||
end
|
||||
deindex=[deindex1;deindex2];
|
||||
deindex=unique(deindex);
|
||||
deindex=sort(deindex);
|
||||
hui=length(deindex);
|
||||
if hui>0
|
||||
for i=1:(q-1)
|
||||
[dogindex,~]=find(deindex==i);
|
||||
if length(dogindex)~=0
|
||||
newnum(i)=0;
|
||||
else
|
||||
[catindex,~]=find(deindex<i);
|
||||
rao=length(catindex);
|
||||
newnum(i)=i-rao;
|
||||
end
|
||||
end
|
||||
fracnumber(deindex,:)=[];
|
||||
fcinff(deindex,:)=[];
|
||||
lengthvsfra(deindex,:)=[];
|
||||
corevsfra(deindex,:)=[];
|
||||
disvsfra(deindex,:)=[];
|
||||
tran(deindex,:)=[];
|
||||
tran_no_perm(deindex,:)=[];
|
||||
avtran(deindex,:)=[];
|
||||
areavsfra(deindex,:)=[];
|
||||
zf(deindex,:)=[];
|
||||
vf(deindex,:)=[];
|
||||
porf(deindex,:)=[];
|
||||
% change matrixvsfra
|
||||
for i=1:m%matrixvsfra矩阵的行数
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0
|
||||
matrixvsfra(i,j)=newnum(matrixvsfra(i,j));
|
||||
end
|
||||
end
|
||||
end
|
||||
% change fracstart
|
||||
fracstart(nf+1,1)=length(fracnumber)+1;
|
||||
for i=1:nf
|
||||
[daiindex,~]=find(deindex<fracstart(i,1));
|
||||
dai=length(daiindex);
|
||||
fracstart(i)=fracstart(i)-dai;
|
||||
end
|
||||
|
||||
end
|
||||
%% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
fcff=cell(1,8);
|
||||
fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;fcff{1,9}=tran_no_perm;
|
||||
%% 裂缝单元的连接情况
|
||||
|
||||
%% 在同一裂缝面上,裂缝单元的连接情况及传导率计算(不包含在同一基质网格中的相邻裂缝单元)
|
||||
connect_infrac=cell(nf,1);
|
||||
Nff=zeros(1,2); %记录同一裂缝面上的网格相邻情况,第一列和第二列分别是相邻网格的编号
|
||||
Tff=zeros(1,1); %记录相应的传导系数
|
||||
Tff_convection=zeros(1,1); %对流项
|
||||
Tff_diff=zeros(1,1);
|
||||
perm_ff=zeros(1,1);
|
||||
flowArea_ff=zeros(1,1);
|
||||
for i=1:nf
|
||||
p=1;
|
||||
raoconnect=zeros(fracstart(i+1)-fracstart(i),10);%一般来说,裂缝网格不超过10条边
|
||||
d3intersection=raopoint{i,1};
|
||||
anothersection=raopoint{i,2};
|
||||
for j=fracstart(i):((fracstart(i+1)-1)-1)%第i条裂缝的编号范围
|
||||
q=1;
|
||||
for k=j:(fracstart(i+1)-1)
|
||||
A=fracnumber(j,:);
|
||||
B=fracnumber(k,:);
|
||||
%将两个向量很可能都有的0去掉,这个0没有什么意义
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
[a,~]=find(matrixvsfra==j); [b,~]=find(matrixvsfra==k);
|
||||
if length(a)~=1
|
||||
heihei=1;
|
||||
end
|
||||
raoflag=intersect(A,B);
|
||||
if((size(raoflag,2)>2)||((size(raoflag,2)<2))) continue;%因为是凸多边形,因此只要代表裂缝网格的行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格,因为如果不是,则必有一个是凹多边形,矛盾,证毕;如果小于两个,则没有共有的边线
|
||||
else if (a==b) continue; %说明这两个裂缝单元在同一个基质网格中,因此不应该算在此类中
|
||||
else
|
||||
raoconnect(p,q)=k;q=q+1;
|
||||
lengthcat=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));%计算裂缝单元公共边长度
|
||||
rao1k=corevsfra(k,:)-d3intersection(raoflag(1),:);
|
||||
rao1j=corevsfra(j,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
%分别计算两裂缝单元中心到公共边的距离
|
||||
disk=norm(cross(rao1k',rao2'))/norm(rao2);
|
||||
disj=norm(cross(rao1j',rao2'))/norm(rao2);
|
||||
if kf(i)==0
|
||||
hartran=0;hartran_convection=0;
|
||||
kij = 0;
|
||||
else
|
||||
tran1=kf(i)*wf(i)*lengthcat/disk;
|
||||
tran2=kf(i)*wf(i)*lengthcat/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均
|
||||
hartran=tran1*tran2/(tran1+tran2);
|
||||
tran1_diff=wf(i)*lengthcat/disk;
|
||||
tran2_diff=wf(i)*lengthcat/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均
|
||||
hartran_diff=tran1_diff*tran2_diff/(tran1_diff+tran2_diff);
|
||||
% k_harmony= kf(i);
|
||||
hartran_convection=kf(i)/(disk+disj)^2;
|
||||
kij = 2*(Kf(j)^(-1)+Kf(k)^(-1))^(-1);
|
||||
end
|
||||
Nff=[Nff; j,k];
|
||||
Tff=[Tff;hartran];
|
||||
Tff_diff=[Tff_diff;hartran_diff];
|
||||
Tff_convection=[Tff_convection;hartran_convection];
|
||||
perm_ff = [perm_ff; kij];
|
||||
flowArea_ff = [flowArea_ff; wf(i)*lengthcat];
|
||||
%计算出每个裂缝网格重心到每条边的距离
|
||||
end
|
||||
end
|
||||
p=p+1;
|
||||
end
|
||||
connect_infrac{i,1}=raoconnect;
|
||||
end
|
||||
end
|
||||
Nff(1,:)=[]; %去除第一行的零行
|
||||
Tff(1,:)=[];
|
||||
Tff_convection(1,:)=[];
|
||||
Tff_diff(1,:)=[];
|
||||
perm_ff(1,:)=[];
|
||||
flowArea_ff(1,:)=[];
|
||||
%% 在同一基质网格中的裂缝单元连接情况及传导率计算
|
||||
nmc=size(matrixvsfra,1);
|
||||
Nmff=zeros(1,2);
|
||||
Tmff=zeros(1,1);
|
||||
Tmff_diff=zeros(1,1);
|
||||
Tmff_convection=zeros(1,1);
|
||||
perm_mff=zeros(1,1);
|
||||
flowArea_mff=zeros(1,1);
|
||||
for i=1:nmc
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>1) %此时表明要采取下述的简化算法
|
||||
% lengthvsfra(matrixvsfra(i,indice))./disvsfra(matrixvsfra(i,indice))
|
||||
for j=1:n-1
|
||||
for k=(j+1):n
|
||||
Nmff=[Nmff;matrixvsfra(i,indice(j)), matrixvsfra(i,indice(k))];
|
||||
% 此时的计算方式是先求每个裂缝网格的算术平均,再算包含在该基质网格中的所有裂缝单元的算术平均
|
||||
fc1=matrixvsfra(i,indice(j)); fc2=matrixvsfra(i,indice(k));
|
||||
allfc=matrixvsfra(i,1:n); sumtran=sum(fcff{1,7}(allfc));sumtran_no_perm=sum(fcff{1,9}(allfc));
|
||||
if sumtran==0
|
||||
Tmff=[Tmff; 0];Tmff_convection=[Tmff_convection;0];
|
||||
Tmff_diff=[Tmff_diff;0];
|
||||
perm_mff=[perm_mff;0];flowArea_mff=[flowArea_mff;(avfracFaceArea(fc1)+avfracFaceArea(fc2))/2];
|
||||
else
|
||||
Tmff=[Tmff; fcff{1,7}(fc1)*fcff{1,7}(fc2)/sumtran];
|
||||
Tmff_diff=[Tmff_diff;fcff{1,9}(fc1)*fcff{1,9}(fc2)/sumtran_no_perm];
|
||||
perm_mff=[perm_mff;(Kf(fc1)^(-1)+Kf(fc2)^(-1))^(-1)];
|
||||
flowArea_mff=[flowArea_mff;(avfracFaceArea(fc1)+avfracFaceArea(fc2))/2];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Nmff(1,:)=[]; %去掉开头的零行
|
||||
Tmff(1,:)=[];
|
||||
% Tmff =Tmff*0;
|
||||
Tmff_convection(1,:)=[];
|
||||
Tmff_diff(1,:)=[];
|
||||
perm_mff(1,:)=[];
|
||||
flowArea_mff(1,:)=[];
|
||||
% N = [N; Nmff+nmc];
|
||||
% T = [T; Tmff];
|
||||
|
||||
%% 基质网格的连接情况及传导系数计算
|
||||
nmc= nx * ny*nz;%基质网格数目
|
||||
nfc=size(fracnumber,1);%裂缝单元数目
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
nmm = (nx-1)*ny*nz+(ny-1)*nx*nz+(nz-1)*nx*ny;%nmm是基质网格之间存在流体交换的总数
|
||||
% r.nf = nmm + nff;%nff是裂缝单元之间存在流体交换的总数
|
||||
Kx=kx.*ones(nmc,1);
|
||||
Ky=ky.*ones(nmc,1);
|
||||
Kz=kz.*ones(nmc,1);
|
||||
N = zeros(nmm, 2);%存储基质网格之间存在流体交换的网格编号
|
||||
T = zeros(nmm, 1);%存储对应与N矩阵的传导系数
|
||||
T_convection = zeros(nmm, 1);
|
||||
T_diff = zeros(nmm, 1);
|
||||
perm = zeros(nmm, 1);
|
||||
flowArea = zeros(nmm, 1);
|
||||
c = 0;
|
||||
for k= 1 : nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + 1;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)*NTG(index)*NTG(indexn)/(Kx(index)*dxv(indexn)*NTG(index) + Kx(indexn)*dxv(index)*NTG(indexn));
|
||||
T_convection(c) = 2/(1/Kx(index)+1/Kx(indexn))/(dxv(indexn)+dxv(index));
|
||||
perm(c)=2*Kx(index)*Kx(indexn)/(Kx(index) + Kx(indexn));
|
||||
T_diff(c)=dzv(index)*dyv(index)/(2/(1/dxv(indexn)+1/dxv(index)));
|
||||
flowArea(c)=dzv(index)*dyv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k= 1 : nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dxv(index)*Ky(index)*Ky(indexn)/(Ky(index)*dyv(indexn) + Ky(indexn)*dyv(index));
|
||||
T_convection(c) = 2/(1/Ky(index)+1/Ky(indexn))/(dyv(indexn)+dyv(index));
|
||||
perm(c)=2*Ky(index)*Ky(indexn)/(Ky(index) + Ky(indexn));
|
||||
T_diff(c)=dzv(index)*dxv(index)/(2/(1/dyv(indexn)+1/dyv(index)));
|
||||
flowArea(c)=dzv(index)*dxv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
for k= 1: nz-1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx * ny;
|
||||
N(c, :) = [index, index + nx*ny];
|
||||
T(c) = 2 * dxv(index)*dyv(index)*Kz(index)*Kz(indexn)/(Kz(index)*dzv(indexn) + Kz(indexn)*dzv(index));
|
||||
T_convection(c) = 2/(1/Kz(index)+1/Kz(indexn))/(dzv(indexn)+dzv(index));
|
||||
perm(c)=2*Kz(index)*Kz(indexn)/(Kz(index) + Kz(indexn));
|
||||
T_diff(c)=dxv(index)*dyv(index)/(2/(1/dzv(indexn)+1/dzv(index)));
|
||||
flowArea(c)=dxv(index)*dyv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
syms x y z;
|
||||
Ninterflow=[];
|
||||
Tinterflow=[];
|
||||
Tinterflow_convection=[];
|
||||
Tinterflow_diff=[];
|
||||
cell_divided_by_fracture_flag = [];
|
||||
perm_interflow=[];
|
||||
flowArea_interflow=[];
|
||||
for i=1:nx*ny*nz %基质网格编号
|
||||
flag = 0;
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
flag = flag + 1;
|
||||
Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
% kcell = sqrt(10*100)*1e-3;
|
||||
Knnc=kcell*Kf(matrixvsfra(i,j))/(kcell+Kf(matrixvsfra(i,j)));
|
||||
Annc=areavsfra(matrixvsfra(i,j));
|
||||
fracore=corevsfra(matrixvsfra(i,j),:);
|
||||
matnodes=nodes(i,:);
|
||||
verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
matcore=mean(verco);d0=matcore-fracore;
|
||||
dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% dn=abs(dn);%影响数值积分效率
|
||||
dn=sqrt(dn^2);
|
||||
dn=matlabFunction(dn);
|
||||
if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(2)~=0
|
||||
Dn=dzv(i)*NTG(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(3)~=0
|
||||
Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0
|
||||
Dn=dyv(i)*dzv(i)*NTG(i)*integral(dn,-dxv(i)/2,dxv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0
|
||||
Dn=dxv(i)*dzv(i)*NTG(i)*integral(dn,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(3)~=0
|
||||
Dn=dxv(i)*dyv(i)*integral(dn,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
% raoT=Knnc*Annc/Dn;
|
||||
% raoT_convection=2*Knnc/Dn^2;
|
||||
% Tinterflow=[Tinterflow;raoT];
|
||||
% Tinterflow_convection=[Tinterflow_convection;raoT_convection];
|
||||
raoT1 = 2*kcell*Annc/Dn;
|
||||
raoT2 = Kf(matrixvsfra(i,j))*Annc/(Wf(matrixvsfra(i,j))/2);
|
||||
raoT = (raoT1^-1+raoT2^-1)^-1;
|
||||
Tinterflow=[Tinterflow;raoT];
|
||||
raoT1_conv = kcell/Dn^2;
|
||||
raoT2_conv = Kf(matrixvsfra(i,j))/(Wf(matrixvsfra(i,j))/2)^2;
|
||||
raoT_convection = (raoT1_conv^-1+raoT2_conv^-1)^-1;
|
||||
Tinterflow_convection=[Tinterflow_convection;raoT_convection];
|
||||
Tinterflow_diff=[Tinterflow_diff;((2*Annc/Dn)^-1+(Annc/(Wf(matrixvsfra(i,j))/2))^-1)^-1;];
|
||||
perm_mf_this = kcell*Kf(matrixvsfra(i,j))/(kcell+Kf(matrixvsfra(i,j)));
|
||||
perm_interflow = [perm_interflow; perm_mf_this];
|
||||
flowArea_interflow = [flowArea_interflow; Annc];
|
||||
end
|
||||
end
|
||||
if flag >0
|
||||
cell_divided_by_fracture_flag = [cell_divided_by_fracture_flag; i];
|
||||
end
|
||||
end
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
% syms x y z;
|
||||
% Ninterflow=[];
|
||||
% Tinterflow=[];
|
||||
% for i=1:nx*ny*nz %基质网格编号
|
||||
% for j=1:10
|
||||
% if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
% Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
% kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
% K1=Kf(matrixvsfra(i,j));d1=Wf(matrixvsfra(i,j));
|
||||
% K2=kffl(matrixvsfra(i,j));d2=dffl(matrixvsfra(i,j));
|
||||
% Annc=2*areavsfra(matrixvsfra(i,j));
|
||||
% fracore=corevsfra(matrixvsfra(i,j),:);
|
||||
% matnodes=nodes(i,:);
|
||||
% verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
% matcore=mean(verco);d0=matcore-fracore;
|
||||
% dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% % dn=abs(dn);%影响数值积分效率
|
||||
% dn=sqrt(dn^2);
|
||||
% dn=matlabFunction(dn);
|
||||
% if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
% Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0 && norvec(2)~=0
|
||||
% Dn=dzv(i)*NTG(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0 && norvec(3)~=0
|
||||
% Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(2)~=0 && norvec(3)~=0
|
||||
% Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0
|
||||
% Dn=dyv(i)*dzv(i)*NTG(i)*integral(dn,-dxv(i)/2,dxv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(2)~=0
|
||||
% Dn=dxv(i)*dzv(i)*NTG(i)*integral(dn,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(3)~=0
|
||||
% Dn=dxv(i)*dyv(i)*integral(dn,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% raoT=((Kcell*Annc/(Dn-d2))^(-1)+(K2*Annc/d2)^(-1)+(K1*Annc/d1)^(-1))^(-1);
|
||||
% Tinterflow=[Tinterflow;raoT];
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
|
||||
%% 把上述三种情况的矩阵分别叠加起来
|
||||
matrixflag = [ones(size(T,1),1); zeros(size(Tmff,1),1); zeros(size(Tff,1),1); ones(size(Tinterflow,1),1);];
|
||||
N = [N; Nmff+nmc; Nff+nmc;Ninterflow;];
|
||||
T = [T; Tmff; Tff;Tinterflow;];
|
||||
T_convection = [T_convection;Tmff_convection; Tff_convection;Tinterflow_convection;];
|
||||
T_diff = [T_diff;Tmff_diff; Tff_diff;Tinterflow_diff;];
|
||||
perm = [perm; perm_mff; perm_ff;perm_interflow; ];
|
||||
flowArea = [flowArea; flowArea_mff; flowArea_ff;flowArea_interflow;];
|
||||
%
|
||||
% deleted_rows = [];
|
||||
% for i = 1:size(N,1)
|
||||
% if ismember(N(i,1),invalid_grids) || ismember(N(i,2),invalid_grids)
|
||||
% deleted_rows = [deleted_rows; i];
|
||||
% end
|
||||
% end
|
||||
% N(deleted_rows,:) = [];
|
||||
% T(deleted_rows,:) = 0;
|
||||
% T_convection(deleted_rows,:) = 0;
|
||||
% T_diff(deleted_rows,:) = 0;
|
||||
% perm(deleted_rows,:) = 0;
|
||||
% flowArea(deleted_rows,:) = 0;
|
||||
% nex=size(N,1);
|
||||
%% 转到CMG或者ECLIPSE进行计算
|
||||
% [ Data_for_ECLIPSE ] = pEDFM_to_CMG_horizontalFractureWell(dxv,dyv,dzv,kx,ky,kz,pori,Kf,Wf,vf,porf,N,T);
|
||||
% [ Data_for_ECLIPSE ] = pEDFM_to_CMG_horizontalFractureWell_net_pay(dxv,dyv,dzv,kx,ky,kz,pori,Kf,Wf,vf,porf,N,T);
|
||||
end
|
||||
@@ -0,0 +1,701 @@
|
||||
function [ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac,N,T,zf,fcinff,vf,porf,fcff] = connections_PEDFM( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,kf,wf,Porf,dxv,dyv,dzv,coord,nodes,NTG,addflag )
|
||||
% 该函数用以给裂缝面网格编号,并存储网格间的连接关系及传导率,是前处理的关键步骤
|
||||
% 不同于二维嵌入式离散裂缝模型,三维模型中,裂缝是二维平面,网格之间连接关系复杂,
|
||||
%不能简单得从基质网格来判定,若所处基质网格不相邻,则裂缝网格必不相邻,若所处基质网格相邻,裂缝网格却不一定相邻
|
||||
%上述原则无助于我们去确定connections,故拟采取以下方案:
|
||||
%第一步:按照xink矩阵去掉零行后,按照行数依次给某裂缝面网格编号,同时存储裂缝网格所在的基质网格序号
|
||||
%第二步:存储每个裂缝网格的面积,边界,边界长度,中心点坐标,中心点到各边界的距离,为后续操作做准备
|
||||
%第三步:按照裂缝网格序号顺序,按照边界进行搜索,如果有相同的边界,则两个裂缝网格是相邻的
|
||||
%matrixvsfra矩阵代表基质网格中包含裂缝网格编号的情况
|
||||
%fracnumber矩阵,行序号表示该裂缝网格编号,行内容表示该网格包含的点序号
|
||||
%areavsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的面积
|
||||
%每相邻两列是一条边,然后将顺序反过来,又是两列一条边
|
||||
%lengthvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的各边长度
|
||||
%corevsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心坐标
|
||||
%disvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心到各边的距离
|
||||
matrixvsfra=zeros(nx*ny*nz,10);%为了减少该矩阵的大小,考虑实际情况,一个基质网格中,一般不会有超过10个裂缝网格
|
||||
fracnumber=zeros(1000,20);%根据实际情况,裂缝网格一般不会超过1000个,也可根据实际情况改变
|
||||
%m=size(xink,1);
|
||||
rownum=zeros(nf,1);
|
||||
for i=1:nf
|
||||
rownum(i)=size(fracturemesh{i,1},1);
|
||||
end
|
||||
%% 将所有裂缝面网格连起来一起编号,并将编号扔给相应的基质网格
|
||||
q=1;
|
||||
fracstart=zeros(nf+1,1);%这个表示在总编号中,每条裂缝起始的号码
|
||||
for j=1:nf
|
||||
fracstart(j)=q;
|
||||
numofmesh=pointvsregion{j,1};
|
||||
for i=1:1:rownum(j)
|
||||
if(norm(fracturemesh{j,1}(i,:))~=0)
|
||||
raoindice=size(fracturemesh{j,1}(i,:),2);
|
||||
fracnumber(q,1:raoindice)=fracturemesh{j,1}(i,:);%q即是该裂缝编号
|
||||
m=floor((i+(2^addflag(j)-1))/(2^addflag(j)));
|
||||
indice=find(matrixvsfra(numofmesh(m),:)~=0);
|
||||
% indice=find(matrixvsfra(numofmesh(i),:)~=0);
|
||||
if (size(indice,2)==0) xiang=1;
|
||||
else
|
||||
rao=max(indice');
|
||||
xiang=rao(1)+1;
|
||||
end
|
||||
matrixvsfra(numofmesh(m),xiang)=q;%将裂缝编号附给相应的基质网格
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
fracstart(nf+1)=q;%裂缝网格总数量+1
|
||||
fracnumber(q:1000,:)=[];
|
||||
|
||||
|
||||
%% 将包含有裂缝单元的基质网格筛选出来,并进行处理
|
||||
m=size(matrixvsfra,1);
|
||||
connectmf=cell(1,4);
|
||||
% for i=1:m
|
||||
% if (norm(matrixvsfra(i,:))~=0)
|
||||
% ConnecS = cell(1,4);
|
||||
cc = 0;
|
||||
cl = 1;
|
||||
for i = 1 : m
|
||||
%筛选出包含裂缝的基质网格
|
||||
% if ~isempty(matrixvsfra(i,:))
|
||||
if (norm(matrixvsfra(i,:)))~=0
|
||||
cc = cc + 1;
|
||||
%存储该基质网格编号
|
||||
connectmf{cc,1} = i;
|
||||
%给这些裂缝点/裂缝单元按顺序编号
|
||||
A=matrixvsfra(i,:);
|
||||
A(A==0)=[];
|
||||
connectmf{cc,2} =A;
|
||||
end
|
||||
end
|
||||
|
||||
%% 一条条裂缝计算裂缝网格面积、边界等等
|
||||
% edgevsfra=cell(nf,1);
|
||||
normalvec=zeros(q-1,3);%unit 法向量
|
||||
areavsfra=zeros(q-1,1);%q-1即裂缝网格总数
|
||||
lengthvsfra=zeros(q-1,10);
|
||||
Kf=zeros(q-1,10);%裂缝网格渗透率
|
||||
Wf=zeros(q-1,10);%裂缝单元缝宽
|
||||
corevsfra=zeros(q-1,3);
|
||||
disvsfra=zeros(q-1,10);
|
||||
tran=zeros(q-1,10);
|
||||
avtran=zeros(q-1,1);%裂缝网格平均传导,用于后续的简化计算
|
||||
fcinff=zeros(q-1,1);%表示裂缝单元所在的裂缝面序号
|
||||
zf=zeros(q-1,1);%裂缝单元高度(以下表面为基准)
|
||||
vf=zeros(q-1,1);%裂缝单元的体积
|
||||
porf=zeros(q-1,1);%裂缝单元的孔隙度
|
||||
for i=1:1:q-1 %对裂缝网格进行操作
|
||||
if(norm(fracnumber(i,:))==0) break;
|
||||
else
|
||||
for k=2:(nf+1)
|
||||
if(i<fracstart(k)) fcinff(i)=k-1; break;%判断该点处在哪个裂缝平面上,k-1号裂缝面
|
||||
end
|
||||
end
|
||||
d3intersection=raopoint{k-1,1};
|
||||
anothersection=raopoint{k-1,2};
|
||||
fraindice=find(fracnumber(i,:)~=0);
|
||||
rx=size(fraindice,2);
|
||||
for j=1:1:(rx-1)
|
||||
%edgevsfra(i,(4*j-3):(4*j))=[fracnumber(i,j),fracnumber(i,j+1),fracnumber(i,j+1),fracnumber(i,j)];%完成对edgevsfra矩阵赋值
|
||||
%%因为是凸多边形,因此只要代表裂缝网格的两个行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格;如果小于两个,则没有共有的边线
|
||||
normalvec(i,:)=cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:))/norm(cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:)));
|
||||
areavsfra(i)=area(anothersection(fracnumber(i,1:(rx-1))',:) ,f(5*(k-1)-3,:),f(5*(k-1)-2,:) );%计算出每个裂缝网格的面积
|
||||
vf(i)=areavsfra(i)*wf(k-1);
|
||||
porf(i)=Porf(k-1);
|
||||
Wf(i,1)=wf(k-1);
|
||||
Kf(i,1)=kf(k-1);
|
||||
lengthvsfra(i,j)=norm(d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:));%计算裂缝网格每条边的长度
|
||||
corevsfra(i,:)=1/(rx-1)*d3intersection(fracnumber(i,j),:)+corevsfra(i,:);%计算每个裂缝网格重心的坐标
|
||||
zf(i)=corevsfra(i,3);%裂缝网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
rao1=corevsfra(i,:)-d3intersection(fracnumber(i,j),:);
|
||||
rao2=d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:);
|
||||
disvsfra(i,j)=norm(cross(rao1',rao2'))/norm(rao2);%计算出每个裂缝网格重心到每条边的距离
|
||||
tran(i,j)=kf(k-1)*wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
end
|
||||
avtran(i)=sum(tran(i,:))/(rx-1);
|
||||
end
|
||||
end
|
||||
|
||||
% %% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
% fcff=cell(1,8);
|
||||
% fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
%% 为了防止出现某裂缝网格面积相对过小,引起计算出错,故将面积很小的裂缝网格给去掉
|
||||
maxarea=max(areavsfra,2);
|
||||
% minlength=min(lengthvsfra,[],2);
|
||||
% maxlength=max(lengthvsfra,[],2);
|
||||
newnum=zeros(q-1,1);
|
||||
[deindex1,~]=find(areavsfra<0*maxarea);
|
||||
deindex2=[];
|
||||
for i=1:(q-1)
|
||||
zeroindex=find(lengthvsfra(i,:)~=0);
|
||||
minlength=min(lengthvsfra(i,zeroindex));
|
||||
maxlength=max(lengthvsfra(i,:));
|
||||
if minlength<0*maxlength
|
||||
deindex2=[deindex2;i];
|
||||
end
|
||||
end
|
||||
deindex=[deindex1;deindex2];
|
||||
deindex=unique(deindex);
|
||||
deindex=sort(deindex);
|
||||
hui=length(deindex);
|
||||
if hui>0
|
||||
for i=1:(q-1)
|
||||
[dogindex,~]=find(deindex==i);
|
||||
if length(dogindex)~=0
|
||||
newnum(i)=0;
|
||||
else
|
||||
[catindex,~]=find(deindex<i);
|
||||
rao=length(catindex);
|
||||
newnum(i)=i-rao;
|
||||
end
|
||||
end
|
||||
fracnumber(deindex,:)=[];
|
||||
fcinff(deindex,:)=[];
|
||||
lengthvsfra(deindex,:)=[];
|
||||
corevsfra(deindex,:)=[];
|
||||
disvsfra(deindex,:)=[];
|
||||
tran(deindex,:)=[];
|
||||
avtran(deindex,:)=[];
|
||||
areavsfra(deindex,:)=[];
|
||||
zf(deindex,:)=[];
|
||||
vf(deindex,:)=[];
|
||||
porf(deindex,:)=[];
|
||||
% change matrixvsfra
|
||||
for i=1:m%matrixvsfra矩阵的行数
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0
|
||||
matrixvsfra(i,j)=newnum(matrixvsfra(i,j));
|
||||
end
|
||||
end
|
||||
end
|
||||
% change fracstart
|
||||
fracstart(nf+1,1)=length(fracnumber)+1;
|
||||
for i=1:nf
|
||||
[daiindex,~]=find(deindex<fracstart(i,1));
|
||||
dai=length(daiindex);
|
||||
fracstart(i)=fracstart(i)-dai;
|
||||
end
|
||||
|
||||
end
|
||||
%% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
fcff=cell(1,8);
|
||||
fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
%% 裂缝单元的连接情况
|
||||
|
||||
%% 在同一裂缝面上,裂缝单元的连接情况及传导率计算(不包含在同一基质网格中的相邻裂缝单元)
|
||||
connect_infrac=cell(nf,1);
|
||||
Nff=zeros(1,2); %记录同一裂缝面上的网格相邻情况,第一列和第二列分别是相邻网格的编号
|
||||
Tff=zeros(1,1); %记录相应的传导系数
|
||||
for i=1:nf
|
||||
p=1;
|
||||
raoconnect=zeros(fracstart(i+1)-fracstart(i),10);%一般来说,裂缝网格不超过10条边
|
||||
d3intersection=raopoint{i,1};
|
||||
anothersection=raopoint{i,2};
|
||||
for j=fracstart(i):((fracstart(i+1)-1)-1)%第i条裂缝的编号范围
|
||||
q=1;
|
||||
for k=j:(fracstart(i+1)-1)
|
||||
A=fracnumber(j,:);
|
||||
B=fracnumber(k,:);
|
||||
%将两个向量很可能都有的0去掉,这个0没有什么意义
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
[a,~]=find(matrixvsfra==j); [b,~]=find(matrixvsfra==k);
|
||||
if length(a)~=1
|
||||
heihei=1;
|
||||
end
|
||||
raoflag=intersect(A,B);
|
||||
if((size(raoflag,2)>2)||((size(raoflag,2)<2))) continue;%因为是凸多边形,因此只要代表裂缝网格的行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格,因为如果不是,则必有一个是凹多边形,矛盾,证毕;如果小于两个,则没有共有的边线
|
||||
else if (a==b) continue; %说明这两个裂缝单元在同一个基质网格中,因此不应该算在此类中
|
||||
else
|
||||
raoconnect(p,q)=k;q=q+1;
|
||||
lengthcat=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));%计算裂缝单元公共边长度
|
||||
rao1k=corevsfra(k,:)-d3intersection(raoflag(1),:);
|
||||
rao1j=corevsfra(j,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
%分别计算两裂缝单元中心到公共边的距离
|
||||
disk=norm(cross(rao1k',rao2'))/norm(rao2);
|
||||
disj=norm(cross(rao1j',rao2'))/norm(rao2);
|
||||
if Kf(j)==0 || Kf(k)==0
|
||||
hartran=0;
|
||||
else
|
||||
tran1=Kf(j)*wf(i)*lengthcat/disk;
|
||||
tran2=Kf(k)*wf(i)*lengthcat/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均的一半
|
||||
hartran=tran1*tran2/(tran1+tran2);
|
||||
end
|
||||
Nff=[Nff; j,k];
|
||||
Tff=[Tff;hartran];
|
||||
%计算出每个裂缝网格重心到每条边的距离
|
||||
end
|
||||
end
|
||||
p=p+1;
|
||||
end
|
||||
connect_infrac{i,1}=raoconnect;
|
||||
end
|
||||
end
|
||||
Nff(1,:)=[]; %去除第一行的零行
|
||||
Tff(1,:)=[];
|
||||
%% 在同一基质网格中的裂缝单元连接情况及传导率计算
|
||||
nmc=size(matrixvsfra,1);
|
||||
Nmff=zeros(1,2);
|
||||
Tmff=zeros(1,1);
|
||||
for i=1:nmc
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>1) %此时表明要采取下述的简化算法
|
||||
% lengthvsfra(matrixvsfra(i,indice))./disvsfra(matrixvsfra(i,indice))
|
||||
for j=1:n-1
|
||||
for k=(j+1):n
|
||||
Nmff=[Nmff;matrixvsfra(i,indice(j)), matrixvsfra(i,indice(k))];
|
||||
% 此时的计算方式是先求每个裂缝网格的算术平均,再算包含在该基质网格中的所有裂缝单元的算术平均
|
||||
fc1=matrixvsfra(i,indice(j)); fc2=matrixvsfra(i,indice(k));
|
||||
allfc=matrixvsfra(i,1:n); sumtran=sum(fcff{1,7}(allfc));
|
||||
if sumtran==0 Tmff=[Tmff; 0];
|
||||
else
|
||||
Tmff=[Tmff; fcff{1,7}(fc1)*fcff{1,7}(fc2)/sumtran];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Nmff(1,:)=[]; %去掉开头的零行
|
||||
Tmff(1,:)=[];
|
||||
% N = [N; Nmff+nmc];
|
||||
% T = [T; Tmff];
|
||||
|
||||
%% 基质网格的连接情况及传导系数计算
|
||||
nmc=nx * ny*nz;%基质网格数目
|
||||
nfc=size(fracnumber,1);%裂缝单元数目
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
nmm = (nx-1)*ny*nz+(ny-1)*nx*nz+(nz-1)*nx*ny;%nmm是基质网格之间存在流体交换的总数
|
||||
% r.nf = nmm + nff;%nff是裂缝单元之间存在流体交换的总数
|
||||
S_ex=zeros(nmm,1);% 流体交换面面积
|
||||
|
||||
Kx=kx.*ones(nmc,1);
|
||||
Ky=ky.*ones(nmc,1);
|
||||
Kz=kz.*ones(nmc,1);
|
||||
N = zeros(nmm, 2);%存储基质网格之间存在流体交换的网格编号
|
||||
T = zeros(nmm, 1);%存储对应与N矩阵的传导系数
|
||||
c = 0;
|
||||
for k= 1 : nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + 1;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)*NTG(index)*NTG(indexn)/(Kx(index)*dxv(indexn)*NTG(index) + Kx(indexn)*dxv(index)*NTG(indexn));
|
||||
% 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)/(Kx(index)*dxv(indexn) + Kx(indexn)*dxv(index));
|
||||
S_ex(c)=dzv(index)*dyv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k= 1 : nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dxv(index)*Ky(index)*Ky(indexn)/(Ky(index)*dyv(indexn) + Ky(indexn)*dyv(index));
|
||||
S_ex(c)=dzv(index)*dxv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
for k= 1: nz-1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx * ny;
|
||||
N(c, :) = [index, index + nx*ny];
|
||||
T(c) = 2 * dxv(index)*dyv(index)*Kz(index)*Kz(indexn)/(Kz(index)*dzv(indexn) + Kz(indexn)*dzv(index));
|
||||
S_ex(c)=dxv(index)*dyv(index);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
syms x y z;
|
||||
Ninterflow=[];
|
||||
Tinterflow=[];
|
||||
for i=1:nx*ny*nz %基质网格编号
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
Knnc=kcell*Kf(matrixvsfra(i,j))/(kcell+Kf(matrixvsfra(i,j)));
|
||||
Annc=areavsfra(matrixvsfra(i,j));% 此处与原始嵌入式不一样,原始是两倍
|
||||
fracore=corevsfra(matrixvsfra(i,j),:);
|
||||
matnodes=nodes(i,:);
|
||||
verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
matcore=mean(verco);d0=matcore-fracore;
|
||||
dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% dn=abs(dn);%影响数值积分效率
|
||||
dn=sqrt(dn^2);
|
||||
dn=matlabFunction(dn);
|
||||
if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(2)~=0
|
||||
Dn=dzv(i)*NTG(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(3)~=0
|
||||
Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0
|
||||
Dn=dyv(i)*dzv(i)*NTG(i)*integral(dn,-dxv(i)/2,dxv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0
|
||||
Dn=dxv(i)*dzv(i)*NTG(i)*integral(dn,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(3)~=0
|
||||
Dn=dxv(i)*dyv(i)*integral(dn,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
% 为论文做修改
|
||||
% Dn=0.9;
|
||||
% Dn=2.5;
|
||||
Dn=dxv(i)/2;
|
||||
raoT=Knnc*Annc/Dn;
|
||||
Tinterflow=[Tinterflow;raoT];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 投影嵌入式处理
|
||||
nmc = size(matrixvsfra,1);
|
||||
%基质网格流体交换面上的裂缝单元投影面之和
|
||||
S_p=zeros(nmm,1);
|
||||
% 因为投影处理新加的F-M connections
|
||||
Nmf_projection=[];
|
||||
Tmf_projection=[];
|
||||
for i=1:nmc
|
||||
matnodes=nodes(i,:);
|
||||
dx_grid=dxv(i);
|
||||
dy_grid=dyv(i);
|
||||
dz_grid=dzv(i);
|
||||
grid_core=mean(coord(matnodes,:));%该基质网格中心
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>=1) %先仅考虑n=1时的情况
|
||||
selected_face=zeros(1,3);
|
||||
the_frac_cells=matrixvsfra(i,indice);%该裂缝单元编号
|
||||
for haihaihai = 1:length(the_frac_cells)
|
||||
the_frac_cell = the_frac_cells(haihaihai);
|
||||
which_frac=fcff{1,2}(the_frac_cell,1);%该裂缝单元所在的裂缝面
|
||||
core_frac_cell=fcff{1,4}(the_frac_cell,1:3);%该裂缝单元的中心坐标
|
||||
area_frac_cell=fcff{1,8}(the_frac_cell,1);%该裂缝单元面积
|
||||
rao_struct=[i,the_frac_cell+nmc];
|
||||
pos_rao=find_row(rao_struct,Ninterflow);
|
||||
D_value=core_frac_cell-grid_core;% 向量OF
|
||||
vector_1=f(5*which_frac-3,:);
|
||||
vector_2=f(5*which_frac-2,:);
|
||||
n_vector_1=cross(vector_1,vector_2);
|
||||
n_vector_2=-cross(vector_1,vector_2);
|
||||
if (dot(n_vector_1,D_value))>=0
|
||||
n_vector=n_vector_1;
|
||||
else
|
||||
n_vector=n_vector_2;
|
||||
end
|
||||
%该裂缝面法向量
|
||||
% x方向投影面积
|
||||
area_frac_cell_x=abs(area_frac_cell*dot([1,0,0],n_vector)/norm(n_vector));
|
||||
area_frac_cell_y=abs(area_frac_cell*dot([0,1,0],n_vector)/norm(n_vector));
|
||||
area_frac_cell_z=abs(area_frac_cell*dot([0,0,1],n_vector)/norm(n_vector));
|
||||
% %% 为valid case修改
|
||||
% area_frac_cell_x=10*10;
|
||||
% area_frac_cell_y=10*10;
|
||||
% area_frac_cell_z=10*10;
|
||||
%将裂缝中心沿法向量做微小平移,此时再按照距离最近原则判断,可以保证得到符合物理意义的情况
|
||||
new_core=core_frac_cell+1e-4*n_vector;
|
||||
% 裂缝单元中心相对于基质网格中心的向矢
|
||||
%x direction
|
||||
D_value_new=new_core-grid_core;
|
||||
if D_value_new(1)<=0
|
||||
selected_face(1)=3;nei_grid_x=i-1;
|
||||
else selected_face(1)=4; nei_grid_x=i+1;
|
||||
end
|
||||
%% ----------------------% 为了做测试实用型pEDFM,人为加处理--------------------------------------
|
||||
% 为了做测试实用型pEDFM,人为加处理
|
||||
% selected_face(1)=4; nei_grid_x=i+1;
|
||||
%% ----------------------% 人为处理结束---------------------------------------------------------------
|
||||
struc_x=[i,nei_grid_x];
|
||||
pos=find_row(struc_x,N);
|
||||
if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
S_p(pos)=S_p(pos)+area_frac_cell_x;
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
knei=(kx(nei_grid_x)*ky(nei_grid_x)*kz(nei_grid_x))^(1/3);%相邻那个基质网格渗透率
|
||||
added_matnodes=nodes(nei_grid_x,:);
|
||||
nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% T_added=Knnc*area_frac_cell_x/dis_added;
|
||||
% 采用另一种方式计算几何因子
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
dis_added=abs(sum((nei_grid_core-core_frac_cell).*[1,0,0],2));
|
||||
if Kf(the_frac_cell)==0
|
||||
T_added=0;
|
||||
else
|
||||
% 单独裂缝单元几何因子
|
||||
Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% 单独相邻基质网格向裂缝单元几何因子
|
||||
Geofnei=knei*area_frac_cell_x/dis_added;
|
||||
% 单独该基质网格向裂缝单元几何因子
|
||||
Geofcell=Tinterflow(pos_rao,1);
|
||||
T_added=1/(1/Geofnei+1/Geof);
|
||||
% T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% T_added=1/(1/Geofcell+1/Geof);
|
||||
% T_added=0;%特殊情况
|
||||
% T_added=0;%特殊情况
|
||||
% T_added=0.0039604;%特殊情况
|
||||
end
|
||||
Nmf_projection=[Nmf_projection;nei_grid_x,the_frac_cell+nmc];
|
||||
Tmf_projection=[Tmf_projection;T_added];
|
||||
end
|
||||
|
||||
%y direction
|
||||
if D_value_new(2)<=0
|
||||
selected_face(2)=2;nei_grid_y=i-nx;
|
||||
else selected_face(2)=5;nei_grid_y=i+nx;
|
||||
end
|
||||
%% ----------------------% 为了做测试实用型pEDFM,人为加处理--------------------------------------
|
||||
% 为了做测试实用型pEDFM,人为加处理
|
||||
% selected_face(2)=5; nei_grid_y=i+nx;
|
||||
%% ----------------------% 人为处理结束---------------------------------------------------------------
|
||||
struc_y=[i,nei_grid_y];
|
||||
pos=find_row(struc_y,N);
|
||||
if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
S_p(pos)=S_p(pos)+area_frac_cell_y;
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
knei=(kx(nei_grid_y)*ky(nei_grid_y)*kz(nei_grid_y))^(1/3);%相邻那个基质网格渗透率
|
||||
added_matnodes=nodes(nei_grid_y,:);
|
||||
nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% T_added=Knnc*area_frac_cell_y/dis_added;
|
||||
% 采用另一种方式计算几何因子
|
||||
dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
if Kf(the_frac_cell)==0
|
||||
T_added=0;
|
||||
else
|
||||
% 单独裂缝单元几何因子
|
||||
Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% 单独相邻基质网格向裂缝单元几何因子
|
||||
Geofnei=knei*area_frac_cell_y/dis_added;
|
||||
% 单独该基质网格向裂缝单元几何因子
|
||||
Geofcell=Tinterflow(pos_rao,1);
|
||||
|
||||
T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% T_added=0;%特殊情况
|
||||
% T_added=0.002;%特殊情况
|
||||
% T_added=0.0039604;%特殊情况
|
||||
end
|
||||
Nmf_projection=[Nmf_projection;nei_grid_y,the_frac_cell+nmc];
|
||||
Tmf_projection=[Tmf_projection;T_added];
|
||||
end
|
||||
|
||||
|
||||
% z direction
|
||||
if D_value_new(3)<=0
|
||||
selected_face(3)=1;nei_grid_z=i-nx*ny;
|
||||
else selected_face(3)=6;nei_grid_z=i+nx*ny;
|
||||
end
|
||||
%% ----------------------% 为了做测试实用型pEDFM,人为加处理--------------------------------------
|
||||
% 为了做测试实用型pEDFM,人为加处理
|
||||
selected_face(3)=6;nei_grid_z=i+nx*ny;
|
||||
%% ----------------------% 人为处理结束---------------------------------------------------------------
|
||||
% nei_grid_z=i-nx*ny;
|
||||
struc_z=[i,nei_grid_z];
|
||||
pos=find_row(struc_z,N);
|
||||
if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
S_p(pos)=S_p(pos)+area_frac_cell_z;
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
knei=(kx(nei_grid_z)*ky(nei_grid_z)*kz(nei_grid_z))^(1/3);%相邻那个基质网格渗透率
|
||||
added_matnodes=nodes(nei_grid_z,:);
|
||||
nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% T_added=Knnc*area_frac_cell_z/dis_added;
|
||||
% 采用另一种方式计算几何因子
|
||||
dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
if Kf(the_frac_cell)==0
|
||||
T_added=0;
|
||||
else
|
||||
% 单独裂缝单元几何因子
|
||||
Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% 单独相邻基质网格向裂缝单元几何因子
|
||||
Geofnei=knei*area_frac_cell_z/dis_added;
|
||||
% 单独该基质网格向裂缝单元几何因子
|
||||
Geofcell=Tinterflow(pos_rao,1);
|
||||
|
||||
T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% T_added=0;%特殊情况
|
||||
% T_added=0.0;%特殊情况
|
||||
% T_added=0.0039604;%特殊情况
|
||||
end
|
||||
Nmf_projection=[Nmf_projection;nei_grid_z,the_frac_cell+nmc];
|
||||
Tmf_projection=[Tmf_projection;T_added];
|
||||
end
|
||||
% %% 例二添加的
|
||||
% if D_value_new(1)>0
|
||||
% selected_face(1)=3;nei_grid_x=i-1;
|
||||
% else selected_face(1)=4; nei_grid_x=i+1;
|
||||
% end
|
||||
% struc_x=[i,nei_grid_x];
|
||||
% pos=find_row(struc_x,N);
|
||||
% if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
% S_p(pos)=S_p(pos)+area_frac_cell_x;
|
||||
% kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
% knei=(kx(nei_grid_x)*ky(nei_grid_x)*kz(nei_grid_x))^(1/3);%相邻那个基质网格渗透率
|
||||
% added_matnodes=nodes(nei_grid_x,:);
|
||||
% nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% % Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% % dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% % T_added=Knnc*area_frac_cell_x/dis_added;
|
||||
% % 采用另一种方式计算几何因子
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% if Kf(the_frac_cell)==0
|
||||
% T_added=0;
|
||||
% else
|
||||
% % 单独裂缝单元几何因子
|
||||
% Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% % 单独相邻基质网格向裂缝单元几何因子
|
||||
% Geofnei=knei*area_frac_cell_x/dis_added;
|
||||
% % 单独该基质网格向裂缝单元几何因子
|
||||
% Geofcell=Tinterflow(pos_rao,1);
|
||||
%
|
||||
% T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% % T_added=0;%特殊情况
|
||||
% % T_added=0;%特殊情况
|
||||
% % T_added=0.0039604;%特殊情况
|
||||
% end
|
||||
% Nmf_projection=[Nmf_projection;nei_grid_x,the_frac_cell+nmc];
|
||||
% Tmf_projection=[Tmf_projection;T_added];
|
||||
% end
|
||||
%
|
||||
% %y direction
|
||||
% if D_value_new(2)>0
|
||||
% selected_face(1)=2;nei_grid_y=i-nx;
|
||||
% else selected_face(1)=5;nei_grid_y=i+nx;
|
||||
% end
|
||||
% struc_y=[i,nei_grid_y];
|
||||
% pos=find_row(struc_y,N);
|
||||
% if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
% S_p(pos)=S_p(pos)+area_frac_cell_y;
|
||||
% kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
% knei=(kx(nei_grid_y)*ky(nei_grid_y)*kz(nei_grid_y))^(1/3);%相邻那个基质网格渗透率
|
||||
% added_matnodes=nodes(nei_grid_y,:);
|
||||
% nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% % Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% % dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% % T_added=Knnc*area_frac_cell_y/dis_added;
|
||||
% % 采用另一种方式计算几何因子
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% if Kf(the_frac_cell)==0
|
||||
% T_added=0;
|
||||
% else
|
||||
% % 单独裂缝单元几何因子
|
||||
% Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% % 单独相邻基质网格向裂缝单元几何因子
|
||||
% Geofnei=knei*area_frac_cell_y/dis_added;
|
||||
% % 单独该基质网格向裂缝单元几何因子
|
||||
% Geofcell=Tinterflow(pos_rao,1);
|
||||
%
|
||||
% T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% % T_added=0;%特殊情况
|
||||
% % T_added=0.002;%特殊情况
|
||||
% % T_added=0.0039604;%特殊情况
|
||||
% end
|
||||
% Nmf_projection=[Nmf_projection;nei_grid_y,the_frac_cell+nmc];
|
||||
% Tmf_projection=[Tmf_projection;T_added];
|
||||
% end
|
||||
%
|
||||
%
|
||||
% % z direction
|
||||
% if D_value_new(3)>0
|
||||
% selected_face(1)=1;nei_grid_z=i-nx*ny;
|
||||
% else selected_face(1)=6;nei_grid_z=i+nx*ny;
|
||||
% end
|
||||
% % nei_grid_z=i-nx*ny;
|
||||
% struc_z=[i,nei_grid_z];
|
||||
% pos=find_row(struc_z,N);
|
||||
% if size(pos,1)==1 %说明需要削减这两个基质网格间的传导系数
|
||||
% S_p(pos)=S_p(pos)+area_frac_cell_z;
|
||||
% kcell=(kx(i)*ky(i)*kz(i))^(1/3);%基质网格渗透率
|
||||
% knei=(kx(nei_grid_z)*ky(nei_grid_z)*kz(nei_grid_z))^(1/3);%相邻那个基质网格渗透率
|
||||
% added_matnodes=nodes(nei_grid_z,:);
|
||||
% nei_grid_core=mean(coord(added_matnodes,:));%该基质网格中心
|
||||
% % Knnc=2*kcell*Kf(the_frac_cell)/(kcell+Kf(the_frac_cell));%调和平均后
|
||||
% % dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% % T_added=Knnc*area_frac_cell_z/dis_added;
|
||||
% % 采用另一种方式计算几何因子
|
||||
% dis_added=norm(nei_grid_core-core_frac_cell);
|
||||
% if Kf(the_frac_cell)==0
|
||||
% T_added=0;
|
||||
% else
|
||||
% % 单独裂缝单元几何因子
|
||||
% Geof=Kf(the_frac_cell)*area_frac_cell/(Wf(the_frac_cell)/2);
|
||||
% % 单独相邻基质网格向裂缝单元几何因子
|
||||
% Geofnei=knei*area_frac_cell_z/dis_added;
|
||||
% % 单独该基质网格向裂缝单元几何因子
|
||||
% Geofcell=Tinterflow(pos_rao,1);
|
||||
%
|
||||
% T_added=1/(1/Geofnei+1/Geofcell+1/Geof);
|
||||
% % T_added=0;%特殊情况
|
||||
% % T_added=0.0;%特殊情况
|
||||
% % T_added=0.0039604;%特殊情况
|
||||
% end
|
||||
% Nmf_projection=[Nmf_projection;nei_grid_z,the_frac_cell+nmc];
|
||||
% Tmf_projection=[Tmf_projection;T_added];
|
||||
% end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 额外添加的改进
|
||||
im_N=[];
|
||||
im_T=[];
|
||||
% q=length(Kf)+1;
|
||||
% for i=1:(q-1)/2%q-1是裂缝单元数量
|
||||
% for j=(q-1)/2+1:(q-1)
|
||||
% if abs(corevsfra(j,1)-corevsfra(i,1))<=1e-2
|
||||
% im_N=[im_N;i+nmc,j+nmc];
|
||||
% % im_T=[im_T;0];
|
||||
% im_T=[im_T;0.0039604];
|
||||
% % im_T=[im_T;(((Kf(i))^(-1)+(1e-3)^(-1)+(1e-3)^(-1)+(Kf(j))^(-1))/4)^(-1)*2*2/0.4];
|
||||
% %
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
%% 用投影面积修正基质网格间传导
|
||||
for i=1:nmm
|
||||
% 为避免数值误差,导致没有真正封堵住,故
|
||||
if (S_ex(i)-S_p(i))/S_ex(i)<=1e-2
|
||||
T(i)=0;
|
||||
else
|
||||
T(i)= T(i)*(S_ex(i)-S_p(i))/S_ex(i);
|
||||
end
|
||||
end
|
||||
%% 把上述三种情况的矩阵分别叠加起来
|
||||
N = [N; Nmff+nmc; Nff+nmc;Ninterflow;Nmf_projection;im_N];
|
||||
T = [T; Tmff; Tff;Tinterflow;Tmf_projection;im_T];
|
||||
% N = [N; Nmff+nmc; Nff+nmc;Ninterflow;Nmf_projection];
|
||||
% T = [T; Tmff; Tff;Tinterflow;Tmf_projection];
|
||||
nex=size(N,1);
|
||||
end
|
||||
@@ -0,0 +1,495 @@
|
||||
function [ matrixvsfra,connectmf,fracnumber,fracstart,corevsfra,connect_infrac,N,T,zf,fcinff,vf,porf,fcff,T_convection,mat_frac,number_of_adding,cell_divided_by_fracture_flag] = connections_unstructured_EDFM( fracturemesh,pointvsregion,raopoint,f,nf,nx,ny,nz,kx,ky,kz,kf,wf,Porf,dxv,dyv,dzv,coord,nodes,NTG,addflag )
|
||||
% 该函数用以给裂缝面网格编号,并存储网格间的连接关系及传导率,是前处理的关键步骤
|
||||
% 不同于二维嵌入式离散裂缝模型,三维模型中,裂缝是二维平面,网格之间连接关系复杂,
|
||||
%不能简单得从基质网格来判定,若所处基质网格不相邻,则裂缝网格必不相邻,若所处基质网格相邻,裂缝网格却不一定相邻
|
||||
%上述原则无助于我们去确定connections,故拟采取以下方案:
|
||||
%第一步:按照xink矩阵去掉零行后,按照行数依次给某裂缝面网格编号,同时存储裂缝网格所在的基质网格序号
|
||||
%第二步:存储每个裂缝网格的面积,边界,边界长度,中心点坐标,中心点到各边界的距离,为后续操作做准备
|
||||
%第三步:按照裂缝网格序号顺序,按照边界进行搜索,如果有相同的边界,则两个裂缝网格是相邻的
|
||||
%matrixvsfra矩阵代表基质网格中包含裂缝网格编号的情况
|
||||
%fracnumber矩阵,行序号表示该裂缝网格编号,行内容表示该网格包含的点序号
|
||||
%areavsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的面积
|
||||
%每相邻两列是一条边,然后将顺序反过来,又是两列一条边
|
||||
%lengthvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的各边长度
|
||||
%corevsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心坐标
|
||||
%disvsfra矩阵,行序号表示该裂缝网格编号,行内容表示该裂缝网格的重心到各边的距离
|
||||
matrixvsfra=zeros(nx*ny*nz,10);%为了减少该矩阵的大小,考虑实际情况,一个基质网格中,一般不会有超过10个裂缝网格
|
||||
fracnumber=zeros(1000,20);%根据实际情况,裂缝网格一般不会超过1000个,也可根据实际情况改变
|
||||
%m=size(xink,1);
|
||||
rownum=zeros(nf,1);
|
||||
for i=1:nf
|
||||
rownum(i)=size(fracturemesh{i,1},1);
|
||||
end
|
||||
%% 将所有裂缝面网格连起来一起编号,并将编号扔给相应的基质网格
|
||||
q=1;
|
||||
fracstart=zeros(nf+1,1);%这个表示在总编号中,每条裂缝起始的号码
|
||||
for j=1:nf
|
||||
fracstart(j)=q;
|
||||
numofmesh=pointvsregion{j,1};
|
||||
for i=1:1:rownum(j)
|
||||
if(norm(fracturemesh{j,1}(i,:))~=0)
|
||||
raoindice=size(fracturemesh{j,1}(i,:),2);
|
||||
fracnumber(q,1:raoindice)=fracturemesh{j,1}(i,:);%q即是该裂缝编号
|
||||
% m=floor((i+(2^nf)-1)/(2^nf));
|
||||
m=floor((i+(2^addflag(j)-1))/(2^addflag(j)));
|
||||
indice=find(matrixvsfra(numofmesh(m),:)~=0);
|
||||
% indice=find(matrixvsfra(numofmesh(i),:)~=0);
|
||||
if (size(indice,2)==0) xiang=1;
|
||||
else
|
||||
rao=max(indice');
|
||||
xiang=rao(1)+1;
|
||||
end
|
||||
matrixvsfra(numofmesh(m),xiang)=q;%将裂缝编号附给相应的基质网格
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
fracstart(nf+1)=q;%裂缝网格总数量+1
|
||||
fracnumber(q:1000,:)=[];
|
||||
|
||||
|
||||
%% 将包含有裂缝单元的基质网格筛选出来,并进行处理
|
||||
m=size(matrixvsfra,1);
|
||||
mat_frac=[];
|
||||
connectmf=cell(1,4);
|
||||
% for i=1:m
|
||||
% if (norm(matrixvsfra(i,:))~=0)
|
||||
% ConnecS = cell(1,4);
|
||||
cc = 0;
|
||||
cl = 1;
|
||||
for i = 1 : m
|
||||
%筛选出包含裂缝的基质网格
|
||||
% if ~isempty(matrixvsfra(i,:))
|
||||
if (norm(matrixvsfra(i,:)))~=0
|
||||
cc = cc + 1;
|
||||
%存储该基质网格编号
|
||||
connectmf{cc,1} = i;
|
||||
mat_frac=[mat_frac;i];
|
||||
%给这些裂缝点/裂缝单元按顺序编号
|
||||
A=matrixvsfra(i,:);
|
||||
A(A==0)=[];
|
||||
connectmf{cc,2} =A;
|
||||
end
|
||||
end
|
||||
|
||||
%% 一条条裂缝计算裂缝网格面积、边界等等
|
||||
% edgevsfra=cell(nf,1);
|
||||
% Kffl=funtion_data.Kffl;
|
||||
% Dffl=funtion_data.Dffl;
|
||||
% kffl=zeros(q-1,1);
|
||||
% dffl=zeros(q-1,1);
|
||||
normalvec=zeros(q-1,3);%unit 法向量
|
||||
areavsfra=zeros(q-1,1);%q-1即裂缝网格总数
|
||||
lengthvsfra=zeros(q-1,10);
|
||||
Kf=zeros(q-1,10);%裂缝网格渗透率
|
||||
corevsfra=zeros(q-1,3);
|
||||
disvsfra=zeros(q-1,10);
|
||||
tran=zeros(q-1,10);
|
||||
avtran=zeros(q-1,1);%裂缝网格平均传导,用于后续的简化计算
|
||||
ave_disvsfra=zeros(q-1,1);
|
||||
fcinff=zeros(q-1,1);%表示裂缝单元所在的裂缝面序号
|
||||
zf=zeros(q-1,1);%裂缝单元高度(以下表面为基准)
|
||||
vf=zeros(q-1,1);%裂缝单元的体积
|
||||
porf=zeros(q-1,1);%裂缝单元的孔隙度
|
||||
for i=1:1:q-1 %对裂缝网格进行操作
|
||||
if(norm(fracnumber(i,:))==0) break;
|
||||
else
|
||||
for k=2:(nf+1)
|
||||
if(i<fracstart(k)) fcinff(i)=k-1; break;%判断该点处在哪个裂缝平面上,k-1号裂缝面
|
||||
end
|
||||
end
|
||||
d3intersection=raopoint{k-1,1};
|
||||
anothersection=raopoint{k-1,2};
|
||||
fraindice=find(fracnumber(i,:)~=0);
|
||||
rx=size(fraindice,2);
|
||||
for j=1:1:(rx-1)
|
||||
%edgevsfra(i,(4*j-3):(4*j))=[fracnumber(i,j),fracnumber(i,j+1),fracnumber(i,j+1),fracnumber(i,j)];%完成对edgevsfra矩阵赋值
|
||||
%%因为是凸多边形,因此只要代表裂缝网格的两个行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格;如果小于两个,则没有共有的边线
|
||||
normalvec(i,:)=cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:))/norm(cross(f(5*(k-1)-3,:),f(5*(k-1)-2,:)));
|
||||
areavsfra(i)=area(anothersection(fracnumber(i,1:(rx-1))',:) ,f(5*(k-1)-3,:),f(5*(k-1)-2,:) );%计算出每个裂缝网格的面积
|
||||
vf(i)=areavsfra(i)*wf(k-1);
|
||||
porf(i)=Porf(k-1);
|
||||
Kf(i,1)=kf(k-1);
|
||||
% kffl(i,1)=Kffl(k-1);
|
||||
% dffl(i,1)=Dffl(k-1);
|
||||
lengthvsfra(i,j)=norm(d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:));%计算裂缝网格每条边的长度
|
||||
corevsfra(i,:)=1/(rx-1)*d3intersection(fracnumber(i,j),:)+corevsfra(i,:);%计算每个裂缝网格重心的坐标
|
||||
zf(i)=corevsfra(i,3);%裂缝网格计算深度(以下平面为基准计算得到的高度,值为正数)
|
||||
rao1=corevsfra(i,:)-d3intersection(fracnumber(i,j),:);
|
||||
rao2=d3intersection(fracnumber(i,j+1),:)-d3intersection(fracnumber(i,j),:);
|
||||
disvsfra(i,j)=norm(cross(rao1',rao2'))/norm(rao2);%计算出每个裂缝网格重心到每条边的距离
|
||||
tran(i,j)=kf(k-1)*wf(k-1)*lengthvsfra(i,j)./disvsfra(i,j);
|
||||
end
|
||||
avtran(i)=sum(tran(i,:))/(rx-1);
|
||||
ave_disvsfra(i)=sum(disvsfra(i,:))/(rx-1);
|
||||
end
|
||||
end
|
||||
|
||||
% %% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
% fcff=cell(1,8);
|
||||
% fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
%% 为了防止出现某裂缝网格面积相对过小,引起计算出错,故将面积很小的裂缝网格给去掉
|
||||
maxarea=max(areavsfra,2);
|
||||
% minlength=min(lengthvsfra,[],2);
|
||||
% maxlength=max(lengthvsfra,[],2);
|
||||
newnum=zeros(q-1,1);
|
||||
[deindex1,~]=find(areavsfra<0*maxarea);
|
||||
deindex2=[];
|
||||
for i=1:(q-1)
|
||||
zeroindex=find(lengthvsfra(i,:)~=0);
|
||||
minlength=min(lengthvsfra(i,zeroindex));
|
||||
maxlength=max(lengthvsfra(i,:));
|
||||
if minlength<0*maxlength
|
||||
deindex2=[deindex2;i];
|
||||
end
|
||||
end
|
||||
deindex=[deindex1;deindex2];
|
||||
deindex=unique(deindex);
|
||||
deindex=sort(deindex);
|
||||
hui=length(deindex);
|
||||
if hui>0
|
||||
for i=1:(q-1)
|
||||
[dogindex,~]=find(deindex==i);
|
||||
if length(dogindex)~=0
|
||||
newnum(i)=0;
|
||||
else
|
||||
[catindex,~]=find(deindex<i);
|
||||
rao=length(catindex);
|
||||
newnum(i)=i-rao;
|
||||
end
|
||||
end
|
||||
fracnumber(deindex,:)=[];
|
||||
fcinff(deindex,:)=[];
|
||||
lengthvsfra(deindex,:)=[];
|
||||
corevsfra(deindex,:)=[];
|
||||
disvsfra(deindex,:)=[];
|
||||
tran(deindex,:)=[];
|
||||
avtran(deindex,:)=[];
|
||||
areavsfra(deindex,:)=[];
|
||||
zf(deindex,:)=[];
|
||||
vf(deindex,:)=[];
|
||||
porf(deindex,:)=[];
|
||||
% change matrixvsfra
|
||||
for i=1:m%matrixvsfra矩阵的行数
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0
|
||||
matrixvsfra(i,j)=newnum(matrixvsfra(i,j));
|
||||
end
|
||||
end
|
||||
end
|
||||
% change fracstart
|
||||
fracstart(nf+1,1)=length(fracnumber)+1;
|
||||
for i=1:nf
|
||||
[daiindex,~]=find(deindex<fracstart(i,1));
|
||||
dai=length(daiindex);
|
||||
fracstart(i)=fracstart(i)-dai;
|
||||
end
|
||||
|
||||
end
|
||||
%% 生成裂缝单元及所在裂缝面的cell数组及其它形状信息
|
||||
fcff=cell(1,8);
|
||||
fcff{1,1}=fracnumber; fcff{1,2}=fcinff;fcff{1,3}=lengthvsfra;fcff{1,4}=corevsfra;fcff{1,5}=disvsfra;fcff{1,6}=tran;fcff{1,7}=avtran;fcff{1,8}=areavsfra;
|
||||
%% 裂缝单元的连接情况
|
||||
|
||||
%% 在同一裂缝面上,裂缝单元的连接情况及传导率计算(不包含在同一基质网格中的相邻裂缝单元)
|
||||
connect_infrac=cell(nf,1);
|
||||
Nff=zeros(1,2); %记录同一裂缝面上的网格相邻情况,第一列和第二列分别是相邻网格的编号
|
||||
Tff=zeros(1,1); %记录相应的传导系数
|
||||
Tff_convection=zeros(1,1); %对流项
|
||||
for i=1:nf
|
||||
p=1;
|
||||
raoconnect=zeros(fracstart(i+1)-fracstart(i),10);%一般来说,裂缝网格不超过10条边
|
||||
d3intersection=raopoint{i,1};
|
||||
anothersection=raopoint{i,2};
|
||||
for j=fracstart(i):((fracstart(i+1)-1)-1)%第i条裂缝的编号范围
|
||||
q=1;
|
||||
for k=j:(fracstart(i+1)-1)
|
||||
A=fracnumber(j,:);
|
||||
B=fracnumber(k,:);
|
||||
%将两个向量很可能都有的0去掉,这个0没有什么意义
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
[a,~]=find(matrixvsfra==j); [b,~]=find(matrixvsfra==k);
|
||||
if length(a)~=1
|
||||
heihei=1;
|
||||
end
|
||||
raoflag=intersect(A,B);
|
||||
if((size(raoflag,2)>2)||((size(raoflag,2)<2))) continue;%因为是凸多边形,因此只要代表裂缝网格的行向量的共有元素有2个,即有公共边;
|
||||
%如果多于2个,则是相同的裂缝网格,因为如果不是,则必有一个是凹多边形,矛盾,证毕;如果小于两个,则没有共有的边线
|
||||
else if (a==b) continue; %说明这两个裂缝单元在同一个基质网格中,因此不应该算在此类中
|
||||
else
|
||||
raoconnect(p,q)=k;q=q+1;
|
||||
lengthcat=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));%计算裂缝单元公共边长度
|
||||
rao1k=corevsfra(k,:)-d3intersection(raoflag(1),:);
|
||||
rao1j=corevsfra(j,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
%分别计算两裂缝单元中心到公共边的距离
|
||||
disk=norm(cross(rao1k',rao2'))/norm(rao2);
|
||||
disj=norm(cross(rao1j',rao2'))/norm(rao2);
|
||||
if kf(i)==0 hartran=0;hartran_convection=0;
|
||||
else
|
||||
tran1=kf(i)*wf(i)*lengthcat/disk;
|
||||
tran2=kf(i)*wf(i)*lengthcat/disj;
|
||||
% hartran=length/(disk+disj);%取调和平均
|
||||
hartran=tran1*tran2/(tran1+tran2);
|
||||
k_harmony= kf(i);
|
||||
hartran_convection=kf(i)/(disk+disj)^2;
|
||||
end
|
||||
Nff=[Nff; j,k];
|
||||
Tff=[Tff;hartran];
|
||||
Tff_convection=[Tff_convection;hartran_convection];
|
||||
%计算出每个裂缝网格重心到每条边的距离
|
||||
end
|
||||
end
|
||||
p=p+1;
|
||||
end
|
||||
connect_infrac{i,1}=raoconnect;
|
||||
end
|
||||
end
|
||||
Nff(1,:)=[]; %去除第一行的零行
|
||||
Tff(1,:)=[];
|
||||
Tff_convection(1,:)=[];
|
||||
%% 在同一基质网格中的裂缝单元连接情况及传导率计算
|
||||
nmc=size(matrixvsfra,1);
|
||||
Nmff=zeros(1,2);
|
||||
Tmff=zeros(1,1);
|
||||
Tmff_convection=zeros(1,1);
|
||||
for i=1:nmc
|
||||
if(norm(matrixvsfra(i,:))~=0)
|
||||
indice=find(matrixvsfra(i,:)~=0);
|
||||
n=size(indice,2);
|
||||
if (n>1) %此时表明要采取下述的简化算法
|
||||
% lengthvsfra(matrixvsfra(i,indice))./disvsfra(matrixvsfra(i,indice))
|
||||
for j=1:n-1
|
||||
for k=(j+1):n
|
||||
Nmff=[Nmff;matrixvsfra(i,indice(j)), matrixvsfra(i,indice(k))];
|
||||
% 此时的计算方式是先求每个裂缝网格的算术平均,再算包含在该基质网格中的所有裂缝单元的算术平均
|
||||
fc1=matrixvsfra(i,indice(j)); fc2=matrixvsfra(i,indice(k));
|
||||
allfc=matrixvsfra(i,1:n); sumtran=sum(fcff{1,7}(allfc));
|
||||
if sumtran==0 Tmff=[Tmff; 0];Tmff_convection=[Tmff_convection;0];
|
||||
else
|
||||
Tmff=[Tmff; fcff{1,7}(fc1)*fcff{1,7}(fc2)/sumtran];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Nmff(1,:)=[]; %去掉开头的零行
|
||||
Tmff(1,:)=[];
|
||||
Tmff_convection(1,:)=[];
|
||||
% N = [N; Nmff+nmc];
|
||||
% T = [T; Tmff];
|
||||
|
||||
%% 基质网格的连接情况及传导系数计算
|
||||
nmc=nx * ny*nz;%基质网格数目
|
||||
nfc=size(fracnumber,1);%裂缝单元数目
|
||||
rpt = [ones(nmc, 1); zeros(nfc, 1)];
|
||||
% r.rpt = rpt;
|
||||
nmm = (nx-1)*ny*nz+(ny-1)*nx*nz+(nz-1)*nx*ny;%nmm是基质网格之间存在流体交换的总数
|
||||
% r.nf = nmm + nff;%nff是裂缝单元之间存在流体交换的总数
|
||||
Kx=kx.*ones(nmc,1);
|
||||
Ky=ky.*ones(nmc,1);
|
||||
Kz=kz.*ones(nmc,1);
|
||||
N = zeros(nmm, 2);%存储基质网格之间存在流体交换的网格编号
|
||||
T = zeros(nmm, 1);%存储对应与N矩阵的传导系数
|
||||
T_convection = zeros(nmm, 1);
|
||||
c = 0;
|
||||
for k= 1 : nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + 1;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dyv(index)*Kx(index)*Kx(indexn)*NTG(index)*NTG(indexn)/(Kx(index)*dxv(indexn)*NTG(index) + Kx(indexn)*dxv(index)*NTG(indexn));
|
||||
T_convection(c) = 2/(1/Kx(index)+1/Kx(indexn))/(dxv(indexn)+dxv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for k= 1 : nz
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny - 1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx;
|
||||
N(c, :) = [index, indexn];
|
||||
T(c) = 2 * dzv(index)*dxv(index)*Ky(index)*Ky(indexn)/(Ky(index)*dyv(indexn) + Ky(indexn)*dyv(index));
|
||||
T_convection(c) = 2/(1/Ky(index)+1/Ky(indexn))/(dyv(indexn)+dyv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1 : nx
|
||||
for j = 1 : ny
|
||||
for k= 1: nz-1
|
||||
c = c + 1;
|
||||
index = i + (j - 1) * nx + (k - 1) * nx * ny;
|
||||
indexn = index + nx * ny;
|
||||
N(c, :) = [index, index + nx*ny];
|
||||
T(c) = 2 * dxv(index)*dyv(index)*Kz(index)*Kz(indexn)/(Kz(index)*dzv(indexn) + Kz(indexn)*dzv(index));
|
||||
T_convection(c) = 2/(1/Kz(index)+1/Kz(indexn))/(dzv(indexn)+dzv(index));
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
syms x y z;
|
||||
Ninterflow=[];
|
||||
Tinterflow=[];
|
||||
Tinterflow_convection=[];
|
||||
matrix_cells_containing_fracture_cells = [];
|
||||
for i=1:nx*ny*nz %基质网格编号
|
||||
for j=1:10
|
||||
if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
matrix_cells_containing_fracture_cells = [matrix_cells_containing_fracture_cells; i];
|
||||
Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
Knnc=kcell*Kf(matrixvsfra(i,j))/(kcell+Kf(matrixvsfra(i,j)));
|
||||
Annc=2*areavsfra(matrixvsfra(i,j));
|
||||
fracore=corevsfra(matrixvsfra(i,j),:);
|
||||
matnodes=nodes(i,:);
|
||||
verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
matcore=mean(verco);d0=matcore-fracore;
|
||||
dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% dn=abs(dn);%影响数值积分效率
|
||||
dn=sqrt(dn^2);
|
||||
dn=matlabFunction(dn);
|
||||
if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(2)~=0
|
||||
Dn=dzv(i)*NTG(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0 && norvec(3)~=0
|
||||
Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0 && norvec(3)~=0
|
||||
Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(1)~=0
|
||||
Dn=dyv(i)*dzv(i)*NTG(i)*integral(dn,-dxv(i)/2,dxv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(2)~=0
|
||||
Dn=dxv(i)*dzv(i)*NTG(i)*integral(dn,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
else if norvec(3)~=0
|
||||
Dn=dxv(i)*dyv(i)*integral(dn,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
raoT=Knnc*Annc/Dn;
|
||||
raoT_convection=2*Knnc/Dn^2;
|
||||
Tinterflow=[Tinterflow;raoT];
|
||||
Tinterflow_convection=[Tinterflow_convection;raoT_convection];
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 额外处理,此处并未通用化,有待进一步开展
|
||||
nfc=size(fracnumber,1);
|
||||
the_added_matrix_cells = [];
|
||||
nmc=nx * ny*nz;
|
||||
the_added_mf_connec = [];
|
||||
the_added_mf_T = [];
|
||||
number_of_adding = 0;
|
||||
cell_divided_by_fracture_flag = matrix_cells_containing_fracture_cells;
|
||||
for i = 1:size(matrix_cells_containing_fracture_cells,1)
|
||||
the_matrix_cell = matrix_cells_containing_fracture_cells(i,1);
|
||||
number_of_adding = number_of_adding+1;
|
||||
the_new_cell = number_of_adding+nmc;
|
||||
the_added_matrix_cells = [the_added_matrix_cells; the_new_cell];
|
||||
% m-m连接
|
||||
for j = 1:size(N,1)
|
||||
if N(j,1) == the_matrix_cell
|
||||
if N(j,2) == the_matrix_cell+1
|
||||
N(j,1) = the_new_cell; T(j) = ...
|
||||
((Kx(the_matrix_cell)*dzv(the_matrix_cell)*dyv(the_matrix_cell)/(dxv(the_matrix_cell)/3))^(-1)+(Kx(the_matrix_cell+1)*dzv(the_matrix_cell+1)*dyv(the_matrix_cell+1)/(dxv(the_matrix_cell+1)/2))^(-1))^(-1);
|
||||
end
|
||||
if N(j,2) == the_matrix_cell-nx
|
||||
N(j,1) = the_new_cell; T(j) = ...
|
||||
((Ky(the_matrix_cell)*dzv(the_matrix_cell)*dxv(the_matrix_cell)/(dyv(the_matrix_cell)/3))^(-1)+(Ky(the_matrix_cell-n)*dzv(the_matrix_cell-n)*dxv(the_matrix_cell-n)/(dxv(the_matrix_cell-n)/2))^(-1))^(-1);
|
||||
end
|
||||
end
|
||||
if N(j,2) == the_matrix_cell
|
||||
if N(j,1) == the_matrix_cell+1
|
||||
N(j,2) = the_new_cell; T(j) = ...
|
||||
((Kx(the_matrix_cell)*dzv(the_matrix_cell)*dyv(the_matrix_cell)/(dxv(the_matrix_cell)/3))^(-1)+(Kx(the_matrix_cell+1)*dzv(the_matrix_cell+1)*dyv(the_matrix_cell+1)/(dxv(the_matrix_cell+1)/2))^(-1))^(-1);
|
||||
end
|
||||
if N(j,1) == the_matrix_cell-nx
|
||||
N(j,2) = the_new_cell; T(j) = ...
|
||||
((Ky(the_matrix_cell)*dzv(the_matrix_cell)*dxv(the_matrix_cell)/(dyv(the_matrix_cell)/3))^(-1)+(Ky(the_matrix_cell-n)*dzv(the_matrix_cell-n)*dxv(the_matrix_cell-n)/(dxv(the_matrix_cell-n)/2))^(-1))^(-1);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Ninterflow(:,2) = Ninterflow(:,2)+ number_of_adding;
|
||||
ori_nmc = nmc;
|
||||
nmc = ori_nmc +number_of_adding;
|
||||
% m-f连接
|
||||
number_of_adding = 0;
|
||||
for i = 1:size(matrix_cells_containing_fracture_cells,1)
|
||||
the_matrix_cell = matrix_cells_containing_fracture_cells(i,1);
|
||||
number_of_adding = number_of_adding+1;
|
||||
the_new_cell = number_of_adding+ori_nmc;
|
||||
for j = 1:size(Ninterflow,1)
|
||||
if Ninterflow(j,1) == the_matrix_cell
|
||||
the_added_mf_connec = [the_added_mf_connec;the_new_cell,Ninterflow(j,2)];
|
||||
the_added_mf_T = [the_added_mf_T; Tinterflow(j)/2];
|
||||
Tinterflow(j) = Tinterflow(j)/2;
|
||||
end
|
||||
end
|
||||
end
|
||||
Ninterflow = [Ninterflow; the_added_mf_connec];
|
||||
Tinterflow = [Tinterflow; the_added_mf_T];
|
||||
%% 按照2014年的方法,将窜流处理为与上述相似的形式
|
||||
% syms x y z;
|
||||
% Ninterflow=[];
|
||||
% Tinterflow=[];
|
||||
% for i=1:nx*ny*nz %基质网格编号
|
||||
% for j=1:10
|
||||
% if matrixvsfra(i,j)~=0 %this matrix cell contains a fracture cell
|
||||
% Ninterflow=[Ninterflow;i,matrixvsfra(i,j)+nmc];
|
||||
% kcell=(kx(i)*ky(i)*kz(i))^(1/3);
|
||||
% K1=Kf(matrixvsfra(i,j));d1=Wf(matrixvsfra(i,j));
|
||||
% K2=kffl(matrixvsfra(i,j));d2=dffl(matrixvsfra(i,j));
|
||||
% Annc=2*areavsfra(matrixvsfra(i,j));
|
||||
% fracore=corevsfra(matrixvsfra(i,j),:);
|
||||
% matnodes=nodes(i,:);
|
||||
% verco=coord(matnodes,:);norvec=normalvec(matrixvsfra(i,j),:);
|
||||
% matcore=mean(verco);d0=matcore-fracore;
|
||||
% dn=(x+d0(1))*norvec(1)+(y+d0(2))*norvec(2)+(z+d0(3))*norvec(3);
|
||||
% % dn=abs(dn);%影响数值积分效率
|
||||
% dn=sqrt(dn^2);
|
||||
% dn=matlabFunction(dn);
|
||||
% if norvec(1)~=0 && norvec(2)~=0 && norvec(3)~=0
|
||||
% Dn=integral3(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0 && norvec(2)~=0
|
||||
% Dn=dzv(i)*NTG(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0 && norvec(3)~=0
|
||||
% Dn=dyv(i)*integral2(dn,-dxv(i)/2,dxv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(2)~=0 && norvec(3)~=0
|
||||
% Dn=dxv(i)*integral2(dn,-dyv(i)/2,dyv(i)/2,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(1)~=0
|
||||
% Dn=dyv(i)*dzv(i)*NTG(i)*integral(dn,-dxv(i)/2,dxv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(2)~=0
|
||||
% Dn=dxv(i)*dzv(i)*NTG(i)*integral(dn,-dyv(i)/2,dyv(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% else if norvec(3)~=0
|
||||
% Dn=dxv(i)*dyv(i)*integral(dn,-dzv(i)*NTG(i)/2,dzv(i)*NTG(i)/2)/(dxv(i)*dyv(i)*dzv(i)*NTG(i));
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% raoT=((Kcell*Annc/(Dn-d2))^(-1)+(K2*Annc/d2)^(-1)+(K1*Annc/d1)^(-1))^(-1);
|
||||
% Tinterflow=[Tinterflow;raoT];
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
|
||||
%% 把上述三种情况的矩阵分别叠加起来
|
||||
N = [N; Nmff+nmc; Nff+nmc;Ninterflow;];
|
||||
T = [T; Tmff; Tff;Tinterflow;];
|
||||
T_convection = [T_convection;Tmff_convection; Tff_convection;Tinterflow_convection;];
|
||||
nex=size(N,1);
|
||||
end
|
||||
@@ -0,0 +1,185 @@
|
||||
function [ crossp,tmax,tmin ] = frac_cross_frac( f1,f2 )
|
||||
%f1,f2代表两条裂缝,f表示5*3矩阵,前三行每一行表示一个向量,后两行分别是两个参数的范围
|
||||
%以矩形缝为例,每个裂缝输入的为一个数组,[a0;a1;a2;umin,umax,vmin,vmax],若是其它类型缝,则是利用元胞数组存储,其中包含MATLABfunction
|
||||
%裂缝与裂缝相交于一条线段,如果只相交于一点,则视为两裂缝无传质
|
||||
%解析求解这条相交线段的方程不易,因为裂缝形状的多样,因此利用参数等间隔搜寻两个相交点(x1,y1,z1),(x2,y2,z2),
|
||||
%则可以确定该线段所在直线的参数方程,r=(x1,y1,z1)+t*(x2-x1,y2-y1,z2-z1),只需确定t的范围
|
||||
%使t在较大范围内等间隔搜索求解该点分别对应的两个裂缝的参数取值,并判断是否在裂缝形状设置的参数范围内,如果不是,就确定了该相交线段的具体位置。
|
||||
%[ cross,tmax,tmin ] = frac_cross_frac( [0.5,0,0;1,1,0;0,0,1;0,6,0;0,7,0],[5,0,0;-1,1,0;0,0,1;0,6,0;0,5,0] )
|
||||
a0=f1(1,:);a1=f1(2,:);a2=f1(3,:);
|
||||
u1min=f1(4,1);u1max=f1(4,2);v1min=f1(5,1);v1max=f1(5,2);
|
||||
b0=f2(1,:);b1=f2(2,:);b2=f2(3,:);
|
||||
u2min=f2(4,1);u2max=f2(4,2);v2min=f2(5,1);v2max=f2(5,2);
|
||||
n=1;
|
||||
crossp=[];
|
||||
tmax=0;tmin=0;
|
||||
n1=cross(a1,a2);%第一个裂缝面法向量;
|
||||
n2=cross(b1,b2);%第二个裂缝面法向量;
|
||||
flag=0;% 等于0表示b1直线有交点,等于1则表示b1没有
|
||||
if (norm(f1-f2)~=0) && (norm(cross(n1,n2))~=0) %确保存在交点
|
||||
% 直接用b1,b2所在直线去求交点,用之前,先判断该直线所在向量是否会与裂缝面平行,即此时无交点
|
||||
%b1直线: r=u2*b1+b0;
|
||||
%裂缝面: r=a0+u1*a1+v1*a2; i.e., a0+u1*a1+v1*a2=u2*b1+b0 u1*a1+v1*a2-u2*b1=b0-a0 obtain three
|
||||
%closed linear equations
|
||||
coe=[a1(1) a2(1) -b1(1);
|
||||
a1(2) a2(2) -b1(2);
|
||||
a1(3) a2(3) -b1(3);];
|
||||
bv=[b0(1)-a0(1);b0(2)-a0(2);b0(3)-a0(3);];
|
||||
if abs(det(coe))<=1e-8 %表明无交点
|
||||
else
|
||||
solution1=coe\bv;
|
||||
crossp=[crossp;a0+solution1(1)*a1+solution1(2)*a2;];
|
||||
n=n+1;
|
||||
%b1直线往b2方向平移一点: r=u2*b1+b2+b0;
|
||||
%裂缝面: r=a0+u1*a1+v1*a2; i.e., a0+u1*a1+v1*a2=u2*b1+b0 u1*a1+v1*a2-u2*b1=b0-a0 obtain three
|
||||
%closed linear equations
|
||||
bv=[b2(1)+b0(1)-a0(1);b2(2)+b0(2)-a0(2);b2(3)+b0(3)-a0(3);];
|
||||
solution2=coe\bv;
|
||||
crossp=[crossp;a0+solution2(1)*a1+solution2(2)*a2;];
|
||||
n=n+1;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%b2直线: r=u2*b2+b0;
|
||||
coe=[a1(1) a2(1) -b2(1);
|
||||
a1(2) a2(2) -b2(2);
|
||||
a1(3) a2(3) -b2(3);];
|
||||
bv=[b0(1)-a0(1);b0(2)-a0(2);b0(3)-a0(3);];
|
||||
if abs(det(coe))<=1e-8 %表明无交点
|
||||
else
|
||||
flag=1;
|
||||
solution1=coe\bv;
|
||||
crossp=[crossp;a0+solution1(1)*a1+solution1(2)*a2;];
|
||||
n=n+1;
|
||||
%b2直线往b1方向平移一点: r=u2*b2+b1+b0;
|
||||
bv=[b1(1)+b0(1)-a0(1);b1(2)+b0(2)-a0(2);b1(3)+b0(3)-a0(3);];
|
||||
solution2=coe\bv;
|
||||
crossp=[crossp;a0+solution2(1)*a1+solution2(2)*a2;];
|
||||
n=n+1;
|
||||
end
|
||||
|
||||
if (n<3) crossp=zeros(2,3);tmax=0;tmin=0;
|
||||
else
|
||||
crossp=crossp(1:2,:);
|
||||
vertex_1=[a0+u1min*a1+v1min*a2;
|
||||
a0+u1min*a1+v1max*a2;
|
||||
a0+u1max*a1+v1max*a2;
|
||||
a0+u1max*a1+v1min*a2;
|
||||
a0+u1min*a1+v1min*a2;];
|
||||
vertex_2=[b0+u2min*b1+v2min*b2;
|
||||
b0+u2min*b1+v2max*b2;
|
||||
b0+u2max*b1+v2max*b2;
|
||||
b0+u2max*b1+v2min*b2;
|
||||
b0+u2min*b1+v2min*b2;];
|
||||
|
||||
% 计算该交线与矩形裂缝面的交点
|
||||
t1=[];%交线在裂缝面1上时t的取值
|
||||
t2=[];%交线在裂缝面2上时t的取值
|
||||
%% 裂缝面1上计算
|
||||
for i=1:4
|
||||
k1=vertex_1(i+1,:)-vertex_1(i,:);%凸多边形相邻两点线段斜率
|
||||
k2=crossp(2,:)-crossp(1,:);
|
||||
% if (((dot(k1,k2)/ norm(k1) / norm(k2))==1)||((dot(k1,k2)/ norm(k1) / norm(k2))==-1))%表明这两条边肯定不会相邻
|
||||
if (abs(abs(dot(k1,k2)/ norm(k1) / norm(k2))-1)<=1e-3)%表明这两条边肯定不会
|
||||
continue;
|
||||
else
|
||||
A=[crossp(2,1)-crossp(1,1),vertex_1(i,1)-vertex_1(i+1,1);
|
||||
crossp(2,2)-crossp(1,2),vertex_1(i,2)-vertex_1(i+1,2);
|
||||
crossp(2,3)-crossp(1,3),vertex_1(i,3)-vertex_1(i+1,3);];
|
||||
b=[vertex_1(i,1)-crossp(1,1);
|
||||
vertex_1(i,2)-crossp(1,2);
|
||||
vertex_1(i,3)-crossp(1,3)];
|
||||
if abs(det(A'*A))<1e-8
|
||||
end
|
||||
para=A\b;
|
||||
% if((para(2)>=0.999)||(para(2)<0)||(para(1)>tmax)||(para(1)<tmin)) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
if (para(2)>=0.999)||(para(2)<0) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
% 表示交点确在裂缝面边界线上
|
||||
else
|
||||
t1=[t1;para(1)];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 裂缝面2上的计算
|
||||
for i=1:4
|
||||
k1=vertex_2(i+1,:)-vertex_2(i,:);%凸多边形相邻两点线段斜率
|
||||
k2=crossp(2,:)-crossp(1,:);
|
||||
% if (((dot(k1,k2)/ norm(k1) / norm(k2))==1)||((dot(k1,k2)/ norm(k1) / norm(k2))==-1))%表明这两条边肯定不会相邻
|
||||
if (abs(abs(dot(k1,k2)/ norm(k1) / norm(k2))-1)<=1e-3)%表明这两条边肯定不会
|
||||
continue;
|
||||
else
|
||||
A=[crossp(2,1)-crossp(1,1),vertex_2(i,1)-vertex_2(i+1,1);
|
||||
crossp(2,2)-crossp(1,2),vertex_2(i,2)-vertex_2(i+1,2);
|
||||
crossp(2,3)-crossp(1,3),vertex_2(i,3)-vertex_2(i+1,3);];
|
||||
b=[vertex_2(i,1)-crossp(1,1);
|
||||
vertex_2(i,2)-crossp(1,2);
|
||||
vertex_2(i,3)-crossp(1,3)];
|
||||
if abs(det(A'*A))<1e-8
|
||||
end
|
||||
para=A\b;
|
||||
% if((para(2)>=0.999)||(para(2)<0)||(para(1)>tmax)||(para(1)<tmin)) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
if (para(2)>=0.999)||(para(2)<0) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
% 表示交点确在裂缝面边界线上
|
||||
else
|
||||
t2=[t2;para(1)];
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if length(t1)>2 || length(t2)>2
|
||||
error('Dr Rao reminds you to check the existing error carefully');
|
||||
elseif length(t1)<2 || length(t2)<2 || max(t1)<=min(t2) || max(t2)<=min(t1) %无公共交线部分
|
||||
crossp=zeros(2,3);tmax=0;tmin=0;
|
||||
else
|
||||
kitty=[t1;t2];
|
||||
kitty=sort(kitty);
|
||||
tmin=kitty(2);tmax=kitty(3);
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% if flag==0 %则用b1直线即可求出交线在裂缝面上的参数取值范围
|
||||
% A1=[a1(1),a2(1);
|
||||
% a1(2),a2(2);
|
||||
% a1(3),a2(3)];
|
||||
% A2=[b1(1),b2(1);
|
||||
% b1(2),b2(2);
|
||||
% b1(3),b2(3)];
|
||||
% B1=crossp(1,:)-a0;
|
||||
% B2=crossp(1,:)-b0;
|
||||
% s1=A1\B1';
|
||||
% s2=A2\B2';
|
||||
% if((s1(1)>u1max)||(s1(1)<u1min)||(s1(2)>v1max)||(s1(2)<v1min)||(s2(1)>u2max)||(s2(1)<u2min)||(s2(2)>v2max)||(s2(2)<v2min))
|
||||
% % 说明这个点并不在范围内
|
||||
% for t=0:0.01:1:500
|
||||
% r=crossp(1,:)+t*(crossp(2,:)-crossp(1,:));
|
||||
% B1=r-a0;
|
||||
% B2=r-b0;
|
||||
% s1=A1\B1';
|
||||
% s2=A2\B2';
|
||||
% if((s1(1)>u1max)||(s1(1)<u1min)||(s1(2)>v1max)||(s1(2)<v1min)||(s2(1)>u2max)||(s2(1)<u2min)||(s2(2)>v2max)||(s2(2)<v2min))
|
||||
% tmax=t-1;
|
||||
% break;
|
||||
% end
|
||||
% end
|
||||
%
|
||||
% for t=0:-1:-500
|
||||
% r=crossp(1,:)+t*(crossp(2,:)-crossp(1,:));
|
||||
% B1=r-a0;
|
||||
% B2=r-b0;
|
||||
% s1=A1\B1';
|
||||
% s2=A2\B2';
|
||||
% if((s1(1)>u1max)||(s1(1)<u1min)||(s1(2)>v1max)||(s1(2)<v1min)||(s2(1)>u2max)||(s2(1)<u2min)||(s2(2)>v2max)||(s2(2)<v2min))
|
||||
% tmin=t+1;
|
||||
% break;
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,152 @@
|
||||
function [ xink,d3intersection,anothersection ]= frac_frac_mesh(k, t0,t1,t2,cross,tmax,tmin,d3intersection,anothersection,numvspoint,numofmesh )
|
||||
%FRA_FRA_MESH 此处显示有关此函数的摘要
|
||||
%计算裂缝相交线在其中一条裂缝面上造成的区域更新
|
||||
%d3intersection是裂缝面与网格线交点的x,y,z的值矩阵,行代表点的序号,列依次是x,y,z
|
||||
%anothersection是裂缝面与网格线交点的该裂缝面参数u,v的值矩阵,行代表点的序号,第一列u,第二列v
|
||||
%numvspoint是裂缝面与网格线交点与区域的矩阵,行表示包含交点的基质网格的顺序序号,
|
||||
%列表示每个区域中包含的交点对应于上述两个矩阵中的序号
|
||||
%numofmesh是包含交点的基质网格的序号,是一个列向量
|
||||
%cross表示确定的另一裂缝面与该裂缝相交线段上的两个点,每一行代表一个点的三维坐标
|
||||
%tmax表示该相交线段上所取参数的最大值
|
||||
%tmin表示该相交线段上所取参数的最小值
|
||||
|
||||
%第一步,判断每个区域包含的交点构成的凸多边形的连接顺序
|
||||
%需要在裂缝平面上根据参数u,v的取值利用delaunaytri函数及convexhull函数得到,
|
||||
%这是由于如果用三维坐标,由于这些点共面,delaunaytri函数无法处理
|
||||
%% 将其它裂缝与该裂缝交线添加到裂缝平面上剖分的网格情况
|
||||
%对于其它裂缝与该裂缝的相交线并没有完全穿透一个网格时,则处理为:该网格不被这条相交线剖分
|
||||
%设置一个矩阵存储被再次剖分的网格情况,列数为10
|
||||
%行数初始化为2*size(k,1),以使有足够空间
|
||||
n=size(k,1);
|
||||
z=size(k,2);
|
||||
xink=zeros(2*n,z+2);
|
||||
if(norm(cross)==0) %为了便于前处理而调整的
|
||||
for i=1:n
|
||||
xink(2*i-1,1:z)=k(i,:);
|
||||
end
|
||||
else
|
||||
raoflag=zeros(n,6);%表示是否有交点,0表示j至j+1这段没有焦点,如果非0,则表示交点矩阵的行数
|
||||
raocross=zeros(2*n,3);%交点矩阵,列分别表示x,y,z坐标
|
||||
q=1;
|
||||
for i=1:1:n
|
||||
indice=find(k(i,:)~=0);
|
||||
if(size(indice,2)==0) continue;
|
||||
end
|
||||
m=size(indice,2);
|
||||
|
||||
for j=1:1:m-1
|
||||
k1=d3intersection(k(i,j+1),:)-d3intersection(k(i,j),:);%凸多边形相邻两点线段斜率
|
||||
k2=cross(2,:)-cross(1,:);
|
||||
if (((dot(k1,k2)/ norm(k1) / norm(k2))==1)||((dot(k1,k2)/ norm(k1) / norm(k2))==-1))
|
||||
continue;
|
||||
else
|
||||
A=[cross(2,1)-cross(1,1),d3intersection(k(i,j),1)-d3intersection(k(i,j+1),1);
|
||||
cross(2,2)-cross(1,2),d3intersection(k(i,j),2)-d3intersection(k(i,j+1),2);
|
||||
cross(2,3)-cross(1,3),d3intersection(k(i,j),3)-d3intersection(k(i,j+1),3)];
|
||||
b=[d3intersection(k(i,j),1)-cross(1,1);
|
||||
d3intersection(k(i,j),2)-cross(1,2);
|
||||
d3intersection(k(i,j),3)-cross(1,3)];
|
||||
para=A\b;
|
||||
if((para(2)>=1)||(para(2)<0)||(para(1)>tmax)||(para(1)<tmin)) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
else
|
||||
raoflag(i,j)=q;
|
||||
raocross(q,:)=d3intersection(k(i,j),:)+para(2)*(d3intersection(k(i,j+1),:)-d3intersection(k(i,j),:));
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 在上述的准备工作基础上,按照设定,raoflag矩阵中,如果第i行非零指标向量长度小于2,则xink矩阵中第2*i-1行,保持k中的第i行,第2*i行全是0,代表没有剖分出新的网格
|
||||
% 如果等于2,则按照相应方法将2*i-1行、2*i行分别写成新的矩阵形式
|
||||
%首先将raocross矩阵添加到d3intersection及anothersection后面,实现更新,方便整体和后续添加裂缝的操作
|
||||
d3intersection=[d3intersection;raocross];
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[t0(1);t0(2);t0(3)];
|
||||
B=raocross'-repmat(b,1,2*n);
|
||||
raocross1=A\B;
|
||||
f=size(anothersection,1);
|
||||
anothersection=[anothersection;
|
||||
raocross1'];
|
||||
for i=1:1:n
|
||||
indice=find(raoflag(i,:)~=0);%非零值所处的指标
|
||||
%if(size(indice,2)<2)
|
||||
%xink(2*i-1,1:7)=k(i,:);continue;%由于这样做,不方便后续边的搜寻,因为即使一个交点在边上,也要加到边里
|
||||
if(size(indice,2)<2) xink(2*i-1,1:z)=k(i,:);continue;
|
||||
else if(size(indice,2)==1)
|
||||
crossnum=raoflag(i,indice);
|
||||
if(anothersection(f+crossnum(1),:)==anothersection(indice(1),:))
|
||||
xink(2*i-1,1:z)=k(i,:);
|
||||
else
|
||||
xink(2*i-1,1:z+1)=[k(i,1:indice(1)),f+crossnum(1),k(i,(indice(1)+1):z)];
|
||||
end
|
||||
else
|
||||
crossnum=raoflag(i,indice);
|
||||
raoindice=find(k(i,:)~=0);
|
||||
raodu=size(raoindice,2)-1;
|
||||
rao1=[f+crossnum(1),k(i,(indice(1)+1):1:indice(2)),f+crossnum(2),f+crossnum(1)];%对应于anothersection的点序号
|
||||
raovector2=(indice(2)+1):1:(indice(1)+raodu);
|
||||
num=size(raovector2,2);
|
||||
for q=1:1:num
|
||||
if(raovector2(q)>raodu) raovector2(q)=mod(raovector2(q),raodu);
|
||||
end
|
||||
end
|
||||
rao2=[f+crossnum(2),k(i,raovector2),f+crossnum(1),f+crossnum(2)];
|
||||
if(norm(anothersection(f+crossnum(1),:)-anothersection(indice(1),:))==0&&norm(anothersection(f+crossnum(2),:)==anothersection(indice(2),:))==0)
|
||||
rao1=[indice(1),k(i,(indice(1)+1):1:indice(2)),indice(1)];
|
||||
rao2=[indice(2),k(i,raovector2),indice(2)];
|
||||
end
|
||||
if(norm(anothersection(f+crossnum(1),:)-anothersection(indice(1),:))==0&&norm(anothersection(f+crossnum(2),:)-anothersection(indice(2),:))~=0)
|
||||
rao1=[indice(1),k(i,(indice(1)+1):1:indice(2)),f+crossnum(2),indice(1)];
|
||||
rao2=[f+crossnum(2),k(i,raovector2),f+crossnum(2)];
|
||||
end
|
||||
if(norm(anothersection(f+crossnum(1),:)-anothersection(indice(1),:))~=0&&norm(anothersection(f+crossnum(2),:)-anothersection(indice(2),:))==0)
|
||||
rao1=[f+crossnum(1),k(i,(indice(1)+1):1:indice(2)),f+crossnum(1)];
|
||||
rao2=[indice(2),k(i,raovector2),f+crossnum(1),indice(2)];
|
||||
end
|
||||
p=size(rao1,2);q=size(rao2,2);
|
||||
xink(2*i-1,1:p)=rao1; xink(2*i,1:q)=rao2;
|
||||
%raoindice=find(k(i)~=0);
|
||||
% raodu=size(raodice,2)-1;
|
||||
% rao1=indice(1):1:indice(2);rao1=[rao1,indice(1)];
|
||||
% rao2=indice(2):1:(indice(1)+raodu);rao2=[rao2,indice(2)];
|
||||
% rao2=mod(rao2,raodu);
|
||||
% p=size(rao1,2);q=size(rao2,2);
|
||||
% xink(2*i-1,1:p)=k(i,rao1); xink(2*i,1:q)=k(i,rao2);
|
||||
end
|
||||
end
|
||||
end
|
||||
%新的裂缝面网格剖分情况xink矩阵形成,xink中元素既是d3intersection中的行数,即实际的点序号
|
||||
% for i=1:1:2*n
|
||||
% indice=find(xink(i,:));
|
||||
% if(size(indice,2)==0) continue;
|
||||
% else
|
||||
% point=xink(i,indice)';
|
||||
% u=anothersection(point,1);
|
||||
% v=anothersection(point,2);
|
||||
% dt=DelaunayTri(u,v);
|
||||
% %triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
% k1 = convexHull(dt);%k1是列向量,且长度极可能与k矩阵列数不一致
|
||||
% plot(u,v, '.', 'markersize',10); hold on;
|
||||
% plot(u,v, 'r');
|
||||
% end
|
||||
% end
|
||||
% hold off;
|
||||
end
|
||||
% meshrao=[];
|
||||
% n=size(xink,1);
|
||||
% for i=1:n
|
||||
% a=xink(i,:);
|
||||
% if(norm(a)~=0)
|
||||
% meshrao=[meshrao;a];
|
||||
% end
|
||||
% end
|
||||
% xink=meshrao;
|
||||
%
|
||||
%xink(i,1:7)=k(i,:); xink(i,10)=i;
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,206 @@
|
||||
function [ xink,d3intersection,anothersection,add_flag ]= frac_frac_mesh_modified(xrao,yrao,zrao,k, t0,t1,t2,cross,tmax,tmin,d3intersection,anothersection,numvspoint,numofmesh )
|
||||
%FRA_FRA_MESH 此处显示有关此函数的摘要
|
||||
%计算裂缝相交线在其中一条裂缝面上造成的区域更新
|
||||
%d3intersection是裂缝面与网格线交点的x,y,z的值矩阵,行代表点的序号,列依次是x,y,z
|
||||
%anothersection是裂缝面与网格线交点的该裂缝面参数u,v的值矩阵,行代表点的序号,第一列u,第二列v
|
||||
%numvspoint是裂缝面与网格线交点与区域的矩阵,行表示包含交点的基质网格的顺序序号,
|
||||
%列表示每个区域中包含的交点对应于上述两个矩阵中的序号
|
||||
%numofmesh是包含交点的基质网格的序号,是一个列向量
|
||||
%cross表示确定的另一裂缝面与该裂缝相交线段上的两个点,每一行代表一个点的三维坐标
|
||||
%tmax表示该相交线段上所取参数的最大值
|
||||
%tmin表示该相交线段上所取参数的最小值
|
||||
|
||||
%第一步,判断每个区域包含的交点构成的凸多边形的连接顺序
|
||||
%需要在裂缝平面上根据参数u,v的取值利用delaunaytri函数及convexhull函数得到,
|
||||
%这是由于如果用三维坐标,由于这些点共面,delaunaytri函数无法处理
|
||||
%% 将其它裂缝与该裂缝交线添加到裂缝平面上剖分的网格情况
|
||||
%对于其它裂缝与该裂缝的相交线并没有完全穿透一个网格时,则处理为:该网格不被这条相交线剖分
|
||||
%设置一个矩阵存储被再次剖分的网格情况,列数为10
|
||||
%行数初始化为2*size(k,1),以使有足够空间
|
||||
n=size(k,1);
|
||||
z=size(k,2);
|
||||
% xink=zeros(2*n,z+2);
|
||||
% xink=sparse(2*n,z+2);
|
||||
add_flag=0;
|
||||
if(norm(cross)==0) %为了便于前处理而调整的
|
||||
% for i=1:n
|
||||
% xink(2*i-1,1:z)=k(i,:);
|
||||
% end
|
||||
xink=k;
|
||||
else
|
||||
add_flag=1;
|
||||
xink=zeros(2*n,z+2);
|
||||
% [WO,~]=find(cross(:,1)>max(xrao));
|
||||
% [dao,~]=find(cross(:,2)>max(yrao));
|
||||
% [di,~]=find(cross(:,3)>max(zrao));
|
||||
% [gai,~]=find(cross(:,1)<min(xrao));
|
||||
% [qu,~]=find(cross(:,2)<min(yrao));
|
||||
% [na,~]=find(cross(:,3)<min(zrao));
|
||||
% spindex=[WO;dao;di;gai;qu;na];
|
||||
% if (length(spindex)~=0)
|
||||
for i=1:n
|
||||
xink(2*i-1,1:z)=k(i,:);
|
||||
end
|
||||
raoflag=-1e6*ones(n,6);%表示是否有交点,-1e6表示j至j+1这段没有交点,如果非0,则表示交点矩阵的行数
|
||||
raocross=zeros(2*n,3);%交点矩阵,列分别表示x,y,z坐标
|
||||
f=size(anothersection,1);
|
||||
q=1;
|
||||
for i=1:1:n
|
||||
indice=find(k(i,:)~=0);
|
||||
if(size(indice,2)==0) continue;
|
||||
end
|
||||
m=size(indice,2);
|
||||
|
||||
for j=1:1:m-1
|
||||
k1=d3intersection(k(i,j+1),:)-d3intersection(k(i,j),:);%凸多边形相邻两点线段斜率
|
||||
k2=cross(2,:)-cross(1,:);
|
||||
% if (((dot(k1,k2)/ norm(k1) / norm(k2))==1)||((dot(k1,k2)/ norm(k1) / norm(k2))==-1))%表明这两条边肯定不会相邻
|
||||
if (abs(abs(dot(k1,k2)/ norm(k1) / norm(k2))-1)<=1e-3)%表明这两条边肯定不会相邻
|
||||
continue;
|
||||
else
|
||||
A=[cross(2,1)-cross(1,1),d3intersection(k(i,j),1)-d3intersection(k(i,j+1),1);
|
||||
cross(2,2)-cross(1,2),d3intersection(k(i,j),2)-d3intersection(k(i,j+1),2);
|
||||
cross(2,3)-cross(1,3),d3intersection(k(i,j),3)-d3intersection(k(i,j+1),3)];
|
||||
b=[d3intersection(k(i,j),1)-cross(1,1);
|
||||
d3intersection(k(i,j),2)-cross(1,2);
|
||||
d3intersection(k(i,j),3)-cross(1,3)];
|
||||
if abs(det(A'*A))<1e-8
|
||||
end
|
||||
para=A\b;
|
||||
if((para(2)>=0.999)||(para(2)<0)||(para(1)>tmax)||(para(1)<tmin)) continue;%取半线段,包含左边端点,不包含右侧端点,以免造成错误
|
||||
else
|
||||
% heihei=d3intersection(k(i,j),:)+para(2)*(d3intersection(k(i,j+1),:)-d3intersection(k(i,j),:));
|
||||
% ind=ismember(d3intersection,heihei,'rows');
|
||||
% [dai,~]=find(ind==1);
|
||||
% if isempty(dai)==1
|
||||
% raoflag(i,j)=q;raocross(q,:)=heihei;q=q+1;
|
||||
% else
|
||||
% raoflag(i,j)=dai-f;%预先减去f
|
||||
% end
|
||||
|
||||
raoflag(i,j)=q;
|
||||
raocross(q,:)=d3intersection(k(i,j),:)+para(2)*(d3intersection(k(i,j+1),:)-d3intersection(k(i,j),:));
|
||||
q=q+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 在上述的准备工作基础上,按照设定,raoflag矩阵中,如果第i行非零指标向量长度小于2,则xink矩阵中第2*i-1行,保持k中的第i行,第2*i行全是0,代表没有剖分出新的网格
|
||||
% 如果等于2,则按照相应方法将2*i-1行、2*i行分别写成新的矩阵形式
|
||||
%首先将raocross矩阵添加到d3intersection及anothersection后面,实现更新,方便整体和后续添加裂缝的操作
|
||||
% raocross=unique(raocross, 'rows', 'stable');
|
||||
d3intersection=[d3intersection;raocross];
|
||||
kitty=size(d3intersection,1);
|
||||
record=[];
|
||||
for cutekitty=1:kitty
|
||||
if (norm(d3intersection(cutekitty,:))==0)
|
||||
record=[record;cutekitty];
|
||||
end
|
||||
end
|
||||
d3intersection(record,:)=[];
|
||||
doggy=size(raocross,1);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[t0(1);t0(2);t0(3)];
|
||||
B=raocross'-repmat(b,1,doggy);
|
||||
raocross1=A\B;
|
||||
|
||||
anothersection=[anothersection;
|
||||
raocross1'];
|
||||
piggy=size(anothersection,1);
|
||||
record=intersect([1:piggy]',record,'rows');
|
||||
anothersection(record,:)=[];
|
||||
|
||||
|
||||
%剔除奇异的情况
|
||||
% [I,J]=find(anothersection<0);
|
||||
% anothersection(I,:)=[];
|
||||
|
||||
for i=1:1:n
|
||||
indice=find(raoflag(i,:)~=-1e6);%有交点所处的指标
|
||||
%if(size(indice,2)<2)
|
||||
%xink(2*i-1,1:7)=k(i,:);continue;%由于这样做,不方便后续边的搜寻,因为即使一个交点在边上,也要加到边里
|
||||
if(size(indice,2)<2) xink(2*i-1,1:z)=k(i,:);continue;
|
||||
elseif(size(indice,2)==1)
|
||||
crossnum=raoflag(i,indice);
|
||||
if(anothersection(f+crossnum(1),:)==anothersection(indice(1),:))
|
||||
xink(2*i-1,1:z)=k(i,:);
|
||||
else
|
||||
xink(2*i-1,1:z+1)=[k(i,1:indice(1)),f+crossnum(1),k(i,(indice(1)+1):z)];
|
||||
end
|
||||
else
|
||||
crossnum=raoflag(i,indice);
|
||||
raoindice=find(k(i,:)~=0);
|
||||
raodu=size(raoindice,2)-1;
|
||||
rao1=[f+crossnum(1),k(i,(indice(1)+1):1:indice(2)),f+crossnum(2),f+crossnum(1)];%对应于anothersection的点序号
|
||||
raovector2=(indice(2)+1):1:(indice(1)+raodu);
|
||||
num=size(raovector2,2);
|
||||
for q=1:1:num
|
||||
if(raovector2(q)>raodu) raovector2(q)=mod(raovector2(q),raodu);
|
||||
end
|
||||
end
|
||||
rao2=[f+crossnum(2),k(i,raovector2),f+crossnum(1),f+crossnum(2)];
|
||||
if norm(anothersection(f+crossnum(1),:)-anothersection(k(i,(indice(1))),:))<=1e-5&&norm(anothersection(f+crossnum(2),:)-anothersection(k(i,(indice(2))),:))<=1e-5
|
||||
rao1=[k(i,indice(1)),k(i,(indice(1)+1):1:indice(2)),k(i,indice(1))];
|
||||
rao2=[k(i,indice(2)),k(i,raovector2),k(i,indice(2))];
|
||||
end
|
||||
if norm(anothersection(f+crossnum(1),:)-anothersection(k(i,(indice(1))),:))<=1e-5 &&norm(anothersection(f+crossnum(2),:)-anothersection(k(i,(indice(2))),:))>=1e-5
|
||||
rao1=[k(i,indice(1)),k(i,(indice(1)+1):1:indice(2)),f+crossnum(2),k(i,indice(1))];
|
||||
rao2=[f+crossnum(2),k(i,raovector2),f+crossnum(2)];
|
||||
end
|
||||
if(norm(anothersection(f+crossnum(1),:)-anothersection(k(i,(indice(1))),:))>=1e-5&&norm(anothersection(f+crossnum(2),:)-anothersection(k(i,(indice(2))),:))<=1e-5)
|
||||
rao1=[f+crossnum(1),k(i,(indice(1)+1):1:indice(2)),f+crossnum(1)];
|
||||
rao2=[k(i,indice(2)),k(i,raovector2),f+crossnum(1),k(i,indice(2))];
|
||||
end
|
||||
p=size(rao1,2);q=size(rao2,2);
|
||||
xink(2*i-1,:)=zeros(1,z+2);
|
||||
xink(2*i-1,1:p)=rao1; xink(2*i,1:q)=rao2;
|
||||
%raoindice=find(k(i)~=0);
|
||||
% raodu=size(raodice,2)-1;
|
||||
% rao1=indice(1):1:indice(2);rao1=[rao1,indice(1)];
|
||||
% rao2=indice(2):1:(indice(1)+raodu);rao2=[rao2,indice(2)];
|
||||
% rao2=mod(rao2,raodu);
|
||||
% p=size(rao1,2);q=size(rao2,2);
|
||||
% xink(2*i-1,1:p)=k(i,rao1); xink(2*i,1:q)=k(i,rao2);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 去掉重复的点
|
||||
% dai=size(xink,1);
|
||||
% for i=1:dai
|
||||
% hui=unique(xink(i,:));
|
||||
% xink(i,:)=zeros(1,z+2);
|
||||
% if length(hui)>2
|
||||
% xink(i,1:length(hui))=hui;xink(i,1)=xink(i,length(hui));
|
||||
% end
|
||||
% end
|
||||
|
||||
%新的裂缝面网格剖分情况xink矩阵形成,xink中元素既是d3intersection中的行数,即实际的点序号
|
||||
% for i=1:1:2*n
|
||||
% indice=find(xink(i,:));
|
||||
% if(size(indice,2)==0) continue;
|
||||
% else
|
||||
% point=xink(i,indice)';
|
||||
% u=anothersection(point,1);
|
||||
% v=anothersection(point,2);
|
||||
% dt=DelaunayTri(u,v);
|
||||
% %triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
% k1 = convexHull(dt);%k1是列向量,且长度极可能与k矩阵列数不一致
|
||||
% plot(u,v, '.', 'markersize',10); hold on;
|
||||
% plot(u,v, 'r');
|
||||
% end
|
||||
% end
|
||||
% hold off;
|
||||
|
||||
% end
|
||||
% xink=unique(xink, 'rows', 'stable');
|
||||
% d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
% anothersection=unique(anothersection, 'rows', 'stable');
|
||||
%xink(i,1:7)=k(i,:); xink(i,10)=i;
|
||||
|
||||
|
||||
end
|
||||
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
function [ mesh] = frac_mat_mesh( d3intersection,anothersection,numvspoint,numofmesh )
|
||||
% 此函数由fracvsfrac函数拆分而来,
|
||||
% 是为了计算裂缝面与基质网格相交产生的基质网格
|
||||
%% 画出裂缝与网格线交点在裂缝面上剖分网格的情况
|
||||
n=size(numvspoint,1);
|
||||
mesh=zeros(n,7);%存放每个区域凸多边形的连点顺序,因为要形成闭合回路,因此列数加1以确保适用
|
||||
for i=1:1:n
|
||||
indice=find(numvspoint(i,:)~=0);
|
||||
if(size(indice,2)<3) mesh(i,:)=[0,0,0,0,0,0,0]; continue;
|
||||
end
|
||||
point=numvspoint(i,indice)';
|
||||
u=anothersection(point,1);
|
||||
v=anothersection(point,2);
|
||||
dt=DelaunayTri(u,v);
|
||||
%triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
k1 = convexHull(dt);%k1是列向量,且长度极可能与k矩阵列数不一致
|
||||
% plot(u,v, '.', 'markersize',10); hold on;
|
||||
% plot(u(k1),v(k1), 'r');
|
||||
m=size(k1,1);
|
||||
for j=1:1:m
|
||||
mesh(i,j)=point(k1(j));
|
||||
end
|
||||
% k1=k1';
|
||||
% m=size(k1,2);
|
||||
% k(i,1:m)=k1;
|
||||
%hold off;
|
||||
end
|
||||
%hold off
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,114 @@
|
||||
function [ cf ] = fun1( anothersection,fracnumber,p0,f )
|
||||
%fracturenumber是该裂缝网格包含的点编号,anothersection是该裂缝平面点的参数坐标矩阵
|
||||
% 将每个裂缝网格的最后一个点去掉,防止重复
|
||||
% f表示该裂缝网格所在裂缝面的信息
|
||||
% facemid矩阵表示基质网格各面的中点坐标
|
||||
indice=find(fracnumber~=0);
|
||||
m=size(indice,2);
|
||||
newsection=fracnumber(1,1:(m-1));
|
||||
u=anothersection(newsection',1);
|
||||
v=anothersection(newsection',2);
|
||||
% ucore=mean(u);%该裂缝单元中心对应的u,v值
|
||||
% vcore=mean(v);
|
||||
dt=delaunayTriangulation(u,v);
|
||||
n=size(dt,1);
|
||||
cf=0;
|
||||
for k=1:n
|
||||
coordinate=anothersection(newsection(dt(k,:))',:);%dt(k,:)只是newsection中的序号,因此如左所示
|
||||
cf=triint( coordinate,f,p0 )+cf;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
function [ cf ] = triint( coordinate,f,p0 )
|
||||
%TRIINT 此处显示有关此函数的摘要,f表示所处裂缝面的参数5*3矩阵
|
||||
% 此处显示详细说明
|
||||
syms u v r s length m n;
|
||||
t0=f(1,:);
|
||||
t1=f(2,:);
|
||||
t2=f(3,:);
|
||||
x1=coordinate(1,1);y1=coordinate(1,2);
|
||||
x2=coordinate(2,1);y2=coordinate(2,2);
|
||||
x3=coordinate(3,1);y3=coordinate(3,2);
|
||||
Jocbimatrix=[x1-x3,x2-x3;
|
||||
y1-y3,y2-y3];
|
||||
J=abs(det(Jocbimatrix));
|
||||
if(J==0) cf=0;
|
||||
else
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
p1=p0-t0;
|
||||
p2=A\p1';
|
||||
% p2=(A'*p1')\(A'*A);
|
||||
u0=p2(1);v0=p2(2);
|
||||
tol=t1*u0+t2*v0+t0-p0;
|
||||
if(norm(tol)==0)%说明该点在该平面上,是奇点
|
||||
% length=sqrt((u-u0)^2*norm(t1)^2+(v-v0)^2*norm(t2)^2);
|
||||
% g=-1/4/pi/length;
|
||||
% g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f1=@(r,s)(g1(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%上述方法无效,因此拟打算在积分时给length加上一个较小的正常数,使其为非奇点情况
|
||||
%该处理是合理的,因为裂缝本就具有一定厚度,并且该积分本身是可积的,这保证了这样处理的误差极小,暂定为加0.01。
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+1e-6;%与奇点相比具有本质的差别,在原积分可积的情况下,误差极小!
|
||||
% g=-1/(4*pi*length);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
else%不存在奇点
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
% g=-1/(4*pi*length);
|
||||
% g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% g=@(r,s)(-1./(4.*pi.*sqrt((((x1-x3).*r+(x2-x3).*s+x3).*t1(1)+((y1-y3).*r+(y2-y3).*s+y3).*t2(1)+t0(1)-p0(1)).^2+...
|
||||
% (((x1-x3).*r+(x2-x3).*s+x3).*t1(2)+((y1-y3).*r+(y2-y3).*s+y3).*t2(2)+t0(2)-p0(2)).^2+...
|
||||
% (((x1-x3).*r+(x2-x3).*s+x3).*t1(3)+((y1-y3).*r+(y2-y3).*s+y3).*t2(3)+t0(3)-p0(3)).^2)));
|
||||
% lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
% ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
% lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
% length=sqrt(lx^2+ly^2+lz^2);
|
||||
% g=-1/(4*pi*length);
|
||||
%g=subs(g,[u,v],[(x1-x3).*r+(x2-x3).*s+x3,(y1-y3).*r+(y2-y3).*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f=@(r,s)(g(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%cf=J*norm(t1)*norm(t2)*integral2(g1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
function [ cf ] = fun2( anothersection,fracnumber,coreco,f )
|
||||
%fracturenumber是该裂缝网格包含的点编号,anothersection是该裂缝平面点的参数坐标矩阵
|
||||
% 将每个裂缝网格的最后一个点去掉,防止重复
|
||||
% f表示该裂缝网格所在裂缝面的信息
|
||||
% facemid矩阵表示基质网格各面的中点坐标
|
||||
indice=find(fracnumber~=0);
|
||||
m=size(indice,2);
|
||||
newsection=fracnumber(1,1:(m-1));
|
||||
u=anothersection(newsection',1);
|
||||
v=anothersection(newsection',2);
|
||||
dt=delaunayTriangulation(u,v);
|
||||
n=size(dt,1);
|
||||
cf=0;
|
||||
for k=1:n
|
||||
coordinate=anothersection(newsection(dt(k,:))',:);%dt(k,:)只是newsection中的序号,因此如左所示
|
||||
cf=triint1( coordinate,f,coreco )+cf;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
function [ cf ] = triint1( coordinate,f,coreco )
|
||||
%TRIINT 此处显示有关此函数的摘要,f表示所处裂缝面的参数5*3矩阵
|
||||
% 此处显示详细说明
|
||||
syms u v r s length;
|
||||
t0=f(1,:);
|
||||
t1=f(2,:);
|
||||
t2=f(3,:);
|
||||
x1=coordinate(1,1);y1=coordinate(1,2);
|
||||
x2=coordinate(2,1);y2=coordinate(2,2);
|
||||
x3=coordinate(3,1);y3=coordinate(3,2);
|
||||
Jocbimatrix=[x1-x3,x2-x3;
|
||||
y1-y3,y2-y3];
|
||||
J=abs(det(Jocbimatrix));
|
||||
if(J==0) cf=0;
|
||||
else
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
p1=coreco-t0;
|
||||
p2=A\p1';
|
||||
u0=p2(1);v0=p2(2);
|
||||
tol=t1*u0+t2*v0+t0-coreco;
|
||||
if(norm(tol)==0)%说明该点在该平面上,是奇点
|
||||
% length=sqrt((u-u0)^2*norm(t1)^2+(v-v0)^2*norm(t2)^2)+1e-8;
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-coreco(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-coreco(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-coreco(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-8;
|
||||
g=-1/4/pi/length;
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
% ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
% lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+0.01;%与奇点相比具有本质的差别,在原积分可积的情况下,误差极小!
|
||||
% g=-1/(4*pi*length);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
else%不存在奇点
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-coreco(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-coreco(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-coreco(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-8;
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%cf=J*norm(t1)*norm(t2)*integral2(g1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
function [ cf ] = fun3( anothersection,p0,fracnumber,coreco,f )
|
||||
%fracturenumber是该裂缝网格包含的点编号,anothersection是该裂缝平面点的参数坐标矩阵
|
||||
% 将每个裂缝网格的最后一个点去掉,防止重复
|
||||
% f表示该裂缝网格所在裂缝面的信息
|
||||
% facemid矩阵表示基质网格各面的中点坐标
|
||||
% indice=find(fracnumber~=0);
|
||||
% m=size(indice,2);
|
||||
% newsection=fracnumber(1,1:(m-1));
|
||||
% u=anothersection(newsection',1);
|
||||
% v=anothersection(newsection',2);
|
||||
% dt=delaunayTriangulation(u,v);
|
||||
% n=size(dt,1);
|
||||
% cf=0;
|
||||
% for k=1:n
|
||||
% coordinate=anothersection(newsection(dt(k,:))',:);%dt(k,:)只是newsection中的序号,因此如左所示
|
||||
% cf=triint1( coordinate,f,p0 )+cf;
|
||||
% end
|
||||
|
||||
%TRIINT 此处显示有关此函数的摘要,f表示所处裂缝面的参数5*3矩阵
|
||||
% 此处显示详细说明
|
||||
syms u v r s length;
|
||||
t0=f(1,:);
|
||||
t1=f(2,:);
|
||||
t2=f(3,:);
|
||||
x1=coordinate(1,1);y1=coordinate(1,2);
|
||||
x2=coordinate(2,1);y2=coordinate(2,2);
|
||||
x3=coordinate(3,1);y3=coordinate(3,2);
|
||||
Jocbimatrix=[x1-x3,x2-x3;
|
||||
y1-y3,y2-y3];
|
||||
J=abs(det(Jocbimatrix));
|
||||
if(J==0) cf=0;
|
||||
else
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
p1=coreco-t0;
|
||||
p2=p1'\A;
|
||||
u0=p2(1);v0=p2(2);
|
||||
tol=t1*u0+t2*v0+t0-p0;
|
||||
if(norm(tol)==0)%说明该点在该平面上,是奇点
|
||||
% length=sqrt((u-u0)^2*norm(t1)^2+(v-v0)^2*norm(t2)^2);
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2);
|
||||
g=-1/4/pi/length;
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
else%不存在奇点
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2);
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
f=@(r,s)(g1(r,s));
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(cross(t1,t2))*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%cf=J*norm(t1)*norm(t2)*integral2(g1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
function [ numofmesh, numvspoint,numofregion] = interarea( d3intersection,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
%判断交点所在的区域编号
|
||||
%numofregion矩阵,row denotes point,column denotes ,一个点最多属于8个区域,因此建m行8列矩阵
|
||||
%numvspoint矩阵,row denotes the number of matrix mesh,column denotes the point,相交最多六个点,因此矩阵列数是6,行数为牵涉到的基质网格数
|
||||
%[ numofmesh, numvspoint,numofregion] = interarea( d3intersection,1,1,1,10,10,10 )
|
||||
m=size(d3intersection,1);
|
||||
numofregion=zeros(m,8);%判断这些交点属于哪个基质网格
|
||||
for i=1:m
|
||||
% a1=floor(d3intersection(i,1)/dx);
|
||||
% a2=mod(d3intersection(i,1),dx);
|
||||
% b1=floor(d3intersection(i,2)/dy);
|
||||
% b2=mod(d3intersection(i,2),dy);
|
||||
% c1=floor(d3intersection(i,3)/dz);
|
||||
% c2=mod(d3intersection(i,3),dz);
|
||||
|
||||
|
||||
for zhang=1:nx+1
|
||||
if xrao(1,zhang)<=d3intersection(i,1)
|
||||
a1=zhang-1;
|
||||
a2=d3intersection(i,1)-xrao(1,zhang);
|
||||
end
|
||||
end
|
||||
for zhang=1:ny+1
|
||||
if yrao(1,zhang)<=d3intersection(i,2)
|
||||
b1=zhang-1;
|
||||
b2=d3intersection(i,2)-yrao(1,zhang);
|
||||
end
|
||||
end
|
||||
for zhang=1:nz+1
|
||||
if zrao(1,zhang)<=d3intersection(i,3)
|
||||
c1=zhang-1;
|
||||
c2=d3intersection(i,3)-zrao(1,zhang);
|
||||
end
|
||||
end
|
||||
|
||||
numofregion(i,:)=[a1+b1*nx+c1*nx*ny,a1+1+b1*nx+c1*nx*ny,a1+(b1-1)*nx+c1*nx*ny,a1+1+(b1-1)*nx+c1*nx*ny,...
|
||||
a1+(b1-1)*nx+(c1-1)*nx*ny,a1+1+(b1-1)*nx+(c1-1)*nx*ny,a1+b1*nx+(c1-1)*nx*ny,a1+1+b1*nx+(c1-1)*nx*ny];
|
||||
% 坐标取0边界处理
|
||||
if((a1==0)&&(a2==0))
|
||||
numofregion(i,1)=0;numofregion(i,3)=0;numofregion(i,5)=0;numofregion(i,7)=0;
|
||||
end
|
||||
if((b1==0)&&(b2==0))
|
||||
numofregion(i,3)=0;numofregion(i,4)=0;numofregion(i,5)=0;numofregion(i,6)=0;
|
||||
end
|
||||
if((c1==0)&&(c2==0))
|
||||
numofregion(i,5)=0;numofregion(i,6)=0;numofregion(i,7)=0;numofregion(i,8)=0;
|
||||
end
|
||||
% 坐标取最大边界处理
|
||||
if a1==nx
|
||||
numofregion(i,2)=0;numofregion(i,4)=0;numofregion(i,6)=0;numofregion(i,8)=0;
|
||||
end
|
||||
if b1==ny
|
||||
numofregion(i,1)=0;numofregion(i,2)=0;numofregion(i,7)=0;numofregion(i,8)=0;
|
||||
end
|
||||
% if c1==nz
|
||||
% numofregion(i,1)=0;numofregion(i,2)=0;numofregion(i,3)=0;numofregion(i,4)=0;
|
||||
% end
|
||||
if(a2~=0)
|
||||
numofregion(i,1)=0;numofregion(i,3)=0;numofregion(i,5)=0;numofregion(i,7)=0;
|
||||
end
|
||||
if(b2~=0)
|
||||
numofregion(i,3)=0;numofregion(i,4)=0;numofregion(i,5)=0;numofregion(i,6)=0;
|
||||
end
|
||||
if(c2~=0)
|
||||
numofregion(i,5)=0;numofregion(i,6)=0;numofregion(i,7)=0;numofregion(i,8)=0;
|
||||
end
|
||||
end
|
||||
numofregion(numofregion>nx*ny*nz)=0;%把基质网格不包含的剔除,因为最上面一层没有
|
||||
numofmesh=unique(numofregion);%输出的是列向量,即包含交点的基质网格编号
|
||||
|
||||
%% 将只包含不多于两个交点的mesh去掉
|
||||
record=[];
|
||||
n=size(numofmesh,1);
|
||||
if(numofmesh(1)==0)
|
||||
record=[record;1];
|
||||
for i=2:1:n
|
||||
[I,J]= find(numofregion==numofmesh(i));%返回的是列向量
|
||||
k=size(I,1);
|
||||
if(k<=2) record=[record;i];
|
||||
end
|
||||
end
|
||||
else
|
||||
for i=1:1:n
|
||||
[I,J]= find(numofregion==numofmesh(i));
|
||||
k=size(I,1);
|
||||
if(k<=2) record=[record;k];
|
||||
end
|
||||
end
|
||||
end
|
||||
numofmesh(record,:)=[];
|
||||
|
||||
%%
|
||||
n=size(numofmesh,1);
|
||||
if(numofmesh(1)==0)
|
||||
numvspoint=zeros(n-1,6);%计算相应基质网格包含的交点
|
||||
for i=2:1:n
|
||||
[I,J]= find(numofregion==numofmesh(i));%返回的是列向量
|
||||
k=size(I,1);
|
||||
numvspoint(i-1,1:k)=I';
|
||||
end
|
||||
numofmesh=numofmesh(2:n,:);%把开头的0去掉
|
||||
else
|
||||
numvspoint=zeros(n,6);
|
||||
for i=1:1:n
|
||||
[I,J]= find(numofregion==numofmesh(i));
|
||||
k=size(I,1);
|
||||
numvspoint(i,1:k)=I';
|
||||
end
|
||||
end
|
||||
numvspoint=sort(numvspoint,2);
|
||||
|
||||
numvspoint=unique(numvspoint,'rows','stable');
|
||||
|
||||
|
||||
|
||||
|
||||
% if(a2==0)
|
||||
% if(b2==0)
|
||||
% if(c2==0)
|
||||
% numofregion(i,:)=[a1+b1*nx+c1*nx*ny,a1+1+b1*nx+c1*nx*ny,a1+(b1-1)*nx+c1*nx*ny,a1+1+(b1-1)*nx+c1*nx*ny,...
|
||||
% a1+(b1-1)*nx+(c1-1)*nx*ny,a1+1+(b1-1)*nx+(c1-1)*nx*ny,a1+b1*nx+(c1-1)*nx*ny,a1+1+b1*nx+(c1-1)*nx*ny];
|
||||
% else
|
||||
% numofregion(i,:)=[a1+b1*nx+c1*nx*ny,a1+1+b1*nx+c1*nx*ny,a1+(b1-1)*nx+c1*nx*ny,a1+1+(b1-1)*nx+c1*nx*ny,...
|
||||
% 0,0,0,0];
|
||||
% end
|
||||
% else
|
||||
% numofregion(i,:)=[a1+b1*nx+c1*nx*ny,a1+1+b1*nx+c1*nx*ny,...
|
||||
% 0,0,0,0,0,0];
|
||||
% end
|
||||
% else
|
||||
% numofregion(i,:)=[a1+1+b1*nx+c1*nx*ny,...
|
||||
% 0,0,0,0,0,0,0];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,303 @@
|
||||
function [ G,Gfm,Gff,Gf,Ap,Apf ] = interflowmf(dx,dy,dz,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra )
|
||||
%此函数用于计算在边界元方法中将源点选在基质网格面中心时,
|
||||
%与三相窜流有关的系数矩阵
|
||||
%G矩阵,偏G偏n矩阵,Gfm矩阵
|
||||
%dx,dy,dz分别是包含裂缝的该基质网格的尺寸
|
||||
%假设选取的点在某xy平面上,要计算的是相对的另一面上的G矩阵的cm
|
||||
% G矩阵求解
|
||||
m=size(connectmf,1);%包含有裂缝单元的基质网格数
|
||||
|
||||
syms z y x;
|
||||
%dx=1;dy=1;dz=1;
|
||||
%r=sqrt((z-dz/2).^2+y.^2+(dx/2).^2);
|
||||
%c11
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2));
|
||||
c11=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c12
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z+dz./2).^2));
|
||||
c12=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c13
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+(-dx/2).^2+(z+dz./2).^2));
|
||||
c13=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c16
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2+dz.^2));
|
||||
c16=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c21
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y+dy/2).^2+(-dz/2).^2));
|
||||
c21=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c22
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+z.^2));
|
||||
c22=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c23
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+(y+dy/2).^2+z.^2));
|
||||
c23=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c25
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+dy.^2+z.^2));
|
||||
c25=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c31
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x+dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c31=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c32
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x+dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c32=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c33
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+z.^2));
|
||||
c33=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c34
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(dx^2+y.^2+z.^2));
|
||||
c34=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c41
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x-dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c41=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c42
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x-dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c42=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c51
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c51=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c53
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c53=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c62
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z-dz/2).^2));
|
||||
c62=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c63
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+y.^2+(z-dz/2).^2));
|
||||
c63=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%计算G矩阵
|
||||
G=[c11,c12,c13,c13,c12,c16;
|
||||
c21,c22,c23,c23,c25,c21;
|
||||
c31,c32,c33,c34,c32,c31;
|
||||
c41,c42,c34,c33,c42,c41;
|
||||
c51,c25,c53,c53,c22,c51;
|
||||
c16,c62,c63,c63,c62,c11];
|
||||
%% dG矩阵的求解
|
||||
dG=zeros(6);
|
||||
grad=cell{6,1};
|
||||
%到编号为1源点的r(0,0,-dz/2)
|
||||
r1=@(x,y,z)-1./((4.*pi).*sqrt(x.^2+y.^2+(z+dz./2).^2));
|
||||
grad{1,1}=[diff(r1,x),diff(r1,y),diff(r1,z)];
|
||||
n1=[0,0,-1];
|
||||
%到编号为2源点的r(0,-dy/2,0)
|
||||
r2=@(x,y,z)-1./((4.*pi).*sqrt(x.^2+(y+dy/2).^2+z.^2));
|
||||
grad{2,1}=[diff(r2,x),diff(r2,y),diff(r2,z)];
|
||||
n2=[0,-1,0];
|
||||
%到编号为3源点的r(-dx/2,0,0)
|
||||
r3=@(x,y,z)-1./((4.*pi).*sqrt((x+dx/2).^2+y.^2+z.^2));
|
||||
grad{3,1}=[diff(r3,x),diff(r3,y),diff(r3,z)];
|
||||
n3=[-1,0,0];
|
||||
%到编号为4源点的r(dx/2,0,0)
|
||||
r4=@(x,y,z)-1./((4.*pi).*sqrt((x-dx/2).^2+y.^2+z.^2));
|
||||
grad{4,1}=[diff(r4,x),diff(r4,y),diff(r4,z)];
|
||||
n4=[0,0,1];
|
||||
%到编号为5源点的r(0,dy/2,0)
|
||||
r5=@(x,y,z)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+z.^2));
|
||||
grad{5,1}=[diff(r5,x),diff(r5,y),diff(r5,z)];
|
||||
n5=[0,1,0];
|
||||
%到编号为6源点的r(0,0,dz/2)
|
||||
r6=@(x,y,z)-1./((4.*pi).*sqrt(x.^2+y.^2+(z-dz./2).^2));
|
||||
grad{6,1}=[diff(r6,x),diff(r6,y),diff(r6,z)];
|
||||
n6=[0,0,1];
|
||||
%
|
||||
for i=1:6
|
||||
if j==1
|
||||
rao=grad{i,1}.*n1;
|
||||
g=subs(rao,z,-dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==2
|
||||
rao=grad{i,1}.*n2;
|
||||
g=subs(rao,y,-dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==3
|
||||
rao=grad{i,1}.*n3;
|
||||
g=subs(rao,x,-dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==4
|
||||
rao=grad{i,1}.*n4;
|
||||
g=subs(rao,x,dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==5
|
||||
rao=grad{i,1}.*n5;
|
||||
g=subs(rao,y,dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==1
|
||||
rao=grad{i,1}.*n6;
|
||||
g=subs(rao,z,dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
dG=dG-2*pi/(4*pi)*eye(6);
|
||||
% for i=1:6
|
||||
% for j=1:6
|
||||
% dG(i,j)=fun3
|
||||
% dG(i,i)=-2*pi/(4*pi);
|
||||
% end
|
||||
%% Gfm矩阵求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gfm=cell(m,1);
|
||||
Gfm=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(6,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
for j=1:6
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun1(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),p(j,:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gfm{i,1}=cf;
|
||||
end
|
||||
|
||||
%% Gff矩阵求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gff=cell(m,1);
|
||||
Gff=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
for j=1:n
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun2(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),corevsfra(matrixvsfra(connectmf{i,1},j),:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gff{i,1}=cf;
|
||||
end
|
||||
%% dGf矩阵的求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% dGf=cell(m,1);
|
||||
dGf=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
r=p(1,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
end
|
||||
dGf{i,1}=cf;
|
||||
end
|
||||
%% Gf矩阵的求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
syms z y x;
|
||||
m=size(matrixvsfra,1);
|
||||
Gf=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,6);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;%z不变
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;%y不变
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;%x不变
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;%x不变
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;%y不变
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;%z不变
|
||||
for j=1:n
|
||||
%for k=1:6%使立方体面循环
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(i,j)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
%k=1
|
||||
r=p(1,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,1)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=2
|
||||
r=p(2,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,2)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=3
|
||||
r=p(3,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,3)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=4
|
||||
r=p(4,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,4)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=5
|
||||
r=p(5,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,5)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=6
|
||||
r=p(6,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,6)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
Gf{i,1}=cf;
|
||||
end
|
||||
|
||||
%% 系数矩阵计算
|
||||
% m=size(matrixvsfra,1);
|
||||
% Ap=cell(m,1);
|
||||
Ap=cell(m,1);
|
||||
Apf=cell(m,1);
|
||||
for i=1:m
|
||||
% if (isempty(Gfm{i,1})==0)%非空
|
||||
Gin = G^(-1);
|
||||
Ap0 = dGf{i,1} - Gf{i,1} * Gin * dG{i,1};
|
||||
Apf0 = Gf{i,1} * Gin * Gfm{i,1} - Gff;
|
||||
Apfv = Apf0^(-1);
|
||||
Apt= Apfv * Ap0;
|
||||
Ap{i,1} = Apt * ones(6,1);
|
||||
Apf{i,1} = -Apfv;
|
||||
end
|
||||
end
|
||||
% Ap = Ap * ones(nb,1);
|
||||
% Apf = -Apfv;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,528 @@
|
||||
function [ G,Gfm,Gff,Gf,Ap,Apf ] = interflowmf1(r,dxv,dyv,dzv,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra )
|
||||
%此函数用于计算在边界元方法中将源点选在基质网格面中心时,
|
||||
%与三相窜流有关的系数矩阵
|
||||
%G矩阵,偏G偏n矩阵,Gfm矩阵
|
||||
%dx,dy,dz分别是包含裂缝的该基质网格的尺寸
|
||||
%假设选取的点在某xy平面上,要计算的是相对的另一面上的G矩阵的cm
|
||||
% G矩阵求解
|
||||
%[ G,Gfm,Gff,Gf,Ap,Apf,Apmt,Apft ] = interflowmf1(dxv,dyv,dzv,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra )
|
||||
syms z y x x0 y0 z0 x1 y1 z1;
|
||||
m=size(connectmf,1);%包含有裂缝单元的基质网格数
|
||||
dimen=zeros(m,3);
|
||||
for hui=1:m
|
||||
dimen(hui,:)=[dxv(connectmf{hui,1}) dyv(connectmf{hui,1}) dzv(connectmf{hui,1})];
|
||||
end
|
||||
raowang=unique(dimen,'rows');
|
||||
xiang=size(raowang,1);
|
||||
wang=cell(xiang,1);
|
||||
for i=1:xiang
|
||||
dx=raowang(i,1);dy=raowang(i,2);dz=raowang(i,3);
|
||||
%dx=1;dy=1;dz=1;
|
||||
%r=sqrt((z-dz/2).^2+y.^2+(dx/2).^2);
|
||||
%c11
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2));
|
||||
c11=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c12
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z+dz./2).^2));
|
||||
c12=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c13
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+(-dx/2).^2+(z+dz./2).^2));
|
||||
c13=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c16
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2+dz.^2));
|
||||
c16=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c21
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y+dy/2).^2+(-dz/2).^2));
|
||||
c21=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c22
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+z.^2));
|
||||
c22=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c23
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+(y+dy/2).^2+z.^2));
|
||||
c23=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c25
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+dy.^2+z.^2));
|
||||
c25=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c31
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x+dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c31=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c32
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x+dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c32=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c33
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+z.^2));
|
||||
c33=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c34
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(dx^2+y.^2+z.^2));
|
||||
c34=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c41
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x-dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c41=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c42
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x-dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c42=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c51
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c51=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c53
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c53=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c62
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z-dz/2).^2));
|
||||
c62=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c63
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+y.^2+(z-dz/2).^2));
|
||||
c63=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%计算G矩阵
|
||||
wang{i,1}=[c11,c12,c13,c13,c12,c16;
|
||||
c21,c22,c23,c23,c25,c21;
|
||||
c31,c32,c33,c34,c32,c31;
|
||||
c41,c42,c34,c33,c42,c41;
|
||||
c51,c25,c53,c53,c22,c51;
|
||||
c16,c62,c63,c63,c62,c11];
|
||||
end
|
||||
G=cell(m,1);
|
||||
for i=1:m
|
||||
% index=connectmf{i,1};%该基质网格编号
|
||||
for j=1:xiang
|
||||
if norm(dimen(i,:)-raowang(j,:))==0
|
||||
G{i,1}=wang{j,1};
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% dG矩阵的求解
|
||||
dai=cell(xiang,1);
|
||||
for zhang=1:xiang
|
||||
dx=raowang(zhang,1);
|
||||
dy=raowang(zhang,2);
|
||||
dz=raowang(zhang,3);
|
||||
dG=zeros(6);
|
||||
grad=cell(6,1);
|
||||
r=-1./((4.*pi).*sqrt((x-x0).^2+(y-y0).^2+(z-z0).^2));
|
||||
gradx=(x-x0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
grady=(y-y0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradz=(z-z0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradrao=[gradx,grady,gradz];
|
||||
grad{1,1}=subs(gradrao,[x0,y0,z0],[0,0,-dz/2]);
|
||||
grad{2,1}=subs(gradrao,[x0,y0,z0],[0,-dy/2,0]);
|
||||
grad{3,1}=subs(gradrao,[x0,y0,z0],[-dx/2,0,0]);
|
||||
grad{4,1}=subs(gradrao,[x0,y0,z0],[dx/2,0,0]);
|
||||
grad{5,1}=subs(gradrao,[x0,y0,z0],[0,dy/2,0]);
|
||||
grad{6,1}=subs(gradrao,[x0,y0,z0],[0,0,dz/2]);
|
||||
n1=[0,0,-1];
|
||||
n2=[0,-1,0];
|
||||
n3=[-1,0,0];
|
||||
n4=[1,0,0];
|
||||
n5=[0,1,0];
|
||||
n6=[0,0,1];
|
||||
for i=1:6
|
||||
for j=1:6
|
||||
if j==1
|
||||
rao=grad{i,1}*n1';
|
||||
g=subs(rao,z,-dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==2
|
||||
rao=grad{i,1}*n2';
|
||||
g=subs(rao,y,-dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
|
||||
end
|
||||
end
|
||||
if j==3
|
||||
rao=grad{i,1}*n3';
|
||||
g=subs(rao,x,-dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==4
|
||||
rao=grad{i,1}*n4';
|
||||
g=subs(rao,x,dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==5
|
||||
rao=grad{i,1}*n5';
|
||||
g=subs(rao,y,dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==6
|
||||
rao=grad{i,1}*n6';
|
||||
g=subs(rao,z,dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
dG=dG-2*pi/(4*pi)*eye(6);
|
||||
dai{zhang,1}=dG;
|
||||
end
|
||||
|
||||
dG=cell(m,1);
|
||||
for i=1:m
|
||||
% index=connectmf{i,1};%该基质网格编号
|
||||
for j=1:xiang
|
||||
if norm(dimen(i,:)-raowang(j,:))==0
|
||||
dG{i,1}=dai{j,1};
|
||||
end
|
||||
end
|
||||
end
|
||||
% for i=1:6
|
||||
% for j=1:6
|
||||
% dG(i,j)=fun3
|
||||
% dG(i,i)=-2*pi/(4*pi);
|
||||
% end
|
||||
%% Gfm矩阵求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gfm=cell(m,1);
|
||||
Gfm=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(6,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
for j=1:6
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun1(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),p(j,:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gfm{i,1}=cf;
|
||||
end
|
||||
|
||||
%% Gff矩阵求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gff=cell(m,1);
|
||||
Gff=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
for j=1:n
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun2(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),corevsfra(matrixvsfra(connectmf{i,1},j),:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gff{i,1}=cf;
|
||||
end
|
||||
%% dGf矩阵的求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% dGf=cell(m,1);
|
||||
|
||||
dGf=cell(m,1);
|
||||
|
||||
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
dx=dimen(i,1); dy=dimen(i,2); dz=dimen(i,3);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
cf=zeros(n,6);
|
||||
for k=1:n
|
||||
core=corevsfra(matrixvsfra(connectmf{i,1},k),:);
|
||||
% r=-1./((4.*pi).*sqrt(x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2);
|
||||
% grad=[diff(r,x),diff(r,y),diff(r,z)];
|
||||
gradx=(x-core(1))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grady=(y-core(2))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
gradz=(z-core(3))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grad=[gradx,grady,gradz];
|
||||
for j=1:6
|
||||
if j==1
|
||||
rao=grad*n1';
|
||||
g=subs(rao,[x,y,z],[p(1,1)+x1,p(1,2)+y1,p(1,3)]);
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x1,y1)g1(x1,y1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==2
|
||||
rao=grad*n2';
|
||||
% g=subs(rao,y,);
|
||||
g=subs(rao,[x,y,z],[p(2,1)+x1,p(2,2),p(2,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x1,z1)g1(x1,z1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==3
|
||||
rao=grad*n3';
|
||||
% g=subs(rao,x,-dx/2);
|
||||
g=subs(rao,[x,y,z],[p(3,1),p(3,2)+y1,p(3,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y1,z1)g1(y1,z1);
|
||||
cf(k,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==4
|
||||
rao=grad*n4';
|
||||
% g=subs(rao,x,dx/2);
|
||||
g=subs(rao,[x,y,z],[p(4,1),p(4,2)+y1,p(4,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);g2=@(y1,z1)g1(y1,z1);
|
||||
cf(k,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==5
|
||||
rao=grad*n5';
|
||||
% g=subs(rao,y,dy/2);
|
||||
g=subs(rao,[x,y,z],[p(5,1)+x1,p(5,2),p(5,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g); g2=@(x1,z1)g1(x1,z1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==6
|
||||
rao=grad*n6';
|
||||
% g=subs(rao,z,dz/2);
|
||||
g=subs(rao,[x,y,z],[p(6,1)+x1,p(6,2)+y1,p(6,3)]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g); g2=@(x1,y1)g1(x1,y1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
dGf{i,1}=cf;
|
||||
end
|
||||
|
||||
a=1;
|
||||
end
|
||||
%% Gf矩阵的求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
syms z y x;
|
||||
% m=size(matrixvsfra,1);
|
||||
Gf=cell(m,1);
|
||||
for i=1:m
|
||||
dx=dimen(i,1); dy=dimen(i,2); dz=dimen(i,3);
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,6);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;%z不变
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;%y不变
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;%x不变
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;%x不变
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;%y不变
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;%z不变
|
||||
for j=1:n
|
||||
%for k=1:6%使立方体面循环
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(i,j)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
%k=1
|
||||
r=p(1,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,1)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=2
|
||||
r=p(2,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,2)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=3
|
||||
r=p(3,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,3)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=4
|
||||
r=p(4,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,4)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=5
|
||||
r=p(5,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,5)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=6
|
||||
r=p(6,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,6)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
Gf{i,1}=cf;
|
||||
end
|
||||
|
||||
% % % %% Gmt
|
||||
% % % Gmt=cell(m,1);
|
||||
% % % hui=cell(xiang,1);
|
||||
% % % for zhang=1:xiang
|
||||
% % % dx=raowang(zhang,1);
|
||||
% % % dy=raowang(zhang,2);
|
||||
% % % dz=raowang(zhang,3);
|
||||
% % % raomt=zeros(6,1);
|
||||
% % % p=[0,0,-dz/2;
|
||||
% % % 0,-dy/2,0;
|
||||
% % % -dx/2,0,0;
|
||||
% % % dx/2,0,0;
|
||||
% % % 0,dy/2,0;
|
||||
% % % 0,0,dz/2;];
|
||||
% % % r=-1./((4.*pi).*sqrt((x-x0).^2+(y-y0).^2+(z-z0).^2)+1e-8);
|
||||
% % % for i=1:6
|
||||
% % % g1=subs(r,[x0,y0,z0],p(i,:));
|
||||
% % % f=matlabFunction(g1);
|
||||
% % % if i==1|| i==6
|
||||
% % % raomt(i,1)=1/2*integral3(f,-dx/2,dx/2,-dy/2,dy/2,-3*dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % % if i==6
|
||||
% % % % Gmt(i,1)=1/2*integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,3*dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % % end
|
||||
% % % if i==2|| i==5
|
||||
% % % raomt(i,1)=1/2*integral3(f,-dx/2,dx/2,-3*dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % if i==3|| i==4
|
||||
% % % raomt(i,1)=1/2*integral3(f,-3*dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % % Gmt(i,1)=integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % hui{zhang,1}=raomt;
|
||||
% % % end
|
||||
% % %
|
||||
% % % for j=1:xiang
|
||||
% % % if norm(dimen(i,:)-raowang(j,:))==0
|
||||
% % % Gmt{i,1}=dai{j,1};
|
||||
% % % end
|
||||
% % % end
|
||||
% % %
|
||||
% % % %% Gmft
|
||||
% % % m=size(connectmf,1);
|
||||
% % % Gmft=Gfm;
|
||||
% % %
|
||||
% % %
|
||||
% % % %% Gfmt
|
||||
% % % Gfmt=cell(m,1);
|
||||
% % % for i=1:m
|
||||
% % % indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
% % % n=size(indice,2);
|
||||
% % % cf=zeros(n,1);
|
||||
% % % if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
% % % for j=1:n
|
||||
% % % matnodes=nodes(connectmf{i,1},:);
|
||||
% % % matnodes=coord(matnodes,:);
|
||||
% % % pm=mean(matnodes);
|
||||
% % % core=corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
% % % r=-1./((4.*pi).*sqrt((x+pm(1)-core(1)).^2+(y+pm(2)-core(2)).^2+(z+pm(3)-core(3)).^2)+1e-8);
|
||||
% % % f=matlabFunction(r);
|
||||
% % % cf(j,1)=integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % end
|
||||
% % % Gfmt{i,1}=cf;
|
||||
% % % end
|
||||
% % %
|
||||
% % % %% Gfft
|
||||
% % % Gfft=Gff;%没乘以相应缝宽
|
||||
%% 系数矩阵计算
|
||||
% m=size(matrixvsfra,1);
|
||||
% Ap=cell(m,1);
|
||||
Ap=cell(m,1);
|
||||
Apf=cell(m,1);
|
||||
% Apmt=cell(m,1);
|
||||
% Apft=cell(m,1);
|
||||
for i=1:m
|
||||
% if (isempty(Gfm{i,1})==0)%非空
|
||||
% 计算转换矩阵
|
||||
% grid_num=connectmf{i,1};
|
||||
% % 先只考虑上下左右,因为如果要加上上下,则需要预先在上下各垫一层,防止超出索引,这样会极大增加运算量
|
||||
% C=zeros(4,5);
|
||||
% rel_grid=[grid_num-r.nx,grid_num-1,grid_num+1,grid_num+r.nx,grid_num];
|
||||
% % x 方向
|
||||
% C(1,1)=r.ky(grid_num-r.nx)/r.dyv(grid_num-r.nx)/(r.ky(grid_num)/r.dyv(grid_num)+r.ky(grid_num-r.nx)/r.dyv(grid_num-r.nx));
|
||||
% C(1,5)=r.ky(grid_num)/r.dyv(grid_num)/(r.ky(grid_num)/r.dyv(grid_num)+r.ky(grid_num-r.nx)/r.dyv(grid_num-r.nx));
|
||||
% C(4,4)=r.ky(grid_num+r.nx)/r.dyv(grid_num+r.nx)/(r.ky(grid_num)/r.dyv(grid_num)+r.ky(grid_num+r.nx)/r.dyv(grid_num+r.nx));
|
||||
% C(4,5)=r.ky(grid_num)/r.dyv(grid_num)/(r.ky(grid_num)/r.dyv(grid_num)+r.ky(grid_num+r.nx)/r.dyv(grid_num+r.nx));
|
||||
% % y 方向
|
||||
% C(2,2)=r.kx(grid_num-1)/r.dxv(grid_num-1)/(r.kx(grid_num)/r.dxv(grid_num)+r.kx(grid_num-1)/r.dxv(grid_num-1));
|
||||
% C(2,5)=r.kx(grid_num)/r.dxv(grid_num)/(r.kx(grid_num)/r.dxv(grid_num)+r.kx(grid_num-1)/r.dxv(grid_num-1));
|
||||
% C(3,3)=r.kx(grid_num+1)/r.dxv(grid_num+1)/(r.kx(grid_num)/r.dxv(grid_num)+r.kx(grid_num+1)/r.dxv(grid_num+1));
|
||||
% C(3,5)=r.kx(grid_num)/r.dxv(grid_num)/(r.kx(grid_num)/r.dxv(grid_num)+r.kx(grid_num+1)/r.dxv(grid_num+1));
|
||||
% C=[[0,0,0,0,1];C;[0,0,0,0,1]];
|
||||
|
||||
Gin = G{i,1}^(-1);
|
||||
Ap0 = dGf{i,1} - Gf{i,1} * Gin * dG{i,1};
|
||||
Apf0 = Gf{i,1} * Gin * Gfm{i,1} - Gff{i,1};
|
||||
Apfv = Apf0^(-1);
|
||||
Apt= Apfv * Ap0;
|
||||
Ap{i,1} = Apt * ones(6,1);
|
||||
% Ap{i,1} = Apt * C;
|
||||
% Ap{i,2} = rel_grid;
|
||||
Apf{i,1} = -Apfv;
|
||||
wo=size(Apfv,1);
|
||||
ni=size(Apfv,2);
|
||||
% Apmt{i,1}=0;
|
||||
% Apft{i,1}=zeros(wo,ni);
|
||||
% % % Apmt{i,1}=Apfv*(Gfmt{i,1}-Gf{i,1}*Gin*Gmt{i,1});
|
||||
% % % Apft{i,1}=Apfv*(Gfft{i,1}-Gf{i,1}*Gin*Gmft{i,1});
|
||||
end
|
||||
end
|
||||
% Ap = Ap * ones(nb,1);
|
||||
% Apf = -Apfv;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,528 @@
|
||||
function [ G,Gfm,Gff,Gf,Ap,Apf ] = interflowmf_MODIFIED(rr,dxv,dyv,dzv,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra )
|
||||
%此函数用于计算在边界元方法中将源点选在基质网格面中心时,
|
||||
%与三相窜流有关的系数矩阵
|
||||
%G矩阵,偏G偏n矩阵,Gfm矩阵
|
||||
%dx,dy,dz分别是包含裂缝的该基质网格的尺寸
|
||||
%假设选取的点在某xy平面上,要计算的是相对的另一面上的G矩阵的cm
|
||||
% G矩阵求解
|
||||
%[ G,Gfm,Gff,Gf,Ap,Apf,Apmt,Apft ] = interflowmf1(dxv,dyv,dzv,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra )
|
||||
syms z y x x0 y0 z0 x1 y1 z1;
|
||||
m=size(connectmf,1);%包含有裂缝单元的基质网格数
|
||||
dimen=zeros(m,3);
|
||||
for hui=1:m
|
||||
dimen(hui,:)=[dxv(connectmf{hui,1}) dyv(connectmf{hui,1}) dzv(connectmf{hui,1})];
|
||||
end
|
||||
raowang=unique(dimen,'rows');
|
||||
xiang=size(raowang,1);
|
||||
wang=cell(xiang,1);
|
||||
for i=1:xiang
|
||||
dx=raowang(i,1);dy=raowang(i,2);dz=raowang(i,3);
|
||||
%dx=1;dy=1;dz=1;
|
||||
%r=sqrt((z-dz/2).^2+y.^2+(dx/2).^2);
|
||||
%c11
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2));
|
||||
c11=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c12
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z+dz./2).^2));
|
||||
c12=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c13
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+(-dx/2).^2+(z+dz./2).^2));
|
||||
c13=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c16
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+y.^2+dz.^2));
|
||||
c16=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c21
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y+dy/2).^2+(-dz/2).^2));
|
||||
c21=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c22
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+z.^2));
|
||||
c22=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c23
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+(y+dy/2).^2+z.^2));
|
||||
c23=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c25
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+dy.^2+z.^2));
|
||||
c25=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c31
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x+dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c31=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c32
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x+dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c32=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c33
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(y.^2+z.^2));
|
||||
c33=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c34
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(dx^2+y.^2+z.^2));
|
||||
c34=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c41
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x-dx/2).^2+y.^2+(-dz/2).^2));
|
||||
c41=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c42
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x-dx/2).^2+(-dy/2).^2+z.^2));
|
||||
c42=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c51
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c51=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c53
|
||||
g=@(x,y)-1./((4.*pi).*sqrt(x.^2+(y-dy/2).^2+(-dz/2).^2));
|
||||
c53=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c62
|
||||
g=@(x,z)-1./((4.*pi).*sqrt(x.^2+(-dy/2).^2+(z-dz/2).^2));
|
||||
c62=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%c63
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((-dx/2).^2+y.^2+(z-dz/2).^2));
|
||||
c63=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%计算G矩阵
|
||||
wang{i,1}=[c11,c12,c13,c13,c12,c16;
|
||||
c21,c22,c23,c23,c25,c21;
|
||||
c31,c32,c33,c34,c32,c31;
|
||||
c41,c42,c34,c33,c42,c41;
|
||||
c51,c25,c53,c53,c22,c51;
|
||||
c16,c62,c63,c63,c62,c11];
|
||||
end
|
||||
G=cell(m,1);
|
||||
for i=1:m
|
||||
% index=connectmf{i,1};%该基质网格编号
|
||||
for j=1:xiang
|
||||
if norm(dimen(i,:)-raowang(j,:))==0
|
||||
G{i,1}=wang{j,1};
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% dG矩阵的求解
|
||||
dai=cell(xiang,1);
|
||||
n1=[0,0,-1];
|
||||
n2=[0,-1,0];
|
||||
n3=[-1,0,0];
|
||||
n4=[1,0,0];
|
||||
n5=[0,1,0];
|
||||
n6=[0,0,1];
|
||||
r=-1./((4.*pi).*sqrt((x-x0).^2+(y-y0).^2+(z-z0).^2));
|
||||
for zhang=1:xiang
|
||||
dx=raowang(zhang,1);
|
||||
dy=raowang(zhang,2);
|
||||
dz=raowang(zhang,3);
|
||||
dG=zeros(6);
|
||||
grad=cell(6,1);
|
||||
gradx=(x-x0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
grady=(y-y0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradz=(z-z0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradrao=[gradx,grady,gradz];
|
||||
grad{1,1}=subs(gradrao,[x0,y0,z0],[0,0,-dz/2]);
|
||||
grad{2,1}=subs(gradrao,[x0,y0,z0],[0,-dy/2,0]);
|
||||
grad{3,1}=subs(gradrao,[x0,y0,z0],[-dx/2,0,0]);
|
||||
grad{4,1}=subs(gradrao,[x0,y0,z0],[dx/2,0,0]);
|
||||
grad{5,1}=subs(gradrao,[x0,y0,z0],[0,dy/2,0]);
|
||||
grad{6,1}=subs(gradrao,[x0,y0,z0],[0,0,dz/2]);
|
||||
for i=1:6
|
||||
for j=1:6
|
||||
if j==1
|
||||
rao=grad{i,1}*n1';
|
||||
g=subs(rao,z,-dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==2
|
||||
rao=grad{i,1}*n2';
|
||||
g=subs(rao,y,-dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
|
||||
end
|
||||
end
|
||||
if j==3
|
||||
rao=grad{i,1}*n3';
|
||||
g=subs(rao,x,-dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==4
|
||||
rao=grad{i,1}*n4';
|
||||
g=subs(rao,x,dx/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==5
|
||||
rao=grad{i,1}*n5';
|
||||
g=subs(rao,y,dy/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==6
|
||||
rao=grad{i,1}*n6';
|
||||
g=subs(rao,z,dz/2);
|
||||
if j~=i
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
dG=dG-2*pi/(4*pi)*eye(6);
|
||||
dai{zhang,1}=dG;
|
||||
end
|
||||
|
||||
dG=cell(m,1);
|
||||
parfor i=1:m
|
||||
% index=connectmf{i,1};%该基质网格编号
|
||||
for j=1:xiang
|
||||
if norm(dimen(i,:)-raowang(j,:))==0
|
||||
dG{i,1}=dai{j,1};
|
||||
end
|
||||
end
|
||||
end
|
||||
% for i=1:6
|
||||
% for j=1:6
|
||||
% dG(i,j)=fun3
|
||||
% dG(i,i)=-2*pi/(4*pi);
|
||||
% end
|
||||
%% Gfm矩阵求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gfm=cell(m,1);
|
||||
Gfm=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(6,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
for j=1:6
|
||||
for k=1:n
|
||||
for xiao=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(xiao)) break;%判断该点处在哪个裂缝平面上,可知在xiao-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun1(raopoint{xiao-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),p(j,:),f(5*(xiao-1)-4:5*(xiao-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gfm{i,1}=cf;
|
||||
end
|
||||
|
||||
%% Gff矩阵求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gff=cell(m,1);
|
||||
Gff=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
for j=1:n
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun2(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),corevsfra(matrixvsfra(connectmf{i,1},j),:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gff{i,1}=cf;
|
||||
end
|
||||
%% dGf矩阵的求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% dGf=cell(m,1);
|
||||
|
||||
dGf=cell(m,1);
|
||||
|
||||
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
dx=dimen(i,1); dy=dimen(i,2); dz=dimen(i,3);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;
|
||||
cf=zeros(n,6);
|
||||
for k=1:n
|
||||
core=corevsfra(matrixvsfra(connectmf{i,1},k),:);
|
||||
% r=-1./((4.*pi).*sqrt(x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2);
|
||||
% grad=[diff(r,x),diff(r,y),diff(r,z)];
|
||||
gradx=(x-core(1))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grady=(y-core(2))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
gradz=(z-core(3))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grad=[gradx,grady,gradz];
|
||||
for j=1:6
|
||||
if j==1
|
||||
rao=grad*n1';
|
||||
g=subs(rao,[x,y,z],[p(1,1)+x1,p(1,2)+y1,p(1,3)]);
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x1,y1)g1(x1,y1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==2
|
||||
rao=grad*n2';
|
||||
% g=subs(rao,y,);
|
||||
g=subs(rao,[x,y,z],[p(2,1)+x1,p(2,2),p(2,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x1,z1)g1(x1,z1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==3
|
||||
rao=grad*n3';
|
||||
% g=subs(rao,x,-dx/2);
|
||||
g=subs(rao,[x,y,z],[p(3,1),p(3,2)+y1,p(3,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y1,z1)g1(y1,z1);
|
||||
cf(k,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==4
|
||||
rao=grad*n4';
|
||||
% g=subs(rao,x,dx/2);
|
||||
g=subs(rao,[x,y,z],[p(4,1),p(4,2)+y1,p(4,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);g2=@(y1,z1)g1(y1,z1);
|
||||
cf(k,j)=integral2(g2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==5
|
||||
rao=grad*n5';
|
||||
% g=subs(rao,y,dy/2);
|
||||
g=subs(rao,[x,y,z],[p(5,1)+x1,p(5,2),p(5,3)+z1]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g); g2=@(x1,z1)g1(x1,z1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
if j==6
|
||||
rao=grad*n6';
|
||||
% g=subs(rao,z,dz/2);
|
||||
g=subs(rao,[x,y,z],[p(6,1)+x1,p(6,2)+y1,p(6,3)]);
|
||||
|
||||
if (isempty(symvar(g)))
|
||||
cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g); g2=@(x1,y1)g1(x1,y1);
|
||||
cf(k,j)=integral2(g2,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
dGf{i,1}=cf;
|
||||
end
|
||||
|
||||
a=1;
|
||||
end
|
||||
%% Gf矩阵的求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
syms z y x;
|
||||
% m=size(matrixvsfra,1);
|
||||
Gf=cell(m,1);
|
||||
for i=1:m
|
||||
dx=dimen(i,1); dy=dimen(i,2); dz=dimen(i,3);
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,6);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},:);
|
||||
matnodes=coord(matnodes,:);
|
||||
p(1,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(3,:)+matnodes(4,:))/4;%z不变
|
||||
p(2,:)=(matnodes(1,:)+matnodes(2,:)+matnodes(5,:)+matnodes(6,:))/4;%y不变
|
||||
p(3,:)=(matnodes(1,:)+matnodes(3,:)+matnodes(5,:)+matnodes(7,:))/4;%x不变
|
||||
p(4,:)=(matnodes(2,:)+matnodes(4,:)+matnodes(6,:)+matnodes(8,:))/4;%x不变
|
||||
p(5,:)=(matnodes(3,:)+matnodes(4,:)+matnodes(7,:)+matnodes(8,:))/4;%y不变
|
||||
p(6,:)=(matnodes(5,:)+matnodes(6,:)+matnodes(7,:)+matnodes(8,:))/4;%z不变
|
||||
for j=1:n
|
||||
%for k=1:6%使立方体面循环
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(i,j)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
%k=1
|
||||
r=p(1,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,1)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=2
|
||||
r=p(2,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,2)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=3
|
||||
r=p(3,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,3)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=4
|
||||
r=p(4,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(y,z)-1./((4.*pi).*sqrt(r(1).^2+(r(2)+y).^2+(r(3)+z).^2));
|
||||
cf(j,4)=integral2(g,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=5
|
||||
r=p(5,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((r(1)+x).^2+r(2).^2+(r(3)+z).^2));
|
||||
cf(j,5)=integral2(g,-dx/2,dx/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%k=6
|
||||
r=p(6,:)-corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((r(1)+x).^2+(r(2)+y).^2+r(3).^2));
|
||||
cf(j,6)=integral2(g,-dx/2,dx/2,-dy/2,dy/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
Gf{i,1}=cf;
|
||||
end
|
||||
|
||||
% % % %% Gmt
|
||||
% % % Gmt=cell(m,1);
|
||||
% % % hui=cell(xiang,1);
|
||||
% % % for zhang=1:xiang
|
||||
% % % dx=raowang(zhang,1);
|
||||
% % % dy=raowang(zhang,2);
|
||||
% % % dz=raowang(zhang,3);
|
||||
% % % raomt=zeros(6,1);
|
||||
% % % p=[0,0,-dz/2;
|
||||
% % % 0,-dy/2,0;
|
||||
% % % -dx/2,0,0;
|
||||
% % % dx/2,0,0;
|
||||
% % % 0,dy/2,0;
|
||||
% % % 0,0,dz/2;];
|
||||
% % % r=-1./((4.*pi).*sqrt((x-x0).^2+(y-y0).^2+(z-z0).^2)+1e-8);
|
||||
% % % for i=1:6
|
||||
% % % g1=subs(r,[x0,y0,z0],p(i,:));
|
||||
% % % f=matlabFunction(g1);
|
||||
% % % if i==1|| i==6
|
||||
% % % raomt(i,1)=1/2*integral3(f,-dx/2,dx/2,-dy/2,dy/2,-3*dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % % if i==6
|
||||
% % % % Gmt(i,1)=1/2*integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,3*dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % % end
|
||||
% % % if i==2|| i==5
|
||||
% % % raomt(i,1)=1/2*integral3(f,-dx/2,dx/2,-3*dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % if i==3|| i==4
|
||||
% % % raomt(i,1)=1/2*integral3(f,-3*dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % % Gmt(i,1)=integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % hui{zhang,1}=raomt;
|
||||
% % % end
|
||||
% % %
|
||||
% % % for j=1:xiang
|
||||
% % % if norm(dimen(i,:)-raowang(j,:))==0
|
||||
% % % Gmt{i,1}=dai{j,1};
|
||||
% % % end
|
||||
% % % end
|
||||
% % %
|
||||
% % % %% Gmft
|
||||
% % % m=size(connectmf,1);
|
||||
% % % Gmft=Gfm;
|
||||
% % %
|
||||
% % %
|
||||
% % % %% Gfmt
|
||||
% % % Gfmt=cell(m,1);
|
||||
% % % for i=1:m
|
||||
% % % indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
% % % n=size(indice,2);
|
||||
% % % cf=zeros(n,1);
|
||||
% % % if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
% % % for j=1:n
|
||||
% % % matnodes=nodes(connectmf{i,1},:);
|
||||
% % % matnodes=coord(matnodes,:);
|
||||
% % % pm=mean(matnodes);
|
||||
% % % core=corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
% % % r=-1./((4.*pi).*sqrt((x+pm(1)-core(1)).^2+(y+pm(2)-core(2)).^2+(z+pm(3)-core(3)).^2)+1e-8);
|
||||
% % % f=matlabFunction(r);
|
||||
% % % cf(j,1)=integral3(f,-dx/2,dx/2,-dy/2,dy/2,-dz/2,dz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% % % end
|
||||
% % % end
|
||||
% % % Gfmt{i,1}=cf;
|
||||
% % % end
|
||||
% % %
|
||||
% % % %% Gfft
|
||||
% % % Gfft=Gff;%没乘以相应缝宽
|
||||
%% 系数矩阵计算
|
||||
% m=size(matrixvsfra,1);
|
||||
% Ap=cell(m,1);
|
||||
Ap=cell(m,2);
|
||||
Apf=cell(m,1);
|
||||
% Apmt=cell(m,1);
|
||||
% Apft=cell(m,1);
|
||||
for i=1:m
|
||||
% if (isempty(Gfm{i,1})==0)%非空
|
||||
% 计算转换矩阵
|
||||
grid_num=connectmf{i,1};
|
||||
% 先只考虑上下左右,因为如果要加上上下,则需要预先在上下各垫一层,防止超出索引,这样会极大增加运算量
|
||||
C=zeros(4,5);
|
||||
rel_grid=[grid_num-rr.nx,grid_num-1,grid_num+1,grid_num+rr.nx,grid_num];
|
||||
% x 方向
|
||||
C(1,1)=rr.ky(grid_num-rr.nx)/rr.dyv(grid_num-rr.nx)/(rr.ky(grid_num)/rr.dyv(grid_num)+rr.ky(grid_num-rr.nx)/rr.dyv(grid_num-rr.nx));
|
||||
C(1,5)=rr.ky(grid_num)/rr.dyv(grid_num)/(rr.ky(grid_num)/rr.dyv(grid_num)+rr.ky(grid_num-rr.nx)/rr.dyv(grid_num-rr.nx));
|
||||
C(4,4)=rr.ky(grid_num+rr.nx)/rr.dyv(grid_num+rr.nx)/(rr.ky(grid_num)/rr.dyv(grid_num)+rr.ky(grid_num+rr.nx)/rr.dyv(grid_num+rr.nx));
|
||||
C(4,5)=rr.ky(grid_num)/rr.dyv(grid_num)/(rr.ky(grid_num)/rr.dyv(grid_num)+rr.ky(grid_num+rr.nx)/rr.dyv(grid_num+rr.nx));
|
||||
% y 方向
|
||||
C(2,2)=rr.kx(grid_num-1)/rr.dxv(grid_num-1)/(rr.kx(grid_num)/rr.dxv(grid_num)+rr.kx(grid_num-1)/rr.dxv(grid_num-1));
|
||||
C(2,5)=rr.kx(grid_num)/rr.dxv(grid_num)/(rr.kx(grid_num)/rr.dxv(grid_num)+rr.kx(grid_num-1)/rr.dxv(grid_num-1));
|
||||
C(3,3)=rr.kx(grid_num+1)/rr.dxv(grid_num+1)/(rr.kx(grid_num)/rr.dxv(grid_num)+rr.kx(grid_num+1)/rr.dxv(grid_num+1));
|
||||
C(3,5)=rr.kx(grid_num)/rr.dxv(grid_num)/(rr.kx(grid_num)/rr.dxv(grid_num)+rr.kx(grid_num+1)/rr.dxv(grid_num+1));
|
||||
C=[[0,0,0,0,1];C;[0,0,0,0,1]];
|
||||
|
||||
Gin = G{i,1}^(-1);
|
||||
Ap0 = dGf{i,1} - Gf{i,1} * Gin * dG{i,1};
|
||||
Apf0 = Gf{i,1} * Gin * Gfm{i,1} - Gff{i,1};
|
||||
Apfv = Apf0^(-1);
|
||||
Apt= Apfv * Ap0;
|
||||
% Ap{i,1} = Apt * ones(6,1);
|
||||
Ap{i,1} = Apt * C;
|
||||
Ap{i,2} = rel_grid;
|
||||
Apf{i,1} = -Apfv;
|
||||
wo=size(Apfv,1);
|
||||
ni=size(Apfv,2);
|
||||
% Apmt{i,1}=0;
|
||||
% Apft{i,1}=zeros(wo,ni);
|
||||
% % % Apmt{i,1}=Apfv*(Gfmt{i,1}-Gf{i,1}*Gin*Gmt{i,1});
|
||||
% % % Apft{i,1}=Apfv*(Gfft{i,1}-Gf{i,1}*Gin*Gmft{i,1});
|
||||
end
|
||||
end
|
||||
% Ap = Ap * ones(nb,1);
|
||||
% Apf = -Apfv;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,225 @@
|
||||
function [ d3intersection ] = intersectionsolve(fracture,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
% 裂缝由两个相互正交向量,及两个参数的范围确定,面缝具有几何上的对称性
|
||||
% dx,dy,dz,lx,ly,lz是网格属性参数
|
||||
% t=t0+u*t1+v*t2;缝上参数为u,v点的向量
|
||||
%如果只是相交于一点,则只用每一行前三个是交点坐标,存在d3intersection中;
|
||||
%如果相交于一条线段,存在d2intersection中则只用每一行前三个中两个是坐标线的两个坐标,另一个代表未知的坐标(用-1表示);第四、五个表示相交线段在坐标线上的另一坐标取值范围;
|
||||
%对d2intersection中的每一条线段进行处理
|
||||
%示例:[ d3intersection ] = intersectionsolve([0.5,0,0],[1,1,0],[0,0,1],0,6,0,7,1,1,1,10,10,10)
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
umin=fracture(4,1);umax=fracture(4,2);vmin=fracture(5,1);vmax=fracture(5,2);
|
||||
d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
% [I,J]=find(d3intersection==-1000);%用-1000做标识
|
||||
% n=min(I);
|
||||
d2intersection=zeros(50,5);
|
||||
n=1;
|
||||
i=1;
|
||||
unknown=ones(2,1);
|
||||
% 判断与x方向坐标线相交情况
|
||||
%由于网格间距很可能不相等,故进行处理
|
||||
|
||||
|
||||
for wang=1:ny+1
|
||||
y=yrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[y;z]-[t0(2);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
x=[t1(1),t2(1)]*unknown+t0(1);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
if((t1(2)~=0))
|
||||
if(((t1(2)*z)==(t1(3)*y))&&(y/t1(2)>=umin)&&(y/t1(2)<=umax))
|
||||
intersecxmin=t1(1)*y/t1(2)+t2(1)*vmin;
|
||||
intersecxmax=t1(1)*y/t1(2)+t2(1)*vmax;
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax]+[0,t0(2),t0(3),t0(1),t0(1)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t1(3)~=0)
|
||||
if(((t1(2)*z)==(t1(3)*y))&&(z/t1(3)>=umin)&&(z/t1(3)<=umax))
|
||||
intersecxmin=t1(1)*z/t1(3)+t2(1)*vmin;
|
||||
intersecxmax=t1(1)*z/t1(3)+t2(1)*vmax;
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax]+[0,t0(2),t0(3),t0(1),t0(1)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t2(2)~=0)
|
||||
if(((t2(2)*z)==(t2(3)*y))&&(y/t2(2)>=vmin)&&(y/t2(2)<=vmax))
|
||||
intersecxmin=t1(1)*umin+t2(1)*y/t2(2);
|
||||
intersecxmax=t1(1)*umax+t2(1)*y/t2(2);
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax]+[0,t0(2),t0(3),t0(1),t0(1)];
|
||||
i=i+1;
|
||||
end
|
||||
else
|
||||
if(((t2(2)*z)==(t2(3)*y))&&(z/t2(3)>=vmin)&&(z/t2(3)<=vmax))
|
||||
intersecxmin=t1(1)*umin+t2(1)*z/t2(3);
|
||||
intersecxmax=t1(1)*umax+t2(1)*z/t2(3);
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax]+[0,t0(2),t0(3),t0(1),t0(1)];
|
||||
i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% 判断与y方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(3),t2(3)];
|
||||
b=[x;z]-[t0(1);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
y=[t1(2),t2(2)]*unknown+t0(2);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
if((t1(1)~=0))
|
||||
if(((t1(1)*z)==(t1(3)*x))&&(x/t1(1)>=umin)&&(x/t1(1)<=umax))
|
||||
intersecymin=t1(2)*x/t1(1)+t2(2)*vmin;
|
||||
intersecymax=t1(2)*x/t1(1)+t2(2)*vmax;
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax]+[t0(1),0,t0(3),t0(2),t0(2)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t1(3)~=0)
|
||||
if(((t1(1)*z)==(t1(3)*x))&&(z/t1(3)>=umin)&&(z/t1(3)<=umax))
|
||||
intersecymin=t1(2)*z/t1(3)+t2(2)*vmin;
|
||||
intersecymax=t1(2)*z/t1(3)+t2(2)*vmax;
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax]+[t0(1),0,t0(3),t0(2),t0(2)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t2(1)~=0)
|
||||
if(((t2(1)*z)==(t2(3)*x))&&(x/t2(1)>=vmin)&&(x/t2(1)<=vmax))
|
||||
intersecymin=t1(2)*umin+t2(2)*x/t2(1);
|
||||
intersecymax=t1(2)*umax+t2(2)*x/t2(1);
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax]+[t0(1),0,t0(3),t0(2),t0(2)];
|
||||
i=i+1;
|
||||
end
|
||||
else
|
||||
if(((t2(1)*z)==(t2(3)*x))&&(z/t2(3)>=vmin)&&(z/t2(3)<=vmax))
|
||||
intersecymin=t1(2)*umin+t2(2)*z/t2(3);
|
||||
intersecymax=t1(2)*umax+t2(2)*z/t2(3);
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax]+[t0(1),0,t0(3),t0(2),t0(2)];
|
||||
i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%判断与z方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:ny+1
|
||||
y=yrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2)];
|
||||
b=[x;y]-[t0(1);t0(2)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
z=[t1(3),t2(3)]*unknown+t0(3);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
if((t1(1)~=0))
|
||||
if(((t1(1)*y)==(t1(2)*x))&&(x/t1(1)>=umin)&&(x/t1(1)<=umax))
|
||||
interseczmin=t1(3)*x/t1(1)+t2(3)*vmin;
|
||||
interseczmax=t1(3)*x/t1(1)+t2(3)*vmax;
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax]+[t0(1),t0(2),0,t0(3),t0(3)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t1(2)~=0)
|
||||
if(((t1(1)*y)==(t1(2)*x))&&(y/t1(2)>=umin)&&(y/t1(2)<=umax))
|
||||
interseczmin=t1(3)*y/t1(2)+t2(3)*vmin;
|
||||
interseczmax=t1(3)*y/t1(2)+t2(3)*vmax;
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax]+[t0(1),t0(2),0,t0(3),t0(3)];
|
||||
i=i+1;
|
||||
end
|
||||
else if(t2(1)~=0)
|
||||
if(((t2(1)*y)==(t2(2)*x))&&(x/t2(1)>=vmin)&&(x/t2(1)<=vmax))
|
||||
interseczmin=t1(3)*umin+t2(3)*x/t2(1);
|
||||
interseczmax=t1(3)*umax+t2(3)*x/t2(1);
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax]+[t0(1),t0(2),0,t0(3),t0(3)];
|
||||
i=i+1;
|
||||
end
|
||||
else
|
||||
if(((t2(1)*y)==(t2(2)*x))&&(y/t2(2)>=vmin)&&(y/t2(2)<=vmax))
|
||||
interseczmin=t1(3)*umin+t2(3)*y/t2(2);
|
||||
interseczmax=t1(3)*umax+t2(3)*y/t2(2);
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax]+[t0(1),t0(2),0,t0(3),t0(3)];
|
||||
i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
% 删去相同的线段
|
||||
d2intersection=unique(d2intersection, 'rows', 'stable');
|
||||
m=size(d2intersection,1);
|
||||
for i=1:m
|
||||
|
||||
if(d2intersection(i,1)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,4),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,5),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:nx+1
|
||||
j=xrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[j,d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,2)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,4),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,5),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:ny+1
|
||||
j=yrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),j,d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,3)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,4)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,5)];n=n+1;
|
||||
for wang=1:nz+1
|
||||
j=zrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),j];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
[I,J]=find(d3intersection==-1000);
|
||||
d3intersection(I,:)=[];
|
||||
|
||||
|
||||
% A=[t1(1),t2(1);
|
||||
% t1(2),t2(2);
|
||||
% t1(3),t2(3)];
|
||||
% b=[0;0;0];
|
||||
% x=A\b;
|
||||
% if((x(1)>umax)||(x(1)<umin)||(x(2)>vmax)||(x(2)<vmin))
|
||||
% d3intersection(all(d3intersection==0,2),:)=[];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,231 @@
|
||||
function [ d3intersection ] = intersectionsolve_new(fracture,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
% 裂缝由两个相互正交向量,及两个参数的范围确定,面缝具有几何上的对称性
|
||||
% dx,dy,dz,lx,ly,lz是网格属性参数
|
||||
% t=t0+u*t1+v*t2;缝上参数为u,v点的向量
|
||||
%如果只是相交于一点,则只用每一行前三个是交点坐标,存在d3intersection中;
|
||||
%如果相交于一条线段,存在d2intersection中则只用每一行前三个中两个是坐标线的两个坐标,另一个代表未知的坐标(用-1表示);第四、五个表示相交线段在坐标线上的另一坐标取值范围;
|
||||
%对d2intersection中的每一条线段进行处理
|
||||
%示例:[ d3intersection ] = intersectionsolve([0.5,0,0],[1,1,0],[0,0,1],0,6,0,7,1,1,1,10,10,10)
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
umin=fracture(4,1);umax=fracture(4,2);vmin=fracture(5,1);vmax=fracture(5,2);
|
||||
d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
% [I,J]=find(d3intersection==-1000);%用-1000做标识
|
||||
% n=min(I);
|
||||
d2intersection=zeros(50,5);
|
||||
n=1;
|
||||
i=1;
|
||||
unknown=ones(2,1);
|
||||
% 判断与x方向坐标线相交情况
|
||||
%由于网格间距很可能不相等,故进行处理
|
||||
|
||||
|
||||
for wang=1:ny+1
|
||||
y=yrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[y;z]-[t0(2);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
x=[t1(1),t2(1)]*unknown+t0(1);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
%当A奇异时,当有无穷多组解时,可以知道
|
||||
%该坐标线所在的方向向量包含在该裂缝平面内,故该条坐标线上的所有点的矢径减去改裂缝面的t0向量后,必能表示成t1和t2的线性组合
|
||||
%因此,可以立刻求出该点对应的u,v值,然后加以判断是否符合u,v的范围,
|
||||
%当无解时,用上述方法亦可判断出。
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([0,y,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nx+1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
for huihui=nx+1:-1:1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
intersecxmax=xtest; flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
if flag==2
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax];i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% 判断与y方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(3),t2(3)];
|
||||
b=[x;z]-[t0(1);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
y=[t1(2),t2(2)]*unknown+t0(2);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,0,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:ny+1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
intersecymin=ytest; flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
for huihui=ny+1:-1:1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%判断与z方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:ny+1
|
||||
y=yrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2)];
|
||||
b=[x;y]-[t0(1);t0(2)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
z=[t1(3),t2(3)]*unknown+t0(3);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,y,0]-t0)';
|
||||
tests=A\test;
|
||||
hen=A*tests-test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nz+1
|
||||
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
for huihui=nz+1:-1:1
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
% 删去相同的线段及零线段
|
||||
d2intersection=unique(d2intersection, 'rows', 'stable');
|
||||
m=size(d2intersection,1);
|
||||
for i=1:m
|
||||
|
||||
if(d2intersection(i,1)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,4),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,5),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:nx+1
|
||||
j=xrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[j,d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,2)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,4),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,5),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:ny+1
|
||||
j=yrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),j,d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,3)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,4)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,5)];n=n+1;
|
||||
for wang=1:nz+1
|
||||
j=zrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),j];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
[I,J]=find(d3intersection==-1000);
|
||||
d3intersection(I,:)=[];
|
||||
|
||||
|
||||
% A=[t1(1),t2(1);
|
||||
% t1(2),t2(2);
|
||||
% t1(3),t2(3)];
|
||||
% b=[0;0;0];
|
||||
% x=A\b;
|
||||
% if((x(1)>umax)||(x(1)<umin)||(x(2)>vmax)||(x(2)<vmin))
|
||||
% d3intersection(all(d3intersection==0,2),:)=[];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,474 @@
|
||||
function [ d3intersection ] = intersectionsolve_new_modified(fracture,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
% 裂缝由两个相互正交向量,及两个参数的范围确定,面缝具有几何上的对称性
|
||||
% dx,dy,dz,lx,ly,lz是网格属性参数
|
||||
% t=t0+u*t1+v*t2;缝上参数为u,v点的向量
|
||||
%如果只是相交于一点,则只用每一行前三个是交点坐标,存在d3intersection中;
|
||||
%如果相交于一条线段,存在d2intersection中则只用每一行前三个中两个是坐标线的两个坐标,另一个代表未知的坐标(用-1表示);第四、五个表示相交线段在坐标线上的另一坐标取值范围;
|
||||
%对d2intersection中的每一条线段进行处理
|
||||
%示例:[ d3intersection ] = intersectionsolve([0.5,0,0],[1,1,0],[0,0,1],0,6,0,7,1,1,1,10,10,10)
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
umin=fracture(4,1);umax=fracture(4,2);vmin=fracture(5,1);vmax=fracture(5,2);
|
||||
d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
% [I,J]=find(d3intersection==-1000);%用-1000做标识
|
||||
% n=min(I);
|
||||
d2intersection=zeros(50,5);
|
||||
n=1;
|
||||
i=1;
|
||||
unknown=ones(2,1);
|
||||
% 判断与x方向坐标线相交情况
|
||||
%由于网格间距很可能不相等,故进行处理
|
||||
|
||||
tolerance=0.005;%精确找点的误差允许,单位米
|
||||
|
||||
for wang=1:ny+1
|
||||
y=yrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[y;z]-[t0(2);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
x=[t1(1),t2(1)]*unknown+t0(1);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
%当A奇异时,当有无穷多组解时,可以知道
|
||||
%该坐标线所在的方向向量包含在该裂缝平面内,故该条坐标线上的所有点的矢径减去改裂缝面的t0向量后,必能表示成t1和t2的线性组合
|
||||
%因此,可以立刻求出该点对应的u,v值,然后加以判断是否符合u,v的范围,
|
||||
%当无解时,用上述方法亦可判断出。
|
||||
else
|
||||
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([0,y,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nx+1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
|
||||
xxtest=xtest-0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
else xlow=xrao(1,huihui-1); xhigh=xtest;
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
xhigh=xxtest; xlow=xlow;
|
||||
else xlow=xxtest; xhigh=xhigh;
|
||||
end
|
||||
end
|
||||
intersecxmin=xhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nx+1:-1:1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
xxtest=xtest+0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nx+1)
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
else xlow=xtest; xhigh=xrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
xhigh=xhigh; xlow=xxtest;
|
||||
else xlow=xlow; xhigh=xxtest;
|
||||
end
|
||||
end
|
||||
intersecxmax=xlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax];i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% 判断与y方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(3),t2(3)];
|
||||
b=[x;z]-[t0(1);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
y=[t1(2),t2(2)]*unknown+t0(2);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,0,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:ny+1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
yytest=ytest-0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
else ylow=yrao(1,huihui-1); yhigh=ytest;
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
yhigh=yytest; ylow=ylow;
|
||||
else ylow=yytest; yhigh=yhigh;
|
||||
end
|
||||
end
|
||||
intersecymin=yhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=ny+1:-1:1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
yytest=ytest+0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(ny+1)
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
else ylow=ytest; yhigh=yrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
yhigh=yhigh; ylow=yytest;
|
||||
else ylow=ylow; yhigh=yytest;
|
||||
end
|
||||
end
|
||||
intersecymax=ylow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%判断与z方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:ny+1
|
||||
y=yrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2)];
|
||||
b=[x;y]-[t0(1);t0(2)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
z=[t1(3),t2(3)]*unknown+t0(3);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,y,0]-t0)';
|
||||
tests=A\test;
|
||||
hen=A*tests-test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nz+1
|
||||
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
zztest=ztest-0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
else zlow=zrao(1,huihui-1); zhigh=ztest;
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
zhigh=zztest; zlow=zlow;
|
||||
else zlow=zztest; zhigh=zhigh;
|
||||
end
|
||||
end
|
||||
interseczmin=zhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nz+1:-1:1
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
zztest=ztest+0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nz+1)
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
else zlow=ztest; zhigh=zrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
zhigh=zhigh; zlow=zztest;
|
||||
else zlow=zlow; zhigh=zztest;
|
||||
end
|
||||
end
|
||||
interseczmax=zlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 求解裂缝面边界与基质网格面的交点
|
||||
% 当u=umin时
|
||||
%point=t0+umin*t1+v*t2;
|
||||
%与y-z面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:nx+1
|
||||
if t2(1)==0 break;
|
||||
else
|
||||
x=xrao(1,hui);
|
||||
v=(x-t1(1)*boundary(xiang)-t0(1))/t2(1);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:nx+1
|
||||
if t1(1)==0 break;
|
||||
else
|
||||
x=xrao(1,hui);
|
||||
u=(x-t2(1)*boundary(xiang)-t0(1))/t1(1);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%与x-z面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:ny+1
|
||||
if t2(2)==0 break;
|
||||
else
|
||||
y=yrao(1,hui);
|
||||
v=(y-t1(2)*boundary(xiang)-t0(2))/t2(2);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:ny+1
|
||||
if t1(2)==0 break;
|
||||
else
|
||||
y=yrao(1,hui);
|
||||
u=(y-t2(2)*boundary(xiang)-t0(2))/t1(2);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%与x-y面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:nz+1
|
||||
if t2(3)==0 break;
|
||||
else
|
||||
z=zrao(1,hui);
|
||||
v=(z-t1(3)*boundary(xiang)-t0(3))/t2(3);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:nz+1
|
||||
if t1(3)==0 break;
|
||||
else
|
||||
z=zrao(1,hui);
|
||||
u=(z-t2(3)*boundary(xiang)-t0(3))/t1(3);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% 删去相同的线段及零线段
|
||||
d2intersection=unique(d2intersection, 'rows', 'stable');
|
||||
m=size(d2intersection,1);
|
||||
for i=1:m
|
||||
|
||||
if(d2intersection(i,1)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,4),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,5),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:nx+1
|
||||
j=xrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[j,d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,2)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,4),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,5),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:ny+1
|
||||
j=yrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),j,d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,3)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,4)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,5)];n=n+1;
|
||||
for wang=1:nz+1
|
||||
j=zrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),j];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
[I,J]=find(d3intersection==-1000);
|
||||
d3intersection(I,:)=[];
|
||||
|
||||
record=[];
|
||||
kitty=size(d3intersection,1);
|
||||
for i=1:kitty-1
|
||||
for j=i+1:kitty
|
||||
if (norm(d3intersection(i,:)-d3intersection(j,:))<=1e-1)%该数值与网格属性有关
|
||||
record=[record;j];
|
||||
end
|
||||
end
|
||||
end
|
||||
record=unique(record, 'rows', 'stable');
|
||||
d3intersection(record,:)=[];
|
||||
|
||||
|
||||
|
||||
% A=[t1(1),t2(1);
|
||||
% t1(2),t2(2);
|
||||
% t1(3),t2(3)];
|
||||
% b=[0;0;0];
|
||||
% x=A\b;
|
||||
% if((x(1)>umax)||(x(1)<umin)||(x(2)>vmax)||(x(2)<vmin))
|
||||
% d3intersection(all(d3intersection==0,2),:)=[];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,433 @@
|
||||
function [ d3intersection ] = intersectionsolve_new_modified_irr(fracture,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
% 裂缝由两个相互正交向量,及两个参数的范围确定,面缝具有几何上的对称性
|
||||
% dx,dy,dz,lx,ly,lz是网格属性参数
|
||||
% t=t0+u*t1+v*t2;缝上参数为u,v点的向量
|
||||
%如果只是相交于一点,则只用每一行前三个是交点坐标,存在d3intersection中;
|
||||
%如果相交于一条线段,存在d2intersection中则只用每一行前三个中两个是坐标线的两个坐标,另一个代表未知的坐标(用-1表示);第四、五个表示相交线段在坐标线上的另一坐标取值范围;
|
||||
%对d2intersection中的每一条线段进行处理
|
||||
%示例:[ d3intersection ] = intersectionsolve([0.5,0,0],[1,1,0],[0,0,1],0,6,0,7,1,1,1,10,10,10)
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
urao=fracture(4,3);%长半轴,相对于向量参数
|
||||
vdai=fracture(5,3);%短半轴,相对于向量参数
|
||||
%u^2/urao^2+v^2/vdai^2<=1;
|
||||
d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
% [I,J]=find(d3intersection==-1000);%用-1000做标识
|
||||
% n=min(I);
|
||||
d2intersection=zeros(50,5);
|
||||
n=1;
|
||||
i=1;
|
||||
unknown=ones(2,1);
|
||||
% 判断与x方向坐标线相交情况
|
||||
%由于网格间距很可能不相等,故进行处理
|
||||
|
||||
tolerance=0.005;%精确找点的误差允许,单位米
|
||||
|
||||
for wang=1:ny+1
|
||||
y=yrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[y;z]-[t0(2);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
x=[t1(1),t2(1)]*unknown+t0(1);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
%当A奇异时,当有无穷多组解时,可以知道
|
||||
%该坐标线所在的方向向量包含在该裂缝平面内,故该条坐标线上的所有点的矢径减去改裂缝面的t0向量后,必能表示成t1和t2的线性组合
|
||||
%因此,可以立刻求出该点对应的u,v值,然后加以判断是否符合u,v的范围,
|
||||
%当无解时,用上述方法亦可判断出。
|
||||
else
|
||||
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([0,y,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nx+1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
|
||||
xxtest=xtest-0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if (uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
else xlow=xrao(1,huihui-1); xhigh=xtest;
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
xhigh=xxtest; xlow=xlow;
|
||||
else xlow=xxtest; xhigh=xhigh;
|
||||
end
|
||||
end
|
||||
intersecxmin=xhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nx+1:-1:1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
xxtest=xtest+0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if (uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nx+1)
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
else xlow=xtest; xhigh=xrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
xhigh=xhigh; xlow=xxtest;
|
||||
else xlow=xlow; xhigh=xxtest;
|
||||
end
|
||||
end
|
||||
intersecxmax=xlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax];i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% 判断与y方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(3),t2(3)];
|
||||
b=[x;z]-[t0(1);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
y=[t1(2),t2(2)]*unknown+t0(2);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,0,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:ny+1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
yytest=ytest-0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
else ylow=yrao(1,huihui-1); yhigh=ytest;
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
yhigh=yytest; ylow=ylow;
|
||||
else ylow=yytest; yhigh=yhigh;
|
||||
end
|
||||
end
|
||||
intersecymin=yhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=ny+1:-1:1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
yytest=ytest+0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(ny+1)
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
else ylow=ytest; yhigh=yrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
yhigh=yhigh; ylow=yytest;
|
||||
else ylow=ylow; yhigh=yytest;
|
||||
end
|
||||
end
|
||||
intersecymax=ylow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%判断与z方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:ny+1
|
||||
y=yrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2)];
|
||||
b=[x;y]-[t0(1);t0(2)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
z=[t1(3),t2(3)]*unknown+t0(3);
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,y,0]-t0)';
|
||||
tests=A\test;
|
||||
hen=A*tests-test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nz+1
|
||||
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
zztest=ztest-0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
else zlow=zrao(1,huihui-1); zhigh=ztest;
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
zhigh=zztest; zlow=zlow;
|
||||
else zlow=zztest; zhigh=zhigh;
|
||||
end
|
||||
end
|
||||
interseczmin=zhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nz+1:-1:1
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1,1)^2/urao^2+unknown(2,1)^2/vdai^2)<=1)
|
||||
zztest=ztest+0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nz+1)
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
else zlow=ztest; zhigh=zrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1,1)^2/urao^2+uunknown(2,1)^2/vdai^2)<=1)
|
||||
zhigh=zhigh; zlow=zztest;
|
||||
else zlow=zlow; zhigh=zztest;
|
||||
end
|
||||
end
|
||||
interseczmax=zlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 求解裂缝面边界与基质网格面的交点
|
||||
% 当u=umin时
|
||||
%point=t0+umin*t1+v*t2;
|
||||
%与y-z面的交点
|
||||
|
||||
% 目前仅限于alfa2 向量只有z方向分量时
|
||||
%alfa1 向量没有z方向分量
|
||||
|
||||
%对于yz网格面
|
||||
|
||||
for hui=1:nx+1
|
||||
x=xrao(1,hui);
|
||||
if t1(1)==0 break; %因为一般不将裂缝面设置得与坐标面重合
|
||||
else
|
||||
u=(x-t0(1))/t1(1);
|
||||
if (u<=urao) &&(u>=-urao)
|
||||
v1=sqrt((1-u^2/urao^2)*vdai^2);
|
||||
d3intersection(n,:)=t0+u*t1+v1*t2;n=n+1;
|
||||
v2=-sqrt((1-u^2/urao^2)*vdai^2);
|
||||
d3intersection(n,:)=t0+u*t1+v2*t2;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% 对于xz网格面
|
||||
|
||||
for hui=1:ny+1
|
||||
y=yrao(1,hui);
|
||||
if t1(2)==0 break; %因为一般不将裂缝面设置得与坐标面重合
|
||||
else
|
||||
u=(y-t0(2))/t1(2);
|
||||
if (u<=urao) && (u>=-urao)
|
||||
v1=sqrt((1-u^2/urao^2)*vdai^2);
|
||||
d3intersection(n,:)=t0+u*t1+v1*t2;n=n+1;
|
||||
v2=-sqrt((1-u^2/urao^2)*vdai^2);
|
||||
d3intersection(n,:)=t0+u*t1+v2*t2;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
% 对于xy网格面
|
||||
% 按照前述假设,t2向量才有z方向的分量
|
||||
for hui=1:nz+1
|
||||
z=zrao(1,hui);
|
||||
if t2(3)==0 break; %因为一般不将裂缝面设置得与坐标面重合
|
||||
else
|
||||
v=(z-t0(3))/t1(3);
|
||||
if (v<=vdai) && (v>=-vdai)
|
||||
u1=sqrt((1-v^2/vdai^2)*urao^2);
|
||||
d3intersection(n,:)=t0+u1*t1+v*t2;n=n+1;
|
||||
u2=-sqrt((1-v^2/vdai^2)*urao^2);
|
||||
d3intersection(n,:)=t0+u2*t1+v*t2;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
% 删去相同的线段及零线段
|
||||
d2intersection=unique(d2intersection, 'rows', 'stable');
|
||||
m=size(d2intersection,1);
|
||||
for i=1:m
|
||||
|
||||
if(d2intersection(i,1)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,4),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,5),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:nx+1
|
||||
j=xrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[j,d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,2)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,4),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,5),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:ny+1
|
||||
j=yrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),j,d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,3)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,4)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,5)];n=n+1;
|
||||
for wang=1:nz+1
|
||||
j=zrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),j];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
[I,J]=find(d3intersection==-1000);
|
||||
d3intersection(I,:)=[];
|
||||
|
||||
record=[];
|
||||
kitty=size(d3intersection,1);
|
||||
for i=1:kitty-1
|
||||
for j=i+1:kitty
|
||||
if (norm(d3intersection(i,:)-d3intersection(j,:))<=1e-1)%该数值与网格属性有关
|
||||
record=[record;j];
|
||||
end
|
||||
end
|
||||
end
|
||||
record=unique(record, 'rows', 'stable');
|
||||
d3intersection(record,:)=[];
|
||||
|
||||
|
||||
|
||||
% A=[t1(1),t2(1);
|
||||
% t1(2),t2(2);
|
||||
% t1(3),t2(3)];
|
||||
% b=[0;0;0];
|
||||
% x=A\b;
|
||||
% if((x(1)>umax)||(x(1)<umin)||(x(2)>vmax)||(x(2)<vmin))
|
||||
% d3intersection(all(d3intersection==0,2),:)=[];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,491 @@
|
||||
function [ d3intersection ] = intersectionsolve_new_modified_r(fracture,dx,dy,dz,nx,ny,nz,xrao,yrao,zrao )
|
||||
% 裂缝由两个相互正交向量,及两个参数的范围确定,面缝具有几何上的对称性
|
||||
% dx,dy,dz,lx,ly,lz是网格属性参数
|
||||
% t=t0+u*t1+v*t2;缝上参数为u,v点的向量
|
||||
%如果只是相交于一点,则只用每一行前三个是交点坐标,存在d3intersection中;
|
||||
%如果相交于一条线段,存在d2intersection中则只用每一行前三个中两个是坐标线的两个坐标,另一个代表未知的坐标(用-1表示);第四、五个表示相交线段在坐标线上的另一坐标取值范围;
|
||||
%对d2intersection中的每一条线段进行处理
|
||||
%示例:[ d3intersection ] = intersectionsolve([0.5,0,0],[1,1,0],[0,0,1],0,6,0,7,1,1,1,10,10,10)
|
||||
t0=fracture(1,:);t1=fracture(2,:);t2=fracture(3,:);
|
||||
umin=fracture(4,1);umax=fracture(4,2);vmin=fracture(5,1);vmax=fracture(5,2);
|
||||
d3intersection=-1000*ones(1000,3);%用-1000做标识
|
||||
% [I,J]=find(d3intersection==-1000);%用-1000做标识
|
||||
% n=min(I);
|
||||
d2intersection=zeros(50,5);
|
||||
n=1;
|
||||
i=1;
|
||||
unknown=ones(2,1);
|
||||
% 判断与x方向坐标线相交情况
|
||||
%由于网格间距很可能不相等,故进行处理
|
||||
|
||||
tolerance=0.005;%精确找点的误差允许,单位米
|
||||
|
||||
for wang=1:ny+1
|
||||
y=yrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
b=[y;z]-[t0(2);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
x=[t1(1),t2(1)]*unknown+t0(1);
|
||||
% if x<=max(xrao) && x>=min(xrao)
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
% end
|
||||
end
|
||||
%当A奇异时,当有无穷多组解时,可以知道
|
||||
%该坐标线所在的方向向量包含在该裂缝平面内,故该条坐标线上的所有点的矢径减去改裂缝面的t0向量后,必能表示成t1和t2的线性组合
|
||||
%因此,可以立刻求出该点对应的u,v值,然后加以判断是否符合u,v的范围,
|
||||
%当无解时,用上述方法亦可判断出。
|
||||
else
|
||||
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([0,y,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nx+1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
|
||||
xxtest=xtest-0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
else xlow=xrao(1,huihui-1); xhigh=xtest;
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
xhigh=xxtest; xlow=xlow;
|
||||
else xlow=xxtest; xhigh=xhigh;
|
||||
end
|
||||
end
|
||||
intersecxmin=xhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmin=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nx+1:-1:1
|
||||
xtest=xrao(1,huihui);
|
||||
vectest=[xtest,y,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
xxtest=xtest+0.01;vvectest=[xxtest,y,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nx+1)
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
else xlow=xtest; xhigh=xrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (xhigh-xlow>=tolerance)
|
||||
xxtest=1/2*(xlow+xhigh);
|
||||
vvectest=[xxtest,y,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
xhigh=xhigh; xlow=xxtest;
|
||||
else xlow=xlow; xhigh=xxtest;
|
||||
end
|
||||
end
|
||||
intersecxmax=xlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecxmax=xtest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[-1,y,z,intersecxmin,intersecxmax];i=i+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
% 判断与y方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:nz+1
|
||||
z=zrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(3),t2(3)];
|
||||
b=[x;z]-[t0(1);t0(3)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
y=[t1(2),t2(2)]*unknown+t0(2);
|
||||
% if y<=max(yrao) && y>=min(yrao)
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
% end
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,0,z]-t0)';
|
||||
tests=A\test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:ny+1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
yytest=ytest-0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
else ylow=yrao(1,huihui-1); yhigh=ytest;
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
yhigh=yytest; ylow=ylow;
|
||||
else ylow=yytest; yhigh=yhigh;
|
||||
end
|
||||
end
|
||||
intersecymin=yhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymin=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=ny+1:-1:1
|
||||
ytest=yrao(1,huihui);
|
||||
vectest=[x,ytest,z];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
yytest=ytest+0.01;vvectest=[x,yytest,z];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(ny+1)
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
else ylow=ytest; yhigh=yrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (yhigh-ylow>=tolerance)
|
||||
yytest=1/2*(ylow+yhigh);
|
||||
vvectest=[x,yytest,z];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
yhigh=yhigh; ylow=yytest;
|
||||
else ylow=ylow; yhigh=yytest;
|
||||
end
|
||||
end
|
||||
intersecymax=ylow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
intersecymax=ytest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,-1,z,intersecymin,intersecymax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%判断与z方向坐标线相交情况
|
||||
for wang=1:nx+1
|
||||
x=xrao(1,wang);
|
||||
for dai=1:ny+1
|
||||
y=yrao(1,dai);
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2)];
|
||||
b=[x;y]-[t0(1);t0(2)];
|
||||
if(det(A)~=0)
|
||||
unknown=A\b;
|
||||
if ((unknown(1,1)>=umin)&&(unknown(1,1)<=umax)&&(unknown(2,1)>=vmin)&&(unknown(2,1)<=vmax))
|
||||
z=[t1(3),t2(3)]*unknown+t0(3);
|
||||
% if z<=max(zrao) && z>=min(zrao)
|
||||
d3intersection(n,:)=[x,y,z];
|
||||
n=n+1;
|
||||
% end
|
||||
end
|
||||
else
|
||||
A=[t1(1),t2(1),
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
test=([x,y,0]-t0)';
|
||||
tests=A\test;
|
||||
hen=A*tests-test;
|
||||
if norm(A*tests-test)<=1e-6 %说明这条坐标线在该裂缝面上
|
||||
flag=0;
|
||||
for huihui=1:nz+1
|
||||
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
zztest=ztest-0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==1
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
else zlow=zrao(1,huihui-1); zhigh=ztest;
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
zhigh=zztest; zlow=zlow;
|
||||
else zlow=zztest; zhigh=zhigh;
|
||||
end
|
||||
end
|
||||
interseczmin=zhigh;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmin=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for huihui=nz+1:-1:1
|
||||
ztest=zrao(1,huihui);
|
||||
vectest=[x,y,ztest];
|
||||
unknown=A\(vectest-t0)';
|
||||
if ((unknown(1)>=umin)&&(unknown(1)<=umax)&&(unknown(2)>=vmin)&&(unknown(2)<=vmax))
|
||||
zztest=ztest+0.01;vvectest=[x,y,zztest];uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))%表明并不是正好是这个x,需要在区间内搜寻准确点
|
||||
|
||||
if huihui==(nz+1)
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
else zlow=ztest; zhigh=zrao(1,huihui+1);
|
||||
|
||||
end
|
||||
while (zhigh-zlow>=tolerance)
|
||||
zztest=1/2*(zlow+zhigh);
|
||||
vvectest=[x,y,zztest];
|
||||
uunknown=A\(vvectest-t0)';
|
||||
if ((uunknown(1)>=umin)&&(uunknown(1)<=umax)&&(uunknown(2)>=vmin)&&(uunknown(2)<=vmax))
|
||||
zhigh=zhigh; zlow=zztest;
|
||||
else zlow=zlow; zhigh=zztest;
|
||||
end
|
||||
end
|
||||
interseczmax=zlow;flag=flag+1; break;
|
||||
else %表明这个节点就是要找的点
|
||||
interseczmax=ztest;flag=flag+1; break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==2
|
||||
d2intersection(i,:)=[x,y,-1,interseczmin,interseczmax];i=i+1;
|
||||
end
|
||||
|
||||
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 求解裂缝面边界与基质网格面的交点
|
||||
% 当u=umin时
|
||||
%point=t0+umin*t1+v*t2;
|
||||
%与y-z面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:nx+1
|
||||
if t2(1)==0 break;
|
||||
else
|
||||
x=xrao(1,hui);
|
||||
v=(x-t1(1)*boundary(xiang)-t0(1))/t2(1);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:nx+1
|
||||
if t1(1)==0 break;
|
||||
else
|
||||
x=xrao(1,hui);
|
||||
u=(x-t2(1)*boundary(xiang)-t0(1))/t1(1);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%与x-z面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:ny+1
|
||||
if t2(2)==0 break;
|
||||
else
|
||||
y=yrao(1,hui);
|
||||
v=(y-t1(2)*boundary(xiang)-t0(2))/t2(2);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:ny+1
|
||||
if t1(2)==0 break;
|
||||
else
|
||||
y=yrao(1,hui);
|
||||
u=(y-t2(2)*boundary(xiang)-t0(2))/t1(2);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%与x-y面的交点
|
||||
boundary=[umin,umax,vmin,vmax];
|
||||
for xiang=1:4
|
||||
|
||||
if xiang<=2 %说明定u的取值
|
||||
for hui=1:nz+1
|
||||
if t2(3)==0 break;
|
||||
else
|
||||
z=zrao(1,hui);
|
||||
v=(z-t1(3)*boundary(xiang)-t0(3))/t2(3);
|
||||
if (v>=vmin)&&(v<=vmax)
|
||||
point=t0+boundary(xiang)*t1+v*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
else %定v的取值
|
||||
for hui=1:nz+1
|
||||
if t1(3)==0 break;
|
||||
else
|
||||
z=zrao(1,hui);
|
||||
u=(z-t2(3)*boundary(xiang)-t0(3))/t1(3);
|
||||
if (u>=umin)&&(u<=umax)
|
||||
point=t0+u*t1+boundary(xiang)*t2;
|
||||
d3intersection(n,:)=point;n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 删去相同的线段及零线段
|
||||
d2intersection=unique(d2intersection, 'rows', 'stable');
|
||||
m=size(d2intersection,1);
|
||||
for i=1:m
|
||||
|
||||
if(d2intersection(i,1)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,4),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,5),d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:nx+1
|
||||
j=xrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[j,d2intersection(i,2),d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,2)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,4),d2intersection(i,3)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,5),d2intersection(i,3)];n=n+1;
|
||||
for wang=1:ny+1
|
||||
j=yrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),j,d2intersection(i,3)];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if(d2intersection(i,3)==-1)
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,4)];n=n+1;
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),d2intersection(i,5)];n=n+1;
|
||||
for wang=1:nz+1
|
||||
j=zrao(1,wang);
|
||||
if (((j>=d2intersection(i,4))&&(j<=d2intersection(i,5)))||((j>=d2intersection(i,5))&&(j<=d2intersection(i,4))))
|
||||
d3intersection(n,:)=[d2intersection(i,1),d2intersection(i,2),j];n=n+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 添加矩形缝的四个顶点坐标
|
||||
vertex1=t0+umin*t1+vmin*t2;
|
||||
vertex2=t0+umin*t1+vmax*t2;
|
||||
vertex3=t0+umax*t1+vmin*t2;
|
||||
vertex4=t0+umax*t1+vmax*t2;
|
||||
d3intersection=[d3intersection;vertex1;vertex2;vertex3;vertex4];
|
||||
%% 后续处理
|
||||
d3intersection=unique(d3intersection, 'rows', 'stable');
|
||||
[I,J]=find(d3intersection==-1000);
|
||||
d3intersection(I,:)=[];
|
||||
|
||||
record=[];
|
||||
kitty=size(d3intersection,1);
|
||||
for i=1:kitty-1
|
||||
for j=i+1:kitty
|
||||
if (norm(d3intersection(i,:)-d3intersection(j,:))<=1e-4)%该数值与网格属性有关
|
||||
record=[record;j];
|
||||
end
|
||||
end
|
||||
end
|
||||
record=unique(record, 'rows', 'stable');
|
||||
d3intersection(record,:)=[];
|
||||
|
||||
record1=[];
|
||||
myhui=size(d3intersection,1);
|
||||
for i=1:myhui
|
||||
huix=d3intersection(i,1);
|
||||
huiy=d3intersection(i,2);
|
||||
huiz=d3intersection(i,3);
|
||||
if huix>max(xrao) || huix<min(xrao) || huiy>max(yrao) || huiy<min(yrao) || huiz>max(zrao) || huiz<min(zrao)
|
||||
record1=[record1;i];
|
||||
end
|
||||
end
|
||||
d3intersection(record1,:)=[];
|
||||
% A=[t1(1),t2(1);
|
||||
% t1(2),t2(2);
|
||||
% t1(3),t2(3)];
|
||||
% b=[0;0;0];
|
||||
% x=A\b;
|
||||
% if((x(1)>umax)||(x(1)<umin)||(x(2)>vmax)||(x(2)<vmin))
|
||||
% d3intersection(all(d3intersection==0,2),:)=[];
|
||||
% end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,892 @@
|
||||
function [G,Gfm,Gff,Gf,Ap,Apf] = lpr( dx,dy,dz,matrixvsfra,connectmf,fracstart,fracnumber,raopoint,f,nodes,coord,nf,corevsfra)
|
||||
%LPR 指的是local point refinement,结合边界元方法的特点进行局部点加密,以达到提高精度的目的
|
||||
% 此处显示详细说明
|
||||
n=2;%基质网格面上加密的倍数,为了能够使加密后的点处在分割的面积块中心
|
||||
flag=1;%此处1表示对采取对裂缝单元加密的第一套方案,此处0表示不对裂缝单元操作
|
||||
%按2的幂次加密
|
||||
%则基质网格的每个面上有4^(n-1)个点
|
||||
%每一边上有2^(n-1)个点
|
||||
%1号面
|
||||
%lpr( 1,1,1)
|
||||
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
|
||||
cor1=zeros(4^(n-1),3);
|
||||
fn=4^(n-1);
|
||||
en=2^(n-1);
|
||||
deltx=dx/en;
|
||||
delty=dy/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor1(op,1)=(i-1)*deltx+deltx/2;
|
||||
cor1(op,2)=(j-1)*delty+delty/2;
|
||||
cor1(op,3)=0;
|
||||
end
|
||||
end
|
||||
cor1=repmat([0,0,0],4^(n-1),1)+cor1;
|
||||
%6号面
|
||||
cor6=zeros(4^(n-1),2);
|
||||
deltx=dx/en;
|
||||
delty=dy/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor6(op,1)=(i-1)*deltx+deltx/2;
|
||||
cor6(op,2)=(j-1)*delty+delty/2;
|
||||
cor6(op,3)=0;
|
||||
end
|
||||
end
|
||||
cor6=repmat([0,0,dz],4^(n-1),1)+cor6;
|
||||
|
||||
|
||||
%2号面
|
||||
cor2=zeros(4^(n-1),3);
|
||||
en=2^(n-1);
|
||||
deltx=dx/en;
|
||||
deltz=dz/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor2(op,1)=(i-1)*deltx+deltx/2;
|
||||
cor2(op,2)=0;
|
||||
cor2(op,3)=(j-1)*deltz+deltz/2;
|
||||
end
|
||||
end
|
||||
cor2=repmat([0,0,0],4^(n-1),1)+cor2;
|
||||
%5号面
|
||||
cor5=zeros(4^(n-1),3);
|
||||
en=2^(n-1);
|
||||
deltx=dx/en;
|
||||
deltz=dz/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor5(op,1)=(i-1)*deltx+deltx/2;
|
||||
cor5(op,2)=0;
|
||||
cor5(op,3)=(j-1)*deltz+deltz/2;
|
||||
end
|
||||
end
|
||||
cor5=repmat([0,dy,0],4^(n-1),1)+cor5;
|
||||
|
||||
|
||||
|
||||
%3号面
|
||||
cor3=zeros(4^(n-1),3);
|
||||
en=2^(n-1);
|
||||
delty=dy/en;
|
||||
deltz=dz/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor3(op,1)=0;
|
||||
cor3(op,2)=(i-1)*delty+delty/2;
|
||||
cor3(op,3)=(j-1)*deltz+deltz/2;
|
||||
end
|
||||
end
|
||||
cor3=repmat([0,0,0],4^(n-1),1)+cor3;
|
||||
%4号面
|
||||
cor4=zeros(4^(n-1),3);
|
||||
en=2^(n-1);
|
||||
delty=dy/en;
|
||||
deltz=dz/en;
|
||||
for j=1:en
|
||||
for i=1:en
|
||||
op=(j-1)*en+i;
|
||||
cor4(op,1)=0;
|
||||
cor4(op,2)=(i-1)*delty+delty/2;
|
||||
cor4(op,3)=(j-1)*deltz+deltz/2;
|
||||
end
|
||||
end
|
||||
cor4=repmat([dx,0,0],4^(n-1),1)+cor4;
|
||||
|
||||
cor=[cor1;cor2;cor3;cor4;cor5;cor6];
|
||||
syms z y x x0 y0 z0 x1 y1 z1;
|
||||
%dx=1;dy=1;dz=1;
|
||||
%r=sqrt((z-dz/2).^2+y.^2+(dx/2).^2);
|
||||
%c11
|
||||
np=6*fn;
|
||||
%% G矩阵求解
|
||||
G=zeros(np);
|
||||
%利用其肯定是对称阵的性质
|
||||
for i=1:np
|
||||
for j=i:np
|
||||
p1=cor(i,:);
|
||||
p2=cor(j,:);
|
||||
s=floor((j+fn-1)/fn);%用这种方式求商,得到的才是点对应的面数
|
||||
if s==1
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x-p1(1)).^2+(y-p1(2)).^2+(0-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
if s==6
|
||||
g=@(x,y)-1./((4.*pi).*sqrt((x-p1(1)).^2+(y-p1(2)).^2+(dz-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
|
||||
if s==2
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x-p1(1)).^2+(0-p1(2)).^2+(z-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
if s==5
|
||||
g=@(x,z)-1./((4.*pi).*sqrt((x-p1(1)).^2+(dy-p1(2)).^2+(z-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
|
||||
if s==3
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((0-p1(1)).^2+(y-p1(2)).^2+(z-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
if s==4
|
||||
g=@(y,z)-1./((4.*pi).*sqrt((dx-p1(1)).^2+(y-p1(2)).^2+(z-p1(2)).^2)+1e-8);
|
||||
G(i,j)=integral2(g,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
G=G+G';G(eye(size(G, 1)) == 1)=G(eye(size(G, 1)) == 1)/2;
|
||||
|
||||
%% dG矩阵求解
|
||||
dG=zeros(np);
|
||||
grad=cell(np,1);
|
||||
r=-1./((4.*pi).*sqrt((x-x0).^2+(y-y0).^2+(z-z0).^2));
|
||||
gradx=(x-x0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
grady=(y-y0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradz=(z-z0)./((4.*pi).*((x-x0).^2+(y-y0).^2+(z-z0).^2)^(3/2));
|
||||
gradrao=[gradx,grady,gradz];
|
||||
for i=1:np
|
||||
grad{i,1}=subs(gradrao,[x0,y0,z0],cor(i,:));
|
||||
end
|
||||
%六个面的法向量矩阵
|
||||
n=zeros(6,3);
|
||||
n(1,:)=[0,0,-1];
|
||||
n(2,:)=[0,-1,0];
|
||||
n(3,:)=[-1,0,0];
|
||||
n(4,:)=[1,0,0];
|
||||
n(5,:)=[0,1,0];
|
||||
n(6,:)=[0,0,1];
|
||||
|
||||
for i=1:np
|
||||
for j=1:np
|
||||
p1=cor(i,:);
|
||||
p2=cor(j,:);
|
||||
s=floor((j+fn-1)/fn);
|
||||
h=floor((i+fn-1)/fn);
|
||||
|
||||
if s==1
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,z,0);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==6
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,z,dz);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
dG(i,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==2
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,y,0);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==5
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,y,dy);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
dG(i,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==3
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,x,0);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==4
|
||||
rao=grad{i,1}*n(s,:)';
|
||||
g=subs(rao,x,dx);
|
||||
if s~=h
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
dG(i,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
dG=dG-2*pi/(4*pi)*eye(np);
|
||||
|
||||
%% Gfm矩阵求解
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
Gfm=cell(m,1);
|
||||
|
||||
%第一种方案
|
||||
if flag==1
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
% cf=zeros(np,n);
|
||||
if(n>0)%此处判断已无必要,表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
%该函数的坐标基点是正六面体的左下角点,即编号为1的点
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
|
||||
gfmc=[];
|
||||
for mei=1:np
|
||||
|
||||
gfmr=[];
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
frace=fracnumber(matrixvsfra(connectmf{i,1},k),:);
|
||||
indice=find(frace~=0);
|
||||
m=size(indice,2);
|
||||
newsection=frace(1,1:(m-1));
|
||||
u=raopoint{r-1,2}(newsection',1);
|
||||
v=raopoint{r-1,2}(newsection',2);
|
||||
% ucore=mean(u);%该裂缝单元中心对应的u,v值
|
||||
% vcore=mean(v);
|
||||
dt=delaunayTriangulation(u,v);
|
||||
han=size(dt,1);%该裂缝单元包含的小三角形单元个数
|
||||
cf=0;
|
||||
tcore=zeros(han,2);
|
||||
for puma=1:han
|
||||
%三角形的裂缝面上坐标
|
||||
coordinate=raopoint{r-1,2}(newsection(dt(puma,:))',:);%dt(k,:)只是newsection中的序号,因此如左所示
|
||||
% tcore=[1/3*sum(coordinate(:,1)),1/3*sum(coordinate(:,2))];
|
||||
cf=triintlpr( coordinate,f, p(mei,:) );
|
||||
gfmr=[gfmr,cf];
|
||||
end
|
||||
end
|
||||
gfmc=[gfmc;gfmr];
|
||||
end
|
||||
Gfm{i,1}=gfmc;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%原方案
|
||||
if flag==0
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(np,n);
|
||||
if(n>0)%此处判断已无必要,表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
%该函数的坐标基点是正六面体的左下角点,即编号为1的点
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
for j=1:np
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun1(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),p(j,:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gfm{i,1}=cf;
|
||||
end
|
||||
end
|
||||
|
||||
%% Gff矩阵求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gff=cell(m,1);
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
convcell=cell(m,1);
|
||||
%第一种方案
|
||||
if flag==1
|
||||
|
||||
%开展方便的前处理
|
||||
|
||||
raofrac=cell(m,1);
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
gfmc=[];
|
||||
gfmr=[];
|
||||
%for j=1:n %裂缝单元源点选取
|
||||
fracp=cell(1,3);
|
||||
cc=0;
|
||||
conv=[];
|
||||
for k=1:n %裂缝单元面积积分区域选取
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
frace=fracnumber(matrixvsfra(connectmf{i,1},k),:);
|
||||
indice=find(frace~=0);
|
||||
m=size(indice,2);
|
||||
newsection=frace(1,1:(m-1));
|
||||
u=raopoint{r-1,2}(newsection',1);
|
||||
v=raopoint{r-1,2}(newsection',2);
|
||||
% ucore=mean(u);%该裂缝单元中心对应的u,v值
|
||||
% vcore=mean(v);
|
||||
dt=delaunayTriangulation(u,v);
|
||||
han=size(dt,1);%该裂缝单元包含的小三角形单元个数
|
||||
cat=size(conv,1);
|
||||
conv=[conv zeros(cat,han);zeros(1,cc) 1/han*ones(1,han)];
|
||||
for k=1:han
|
||||
cc=cc+1;
|
||||
%三角形的裂缝面上坐标
|
||||
coordinate=raopoint{r-1,2}(newsection(dt(k,:))',:);%dt(k,:)只是newsection中的序号,因此如左所示
|
||||
fracp{cc,1}=coordinate;
|
||||
tcore=[1/3*sum(coordinate(:,1)),1/3*sum(coordinate(:,2))];%该裂缝三角的三个顶点坐标
|
||||
raocore=f(5*(r-1)-4,:)+f(5*(r-1)-3,:)*tcore(1)+f(5*(r-1)-2,:)*tcore(2);
|
||||
fracp{cc,2}=raocore;%该裂缝三角的中心
|
||||
fracp{cc,3}=r-1;%该裂缝三角所在裂缝平面编号
|
||||
end
|
||||
end
|
||||
convcell{i,1}=conv;
|
||||
raofrac{i,1}=fracp;
|
||||
end
|
||||
end
|
||||
|
||||
% %开始计算
|
||||
% m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
% Gff=cell(m,1);
|
||||
% for i=1:m
|
||||
% fracp=raofrac{i,1};
|
||||
% nfrac=size(fracp,1);%新的裂缝三角个数
|
||||
% cf=zeros(nfrac);
|
||||
% for j=1:nfrac %源点
|
||||
% for k=1:nfrac %积分区域
|
||||
% cf(j,k)=triint1lpr(raofrac{i,1}{k,1},f((5*raofrac{i,1}{k,3}-4):(5*raofrac{i,1}{k,3}),:),raofrac{i,1}{j,2});
|
||||
% end
|
||||
% end
|
||||
%
|
||||
% Gff{i,1}=cf;
|
||||
% end
|
||||
end
|
||||
|
||||
% %原方案
|
||||
% if flag==0
|
||||
% Gff=cell(m,1);
|
||||
% for i=1:m
|
||||
% indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
% n=size(indice,2);
|
||||
% cf=zeros(n,n);
|
||||
% if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
% for j=1:n
|
||||
% for k=1:n
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
% cf(j,k)=fun2(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),corevsfra(matrixvsfra(connectmf{i,1},j),:),f(5*(r-1)-4:5*(r-1),:));
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
% Gff{i,1}=cf;
|
||||
% end
|
||||
% end
|
||||
|
||||
|
||||
%% dGf矩阵的求解
|
||||
% m=size(matrixvsfra,1);
|
||||
% dGf=cell(m,1);
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
dGf=cell(m,1);
|
||||
|
||||
if flag==0
|
||||
for i=1:m
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
cf=zeros(n,np);
|
||||
for k=1:n
|
||||
core=corevsfra(matrixvsfra(connectmf{i,1},k),:);
|
||||
% r=-1./((4.*pi).*sqrt(x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2);
|
||||
% grad=[diff(r,x),diff(r,y),diff(r,z)];
|
||||
gradx=(x-core(1))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grady=(y-core(2))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
gradz=(z-core(3))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grad=[gradx,grady,gradz];
|
||||
% if (isempty(symvar(g))) cf(k,j)=0;
|
||||
% else cf(k,j)
|
||||
for j=1:np
|
||||
p2=p(j,:);
|
||||
s=floor((j+fn-1)/fn);
|
||||
if s==1
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==6
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==2
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==5
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==3
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(k,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==4
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(k,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
|
||||
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
dGf{i,1}=cf;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==1
|
||||
for i=1:m
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
fracp=raofrac{i,1};
|
||||
nfrac=size(fracp,1);
|
||||
cf=zeros(nfrac,np);
|
||||
for k=1:nfrac
|
||||
core=raofrac{i,1}{k,2};
|
||||
% r=-1./((4.*pi).*sqrt(x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2);
|
||||
% grad=[diff(r,x),diff(r,y),diff(r,z)];
|
||||
gradx=(x-core(1))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grady=(y-core(2))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
gradz=(z-core(3))./((4.*pi).*((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2)^(3/2));
|
||||
grad=[gradx,grady,gradz];
|
||||
%六个面的法向量矩阵
|
||||
n=zeros(6,3);
|
||||
n(1,:)=[0,0,-1];
|
||||
n(2,:)=[0,-1,0];
|
||||
n(3,:)=[-1,0,0];
|
||||
n(4,:)=[1,0,0];
|
||||
n(5,:)=[0,1,0];
|
||||
n(6,:)=[0,0,1];
|
||||
for j=1:np
|
||||
p2=p(j,:);
|
||||
s=floor((j+fn-1)/fn);
|
||||
if s==1
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==6
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==2
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==5
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(k,j)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==3
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(k,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==4
|
||||
rao=grad*n(s,:)';
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(k,j)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
dGf{i,1}=cf;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% Gff矩阵求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
% m=size(matrixvsfra,1);
|
||||
% Gff=cell(m,1);
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
Gff=cell(m,1);
|
||||
if flag==0
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,n);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
for j=1:n
|
||||
for k=1:n
|
||||
for r=2:(nf+1)
|
||||
if(matrixvsfra(connectmf{i,1},k)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
end
|
||||
end
|
||||
cf(j,k)=fun2(raopoint{r-1,2},fracnumber(matrixvsfra(connectmf{i,1},k),:),corevsfra(matrixvsfra(connectmf{i,1},j),:),f(5*(r-1)-4:5*(r-1),:));
|
||||
end
|
||||
end
|
||||
end
|
||||
Gff{i,1}=cf;
|
||||
end
|
||||
end
|
||||
|
||||
if flag==1
|
||||
fracp=raofrac{i,1};
|
||||
nfrac=size(fracp,1);
|
||||
cf=zeros(nfrac);
|
||||
for i=1:m
|
||||
for j=1:nfrac
|
||||
for k=1:nfrac
|
||||
cf(j,k)=triint1lpr(raofrac{i,1}{k,1},f((5*raofrac{i,1}{k,3}-4):(5*raofrac{i,1}{k,3}),:),raofrac{i,1}{j,2});
|
||||
end
|
||||
end
|
||||
Gff{i,1}=cf;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
%% Gf矩阵的求解
|
||||
%corevsfra矩阵存放每个裂缝网格的重心坐标
|
||||
syms z y x;
|
||||
% m=size(matrixvsfra,1);
|
||||
m=size(connectmf,1);%m表示包含裂缝单元的基质网格数
|
||||
Gf=cell(m,1);
|
||||
|
||||
if flag==0
|
||||
for i=1:m
|
||||
indice=find(matrixvsfra(connectmf{i,1},:)~=0);
|
||||
n=size(indice,2);
|
||||
cf=zeros(n,np);
|
||||
if(n>0)%表明改基质网格包含裂缝网格n=size(indice,2);
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
for j=1:n
|
||||
for k=1:np
|
||||
%for k=1:6%使立方体面循环
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(i,j)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
%k=1
|
||||
core=corevsfra(matrixvsfra(connectmf{i,1},j),:);
|
||||
r=-1./((4.*pi).*sqrt(x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2);
|
||||
s=floor((k+fn-1)/fn);
|
||||
p2=p(k,:);
|
||||
if s==1
|
||||
rao=r;
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==6
|
||||
rao=r;
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==2
|
||||
rao=r;
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==5
|
||||
rao=r;
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==3
|
||||
rao=r;
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(j,k)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==4
|
||||
rao=r;
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(j,k)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
Gf{i,1}=cf;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if flag==1
|
||||
for i=1:m
|
||||
matnodes=nodes(connectmf{i,1},1);
|
||||
origin=coord(matnodes,:);
|
||||
p=repmat(origin,np,1)+cor;%accor是该基质网格面上所有点的实际坐标
|
||||
fracp=raofrac{i,1};
|
||||
nfrac=size(fracp,1);
|
||||
cf=zeros(nfrac,np);
|
||||
for j=1:nfrac
|
||||
for k=1:np
|
||||
%for k=1:6%使立方体面循环
|
||||
% for r=2:(nf+1)
|
||||
% if(matrixvsfra(i,j)<fracstart(r)) break;%判断该点处在哪个裂缝平面上,可知在r-1号裂缝面上
|
||||
% end
|
||||
% end
|
||||
%k=1
|
||||
core=raofrac{i,1}{j,2};
|
||||
s=floor((k+fn-1)/fn);
|
||||
p2=p(k,:);
|
||||
r=-1./((4.*pi).*sqrt((x-core(1)).^2+(y-core(2)).^2+(z-core(3)).^2));
|
||||
if s==1
|
||||
rao=r;
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==6
|
||||
rao=r;
|
||||
g=subs(rao,z,p2(3));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,y)g1(x,y);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(2)-delty/2,p2(2)+delty/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==2
|
||||
rao=r;
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==5
|
||||
rao=r;
|
||||
g=subs(rao,y,p2(2));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(x,z)g1(x,z);
|
||||
cf(j,k)=integral2(g2,p2(1)-deltx/2,p2(1)+deltx/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==3
|
||||
rao=r;
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(j,k)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
if s==4
|
||||
rao=r;
|
||||
g=subs(rao,x,p2(1));
|
||||
if (isempty(symvar(g))) cf(k,j)=0;
|
||||
else
|
||||
g1=matlabFunction(g);
|
||||
g2=@(y,z)g1(y,z);
|
||||
cf(j,k)=integral2(g2,p2(2)-delty/2,p2(2)+delty/2,p2(3)-deltz/2,p2(3)+deltz/2,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
Gf{i,1}=cf;
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
%% 系数矩阵计算
|
||||
% m=size(matrixvsfra,1);
|
||||
% Ap=cell(m,1);
|
||||
|
||||
if flag==1
|
||||
Ap=cell(m,1);
|
||||
Apf=cell(m,1);
|
||||
for i=1:m
|
||||
conv=convcell{i,1};
|
||||
convp=pinv(conv);
|
||||
% if (isempty(Gfm{i,1})==0)%非空
|
||||
Gin = G^(-1);
|
||||
Ap0 = dGf{i,1} - Gf{i,1} * Gin * dG;
|
||||
Apf0 = Gf{i,1} * Gin * Gfm{i,1} - Gff{i,1};
|
||||
Apfv = conv*Apf0^(-1);
|
||||
Apt= Apfv * Ap0;
|
||||
Ap{i,1} = Apt * ones(np,1);
|
||||
Apf{i,1} = -Apfv*convp;
|
||||
end
|
||||
end
|
||||
|
||||
if flag==0
|
||||
Ap=cell(m,1);
|
||||
Apf=cell(m,1);
|
||||
for i=1:m
|
||||
% if (isempty(Gfm{i,1})==0)%非空
|
||||
Gin = G^(-1);
|
||||
Ap0 = dGf{i,1} - Gf{i,1} * Gin * dG;
|
||||
Apf0 = Gf{i,1} * Gin * Gfm{i,1} - Gff{i,1};
|
||||
Apfv = Apf0^(-1);
|
||||
Apt= Apfv * Ap0;
|
||||
Ap{i,1} = Apt * ones(np,1);
|
||||
Apf{i,1} = -Apfv;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
function [ ] = network3D(dx,dy,dz,nx,ny,nz )
|
||||
%UNTITLED 此处显示有关此函数的摘要
|
||||
% 此处显示详细说明
|
||||
%figure
|
||||
% % % ndgrid(0:dx:dx*nx,0:dy:dy*ny,0:dz:dz*nz);
|
||||
% % % x=0:dx:dx*nx;y=0:dy:dy*ny;z=0:dz:dz*nz;
|
||||
% % % lx=size(x,2);ly=size(y,2);lz=size(z,2);
|
||||
% % % %x方向线,每个方向上有11*11=121条线
|
||||
% % % xx=x(1)*ones(2,ly*lz);xx(2,:)=x(lx)*ones(1,ly*lz);
|
||||
% % % xy=repmat(y,2,lz);
|
||||
% % % xz=repmat(z,ly,1);
|
||||
% % % xz=reshape(xz,1,ly*lz);
|
||||
% % % xz=repmat(xz,2,1);
|
||||
% % % %y方向线,每个方向上有11*11=121条线
|
||||
% % % yy=y(1)*ones(2,lx*lz);yy(2,:)=y(ly)*ones(1,lx*lz);
|
||||
% % % yx=repmat(x,2,lz);
|
||||
% % % yz=repmat(z,lx,1);
|
||||
% % % yz=reshape(yz,1,lx*lz);
|
||||
% % % yz=repmat(yz,2,1);
|
||||
% % % %z方向线,每个方向上有11*11=121条线
|
||||
% % % zz=z(1)*ones(2,lx*ly);zz(2,:)=z(lz)*ones(1,lx*ly);
|
||||
% % % zx=repmat(x,2,ly);
|
||||
% % % zy=repmat(y,lx,1);
|
||||
% % % zy=reshape(zy,1,lx*ly);
|
||||
% % % zy=repmat(zy,2,1);
|
||||
% % % xline=[xx,yx,zx];
|
||||
% % % yline=[xy,yy,zy];
|
||||
% % % zline=[xz,yz,zz];
|
||||
% % % line(xline,yline,zline,'linewidth',0.01,'color',[0.5,0.5,0.5]);
|
||||
% % % hold on;
|
||||
|
||||
% 新的
|
||||
x=0:dx:dx*nx;y=0:dy:dy*ny;z=0:dz:dz*nz;
|
||||
lx=size(x,2);ly=size(y,2);lz=size(z,2);
|
||||
%x方向线,每个方向上有11*11=121条线
|
||||
xx=x(1)*ones(2,ly+lz);xx(2,:)=x(lx)*ones(1,ly+lz);
|
||||
xy=[repmat(0,2,lz),repmat(y,2,1)];
|
||||
xz=[repmat(z,2,1),repmat(dz*nz,2,ly)];
|
||||
%y方向线,每个方向上有11*11=121条线
|
||||
yy=y(1)*ones(2,lx+lz);yy(2,:)=y(ly)*ones(1,lx+lz);
|
||||
yx=[repmat(0,2,lz),repmat(x,2,1)];
|
||||
yz=[repmat(z,2,1),repmat(dz*nz,2,lx)];
|
||||
%z方向线,每个方向上有11*11=121条线
|
||||
zz=z(1)*ones(2,lx+ly);zz(2,:)=z(lz)*ones(1,lx+ly);
|
||||
zx=[repmat(0,2,ly),repmat(x,2,1)];
|
||||
zy=[repmat(y,2,1),repmat(0,2,lx)];
|
||||
|
||||
xline=[xx,yx,zx];
|
||||
yline=[xy,yy,zy];
|
||||
zline=[xz,yz,zz];
|
||||
% line(xline,yline,zline,'linewidth',0.01,'color',[0.5,0.5,0.5]);
|
||||
line(xline,yline,zline,'linewidth',0.1,'color','k');
|
||||
hold on;
|
||||
axis tight;
|
||||
% axis equal;
|
||||
xlabel('x/m');
|
||||
ylabel('y/m');
|
||||
|
||||
% fill3(xline,yline,zline,'r');
|
||||
end
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
function [ f ] = outfp( finitial )
|
||||
%PUTFP 此处显示有关此函数的摘要
|
||||
% 此处显示详细说明
|
||||
nf=size(finitial,1);
|
||||
f=zeros(5*nf,3);
|
||||
for i=1:nf
|
||||
f(5*i-4,:)=finitial{i,2};
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
function [ ] = plotmesh2D( xink,anothersection,the_color )
|
||||
% figure('color','w');
|
||||
m=size(xink,1);
|
||||
for i=1:1:m
|
||||
indice=find(xink(i,:)~=0);
|
||||
if(size(indice,2)==0) continue;
|
||||
else
|
||||
point=xink(i,indice)';
|
||||
u=anothersection(point,1);
|
||||
v=anothersection(point,2);
|
||||
% dt=DelaunayTri(u,v);
|
||||
% %triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
% k1 = convexHull(dt);%k1是列向量,且长度极可能与k矩阵列数不一致
|
||||
plot(u,v, '.', 'markersize',20); hold on;
|
||||
plot(u,v, the_color,'linewidth',2);
|
||||
fill(u,v,the_color);
|
||||
% axis equal
|
||||
% axis tight
|
||||
end
|
||||
end
|
||||
%标号
|
||||
for i=1:size(anothersection,1)
|
||||
c=num2str(i);
|
||||
c=[' ',c];
|
||||
text(anothersection(i,1),anothersection(i,2),c,'VerticalAlignment','top');
|
||||
end
|
||||
axis off;
|
||||
hold off;
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
function [ ] = plotmesh3D( xink,d3intersection,the_color)
|
||||
% figure('color','w');
|
||||
m=size(xink,1);
|
||||
the_num=0;
|
||||
for i=1:1:m
|
||||
indice=find(xink(i,:)~=0);
|
||||
if(size(indice,2)==0) continue;
|
||||
else
|
||||
point=xink(i,indice)';
|
||||
x=d3intersection(point,1);
|
||||
y=d3intersection(point,2);
|
||||
z=d3intersection(point,3);
|
||||
% dt=DelaunayTri(u,v);
|
||||
% %triplot(d,anothersection(1,:),anothersection(2,:));
|
||||
% k1 = convexHull(dt);%k1是列向量,且长度极可能与k矩阵列数不一致
|
||||
|
||||
plot3(x,y,z, '.', 'markersize',1); hold on;
|
||||
fill3(x,y,z,the_color);% the_color(1) the_color{1}
|
||||
% plot3(x,y,z, the_color{1},'linewidth',1,'color',[0.5,0.5,0.5]); %
|
||||
% plot3(x,y,z, the_color(1),'linewidth',1,'color','k');
|
||||
plot3(x,y,z, the_color,'linewidth',1);
|
||||
end
|
||||
end
|
||||
% %% 标号
|
||||
% for i=1:size(d3intersection,1)
|
||||
% c=num2str(i);
|
||||
% c=[' ',c];
|
||||
% text(d3intersection(i,1),d3intersection(i,2),d3intersection(i,3),c)
|
||||
% end
|
||||
% axis equal
|
||||
%hold off;
|
||||
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,166 @@
|
||||
function [ transmatrix,transfracture ] = trans(dx,dy,dz ,nx,ny,nz,nf,fracnumber,lengthvsfra,disvsfra,fracstart,connect_infrac,corevsfra,matrixvsfra,raopoint,f )
|
||||
%dx,dy,dz是三个行向量,为了适应于局部加密,没有设置成均等的间隔
|
||||
%基质网格与基质网格的传导系数transmatrix
|
||||
%裂缝与裂缝网格的传导系数transfracture
|
||||
%由于裂缝与裂缝相交情况复杂,因此按照一个网格内包含的裂缝网格数,按照星型变换的结果计算,而不管具体的裂缝网格连接情况
|
||||
np=nx * ny * nz;%基质网格数目
|
||||
m=size(fracnumber,1);%裂缝网格数目
|
||||
raomatrix=zeros(np);
|
||||
transmatrix=zeros(np);%基质网格之间传导系数,对称阵,如果是0,则无传质
|
||||
raofracture=zeros(m);
|
||||
transfracture=zeros(m);%需要注意裂缝相交时的情况,遵循星型变换规则,具体细节见下述描述
|
||||
%% 基质网格间传导系数求解,没有乘以渗透率
|
||||
%设置raotrans矩阵,存放A/(L/2)
|
||||
for k=1:nz
|
||||
for j = 1 : ny
|
||||
for i = 1 : nx
|
||||
if(i-1>=1&&i-1<=nx)
|
||||
raomatrix(i + (j - 1) * nx+nx*ny*(k-1), i-1+ (j - 1) * nx+nx*ny*(k-1))=dy(j)*dz(k)/(dx(i)/2);
|
||||
end
|
||||
if(i+1>=1&&i+1<=nx)
|
||||
raomatrix(i + (j - 1) * nx+nx*ny*(k-1), i+1+ (j - 1) * nx+nx*ny*(k-1))=dy(j)*dz(k)/(dx(i)/2);
|
||||
end
|
||||
if(j-2>=0&&j-2<=ny-1)
|
||||
raomatrix(i + (j - 1) * nx+nx*ny*(k-1), i + (j - 2) * nx+nx*ny*(k-1))=dx(i)*dz(k)/(dy(j)/2);
|
||||
end
|
||||
if(j>=0&&j<=ny-1)
|
||||
raomatrix(i + (j-1 ) * nx+nx*ny*(k-1), i + (j ) * nx+nx*ny*(k-1))=dx(i)*dz(k)/(dy(j)/2);
|
||||
end
|
||||
if(k-2>=0&&k-2<=nz-1)
|
||||
raomatrix(i + (j - 1) * nx+nx*ny*(k-1), i + (j - 1) * nx+nx*ny*(k-2))=dx(i)*dy(j)/(dz(k)/2);
|
||||
end
|
||||
if(k>=0&&k-2<=nz-1)
|
||||
raomatrix(i + (j - 1) * nx+nx*ny*(k-1), i + (j - 1) * nx+nx*ny*(k))=dx(i)*dy(j)/(dz(k)/2);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
%利用tansmatrix矩阵的对称性减少循环运算,提高效率
|
||||
for i=1:np
|
||||
for j=1:np
|
||||
if(raomatrix(i,j)~=0)
|
||||
transmatrix(i,j)=(raomatrix(i,j)*raomatrix(j,i))/(raomatrix(i,j)+raomatrix(j,i));
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
%% 计算裂缝网格之间的传导系数,先不管不同裂缝面相交时的传导系数情况
|
||||
%先将不同裂缝面的连接情况合在一起
|
||||
% raodu=zeros(m);
|
||||
% p=1;
|
||||
% for i=1:nf
|
||||
% raonumber=size(connect_infrac{i,1},1);
|
||||
% raodu(p:raonumber,p:p+raonumber-1)=connect_infrac{i,1};
|
||||
% p=p+raonumber;
|
||||
% end
|
||||
%计算裂缝网格之间的传导系数,没有乘以缝宽和渗透率
|
||||
|
||||
% for i=1:m
|
||||
% for j=1:m
|
||||
% if(raodu(i,j)~=0)
|
||||
% A=fracnumber(j,:);
|
||||
% B=fracnumber(k,:);
|
||||
% A(A==0)=[];
|
||||
% B(B==0)=[];
|
||||
% raoflag=intersect(A,B);
|
||||
% length=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));
|
||||
% rao1=corevsfra(i,:)-d3intersection(raoflag(1),:);
|
||||
% rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
% disvsfra=norm(cross(rao1',rao2'))/norm(rao2);%计算出裂缝网格重心到公共边的距离
|
||||
% raofracture(i,j)=length/disvsfra;%没有乘以渗透率和缝宽
|
||||
% end
|
||||
% end
|
||||
% end
|
||||
p=0;
|
||||
for raox=1:nf
|
||||
raonumber=size(connect_infrac{raox,1},1);% raox条裂缝面上的裂缝单元数
|
||||
d3intersection=raopoint{raox,1};
|
||||
for i=1:raonumber %p:(p+raonumber-1)
|
||||
for j=1:10
|
||||
if(connect_infrac{raox,1}(i,j)~=0)
|
||||
A=fracnumber(i+p,:);
|
||||
B=fracnumber(connect_infrac{raox,1}(i,j),:);
|
||||
A(A==0)=[];
|
||||
B(B==0)=[];
|
||||
raoflag=intersect(A,B);
|
||||
length=norm(d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:));
|
||||
rao1=corevsfra(i+p,:)-d3intersection(raoflag(1),:);
|
||||
rao2=d3intersection(raoflag(1),:)-d3intersection(raoflag(2),:);
|
||||
newdisvsfra=norm(cross(rao1',rao2'))/norm(rao2);%计算出裂缝网格重心到公共边的距离
|
||||
raofracture(i,connect_infrac{raox,1}(i,j))=length/newdisvsfra;%没有乘以渗透率和缝宽
|
||||
end
|
||||
end
|
||||
end
|
||||
p=p+raonumber;
|
||||
end
|
||||
|
||||
for i=1:m
|
||||
for j=1:m
|
||||
if(raofracture(i,j)~=0)
|
||||
transfracture(i,j)=(raofracture(i,j)*raofracture(j,i))/(raofracture(i,j)+raofracture(j,i));
|
||||
end
|
||||
end
|
||||
end
|
||||
%% 考虑基质网格内裂缝相交时,裂缝网格之间的传导系数
|
||||
%首先将该基质网格中包含的裂缝网格按照裂缝面的不同分组存放,判断同一裂缝面上裂缝网格的交线,
|
||||
%并计算相应裂缝网格重心到交线的距离,并将此作为该裂缝网格的传导系数,如果某裂缝网格与同一裂缝面上多个裂缝网格都有相交
|
||||
%则该裂缝网格的传导是所有传导系数的算数平均(因为不是在一条流线上)
|
||||
%由于连接关系复杂,故简化为所有网格的传导系数,按照星型变换的规则,确定该基质网格中某裂缝网格到另一裂缝网格的传导系数
|
||||
% n=size(matrixvsfra,1);
|
||||
% indice=zeros(nf,10);
|
||||
% for i=1:n
|
||||
% raoindice=find(matrixvsfra(i,:)~=0);
|
||||
% if(size(raoindice,2)>1)
|
||||
% for k=1:nf
|
||||
% indice(k,:)=find((matrixvsfra(i,:)<fracstart(k+1))&&(matrixvsfra(i,:)>=fracstart(k)));
|
||||
% end
|
||||
% for k=1:nf
|
||||
% if(size(indice(k,:),2)>1)%若等于0,则该裂缝面没有网格在其中,若等于1,说明该裂缝网格没有与其它裂缝面相交,故不予考虑去改变
|
||||
% rao=zero(size(indice(k,:),2));
|
||||
% for j=1:size(indice(k,:),2)%在同一裂缝面内查看这些同裂缝面裂缝网格的相交情况
|
||||
% for z=1:size(indice(k,:),2)
|
||||
% A=fracnumber(matrixvsfra(i,indice(k,j)),:);
|
||||
% B=fracnumber(matrixvsfra(i,indice(k,z)),:);
|
||||
% raoindi=intersect(A,B);
|
||||
% if(size(raoindi,2)==2)
|
||||
% length=norm(d3intersection(raoindi(1),:)-d3intersection(raoindi(2),:));
|
||||
% rao1=corevsfra(matrixvsfra(i,indice(k,j)),:)-d3intersection(raoindi(1),:);
|
||||
% rao2=d3intersection(raoindi(1),:)-d3intersection(raoindi(2),:);
|
||||
% disvsfra=norm(cross(rao1',rao2'))/norm(rao2);%计算出裂缝网格重心到公共边的距离
|
||||
% rao(j,z)=length/disvsfra;%没有乘以渗透率和缝宽
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
% end
|
||||
% end
|
||||
|
||||
% 首先将该基质网格中包含的裂缝网格按照裂缝面的不同分组存放,某一裂缝网格的传导系数等于朝向各边的传导系数的算术平均(连接情况复杂,此为简化处理)
|
||||
% 按照星型变换的规则,确定该基质网格中某裂缝网格到另一裂缝网格的传导系数
|
||||
n=size(matrixvsfra,1);
|
||||
indice=zeros(nf,10);
|
||||
for i=1:n
|
||||
raoindice=find(matrixvsfra(i,:)~=0);
|
||||
if(size(raoindice,2)>1)
|
||||
extratrans=zeros(1,size(raoindice,2));
|
||||
for j=1:size(raoindice,2)
|
||||
% for k=2:(nf+1)
|
||||
% if(matrixvsfra(i,raoindice(j))<fracstart(k))%判断该点处在哪个裂缝平面上,可知在k-1号裂缝面上
|
||||
A=fracnumber(matrixvsfra(i,raoindice(j)),:);%matrixvsfra矩阵存储的就是所有裂缝网格混在一起的编号
|
||||
loveindice=find(fracnumber(matrixvsfra(i,raoindice(j)),:)~=0);
|
||||
love=size(loveindice,2)-1;
|
||||
extratrans(1,j)=lengthvsfra(matrixvsfra(i,raoindice(j)),1:love)*(1./disvsfra(matrixvsfra(i,raoindice(j)),1:love))';
|
||||
end
|
||||
for r=1:size(raoindice,2)
|
||||
for s=1:size(raoindice,2)
|
||||
if(r~=s)
|
||||
transfracture(matrixvsfra(i,r),matrixvsfra(i,s))=extratrans(1,r)*extratrans(1,s)/sum(extratrans);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
function [Ka, M, F2M , MF_coef] = transFunc_aniso_MODIFIED(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}; grid_num=Ap{i,2};
|
||||
Apfi=Apf{i,1};
|
||||
nlf = length(indxf);%该基质网格中包含的裂缝单元数
|
||||
ind = ie;%该基质网格的编号
|
||||
indf = indxf + nmc;%该基质网格所包含裂缝单元在nc中的序号
|
||||
% 不在只是一个基质网格压力与该网格内裂缝cell窜流有关
|
||||
% m1 = repmat(ind, nlf, 1);
|
||||
m1 = repmat(grid_num, nlf, 1);
|
||||
f1 = repmat(indf, nlf, 1);
|
||||
% Il = zeros(nlf, 1+nlf);
|
||||
Il = zeros(nlf, 5+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,57 @@
|
||||
function [ cf ] = triint1lpr( coordinate,f,coreco )
|
||||
%TRIINT 此处显示有关此函数的摘要,f表示所处裂缝面的参数5*3矩阵
|
||||
% 此处显示详细说明
|
||||
syms u v r s length;
|
||||
t0=f(1,:);
|
||||
t1=f(2,:);
|
||||
t2=f(3,:);
|
||||
x1=coordinate(1,1);y1=coordinate(1,2);
|
||||
x2=coordinate(2,1);y2=coordinate(2,2);
|
||||
x3=coordinate(3,1);y3=coordinate(3,2);
|
||||
Jocbimatrix=[x1-x3,x2-x3;
|
||||
y1-y3,y2-y3];
|
||||
J=abs(det(Jocbimatrix));
|
||||
if(J==0) cf=0;
|
||||
else
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
p1=coreco-t0;
|
||||
p2=A\p1';
|
||||
u0=p2(1);v0=p2(2);
|
||||
tol=t1*u0+t2*v0+t0-coreco;
|
||||
if(norm(tol)==0)%说明该点在该平面上,是奇点
|
||||
length=sqrt((u-u0)^2*norm(t1)^2+(v-v0)^2*norm(t2)^2)+1e-6;
|
||||
g=-1/4/pi/length;
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)g1(r,s);
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
% ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
% lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+0.01;%与奇点相比具有本质的差别,在原积分可积的情况下,误差极小!
|
||||
% g=-1/(4*pi*length);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
else%不存在奇点
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-coreco(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-coreco(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-coreco(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2);
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
f=@(r,s)g1(r,s);
|
||||
smax=@(r)1-r;
|
||||
cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%cf=J*norm(t1)*norm(t2)*integral2(g1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -0,0 +1,93 @@
|
||||
function [ cf ] = triint( coordinate,f,p0 )
|
||||
%TRIINT 此处显示有关此函数的摘要,f表示所处裂缝面的参数5*3矩阵
|
||||
% 此处显示详细说明
|
||||
syms u v r s length m n;
|
||||
t0=f(1,:);
|
||||
t1=f(2,:);
|
||||
t2=f(3,:);
|
||||
x1=coordinate(1,1);y1=coordinate(1,2);
|
||||
x2=coordinate(2,1);y2=coordinate(2,2);
|
||||
x3=coordinate(3,1);y3=coordinate(3,2);
|
||||
Jocbimatrix=[x1-x3,x2-x3;
|
||||
y1-y3,y2-y3];
|
||||
J=abs(det(Jocbimatrix));
|
||||
if(J==0) cf=0;
|
||||
else
|
||||
A=[t1(1),t2(1);
|
||||
t1(2),t2(2);
|
||||
t1(3),t2(3)];
|
||||
p1=p0-t0;
|
||||
p2=A\p1';
|
||||
% p2=(A'*p1')\(A'*A);
|
||||
u0=p2(1);v0=p2(2);
|
||||
tol=t1*u0+t2*v0+t0-p0;
|
||||
if(norm(tol)==0)%说明该点在该平面上,是奇点
|
||||
% length=sqrt((u-u0)^2*norm(t1)^2+(v-v0)^2*norm(t2)^2);
|
||||
% g=-1/4/pi/length;
|
||||
% g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f1=@(r,s)(g1(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%上述方法无效,因此拟打算在积分时给length加上一个较小的正常数,使其为非奇点情况
|
||||
%该处理是合理的,因为裂缝本就具有一定厚度,并且该积分本身是可积的,这保证了这样处理的误差极小,暂定为加0.01。
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)g1(r,s);
|
||||
smax=@(r)1-r;
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+1e-6;%与奇点相比具有本质的差别,在原积分可积的情况下,误差极小!
|
||||
% g=-1/(4*pi*length);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
else%不存在奇点
|
||||
lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
g=-1/(4*pi*length);
|
||||
g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
g1=matlabFunction(g);
|
||||
% % % f2=@(r,s)(r+s<=1);
|
||||
% % % f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
f=@(r,s)g1(r,s);
|
||||
smax=@(r)1-r;
|
||||
% length=sqrt(lx^2+ly^2+lz^2)+1e-6;
|
||||
% g=-1/(4*pi*length);
|
||||
% g=subs(g,[u,v],[(x1-x3)*r+(x2-x3)*s+x3,(y1-y3)*r+(y2-y3)*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f=@(r,s)(g1(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(u,v)(u+v<=1);
|
||||
% f1=@(u,v)(g1(u,v).*f2(u,v));
|
||||
cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,smax,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
% g=@(r,s)(-1./(4.*pi.*sqrt((((x1-x3).*r+(x2-x3).*s+x3).*t1(1)+((y1-y3).*r+(y2-y3).*s+y3).*t2(1)+t0(1)-p0(1)).^2+...
|
||||
% (((x1-x3).*r+(x2-x3).*s+x3).*t1(2)+((y1-y3).*r+(y2-y3).*s+y3).*t2(2)+t0(2)-p0(2)).^2+...
|
||||
% (((x1-x3).*r+(x2-x3).*s+x3).*t1(3)+((y1-y3).*r+(y2-y3).*s+y3).*t2(3)+t0(3)-p0(3)).^2)));
|
||||
% lx=u*t1(1)+v*t2(1)+t0(1)-p0(1);
|
||||
% ly=u*t1(2)+v*t2(2)+t0(2)-p0(2);
|
||||
% lz=u*t1(3)+v*t2(3)+t0(3)-p0(3);
|
||||
% length=sqrt(lx^2+ly^2+lz^2);
|
||||
% g=-1/(4*pi*length);
|
||||
%g=subs(g,[u,v],[(x1-x3).*r+(x2-x3).*s+x3,(y1-y3).*r+(y2-y3).*s+y3]);
|
||||
% g1=matlabFunction(g);
|
||||
% f2=@(r,s)(r+s<=1);
|
||||
% f=@(r,s)(g(r,s).*f2(r,s));
|
||||
% cf=J*norm(t1)*norm(t2)*integral2(f,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
%cf=J*norm(t1)*norm(t2)*integral2(g1,0,1,0,1,'Method','iterated','AbsTol',1e-8,'RelTol',1e-5);
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
function [ pos ] = find_row( struc_x,N )
|
||||
%FIND_ROW 此处显示有关此函数的摘要
|
||||
% 此处显示详细说明
|
||||
sz=size(N,1); %获得a的行列数
|
||||
pos=[]; %待记录的位置
|
||||
for i=1:sz %sz(1)为a的行数
|
||||
if(isequal(N(i,:),struc_x))
|
||||
pos=[pos;i];
|
||||
end
|
||||
end
|
||||
% 将nei_grid反序
|
||||
struc_x_inv=[struc_x(2),struc_x(1)];
|
||||
for i=1:sz %sz(1)为a的行数
|
||||
if(isequal(N(i,:),struc_x_inv))
|
||||
pos=[pos;i];
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
function h = Bg(p, BG, Ppr)
|
||||
h = interptable(Ppr, BG, p);
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
function h = Bo(p, Bopb, pb, co)
|
||||
h = Bopb * (1 - co * (p - pb));
|
||||
@@ -0,0 +1,2 @@
|
||||
function h = Bw(p, Bwi, prw, cw)
|
||||
h = Bwi * (1 - cw * (p - prw));
|
||||
@@ -0,0 +1,3 @@
|
||||
function h = cb_absorb_f(cs, cb_data, cba_data)
|
||||
h = interptable(cb_data, cba_data, cs);
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function h = cs_absorb_f(cs, cs_data, csa_data)
|
||||
h = interptable(cs_data, csa_data, cs);
|
||||
end
|
||||
@@ -0,0 +1,16 @@
|
||||
function h = cs_to_Nc(cs, cs_Nc, varargin)
|
||||
n = numel(varargin);%表示没有输入裂缝参数
|
||||
cs_data = cs_Nc(:,1);
|
||||
Nc_data = cs_Nc(:,2);
|
||||
if n == 0
|
||||
h = interptable(cs_data, Nc_data, cs);
|
||||
else
|
||||
cs_Nc_fracture = varargin{1};
|
||||
rpt = varargin{2};
|
||||
cs_data_fracture = cs_Nc_fracture(:,1);
|
||||
Nc_data_fracture = cs_Nc_fracture(:,2);
|
||||
hm = interptable(cs_data, Nc_data, cs);
|
||||
hf = interptable(cs_data_fracture, Nc_data_fracture, cs);
|
||||
h = rpt .* hm + ~rpt .* hf;%分别为裂缝与基质
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,29 @@
|
||||
function h = krg(sw, Nc, Nc_nosurf, Nc_surf, kr_nosurf, kr_surf, varargin)
|
||||
n = numel(varargin);%±íʾûÓÐÊäÈëÁÑ·ì²ÎÊý
|
||||
SW = kr_nosurf(:,1);
|
||||
KRO = kr_nosurf(:,3);
|
||||
SW_surf = kr_surf(:,1);
|
||||
KRO_surf = kr_surf(:,3);
|
||||
m = (log(Nc)-log(Nc_nosurf))./(log(Nc_surf)-log(Nc_nosurf));
|
||||
if n == 0
|
||||
h1 = interptable(SW, KRO, sw);
|
||||
h2 = interptable(SW_surf, KRO_surf, sw);
|
||||
h = (1-m).*h1 +m.*h2;
|
||||
else
|
||||
kr_nosurf_fracture = varargin{1};
|
||||
kr_surf_fracture = varargin{2};
|
||||
rpt = varargin{3};
|
||||
SWF = kr_nosurf_fracture(:,1);
|
||||
KROF = kr_nosurf_fracture(:,3);
|
||||
SWF_surf = kr_surf_fracture(:,1);
|
||||
KROF_surf = kr_surf_fracture(:,3);
|
||||
h1m = interptable(SW, KRO, sw);
|
||||
h1f = interptable(SWF, KROF, sw);
|
||||
h2m = interptable(SW_surf, KRO_surf, sw);
|
||||
h2f = interptable(SWF_surf, KROF_surf, sw);
|
||||
h1 = rpt .* h1m + ~rpt .* h1f;
|
||||
h2 = rpt .* h2m + ~rpt .* h2f;
|
||||
h = (1-m).*h1 +m.*h2;
|
||||
end
|
||||
% h=sw+(1-sw);
|
||||
end
|
||||
@@ -0,0 +1,14 @@
|
||||
function h = kro(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,30 @@
|
||||
function h = krw(sw, Nc, Nc_nosurf, Nc_surf, kr_nosurf, kr_surf, varargin)
|
||||
n = numel(varargin);%表示没有输入裂缝参数
|
||||
SW = kr_nosurf(:,1);
|
||||
KRW = kr_nosurf(:,2);
|
||||
SW_surf = kr_surf(:,1);
|
||||
KRW_surf = kr_surf(:,2);
|
||||
m = (log(Nc)-log(Nc_nosurf))./(log(Nc_surf)-log(Nc_nosurf));
|
||||
if n == 0
|
||||
h1 = interptable(SW, KRW, sw);
|
||||
h2 = interptable(SW_surf, KRW_surf, sw);
|
||||
h = (1-m).*h1 +m.*h2;
|
||||
else
|
||||
kr_nosurf_fracture = varargin{1};
|
||||
kr_surf_fracture = varargin{2};
|
||||
rpt = varargin{3};
|
||||
SWF = kr_nosurf_fracture(:,1);
|
||||
KRWF = kr_nosurf_fracture(:,2);
|
||||
SWF_surf = kr_surf_fracture(:,1);
|
||||
KRWF_surf = kr_surf_fracture(:,2);
|
||||
h1m = interptable(SW, KRW, sw);
|
||||
h1f = interptable(SWF, KRWF, sw);
|
||||
h2m = interptable(SW_surf, KRW_surf, sw);
|
||||
h2f = interptable(SWF_surf, KRWF_surf, sw);
|
||||
h1 = rpt .* h1m + ~rpt .* h1f;
|
||||
h2 = rpt .* h2m + ~rpt .* h2f;
|
||||
h = (1-m).*h1 +m.*h2;
|
||||
end
|
||||
% h=sw+(1-sw);
|
||||
end
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
function h = mug(p, MUG, Ppr)
|
||||
h = interptable(Ppr, MUG, p);
|
||||
end
|
||||
@@ -0,0 +1,2 @@
|
||||
function h = muo(p, visopb, pb, cvo)
|
||||
h = visopb + cvo * (p - pb);
|
||||
@@ -0,0 +1,2 @@
|
||||
function h = muw(p, vwi, prw, cvw)
|
||||
h = vwi + cvw * (p - prw);
|
||||
@@ -0,0 +1,20 @@
|
||||
function h = pc(sw, PC, varargin)
|
||||
n = numel(varargin);
|
||||
SW = PC(:,1);
|
||||
PCOW = PC(:,2);
|
||||
% if PCOW == 0
|
||||
% h = 0;
|
||||
% else
|
||||
if n == 0
|
||||
h = interptable(SW, PCOW, sw);
|
||||
else
|
||||
PC_fracture = varargin{1};
|
||||
rpt = varargin{2};
|
||||
SWF = PC_fracture(:,1);
|
||||
PCOWF = PC_fracture(:,2);
|
||||
hm = interptable(SW, PCOW, sw);
|
||||
hf = interptable(SWF, PCOWF, sw);
|
||||
h = rpt .* hm + ~rpt .* hf;
|
||||
end
|
||||
% end
|
||||
end
|
||||
@@ -0,0 +1,16 @@
|
||||
function h = pcow(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
|
||||
@@ -0,0 +1,16 @@
|
||||
function h = pcow(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
|
||||
@@ -0,0 +1,12 @@
|
||||
function h = por(p, prpor, pori, cpor, varargin)
|
||||
n = numel(varargin);
|
||||
if n == 0
|
||||
h = pori .* (1 + cpor .* (p - prpor));
|
||||
else
|
||||
prporf = varargin{1};
|
||||
cporf = varargin{2};
|
||||
rpt = varargin{3};
|
||||
hm = pori .* (1 + cpor .* (p - prpor));
|
||||
hf = pori .* (1 + cporf .* (p - prporf));
|
||||
h = rpt .* hm + ~rpt .* hf;
|
||||
end
|
||||
Reference in New Issue
Block a user