Domain: Chemistry — Polymer Chemistry

Problem:
A polymer nanocomposite film of thickness \(H\) is reinforced with two distinct families of coated spherical nanoparticles (types A and B). Each family has:

- a polydisperse core radius,
- a graded interphase whose modulus depends on radius and local temperature,
- a through-thickness composition gradient.

All phases are isotropic and linearly elastic.

Compute:
\[
\eta_{\mathrm{avg}} = \frac{1}{H}\int_0^H
\frac{E_{\mathrm{eff}}(z)}{E_m\big(T(z)\big)}\,\mathrm{d}z
\]

and report \(\eta_{\mathrm{avg}}\) to three decimal places.

1. Matrix Modulus and Temperature Profile

The film thickness is:
\[
H = 100.0\ \mu\text{m}
\]

Define a through-thickness coordinate \(z\in[0,H]\) (in \(\mu\)m), with:

- Bottom surface \(z=0\) at temperature \(T_{\min}\),
- Top surface \(z=H\) at temperature \(T_{\max}\).

Temperatures:
\[
T_{\min} = 290\ \text{K},\quad T_{\max} = 430\ \text{K}
\]

Temperature varies linearly through thickness:
\[
T(z) = T_{\min} + \big(T_{\max} - T_{\min}\big)\,\frac{z}{H}
\]

The matrix Young’s modulus depends on local temperature as:
\[
E_m\big(T(z)\big) = E_{m0}\,\exp\!\big[-\alpha\,(T(z) - T_0)\big]
\]
with:
\[
E_{m0} = 2.80\ \text{GPa},\quad
T_0 = 300\ \text{K},\quad
\alpha = 5.0\times 10^{-3}\ \text{K}^{-1}
\]

2. Filler Families and Local Volume Fractions

There are two filler families: A and B.

The total (coated) filler volume fraction at position \(z\) is:
\[
\phi_{\text{tot}}(z) = \phi_0\left[1 + \xi \sin\!\left(\pi\frac{z}{H}\right)\right]
\]
with:
\[
\phi_0 = 0.10,\quad \xi = 0.30
\]

The local fraction of type A (among all fillers) varies as:
\[
w_A(z) = 0.30 + 0.40\left(\frac{z}{H}\right)^2
\]
The fraction of type B is:
\[
w_B(z) = 1 - w_A(z)
\]

Thus, the local volume fractions of coated particles are:
\[
\phi_A(z) = \phi_{\text{tot}}(z)\,w_A(z),\qquad
\phi_B(z) = \phi_{\text{tot}}(z)\,w_B(z)
\]

The core modulus for both families is temperature-independent:
\[
E_c = 80.0\ \text{GPa}
\]

3. Particle Geometry (Both Families)

For both A and B:

- Core radius \(R\) (nm).
- Interphase thickness \(\delta_k\) (nm) (where \(k\in\{A,B\}\)):
  
 \[
  R_{\text{out},k} = R + \delta_k
  \]

Given:
\[
\delta_A = 3.0\ \text{nm},\qquad
\delta_B = 5.0\ \text{nm}
\]

All radii are in nm. You may treat all length-dependent quantities consistently in nm.

4. Core Radius Distributions

4.1 Type A (Lognormal, Truncated)

For type A, the core radius \(R\) lies in:
\[
R_{\min,A} = 5.0\ \text{nm},\quad
R_{\max,A} = 40.0\ \text{nm}
\]

Unnormalized lognormal density:
\[
f_{\mathrm{LN},A}(R) =
\frac{1}{R\,\sigma_A\sqrt{2\pi}}\,
\exp\!\left[
-\frac{(\ln R - \mu_A)^2}{2\sigma_A^2}
\right]
\]
with:
\[
\mu_A = \ln(15.0),\quad \sigma_A = 0.50
\]

Normalization factor:
\[
Z_A = \int_{R_{\min,A}}^{R_{\max,A}} f_{\mathrm{LN},A}(R)\,\mathrm{d}R
\]

Final PDF:
\[
f_A(R) = \frac{f_{\mathrm{LN},A}(R)}{Z_A}
\quad\text{for } R_{\min,A} \le R \le R_{\max,A},\quad
\text{else}\  f_A(R)=0.
\]

4.2 Type B (Shifted Truncated Gaussian in Radius)

For type B, the core radius \(R\) lies in:
\[
R_{\min,B} = 10.0\ \text{nm},\quad
R_{\max,B} = 50.0\ \text{nm}
\]

Unnormalized Gaussian-in-R density:
\[
f_{\mathrm{G},B}(R) =
\exp\!\left[
-\frac{(R - \mu_B)^2}{2\sigma_B^2}
\right]
\]
with:
\[
\mu_B = 25.0\ \text{nm},\quad \sigma_B = 7.0\ \text{nm}
\]

Normalization factor:
\[
Z_B = \int_{R_{\min,B}}^{R_{\max,B}} f_{\mathrm{G},B}(R)\,\mathrm{d}R
\]

Final PDF:
\[
f_B(R) = \frac{f_{\mathrm{G},B}(R)}{Z_B}
\quad\text{for } R_{\min,B} \le R \le R_{\max,B},\quad
\text{else}\ f_B(R)=0.
\]

Both \(Z_A\) and \(Z_B\) must be evaluated **numerically**.

5. Radially Graded Interphase Modulus

For family \(k\in\{A,B\}\) with core radius \(R\), and radial coordinate \(r\) such that:
\[
R \le r \le R_{\text{out},k} = R + \delta_k,
\]
the local interphase modulus at temperature \(T(z)\) is:

\[
E_{i,k}(r;R,z) =
E_m\big(T(z)\big)
+
\Big(E_{\text{peak},k}(T(z)) - E_m\big(T(z)\big)\Big)\,
\exp\!\left(-\frac{r - R}{\lambda_k(T(z))}\right)
\]

with:

- Type A:
  \[
  E_{\text{peak},A}(T) = 9.0\ \text{GPa} - 5.0\times 10^{-3}\,(T - T_0)\ \text{GPa}
  \]
  \[
  \lambda_A(T) = 2.0\ \text{nm}\,\exp\!\big[-2.0\times 10^{-3}\,(T - T_0)\big]
  \]

- Type B:
  \[
  E_{\text{peak},B}(T) = 7.5\ \text{GPa} - 3.0\times 10^{-3}\,(T - T_0)\ \text{GPa}
  \]
  \[
  \lambda_B(T) = 1.5\ \text{nm}\,\exp\!\big[-1.0\times 10^{-3}\,(T - T_0)\big]
  \]

All \(T\) in K, radii in nm, moduli in GPa.

6. Effective Shell Modulus \(E_{\text{shell},k} (R,z )\)

For each family \(k\in\{A,B\}\), and for each \(R\) and \(z\), define the effective homogeneous shell modulus via volume-averaged compliance:

Shell volume:
\[
V_{\text{shell} k}(R) =
\frac{4\pi}{3}\Big(R_{\text{out},k}^3 - R^3\Big)
\]

Volume-averaged compliance:
\[\left\langle \frac{1}{E_{i, k}} \right\rangle_{R, z}=\frac{1 }{V_{\text{shell}, k}(R)} \int_{R}^{R_{\text{out}, k}} \frac{1}{E_{i,k}(r;R,z)}\,
4\pi r^2\,\mathrm{d}r
\]

Effective shell modulus:
\[
\frac{1}{E_{\text{shell},k}(R,z)} =
\left\langle \frac{1}{E_{i,k}} \right\rangle_{R,z}
\]

For numerical work, you may cancel the factor \(4\pi/3\) and write:
\[
\frac{1}{E_{\text{shell},k}(R,z)} =
\frac{3}{R_{\text{out},k}^3 - R^3}
\int_{R}^{R_{\text{out},k}}
\frac{r^2}{E_{i,k}(r;R,z)}\,\mathrm{d}r
\]

This radial integral over \(r\) must be evaluated numerically for each \((k, R, z)\).

7. Effective Inclusion Modulus \(E_{\text{inc},k}(R,z)\)

Within a single coated particle of family \(k\) and core radius \(R\), define:

Core volume fraction:
\[
f_{\text{core},k}(R) = \frac{R^3}{R_{\text{out},k}^3}
\]

Shell volume fraction:
\[
f_{\text{shell},k}(R) = 1 - f_{\text{core},k}(R)
\]

Effective homogeneous inclusion modulus:
\[E_{\text{inc},k}(R,z) = f_{\text{core},k}(R)\,E_c + f_{\text{shell},k}(R)\,E_{\text{shell},k}(R,z)
\]

8. Radius-Averaged Inclusion Moduli for Each Family

For each \(z\), define the radius-averaged inclusion modulus for each family:

- Type A:
  \[
  \bar{E}_{\text{inc},A}(z) =
  \int_{R_{\min,A}}^{R_{\max,A}} f_A(R)\,E_{\text{inc},A}(R,z)\,\mathrm{d}R
  \]

- Type B:
  \[
  \bar{E}_{\text{inc},B}(z) =
  \int_{R_{\min,B}}^{R_{\max,B}} f_B(R)\,E_{\text{inc},B}(R,z)\,\mathrm{d}R
  \]

Each of these \(R\)-integrals must be computed numerically for each \(z\).

9. Local Self-Consistent Composite Modulus \(E_{\mathrm{eff}}(z)\)

At each position \(z\in[0, H]\), the local effective composite modulus \(E_{\mathrm{eff}}(z)\) is defined implicitly as the solution of the nonlinear scalar equation:

\[0 =
\phi_A(z)\,
\frac{\bar{E}_{\text{inc},A}(z) - E_{\mathrm{eff}}(z)}{
1 + \alpha_A\;\dfrac{\bar{E}_{\text{inc},A}(z) - E_{\mathrm{eff}}(z)}{E_{\mathrm{eff}}(z)}
}
+
\phi_B(z)\,
\frac{\bar{E}_{\text{inc},B}(z) - E_{\mathrm{eff}}(z)}{
1 + \alpha_B\;\dfrac{\bar{E}_{\text{inc},B}(z) - E_{\mathrm{eff}}(z)}{E_{\mathrm{eff}}(z)}
}
-\frac{E_{\mathrm{eff}}(z) - E_m\big(T(z)\big)}{E_m\big(T(z)\big)}
\]

with shape/interaction parameters:
\[
\alpha_A = 0.35,\qquad \alpha_B = 0.20
\]

For each \(z\), this equation has a single scalar unknown*\(E_{\mathrm{eff}}(z)\) and must be solved.

Answer: 2.742

Solution code:
import math
def solution():

    # =========================
    # 1. Global constants
    # =========================

    # Matrix modulus vs T
    E_m0 = 2.8        # GPa
    T0 = 300.0        # K
    alpha = 5.0e-3    # 1/K

    # Filler core
    E_c = 80.0        # GPa

    # Filler volume fraction profile
    phi_0 = 0.10
    xi = 0.30

    # Film thickness and temperature range
    H = 100.0         # micrometers
    T_min = 290.0     # K
    T_max = 430.0     # K

    # Family A parameters
    delta_A = 3.0     # nm
    Rmin_A, Rmax_A = 5.0, 40.0  # nm
    mu_A = math.log(15.0)
    sigma_A = 0.50

    # Family B parameters
    delta_B = 5.0     # nm
    Rmin_B, Rmax_B = 10.0, 50.0 # nm
    mu_B = 25.0       # nm
    sigma_B = 7.0     # nm

    # Self-consistent interaction parameters
    alpha_A = 0.35
    alpha_B = 0.20

    # Discretization settings (adjustable)
    N_seg_R_A = 80    # segments for R integral (A), must be even
    N_seg_R_B = 80    # segments for R integral (B), must be even
    N_seg_r   = 80    # segments for radial integral in interphase, must be even
    N_seg_z   = 40    # segments for z integral, must be even

    # =========================
    # 2. Basic helper functions
    # =========================

    def Em(T):
        """Matrix modulus as a function of temperature T (K)."""
        return E_m0 * math.exp(-alpha * (T - T0))

    def T_of_z(z):
        """Through-thickness temperature profile T(z)."""
        return T_min + (T_max - T_min) * (z / H)

    def phi_tot(z):
        """Local total coated filler volume fraction φ_tot(z)."""
        return phi_0 * (1.0 + xi * math.sin(math.pi * z / H))

    def w_A_of_z(z):
        """Local fraction of type A among fillers at position z."""
        return 0.30 + 0.40 * (z / H) ** 2

    # Interphase profile parameters
    def E_peak_A(T):
        return 9.0 - 5.0e-3 * (T - T0)

    def lam_A(T):
        return 2.0 * math.exp(-2.0e-3 * (T - T0))

    def E_peak_B(T):
        return 7.5 - 3.0e-3 * (T - T0)

    def lam_B(T):
        return 1.5 * math.exp(-1.0e-3 * (T - T0))

    # 1D Simpson grid constructor
    def simpson_grid(a, b, N_seg):
        """
        Build Simpson integration grid:
        returns (x_values, Simpson_weights, step h) over [a, b] using N_seg segments.
        N_seg must be even.
        """
        assert N_seg % 2 == 0, "N_seg must be even for Simpson's rule."
        h = (b - a) / N_seg
        xs = [a + i * h for i in range(N_seg + 1)]
        ws = []
        for i in range(N_seg + 1):
            if i == 0 or i == N_seg:
                w = 1.0
            elif i % 2 == 1:
                w = 4.0
            else:
                w = 2.0
            ws.append(w)
        return xs, ws, h

    # =========================
    # 3. Radius distributions
    # =========================

    # Family A: truncated lognormal on [Rmin_A, Rmax_A]
    def f_LN_A(R):
        return (1.0 / (R * sigma_A * math.sqrt(2.0 * math.pi))) * math.exp(
            -((math.log(R) - mu_A) ** 2) / (2.0 * sigma_A ** 2)
        )

    # Family B: truncated Gaussian in R on [Rmin_B, Rmax_B]
    def f_G_B(R):
        return math.exp(-((R - mu_B) ** 2) / (2.0 * sigma_B ** 2))

    # Build Simpson grids in R for each family
    R_A, w_R_A, h_R_A = simpson_grid(Rmin_A, Rmax_A, N_seg_R_A)
    R_B, w_R_B, h_R_B = simpson_grid(Rmin_B, Rmax_B, N_seg_R_B)

    # Normalize pdf_A on [Rmin_A, Rmax_A]
    Z_A_num = 0.0
    for i, R in enumerate(R_A):
        Z_A_num += w_R_A[i] * f_LN_A(R)
    Z_A = Z_A_num * h_R_A / 3.0
    pdf_A = [f_LN_A(R) / Z_A for R in R_A]

    # Normalize pdf_B on [Rmin_B, Rmax_B]
    Z_B_num = 0.0
    for i, R in enumerate(R_B):
        Z_B_num += w_R_B[i] * f_G_B(R)
    Z_B = Z_B_num * h_R_B / 3.0
    pdf_B = [f_G_B(R) / Z_B for R in R_B]

    # =========================
    # 4. Interphase and inclusion moduli
    # =========================

    def E_i_family(k, r, R, T, Em_local):
        """Local interphase modulus E_i for family k ('A' or 'B')."""
        if k == 'A':
            E_peak = E_peak_A(T)
            lam = lam_A(T)
        else:
            E_peak = E_peak_B(T)
            lam = lam_B(T)
        return Em_local + (E_peak - Em_local) * math.exp(-(r - R) / lam)

    def E_shell_family(k, R, T, Em_local):
        """
        Effective shell modulus E_shell for family k and core radius R,
        via volume-averaged compliance over R <= r <= R_out.
        """
        delta = delta_A if k == 'A' else delta_B
        R_out = R + delta

        # Radial Simpson integration over r^2 / E_i(r;R,z)
        h_r = (R_out - R) / N_seg_r
        integral = 0.0
        for j in range(N_seg_r + 1):
            r = R + j * h_r
            Ei = E_i_family(k, r, R, T, Em_local)
            integrand = (r ** 2) / Ei
            if j == 0 or j == N_seg_r:
                w = 1.0
            elif j % 2 == 1:
                w = 4.0
            else:
                w = 2.0
            integral += w * integrand
        integral *= h_r / 3.0

        inv_E_shell = 3.0 * integral / (R_out ** 3 - R ** 3)
        return 1.0 / inv_E_shell

    def E_inc_family(k, R, T, Em_local):
        """
        Effective inclusion modulus for family k and core radius R:
        Voigt mixture of core and shell.
        """
        delta = delta_A if k == 'A' else delta_B
        R_out = R + delta
        E_shell = E_shell_family(k, R, T, Em_local)
        f_core = (R ** 3) / (R_out ** 3)
        f_shell = 1.0 - f_core
        return f_core * E_c + f_shell * E_shell

    # =========================
    # 5. Radius-averaged inclusion moduli
    # =========================

    def barE_inc_A(z, Em_local, T):
        """Radius-averaged inclusion modulus for family A at position z."""
        s = 0.0
        for i, R in enumerate(R_A):
            Einc = E_inc_family('A', R, T, Em_local)
            g = pdf_A[i] * Einc
            s += w_R_A[i] * g
        return s * h_R_A / 3.0

    def barE_inc_B(z, Em_local, T):
        """Radius-averaged inclusion modulus for family B at position z."""
        s = 0.0
        for i, R in enumerate(R_B):
            Einc = E_inc_family('B', R, T, Em_local)
            g = pdf_B[i] * Einc
            s += w_R_B[i] * g
        return s * h_R_B / 3.0

    # =========================
    # 6. Local self-consistent modulus E_eff(z)
    # =========================

    def solve_E_eff(z):
        """
        Solve the self-consistent scalar equation for E_eff(z) using bisection.
        """
        T = T_of_z(z)
        Em_local = Em(T)
        phi_t = phi_tot(z)
        wA = w_A_of_z(z)
        phiA = phi_t * wA
        phiB = phi_t * (1.0 - wA)

        # Precompute barE_inc for each family at this z
        barA = barE_inc_A(z, Em_local, T)
        barB = barE_inc_B(z, Em_local, T)

        # Define the scalar self-consistent equation F(E_eff) = 0
        def F(E_eff):
            termA = phiA * (barA - E_eff) / (1.0 + alpha_A * (barA - E_eff) / E_eff)
            termB = phiB * (barB - E_eff) / (1.0 + alpha_B * (barB - E_eff) / E_eff)
            return termA + termB - (E_eff - Em_local) / Em_local

        # Bracket a root
        lower = 0.1 * Em_local
        upper = max(barA, barB, Em_local, E_c) * 2.0

        F_lo = F(lower)
        F_hi = F(upper)

        # Expand upper if needed to get a sign change
        expand_count = 0
        while F_lo * F_hi > 0.0 and expand_count < 12:
            upper *= 2.0
            F_hi = F(upper)
            expand_count += 1

        # If still no sign change, fall back to Em_local (should be rare)
        if F_lo * F_hi > 0.0:
            return Em_local

        # Bisection
        lo, hi = lower, upper
        for _ in range(60):
            mid = 0.5 * (lo + hi)
            F_mid = F(mid)
            if abs(F_mid) < 1.0e-6:
                return mid
            if F_lo * F_mid < 0.0:
                hi = mid
                F_hi = F_mid
            else:
                lo = mid
                F_lo = F_mid
        return 0.5 * (lo + hi)

    # =========================
    # 7. Thickness-averaged reinforcement factor η_avg
    # =========================

    # Build Simpson grid over z
    z_vals, w_z, h_z = simpson_grid(0.0, H, N_seg_z)

    s_eta = 0.0
    for i, z in enumerate(z_vals):
        T = T_of_z(z)
        Em_local = Em(T)
        E_eff_z = solve_E_eff(z)
        s_eta += w_z[i] * (E_eff_z / Em_local)

    # Integral over z
    integral_z = s_eta * h_z / 3.0
    eta_avg = integral_z / H

    # Print and return
    return(f"{eta_avg:.3f}")

print(solution())