182struct HypercubeResolutionParameters
184 HypercubeResolutionParameters()
188 HypercubeResolutionParameters(std::string
const & input_file,
unsigned int const dim) : dim(dim)
190 dealii::ParameterHandler prm;
192 prm.parse_input(input_file,
"",
true,
true);
198 add_parameters(dealii::ParameterHandler & prm)
200 prm.enter_subsection(
"Resolution");
203 "RunType", run_type,
"Type of throughput study.", Patterns::Enum<RunType>(),
true);
205 "ElementType", element_type,
"Type of elements.", Patterns::Enum<ElementType>(),
true);
206 prm.add_parameter(
"DegreeMin",
208 "Minimal polynomial degree of shape functions.",
209 dealii::Patterns::Integer(1),
211 prm.add_parameter(
"DegreeMax",
213 "Maximal polynomial degree of shape functions.",
214 dealii::Patterns::Integer(1),
216 prm.add_parameter(
"RefineSpaceMin",
218 "Minimal number of mesh refinements.",
219 dealii::Patterns::Integer(0, 20),
221 prm.add_parameter(
"RefineSpaceMax",
223 "Maximal number of mesh refinements.",
224 dealii::Patterns::Integer(0, 20),
226 prm.add_parameter(
"DofsMin",
228 "Minimal number of degrees of freedom.",
229 dealii::Patterns::Integer(1),
231 prm.add_parameter(
"DofsMax",
233 "Maximal number of degrees of freedom.",
234 dealii::Patterns::Integer(1),
237 prm.leave_subsection();
243 if(run_type == RunType::RefineHAndP)
245 AssertThrow(degree_max >= degree_min, dealii::ExcMessage(
"Invalid parameters."));
246 AssertThrow(refine_space_max >= refine_space_min, dealii::ExcMessage(
"Invalid parameters."));
248 else if(run_type == RunType::FixedProblemSize)
250 AssertThrow(degree_max >= degree_min, dealii::ExcMessage(
"Invalid parameters."));
251 AssertThrow(n_dofs_max >= n_dofs_min, dealii::ExcMessage(
"Invalid parameters."));
253 else if(run_type == RunType::IncreasingProblemSize)
256 degree_min == degree_max,
258 "Only a single polynomial degree can be considered for RunType::IncreasingProblemSize"));
260 AssertThrow(n_dofs_max >= n_dofs_min, dealii::ExcMessage(
"Invalid parameters."));
264 AssertThrow(
false, dealii::ExcMessage(
"not implemented."));
269 fill_resolution_vector(
270 std::function<
double(
unsigned int,
unsigned int, ElementType)>
const & get_dofs_per_element)
272 if(run_type == RunType::RefineHAndP)
274 unsigned int const n_cells_1d = 1;
277 for(
unsigned int degree = degree_min; degree <= degree_max; ++degree)
280 for(
unsigned int refine_space = refine_space_min; refine_space <= refine_space_max;
283 resolutions.push_back(
284 std::tuple<unsigned int, unsigned int, unsigned int>(degree, refine_space, n_cells_1d));
288 else if(run_type == RunType::FixedProblemSize or run_type == RunType::IncreasingProblemSize)
290 for(
unsigned int degree = degree_min; degree <= degree_max; ++degree)
292 double dofs_per_element = get_dofs_per_element(dim, degree, element_type);
293 fill_resolutions_vector(resolutions,
305 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
309 unsigned int dim = 2;
311 RunType run_type = RunType::RefineHAndP;
313 ElementType element_type = ElementType::Hypercube;
315 unsigned int degree_min = 3;
316 unsigned int degree_max = 3;
318 unsigned int refine_space_min = 0;
319 unsigned int refine_space_max = 0;
321 dealii::types::global_dof_index n_dofs_min = 1e4;
322 dealii::types::global_dof_index n_dofs_max = 3e4;
325 std::vector<std::tuple<unsigned int, unsigned int, unsigned int>> resolutions;