rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
p_part_gen_detailed_data.m
1 function detailed_data = p_part_gen_detailed_data(model,model_data)
2 %function detailed_data = p_part_gen_detailed_data(model,model_data)
3 %
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
7 
8 % Bernard Haasdonk 12.2.2010
9 % Markus Dihlmann 17.2.2010
10 
11 detailed_data = [];
12 % field RB is generated
13 
14 detailed_data.pgrid = [];
15 %detailed_data.parts_ranges = {};
16 detailed_data.parts_detailed_data = {};
17 
18 % initialize pgrid
19 if isfield(model,'p_part_ranges')
20  params.range = model.p_part_ranges;
21 else
22  params.range = model.mu_ranges;
23 end
24 params.numintervals = model.p_part_numintervals;
25 pgrid = cubegrid(params);
26 
27 switch model.p_part_generation_mode
28  case 'uniform'
29  nelements = get(pgrid,'nelements');
30  for p = 1: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;
37  end;
38 
39  case 'adaptive'
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;
47  end
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))]);
52 
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);
57 
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:
62  lid=gid2lid(pgrid,p);
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),'...']);
66  end
67  disp(['Refined partition ',num2str(p),' into leafelements of level ',num2str(levels(p)+1)]);
68 
69  %clean up to save capacity
70  is_leaf = get(pgrid,'isleaf');
71  if ~is_leaf(p)
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));
76  end
77  end
78  end
79 
80 
81 
82  end
83  else
84  %last possible refinement level reached
85 
86  base_model.p_part_early_refinement=0;
87  detailed_data.parts_detailed_data{p}=gen_detailed_data(base_model, model_data);
88 
89 
90  end
91  p=p+1;
92  end
93 
94  case 'adaptive_epsilon_fixed'
95 
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;
103  end
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))]);
108 
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);
113 
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),'...']);
122  end
123  disp(['Refined partition ',num2str(p),' into leafelements of level ',num2str(levels(p)+1)]);
124 
125  %clean up to save capacity
126  is_leaf = get(pgrid,'isleaf');
127  if ~is_leaf(p)
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));
132  end
133  end
134  end
135 
136 
137 
138  end
139  else
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);
147 
148 
149  end
150  p=p+1;
151  end
152 
153  otherwise
154  error('p_part_generation_mode not defined');
155 end;
156 
157 detailed_data.pgrid = pgrid;
158 
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);
165 consistency_ok = 1;
166 i=1;
167 num_vertices = get(pgrid,'nvertices');
168 try
169  while(consistency_ok && (i<=num_vertices))
170  model = set_mu(model,vertexes(i,:));
171  sim_data = rb_simulation(model,reduced_data);
172 
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);
177  else
178  sim_error = 0;
179  error('It was not possible to identify error estimator during p-part consistency check')
180  end
181 
182  if(model.base_model.RB_stop_epsilon < sim_error)
183  consitency_ok = 0;
184  disp('!!!!!!!!!!!!!!!!!!!!!!!!!!!');
185  error('Consistency Error');
186 
187  end
188  i=i+1;
189  end
190 catch ME
191  disp('Error in consistency check. Define Delta in p_part_gen_detailed_data.m !! Ignore if fixed p-part grid with Nmax...')
192 end
193 
194 
195 
196 
197 %detailed_data.number_parts = length(detailed_data.parts_detailed_data);
198 
199 
200 
201 
202 
203 %| \docupdate
A hierarchical cubegrid of arbitrary dimension.
Definition: cubegrid.m:17
Test reduced basis implementation.
Definition: DetailedData.m:1