Skip to content

Commit e2a1a17

Browse files
committed
make deviator() and second_invariant() consistent with plane strain assumption in 2D
1 parent d05c373 commit e2a1a17

23 files changed

+107
-46
lines changed

include/aspect/utilities.h

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1407,6 +1407,29 @@ namespace aspect
14071407
// Declare the existence of a specialization:
14081408
template <>
14091409
const Tensor<3,3> &levi_civita<3>();
1410+
1411+
/**
1412+
* Compute the deviator of a symmetric tensor. Unlike the function with the same name in
1413+
* deal.II, this function is consistent with the plane strain assumption when dim = 2.
1414+
* Specifically, the deviator of the stress tensor $\mathbf\tau$ in 2D is given by
1415+
* $\text{dev}(\mathbf\tau) = \mathbf\tau - \frac{1}{3}\text{trace}(\mathbf\tau)\mathbf 1$
1416+
* under the plane strain assumption.
1417+
*/
1418+
template <int dim>
1419+
SymmetricTensor<2,dim>
1420+
deviator(const SymmetricTensor<2,dim> &input);
1421+
1422+
/**
1423+
* Compute the second invariant of a deviatoric tensor of rank 2. Unlike the function
1424+
* named "second_invariant" in deal.II, this function is consistent with the plane
1425+
* strain assumption when dim = 2. Specifically, the second invariant of the deviatoric
1426+
* stress tensor $\tau_{II}$ in 2D is given by $\tau_{II} = -\frac{1}{2}(\tau_{11}^2 +
1427+
* \tau_{22}^2 + \tau_{33}^2 + 2\tau_{12}^2) = -\frac{1}{2}[\tau_{11}^2 + \tau_{22}^2 +
1428+
* (\tau_{11} + \tau_{22})^2 + 2\tau_{12}^2]$ under the plane strain assumption.
1429+
*/
1430+
template <int dim>
1431+
double
1432+
deviatoric_tensor_inv2(const SymmetricTensor<2,dim> &input);
14101433
}
14111434

14121435
}

source/heating_model/shear_heating.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ namespace aspect
7676
drucker_prager_parameters);
7777

7878
// Scale the stress accordingly.
79-
const double deviatoric_stress = 2 * material_model_outputs.viscosities[q] * std::sqrt(std::fabs(second_invariant(deviatoric_strain_rate)));
79+
const double deviatoric_stress = 2 * material_model_outputs.viscosities[q] * std::sqrt(std::fabs(Utilities::Tensors::deviatoric_tensor_inv2(deviatoric_strain_rate)));
8080
double scaling_factor = 1.0;
8181
if (deviatoric_stress > 0.0)
8282
scaling_factor = std::min(yield_stress / deviatoric_stress, 1.0);

source/material_model/drucker_prager.cc

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ namespace aspect
5353
Assert(std::isfinite(in.strain_rate[i].norm()),
5454
ExcMessage("Invalid strain_rate in the MaterialModelInputs. This is likely because it was "
5555
"not filled by the caller."));
56-
const SymmetricTensor<2,dim> strain_rate_deviator = deviator(in.strain_rate[i]);
56+
const SymmetricTensor<2,dim> strain_rate_deviator = Utilities::Tensors::deviator(in.strain_rate[i]);
5757

5858
// For the very first time this function is called
5959
// (the first iteration of the first timestep), this function is called
@@ -64,8 +64,8 @@ namespace aspect
6464
// In later iterations and timesteps we calculate the second moment
6565
// invariant of the deviatoric strain rate tensor.
6666
// This is equal to the negative of the second principle
67-
// invariant of the deviatoric strain rate (calculated with the function second_invariant),
68-
// as shown in Appendix A of Zienkiewicz and Taylor (Solid Mechanics, 2000).
67+
// invariant of the deviatoric strain rate, as shown in Appendix A of
68+
// Zienkiewicz and Taylor (Solid Mechanics, 2000).
6969
//
7070
// The negative of the second principle invariant is equal to 0.5 e_dot_dev_ij e_dot_dev_ji,
7171
// where e_dot_dev is the deviatoric strain rate tensor. The square root of this quantity
@@ -78,7 +78,7 @@ namespace aspect
7878
// initialized. This might mean that we are
7979
// in a unit test, or at least that we can't
8080
// rely on any simulator information
81-
std::fabs(second_invariant(strain_rate_deviator))
81+
std::fabs(Utilities::Tensors::deviatoric_tensor_inv2(strain_rate_deviator))
8282
:
8383
// simulator object is available, but we need to treat the
8484
// first time step separately
@@ -88,7 +88,7 @@ namespace aspect
8888
?
8989
reference_strain_rate * reference_strain_rate
9090
:
91-
std::fabs(second_invariant(strain_rate_deviator))));
91+
std::fabs(Utilities::Tensors::deviatoric_tensor_inv2(strain_rate_deviator))));
9292

9393
const double strain_rate_effective = edot_ii_strict;
9494

source/material_model/entropy_model.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ namespace aspect
253253
drucker_prager_parameters);
254254
}
255255

256-
const double strain_rate_effective = std::fabs(second_invariant(deviator(in.strain_rate[i])));
256+
const double strain_rate_effective = std::fabs(Utilities::Tensors::deviatoric_tensor_inv2(Utilities::Tensors::deviator(in.strain_rate[i])));
257257

258258
if (std::sqrt(strain_rate_effective) >= std::numeric_limits<double>::min())
259259
{

source/material_model/grain_size.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ namespace aspect
199199

200200
const double strain_rate_dependence = (1.0 - dislocation_creep_exponent[phase_index]) / dislocation_creep_exponent[phase_index];
201201
const SymmetricTensor<2,dim> shear_strain_rate = strain_rate - 1./dim * trace(strain_rate) * unit_symmetric_tensor<dim>();
202-
const double second_strain_rate_invariant = std::sqrt(std::max(-second_invariant(shear_strain_rate), 0.));
202+
const double second_strain_rate_invariant = std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(shear_strain_rate), 0.));
203203

204204
// If the strain rate is zero, the dislocation viscosity is infinity.
205205
if (second_strain_rate_invariant <= std::numeric_limits<double>::min())
@@ -221,7 +221,7 @@ namespace aspect
221221
{
222222
const SymmetricTensor<2,dim> dislocation_strain_rate = diffusion_viscosity
223223
/ (diffusion_viscosity + dis_viscosity) * shear_strain_rate;
224-
const double dislocation_strain_rate_invariant = std::sqrt(std::max(-second_invariant(dislocation_strain_rate), 0.));
224+
const double dislocation_strain_rate_invariant = std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(dislocation_strain_rate), 0.));
225225

226226
dis_viscosity_old = dis_viscosity;
227227
dis_viscosity = dislocation_creep_prefactor[phase_index]
@@ -540,8 +540,8 @@ namespace aspect
540540
Assert(std::isfinite(in.strain_rate[i].norm()),
541541
ExcMessage("Invalid strain_rate in the MaterialModelInputs. This is likely because it was "
542542
"not filled by the caller."));
543-
const SymmetricTensor<2,dim> shear_strain_rate = deviator(in.strain_rate[i]);
544-
const double second_strain_rate_invariant = std::sqrt(std::max(-second_invariant(shear_strain_rate), 0.));
543+
const SymmetricTensor<2,dim> shear_strain_rate = Utilities::Tensors::deviator(in.strain_rate[i]);
544+
const double second_strain_rate_invariant = std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(shear_strain_rate), 0.));
545545

546546
const double adiabatic_temperature = this->get_adiabatic_conditions().is_initialized()
547547
?

source/material_model/reaction_model/grain_size_evolution.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ namespace aspect
227227

228228
// grain size reduction in dislocation creep regime
229229
const SymmetricTensor<2,dim> shear_strain_rate = in.strain_rate[i] - 1./dim * trace(in.strain_rate[i]) * unit_symmetric_tensor<dim>();
230-
const double second_strain_rate_invariant = std::sqrt(std::max(-second_invariant(shear_strain_rate), 0.));
230+
const double second_strain_rate_invariant = std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(shear_strain_rate), 0.));
231231

232232
const double current_diffusion_viscosity = diffusion_viscosity(in.temperature[i], adiabatic_temperature, pressures[i], grain_size, second_strain_rate_invariant, phase_indices[i]);
233233
current_dislocation_viscosity = dislocation_viscosity(in.temperature[i], adiabatic_temperature, pressures[i], in.strain_rate[i], phase_indices[i], current_diffusion_viscosity, current_dislocation_viscosity);

source/material_model/rheology/composite_visco_plastic.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ namespace aspect
161161
// to prevent a division-by-zero, and a floating point exception.
162162
// Otherwise, calculate the square-root of the norm of the second invariant of the deviatoric-
163163
// strain rate (often simplified as epsilondot_ii)
164-
const double edot_ii = std::max(std::sqrt(std::max(-second_invariant(deviator(strain_rate)), 0.)),
164+
const double edot_ii = std::max(std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(Utilities::Tensors::deviator(strain_rate)), 0.)),
165165
minimum_strain_rate);
166166
const double log_edot_ii = std::log(edot_ii);
167167

@@ -475,7 +475,7 @@ namespace aspect
475475
// to prevent a division-by-zero, and a floating point exception.
476476
// Otherwise, calculate the square-root of the norm of the second invariant of the deviatoric-
477477
// strain rate (often simplified as epsilondot_ii)
478-
const double edot_ii = std::max(std::sqrt(std::max(-second_invariant(deviator(strain_rate)), 0.)),
478+
const double edot_ii = std::max(std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(Utilities::Tensors::deviator(strain_rate)), 0.)),
479479
minimum_strain_rate);
480480
const double log_edot_ii = std::log(edot_ii);
481481

source/material_model/rheology/diffusion_dislocation.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ namespace aspect
5151
// to prevent a division-by-zero, and a floating point exception.
5252
// Otherwise, calculate the square-root of the norm of the second invariant of the deviatoric-
5353
// strain rate (often simplified as epsilondot_ii)
54-
const double edot_ii = std::max(std::sqrt(std::max(-second_invariant(deviator(strain_rate)), 0.)),
54+
const double edot_ii = std::max(std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(Utilities::Tensors::deviator(strain_rate)), 0.)),
5555
min_strain_rate);
5656
const double log_edot_ii = std::log(edot_ii);
5757

source/material_model/rheology/elasticity.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ namespace aspect
401401

402402
for (unsigned int i=0; i < in.n_evaluation_points(); ++i)
403403
{
404-
const SymmetricTensor<2, dim> deviatoric_strain_rate = deviator(in.strain_rate[i]);
404+
const SymmetricTensor<2, dim> deviatoric_strain_rate = Utilities::Tensors::deviator(in.strain_rate[i]);
405405

406406
// Get stress from timestep $t$ rotated and advected into the current
407407
// timestep $t+\Delta t_c$ from the compositional fields.
@@ -496,7 +496,7 @@ namespace aspect
496496
for (unsigned int i = 0; i < in.n_evaluation_points(); ++i)
497497
{
498498
const double eta = out.viscosities[i];
499-
const SymmetricTensor<2, dim> deviatoric_strain_rate = deviator(in.strain_rate[i]);
499+
const SymmetricTensor<2, dim> deviatoric_strain_rate = Utilities::Tensors::deviator(in.strain_rate[i]);
500500
const SymmetricTensor<2,dim> stress_0_advected (Utilities::Tensors::to_symmetric_tensor<dim>(&in.composition[i][stress_start_index],
501501
&in.composition[i][stress_start_index]+n_independent_components));
502502
const SymmetricTensor<2,dim> stress_old (Utilities::Tensors::to_symmetric_tensor<dim>(&in.composition[i][stress_start_index+n_independent_components],
@@ -700,7 +700,7 @@ namespace aspect
700700

701701
// Compute the total stress at time t.
702702
const SymmetricTensor<2, dim>
703-
stress_t = 2. * effective_creep_viscosity * deviator(in.strain_rate[i])
703+
stress_t = 2. * effective_creep_viscosity * Utilities::Tensors::deviator(in.strain_rate[i])
704704
+ effective_creep_viscosity / elastic_viscosity * stress_0_t
705705
+ (1. - timestep_ratio) * (1. - effective_creep_viscosity / elastic_viscosity) * stress_old;
706706

@@ -858,7 +858,7 @@ namespace aspect
858858
const double timestep_ratio = calculate_timestep_ratio();
859859

860860
const SymmetricTensor<2, dim>
861-
edot_deviator = deviator(strain_rate) + 0.5 * stress_0_advected / elastic_viscosity
861+
edot_deviator = Utilities::Tensors::deviator(strain_rate) + 0.5 * stress_0_advected / elastic_viscosity
862862
+ 0.5 * (1. - timestep_ratio) * (1. - creep_viscosity/elastic_viscosity) * stress_old / creep_viscosity;
863863

864864
return edot_deviator;

source/material_model/rheology/strain_dependent.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ namespace aspect
457457
&composition[0] + Tensor<2,dim>::n_independent_components));
458458
const SymmetricTensor<2,dim> L = symmetrize( strain * transpose(strain) );
459459

460-
const double strain_ii = std::fabs(second_invariant(L));
460+
const double strain_ii = std::fabs(Utilities::Tensors::deviatoric_tensor_inv2(L));
461461
brittle_weakening = calculate_plastic_weakening(strain_ii, j);
462462
viscous_weakening = calculate_viscous_weakening(strain_ii, j);
463463
break;
@@ -633,7 +633,7 @@ namespace aspect
633633
ExcMessage("Invalid strain_rate in the MaterialModelInputs. This is likely because it was "
634634
"not filled by the caller."));
635635

636-
const double edot_ii = std::max(std::sqrt(std::max(-second_invariant(deviator(in.strain_rate[i])), 0.)),
636+
const double edot_ii = std::max(std::sqrt(std::max(-Utilities::Tensors::deviatoric_tensor_inv2(Utilities::Tensors::deviator(in.strain_rate[i])), 0.)),
637637
min_strain_rate);
638638
double delta_e_ii = edot_ii*this->get_timestep();
639639

0 commit comments

Comments
 (0)