-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathfdder.m
More file actions
179 lines (162 loc) · 3.46 KB
/
fdder.m
File metadata and controls
179 lines (162 loc) · 3.46 KB
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
function [DX,D2X,DY,D2Y] = fdder(NS,RES,BC)
% FDDDER Finite-Difference Derivative Operators
%
% [DX,D2X,DY,D2Y] = fdder(NS,RES,BC);
%
% This MATLAB function generates matrix derivative operators
% for scalar functions on a collocated grid.
%
% INPUT ARGUMENTS
% ================
% NS [Nx Ny] size of grid
% RES [dx dy] grid resolution
% BC [BCx BCy] Boundary Conditions
% 0=Dirichlet, -1=Periodic, +1=Neumann
%
% OUTPUT ARGUMENTS
% ================
% DX First-order derivative with respect to x
% D2X Second-order derivative with respect to x
% DY First-order derivative with respect to y
% D2Y Second-order derivative with respect to y
% Misc. Housekeeping
Nx = NS(1);
Ny = NS(2);
dx = RES(1);
dy = RES(2);
BCx = BC(1);
BCy = BC(2);
% Size of Matrices
M = Nx*Ny;
% Utility Matrix
Z = sparse(M,M);
O = ones(Nx,Ny);
O = O(:);
% Handle Special Cases
if (Nx == 1)
DX = Z;
D2X = Z;
elseif (Nx ~= 1)
DX = Z;
D2X = Z;
DX = spdiags(-1*O,-1,DX);
DX = spdiags(+1*O,+1,DX);
D2X = spdiags(O,-1,D2X);
D2X = spdiags(-2*O,0,D2X);
D2X = spdiags(O,+1,D2X);
end
if (Ny == 1)
DY = Z;
D2Y = Z;
elseif (Ny ~= 1)
DY = Z;
D2Y = Z;
DY = spdiags(+1*O,Nx,DY);
DY = spdiags(-1*O,-Nx,DY);
D2Y = spdiags(O,+Nx,D2Y);
D2Y = spdiags(O,-Nx,D2Y);
D2Y = spdiags(-2*O,0,D2Y);
end
%
%% IMPLEMENT BOUNDARY CONDITIONS
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Dirichlet
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% DIRICHLET ALONG X (DY and D2Y stay the same for Dirichlet)
if(BCx == 0)
for ny = 1 : Ny-1
m = Nx + (ny-1)*Nx;
n = m + 1;
DX(m,n) = 0;
DX(n,m) = 0;
D2X(m,n) = 0;
D2X(n,m) = 0;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% PERIODIC
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% PERIODIC ALONG X
if (BCx == -1 && Nx ~= 1)
for ny = 1 : Ny
m = Nx + (ny-1)*Nx;
n = m - (Nx-1);
DX(m,n) = 1;
DX(n,m) = -1;
D2X(m,n) = 1;
D2X(n,m) = 1;
end
for ny = 1 : Ny-1
m = Nx + (ny-1)*Nx;
n = m + 1;
DX(m,n) = 0;
DX(n,m) = 0;
D2X(m,n) = 0;
D2X(n,m) = 0;
end
end
% PERIODIC ALONG Y
if(BCy == -1 && Ny ~= 1)
for nx = 1 : Nx
m = Nx*Ny - (nx-1);
n = Nx - (nx-1);
DY(m,n) = 1;
DY(n,m) = -1;
D2Y(m,n) = 1;
D2Y(n,m) = 1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% NEUMANN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% NEUMANN ALONG X
if(BCx == +1 && Nx ~= 1)
m = 1;
n = 1;
for ny = 1 : Ny
DX(m,n) = -2;
DX(m,n+1) = +2;
D2X(m,n) = 0;
D2X(m,n+1) = 0;
m = Nx*ny;
n = Nx*ny-1;
DX(m,n) = -2;
DX(m,n+1) = +2;
D2X(m,n) = 0;
D2X(m,n+1) = 0;
m = m + 1;
n = n + 2;
end
for ny = 1 : Ny-1
m = Nx + (ny-1)*Nx;
n = m + 1;
DX(m,n) = 0;
DX(n,m) = 0;
D2X(m,n) = 0;
D2X(n,m) = 0;
end
end
% NEUMANN ALONG Y
if(BCy == +1 && Ny ~= 1)
for nx = 1 : Nx
m = nx;
n = Nx*Ny-nx+1;
o = m+Nx;
p = n-Nx;
DY(m,m) = -2;
DY(n,n) = +2;
DY(m,o) = +2;
DY(n,p) = -2;
D2Y(m,m) = 0;
D2Y(n,n) = 0;
D2Y(m,o) = 0;
D2Y(n,p) = 0;
end
end
% FINISH DERIVATIVE MATRICES
DX = DX/(2*dx);
D2X = D2X/(dx^2);
DY = DY/(2*dy);
D2Y = D2Y/(dy^2);
end