Mercurial > repos > public > sbplib
annotate +scheme/bcSetup.m @ 840:d8d71f652917 feature/grids
Close feature/grids after merge to default
author | Jonatan Werpers <jonatan@werpers.com> |
---|---|
date | Tue, 18 Sep 2018 15:58:12 +0200 |
parents | 5cf9fdf4c98f |
children | 006defd0247b 57760d7088ad |
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 |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
31 [ok, isSym, data] = parseData(bcs{i}, penalty, diffOp.grid); |
790
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 |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
39 symbolicData{end+1} = data; |
790
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
40 else |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
41 gridData{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 |
787
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
62 function verifyBcFormat(bcs, diffOp) |
786
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
63 for i = 1:length(bcs) |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
64 assertType(bcs{i}, 'struct'); |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
65 assertStructFields(bcs{i}, {'type', 'boundary'}); |
785
c02b6d03c77c
Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents:
777
diff
changeset
|
66 |
786
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
67 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
|
68 continue |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
69 end |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
70 |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
71 if ~isa(bcs{i}.data, 'function_handle') |
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
72 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
|
73 end |
787
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
74 |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
75 b = diffOp.grid.getBoundary(bcs{i}.boundary); |
787
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
76 |
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
77 dim = size(b,2); |
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
78 |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
79 if nargin(bcs{i}.data) == 1 |
787
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
80 % Grid data (only function of time) |
797
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
81 assertSize(bcs{i}.data(0), 1, size(b)); |
5cf9fdf4c98f
Merge with feature/grids and bugfix bcSetup
Martin Almquist <malmquist@stanford.edu>
diff
changeset
|
82 elseif nargin(bcs{i}.data) ~= 1+dim |
787
fef739088f20
Move more stuff into verifyFormat
Jonatan Werpers <jonatan@werpers.com>
parents:
786
diff
changeset
|
83 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
|
84 end |
786
18ce4b1ab3e1
Move verification to a separate function
Jonatan Werpers <jonatan@werpers.com>
parents:
785
diff
changeset
|
85 end |
785
c02b6d03c77c
Change name from bc to bcs
Jonatan Werpers <jonatan@werpers.com>
parents:
777
diff
changeset
|
86 end |
790
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
87 |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
88 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
|
89 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
|
90 ok = false; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
91 return |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
92 end |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
93 ok = true; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
94 |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
95 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
|
96 |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
97 if nArg > 1 |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
98 % Symbolic data |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
99 isSym = true; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
100 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
|
101 dataStruct.penalty = penalty; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
102 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
|
103 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
|
104 else |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
105 % Grid data |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
106 isSym = false; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
107 dataStruct.penalty = penalty; |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
108 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
|
109 end |
6afd3dd3ed96
Add function for parsing each entry in bcs to a struct
Jonatan Werpers <jonatan@werpers.com>
parents:
789
diff
changeset
|
110 end |