{ "cells": [ { "cell_type": "markdown", "id": "51921015-2e7e-4962-90c5-690d5ac32e95", "metadata": {}, "source": [ "# Using LayeredPlanarBiaxial" ] }, { "cell_type": "code", "execution_count": 1, "id": "5aff7647-57d6-4a57-a774-4e2fe6aef982", "metadata": {}, "outputs": [], "source": [ "import pymecht as pmt\n", "from matplotlib import pyplot as plt\n", "import numpy as np" ] }, { "cell_type": "markdown", "id": "8c769b23-12b6-416e-85d7-3cf4aa950b04", "metadata": {}, "source": [ "We start by creating two `PlanarBiaxialExtension` samples with different material properties and different **reference length**. We also set the fiber directions for the two layers differently." ] }, { "cell_type": "code", "execution_count": 2, "id": "2c74b2ec-9e52-40b8-b1cb-c491c67245ad", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Fiber directions set to 45 degrees ( 0.7853981633974483 radians)\n", "Fiber directions set to 30 degrees ( 0.5235987755982988 radians)\n" ] } ], "source": [ "mat1 = pmt.MatModel('nh','goh')\n", "strip_1 = pmt.PlanarBiaxialExtension(mat1,disp_measure='length', force_measure='force')\n", "pmt.specify_two_fibers(strip_1,45)\n", "params = strip_1.parameters\n", "params.set('mu_0',22.57)\n", "params.set('k1_1',276.45)\n", "params.set('k2_1',42.85)\n", "params.set('k3_1',0.246)\n", "params.set('L10',20)\n", "params.set('L20',21)\n", "strip_1.parameters = params\n", "\n", "mat2 = pmt.MatModel('nh','goh')\n", "strip_2 = pmt.PlanarBiaxialExtension(mat2,disp_measure='length', force_measure='force')\n", "pmt.specify_two_fibers(strip_2,30)\n", "params = strip_2.parameters\n", "params.set('mu_0',14.30)\n", "params.set('k1_1',290.22)\n", "params.set('k2_1',4.87)\n", "params.set('k3_1',0.224)\n", "params.set('L10',22)\n", "params.set('L20',22)\n", "strip_2.parameters = params" ] }, { "cell_type": "markdown", "id": "36c8b865-6c91-440e-ab2e-dca81a0bf847", "metadata": {}, "source": [ "Next, we combine them using `LayeredPlanarBiaxial` and check its parameters. We notice that all the parameters for the first \"layer\" have `_layer0` appended to their names, and those for second layer have `_layer1` appended, etc." ] }, { "cell_type": "code", "execution_count": 3, "id": "c37962ff-4ac3-432e-b8fb-b48c0ba70e15", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------------------------------------------------------------\n", "Keys Value Fixed? Lower bound Upper bound \n", "------------------------------------------------------------------\n", "L10_layer0 20.00 No 1.00e-04 1.00e+03 \n", "L20_layer0 21.00 No 1.00e-04 1.00e+03 \n", "thick_layer0 1.00 No 1.00e-04 1.00e+03 \n", "mu_0_layer0 22.57 No 1.00e-04 1.00e+02 \n", "k1_1_layer0 2.76e+02 No 0.10 30.00 \n", "k2_1_layer0 42.85 No 0.10 30.00 \n", "k3_1_layer0 0.25 No 0.00 0.33 \n", "L10_layer1 22.00 No 1.00e-04 1.00e+03 \n", "L20_layer1 22.00 No 1.00e-04 1.00e+03 \n", "thick_layer1 1.00 No 1.00e-04 1.00e+03 \n", "mu_0_layer1 14.30 No 1.00e-04 1.00e+02 \n", "k1_1_layer1 2.90e+02 No 0.10 30.00 \n", "k2_1_layer1 4.87 No 0.10 30.00 \n", "k3_1_layer1 0.22 No 0.00 0.33 \n", "------------------------------------------------------------------\n", "\n" ] } ], "source": [ "combined = pmt.LayeredPlanarBiaxial(strip_1,strip_2)\n", "print(combined.parameters)" ] }, { "cell_type": "markdown", "id": "ed0569db-936a-4e84-8293-87a079e4daf2", "metadata": {}, "source": [ "We impose a deformed length varying between 20 and 25 and calculate and plot the resulting forces along the two axes." ] }, { "cell_type": "code", "execution_count": 4, "id": "e7c8a6e1-65c4-4239-9f62-fb1abd30036a", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def_length1 = np.linspace(20,25,30)\n", "def_length2 = np.linspace(20,25,30)\n", "def_length = np.vstack((def_length1,def_length2)).T\n", "force = combined.disp_controlled(def_length)\n", "\n", "fig,ax = plt.subplots(1,1,figsize=(4*0.7,3*0.7))\n", "ax.plot(def_length[:,0],force[:,0],'-o',color='r',label='x')\n", "ax.plot(def_length[:,1],force[:,1],'-o',color='b',label='y')\n", "ax.set_xlabel('Deformed length')\n", "ax.set_ylabel('Applied force')\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "caff3802-3988-4dd6-801e-10ba2cf945fd", "metadata": {}, "source": [ "Moreover, we calculate the \"free\" length of the layered structure by applied a zero force and find that it is somewhere between the lengths of the two layers. " ] }, { "cell_type": "code", "execution_count": 5, "id": "3bfc55fd-50be-46d1-8e44-91324a80dd72", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Length without applied force is [20.59713974 21.27247465]\n" ] } ], "source": [ "zero_force_length = combined.force_controlled(np.array([0,0]),x0=np.array([21,21]))\n", "print('Length without applied force is', zero_force_length)" ] }, { "cell_type": "markdown", "id": "e95f20d3-d9f7-4903-94a0-0caa824f9246", "metadata": {}, "source": [ "We can calculate the force contributions from two layers at this equilibrium, which do cancel out." ] }, { "cell_type": "code", "execution_count": 6, "id": "557688d9-a582-438f-b7d3-73bd81efc6be", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[115.49063081 92.81617322]\n", "[-115.49063081 -92.81617322]\n" ] } ], "source": [ "print(strip_1.disp_controlled(zero_force_length))\n", "print(strip_2.disp_controlled(zero_force_length))" ] }, { "cell_type": "markdown", "id": "572225bf-ad1d-4e74-a71f-8f94e5e99330", "metadata": {}, "source": [ "## Required `disp_measure` and `force_measure`" ] }, { "cell_type": "markdown", "id": "a6626439-3d38-4b1e-9b58-ed61b28d869c", "metadata": {}, "source": [ "For the `LayeredPlanarBiaxial` to work correctly, we need the component layers to have lengths as their `disp_measure` and force as their `force_measure`. Lengths are required to remove ambiguity about what is the stretch/strain etc. is with respect to (i.e., is it the length of the first layer or the second layer?). The force is required, since the forces generated by the component layers will add up, while stresses do not.\n", "\n", "If we do not follow these rules, errors will be raised as shown below." ] }, { "cell_type": "code", "execution_count": 7, "id": "d38c81d0-ec27-4ebc-a03c-02cfd21d0b4d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ValueError raised: The input of all layers in LayeredPlanarBiaxial should be length to remove ambiguity about the reference length\n", "ValueError raised: The output of the LayeredPlanarBiaxial should be force, as stresses are not additive. The results may be spurious\n" ] } ], "source": [ "try:\n", " strip_1 = pmt.PlanarBiaxialExtension(mat1, disp_measure='stretch', force_measure='force')\n", " strip_2 = pmt.PlanarBiaxialExtension(mat2, disp_measure='stretch', force_measure='force')\n", " combined = pmt.LayeredPlanarBiaxial(strip_1,strip_2)\n", "except ValueError as e:\n", " print(\"ValueError raised:\", e)\n", "\n", "try:\n", " strip_1 = pmt.PlanarBiaxialExtension(mat1, disp_measure='length', force_measure='cauchy')\n", " strip_2 = pmt.PlanarBiaxialExtension(mat2, disp_measure='length', force_measure='cauchy')\n", " combined = pmt.LayeredPlanarBiaxial(strip_1,strip_2)\n", "except ValueError as e:\n", " print(\"ValueError raised:\", e)" ] } ], "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.16" } }, "nbformat": 4, "nbformat_minor": 5 }