2 #ifndef MATRIXFREEPDE_H 3 #define MATRIXFREEPDE_H 11 #include <deal.II/base/quadrature.h> 12 #include <deal.II/base/timer.h> 13 #include <deal.II/lac/vector.h> 14 #include <deal.II/lac/constraint_matrix.h> 15 #include <deal.II/fe/fe_system.h> 16 #include <deal.II/fe/fe_q.h> 17 #include <deal.II/fe/fe_values.h> 18 #include <deal.II/grid/tria.h> 19 #include <deal.II/grid/tria_accessor.h> 20 #include <deal.II/grid/tria_iterator.h> 21 #include <deal.II/grid/grid_tools.h> 22 #include <deal.II/dofs/dof_tools.h> 23 #include <deal.II/dofs/dof_handler.h> 24 #include <deal.II/numerics/vector_tools.h> 25 #include <deal.II/lac/parallel_vector.h> 26 #include <deal.II/matrix_free/matrix_free.h> 27 #include <deal.II/matrix_free/fe_evaluation.h> 28 #include <deal.II/base/config.h> 29 #include <deal.II/base/exceptions.h> 30 #include <deal.II/distributed/tria.h> 31 #include <deal.II/distributed/solution_transfer.h> 32 #include <deal.II/grid/manifold_lib.h> 47 typedef dealii::parallel::distributed::Vector<double>
vectorType;
51 #define constV(a) make_vectorized_array(a) 66 template <
int dim,
int degree>
81 virtual void makeTriangulation(parallel::distributed::Triangulation<dim> &)
const;
115 virtual void setInitialCondition(
const dealii::Point<dim> &p,
const unsigned int index,
double & scalar_IC, dealii::Vector<double> & vector_IC) = 0;
118 virtual void setNonUniformDirichletBCs(
const dealii::Point<dim> &p,
const unsigned int index,
const unsigned int direction,
const double time,
double & scalar_BC, dealii::Vector<double> & vector_BC) = 0;
131 const static unsigned int CIJ_tensor_size = 2*dim-1+dim/3;
139 void reassignGrains();
148 virtual void solveIncrement (
bool skip_time_dependent);
155 void outputResults();
188 std::vector<parallel::distributed::SolutionTransfer<dim, vectorType>*>
soltransSet;
215 void adaptiveRefine(
unsigned int _currentIncrement);
217 virtual void adaptiveRefineCriterion();
220 void computeExplicitRHS();
221 void computeNonexplicitRHS();
225 void getLHS(
const MatrixFree<dim,double> &data,
228 const std::pair<unsigned int,unsigned int> &cell_range)
const;
232 void getLaplaceLHS(
const MatrixFree<dim,double> &data,
235 const std::pair<unsigned int,unsigned int> &cell_range)
const;
238 void setNonlinearEqInitialGuess();
239 void computeLaplaceRHS(
unsigned int fieldIndex);
240 void getLaplaceRHS (
const MatrixFree<dim,double> &data,
243 const std::pair<unsigned int,unsigned int> &cell_range)
const;
247 void getExplicitRHS (
const MatrixFree<dim,double> &data,
248 std::vector<vectorType*> &dst,
249 const std::vector<vectorType*> &src,
250 const std::pair<unsigned int,unsigned int> &cell_range)
const;
252 void getNonexplicitRHS (
const MatrixFree<dim,double> &data,
253 std::vector<vectorType*> &dst,
254 const std::vector<vectorType*> &src,
255 const std::pair<unsigned int,unsigned int> &cell_range)
const;
257 virtual void explicitEquationRHS(
variableContainer<dim,degree,dealii::VectorizedArray<double> > & variable_list,
258 dealii::Point<dim, dealii::VectorizedArray<double> > q_point_loc)
const=0;
260 virtual void nonExplicitEquationRHS(
variableContainer<dim,degree,dealii::VectorizedArray<double> > & variable_list,
261 dealii::Point<dim, dealii::VectorizedArray<double> > q_point_loc)
const=0;
263 virtual void equationLHS(
variableContainer<dim,degree,dealii::VectorizedArray<double> > & variable_list,
264 dealii::Point<dim, dealii::VectorizedArray<double> > q_point_loc)
const=0;
267 variableContainer<dim,degree,dealii::VectorizedArray<double> > & pp_variable_list,
268 const dealii::Point<dim, dealii::VectorizedArray<double> > q_point_loc)
const {};
269 void computePostProcessedFields(std::vector<vectorType*> &postProcessedSet);
271 void getPostProcessedFields(
const dealii::MatrixFree<dim,double> &data,
272 std::vector<vectorType*> &dst,
273 const std::vector<vectorType*> &src,
274 const std::pair<unsigned int,unsigned int> &cell_range);
280 void markBoundaries(parallel::distributed::Triangulation<dim> &)
const;
282 void applyDirichletBCs();
285 void applyNeumannBCs();
288 void setPeriodicity();
289 void setPeriodicityConstraints(ConstraintMatrix *,
const DoFHandler<dim>*)
const;
290 void getComponentsWithRigidBodyModes(std::vector<int> &)
const;
291 void setRigidBodyModeConstraints(
const std::vector<int>, ConstraintMatrix *,
const DoFHandler<dim>*)
const;
296 void applyInitialConditions();
302 void save_checkpoint();
304 void load_checkpoint_triangulation();
305 void load_checkpoint_fields();
306 void load_checkpoint_time_info();
308 void move_file(
const std::string&,
const std::string&);
310 void verify_checkpoint_file_exists(
const std::string filename);
319 void updateNucleiList();
320 std::vector<nucleus<dim> > getNewNuclei();
321 void getLocalNucleiList(std::vector<
nucleus<dim> > & newnuclei)
const;
322 void safetyCheckNewNuclei(std::vector<
nucleus<dim> > newnuclei, std::vector<unsigned int> & conflict_ids);
323 void refineMeshNearNuclei(std::vector<
nucleus<dim> > newnuclei);
324 double weightedDistanceFromNucleusCenter(
const dealii::Point<dim,double> center,
const std::vector<double> semiaxes,
const dealii::Point<dim,double> q_point_loc,
const unsigned int var_index)
const;
325 dealii::VectorizedArray<double> weightedDistanceFromNucleusCenter(
const dealii::Point<dim,double> center,
const std::vector<double> semiaxes,
const dealii::Point<dim,dealii::VectorizedArray<double> > q_point_loc,
const unsigned int var_index)
const;
333 unsigned int getFieldIndex(std::string _name);
336 void outputFreeEnergy(
const std::vector<double>& freeEnergyValues)
const;
339 void computeIntegral(
double& integratedField,
int index, std::vector<vectorType*> postProcessedSet);
353 unsigned int currentIncrement,
currentOutput, currentCheckpoint, current_grain_reassignment;
367 void computeIntegralMF(
double& integratedField,
int index,
const std::vector<vectorType*> postProcessedSet);
369 void getIntegralMF (
const MatrixFree<dim,double> &data,
370 std::vector<vectorType*> &dst,
371 const std::vector<vectorType*> &src,
372 const std::pair<unsigned int,unsigned int> &cell_range);
std::vector< Field< dim > > fields
virtual void postProcessedFields(const variableContainer< dim, degree, dealii::VectorizedArray< double > > &variable_list, variableContainer< dim, degree, dealii::VectorizedArray< double > > &pp_variable_list, const dealii::Point< dim, dealii::VectorizedArray< double > > q_point_loc) const
std::vector< double > freeEnergyValues
std::vector< const IndexSet * > locally_relevant_dofsSet
bool hasNonExplicitEquation
virtual double getNucleationProbability(variableValueContainer, double, dealii::Point< dim >, unsigned int variable_index) const
unsigned int integral_index
dealii::parallel::distributed::Vector< double > vectorType
FESystem< dim > * vector_fe
bool generatingInitialGuess
parallel::distributed::Triangulation< dim > triangulation
bool first_integrated_var_output_complete
MatrixFree< dim, double > matrixFreeObject
std::vector< parallel::distributed::SolutionTransfer< dim, vectorType > * > soltransSet
std::vector< std::map< dealii::types::global_dof_index, double > * > valuesDirichletSet
unsigned int currentFieldIndex
std::vector< DoFHandler< dim > * > dofHandlersSet_nonconst
std::vector< ConstraintMatrix * > constraintsOtherSet_nonconst
TimerOutput computing_timer
MatrixFree< dim, double > vector_matrixFreeObject
unsigned int currentOutput
dealii::parallel::distributed::Vector< double > vectorType
std::vector< double > integrated_postprocessed_fields
std::vector< const ConstraintMatrix * > constraintsOtherSet
std::vector< FESystem< dim > * > FESet
std::vector< const DoFHandler< dim > * > dofHandlersSet
std::vector< vectorType * > residualSet
unsigned int parabolicFieldIndex
dealii::Threads::Mutex assembler_lock
std::vector< nucleus< dim > > nuclei
std::vector< IndexSet * > locally_relevant_dofsSet_nonconst
variableAttributeLoader var_attributes
std::vector< vectorType * > solutionSet
std::vector< SimplifiedGrainRepresentation< dim > > simplified_grain_representations
dealii::VectorizedArray< double > scalarType
userInputParameters< dim > userInputs
DoFHandler< dim > * vector_dofHandler