diff --git a/exercises/X0601 - Energy supply and dissipated energy.pdf b/exercises/X0601 - Energy supply and dissipated energy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..74cb696aa151590bc0efe1d9937c12ac6321560c Binary files /dev/null and b/exercises/X0601 - Energy supply and dissipated energy.pdf differ diff --git a/exercises/X0701_Identification of the fracture energy.pdf b/exercises/X0701_Identification of the fracture energy.pdf new file mode 100644 index 0000000000000000000000000000000000000000..637dea1eeccd10f6b5e08c6a3d16cdfe50ff6898 Binary files /dev/null and b/exercises/X0701_Identification of the fracture energy.pdf differ diff --git a/fig/F-w-Gf.png b/fig/F-w-Gf.png new file mode 100644 index 0000000000000000000000000000000000000000..52fc917ac2037d748193bb4c4d997b1a1d398e77 Binary files /dev/null and b/fig/F-w-Gf.png differ diff --git a/fig/beam_GF.odg b/fig/beam_GF.odg new file mode 100644 index 0000000000000000000000000000000000000000..213d2d971056dd09c7d3596b484c15e6ccf4215c Binary files /dev/null and b/fig/beam_GF.odg differ diff --git a/icons/caveat.png b/icons/caveat.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e1fcd94569b0d135b11b7a33fb4ed0d1b6bcdc Binary files /dev/null and b/icons/caveat.png differ diff --git a/icons/warning.png b/icons/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0ba6b8c56d714d2c388e095ae86c0b60be1ca5 Binary files /dev/null and b/icons/warning.png differ diff --git a/pull_out/bmcs_ipw/PO_constant_bond.py b/pull_out/bmcs_ipw/PO_constant_bond.py new file mode 100755 index 0000000000000000000000000000000000000000..3d834829d55884dfa2dfa92ec3c9395f28097dd9 --- /dev/null +++ b/pull_out/bmcs_ipw/PO_constant_bond.py @@ -0,0 +1,344 @@ +import ipywidgets as ipw +import matplotlib.pyplot as plt +import numpy as np +import traits.api as tr + + +def plot_filled_var(ax, xdata, ydata, xlabel='', ylabel='', + color='black', alpha=0.1, ylim=None, xlim=None): + line, = ax.plot(xdata, ydata, color=color) + if xlabel: + ax.set_xlabel(xlabel) + if ylabel: + ax.set_ylabel(ylabel) + if ylim: + ax.set_ylim(*ylim) + if xlim: + ax.set_xlim(*xlim) + ax.fill_between(xdata, ydata, color=color, alpha=alpha) + return line + + +def clear_plot(*axs): + for ax in axs: + ax.collections.clear() + + +def update_filled_plot(ax, line, xdata, ydata, color='green', alpha=0.1): + line.set_ydata(ydata) + line.set_xdata(xdata) + ax.set_xlim(np.min(xdata), np.max(xdata)) + ax.fill_between(xdata, ydata, 0, color=color, alpha=alpha) + + +class PlotModel(tr.HasTraits): + itr = tr.WeakRef + + model = tr.Type + + def init_fields(self, *params): + model = self.model + itr = self.itr + eps_max = model.get_eps_f_x(0, itr.w_max, *params) + eps_min = model.get_eps_m_x(0, itr.w_max, *params) + tau_max = float(itr.tau * 2) + x_range = itr.x_range + w_max = itr.w_max + L_b = itr.L_b + self.line_u_f = plot_filled_var( + itr.ax_u, x_range, + model.get_u_fa_x(x_range, 0, *params), + color='brown', alpha=0.2 + ) + + self.line_u_m = plot_filled_var( + itr.ax_u, x_range, + model.get_u_ma_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel='$u$ [mm]', + color='black', alpha=0.2, + ylim=(0, w_max), xlim=(-L_b, 0) + ) + + self.line_eps_f = plot_filled_var( + itr.ax_eps, x_range, + model.get_eps_m_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\varepsilon$ [mm]', color='green', + ylim=(eps_min, eps_max), xlim=(-L_b, 0) + ) + + self.line_eps_m = plot_filled_var( + itr.ax_eps, x_range, + model.get_eps_f_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\varepsilon$ [mm]', color='green', + ylim=(eps_min, eps_max), xlim=(-L_b, 0) + ) + + self.line_tau = plot_filled_var( + itr.ax_tau, x_range, + model.get_tau_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\tau$ [MPa]', color='red', + ylim=(0, tau_max), xlim=(-L_b, 0) + ) + + def update_fields(self, w, *params): + model = self.model + itr = self.itr + x_range = itr.x_range + u_ma_x = model.get_u_ma_x(x_range, w, *params) + u_fa_x = model.get_u_fa_x(x_range, w, *params) + self.u_max = u_fa_x[-1] + self.u_min = u_ma_x[-1] + eps_f_x = model.get_eps_f_x(x_range, w, *params) + eps_m_x = model.get_eps_m_x(x_range, w, *params) + self.eps_max = eps_f_x[-1] + self.eps_min = eps_m_x[-1] + tau_x = model.get_tau_x(x_range, w, *params) + update_filled_plot(itr.ax_u, self.line_u_f, x_range, u_fa_x, + color='brown', alpha=0.2) + update_filled_plot(itr.ax_u, self.line_u_m, x_range, u_ma_x, + color='black', alpha=0.2) + update_filled_plot(itr.ax_eps, self.line_eps_m, x_range, eps_m_x, + color='green') + update_filled_plot(itr.ax_eps, self.line_eps_f, x_range, eps_f_x, + color='green') + update_filled_plot(itr.ax_tau, self.line_tau, x_range, tau_x, + color='red') + + def init_Pw(self, *params): + itr = self.itr + model = self.model + w_range = itr.w_range + self.line_po = plot_filled_var(itr.ax_po, w_range, + model.get_Pw_pull(w_range, *params), + xlabel=r'$w$ [mm]', ylabel=r'$P$ [N]', color='blue') + w_L_b_range = model.get_w_L_b(w_range, *params) + self.line_po_Lb = plot_filled_var(itr.ax_po, w_L_b_range, + model.get_Pw_pull(w_range, *params), + color='orange', alpha=0.05) + self.Pw_marker, = itr.ax_po.plot(0, 0, marker='o', color='blue') + self.Pw_marker_Lb, = itr.ax_po.plot(0, 0, marker='o', color='orange') + + def update_Pw(self, w, *params): + model = self.model + itr = self.itr + w_range = itr.w_range + w_L_b_current = model.get_w_L_b(w, *params) + w_L_b_range = model.get_w_L_b(w_range, *params) + Pw = model.get_Pw_pull(w_range, *params) + self.P_max = np.max(Pw) + update_filled_plot(itr.ax_po, self.line_po, w_range, Pw, + color='blue', alpha=0.1) + update_filled_plot(itr.ax_po, self.line_po_Lb, w_L_b_range, Pw, + color='orange', alpha=0.05) + + P = model.get_Pw_pull(w, *params) + self.Pw_marker.set_ydata(P) + self.Pw_marker.set_xdata(w) + self.Pw_marker_Lb.set_ydata(P) + self.Pw_marker_Lb.set_xdata(w_L_b_current) + + +class ModelInteract(tr.HasTraits): + + models = tr.List([ + ]) + + py_vars = tr.List(tr.Str) + map_py2sp = tr.Dict + + d = tr.Float(0.03, GEO=True) + h = tr.Float(0.8, GEO=True) + + # define the free parameters as traits with default, min and max values + w_max = tr.Float(1.0) + t = tr.Float(0.0001, min=1e-5, max=1) + tau = tr.Float(0.5, interact=True) + L_b = tr.Float(200, interact=True) + E_f = tr.Float(100000, interact=True) + A_f = tr.Float(20, interact=True) + p = tr.Float(40, interact=True) + E_m = tr.Float(26000, interact=True) + A_m = tr.Float(100, interact=True) + + n_steps = tr.Int(50) + + sliders = tr.Property + + @tr.cached_property + def _get_sliders(self): + traits = self.traits(interact=True) + vals = self.trait_get(interact=True) + slider_names = self.py_vars[1:] + max_vals = {name: getattr(traits, 'max', vals[name] * 2) + for name in slider_names} + t_slider = {'t': ipw.FloatSlider(1e-5, min=1e-5, max=1, step=0.05, + description=r'\(t\)')} + param_sliders = {name: ipw.FloatSlider(value=vals[name], + min=1e-5, + max=max_vals[name], + step=max_vals[name] / + self.n_steps, + description=r'\(%s\)' % self.map_py2sp[name].name) + for (name, _) in traits.items() + } + t_slider.update(param_sliders) + return t_slider + + w_range = tr.Property(tr.Array(np.float_), depends_on='w_max') + + @tr.cached_property + def _get_w_range(self): + return np.linspace(0, self.w_max, 50) + + x_range = tr.Property(tr.Array(np.float_), depends_on='L_b') + + @tr.cached_property + def _get_x_range(self): + return np.linspace(-self.L_b, 0, 100) + + model_plots = tr.Property(tr.List) + + @tr.cached_property + def _get_model_plots(self): + return [PlotModel(itr=self, model=m) for m in self.models] + + def init_fields(self): + self.fig, ((self.ax_po, self.ax_u), (self.ax_eps, self.ax_tau)) = plt.subplots( + 2, 2, figsize=(9, 5), tight_layout=True + ) + values = self.trait_get(interact=True) + params = list(values[py_var] for py_var in self.py_vars[1:]) + for mp in self.model_plots: + mp.init_fields(*params) + mp.init_Pw(*params) + self.ax_po.set_xlim(0, self.w_max * 1.05) + + def clear_fields(self): + clear_plot(self.ax_po, self.ax_u, self.ax_eps, self.ax_tau) + + def update_fields(self, t, **values): + w = t * self.w_max + self.trait_set(**values) + params = list(values[py_var] for py_var in self.py_vars[1:]) + L_b = self.L_b + self.clear_fields() + for mp in self.model_plots: + mp.update_fields(w, *params) + mp.update_Pw(w, *params) + + P_max = np.max(np.array([m.P_max for m in self.model_plots])) + self.ax_po.set_ylim(0, P_max * 1.05) + self.ax_po.set_xlim(0, self.w_max * 1.05) + u_min = np.min(np.array([m.u_min for m in self.model_plots])) + u_max = np.max(np.array([m.u_max for m in self.model_plots] + [1])) + self.ax_u.set_ylim(u_min, u_max * 1.1) + self.ax_u.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + eps_min = np.min(np.array([m.eps_min for m in self.model_plots])) + eps_max = np.max(np.array([m.eps_max for m in self.model_plots])) + self.ax_eps.set_ylim(eps_min, eps_max * 1.1) + self.ax_eps.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + self.ax_tau.set_ylim(0, self.tau * 1.1) + self.ax_tau.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + self.fig.canvas.draw_idle() + + def set_w_max_fields(self, w_max): + self.w_max = w_max + values = {name: slider.value for name, slider in self.sliders.items()} + self.update_fields(**values) + + def interact_fields(self): + self.init_fields() + self.on_w_max_change = self.update_fields + sliders = self.sliders + out = ipw.interactive_output(self.update_fields, sliders) + self.widget_layout(out) + + #========================================================================= + # Interaction on the pull-out curve spatial plot + #========================================================================= + def init_geometry(self): + self.fig, (self.ax_po, self.ax_geo) = plt.subplots( + 1, 2, figsize=(8, 3.4)) # , tight_layout=True) + values = self.trait_get(interact=True) + params = list(values[py_var] for py_var in self.py_vars[1:]) + h = self.h + x_C = np.array([[-1, 0], [0, 0], [0, h], [-1, h]], dtype=np.float_) + self.line_C, = self.ax_geo.fill(*x_C.T, color='gray', alpha=0.3) + for mp in self.model_plots: + mp.line_aw, = self.ax_geo.fill([], [], color='white', alpha=1) + mp.line_F, = self.ax_geo.fill([], [], color='black', alpha=0.8) + mp.line_F0, = self.ax_geo.fill([], [], color='white', alpha=1) + mp.init_Pw(*params) + self.ax_po.set_xlim(0, self.w_max * 1.05) + + def clear_geometry(self): + clear_plot(self.ax_po, self.ax_geo) + + def update_geometry(self, t, **values): + w = t * self.w_max + self.clear_geometry() + self.trait_set(**values) + params = list(values[py_var] for py_var in self.py_vars[1:]) + h = self.h + d = self.d + L_b = self.L_b + f_top = h / 2 + d / 2 + f_bot = h / 2 - d / 2 + self.ax_geo.set_xlim( + xmin=-1.05 * L_b, xmax=max(0.05 * L_b, 1.1 * self.w_max)) + x_C = np.array([[-L_b, 0], [0, 0], [0, h], [-L_b, h]], dtype=np.float_) + self.line_C.set_xy(x_C) + for mp in self.model_plots: + a_val = mp.model.get_aw_pull(w, *params) + width = d * 0.5 + x_a = np.array([[a_val, f_bot - width], [0, f_bot - width], + [0, f_top + width], [a_val, f_top + width]], + dtype=np.float_) + mp.line_aw.set_xy(x_a) + + w_L_b = mp.model.get_w_L_b(w, *params) + x_F = np.array([[-L_b + w_L_b, f_bot], [w, f_bot], + [w, f_top], [-L_b + w_L_b, f_top]], dtype=np.float_) + mp.line_F.set_xy(x_F) + x_F0 = np.array([[-L_b, f_bot], [-L_b + w_L_b, f_bot], + [-L_b + w_L_b, f_top], [-L_b, f_top]], dtype=np.float_) + mp.line_F0.set_xy(x_F0) + + mp.update_Pw(w, *params) + + P_max = np.max(np.array([mp.P_max for mp in self.model_plots])) + self.ax_po.set_ylim(0, P_max * 1.1) + self.ax_po.set_xlim(0, self.w_max * 1.05) + self.fig.canvas.draw_idle() + + def set_w_max(self, w_max): + self.w_max = w_max + values = {name: slider.value for name, slider in self.sliders.items()} + self.on_w_max_change(**values) + + on_w_max_change = tr.Callable + + def interact_geometry(self): + self.init_geometry() + self.on_w_max_change = self.update_geometry + sliders = self.sliders + out = ipw.interactive_output(self.update_geometry, sliders) + self.widget_layout(out) + + def widget_layout(self, out): + sliders = self.sliders + layout = ipw.Layout(grid_template_columns='1fr 1fr') + param_sliders_list = [sliders[py_var] for py_var in self.py_vars[1:]] + t_slider = sliders['t'] + grid = ipw.GridBox(param_sliders_list, layout=layout) + w_max_text = ipw.FloatText( + value=self.w_max, + description=r'w_max', + disabled=False + ) + out_w_max = ipw.interactive_output(self.set_w_max, + {'w_max': w_max_text}) + + hbox = ipw.HBox([t_slider, w_max_text]) + box = ipw.VBox([hbox, grid, out, out_w_max]) + display(box) diff --git a/pull_out/bmcs_ipw/__init__.py b/pull_out/bmcs_ipw/__init__.py new file mode 100755 index 0000000000000000000000000000000000000000..b3dde10d4ff43c7462904e1adda8352ae4e5ed7f --- /dev/null +++ b/pull_out/bmcs_ipw/__init__.py @@ -0,0 +1,2 @@ + +from .ipw_node import IPWNode diff --git a/pull_out/bmcs_ipw/ipw_node.py b/pull_out/bmcs_ipw/ipw_node.py new file mode 100755 index 0000000000000000000000000000000000000000..2649461e15f208f164526cb55ba7ec9e6b91dbd0 --- /dev/null +++ b/pull_out/bmcs_ipw/ipw_node.py @@ -0,0 +1,10 @@ +''' +''' +import ipywidgets as ipw +import matplotlib.pyplot as plt +import numpy as np +import traits.api as tr + + +class IPWNode(tr.HasStrictTraits): + pass diff --git a/pull_out/bmcs_ipw/model_interactor.py b/pull_out/bmcs_ipw/model_interactor.py new file mode 100755 index 0000000000000000000000000000000000000000..580b34ad3572620ddcde07db4b93d3639525b3d3 --- /dev/null +++ b/pull_out/bmcs_ipw/model_interactor.py @@ -0,0 +1,354 @@ +''' +''' +import ipywidgets as ipw +import matplotlib.pyplot as plt +import numpy as np +import traits.api as tr + + +def plot_filled_var(ax, xdata, ydata, xlabel='', ylabel='', + color='black', alpha=0.1, ylim=None, xlim=None): + line, = ax.plot(xdata, ydata, color=color) + if xlabel: + ax.set_xlabel(xlabel) + if ylabel: + ax.set_ylabel(ylabel) + if ylim: + ax.set_ylim(*ylim) + if xlim: + ax.set_xlim(*xlim) + ax.fill_between(xdata, ydata, color=color, alpha=alpha) + return line + + +def clear_plot(*axs): + for ax in axs: + ax.collections.clear() + + +def update_filled_plot(ax, line, xdata, ydata, color='green', alpha=0.1): + line.set_ydata(ydata) + line.set_xdata(xdata) + ax.set_xlim(np.min(xdata), np.max(xdata)) + ax.fill_between(xdata, ydata, 0, color=color, alpha=alpha) + + +class PlotModel(tr.HasTraits): + itr = tr.WeakRef + + model = tr.Type + + def init_fields(self, *params): + model = self.model + itr = self.itr + eps_max = model.get_eps_f_x(0, itr.w_max, *params) + eps_min = model.get_eps_m_x(0, itr.w_max, *params) + tau_max = float(itr.tau * 2) + x_range = itr.x_range + w_max = itr.w_max + L_b = itr.L_b + self.line_u_f = plot_filled_var( + itr.ax_u, x_range, + model.get_u_fa_x(x_range, 0, *params), + color='brown', alpha=0.2 + ) + + self.line_u_m = plot_filled_var( + itr.ax_u, x_range, + model.get_u_ma_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel='$u$ [mm]', + color='black', alpha=0.2, + ylim=(0, w_max), xlim=(-L_b, 0) + ) + + self.line_eps_f = plot_filled_var( + itr.ax_eps, x_range, + model.get_eps_m_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\varepsilon$ [mm]', color='green', + ylim=(eps_min, eps_max), xlim=(-L_b, 0) + ) + + self.line_eps_m = plot_filled_var( + itr.ax_eps, x_range, + model.get_eps_f_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\varepsilon$ [mm]', color='green', + ylim=(eps_min, eps_max), xlim=(-L_b, 0) + ) + + self.line_tau = plot_filled_var( + itr.ax_tau, x_range, + model.get_tau_x(x_range, 0, *params), + xlabel='$x$ [mm]', ylabel=r'$\tau$ [MPa]', color='red', + ylim=(0, tau_max), xlim=(-L_b, 0) + ) + + def update_fields(self, w, *params): + model = self.model + itr = self.itr + x_range = itr.x_range + u_ma_x = model.get_u_ma_x(x_range, w, *params) + u_fa_x = model.get_u_fa_x(x_range, w, *params) + self.u_max = u_fa_x[-1] + self.u_min = u_ma_x[-1] + eps_f_x = model.get_eps_f_x(x_range, w, *params) + eps_m_x = model.get_eps_m_x(x_range, w, *params) + self.eps_max = eps_f_x[-1] + self.eps_min = eps_m_x[-1] + tau_x = model.get_tau_x(x_range, w, *params) + update_filled_plot(itr.ax_u, self.line_u_f, x_range, u_fa_x, + color='brown', alpha=0.2) + update_filled_plot(itr.ax_u, self.line_u_m, x_range, u_ma_x, + color='black', alpha=0.2) + update_filled_plot(itr.ax_eps, self.line_eps_m, x_range, eps_m_x, + color='green') + update_filled_plot(itr.ax_eps, self.line_eps_f, x_range, eps_f_x, + color='green') + update_filled_plot(itr.ax_tau, self.line_tau, x_range, tau_x, + color='red') + + def init_Pw(self, *params): + itr = self.itr + model = self.model + w_range = itr.w_range + self.line_po = plot_filled_var(itr.ax_po, w_range, + model.get_Pw_pull(w_range, *params), + xlabel=r'$w$ [mm]', ylabel=r'$P$ [N]', color='blue') + w_L_b_range = model.get_w_L_b(w_range, *params) + self.line_po_Lb = plot_filled_var(itr.ax_po, w_L_b_range, + model.get_Pw_pull(w_range, *params), + color='orange', alpha=0.05) + self.Pw_marker, = itr.ax_po.plot(0, 0, marker='o', color='blue') + self.Pw_marker_Lb, = itr.ax_po.plot(0, 0, marker='o', color='orange') + + def update_Pw(self, w, *params): + model = self.model + itr = self.itr + w_range = itr.w_range + w_L_b_current = model.get_w_L_b(w, *params) + w_L_b_range = model.get_w_L_b(w_range, *params) + Pw = model.get_Pw_pull(w_range, *params) + self.P_max = np.max(Pw) + update_filled_plot(itr.ax_po, self.line_po, w_range, Pw, + color='blue', alpha=0.1) + update_filled_plot(itr.ax_po, self.line_po_Lb, w_L_b_range, Pw, + color='orange', alpha=0.05) + + P = model.get_Pw_pull(w, *params) + self.Pw_marker.set_ydata(P) + self.Pw_marker.set_xdata(w) + self.Pw_marker_Lb.set_ydata(P) + self.Pw_marker_Lb.set_xdata(w_L_b_current) + + +class ModelInteractor(tr.HasTraits): + + model = tr.List([ + ]) + + model_components = tr.Property() + + @tr.cached_property + def _get_model_components(self): + for tr in self.model.trait_get(report=True).values(): + yield tr + self.get_ipw_model_components(tr) + + py_vars = tr.List(tr.Str) + map_py2sp = tr.Dict + + d = tr.Float(0.03, GEO=True) + h = tr.Float(0.8, GEO=True) + + # define the free parameters as traits with default, min and max values + w_max = tr.Float(1.0) + t = tr.Float(0.0001, min=1e-5, max=1) + tau = tr.Float(0.5, interact=True) + L_b = tr.Float(200, interact=True) + E_f = tr.Float(100000, interact=True) + A_f = tr.Float(20, interact=True) + p = tr.Float(40, interact=True) + E_m = tr.Float(26000, interact=True) + A_m = tr.Float(100, interact=True) + + n_steps = tr.Int(50) + + sliders = tr.Property + + @tr.cached_property + def _get_sliders(self): + traits = self.traits(interact=True) + vals = self.trait_get(interact=True) + slider_names = self.py_vars[1:] + max_vals = {name: getattr(traits, 'max', vals[name] * 2) + for name in slider_names} + t_slider = {'t': ipw.FloatSlider(1e-5, min=1e-5, max=1, step=0.05, + description=r'\(t\)')} + param_sliders = {name: ipw.FloatSlider(value=vals[name], + min=1e-5, + max=max_vals[name], + step=max_vals[name] / + self.n_steps, + description=r'\(%s\)' % self.map_py2sp[name].name) + for (name, _) in traits.items() + } + t_slider.update(param_sliders) + return t_slider + + w_range = tr.Property(tr.Array(np.float_), depends_on='w_max') + + @tr.cached_property + def _get_w_range(self): + return np.linspace(0, self.w_max, 50) + + x_range = tr.Property(tr.Array(np.float_), depends_on='L_b') + + @tr.cached_property + def _get_x_range(self): + return np.linspace(-self.L_b, 0, 100) + + model_plots = tr.Property(tr.List) + + @tr.cached_property + def _get_model_plots(self): + return [PlotModel(itr=self, model=m) for m in self.models] + + def init_fields(self): + self.fig, ((self.ax_po, self.ax_u), (self.ax_eps, self.ax_tau)) = plt.subplots( + 2, 2, figsize=(9, 5), tight_layout=True + ) + values = self.trait_get(interact=True) + params = list(values[py_var] for py_var in self.py_vars[1:]) + for mp in self.model_plots: + mp.init_fields(*params) + mp.init_Pw(*params) + self.ax_po.set_xlim(0, self.w_max * 1.05) + + def clear_fields(self): + clear_plot(self.ax_po, self.ax_u, self.ax_eps, self.ax_tau) + + def update_fields(self, t, **values): + w = t * self.w_max + self.trait_set(**values) + params = list(values[py_var] for py_var in self.py_vars[1:]) + L_b = self.L_b + self.clear_fields() + for mp in self.model_plots: + mp.update_fields(w, *params) + mp.update_Pw(w, *params) + + P_max = np.max(np.array([m.P_max for m in self.model_plots])) + self.ax_po.set_ylim(0, P_max * 1.05) + self.ax_po.set_xlim(0, self.w_max * 1.05) + u_min = np.min(np.array([m.u_min for m in self.model_plots])) + u_max = np.max(np.array([m.u_max for m in self.model_plots] + [1])) + self.ax_u.set_ylim(u_min, u_max * 1.1) + self.ax_u.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + eps_min = np.min(np.array([m.eps_min for m in self.model_plots])) + eps_max = np.max(np.array([m.eps_max for m in self.model_plots])) + self.ax_eps.set_ylim(eps_min, eps_max * 1.1) + self.ax_eps.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + self.ax_tau.set_ylim(0, self.tau * 1.1) + self.ax_tau.set_xlim(xmin=-1.05 * L_b, xmax=0.05 * L_b) + self.fig.canvas.draw_idle() + + def set_w_max_fields(self, w_max): + self.w_max = w_max + values = {name: slider.value for name, slider in self.sliders.items()} + self.update_fields(**values) + + def interact_fields(self): + self.init_fields() + self.on_w_max_change = self.update_fields + sliders = self.sliders + out = ipw.interactive_output(self.update_fields, sliders) + self.widget_layout(out) + + #========================================================================= + # Interaction on the pull-out curve spatial plot + #========================================================================= + def init_geometry(self): + self.fig, (self.ax_po, self.ax_geo) = plt.subplots( + 1, 2, figsize=(8, 3.4)) # , tight_layout=True) + values = self.trait_get(interact=True) + params = list(values[py_var] for py_var in self.py_vars[1:]) + h = self.h + x_C = np.array([[-1, 0], [0, 0], [0, h], [-1, h]], dtype=np.float_) + self.line_C, = self.ax_geo.fill(*x_C.T, color='gray', alpha=0.3) + for mp in self.model_plots: + mp.line_aw, = self.ax_geo.fill([], [], color='white', alpha=1) + mp.line_F, = self.ax_geo.fill([], [], color='black', alpha=0.8) + mp.line_F0, = self.ax_geo.fill([], [], color='white', alpha=1) + mp.init_Pw(*params) + self.ax_po.set_xlim(0, self.w_max * 1.05) + + def clear_geometry(self): + clear_plot(self.ax_po, self.ax_geo) + + def update_geometry(self, t, **values): + w = t * self.w_max + self.clear_geometry() + self.trait_set(**values) + params = list(values[py_var] for py_var in self.py_vars[1:]) + h = self.h + d = self.d + L_b = self.L_b + f_top = h / 2 + d / 2 + f_bot = h / 2 - d / 2 + self.ax_geo.set_xlim( + xmin=-1.05 * L_b, xmax=max(0.05 * L_b, 1.1 * self.w_max)) + x_C = np.array([[-L_b, 0], [0, 0], [0, h], [-L_b, h]], dtype=np.float_) + self.line_C.set_xy(x_C) + for mp in self.model_plots: + a_val = mp.model.get_aw_pull(w, *params) + width = d * 0.5 + x_a = np.array([[a_val, f_bot - width], [0, f_bot - width], + [0, f_top + width], [a_val, f_top + width]], + dtype=np.float_) + mp.line_aw.set_xy(x_a) + + w_L_b = mp.model.get_w_L_b(w, *params) + x_F = np.array([[-L_b + w_L_b, f_bot], [w, f_bot], + [w, f_top], [-L_b + w_L_b, f_top]], dtype=np.float_) + mp.line_F.set_xy(x_F) + x_F0 = np.array([[-L_b, f_bot], [-L_b + w_L_b, f_bot], + [-L_b + w_L_b, f_top], [-L_b, f_top]], dtype=np.float_) + mp.line_F0.set_xy(x_F0) + + mp.update_Pw(w, *params) + + P_max = np.max(np.array([mp.P_max for mp in self.model_plots])) + self.ax_po.set_ylim(0, P_max * 1.1) + self.ax_po.set_xlim(0, self.w_max * 1.05) + self.fig.canvas.draw_idle() + + def set_w_max(self, w_max): + self.w_max = w_max + values = {name: slider.value for name, slider in self.sliders.items()} + self.on_w_max_change(**values) + + on_w_max_change = tr.Callable + + def interact_geometry(self): + self.init_geometry() + self.on_w_max_change = self.update_geometry + sliders = self.sliders + out = ipw.interactive_output(self.update_geometry, sliders) + self.widget_layout(out) + + def widget_layout(self, out): + sliders = self.sliders + layout = ipw.Layout(grid_template_columns='1fr 1fr') + param_sliders_list = [sliders[py_var] for py_var in self.py_vars[1:]] + t_slider = sliders['t'] + grid = ipw.GridBox(param_sliders_list, layout=layout) + w_max_text = ipw.FloatText( + value=self.w_max, + description=r'w_max', + disabled=False + ) + out_w_max = ipw.interactive_output(self.set_w_max, + {'w_max': w_max_text}) + + hbox = ipw.HBox([t_slider, w_max_text]) + box = ipw.VBox([hbox, grid, out, out_w_max]) + display(box) diff --git a/tension/ACK model.ipynb b/tension/ACK model.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..d42ae3eeb2f85f79c514a664af902d8afa2a2052 --- /dev/null +++ b/tension/ACK model.ipynb @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "crude-gregory", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "id": "helpful-apple", + "metadata": {}, + "source": [ + "# ACK model for the tensile fragmentation problem" + ] + }, + { + "cell_type": "markdown", + "id": "spiritual-austin", + "metadata": {}, + "source": [ + "The ACK model developed by Aveston, Cooper and Kelly is an analytical model that represents the composite tensile response by a trilinear law as shown in the following figure. \n", + "\n", + "This model is based on the following assumptions:\n", + "- The bond behavior is governed by a constant frictional bond in the debonded interface\n", + "- The constitutive law for both reinforcement and matrix is assumed to be linear-elastic with brittle failure upon reaching their strengths\n", + "- Multiple cracking occurs at a constant level of applied stress, inducing a horizontal branch in the stress-strain behavior\n" + ] + }, + { + "attachments": { + "image-4.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "handed-sperm", + "metadata": {}, + "source": [ + "" + ] + }, + { + "cell_type": "markdown", + "id": "loaded-webmaster", + "metadata": {}, + "source": [ + "## Stress-strain curve\n", + "\n", + "The trilinear curve of ACK model represents the composite tensile response by identifying the following characteristic points:\n", + "- In the first stage, the matrix is uncracked and perfect bond between matrix and fabric is assumed up to the first cracking stress $\\sigma_{2}$ , which is defined as \n", + "\\begin{align}\n", + "\\sigma_{2} = E_\\mathrm{c} \\varepsilon_{2}\n", + "\\end{align}\n", + "where $\\varepsilon_{2}$ is the composite strain value at which the matrix cracks and $E_\\mathrm{c}$ is the composite stiffness. \n", + "The strain $\\varepsilon_{2}$ is given as\n", + "\\begin{align}\n", + "\\varepsilon_{2} = \\dfrac{\\sigma_\\mathrm{mu}}{E_\\mathrm{m}}\n", + "\\end{align}\n", + "where $\\sigma_\\mathrm{mu}$ and $E_\\mathrm{m}$ are the matrix tensile strength and stiffness, respectively.\n", + "The composite stiffness has been obtained using the\n", + "[mixture rule](../bmcs_course/1_1_elastic_stiffness_of_the_composite.ipynb) \n", + "and can be expressed here as:\n", + "\\begin{align}\n", + "E_\\mathrm{c} = E_\\mathrm{f} \\; V_\\mathrm{f} + E_\\mathrm{m} \\; (1 - V_\\mathrm{f})\n", + "\\end{align} \n", + "where $E_\\mathrm{f}$ is the fiber stiffness, and $V_\\mathrm{f}$ is denoting the fiber volume fraction (reinforcement ratio).\n", + "\n", + "- The second stage is characterized by the crack propagation. In this phase, the load is\n", + "assumed to be constant up to the strain value $\\varepsilon_{3}$ calculated as follows:\n", + "\\begin{align}\n", + "\\varepsilon_{3} = \\dfrac{\\sigma_\\mathrm{mu}}{E_\\mathrm{m}} \\; (1 + 0.666 \\alpha_\\mathrm{e})\n", + "\\end{align}\n", + "where where $\\alpha_\\mathrm{e}$ is an homogenization coefficient given as\n", + "\\begin{align}\n", + "\\alpha_\\mathrm{e} = \\dfrac{E_\\mathrm{m} \\; (1 - V_\\mathrm{f}) }{E_\\mathrm{f} \\; V_\\mathrm{f}}\n", + "\\end{align}\n", + "\n", + "- Finally, in the third stage, when the crack pattern is stabilized the load increases linearly up to the ultimate tensile stress $\\sigma_4$ with a slope equal to $E_\\mathrm{r}$\n", + "The ultimate tensile stress is given as\n", + "\\begin{align}\n", + "\\sigma_4 = \\sigma_\\mathrm{fu} \\; V_\\mathrm{f}\n", + "\\end{align}\n", + "where $\\sigma_\\mathrm{fu}$ is the tensile strength of the fiber.\n", + "The slope $E_\\mathrm{r}$ is given as\n", + "\\begin{align}\n", + "E_\\mathrm{r} = E_\\mathrm{f} \\; V_\\mathrm{f} \n", + "\\end{align}\n", + "The composilte strain at failure $\\varepsilon_{4}$ is given as\n", + "\\begin{align}\n", + "\\varepsilon_{4} = \\varepsilon_{3} + \\dfrac{\\sigma_\\mathrm{4} - \\sigma_\\mathrm{2}}{E_\\mathrm{r}}\n", + "\\end{align}" + ] + }, + { + "cell_type": "markdown", + "id": "sorted-frame", + "metadata": {}, + "source": [ + "## Crack spacing\n", + "\n", + "\n", + "The final average crack spacing $l_\\mathrm{cs}$ is given as\n", + "\n", + "\\begin{align}\n", + "l_\\mathrm{cs} = 1.337 \\; \\dfrac{(1 - V_\\mathrm{f}) \\; \\sigma_\\mathrm{mu}}{ V_\\mathrm{f} \\; T}\n", + "\\end{align}\n", + "\n", + "where $T$ is the bond intensity." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.1" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb b/tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb index 4628398d57a33d0b025c84b3592ec476f3a60d2f..48dfa7cbe36a9a6215e861c35cec9e0578914159 100644 --- a/tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb +++ b/tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb @@ -748,6 +748,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "<a id=\"exp_slope\"></a>\n", "## Damage function derived from strength and shape of softening branch" ] }, diff --git a/tour6_energy/6_3_localized_energy_dissipation.ipynb b/tour6_energy/6_3_localized_energy_dissipation.ipynb index 99900406967e2babcb20c740cd0687b951a59c2f..87469ad9fd95ce954631b861b30fd4387aef176e 100644 --- a/tour6_energy/6_3_localized_energy_dissipation.ipynb +++ b/tour6_energy/6_3_localized_energy_dissipation.ipynb @@ -9,6 +9,14 @@ "# **6.3 Softening and fracture energy**" ] }, + { + "cell_type": "markdown", + "id": "e975436b-419b-4c36-a1e0-dadd4c5069b5", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643794)" + ] + }, { "cell_type": "markdown", "id": "0734f03a-ade2-4582-8008-c074822f9c3d", @@ -176,7 +184,7 @@ "metadata": {}, "source": [ "$$\n", - "G(w) = \\mathcal{W}(w) - \\mathcal{U}(w) = \\int_0^w P(w) \\; \\mathrm{d}w - \\int_\\Omega E \\boldsymbol{\\varepsilon}_\\mathrm{el}(w) : \\boldsymbol{\\varepsilon}_\\mathrm{el}(w) \\; \\mathrm{d}x.\n", + "G(w) = \\mathcal{W}(w) - \\mathcal{U}(w) = \\int_0^w P(w) \\; \\mathrm{d}w - \\frac{1}{2} \\int_\\Omega E \\boldsymbol{\\varepsilon}_\\mathrm{el}(w) : \\boldsymbol{\\varepsilon}_\\mathrm{el}(w) \\; \\mathrm{d}x.\n", "$$" ] }, @@ -202,7 +210,7 @@ "metadata": {}, "source": [ "$$\n", - "G(t) = \\mathcal{W}(t) - \\mathcal{U}(t) = \\int_0^t P(w(t)) \\dfrac{\\mathrm{d}w}{\\mathrm{d}t} \\; \\mathrm{d}t - \\int_\\Omega \\sigma(w(t)) \\cdot \\varepsilon_\\mathrm{el}(w(t)) \\; \\mathrm{d}x.\n", + "G(t) = \\mathcal{W}(t) - \\mathcal{U}(t) = \\int_0^t P(w(t)) \\dfrac{\\mathrm{d}w}{\\mathrm{d}t} \\; \\mathrm{d}t - \\frac{1}{2} \\int_\\Omega \\sigma(w(t)) \\cdot \\varepsilon_\\mathrm{el}(w(t)) \\; \\mathrm{d}x.\n", "$$" ] }, @@ -228,7 +236,7 @@ "from bmcs_cross_section.pullout import PullOutModel1D\n", "po_cfrp = PullOutModel1D(n_e_x=300, w_max=5) # mm \n", "po_cfrp.geometry.L_x=500 # [mm]\n", - "po_cfrp.time_line.step = 0.008\n", + "po_cfrp.time_line.step = 0.02\n", "po_cfrp.cross_section.trait_set(A_m=400*200, A_f=100*0.11, P_b=100);\n", "po_cfrp.material_model='damage'\n", "po_cfrp.material_model_.trait_set(E_m=28000, E_f=230000, E_b=250, s_max=.4)\n", @@ -254,7 +262,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ce80e4ec167d48b8ab3d08d0e4f162c8", + "model_id": "601ef70cd8a94569808c06b674416649", "version_major": 2, "version_minor": 0 }, @@ -287,7 +295,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "2b480b67beea49e5bae9687ba13aa540", + "model_id": "5f9c222bbedf46169d59e56d047a84ee", "version_major": 2, "version_minor": 0 }, @@ -347,12 +355,20 @@ "**When designing an experiment or a structural members always watch out how much elastic energy is stored in the structure prior to the failure.** Ignoring this can lead to unforeseen, uncontrolled failure event which is not only brittle but may be highly **explosive**. " ] }, + { + "cell_type": "markdown", + "id": "16ebaf13-63e9-4c9c-bddc-99dd29937675", + "metadata": {}, + "source": [ + "# **Quantification and verification of dissipated energy**" + ] + }, { "cell_type": "markdown", "id": "a5085968-256f-49a2-b0cd-6d3f537b2dfe", "metadata": {}, "source": [ - "Even though the value of $G_\\mathrm{total}$ could be extracted from the graphs presented in the above simulation, let us quantify them by accessing the output data of the simulation. The `history` attribute includes the arrays of stored, supplied and dissipated energy as `W_t`, `U_bar_t`, and `G_t`, respectively. Then, because the geometry was specified in $\\mathrm{mm}$, the above formulas deliver the value of $G_\\mathrm{total}$ in $\\mathrm{[Nmm]}$, corresponding to $\\mathrm{[kJ]}$ " + "Even though the value of $G_\\mathrm{total}$ could be extracted from the graphs presented in the above simulation, let us quantify them by accessing the output data of the simulation. The `history` attribute includes the arrays of stored, supplied and dissipated energy as `W_t`, `U_bar_t`, and `G_t`, respectively. Then, because the geometry was specified in $\\mathrm{mm}$, the above formulas deliver the value of $G_\\mathrm{total}$ in $\\mathrm{[Nmm]}$" ] }, { @@ -364,7 +380,7 @@ { "data": { "text/plain": [ - "53246.55322083428" + "52784.20045086269" ] }, "execution_count": 4, @@ -374,7 +390,7 @@ ], "source": [ "t_idx = np.argmax(po_cfrp.history.U_bar_t)\n", - "G_total = po_cfrp.hist.G_t[t_idx]\n", + "G_total = po_cfrp.history.G_t[t_idx]\n", "G_total # Nmm" ] }, @@ -417,7 +433,7 @@ "id": "f719f572-0f23-49a2-85e6-2e48e6cc1fa6", "metadata": {}, "source": [ - "Rendering the value of $G_\\mathrm{F}$ in $\\mathrm{[kJ/mm^2]} = \\mathrm{[N/mm]}$" + "Rendering the value of $G_\\mathrm{F}$ in $\\mathrm{[J/mm^2]} = \\mathrm{[N/mm]}$" ] }, { @@ -429,7 +445,7 @@ { "data": { "text/plain": [ - "1.0649310644166856" + "1.055684009017254" ] }, "execution_count": 6, @@ -457,7 +473,7 @@ "id": "f85b7744-5bc0-47c3-90ed-b4577d7d56b5", "metadata": {}, "source": [ - "**However, why are they not equal?** The obtained values, i.e. $G_\\mathrm{F} = = 1.08 \\; \\mathrm{[N/mm]}$ and $G_\\mathrm{f} = 1.19 \\; \\mathrm{[N/mm]}$ so that the globally evaluated dissipated energy is smaller than the prescribed fracture energy \n", + "**However, why are they not equal?** The obtained values, i.e. $G_\\mathrm{F} = 1.05 \\; \\mathrm{[N/mm]}$ and $G_\\mathrm{f} = 1.19 \\; \\mathrm{[N/mm]}$ so that the globally evaluated dissipated energy is smaller than the prescribed fracture energy \n", "$$\n", " G_\\mathrm{F} < G_\\mathrm{f}.\n", "$$\n", @@ -474,7 +490,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "1677a84c480a4a04b05724789a8617b0", + "model_id": "baaaef8078fb49fbbf8eaad5a62feea8", "version_major": 2, "version_minor": 0 }, @@ -571,14 +587,6 @@ "</div><div style=\"background-color:lightgray;text-align:center;width:10%;display:inline-table;\"> <a href=\"#top\"><img src=\"../icons/compass.png\" alt=\"Compass\" width=\"50\" height=\"50\"></a></div><div style=\"background-color:lightgray;text-align:right;width:45%;display:inline-table;\"> \n", " <a href=\"../tour7_cracking/7_1_bending3pt_2d.ipynb#top\">7.1 Crack propagation</a> <img src=\"../icons/next.png\" alt=\"Previous trip\" width=\"50\" height=\"50\"> </div> " ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "e59b6e37-03c1-4db4-be30-6ec6ae84530d", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/tour7_cracking/7_1_bending3pt_2d.ipynb b/tour7_cracking/7_1_bending3pt_2d.ipynb index 142f2b69f6bf294766bcded57bc45ce43a6bdb7e..b188d1847c913625ed0e132d89a9d2f19f2edd28 100644 --- a/tour7_cracking/7_1_bending3pt_2d.ipynb +++ b/tour7_cracking/7_1_bending3pt_2d.ipynb @@ -9,6 +9,14 @@ "# **7.1 Propagation of a straight crack**" ] }, + { + "cell_type": "markdown", + "id": "4ad631a0-2bb3-4f35-abd5-39ce796a5d3e", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643780) part 1" + ] + }, { "cell_type": "markdown", "id": "0465afaf-c8d1-4604-a9bd-3bd91bb67ca4", @@ -36,6 +44,19 @@ " <b>Where are we heading</b> </div> " ] }, + { + "attachments": { + "9fb77393-4c12-4784-8c03-00258f81aa5e.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "a7beef0d-d210-4bd7-b95f-b1f27902f20c", + "metadata": {}, + "source": [ + "" + ] + }, { "cell_type": "markdown", "id": "cc776d2c-f89a-4c69-8374-93447c23eda8", @@ -57,11 +78,11 @@ "id": "b1e064b7-2688-40a4-83ce-491b6dcabe6d", "metadata": {}, "source": [ - "An isolated tensile crack propagation can be initiated using a notched specimen. The most common configurations used to study the cracking behavior for a tensile crack denoted as mode I are the wedge splitting test and notched, three-point bending test. Both these tests aim to characterize the material behavior in terms of the softening law describing the relation between the tensile stress transmitted across the localization zone and the corresponding crack opening. \n", + "An isolated tensile crack propagation can be initiated using a notched specimen. The most common configurations used to study the cracking behavior for a tensile crack denoted as mode I are the wedge splitting test and the notched, three-point bending test. Both these tests aim to characterize the material behavior in terms of the softening law describing the relation between the tensile stress transmitted across the localization zone and the corresponding crack opening. \n", "\n", "Due to its simplicity, three-point-bending test on a notched concrete has become a standard (RILEM) to determine the fracture energy $G_\\mathrm{f}$ characterizing the cracking behavior of concrete. The test induces a single crack in the notched section propagating straight upwards from the notch in a stable manner. The energy is dissipated in a local region in the crack vicinity so that it can be directly ascribed to the area of emerging crack surface. \n", "\n", - "The numerical simulation of this model can be readily performed using the material model with the damage function derived in previous notebooks. An example of the geometry and boundary conditions of the three-point bending test is provided by the [Petersson (1982)](https://portal.research.lu.se/portal/files/4705811/1785208.pdf) test series using the following setup." + "The numerical simulation of this model can be readily performed using the material model with the damage function presented in notebook [5.1](tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb). An example of the geometry and boundary conditions of the three-point bending test is provided by the [Petersson (1982)](https://portal.research.lu.se/portal/files/4705811/1785208.pdf) test series using the following setup." ] }, { @@ -90,18 +111,18 @@ "id": "1f7c6217-d72e-4777-a276-1ff5f524da43", "metadata": {}, "source": [ - "The numerical model simulating this test is assuming a plain stress described by the stress tensor with the enumeration of spatial dimensions using the index variables $a, b$ = [1,2]\n", + "The numerical model simulating this test is assuming a [plain stress](https://en.wikipedia.org/wiki/Plane_stress) described by the stress tensor with the enumeration of spatial dimensions using the index variables $a, b$ = [1,2]\n", "$$\n", "\\sigma_{ab}\n", "= \n", "\\left[\n", "\\begin{array}{cc}\n", - "\\sigma_{xx} & \\sigma_{xy} \\\\\n", - "\\sigma_{yx} & \\sigma_{yy}\n", + "\\sigma_{11} & \\sigma_{12} \\\\\n", + "\\sigma_{21} & \\sigma_{22}\n", "\\end{array}\n", "\\right]\n", "$$ \n", - "and $\\sigma_{zz} = \\sigma_{xz} = \\sigma_{yz} = 0$. The finite element discretization in this model applies the symmetry condition at the middle section of the beam. Upon loading loading, the damage will localize\n", + "and $\\sigma_{33} = \\sigma_{13} = \\sigma_{23} = 0$. The finite element discretization in this model applies the symmetry condition at the middle section of the beam. Upon loading loading, the damage will localize\n", "at the tip of the notch and propagate upwards." ] }, @@ -118,6 +139,14 @@ "" ] }, + { + "cell_type": "markdown", + "id": "9b71ca40-8070-4f53-ac8a-c5389c590ccc", + "metadata": {}, + "source": [ + "The discretization is using quadrilateral finite elements with bilinear shape functions. A fineness of the regular mesh is defined by the number of elements in $x$ and $y$ directions denoted as `n_e_x` and `n_e_y`, respectively. A maximum deflection is given by the parameter `w_max`. The maximum number of iterations to find an equilibrium within a single load increment is controlled by the parameter `k_max`." + ] + }, { "cell_type": "code", "execution_count": 1, @@ -131,8 +160,8 @@ "bt = BendingTestModel(material_model='scalar damage', \n", " n_e_x=6, n_e_y=16, w_max=-2, k_max=500)\n", "bt.time_line.step=0.03\n", - "bt.history.warp_factor=100\n", - "bt.cross_section.trait_set(b=50)\n", + "bt.history.warp_factor=100 # multiplier for displacement plotting\n", + "bt.cross_section.trait_set(B=50)\n", "bt.geometry.trait_set(L=2000, H=200, a=100, L_cb=1);" ] }, @@ -141,7 +170,12 @@ "id": "780cfe67-6a6f-435d-afce-dbb2bc491e76", "metadata": {}, "source": [ - "# **Material model**" + "# **Material model**\n", + "\n", + "Elastic material matrix is defined with the parameters `E` and `nu`. Note that the lateral\n", + "deformation is switched off by setting `nu = 0.0` here. This choice is induced by the need to \n", + "avoid the spurious failure of the compression zone in the final stage of simulation. \n", + "This \"numerical trick\" is justified by the need to keep the model simple. The damage evolution in response to tensile strain is reflected relatively well, so that the model is sufficient to demonstrate the evaluation of fracture energy upon tensile crack propagation." ] }, { @@ -152,8 +186,6 @@ "outputs": [], "source": [ "E = 30000\n", - "f_ct = 3.3\n", - "kappa_0 = f_ct / E\n", "bt.material_model_.trait_set(E = E, nu = 0.0); # note nu = 0.0 to avoid compressive failure" ] }, @@ -170,7 +202,7 @@ "id": "49ade73c-3541-43a5-9237-2eee0892056e", "metadata": {}, "source": [ - "The exponential damage function with the two parameters $\\kappa_0$ defining the onset of damage and $\\kappa_\\mathrm{f}$ controlling the slope of the exponential softening branch at the onset of damage is defined as follows. " + "The exponential damage function with the two parameters $\\kappa_0$ defining the onset of damage and $\\kappa_\\mathrm{f}$ controlling the slope of the exponential softening branch at the onset of damage presented in notebook [5.1](../tour5_damage_bond/5_1_Introspect_Damage_Evolution_Damage_initiation.ipynb#exp_slope). Assuming the concrete tensile strength $f_\\mathrm{ct} = 3.3 \\mathrm{[MPa]}$, we can set the parameters $\\kappa_0$ and the slope of the softening branch $\\kappa_\\mathrm{f}$ as follows" ] }, { @@ -185,7 +217,7 @@ "$\\displaystyle \\begin{cases} 0 & \\text{for}\\: \\kappa \\leq \\kappa_{0} \\\\1 - \\frac{\\kappa_{0} e^{\\frac{- \\kappa + \\kappa_{0}}{- \\kappa_{0} + \\kappa_\\mathrm{f}}}}{\\kappa} & \\text{otherwise} \\end{cases}$" ], "text/plain": [ - "<ibvpy.tmodel.mats_damage_fn.ExpSlopeDamageFn at 0x7fe52ff5d090>" + "<ibvpy.tmodel.mats_damage_fn.ExpSlopeDamageFn at 0x7f5068f4c2c0>" ] }, "execution_count": 3, @@ -194,8 +226,10 @@ } ], "source": [ + "f_ct = 3.3\n", + "kappa_0 = f_ct / E\n", "bt.material_model_.omega_fn = 'exp-slope'\n", - "bt.material_model_.omega_fn_.trait_set(kappa_0=kappa_0, kappa_f=0.0200)" + "bt.material_model_.omega_fn_.trait_set(kappa_0=kappa_0, kappa_f=0.02)" ] }, { @@ -253,6 +287,14 @@ "## Strain norm" ] }, + { + "cell_type": "markdown", + "id": "da77f432-b3f5-4c4d-90a7-471e1fd2fa32", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643780) part 2" + ] + }, { "cell_type": "markdown", "id": "2a6b3a48-27f9-4fdf-9752-bd42bb9e861a", @@ -265,8 +307,8 @@ "= \n", "\\left[\n", "\\begin{array}{cc}\n", - "\\varepsilon_{xx} & \\varepsilon_{xy} \\\\\n", - "\\varepsilon_{yx} & \\varepsilon_{yy}\n", + "\\varepsilon_{11} & \\varepsilon_{12} \\\\\n", + "\\varepsilon_{21} & \\varepsilon_{22}\n", "\\end{array}\n", "\\right]\n", "$$ \n", @@ -283,7 +325,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0cab14ecb5954173ae61dee5c134b547", + "model_id": "d7fd39efabe74251a5a9c5595770bb61", "version_major": 2, "version_minor": 0 }, @@ -296,7 +338,7 @@ } ], "source": [ - "bt.material_model_.strain_norm = 'Rankine'\n", + "bt.material_model_.strain_norm = 'Rankine' # 'Masars', 'Energy'\n", "bt.material_model_.strain_norm_.interact()" ] }, @@ -311,33 +353,7 @@ " - Energy norm\n", " \n", "These norms have to be combined with an elastic threshold to distinguish the elastic and inelastic domains.\n", - "\n", - "Inspect the visual representation of the equivalent strain measure by changing the selector in the material model app. (It is necessary to select the respective tree node to render the visualization of the currently selected option.)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "id": "8dd4a96a-e8b6-4cbc-9f71-bdf0f680b35d", - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "c9ebe53ccea8418cae7f8ea74ccef454", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "VBox(children=(HBox(children=(VBox(children=(Tree(layout=Layout(align_items='stretch', border='solid 1px black…" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "bt.material_model_.interact()" + "Inspect the visual representation of the equivalent strain measure by changing the selector above from `Rankine` to either `Masars` or `Energy`" ] }, { @@ -456,27 +472,44 @@ "# **Simulation example**" ] }, + { + "cell_type": "markdown", + "id": "f590e07c-a61f-41cd-b97d-a0f32928acfb", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643780) part 3" + ] + }, + { + "cell_type": "markdown", + "id": "c57baa9f-e769-43fa-b0e4-2eb7c260d100", + "metadata": {}, + "source": [ + "Fist, let us ensure that the `Rankine` strain norm is used in the model. " + ] + }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "id": "aba5b31e-bdfb-4446-ba3b-bae4f01d91e6", "metadata": {}, "outputs": [], "source": [ "bt.material_model_.strain_norm='Rankine'\n", + "bt.reset()\n", "bt.run()" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "id": "bf30823c-3ed8-4e8b-a84c-23cc25c8e094", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "ab40da50556048ae99b7cad542b84720", + "model_id": "9a39766278494a51822921e8dbb1ec26", "version_major": 2, "version_minor": 0 }, @@ -539,7 +572,7 @@ } ], "source": [ - "V_diss = (bt.geometry.H - bt.geometry.a)*bt.cross_section.b * bt.geometry.L_cb\n", + "V_diss = (bt.geometry.H - bt.geometry.a)*bt.cross_section.B * bt.geometry.L_cb\n", "V_diss" ] }, @@ -569,7 +602,7 @@ } ], "source": [ - "bt.material_model_.G_f # J/mm^2" + "bt.material_model_.G_f # N/mm" ] }, { @@ -612,7 +645,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "id": "e5e6854c-6ec7-43a7-b4bc-d6a725af6b79", "metadata": {}, "outputs": [ @@ -622,7 +655,7 @@ "282.5506041549446" ] }, - "execution_count": 13, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -640,6 +673,35 @@ "# **Parametric study**" ] }, + { + "cell_type": "markdown", + "id": "a609391c-874a-41b5-89b7-5ea415b0a19c", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643780) part 4" + ] + }, + { + "cell_type": "markdown", + "id": "3a7ea2f8-69f1-443a-9b7e-74347c707fc9", + "metadata": {}, + "source": [ + "What happens when we change something? In particular, what happens if we change the volume of the dissipative zone $V_\\mathrm{diss}$?" + ] + }, + { + "attachments": { + "5e6eb343-c973-4ada-8019-9bd37e5f9fec.png": { + "image/png": "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" + } + }, + "cell_type": "markdown", + "id": "e8400af5-7f0a-4f59-984a-29928ddfea2f", + "metadata": {}, + "source": [ + "" + ] + }, { "cell_type": "markdown", "id": "3479d206-6b40-4b8b-aef7-95143d0bb3fa", @@ -705,7 +767,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c3fd19d8543041709f891a13fa970a8e", + "model_id": "73592155a8d04608a7007572e70562f7", "version_major": 2, "version_minor": 0 }, @@ -719,7 +781,7 @@ { "data": { "text/plain": [ - "(0.0, 1150.9964986034481)" + "(0.0, 575.4982493017241)" ] }, "execution_count": 16, @@ -738,7 +800,7 @@ "ax.set_ylabel(r'$F$ [N]');\n", "G_list = [G_dict[L_cb] for L_cb in L_cb_list]\n", "ax_G.plot(L_cb_list, G_list, marker='H')\n", - "ax_G.set_xlabel(r'$L_\\mathrm{c}$ [mm]')\n", + "ax_G.set_xlabel(r'$L_\\mathrm{cb}$ [mm]')\n", "ax_G.set_ylabel(r'$G_\\mathrm{total}$ [kJ]');\n", "ax_G.set_ylim(ymin=0, ymax=1.1 * np.max(G_list))" ] @@ -944,7 +1006,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "fbc99ee74a544befaaf71685bd7f4614", + "model_id": "98a95ffaca22478b853daf450f039f60", "version_major": 2, "version_minor": 0 }, diff --git a/tour7_cracking/7_2_fracture_energy_ident.ipynb b/tour7_cracking/7_2_fracture_energy_ident.ipynb index c12a94f26641b191b37ebe7e61874a19fa199d05..94699c05eb15d56befb122792a22345b2d2294ae 100644 --- a/tour7_cracking/7_2_fracture_energy_ident.ipynb +++ b/tour7_cracking/7_2_fracture_energy_ident.ipynb @@ -9,6 +9,14 @@ "# **7.2 Fracture energy identification and size effect**" ] }, + { + "cell_type": "markdown", + "id": "5a656ce9-7a20-4f31-82e5-6ed57d4311e8", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643791) part 1" + ] + }, { "cell_type": "markdown", "id": "55707766-c485-4a3b-a811-cc70b90099e6", @@ -228,6 +236,14 @@ "# **Size effect** " ] }, + { + "cell_type": "markdown", + "id": "22ff03a4-f0d8-4488-be03-6cc942340858", + "metadata": {}, + "source": [ + "[](https://moodle.rwth-aachen.de/mod/page/view.php?id=643791) part 2" + ] + }, { "cell_type": "markdown", "id": "d2c15296-1bfc-4ade-be72-24afc2e00f12", @@ -280,7 +296,7 @@ "metadata": {}, "outputs": [], "source": [ - "def new_bt(L=2000, H=200, a=100):\n", + "def new_bt(L, H, a):\n", " E = 30000\n", " f_ct = 3.3\n", " kappa_0 = f_ct / E\n", @@ -288,7 +304,7 @@ " n_e_x=6, n_e_y=16, w_max=-2, k_max=1000)\n", " bt.time_line.step=0.02\n", " bt.history.warp_factor=100\n", - " bt.cross_section.trait_set(b=50)\n", + " bt.cross_section.trait_set(B=50)\n", " bt.geometry.trait_set(L=L, H=H, a=a, L_cb=1);\n", " bt.material_model_.trait_set(E = E, nu = 0.0) # note nu = 0.0 to avoid compressive failure\n", " bt.material_model_.omega_fn = 'exp-slope'\n", @@ -307,7 +323,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 3, "id": "fc9dd650-71c2-4e76-8fb6-7bc8466558f3", "metadata": {}, "outputs": [], @@ -325,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 4, "id": "1cc2a58f-1799-466f-be57-fdbe9bd765e7", "metadata": {}, "outputs": [ @@ -345,7 +361,6 @@ "scale_list = [0.5,1,2,4]\n", "L0 = 2000\n", "H0 = 200\n", - "B0 = 50\n", "a0 = 50\n", "for scale in scale_list:\n", " print('calculating F-w and G_total for scale = %g' % scale)\n", @@ -376,14 +391,14 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 5, "id": "a3fc049f-480f-4615-ae09-fa3135f5596f", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "9adefcfc1089475daac992b80212413a", + "model_id": "7b29635594fa4a90afb2a15f54024c86", "version_major": 2, "version_minor": 0 }, @@ -449,7 +464,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "dfa6230babc64402b44897180f53db18", + "model_id": "12d662e375cf4fc6a1c83253124f2245", "version_major": 2, "version_minor": 0 }, @@ -465,6 +480,16 @@ "bt_dict[2].interact()" ] }, + { + "cell_type": "markdown", + "id": "f2378b06-34a0-4cfa-b165-4bffd5c8273c", + "metadata": {}, + "source": [ + "<div style=\"background-color:lightgray;text-align:left\"> <img src=\"../icons/exercise.png\" alt=\"Run\" width=\"50\" height=\"50\">\n", + " <a href=\"../exercises/X0701_Identification of the fracture energy.pdf\"><b>Exercise X0701:</b></a> <b>Evaluation of fracture energy</b> \n", + "</div>" + ] + }, { "cell_type": "markdown", "id": "af32baab-4840-48ab-896a-baffbc7c6983", diff --git a/tour7_cracking/bmcs_bending/bending3pt_2d.py b/tour7_cracking/bmcs_bending/bending3pt_2d.py index 130a80231efb988fa424406d5037bc6b8f02330e..f139b2ab54a0570a4bddb81c867914b78d47e241 100755 --- a/tour7_cracking/bmcs_bending/bending3pt_2d.py +++ b/tour7_cracking/bmcs_bending/bending3pt_2d.py @@ -192,7 +192,7 @@ class Viz2DdGdA(Viz2D): t = self.vis2d.sim.hist.t G_t = self.vis2d.get_G_t() a_t = self.vis2d_cb.get_a_t() - b = self.vis2d_cb.sim.cross_section.b + b = self.vis2d_cb.sim.cross_section.B tck = ip.splrep(a_t * b, G_t, s=0, k=1) dG_da = ip.splev(a_t, tck, der=1) @@ -361,14 +361,14 @@ class CrossSection(BMCSLeafNode): ''' name = 'cross-section' - b = Float(100.0, + B = Float(100.0, CS=True, label='thickness', auto_set=False, enter_set=True, desc='cross-section width [mm2]') ipw_view = View( - Item('b'), + Item('B'), ) @@ -588,7 +588,7 @@ class BendingTestModel(TStepBC, Model): @cached_property def _get_xdomain(self): dgrid = XDomainFEGrid(coord_max=(self.geometry.L / 2., self.geometry.H), - integ_factor=self.cross_section.b, + integ_factor=self.cross_section.B, shape=(self.n_e_x, self.n_e_y), fets=self.fets_eval)