Curl Calculator

Quick Start

If we have a two-layer film, it can curl due to tensile stresses created during lamination, or by differential thermal or hygroscopic expansion.


An update on two apps from Practical Webhandling.

Curl Calculator

Tension1 N/m
Modulus1 GPa
Thickness1 μm
CTE1 μm/m/°C
CHE1 μm/m/%RH
Tension2 N/m
Modulus2 GPa
Thickness2 μm
CTE2 μm/m/°C
CHE2 μm/m/%RH
Strain1 %
Strain2 %
Curl mm
//One universal basic required here to get things going once loaded
window.onload = function () {
    //restoreDefaultValues(); //Un-comment this if you want to start with defaults
//Any global variables go here

//Main is hard wired as THE place to start calculating when input changes
//It does no calculations itself, it merely sets them up, sends off variables, gets results and, if necessary, plots them.
function Main() {

    //Send all the inputs as a structured object
    //If you need to convert to, say, SI units, do it here!
    const NuCorrection = 1 - Math.pow(0.3, 2) //Assume Poisson is 0.3
    const inputs = {
        T1: sliders.SlideT1.value,
        T2: sliders.SlideT2.value,
        E1: sliders.SlideE1.value * 1e9 / NuCorrection, //GPa to Pa
        E2: sliders.SlideE2.value * 1e9 / NuCorrection,
        h1: sliders.Slideh1.value / 1e6, //μm to m
        h2: sliders.Slideh2.value / 1e6,
        CTE1: sliders.SlideCTE1.value / 1e6, //μm to m
        CTE2: sliders.SlideCTE2.value / 1e6,
        CHE1: sliders.SlideCHE1.value / 1e6, //μm to m
        CHE2: sliders.SlideCHE2.value / 1e6,
        dT: sliders.SlideDeltaT.value,
        dH: sliders.SlideDeltaH.value,

    //Get all the resonses as a structure
    const result = CalcIt(inputs)

    //Set all the text box outputs
    document.getElementById('Strain1').value = result.Strain1
    document.getElementById('Strain2').value = result.Strain2
    document.getElementById('Curl').value = result.Curl

//Here's the real app calculation
function CalcIt({ T1, T2, E1, E2, h1, h2, CTE1, CTE2, CHE1, CHE2, dT, dH }) {
    const deltaTH=1.3*(dT * CTE1 + dH * CHE1-dT * CTE2 - dH * CHE2)
    const Strain1 = T1 / E1 / h1 
    const Strain2 = T2 / E2 / h2 
    let Curl = "Flat", TheCurl=-99999
    const D1 = E1 * Math.pow(h1, 3) / 12
    const D2 = E2 * Math.pow(h2, 3) / 12
    const Top = 2 * (D1 + D2)
    const H12 = h1 + h2
    const tmp = (Strain1 - Strain2-deltaTH) / (1 / (E1 * h1) + 1 / (E2 * h2) + H12 * H12 / (2 * Top))

    if (tmp != 0) TheCurl = 1000*Top / (H12 * tmp)
    if (TheCurl > 999 || TheCurl < -999) {Curl = "Flat"} else {Curl=TheCurl.toFixed(0)}
    return {
        Strain1: (100 * Strain1).toPrecision(3),
        Strain2: (100 * Strain2).toPrecision(3),
        Curl: Curl,

The basics of curl

You have two layers in a laminate (the story with more than 2 is much more complicated). They have modulus E1, E2 and thickness h1, h2. During lamination the two webs are under tension T1, T2.

In addition, after the lamination, the laminate may experience a change of temperature ΔT and/or a change of relative humidity, ΔH. Each layer has a (familiar) coefficient of thermal expansion, CTE1, CTE2 in μm/m/°C and a less familiar coefficient of hygroscopic expansion, CHE1, CHE2 in μm/m/%RH. You may see them expressed as 1.5.10-5 but I prefer numbers such as 15.

The tensions exert a strain, ε, given by


The individual tension strains are shown as these play an important role in diagnosing curl issues.

The expansions create an extension, equivalent to a strain of `CTE.ΔT` and `CHE.ΔH`. From all these we can calculated a differential strain Δε between the layers. We can then calculate a curl of radius R (where larger R is better!) given by the following logic:




and finally we get R:


What does this mean?

Set ΔT and ΔH to zero then play with the T, E and h values. You quickly learn, for example, that laminating different webs with the same tension can be a disaster for curl. For a strain-free laminate the tension on the thinner, lower-modulus web should be lower. That's why it's useful to see the strain values. In general lower strains are a good thing, followed by adjusting the tensions to get the strains close to being equal.

Now balance out the tensions to give zero curl and play with the thermal and hygroscopic effects. If you set layer 1 to 4GPa for PET then the CTE and CHE are each ~15. If layer 2 is 0.5GPa for PE then the CTE are 100 (yes, it's huge) and 0. When you then adjust ΔT and ΔH you can find some big surprises. For those using paper, the CTE is around 5, relatively low, while the CHE is 50 or more.

The curl calculations are worst case. If the polymers (or the adhesive between them) creep or relax, then the curl will disappear.