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 |
|
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) |
|
OK |
OK |
OK |
OK |
Generalized Maxwell |
|
OK |
(interconv.) |
OK |
OK |
SpringPot |
|
OK |
OK |
OK |
N/A |
All implemented models match their canonical textbook formulations.