rbmatlab  1.13.10
 All Classes Namespaces Files Functions Variables Groups Pages
elliptic_discrete_model.m
1 function local_model = elliptic_discrete_model(model)
2 % function local_model = elliptic_discrete_model(model)
3 %
4 % function creating a model with local functions out of a model
5 % with global functions, i.e. all volume-data functions can be
6 % evaluated in many elements simultanously by e.g.
7 %
8 % local_model.source(grid,eindices,loc,params)
9 %
10 % where eindices is a n times 1 vector of element-indices and loc
11 % is a local coordinate in the reference triangle. the result is a
12 % n times 1 vector of resulting values of the source.
13 % and boundary-data functions can be evaluated by e.g.
14 %
15 % local_model.dirichlet_values(grid,eindices,face_index,lloc,params)
16 %
17 % where eindices is a n times 1 vector of element-indices and lloc
18 % is a 1d coordinate in [0,1]. the result is a n times 1 vector of
19 % resulting dirichlet-values on the edge given by face_index.
20 %
21 % to avoid conflicts in the "global" model, all data functions can
22 % still be evaluated with (glob,params), where glob are global
23 % coordinates.
24 
25 % Immanuel Maier, 25.03.2011
26 
27 local_model = model;
28 
29 % convert all data functions of model:
30 
31 if model.has_reaction
32  local_model.reaction = @(varargin) ...
33  discrete_volume_values(model.reaction,varargin{:});
34 end;
35 
36 if model.has_advection
37  local_model.velocity = @(varargin) ...
38  discrete_volume_values(model.velocity,varargin{:});
39 end;
40 
41 if model.has_diffusivity
42  local_model.diffusivity_tensor = @(varargin) ...
43  discrete_volume_values(model.diffusivity_tensor,varargin{:});
44 end;
45 
46 if model.has_source
47  local_model.source = @(varargin) ...
48  discrete_volume_values(model.source,varargin{:});
49 end;
50 
51 if model.has_dirichlet_values
52  local_model.dirichlet_values = @(varargin) ...
53  discrete_boundary_values(model.dirichlet_values,varargin{:});
54 end;
55 
56 if model.has_neumann_values
57  local_model.neumann_values = @(varargin) ...
58  discrete_boundary_values(model.neumann_values,varargin{:});
59 end;
60 
61 if model.has_robin_values
62  local_model.robin_alpha = @(varargin) ...
63  discrete_boundary_values(model.robin_alpha,varargin{:});
64  local_model.robin_beta = @(varargin) ...
65  discrete_boundary_values(model.robin_beta,varargin{:});
66  local_model.robin_values = @(varargin) ...
67  discrete_boundary_values(model.robin_values,varargin{:});
68 end;
69 
70 %%%%%%%%%%%% auxiliary functions:
71 
72 %function res = discrete_volume_values(func,varargin)%
73 %
74 %if nargin == 5
75 % loc = varargin{3};
76 % if numel(loc) == 0
77 % glob = [];
78 % else
79 % glob = local2global(varargin{1},varargin{2},loc);
80 % end;
81 %elseif nargin == 3
82 % glob = varargin{1};
83 %else
84 % error('incorrect number of inputs');
85 %end;
86 %res = func(glob,varargin{end});
87 
88 function res = discrete_boundary_values(val,varargin)
89 
90 if nargin == 6
91  lloc = varargin{4};
92  if numel(lloc) == 0
93  glob = [];
94  else
95  loc = llocal2local(varargin{1},varargin{3},lloc);
96  glob = local2global(varargin{1},varargin{2},loc);
97  end;
98 elseif nargin == 3
99  glob = varargin{1};
100 else
101  error('incorrect number of inputs');
102 end;
103 res = val(glob,varargin{end});