PRISMS-PF  v2.1
userInputParameters.h
Go to the documentation of this file.
1 // Class to load in the user input from parameters.h and the variable definition
2 // part of equations.h
3 
4 #ifndef INCLUDE_USERINPUTPARAMETERS_H_
5 #define INCLUDE_USERINPUTPARAMETERS_H_
6 
7 
8 #include <deal.II/lac/vector.h>
9 #include <deal.II/lac/parallel_vector.h>
10 
11 #include "model_variables.h"
12 #include "varBCs.h"
13 #include "inputFileReader.h"
14 #include "varTypeEnums.h"
16 #include "nucleationParameters.h"
17 #include "SolverParameters.h"
18 #include <deal.II/base/conditional_ostream.h>
19 #include <boost/variant.hpp>
20 #include <boost/algorithm/string.hpp>
21 #include <boost/algorithm/string/predicate.hpp>
22 #include <vector>
23 #include <iostream>
24 #include <unordered_map>
25 
27 
28 template <int dim>
30 {
31 
32 public:
33  // Method to read the input parameters from a file and load them into the class member variables
34  userInputParameters(inputFileReader & input_file_reader, dealii::ParameterHandler & parameter_handler, variableAttributeLoader variable_attributes);
35 
36  // Method to create the list of BCs from the user input strings (called from the constructor)
37  void load_BC_list(const std::vector<std::string> list_of_BCs);
38 
39  // Map linking the model constant name to its index
40  std::unordered_map<std::string,unsigned int> model_constant_name_map;
41 
42  // Methods to access members of 'model_constant', one for each type (since one can't template based on return values)
43  // These are really just wrappers for Boost's 'get' function
44  double get_model_constant_double(const std::string constant_name) const {return boost::get<double>(model_constants[model_constant_name_map.at(constant_name)]);};
45  int get_model_constant_int(const std::string constant_name) const {return boost::get<int>(model_constants[model_constant_name_map.at(constant_name)]);};
46  bool get_model_constant_bool(const std::string constant_name) const {return boost::get<bool>(model_constants[model_constant_name_map.at(constant_name)]);};
47  dealii::Tensor<1,dim> get_model_constant_rank_1_tensor(const std::string constant_name) const {return boost::get<dealii::Tensor<1,dim> >(model_constants[model_constant_name_map.at(constant_name)]);};
48  dealii::Tensor<2,dim> get_model_constant_rank_2_tensor(const std::string constant_name) const {return boost::get<dealii::Tensor<2,dim> >(model_constants[model_constant_name_map.at(constant_name)]);};
49  dealii::Tensor<2,2*dim-1+dim/3> get_model_constant_elasticity_tensor(const std::string constant_name) const {return boost::get<dealii::Tensor<2,2*dim-1+dim/3> >(model_constants[model_constant_name_map.at(constant_name)]);};
50 
51  // Method to load in the variable attributes
52  void loadVariableAttributes(variableAttributeLoader variable_attributes);
53 
54  // Nucleation attribute methods
55  std::vector<double> get_nucleus_semiaxes(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].semiaxes; };
56  std::vector<double> get_nucleus_freeze_semiaxes(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].freeze_semiaxes; };
57  std::vector<double> get_nucleus_rotation(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].ellipsoid_rotation; };
58  double get_no_nucleation_border_thickness(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].no_nucleation_border_thickness; };
59  double get_nucleus_hold_time(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].hold_time; };
60  dealii::Tensor<2,dim,double> get_nucleus_rotation_matrix(unsigned int var_index) const { return nucleation_parameters_list[nucleation_parameters_list_index.at(var_index)].rotation_matrix; };
61 
62  // Meshing parameters
63  std::vector<double> domain_size;
64  std::vector<unsigned int> subdivisions;
65  unsigned int refine_factor;
66  unsigned int degree;
67 
68  // Mesh refinement parameters
70  unsigned int max_refinement_level;
71  unsigned int min_refinement_level;
72 
73  std::vector<int> refine_criterion_fields;
74  std::vector<double> refine_window_max;
75  std::vector<double> refine_window_min;
76 
77  unsigned int skip_remeshing_steps;
78 
79  // Output parameters
80  unsigned int skip_print_steps;
81  std::string output_file_type;
83  std::string output_file_name;
84  std::vector<unsigned int> outputTimeStepList;
85 
86  // Time step parameters
87  double dtValue;
88  double finalTime;
89  unsigned int totalIncrements;
90 
91  // Elliptic solver parameters
93 
94  // Nonlinear solver parameters
96 
97  // Variable inputs (I might be able to leave some/all of these in variable_attributes)
98  unsigned int number_of_variables;
99 
100  std::vector<std::string> var_name;
101  std::vector<fieldType> var_type;
102  std::vector<PDEType> var_eq_type;
103 
104  std::vector<bool> var_nonlinear;
105 
106  // Variables needed to calculate the RHS
109 
110  // Variables needed to calculate the LHS
111  unsigned int num_var_LHS;
112  std::vector<variable_info> varInfoListLHS;
113  std::vector<variable_info> varChangeInfoListLHS;
114 
115  // Variables for loading in initial conditions
116  std::vector<bool> load_ICs;
117  std::vector<bool> load_parallel_file;
118  std::vector<std::string> load_file_name;
119  std::vector<std::string> load_field_name;
120 
121  // Variables for saving/loading checkpoints
123  std::vector<unsigned int> checkpointTimeStepList;
124 
125  // Postprocessing parameters
127  unsigned int num_integrated_fields;
129  std::vector<bool> pp_calc_integral;
130  std::vector<unsigned int> integrated_field_indices;
131 
132  std::vector<std::string> pp_var_name;
133  std::vector<fieldType> pp_var_type;
134 
135  // Variable and residual info
136  std::vector<variable_info> pp_varInfoList;
137  std::vector<variable_info> pp_baseVarInfoList;
138 
139  // List of boundary conditions
140  std::vector<varBCs<dim> > BC_list;
141 
142  // List of user-defined constants
143  std::vector<boost::variant<double, int, bool,dealii::Tensor<1,dim>, dealii::Tensor<2,dim>, dealii::Tensor<2,2*dim-1+dim/3> > > model_constants;
144 
145  // Nucleation parameters
147  std::vector<unsigned int> nucleating_variable_indices;
148  std::vector<unsigned int> nucleation_need_value;
149 
150  double min_distance_between_nuclei; // Only enforced for nuclei placed during the same time step
153 
154  // Grain remapping parameters
156  std::vector<unsigned int> variables_for_remapping; // Note: this should be a sorted list
160 
166 
167 private:
168  // Method to create the list of time steps where the results should be output (called from loadInputParameters)
169  std::vector<unsigned int> setTimeStepList(const std::string outputSpacingType, unsigned int numberOfOutputs,
170  const std::vector<unsigned int> & userGivenTimeStepList);
171 
172  void load_user_constants(inputFileReader & input_file_reader, dealii::ParameterHandler & parameter_handler);
173 
174  dealii::Tensor<2,2*dim-1+dim/3> get_Cij_tensor(std::vector<double> elastic_constants, const std::string elastic_const_symmetry) const;
175 
176  dealii::Tensor<2,2*dim-1+dim/3> getCIJMatrix(const elasticityModel model, const std::vector<double> constants, dealii::ConditionalOStream & pcout) const;
177 
178  // Private nucleation variables
179  std::vector<nucleationParameters<dim> > nucleation_parameters_list;
180  std::map<unsigned int, unsigned int> nucleation_parameters_list_index;
181 
182 };
183 
184 #endif /* INCLUDE_USERINPUTPARAMETERS_H_ */
dealii::Tensor< 2, 2 *dim-1+dim/3 > getCIJMatrix(const elasticityModel model, const std::vector< double > constants, dealii::ConditionalOStream &pcout) const
std::vector< std::string > pp_var_name
std::vector< unsigned int > nucleation_need_value
std::vector< unsigned int > integrated_field_indices
unsigned int pp_number_of_variables
unsigned int skip_remeshing_steps
std::vector< std::string > load_file_name
std::vector< bool > load_ICs
std::string grain_structure_variable_name
void load_user_constants(inputFileReader &input_file_reader, dealii::ParameterHandler &parameter_handler)
unsigned int skip_grain_reassignment_steps
std::vector< nucleationParameters< dim > > nucleation_parameters_list
std::vector< boost::variant< double, int, bool, dealii::Tensor< 1, dim >, dealii::Tensor< 2, dim >, dealii::Tensor< 2, 2 *dim-1+dim/3 > > > model_constants
unsigned int skip_print_steps
dealii::Tensor< 2, dim > get_model_constant_rank_2_tensor(const std::string constant_name) const
LinearSolverParameters linear_solver_parameters
dealii::Tensor< 2, 2 *dim-1+dim/3 > get_model_constant_elasticity_tensor(const std::string constant_name) const
std::vector< bool > var_nonlinear
std::vector< unsigned int > subdivisions
NonlinearSolverParameters nonlinear_solver_parameters
std::vector< varBCs< dim > > BC_list
double get_model_constant_double(const std::string constant_name) const
unsigned int num_var_nonexplicit_RHS
std::vector< unsigned int > setTimeStepList(const std::string outputSpacingType, unsigned int numberOfOutputs, const std::vector< unsigned int > &userGivenTimeStepList)
std::vector< bool > pp_calc_integral
std::map< unsigned int, unsigned int > nucleation_parameters_list_index
std::vector< double > domain_size
std::vector< PDEType > var_eq_type
int get_model_constant_int(const std::string constant_name) const
unsigned int steps_between_nucleation_attempts
elasticityModel
bool get_model_constant_bool(const std::string constant_name) const
std::vector< variable_info > varChangeInfoListLHS
std::vector< std::string > load_field_name
unsigned int num_grain_smoothing_cycles
std::vector< variable_info > pp_baseVarInfoList
std::vector< double > refine_window_min
std::vector< double > refine_window_max
void loadVariableAttributes(variableAttributeLoader variable_attributes)
std::vector< variable_info > pp_varInfoList
std::string grain_structure_filename
unsigned int max_refinement_level
std::unordered_map< std::string, unsigned int > model_constant_name_map
unsigned int num_var_explicit_RHS
unsigned int totalIncrements
unsigned int num_integrated_fields
userInputParameters(inputFileReader &input_file_reader, dealii::ParameterHandler &parameter_handler, variableAttributeLoader variable_attributes)
std::vector< double > get_nucleus_semiaxes(unsigned int var_index) const
double get_no_nucleation_border_thickness(unsigned int var_index) const
dealii::Tensor< 1, dim > get_model_constant_rank_1_tensor(const std::string constant_name) const
std::vector< int > refine_criterion_fields
std::vector< variable_info > varInfoListExplicitRHS
double get_nucleus_hold_time(unsigned int var_index) const
std::vector< unsigned int > nucleating_variable_indices
dealii::Tensor< 2, dim, double > get_nucleus_rotation_matrix(unsigned int var_index) const
std::vector< bool > load_parallel_file
std::vector< double > get_nucleus_rotation(unsigned int var_index) const
unsigned int number_of_variables
unsigned int min_refinement_level
std::vector< unsigned int > checkpointTimeStepList
std::vector< unsigned int > variables_for_remapping
std::vector< unsigned int > outputTimeStepList
std::vector< variable_info > varInfoListLHS
std::vector< std::string > var_name
std::vector< fieldType > var_type
std::vector< variable_info > varInfoListNonexplicitRHS
std::vector< double > get_nucleus_freeze_semiaxes(unsigned int var_index) const
std::vector< fieldType > pp_var_type
dealii::Tensor< 2, 2 *dim-1+dim/3 > get_Cij_tensor(std::vector< double > elastic_constants, const std::string elastic_const_symmetry) const
void load_BC_list(const std::vector< std::string > list_of_BCs)
Definition: load_BC_list.cc:7