1 function Mat = matrix_part(int_kernel, model, df_info1, varargin)
2 %
function Mat = matrix_part(int_kernel, model, df_info1, varargin)
5 % Assembly of volume or boundary FE matrix, possibility of
6 % providing two different
function spaces on same grid or on grids with
7 % common boundary in the
case of boundary integrals. This
function
10 % varargin possibilities:
14 % - bc_info1, df_info2, bc_info2
16 % boundary integrals are computed
if bc_info(s) are provided.
32 bc_info1 = varargin{1};
33 df_info2 = varargin{2};
34 bc_info2 = varargin{3};
37 if isa(varargin{1},
'Fem.IFemInfo')
41 df_info2 = varargin{1};
46 bc_info1 = varargin{1};
58 nint_parts = bc_info1.nbint_parts;
61 Mat = spalloc(df_info1.ndofs, df_info2.ndofs, 1);
65 %% assemble each integral part
69 if ~is_boundary || ~isempty(int_kernel{k})
72 lin_ind = sub2ind(size(df_info1.grid.EL), bc_info1.elinds{k}, bc_info1.edgeinds{k});
73 c = df_info1.grid.EL(lin_ind);
78 for i = 1:df_info1.ndofs_per_element
80 for j = 1:df_info2.ndofs_per_element
84 func = @(x) int_kernel{k}(x, model, df_info1, i, j, bc_info1.elinds{k}, bc_info1.edgeinds{k});
86 func = @(x) int_kernel{k}(x, model, df_info1, df_info2, i, j, ...
87 bc_info1.elinds{k}, bc_info1.edgeinds{k}, bc_info2.elinds{k}, bc_info2.edgeinds{k});
91 gids_i = df_info1.get_global_dof_index(bc_info1.elinds{k}, i);
92 gids_j = df_info2.get_global_dof_index(bc_info2.elinds{k}, j);
95 func = @(x) int_kernel(x, model, df_info1, i, j);
97 func = @(x) int_kernel(x, model, df_info1, df_info2, i, j);
99 res = triaquadrature(model.qdeg, func);
101 gids_i = df_info1.get_global_dof_index(
':', i);
102 gids_j = df_info2.get_global_dof_index(
':', j);
107 % depending on decomp_mode the output is a single matrix or a cell
113 Mat_tmp = sparse(gids_i, gids_j, res, df_info1.ndofs, df_info2.ndofs);
119 Mat = cell(1, length(res));
120 for q = 1:length(res)
121 Mat{q} = spalloc(df_info1.ndofs, df_info2.ndofs, 1);
125 for q = 1:length(res)
127 res{q} = c .* res{q};
129 Mat_tmp = sparse(gids_i, gids_j, res{q}, df_info1.ndofs, df_info2.ndofs);
130 Mat{q} = Mat{q} + Mat_tmp;
139 % concatenate cell arrays
142 Mat_cell = [Mat_cell, Mat(:)'];
151 if ~isempty(Mat_cell)
function res = intervalquadrature(poldeg, func, varargin)
integration of function func over reference interval == unit interval. by Gaussian quadrature exactly...