Mercurial > repos > public > sbplib
annotate +scheme/+bc/forcingSetup.m @ 1031:2ef20d00b386 feature/advectionRV
For easier comparison, return both the first order and residual viscosity when evaluating the residual. Add the first order and residual viscosity to the state of the RungekuttaRV time steppers
author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
---|---|
date | Thu, 17 Jan 2019 10:25:06 +0100 |
parents | ba10f24bf476 |
children | a52033540dd9 |
rev | line source |
---|---|
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
1 % Setup the forcing function for the given boundary conditions and data. |
899
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
2 % Each bc is a struct with the fields |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
3 % * type -- Type of boundary condition |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
4 % * boundary -- Boundary identifier |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
5 % * data -- A function_handle for a function which provides boundary data.(see below) |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
6 % S_sign allows changing the sign of the function to put on different sides in the system of ODEs. |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
7 % default is 1, which the same side as the diffOp. |
899
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
8 % Returns a forcing function S. |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
9 % |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
10 % The boundary data function can either be a function of time or a function of time and space coordinates. |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
11 % In the case where it only depends on time it should return the data as grid function for the boundary. |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
12 % In the case where it also takes space coordinates the number of space coordinates should match the number of dimensions of the problem domain. |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
13 % For example in the 2D case: f(t,x,y). |
ba10f24bf476
Fix the documentation of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
878
diff
changeset
|
14 |
870
fb91d12093f8
Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
869
diff
changeset
|
15 function S = forcingSetup(diffOp, penalties, bcs, S_sign) |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 default_arg('S_sign', 1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 assertType(bcs, 'cell'); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 assertIsMember(S_sign, [1, -1]); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 |
870
fb91d12093f8
Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
869
diff
changeset
|
21 scheme.bc.verifyFormat(bcs, diffOp); |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
23 [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp); |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
24 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 % Setup penalty function |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 O = spzeros(size(diffOp),1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 function v = S_fun(t) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 v = O; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 for i = 1:length(gridData) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 v = v + gridData{i}.penalty*gridData{i}.func(t); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
31 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
32 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
33 for i = 1:length(symbolicData) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
34 v = v + symbolicData{i}.penalty*symbolicData{i}.func(t, symbolicData{i}.coords{:}); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
35 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
36 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
37 v = S_sign * v; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
38 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
39 S = @S_fun; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
40 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
41 |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
42 % Go through a cell array of boundary condition specifications and return cell arrays |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
43 % of structs for grid and symbolic data. |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
44 function [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp) |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
45 gridData = {}; |
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
46 symbolicData = {}; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
47 for i = 1:length(bcs) |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
48 [ok, isSymbolic, data] = parseData(bcs{i}, penalties{i}, diffOp.grid); |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
49 |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
50 if ~ok |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
51 continue % There was no data |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
52 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
53 |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
54 if isSymbolic |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
55 symbolicData{end+1} = data; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
56 else |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
57 gridData{end+1} = data; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
58 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
59 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
60 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
61 |
876 | 62 function [ok, isSymbolic, dataStruct] = parseData(bc, penalty, grid) |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 if ~isfield(bc,'data') || isempty(bc.data) |
876 | 64 isSymbolic = []; |
65 dataStruct = struct(); | |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 ok = false; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 return |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 ok = true; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
70 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
71 nArg = nargin(bc.data); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
72 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
73 if nArg > 1 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
74 % Symbolic data |
876 | 75 isSymbolic = true; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
76 coord = grid.getBoundary(bc.boundary); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
77 dataStruct.penalty = penalty; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
78 dataStruct.func = bc.data; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
79 dataStruct.coords = num2cell(coord, 1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
80 else |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
81 % Grid data |
876 | 82 isSymbolic = false; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
83 dataStruct.penalty = penalty; |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
84 dataStruct.func = bc.data; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
85 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
86 end |