In our research on hydrogel design, we have found or made several tools that help us to characterize hydrogels or improve how we design hydrogels. Here, we share those tools to help other hydrogel designers and researchers.
3D-Printed Density Kit
We use density kits to measure the volumes of the hydrogels in each of their swelling states and calculate polymer volume fractions [Richbourg et al., 2021]. A leading research equipment company quoted us for nearly $1000 for a density kit, so we designed and 3D-printed our own. The .stl files are available online at Thingiverse for download [Link to Thingiverse Density Kit Page]. Because the hydrogel needs to be submerged in heptane or a similar organic solvent that is non-miscible with water, we used a coil of metal wire for the submersion hanger and glued it to the bottom of the “in air” stand. We also used a 150-mL glass beaker to hold the organic solvent. Everything else was 3D printed using PLA. The total cost per density kit was around $2 since the University of Texas has the Texas Inventionworks that lets us 3D print for free.
Use the density kits to characterize hydrogel volume, swelling, and density. Swelling data can then be compared to predictions made via equilibrium swelling theory or used to predict stiffness and diffusivity via rubberlike elasticity theory or mesh transport theory.
On-Site HTML Calculators
For those interested in how we implemented the calculators on the rubberlike elasticity, equilibrium swelling, and mesh transport pages, we have the HTML codes below.
Inspiration for these calculators comes from the Appel Lab’s website.
Comprehensive Model
<form id="inputform">
<!-- Creates a table for necessary inputs-->
<p></p><left> <b>Universal Structural Parameters</b></left><p></p>
<table border="0" cellspacing="10" cellpadding="10" id="StrucParamTable">
<tbody>
<tr id="row1">
<td>
<label for="iPVF">Initial Polymer Volume Fraction (φ<sub>0</sub>)</label>
</td>
<td>
<input type="number" id="iPVF" value="0.1" style="width: 50%">
</td>
<td>
<label for="Nj">Degree of Polymerization between Junctions (N<sub>j</sub>)</label>
</td>
<td>
<input type="number" id="Nj" value="50" style="width: 50%">
</td>
</tr>
<tr id="row2">
<td>
<label for="fun">Junction Functionality (f) </label>
</td>
<td>
<select id="fun" style="width: 50%">
<option value="4">4</option>
<option value="6">6</option>
<option value="8">8</option>
</select>
</td>
<td>
<label for="gamma">Frequency of Chain-End Defects (γ)</label>
</td>
<td>
<input type="number" id="gamma" value="0.0" style="width:50%">
</td>
</tr>
</tbody>
</table>
<p></p><left> <b>General Identity Parameters</b></left><p></p>
<table border="0" cellspacing="10" cellpadding="10" id="OtherParamTable">
<tbody><tr id="row3">
<td>
<label for="temp">Temperature (T, °C) </label>
</td>
<td>
<input type="number" id="temp" value="25" style="width: 80%">
</td>
<td>
<label for="rs">Solute Hydrodynamc Radius (r<sub>s</sub>, nm)</label>
</td>
<td>
<input type="number" id="rs" value="1.5" style="width:80%">
</td>
</tr>
</tbody>
</table>
<p></p><left> <b>Polymer Identity Parameters</b></left><p></p>
<table border="0" cellspacing="10" cellpadding="10" id="PolymerParamTable">
<tbody><tr id="row4">
<td>
<label for="polym">Polymer</label>
</td>
<td>
<select onchange="update_polymer()" id="polymer">
<option value="peg">PEG</option>
<option value="pva">PVA</option>
<option value="custom">Custom</option>
</select>
</td>
<td>
<label for="dens">Dry Density of Polymer Network (ρ<sub>d</sub>, g/mL)</label>
</td>
<td>
<input type="number" id="dens" value="1.12" style="width:80%">
</td>
<td>
<label for="Mr">Molecular Weight of Polymer Repeating Unit (M<sub>r</sub>, g/mol)</label>
</td>
<td>
<input type="number" id="Mr" value="44" style="width: 80%">
</td>
</tr>
<tr id="row5">
<td>
<label for="chi">Polymer-Solvent Interaction Parameter (χ)</label>
</td>
<td>
<input type="number" id="chi" value="0.426" style="width: 80%">
</td>
<td>
<label for="blen">Polymeric Repeating Unit Average Bond Length (l, nm)</label>
</td>
<td>
<input type="number" id="blen" value="0.15" style="width:80%">
</td>
<td>
<label for="bnum">Number of Backbone Bonds per Repeating Unit (λ)</label>
</td>
<td>
<input type="number" id="bnum" value="3" style="width: 80%">
</td>
</tr>
<tr id="row6">
<td>
<label for="cinf">Polymer Characteristic Ratio (C<sub>∞</sub>)</label>
</td>
<td>
<input type="number" id="cinf" value="4" style="width:80%">
</td>
<td>
<label for="rf">Polymer Fiber Radius (r<sub>f</sub>, nm)</label>
</td>
<td>
<input type="number" id="rf" value="0.51" style="width: 80%">
</td>
</tr>
</tbody>
</table>
</form>
<!-- Output formatting-->
<p></p><center> φ<sub>s</sub> = <span id="sPVF1">0</span></center><p></p>
<p></p><center> G = <span id="G1">0</span> kPa</center><p></p>
<p></p><center> ξ = <span id="ms1">0</span> nm</center><p></p>
<p></p><center> r<sub>m</sub> = <span id="rm1">0</span> nm</center><p></p>
<p></p><center> D<sub>0</sub> = <span id="dnot1">0</span> µm<sup>2</sup>/s</center><p></p>
<p></p><center> <sup>D</sup>⁄<sub>D<sub>0</sub></sub> = <span id="dnorm1">0</span></center><p></p>
<p></p><center> D = <span id="diff1">0</span> µm<sup>2</sup>/s</center><p></p>
<!-- Creates the button used for calling the function-->
<form id="inputform" onsubmit="return calculate_hydrogel_properties()">
<div>
<center><button style="margin: 20px 10px" onclick="calculate_hydrogel_properties()">Calculate Hydrogel Properties</button></center>
</div>
</form>
<!-- Import nerdamer and math.js libraries to solve the equation -->
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/nerdamer.core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Algebra.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Calculus.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Solve.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.2.0/math.min.js"></script>
<script>
function calculate_hydrogel_properties() {
// Get input values from the table and assign to respective variables
var iPVF = parseFloat(document.getElementById('iPVF').value);
var Nj = parseFloat(document.getElementById('Nj').value);
var fun = parseFloat(document.getElementById('fun').value);
var gamma = parseFloat(document.getElementById('gamma').value);
var temp = parseFloat(document.getElementById('temp').value);
var dens = parseFloat(document.getElementById('dens').value);
var Mr = parseFloat(document.getElementById('Mr').value);
var chi = parseFloat(document.getElementById('chi').value);
var blen = parseFloat(document.getElementById('blen').value);
var bnum = parseFloat(document.getElementById('bnum').value);
var cinf = parseFloat(document.getElementById('cinf').value);
var rs = parseFloat(document.getElementById('rs').value);
var rf = parseFloat(document.getElementById('rf').value);
//define static variables
var R = parseFloat(8314); // Ideal Gas Constant, as it is used in the rubberlike elasticity equation
var v1 = parseFloat(18); // mol/mL, molar volume of water (solvent)
var rfvw = parseFloat(0.269); // nm
var kb = parseFloat(1.38e-23); // J/k
var visc = parseFloat(0.00089); // Pa * s viscosity of water
//declar output variables
var sPVF;
var G;
var ms;
var rm;
var dnorm;
var dnot;
var diff;
//Calculate sPVF using nonlinear solver method
var final = 1000*(-1) * (1 - (2 / fun)) * (1 - gamma) * ((v1 * dens) / (Mr * Nj)) * (iPVF ** (2 / 3));
var eq = nerdamer('(log(1 - p) + p + (chi)*(p)**2) / (p ** (1/3))*1000 = fthing');
eq = eq.evaluate({ fthing: final, chi: chi });
var result = eq.solveFor('p');
result = result.toString();
sPVF = eval(result);
// Calculate shear modulus through rubberlike elasticity equation
G = R * (temp + 273) * (1 - (2 / fun)) * (1 - gamma) * dens / Mr / Nj * (iPVF ** (2 / 3)) * (sPVF ** (1 / 3));
//Calculate mesh size
ms = ((sPVF) ** (-1 / 3)) * Math.sqrt(((1 - (2 / fun)) * (blen ** (2)) * cinf * bnum * Nj));
//Conditional calculation of mesh radius
if (fun == 4) {
rm = (Math.sqrt(6) / 3.0) * ms;
} else if (fun == 6) {
rm = (1.0 / 2.0) * ms;
} else if (fun == 8) {
rm = (Math.sqrt(2)/4.0) * ms;
}
//Calculate the normalized diffusivity ratio (D/D0)
dnorm = math.erf(rfvw / rs) * math.exp(-1 * ((rs / rfvw) ** 3) * (sPVF / (1 - sPVF))) + (1 - math.erf(rfvw / rs)) * math.exp(-1/4 * math.PI * ((rs + rf) / rm) ** 2);
//Calculate D0 through stokes einstein equation
dnot = (kb * (temp + 273) * (10 ** 21)) / (6 * math.PI * visc * rs);
//Calculate diffusivity in hydrogel from dnot and dnorm
diff = dnorm * dnot;
//Adjust sig figs of output variables for presentation
sPVF = sPVF.toPrecision('3');
G = G.toPrecision('3');
ms = ms.toPrecision('3');
rm = rm.toPrecision('3');
dnorm = dnorm.toPrecision('3');
dnot = dnot.toPrecision('3');
diff = diff.toPrecision('3');
//assign output variables to be displayed
document.getElementById('sPVF1').innerHTML = sPVF;
document.getElementById('G1').innerHTML = G;
document.getElementById('ms1').innerHTML = ms;
document.getElementById('rm1').innerHTML = rm;
document.getElementById('dnot1').innerHTML = dnot;
document.getElementById('dnorm1').innerHTML = dnorm;
document.getElementById('diff1').innerHTML = diff;
return false;
};
function update_polymer() {
if (document.getElementById('polymer').value == 'peg') {
//assign polymer parameters to be displayed
document.getElementById('dens').value = 1.12;
document.getElementById('Mr').value = 44;
document.getElementById('chi').value = 0.426;
document.getElementById('blen').value = 0.15;
document.getElementById('bnum').value = 3;
document.getElementById('cinf').value = 4;
document.getElementById('rf').value = 0.51;
} else if (document.getElementById('polymer').value == 'pva') {
document.getElementById('dens').value = 1.27;
document.getElementById('Mr').value = 44;
document.getElementById('chi').value = 0.494;
document.getElementById('blen').value = 0.154;
document.getElementById('bnum').value = 2;
document.getElementById('cinf').value = 8.3;
document.getElementById('rf').value = 0.55;
}
};
</script>
Rubberlike Elasticity
<form id="inputform">
<!-- Creates a table for necessary inputs-->
<table border="0" cellspacing="10" cellpadding="10" id="inputTable">
<tbody>
<tr id="row1">
<td>
<label for="temperature">Temperature (T, °C) </label>
</td>
<td>
<input type="number" id="temperature" value="25" style="width: 80%">
</td>
<td>
<label for="junction functionality">Junction Functionality (f) </label>
</td>
<td>
<input type="number" id="junction functionality" value="4" style="width:80%">
</td>
<td>
<label for="gamma">Frequency of Chain-End Defects (γ)</label>
</td>
<td>
<input type="number" id="gamma" value="0.2" style="width:80%">
</td>
</tr>
<tr id="row2">
<td>
<label for="N_j">Degree of Polymerization between junctions (N<sub>j</sub>)</label>
</td>
<td>
<input type="number" id="N_j" value="100" style="width: 80%">
</td>
<td>
<label for="phi_0">Initial Polymer Volume Fraction (φ<sub>0</sub>)</label>
</td>
<td>
<input type="number" id="phi_0" value="0.1" style="width: 80%">
</td>
<td>
<label for="phi_s">Swollen Polymer Volume Fraction (φ<sub>s</sub>)</label>
</td>
<td>
<input type="number" id="phi_s" value="0.08" style="width: 80%">
</td>
</tr>
<tr id="row3">
<td>
<label for="polym">Polymer</label>
</td>
<td>
<select onchange="update_polymer()" id="polymer">
<option value="peg">PEG</option>
<option value="pva">PVA</option>
<option value="custom">Custom</option>
</select>
</td>
<td>
<label for="rho_d">Dry Density of Polymer Network (ρ<sub>d</sub>, g/mL)</label>
</td>
<td>
<input type="number" id="rho_d" value="1.12" style="width:80%">
</td>
<td>
<label for="M_r">Molecular weight of polymer repeating unit (M<sub>r</sub>, g/mol)</label>
</td>
<td>
<input type="number" id="M_r" value="44" style="width: 80%">
</td>
</tr>
</tbody>
</table>
</form>
<!-- Output formatting-->
<center> G = <span id="G">0</span> kPa</center>
<!-- Creates the button used for calling the function-->
<form id="inputform" onsubmit="return calculate_hydrogel_shearMod()">
<div>
<center><button style="margin: 20px 10px" onclick="calculate_hydrogel_shearMod()">Calculate Shear Modulus</button></center>
</div>
</form>
<script>
function calculate_hydrogel_shearMod() {
// Get input values from the table and assign to respective variables
var t;
t = parseFloat(document.getElementById('temperature').value);
var f;
f = parseFloat(document.getElementById('junction functionality').value);
var gamma1;
gamma1 = parseFloat(document.getElementById('gamma').value);
var rho_d1;
rho_d1 = parseFloat(document.getElementById('rho_d').value);
var M_r1;
M_r1 = parseFloat(document.getElementById('M_r').value);
var N_j1;
N_j1 = parseFloat(document.getElementById('N_j').value);
var phi_01;
phi_01 = parseFloat(document.getElementById('phi_0').value);
var phi_s1;
phi_s1 = parseFloat(document.getElementById('phi_s').value);
var shearMod; // Declare shear modulus variable
var R = 8314; // Ideal Gas Constant
// Calculate shear modulus through rubberlike elasticity equation
shearMod = R * (t + 273) * (1 - (2 / f)) * (1 - gamma1) * rho_d1 / M_r1 / N_j1 * (phi_01 ** (2 / 3)) * (phi_s1 ** (1 / 3));
shearMod = shearMod.toPrecision("3");
document.getElementById('G').innerHTML = shearMod; // Assign shear modulus output to G variable so its displayed
return false;
};
function update_polymer() {
if (document.getElementById('polymer').value == 'peg') {
//assign polymer parameters to be displayed
document.getElementById('rho_d').value = 1.12;
document.getElementById('M_r').value = 44;
} else if (document.getElementById('polymer').value == 'pva') {
document.getElementById('rho_d').value = 1.27;
document.getElementById('M_r').value = 44;
}
};
</script>
Equilibrium Swelling
<form id="inputform">
<!-- Creates a table for necessary inputs in HTML-->
<table border="0" cellspacing="10" cellpadding="10" id="inputTable">
<tbody>
<tr id="row1">
<td>
<label for="N_j">Degree of Polymerization between junctions (N<sub>j</sub>)</label>
</td>
<td>
<input type="number" id="N_j" value="50" style="width: 100%">
</td>
<td>
<label for="phi_r">Initial Polymer Volume Fraction (φ<sub>0</sub>)</label>
</td>
<td>
<input type="number" id="phi_r" value="0.1" style="width: 100%">
</td>
<td>
<label for="f">Junction Functionality (f)</label>
</td>
<td>
<input type="number" id="f" value="4" style="width: 100%">
</td>
<td>
<label for="gamma">Frequency of Chain-End Defects (γ)</label>
</td>
<td>
<input type="number" id="gamma" value="0.1" style="width:100%">
</td>
</tr>
<tr id="row2">
<td>
<label for="polym">Polymer</label>
</td>
<td>
<select onchange="update_polymer()" id="polymer">
<option value="peg">PEG</option>
<option value="pva">PVA</option>
<option value="custom">Custom</option>
</select>
</td>
<td>
<label for="polymer solvent interaction parameter">Polymer-Solvent Interaction Parameter (χ)</label>
</td>
<td>
<input type="number" id="chi" value="0.426" style="width: 100%">
</td>
<td>
<label for="M_r">Molecular weight of polymer repeating unit (M<sub>r</sub>, g/mol)</label>
</td>
<td>
<input type="number" id="M_r" value="44" style="width: 100%">
</td>
<td>
<label for="rho_d">Dry Density of Polymer Network (ρ<sub>d</sub>, g/mL)</label>
</td>
<td>
<input type="number" id="rho_d" value="1.12" style="width:100%">
</td>
</tr>
</tbody>
</table>
</form>
<p></p><center> φ<sub>s</sub> = <span id="G">0</span></center><p></p>
<!-- Creates a the calculate button, when clicked runs the function below to calculate values-->
<form id="inputform" onsubmit="return calculate_hydrogel_shearMod()">
<div>
<center><button style="margin: 20px 10px" onclick="calculate_hydrogel_shearMod()">Calculate Swollen Polymer Volume Fraction</button></center>
</div>
</form>
<!-- Import nerdamer and math.js libraries to solve the equation -->
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/nerdamer.core.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Algebra.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Calculus.js"></script>
<script src="https://cdn.jsdelivr.net/npm/nerdamer@latest/Solve.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.2.0/math.min.js"></script>
<script>
function calculate_hydrogel_shearMod() {
// Obtaining the input values
var x = parseFloat(document.getElementById('chi').value);
var v1 = parseFloat(18);
var gamma = parseFloat(document.getElementById('gamma').value);
var rho_d = parseFloat(document.getElementById('rho_d').value);
var M_r = parseFloat(document.getElementById('M_r').value);
var N_j = parseFloat(document.getElementById('N_j').value);
var phi_r = parseFloat(document.getElementById('phi_r').value);
var f = parseFloat(document.getElementById('f').value);
// var phi_s = document.getElementById('phi_s').value;
var phi_s; // phi_s = 0.08 is typical value
var final = 1000*(-1) * (1 - (2 / f)) * (1 - gamma) * ((v1 * rho_d) / (M_r * N_j)) * (phi_r ** (2 / 3));
var eq = nerdamer('(log(1 - p) + p + (x)*(p)**2) / (p ** (1/3))*1000 = f')
eq = eq.evaluate({ f: final, x: x });
var result = eq.solveFor('p');
result = result.toString();
solution = eval(result);
solution = solution.toPrecision('3');
//result = result.toString();
// Set found value to HTML ID
document.getElementById('G').innerHTML = solution;
return false;
};
function update_polymer() {
if (document.getElementById('polymer').value == 'peg') {
//assign polymer parameters to be displayed
document.getElementById('rho_d').value = 1.12;
document.getElementById('M_r').value = 44;
document.getElementById('chi').value = 0.426;
} else if (document.getElementById('polymer').value == 'pva') {
document.getElementById('rho_d').value = 1.27;
document.getElementById('M_r').value = 44;
document.getElementById('chi').value = 0.494;
}
};
</script>
Mesh Transport
<form id="inputform">
<!-- Creates a table for necessary inputs-->
<table border="0" cellspacing="10" cellpadding="10" id="inputTable">
<tbody>
<tr id="row1">
<td>
<label for="phi_s">Swollen Polymer Volume Fraction (φ<sub>s</sub>)</label>
</td>
<td>
<input type="number" id="phi_s" value="0.08" style="width: 100%">
</td>
<td>
<label for="junction functionality">Junction Functionality (f)</label>
</td>
<td>
<select id="junction functionality" style="width: 100%">
<option value="4">4</option>
<option value="6">6</option>
<option value="8">8</option>
</select>
</td>
<td>
<label for="N_j">Degree of Polymerization between Junctions (N<sub>j</sub>)</label>
</td>
<td>
<input type="number" id="N_j" value="40" style="width: 100%">
</td>
</tr>
<tr id="row2">
<td>
<label for="t">Temperature (T, °C)</label>
</td>
<td>
<input type="number" id="t" value="25" style="width: 100%">
</td>
<td>
<label for="r_s">Solute Hydrodynamic Radius (r<sub>s</sub>, nm)</label>
</td>
<td>
<input type="number" id="r_s" value="1.5" style="width:100%">
</td>
</tr>
<tr id="row3">
<td>
<label for="polym">Polymer</label>
</td>
<td>
<select onchange="update_polymer()" id="polymer">
<option value="peg">PEG</option>
<option value="pva">PVA</option>
<option value="custom">Custom</option>
</select>
</td>
<td>
<label for="r_f">Polymer Fiber Radius (r<sub>f</sub>, nm)</label>
</td>
<td>
<input type="number" id="r_f" value="0.51" style="width: 100%">
</td>
</tr>
<tr id="row4">
<td>
<label for="lambda">Number of Backbone Bonds per Repeating Unit (λ)</label>
</td>
<td>
<input type="number" id="lambda" value="3" style="width: 100%">
</td>
<td>
<label for="bond length">Polymeric Repeating Unit Average Bond Length (l, nm)</label>
</td>
<td>
<input type="number" id="l" value="0.15" style="width:100%">
</td>
<td>
<label for="characteristic ratio">Polymer's Flory Characteristic Ratio (C<sub>∞</sub>)</label>
</td>
<td>
<input type="number" id="cinf" value="4" style="width:100%">
</td>
</tr>
</tbody>
</table>
</form>
<!-- Output formatting-->
<p></p><center> r<sub>m</sub> = <span id="meshRadius">0</span> nm</center><p></p>
<p></p><center> <sup>D</sup>⁄<sub>D<sub>0</sub></sub> = <span id="diffusivity">0</span></center><p></p>
<p></p><center> D<sub>0</sub> = <span id="d0">0</span> µm<sup>2</sup>/s</center><p></p>
<p></p><center> D = <span id="effectiveDiffusivity">0</span> µm<sup>2</sup>/s</center><p></p>
<!-- Creates the button used for calling the function-->
<form id="inputform" onsubmit="return calculate_diff()">
<div>
<center><button style="margin: 20px 10px" onclick="calculate_diff()">Calculate Hydrogel Diffusivity</button></center>
</div>
</form>
<!-- Import Math.js library to use the erf function and call Pi-->
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjs/6.2.0/math.min.js"></script>
<script>
function calculate_diff() {
// Get input values from the table and assign to respective variables
var phi_s = parseFloat(document.getElementById('phi_s').value);
var f = parseFloat(document.getElementById('junction functionality').value);
var l = parseFloat(document.getElementById('l').value);
var lambda = parseFloat(document.getElementById('lambda').value);
var N_j = parseFloat(document.getElementById('N_j').value);
var cinf = parseFloat(document.getElementById('cinf').value);
var r_s = parseFloat(document.getElementById('r_s').value);
var r_f = parseFloat(document.getElementById('r_f').value);
var t = parseFloat(document.getElementById('t').value); // Convert temp to kelvin and make floating value
var r_fvw = parseFloat(0.269) // nm
var kb = parseFloat(1.38e-23); // J/k
var eta = parseFloat(0.00089); // Pa * s viscosity of water
var diffusivity; // Declare diffusivity variable
var d; // Declare effective diffusivity
var d0; // um^2 / s
var meshSize; // Declare mesh size variable
var meshRadius; // Declare mesh radius variable
meshSize = ((phi_s) ** (-1 / 3)) * Math.sqrt(((1 - (2 / f)) * (l ** (2)) * cinf * lambda * N_j));
if (f == 4) {
meshRadius = (Math.sqrt(6) / 3.0) * meshSize;
} else if (f == 6) {
meshRadius = (1.0 / 2.0) * meshSize;
} else if (f == 8) {
meshRadius = (Math.sqrt(2)/4.0) * meshSize;
}
// Calculate the diffusivity ratio (D/D0)
diffusivity = math.erf(r_fvw / r_s) * math.exp(-1 * ((r_s / r_fvw) ** 3) * (phi_s / (1 - phi_s))) + (1 - math.erf(r_fvw / r_s)) * math.exp(-1/4 * math.PI * ((r_s + r_f) / meshRadius) ** 2);
// Calculate D0 through stokes einstein equation
t = t + 273; // Convert to kelvin
d0 = (kb * t * (10 ** 21)) / (6 * math.PI * eta * r_s);
// Use D0 from stokes einstein to calculate effective diffusivity
d = diffusivity * d0;
// Adjust each values to 3 significant figures
diffusivity = diffusivity.toPrecision("3")
d = d.toPrecision("3")
d0 = d0.toPrecision("3")
meshRadius = meshRadius.toPrecision('3');
document.getElementById('meshRadius').innerHTML = meshRadius;
document.getElementById("effectiveDiffusivity").innerHTML = d;
document.getElementById("d0").innerHTML = d0;
document.getElementById('diffusivity').innerHTML = diffusivity;
return false;
};
function update_polymer() {
if (document.getElementById('polymer').value == 'peg') {
//assign polymer parameters to be displayed
document.getElementById('l').value = 0.15;
document.getElementById('lambda').value = 3;
document.getElementById('cinf').value = 4;
document.getElementById('r_f').value = 0.51;
} else if (document.getElementById('polymer').value == 'pva') {
document.getElementById('l').value = 0.154;
document.getElementById('lambda').value = 2;
document.getElementById('cinf').value = 8.3;
document.getElementById('r_f').value = 0.55;
}
};
</script>
R Scripts for Hydrogel Data Analysis
The large amounts of hydrogel data generated in our studies are managed by R scripts to summarize the most important details of each study. With each experimental paper we publish the related R scripts for free access to Figshare. More details can be found in the links below, at our Figshare page, or by contacting us.
- Swelling Scripts from the Sciences Advances paper [Richbourg et al., 2021].
- Diffusion Scripts from the Macromolecules paper [Richbourg & Peppas, 2021].
- Stiffness Scripts from the Polymer paper [Richbourg, Rausch, & Peppas, 2022].
- To compare with the swollen polymer network model predictions, the Large Pore Effective Medium (LPEM) model of Liu et al. (2013) was used to predict solute diffusion coefficients via THIS R Script for the multi-arm PEG, Journal of Materials Chemistry B paper [Richbourg and Peppas, 2023].
- Statistical Decoupling of Stiffness and Solute Transport Script for the Biomaterials paper [Richbourg and Peppas, 2023].
- The Hydrogel Property Predictor R Script predicts hydrogel properties from formulation data (structural parameters) and identity parameters for all the hydrogel formulations in the Comprehensive and Essential Richbourg-Peppas datasets.
Raw Hydrogel Datasets
So far, we have published seven datasets of hydrogel properties that provide more in-depth information than what we published in the associated papers. More details on the data can be found in the links below, at our Figshare page, or by contacting us.
- Swelling Data for PVA, PEGDA, and GelMA hydrogels from the Sciences Advances paper [Richbourg et al., 2021].
- Diffusion Data in PVA hydrogels from the Macromolecules paper [Richbourg & Peppas, 2021].
- Stiffness Data on PVA hydrogels from the Polymer paper [Richbourg, Rausch, & Peppas, 2022]. Further raw data available here.
- Diffusion and Partitioning Data for multi-arm PEG hydrogels from the Journal of Materials Chemistry B paper [Richbourg and Peppas, 2023].
- Decoupling Stiffness and Diffusivity Data for multi-arm PEG hydrogels from the Biomaterials paper [Richbourg and Peppas, 2023].
- The Comprehensive Richbourg-Peppas Dataset is a single table .csv file containing all the hydrogel properties predicted and measured during Nate’s PhD.
- The Essential Richbourg-Peppas Dataset is a single table .csv file containing the essential structural parameters, predictions, and measurements for the PVA and multi-arm PEG hydrogels synthesized and characterized during Nate’s PhD.
Protocols
Sharing our protocols online helps to clarify details for those aiming to reproduce our experiments. Contact us for questions not addressed by the protocols.
- PVA Hydrogel Synthesis and FRAP Experiment Protocols from the Macromolecules paper [Richbourg & Peppas, 2021].
- Stiffness Measurement Protocols from the Polymer paper [Richbourg, Rausch, & Peppas, 2022].
- Multi-Arm PEG Hydrogel Synthesis and Diffusion Experiment Protocols from the Journal of Materials Chemistry B paper [Richbourg and Peppas, 2023].
FRAP Analysis Programs (Ours and Jönsson’s)
The FRAP analysis program by Jönsson et al., [Jönsson et al., 2008] is one of the best tools for studying solute diffusion in hydrogels. It is a robust method of FRAP analysis that makes good use of the rich data gathered in a FRAP experiment with a confocal laser scanning microscope [Lorén et al., 2015]. It can be found on the MATLAB File Exchange Repository [LINK HERE]. The graphical user interface created by the program is friendly to users without much MATLAB experience, and the software comes with a helpful guide on how to use it.
Our batch FRAP analysis program [LINK HERE] builds upon the Jönsson program by creating a streamlined interface and backend for high-throughput batch analysis of FRAP experiments on fluorescent solute diffusing within a hydrogel. Key improvements for this application include automatically reading in a whole folder of .tiff FRAP experiment files and finally exporting an Excel-readable .csv table where each experiment is a row with key parameters listed including the diffusion coefficient and the R-squared value for the curve fit to the data. When we analyzed approximately 2000 FRAP experiments first using the Jönsson program and then using the batch FRAP analysis program, it took over 150 person-hours to collect data into tables using the Jönsson program and only five minutes to set up the batch FRAP analysis program, after which it analyzed all the data and exported a table in only three hours. For high-throughput analysis of solute diffusion in hydrogels, our program is a solid improvement on the state-of-the-art program by Jönsson and colleagues. The batch FRAP analysis program was tested first with seven solute in PVA hydrogels, and the results we gained from that study are published in Macromolecules [Richbourg and Peppas, 2021]. A following study with 73 multi-arm PEG hydrogel formulations and three solutes provided further insight on how hydrogel structure affects solute transport, published in the Journal of Materials Chemistry B [Richbourg and Peppas, 2023].
Blender Files for Conceptual Polymer Network 3D Visualization
For our manuscript in Macromolecular Chemistry and Physics, [Richbourg, Ravikumar, & Peppas, 2021], we used the free 3D design software Blender to help visualize polymer network structures. The resulting blender files for that paper can be found HERE.
Video animations (and a protocol on how to create them) can be found HERE, thanks to the work of Ezekiel Eliamani.