-
Notifications
You must be signed in to change notification settings - Fork 1
/
advecDiff.m
120 lines (95 loc) · 3.4 KB
/
advecDiff.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
function [rho] = advecDiff(rho0,u,nt,dt,par)
%% rho(:,1...T) = transport (rho0 - initial mass density,
% u - velocity vector for nt time steps,
% size(prod(n),nt)
% nt - time steps)
% rho_N - density at the last time step
% Advection: Semi- Lagrangian rho^(i,ad) = S(U^(i)*rho^(i-1);
% Dispersion: Implicitly: (I - dt*Div*D*Grad)*rho^(i) = rho^(i,ad)
% rho(:,0) -----------> rho(:,1) --------------> rho(:,2)
% u(:,1) u(:,2)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if par.dim==2
%% 2D version
n = par.n;
rho = zeros(prod(n),nt+1);
u = reshape(u,2*prod(n),nt);
if isfield(par,'B')
B = par.B;
else
Mdis = - par.sigma*(par.Grad)'*par.Grad; % change to add variable sigma
I = speye(prod(n));
B = I - Mdis;
end
rho(:,1) = rho0;
for i = 2:nt+1
U1 = reshape(u(1:prod(n),i-1),n');
U2 = reshape(u(prod(n)+1:end,i-1),n');
S = dTrilinears2d(rho(:,i-1),par.Xc + dt*U1, par.Yc + dt*U2,...
par.h1(1),par.h2(1),par.bc);
%T=rho(:,i-1);x=par.Xc + dt*U1;y= par.Yc + dt*U2;z= par.Zc + dt*U3;
% hx=1;hy=1;hz=1;
% advection step
%rho(:,i) = S*rho(:,i-1);
% advection step with source:
if par.add_source
rho(:,i) = S*(rho(:,i-1) + dt.*par.qex(:));
else
rho(:,i) = S*rho(:,i-1);
end
% diffusion step
[rho(:,i),pcgflag] = pcg(B,rho(:,i));
if pcgflag ~= 0
warning('MATLAB:pcgExitFlag','Warning: advecDiff.m >>> while finding rho(:,%d), pcg exit flag = %d',i,pcgflag)
end
%rho(:,i) = (I - dt*Mdis)\rho(:,i);
%montageArray(reshape(rho(:,i),n'));
%pause(0.1);
end
%rho = squeeze(rho(:,2:end));
rho = rho(:,2:end);
elseif par.dim==3
%% 3D version
%%
n = par.n;
rho = zeros(prod(n),nt+1);
u = reshape(u,3*prod(n),nt);
if isfield(par,'B')
B = par.B;
else
Mdis = - par.sigma*(par.Grad)'*par.Grad; % change to add variable sigma
I = speye(prod(n));
B = I - Mdis;
end
rho(:,1) = rho0;
for i = 2:nt+1
U1 = reshape(u(1:prod(n),i-1),n');
U2 = reshape(u(prod(n)+1:2*prod(n),i-1),n');
U3 = reshape(u(2*prod(n)+1:end,i-1),n');
S = dTrilinears3d(rho(:,i-1),par.Xc + dt*U1, par.Yc + dt*U2, par.Zc + dt*U3,...
par.h1(1),par.h2(1),par.h3(1),par.bc);
%T=rho(:,i-1);x=par.Xc + dt*U1;y= par.Yc + dt*U2;z= par.Zc + dt*U3;
% hx=1;hy=1;hz=1;
% advection step
%rho(:,i) = S*rho(:,i-1);
% advection step with source:
if par.add_source
rho(:,i) = S*(rho(:,i-1) + dt.*par.qex(:));
else
rho(:,i) = S*rho(:,i-1);
end
% diffusion step
[rho(:,i),pcgflag] = pcg(B,rho(:,i));
if pcgflag ~= 0
warning('MATLAB:pcgExitFlag','Warning: advecDiff.m >>> while finding rho(:,%d), pcg exit flag = %d',i,pcgflag)
end
%rho(:,i) = (I - dt*Mdis)\rho(:,i);
%montageArray(reshape(rho(:,i),n'));
%pause(0.1);
end
%rho = squeeze(rho(:,2:end));
rho = rho(:,2:end);
else
warning('In advecDiff.m: dimension of data should be either 2 or 3')
end
end