This program calculates an overall change in the radius of curvature to determine stress in an amorphous Si film grown by laser-induced chemical vapor deposition (LICVD). The film is deposited on a thin quartz substrate which will bend according to the level of stress it receives. In order to calculate stress, one takes a pregrowth curvature measurement, then a postgrowth curvature profile, obtaining a net curvature difference. Curvature is measured by bouncing a HeNe laser beam off the surface of the substrate and projecting the beam on a wall with a mirror.
You scan the HeNe beam over fixed points along an axis of the substrate to establish an initial curvature, then return to those same points after growth to resolve a final curvature, based on the displacement of points on the wall. Program input accepts horizontal position and displacement of points projected on the wall. From there, it does a linear regression between position and displacement, delivering a slope, a, along with a y-intercept, b, which the compiler recognizes, never gets used. After substrate and height parameters are taken into consideration, stress emerges. Curvature change can appear in positive or negative ways, depending on whether the film stress acts in a tensile(+) or compressive(-) manner.
stress.pas:
program stress (input, output);
const
mi = 1;
h = 467 { cm };
es = 7E11 { dyne/cm^2 };
ts = 0.015 { cm };
vs = 0.17;
type
dim = array [1..100] of real;
var
pos, disp : dim;
mc, r, sigma, d : real;
i, n : integer;
procedure indata;
begin
write('What was the film thickness [cm] ? ');
readln(d);
writeln;
write('How many data points ? ');
readln(n);
writeln;
writeln('Enter pos(i), then disp(i):');
for i := 1 to n do
readln(pos[i], disp[i]);
end; { indata }
procedure outdata;
begin
writeln;
writeln('mc = ',mc);
writeln('r = ',r,' cm');
writeln('sigma = ',sigma,' dyne/cm^2');
end; { outdata }
function slope (var x, y : dim; var n : integer) : real;
var
sx, sy, s1, s2, a, b : real;
i : integer;
begin
sx := 0;
sy := 0;
s1 := 0;
s2 := 0;
for i := 1 to n do
begin
sx := sx + x[i]/n;
sy := sy + y[i]/n;
end; { for }
for i := 1 to n do
begin
s1 := s1 + y[i]*(x[i] - sx);
s2 := s2 + sqr(x[i] - sx);
end; { for }
a := s1/s2;
b := sy - a*sx;
slope := a;
end; { slope }
begin
indata;
mc := slope(pos,disp,n) - mi;
r := 2*h/mc;
sigma := es*sqr(ts)/(1 - sqr(vs))/6/r/d;
outdata;
end. { stress }
$ fpc stress.pas
Free Pascal Compiler version 3.0.4 [2018/06/14] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling stress.pas
stress.pas(35,26) Note: Local variable "b" is assigned but never used
Linking stress
/usr/bin/ld: warning: link.res contains output sections; did you forget -T?
62 lines compiled, 0.1 sec
1 note(s) issued
$ ./stress
What was the film thickness [cm] ? 1e-4
How many data points ? 4
Enter pos(i), then disp(i):
10 12
11 14
13 15
14 18
mc = 3.0000000000000004E-001
r = 3.1133333333333330E+003 cm
sigma = 8.6823988426114276E+007 dyne/cm^2