diff +noname/convergence.m @ 32:ddfb98209aa2

Fixed a bunch of problems regarding convergence and saving solutions
author Jonatan Werpers <jonatan@werpers.com>
date Tue, 29 Sep 2015 09:22:22 +0200
parents
children c6eb3af205c0
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/+noname/convergence.m	Tue Sep 29 09:22:22 2015 +0200
@@ -0,0 +1,50 @@
+% Reference is either a key or a function handle
+function [q, e, h] = convergence(filename, errorFunc, reference, method, order, m, T)
+    default_arg('errorFunc', @scheme.error1d);
+
+    sf = SolutionFile(filename);
+
+    analytical_ref = isa(reference,'function_handle');
+    if ~analytical_ref
+        reference = sf.get(reference);
+    end
+
+
+    % Generate convergence, error, and efficiency plots for each search key with more than one entry.
+    for i = 1:length(m)
+        key.method = method;
+        key.order = order;
+        key.m = m(i);
+        key.T = T;
+
+        entry = sf.get(key);
+
+        [e(i),h(i)] = errorForEntry(key, entry, errorFunc, reference,T);
+
+    end
+    q = convergence(e,h);
+end
+
+function [e, h] = errorForEntry(key,entry, errorFunc, reference,T)
+    v_repr = entry.repr;
+    discr = entry.discr;
+
+    % Get the solution to be compared
+    v = v_repr.v;
+
+    % Get the reference solution vector
+    if isa(reference,'function_handle');
+        x = v_repr.x;
+        v_ref = reference(x,T);
+    else
+        % Downsample the reference solution
+        x = v_repr.x;
+        x_ref = reference.x;
+
+        [~,I] = ismember(x,x_ref,'rows');
+        v_ref = reference.v(I);
+    end
+
+    e = errorFunc(discr,v, v_ref);
+    h = discr.h;
+end
\ No newline at end of file