Mercurial > repos > public > sbplib
annotate +scheme/+bc/forcingSetup.m @ 878:51cc7b05b4ab bcSetupExperiment
Fix bugs in forcingSetup and verifyFormat
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Fri, 02 Nov 2018 11:11:50 +0100 |
parents | 7ceaea27d944 |
children | ba10f24bf476 |
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. |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
2 % 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
|
3 % default is 1, which the same side as the diffOp. |
870
fb91d12093f8
Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
869
diff
changeset
|
4 function S = forcingSetup(diffOp, penalties, bcs, S_sign) |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
5 default_arg('S_sign', 1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
6 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
7 assertType(bcs, 'cell'); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
8 assertIsMember(S_sign, [1, -1]); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
9 |
870
fb91d12093f8
Change some naming of functions
Jonatan Werpers <jonatan@werpers.com>
parents:
869
diff
changeset
|
10 scheme.bc.verifyFormat(bcs, diffOp); |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
11 |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
12 [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp); |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
13 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
14 % Setup penalty function |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
15 O = spzeros(size(diffOp),1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
16 function v = S_fun(t) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
17 v = O; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
18 for i = 1:length(gridData) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
19 v = v + gridData{i}.penalty*gridData{i}.func(t); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
20 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
21 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
22 for i = 1:length(symbolicData) |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
23 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
|
24 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
25 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
26 v = S_sign * v; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
27 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
28 S = @S_fun; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
29 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
30 |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
31 % 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
|
32 % of structs for grid and symbolic data. |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
33 function [gridData, symbolicData] = parseAndSortData(bcs, penalties, diffOp) |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
34 gridData = {}; |
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
35 symbolicData = {}; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
36 for i = 1:length(bcs) |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
37 [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
|
38 |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
39 if ~ok |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
40 continue % There was no data |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
41 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
42 |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
43 if isSymbolic |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
44 symbolicData{end+1} = data; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
45 else |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
46 gridData{end+1} = data; |
877
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
47 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
48 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
49 end |
7ceaea27d944
Clean up bc.forcingSetup
Jonatan Werpers <jonatan@werpers.com>
parents:
876
diff
changeset
|
50 |
876 | 51 function [ok, isSymbolic, dataStruct] = parseData(bc, penalty, grid) |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
52 if ~isfield(bc,'data') || isempty(bc.data) |
876 | 53 isSymbolic = []; |
54 dataStruct = struct(); | |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
55 ok = false; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
56 return |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
57 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
58 ok = true; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
59 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
60 nArg = nargin(bc.data); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
61 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
62 if nArg > 1 |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
63 % Symbolic data |
876 | 64 isSymbolic = true; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
65 coord = grid.getBoundary(bc.boundary); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
66 dataStruct.penalty = penalty; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
67 dataStruct.func = bc.data; |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
68 dataStruct.coords = num2cell(coord, 1); |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
69 else |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
70 % Grid data |
876 | 71 isSymbolic = false; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
72 dataStruct.penalty = penalty; |
878
51cc7b05b4ab
Fix bugs in forcingSetup and verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
877
diff
changeset
|
73 dataStruct.func = bc.data; |
869
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
74 end |
d356f1a22d4f
Start organizing the code
Jonatan Werpers <jonatan@werpers.com>
parents:
diff
changeset
|
75 end |