3 % the detailed solution is computed via the iterative
4 % Dirichlet-Neumann schema.
7 % sim_data:
struct containing the solution and further information
9 % Generated fields of sim_data:
10 % uh: cell of discrete functions, which contains the last
12 % all_dofs: cell of matrizes containing the dofs of all iteratives
13 % theta: the last relaxation-parameter
14 % numiter: number of iterations
15 % reached_maxiter: indicates the cause of termination
16 % reached_tolerance: indicates the cause of termination
20 model.decomp_mode = 0;
21 dir = model.dirichlet_side;
22 no_dir = mod(dir,2)+1;
25 sim_data.reached_maxiter = 0;
26 sim_data.reached_tolerance = 0;
29 fprintf(
'start detailed simulation ');
32 % compute required matrizes and vectors
33 [A, r, A_gamma, r_gamma] = model.operators(model,model_data);
35 % initialize iterative schema
42 uh_old{i} = zeros(uh{i}.ndofs,1);
43 uh_tilde{i} = zeros(uh{i}.ndofs,1);
44 zh{i} = zeros(uh{i}.ndofs,1);
52 sim_data.uh = cell(1,2);
54 sim_data.uh{i} = uh{i};
56 sim_data.all_dofs = cell(1,2);
58 sim_data.all_dofs{i} = zeros(uh{i}.ndofs,model.maxiter);
62 uh{dir}.dofs = A_gamma{dir} \ r_gamma{dir};
63 uh{no_dir}.dofs = A{no_dir} \ r{no_dir};
64 uh_0_no_dir = uh{no_dir}.dofs;
67 r_gamma{i} = zeros(size(r_gamma{i}));
68 r_gamma{i}(model_data.gamma_dofs{i}) = ...
69 uh{i}.dofs(model_data.gamma_dofs{i});
70 uh_tilde{i} = A_gamma{i} \ r_gamma{i};
73 %
delete matrizes not needed any longer
74 A_gamma_dir = A_gamma{dir};
82 diff_norm = zeros(1,2);
88 uh_old{i} = uh{i}.dofs;
92 r_gamma{dir}(model_data.gamma_dofs{dir}) = ...
93 uh_tilde{no_dir}(model_data.gamma_dofs{no_dir});
94 zh{dir} = A_gamma_dir \ r_gamma{dir};
97 a = (zh{dir}
'*A{dir}*zh{dir}) / (uh_tilde{no_dir}'*A{no_dir}* ...
101 theta = (tau+1)/(sigma^2*tau+tau+2)/2*model.relaxation_factor;
104 uh{dir}.dofs = uh{dir}.dofs + theta*(zh{dir}-uh_tilde{dir});
105 uh_tilde{dir} = uh_tilde{dir} + theta*(zh{dir}-uh_tilde{dir});
108 zh{dir} = r_dir - A{dir}*uh{dir}.dofs;
109 r_gamma{no_dir}(model_data.gamma_dofs{no_dir}) = ...
110 zh{dir}(model_data.gamma_dofs{dir});
111 zh{no_dir} = A{no_dir} \ r_gamma{no_dir};
114 uh{no_dir}.dofs = uh_0_no_dir + zh{no_dir};
115 uh_tilde{no_dir} = uh_tilde{no_dir} + uh{no_dir}.dofs - ...
120 sim_data.all_dofs{i}(:,numiter) = uh{i}.dofs;
125 diff_norm(i) = sqrt((uh{i}.dofs-uh_old{i})
' * A{i} * ...
126 (uh{i}.dofs-uh_old{i}));
128 if sum(diff_norm) < model.det_sim_tol
130 sim_data.reached_tolerance = 1;
132 if numiter == model.maxiter
134 sim_data.reached_maxiter = 1;
137 if (mod(numiter,100) == 1) && (model.verbose >= 1)
143 % further information
144 sim_data.theta = theta;
145 sim_data.numiter = numiter;
147 sim_data.all_dofs{i} = sim_data.all_dofs{i}(:,1:numiter);
151 if model.base_model.compute_output_functional
154 model.base_model.decomp_mode = model.decomp_mode;
156 model_data.df_info = model_data.df_infos{i};
157 v = model.operators_output(model.base_model,model_data);
158 s = s + (v(:)') * sim_data.uh{i}.dofs;
163 if model.verbose >= 1
class representing a continous piecewise polynomial function of arbitrary dimension. DOFS correspond to the values of Lagrange-nodes.
function sim_data = dom_dec_detailed_simulation(model, model_data)
the detailed solution is computed via the iterative Dirichlet-Neumann schema.