annotate +scheme/bcSetup.m @ 753:44c46bd6913a feature/d1_staggered

Fix stage rate bug in RK4 discrete data
author Martin Almquist <malmquist@stanford.edu>
date Fri, 15 Jun 2018 13:02:29 -0700
parents 9dd49d622a4c
children facb8ffb5c34 eac5fb4b63db
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 assertType(bc{i}.data, 'function_handle');
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
29
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
30 coord = diffOp.grid.getBoundary(bc{i}.boundary);
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
31 assertNumberOfArguments(bc{i}.data, 1+size(coord,2));
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
32
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
33 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
34 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
35 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
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
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
38 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
39 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
40 v = O;
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
41 for i = 1:length(dataFunctions)
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
42 v = v + penalties{i}*dataFunctions{i}(t, dataParams{i}{:});
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 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
46 end
9dd49d622a4c Add a function for easily applying many boundary conditions at the same time
Jonatan Werpers <jonatan@werpers.com>
parents:
diff changeset
47 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
48 end