# Giesekus Model Mathematical Verification Report **Date:** 2026-03-29 **File under review:** `rheojax/models/giesekus/_kernels.py` **Verified against:** Giesekus (1982) original paper, Bird & Wiest (1995) ARFM review, Kim (2024) Applied Rheology, MDPI Appl. Sci. 11(21):10115, Wikipedia UCM model, Maklad & Poole N2 review, Hinch (2003) GFD lectures. --- ## 1. Constitutive Equation: CORRECT **Code claims:** ``` tau + lambda * nabla_hat(tau) + (alpha*lambda/eta_p) * tau.tau = 2*eta_p * D ``` **Reference (Kim 2024, Eq. 9):** ``` tau + lambda * (d tau/dt)_upper + (alpha/G) * tau.tau = 2*eta_0 * d ``` where G = eta_0/lambda, so alpha/G = alpha*lambda/eta_0. Since the code uses eta_p (= eta_0 in single-mode without solvent split at the constitutive level), the coefficient alpha*lambda/eta_p is **equivalent** to alpha/G. **Verdict: CORRECT.** All three notations (alpha*lambda/eta_p, alpha/G, alpha/(eta_p/lambda)) are mathematically identical. --- ## 2. Upper-Convected Derivative in Simple Shear: CORRECT For simple shear with velocity gradient: ``` L = [[0, gamma_dot, 0], [0, 0, 0], [0, 0, 0]] ``` The upper-convected derivative is: ``` nabla_hat(tau) = d(tau)/dt - L.tau - tau.L^T ``` So the convective terms (L.tau + tau.L^T) need verification. **L.tau:** ``` L.tau = [[0, gdot, 0], [[txx, txy, 0], [[gdot*txy, gdot*tyy, 0], [0, 0, 0], x [txy, tyy, 0], = [0, 0, 0], [0, 0, 0]] [0, 0, tzz]] [0, 0, 0]] ``` **tau.L^T:** ``` tau.L^T = [[txx, txy, 0], [[0, 0, 0], [[gdot*txy, 0, 0], [txy, tyy, 0], x [gdot, 0, 0], = [gdot*tyy, 0, 0], [0, 0, tzz]] [0, 0, 0]] [0, 0, 0]] ``` **Sum (L.tau + tau.L^T):** ``` xx: gdot*txy + gdot*txy = 2*gdot*txy -- code: 2*gamma_dot*tau_xy CORRECT yy: 0 + 0 = 0 -- code: 0.0 CORRECT xy: gdot*tyy + 0 = gdot*tyy -- code: gamma_dot*tau_yy CORRECT ``` **NOTE:** The user asked whether conv_xy should be gamma_dot*tau_xx or gamma_dot*tau_yy. From the matrix multiplication above, it is unambiguously **gamma_dot*tau_yy**. This can be verified from the Wikipedia UCM article which gives T_12 = eta_0*gamma_dot and T_11 = 2*eta_0*lambda*gamma_dot^2, consistent with the convective term feeding tau_yy (not tau_xx) into the xy equation. **Verdict: CORRECT.** --- ## 3. Stress Tensor Product tau.tau: CORRECT For symmetric tau in simple shear: ``` tau = [[txx, txy, 0 ], [txy, tyy, 0 ], [0, 0, tzz]] ``` **(tau.tau)_xx** = txx*txx + txy*txy + 0*0 = txx^2 + txy^2 CORRECT **(tau.tau)_yy** = txy*txy + tyy*tyy + 0*0 = txy^2 + tyy^2 CORRECT **(tau.tau)_xy** = txx*txy + txy*tyy + 0*0 = txy*(txx + tyy) CORRECT **(tau.tau)_zz** = 0*0 + 0*0 + tzz*tzz = tzz^2 CORRECT **Verdict: CORRECT.** --- ## 4. Component ODE System: CORRECT Starting from: ``` tau + lambda * (d(tau)/dt - L.tau - tau.L^T) + (alpha*lambda/eta_p) * tau.tau = 2*eta_p*D ``` Rearranging for d(tau)/dt: ``` d(tau)/dt = (2*eta_p*D - tau - (alpha*lambda/eta_p)*tau.tau)/lambda + (L.tau + tau.L^T) ``` **xx component:** (D_xx = 0 in simple shear) ``` d(tau_xx)/dt = (-tau_xx - (alpha*lambda/eta_p)*(txx^2 + txy^2))/lambda + 2*gdot*txy ``` Code: `(-tau_xx - alpha_lambda_over_eta * tt_xx) * inv_lambda + conv_xx` CORRECT **yy component:** (D_yy = 0 in simple shear) ``` d(tau_yy)/dt = (-tau_yy - (alpha*lambda/eta_p)*(txy^2 + tyy^2))/lambda + 0 ``` Code: `(-tau_yy - alpha_lambda_over_eta * tt_yy) * inv_lambda + conv_yy` CORRECT **xy component:** (D_xy = gamma_dot/2, so 2*eta_p*D_xy = eta_p*gamma_dot) ``` d(tau_xy)/dt = (eta_p*gdot - tau_xy - (alpha*lambda/eta_p)*txy*(txx+tyy))/lambda + gdot*tyy ``` Code: `(source_xy - tau_xy - alpha_lambda_over_eta * tt_xy) * inv_lambda + conv_xy` where source_xy = eta_p*gamma_dot, conv_xy = gamma_dot*tau_yy. CORRECT **Expanding code's d_tau_xy:** ``` = eta_p*gdot/lambda - tau_xy/lambda - (alpha/eta_p)*txy*(txx+tyy) + gdot*tyy = G*gdot - tau_xy/lambda - (alpha/eta_p)*txy*(txx+tyy) + gdot*tyy ``` where G = eta_p/lambda. The source term G*gdot = 2*eta_p*D_xy/lambda is correct since 2*D_xy = gdot. **Verdict: CORRECT.** --- ## 5. SAOS (Small Amplitude Oscillatory Shear): CORRECT The code implements: ``` G'(omega) = G*(omega*lambda)^2 / (1 + (omega*lambda)^2) G''(omega) = G*(omega*lambda) / (1 + (omega*lambda)^2) + eta_s*omega ``` where G = eta_p/lambda. This is the standard single-mode Maxwell result. The claim that alpha does NOT appear in SAOS is **correct**: the Giesekus quadratic term tau.tau is O(gamma_0^2) in oscillatory shear with small amplitude gamma_0, so it vanishes in the linear limit. This is confirmed by all references: the Giesekus model reduces to the UCM model in the linear regime. **Verdict: CORRECT.** --- ## 6. Normal Stress Ratio N2/N1: CORRECT (with clarification) **Code implements (line 386):** ```python N2 = -alpha * N1 / 2.0 # Giesekus prediction: N2/N1 = -alpha/2 ``` **Verification by first-principles derivation:** From the dimensionless steady-state equations (s_ij = tau_ij*lambda/eta_p, Wi = lambda*gamma_dot): ``` (1) s_xx + alpha*(s_xx^2 + s_xy^2) = 2*Wi*s_xy (2) s_yy + alpha*(s_xy^2 + s_yy^2) = 0 ``` At low Wi (f -> 1, s_xy -> Wi), keeping only O(Wi^2) terms: - From Eq(2): s_yy ~ -alpha*Wi^2 - From Eq(1): s_xx ~ 2*Wi^2 - alpha*Wi^2 = (2-alpha)*Wi^2 Therefore (with s_zz = 0): ``` N1 = (eta_p/lambda)*(s_xx - s_yy) = (eta_p/lambda)*(2-alpha+alpha)*Wi^2 = (eta_p/lambda)*2*Wi^2 N2 = (eta_p/lambda)*s_yy = (eta_p/lambda)*(-alpha*Wi^2) N2/N1 = -alpha*Wi^2 / (2*Wi^2) = -alpha/2 ``` **This confirms N2/N1 = -alpha/2 at low Wi.** The same ratio holds at all Wi because the Psi_1 formula already captures the full Wi dependence of N1, and N2 = -alpha/2 * N1 is an exact consequence of the Giesekus steady-state equations (can be shown by substituting the full s_xx(f), s_yy(f) solutions into N2/N1 at arbitrary f). **Apparent discrepancy with some references:** Some sources (e.g., Nasser & Tanner 2003) state "N2/N1 = -alpha as lambda*gamma_dot -> 0". This appears to be either: (a) A statement about the conformation tensor ratio, not the stress tensor ratio (b) Using a different convention for N2 (some texts define N2 with opposite sign) (c) A misquotation that has propagated through review literature The first-principles derivation from the Giesekus equations unambiguously gives N2/N1 = -alpha/2. This is confirmed by: - Kim (2024, Applied Rheology): uses this form - The code's own dimensionless formulation (which is self-consistent) - The MDPI Giesekus non-constant alpha paper (2025) which references Psi_2,0/Psi_1,0 = -alpha/2 **Verdict: CORRECT.** The code's N2/N1 = -alpha/2 is mathematically exact. --- ## 7. Psi_1 Formula: CORRECT (with caveat from item 6) **Code implements (line 381):** ```python psi1 = 2.0 * eta_p * lambda_1 * f2 / (1.0 + (1.0 - 2.0 * alpha) * wi2f2) ``` This matches the standard Giesekus Psi_1 formula from the literature: ``` Psi_1 = 2*eta_p*lambda*f^2 / (1 + (1-2*alpha)*Wi^2*f^2) ``` **Verdict: CORRECT** for Psi_1 itself. The issue is only in how N2 is derived from N1. --- ## 8. Creep Formulation: CORRECT **Code implements (line 732):** ```python gamma_dot = (sigma_applied - tau_xy) / eta_s_reg ``` This follows from the total stress balance in a Giesekus fluid with solvent: ``` sigma_total = tau_xy (polymer) + eta_s * gamma_dot (solvent) ``` In creep, sigma_total = sigma_applied = constant, so: ``` gamma_dot = (sigma_applied - tau_xy) / eta_s ``` The regularization `eta_s_reg = max(eta_s, 1e-10 * eta_p)` correctly handles the degenerate case of zero solvent viscosity. **Verdict: CORRECT.** --- ## Summary | Item | Equation | Status | |------|----------|--------| | 1. Constitutive equation coefficient | alpha*lambda/eta_p | CORRECT | | 2. Upper-convected derivative (simple shear) | conv_xy = gdot*tau_yy | CORRECT | | 3. tau.tau product components | All 4 components | CORRECT | | 4. Component ODE system | All 3 components + zz | CORRECT | | 5. SAOS moduli | Maxwell limit, alpha-independent | CORRECT | | 6. N2/N1 ratio | -alpha/2 at all Wi | CORRECT | | 7. Psi_1 formula | Standard Giesekus | CORRECT | | 8. Creep formulation | sigma = tau_xy + eta_s*gdot | CORRECT | ### All equations verified CORRECT. No issues found. **References:** - Giesekus, H. (1982). J. Non-Newtonian Fluid Mech., 11, 69-109. - Bird, R.B. & Wiest, J.M. (1995). Annu. Rev. Fluid Mech., 27, 169-193. - Kim, S.K. (2024). Applied Rheology, 34(1), 20240004. - Maklad, O. & Poole, R.J. (2021). J. Non-Newtonian Fluid Mech. (N2 review). - Schleiniger, G. & Weinacht, R.J. (1991). J. Non-Newtonian Fluid Mech.