forked from christophmschaefer/miluphcuda
-
Notifications
You must be signed in to change notification settings - Fork 0
/
stress.cu
137 lines (119 loc) · 4.1 KB
/
stress.cu
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/**
* @author Christoph Schaefer cm.schaefer@gmail.com
*
* @section LICENSE
* Copyright (c) 2019 Christoph Schaefer
*
* This file is part of miluphcuda.
*
* miluphcuda is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* miluphcuda is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with miluphcuda. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "stress.h"
#include "parameter.h"
#include "miluph.h"
#include "timeintegration.h"
#include "linalg.h"
#if FRAGMENTATION
#warning DAMAGE_ACTS_ON_PRINCIPAL_STRESSES is defined in stress.cu
// if 1, then damage reduces the principal stresses
// if 0, then p<0 -> (1-d) p and S -> (1-d) S
# define DAMAGE_ACTS_ON_PRINCIPAL_STRESSES 0
#else
# define DAMAGE_ACTS_ON_PRINCIPAL_STRESSES 0
#endif
// principal axes damage does not work for pressure dependent yield strengths
#if DAMAGE_ACTS_ON_PRINCIPAL_STRESSES && COLLINS_PRESSURE_DEPENDENT_YIELD_STRENGTH
#error Do not combine DAMAGE_ACTS_ON_PRINCIPAL_STRESSES and COLLINS_PRESSURE_DEPENDENT_YIELD_STRENGTH
#endif
#if SOLID
__global__ void set_stress_tensor(void)
{
register int i, inc, matId;
int d, e;
int niters;
double sigma[DIM][DIM];
double sigmatmp[DIM][DIM];
double rotation_matrix[DIM][DIM];
double main_stresses[DIM];
double max_ev;
double damage = 0.0;
double stress_damage = 0.0;
inc = blockDim.x * gridDim.x;
for (i = threadIdx.x + blockIdx.x * blockDim.x; i < numParticles; i += inc) {
matId = p_rhs.materialId[i];
niters = 0;
// here we set the stress tensor sigma from pressure and deviatoric stress S
// note, that S was already lowered in plasticity
#if FRAGMENTATION
damage = pow(p.damage_total[i], DIM);
if (damage > 1.0) damage = 1.0;
stress_damage = damage;
// special handling of granular media with pressure dependent yield strengths
# if COLLINS_PRESSURE_DEPENDENT_YIELD_STRENGTH
if (!(damage < 1)) {
stress_damage = 0.0;
}
# endif
#else
damage = 0.0;
stress_damage = 0.0;
#endif
#if DAMAGE_ACTS_ON_PRINCIPAL_STRESSES
for (d = 0; d < DIM; d++) {
for (e = 0; e < DIM; e++) {
sigmatmp[d][e] = 0.0;
sigma[d][e] = p.S[stressIndex(i, d, e)];
if (d == e) {
sigma[d][e] += -p.p[i];
}
}
}
// calculate main stresses
niters = calculate_all_eigenvalues(sigma, main_stresses, rotation_matrix);
for (d = 0; d < DIM; d++) {
sigmatmp[d][d] = main_stresses[d];
if (sigmatmp[d][d] > 0) {
sigmatmp[d][d] *= (1.0 - damage);
}
}
// rotate back the lowered principal stresses
multiply_matrix(sigmatmp, rotation_matrix, sigma);
transpose_matrix(rotation_matrix);
multiply_matrix(rotation_matrix, sigma, sigmatmp);
// sigmatmp now holds the stress tensor for particle i with damaged reduced stresses
copy_matrix(sigmatmp, sigma);
#else
for (d = 0; d < DIM; d++) {
for (e = 0; e < DIM; e++) {
sigma[d][e] = (1.0 - stress_damage) * p.S[stressIndex(i, d, e)];
if (d == e) { // the trace
if (p.p[i] < 0) {
sigma[d][e] += - (1.0 - damage) * p.p[i];
} else {
sigma[d][e] += -p.p[i];
}
}
}
}
#endif
// remember sigma
for (d = 0; d < DIM; d++) {
for (e = 0; e < DIM; e++) {
p_rhs.sigma[stressIndex(i,d,e)] = sigma[d][e];
}
}
}
}
#endif