1 function detailed_data = p_part_gen_detailed_data(model,model_data)
2 %
function detailed_data = p_part_gen_detailed_data(model,model_data)
4 %
function computing the detailed data
for a p_part_model. I.e. a
5 % list of detailed_data
for all partitions plus some management information
6 % as p_part_mode
'uniform' or
'adaptive' can be chosen
8 % Bernard Haasdonk 12.2.2010
9 % Markus Dihlmann 17.2.2010
12 % field RB is generated
14 detailed_data.pgrid = [];
15 %detailed_data.parts_ranges = {};
16 detailed_data.parts_detailed_data = {};
19 if isfield(model,
'p_part_ranges')
20 params.range = model.p_part_ranges;
22 params.range = model.mu_ranges;
24 params.numintervals = model.p_part_numintervals;
27 switch model.p_part_generation_mode
29 nelements = get(pgrid,'nelements');
31 base_model = model.base_model;
32 ranges = get_ranges_of_element(pgrid, p);
33 base_model.mu_ranges = ranges;
34 detailed_data.parts_detailed_data{p} = ...
35 gen_detailed_data(base_model,model_data);
36 %detailed_data.parts_ranges{p} = ranges;
40 p=1; %p indicates
for which part of pgrid the detailed_data is generated.
41 disp(
'Generating detailed_datas in adaptive p-partitions.');
42 disp([
'Maximum number of Basis per partition is : ',num2str(model.base_model.RB_stop_Nmax)]);
43 while(p<=
get(pgrid,
'nelements'))
44 base_model = model.base_model;
45 if isfield(model,
'p_part_early_refinement')
46 base_model.p_part_early_refinement=model.p_part_early_refinement;
48 ranges = get_ranges_of_element(pgrid, p);
49 base_model.mu_ranges = ranges;
50 levels=get(pgrid,'level');
51 disp(['Generating detailed_data in partition ',num2str(p),' with refinement level ',num2str(levels(p))]);
53 %if not yet on last refinement level...
54 if(levels(p)<base_model.p_part_max_refinement_level)
55 %gen detailed data for partition
56 detailed_data.parts_detailed_data{p}=gen_detailed_data(base_model, model_data);
58 %
if generation of detailed data stopped due to maximum Number of
59 %Basis-vectors reached, then refine the actual partition
60 if(((detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nmax)||detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nlimit_estimation)&& ~(detailed_data.parts_detailed_data{p}.RB_info.stopped_on_epsilon))
61 %refine method must
get a leaf_element_id, so conversion:
63 pgrid=refine(pgrid,lid);
64 if(detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nlimit_estimation)
65 disp([
'Due to an estimation of needed basis vectors of ',num2str(detailed_data.parts_detailed_data{p}.RB_info.N_limit_est_av),
'...']);
67 disp([
'Refined partition ',num2str(p),
' into leafelements of level ',num2str(levels(p)+1)]);
69 %clean up to save capacity
70 is_leaf =
get(pgrid,
'isleaf');
72 fields = fieldnames(detailed_data.parts_detailed_data{p});
73 for f=1:length(fields)
74 if~(strcmp(fields{f},
'RB_info'))
75 detailed_data.parts_detailed_data{p} = rmfield(detailed_data.parts_detailed_data{p},fields(f));
84 %last possible refinement level reached
86 base_model.p_part_early_refinement=0;
87 detailed_data.parts_detailed_data{p}=gen_detailed_data(base_model, model_data);
94 case 'adaptive_epsilon_fixed'
96 p=1; %p indicates
for which part of pgrid the detailed_data is generated.
97 disp(
'Generating detailed_datas in adaptive p-partitions.');
98 disp([
'Maximum number of Basis per partition is : ',num2str(model.base_model.RB_stop_Nmax)]);
99 while(p<=
get(pgrid,
'nelements'))
100 base_model = model.base_model;
101 if isfield(model,
'p_part_early_refinement')
102 base_model.p_part_early_refinement=model.p_part_early_refinement;
104 ranges = get_ranges_of_element(pgrid, p);
105 base_model.mu_ranges = ranges;
106 levels=get(pgrid,'level');
107 disp(['Generating detailed_data in partition ',num2str(p),' with refinement level ',num2str(levels(p))]);
109 %if not yet on last refinement level...
110 if(levels(p)<base_model.p_part_max_refinement_level)
111 %gen detailed data for partition
112 detailed_data.parts_detailed_data{p}=gen_detailed_data(base_model, model_data);
114 %
if generation of detailed data stopped due to maximum Number of
115 %Basis-vectors reached, then refine the actual partition
116 if(((detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nmax)||detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nlimit_estimation)&& ~(detailed_data.parts_detailed_data{p}.RB_info.stopped_on_epsilon))
117 %refine method must
get a leaf_element_id, so conversion:
118 lid=gid2lid(pgrid,p);
119 pgrid=refine(pgrid,lid);
120 if(detailed_data.parts_detailed_data{p}.RB_info.stopped_on_Nlimit_estimation)
121 disp([
'Due to an estimation of needed basis vectors of ',num2str(detailed_data.parts_detailed_data{p}.RB_info.N_limit_est_av),
'...']);
123 disp([
'Refined partition ',num2str(p),
' into leafelements of level ',num2str(levels(p)+1)]);
125 %clean up to save capacity
126 is_leaf =
get(pgrid,
'isleaf');
128 fields = fieldnames(detailed_data.parts_detailed_data{p});
129 for f=1:length(fields)
130 if~(strcmp(fields{f},
'RB_info'))
131 detailed_data.parts_detailed_data{p} = rmfield(detailed_data.parts_detailed_data{p},fields(f));
140 %last possible refinement level reached
141 %so we can not prescribe a maximum number of Basisvectors to reach
142 %a certain level in error tolerance, so it is set to an
143 %arbitrarily high number
144 base_model.RB_stop_Nmax = 500;
145 base_model.p_part_early_refinement=0;
146 detailed_data.parts_detailed_data{p}=gen_detailed_data(base_model, model_data);
154 error(
'p_part_generation_mode not defined');
157 detailed_data.pgrid = pgrid;
159 %
Test of consistency: In all nodepoints of the p-grid the estimated error
160 %must be below etol..
161 % to be implemented...
162 disp(
'Consistency check...')
163 vertexes =
get(pgrid,
'vertex');
164 reduced_data=gen_reduced_data(model, detailed_data);
167 num_vertices =
get(pgrid,
'nvertices');
169 while(consistency_ok && (i<=num_vertices))
170 model = set_mu(model,vertexes(i,:));
171 sim_data = rb_simulation(model,reduced_data);
173 if(isfield(sim_data,
'DeltaX'))
174 sim_error = sim_data.DeltaX(end);
175 elseif(isfield(sim_data,
'Delta'))
176 sim_error = sim_data.Delta(end);
179 error('It was not possible to identify error estimator during p-part consistency check')
182 if(model.base_model.RB_stop_epsilon < sim_error)
184 disp('!!!!!!!!!!!!!!!!!!!!!!!!!!!');
185 error('Consistency Error');
191 disp('Error in consistency check. Define Delta in p_part_gen_detailed_data.m !! Ignore if fixed p-part grid with Nmax...')
197 %detailed_data.number_parts = length(detailed_data.parts_detailed_data);
A hierarchical cubegrid of arbitrary dimension.
Test reduced basis implementation.