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 % Optional fields of model_data:
14 % RB: If a RB is given,
this RB is extended
16 % Generated fields of detailed_data:
17 % RB: The reduced bases
for the solution
18 % RB_der: cell array with thr reduced bases
for the derivative solution
19 % RB_info: Usual info field
20 % RB_der_info: cell array containing the RBinfo
for the derivative
24 % Markus Dihlmann 31.03.2011
26 %
get number of parameters to know how many derivative_rb have to be
28 nr_parameters = length(get_mu(model));
30 Nmax = model.RB_stop_Nmax;
31 epsilon_tol = model.RB_stop_epsilon;
32 % check some fields in model
33 if isfield(model,
'RB_mixed_sensitivity_basis_generation')
34 if model.RB_mixed_sensitivity_basis_generation
35 disp('Warning: The field model.RB_mixed_sensitivity_basis_generation is probably set to the wrong value');
36 model.RB_mixed_sensitivity_basis_generation=0;
41 %1. start generating a normal reduced basis
42 %-----------------------------------------
43 compute_derivative_info_old = model.compute_derivative_info;
44 model.compute_derivative_info =0;
45 if isfield(model,'base_model')&&isfield(model.base_model,'compute_derivative_info')
46 model.base_model.compute_derivative_info = 0;
49 %set fields, so that the error and the dofs of the solution is returned
50 model.get_estimator_from_sim_data = @(sim_data)get_estimator_from_sim_data_mixed(sim_data,0);
51 model.get_dofs_from_sim_data = @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,0);
52 model.get_rb_size = @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,0);
54 if isfield(model,'RB_solution_Nmax')
55 model.RB_stop_Nmax=model.RB_solution_Nmax;
57 model.RB_stop_Nmax = 2*Nmax;
59 if isfield(model,'RB_solution_epsilon')
60 model.RB_stop_epsilon = model.RB_solution_epsilon;
62 model.RB_stop_epsilon = epsilon_tol/10;
65 detailed_data = lin_evol_gen_detailed_data(model, model_data);
66 RB_finished = detailed_data.RB;
67 RB_info = detailed_data.RB_info;
68 model_data.RB = RB_finished;
71 %2. generate a reduced basis for every derivative in a loop
72 %-----------------------------------------------------------
73 model.RB_stop_Nmax = Nmax;
74 model.RB_stop_epsilon = epsilon_tol;
75 model.compute_derivative_info =1;
76 if isfield(model,'base_model')&&isfield(model.base_model,'compute_derivative_info')
77 model.base_model.compute_derivative_info = 1;
79 if ~isfield(model_data,'RB_der_info')
80 RB_der_info = cell(1,nr_parameters);
82 %RB_der = cell(1,nr_parameters);
83 %compute_derivative_indices_old=model.compute_derivative_indices;
84 %indices_to_compute = find(compute_derivative_indices_old);
88 disp('-----------------------------------------------');
89 disp(['Generating RB of derivative ',num2str(p),'...'])
90 disp('-----------------------------------------------');
92 %set fields, so that the right error is produced
94 % model.get_estimator_from_sim_data = @(sim_data)get_estimator_from_sim_data_mixed(sim_data,1);
95 % model.get_dofs_from_sim_data = @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,1);
96 % model.get_rb_size = @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,p);
99 model = setfield_in_model_and_base_model(model,'get_estimator_from_sim_data',@(sim_data)get_estimator_from_sim_data_mixed(sim_data,1));
100 model = setfield_in_model_and_base_model(model,'get_dofs_from_sim_data', @(sim_data)get_dofs_from_sim_data_for_sensitivity_extension(sim_data,1));
101 model = setfield_in_model_and_base_model(model,'get_rb_size', @(model, detailed_data)lin_evol_opt_get_rb_size(model, detailed_data,p));
104 %model.optimization.params_to_optimize = [model.optimization.params_to_optimize,1];
105 %model.compute_derivative_indices = zeros(1,size(compute_derivative_indices_old,2));
106 %model.compute_derivative_indices(indices_to_compute(p)) = 1;
107 model.optimization.params_to_optimize = zeros(1,nr_parameters);
108 model.optimization.params_to_optimize(p)= 1;
109 if isfield(model,'base_model')&&isfield(model.base_model,'optimization')
110 model.base_model.optimization.params_to_optimize = zeros(1,nr_parameters);
111 model.base_model.optimization.params_to_optimize(p) = 1;
113 if (isfield(model_data,'RB_der_info'))&&(length(model_data.RB_der_info)>=p)
114 model_data.RB_info = model_data.RB_der_info{p};
116 detailed_data = lin_evol_gen_detailed_data(model, model_data);
117 RB_der_info{p} = detailed_data.RB_info;
118 RB_der = detailed_data.RB_der;
119 model_data.RB_der = RB_der;
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 = setfield_in_model_and_base_model(model,
'compute_derivative_info',compute_derivative_info_old);
129 %model.compute_derivative_indices = compute_derivative_indices_old;
132 function model = setfield_in_model_and_base_model(model,field, entry)
133 model = setfield(model,field,entry);
134 if isfield(model,'base_model')&&isfield(model.base_model,field)
135 model.base_model = setfield(model.base_model,field,entry);
function r = verbose(level, message, messageId)
This function displays messages depending on a message-id and/or a level. Aditionally you can set/res...
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);