|
|
DataMuseum.dkPresents historical artifacts from the history of: RC4000/8000/9000 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about RC4000/8000/9000 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 18432 (0x4800)
Types: TextFile
Names: »mprofile15«
└─⟦00964e8f7⟧ Bits:30007478 RC8000 Dump tape fra HCØ.
└─⟦b2ec5d50f⟧
└─⟦this⟧ »mprofile15«
begin
comment MPROFILE, VER 15, 1-OCT-81, Kaare Lund Rasmussen, RC4000.;
comment VER 15 : no plotting, undercooling assumed in simulation
one-sided growth only. Local Ni and P for input of
calculated loacl P as phosfor;
comment VER 15 : phase diagram Romig and Goldstein (1980).
Corrected solution of differential equation.
Phosphorous included in phasediagram, both alfa and gamma
and in diffusion coefficients, according to Moren
and Goldstein (1979).;
comment Mainprogram for cooling simulation above 320 deg C;
integer i,j,k,maxno,plotseq,ordn,x1,x2,x2a,start,ch,nomeas,noalfa,
alfainit,oldq,agrellgrow,oldx2,oldx2a,chp,chpsat,aga;
real t,tempstart,tempslut,bulknipc,q,qa,dx1,dx2,xbound1,xbound2,pl,
dt,r1,r2,rod,dxg1,dxg2,kk,aa,bb,cc,skt,xzero1,xzero2,xbound,stable,
erral,err1,err2,gamw,alfapre,alfanex,theta,kappa1,kappa2,phosfor,
xmpc,mpc,tzero,undercool,understart,nialfapre,dxal,dxgal,
nipcalint,phosalfa,phosgam,nipcalfa,nipcgam,phosalsat,
nialsat,phosgasat,nigasat,nial0,niga0,phosal0,phosga0,
phoschem,localp,tee1,tee2,tee,secinyear,wfe,wni;
real array nipc,nipci,nipc2,xx1,xg,s,nipcal,xa(1:200),
text(1:4),xmeas,nimeas(1:60),p,talfa,phgam,phalfa,
nialph0,nialphinf,nigaph0,nigaphinf(0:20),
const(1:10);
real procedure dgam(nipc);
value nipc;
real nipc;
begin
comment this procedure computes the diffusion
koefficient of ni in gamma iron at
temperature t;
real ni;
ni := nipc*100.0/(wni*(nipc/wni+(100.0-nipc)/wfe));
dgam := exp(0.0519*ni + 1.15)*(1.0 + 9.3*phosgam)*
exp(-(76400 - 11.6*ni)/(1.986*t))*secinyear;
end of real procedure dgam;
real procedure dgamP(temp,nipc,pres);
value temp,nipc;
real temp,nipc,pres;
begin
comment Pressure correction to diffusion constant
in the gamma phase. Deltavol = activation volume.;
real d,deltavol;
deltavol := 0.0;
d := dgam(nipc);
d := d*exp(-pres*deltavol/(1.986*temp));
dgamP := d;
end of real procedure dgamP;
real procedure dalfa;
begin
comment this procedure computes the diffusion
koefficient of nickel in alpha iron
at temperature t, according to Romig
and Goldstein (1979).;
dalfa := 10.5*exp(-64300/(1.986*t))*secinyear*
(1.0 + 1.2665*phosalfa + 0.6231*phosalfa*phosalfa);
end of real procedure dalfa;
real procedure dalfaP(temp,pres);
value temp;
real temp,pres;
begin
comment Pressure correction to diffusion constant
in the alpha phase. Deltavol = activation volume.;
real d,deltavol;
deltavol := 0.0;
d := dalfa;
d := d*exp(-pres*deltavol/(1.986*temp));
dalfaP := d;
end of real procedure dalfaP;
procedure phasestart(phosfor);
value phosfor;
real phosfor;
begin
comment This procedure initialize the phasediagram.;
noalfa := 7;
talfa(0) := 1187; talfa(1) := 973; talfa(2) := 873;
talfa(3) := 773; talfa(4) := 748; talfa(5) := 723;
talfa(6) := 673; talfa(7) := 573;
comment alpha-phase;
nialph0(0) := 0.0; nialph0(1) := 4.1; nialph0(2) := 5.4;
nialph0(3) := 6.05; nialph0(4) := 6.1; nialph0(5) := 6.0;
nialph0(6) := 5.5; nialph0(7) := 4.1;
nialphinf(0) := 0.00; nialphinf(1) := 4.5; nialphinf(2) := 6.1;
nialphinf(3) := 7.5; nialphinf(4) := 7.64; nialphinf(5) := 7.8;
nialphinf(6) := 7.2; nialphinf(7) := 4.7;
comment gamma-phase;
nigaph0(0) := 0.0; nigaph0(1) := 10.4; nigaph0(2) := 20.2;
nigaph0(3) := 33.3; nigaph0(4) := 35.4; nigaph0(5) := 39.6;
nigaph0(6) := 46.0; nigaph0(7) := 54.6;
nigaphinf(0) := 0.0; nigaphinf(1) := 9.3; nigaphinf(2) := 15.7;
nigaphinf(3) := 27.3; nigaphinf(4) := 29.6; nigaphinf(5) := 32.5;
nigaphinf(6) := 37.5; nigaphinf(7) := 46.0;
end of procedure phasestart;
procedure phasedia(temp,ordn,start,undercool);
value temp,undercool;
real temp,undercool;
integer ordn,start;
begin
comment This procedure evalueates the phasediagram
at temperature temp. The equilibrium tieline of
Moren and Goldstein (1979) are used.;
real ni,ni0,niinf,pho,phinf,ta1,ta2,a,b,c,ecxp;
integer i,n;
comment Saturation and zero Ni and P values are found.;
n := 0;
for i := 1 step 1 until noalfa do
if temp < talfa(i) then n := i;
if n = noalfa then n := n-1;
ta1 := talfa(n); ta2 := talfa(n+1);
nial0 := (nialph0(n+1) - nialph0(n))/(ta1 - ta2);
nial0 := nialph0(n) + nial0*(ta1 - temp);
if nial0 < 0.0 then nial0 := 0.0;
nialsat := (nialphinf(n+1) - nialphinf(n))/(ta1-ta2);
nialsat := nialphinf(n) + nialsat*(ta1-temp);
if nialsat < 0.0 then nialsat := 0.0;
niga0 := (nigaph0(n+1) - nigaph0(n))/(ta1-ta2);
niga0 := nigaph0(n) + niga0*(ta1-temp);
if niga0 > 50.0 then niga0 := 50.0;
nigasat := (nigaphinf(n+1) - nigaphinf(n))/(ta1-ta2);
nigasat := nigaphinf(n) + nigasat*(ta1-temp);
phosalsat := 10**(-2440.0/temp + 2.346);
phosgasat := 10**(-2790.0/temp + 2.29);
comment The real values are found now;
if chpsat = 0 then
begin
c := localp*(niga0 - nial0);
b := (phosgasat*(nial0-bulknipc)
+localp*(nigasat-niga0))
+(phosalsat*(bulknipc-niga0)
-localp*(nialsat-nial0));
a := (phosgasat*(nialsat-nial0)
-phosalsat*(nigasat-niga0));
tee2 := b*b - 4.0*a*c;
if tee2 < 0.0 then tee1 := -b
else tee1 := - b - sqrt(tee2);
tee := tee1*0.5/a;
if tee > 1.0 then tee := 1.0;
nipcgam := niga0 + tee*(nigasat-niga0);
nipcalfa := nial0 + tee*(nialsat-nial0);
phosgam := tee*phosgasat;
if phosgam < 0.0 then phosgam := 0.0;
phosalfa := tee*phosalsat;
if nipcgam < bulknipc then nipcgam := bulknipc;
if tee = 1.0 and x2 > 5 then chpsat := 1.0;
comment Maximum P obeyed;
ecxp := xbound1*phosalfa + (xzero1-xbound1)*phosgam;
if ecxp/xzero1 > localp then
begin
ecxp := localp*xzero1/ecxp;
phosgam := phosgam*ecxp;
phosalfa := phosalfa*ecxp;
end
else
if phosgam > localp then phosgam := localp;
comment Local bulk P is set at Kamacite nucleation;
if localp > phosfor then localp := phosfor;
if start = 1 and chp = 0 then
begin
localp := phosfor;
chp := 1;
write(out,<:<10>Kamacite nucleated at temp = :>,
<<dddd.ddd>,t,<:<10>Local bulk Ni,P = :>,
nipcgam,localp,<:<10>:>);
end;
comment undercooling included, start of growth check;
if nipcgam >= bulknipc then
begin
if understart = 0 then understart := t;
if understart - t < undercool then nipcgam := bulknipc;
end;
if nipcgam <= bulknipc and start = 0 then
begin
nipcgam := bulknipc;
start := 0;
end
else
start := 1;
if start = 1 and chp = 0 then aga := 1 else aga := 0;
end
else
begin
nipcgam := nigasat;
nipcalfa := nialsat;
phosgam := phosgasat;
phosalfa := phosalsat;
end;
end of procedure phasedia;
real procedure prescorrect(temp,start,pres);
value temp,start,pres;
real temp,pres;
integer start;
begin
comment Pressure correction to the phase diagram;
prescorrect := pres*1'-11;
end of real procedure prescorrect;
real procedure time(temp,const);
real temp;
real array const;
begin
comment time as a function of temperature
ie the cooling history;
time := -const(1) - temp*const(2);
end of real procedure time;
real procedure temp(time,const);
real time;
real array const;
begin
comment temperature as a function of time
ie cooling history;
temp := (-time-const(1))/const(2);
end of real procedure temp;
real procedure coolrate(temp,const);
real temp;
real array const;
begin
comment this procedure gives the instant cooling rate,
ie the first derivative of temp(time), as a function
of temperature;
coolrate := 1/const(2);
end of real procedure coolrate;
procedure writesection;
begin
comment This procedure writes out all information.;
integer i;
real r1,r2;
mpc := nipc(x2);
write(out,<<-d.dddddddddd'-dd>,
<:<10><10>MPROFILE VER 15<10>:>,
<:<10>Coolingrate = :>,coolrate(t,const),
<:<10>Bulk nipc = :>,bulknipc,
<:<10>P initial = :>,phosfor,
<:<10>Local P in taenite at kamacite nucleation = :>,localp,
<:<10>Undercooling = :>,undercool,
<:<10>Total width of bands :>,xzero1,
<:<10>Resulting gamma bandwidth = :>,
xzero1-xbound1,
<:<10>MPC = :>,mpc,
<:<10>nipcgam = :>,nipcgam,
<:<10>nipcalfa = :>,nipcalfa,
<:<10>phosgam = :>,phosgam,
<:<10>phosalfa = :>,phosalfa,
<:<10>nial0 = :>,nial0,
<:<10>nialsat = :>,nialsat,
<:<10>niga0 = :>,niga0,
<:<10>nigasat = :>,nigasat,
<:<10>phosalsat = :>,phosalsat,
<:<10>phosgasat = :>,phosgasat,
<:<10>temp = :>,t);
end of procedure writesection;
procedure growth(t,xbound,nipc,dx,xzero,err);
real array nipc;
real t,xbound,dx,xzero,err;
begin
comment This procedure solves the differential equation
and calculates the distance which the phase-
boundary will be moved in this timestep.;
dt := abs(time(t,const) - time(t-skt,const));
nipc(1) := nipci(1) := nipcgam;
stable := 1.0;
comment now the diffusion equation is solved;
comment Gamma phase;
for i := 2 step 1 until x2-1 do
begin
r1 := nipc(i-1) + nipc(i+1) - nipc(i)*2;
r2 := stable*dgam(nipc(i))*dt/(dx**2);
if r2 >= 0.5 then
begin
if x2 > 5 then
begin
write(out,<:<10>Too heavy growth in gamma phase<10>:>);
goto bounderr;
end
else
r2 := 0.5;
end;
nipci(i) := nipc(i) + r1*r2;
if nipci(i) > nipci(i-1) and x2 <= 5 then
begin
writesection;
write(out,<:<10>Growth error in gamma at high temp<10>:>);
goto bounderr;
end;
end;
r1 := 2*(nipc(x2-1)-nipc(x2))*stable*
dgam(nipc(x2))*dt/(dx**2);
nipci(x2) := nipc(x2) + r1;
if nipci(x2) > nipci(x2-1) then nipci(x2) := nipci(x2-1);
for i := 2 step 1 until x2 do
nipc(i) := nipci(i);
comment Alpha phase;
if xbound > 0.1*xzero then
begin
nipcal(x2a) := nipci(x2a) := nipcalfa;
if start > 0 and alfainit = 0 then
begin
for i := 1 step 1 until x2a-1 do nipcal(i) := nipcal(x2a);
for i := 1 step 1 until x2a do xa(i) := (i-1)*0.1*xzero/x2a;
alfainit := 1;
end;
for i := x2a-1 step -1 until 2 do
begin
r1 := nipcal(i-1) + nipcal(i+1) - 2*nipcal(i);
r2 := stable*dalfa*dt/(dxal**2);
if r2 > 0.5 then
begin
if x2a > 5 then
begin
write(out,<:<10>Too heavy growth in alpha<10>:>);
goto bounderr;
end
else
r2 := 0.5;
end;
nipci(i) := nipcal(i) + r1*r2;
end;
r1 := 2*(nipcal(2)-nipcal(1))*stable*
dalfa*dt/(dxal**2);
nipci(1) := nipcal(1) + r1;
if nipci(1) > nipci(2) then nipci(1) := nipci(2);
for i := 1 step 1 until x2a-1 do nipcal(i) := nipci(i);
end
else
begin
for i := 1 step 1 until x2a do nipcal(i) := nipcalfa;
end;
comment growth of alpha phase;
grow:
if start > 0 and xbound >= 0.1*xzero then
begin
nipcalint := 0.0;
for i := 1 step 1 until x2a-1 do
nipcalint := nipcalint + dxal*(nipcal(i) + nipcal(i+1))/2;
nipcalint := nipcalint + erral*nipcal(1);
end
else
nipcalint := nipcalfa*xbound;
if start = 0 then goto endgrow;
kk := 0.0;
for j := 2 step 1 until x2 do
kk := kk + nipc(j) + nipc(j-1);
kk := kk*dx/2 +err*nipc(x2);
aa := (nipc(1) - nipc(2))/(2*dx);
bb := nipcal(x2a) - nipc(1);
cc := nipcalint + kk - xzero*bulknipc;
kk := bb**2 - 4*aa*cc;
if nipcal(x2a) - nipc(1) >= 0.0 then
rod := 0.0
else
if aa < 1'-10 then
rod := - cc/bb
else
if kk < 0.0 then rod := dx
else
rod := (-bb - sqrt(kk))/(2*aa);
if rod >= dx then
begin
kk := 0.0;
for j := 3 step 1 until x2 do
kk := kk + nipc(j) + nipc(j-1);
kk := kk*dx/2 + err*nipc(2);
aa := (nipc(2) - nipc(3))/(2*dx);
bb := nipcal(x2a) - nipc(2);
cc := nipcalint + dx*nipcal(x2a) + kk - xzero*bulknipc;
kk := bb**2 - 4*aa*cc;
if aa < 1'-10 then rod := -cc/bb +dx
else
if kk < 0.0 then rod := 2*dx
else
rod := dx + (-bb-sqrt(kk))/(2*aa);
if rod < 2*dx then write(out,<:<10>Enhanced growth at temp = :>,
<<dddd.ddd>,t,<: x2 = :>,<<ddd>,x2);
if rod >= 2*dx then
begin
kk := 0.0;
for j := 4 step 1 until x2 do
kk := kk + nipc(j) + nipc(j-1);
kk := kk*dx/2 + err*nipc(x2);
aa := (nipc(3) - nipc(4))/(2*dx);
bb := nipcal(x2a) - nipc(3);
cc := nipcalint + 2*dx*nipcal(x2a) + kk - xzero*bulknipc;
kk := bb**2 - 4*aa*cc;
if aa < 1'-10 then rod := -cc/bb + 2*dx
else
if kk < 0.0 then rod := 3*dx
else
rod := 2*dx + (-bb-sqrt(kk))/(2*aa);
write(out,<:<10>Heavy enhanced growth at temp = :>,
<<dddd.ddd>,t,<: x2 = :>,<<ddd>,x2);
end;
end;
if rod >= 3*dx then
begin
write(out,<:<10>rod gtr 3 dx at temp = :>,<<-dddd>,t,
<<-d.dd'-d>,<: rod = :>,rod,<: dx = :>,
dx,<: x2 = :>,<<ddd>,x2);
goto bounderr;
end;
xbound := xbound + rod;
if xbound < 0.0 then xbound := 0.0;
endgrow:
end of procedure growth;
procedure move(x,xbound,xzero,nipc,dxg,dx,dxgal,dxal);
real array x,nipc;
real xbound,dxg,dx,dxgal,dxal,xzero;
begin
comment This procedure makes the interpolation
between the old points and generates the new
points.;
comment Gamma phase;
xg(1) := x(1);
x(1) := xbound;
for i := 2 step 1 until x2 do
begin
xg(i) := x(i);
x(i) := x(i-1) + dx;
end;
j := 2;
for i := 1 step 1 until x2 do
begin
for k := i while x(i) > xg(j) and j < oldx2 do j := j + 1;
if j <= oldx2 then
begin
aa := (nipc(j) - nipc(j-1))/dxg;
nipci(i) := aa*(x(i) - xg(j-1)) + nipc(j-1);
end
else
nipci(i) := nipc(oldx2);
end;
for i := 1 step 1 until x2 do nipc(i) := nipci(i);
comment Alpha phase;
if xbound < 0.1*xzero then goto endmove;
for i := 1 step 1 until oldx2a do
xg(i) := xa(i);
for i := 1 step 1 until x2a do
xa(i) := (i-1)*dxal + erral;
j := 2;
for i := 1 step 1 until x2a do
begin
if xa(i) > xg(j) and j < oldx2a then j := j + 1;
if abs(dxgal) < 1'-5 then dxgal := dxal;
if j <= oldx2a then
begin
aa := (nipcal(j) - nipcal(j-1))/dxgal;
nipci(i) := aa*(xa(i) - xg(j-1)) + nipcal(j-1);
end
else
nipci(i) := nipcal(oldx2a);
end;
for i := 1 step 1 until x2a do nipcal(i) := nipci(i);
endmove:
end of procedure move;
comment Headsection starts.;
comment initialization and read in block starts;
err1 := err2 := 0.0;
start := 0;
alfainit := 0;
xbound1 := xbound2 := 0.0;
for i := 1 step 1 until 200 do
begin
xx1(i) := xa(i) := 0.0;
xg(i) := 1.0;
end;
x1 := 1;
understart := 0.0;
agrellgrow := 1;
nialfapre := -1.0;
readstring(in,text,1);
read(in,tempstart,tempslut,maxno,q,const(2),bulknipc,
gamw,alfapre,alfanex,kappa1,kappa2,phosfor,undercool);
tzero := tempstart;
phasestart(phosfor);
nomeas := 0;
const(2) := 1000000/const(2);
comment the length unit is cm and the time unit is years.;
gamw := gamw*'-4;
alfapre := alfapre*'-4;
alfanex := alfanex*'-4;
xzero1 := alfapre*kappa1;
xzero2 := alfanex*kappa2;
xzero1 := 0.5*(xzero1 + xzero2);
for i := 1 step 1 until 200 do
nipc2(i) := nipc(i) := nipcal(i) := bulknipc;
dx1 := xzero1/4;
dx2 := xzero2/4;
dxal := dxgal := xzero1/((x2a-1)*10);
x2 := oldq := x1 := x2a := oldx2 := oldx2a := 5;
const(1) := -tempstart*const(2);
localp := phoschem := phosfor;
chpsat := 0;
chp := 0;
secinyear := 31556926.08;
wni := 58.71;
wfe := 55.847;
skt := -0.5;
comment initialization block end;
for t := tempstart step skt until tempslut do
begin
if time(t,const) > 6'9 then goto now;
phasedia(t,ordn,start,undercool);
if aga = 1 then phasedia(t,ordn,start,undercool);
if nipcalfa < nialfapre then agrellgrow := 0;
nialfapre := nipcalfa;
growth(t,xbound1,nipc,dx1,xzero1,err1);
if xbound1 >= xzero1 then goto bounderr;
x1 := x2;
oldx2a := x2a;
oldx2 := x2;
dxg1 := dx1;
dxg2 := dx2;
dxgal := dxal;
dx1 := sqrt(-skt*dgam(nipc(2))/(coolrate(t,const)*q));
dxal := sqrt(-skt*dalfa/(coolrate(t,const)*q));
if dx1 > (xzero1 - xbound1)/4 then
begin
dx1 := (xzero1 - xbound1)/4;
x2 := 5;
end
else
if dx1*(maxno-1) < xzero1 - xbound1 then
begin
dx1 := (xzero1 - xbound1)/(maxno-1);
x2 := maxno;
end else
x2 := entier((xzero1 - xbound1)/dx1) + 1;
err1 := xzero1 - xbound1 - dx1*(x2-1);
if xbound1 >= 0.1*xzero1 then
begin
if dxal > xbound1/4 then
begin
dxal := xbound1/4.0;
x2a := 5;
end
else
if dxal*(maxno-1) < xbound1 then
begin
dxal := xbound1/(maxno-1);
x2a := maxno;
end
else
x2a := entier(xbound1/dxal) + 1;
end;
erral := xbound1 - dxal*(x2a-1);
if oldq+5 < x2 then
begin
write(out,<:<10>x2 = :>,
<<ddd>,x2,<: and x2a = :>,x2a,<: at temp = :>,<<dddd.ddddd>,t);
oldq := x2;
end;
move(xx1,xbound1,xzero1,nipc,dxg1,dx1,dxgal,dxal);
if tzero - t > 1900.0 then
begin
tzero := t;
writesection;
end;
end of temperature loop;
now:
writesection;
goto slut;
bounderr:
write(out,<:<10>ERROR IN SIMULATION.<10><10>First aid turn q down:>,
<:<10><10>The results beneath are in error.<10>:>);
writesection;
goto slut;
slut:
end of program;
▶EOF◀