Mercurial > repos > public > sbplib
annotate +scheme/bcSetup.m @ 742:08f3ffe63f48 feature/poroelastic Heimisson2018 elastic1.0
Add metric scale factors to properties in heat and elastic curvilinear
author | Martin Almquist <malmquist@stanford.edu> |
---|---|
date | Fri, 11 May 2018 13:11:32 -0700 |
parents | eac5fb4b63db |
children | 1f6b2fb69225 |
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 |