Skip to content

Commit dbf80e1

Browse files
committed
Remove heating model duplication
1 parent a5bc338 commit dbf80e1

File tree

3 files changed

+23
-123
lines changed

3 files changed

+23
-123
lines changed

include/aspect/heating_model/shear_heating_anisotropic_viscosity.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ namespace aspect
2929
{
3030
namespace HeatingModel
3131
{
32+
/**
33+
* A class that implements a standard model for shear heating extended for an
34+
* anisotropic viscosity tensor. If the material model provides a stress-
35+
* strain director tensor, then the strain-rate is multiplied with this
36+
* tensor to compute the stress that is used when computing the shear heating.
37+
*
38+
* @ingroup HeatingModels
39+
*/
3240
template <int dim>
3341
class ShearHeatingAnisotropicViscosity : public Interface<dim>, public ::aspect::SimulatorAccess<dim>
3442
{

source/heating_model/shear_heating_anisotropic_viscosity.cc

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <aspect/heating_model/shear_heating_anisotropic_viscosity.h>
2222

2323
#include <aspect/material_model/interface.h>
24+
#include <aspect/heating_model/shear_heating.h>
2425
#include <aspect/simulator/assemblers/stokes_anisotropic_viscosity.h>
2526

2627
#include <deal.II/base/symmetric_tensor.h>
@@ -42,11 +43,11 @@ namespace aspect
4243

4344
// Some material models provide dislocation viscosities and boundary area work fractions
4445
// as additional material outputs. If they are attached, use them.
45-
const std::shared_ptr<const ShearHeatingOutputs<dim>> shear_heating_out
46-
= material_model_outputs.template get_additional_output_object<ShearHeatingOutputs<dim>>();
46+
const std::shared_ptr<const ShearHeatingOutputs<dim>> shear_heating_out =
47+
material_model_outputs.template get_additional_output_object<ShearHeatingOutputs<dim>>();
4748

48-
const std::shared_ptr<const MaterialModel::AnisotropicViscosity<dim>> anisotropic_viscosity
49-
= material_model_outputs.template get_additional_output_object<MaterialModel::AnisotropicViscosity<dim>>();
49+
const std::shared_ptr<const MaterialModel::AnisotropicViscosity<dim>> anisotropic_viscosity =
50+
material_model_outputs.template get_additional_output_object<MaterialModel::AnisotropicViscosity<dim>>();
5051

5152
for (unsigned int q=0; q<heating_model_outputs.heating_source_terms.size(); ++q)
5253
{
@@ -114,11 +115,9 @@ namespace aspect
114115
{
115116
ASPECT_REGISTER_HEATING_MODEL(ShearHeatingAnisotropicViscosity,
116117
"anisotropic shear heating",
117-
"Implementation of a standard model for shear heating. "
118-
"Adds the term: "
119-
"$ 2 \\eta \\left( \\varepsilon - \\frac{1}{3} \\text{tr} "
120-
"\\varepsilon \\mathbf 1 \\right) : \\left( \\varepsilon - \\frac{1}{3} "
121-
"\\text{tr} \\varepsilon \\mathbf 1 \\right)$ to the "
122-
"right-hand side of the temperature equation.")
118+
"Implementation of a standard model for shear heating extended for an "
119+
"anisotropic viscosity tensor. If the material model provides a stress-"
120+
"strain director tensor, then the strain-rate is multiplied with this "
121+
"tensor to compute the stress that is used when computing the shear heating.")
123122
}
124123
}

tests/anisotropic_viscosity.cc

Lines changed: 6 additions & 113 deletions
Original file line numberDiff line numberDiff line change
@@ -33,120 +33,25 @@
3333

3434
namespace aspect
3535
{
36-
namespace HeatingModel
37-
{
38-
template <int dim>
39-
class ShearHeatingAnisotropicViscosity : public Interface<dim>, public ::aspect::SimulatorAccess<dim>
40-
{
41-
public:
42-
/**
43-
* Compute the heating model outputs for this class.
44-
*/
45-
virtual
46-
void
47-
evaluate (const MaterialModel::MaterialModelInputs<dim> &material_model_inputs,
48-
const MaterialModel::MaterialModelOutputs<dim> &material_model_outputs,
49-
HeatingModel::HeatingModelOutputs &heating_model_outputs) const;
50-
51-
/**
52-
* Allow the heating model to attach additional material model outputs.
53-
*/
54-
virtual
55-
void
56-
create_additional_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &material_model_outputs) const;
57-
};
58-
59-
template <int dim>
60-
void
61-
ShearHeatingAnisotropicViscosity<dim>::
62-
evaluate (const MaterialModel::MaterialModelInputs<dim> &material_model_inputs,
63-
const MaterialModel::MaterialModelOutputs<dim> &material_model_outputs,
64-
HeatingModel::HeatingModelOutputs &heating_model_outputs) const
65-
{
66-
Assert(heating_model_outputs.heating_source_terms.size() == material_model_inputs.position.size(),
67-
ExcMessage ("Heating outputs need to have the same number of entries as the material model inputs."));
68-
69-
// Some material models provide dislocation viscosities and boundary area work fractions
70-
// as additional material outputs. If they are attached, use them.
71-
const std::shared_ptr<const ShearHeatingOutputs<dim>> shear_heating_out =
72-
material_model_outputs.template get_additional_output_object<ShearHeatingOutputs<dim>>();
73-
74-
const std::shared_ptr<const MaterialModel::AnisotropicViscosity<dim>> anisotropic_viscosity =
75-
material_model_outputs.template get_additional_output_object<MaterialModel::AnisotropicViscosity<dim>>();
76-
77-
for (unsigned int q=0; q<heating_model_outputs.heating_source_terms.size(); ++q)
78-
{
79-
// If there is an anisotropic viscosity, use it to compute the correct stress
80-
const SymmetricTensor<2,dim> &directed_strain_rate = ((anisotropic_viscosity != nullptr)
81-
?
82-
anisotropic_viscosity->stress_strain_directors[q]
83-
* material_model_inputs.strain_rate[q]
84-
:
85-
material_model_inputs.strain_rate[q]);
86-
87-
const SymmetricTensor<2,dim> stress =
88-
2 * material_model_outputs.viscosities[q] *
89-
(this->get_material_model().is_compressible()
90-
?
91-
directed_strain_rate - 1./3. * trace(directed_strain_rate) * unit_symmetric_tensor<dim>()
92-
:
93-
directed_strain_rate);
94-
95-
const SymmetricTensor<2,dim> deviatoric_strain_rate =
96-
(this->get_material_model().is_compressible()
97-
?
98-
material_model_inputs.strain_rate[q]
99-
- 1./3. * trace(material_model_inputs.strain_rate[q]) * unit_symmetric_tensor<dim>()
100-
:
101-
material_model_inputs.strain_rate[q]);
102-
103-
heating_model_outputs.heating_source_terms[q] = stress * deviatoric_strain_rate;
104-
105-
// If shear heating work fractions are provided, reduce the
106-
// overall heating by this amount (which is assumed to be converted into other forms of energy)
107-
if (shear_heating_out != nullptr)
108-
heating_model_outputs.heating_source_terms[q] *= shear_heating_out->shear_heating_work_fractions[q];
109-
110-
heating_model_outputs.lhs_latent_heat_terms[q] = 0.0;
111-
}
112-
}
113-
114-
template <int dim>
115-
void
116-
ShearHeatingAnisotropicViscosity<dim>::
117-
create_additional_material_model_outputs(MaterialModel::MaterialModelOutputs<dim> &material_model_outputs) const
118-
{
119-
const unsigned int n_points = material_model_outputs.viscosities.size();
120-
121-
if (material_model_outputs.template has_additional_output_object<MaterialModel::AnisotropicViscosity<dim>>() == false)
122-
{
123-
material_model_outputs.additional_outputs.push_back(
124-
std::make_unique<MaterialModel::AnisotropicViscosity<dim>> (n_points));
125-
}
126-
127-
this->get_material_model().create_additional_named_outputs(material_model_outputs);
128-
}
129-
}
130-
13136
namespace MaterialModel
13237
{
13338
template <int dim>
13439
class Anisotropic : public MaterialModel::Simple<dim>
13540
{
13641
public:
137-
virtual void initialize();
42+
void initialize() override;
13843

139-
virtual void evaluate(const MaterialModel::MaterialModelInputs<dim> &in,
140-
MaterialModel::MaterialModelOutputs<dim> &out) const;
44+
void evaluate(const MaterialModel::MaterialModelInputs<dim> &in,
45+
MaterialModel::MaterialModelOutputs<dim> &out) const override;
14146
static void declare_parameters(ParameterHandler &prm);
142-
virtual void parse_parameters(ParameterHandler &prm);
47+
void parse_parameters(ParameterHandler &prm) override;
14348

14449
/**
14550
* Return true if the compressibility() function returns something that
14651
* is not zero.
14752
*/
148-
virtual bool
149-
is_compressible () const;
53+
bool
54+
is_compressible () const override;
15055

15156
private:
15257
void set_assemblers(const SimulatorAccess<dim> &,
@@ -313,18 +218,6 @@ namespace aspect
313218
// explicit instantiations
314219
namespace aspect
315220
{
316-
namespace HeatingModel
317-
{
318-
ASPECT_REGISTER_HEATING_MODEL(ShearHeatingAnisotropicViscosity,
319-
"anisotropic shear heating",
320-
"Implementation of a standard model for shear heating. "
321-
"Adds the term: "
322-
"$ 2 \\eta \\left( \\varepsilon - \\frac{1}{3} \\text{tr} "
323-
"\\varepsilon \\mathbf 1 \\right) : \\left( \\varepsilon - \\frac{1}{3} "
324-
"\\text{tr} \\varepsilon \\mathbf 1 \\right)$ to the "
325-
"right-hand side of the temperature equation.")
326-
}
327-
328221
namespace MaterialModel
329222
{
330223
ASPECT_REGISTER_MATERIAL_MODEL(Anisotropic,

0 commit comments

Comments
 (0)