Skip to content

Commit c7beadc

Browse files
committed
Completely changed the problem to be spectral
1 parent b849181 commit c7beadc

File tree

5 files changed

+59
-22
lines changed

5 files changed

+59
-22
lines changed

src/+otp/+kuramotosivashinsky/+presets/Canonical.m

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,30 @@
44
function obj = Canonical(varargin)
55

66
p = inputParser;
7-
addParameter(p, 'Size', 64, @isscalar);
8-
addParameter(p, 'L', 25, @isscalar);
7+
addParameter(p, 'Size', 128);
8+
addParameter(p, 'L', 32*pi);
99

1010
parse(p, varargin{:});
1111

1212
s = p.Results;
1313

14-
n = s.Size;
14+
N = s.Size;
15+
L = s.L;
1516

17+
params.L = L;
1618

17-
params.n = n;
18-
params.l = s.L;
19+
h=L/N;
1920

20-
x = linspace(0, 10*pi, n + 1);
21+
x=h*(1:N).';
2122

22-
u0 = 4*cos(x(1:end-1)).';
23+
u0 = cos(x/16).*(1+sin(x/16));
24+
25+
u0hat = fft(u0);
2326

2427
tspan = [0, 100];
2528

26-
obj = obj@otp.kuramotosivashinsky.KuramotoSivashinskyProblem(tspan, u0, params);
29+
obj = obj@otp.kuramotosivashinsky.KuramotoSivashinskyProblem(tspan, u0hat, params);
30+
2731
end
2832
end
2933
end

src/+otp/+kuramotosivashinsky/KuramotoSivashinskyProblem.m

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,57 @@
22

33
methods
44
function obj = KuramotoSivashinskyProblem(timeSpan, y0, parameters)
5-
obj@otp.Problem('Kuramoto Sivashinsky Problem', [], timeSpan, y0, parameters);
5+
obj@otp.Problem('Kuramoto-Sivashinsky', [], timeSpan, y0, parameters);
66
end
77
end
88

9+
methods
10+
function soly = solution2real(soly)
11+
12+
if isstruct(soly)
13+
soly.y = real(ifft(soly.y));
14+
else
15+
soly = real(ifft(soly.')).';
16+
end
17+
18+
end
19+
20+
end
21+
922
methods (Access = protected)
1023
function onSettingsChanged(obj)
11-
n = obj.Parameters.n;
12-
l = obj.Parameters.l;
1324

14-
domain = [-l, l];
15-
D = otp.utils.pde.D(n, domain, 'C');
16-
L = otp.utils.pde.laplacian(n, domain, 1, 'C');
25+
L = obj.Parameters.L;
1726

18-
obj.Rhs = otp.Rhs(@(t, u) otp.kuramotosivashinsky.f(t, u, D, L), ...
19-
otp.Rhs.FieldNames.Jacobian, @(t, u) otp.kuramotosivashinsky.jac(t, u, D, L));
27+
N = numel(obj.Y0);
28+
29+
div = L/(2*pi);
30+
31+
k = (1i*[0:(N/2 - 1), 0, (-N/2 + 1):-1].'/div);
32+
k2 = k.^2;
33+
k4 = k.^4;
34+
35+
Dfft = dftmtx(N);
36+
Difft = conj(Dfft)/N;
37+
38+
obj.Rhs = otp.Rhs(@(t, u) otp.kuramotosivashinsky.f(t, u, k, k2, k4), ...
39+
otp.Rhs.FieldNames.Jacobian, ...
40+
@(t, u) otp.kuramotosivashinsky.jac(t,u, k, k2, k4, Dfft, Difft), ...
41+
otp.Rhs.FieldNames.JacobianVectorProduct, ...
42+
@(t, u, v) otp.kuramotosivashinsky.jvp(t,u, k, k2, k4, v));
2043

2144
end
2245

2346
function validateNewState(obj, newTimeSpan, newY0, newParameters)
47+
2448
validateNewState@otp.Problem(obj, ...
2549
newTimeSpan, newY0, newParameters)
2650

51+
assert(mod(numel(newY0), 2) == 0);
52+
2753
otp.utils.StructParser(newParameters) ...
28-
.checkField('n', 'scalar', 'integer', 'finite', 'positive') ...
29-
.checkField('l', 'scalar', 'integer', 'finite', 'positive');
54+
.checkField('L', 'scalar', 'finite', 'positive');
55+
3056
end
3157
end
3258
end

src/+otp/+kuramotosivashinsky/f.m

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
function du = f(~, u, D, L)
1+
function ut = f(~, u, k, k2, k4)
22

3-
du = - L*(L*u + u) - u.*(D*u);
3+
u2 = fft(real(ifft(u)).^2);
4+
5+
ut = - k2.*u - k4.*u -(k/2).*u2;
46

57
end
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
function j = jac(~, u, D, L)
1+
function j = jac(~, u, k, k2, k4, Dfft, Difft)
22

3-
j = -L*L - L - spdiags(u, 0, numel(u), numel(u))*D - spdiags(D*u, 0, numel(u), numel(u));
3+
j = -diag(k2) - diag(k4) - diag(k)*Dfft*diag(ifft(u))*Difft;
44

55
end
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
function jv = jvp(~, u, k, k2, k4, v)
2+
3+
jv = -k2.*v - k4.*v - k.*fft(real(ifft(u)).*real(ifft(v)));
4+
5+
end

0 commit comments

Comments
 (0)