Mercurial > repos > public > sbplib
annotate +scheme/+bc/forcingSetup.m @ 1142:cff49fba3cc8 rv-interpolation
Closing branch
| author | Vidar Stiernström <vidar.stiernstrom@it.uu.se> |
|---|---|
| date | Mon, 05 Aug 2019 10:49:21 +0200 |
| 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 |
