API — Viscoelasticity
MeanFieldHomogenization.Viscoelasticity Module
MeanFieldHomogenization.ViscoelasticityAging linear Volterra (ALV) homogenization: aging linear viscoelasticity at order 4, and its hereditary conduction and diffusion counterpart at order 2. Provides:
ViscoLaw— relaxationor creep kernel, scalar- or 4-tensor-valued, with built-in Maxwell / Kelvin constructors. trapezoidal_matrix— discretization of the Stieltjes integral on a time grid into a lower-block-triangular matrix ( for scalar, for 4-tensor in Mandel form).volterra_inverse— block forward-substitution that takes a discrete relaxation kernel to the corresponding creep kernel (and vice versa).iso_params_from_blocks/iso_blocks_from_paramsand theirti_/ortho_counterparts — conversions between symmetry-structured per-component scalar matrices and the full block matrix.hill_kernel— discrete ALV Hill polarization tensor for an ellipsoidal inclusion, isotropic-matrix branch using the time-space decoupling formula (Barthélémy et al., 2016; appendix on the ALV Hill kernel).Time-domain homogenization schemes (Voigt, Reuss, Dilute, DiluteDual, Mori-Tanaka, Maxwell, Ponte Castañeda-Willis, self-consistent, asymmetric self-consistent at order 4, differential), ellipsoids, cracks and layered spheres alike, plugged into the existing
homogenizedispatcher whenever a phase carries aViscoLawproperty.
All ALV operators are stored as dense Matrix{T} of size
Constitutive laws
MeanFieldHomogenization.Viscoelasticity.AbstractViscoLaw Type
AbstractViscoLawRoot supertype for viscoelastic kernels. Concrete subtypes provide an eval(law, t, t_p) method returning a scalar or a 4-tensor.
MeanFieldHomogenization.Viscoelasticity.ViscoLaw Type
ViscoLaw(eval_fun, mode::Symbol = :relaxation)Concrete viscoelastic law. Wraps an eval_fun::F callable (t, t_p) -> X together with its mode Symbol (:relaxation or :creep). The output type X may be:
a
RealorComplexscalar (scalar Volterra kernel) ;a
TensND.AbstractTens{4,3}(4-tensor relaxation / creep tensor) ;an
AbstractMatrixof size already in Mandel form.
Construct via ViscoLaw directly or use the convenience constructors maxwell_relaxation, kelvin_creep, maxwell_iso, kelvin_iso.
MeanFieldHomogenization.Viscoelasticity.visco_mode Function
visco_mode(law) -> SymbolReturn the mode (:relaxation or :creep) of law.
MeanFieldHomogenization.Viscoelasticity.VALID_VISCO_MODES Constant
VALID_VISCO_MODES :: Tuple{Symbol, Symbol}Allowed values for ViscoLaw.mode :
:relaxation—maps strain history to stress. :creep—maps stress history to strain.
MeanFieldHomogenization.Viscoelasticity.visco_eval Function
visco_eval(law, t, t_p)Evaluate the kernel at (t, t_p).
MeanFieldHomogenization.Viscoelasticity.maxwell_relaxation Function
maxwell_relaxation(C_inf, C_branches, taus; mode = :relaxation)Build a generalized Maxwell relaxation kernel
for C_inf (C_branches[i] (TensND.AbstractTens{4,3}); taus[i] (
MeanFieldHomogenization.Viscoelasticity.kelvin_creep Function
kelvin_creep(J_0, J_branches, taus; mode = :creep)Build a Kelvin (or Kelvin-Voigt-Generalized) creep kernel
for J_0 (J_branches[i] (taus[i] (
MeanFieldHomogenization.Viscoelasticity.maxwell_iso Function
maxwell_iso(k, mu, eta_k, eta_mu) -> ViscoLawConvenience: build an isotropic Maxwell relaxation 4-tensor kernel
with mu (eta_k (eta_mu (TensND.TensISO{4,3} at every
MeanFieldHomogenization.Viscoelasticity.kelvin_iso Function
kelvin_iso(k_0, mu_0, k_branches, mu_branches, taus_k, taus_mu) -> ViscoLawConvenience: build an isotropic Kelvin creep 4-tensor kernel
with mu_0 (k_branches[i] (mu_branches[i] (taus_k[i] (taus_mu[i] (k_branches, mu_branches, taus_k, taus_mu may be empty if no Kelvin branches are required (instantaneous-only compliance).
MeanFieldHomogenization.Viscoelasticity.heaviside_law Function
heaviside_law(C; mode = :relaxation)Return a ViscoLaw corresponding to a purely elastic kernel
Trapezoidal discretization
MeanFieldHomogenization.Viscoelasticity.trapezoidal_matrix Function
trapezoidal_matrix(law::ViscoLaw, times::AbstractVector{<:Real}) -> MatrixBuild the discrete times
The exact block layout is described at the top of trapezoidal.jl. The output is type-stable in the element type returned by visco_eval(law, ...).
MeanFieldHomogenization.Viscoelasticity._trapezoidal_relaxation Function
_trapezoidal_relaxation(law::ViscoLaw, times, B) -> MatrixBuild the discrete relaxation block matrix from a ViscoLaw, regardless of whether the law is in :relaxation or :creep mode. When the law is :creep, the trapezoidal compliance matrix is inverted (block forward substitution at block_size = B) to obtain the corresponding relaxation matrix — the convention every ALV scheme assumes internally.
B is the block size (6 for order-4 4-tensor / Mandel, 3 for order-2 vector-tensor).
Volterra algebra
MeanFieldHomogenization.Viscoelasticity.volterra_inverse Function
volterra_inverse(M::AbstractMatrix; block_size::Int = 6) -> MatrixCompute the Volterra inverse of a lower-block-triangular matrix M of size block_size. The result is also lower-block-triangular and satisfies M * volterra_inverse(M)
block_size must be a positive divisor of size(M, 1) and size(M, 2), typically 1 (scalar Volterra kernel) or 6 (4-tensor in Mandel form).
The cost is inv(...) of stdlib (so
volterra_inverse(K::AbstractALVKernel) -> AbstractALVKernelVolterra inverse of a structured ALV kernel. Stays in the same symmetry class : iso ↦ iso, TI ↦ TI, ortho ↦ ortho. Avoids materializing the
MeanFieldHomogenization.Viscoelasticity.volterra_product Function
volterra_product(A::AbstractMatrix, B::AbstractMatrix) -> MatrixDiscrete Volterra product Matrix. The result is again lower-block-triangular by construction.
Equivalent to A * B, exposed as a named function to make the viscoelastic algebra explicit at call sites.
MeanFieldHomogenization.Viscoelasticity.volterra_divide Function
volterra_divide(M, S; block_size = 1) -> MatrixCompute M * volterra_inverse(S) would lose precision through a huge intermediate inverse, e.g. for soft-phase moduli (ViscoLaw kernels in multi-layer ALV recurrences.
block_size must divide size(M, 1); typical values are 1 (scalar Volterra) and 6 (4-tensor Mandel). The result is lower-block-triangular if both M and S are.
MeanFieldHomogenization.Viscoelasticity.volterra_left_divide Function
volterra_left_divide(S, M; block_size = 1) -> MatrixCompute
Use this rather than volterra_divide when the closed-form algebra requires the inverse on the LEFT of the numerator (e.g. the Hervé–Zaoui bulk/shear transition matrices, where
block_size must divide size(M, 1); typical values are 1 (scalar Volterra) and 6 (4-tensor Mandel). Both arguments must be lower- block-triangular of the same size; the result is lower-block-triangular.
volterra_left_divide(S::AbstractALVKernel, M::AbstractALVKernel)
-> AbstractALVKernelVolterra left-divide
Symmetry-class conversions
MeanFieldHomogenization.Viscoelasticity.iso_params_from_blocks Function
iso_params_from_blocks(M) -> (α::Matrix, β::Matrix)Decompose a α and β, both of size
where
MeanFieldHomogenization.Viscoelasticity.iso_blocks_from_params Function
iso_blocks_from_params(α::Matrix, β::Matrix) -> MatrixInverse of iso_params_from_blocks: build a
Both α and β must be
Note: a kron(α, 𝕁_M) + kron(β, 𝕂_M) formulation was experimented (P3.3.1) and reverted — the two extra
MeanFieldHomogenization.Viscoelasticity.ti_params_from_blocks Function
ti_params_from_blocks(M; axis = (0, 0, 1))
-> NTuple{6, Matrix{T}}Decompose a
MeanFieldHomogenization.Viscoelasticity.ti_blocks_from_params Function
ti_blocks_from_params(ℓ::NTuple{6, AbstractMatrix}; axis = (0, 0, 1))
-> Matrix{T}Inverse of ti_params_from_blocks: rebuild a
MeanFieldHomogenization.Viscoelasticity.ortho_params_from_blocks Function
ortho_params_from_blocks(M; axes = ((1,0,0),(0,1,0),(0,0,1)))
-> NTuple{12, Matrix{T}}Decompose a
each of size
Note that closure under Volterra product does not preserve major symmetry (
MeanFieldHomogenization.Viscoelasticity.ortho_blocks_from_params Function
ortho_blocks_from_params(o::NTuple{12, AbstractMatrix};
axes = ((1,0,0),(0,1,0),(0,0,1)))
-> Matrix{T}Inverse of ortho_params_from_blocks: rebuild a
Hill ALV kernel
MeanFieldHomogenization.Viscoelasticity.hill_kernel Function
hill_kernel(ell::AbstractEllipsoidalInclusion,
C0_law::ViscoLaw,
times::AbstractVector{<:Real}) -> MatrixDiscrete ALV Hill polarization tensor kernel for the inclusion ell in an isotropic ALV matrix described by C0_law (a ViscoLaw returning a TensND.TensISO{4,3} 4-tensor at each
The output is a Matrix{T} with length(times), in the same Mandel block convention as trapezoidal_matrix.
Implementation follows the time-space decoupling formula of the ECHOES manual appendix viscoelastic_hill_kernel.qmd:
Discretize the matrix kernel
C0_lawontimesto a block matrix .Extract the iso scalar parameter matrices
of ( , per Mandel convention).Build the longitudinal
and the shear matrices: the two eigenvalues of the acoustic tensor, which the Hill tensor inverts. The bulk and shear kernels follow linearly, and ; their inverses do not (see the theory page).Take the scalar Volterra inverses
and .Compute the Mandel forms
and of the elastic auxiliary tensorstens_UA(ell)andtens_VA(ell).Assemble block-by-block:
.
MeanFieldHomogenization.Viscoelasticity.second_hill_kernel Function
second_hill_kernel(ell, C0_law::ViscoLaw, times) -> MatrixDiscrete ALV second Hill tensor kernel of the inclusion ell in an isotropic ALV matrix described by C0_law, the counterpart of second_hill_tensor with the double contractions replaced by Volterra products:
hill_kernel built on it. Same trapezoidal_matrix; for a law constant in time each diagonal block is the elastic
Schemes — generic (6n × 6n) algebra
MeanFieldHomogenization.Viscoelasticity.voigt_alv Function
voigt_alv(C_phases::AbstractVector, fractions::AbstractVector) -> MatrixVoigt (uniform-strain) bound: C_phases[i] is a fractions[i] is the volume fraction
MeanFieldHomogenization.Viscoelasticity.reuss_alv Function
reuss_alv(C_phases::AbstractVector, fractions::AbstractVector) -> MatrixReuss (uniform-stress) bound: invert each
MeanFieldHomogenization.Viscoelasticity.dilute_alv Function
dilute_alv(C_0, contribs, fractions) -> MatrixDilute scheme: dilute_contribution_alv (each
Note that for the dilute scheme the matrix volume fraction
MeanFieldHomogenization.Viscoelasticity.dilute_dual_alv Function
dilute_dual_alv(C_0, contribs, fractions) -> MatrixDiluteDual scheme: the dilute contribution is computed in compliance space. Equivalent in form to dilute_alv but with the matrix acting on the compliance kernel. Useful when the inclusions are weak (e.g. cracks) — the linearization around the matrix compliance converges better.
with the compliance contribution kernels contribs_compliance holds them.
Implementation routes through volterra_inverse of C_0 to obtain
MeanFieldHomogenization.Viscoelasticity.mori_tanaka_alv Function
mori_tanaka_alv(C_0, A_duts, contribs, fractions, f_matrix) -> MatrixMori-Tanaka scheme: the average matrix-strain is taken as the reference "infinite-matrix" strain, hence each inclusion experiences a perturbed strain proportional to the inverse of the volume-weighted concentration average.
A_duts[i] is the dilute concentration kernel contribs[i] fractions[i] its volume fraction f_matrix the matrix volume fraction
MeanFieldHomogenization.Viscoelasticity.maxwell_alv Function
maxwell_alv(C_0, contribs, fractions; H_0) -> MatrixMaxwell scheme: the reference is replaced by a "host medium" with a prescribed distribution shape, whose Hill kernel is H_0
where dilute_contribution_alv.
When every inclusion phase has the shape of the distribution and the matrix is the reference, Maxwell reduces to Mori-Tanaka.
Pass H_0 = hill_kernel(distribution_shape, C_0_law, times), the distribution shape being the one declared on the RVE; there is no default.
MeanFieldHomogenization.Viscoelasticity.self_consistent_alv Function
self_consistent_alv(rve, prop; times,
abstol = 1e-10, reltol = 1e-8, maxiters = 200,
damping = 0.0, verbose = false,
select_best = false) -> MatrixSelf-consistent ALV homogenization. Iterates the symmetric Picard fixed point on the
The initial estimate is the discretized matrix kernel
Returns the converged effective relaxation matrix.
Keyword arguments
abstol— absolute Frobenius tolerance on .reltol— additive relative tolerance (multiplied by ).maxiters— hard iteration cap.damping— Picard relaxationdamping (0 = no damping).verbose— print residual norms each iteration.select_best— return the best iterate seen (rather than the last) when convergence stalls.
MeanFieldHomogenization.Viscoelasticity.asymmetric_self_consistent_alv Function
asymmetric_self_consistent_alv(rve::RVE, prop::Symbol; times,
abstol = 1e-10, reltol = 1e-8,
maxiters = 200, damping = 0.0,
verbose = false, select_best = false)
-> Matrix{T}Asymmetric self-consistent viscoelastic homogenization. The iteration update reads
with abstol + reltol maxiters Picard steps).
MeanFieldHomogenization.Viscoelasticity.pcw_alv Function
pcw_alv(C_0, contribs, fractions; H_dist) -> MatrixPonte-Castañeda & Willis (1995) viscoelastic homogenization in single-distribution-shape form. The formula is algebraically identical to maxwell_alv ; the only difference is that the Hill kernel H_dist is computed against the distribution shape stored in rve.distribution_shape, not against any individual phase.
Use homogenize_alv with scheme = PonteCastanedaWillis() — the dispatcher reads the RVE's distribution shape and forwards here.
MeanFieldHomogenization.Viscoelasticity.differential_alv Function
differential_alv(rve::RVE, prop::Symbol; times,
nsteps = 100, trajectory = nothing,
abstol = 1e-8, reltol = 1e-6, alg = nothing,
formulation = :stiffness) -> Matrix{T}Differential homogenization in aging linear viscoelasticity, solved as a SciML ODE on the fictitious incorporation time
with the volume balance nsteps is the density of save points along abstol / reltol.
formulation = :compliance integrates the dual ODE on the creep function DifferentialScheme.
Supported inclusion geometries: ellipsoids / spheroids (through the ALV Hill kernel), LayeredSphere (through the bulk + shear ALV recurrences) and flat cracks (CrackDensity). Because the reference of the ODE is the running medium and the ALV Hill kernel is isotropic only, every phase must keep that medium isotropic — see _alv_diff_keeps_iso; the ODE throws an explicit ArgumentError otherwise instead of returning a wrong answer.
MeanFieldHomogenization.Viscoelasticity.dilute_concentration_alv Function
dilute_concentration_alv(C_E, C_0, P) -> MatrixDilute strain concentration kernel
MeanFieldHomogenization.Viscoelasticity.dilute_contribution_alv Function
dilute_contribution_alv(C_E, C_0, P) -> MatrixDilute strain contribution kernel
Internal guards
MeanFieldHomogenization.Viscoelasticity._alv_diff_keeps_iso Function
_alv_diff_keeps_iso(geom, sym, C_r) -> BoolWhether a solid phase leaves the running effective medium of the differential ALV ODE inside the isotropic class.
This matters only for the differential scheme. The ALV Hill kernel hill_kernel exists for an isotropic reference only, and where Mori-Tanaka or the dilute scheme evaluate it against the (fixed, isotropic) matrix, the differential scheme evaluates it against the running estimate differential_alv).
An isotropic orientation average (symmetrize = :iso) restores the property for any shape, which is what randomly oriented inclusions or cracks mean physically.
Schemes — iso fast path
MeanFieldHomogenization.Viscoelasticity.voigt_alv_iso Function
voigt_alv_iso(αβ_phases, fractions) -> (α_eff, β_eff)Iso-form Voigt bound:
MeanFieldHomogenization.Viscoelasticity.reuss_alv_iso Function
reuss_alv_iso(αβ_phases, fractions) -> (α_eff, β_eff)Iso-form Reuss bound: invert per-phase compliances, average, invert back — done independently on the two scalar Volterra components.
MeanFieldHomogenization.Viscoelasticity.dilute_alv_iso Function
dilute_alv_iso(αβ_0, contribs_iso, fractions) -> (α_eff, β_eff)Iso-form Dilute scheme:
MeanFieldHomogenization.Viscoelasticity.dilute_dual_alv_iso Function
dilute_dual_alv_iso(αβ_0, contribs_compliance_iso, fractions) -> (α_eff, β_eff)Iso-form DiluteDual: invert the matrix to compliance space, average, invert back.
MeanFieldHomogenization.Viscoelasticity.mori_tanaka_alv_iso Function
mori_tanaka_alv_iso(αβ_0, A_duts_iso, contribs_iso, fractions, f_M)
-> (α_eff, β_eff)Iso-form Mori-Tanaka:
reduced to two scalar Volterra problems on
MeanFieldHomogenization.Viscoelasticity.maxwell_alv_iso Function
maxwell_alv_iso(αβ_0, contribs_iso, fractions, αβ_H_0) -> (α_eff, β_eff)Iso-form Maxwell scheme:
with
MeanFieldHomogenization.Viscoelasticity.dilute_concentration_alv_iso Function
dilute_concentration_alv_iso(αβ_E, αβ_0, αβ_P) -> (α_A, β_A)Iso-form dilute concentration
MeanFieldHomogenization.Viscoelasticity.dilute_contribution_alv_iso Function
dilute_contribution_alv_iso(αβ_E, αβ_0, αβ_P) -> (α_N, β_N)Iso-form dilute contribution
Schemes — TI fast path
MeanFieldHomogenization.Viscoelasticity.voigt_alv_ti Function
voigt_alv_ti(ℓ_phases, fractions) -> NTuple{6, Matrix}TI-form Voigt bound:
MeanFieldHomogenization.Viscoelasticity.reuss_alv_ti Function
reuss_alv_ti(ℓ_phases, fractions) -> NTuple{6, Matrix}TI-form Reuss bound: invert per-phase compliances in TI Walpole form, average, invert back.
MeanFieldHomogenization.Viscoelasticity.dilute_alv_ti Function
dilute_alv_ti(ℓ_0, contribs_ti, fractions) -> NTuple{6, Matrix}TI-form Dilute scheme:
MeanFieldHomogenization.Viscoelasticity.dilute_dual_alv_ti Function
dilute_dual_alv_ti(ℓ_0, contribs_compliance_ti, fractions)
-> NTuple{6, Matrix}TI-form DiluteDual: invert to compliance Walpole form, average, invert back.
MeanFieldHomogenization.Viscoelasticity.mori_tanaka_alv_ti Function
mori_tanaka_alv_ti(ℓ_0, A_duts_ti, contribs_ti, fractions, f_M)
-> NTuple{6, Matrix}TI-form Mori-Tanaka:
all in TI Walpole form.
MeanFieldHomogenization.Viscoelasticity.maxwell_alv_ti Function
maxwell_alv_ti(ℓ_0, contribs_ti, fractions, ℓ_H_0) -> NTuple{6, Matrix}TI-form Maxwell scheme.
MeanFieldHomogenization.Viscoelasticity.dilute_concentration_alv_ti Function
dilute_concentration_alv_ti(ℓ_E, ℓ_0, ℓ_P) -> NTuple{6, Matrix}TI-form dilute concentration
MeanFieldHomogenization.Viscoelasticity.dilute_contribution_alv_ti Function
dilute_contribution_alv_ti(ℓ_E, ℓ_0, ℓ_P) -> NTuple{6, Matrix}TI-form dilute contribution
Schemes — ortho fast path
MeanFieldHomogenization.Viscoelasticity.voigt_alv_ortho Function
voigt_alv_ortho(o_phases, fractions) -> NTuple{12, Matrix}Ortho-form Voigt bound:
MeanFieldHomogenization.Viscoelasticity.reuss_alv_ortho Function
reuss_alv_ortho(o_phases, fractions) -> NTuple{12, Matrix}Ortho-form Reuss bound: invert per-phase compliances in ortho form, average, invert back.
MeanFieldHomogenization.Viscoelasticity.dilute_alv_ortho Function
dilute_alv_ortho(o_0, contribs_ortho, fractions) -> NTuple{12, Matrix}Ortho-form Dilute scheme:
MeanFieldHomogenization.Viscoelasticity.dilute_dual_alv_ortho Function
dilute_dual_alv_ortho(o_0, contribs_compliance_ortho, fractions)
-> NTuple{12, Matrix}Ortho-form DiluteDual: invert to compliance ortho form, average, invert back.
MeanFieldHomogenization.Viscoelasticity.mori_tanaka_alv_ortho Function
mori_tanaka_alv_ortho(o_0, A_duts_ortho, contribs_ortho, fractions, f_M)
-> NTuple{12, Matrix}Ortho-form Mori-Tanaka:
all in ortho form.
MeanFieldHomogenization.Viscoelasticity.maxwell_alv_ortho Function
maxwell_alv_ortho(o_0, contribs_ortho, fractions, o_H_0) -> NTuple{12, Matrix}Ortho-form Maxwell scheme.
MeanFieldHomogenization.Viscoelasticity.dilute_concentration_alv_ortho Function
dilute_concentration_alv_ortho(o_E, o_0, o_P) -> NTuple{12, Matrix}Ortho-form dilute concentration
MeanFieldHomogenization.Viscoelasticity.dilute_contribution_alv_ortho Function
dilute_contribution_alv_ortho(o_E, o_0, o_P) -> NTuple{12, Matrix}Ortho-form dilute contribution
Cracks
The stiffness contribution of a crack is a method of property_contribution_alv, documented with the layered spheres below.
MeanFieldHomogenization.Viscoelasticity.cod_kernel_alv Function
cod_kernel_alv(crack::EllipticCrack, C_M_law::ViscoLaw, times;
Rn = nothing, Rt = nothing) -> NamedTupleDiscrete ALV COD-tensor data for a penny crack (B_n = …, B_t = …) of two length(times)). Each
Interface stiffness (Sevostianov-style spring-like interface)
When the crack carries finite interface stiffness kernels ViscoLaws through the Rn / Rt keyword arguments. The traction-free COD matrices
(Sevostianov and Kachanov, 2007; Barthélémy et al., 2019), where semi_minor) of the elliptic crack. Limits :
Rn / Rt = nothing(default) → traction-free penny limit, recovers the existingB_n,B_t. (rigid bonding) → (no opening).
Throws if the matrix law is not iso or the crack is not a penny.
MeanFieldHomogenization.Viscoelasticity.inverse_property_contribution_alv Function
inverse_property_contribution_alv(crack, C_M_law::ViscoLaw, times) -> Matrix{T}Discrete
where
Convention: same as the elastic inverse_property_contribution — the Budiansky-O'Connell density factor is applied separately via delta_inverse_property_alv.
MeanFieldHomogenization.Viscoelasticity.delta_inverse_property_alv Function
delta_inverse_property_alv(crack, H̃, ε) -> MatrixApply the Budiansky-O'Connell crack density factor to the size-independent compliance contribution inverse_property_contribution_alv, giving the fractional compliance correction
MeanFieldHomogenization.Viscoelasticity.property_contribution_alv_at Function
property_contribution_alv_at(sphere::LayeredSphere, C_ref::AbstractMatrix, times)Layered-sphere counterpart of property_contribution_alv_at for cracks: the same size-independent ALV contribution, but against a pre-discretized
The reference must be isotropic, as everywhere in the layered-sphere ALV recurrences.
property_contribution_alv_at(crack, C_ref::AbstractMatrix) -> MatrixVariant that takes a pre-discretized C_ref (only iso ALV matrices are currently supported by inverse_property_contribution_alv).
MeanFieldHomogenization.Viscoelasticity.delta_property_alv Function
delta_property_alv(crack, Ñ, ε) -> MatrixApply the Budiansky-O'Connell crack density factor to the size-independent stiffness contribution property_contribution_alv, giving the dilute stiffness correction
Layered spheres
One function per notion serves elasticity and conduction, the order of the reference law selecting the method: gradient_gradient_concentration_alv and property_contribution_alv return a
MeanFieldHomogenization.Viscoelasticity.gradient_gradient_concentration_alv Function
gradient_gradient_concentration_alv(sphere, ref, times; external = true) -> MatrixVolume-averaged gradient concentration of a whole LayeredSphere in an isotropic aging reference ref (a ViscoLaw, or the Volterra matrix of a running estimate), under a unit Volterra far-field gradient. The order of ref selects the physics.
In elasticity, the external decides whether the outer interface belongs to the sphere, as in the elastic gradient_gradient_concentration.
This is what the ALV dilute / Mori–Tanaka / Maxwell schemes use when an inclusion phase is a LayeredSphere. Explicit name in elasticity: strain_strain_concentration_alv.
MeanFieldHomogenization.Viscoelasticity.property_contribution_alv Function
property_contribution_alv(crack, C_ref, times) -> Matrix{T}Discrete property_contribution(crack, C₀)] formula, with C_ref. C_ref may be a ViscoLaw (the matrix law — relaxation auto-built through _trapezoidal_relaxation) or a pre-discretized C_n).
property_contribution_alv(sphere, ref, times; external = true) -> MatrixSize-independent ALV contribution of an inclusion to the property of an aging reference ref: the dilute effective property at volume fraction
For a LayeredSphere the order of ref selects the physics. In elasticity the
ref may also be the Volterra matrix of a running estimate, which is how the self-consistent and differential schemes call it; external has the meaning it has in gradient_gradient_concentration_alv.
The crack method, documented next, is the elastic ALV stiffness contribution of a crack family. Explicit names: stiffness_contribution_alv and conductivity_contribution_alv.
The per-layer kernels behind them, of the bulk and shear modes in elasticity and of the single mode of conduction:
MeanFieldHomogenization.Viscoelasticity.bulk_concentration_alv Function
bulk_concentration_alv(sphere, C0_law, times) -> NTuple{N, Matrix}Per-layer bulk concentration matrices
For the bulk
Implementation : amplitude-space recurrence with closed-form interface transitions (bulk_amplitude_seq_alv). Stable for arbitrary modulus contrasts (pores, step-activated layers …).
Reference : Hervé-Zaoui 1993 (elastic) ; ECHOES manual ch07 §"n-layer ALV bulk recurrence" ; sanahuja2013.
MeanFieldHomogenization.Viscoelasticity.bulk_state_seq_alv Function
bulk_state_seq_alv(sphere, C0_law, times)
-> (inside_states::NTuple{N, Matrix}, s_matrix::Matrix)Backwards-compatible wrapper that exposes the σ-state form of the bulk recurrence: at each layer
Most users should rely on bulk_concentration_alv directly. This helper is retained for the existing test that asserts the matrix-side state matches the analytical Hervé-Zaoui boundary condition.
MeanFieldHomogenization.Viscoelasticity.bulk_amplitude_seq_alv Function
bulk_amplitude_seq_alv(sphere, C0_law, times)
-> (NTuple{N, (A_k, B_k)}, A_M, B_M)Forward-propagate the bulk mode amplitudes A_M, B_M).
Supports PerfectInterface, SpringInterface (primal) and MembraneInterface (dual) — same set as the σ-state recurrence — but with no matrix inversion of a fundamental volterra_divide by
MeanFieldHomogenization.Viscoelasticity.shear_concentration_alv Function
shear_concentration_alv(sphere, C0_law, times) -> NTuple{N, Matrix}Per-layer deviatoric ALV concentration matrices
The
Reference : ECHOES manual ch07 §"n-layer ALV shear recurrence" ; Hervé-Zaoui 1993 generalized to ALV via (Sanahuja, 2013).
MeanFieldHomogenization.Viscoelasticity.gradient_concentration_alv Function
gradient_concentration_alv(sphere, K0_law, times) -> NTuple{N, Matrix}Per-layer gradient concentrations of a LayeredSphere in an isotropic aging reference: the bulk_concentration_alv). For a non-aging problem they are the elastic ones of gradient_gradient_concentration at every time step.
The names of elasticity and of conduction
Each generic function also answers to the name it has in elasticity, and the contribution to the name it has in conduction. Such a name forwards to the generic function, accepts one order only, and refuses the other with an error that names the generic function. The crack functions are elastic only, and their names in elasticity are plain synonyms.
| Generic function | Elasticity (order 4) | Conduction (order 2) |
|---|---|---|
gradient_gradient_concentration_alv | strain_strain_concentration_alv | |
property_contribution_alv | stiffness_contribution_alv | conductivity_contribution_alv |
property_contribution_alv_at | stiffness_contribution_alv_at | |
inverse_property_contribution_alv | compliance_contribution_alv | |
delta_property_alv | delta_stiffness_alv | |
delta_inverse_property_alv | delta_compliance_alv |
MeanFieldHomogenization.Viscoelasticity.strain_strain_concentration_alv Function
strain_strain_concentration_alv(sphere, C0_law, times; external = true) -> MatrixName in elasticity of gradient_gradient_concentration_alv, for a fourth-order reference only.
MeanFieldHomogenization.Viscoelasticity.stiffness_contribution_alv Function
stiffness_contribution_alv(sphere_or_crack, C0_law, times; kw...) -> MatrixName in elasticity of property_contribution_alv, for a fourth-order reference only.
MeanFieldHomogenization.Viscoelasticity.conductivity_contribution_alv Function
conductivity_contribution_alv(sphere, K0_law, times; external = true) -> MatrixName in conduction of property_contribution_alv, for a second-order reference only.
MeanFieldHomogenization.Viscoelasticity.stiffness_contribution_alv_at Function
stiffness_contribution_alv_at(sphere_or_crack, C_ref, args...; kw...) -> MatrixName in elasticity of property_contribution_alv_at, whose methods are all elastic.
MeanFieldHomogenization.Viscoelasticity.compliance_contribution_alv Function
compliance_contribution_alv(crack, C_M_law, times; Rn, Rt) -> MatrixName in elasticity of inverse_property_contribution_alv, whose methods are all elastic.
MeanFieldHomogenization.Viscoelasticity.delta_stiffness_alv Function
delta_stiffness_alv(crack, Ñ, ε) -> MatrixName in elasticity of delta_property_alv.
MeanFieldHomogenization.Viscoelasticity.delta_compliance_alv Function
delta_compliance_alv(crack, H̃, ε) -> MatrixName in elasticity of delta_inverse_property_alv.
Order-2 ALV (conductivity / diffusion)
The kernels below act on Volterra matrices, which do not carry their order in their type: a homogenize_alv chooses among them from the property.
MeanFieldHomogenization.Viscoelasticity.hill_kernel_order2 Function
hill_kernel_order2(ell, K_0_law::ViscoLaw, times) -> MatrixBuild the discrete Hill kernel
MeanFieldHomogenization.Viscoelasticity.second_hill_kernel_order2 Function
second_hill_kernel_order2(ell, K_0_law::ViscoLaw, times) -> MatrixDiscrete ALV second Hill tensor kernel (size K_0_law: hill_kernel_order2; the order-2 counterpart of second_hill_kernel.
MeanFieldHomogenization.Viscoelasticity.voigt_alv_order2 Function
voigt_alv_order2(matrices, fractions) -> MatrixOrder-2 Voigt bound:
MeanFieldHomogenization.Viscoelasticity.reuss_alv_order2 Function
reuss_alv_order2(matrices, fractions) -> MatrixOrder-2 Reuss bound: invert each compliance, average, invert back.
MeanFieldHomogenization.Viscoelasticity.dilute_alv_order2 Function
dilute_alv_order2(K_0, contribs, fractions) -> MatrixOrder-2 Dilute scheme:
MeanFieldHomogenization.Viscoelasticity.dilute_dual_alv_order2 Function
dilute_dual_alv_order2(K_0, contribs_compliance, fractions) -> MatrixOrder-2 DiluteDual: invert to compliance space, average, invert back.
MeanFieldHomogenization.Viscoelasticity.mori_tanaka_alv_order2 Function
mori_tanaka_alv_order2(K_0, A_duts, contribs, fractions, f_M) -> MatrixOrder-2 Mori-Tanaka:
MeanFieldHomogenization.Viscoelasticity.maxwell_alv_order2 Function
maxwell_alv_order2(K_0, contribs, fractions; H_0) -> MatrixOrder-2 Maxwell scheme. H_0 is the Hill kernel of the (matrix-only) distribution shape — defaults to a sphere when not specified by homogenize_alv_order2.
MeanFieldHomogenization.Viscoelasticity.self_consistent_alv_order2 Function
self_consistent_alv_order2(rve, prop; times, matrix = nothing, abstol = 1e-10,
reltol = 1e-8, maxiters = 200, damping = 0.0,
verbose = false) -> MatrixOrder-2 (conduction, diffusion) self-consistent estimate in the aging linear Volterra setting: the fixed point of matrix, or the one with fraction = :rest). A LayeredSphere phase enters through its recurrence. Every phase must keep the estimate isotropic, as the order-2 Hill kernel against it requires: a sphere of isotropic conductivity, a layered sphere, or symmetrize = :iso. Reached through homogenize_alv(rve, SelfConsistent(), :K; times).
MeanFieldHomogenization.Viscoelasticity.homogenize_alv_order2 Function
homogenize_alv_order2(rve, scheme, prop; times)Backwards-compatible alias for homogenize_alv when the matrix property is order-2. New code should call homogenize_alv directly — the dispatch on order-2 vs order-4 is automatic from the law sample.
MeanFieldHomogenization.Viscoelasticity.dilute_concentration_alv_order2 Function
dilute_concentration_alv_order2(K_E, K_0, P) -> MatrixOrder-2 dilute concentration
MeanFieldHomogenization.Viscoelasticity.dilute_contribution_alv_order2 Function
dilute_contribution_alv_order2(K_E, K_0, P) -> MatrixOrder-2 dilute contribution
MeanFieldHomogenization.Viscoelasticity.iso_order2_params_from_blocks Function
iso_order2_params_from_blocks(M) -> α::MatrixDecompose a
MeanFieldHomogenization.Viscoelasticity.iso_order2_blocks_from_params Function
iso_order2_blocks_from_params(α::AbstractMatrix) -> MatrixInverse of iso_order2_params_from_blocks: build a
Structured ALV kernel types
MeanFieldHomogenization.Viscoelasticity.AbstractALVKernel Type
AbstractALVKernel{T} <: AbstractMatrix{T}Abstract supertype for structured ALV kernel wrappers. Concrete subtypes (ALVKernelISO, ALVKernelTI, ALVKernelOrtho) store the symmetry-class parameters compactly and present a getindex.
MeanFieldHomogenization.Viscoelasticity.ALVKernelISO Type
ALVKernelISO{T}(α::Matrix{T}, β::Matrix{T})
ALVKernelISO(M::AbstractMatrix)Iso ALV kernel: stores the two α and β (with Matrix(K) or getindex.
MeanFieldHomogenization.Viscoelasticity.ALVKernelTI Type
ALVKernelTI{T}(ℓ::NTuple{6, Matrix{T}}; axis = (0, 0, 1))
ALVKernelTI(M::AbstractMatrix; axis = (0, 0, 1))TI ALV kernel: stores the six
MeanFieldHomogenization.Viscoelasticity.ALVKernelOrtho Type
ALVKernelOrtho{T}(o::NTuple{12, Matrix{T}}; axes = canonical)
ALVKernelOrtho(M::AbstractMatrix; axes = canonical)Ortho ALV kernel: stores the twelve
Orientation symmetrization
MeanFieldHomogenization.Viscoelasticity._maybe_symmetrize_alv Function
_maybe_symmetrize_alv(M, sym) -> MatrixApply the orientation-averaging projection corresponding to sym to a NoSymmetrize (passthrough), IsoSymmetrize (block-by-block exact TISymmetrize(axis) (block-by-block exact azimuthal average about the axis).
MeanFieldHomogenization.Viscoelasticity._maybe_symmetrize_alv2 Function
_maybe_symmetrize_alv2(M, sym) -> MatrixOrder-2 counterpart of _maybe_symmetrize_alv, for
Public dispatcher
MeanFieldHomogenization.Viscoelasticity.homogenize_alv Function
homogenize_alv(lam::Laminate, ::Laminated, prop; times, kw...)Aging-viscoelastic effective operator of a periodic multilayer, dispatching on the order of the layer laws exactly as the elastic Laminated scheme dispatches on the order of the layer tensors.
homogenize_alv(rve, scheme, prop::Symbol; times) -> MatrixALV pipeline: build the discrete block matrices of every phase, compute the ALV Hill kernel and dilute concentration tensors, and dispatch on scheme to the corresponding _alv scheme function.
The function dispatches on the order of the matrix property (read once from the matrix ViscoLaw sample type):
order-4 (4-tensor /
Mandel kernel) → returns relaxation matrix following the standard Hill-kernel + dilute-concentration pipeline.order-2 (2-tensor /
kernel; conductivity / diffusion / permittivity) → returns matrix via the order-2 ALV pipeline (hill_kernel_order2, time-space decoupling).
Supports two inclusion-geometry families, in both orders:
Single-shape ellipsoidal (
Ellipsoid,Spheroid): the standard Hill-kernel + dilute-concentration pipeline.LayeredSphere: the ALV recurrences feed its concentration and contribution directly — no Hill kernel is needed. At order 4 these aregradient_gradient_concentration_alvandproperty_contribution_alv(bulk and shear recurrences,bulk_concentration_alv,shear_concentration_alv); at order 2,gradient_gradient_concentration_alvandproperty_contribution_alv. The phase property is ignored (the layers carry their own kernels); pass anyViscoLaw(e.g.heaviside_law(C_0)) as a placeholder.
symmetrize is honored in both orders, with the projector of the matching tensor order (_maybe_symmetrize_alv and _maybe_symmetrize_alv2). Voigt and Reuss average the phase relaxation matrices (Voigt) or their Volterra inverses (Reuss) directly, each over its orientation distribution symmetrize; the geometry does not enter them.
Reference-updating schemes need an isotropic running medium
Every ALV Hill kernel, order 2 and order 4 alike, is built for an isotropic reference: that is what decouples the time and space parts. Voigt, Reuss, Dilute, DiluteDual, MoriTanaka, Maxwell and PCW evaluate it against the fixed, isotropic matrix and accept any inclusion shape or orientation. SelfConsistent and DifferentialScheme evaluate it against their running estimate, so every inclusion phase must keep that estimate isotropic — either a spherical inclusion with an isotropic phase law, or an isotropic orientation average symmetrize = :iso, which is also what randomly oriented inclusions and cracks mean physically. A LayeredSphere, whose contribution is isotropic by construction, is always accepted.
An RVE satisfying neither raises an ArgumentError naming the phase, rather than reading iso parameters off a matrix that is not isotropic. A non-isotropic ALV matrix is refused for the same reason. The elastic pipeline has no such restriction — its Hill tensor is available for anisotropic references.
MeanFieldHomogenization.Viscoelasticity.has_visco_property Function
has_visco_property(cell, prop::Symbol = :C) -> BoolReturn true if any member (phase or layer) of cell carries a ViscoLaw under the key prop.
Reads through the raw accessor cell_container_property: this is a type inspection, and going through the resolving accessor would run a whole inner homogenization on every declaratively nested cell just to look at a type. A nested cell is instead recursed into, so a ViscoLaw buried one scale down is still reported.