Disabled external gits
This commit is contained in:
5316 files changed
+4563444
-6
No files matched your search
+254
@@ -0,0 +1,254 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook shows a way to solve an inverse problem parameterized with a single quantity.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from stretch_utils import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"We will use the ball for the current experiment."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/ball.obj\")\n",
|
||||
"\n",
|
||||
"be = igl.edges(igl.boundary_facets(t))\n",
|
||||
"bv = np.unique(igl.boundary_facets(t))\n",
|
||||
"e = igl.edges(t)\n",
|
||||
"\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)\n",
|
||||
"length_scale = np.mean(aabb)\n",
|
||||
"\n",
|
||||
"# p = mp.plot(v @ rot.T, t, shading=shadingOptions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 7e5 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"# Determines the pinned indices and the lowest pinned indext\n",
|
||||
"maxZ = np.max(v[:, 2])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 2] > maxZ - 0.1*aabb[2]]\n",
|
||||
"lowest_pin_idx = np.argsort(v[:, 2])[-pin_idx.shape[0]-1]\n",
|
||||
"\n",
|
||||
"ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Manually search for a solution"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n_search = 50\n",
|
||||
"n_steps = 20\n",
|
||||
"thresh = 1.\n",
|
||||
"\n",
|
||||
"v_rest_init = v.copy()\n",
|
||||
"v_rest_tmp = v.copy()\n",
|
||||
"v_target = v.copy()[bv]\n",
|
||||
"\n",
|
||||
"stretches = np.linspace(0.55, 1.1, n_search)\n",
|
||||
"\n",
|
||||
"list_v_rest, list_v_eq, target_closeness = report_stretches(solid, v_rest_init, bv, v_target, stretches, lowest_pin_idx)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.plot(stretches, target_closeness)\n",
|
||||
"plt.title(\"Closeness to target\", fontsize=14)\n",
|
||||
"plt.xlabel(\"Stretch along $z$\", fontsize=12)\n",
|
||||
"plt.ylabel(\"Objective\", fontsize=12)\n",
|
||||
"plt.grid()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Plot best solution"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "665a8bf8e742437bb4b51c4b3d384c4c",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.0020764…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"min_stretch = stretches[np.argmin(target_closeness)]\n",
|
||||
"\n",
|
||||
"stretch_diag = np.array([1., 1., min_stretch])\n",
|
||||
"v_rest_opt = list_v_rest[np.argmin(target_closeness)]\n",
|
||||
"v_eq_opt = list_v_eq[np.argmin(target_closeness)]\n",
|
||||
"\n",
|
||||
"p = mp.plot(v_eq_opt @ rot.T, t, shading=shadingOptions)\n",
|
||||
"p.add_points(v_eq_opt[solid.pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v_rest_opt @ rot.T, be, shading={\"line_color\": \"blue\"})\n",
|
||||
"p.add_edges(v_target @ rot.T, be, shading={\"line_color\": \"red\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,413 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook intends to gather all the functionalities you'll have to implement for assignment 2.3.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"Several meshes are available for you to play with under `data/`: `ball.obj`, `dinosaur.obj`, and `beam.obj`. You can also uncomment the few commented lines below to manipulate a simple mesh made out of 2 tetrahedra."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "cde9c07200964ca49ba30dc0805f86b4",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-1.987469…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/dinosaur.obj\")\n",
|
||||
"# v, _, _, t, _, _ = igl.read_obj(\"../data/beam.obj\")\n",
|
||||
"\n",
|
||||
"# t = np.array([\n",
|
||||
"# [0, 1, 2, 3],\n",
|
||||
"# [1, 2, 3, 4]\n",
|
||||
"# ])\n",
|
||||
"# v = np.array([\n",
|
||||
"# [0., 0., 0.],\n",
|
||||
"# [1., 0., 0.],\n",
|
||||
"# [0., 1., 0.],\n",
|
||||
"# [0., 0., 1.],\n",
|
||||
"# [2/3, 2/3, 2/3]\n",
|
||||
"# ])\n",
|
||||
"\n",
|
||||
"be = igl.edges(igl.boundary_facets(t))\n",
|
||||
"e = igl.edges(t)\n",
|
||||
"\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)\n",
|
||||
"length_scale = np.mean(aabb)\n",
|
||||
"\n",
|
||||
"p = mp.plot(v @ rot.T, t, shading=shadingOptions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 3e8 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"# minX = np.min(v[:, 0])\n",
|
||||
"# pin_idx = np.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]\n",
|
||||
"minZ = np.min(v[:, 2])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 2] < minZ + 0.1*aabb[2]]\n",
|
||||
"\n",
|
||||
"# ee = LinearElasticEnergy(young, poisson)\n",
|
||||
"ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Deform the mesh\n",
|
||||
"\n",
|
||||
"This should now involve elastic forces computation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "7fabee312a0d47a08145c7eca8b09306",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-3.974938…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"v_def = v.copy()\n",
|
||||
"v_def[:, 0] *= 2.\n",
|
||||
"solid.update_def_shape(v_def)\n",
|
||||
"\n",
|
||||
"p = mp.plot(solid.v_def @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"p.add_points(solid.v_def[solid.pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(solid.v_def @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Find equilibrium\n",
|
||||
"\n",
|
||||
"We compare different methods: number of steps, computation time."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n_steps = 1000\n",
|
||||
"thresh = 1.\n",
|
||||
"v_init = v.copy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Gradient descent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:133: RuntimeWarning: invalid value encountered in log\n",
|
||||
" j = np.log(np.linalg.det(jac))\n",
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:148: RuntimeWarning: invalid value encountered in log\n",
|
||||
" self.logJ = np.log(np.linalg.det(jac))\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%run ../src/Utils.py\n",
|
||||
"\n",
|
||||
"report_GD = equilibrium_convergence_report_GD(solid, v_init, n_steps, 1e-8, thresh=thresh)\n",
|
||||
"energies_el_GD = report_GD['energies_el']\n",
|
||||
"energies_ext_GD = report_GD['energies_ext']\n",
|
||||
"energy_GD = energies_el_GD + energies_ext_GD\n",
|
||||
"residuals_GD = report_GD['residuals']\n",
|
||||
"times_GD = report_GD['times']\n",
|
||||
"idx_stop_GD = report_GD['idx_stop']\n",
|
||||
"v_def_GD = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_GD @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_GD @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_GD[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BFGS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"report_BFGS = equilibrium_convergence_report_BFGS(solid, v_init, n_steps, 1e-8, thresh=thresh)\n",
|
||||
"energies_el_BFGS = report_BFGS['energies_el']\n",
|
||||
"energies_ext_BFGS = report_BFGS['energies_ext']\n",
|
||||
"energy_BFGS = energies_el_BFGS + energies_ext_BFGS\n",
|
||||
"residuals_BFGS = report_BFGS['residuals']\n",
|
||||
"times_BFGS = report_BFGS['times']\n",
|
||||
"idx_stop_BFGS = report_BFGS['idx_stop']\n",
|
||||
"v_def_BFGS = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_BFGS @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_BFGS @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_BFGS[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Newton-CG"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"report_NCG = equilibrium_convergence_report_NCG(solid, v_init, n_steps, thresh=thresh)\n",
|
||||
"energies_el_NCG = report_NCG['energies_el']\n",
|
||||
"energies_ext_NCG = report_NCG['energies_ext']\n",
|
||||
"energy_NCG = energies_el_NCG + energies_ext_NCG\n",
|
||||
"residuals_NCG = report_NCG['residuals']\n",
|
||||
"times_NCG = report_NCG['times']\n",
|
||||
"idx_stop_NCG = report_NCG['idx_stop']\n",
|
||||
"v_def_NCG = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_NCG @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_NCG @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_NCG[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Compare the different algorithms"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"cmap = plt.get_cmap('viridis')\n",
|
||||
"colors = cmap(np.linspace(0., 1., 4))\n",
|
||||
"\n",
|
||||
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
|
||||
"fig = plt.figure(figsize=(10, 6))\n",
|
||||
"\n",
|
||||
"axTmp = plt.subplot(gs[0, 0])\n",
|
||||
"axTmp.plot(times_GD[:idx_stop_GD+1], residuals_GD[:idx_stop_GD+1], c=colors[0], \n",
|
||||
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
|
||||
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], residuals_BFGS[:idx_stop_BFGS+1], c=colors[1], \n",
|
||||
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
|
||||
"axTmp.plot(times_NCG[:idx_stop_NCG+1], residuals_NCG[:idx_stop_NCG+1], c=colors[2], \n",
|
||||
" label=\"Newton-CG ({:}its)\".format(idx_stop_NCG))\n",
|
||||
"y_lim = axTmp.get_ylim()\n",
|
||||
"axTmp.set_title(\"Residuals as optimization goes\", fontsize=14)\n",
|
||||
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
|
||||
"axTmp.set_ylabel(\"Force residuals [N]\", fontsize=12)\n",
|
||||
"axTmp.set_ylim(y_lim)\n",
|
||||
"plt.legend(fontsize=12)\n",
|
||||
"plt.grid()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
|
||||
"fig = plt.figure(figsize=(10, 6))\n",
|
||||
"\n",
|
||||
"axTmp = plt.subplot(gs[0, 0])\n",
|
||||
"axTmp.plot(times_GD[:idx_stop_GD+1], energy_GD[:idx_stop_GD+1], c=colors[0], \n",
|
||||
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
|
||||
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], energy_BFGS[:idx_stop_BFGS+1], c=colors[1], \n",
|
||||
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
|
||||
"axTmp.plot(times_NCG[:idx_stop_NCG+1], energy_NCG[:idx_stop_NCG+1], c=colors[2], \n",
|
||||
" label=\"Newton-CG ({:}its)\".format(idx_stop_NCG))\n",
|
||||
"y_lim = axTmp.get_ylim()\n",
|
||||
"axTmp.set_title(\"Total energy as optimization goes\", fontsize=14)\n",
|
||||
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
|
||||
"axTmp.set_ylabel(\"Energy [J]\", fontsize=12)\n",
|
||||
"axTmp.set_ylim(y_lim)\n",
|
||||
"plt.legend(fontsize=12)\n",
|
||||
"plt.grid()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,279 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook intends to gather all the functionalities you'll have to implement for assignment 2.2.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"Several meshes are available for you to play with under `data/`: `ball.obj`, `dinosaur.obj`, and `beam.obj`. You can also uncomment the few commented lines below to manipulate a simple mesh made out of 2 tetrahedra."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/beam.obj\")\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 12,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 10e6 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"minX = np.min(v[:, 0])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]\n",
|
||||
"\n",
|
||||
"ee = LinearElasticEnergy(young, poisson)\n",
|
||||
"neo_ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n",
|
||||
"neo_solid = ElasticSolid(v, t, neo_ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate Elastic Energy Gradient (Elastic Forces) using Finite Differences on Elastic Energy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fd_validation_elastic(solid)\n",
|
||||
"fd_validation_elastic(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate External Energy Gradient (External Forces) using Finite Differences on External Energy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fd_validation_ext(solid)\n",
|
||||
"fd_validation_ext(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate Elastic Energy Force Differentials (Elastic Forces) using Finite Differences on Elastic Forces"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 10,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/opt/notebooks/assignment_2_3/src/Utils.py:402: RuntimeWarning: divide by zero encountered in double_scalars\n",
|
||||
" errors.append(norm_error/norm_an_df)\n",
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:134: RuntimeWarning: invalid value encountered in log\n",
|
||||
" j = np.log(np.linalg.det(jac))\n",
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:149: RuntimeWarning: invalid value encountered in log\n",
|
||||
" self.logJ = np.log(np.linalg.det(jac))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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\n",
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%run ../src/Utils.py\n",
|
||||
"\n",
|
||||
"v_def = v.copy()\n",
|
||||
"v_def[:, 0] *= 2.\n",
|
||||
"solid.update_def_shape(v_def)\n",
|
||||
"neo_solid.update_def_shape(v_def)\n",
|
||||
"\n",
|
||||
"fd_validation_elastic_differentials(solid)\n",
|
||||
"fd_validation_elastic_differentials(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,254 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook shows a way to solve an inverse problem parameterized with a single quantity.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from stretch_utils import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"We will use the ball for the current experiment."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/ball.obj\")\n",
|
||||
"\n",
|
||||
"be = igl.edges(igl.boundary_facets(t))\n",
|
||||
"bv = np.unique(igl.boundary_facets(t))\n",
|
||||
"e = igl.edges(t)\n",
|
||||
"\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)\n",
|
||||
"length_scale = np.mean(aabb)\n",
|
||||
"\n",
|
||||
"# p = mp.plot(v @ rot.T, t, shading=shadingOptions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 7e5 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"# Determines the pinned indices and the lowest pinned indext\n",
|
||||
"maxZ = np.max(v[:, 2])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 2] > maxZ - 0.1*aabb[2]]\n",
|
||||
"lowest_pin_idx = np.argsort(v[:, 2])[-pin_idx.shape[0]-1]\n",
|
||||
"\n",
|
||||
"ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Manually search for a solution"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {
|
||||
"scrolled": true
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n_search = 50\n",
|
||||
"n_steps = 20\n",
|
||||
"thresh = 1.\n",
|
||||
"\n",
|
||||
"v_rest_init = v.copy()\n",
|
||||
"v_rest_tmp = v.copy()\n",
|
||||
"v_target = v.copy()[bv]\n",
|
||||
"\n",
|
||||
"stretches = np.linspace(0.55, 1.1, n_search)\n",
|
||||
"\n",
|
||||
"list_v_rest, list_v_eq, target_closeness = report_stretches(solid, v_rest_init, bv, v_target, stretches, lowest_pin_idx)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"plt.plot(stretches, target_closeness)\n",
|
||||
"plt.title(\"Closeness to target\", fontsize=14)\n",
|
||||
"plt.xlabel(\"Stretch along $z$\", fontsize=12)\n",
|
||||
"plt.ylabel(\"Objective\", fontsize=12)\n",
|
||||
"plt.grid()\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Plot best solution"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "665a8bf8e742437bb4b51c4b3d384c4c",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(0.0020764…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"min_stretch = stretches[np.argmin(target_closeness)]\n",
|
||||
"\n",
|
||||
"stretch_diag = np.array([1., 1., min_stretch])\n",
|
||||
"v_rest_opt = list_v_rest[np.argmin(target_closeness)]\n",
|
||||
"v_eq_opt = list_v_eq[np.argmin(target_closeness)]\n",
|
||||
"\n",
|
||||
"p = mp.plot(v_eq_opt @ rot.T, t, shading=shadingOptions)\n",
|
||||
"p.add_points(v_eq_opt[solid.pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v_rest_opt @ rot.T, be, shading={\"line_color\": \"blue\"})\n",
|
||||
"p.add_edges(v_target @ rot.T, be, shading={\"line_color\": \"red\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,467 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook intends to gather all the functionalities you'll have to implement for assignment 2.3.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"Several meshes are available for you to play with under `data/`: `ball.obj`, `dinosaur.obj`, and `beam.obj`. You can also uncomment the few commented lines below to manipulate a simple mesh made out of 2 tetrahedra."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "bc63cdd8cfe14603b4e54d871b4206d7",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-1.987469…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/dinosaur.obj\")\n",
|
||||
"# v, _, _, t, _, _ = igl.read_obj(\"../data/beam.obj\")\n",
|
||||
"\n",
|
||||
"# t = np.array([\n",
|
||||
"# [0, 1, 2, 3],\n",
|
||||
"# [1, 2, 3, 4]\n",
|
||||
"# ])\n",
|
||||
"# v = np.array([\n",
|
||||
"# [0., 0., 0.],\n",
|
||||
"# [1., 0., 0.],\n",
|
||||
"# [0., 1., 0.],\n",
|
||||
"# [0., 0., 1.],\n",
|
||||
"# [2/3, 2/3, 2/3]\n",
|
||||
"# ])\n",
|
||||
"\n",
|
||||
"be = igl.edges(igl.boundary_facets(t))\n",
|
||||
"e = igl.edges(t)\n",
|
||||
"\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)\n",
|
||||
"length_scale = np.mean(aabb)\n",
|
||||
"\n",
|
||||
"p = mp.plot(v @ rot.T, t, shading=shadingOptions)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 3e8 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"# minX = np.min(v[:, 0])\n",
|
||||
"# pin_idx = np.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]\n",
|
||||
"minZ = np.min(v[:, 2])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 2] < minZ + 0.1*aabb[2]]\n",
|
||||
"\n",
|
||||
"# ee = LinearElasticEnergy(young, poisson)\n",
|
||||
"ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Deform the mesh\n",
|
||||
"\n",
|
||||
"This should now involve elastic forces computation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "b6c6920e14be4332b4a96e814c9236da",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-3.974938…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"v_def = v.copy()\n",
|
||||
"v_def[:, 0] *= 2.\n",
|
||||
"solid.update_def_shape(v_def)\n",
|
||||
"\n",
|
||||
"p = mp.plot(solid.v_def @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"p.add_points(solid.v_def[solid.pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(solid.v_def @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Find equilibrium\n",
|
||||
"\n",
|
||||
"We compare different methods: number of steps, computation time."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"n_steps = 1000\n",
|
||||
"thresh = 1.\n",
|
||||
"v_init = v.copy()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Gradient descent"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "fe18307f9c24439db1ed8fc58928c284",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-1.987469…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 6,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%run ../src/Utils.py\n",
|
||||
"\n",
|
||||
"report_GD = equilibrium_convergence_report_GD(solid, v_init, n_steps, 1e-8, thresh=thresh)\n",
|
||||
"energies_el_GD = report_GD['energies_el']\n",
|
||||
"energies_ext_GD = report_GD['energies_ext']\n",
|
||||
"energy_GD = energies_el_GD + energies_ext_GD\n",
|
||||
"residuals_GD = report_GD['residuals']\n",
|
||||
"times_GD = report_GD['times']\n",
|
||||
"idx_stop_GD = report_GD['idx_stop']\n",
|
||||
"v_def_GD = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_GD @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_GD @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_GD[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## BFGS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"application/vnd.jupyter.widget-view+json": {
|
||||
"model_id": "0621481088744a34af8662b30613ceac",
|
||||
"version_major": 2,
|
||||
"version_minor": 0
|
||||
},
|
||||
"text/plain": [
|
||||
"Renderer(camera=PerspectiveCamera(children=(DirectionalLight(color='white', intensity=0.6, position=(-0.297981…"
|
||||
]
|
||||
},
|
||||
"metadata": {},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"3"
|
||||
]
|
||||
},
|
||||
"execution_count": 7,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"report_BFGS = equilibrium_convergence_report_BFGS(solid, v_init, n_steps, 1e-8, thresh=thresh)\n",
|
||||
"energies_el_BFGS = report_BFGS['energies_el']\n",
|
||||
"energies_ext_BFGS = report_BFGS['energies_ext']\n",
|
||||
"energy_BFGS = energies_el_BFGS + energies_ext_BFGS\n",
|
||||
"residuals_BFGS = report_BFGS['residuals']\n",
|
||||
"times_BFGS = report_BFGS['times']\n",
|
||||
"idx_stop_BFGS = report_BFGS['idx_stop']\n",
|
||||
"v_def_BFGS = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_BFGS @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_BFGS @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_BFGS[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Newton-CG"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Energy: -127985.65419881282 Force norm: 287742.8969935862 Line search Iters: 0\n",
|
||||
"Energy: -178892.14400109363 Force norm: 182952.00531737506 Line search Iters: 0\n",
|
||||
"Energy: -206901.42653635694 Force norm: 151950.01953001413 Line search Iters: 0\n",
|
||||
"Energy: -227792.85782151608 Force norm: 135158.66283929092 Line search Iters: 0\n",
|
||||
"Energy: -244838.85692066932 Force norm: 123433.77675577633 Line search Iters: 0\n",
|
||||
"Energy: -259318.48388755036 Force norm: 114389.35466936302 Line search Iters: 0\n",
|
||||
"Energy: -271937.0843840749 Force norm: 107190.15322070086 Line search Iters: 0\n",
|
||||
"Energy: -283160.0740997393 Force norm: 101411.77988596291 Line search Iters: 0\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"report_NCG = equilibrium_convergence_report_NCG(solid, v_init, n_steps, thresh=thresh)\n",
|
||||
"energies_el_NCG = report_NCG['energies_el']\n",
|
||||
"energies_ext_NCG = report_NCG['energies_ext']\n",
|
||||
"energy_NCG = energies_el_NCG + energies_ext_NCG\n",
|
||||
"residuals_NCG = report_NCG['residuals']\n",
|
||||
"times_NCG = report_NCG['times']\n",
|
||||
"idx_stop_NCG = report_NCG['idx_stop']\n",
|
||||
"v_def_NCG = solid.v_def.copy()\n",
|
||||
"\n",
|
||||
"# Lastly, plot the resulting shape\n",
|
||||
"p = mp.plot(v_def_NCG @ rot.T, solid.t, shading=shadingOptions)\n",
|
||||
"forcesScale = 2 * np.max(np.linalg.norm(solid.f_ext, axis=1))\n",
|
||||
"p.add_lines(v_def_NCG @ rot.T, (solid.v_def + solid.f_ext / forcesScale) @ rot.T)\n",
|
||||
"p.add_points(v_def_NCG[pin_idx, :] @ rot.T, shading={\"point_color\":\"black\", \"point_size\": 0.1 * length_scale})\n",
|
||||
"p.add_edges(v @ rot.T, be, shading={\"line_color\": \"blue\"})"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Compare the different algorithms"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"cmap = plt.get_cmap('viridis')\n",
|
||||
"colors = cmap(np.linspace(0., 1., 4))\n",
|
||||
"\n",
|
||||
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
|
||||
"fig = plt.figure(figsize=(10, 6))\n",
|
||||
"\n",
|
||||
"axTmp = plt.subplot(gs[0, 0])\n",
|
||||
"axTmp.plot(times_GD[:idx_stop_GD+1], residuals_GD[:idx_stop_GD+1], c=colors[0], \n",
|
||||
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
|
||||
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], residuals_BFGS[:idx_stop_BFGS+1], c=colors[1], \n",
|
||||
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
|
||||
"axTmp.plot(times_NCG[:idx_stop_NCG+1], residuals_NCG[:idx_stop_NCG+1], c=colors[2], \n",
|
||||
" label=\"Newton-CG ({:}its)\".format(idx_stop_NCG))\n",
|
||||
"y_lim = axTmp.get_ylim()\n",
|
||||
"axTmp.set_title(\"Residuals as optimization goes\", fontsize=14)\n",
|
||||
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
|
||||
"axTmp.set_ylabel(\"Force residuals [N]\", fontsize=12)\n",
|
||||
"axTmp.set_ylim(y_lim)\n",
|
||||
"plt.legend(fontsize=12)\n",
|
||||
"plt.grid()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"gs = gridspec.GridSpec(nrows=1, ncols=1, width_ratios=[1], height_ratios=[1])\n",
|
||||
"fig = plt.figure(figsize=(10, 6))\n",
|
||||
"\n",
|
||||
"axTmp = plt.subplot(gs[0, 0])\n",
|
||||
"axTmp.plot(times_GD[:idx_stop_GD+1], energy_GD[:idx_stop_GD+1], c=colors[0], \n",
|
||||
" label=\"Gradient Descent ({:}its)\".format(idx_stop_GD))\n",
|
||||
"axTmp.plot(times_BFGS[:idx_stop_BFGS+1], energy_BFGS[:idx_stop_BFGS+1], c=colors[1], \n",
|
||||
" label=\"BFGS ({:}its)\".format(idx_stop_BFGS))\n",
|
||||
"axTmp.plot(times_NCG[:idx_stop_NCG+1], energy_NCG[:idx_stop_NCG+1], c=colors[2], \n",
|
||||
" label=\"Newton-CG ({:}its)\".format(idx_stop_NCG))\n",
|
||||
"y_lim = axTmp.get_ylim()\n",
|
||||
"axTmp.set_title(\"Total energy as optimization goes\", fontsize=14)\n",
|
||||
"axTmp.set_xlabel(\"Computation time [s]\", fontsize=12)\n",
|
||||
"axTmp.set_ylabel(\"Energy [J]\", fontsize=12)\n",
|
||||
"axTmp.set_ylim(y_lim)\n",
|
||||
"plt.legend(fontsize=12)\n",
|
||||
"plt.grid()\n",
|
||||
"plt.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
@@ -0,0 +1,289 @@
|
||||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Description\n",
|
||||
"\n",
|
||||
"This notebook intends to gather all the functionalities you'll have to implement for assignment 2.2.\n",
|
||||
"\n",
|
||||
"# Load libraries"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 13,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"import igl\n",
|
||||
"import meshplot as mp\n",
|
||||
"import time\n",
|
||||
"\n",
|
||||
"import sys as _sys\n",
|
||||
"_sys.path.append(\"../src\")\n",
|
||||
"from elasticsolid import *\n",
|
||||
"from elasticenergy import *\n",
|
||||
"from matplotlib import gridspec\n",
|
||||
"import matplotlib.pyplot as plt\n",
|
||||
"\n",
|
||||
"shadingOptions = {\n",
|
||||
" \"flat\":True,\n",
|
||||
" \"wireframe\":False, \n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"rot = np.array(\n",
|
||||
" [[1, 0, 0 ],\n",
|
||||
" [0, 0, 1],\n",
|
||||
" [0, -1, 0 ]]\n",
|
||||
")"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Load mesh\n",
|
||||
"\n",
|
||||
"Several meshes are available for you to play with under `data/`: `ball.obj`, `dinosaur.obj`, and `beam.obj`. You can also uncomment the few commented lines below to manipulate a simple mesh made out of 2 tetrahedra."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 14,
|
||||
"metadata": {
|
||||
"scrolled": false
|
||||
},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"v, _, _, t, _, _ = igl.read_obj(\"../data/beam.obj\")\n",
|
||||
"aabb = np.max(v, axis=0) - np.min(v, axis=0)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Linear/Non-Linear Elastic Solid\n",
|
||||
"\n",
|
||||
"## Instantiation\n",
|
||||
"\n",
|
||||
"We first specify the elasticity model to use for the elastic solid, as well as pinned vertices, and volumetric forces."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 15,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"rho = 131 # [kg.m-3]\n",
|
||||
"young = 10e6 # [Pa] \n",
|
||||
"poisson = 0.2\n",
|
||||
"force_mass = np.zeros(shape = (3,))\n",
|
||||
"force_mass[2] = - rho * 9.81\n",
|
||||
"\n",
|
||||
"minX = np.min(v[:, 0])\n",
|
||||
"pin_idx = np.arange(v.shape[0])[v[:, 0] < minX + 0.2*aabb[0]]\n",
|
||||
"\n",
|
||||
"ee = LinearElasticEnergy(young, poisson)\n",
|
||||
"neo_ee = NeoHookeanElasticEnergy(young, poisson)\n",
|
||||
"solid = ElasticSolid(v, t, ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n",
|
||||
"neo_solid = ElasticSolid(v, t, neo_ee, rho=rho, pin_idx=pin_idx, f_mass=force_mass)\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate Elastic Energy Gradient (Elastic Forces) using Finite Differences on Elastic Energy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 16,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fd_validation_elastic(solid)\n",
|
||||
"fd_validation_elastic(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate External Energy Gradient (External Forces) using Finite Differences on External Energy"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 17,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"fd_validation_ext(solid)\n",
|
||||
"fd_validation_ext(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Validate Elastic Energy Force Differentials (Elastic Forces) using Finite Differences on Elastic Forces"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 18,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
},
|
||||
{
|
||||
"name": "stderr",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:145: RuntimeWarning: invalid value encountered in log\n",
|
||||
" self.logJ = np.log(np.linalg.det(jac))\n",
|
||||
"/opt/notebooks/assignment_2_3/notebook/../src/elasticenergy.py:131: RuntimeWarning: invalid value encountered in log\n",
|
||||
" j = np.log(np.linalg.det(jac))\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 432x288 with 1 Axes>"
|
||||
]
|
||||
},
|
||||
"metadata": {
|
||||
"needs_background": "light"
|
||||
},
|
||||
"output_type": "display_data"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%run ../src/Utils.py\n",
|
||||
"\n",
|
||||
"v_def = v.copy()\n",
|
||||
"v_def[:, 0] *= 2.\n",
|
||||
"solid.update_def_shape(v_def)\n",
|
||||
"neo_solid.update_def_shape(v_def)\n",
|
||||
"\n",
|
||||
"fd_validation_elastic_differentials(solid)\n",
|
||||
"fd_validation_elastic_differentials(neo_solid)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": null,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": []
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "Python 3 (ipykernel)",
|
||||
"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.7"
|
||||
},
|
||||
"toc": {
|
||||
"base_numbering": 1,
|
||||
"nav_menu": {},
|
||||
"number_sections": true,
|
||||
"sideBar": true,
|
||||
"skip_h1_title": false,
|
||||
"title_cell": "Table of Contents",
|
||||
"title_sidebar": "Contents",
|
||||
"toc_cell": false,
|
||||
"toc_position": {},
|
||||
"toc_section_display": true,
|
||||
"toc_window_display": false
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
Reference in new issue
Block a user