183struct HypercubeResolutionParameters
185 HypercubeResolutionParameters()
189 HypercubeResolutionParameters(std::string
const & input_file,
unsigned int const dim) : dim(dim)
191 dealii::ParameterHandler prm;
193 prm.parse_input(input_file,
"",
true,
true);
199 add_parameters(dealii::ParameterHandler & prm)
201 prm.enter_subsection(
"Resolution");
204 "RunType", run_type,
"Type of throughput study.", Patterns::Enum<RunType>(),
true);
206 "ElementType", element_type,
"Type of elements.", Patterns::Enum<ElementType>(),
true);
207 prm.add_parameter(
"DegreeMin",
209 "Minimal polynomial degree of shape functions.",
210 dealii::Patterns::Integer(1),
212 prm.add_parameter(
"DegreeMax",
214 "Maximal polynomial degree of shape functions.",
215 dealii::Patterns::Integer(1),
217 prm.add_parameter(
"RefineSpaceMin",
219 "Minimal number of mesh refinements.",
220 dealii::Patterns::Integer(0, 20),
222 prm.add_parameter(
"RefineSpaceMax",
224 "Maximal number of mesh refinements.",
225 dealii::Patterns::Integer(0, 20),
227 prm.add_parameter(
"DofsMin",
229 "Minimal number of degrees of freedom.",
230 dealii::Patterns::Integer(1),
232 prm.add_parameter(
"DofsMax",
234 "Maximal number of degrees of freedom.",
235 dealii::Patterns::Integer(1),
238 prm.leave_subsection();
244 if(run_type == RunType::RefineHAndP)
246 AssertThrow(degree_max >= degree_min, dealii::ExcMessage(
"Invalid parameters."));
247 AssertThrow(refine_space_max >= refine_space_min, dealii::ExcMessage(
"Invalid parameters."));
249 else if(run_type == RunType::FixedProblemSize)
251 AssertThrow(degree_max >= degree_min, dealii::ExcMessage(
"Invalid parameters."));
252 AssertThrow(n_dofs_max >= n_dofs_min, dealii::ExcMessage(
"Invalid parameters."));
254 else if(run_type == RunType::IncreasingProblemSize)
257 degree_min == degree_max,
259 "Only a single polynomial degree can be considered for RunType::IncreasingProblemSize"));
261 AssertThrow(n_dofs_max >= n_dofs_min, dealii::ExcMessage(
"Invalid parameters."));
265 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
270 fill_resolution_vector(
271 std::function<
double(
unsigned int,
unsigned int, ElementType)>
const & get_dofs_per_element)
273 if(run_type == RunType::RefineHAndP)
275 unsigned int const n_cells_1d = 1;
278 for(
unsigned int degree = degree_min; degree <= degree_max; ++degree)
281 for(
unsigned int refine_space = refine_space_min; refine_space <= refine_space_max;
284 resolutions.push_back(
285 std::tuple<unsigned int, unsigned int, unsigned int>(degree, refine_space, n_cells_1d));
289 else if(run_type == RunType::FixedProblemSize or run_type == RunType::IncreasingProblemSize)
291 for(
unsigned int degree = degree_min; degree <= degree_max; ++degree)
293 double dofs_per_element = get_dofs_per_element(dim, degree, element_type);
294 fill_resolutions_vector(resolutions,
306 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
310 unsigned int dim = 2;
312 RunType run_type = RunType::RefineHAndP;
314 ElementType element_type = ElementType::Hypercube;
316 unsigned int degree_min = 3;
317 unsigned int degree_max = 3;
319 unsigned int refine_space_min = 0;
320 unsigned int refine_space_max = 0;
322 dealii::types::global_dof_index n_dofs_min = 1e4;
323 dealii::types::global_dof_index n_dofs_max = 3e4;
326 std::vector<std::tuple<unsigned int, unsigned int, unsigned int>> resolutions;