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 
27 
28 #include <deal.II/matrix_free/fe_point_evaluation.h>
29 
30 #include <array>
31 
32 namespace aspect
33 {
34  namespace MaterialModel
35  {
36  using namespace dealii;
37 
43  template <int dim>
45  {
46  public:
47  DislocationViscosityOutputs(const unsigned int n_points);
48 
49  std::vector<double> get_nth_output(const unsigned int idx) const override;
50 
56  std::vector<double> dislocation_viscosities;
57 
63  std::vector<double> diffusion_viscosities;
64  };
65 
66 
67 
89  template <int dim>
91  {
92  public:
97  void
98  initialize () override;
99 
108  bool is_compressible () const override;
109 
110  void evaluate(const typename Interface<dim>::MaterialModelInputs &in,
111  typename Interface<dim>::MaterialModelOutputs &out) const override;
112 
120  static
121  void
122  declare_parameters (ParameterHandler &prm);
123 
127  void
128  parse_parameters (ParameterHandler &prm) override;
129 
130 
131  void
132  create_additional_named_outputs (MaterialModel::MaterialModelOutputs<dim> &out) const override;
133 
141  double enthalpy (const double temperature,
142  const double pressure,
143  const std::vector<double> &compositional_fields,
144  const Point<dim> &position) const;
145 
157  std::array<std::pair<double, unsigned int>,2>
158  enthalpy_derivative (const typename Interface<dim>::MaterialModelInputs &in) const;
159 
160  protected:
162  double reference_T;
163  double eta;
166 
171 
175  double k_value;
176 
180  unsigned int grain_size_index;
181 
185  std::vector<double> grain_growth_activation_energy;
186  std::vector<double> grain_growth_activation_volume;
187  std::vector<double> grain_growth_rate_constant;
188  std::vector<double> grain_growth_exponent;
190  std::vector<double> reciprocal_required_strain;
191  std::vector<double> recrystallized_grain_size;
192 
196  std::vector<double> grain_boundary_energy;
198  std::vector<double> geometric_constant;
199 
204  struct Formulation
205  {
226  enum Kind
227  {
230  pinned_grain_damage
231  };
232 
237  static
238  Kind
239  parse(const std::string &input)
240  {
241  if (input == "paleowattmeter")
242  return Formulation::paleowattmeter;
243  else if (input == "paleopiezometer")
244  return Formulation::paleopiezometer;
245  else if (input == "pinned grain damage")
246  return Formulation::pinned_grain_damage;
247  else
248  AssertThrow(false, ExcNotImplemented());
249 
250  return Formulation::Kind();
251  }
252  };
253 
259 
266  double compute_partitioning_fraction (const double temperature) const;
267 
277 
289 
295 
301  std::vector<double> dislocation_creep_exponent;
302  std::vector<double> dislocation_activation_energy;
303  std::vector<double> dislocation_activation_volume;
304  std::vector<double> dislocation_creep_prefactor;
305  std::vector<double> diffusion_creep_exponent;
306  std::vector<double> diffusion_activation_energy;
307  std::vector<double> diffusion_activation_volume;
308  std::vector<double> diffusion_creep_prefactor;
310 
317  double min_eta;
318  double max_eta;
326 
332 
333  double diffusion_viscosity (const double temperature,
334  const double adiabatic_temperature,
335  const double adiabatic_pressure,
336  const double grain_size,
337  const double second_strain_rate_invariant,
338  const Point<dim> &position) const;
339 
351  double dislocation_viscosity (const double temperature,
352  const double adiabatic_temperature,
353  const double adiabatic_pressure,
354  const SymmetricTensor<2,dim> &strain_rate,
355  const Point<dim> &position,
356  const double diffusion_viscosity,
357  const double viscosity_guess = 0) const;
358 
359  double density (const double temperature,
360  const double pressure,
361  const std::vector<double> &compositional_fields,
362  const Point<dim> &position) const;
363 
364  double compressibility (const double temperature,
365  const double pressure,
366  const std::vector<double> &compositional_fields,
367  const Point<dim> &position) const;
368 
369  double specific_heat (const double temperature,
370  const double pressure,
371  const std::vector<double> &compositional_fields,
372  const Point<dim> &position) const;
373 
374  double thermal_expansion_coefficient (const double temperature,
375  const double pressure,
376  const std::vector<double> &compositional_fields,
377  const Point<dim> &position) const;
378 
382  double seismic_Vp (const double temperature,
383  const double pressure,
384  const std::vector<double> &compositional_fields,
385  const Point<dim> &position) const;
386 
390  double seismic_Vs (const double temperature,
391  const double pressure,
392  const std::vector<double> &compositional_fields,
393  const Point<dim> &position) const;
394 
410  double
411  grain_size_change (const double temperature,
412  const double pressure,
413  const std::vector<double> &compositional_fields,
414  const SymmetricTensor<2,dim> &strain_rate,
415  const Tensor<1,dim> &velocity,
416  const Point<dim> &position,
417  const unsigned int grain_size_index,
418  const int crossed_transition) const;
419 
425  double
426  phase_function (const Point<dim> &position,
427  const double temperature,
428  const double pressure,
429  const unsigned int phase) const;
430 
436  unsigned int
437  get_phase_index (const Point<dim> &position,
438  const double temperature,
439  const double pressure) const;
440 
449  void
450  convert_log_grain_size (std::vector<double> &compositional_fields) const;
451 
456  std::vector<double> transition_depths;
457  std::vector<double> transition_temperatures;
458  std::vector<double> transition_slopes;
459  std::vector<double> transition_widths;
460 
461 
466  std::string datadirectory;
467  std::vector<std::string> material_file_names;
468  std::vector<std::string> derivatives_file_names;
469  unsigned int n_material_data;
473 
474 
479  enum formats
480  {
482  hefesto
483  } material_file_format;
484 
490  std::vector<std::unique_ptr<MaterialModel::MaterialUtilities::Lookup::MaterialLookup>> material_lookup;
491 
498  mutable std::unique_ptr<FEPointEvaluation<1, dim>> temperature_evaluator;
499  mutable std::unique_ptr<FEPointEvaluation<1, dim>> pressure_evaluator;
500  };
501 
502  }
503 }
504 
505 #endif
std::vector< double > grain_growth_rate_constant
Definition: grain_size.h:187
std::vector< double > diffusion_activation_volume
Definition: grain_size.h:307
std::vector< double > grain_boundary_energy
Definition: grain_size.h:196
std::vector< std::string > material_file_names
Definition: grain_size.h:467
std::vector< double > grain_growth_activation_energy
Definition: grain_size.h:185
std::vector< double > transition_depths
Definition: grain_size.h:456
std::vector< double > diffusion_creep_exponent
Definition: grain_size.h:305
std::vector< double > dislocation_activation_volume
Definition: grain_size.h:303
std::vector< double > reciprocal_required_strain
Definition: grain_size.h:190
void declare_parameters(ParameterHandler &prm)
std::vector< std::unique_ptr< MaterialModel::MaterialUtilities::Lookup::MaterialLookup > > material_lookup
Definition: grain_size.h:490
double grain_size_reduction_work_fraction_exponent
Definition: grain_size.h:272
std::vector< double > geometric_constant
Definition: grain_size.h:198
std::vector< double > grain_growth_exponent
Definition: grain_size.h:188
std::vector< double > diffusion_creep_grain_size_exponent
Definition: grain_size.h:309
std::vector< double > diffusion_creep_prefactor
Definition: grain_size.h:308
std::vector< double > dislocation_activation_energy
Definition: grain_size.h:302
unsigned int dislocation_viscosity_iteration_number
Definition: grain_size.h:300
std::vector< double > transition_slopes
Definition: grain_size.h:458
std::vector< double > grain_growth_activation_volume
Definition: grain_size.h:186
std::vector< double > dislocation_creep_exponent
Definition: grain_size.h:301
std::vector< double > recrystallized_grain_size
Definition: grain_size.h:191
std::unique_ptr< FEPointEvaluation< 1, dim > > temperature_evaluator
Definition: grain_size.h:498
std::vector< double > diffusion_activation_energy
Definition: grain_size.h:306
std::vector< double > transition_temperatures
Definition: grain_size.h:457
std::vector< double > transition_widths
Definition: grain_size.h:459
std::vector< double > boundary_area_change_work_fraction
Definition: grain_size.h:197
static Kind parse(const std::string &input)
Definition: grain_size.h:239
Definition: compat.h:42
Formulation::Kind grain_size_evolution_formulation
Definition: grain_size.h:258
std::vector< std::string > derivatives_file_names
Definition: grain_size.h:468
std::unique_ptr< FEPointEvaluation< 1, dim > > pressure_evaluator
Definition: grain_size.h:499
std::vector< double > dislocation_creep_prefactor
Definition: grain_size.h:304