Fibre Foam Mechanical

Quick Start

Fibre compressive strength depends on the standard Euler buckling theory. For compressions greater than a few % an extra s(ε) term has to be included.

Credits

We use a paper by Jukka A. Ketoja et al at VTT U1

Fibre Foam Mechanical

Modulus E GPa
Diameter D μm
ρfoam kg/m³
ρsolid kg/m³
Factor μ
Fit factor
Max ε %
Efoam @ 10% kPa
//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
    Main();
};

//Main() is hard wired as THE place to start calculating when inputs change
//It does no calculations itself, it merely sets them up, sends off variables, gets results and, if necessary, plots them.
function Main() {
    //Save settings every time you calculate, so they're always ready on a reload
    saveSettings();

    //Send all the inputs as a structured object
    //If you need to convert to, say, SI units, do it here!
    const inputs = {
        E:sliders.SlideE.value*1e9, //GPa to Pa
        D: sliders.SlideD.value*1e-6, //um to m
        mu: sliders.Slidemu.value, 
        rhofoam: sliders.Sliderhofoam.value,
        rhosolid: sliders.Sliderhosolid.value,
        Max: sliders.SlideMax.value,
        Fit: sliders.SlideFit.value,
   };

    //Send inputs off to CalcIt where the names are instantly available
    //Get all the resonses as an object, result


    const result = CalcIt(inputs);

    //Set all the text box outputs
    document.getElementById('Efoam').value = result.Efoam; 
    //Do all relevant plots by calling plotIt - if there's no plot, nothing happens
    //plotIt is part of the app infrastructure in app.new.js
    if (result.plots) {
        for (let i = 0; i < result.plots.length; i++) {
            plotIt(result.plots[i], result.canvas[i]);
        }
    }

    //You might have some other stuff to do here, but for most apps that's it for Main!
}

//Here's the app calculation
//The inputs are just the names provided - their order in the curly brackets is unimportant!
//By convention the input values are provided with the correct units within Main
function CalcIt({ E,D,mu,rhofoam,rhosolid, Max, Fit }) {
let pSigma=[],i,j, Stress, Strain, se=10,seexp=0, Efoam=0
//The expression below could be simplified, but it makes the link to the paper explicit
const In=Math.PI/4*(D/2)**4 //Area moment of inertia
const D2=D**2,rhos2=rhosolid**2,rhof2=rhofoam**2
const J2=0.71**2 //An average of 0.78 and 0.64 for isotropic and layered J factors
//pSigma.push({x:0,y:0})
for (i=0.1;i<=Max;i+=0.1){
    Strain=i*0.01
    //A very simple solver for the explicit equation (8)
    while (seexp <= Strain && se > 0) {
        se -= 0.001
        seexp=(se+1)*Math.exp(-se)
    }
    //Equation (9)
    Stress = mu*64*E*In*J2*rhof2/(D2*rhos2*se*se)
    pSigma.push({x:i,y:Stress*Fit}) //The paper doesn't give a fit factor
    if (Efoam == 0 && Strain >= 0.1) Efoam = Fit*Stress/Strain
}

//console.log(pSigma)
//Now set up all the graphing data.
//We use the amazing Open Source Chart.js, https://www.chartjs.org/
//A lot of the sophistication is addressed directly here
//But if you need something more, read the Chart.js documentation or search Stack Overflow
const plotData=[pSigma]
const lineLabels=["Sigma"]
const myColors=["blue"]

//Now set up all the graphing data detail by detail.
const prmap = {
    plotData: plotData, //An array of 1 or more datasets
    lineLabels: lineLabels, //An array of labels for each dataset
    colors: myColors, //An array of colors for each dataset
    hideLegend: true,
    borderWidth: [2],
    xLabel: 'Compressive ε&%', //Label for the x axis, with an & to separate the units
    yLabel: 'Stress σ&kPa', //Label for the y axis, with an & to separate the units
    y2Label: null, //Label for the y2 axis, null if not needed
    yAxisL1R2: [], //Array to say which axis each dataset goes on. Blank=Left=1
    logX: false, //Is the x-axis in log form?
    xTicks: undefined,
    logY: false, //Is the y-axis in log form?
    yTicks: undefined, //We can define a tick function if we're being fancy
    legendPosition: 'top', //Where we want the legend - top, bottom, left, right
    xMinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
    yMinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
    y2MinMax: [,], //Set min and max, e.g. [-10,100], leave one or both blank for auto
    xSigFigs: 'F1', //These are the sig figs for the Tooltip readout. A wide choice!
    ySigFigs: 'F1', //F for Fixed, P for Precision, E for exponential
};

//Now we return everything - text boxes, plot and the name of the canvas, which is 'canvas' for a single plot
return {
    plots: [prmap],
    canvas: ['canvas'],
    Efoam: (Efoam).toFixed(0) + " kPa",
};
}
            

The basics

We have a foam made up of some fibres with modulus E and diameter D. The fibres have a solid density ρsolid and the foam has a density ρfoam. We include a factor μ which captures how easy (1) or hard (4) it is to move the tops of the fibre columns as they undergo Euler buckling. Buckling involves a factor J which is set at a typical value of 0.71 and the area moment of inertia, I, which is given by `I=π/4(D/2)^4`. For a strain ε we create a stress, σ(ε) given by

`σ(ε)=μ(64EIJ^2ρ_"foam"^2)/(D^2ρ_"solid"^2[s(ε)]^2)`

The term s(ε) is calculated from the implicit equation (solved numerically):

`(s(ε)+1)exp(-s(ε))=ε`

From the stress/strain curve up to 10% strain we can calculate a modulus, Efoam which, although approximate gives you a good idea of relative values. As the paper says: However, one should notice that the number of fibers contributing to the stress is not included in [the equation] and should be considered separately. This means a Fit Factor of a value around 1000 has had to be included. Maybe a future version will not require this factor.

1Jukka A. Ketoja, Sara Paunonen, Petri Jetsu and Elina Pääkkönen, Compression Strength Mechanisms of Low-Density Fibrous Materials, Materials 2019, 12, 384; doi:10.3390/ma12030384