{
"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 PCA\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",
" FlattenTransformer\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": 5,
"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": 7,
"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": 8,
"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": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"x_data"
]
},
{
"cell_type": "code",
"execution_count": 9,
"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": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"y_data"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## View Microstructures"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"