diff --git a/fig/fiber_bundle.odg b/fig/fiber_bundle.odg new file mode 100644 index 0000000000000000000000000000000000000000..1ad6648746014b7b1dc31abcfe319b4047e802a1 Binary files /dev/null and b/fig/fiber_bundle.odg differ diff --git a/fig/fiber_bundle.png b/fig/fiber_bundle.png new file mode 100644 index 0000000000000000000000000000000000000000..2b941d621e9dc89c20768c5ec489065c393e1fe2 Binary files /dev/null and b/fig/fiber_bundle.png differ diff --git a/fig/fiber_bundle_carbon_tensile_test.png b/fig/fiber_bundle_carbon_tensile_test.png new file mode 100644 index 0000000000000000000000000000000000000000..35ad41bfdbd00067fbabfd8dc19d0e4686e0efb0 Binary files /dev/null and b/fig/fiber_bundle_carbon_tensile_test.png differ diff --git a/fig/interface_2d.odg b/fig/interface_2d.odg new file mode 100644 index 0000000000000000000000000000000000000000..c4f5c4a56b559b44fbe5464e2864b04aa7bcbe30 Binary files /dev/null and b/fig/interface_2d.odg differ diff --git a/fig/interface_2d.png b/fig/interface_2d.png new file mode 100644 index 0000000000000000000000000000000000000000..766cf7d1a7158a3780331d456e8d4e4cc4853f03 Binary files /dev/null and b/fig/interface_2d.png differ diff --git a/fig/yarn3d.png b/fig/yarn3d.png new file mode 100644 index 0000000000000000000000000000000000000000..490f053127d6aa3638813209b97c44d0e5a81570 Binary files /dev/null and b/fig/yarn3d.png differ diff --git a/icons/classify.png b/icons/classify.png new file mode 100644 index 0000000000000000000000000000000000000000..3acc67305454450d5285791440ab60a9bc6b315f Binary files /dev/null and b/icons/classify.png differ diff --git a/icons/recall.png b/icons/recall.png new file mode 100644 index 0000000000000000000000000000000000000000..45b25c9c8e74242f9f4f2c17ea296032f8570366 Binary files /dev/null and b/icons/recall.png differ diff --git a/papers/yarn_tensile_test_example.pdf b/papers/yarn_tensile_test_example.pdf new file mode 100644 index 0000000000000000000000000000000000000000..63d0d6c0e3d8cf8c61ed13c27945fd754e62946c Binary files /dev/null and b/papers/yarn_tensile_test_example.pdf differ 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 245ee73955978205d9fbd268b96c5378f0b3e64b..b2aa26b0527639de19d452aec53b672b80d07c8d 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 @@ -351,7 +351,7 @@ "$\\displaystyle \\begin{cases} 0 & \\text{for}\\: \\kappa < \\kappa_{0} \\\\\\frac{\\kappa - \\kappa_{0}}{- \\kappa_{0} + \\kappa_{u}} & \\text{for}\\: \\kappa < \\kappa_{u} \\\\1 & \\text{otherwise} \\end{cases}$" ], "text/plain": [ - "<ibvpy.tmodel.mats_damage_fn.LinearDamageFn at 0x7f12a369f9a0>" + "<ibvpy.tmodel.mats_damage_fn.LinearDamageFn at 0x7f96c54ef3b0>" ] }, "execution_count": 2, @@ -380,7 +380,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "54f0a10b76d94688aa571d5377508175", + "model_id": "2eac6f2077a64c3db67ded9b2c64bc3a", "version_major": 2, "version_minor": 0 }, @@ -413,7 +413,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "5191002c96d148b8ab0549351c1f7cd8", + "model_id": "01a1d15c567d4ab18053e962347842e0", "version_major": 2, "version_minor": 0 }, @@ -527,7 +527,7 @@ "$\\displaystyle \\begin{cases} 0 & \\text{for}\\: \\kappa < 0 \\\\1 - e^{- \\left(\\frac{\\kappa}{\\lambda}\\right)^{m}} & \\text{otherwise} \\end{cases}$" ], "text/plain": [ - "<ibvpy.tmodel.mats_damage_fn.WeibullDamageFn at 0x7f1273d89720>" + "<ibvpy.tmodel.mats_damage_fn.WeibullDamageFn at 0x7f9704ac8090>" ] }, "execution_count": 5, @@ -557,7 +557,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "f064d9a091d94f44b0e3317808efcb13", + "model_id": "72f78ca99ab840138611c77be14ce567", "version_major": 2, "version_minor": 0 }, @@ -588,7 +588,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "c5c51d30516c42948cd852ca88be782a", + "model_id": "20784fa178a749f4a78c648da54cefdb", "version_major": 2, "version_minor": 0 }, @@ -708,7 +708,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "d65e165dcd9b4ec89b91493ebec61ca6", + "model_id": "f35c091da8ed497da6aa6862304092ff", "version_major": 2, "version_minor": 0 }, @@ -770,7 +770,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 0x7f1273a974f0>" + "<ibvpy.tmodel.mats_damage_fn.ExpSlopeDamageFn at 0x7f96c4ebfd60>" ] }, "execution_count": 10, @@ -792,7 +792,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0340ecfab8164da5a65300a4c1d318a1", + "model_id": "dfc77cdf54394ed1925eeeb230188bbc", "version_major": 2, "version_minor": 0 }, @@ -862,7 +862,7 @@ "$\\displaystyle \\begin{cases} 0 & \\text{for}\\: \\kappa \\leq \\kappa_{0} \\\\1 - \\begin{cases} 1 & \\text{for}\\: \\kappa < \\kappa_{0} \\\\\\frac{\\kappa_{0} \\left(1 - \\frac{1 - e^{- \\frac{\\alpha \\left(\\kappa - \\kappa_{0}\\right)}{- \\kappa_{0} + \\kappa_{u}}}}{1 - e^{- \\alpha}}\\right)}{\\kappa} & \\text{for}\\: \\kappa < \\kappa_{u} \\\\0 & \\text{otherwise} \\end{cases} & \\text{otherwise} \\end{cases}$" ], "text/plain": [ - "<ibvpy.tmodel.mats_damage_fn.AbaqusDamageFn at 0x7f1273974a90>" + "<ibvpy.tmodel.mats_damage_fn.AbaqusDamageFn at 0x7f96c4d6cf90>" ] }, "execution_count": 12, @@ -884,7 +884,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "0182a2cffd3d4b96b3c9cd1b8b5ca134", + "model_id": "9050d860a09742b6b4b65cc22312c393", "version_major": 2, "version_minor": 0 }, @@ -936,7 +936,7 @@ "$\\displaystyle 1 - \\begin{cases} 1 & \\text{for}\\: \\kappa < \\kappa_{0} \\\\e^{\\frac{\\left(\\kappa - \\kappa_{0}\\right) \\left(\\sqrt{E_{b}} \\sqrt{- E_{b} \\kappa_{0}^{2} + 4 G_{f}} + E_{b} \\kappa_{0}\\right)}{E_{b} \\kappa_{0}^{2} - 2 G_{f}}} & \\text{otherwise} \\end{cases}$" ], "text/plain": [ - "<ibvpy.tmodel.mats_damage_fn.GfDamageFn at 0x7f1273c52590>" + "<ibvpy.tmodel.mats_damage_fn.GfDamageFn at 0x7f96c4be54f0>" ] }, "execution_count": 14, @@ -965,7 +965,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "8d5c19fa779942f6b5ce937f8e643b4d", + "model_id": "d7ca49638d8e423184e52f60c5953a14", "version_major": 2, "version_minor": 0 }, @@ -1124,7 +1124,7 @@ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "4b71cc4879bf493f8f05769bf163f50b", + "model_id": "17d69b2b3c8e44f89cdfad12772fb249", "version_major": 2, "version_minor": 0 }, @@ -1203,71 +1203,33 @@ "\\end{align}\n", "\n", "> **<font color=\"brown\"> Damage increment caused in direction $x$ directly affects the behavior in direction $y$**\n", - " </font>\n", - "\n", - "Let us inspect the damage evolution for 2D loading histories in the space $\\left[s_x, s_y, \\sqrt{\\tau_x^2 + \\tau_y^2}\\right]$" + " </font>" ] }, { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "hide_input": false, - "slideshow": { - "slide_type": "skip" - } - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "import damage2d_explorer as de" + "<div style=\"background-color:lightgray;text-align:left\"> <img src=\"../icons/view.png\" alt=\"Previous trip\" width=\"50\" height=\"50\">\n", + " <b>Let see how does the isotropic damage evolves in a single point</b> </div> \n", + " \n", + "To visualize the response of a material point with two control slip vector components $s_x, s_y$ and two stress vector components $\\tau_x, \\tau_y$ in a 3D diagram, we will plot the loading histories in the space $\\left[s_x, s_y, \\sqrt{\\tau_x^2 + \\tau_y^2}\\right]$. The vertical axis represents the norm of the stress vector. We will make use of an interactive model component `damage_2d_explorer`." ] }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "metadata": { "hide_input": false, "slideshow": { - "slide_type": "slide" + "slide_type": "skip" } }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { - "model_id": "86742b1b44f04ec693d236a19e49fbc3", - "version_major": 2, - "version_minor": 0 - }, - "text/plain": [ - "Canvas(toolbar=Toolbar(toolitems=[('Home', 'Reset original view', 'home', 'home'), ('Back', 'Back to previous …" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig = plt.figure(figsize=(10,5), tight_layout=True)\n", - "fig.canvas.header_visible = False\n", - "fig.suptitle(r'Damage functions with softening controlled by $g_3( G_\\mathrm{f} )$')\n", - "ax = fig.add_subplot(1, 1, 1, projection='3d')\n", - "bs = MATS1D5BondSlipD(omega_fn='fracture-energy', s_max=0.05)\n", - "bs.omega_fn_.trait_set(kappa_0=0.004, G_f=10)\n", - "de.plot_tau_s(ax, [0,0,0.03], 0.08, 500, bs)\n", - "de.plot_tau_s(ax, [0,0,0.04], 0.08, 500, bs)\n", - "de.plot_tau_s(ax, [0,0,0.05], 0.08, 500, bs) " - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "ce3b8331542648679e052ca8db49f913", + "model_id": "7c1960203b024f5c8871866dd557d4b7", "version_major": 2, "version_minor": 0 }, @@ -1280,6 +1242,8 @@ } ], "source": [ + "import damage2d_explorer as de\n", + "bs = MATS1D5BondSlipD(omega_fn='fracture-energy', s_max=0.05)\n", "explore = de.Explore(bs=bs)\n", "explore.interact()" ] @@ -1311,7 +1275,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 19, "metadata": { "slideshow": { "slide_type": "fragment" diff --git a/tour5_damage_bond/damage2d_explorer.py b/tour5_damage_bond/damage2d_explorer.py index e233a3979233fcdd55517bdbeaaca5c258694df1..7066c0de46a9cb6cbb4bbc49dad20327a5f51884 100644 --- a/tour5_damage_bond/damage2d_explorer.py +++ b/tour5_damage_bond/damage2d_explorer.py @@ -24,9 +24,9 @@ def get_tau_s(s_x_n1, s_y_n1, Eps_n, bs, **kw): np.array([tau_x_n1, tau_y_n1, omega_n1]) ) -def plot_tau_s(ax, Eps_n, s_max, n_s, bs, **kw): +def plot_tau_s(ax, Eps_n, s_min, s_max, n_s, bs, **kw): n_s_i = complex(0,n_s) - s_x_n1, s_y_n1 = np.mgrid[-s_max:s_max:n_s_i, -s_max:s_max:n_s_i] + s_x_n1, s_y_n1 = np.mgrid[s_min:s_max:n_s_i, s_min:s_max:n_s_i] Eps_n1, Sig_n1 = get_tau_s(s_x_n1, s_y_n1, Eps_n, bs, **kw) s_x_n1, s_y_n1, _ = Eps_n1 tau_x_n1, tau_y_n1, _ = Sig_n1 @@ -47,7 +47,7 @@ def plot_tau_s(ax, Eps_n, s_max, n_s, bs, **kw): class Explore(bu.Model): - + name = 'Damage model explorer' bs = bu.Instance(MATS1D5BondSlipD, ()) tree = ['bs'] @@ -97,16 +97,18 @@ class Explore(bu.Model): Sig_arr = np.array(self.Sig_record, dtype=np.float_) Eps_arr = np.array(self.Eps_record, dtype=np.float_) plot_tau_s(ax, Eps_arr[-1, ...], - self.s_max, 500, self.bs) + self.s_min, self.s_max, 500, self.bs) self.plot_Sig_Eps(ax, Sig_arr) ax.plot(self.s_x_t, self.s_y_t, 0, color='red') - s_max = bu.Float(4, BC=True) n_s = bu.Int(500, BC=True) s_x_1 = bu.Float(0, BC=True) s_y_1 = bu.Float(0, BC=True) n_steps = bu.Float(20, BC=True) + s_min = bu.Float(-0.1, BC=True) + s_max = bu.Float(0.1, BC=True) + def run(self, update_progress=lambda t: t): try: self.get_response_i(update_progress) @@ -123,14 +125,8 @@ class Explore(bu.Model): ipw_view = bu.View( bu.Item('s_max'), bu.Item('n_s'), - bu.Item('s_x_1', editor=bu.FloatRangeEditor(low=-5,high=5)), - bu.Item('s_y_1', editor=bu.FloatRangeEditor(low=-5,high=5)), + bu.Item('s_x_1', editor=bu.FloatRangeEditor(low_name='s_min',high_name='s_max')), + bu.Item('s_y_1', editor=bu.FloatRangeEditor(low_name='s_min',high_name='s_max')), bu.Item('n_steps'), - time_editor=bu.ProgressEditor(run_method='run', - reset_method='reset', - interrupt_var='sim_stop', - time_var='t', - time_max='t_max', - ) )