# Laminate Material¶

The generic laminate material is implemented in `MaterialLaminate`

inheriting directly from `MaterialBase`

, and it contains two arbitrary underlting materials(with either linear or nonlinear constitutive laws). In order to compile this class one should set the cmake variable `SPLIT_CELL`

**ON** in the configuration.

The underlying materials behave as they consist a laminate. The resultant constitutive behavior depends on both of their constitutive laws, the volume fraction of phases (\((\alpha^l)\), \((\alpha^r)\)), and the normal vector of their interface. The formulation governing the stress and the deformation gradient of the underlying phases is given by:

where, The superscripts \((l)\) and \((r)\) show the two constituent materials of the pixel and \((\boldsymbol{P})\), \((\boldsymbol{F})\) are, respectively, first Piola-Kirchhoff and deforamtion gradient tensors. \((\alpha)\) is the normal vector of phases’ interface and \((\mathbb{I})\) is the fourth order identity matrix. Equations \((3)\) and \((4)\) are the equilibrium and the compatibility equations on the pahses’ interface in the laminate structure. By having deformations as the input (µSpectre) and from equation \((4)\) some components of deforamtion of both phases are easily derived. For calculating the remaining components, it is necessary to solve equation \((3)\), which in the most general case is a nonlinear equation depending on both materials’ constiturive laws. Accordingly this material’s `evaluate_stress()`

calls an internal solver implemented in `laminate_solver()`

where equation \((3)\) is solved, per-pixel, employing both underlying materials’ constitutive laws. Accordingly, this material is not expected to be as efficient as materials inheriting from `MaterialMuSpectre`

.

`MaterialLaminate`

at creation only needs a name. However, its `add_pixel()`

takes a pixel and pointers two the underlying materials for each pixel as well as volume fraction and interface normal vector for each pixel. For convinience, function `make_pixels_precipitate_for_laminate_material()`

has been added to `CellBase`

using which user can add pixels to a `MaterialLaminate`

object by introducing the shape of a precipitate, it’s material an the base material of the matrix media in which the precipitate lies. In addition, `complete_material_assignment_simple()`

enables to assign the remaining of the pixles (unassigned) pixels to a material(the base material of the matrix media).The following snippet shows how one can use the machinery to employ this specific Material in µSpectre.

## Python Usage Example¶

rve = msp.Cell(res, lengths, formulation) mat1_laminate = msp.material.MaterialLinearElastic1_2d.make_free( "mat1_free", E1, noo) mat2_laminate = msp.material.MaterialLinearElastic1_2d.make_free( "mat2_free", E2, noo) mat1 = msp.material.MaterialLinearElastic1_2d.make( rve, "mat1", E1, noo) mat2 = msp.material.MaterialLinearElastic1_2d.make( rve, "mat2", E2, noo) mat_lam = msp.material.MaterialLaminate_2d.make(rve, "laminate") points = np.ndarray(shape=(num, 2)) for j, tetha in enumerate(np.linspace(0, 2*np.pi, num, endpoint=false)): points[j, 0] = center[0] + radius*np.cos(tetha) points[j, 1] = center[1] + radius*np.sin(tetha) points_list = [points.tolist()] rve.make_precipitate_laminate(mat_lam, mat1, mat1_laminate, mat2_laminate, points_list) rve.complete_material_assignemnt_simple(mat2)