annotate +scheme/bcSetup.m @ 864:c51b3f945c65 bcSetupExperiment

Add functions for taking local closures and penalties global
author Jonatan Werpers <jonatan@werpers.com>
date Wed, 25 Jul 2018 15:24:37 -0700
parents 8e4b9a5d7c50
children d634d4deb263
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
1 % function [closure, S] = bcSetup(diffOp, bc)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
2 % Takes a diffOp and a cell array of boundary condition definitions.
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
3 % Each bc is a struct with the fields
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
4 % * type -- Type of boundary condition
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
5 % * boundary -- Boundary identifier
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
6 % * data -- A function_handle for a function which provides boundary data.(see below)
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
7 % Also takes S_sign which modifies the sign of S, [-1,1]
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
8 % Returns a closure matrix and a forcing function S.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
9 %
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
10 % The boundary data function can either be a function of time or a function of time and space coordinates.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
11 % In the case where it only depends on time it should return the data as grid function for the boundary.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
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.
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
13 % For example in the 2D case: f(t,x,y).
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
14 function [closure, S] = bcSetup(diffOp, bcs, S_sign)
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 default_arg('S_sign', 1);
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
16 assertType(bcs, 'cell');
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 assert(S_sign == 1 || S_sign == -1, 'S_sign must be either 1 or -1');
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
19 verifyBcFormat(bcs, diffOp);
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
21 % Setup storage arrays
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22 closure = spzeros(size(diffOp));
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
23 gridData = {};
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
24 symbolicData = {};
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
26 % Collect closures, penalties and data
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
27 for i = 1:length(bcs)
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
28 [localClosure, penalty] = diffOp.boundary_condition(bcs{i}.boundary, bcs{i}.type);
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29 closure = closure + localClosure;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
31 [ok, isSym, data] = parseData(bcs{i}, penalty, diffOp.grid)
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
32
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
33 if ~ok
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
34 % There was no data
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
35 continue
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
36 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
37
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
38 if isSym
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
39 gridData{end+1} = data;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
40 else
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
41 symbolicData{end+1} = data;
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
42 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
43 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
44
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
45 % Setup penalty function
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
46 O = spzeros(size(diffOp),1);
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 function v = S_fun(t)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 v = O;
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
49 for i = 1:length(gridData)
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
50 v = v + gridData{i}.penalty*gridData{i}.func(t);
749
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
51 end
1de60c4d462d Allow gird functions as data in bcSetup
Jonatan Werpers <jonatan@werpers.com>
parents: 723
diff changeset
52
789
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
53 for i = 1:length(symbolicData)
1a6095bed6d6 Change to using structs for storing data functions and penalties
Jonatan Werpers <jonatan@werpers.com>
parents: 788
diff changeset
54 v = v + symbolicData{i}.penalty*symbolicData{i}.func(t, symbolicData{i}.coords{:});
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
55 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57 v = S_sign * v;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
59 S = @S_fun;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
61
792
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
62 % Borde man använda eval on här??
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
63 % Borde man dela upp bcSetup i bcSetupSymbolic(name?) och bcSetupGridData
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
64 % och sen skriva en wrapper som sorterar och wrappar de två andra??
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
65
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
66 % Erbjuda en separat function for att validera en bc specifikation?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
67 % alltid kräva alla fields?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
68 % literal struct improvement?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
69
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
70 function verifyBcFormat(bcs, diffOp)
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
71 for i = 1:length(bcs)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
72 assertType(bcs{i}, 'struct');
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
73 assertStructFields(bcs{i}, {'type', 'boundary'});
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
74
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
75 if ~isfield(bcs{i}, 'data') || isempty(bcs{i}.data)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
76 continue
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
77 end
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
78
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
79 if ~isa(bcs{i}.data, 'function_handle')
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
80 error('bcs{%d}.data should be a function of time or a function of time and space',i);
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
81 end
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
82
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
83 b = diffOp.grid.getBoundary(bc.boundart);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
84
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
85 dim = size(b,2);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
86
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
87 if nargin(bc.data) == 1
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
88 % Grid data (only function of time)
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
89 assertSize(bc.data(0), 1, size(b));
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
90 elseif nargin(bc.data) ~= 1+dim
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
91 error('sbplib:scheme:bcSetup:DataWrongNumberOfArguments', 'bcs{%d}.data has the wrong number of input arguments. Must be either only time or time and space.', i);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
92 end
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
93 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
94 end
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
95
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
96 function [ok, isSym, dataStruct] = parseData(bc, penalty, grid)
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
97 if ~isfield(bc,'data') || isempty(bc.data)
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
98 ok = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
99 return
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
100 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
101 ok = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
102
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
103 nArg = nargin(bc.data);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
104
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
105 if nArg > 1
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
106 % Symbolic data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
107 isSym = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
108 coord = grid.getBoundary(bc.boundary);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
109 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
110 dataStruct.func = bc.data;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
111 dataStruct.coords = num2cell(coord, 1);
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
112 else
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
113 % Grid data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
114 isSym = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
115 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
116 dataStruct.func = bcs{i}.data;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
117 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
118 end