@@ -21,7 +21,8 @@ def setUp(self):
21
21
G_neq_1 = 5.0
22
22
tau_1 = 25.0
23
23
self .G_neq_1 = G_neq_1
24
- self .tau_1 = tau_1 # needed for analytic calculation below
24
+ self .tau_1 = tau_1
25
+ self .eta = G_neq_1 * tau_1
25
26
self .props = {
26
27
'equilibrium bulk modulus' : K_eq ,
27
28
'equilibrium shear modulus' : G_eq ,
@@ -52,26 +53,23 @@ def test_loading_only(self):
52
53
state_old = self .compute_initial_state ()
53
54
energies = np .zeros (n_steps )
54
55
states = np .zeros ((n_steps , state_old .shape [0 ]))
56
+ dissipated_energies = np .zeros (n_steps )
55
57
56
58
# numerical solution
57
59
for n , F in enumerate (Fs ):
58
60
dispGrad = F - np .eye (3 )
59
61
energies = energies .at [n ].set (self .energy_density (dispGrad , state_old , dt ))
60
62
state_new = self .compute_state_new (dispGrad , state_old , dt )
61
63
states = states .at [n , :].set (state_new )
64
+ dissipated_energies = dissipated_energies .at [n ].set (self .compute_material_qoi (dispGrad , state_old , dt ))
62
65
state_old = state_new
63
66
64
-
65
67
Fvs = jax .vmap (lambda Fv : Fv .reshape ((3 , 3 )))(states )
66
68
Fes = jax .vmap (lambda F , Fv : F @ np .linalg .inv (Fv ), in_axes = (0 , 0 ))(Fs , Fvs )
67
69
68
70
Evs = jax .vmap (lambda Fv : log_symm (Fv ))(Fvs )
69
71
Ees = jax .vmap (lambda Fe : log_symm (Fe ))(Fes )
70
72
71
- Dvs = jax .vmap (lambda Ee : (1. / self .tau_1 ) * deviator (Ee ))(Ees )
72
- Mes = jax .vmap (lambda Ee : 2. * self .G_neq_1 * deviator (Ee ))(Ees )
73
- dissipations = jax .vmap (lambda D , M : np .tensordot (D , M ), in_axes = (0 , 0 ))(Dvs , Mes )
74
-
75
73
# analytic solution
76
74
e_v_11 = (2. / 3. ) * strain_rate * times - \
77
75
(2. / 3. ) * strain_rate * self .tau_1 * (1. - np .exp (- times / self .tau_1 ))
@@ -86,38 +84,27 @@ def test_loading_only(self):
86
84
[0. , 0. , e_22 ]]
87
85
), in_axes = (0 , 0 )
88
86
)(e_e_11 , e_e_22 )
87
+
89
88
Me_analytic = jax .vmap (lambda Ee : 2. * self .G_neq_1 * deviator (Ee ))(Ee_analytic )
90
- Dv_analytic = jax .vmap (lambda Me : 1. / (2. * self .G_neq_1 * self . tau_1 ) * deviator (Me ))(Me_analytic )
91
- dissipations_analytic = jax .vmap (lambda Me , Dv : np .tensordot (Me , Dv ), in_axes = ( 0 , 0 ))( Me_analytic , Dv_analytic )
89
+ Dv_analytic = jax .vmap (lambda Me : 1. / (2. * self .eta ) * deviator (Me ))(Me_analytic )
90
+ dissipated_energies_analytic = jax .vmap (lambda Dv : dt * self . eta * np .tensordot (deviator ( Dv ), deviator ( Dv )) )( Dv_analytic )
92
91
93
92
# test
94
93
self .assertArrayNear (Evs [:, 0 , 0 ], e_v_11 , 3 )
95
94
self .assertArrayNear (Ees [:, 0 , 0 ], e_e_11 , 3 )
96
95
self .assertArrayNear (Ees [:, 1 , 1 ], e_e_22 , 3 )
97
- self .assertArrayNear (dissipations , dissipations_analytic , 3 )
96
+ self .assertArrayNear (dissipated_energies , dissipated_energies_analytic , 3 )
98
97
99
98
if plotting :
100
99
plt .figure (1 )
101
- plt .plot (times , np .log (Fs [:, 0 , 0 ]))
102
- plt .xlabel ('Time (s)' )
103
- plt .ylabel ('F 11' )
104
- plt .savefig ('times_Fs.png' )
105
-
106
- plt .figure (2 )
107
- plt .plot (times , energies )
108
- plt .xlabel ('Time (s)' )
109
- plt .ylabel ('Algorithmic energy' )
110
- plt .savefig ('times_energies.png' )
111
-
112
- plt .figure (3 )
113
100
plt .plot (times , Evs [:, 0 , 0 ], marker = 'o' , linestyle = 'None' , markevery = 10 )
114
101
plt .plot (times , e_v_11 , linestyle = '--' )
115
102
plt .xlabel ('Time (s)' )
116
103
plt .ylabel ('Viscous Logarithmic Strain 11 component' )
117
104
plt .legend (["Numerical" , "Analytic" ], loc = 0 , frameon = True )
118
105
plt .savefig ('times_viscous_stretch.png' )
119
106
120
- plt .figure (4 )
107
+ plt .figure (2 )
121
108
plt .plot (times , Ees [:, 0 , 0 ], marker = 'o' , linestyle = 'None' , markevery = 10 , label = '11' , color = 'blue' )
122
109
plt .plot (times , Ees [:, 1 , 1 ], marker = 'o' , linestyle = 'None' , markevery = 10 , label = '22' , color = 'red' )
123
110
plt .plot (times , e_e_11 , linestyle = '--' , color = 'blue' )
@@ -127,11 +114,13 @@ def test_loading_only(self):
127
114
plt .legend (["11 Numerical" , "22 Numerical" , "11 Analytic" , "22 Analytic" ], loc = 0 , frameon = True )
128
115
plt .savefig ('times_elastic_stretch.png' )
129
116
130
- plt .figure (5 )
131
- plt .plot (times , dissipations , marker = 'o' , linestyle = 'None' , markevery = 10 )
132
- plt .plot (times , dissipations_analytic , linestyle = '--' )
117
+ plt .figure (3 )
118
+ plt .plot (times , np .cumsum (dissipated_energies ), marker = 'o' , linestyle = 'None' , markevery = 10 )
119
+ plt .plot (times , np .cumsum (dissipated_energies_analytic ), linestyle = '--' )
120
+ plt .xlabel ('Time (s)' )
121
+ plt .ylabel ('Dissipated Energy Density (MPa)' )
133
122
plt .legend (["Numerical" , "Analytic" ], loc = 0 , frameon = True )
134
- plt .savefig ('times_dissipation .png' )
123
+ plt .savefig ('times_dissipated_energy .png' )
135
124
136
125
137
126
0 commit comments