{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Type 1 transition " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import json\n", "import matplotlib.pylab as plt\n", "%matplotlib inline\n", "\n", "from tyssue import Sheet, config\n", "from tyssue import SheetGeometry as geom\n", "\n", "# What we're here for\n", "from tyssue.topology.sheet_topology import type1_transition\n", "\n", "## model and solver\n", "from tyssue.dynamics.sheet_vertex_model import SheetModel as model\n", "from tyssue.solvers.quasistatic import QSSolver\n", "\n", "# 2D plotting\n", "from tyssue.draw import sheet_view\n", "\n", "#I/O\n", "from tyssue.io import hdf5\n", "plt.style.use('bmh')\n", "\n", "import logging\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![Type 1 transition](../../doc/illus/t1_transition.png)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "solver = QSSolver()\n", "\n", "h5store = 'data/small_hexagonal.hf5'\n", "datasets = hdf5.load_datasets(h5store,\n", " data_names=['face', 'vert', 'edge'])\n", "specs = config.geometry.cylindrical_sheet()\n", "sheet = Sheet('emin', datasets, specs)\n", "\n", "\n", "geom.update_all(sheet)\n", "\n", "nondim_specs = config.dynamics.quasistatic_sheet_spec()\n", "dim_model_specs = model.dimensionalize(nondim_specs)\n", "sheet.update_specs(dim_model_specs, reset=True)\n", "\n", "solver_settings = {'options': {'gtol':1e-4}}\n", "\n", "sheet.get_opposite()\n", "sheet.vert_df.is_active = 0\n", "\n", "active_edges = (sheet.edge_df['opposite'] > -1)\n", "active_verts = set(sheet.edge_df[active_edges]['srce'])\n", "\n", "sheet.vert_df.loc[active_verts, 'is_active'] = 1\n", "\n", "fig, ax = sheet_view(sheet, ['z', 'x'],\n", " edge={'head_width': 0.5},\n", " vert={'visible': False})\n", "fig.set_size_inches(10, 6)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "res = solver.find_energy_min(sheet, geom, model, **solver_settings)\n", "fig, ax = sheet_view(sheet, mode=\"quick\", coords=['z', 'x'])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tyssue.topology.sheet_topology import type1_transition" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type1_transition(sheet, 84)\n", "geom.update_all(sheet)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "fig, ax = sheet_view(sheet, ['z', 'x'], mode=\"quick\")\n", "\n", "ax.set_xlim(3, 10)\n", "ax.set_ylim(0, 5)\n", "\n", "ax.set_aspect('equal')\n", "fig.set_size_inches(8, 5)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "res = solver.find_energy_min(sheet, geom, model)\n", "print(res['success'])\n", "fig, ax = sheet_view(sheet, ['z', 'x'], mode=\"quick\")\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sheet.validate()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Type 1 transitions can also be performed on edge faces" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from tyssue.generation import three_faces_sheet\n", "\n", "sheet = Sheet('3f', *three_faces_sheet())\n", "geom.update_all(sheet)\n", "fig, ax = sheet_view(sheet, edge={'head_width': 0.05})\n", "fig.set_size_inches(8, 8)\n", "\n", "for face, data in sheet.face_df.iterrows():\n", " ax.text(data.x, data.y, face)\n", "for vert, data in sheet.vert_df.iterrows():\n", " ax.text(data.x, data.y+0.1, vert)\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "type1_transition(sheet, 0, epsilon=0.4)\n", "sheet.reset_index()\n", "\n", "geom.update_all(sheet)\n", "\n", "fig, ax = sheet_view(sheet, edge={'head_width': 0.05})\n", "fig.set_size_inches(8, 8)\n", "for face, data in sheet.face_df.iterrows():\n", " ax.text(data.x, data.y, face)\n", "\n", "for vert, data in sheet.vert_df.iterrows():\n", " ax.text(data.x, data.y+0.1, vert)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type1_transition(sheet, 16, epsilon=0.5)\n", "\n", "geom.update_all(sheet)\n", "\n", "fig, ax = sheet_view(sheet, edge={'head_width': 0.05})\n", "fig.set_size_inches(8, 8)\n", "for face, data in sheet.face_df.iterrows():\n", " ax.text(data.x, data.y, face)\n", "\n", "for vert, data in sheet.vert_df.iterrows():\n", " ax.text(data.x, data.y+0.1, vert)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sheet.validate()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "type1_transition(sheet, 17, epsilon=0.5)\n", "\n", "geom.update_all(sheet)\n", "print(sheet.validate())\n", "\n", "fig, ax = sheet_view(sheet, edge={'head_width': 0.05})\n", "fig.set_size_inches(8, 8)\n", "for face, data in sheet.face_df.iterrows():\n", " ax.text(data.x, data.y, face)\n", "\n", "for vert, data in sheet.vert_df.iterrows():\n", " ax.text(data.x, data.y+0.1, vert)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "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.7.6" } }, "nbformat": 4, "nbformat_minor": 1 }