Skip to content

Commit e56dca8

Browse files
authored
Merge branch 'main' into ralberd/add_snap_example
2 parents 2bc21be + 6782079 commit e56dca8

File tree

2 files changed

+25
-37
lines changed

2 files changed

+25
-37
lines changed

optimism/material/HyperViscoelastic.py

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def compute_state_new(dispGrad, state, dt):
2929
return state
3030

3131
def compute_material_qoi(dispGrad, state, dt):
32-
return _compute_dissipation(dispGrad, state, dt, props)
32+
return _compute_dissipated_energy(dispGrad, state, dt, props)
3333

3434
return MaterialModel(compute_energy_density = energy_density,
3535
compute_initial_state = compute_initial_state,
@@ -63,9 +63,11 @@ def _energy_density(dispGrad, state, dt, props):
6363
Ee = Ee_trial - delta_Ev
6464

6565
W_neq = _neq_strain_energy(Ee, props)
66-
Psi = _incremental_dissipated_energy(Ee, dt, props)
66+
67+
Dv = delta_Ev / dt
68+
Psi = _dissipation_potential(Dv, props)
6769

68-
return W_eq + W_neq + Psi
70+
return W_eq + W_neq + dt * Psi
6971

7072
def _eq_strain_energy(dispGrad, props):
7173
K, G = props[PROPS_K_eq], props[PROPS_G_eq]
@@ -81,22 +83,19 @@ def _neq_strain_energy(elasticStrain, props):
8183
G_neq = props[PROPS_G_neq]
8284
return G_neq * TensorMath.norm_of_deviator_squared(elasticStrain)
8385

84-
def _incremental_dissipated_energy(elasticStrain, dt, props):
86+
def _dissipation_potential(Dv, props):
8587
G_neq = props[PROPS_G_neq]
8688
tau = props[PROPS_TAU]
8789
eta = G_neq * tau
8890

89-
Me = 2. * G_neq * elasticStrain
90-
M_bar = TensorMath.norm_of_deviator_squared(Me)
91-
92-
return 0.5 * dt * M_bar / eta
91+
return eta * TensorMath.norm_of_deviator_squared(Dv)
9392

94-
def _compute_dissipation(dispGrad, state, dt, props):
93+
def _compute_dissipated_energy(dispGrad, state, dt, props):
9594
Ee_trial = _compute_elastic_logarithmic_strain(dispGrad, state)
9695
delta_Ev = _compute_state_increment(Ee_trial, dt, props)
97-
Ee = Ee_trial - delta_Ev
9896

99-
return _incremental_dissipated_energy(Ee, dt, props)
97+
Dv = delta_Ev / dt
98+
return dt * _dissipation_potential(Dv, props)
10099

101100
def _compute_state_new(dispGrad, stateOld, dt, props):
102101
Ee_trial = _compute_elastic_logarithmic_strain(dispGrad, stateOld)

test/material/test_HyperVisco.py

Lines changed: 15 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ def setUp(self):
2121
G_neq_1 = 5.0
2222
tau_1 = 25.0
2323
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
2526
self.props = {
2627
'equilibrium bulk modulus' : K_eq,
2728
'equilibrium shear modulus' : G_eq,
@@ -52,26 +53,23 @@ def test_loading_only(self):
5253
state_old = self.compute_initial_state()
5354
energies = np.zeros(n_steps)
5455
states = np.zeros((n_steps, state_old.shape[0]))
56+
dissipated_energies = np.zeros(n_steps)
5557

5658
# numerical solution
5759
for n, F in enumerate(Fs):
5860
dispGrad = F - np.eye(3)
5961
energies = energies.at[n].set(self.energy_density(dispGrad, state_old, dt))
6062
state_new = self.compute_state_new(dispGrad, state_old, dt)
6163
states = states.at[n, :].set(state_new)
64+
dissipated_energies = dissipated_energies.at[n].set(self.compute_material_qoi(dispGrad, state_old, dt))
6265
state_old = state_new
6366

64-
6567
Fvs = jax.vmap(lambda Fv: Fv.reshape((3, 3)))(states)
6668
Fes = jax.vmap(lambda F, Fv: F @ np.linalg.inv(Fv), in_axes=(0, 0))(Fs, Fvs)
6769

6870
Evs = jax.vmap(lambda Fv: log_symm(Fv))(Fvs)
6971
Ees = jax.vmap(lambda Fe: log_symm(Fe))(Fes)
7072

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-
7573
# analytic solution
7674
e_v_11 = (2. / 3.) * strain_rate * times - \
7775
(2. / 3.) * strain_rate * self.tau_1 * (1. - np.exp(-times / self.tau_1))
@@ -86,38 +84,27 @@ def test_loading_only(self):
8684
[0., 0., e_22]]
8785
), in_axes=(0, 0)
8886
)(e_e_11, e_e_22)
87+
8988
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)
9291

9392
# test
9493
self.assertArrayNear(Evs[:, 0, 0], e_v_11, 3)
9594
self.assertArrayNear(Ees[:, 0, 0], e_e_11, 3)
9695
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)
9897

9998
if plotting:
10099
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)
113100
plt.plot(times, Evs[:, 0, 0], marker='o', linestyle='None', markevery=10)
114101
plt.plot(times, e_v_11, linestyle='--')
115102
plt.xlabel('Time (s)')
116103
plt.ylabel('Viscous Logarithmic Strain 11 component')
117104
plt.legend(["Numerical", "Analytic"], loc=0, frameon=True)
118105
plt.savefig('times_viscous_stretch.png')
119106

120-
plt.figure(4)
107+
plt.figure(2)
121108
plt.plot(times, Ees[:, 0, 0], marker='o', linestyle='None', markevery=10, label='11', color='blue')
122109
plt.plot(times, Ees[:, 1, 1], marker='o', linestyle='None', markevery=10, label='22', color='red')
123110
plt.plot(times, e_e_11, linestyle='--', color='blue')
@@ -127,11 +114,13 @@ def test_loading_only(self):
127114
plt.legend(["11 Numerical", "22 Numerical", "11 Analytic", "22 Analytic"], loc=0, frameon=True)
128115
plt.savefig('times_elastic_stretch.png')
129116

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)')
133122
plt.legend(["Numerical", "Analytic"], loc=0, frameon=True)
134-
plt.savefig('times_dissipation.png')
123+
plt.savefig('times_dissipated_energy.png')
135124

136125

137126

0 commit comments

Comments
 (0)