{ "cells": [ { "cell_type": "markdown", "id": "e3d965aa", "metadata": {}, "source": [ "# 9 · Contact: Dropping an Elastic Block on the Floor\n", "\n", "Inertia + gravity + contact together: an elastic block is **dropped** onto a flat\n", "floor and bounces. We step it with Backward Euler and watch the three energies\n", "trade off — gravity builds **kinetic** energy on the way down; impact spikes\n", "the **contact** penalty and stores **elastic** energy; the rebound reverses it.\n", "\n", "Each step solves one minimization with Newton,\n", "\n", "$$\n", "x_{n+1} = \\arg\\min_x\\; \\tfrac{1}{2h^2}\\lVert x - \\tilde{x}\\rVert_M^2\n", " + E_{\\text{elastic}}(x) + E_{\\text{gravity}}(x) + E_{\\text{floor}}(x),\n", "$$\n", "\n", "where $\\tilde{x} = x_n + h\\,v_n$ is the momentum prediction and the floor term is a\n", "penalty spring on any vertex below the plane." ] }, { "cell_type": "code", "execution_count": 1, "id": "85813584", "metadata": { "execution": { "iopub.execute_input": "2026-06-09T05:31:48.873369Z", "iopub.status.busy": "2026-06-09T05:31:48.873230Z", "iopub.status.idle": "2026-06-09T05:31:49.374766Z", "shell.execute_reply": "2026-06-09T05:31:49.374501Z" } }, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import scipy as sp\n", "import matplotlib.pyplot as plt\n", "import simkit\n", "from simkit.solvers import newton_solver\n", "import utils" ] }, { "cell_type": "markdown", "id": "2c871605", "metadata": {}, "source": [ "## Block, floor, and one Backward-Euler simulator\n", "\n", "`DropSim` composes four terms from `utils` — the **elastic** material, the\n", "**gravity** potential, a **floor** penalty (a spring on any vertex that drops\n", "below the plane through `[0, FLOOR_Y]` with upward normal `[0, 1]`), and the\n", "backward-Euler **inertia** — and sums them one per line, exactly as the\n", "Newton solver wants. Each `step()` refreshes the inertia prediction $\\tilde{x} =\n", "x_n + h\\,v_n$, Newton-solves for $x_{n+1}$, and updates the velocity." ] }, { "cell_type": "code", "execution_count": 2, "id": "5a99c911", "metadata": { "execution": { "iopub.execute_input": "2026-06-09T05:31:49.375947Z", "iopub.status.busy": "2026-06-09T05:31:49.375867Z", "iopub.status.idle": "2026-06-09T05:31:49.378363Z", "shell.execute_reply": "2026-06-09T05:31:49.378175Z" } }, "outputs": [], "source": [ "FLOOR_Y = -0.6\n", "\n", "class DropSim:\n", " \"\"\"Drop an elastic block on a floor: elastic + gravity + floor + inertia,\n", " stepped with Backward Euler and Newton.\"\"\"\n", "\n", " def __init__(self, X, T, h=0.01):\n", " self.p = utils.precompute(X, T, ym=1e5, pr=0.4, rho=1e3, gravity=-9.8)\n", " self.psi = utils.make_material(\"Neo-Hookean\")\n", " self.gravity = utils.Gravity(self.p.f_g)\n", " self.floor = utils.PlaneContact(1e5, [0.0, FLOOR_Y], [0.0, 1.0], self.p.M_n, self.p.dim)\n", " self.inertia = utils.Inertia(self.p.M, h)\n", " self.x = X.reshape(-1, 1).astype(float)\n", " self.v = np.zeros_like(self.x)\n", "\n", " def energy(self, x):\n", " E_elastic = self.psi.energy(x, self.p)\n", " E_gravity = self.gravity.energy(x)\n", " E_floor = self.floor.energy(x)\n", " E_inertia = self.inertia.energy(x)\n", " return E_elastic + E_gravity + E_floor + E_inertia\n", "\n", " def gradient(self, x):\n", " g_elastic = self.psi.gradient(x, self.p)\n", " g_gravity = self.gravity.gradient(x)\n", " g_floor = self.floor.gradient(x)\n", " g_inertia = self.inertia.gradient(x)\n", " return g_elastic + g_gravity + g_floor + g_inertia\n", "\n", " def hessian(self, x):\n", " H_elastic = self.psi.hessian(x, self.p)\n", " H_floor = self.floor.hessian(x)\n", " H_inertia = self.inertia.hessian(x)\n", " return H_elastic + H_floor + H_inertia\n", "\n", " def step(self):\n", " self.inertia.update(self.x, self.v)\n", " x_new = newton_solver(self.x, self.energy, self.gradient, self.hessian,\n", " max_iter=8, do_line_search=True)\n", " self.v = (x_new - self.x) / self.inertia.h\n", " self.x = x_new\n", " return self.x.reshape(self.p.n, self.p.dim)" ] }, { "cell_type": "markdown", "id": "5c078ba9", "metadata": {}, "source": [ "## Run the drop, recording elastic / kinetic / contact energy each step\n", "\n", "We start the block up high and step it 130 times. At each step we record the\n", "**elastic** energy (the material term), the **kinetic** energy\n", "$\\tfrac{1}{2}v^\\top M v$, and the **contact** energy (the floor penalty)." ] }, { "cell_type": "code", "execution_count": 3, "id": "36e2300e", "metadata": { "execution": { "iopub.execute_input": "2026-06-09T05:31:49.379302Z", "iopub.status.busy": "2026-06-09T05:31:49.379250Z", "iopub.status.idle": "2026-06-09T05:31:49.747500Z", "shell.execute_reply": "2026-06-09T05:31:49.747297Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "impact near t = 0.55s\n" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, T = utils.triangulated_grid(nx=10, ny=8, width=0.5, height=0.5)\n", "X[:, 1] += 1.0 # start up high\n", "\n", "sim = DropSim(X, T, h=0.01)\n", "states, t_axis = [X.copy()], [0.0]\n", "E_el, E_kin, E_con = [0.0], [0.0], [0.0]\n", "for s in range(130):\n", " U_next = sim.step()\n", " E_el.append(sim.psi.energy(sim.x, sim.p))\n", " E_kin.append(0.5 * float((sim.v.T @ (sim.p.M @ sim.v))[0, 0]))\n", " E_con.append(sim.floor.energy(sim.x))\n", " states.append(U_next.copy())\n", " t_axis.append((s + 1) * sim.inertia.h)\n", "\n", "t_axis = np.array(t_axis)\n", "series = {\"elastic\": np.array(E_el), \"kinetic\": np.array(E_kin), \"contact\": np.array(E_con)}\n", "print(f\"impact near t = {t_axis[int(np.argmax(E_con))]:.2f}s\")\n", "\n", "utils.line_plot(t_axis, series, xlabel=\"time (s)\", ylabel=\"energy\",\n", " colors=utils.ENERGY_COLORS, title=\"Energy exchange during the drop\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 4, "id": "554ea797", "metadata": { "execution": { "iopub.execute_input": "2026-06-09T05:31:49.748435Z", "iopub.status.busy": "2026-06-09T05:31:49.748372Z", "iopub.status.idle": "2026-06-09T05:31:52.992931Z", "shell.execute_reply": "2026-06-09T05:31:52.992635Z" } }, "outputs": [ { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fig, anim = utils.animate_dynamics(states, T, t_axis, series, lims=((-1.0, 1.0), (-0.8, 1.4)),\n", " xlabel=\"time (s)\", ylabel=\"energy\", colors=utils.ENERGY_COLORS, floor_y=FLOOR_Y,\n", " scene_title=\"elastic block dropping on the floor\",\n", " title=\"elastic / kinetic / contact energy\", fps=25)\n", "utils.show_video(fig, anim, \"media/09_contact_plane.mp4\", fps=25)" ] }, { "cell_type": "markdown", "id": "f22d3a99", "metadata": {}, "source": [ "### Takeaways\n", "* Gravity → **kinetic** on the way down; impact → **elastic** +\n", " **contact**; rebound reverses it.\n", "* The **contact** penalty spikes exactly at impact.\n", "* Penalty contact + Backward Euler lose a little energy each bounce (the spring is\n", " springy, BE damps), so the block doesn't bounce back to full height." ] } ], "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.13.9" } }, "nbformat": 4, "nbformat_minor": 5 }