ASPECT
visco_plastic.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2020 - 2024 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 LICENSE. If not see
18  <http://www.gnu.org/licenses/>.
19 */
20 
21 #ifndef _aspect_material_model_rheology_visco_plastic_h
22 #define _aspect_material_model_rheology_visco_plastic_h
23 
24 #include <aspect/global.h>
39 
41 
42 namespace aspect
43 {
44  namespace MaterialModel
45  {
51  template <int dim>
53  {
54  public:
55  PlasticAdditionalOutputs(const unsigned int n_points);
56 
57  std::vector<double> get_nth_output(const unsigned int idx) const override;
58 
64  std::vector<double> cohesions;
65 
71  std::vector<double> friction_angles;
72 
77  std::vector<double> yield_stresses;
78 
83  std::vector<double> yielding;
84 
85  };
86 
90  template <int dim>
92  {
93  public:
98  enum class Property
99  {
102  };
103 
107  ViscosityAdditionalOutputs(const unsigned int n_points,
108  const std::vector<Property> &active_properties);
109 
110  std::vector<double>
111  get_nth_output(const unsigned int idx) const override;
112 
113  private:
118  std::vector<Property> active_properties;
119 
120  public:
127  std::vector<double> diffusion_viscosities;
128 
135  std::vector<double> dislocation_viscosities;
136 
137  };
138 
143  {
147  std::vector<double> composition_viscosities;
148 
152  std::vector<bool> composition_yielding;
153 
157  std::vector<Rheology::DruckerPragerParameters> drucker_prager_parameters;
158 
164  std::vector<double> dilation_lhs_terms;
165 
171  std::vector<double> dilation_rhs_terms;
172 
176  std::vector<double> diffusion_viscosities;
177 
181  std::vector<double> dislocation_viscosities;
182  };
183 
184  namespace Rheology
185  {
186 
187  template <int dim>
189  {
190  public:
195 
206  const unsigned int i,
207  const std::vector<double> &volume_fractions,
208  const std::vector<double> &phase_function_values = std::vector<double>(),
209  const std::vector<unsigned int> &n_phase_transitions_per_composition =
210  std::vector<unsigned int>()) const;
211 
221  void compute_viscosity_derivatives(const unsigned int point_index,
222  const std::vector<double> &volume_fractions,
223  const IsostrainViscosities &isostrain_values,
226  const std::vector<double> &phase_function_values = std::vector<double>(),
227  const std::vector<unsigned int> &n_phase_transitions_per_composition =
228  std::vector<unsigned int>()) const;
229 
237 
241  static
242  void
244 
252  void
254  const std::unique_ptr<std::vector<unsigned int>> &expected_n_phases_per_composition = nullptr);
255 
260  void
262 
268  void fill_plastic_outputs(const unsigned int point_index,
269  const std::vector<double> &volume_fractions,
270  const bool plastic_yielding,
273  const IsostrainViscosities &isostrain_viscosities) const;
277  void
279 
284  void fill_viscosity_outputs(const unsigned int point_index,
285  const std::vector<double> &volume_fractions,
287  const IsostrainViscosities &isostrain_viscosities) const;
288 
295 
301 
306 
311 
316 
317 
318  private:
319 
326 
333  std::vector<double> minimum_viscosity;
337  std::vector<double> maximum_viscosity;
338 
345  {
351  };
356 
362  {
365  };
370 
378 
389 
399 
405  std::vector<double> exponents_stress_limiter;
406 
412 
418  std::unique_ptr<Rheology::FrankKamenetskii<dim>> frank_kamenetskii_rheology;
419 
425 
429  std::unique_ptr<Rheology::GrainBoundarySliding<dim>> grain_boundary_sliding_rheology;
430 
437 
441  std::unique_ptr<Rheology::PeierlsCreep<dim>> peierls_creep;
442 
449 
454 
455  /*
456  * Object for computing plastic stresses, viscosities, and additional outputs
457  */
459 
460  };
461  }
462  }
463 }
464 #endif
PlasticAdditionalOutputs(const unsigned int n_points)
std::vector< double > get_nth_output(const unsigned int idx) const override
std::unique_ptr< Rheology::GrainBoundarySliding< dim > > grain_boundary_sliding_rheology
Rheology::DislocationCreep< dim > dislocation_creep
static void declare_parameters(ParameterHandler &prm)
void fill_plastic_outputs(const unsigned int point_index, const std::vector< double > &volume_fractions, const bool plastic_yielding, const MaterialModel::MaterialModelInputs< dim > &in, MaterialModel::MaterialModelOutputs< dim > &out, const IsostrainViscosities &isostrain_viscosities) const
Rheology::Elasticity< dim > elastic_rheology
void parse_parameters(ParameterHandler &prm, const std::unique_ptr< std::vector< unsigned int >> &expected_n_phases_per_composition=nullptr)
void compute_viscosity_derivatives(const unsigned int point_index, const std::vector< double > &volume_fractions, const IsostrainViscosities &isostrain_values, const MaterialModel::MaterialModelInputs< dim > &in, MaterialModel::MaterialModelOutputs< dim > &out, const std::vector< double > &phase_function_values=std::vector< double >(), const std::vector< unsigned int > &n_phase_transitions_per_composition=std::vector< unsigned int >()) const
Rheology::FrictionModels< dim > friction_models
std::unique_ptr< Rheology::FrankKamenetskii< dim > > frank_kamenetskii_rheology
Rheology::CompositionalViscosityPrefactors< dim > compositional_viscosity_prefactors
MaterialUtilities::CompositionalAveragingOperation viscosity_averaging
void create_viscosity_outputs(MaterialModel::MaterialModelOutputs< dim > &out) const
void fill_viscosity_outputs(const unsigned int point_index, const std::vector< double > &volume_fractions, MaterialModel::MaterialModelOutputs< dim > &out, const IsostrainViscosities &isostrain_viscosities) const
Rheology::DruckerPrager< dim > drucker_prager_plasticity
ComponentMask get_volumetric_composition_mask() const
Rheology::DiffusionCreep< dim > diffusion_creep
IsostrainViscosities calculate_isostrain_viscosities(const MaterialModel::MaterialModelInputs< dim > &in, const unsigned int i, const std::vector< double > &volume_fractions, const std::vector< double > &phase_function_values=std::vector< double >(), const std::vector< unsigned int > &n_phase_transitions_per_composition=std::vector< unsigned int >()) const
void create_plastic_outputs(MaterialModel::MaterialModelOutputs< dim > &out) const
Rheology::ConstantViscosityPrefactors< dim > constant_viscosity_prefactors
std::unique_ptr< Rheology::PeierlsCreep< dim > > peierls_creep
Rheology::StrainDependent< dim > strain_rheology
ViscosityAdditionalOutputs(const unsigned int n_points, const std::vector< Property > &active_properties)
std::vector< double > get_nth_output(const unsigned int idx) const override
std::vector< Rheology::DruckerPragerParameters > drucker_prager_parameters