Mercurial > repos > public > sbplib
comparison +noname/testCfl.m @ 118:5046ff7d13b8
Fixed bug and made more robust.
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 15 Dec 2015 16:38:02 +0100 |
parents | ee9c03dc7f42 |
children | de8bcef865b0 |
comparison
equal
deleted
inserted
replaced
117:8514c3d67201 | 118:5046ff7d13b8 |
---|---|
4 function testCfl(discr, timestepper_method, T, alpha0, tol,threshold, silentFlag) | 4 function testCfl(discr, timestepper_method, T, alpha0, tol,threshold, silentFlag) |
5 default_arg('tol',0.00005); | 5 default_arg('tol',0.00005); |
6 default_arg('threshold',1e2); | 6 default_arg('threshold',1e2); |
7 default_arg('silentFlag', false); | 7 default_arg('silentFlag', false); |
8 | 8 |
9 if T < alpha0(2) | 9 % TODO: |
10 error('Upper bound on alpha must be smaller than T'); | 10 % Set threshold from the initial conditions of the pde? |
11 end | 11 % Take a set number of steps instead of evolving to a certain time? |
12 % Stop evolving when it has blown up? | |
12 | 13 |
13 testAlpha = getAlphaTester(discr, T, threshold, silentFlag, timestepper_method); | 14 testAlpha = getAlphaTester(discr, T, threshold, silentFlag, timestepper_method); |
14 | 15 |
15 % Make sure that the upper bound is not working | 16 % Make sure that the upper bound is not working |
16 ok = testAlpha(alpha0(2)); | 17 ok = testAlpha(alpha0(2)); |
27 end | 28 end |
28 | 29 |
29 % Use bisection to find sharp estimate | 30 % Use bisection to find sharp estimate |
30 while( (alpha0(2)-alpha0(1))/alpha0(1) > tol) | 31 while( (alpha0(2)-alpha0(1))/alpha0(1) > tol) |
31 alpha = mean(alpha0); | 32 alpha = mean(alpha0); |
32 fprintf('[%.3e,%.3e]: ', alpha0(1), alpha0(2)); | 33 |
33 ok = testAlpha(alpha); | 34 if ~silentFlag |
35 fprintf('[%.3e,%.3e]: ', alpha0(1), alpha0(2)); | |
36 end | |
37 | |
38 [ok, n_step, maxVal] = testAlpha(alpha); | |
39 | |
34 if ok | 40 if ok |
35 alpha0(1) = alpha; | 41 alpha0(1) = alpha; |
36 else | 42 else |
37 alpha0(2) = alpha; | 43 alpha0(2) = alpha; |
38 end | 44 end |
45 | |
46 if ~silentFlag | |
47 fprintf('a = %.3e, n_step=%d max = %.2e\n', alpha, n_step, maxVal); | |
48 end | |
49 end | |
50 | |
51 if silentFlag | |
52 fprintf('Last calculated: a = %.3e, n_step=%d max = %.2e\n', alpha, n_step, maxVal); | |
39 end | 53 end |
40 | 54 |
41 fprintf('T = %-3d dof = %-4d order = %d: clf = %.4e\n',T, discr.size(), discr.order, alpha0(1)); | 55 fprintf('T = %-3d dof = %-4d order = %d: clf = %.4e\n',T, discr.size(), discr.order, alpha0(1)); |
42 | 56 |
43 end | 57 end |
44 | 58 |
45 function f = getAlphaTester(discr, T, threshold, silentFlag, timestepper_method) | 59 function f = getAlphaTester(discr, T, threshold, silentFlag, timestepper_method) |
46 | 60 |
47 % Returns true if cfl was ok | 61 % Returns true if cfl was ok |
48 function ok = testAlpha(alpha) | 62 function [ok, n_step, maxVal] = testAlpha(alpha) |
49 ts = discr.getTimestepper(struct('method', timestepper_method, 'cfl', alpha)); | 63 ts = discr.getTimestepper(struct('method', timestepper_method, 'cfl', alpha)); |
50 | 64 |
51 warning('off','all') | 65 warning('off','all') |
52 ts.evolve(T,true); | 66 ts.evolve(T,true); |
53 warning('on','all') | 67 warning('on','all') |
54 | 68 |
55 [v,t] = ts.getV(); | 69 [v,t] = ts.getV(); |
56 maxVal = max(v); | 70 maxVal = max(v); |
57 | 71 |
58 if isnan(maxVal) || maxVal == Inf || maxVal > threshold | 72 if isnan(maxVal) || maxVal == Inf || abs(maxVal) > threshold |
59 ok = false; | 73 ok = false; |
60 else | 74 else |
61 ok = true; | 75 ok = true; |
62 end | 76 end |
63 | 77 |
64 if ~silentFlag | 78 n_step = ts.n; |
65 fprintf('a = %.3e, max= %.2e\n', alpha, maxVal); | |
66 end | |
67 end | 79 end |
68 | 80 |
69 f = @testAlpha; | 81 f = @testAlpha; |
70 end | 82 end |