Mercurial > repos > public > sbplib
annotate +noname/calculateErrors.m @ 1198:2924b3a9b921 feature/d2_compatible
Add OpSet for fully compatible D2Variable, created from regular D2Variable by replacing d1 by first row of D1. Formal reduction by one order of accuracy at the boundary point.
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Fri, 16 Aug 2019 14:30:28 -0700 |
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)); |