This commit is contained in:
xinxiao
2026-03-13 11:24:41 +08:00
commit 04e2bb29c7
238 changed files with 29102 additions and 0 deletions
@@ -0,0 +1,17 @@
function BF = Bpara(xb, yb)
n = length(xb);
BF = zeros(n, 7);
BF(:,3) = xb;
BF(:,4) = yb;
for i = 1 : n
if i == n
ip = 1;
else
ip = i + 1;
end
BF(i,1) = (xb(i) + xb(ip)) / 2;
BF(i,2) = (yb(i) + yb(ip)) / 2;
BF(i,5) = ((xb(i) - xb(ip))^2 + (yb(i) - yb(ip))^2)^0.5;
BF(i,6) = (yb(ip) - yb(i)) / BF(i,5);
BF(i,7) = (xb(i) - xb(ip)) / BF(i,5);
end
@@ -0,0 +1,14 @@
function FF = Fpara(xf, yf)
nf = length(xf)/2;
FF = zeros(nf, 7);
for i = 1 : nf
i1 = 2 * i - 1;
i2 = 2 * i;
FF(i,3) = xf(i1);
FF(i,4) = yf(i1);
FF(i,1) = (xf(i1) + xf(i2)) / 2;
FF(i,2) = (yf(i1) + yf(i2)) / 2;
FF(i,5) = ((xf(i1) - xf(i2))^2 + (yf(i1) - yf(i2))^2)^0.5;
FF(i,6) = (yf(i2) - yf(i1)) / FF(i,5);
FF(i,7) = (xf(i1) - xf(i2)) / FF(i,5);
end
@@ -0,0 +1,4 @@
function [x1, y1, ka] = anios(kx, ky, x, y)
ka = (kx*ky)^0.5;
x1 = x*(ka/kx)^0.5;
y1 = y*(ka/ky)^0.5;
@@ -0,0 +1,8 @@
function dG = finddg(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
dG = (lk / (2 * pi)) * quadgk(@(t)intdg(xs, ys, xk, yk, nkx, nky, lk, t), 0, 1);
% intg.m
function y = intdg(xs, ys, xk, yk, nkx, nky, lk, t)
y = (nkx*(xk - xs) + nky*(yk - ys))...
./((xk - t*lk*nky - xs).^2 + (yk + t*lk*nkx - ys).^2);
@@ -0,0 +1,15 @@
function dG = finddgAn(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
A = lk^2;
B = (-nky * (xk - xs) + nkx * (yk - ys)) * (2 * lk);
E = (xk - xs)^2 + (yk - ys)^2;
eps = 1e-9;
De = 4 * A * E - B^2;
if De <= eps
dG = 0;
else
dG = lk/pi * (nkx*(xk - xs)+nky*(yk - ys))/De^0.5 * ...
(atan((2*A+B)/De^0.5) - atan(B/De^0.5));
end
@@ -0,0 +1,7 @@
function G = findg(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
G = (1 / (4 * pi)) * quadgk(@(t)intg(xs, ys, xk, yk, nkx, nky, lk, t), 0, 1);
% intg.m
function y = intg(xs, ys, xk, yk, nkx, nky, lk, t)
y = log((xk - t*lk*nky - xs).^2 + (yk + t*lk*nkx - ys).^2);
@@ -0,0 +1,16 @@
function G = findgAn(xs, ys, xk, yk, nkx, nky, lk)
% Function aims to solve the boundary integrals
A = lk^2;
B = (-nky * (xk - xs) + nkx * (yk - ys)) * (2 * lk);
E = (xk - xs)^2 + (yk - ys)^2;
eps = 1e-9;
De = 4 * A * E - B^2;
if De <= eps
G = lk/2/pi * (log(lk/2) - 1);
else
G = 1/4/pi * (2*(log(lk) - 1) - B/2/A*log(abs(E/A))...
+ (1 + B/2/A)*log(abs(1 + B/A + E/A)) + De^0.5/A...
*(atan((2*A + B)/De^0.5) - atan(B/De^0.5)));
end
@@ -0,0 +1,35 @@
function [qomf, qofm, qwmf, qwfm] = transFunc(r, krO, krW, BO, muO, BW, muW, po, pw)
%po,pw均是定义的类数据
Ka = r.Ka;
M = r.M;
F2M = r.F2M;
MF_coef = r.MF_coef;
nfc = r.nfc;%
nc = r.nc; %
C = sparse((1 : nfc)' * [1 1], M, ones(nfc, 1) * [-1 1], nfc, nc);
grad = @(x) C * x;
faceUpstr = @(flag, x) faceUpstrb(flag, x, M, [nfc, nc]);
dpO = grad(po);
upc = (double(dpO)<=0);
mobO = faceUpstr(upc, krO./(BO.*muO));
% qomf = Ka .* r.h .* mobO .* (MF_coef * po);%
qomf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobO .* (MF_coef * po);%
% qomf = r.V(r.nmc+1:r.nc).*Ka .* mobO .* (MF_coef * po);
% qomf = Ka .* mobO .* (MF_coef * po);
qofm = -F2M * qomf;%
dpW = grad(pw);
upc = (double(dpW)<=0);
mobW = faceUpstr(upc, krW./(BW.*muW));
% qwmf = Ka .* r.h .* mobW .* (MF_coef * pw);
qwmf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobW .* (MF_coef * pw);
% qwmf = r.V(r.nmc+1:r.nc).*Ka .* mobW .* (MF_coef * pw);
% qwmf = Ka .* mobW .* (MF_coef * pw);
qwfm = -F2M * qwmf;
function xu = faceUpstrb(flag, x, N, sz)
flag = logical(flag);
upcell = N(:, 2);
upcell(flag) = N(flag, 1);
xu = sparse((1 : sz(1))', upcell, 1, sz(1), sz(2)) * x;
@@ -0,0 +1,115 @@
function [Ka, M, F2M , MF_coef,MF_deltt] = transFunc_aniso(nc,coordinates, nodes, connectmf,Ap,Apf , matrixvsfra,N,T , kx, ky,kz)
%[Ka, M, F2M , MF_coef,MF_deltt] = transFunc_aniso(nc,coordinates, nodes, connectmf,Ap,Apf ,Apmt,Apft, matrixvsfra,N,T , kx, ky,kz)
Ncell = size(connectmf, 1);%
nmc=size(matrixvsfra,1);
nfc=nc-nmc;
I = zeros(1, 1);
J = zeros(1, 1);
M = zeros(1, 2);
Ka = zeros(1, 1);
cou = 0;
for i = 1 : Ncell
ie = connectmf{i,1};%
% indxf = ConnecS{i, 3};%/
% order = reshape(ConnecS{i,2}',[],1);%
% xb = coordinates(nodes(ie,:),1);%x坐标
% yb = coordinates(nodes(ie,:),2);%y坐标
% xf = Linep(order,1);%x坐标
% yf = Linep(order,2);%y坐标
%
%
% [xb1, yb1, ka] = anios(kx(ie), ky(ie), xb, yb);
% [xf1, yf1, ~] = anios(kx(ie), ky(ie), xf, yf);
% BF = Bpara(xb1, yb1);
% FF = Fpara(xf1, yf1);
% [Ap, Apf] = transMF(BF, FF);
indxf=connectmf{i,2};
Api=Ap{i,1}; Apfi=Apf{i,1};
nlf = length(indxf);%
ind = ie;%
indf = indxf + nmc;%nc中的序号
m1 = repmat(ind, nlf, 1);
f1 = repmat(indf, nlf, 1);
Il = zeros(nlf, 1+nlf);
Jl = [m1 f1];
Vl = [Api Apfi];
for j = 1 : nlf
cou = cou + 1;
Il(j,:) = indxf(j);
I(cou) = ie;
J(cou) = indxf(j);%nfc中的序号
ka=(kx(ie)*ky(ie)*kz(ie))^(1/3);
Ka(cou) = ka;
M(cou, 1) = connectmf{i,1};
M(cou, 2) = indf(j);
end
Il = reshape(Il, [], 1);
Jl = reshape(Jl, [], 1);
Vl = reshape(Vl, [], 1);
if i == 1
I2 = Il;
J2 = Jl;
V2 = Vl;
else
I2 = [I2; Il];
J2 = [J2; Jl];
V2 = [V2; Vl];
end
end
V = ones(cou, 1);
F2M = sparse(I, J, V, nmc, nfc);
MF_coef = sparse(I2, J2, V2, nfc, nc);
% for i = 1 : Ncell
% ie = connectmf{i,1};%
% indxf = ConnecS{i, 3};%/
% order = reshape(ConnecS{i,2}',[],1);%
% xb = coordinates(nodes(ie,:),1);%x坐标
% yb = coordinates(nodes(ie,:),2);%y坐标
% xf = Linep(order,1);%x坐标
% yf = Linep(order,2);%y坐标
%
%
% [xb1, yb1, ka] = anios(kx(ie), ky(ie), xb, yb);
% [xf1, yf1, ~] = anios(kx(ie), ky(ie), xf, yf);
% BF = Bpara(xb1, yb1);
% FF = Fpara(xf1, yf1);
% [Ap, Apf] = transMF(BF, FF);
% indxf=connectmf{i,2};
% Apmti=Apmt{i,1}; Apfti=Apft{i,1};
% nlf = length(indxf);%
% ind = ie;%
% indf = indxf + nmc;%nc中的序号
% m1 = repmat(ind, nlf, 1);
% f1 = repmat(indf, nlf, 1);
% Il = zeros(nlf, 1+nlf);
% Jl = [m1 f1];
% Vl = [Apmti Apfti];
% for j = 1 : nlf
% cou = cou + 1;
% Il(j,:) = indxf(j);
% % I(cou) = ie;
% % J(cou) = indxf(j);%nfc中的序号
% % ka=(kx(ie)*ky(ie)*kz(ie))^(1/3);
% % Ka(cou) = ka;
% % M(cou, 1) = connectmf{i,1};
% % M(cou, 2) = indf(j);
% end
% Il = reshape(Il, [], 1);
% Jl = reshape(Jl, [], 1);
% Vl = reshape(Vl, [], 1);
% if i == 1
% I2 = Il;
% J2 = Jl;
% V2 = Vl;
% else
% I2 = [I2; Il];
% J2 = [J2; Jl];
% V2 = [V2; Vl];
% end
% end
% % V = ones(cou, 1);
% % F2M = sparse(I, J, V, nmc, nfc);
% MF_deltt = sparse(I2, J2, V2, nfc, nc);
% end
@@ -0,0 +1,29 @@
function [qomf, qofm] = transFuncdeltt(r, BO, muO, po,dt,pi)
%po,pw均是定义的类数据
Ka = r.Ka;
M = r.M;
F2M = r.F2M;
MF_coef = r.MF_coef;
nfc = r.nfc;%
nc = r.nc; %
C = sparse((1 : nfc)' * [1 1], M, ones(nfc, 1) * [-1 1], nfc, nc);
grad = @(x) C * x;
faceUpstr = @(flag, x) faceUpstrb(flag, x, M, [nfc, nc]);
dpO = grad(po);
upc = (double(dpO)<=0);
mobO = faceUpstr(upc, 1./(BO.*muO));
% qomf = Ka .* r.h .* mobO .* (MF_coef * po);%
qomf = r.V(r.nmc+1:r.nc)./r.wf.*Ka' .* mobO .* (MF_coef * po)+1/dt*(r.cpor+0.1*r.co)*r.wf.*(r.MF_deltt*(po-pi));%
% qomf = r.V(r.nmc+1:r.nc)./r.wf.*(Ka' .* mobO .* (MF_coef * po));
% qomf = r.V(r.nmc+1:r.nc).*Ka .* mobO .* (MF_coef * po);
% qomf = Ka' .* mobO .* (MF_coef * po);
qofm = -F2M * qomf;%
function xu = faceUpstrb(flag, x, N, sz)
flag = logical(flag);
upcell = N(:, 2);
upcell(flag) = N(flag, 1);
xu = sparse((1 : sz(1))', upcell, 1, sz(1), sz(2)) * x;
@@ -0,0 +1,61 @@
function [Ap, Apf] = transMF(BF, FF)
[nb,~] = size(BF);
[nf,~] = size(FF);
Gb = zeros(nb);
dGb = zeros(nb);
Gmf = zeros(nb, nf);
Gf = zeros(nf, nb);
dGf = zeros(nf, nb);
Gff = zeros(nf);
xb = BF(:,1);
yb = BF(:,2);
xmk = BF(:,3);
ymk = BF(:,4);
lmk = BF(:,5);
nxmk = BF(:,6);
nymk = BF(:,7);
xf = FF(:,1);
yf = FF(:,2);
xfk = FF(:,3);
yfk = FF(:,4);
lfk = FF(:,5);
nxfk = FF(:,6);
nyfk = FF(:,7);
% boundary equation
for i = 1 : nb
for j = 1 : nb
if j == i
dGb(i, j) = 0.0;
Gb(i, j) = 1/(2*pi) * (log(lmk(j)/2) - 1.0);
else
Gb(i, j) = findg(xb(i), yb(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
dGb(i, j) = finddg(xb(i), yb(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
end
end
for j = 1 : nf
Gmf(i, j) = findg(xb(i), yb(i), xfk(j), yfk(j), nxfk(j), nyfk(j), lfk(j));
end
end
dGb = dGb - 0.5 * eye(nb);
% fracture equation
for i = 1 : nf
for j = 1 : nb
Gf(i, j) = findg(xf(i), yf(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
dGf(i, j) = finddg(xf(i), yf(i), xmk(j), ymk(j), nxmk(j), nymk(j), lmk(j));
end
for j = 1 : nf
if i == j
Gff(i, j) = 1/(2*pi) * (log(lfk(j)/2) - 1.0);
else
Gff(i, j) = findg(xf(i), yf(i), xfk(j), yfk(j), nxfk(j), nyfk(j), lfk(j));
end
end
end
Gbv = Gb^(-1);
Ap0 = dGf - Gf * Gbv * dGb;
Apf0 = Gf * Gbv * Gmf - Gff;
Apfv = Apf0^(-1);
Ap = Apfv * Ap0;
Ap = Ap * ones(nb,1);
Apf = -Apfv;
+324
View File
@@ -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);
+17
View File
@@ -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;
+31
View File
@@ -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);
+44
View File
@@ -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);
+6
View File
@@ -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%00
pcOW = f.pcgl(sw);
end
pw = p - pcOW;
ipwf = 0;
for i = 1 : nWel
if strcmp(well_schedules_k{i,2},'open')
jperfall = Wellc{i,3};%
if strcmp(well_schedules_k{i,3},'pro') % prod
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygt(jperf);
Yw = Ywt(jperf);
qo = -Tr(j) .* Yo .*(p(jperf) - pwf(ipwf));
qw = -Tr(j) .* Yw .*(pw(jperf) - pwf(ipwf));
qcs = -Tr(j) .* cs(jperf).*Yw .*(pw(jperf) - pwf(ipwf));
qcb = -Tr(j) .* cb(jperf).*Yw .*(pw(jperf) - pwf(ipwf));
%nc行是水相方程
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(jperf) = qw.val;
%nc行是水相方程
Awell(r.nc + jperf, :) = [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4} qo.jac{5}];
qwell(r.nc + jperf) = qo.val;
%
Awell(2*r.nc + jperf, :) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4} qcs.jac{5}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, :) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4} qcb.jac{5}];
qwell(3*r.nc + jperf) = qcb.val;
%
% 使MR迭代收敛条件过高
Awell(4*r.nc + ipwf, :) = Awell(4*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}] + [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4} qo.jac{5}];
qwell(4*r.nc + ipwf) = qwell(4*r.nc + ipwf) + qw.val + qo.val;
end
qwell(4*r.nc + ipwf) = (qwell(4*r.nc + ipwf) + well_schedules_k{i,5}/86.4);
else % const pwf
if ~WelChg(i)
pwfc = well_schedules_k{i,5};
else
pwfc = well_schedules_k{i,6};
end
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygt(jperf);
Yw = Ywt(jperf);
qo = -Tr(j) .* Yo .*(p(jperf) - pwfc);
qw = -Tr(j) .* Yw .*(pw(jperf) - pwfc);
qcs = -Tr(j) .* cs(jperf).*Yw .*(pw(jperf) - pwfc);
qcb = -Tr(j) .* cb(jperf).*Yw .*(pw(jperf) - pwfc);
%
Awell(jperf, 1 : 4 * r.nc) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4}];
qwell(jperf) = qw.val;
%
Awell(r.nc + jperf, 1 : 4 * r.nc) = [qo.jac{1} qo.jac{2} qo.jac{3} qo.jac{4}];
qwell(r.nc + jperf) = qo.val;
%
Awell(2*r.nc + jperf, 1 : 4 * r.nc) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, 1 : 4 * r.nc) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4}];
qwell(3*r.nc + jperf) = qcb.val;
end
end
else %
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygj(jperf);
Yw = Ywj(jperf);
qw = -Tr(j) ./ BW(jperf) .* (Yo + Yw) .* (pw(jperf) - pwf(ipwf));
qcs = qw*well_schedules_k{i,8};
qcb = qw*well_schedules_k{i,10};
%
Awell(jperf, :) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(jperf) = qw.val;
%
Awell(2*r.nc + jperf, :) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4} qcs.jac{5}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, :) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4} qcb.jac{5}];
qwell(3*r.nc + jperf) = qcb.val;
%
Awell(4*r.nc + ipwf, :) = Awell(4*r.nc + ipwf, :) + ...
[qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4} qw.jac{5}];
qwell(4*r.nc + ipwf) = qwell(4*r.nc + ipwf) + qw.val;
end
qwell(4*r.nc + ipwf) = qwell(4*r.nc + ipwf) - well_schedules_k{i,5}/86.4;
else %
if ~WelChg(i)
pwfc = well_schedules_k{i,5};
else
pwfc = well_schedules_k{i,6};
end
Tr = Wellc{i,4};
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
Yo = Ygj(jperf);
Yw = Ywj(jperf);
qw =- Tr(j) ./ BW(jperf) .* (Yo + Yw) .* (pw(jperf) - pwfc);
qcs = qw*well_schedules_k{i,8};
qcb = qw*well_schedules_k{i,10};
Awell(jperf, 1 : 4*r.nc) = [qw.jac{1} qw.jac{2} qw.jac{3} qw.jac{4}];
qwell(jperf) = qw.val;
%
Awell(2*r.nc + jperf, 1 : 4*r.nc) = [qcs.jac{1} qcs.jac{2} qcs.jac{3} qcs.jac{4}];
qwell(2*r.nc + jperf) = qcs.val;
%
Awell(3*r.nc + jperf, 1 : 4*r.nc) = [qcb.jac{1} qcb.jac{2} qcb.jac{3} qcb.jac{4}];
qwell(3*r.nc + jperf) = qcb.val;
end
end
end
end
end
@@ -0,0 +1,58 @@
function Wellc0 = calcTrans(r, Wellc0)
% Wellcpara: welltype(1) nperf(2) index(3) rw/WI(4) protype(5) value(6)
% constraints(7) skin(8) Wellc(nWel, 6)
% welltype = 1 prod, welltype = 2 inj water, welltype = 3 inj gas
% protype = 1 const flowrate, protype = 2 const pwf
%
nwel = size(Wellc0, 1);%
for i = 1 : nwel
perf = Wellc0{i, 3};%
rw = Wellc0{i, 4};%
skin = Wellc0{i, 5};%
nperf = length(perf);%
WI = zeros(nperf,1);%
for j = 1 : nperf
ind = perf(j);
if ind <= r.nmc %
kmx = r.kx(ind);
kmy = r.ky(ind);
kmz = r.kz(ind);
dx = r.dxv(ind);
dy = r.dyv(ind);
dz = r.dzv(ind);
if Wellc0{i,6}==1%
% h = r.h;
ro = 0.28* (((kmy/kmx)^0.5*dx^2 + (kmx/kmy)^0.5*dy^2))^0.5...
/ ((kmy/kmx)^0.25 + (kmx/kmy)^0.25);%peaceman公式中的等效供给半径
ka = (kmx*kmy*kmz)^(1/3);%
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dz / (log(ro / rw) + skin);%
elseif Wellc0{i,6}==2%沿x方向的水平井
ro = 0.28* (((kmz/kmy)^0.5*dy^2 + (kmy/kmz)^0.5*dz^2))^0.5...
/ ((kmz/kmy)^0.25 + (kmy/kmz)^0.25);%peaceman公式中的等效供给半径
ka = (kmx*kmy*kmz)^(1/3);%
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dx / (log(ro / rw) + skin);%
elseif Wellc0{i,6}==3%沿y方向的水平井
ro = 0.28* (((kmz/kmx)^0.5*dx^2 + (kmx/kmz)^0.5*dz^2))^0.5...
/ ((kmz/kmx)^0.25 + (kmx/kmz)^0.25);
ka = (kmx*kmy*kmz)^(1/3);
%cf=1,
WI(j) = r.cf * 2 * 3.1415 * ka * dy / (log(ro / rw) + skin);%
end
else % ,
I = ind - r.nmc;%
kf = r.kf(I);
wf = r.wf(I);
area=r.fcff{1,8}(I);
% lf = r.lf(I);
% h = r.h;
% h=1;lf=2;
%0.14
ro = 0.14 * (2*area)^0.5;
% ro = 0.14 * (10^2+10^2)^0.5;
WI(j) = r.cf * 2 * 3.1415 * kf * wf / (log(ro / rw) + skin);
end
end
Wellc0{i, 4} = WI;%
end
@@ -0,0 +1,100 @@
function [Wellpara, WelChg, Weladd] = calcWellequation(Weladd, Wellc, WelChg, well_schedules_k, nc, qwell, state)
%Weladd表示定流量井的数量Wellc表示井参数
% Wellcpara: welltype(1) nperf(2) index(3) Tr(j)ans(4) protype(5) value(6) consTr(j)ain(7) Wellc(nWel, 6)
% welltype = 1 prod, welltype = 2 inj
% protype = 1 const flowrate, protype = 2 const pwf
nWel = size(Wellc, 1);%
Wellpara = cell(1, nWel);
if Weladd > 0 %
pwf = state.pwf;
end
ipwf = 0;
for i = 1 : nWel
if strcmp(well_schedules_k{i,2},'open')
qot = 0;
qwt = 0;
jperfall = Wellc{i,3};
if strcmp(well_schedules_k{i,3},'pro') % prod
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
%
qwt = qwt + qwell(jperf);
qot = qot + qwell(nc + jperf);
end
if well_schedules_k{i,5} ~= 0
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.qo = 0;
Wellpara{1,i}.pwf = pwf(ipwf);
end
% if pwf(ipwf)<= Wellc{i,7} %
% WelChg(i) = 1;
% Weladd = Weladd - 1;
% else
% WelChg(i) = 0;
% end
else % const pwf
if ~WelChg(i)
Wellpara{1,i}.pwf = well_schedules_k{i,5};
else
Wellpara{1,i}.pwf = well_schedules_k{i,6};
end
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
qot = qot + qwell(nc + jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*86.4;
end
else %
if strcmp(well_schedules_k{i,4},'const_q') % const flowrate
ipwf = ipwf + 1;
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
qot = qot + qwell(nc + jperf);
end
if well_schedules_k{i,5} ~= 0
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*86.4;
Wellpara{1,i}.pwf = pwf(ipwf);
else
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = 0;
Wellpara{1,i}.qo = 0;
Wellpara{1,i}.pwf = pwf(ipwf);
end
% if pwf(ipwf) >= Wellc{i,7} %
% WelChg(i) = 1;
% Weladd = Weladd - 1;
% else
% WelChg(i) = 0;
% end
else
if ~WelChg(i)
Wellpara{1,i}.pwf = well_schedules_k{i,5};
else
Wellpara{1,i}.pwf = well_schedules_k{i,6};
end
for j = 1 : Wellc{i,2}
jperf = jperfall(j);
qwt = qwt + qwell(jperf);
qot = qot + qwell(nc + jperf);
end
Wellpara{1,i}.wellname = Wellc{i,1};
Wellpara{1,i}.qw = abs(qwt)*86.4;
Wellpara{1,i}.qo = abs(qot)*86.4;
end
end
end
end
@@ -0,0 +1,32 @@
function perfnum = findWelloc(r, welloc)
% Linep = r.Linep;
% Fracp = r.Fracp;
corevsfra=r.fcff{1,4};%
% corevsfra = r.cell_mid_coordinates;
nfc = size(corevsfra,1);
% x = zeros(nfc, 1);
% y = zeros(nfc, 1);
% z = zeros(nfc, 1);
% for i = 1 : nf
% x = Linep(Fracp(i,:), 1);
% y = Linep(Fracp(i,:), 2);
% %
% xp(i) = mean(x);
% yp(i) = mean(y);
% end
x = corevsfra(:, 1);
y = corevsfra(:, 2);
z = corevsfra(:, 3);
% z = 5;
Nperf = size(welloc, 1);
perfnum = zeros(1, Nperf);
for i = 1 : Nperf
xw = welloc(i, 1);
yw = welloc(i, 2);
zw = welloc(i,3);
rp = (xw - x).^2 + (yw - y).^2+(zw-z).^2;
[~,I] = min(rp);
perfnum(i) = I + r.nmc;
% perfnum(i) = I;
end
@@ -0,0 +1,51 @@
function [Weladd, pwf] = initalSchedule(p, sw, Wellc, f)
nWel = size(Wellc, 1);%
Weladd = 0;
pwf = zeros(1);
BW = f.Bw(p);
muW = f.muw(p);
krW = f.krw(sw);
BG = f.Bg(p);
muG = f.mug(p);
krG = f.krrg(sw);
Ygt = krG ./ (muG .* BG);%mu代表黏度
Ygj = krG ./ muG;
Ywt = krW ./ (muW .* BW);%mu代表黏度
Ywj = krW ./ muW;
for i = 1 : nWel
if Wellc{i,1} == 1 && Wellc{i,5} == 1%
Weladd = Weladd + 1;
nper = Wellc{i,2}; %
jperf = zeros(nper,1);
Trans = zeros(nper,1);
Tnp = 0;
Tn = 0;
for j = 1 : nper
jperf(j) = Wellc{i,3}(j);%
Tr = Wellc{i,4}(j);%
Trans(j) = Tr * Ygt(jperf(j));%
Tnp = Tnp + Trans(j)*p(jperf(j));
Tn = Tn + Trans(j);
end
pwf(Weladd) = (Tnp - Wellc{i,6}/86.4) / Tn;%
elseif Wellc{i,1} == 2 && Wellc{i,5} == 1%
Weladd = Weladd + 1;
nper = Wellc{i,2};
jperf = zeros(nper,1);
Trans = zeros(nper,1);
Tnp = 0;
Tn = 0;
for j = 1 : nper
jperf(j) = Wellc{i,3}(j);
Tr = Wellc{i,4}(j);
Trans(j) = Tr / BW(jperf(j)) * (Ygj(jperf(j)) + Ywj(jperf(j)));%
Tnp = Tnp + Trans(j)*p(jperf(j));
Tn = Tn + Trans(j);
end
pwf(Weladd) = (Tnp + Wellc{i,6}/86.4) / Tn;%
else
continue
end
end
pwf = pwf';
@@ -0,0 +1,8 @@
function welloc = wellperf(well, fracp)
n = size(fracp,1)/2;
welloc = zeros(n, 2);
for i = 1 : n
[xi,yi] = polyxpoly([fracp(2*i-1,1) fracp(2*i,1)],[fracp(2*i-1,2) fracp(2*i,2)],[well(1,1) well(2,1)],[well(1,2) well(2,2)]);
welloc(i,1) = xi;
welloc(i,2) = yi;
end
@@ -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 cordinatex,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,jx坐标赋值
coordinates(i + (j - 1) * (nx + 1)+(nx+1)*(ny+1)*(k-1), 2) = y0(j);%(i,jy坐标赋值
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,:);
%00
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,:);
%00
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,:);
%00
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,:);
%00
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;% 0b1直线有交点1b1没有
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=[];%线1t的取值
t2=[];%线2t的取值
%% 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的值矩阵uv
%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);%0j至j+10
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行非零指标向量长度小于2xink矩阵中第2*i-1k中的第i行2*i行全是0
% 22*i-12*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的值矩阵uv
%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);%-1e6j至j+10
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行非零指标向量长度小于2xink矩阵中第2*i-1k中的第i行2*i行全是0
% 22*i-12*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
+114
View File
@@ -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 pointcolumn denotes 8m行8列矩阵
%numvspoint矩阵row denotes the number of matrix meshcolumn denotes the point6
%[ 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
+892
View File
@@ -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;%10
%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)%01
% 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
+20
View File
@@ -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