ASPECT
grain_size.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2014 - 2023 by the authors of the ASPECT code.
3 
4  This file is part of ASPECT.
5 
6  ASPECT is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2, or (at your option)
9  any later version.
10 
11  ASPECT is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with ASPECT; see the file doc/COPYING. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 
22 #ifndef _aspect_model_grain_size_h
23 #define _aspect_model_grain_size_h
24 
29 
30 #include <deal.II/matrix_free/fe_point_evaluation.h>
31 #include <deal.II/sundials/arkode.h>
32 
33 #include <array>
34 
35 namespace aspect
36 {
37  namespace MaterialModel
38  {
39  using namespace dealii;
40 
46  template <int dim>
48  {
49  public:
50  DislocationViscosityOutputs(const unsigned int n_points);
51 
52  std::vector<double> get_nth_output(const unsigned int idx) const override;
53 
59  std::vector<double> dislocation_viscosities;
60 
66  std::vector<double> diffusion_viscosities;
67  };
68 
69 
70 
92  template <int dim>
94  {
95  public:
100  void
101  initialize () override;
102 
111  bool is_compressible () const override;
112 
113  void evaluate(const typename Interface<dim>::MaterialModelInputs &in,
114  typename Interface<dim>::MaterialModelOutputs &out) const override;
115 
123  static
124  void
125  declare_parameters (ParameterHandler &prm);
126 
130  void
131  parse_parameters (ParameterHandler &prm) override;
132 
133 
134  void
135  create_additional_named_outputs (MaterialModel::MaterialModelOutputs<dim> &out) const override;
136 
144  double enthalpy (const double temperature,
145  const double pressure,
146  const std::vector<double> &compositional_fields,
147  const Point<dim> &position) const;
148 
160  std::array<std::pair<double, unsigned int>,2>
161  enthalpy_derivative (const typename Interface<dim>::MaterialModelInputs &in) const;
162 
163  protected:
165  double reference_T;
166  double eta;
169 
174 
178  double k_value;
179 
183  unsigned int grain_size_index;
184 
188  std::vector<double> grain_growth_activation_energy;
189  std::vector<double> grain_growth_activation_volume;
190  std::vector<double> grain_growth_rate_constant;
191  std::vector<double> grain_growth_exponent;
193  std::vector<double> reciprocal_required_strain;
194  std::vector<double> recrystallized_grain_size;
195 
199  std::vector<double> grain_boundary_energy;
201  std::vector<double> geometric_constant;
202 
207  struct Formulation
208  {
229  enum Kind
230  {
233  pinned_grain_damage
234  };
235 
240  static
241  Kind
242  parse(const std::string &input)
243  {
244  if (input == "paleowattmeter")
245  return Formulation::paleowattmeter;
246  else if (input == "paleopiezometer")
247  return Formulation::paleopiezometer;
248  else if (input == "pinned grain damage")
249  return Formulation::pinned_grain_damage;
250  else
251  AssertThrow(false, ExcNotImplemented());
252 
253  return Formulation::Kind();
254  }
255  };
256 
262 
269  double compute_partitioning_fraction (const double temperature) const;
270 
280 
292 
298 
304  std::vector<double> dislocation_creep_exponent;
305  std::vector<double> dislocation_activation_energy;
306  std::vector<double> dislocation_activation_volume;
307  std::vector<double> dislocation_creep_prefactor;
308  std::vector<double> diffusion_creep_exponent;
309  std::vector<double> diffusion_activation_energy;
310  std::vector<double> diffusion_activation_volume;
311  std::vector<double> diffusion_creep_prefactor;
313 
320  double min_eta;
321  double max_eta;
328 
329  double diffusion_viscosity (const double temperature,
330  const double adiabatic_temperature,
331  const double adiabatic_pressure,
332  const double grain_size,
333  const double second_strain_rate_invariant,
334  const unsigned int phase_index) const;
335 
347  double dislocation_viscosity (const double temperature,
348  const double adiabatic_temperature,
349  const double adiabatic_pressure,
350  const SymmetricTensor<2,dim> &strain_rate,
351  const unsigned int phase_index,
352  const double diffusion_viscosity,
353  const double viscosity_guess = 0) const;
354 
355  double density (const double temperature,
356  const double pressure,
357  const std::vector<double> &compositional_fields,
358  const Point<dim> &position) const;
359 
360  double compressibility (const double temperature,
361  const double pressure,
362  const std::vector<double> &compositional_fields,
363  const Point<dim> &position) const;
364 
365  double specific_heat (const double temperature,
366  const double pressure,
367  const std::vector<double> &compositional_fields,
368  const Point<dim> &position) const;
369 
370  double thermal_expansion_coefficient (const double temperature,
371  const double pressure,
372  const std::vector<double> &compositional_fields,
373  const Point<dim> &position) const;
374 
378  double seismic_Vp (const double temperature,
379  const double pressure,
380  const std::vector<double> &compositional_fields,
381  const Point<dim> &position) const;
382 
386  double seismic_Vs (const double temperature,
387  const double pressure,
388  const std::vector<double> &compositional_fields,
389  const Point<dim> &position) const;
390 
406  std::vector<std::vector<double>>
407  grain_size_change (const typename Interface<dim>::MaterialModelInputs &in,
408  const std::vector<double> &adiabatic_pressure,
409  const std::vector<unsigned int> &phase_indices) const;
410 
419  unsigned int
420  get_phase_index (const MaterialUtilities::PhaseFunctionInputs<dim> &in) const;
421 
422 
426  unsigned int n_phase_transitions;
427 
435 
436 
441  std::string datadirectory;
442  std::vector<std::string> material_file_names;
443  std::vector<std::string> derivatives_file_names;
444  unsigned int n_material_data;
448 
449 
454  enum formats
455  {
457  hefesto
458  } material_file_format;
459 
465  std::vector<std::unique_ptr<MaterialModel::MaterialUtilities::Lookup::MaterialLookup>> material_lookup;
466 
473  mutable std::unique_ptr<FEPointEvaluation<1, dim>> temperature_evaluator;
474  mutable std::unique_ptr<FEPointEvaluation<1, dim>> pressure_evaluator;
475 
476  private:
477  /*
478  * Object for computing plastic stresses, viscosities, and additional outputs,
479  * as well as an object for the required input parameters.
480  */
485  };
486 
487  }
488 }
489 
490 #endif
std::vector< double > grain_growth_rate_constant
Definition: grain_size.h:190
std::vector< double > diffusion_activation_volume
Definition: grain_size.h:310
Rheology::DruckerPrager< dim > drucker_prager_plasticity
Definition: grain_size.h:483
std::vector< double > grain_boundary_energy
Definition: grain_size.h:199
std::vector< std::string > material_file_names
Definition: grain_size.h:442
MaterialUtilities::PhaseFunction< dim > phase_function
Definition: grain_size.h:434
std::vector< double > grain_growth_activation_energy
Definition: grain_size.h:188
std::vector< double > diffusion_creep_exponent
Definition: grain_size.h:308
std::vector< double > dislocation_activation_volume
Definition: grain_size.h:306
std::vector< double > reciprocal_required_strain
Definition: grain_size.h:193
void declare_parameters(ParameterHandler &prm)
std::vector< std::unique_ptr< MaterialModel::MaterialUtilities::Lookup::MaterialLookup > > material_lookup
Definition: grain_size.h:465
Rheology::DruckerPragerParameters drucker_prager_parameters
Definition: grain_size.h:484
double grain_size_reduction_work_fraction_exponent
Definition: grain_size.h:275
std::vector< double > geometric_constant
Definition: grain_size.h:201
std::vector< double > grain_growth_exponent
Definition: grain_size.h:191
std::vector< double > diffusion_creep_grain_size_exponent
Definition: grain_size.h:312
std::vector< double > diffusion_creep_prefactor
Definition: grain_size.h:311
std::vector< double > dislocation_activation_energy
Definition: grain_size.h:305
unsigned int dislocation_viscosity_iteration_number
Definition: grain_size.h:303
std::vector< double > grain_growth_activation_volume
Definition: grain_size.h:189
std::vector< double > dislocation_creep_exponent
Definition: grain_size.h:304
std::vector< double > recrystallized_grain_size
Definition: grain_size.h:194
Definition: compat.h:59
std::unique_ptr< FEPointEvaluation< 1, dim > > temperature_evaluator
Definition: grain_size.h:473
std::vector< double > diffusion_activation_energy
Definition: grain_size.h:309
std::vector< double > boundary_area_change_work_fraction
Definition: grain_size.h:200
static Kind parse(const std::string &input)
Definition: grain_size.h:242
Definition: compat.h:42
Formulation::Kind grain_size_evolution_formulation
Definition: grain_size.h:261
std::vector< std::string > derivatives_file_names
Definition: grain_size.h:443
std::unique_ptr< FEPointEvaluation< 1, dim > > pressure_evaluator
Definition: grain_size.h:474
std::vector< double > dislocation_creep_prefactor
Definition: grain_size.h:307