FFT-based homogenization basic scheme proposed by Moulinec and Suquet
(1998) [1] for the solution of micro-scale equilibrium problems of linear
elastic heterogeneous materials. In particular, for a given RVE discretized
in a regular grid of voxels, the method solves the microscale equilibrium
problem when the RVE is subjected to a macroscale strain tensor and is
constrained by periodic boundary conditions. Finite strain extension
is also available, following the formulation of Kabel and coworkers
(2022) [2] and adopting the Hencky hyperelastic constitutive model.
A detailed description of the computational implementation can be found
in Appendix B (infinitesimal strains) and Section 4.6 (finite strains)
of Ferreira (2022) [3].
Convergence criterion: ‘stress_div’ is the original convergence
criterion based on the evaluation of the divergence of the stress
tensor; ‘avg_stress_norm’ is based on the iterative change of the
average stress norm.
Homogenized stress-strain material response. The homogenized strain and
homogenized stress tensor components of the i-th loading increment are
stored columnwise in the i-th row, sorted respectively. Infinitesimal
strain tensor and Cauchy stress tensor (infinitesimal strains) or
Deformation gradient and first Piola-Kirchhoff stress tensor (finite
strains).
strain_formulation ({'infinitesimal', 'finite'}) – Problem strain formulation.
problem_type (int) – Problem type: 2D plane strain (1), 2D plane stress (2),
2D axisymmetric (3) and 3D (4).
rve_dims (list[float]) – RVE size in each dimension.
n_voxels_dims (list[int]) – Number of voxels in each dimension of the regular grid (spatial
discretization of the RVE).
regular_grid (numpy.ndarray (2d or 3d)) – Regular grid of voxels (spatial discretization of the RVE), where
each entry contains the material phase label (int) assigned to the
corresponding voxel.
material_phases (list[str]) – RVE material phases labels (str).
material_phases_properties (dict) – Constitutive model material properties (item, dict) associated to
each material phase (key, str).
strain_formulation ({'infinitesimal', 'finite'}) – Problem strain formulation.
problem_type (int) – Problem type: 2D plane strain (1), 2D plane stress (2),
2D axisymmetric (3) and 3D (4).
rve_dims (list[float]) – RVE size in each dimension.
n_voxels_dims (list[int]) – Number of voxels in each dimension of the regular grid (spatial
discretization of the RVE).
regular_grid (numpy.ndarray (2d or 3d)) – Regular grid of voxels (spatial discretization of the RVE), where
each entry contains the material phase label (int) assigned to the
corresponding voxel.
material_phases (list[str]) – RVE material phases labels (str).
material_phases_properties (dict) – Constitutive model material properties (item, dict) associated to
each material phase (key, str).
Compute average norm of strain or stress local field.
Parameters:
state_vox (dict) – Local strain or stress response (item, numpy.ndarray of shape equal
to RVE regular grid discretization) for each strain or stress
component (key, str).
Returns:
avg_state_norm – Average norm of strain or stress local field.
Perform homogenization over regular grid spatial discretization.
Parameters:
state_vox (dict) – Local strain or stress response (item, numpy.ndarray of shape equal
to RVE regular grid discretization) for each strain or stress
component (key, str).
where \(\boldsymbol{\sigma}\) is the Cauchyevar1 stress tensor,
\(\boldsymbol{\mathsf{D}}^{e}\) is the elasticity tensor, and
\(\boldsymbol{\varepsilon}\) is the infinitesimal strain
tensor.
where \(\boldsymbol{\tau}\) is the Kirchhoff stress tensor,
\(\boldsymbol{\mathsf{D}}^{e}\) is the elasticity tensor, and
\(\boldsymbol{\varepsilon}\) is the spatial logarithmic strain
tensor.
where \(\boldsymbol{S}\) is the second Piola-Kirchhoff stress
tensor, \(\boldsymbol{\mathsf{D}}^{e}\) is the elasticity
tensor, and \(\boldsymbol{E}^{(2)}\) is the Green-Lagrange
strain tensor.
A detailed description of the computational implementation based on
Hadamard (element-wise) operations can be found in Section 4.6 of
Ferreira (2022) [4].
Parameters:
strain_vox (dict) – Local strain response (item, numpy.ndarray of shape equal to RVE
regular grid discretization) for each strain component (key, str).
Infinitesimal strain tensor (infinitesimal strains) or deformation
gradient (finite strains).
Auxiliar elastic properties array (numpy.ndarray of shape equal to
RVE regular grid discretization) containing an elastic
properties-related quantity associated to each voxel,
\[\dfrac{E \nu}{(1 + \nu)(1 - 2 \nu)} \, ,\]
where \(E\) and \(\nu\) are the Young’s Modulus and
Poisson’s ratio, respectively.
Auxiliar elastic properties array (numpy.ndarray of shape equal to
RVE regular grid discretization) containing an elastic
properties-related quantity associated to each voxel,
\[\dfrac{E}{1 + \nu} \, ,\]
where \(E\) and \(\nu\) are the Young’s Modulus and
Poisson’s ratio, respectively.
Auxiliar elastic properties array (numpy.ndarray of shape equal to
RVE regular grid discretization) containing an elastic
properties-related quantity associated to each voxel,
is_optimized (bool) – Optimization flag (minimizes loops over spatial discretization
voxels).
Returns:
stress_vox – Local stress response (item, numpy.ndarray of shape equal to RVE
regular grid discretization) for each stress component (key, str).
Cauchy stress tensor (infinitesimal strains) or first
Piola-Kirchhoff stress tensor (finite strains).
Convergence criterion based on the divergence of the stress tensor.
Convergence criterion proposed by Moulinec and Suquet (1998) [5].
Parameters:
freqs_dims (list[numpy.ndarray (1d)]) – List of discrete frequencies (numpy.ndarray (1d)) associated to
each spatial dimension.
stress_DFT_vox (dict) – Discrete Fourier Transform of local stress response (item,
numpy.ndarray of shape equal to RVE regular grid discretization)
for each stress component (key, str). Cauchy stress tensor
(infinitesimal strains) or First Piola-Kirchhoff stress tensor
(finite strains).
Returns:
discrete_error – Discrete error associated to the convergence criterion.
Compute the RVE local strain response (solution of microscale
equilibrium problem) when subjected to a given macroscale strain
loading, namely a macroscale infinitesimal strain tensor (infinitesimal
strains) or a macroscale deformation gradient (finite strains). It is
assumed that the RVE is spatially discretized in a regular grid of
voxels.
strain_vox – RVE local strain response (item, numpy.ndarray of shape equal to
RVE regular grid discretization) for each strain component
(key, str). Infinitesimal strain tensor (infinitesimal strains) or
material logarithmic strain tensor (finite strains).
_hom_stress_strain – RVE homogenized stress-strain response (item, numpy.ndarray (2d))
for each macroscale strain loading identifier (key, int). The
homogenized strain and homogenized stress tensor components of the
i-th loading increment are stored columnwise in the i-th row,
sorted respectively. Infinitesimal strain tensor and Cauchy stress
tensor (infinitesimal strains) or Deformation gradient and first
Piola-Kirchhoff stress tensor (finite strains).