1 function [A,r] = fem_operators(model,model_data)
2 %
function [A,r] = fem_operators(model,model_data)
4 %
function computing the matrix and rhs of an elliptic problem with
5 % finite element discretization
6 % supports affine decomposition, i.e. result
7 % depending on model.decomp_mode
9 % B. Haasdonk 22.2.2011
11 if model.decomp_mode == 2
12 df_info = []; % not required
14 df_info = model_data.df_info;
17 [r_source, r_dirichlet, r_neumann, r_robin] = ...
18 fem_rhs_parts_assembly(model,df_info);
20 [A_diff , A_adv, A_reac, A_dirichlet, A_neumann, A_robin] = ...
21 fem_matrix_parts_assembly(model,df_info);
24 if model.decomp_mode == 0 % == complete: simple addition
26 % assemble right hand side
27 r = r_source + r_neumann + r_robin + r_dirichlet;
29 disp(
'rhs assembled');
31 % sparse system matrix:
32 A = spalloc(model_data.df_info.ndofs,model_data.df_info.ndofs,10); % rough upper bound
for number of nonzeros
33 A = A_diff + A_adv + A_reac + A_neumann + A_robin + A_dirichlet;
36 disp(
'matrix assembled');
39 elseif model.decomp_mode == 1 % == components: merge to cell arrays
41 r = [r_source(:)
', r_dirichlet(:)', r_neumann(:)
', r_robin(:)'];
43 A = [A_diff(:)
' , A_adv(:)', A_reac(:)
', ...
44 A_dirichlet(:)', A_neumann(:)
', A_robin(:)'];
48 else % decomp_mode == 2, coefficients: merge coeff vectors
50 r = [r_source(:); r_dirichlet(:); r_neumann(:); r_robin(:)];
52 A = [A_diff(:) ; A_adv(:); A_reac(:); ...
53 A_dirichlet(:); A_neumann(:); A_robin(:)];