annotate +scheme/bcSetup.m @ 735:eac5fb4b63db feature/poroelastic

Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
author Martin Almquist <malmquist@stanford.edu>
date Wed, 25 Apr 2018 14:47:54 -0700
parents 9dd49d622a4c
children 1f6b2fb69225
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
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
6 % * data -- A function_handle with time and space coordinates as a parameters, for example f(t,x,y) for a 2D problem
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]
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
8 % Returns a closure matrix and a forcing function S
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
9 function [closure, S] = bcSetup(diffOp, bc, S_sign)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
10 default_arg('S_sign', 1);
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
11 assertType(bc, 'cell');
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
12 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
13
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
14
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
15 closure = spzeros(size(diffOp));
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
16 penalties = {};
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
17 dataFunctions = {};
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
18 dataParams = {};
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
19
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
20 for i = 1:length(bc)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
21 assertType(bc{i}, 'struct');
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
22 [localClosure, penalty] = diffOp.boundary_condition(bc{i}.boundary, bc{i}.type);
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
23 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
24
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
25 if isempty(bc{i}.data)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
26 continue
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
27 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
28
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29 coord = diffOp.grid.getBoundary(bc{i}.boundary);
735
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
30 if iscell(bc{i}.data)
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
31 for j = 1:length(bc{i}.data)
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
32 assertType(bc{i}.data{j}, 'function_handle');
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
33 assertNumberOfArguments(bc{i}.data{j}, 1+size(coord,2));
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
34 end
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
35 else
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
36 assertType(bc{i}.data, 'function_handle');
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
37 assertNumberOfArguments(bc{i}.data, 1+size(coord,2));
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
38 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
39
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
40 penalties{end+1} = penalty;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 dataFunctions{end+1} = bc{i}.data;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 dataParams{end+1} = num2cell(coord ,1);
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
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
45 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
46 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
47 v = O;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
48 for i = 1:length(dataFunctions)
735
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
49 if iscell(penalties{i})
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
50 for j = 1:length(penalties{i})
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
51 v = v + penalties{i}{j}*dataFunctions{i}{j}(t, dataParams{i}{:});
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
52 end
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
53 else
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
54 v = v + penalties{i}*dataFunctions{i}(t, dataParams{i}{:});
eac5fb4b63db Make bcSetup work for cell penalties and data from several BC per boundary. Should probably be changed before merge.
Martin Almquist <malmquist@stanford.edu>
parents: 619
diff changeset
55 end
619
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
56 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
57
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
58 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
59 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
60 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
61 end