2 %
function detailed_data =
5 %
function generating the detailed data
for models with sensitivity
6 % derivatives. Separate bases
for the approximation of the solution and the
7 % derivatives are generated.
10 % Optional fields of model:
13 % Generated fields of detailed_data:
14 % RB: The reduced bases
for the solution
15 % RB_der: cell array with thr reduced bases
for the derivative solution
16 % RB_info: Usual info field
17 % RB_der_info: cell array containing the RBinfo
for the derivative
21 % Markus Dihlmann 31.03.2011
23 %
get number of parameters to know how many derivative_rb have to be
25 nr_parameters = length(get_mu(model));
27 Nmax = model.RB_stop_Nmax;
28 epsilon_tol = model.RB_stop_epsilon;
29 % check some fields in model
30 if isfield(model,
'RB_mixed_sensitivity_basis_generation')
31 if model.RB_mixed_sensitivity_basis_generation
32 disp('Warning: The field model.RB_mixed_sensitivity_basis_generation is probably set to the wrong value');
33 model.RB_mixed_sensitivity_basis_generation=0;
38 %1. start generating a normal reduced basis
39 %-----------------------------------------
40 compute_derivative_info_old = model.compute_derivative_info;
41 model.compute_derivative_info =0;
42 if isfield(model,'base_model')&&isfield(model.base_model,'compute_derivative_info')
43 model.base_model.compute_derivative_info = 0;
46 %set fields, so that the error and the dofs of the solution is returned
47 model.get_estimator_from_sim_data = @(sim_data)get_estimator_from_sim_data_mixed(sim_data,0);
48 model.get_dofs_from_sim_data = @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,0);
49 model.get_rb_size = @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,0);
51 if isfield(model,'RB_solution_Nmax')
52 model.RB_stop_Nmax=model.RB_solution_Nmax;
54 model.RB_stop_Nmax = 2*Nmax;
56 if isfield(model,'RB_solution_epsilon')
57 model.RB_stop_epsilon = model.RB_solution_epsilon;
59 model.RB_stop_epsilon = epsilon_tol/10;
62 detailed_data = lin_evol_gen_detailed_data(model, model_data);
63 RB_finished = detailed_data.RB;
64 RB_info = detailed_data.RB_info;
65 model_data.RB = RB_finished;
68 %2. generate a reduced basis for every derivative in a loop
69 %-----------------------------------------------------------
70 model.RB_stop_Nmax = Nmax;
71 model.RB_stop_epsilon = epsilon_tol;
72 model.compute_derivative_info =1;
73 if isfield(model,'base_model')&&isfield(model.base_model,'compute_derivative_info')
74 model.base_model.compute_derivative_info = 1;
76 RB_der_info = cell(1,nr_parameters);
77 RB_der = cell(1,nr_parameters);
78 for i=1:length(RB_der)
79 %empty initialization with correct size for lin_evol_opt_rb_operators
80 %to work a priori for all p
81 RB_der{i} = zeros(size(RB_finished,1),1);
83 model_data.RB_der = RB_der;
84 %model_data.RB = RB_finished;
85 %compute_derivative_indices_old=model.compute_derivative_indices;
86 %indices_to_compute = find(compute_derivative_indices_old);
88 parfor p=1:nr_parameters
89 disp(
'-----------------------------------------------');
90 disp([
'Generating RB of derivative ',num2str(p),
'...'])
91 disp('-----------------------------------------------');
92 %set fields, so that the right error is produced
95 model_help = setfield_in_model_and_base_model(model_help,'get_estimator_from_sim_data',@(sim_data)get_estimator_from_sim_data_mixed(sim_data,1));
96 model_help = setfield_in_model_and_base_model(model_help,'get_dofs_from_sim_data', @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,1));
97 model_help = setfield_in_model_and_base_model(model_help,'get_rb_size', @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,p));
101 % model_help.get_estimator_from_sim_data = @(sim_data)get_estimator_from_sim_data_mixed(sim_data,1);
102 % model_help.get_dofs_from_sim_data = @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,1);
103 % model_help.get_rb_size = @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,p);
105 % model_help.separate_bases_derivative_nr = p;
106 %model.optimization.params_to_optimize = [model.optimization.params_to_optimize,1];
107 %model.compute_derivative_indices = zeros(1,size(compute_derivative_indices_old,2));
108 %model.compute_derivative_indices(indices_to_compute(p)) = 1;
109 model_help.optimization.params_to_optimize = zeros(1,nr_parameters);
110 model_help.optimization.params_to_optimize(p) = 1;
111 if isfield(model_help,'base_model')&&isfield(model_help.base_model,'optimization')
112 model_help.base_model.optimization.params_to_optimize = zeros(1,nr_parameters);
113 model_help.base_model.optimization.params_to_optimize(p) = 1;
116 detailed_data_buf = lin_evol_gen_detailed_data(model_help, model_data);
117 RB_der_info{p} = detailed_data_buf.RB_info;
118 RB_der{p} = detailed_data_buf.RB_der{p};
119 %model_data.RB_der{p} = RB_der{p};
123 detailed_data.RB_info = RB_info;
124 detailed_data.RB_der_info = RB_der_info;
125 detailed_data.RB = RB_finished;
126 detailed_data.RB_der = RB_der;
128 model.compute_derivative_info = compute_derivative_info_old;
129 %model.compute_derivative_indices = compute_derivative_indices_old;
131 function model = setfield_in_model_and_base_model(model,field, entry)
132 model = setfield(model,field,entry);
133 if isfield(model,'base_model')&&isfield(model.base_model,field)
134 model.base_model = setfield(model.base_model,field,entry);
function detailed_data = lin_evol_opt_gen_detailed_data_separate_bases_parallel(model, model_data)
lin_evol_opt_gen_detailed_data_separate_bases(model, model_data)
function detailed_data = lin_evol_opt_gen_detailed_data_separate_bases(model, model_data)
lin_evol_opt_gen_detailed_data_separate_bases(model, model_data)
function detailed_data = lin_evol_opt_set_rb_in_detailed_data_separate_bases(detailed_data, RB, derivative_index)
lin_evol_opt_set_rb_in_detailed_data_separate_bases(detailed_data,RB,derivative_indx) ...
function RB = lin_evol_opt_get_rb_from_detailed_data_separate_bases(detailed_data, derivative_index)
lin_evol_opt_get_rb_from_detailed_data_separate_bases(detailed_data,p);