Fractional Poynting-Thomson (Fractional)¶
Quick Reference¶
Use when: Stress-relaxation with instantaneous modulus and fractional retardation
Parameters: 4 (\(G_e, G_k, \alpha, \tau\))
Key equation: \(G(t) = G_{\mathrm{eq}} + (G_e - G_{\mathrm{eq}}) E_{\alpha}(-(t/\tau)^{\alpha})\) where \(G_{\mathrm{eq}} = \frac{G_e G_k}{G_e + G_k}\)
Test modes: Relaxation, creep, oscillation
Material examples: Viscoelastic solids emphasizing stress-relaxation interpretations
Fractional Calculus Fundamentals
This model uses fractional calculus for power-law viscoelastic behavior. For mathematical foundations—SpringPot element, Mittag-Leffler functions, physical meaning of fractional order \(\alpha\), and derivation from molecular theory—see:
/user_guide/fractional_viscoelasticity_reference
Notation Guide¶
Symbol |
Units |
Description |
|---|---|---|
\(G_e\) |
Pa |
Instantaneous modulus (immediate elastic response) |
\(G_k\) |
Pa |
Retarded modulus (Kelvin element spring) |
\(\alpha\) |
dimensionless |
Fractional order (0 < \(\alpha\) < 1, power-law character) |
\(\tau\) |
s |
Retardation time (characteristic timescale) |
\(G_{\text{eq}}\) |
Pa |
Equilibrium modulus, \(G_{\text{eq}} = G_e G_k / (G_e + G_k)\) |
\(E_{\alpha}(z)\) |
dimensionless |
One-parameter Mittag-Leffler function |
Overview¶
Equivalent in form to FKVZ but emphasizing the instantaneous modulus \(G_e\) in series with a fractional Kelvin-Voigt element. Convenient for stress-relaxation interpretations.
Physical Foundations¶
The Fractional Poynting-Thomson model (also known as Fractional Standard Linear Solid in relaxation form) consists of:
Mechanical Configuration:
[Spring Ge] ---- series ---- [Spring Gk parallel with SpringPot (α, τ)]
Microstructural Interpretation:
Instantaneous spring ( \(G_e\) ): Immediate elastic response from bond stretching and glassy contributions. Sets \(G(t=0) = G_e\).
Kelvin element: Provides delayed relaxation from network rearrangements. The spring \(G_k\) and SpringPot work together to create power-law stress relaxation.
Equilibrium behavior: Material relaxes to \(G_{\text{eq}} = G_e G_k / (G_e + G_k)\)
Solid-like: Finite equilibrium modulus (no flow)
The series configuration makes this model natural for stress relaxation experiments where the instantaneous modulus and relaxation magnitude are directly observable.
Governing Equations¶
Time domain (creep compliance; same functional form as FKVZ):
Time domain (relaxation modulus; interpolative form):
Frequency domain (via complex compliance):
Parameters¶
Name |
Symbol |
Units |
Bounds |
Notes |
|---|---|---|---|---|
|
\(G_e\) |
Pa |
[1e-3, 1e9] |
Instantaneous modulus |
|
\(G_k\) |
Pa |
[1e-3, 1e9] |
Retarded modulus |
|
\(\alpha\) |
dimensionless |
[0, 1] |
Fractional order |
|
\(\tau\) |
s |
[1e-6, 1e6] |
Retardation time |
Validity and Assumptions¶
Linear viscoelastic assumption; strain amplitudes remain small.
Isothermal, time-invariant material parameters throughout the experiment.
Supported RheoJAX test modes: relaxation, creep, oscillation.
Fractional orders stay within (0, 1) to keep kernels causal and bounded.
Regimes and Behavior¶
Instantaneous response \(G(0)=G_e\); relaxes toward \(G_{\mathrm{eq}}\).
Fractional retardation governs the relaxation tail (broad spectra).
Limiting Behavior¶
\(\alpha \to 1\): classical Poynting-Thomson (Zener) behavior.
\(G_k \to \infty\): \(G(t)\to G_e\) (no retardation).
What You Can Learn¶
This section explains insights from the Fractional Poynting-Thomson model, emphasizing stress-relaxation interpretations and the dual-modulus solid structure.
Parameter Interpretation¶
- Instantaneous Modulus ( \(G_e\) ):
The modulus at \(t = 0^+\), representing the material’s immediate elastic response upon loading.
For graduate students: \(G_e\) includes both entropic (network) and enthalpic (glassy) contributions to elasticity. It represents the sum of all elastic contributions before any relaxation occurs. For practitioners: \(G_e\) is the initial stiffness for impact loading design. Use this value for short-time mechanical response calculations.
- Retarded Modulus ( \(G_k\) ):
Controls the amount of stress relaxation from \(G_e\) to \(G_{\text{eq}}\). The equilibrium modulus is given by \(G_{\text{eq}} = G_e \cdot G_k / (G_e + G_k)\).
For graduate students: \(G_k\) represents the spring stiffness in the Kelvin element. The harmonic mean relationship for \(G_{\text{eq}}\) arises from the series-parallel spring configuration. For practitioners: Relaxation magnitude \(\Delta G = G_e - G_{\text{eq}}\) is directly determined by the \(G_e/G_k\) ratio. Higher \(G_k\) means less relaxation.
- Fractional Order ( \(\alpha\) ):
Governs the power-law character of stress relaxation between instantaneous and equilibrium values. Values closer to 0 indicate more solid-like continuous relaxation, while values closer to 1 indicate more liquid-like narrow relaxation.
\(\alpha \to 0\): Very slow, broad-spectrum relaxation approaching plateau behavior
\(\alpha \approx 0.5\): Typical fractional solid, balanced spectrum breadth
\(\alpha \to 1\): Exponential relaxation (classical Poynting-Thomson/Zener)
For graduate students: \(\alpha\) quantifies polydispersity in the retardation time spectrum. Lower \(\alpha\) indicates greater microstructural heterogeneity. For practitioners: Lower \(\alpha\) means relaxation spreads over more time decades—important for long-term load-bearing applications.
- Retardation Time ( \(\tau\) ):
Characteristic timescale for the transition from \(G_e\) to \(G_{eq}\).
For graduate students: \(\tau\) is temperature-dependent (WLF/Arrhenius), enabling time-temperature superposition for master curve construction. For practitioners: Compare \(\tau\) to service timescales. If service time \(\ll \tau\), use \(G_e\); if \(\gg \tau\), use \(G_{eq}\).
Material Classification¶
\(G_e/G_{eq}\) Ratio |
Relaxation Character |
Typical Materials |
Design Implications |
|---|---|---|---|
< 2 |
Minor relaxation |
Dense crosslinked networks |
Stable under sustained load |
2-10 |
Moderate relaxation |
Filled elastomers, thermoplastics |
Account for stress decay |
> 10 |
Large relaxation |
Soft tissues, weak gels |
Time-dependent design critical |
\(\alpha\) Range |
Spectrum Character |
Typical Materials |
Fitting Considerations |
|---|---|---|---|
0.1-0.3 |
Very broad, hierarchical |
Biological tissues, nanocomposites |
Need 4+ decades in time |
0.4-0.6 |
Moderate breadth |
Polymer gels, rubbers |
Standard 3-4 decades sufficient |
0.7-0.9 |
Narrow, near-exponential |
Homogeneous networks |
Consider classical Zener |
Diagnostic Indicators¶
G(t) continues decreasing at longest time: Equilibrium not reached; extend measurement time or consider liquid model (FMG/FML)
\(G_e/G_k\) near 1: Minimal relaxation; simpler elastic model may suffice
\(\alpha\) hits bounds (0.05 or 0.95): Data may not support fractional behavior; try classical Zener
Non-monotonic residuals: Check for multiple relaxation mechanisms or nonlinear effects
Fitting Guidance¶
Recommended Data Collection:
Stress relaxation (primary): 4-5 decades in time to capture full relaxation
Step strain: Within LVR (typically 1-5%)
Sampling: Log-spaced, 50+ points per decade
Temperature: Constant ±0.1°C
Initialization Strategy:
# From stress relaxation G(t)
Ge_init = G(t → 0) # Instantaneous modulus
Geq_init = G(t → ∞) # Equilibrium modulus
# From Geq = Ge*Gk/(Ge+Gk), solve for Gk:
Gk_init = Ge_init * Geq_init / (Ge_init - Geq_init)
tau_init = time where relaxation is 50% complete
alpha_init = 0.5 # Default
Optimization Tips:
Fit in modulus space (natural for relaxation)
Use log-weighted least squares
Verify monotonic decay from \(G_e\) to \(G_{eq}\)
Check that \(G_{eq} > 0\) (solid-like behavior)
Common Pitfalls:
G(t) approaches zero: Material is liquid-like; use FML or FMG instead
Non-monotonic G(t): Instrument artifacts or nonlinear effects
Poor long-time fit: Equilibrium not reached; extend measurement time
Troubleshooting Table:
Issue |
Likely Cause |
Solution |
|---|---|---|
\(G(t) \to 0\) at long times |
Liquid-like behavior |
Use FML or FMG model instead |
\(G_e/G_k \approx 1\) |
Minimal relaxation |
Consider simple elastic model |
\(\alpha\) near upper bound (0.95+) |
Nearly exponential |
Use classical Poynting-Thomson |
Non-monotonic residuals |
Multiple relaxation modes |
Consider GMM or add second mode |
Poor fit at \(t \to 0\) |
Instrument response time |
Exclude first few points |
\(G_{eq} < 0\) (non-physical) |
Fitting error or wrong model |
Check data quality, verify solid-like |
High \(G_e\)–\(G_k\) correlation |
Insufficient time coverage |
Need broader range (4+ decades) |
Practical Applications¶
Stress Relaxation Prediction:
The FPT model enables prediction of stress decay in bolted joints, gaskets, and seals:
# Bolt preload relaxation over time
epsilon_initial = 0.05 # 5% initial strain
G_initial = Ge # Instantaneous modulus
sigma_initial = G_initial * epsilon_initial
# Predict stress at various service times
service_times = [1, 7, 30, 365] # days
for t_days in service_times:
t_seconds = t_days * 86400
G_t = model.predict(t_seconds, test_mode='relaxation')
sigma_t = G_t * epsilon_initial
relaxation_pct = (1 - sigma_t/sigma_initial) * 100
print(f"Day {t_days}: σ = {sigma_t/1e6:.2f} MPa "
f"({relaxation_pct:.1f}% relaxation)")
Material Selection for Gasketing:
Compare candidates by relaxation characteristics:
Material |
\(G_e\) (MPa) |
\(G_{eq}\) (MPa) |
\(\tau\) (s) |
\(\alpha\) |
Relaxation |
|---|---|---|---|---|---|
PTFE |
500 |
400 |
1000 |
0.65 |
20% at \(10^4\) s |
Fiber composite |
2000 |
1800 |
5000 |
0.55 |
10% at \(10^4\) s |
Metal gasket |
100000 |
98000 |
100 |
0.85 |
2% at \(10^4\) s |
Rubber O-ring |
10 |
5 |
100 |
0.45 |
50% at \(10^4\) s |
Quality Control Applications:
Monitor relaxation parameters for product consistency:
Instantaneous modulus ( \(G_e\) ): Sensitive to cure state and crosslink density
Equilibrium modulus ( \(G_{eq}\) ): Tracks permanent network structure
Relaxation magnitude ( \(G_e - G_{eq}\) ): Indicates temporary vs. permanent structure balance
Fractional order ( \(\alpha\) ): QC metric for microstructural uniformity
Design Guidelines:
For applications requiring sustained stress:
Critical applications (pressure vessels, structural): Target \(G_e/G_{eq} < 1.5\) for minimal relaxation
Sealing applications: \(G_e/G_{eq} = 2\)–5 acceptable if recompression possible
Damping applications: Maximize tan(\(\delta\)) at operating frequency (\(\omega \approx 1/\tau\))
Service life: Ensure measurement time > 10× service time for reliable extrapolation
Example Calculations¶
Stress Relaxation Prediction:
Given fitted parameters \(G_e = 2.0\) MPa, \(G_k = 5.0\) MPa, \(\alpha = 0.55\), \(\tau = 500\) s:
import numpy as np
from rheojax.models import FractionalPoyntingThomson
from rheojax.core.jax_config import safe_import_jax
jax, jnp = safe_import_jax()
model = FractionalPoyntingThomson()
model.parameters.set_value('Ge', 2.0e6) # Pa
model.parameters.set_value('Gk', 5.0e6) # Pa
model.parameters.set_value('alpha', 0.55)
model.parameters.set_value('tau', 500.0) # s
# Calculate equilibrium modulus
Ge = 2.0e6
Gk = 5.0e6
Geq = Ge * Gk / (Ge + Gk) # Harmonic mean
print(f"Equilibrium modulus Geq = {Geq/1e6:.2f} MPa")
# Predict relaxation modulus
t = jnp.logspace(-1, 5, 150) # 0.1 s to ~1 day
G_t = model.predict(t, test_mode='relaxation')
# Verify limiting behavior
print(f"G(t=0.1 s) = {G_t[0]/1e6:.2f} MPa (near Ge)")
print(f"G(t=100,000 s) = {G_t[-1]/1e6:.2f} MPa (near Geq)")
# Calculate half-relaxation time
G_half = (Ge + Geq) / 2
t_half = t[jnp.argmin(jnp.abs(G_t - G_half))]
print(f"Half-relaxation time: {t_half:.1f} s")
Conversion to Creep Compliance:
# Use duality: J(t) = 1/G(t) approximately for this model form
# More accurately, use compliance prediction:
J_t = model.predict(t, test_mode='creep')
# Verify reciprocity at limits
J0 = 1 / Ge
Jinf = 1 / Geq
print(f"J(t→0) = {J_t[0]:.2e} Pa⁻¹ (theory: {J0:.2e})")
print(f"J(t→∞) = {J_t[-1]:.2e} Pa⁻¹ (theory: {Jinf:.2e})")
Frequency Domain Prediction:
# Predict storage and loss moduli
omega = jnp.logspace(-3, 2, 100)
G_star = model.predict(omega, test_mode='oscillation')
G_prime = jnp.real(G_star)
G_double_prime = jnp.imag(G_star)
# Find tan(δ) peak for optimal damping frequency
tan_delta = G_double_prime / G_prime
omega_peak = omega[jnp.argmax(tan_delta)]
tan_delta_max = tan_delta.max()
print(f"Maximum damping at ω = {omega_peak:.3f} rad/s")
print(f"tan(δ)_max = {tan_delta_max:.3f}")
print(f"Compare to 1/τ = {1/500:.4f} rad/s")
# Calculate loss factor over frequency range
loss_factor = G_double_prime / G_prime
# For damping design, target loss_factor > 0.1
See Also¶
Fractional Kelvin-Voigt-Zener (Fractional) — identical topology in creep form, sharing the same compliance expression
Fractional Zener Solid-Solid (Fractional) — adds an additional spring for solids with higher plateaus
Fractional Burgers Model (Fractional) — combines Kelvin and Maxwell branches for more complex retardation spectra
FFTAnalysis — necessary to obtain \(G'(\omega)\) before fitting relaxation data
../../examples/advanced/04-fractional-models-deep-dive — demonstrates how Poynting–Thomson fits compare to other fractional elements
API References¶
Module:
rheojax.modelsClass:
rheojax.models.FractionalPoyntingThomson
Usage¶
Basic Stress Relaxation Fitting¶
from rheojax.models import FractionalPoyntingThomson
from rheojax.core.data import RheoData
import numpy as np
# Load experimental stress relaxation data
time = np.logspace(-1, 4, 100) # 0.1 to 10,000 s
stress = ... # Measured stress after step strain
# Normalize to modulus: G(t) = stress / strain
strain = 0.05 # 5% step strain
G_t = stress / strain
# Create RheoData object
data = RheoData(x=time, y=G_t, test_mode='relaxation')
# Initialize and fit model
model = FractionalPoyntingThomson()
result = model.fit(data)
# Access fitted parameters
Ge = model.parameters.get_value('Ge')
Gk = model.parameters.get_value('Gk')
alpha = model.parameters.get_value('alpha')
tau = model.parameters.get_value('tau')
# Calculate derived quantities
Geq = Ge * Gk / (Ge + Gk) # Equilibrium modulus
Delta_G = Ge - Geq # Relaxation magnitude
print(f"Instantaneous modulus Ge = {Ge/1e6:.2f} MPa")
print(f"Equilibrium modulus Geq = {Geq/1e6:.2f} MPa")
print(f"Relaxation magnitude ΔG = {Delta_G/1e6:.2f} MPa")
print(f"Relaxation ratio Ge/Geq = {Ge/Geq:.2f}")
print(f"Fractional order α = {alpha:.3f}")
print(f"Retardation time τ = {tau:.1f} s")
print(f"R² = {result.r_squared:.4f}")
Bayesian Inference for Relaxation¶
# Bayesian inference with uncertainty quantification
# NLSQ fit first for warm-start
model.fit(data)
# Run Bayesian inference
result = model.fit_bayesian(
data,
num_warmup=1000,
num_samples=2000,
num_chains=4,
seed=42
)
# Extract posterior samples and compute derived quantities
Ge_samples = result.posterior_samples['Ge']
Gk_samples = result.posterior_samples['Gk']
Geq_samples = Ge_samples * Gk_samples / (Ge_samples + Gk_samples)
# Get credible intervals
import numpy as np
Geq_mean = Geq_samples.mean()
Geq_lower = np.percentile(Geq_samples, 2.5)
Geq_upper = np.percentile(Geq_samples, 97.5)
print(f"Geq = {Geq_mean/1e6:.2f} MPa "
f"[{Geq_lower/1e6:.2f}, {Geq_upper/1e6:.2f}] (95% CI)")
# Visualize posterior correlations
import arviz as az
inference_data = az.from_numpyro(result)
az.plot_pair(
inference_data,
var_names=['Ge', 'Gk', 'alpha', 'tau'],
kind='kde',
divergences=True
)
# Check convergence
print(az.summary(inference_data, hdi_prob=0.95))
Frequency Domain Analysis¶
# Convert relaxation parameters to frequency response
omega = np.logspace(-3, 2, 100)
G_star = model.predict(omega, test_mode='oscillation')
G_prime = np.real(G_star)
G_double_prime = np.imag(G_star)
# Calculate loss tangent
tan_delta = G_double_prime / G_prime
# Find damping peak
omega_peak = omega[np.argmax(tan_delta)]
print(f"Peak damping at ω = {omega_peak:.3f} rad/s")
print(f"Compare to 1/τ = {1/tau:.3f} rad/s")
# Plot Cole-Cole diagram (G'' vs G')
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
plt.plot(G_prime/1e6, G_double_prime/1e6, 'o-')
plt.xlabel("G' (MPa)")
plt.ylabel("G'' (MPa)")
plt.title('Cole-Cole Plot')
plt.axis('equal')
plt.grid(True)
Pipeline Integration¶
from rheojax.pipeline import Pipeline
# Complete workflow with visualization
pipeline = (Pipeline()
.load('stress_relaxation.csv', x_col='time', y_col='modulus')
.fit('fractional_poynting_thomson')
.plot(style='publication')
.save('fpt_results.hdf5'))
# Access fitted model
model = pipeline.model
Ge = model.parameters.get_value('Ge')
Gk = model.parameters.get_value('Gk')
Geq = Ge * Gk / (Ge + Gk)
# Predict long-term behavior
t_extrapolate = np.logspace(5, 8, 50) # Up to 3 years
G_extrapolate = model.predict(t_extrapolate, test_mode='relaxation')
import matplotlib.pyplot as plt
plt.semilogx(t_extrapolate/86400, G_extrapolate/1e6) # Convert to days
plt.xlabel('Time (days)')
plt.ylabel('G(t) (MPa)')
plt.title('Long-term Stress Relaxation Prediction')
Multi-Temperature Master Curve¶
# Fit relaxation at multiple temperatures
from rheojax.transforms import Mastercurve
datasets = [
{'time': t_30C, 'G': G_30C, 'T': 30},
{'time': t_50C, 'G': G_50C, 'T': 50},
{'time': t_70C, 'G': G_70C, 'T': 70},
]
# Create master curve using TTS
mc = Mastercurve(reference_temp=50, auto_shift=True)
master_curve, shift_factors = mc.transform(datasets)
# Fit FPT to master curve
model.fit(master_curve.x, master_curve.y, test_mode='relaxation')
# Use shift factors for temperature predictions
T_service = 40 # °C
aT = shift_factors[T_service]
t_service = np.logspace(-1, 5, 100)
t_shifted = t_service / aT # Shift to reference temperature
G_40C = model.predict(t_shifted, test_mode='relaxation')
print(f"At {T_service}°C, shift factor aT = {aT:.2e}")
print(f"Predicted G(1000s) at {T_service}°C = {G_40C[50]/1e6:.2f} MPa")
See also¶
Fractional Kelvin-Voigt-Zener (Fractional) — identical topology in creep form, sharing the same compliance expression.
Fractional Zener Solid-Solid (Fractional) — adds an additional spring for solids with higher plateaus.
Fractional Burgers Model (Fractional) — combines Kelvin and Maxwell branches for more complex retardation spectra.
FFTAnalysis — necessary to obtain \(G'(\omega)\) before fitting relaxation data.
../../examples/advanced/04-fractional-models-deep-dive — demonstrates how Poynting–Thomson fits compare to other fractional elements.