phaseflow
FEM solver for the Navier-Stokes-Boussinesq equations coupled with enthalpy-based phase change
 All Classes Namespaces Files Functions Variables Macros Pages
pf_parameters.h
Go to the documentation of this file.
1 #ifndef pf_parameters_h
2 #define pf_parameters_h
3 
4 #include <vector>
5 #include <iostream>
6 #include <fstream>
7 #include <functional>
8 
9 #include "my_parameter_handler.h"
10 
11 #include "pf_global_parameters.h"
12 
13 /*
14 
15  @brief Encapsulates parameter handling and paramter input file handling.
16 
17  @detail
18 
19  Originally the ParameterReader from deal.II's step-26 was used;
20  but that was too prohibitive. The approach in this file isolates the details
21  of the input file handling from the rest of the program,
22  allowing for rich data structures and simplifying the user code.
23 
24  The goal is to allow one to run the program with different parameters,
25  without having to recomplile the program.
26 
27  It is valuable to structure the parameter data as done here, to greatly
28  simplify the writing and debugging of the code.
29 
30  This also makes it simple to insantiate a PDE Model in a user program
31  and then change it's parameters directly without having to use any intermediate text files.
32 
33  Every parameter name appears three times in this file. Once for the data structure,
34  once for declaring to the ParameterHandler class, and once for parsing the input file.
35 
36  @author A. Zimmerman <zimmerman@aices.rwth-aachen.de>
37 
38 */
39 
40 namespace Phaseflow
41 {
42  namespace Parameters
43  {
44 
45  using namespace dealii;
46 
47  struct Meta
48  {
49  unsigned int dim;
50  };
51 
53  {
54  std::vector<double> gravity;
56  };
57 
58  struct Geometry
59  {
60  unsigned int dim;
61  std::string grid_name;
62  std::vector<double> sizes;
63  std::vector<double> transformations;
64  };
65 
67  {
68  std::vector<unsigned int> strong_boundaries;
69  std::vector<std::vector<std::string>> strong_masks;
70  };
71 
73  {
74  unsigned int initial_cycles;
75  unsigned int max_level;
76  unsigned int max_cells;
77  unsigned int interval;
78  unsigned int cycles_at_interval;
81  };
82 
83  struct Refinement
84  {
85  unsigned int initial_global_cycles;
87  std::vector<unsigned int> boundaries_to_refine;
89  };
90 
91  struct Time
92  {
93  double end;
95  double min_step_size;
96  double max_step_size;
97  unsigned int max_steps;
100  };
101 
103  {
104  std::string method;
105  unsigned int max_iterations;
106  double tolerance;
107  };
108 
109  struct Output
110  {
112  };
113 
115  {
116  bool enabled;
117  };
118 
120  {
130  };
131 
132  template<int dim>
133  void declare(ParameterHandler &prm)
134  {
135 
136  prm.enter_subsection("meta");
137  {
138  prm.declare_entry("dim", std::to_string(dim), Patterns::Integer(1, 3));
139  }
140  prm.leave_subsection();
141 
142 
143  prm.enter_subsection("physics");
144  {
145  prm.declare_entry("gravity", "0., -1, 0.", Patterns::List(Patterns::Double()));
146  prm.declare_entry("liquid_dynamic_viscosity", "1.", Patterns::Double(0.));
147  }
148  prm.leave_subsection();
149 
150 
151  prm.enter_subsection("source_function");
152  {
153  Functions::ParsedFunction<dim>::declare_parameters(prm, dim + 2);
154  }
155  prm.leave_subsection();
156 
157 
158  prm.enter_subsection ("geometry");
159  {
160 
161  prm.declare_entry("grid_name", "hyper_rectangle",
162  Patterns::Selection("hyper_rectangle | hyper_shell"),
163  "Select the name of the geometry and grid to generate.");
164 
165  prm.declare_entry("sizes", "0., 0., 1., 1.",
166  Patterns::List(Patterns::Double(0.)),
167  "Set the sizes for the grid's geometry.");
168 
169  }
170  prm.leave_subsection ();
171 
172 
173  prm.enter_subsection ("initial_values");
174  {
175  Functions::ParsedFunction<dim>::declare_parameters(prm, dim + 2);
176  }
177  prm.leave_subsection ();
178 
179 
180  prm.enter_subsection ("boundary_conditions");
181  {
182  prm.declare_entry(
183  "strong_boundaries",
184  "0, 1, 2, 3",
185  Patterns::List(Patterns::Integer(0)),
186  "Strong boundary conditions will be applied to boundaries with these boundary ID's.");
192  prm.declare_entry(
193  "strong_masks",
194  "velocity; pressure; temperature, velocity; pressure; temperature, velocity; pressure, velocity; pressure",
195  Patterns::Anything(),
196  "The parsed functions will only be applied as strong boundary conditions to components included in the mask."
197  "\nSemi-colons separate components, while commas separate boundaries."
198  "Masks are required for every boundary ID in strong_boundaries.");
199 
200  Functions::ParsedFunction<dim>::declare_parameters(prm, dim + 2);
201 
202  }
203  prm.leave_subsection ();
204 
205 
206  prm.enter_subsection ("refinement");
207  {
208  prm.declare_entry("initial_global_cycles", "2",
209  Patterns::Integer(),
210  "Initially globally refine the grid this many times "
211  "without using any error measure");
212 
213  prm.declare_entry("initial_boundary_cycles", "0",
214  Patterns::Integer(),
215  "Initially refine the grid this many times"
216  "near the boundaries that are listed for refinement");
217 
218  prm.declare_entry("boundaries_to_refine", "0",
219  Patterns::List(Patterns::Integer()),
220  "Refine cells that contain these boundaries");
221 
222  }
223  prm.leave_subsection();
224 
225 
226  prm.enter_subsection ("time");
227  {
228  prm.declare_entry("end", "0.",
229  Patterns::Double(0.),
230  "End the time-dependent simulation once this time is reached.");
231 
232  prm.declare_entry("initial_step_size", "1.",
233  Patterns::Double(0.),
234  "Begin with this time step size.");
235 
236  prm.declare_entry("min_step_size", "1.",
237  Patterns::Double(0.),
238  "Minimum step size for adaptive time steppinig.");
239 
240  prm.declare_entry("max_step_size", "1.",
241  Patterns::Double(0.),
242  "Maximum step size for adaptive time steppinig.");
243 
244  prm.declare_entry("max_steps", "1000000",
245  Patterns::Integer(0),
246  "Maximum number of time steps.");
247 
248  prm.declare_entry("stop_when_steady", "false", Patterns::Bool());
249 
250  prm.declare_entry("steady_tolerance", "1.e-8", Patterns::Double(0.));
251 
252  }
253  prm.leave_subsection();
254 
255 
256  prm.enter_subsection("nonlinear_solver");
257  {
258  prm.declare_entry("method", "Newton",
259  Patterns::Selection("Newton"));
260 
261  prm.declare_entry("max_iterations", "50",
262  Patterns::Integer(0));
263 
264  prm.declare_entry("tolerance", "1e-9",
265  Patterns::Double(0.));
266 
267  }
268  prm.leave_subsection();
269 
270 
271  prm.enter_subsection("output");
272  {
273  prm.declare_entry("write_solution_vtk", "true", Patterns::Bool());
274  }
275  prm.leave_subsection();
276 
277 
278  prm.enter_subsection("verification");
279  {
280  prm.declare_entry("enabled", "false", Patterns::Bool());
281 
282  prm.enter_subsection("exact_solution_function");
283  {
284  Functions::ParsedFunction<dim>::declare_parameters(prm, dim + 2);
285  }
286  prm.leave_subsection();
287  }
288  prm.leave_subsection();
289 
290  }
291 
292 
293  Meta read_meta_parameters(const std::string parameter_file="")
294  {
295  Meta mp;
296 
297  ParameterHandler prm;
298  declare<2>(prm);
299 
300  if (parameter_file != "")
301  {
302  prm.parse_input(parameter_file);
303  }
304 
305  prm.enter_subsection("meta");
306  {
307  mp.dim = prm.get_integer("dim");
308  }
309  prm.leave_subsection();
310 
311  return mp;
312  }
313 
314  template <int dim>
316  const std::string parameter_file,
317  Functions::ParsedFunction<dim> &source_function,
318  Functions::ParsedFunction<dim> &initial_values_function,
319  Functions::ParsedFunction<dim> &boundary_function,
320  Functions::ParsedFunction<dim> &exact_solution_function)
321  {
322 
323  StructuredParameters params;
324 
325  ParameterHandler prm;
326  Parameters::declare<dim>(prm);
327 
328  if (parameter_file != "")
329  {
330  prm.parse_input(parameter_file);
331  }
332 
333  // Print a log file of all the ParameterHandler parameters
334  std::ofstream parameter_log_file("used_parameters.prm");
335  assert(parameter_log_file.good());
336  prm.print_parameters(parameter_log_file, ParameterHandler::Text);
337 
338  prm.enter_subsection("physics");
339  {
340  params.physics.gravity = MyParameterHandler::get_vector<double>(prm, "gravity");
341  params.physics.liquid_dynamic_viscosity = prm.get_double("liquid_dynamic_viscosity");
342  }
343  prm.leave_subsection();
344 
345  prm.enter_subsection("geometry");
346  {
347  params.geometry.grid_name = prm.get("grid_name");
348  params.geometry.sizes = MyParameterHandler::get_vector<double>(prm, "sizes");
349  }
350  prm.leave_subsection();
351 
352 
353  prm.enter_subsection("source_function");
354  {
355  source_function.parse_parameters(prm);
356  }
357  prm.leave_subsection();
358 
359 
360  prm.enter_subsection("verification");
361  {
362 
363  params.verification.enabled = prm.get_bool("enabled");
364 
365  prm.enter_subsection("exact_solution_function");
366  {
367  exact_solution_function.parse_parameters(prm);
368  }
369  prm.leave_subsection();
370 
371  }
372  prm.leave_subsection();
373 
374 
375  prm.enter_subsection("initial_values");
376  {
377 
378  initial_values_function.parse_parameters(prm);
379 
380  }
381  prm.leave_subsection();
382 
383 
384  prm.enter_subsection ("boundary_conditions");
385  {
387  MyParameterHandler::get_vector<unsigned int>(prm, "strong_boundaries");
388 
389  std::string strong_masks_string = prm.get("strong_masks");
390 
391  std::vector<std::string> mask_strings = Utilities::split_string_list(strong_masks_string, ',');
392 
393  assert(mask_strings.size() == params.boundary_conditions.strong_boundaries.size());
394 
395  for (auto mask_string : mask_strings)
396  {
397  std::vector<std::string> mask = Utilities::split_string_list(mask_string, ';');
398 
399  /* Validate the entries, since we could not use the Parameter::Selection validation here */
400  for (auto name : mask)
401  {
402  assert(std::find(FIELD_NAMES.begin(), FIELD_NAMES.end(), name) != FIELD_NAMES.end());
403  }
404 
405  params.boundary_conditions.strong_masks.push_back(mask);
406  }
407 
408  boundary_function.parse_parameters(prm);
409  }
410  prm.leave_subsection ();
411 
412 
413  prm.enter_subsection("refinement");
414  {
415 
416  params.refinement.initial_global_cycles = prm.get_integer("initial_global_cycles");
417  params.refinement.initial_boundary_cycles = prm.get_integer("initial_boundary_cycles");
419  MyParameterHandler::get_vector<unsigned int>(prm, "boundaries_to_refine");
420 
421  }
422  prm.leave_subsection();
423 
424 
425  prm.enter_subsection("time");
426  {
427  params.time.end = prm.get_double("end");
428  params.time.initial_step_size = prm.get_double("initial_step_size");
429  params.time.min_step_size = prm.get_double("min_step_size");
430  params.time.max_step_size = prm.get_double("max_step_size");
431  params.time.max_steps = prm.get_integer("max_steps");
432  params.time.stop_when_steady = prm.get_bool("stop_when_steady");
433  params.time.steady_tolerance = prm.get_double("steady_tolerance");
434  }
435  prm.leave_subsection();
436 
437 
438  prm.enter_subsection("nonlinear_solver");
439  {
440  params.nonlinear_solver.method = prm.get("method");
441  params.nonlinear_solver.max_iterations = prm.get_integer("max_iterations");
442  params.nonlinear_solver.tolerance = prm.get_double("tolerance");
443  }
444  prm.leave_subsection();
445 
446 
447  prm.enter_subsection("output");
448  {
449  params.output.write_solution_vtk = prm.get_bool("write_solution_vtk");
450  }
451  prm.leave_subsection();
452 
453  return params;
454  }
455 
456  }
457 
458 }
459 
460 #endif
double end
Definition: pf_parameters.h:93
StructuredParameters read(const std::string parameter_file, Functions::ParsedFunction< dim > &source_function, Functions::ParsedFunction< dim > &initial_values_function, Functions::ParsedFunction< dim > &boundary_function, Functions::ParsedFunction< dim > &exact_solution_function)
Definition: pf_parameters.h:315
Definition: pf_parameters.h:91
unsigned int cycles_at_interval
Definition: pf_parameters.h:78
Refinement refinement
Definition: pf_parameters.h:125
Meta read_meta_parameters(const std::string parameter_file="")
Definition: pf_parameters.h:293
Definition: pf_parameters.h:52
std::string method
Definition: pf_parameters.h:104
Definition: pf_parameters.h:83
std::vector< unsigned int > boundaries_to_refine
Definition: pf_parameters.h:87
unsigned int initial_boundary_cycles
Definition: pf_parameters.h:86
double min_step_size
Definition: pf_parameters.h:95
std::vector< std::vector< std::string > > strong_masks
Definition: pf_parameters.h:69
std::vector< unsigned int > strong_boundaries
Definition: pf_parameters.h:68
BoundaryConditions boundary_conditions
Definition: pf_parameters.h:123
std::string grid_name
Definition: pf_parameters.h:61
void declare(ParameterHandler &prm)
Definition: pf_parameters.h:133
double coarsen_fraction
Definition: pf_parameters.h:80
Definition: pf_parameters.h:72
Definition: pf_parameters.h:47
unsigned int max_iterations
Definition: pf_parameters.h:105
Geometry geometry
Definition: pf_parameters.h:124
AdaptiveRefinement adaptive
Definition: pf_parameters.h:88
double liquid_dynamic_viscosity
Definition: pf_parameters.h:55
Definition: pf_parameters.h:58
Definition: pf_parameters.h:66
unsigned int dim
Definition: pf_parameters.h:60
Definition: pf_parameters.h:102
Meta meta
Definition: pf_parameters.h:121
PhysicalModel physics
Definition: pf_parameters.h:122
std::vector< std::string > FIELD_NAMES({"velocity","pressure","temperature"})
std::vector< double > sizes
Definition: pf_parameters.h:62
unsigned int interval
Definition: pf_parameters.h:77
std::vector< double > gravity
Definition: pf_parameters.h:54
double initial_step_size
Definition: pf_parameters.h:94
Definition: pf_parameters.h:114
Definition: pf_parameters.h:119
std::vector< double > transformations
Definition: pf_parameters.h:63
double tolerance
Definition: pf_parameters.h:106
Verification verification
Definition: pf_parameters.h:129
bool enabled
Definition: pf_parameters.h:116
Definition: pf_parameters.h:109
bool write_solution_vtk
Definition: pf_parameters.h:111
unsigned int dim
Definition: pf_parameters.h:49
Time time
Definition: pf_parameters.h:126
double max_step_size
Definition: pf_parameters.h:96
IterativeSolver nonlinear_solver
Definition: pf_parameters.h:127
unsigned int max_level
Definition: pf_parameters.h:75
bool stop_when_steady
Definition: pf_parameters.h:98
unsigned int initial_cycles
Definition: pf_parameters.h:74
double steady_tolerance
Definition: pf_parameters.h:99
unsigned int initial_global_cycles
Definition: pf_parameters.h:85
Output output
Definition: pf_parameters.h:128
unsigned int max_cells
Definition: pf_parameters.h:76
unsigned int max_steps
Definition: pf_parameters.h:97
Definition: phaseflow.h:71
double refine_fraction
Definition: pf_parameters.h:79