PRISMS-PF Manual
Loading...
Searching...
No Matches
mechanics.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: © 2026 PRISMS Center at the University of Michigan
2// SPDX-License-Identifier: GNU Lesser General Public Version 2.1
3
4#pragma once
5
6#include <deal.II/base/tensor.h>
7
8#include <prismspf/config.h>
9
11
12namespace Mechanics
13{
14
18 template <unsigned int dim>
19 constexpr unsigned int voigt_tensor_size = (2 * dim) - 1 + (dim / 3);
20
25 template <unsigned int dim, typename T>
26 inline DEAL_II_ALWAYS_INLINE void
27 compute_stress(const dealii::Tensor<2, voigt_tensor_size<dim>, T> &elasticity_tensor,
28 const dealii::Tensor<1, voigt_tensor_size<dim>, T> &strain,
29 dealii::Tensor<1, voigt_tensor_size<dim>, T> &stress)
30 {
31 stress = elasticity_tensor * strain;
32 }
33
39 template <unsigned int dim, typename T>
40 inline DEAL_II_ALWAYS_INLINE void
41 compute_stress(const dealii::Tensor<2, voigt_tensor_size<dim>, T> &elasticity_tensor,
42 const dealii::Tensor<2, dim, T> &strain,
43 dealii::Tensor<2, dim, T> &stress)
44 {
45 dealii::Tensor<1, voigt_tensor_size<dim>, T> sigma;
46 dealii::Tensor<1, voigt_tensor_size<dim>, T> epsilon;
47
48 if constexpr (dim == 3)
49 {
50 const int xx_dir = 0;
51 const int yy_dir = 1;
52 const int zz_dir = 2;
53 const int yz_dir = 3;
54 const int xz_dir = 4;
55 const int xy_dir = 5;
56
57 epsilon[xx_dir] = strain[xx_dir][xx_dir];
58 epsilon[yy_dir] = strain[yy_dir][yy_dir];
59 epsilon[zz_dir] = strain[zz_dir][zz_dir];
60
61 // In Voigt notation: epsilon are engineering shear strains
62 epsilon[yz_dir] = strain[yy_dir][zz_dir] + strain[zz_dir][yy_dir];
63 epsilon[xz_dir] = strain[xx_dir][zz_dir] + strain[zz_dir][xx_dir];
64 epsilon[xy_dir] = strain[xx_dir][yy_dir] + strain[yy_dir][xx_dir];
65
66 // Multiply elasticity_tensor and epsilon to get sigma
67 sigma = elasticity_tensor * epsilon;
68
69 stress[xx_dir][xx_dir] = sigma[xx_dir];
70 stress[yy_dir][yy_dir] = sigma[yy_dir];
71 stress[zz_dir][zz_dir] = sigma[zz_dir];
72
73 stress[yy_dir][zz_dir] = sigma[yz_dir];
74 stress[zz_dir][yy_dir] = sigma[yz_dir];
75
76 stress[xx_dir][zz_dir] = sigma[xz_dir];
77 stress[zz_dir][xx_dir] = sigma[xz_dir];
78
79 stress[xx_dir][yy_dir] = sigma[xy_dir];
80 stress[yy_dir][xx_dir] = sigma[xy_dir];
81 }
82 else if constexpr (dim == 2)
83 {
84 const int xx_dir = 0;
85 const int yy_dir = 1;
86 const int xy_dir = 2;
87
88 epsilon[xx_dir] = strain[xx_dir][xx_dir];
89 epsilon[yy_dir] = strain[yy_dir][yy_dir];
90
91 // In Voigt notation: epsilon are engineering shear strains
92 epsilon[xy_dir] = strain[xx_dir][yy_dir] + strain[yy_dir][xx_dir];
93
94 // Multiply elasticity_tensor and epsilon to get sigma
95 sigma = elasticity_tensor * epsilon;
96
97 stress[xx_dir][xx_dir] = sigma[xx_dir];
98 stress[yy_dir][yy_dir] = sigma[yy_dir];
99 stress[xx_dir][yy_dir] = sigma[xy_dir];
100 stress[yy_dir][xx_dir] = sigma[xy_dir];
101 }
102 else
103 {
104 const int xx_dir = 0;
105
106 stress[xx_dir][xx_dir] =
107 elasticity_tensor[xx_dir][xx_dir] * strain[xx_dir][xx_dir];
108 }
109 }
110
111} // namespace Mechanics
112
113PRISMS_PF_END_NAMESPACE
Definition mechanics.h:13
constexpr unsigned int voigt_tensor_size
Voigt notation index range.
Definition mechanics.h:19
DEAL_II_ALWAYS_INLINE void compute_stress(const dealii::Tensor< 2, voigt_tensor_size< dim >, T > &elasticity_tensor, const dealii::Tensor< 1, voigt_tensor_size< dim >, T > &strain, dealii::Tensor< 1, voigt_tensor_size< dim >, T > &stress)
Compute the stress with a given displacement and elasticity tensor. This assumes that the provided pa...
Definition mechanics.h:27
Definition conditional_ostreams.cc:20