Mercurial > repos > public > sbplib
annotate +noname/calculateErrors.m @ 1037:2d7ba44340d0 feature/burgers1d
Pass scheme specific parameters as cell array. This will enabale constructDiffOps to be more general. In addition, allow for schemes returning function handles as diffOps, which is currently how non-linear schemes such as Burgers1d are implemented.
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Fri, 18 Jan 2019 09:02:02 +0100 |
parents | 1201eb16557e |
children |
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)); |