# Classical Linear Viscoelastic Model Equations -- Verification Reference Canonical formulations for verifying RheoJAX implementations against standard textbook references. ## References - [Ferry1980] Ferry, J. D. (1980). *Viscoelastic Properties of Polymers*, 3rd ed. Wiley. - [Macosko1994] Macosko, C. W. (1994). *Rheology: Principles, Measurements, and Applications*. Wiley-VCH. - [BAH1987] Bird, R. B., Armstrong, R. C., Hassager, O. (1987). *Dynamics of Polymeric Liquids*, Vol. 1, 2nd ed. Wiley. - [Tschoegl1989] Tschoegl, N. W. (1989). *The Phenomenological Theory of Linear Viscoelastic Behavior*. Springer. - [Findley1989] Findley, W. N., Lai, J. S., Onaran, K. (1989). *Creep and Relaxation of Nonlinear Viscoelastic Materials*. Dover. --- ## 1. Maxwell Model (Spring + Dashpot in Series) **Parameters:** G_0 (elastic modulus, Pa), eta (viscosity, Pa.s), tau = eta/G_0 (relaxation time, s) **Constitutive equation** [BAH1987, Eq. 5.2-12]: sigma + tau * d(sigma)/dt = eta * d(gamma)/dt **Relaxation modulus** [Ferry1980, Ch. 3; Macosko1994, Eq. 5.24]: G(t) = G_0 * exp(-t/tau) **Creep compliance** [Tschoegl1989, Ch. 2; Findley1989, Ch. 5]: J(t) = 1/G_0 + t/eta **Storage and loss moduli** [Ferry1980, Eq. 3.16-3.17; Macosko1994, Eq. 5.29-5.30]: G'(omega) = G_0 * (omega*tau)^2 / (1 + (omega*tau)^2) G''(omega) = G_0 * (omega*tau) / (1 + (omega*tau)^2) **Complex modulus:** G*(omega) = G'(omega) + i*G''(omega) **Complex viscosity** [Ferry1980, Eq. 3.19]: eta*(omega) = eta / (1 + i*omega*tau) = eta*(1 - i*omega*tau) / (1 + (omega*tau)^2) **Steady shear:** sigma = eta * gamma_dot (Newtonian, no shear thinning) **Loss tangent:** tan(delta) = G''/G' = 1/(omega*tau) **RheoJAX file:** `rheojax/models/classical/maxwell.py` **Status:** All equations match implementation. VERIFIED. --- ## 2. Kelvin-Voigt Model (Spring + Dashpot in Parallel) **Parameters:** G_0 (elastic modulus, Pa), eta (viscosity, Pa.s), tau_ret = eta/G_0 (retardation time, s) **Constitutive equation** [BAH1987, Eq. 5.2-6; Macosko1994, Eq. 5.19]: sigma(t) = G_0 * gamma(t) + eta * d(gamma)/dt **Creep compliance** [Ferry1980, Ch. 3; Tschoegl1989, Ch. 2]: J(t) = (1/G_0) * (1 - exp(-t/tau_ret)) Note: J(0) = 0 (instantaneous elasticity suppressed), J(inf) = 1/G_0 **Relaxation modulus:** The Kelvin-Voigt element does not have a well-defined stress relaxation function in the usual sense; it exhibits an instantaneous stress response: G(t) = G_0 + eta * delta(t) where delta(t) is the Dirac delta function. [Tschoegl1989, Ch. 3] **Storage and loss moduli** [Ferry1980; Macosko1994, Eq. 5.21]: G'(omega) = G_0 G''(omega) = eta * omega **Complex modulus:** G*(omega) = G_0 + i*eta*omega **Steady shear:** Not meaningful -- Kelvin-Voigt is a solid model with no flow. **RheoJAX file:** Not implemented as standalone (appears in fractional variant: `rheojax/models/fractional/fractional_kelvin_voigt.py`) --- ## 3. Jeffreys Model (Maxwell Element + Solvent Viscosity) Also known as the **Oldroyd-B** model in the limit of small deformations. **Parameters:** eta_0 (total zero-shear viscosity), lambda_1 (relaxation time), lambda_2 (retardation time), with lambda_2 < lambda_1 Alternative parameterization: G_1 (elastic modulus), eta_s (solvent viscosity), eta_p (polymer viscosity), where: - eta_0 = eta_s + eta_p - lambda_1 = eta_p / G_1 - lambda_2 = eta_s * lambda_1 / eta_0 **Constitutive equation** [BAH1987, Eq. 5.2-26; Macosko1994, Eq. 5.37]: sigma + lambda_1 * d(sigma)/dt = eta_0 * (d(gamma)/dt + lambda_2 * d^2(gamma)/dt^2) **Relaxation modulus** [BAH1987, Eq. 5.2-28]: G(t) = eta_0 * delta(t) * (1 - lambda_2/lambda_1) + (eta_0/lambda_1) * (lambda_2/lambda_1) * 1 [incorrect form] More precisely, for the Jeffreys model decomposed as Maxwell + solvent: G(t) = G_1 * exp(-t/lambda_1) + eta_s * delta(t) The delta function arises from the pure viscous (solvent) response. **Storage and loss moduli** [BAH1987, Eq. 5.3-14; Ferry1980]: G'(omega) = eta_0 * omega^2 * lambda_1 * (1 - lambda_2/lambda_1) / (1 + omega^2 * lambda_1^2) = G_1 * (omega*lambda_1)^2 / (1 + (omega*lambda_1)^2) G''(omega) = eta_0 * omega * (1 + omega^2 * lambda_1 * lambda_2) / (1 + omega^2 * lambda_1^2) = eta_s * omega + G_1 * omega*lambda_1 / (1 + (omega*lambda_1)^2) Equivalently using the Maxwell + solvent decomposition: G'(omega) = G_1 * (omega*lambda_1)^2 / (1 + (omega*lambda_1)^2) G''(omega) = G_1 * (omega*lambda_1) / (1 + (omega*lambda_1)^2) + eta_s * omega **Complex viscosity:** eta*(omega) = eta_0 * (1 + i*omega*lambda_2) / (1 + i*omega*lambda_1) **RheoJAX file:** Not implemented as standalone classical model. Fractional variant: `rheojax/models/fractional/fractional_jeffreys.py` --- ## 4. Zener / Standard Linear Solid (SLS) Model Two equivalent representations: - **(a) Maxwell + parallel spring:** Maxwell element (G_m, eta) in parallel with spring G_e - **(b) Voigt + series spring:** Kelvin-Voigt element in series with a spring **Parameters:** G_e (equilibrium modulus), G_m (Maxwell arm modulus), eta (dashpot viscosity) - Relaxation time: tau = eta / G_m - Retardation time: tau_c = eta * (G_e + G_m) / (G_e * G_m) [always tau_c > tau] - Instantaneous modulus: G_0 = G_e + G_m **Constitutive equation** [Tschoegl1989, Ch. 4; Findley1989]: sigma + tau * d(sigma)/dt = (G_e + G_m) * gamma + G_e * tau * d(gamma)/dt Or equivalently: sigma + tau * d(sigma)/dt = G_0 * gamma + G_e * tau * d(gamma)/dt **Relaxation modulus** [Ferry1980; Tschoegl1989; Macosko1994, Eq. 5.34]: G(t) = G_e + G_m * exp(-t/tau) Limits: G(0) = G_e + G_m = G_0, G(inf) = G_e **Creep compliance** [Tschoegl1989; Findley1989]: J(t) = 1/G_0 + (G_m / (G_e * G_0)) * (1 - exp(-t/tau_c)) where G_0 = G_e + G_m and tau_c = eta * G_0 / (G_e * G_m) Equivalently: J(t) = 1/(G_e + G_m) + (G_m/(G_e*(G_e + G_m))) * (1 - exp(-t/tau_c)) Limits: J(0) = 1/G_0, J(inf) = 1/G_e **Storage and loss moduli** [Ferry1980; Macosko1994]: G'(omega) = G_e + G_m * (omega*tau)^2 / (1 + (omega*tau)^2) G''(omega) = G_m * (omega*tau) / (1 + (omega*tau)^2) This is just the Maxwell G',G'' superposed with G_e (parallel combination). **Loss tangent:** tan(delta) = G_m * omega*tau / ((G_e + G_m*(omega*tau)^2/(1+(omega*tau)^2)) * (1+(omega*tau)^2)) Simplified: tan(delta) = G_m * omega*tau / (G_e * (1 + (omega*tau)^2) + G_m * (omega*tau)^2) **Steady shear:** sigma = eta * gamma_dot (from the dashpot in the Maxwell arm) **RheoJAX file:** `rheojax/models/classical/zener.py` **Status:** All equations match implementation. VERIFIED. --- ## 5. Generalized Maxwell Model (GMM / Prony Series) **Parameters:** N modes, each with (G_i, tau_i), plus optional G_inf (equilibrium modulus) **Relaxation modulus** [Ferry1980, Eq. 3.6; Tschoegl1989; Park & Schapery 1999]: G(t) = G_inf + SUM_{i=1}^{N} G_i * exp(-t/tau_i) This is the Prony series representation. G_inf >= 0 (zero for fluids, positive for solids). **Storage and loss moduli** (by Boltzmann superposition) [Ferry1980, Eq. 3.16-3.17]: G'(omega) = G_inf + SUM_{i=1}^{N} G_i * (omega*tau_i)^2 / (1 + (omega*tau_i)^2) G''(omega) = SUM_{i=1}^{N} G_i * (omega*tau_i) / (1 + (omega*tau_i)^2) **Creep compliance** (via interconversion) [Tschoegl1989; Park & Schapery 1999]: Exact Prony series form: J(t) = J_g + SUM_{j=1}^{M} J_j * (1 - exp(-t/tau_j^ret)) + t/eta_0 where J_g is glassy compliance, tau_j^ret are retardation times, and eta_0 is the zero-shear viscosity. The {J_j, tau_j^ret} are obtained by interconversion from {G_i, tau_i}, NOT a simple inversion. For a fluid (G_inf = 0): eta_0 = SUM_{i=1}^{N} G_i * tau_i **Discrete relaxation spectrum:** H(tau) = SUM_{i=1}^{N} G_i * delta(tau - tau_i) **Complex viscosity:** eta*(omega) = G*(omega) / (i*omega) eta'(omega) = G''(omega) / omega eta''(omega) = G'(omega) / omega **RheoJAX file:** `rheojax/models/multimode/generalized_maxwell.py` **Status:** Relaxation and oscillation equations match. VERIFIED. --- ## 6. SpringPot / Scott-Blair Fractional Element **Parameters:** c_alpha (quasi-property, Pa.s^alpha), alpha (fractional order, 0 <= alpha <= 1) **Constitutive equation** [Schiessel et al. 1995; Bagley & Torvik 1983]: sigma(t) = c_alpha * D^alpha [gamma(t)] where D^alpha is the Caputo fractional derivative of order alpha. **Relaxation modulus** [Schiessel et al. 1995]: G(t) = c_alpha * t^(-alpha) / Gamma(1 - alpha) Limits: alpha=0 -> G(t) = c_alpha (pure spring), alpha=1 -> G(t) = c_alpha*delta(t) (pure dashpot) **Creep compliance:** J(t) = (1/c_alpha) * t^alpha / Gamma(1 + alpha) Limits: alpha=0 -> J(t) = 1/c_alpha (instant elastic), alpha=1 -> J(t) = t/c_alpha (viscous flow) **Complex modulus:** G*(omega) = c_alpha * (i*omega)^alpha = c_alpha * omega^alpha * [cos(pi*alpha/2) + i*sin(pi*alpha/2)] Therefore: G'(omega) = c_alpha * omega^alpha * cos(pi*alpha/2) G''(omega) = c_alpha * omega^alpha * sin(pi*alpha/2) **Loss tangent:** tan(delta) = tan(pi*alpha/2) -- frequency-independent! **RheoJAX file:** `rheojax/models/classical/springpot.py` **Status:** All equations match implementation. VERIFIED. --- ## Summary of Verification | Model | File | Relaxation | Creep | Oscillation | Flow | |---------------------|-----------------------------------------------|:----------:|:-----:|:-----------:|:-----:| | Maxwell | `models/classical/maxwell.py` | OK | OK | OK | OK | | Kelvin-Voigt | (fractional variant only) | N/A | N/A | N/A | N/A | | Jeffreys | (fractional variant only) | N/A | N/A | N/A | N/A | | Zener (SLS) | `models/classical/zener.py` | OK | OK | OK | OK | | Generalized Maxwell | `models/multimode/generalized_maxwell.py` | OK | (interconv.) | OK | OK | | SpringPot | `models/classical/springpot.py` | OK | OK | OK | N/A | All implemented models match their canonical textbook formulations.