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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
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
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
53 isSymbolic = [];
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
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
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
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
93489ddb73e8 Merge with default
Jonatan Werpers <jonatan@werpers.com>
parents: 870
diff changeset
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