1 function local_model = elliptic_discrete_model(model)
2 %
function local_model = elliptic_discrete_model(model)
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.
8 % local_model.source(grid,eindices,loc,params)
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.
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.
21 % to avoid conflicts in the "global" model, all data functions can
22 % still be evaluated with (glob,params), where glob are global
25 % Immanuel Maier, 25.03.2011
29 % convert all data functions of model:
32 local_model.reaction = @(varargin) ...
33 discrete_volume_values(model.reaction,varargin{:});
36 if model.has_advection
37 local_model.velocity = @(varargin) ...
38 discrete_volume_values(model.velocity,varargin{:});
41 if model.has_diffusivity
42 local_model.diffusivity_tensor = @(varargin) ...
43 discrete_volume_values(model.diffusivity_tensor,varargin{:});
47 local_model.source = @(varargin) ...
48 discrete_volume_values(model.source,varargin{:});
51 if model.has_dirichlet_values
52 local_model.dirichlet_values = @(varargin) ...
53 discrete_boundary_values(model.dirichlet_values,varargin{:});
56 if model.has_neumann_values
57 local_model.neumann_values = @(varargin) ...
58 discrete_boundary_values(model.neumann_values,varargin{:});
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{:});
70 %%%%%%%%%%%% auxiliary functions:
72 %
function res = discrete_volume_values(func,varargin)%
79 % glob = local2global(varargin{1},varargin{2},loc);
84 % error(
'incorrect number of inputs');
86 %res = func(glob,varargin{end});
88 function res = discrete_boundary_values(val,varargin)
95 loc = llocal2local(varargin{1},varargin{3},lloc);
96 glob = local2global(varargin{1},varargin{2},loc);
101 error(
'incorrect number of inputs');
103 res = val(glob,varargin{end});