annotate +scheme/bcSetup.m @ 867:d634d4deb263 bcSetupExperiment

More notes
author Jonatan Werpers <jonatan@werpers.com>
date Thu, 26 Jul 2018 17:28:48 -0700
parents 8e4b9a5d7c50
children 57760d7088ad
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
867
d634d4deb263 More notes
Jonatan Werpers <jonatan@werpers.com>
parents: 792
diff changeset
66 % Borde man ha en separat funktion för closure penalty generering
d634d4deb263 More notes
Jonatan Werpers <jonatan@werpers.com>
parents: 792
diff changeset
67 % och en separat för att bygga ihop penaltyn med data?
d634d4deb263 More notes
Jonatan Werpers <jonatan@werpers.com>
parents: 792
diff changeset
68
792
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
69 % Erbjuda en separat function for att validera en bc specifikation?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
70 % alltid kräva alla fields?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
71 % literal struct improvement?
8e4b9a5d7c50 Add some notes
Jonatan Werpers <jonatan@werpers.com>
parents: 790
diff changeset
72
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
73 function verifyBcFormat(bcs, diffOp)
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
74 for i = 1:length(bcs)
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
75 assertType(bcs{i}, 'struct');
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
76 assertStructFields(bcs{i}, {'type', 'boundary'});
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
77
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
78 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
79 continue
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
80 end
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
81
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
82 if ~isa(bcs{i}.data, 'function_handle')
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
83 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
84 end
787
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
85
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
86 b = diffOp.grid.getBoundary(bc.boundart);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
87
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
88 dim = size(b,2);
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
89
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
90 if nargin(bc.data) == 1
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
91 % Grid data (only function of time)
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
92 assertSize(bc.data(0), 1, size(b));
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
93 elseif nargin(bc.data) ~= 1+dim
fef739088f20 Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents: 786
diff changeset
94 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
95 end
786
18ce4b1ab3e1 Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents: 785
diff changeset
96 end
785
c02b6d03c77c Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents: 777
diff changeset
97 end
790
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
98
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
99 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
100 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
101 ok = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
102 return
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
103 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
104 ok = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
105
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
106 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
107
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
108 if nArg > 1
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
109 % Symbolic data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
110 isSym = true;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
111 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
112 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
113 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
114 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
115 else
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
116 % Grid data
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
117 isSym = false;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
118 dataStruct.penalty = penalty;
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
119 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
120 end
6afd3dd3ed96 Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents: 789
diff changeset
121 end