annotate +noname/calculateErrors.m @ 1289:2fd2e2337b77 feature/boundary_optimized_grids

Add utility function for constructing a (possibly multidimensional) grid based on the grid points used by the boundary optimized SBP operators
author Vidar Stiernström <vidar.stiernstrom@it.uu.se>
date Wed, 01 Jul 2020 15:15:30 +0200
parents 1201eb16557e
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 % [discr, trueSolution] = schemeFactory(m)
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 % where trueSolution should be a timeSnapshot of the true solution a time T
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 % T is the end time
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 % m are grid size parameters.
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 % N are number of timesteps to use for each gird size
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 % timeOpt are options for the timeStepper
658
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
7 % errorFun is a function_handle taking 2 or 3 arguments, errorFun(trueSolution, approxSolution), errorFun(trueSolution, approxSolution, discr)
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 function e = calculateErrors(schemeFactory, T, m, N, errorFun, timeOpt)
657
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
9 %TODO: Ability to choose paralell or not
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 assertType(schemeFactory, 'function_handle');
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 assertNumberOfArguments(schemeFactory, 1);
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 assertScalar(T);
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
13 assert(length(m) == length(N), 'Vectors m and N must have the same length');
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14 assertType(errorFun, 'function_handle');
658
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
15
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
16 if ~ismember(nargin(errorFun), [2,3])
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
17 error('sbplib:noname:calculateErrors:wrongNumberOfArguments', '"%s" must have 2 or 3, found %d', toString(errorFun), nargin(errorFun));
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
18 end
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
19
657
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
20 default_arg('timeOpt', struct());
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
21
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22
658
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
23 e = zeros(1,length(m));
657
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
24 parfor i = 1:length(m)
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25 done = timeTask('m = %3d ', m(i));
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27 [discr, trueSolution] = schemeFactory(m(i));
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28
657
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
29 timeOptTemp = timeOpt;
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
30 timeOptTemp.k = T/N(i);
b59345f905f0 Make noname.calculateErrors parallel
Jonatan Werpers <jonatan@werpers.com>
parents: 616
diff changeset
31 ts = discr.getTimestepper(timeOptTemp);
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32 ts.stepTo(N(i), true);
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 approxSolution = discr.getTimeSnapshot(ts);
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
34
658
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
35 switch nargin(errorFun)
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
36 case 2
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
37 e(i) = errorFun(trueSolution, approxSolution);
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
38 case 3
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
39 e(i) = errorFun(trueSolution, approxSolution, discr);
1201eb16557e Allow the possibility to have discr as an input the an error function
Jonatan Werpers <jonatan@werpers.com>
parents: 657
diff changeset
40 end
616
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 fprintf('e = %.4e', e(i))
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 done()
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44 end
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 fprintf('\n')
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 end
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
49 %% Example error function
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
50 % u_true = grid.evalOn(dr.grid, @(x,y)trueSolution(T,x,y));
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
51 % err = u_true-u_false;
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
52 % e(i) = norm(err)/norm(u_true);
818d52d4928f Add helper function for convergence runs on discretizations
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
53 % % e(i) = sqrt(err'*d.H*d.J*err/(u_true'*d.H*d.J*u_true));