Step Calorimetry Data Analysis

Notebook written by Hillary Smith (Hillary.L.Smith@gmail.com) July 2014
This notebook is intended for reduction of step calorimetry data measured with a heat flux calorimeter.  Prior to using this notebook, data should be reduce to ‘delta heat flow’ by finding the difference in the maximum and minimum heat flow in each step.  Unless otherwise noted, all files should be imported as two column csv data, temperature and DSC signal (μV).

Read in constants.  Mu values are the MW (g/mol) divided by the number of atoms.  Sample and sapphire mass is in mg.  Heating rate is in K/min.

musample=77.385;
musaph=101.96/5;
HR=10;
samplemass=70.1;
saphmass=21.0;

This section generates sensitivity from the sapphire calibration measurement.

Read in the literature values for sapphire in units of J/gK (column 2) and temperatures in C between 100 and 1200 (column 1).

saphstandard=Import["/Users/hsmith/Documents/Research/DSC/sapphire_JgK.csv"]

Read in the sapphire measurement data.

rawsaph=Import["/Users/hsmith/Documents/Research/DSC/MatheInput_rawdata/saphraw_test.csv"]

a=((x-p0)/p1);

model=(p2+p3*a+p4*(a^2)+p5*(a^3))Exp[-(a^2)]

fit1=FindFit[saphstandard,model,{{p0,202.7},{p1,897},{p2,1.1},{p3,-0.9},{p4,1.3},{p5,-0.38}},x,MaxIterations->10000]

Note that this fails to converge, but the resulting fit is good.

Show[ListPlot[saphstandard,PlotRange->All],Plot[model/.fit1,{x,100,1200},PlotStyle->{Red}, AxesLabel->{Temperature, Sensitivity}]]

modelfit=Function[{x},Evaluate[model/.fit1]];

saphtemps=Table[rawsaph[[i,1]],{i,1,Length[rawsaph]}];

saphfit=Table[modelfit[x],{x,saphtemps}];

saphCp is the standard heat capacity of sapphire in J/gk at each temperature measured experimentally.

saphCp=Transpose[{Flatten[saphtemps],Flatten[saphfit]}];

Generate the sensitivity using the measured sapphire data (rawsaph) and the standard heat capacity values evaluated at the experimentally determined temperatures.

sens=Table[(((rawsaph[[i,2]])/(saphCp[[i,2]])))*(1/(saphmass*(HR/60))),{i,1,Length[rawsaph]}];

senstemps=Table[rawsaph[[i,1]],{i,1,Length[rawsaph]}];

senspair=Transpose[{Flatten[senstemps],Flatten[sens]}];

This section determines the heat capacity of the sample and exports the Cp and mCp as a function of temperature.

Read in the raw sample data.

data=Import["/Users/hsmith/Documents/Research/DSC/MatheInput_rawdata/803_xtal_cut.csv"]

cp=Table[((((data[[i,2]])/(senspair[[i,2]])))*(1/samplemass))*(musample/((HR/60))),{i,1,Length[data]}];

temps=Table[data[[i,1]],{i,1,Length[data]}];

mcp=(cp/musample)*(samplemass/1000);

exportCp=Transpose[{Flatten[temps],Flatten[cp]}];

Export["/Users/hsmith/Documents/Research/DSC/MatheOutput/test.csv",exportCp];

exportmCp=Transpose[{Flatten[temps],Flatten[mcp]}];

Export["/Users/hsmith/Documents/Research/DSC/MatheOutput/test.csv",exportmCp];

This section compares the mCp of the sample with the mCp of sapphire to determine whether the mass condition has been met.  The error bars on the sapphire data (blue) are +/- 5%.

saphmcp=saphfit*(saphmass/1000);

saphmcpE=saphmcp*0.05;

Needs["ErrorBarPlots`"]

exportsaphmCpE=Transpose[{Flatten[saphtemps],Flatten[saphmcp],Flatten[saphmcpE]}];

Show[ErrorListPlot[exportsaphmCpE,Joined->True,PlotRange->Full,PlotRangePadding->.002],ListPlot[exportmCp,PlotStyle->Red]]