{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Effective Stiffness of Fiber Composite\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"This example demonstrates the use of an homogenization model to predict the macroscopic stress in fiber-like structures. The structures emulate fiber-reinforced polymer samples. For a summary of homogenization theory and its use with effective stiffness properties please see the [Effective Siffness of a Composite Material example](./stress.ipynb). The example generates a series of random microstructures with various fiber lengths and volume fractions. The structures are used to calibrate and test the homegnization model against the simulated effective stress values."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import warnings\n",
"import os\n",
"\n",
"os.environ[\"OMP_NUM_THREADS\"] = \"1\"\n",
"warnings.filterwarnings('ignore')\n",
"\n",
"import dask.array as da\n",
"import numpy as np\n",
"import pandas\n",
"import matplotlib.pyplot as plt\n",
"from sklearn.pipeline import Pipeline\n",
"from dask_ml.decomposition import IncrementalPCA\n",
"from dask_ml.preprocessing import PolynomialFeatures\n",
"from sklearn.linear_model import LinearRegression\n",
"from dask_ml.model_selection import train_test_split\n",
"from dask_ml.model_selection import GridSearchCV\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"\n",
"from pymks import (\n",
" generate_multiphase,\n",
" solve_fe,\n",
" plot_microstructures,\n",
" PrimitiveTransformer,\n",
" TwoPointCorrelation,\n",
" GenericTransformer\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"#PYTEST_VALIDATE_IGNORE_OUTPUT\n",
"\n",
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data Generation\n",
"\n",
"The following generates four different types of microstructures each with 200 samples with spatial dimensions of 31 x 31. The grains have a high aspect ratio to simulate fiber-like structures."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"da.random.seed(10)\n",
"np.random.seed(10)\n",
"\n",
"\n",
"tmp = [\n",
" generate_multiphase(\n",
" shape=(100, 31, 31),\n",
" grain_size=grain_size,\n",
" volume_fraction=volume_fraction,\n",
" chunks=50,\n",
" percent_variance=0.2\n",
" )\n",
" for (grain_size, volume_fraction) in zip(\n",
" [(30, 2), (7, 2), (2, 30), (2, 7)],\n",
" [(0.7, 0.3), (0.6, 0.4), (0.3, 0.7), (0.4, 0.6)]\n",
" )\n",
"]\n",
"\n",
"x_data = da.concatenate(tmp).persist()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"y_stress = solve_fe(x_data,\n",
" elastic_modulus=(1.3, 2.5),\n",
" poissons_ratio=(0.42, 0.35),\n",
" macro_strain=0.001)['stress'][..., 0].persist()\n",
"\n",
"y_data = da.average(y_stress.reshape(y_stress.shape[0], -1), axis=1).persist()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The arrays have been computed by calling the `persist` method."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"\n",
"\n",
" \n",
" | Array | Chunk | \n",
" \n",
" \n",
" Bytes | 3.08 MB | 384.40 kB | \n",
" Shape | (400, 31, 31) | (50, 31, 31) | \n",
" Count | 8 Tasks | 8 Chunks | \n",
" Type | int64 | numpy.ndarray | \n",
" \n",
" \n",
" | \n",
"\n",
"\n",
" | \n",
"
\n",
"
"
],
"text/plain": [
"dask.array"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#PYTEST_VALIDATE_IGNORE_OUTPUT\n",
"\n",
"x_data"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"\n",
"\n",
" \n",
" | Array | Chunk | \n",
" \n",
" \n",
" Bytes | 3.20 kB | 400 B | \n",
" Shape | (400,) | (50,) | \n",
" Count | 8 Tasks | 8 Chunks | \n",
" Type | float64 | numpy.ndarray | \n",
" \n",
" \n",
" | \n",
"\n",
"\n",
" | \n",
"
\n",
"
"
],
"text/plain": [
"dask.array"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#PYTEST_VALIDATE_IGNORE_OUTPUT\n",
"\n",
"y_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## View Microstructures"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"