3章 相图的计算机分析与计算
重庆大学材料科学与工程学院
汤爱涛
3.1概述
CALPHAD
计算机在相图研究中应用的主要
? 相图计算与绘制
? 相图库系统
? 计算机相图解析计算
3.2相图计算基本方法
? 热力学模型
? 基本概念
? 理想溶液模型
? 规则溶液模型
? 二元完全固溶相图的计算
3.3相图计算软件简介
CALPHAD技术
? Thermo-Calc(瑞典 )
? F*A*C*T(加拿大 )
? Lukas(德国 )
? MTDATA (美国 )
上机实验 5
相图的模拟计算实践
? 实验目的
? 了解相图计算基本原理
? 了解常用相图计算软件的特点
? 掌握采用理想溶液模型计算绘制二元相图的方法
? 实验内容
? NiO-MgO二元相图的编程上机计算绘制
? 实验要求,
? 实验报告要求,
NiO-MgO二元相图计算程序
#include<stdio.h>
#include<conio.h>
#include<dos.h>
#include<math.h>
#include<graphics.h>
#include <stdlib.h>
#include <stdarg.h>
extern int directvideo=0;
int TA=1960+273,TB=2800+273;
int n ;
float R=8.310,DHA=52300,DHB=77400;
float dg(float dh,int t,int tb)
{ if (TA<=t && t<=TB) return (dh*(tb-t)/tb);
else printf("The temperature is out of range\n");
return 0;
}
float xb2(int k)
{ float dgb,dga,xbl;
dgb=dg(DHB,k,TB);
dga=dg(DHA,k,TA);
xbl=((exp(-dga/(R*k))-1)*exp(-
dgb/(R*k)))/(exp(-dga/(R*k))-exp(-dgb/(R*k)));
return xbl;
}
float xb1(int k)
{ float dgb,dga,xbs;
dgb=dg(DHB,k,TB);
xbs=xb1(k)*exp(-dgb/(R*k));
return xbs;
}
initgrapher()
{ int gdriver=DETECT,graphmode,errorcode;
initgraph(&gdriver,&graphmode,"D:\\TC30\\bgi");
errorcode=graphresult();
if (errorcode!=grOk)
{printf("graphics
error:%s\n",grapherrormsg(errorcode));
printf("press any key halt:");
getch() ;
exit(1);
}
return 0;
}
makemap1()
{ initgrapher();
setviewport(50,50,get
maxx()-50,getmaxy()-
50,1);
textcolor(BLUE);
settextstyle(1,0,4);
outtextxy(70,100,"software for");
outtextxy(60,140,"two phase
diagram\n");
delay(5000);
closegraph();
return 0;
}
rectangle(X1,Y1,X2,Y2);
setlinestyle(0,1,1);
for (i=1;i<=9;i++)
{line(X1+i*xstep,Y1,X1
+i*xstep,Y2);
line(X1+i*xstep,Y1,X1+i
*xstep,Y2);
}
makemap(float *solius,float
*liquidus,int *p)
{ int
X1,X2,Y1,Y2,i,u,v,w,xstep,ystep;
char my[5],mx[5];
initgrapher();
X1=getmaxx()/2-
230;X2=getmaxx()/2+220;
Y1=getmaxy()/2-
150;Y2=getmaxy()/2+150;
xstep=(X2-X1)/10;ystep=(Y2-
Y1)/10;
setbkcolor(WHITE);
setcolor(1);
setlinestyle(0,1,3);
for(i=1;i<=n+1;i++)
{p[i]=p[i]-273;
u=((p[i]-1900)/1000.0*(Y2-
Y1));
v=(int)(solius[i]*(X2-X1));
w=(int)(liquidus[i]*(X2-X1));
putpixel(X1+w,Y2-u,BLUE);
putpixel(X1+v,Y2-u,BLUE);
}
for(i=1;i<=6;i++)
{ gcvt(3.0-2.0*i,2,my);
gcvt(0.2*i,2,mx);
outtextxy(X1-
30,Y1+2*i*ystep-40,my);
outtextxy(X1+2*i*xstep-
10,Y2+10,mx);
}
settextstyle(1,1,1);
outtextxy(30,140,"temperatue(1000)");
settextstyle(1,0,2);
outtextxy(200,50,"two phase
diagram");
outtextxy(190,25,"L L+S S ");
outtextxy(X1-10,Y2+10,"NiO");
outtextxy(X1+450,Y2+10,"MgO");
getch();
closegraph();
return 0;
}