Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 24

MSE – 2023.

Sự hình thành tổ chức tế vi vật liệu


Trật tự - Không trật tự II:
Mô phỏng máy tính
I. Giới thiệu

Mô phỏng nhằm giúp sinh viên hiểu rõ về động học và nhiệt động lực học của quá trình trật tự và không
trật tự trong hệ hợp kim hai cấu tử. Thông qua mô phỏng, sinh viên có thể hiểu tại sao hợp kim tồn tại ở
trạng thái trật tự và không trật tự (ví dụ: do quá trình nhiệt động lực học), cấu trúc trật tự trong tinh thể
như thế nào (tinh thể học), và các thông số trật tự biến đổi theo thời gian ra sao (chẳng hạn: do quá trình
động học). Sinh viên báo cáo kết quả mô phỏng và thực hiện bài tập xác suất thống kê sử dụng bộ tạo số
ngẫu nhiên.

Mô phỏng hay thực nghiệm đều dùng để đánh giá vật chất ở một số tính chất nhất định. Sự khác biệt giữa
mô phỏng máy tính và thực nghiệm ở chỗ, kết quả mô phỏng phụ thuộc vào các quy tắc, mô hình được
được xây dựng khi mô phỏng. Trong khi thực nghiệm là quá trình xảy ra theo quy luật tự nhiên. Thông
qua mô phỏng có thể đánh giá tính hợp lý của các mô hình để dự đoán tính chất của vật liệu.

Phụ lục -E.V.1 bao gồm các thông tin hướng dẫn cách đăng nhập, chạy chương trình và các thông tin liên
quan khác. Tham khảo chương trình mô phỏng ở Phụ lục -E.V.2.

II. Bài tập xác suất thống kê:

A. Khái quát:

Một số mô phỏng trong thí nghiệm này liên quan đến tính xác suất (chuyển biến trật tự-không trật tự,
bước ngẫu nhiên, bài toán xác suất Gamble), một số liên quan đến tính tất định “deterministic” (khử
khí/giải hấp phụ). “Tính tất định” nghĩa là khi mô phỏng, nếu đầu vào như nhau thì luôn tạo kết quả tương
tự. Trong khi với tính xác suất, kết quả có thể khác nhau qua các lần chạy chương trình. Trước tiên, cần
hiểu rõ các khái niệm cơ bản về xác suất thống kê, các biến cố xác suất để giải thích quá trình kết quả mô
phỏng. Trong quá trình mô phỏng, sử dụng bộ tạo số ngẫu nhiên, RNG, sẽ cung cấp giá trị trong khoảng 0
<R <1 thông qua hàm ranno (ix) (Chương trình: Rangene.f), trong đó, ix là tham số đầu vào. Khi chương
trình chạy sẽ tạo ra một chuỗi các số ngẫu nhiên trong tệp dữ liệu.

B. Bộ tạo số ngẫu nhiên

Thực hiện các bước sau:

i) Đâu tiên, chạy chương trình tạo số ngẫu nhiên với N = 30, nghĩa là tạo danh sách 30 số ngẫu
nhiên.

ii) Tạo biểu đồ (Histogram) trong khoảng từ 0 đến 1 với kích thước phân khoảng 0,1.
1
iii) Xác định giá trị trung bình <x>, bình phương trung bình <x2> và độ phân tán <x2> - <x>2.

iv) Lập lại các tính toán với các giá trị N tăng lên (30, 90, 270, 810 và 2430). Vẽ đường biểu diễn
các giá trị trung bình, <x>, bình phương trung bình <x 2> và độ phân tán <x2> - <x>2 theo N.
Xây dựng biểu đồ với N=30 và N=2,430.

v) Áp dụng lý thuyết thống kê và đưa ra biểu thức toán học đối với giá trị trung bình, bình
phương trung bình và độ phân tán là hàm của N.

vi) Lập bảng kết quả mô phỏng và kết quả lý thuyết xác suất phân tích. Từ đó, so sánh giữa hai
kết quả, chỉ ra sự khác biệt và giải thích.

C. Trò chơi súc sắc: (Trò chơi công bằng)

Một trong những ứng dụng của bộ tạo số ngẫu nhiên là mô phỏng tung con súc sắc, mang lại giá trị
nguyên từ 1 đến 6. Bộ tạo số ngẫu nhiên tạo ra vùng giá trị 0<R<1. Để mô phỏng tung con súc sắc, cần có
sự tương ứng giữa giá trị tạo bởi hàm ranno (ix) và số trên mặt súc sắc. Giá trị tương ứng này được mô tả
bởi hàm sau:

Num = INT(6*ranno (ix) +1.

Hàm INT là hàm lấy giá trị nguyên gần nhất của một số đã cho (ví dụ: INT (4,7) = 4)

Thực hiện các bước sau:

i) Chạy chương trình với N=10, 100, 1,000 và vẽ histogram (1 đến 6 với kích thước phân khoảng
là 1). Xác định giá trị trung bình.

ii) Từ kết quả mô phỏng, xác định giá trị trung bình <x>, bình phương trung bình <x2> và độ
phân tán <x2> - <x>2 theo N.

iii) Áp dụng lý thuyết xác suất và đưa ra biểu thức toán học mô tả các giá trị trên (<x>, <x2> ,<x2>
- <x>2 ) là hàm của N.

iv) Lập bảng kết quả mô phỏng và kết quả từ lý thuyết xác suất, từ đó so sánh và giải thích sự
khác nhau.

D. Trò chơi súc sắc (trò chơi không trung thực)

Trong phần này, bài toán đưa ra là tung con súc sắc với xác suất xuất hiện mặt sáu chấm gấp đôi so với
các mặt khác, và các mặt khác còn lại có xác suất xảy ra như nhau. Vẽ biểu đồ phân bố (histogram) các
mặt xuất hiện sau một số lần tung súc sắc.

i) Tìm giá trị trung bình. Chọn N = 1,000.

2
ii) Sử dụng lý thuyết xác suất tìm biểu thức toán học đối với giá trị trung bình, so sánh kết
quả ’thí nghiệm’ và lý thuyết.

III. Trật tự và không trật tự hóa học

Trong hệ hợp kim hai cấu tử A-B, nếu tương tác giữa hai nguyên tử A-B (khác nhau) mạnh hơn tương tác
giữa A-A và B-B (giống nhau), thì các nguyên tử có xu hướng sắp xếp theo cấu trúc trật tự sao cho số liên
kết A-B là lớn nhất khi đó năng lượng bên trong hợp kim có xu hướng thấp nhất. Hình 1 mô tả trật tự cấu
trúc giống nhau giữa các nguyên tử A và B trong không gian hai chiều: siêu mạng tinh thể (ô mạng được
kí hiệu bởi hình nét liền), phân mạng (mạng con) của A và B (ô mạng được kí hiệu bởi hình đứt đoạn).
Khi mạng con được điền đầy bởi các nguyên tử tương ứng thì hợp kim trật tự hoàn toàn. Hợp kim A-B sẽ
mất trật tự hoàn toàn khi 50% mạng con của A bị chiếm ngẫu nhiên bởi nguyên tử B. Đối với hợp kim
gần trật tự hoàn toàn, tồn tại một sô nút mạng lỗi, gọi là khuyết tật điểm.

Hình. 1. Siêu mạng tinh thể hai chiều chứa hai mạng tinh thể con.

Cho hợp kim A - B với 50% nguyên tử A và năng lượng tương tác giữa các nguyên tử: V AA = VBB = -0,2
eV và VAB = -0,6 eV. Trả lời ngắn gọn cho các câu hỏi dưới đây:

- Năng lượng trật tự là gì?

- Tại sao hệ thống trở nên mất trật tự với năng lượng tương tác như vậy?

- Thông số trật tự xa của hợp kim thay đổi theo theo thời gian như thế nào?

Mức độ trật tự xa được đánh giá bởi tỉ phần của mạng con chiếm bởi các nguyên tử. Thông số trật tự xa
được xác định bởi:

rA – XA
Thông số trật tự xa = Ɵ = LRO =
1 - XA
Trong đó rA là tỉ phần của mạng con A chiếm bởi nguyên tử A, XA là nồng độ nguyên tử A. Rõ ràng rằng,
nếu XA < 50% (tức là không phải đúng công thức AB) thì hợp kim này không bao giờ ở trạng thái trật tự

3
hoàn toàn, bởi vì luôn có một số vị trí nút mạng con của A bị chiếm bởi nguyên tử B. Một thông số khác
thể hiện tính trật tự là thông số trật tự gần. Thông số trật tự gần xác định bởi biểu thức sau:

PAB – PAB (random)


Thông số trật tự gần = Ɵ = SRO = PAB(max) – PAB (random)

Trong đó PAB là số liên kết AB trong hợp kim, PAB(random) là số liên kết AB trong dung dịch ngẫu nhiên;
PAB(max) là số liên kết AB lớn nhất.

Độ ưu tiên trật tự được mô tả bởi năng lượng trật tự:

 = VAB – (VAA+VBB)/2

Trong đó, VAA, VBB, VAB năng lượng tương tác giữa nguyên tử AA, BB và AB. Khi liên kết AA và BB bị
thay thế bởi hai liên kết AB thì năng lượng trật tự cho biết độ giảm năng lượng trên mỗi nguyên tử. Nếu
   giảm năng lượng bên trong sẽ thúc đẩy hợp kim ở trạng thái trật tự. Nếu    hợp kim có xu
hướng mất trật tự.

Trong khi các tương tác giữa các nguyên tử có xu hướng đưa về cấu trúc trật tự, thì entropy S luôn làm
mất trật tự bên trong vật chất, đặc biệt ở nhiệt độ cao, thông qua năng lượng tổng của hệ được xác định
bởi G = H-TS. Năng lượng trật tự  sẽ thay đổi rất lớn từ hệ này sang hệ khác. Chẳng hạn, đối với hệ
Cu3Au trật tự ở dưới nhiệt độ tới hạn (T C ~ 390oC), và mất trật tự khi T > T C. Nhiệt độ tới hạn này phụ
thuộc vào năng lượng tương tác giữa các nguyên tử. Quá trình trật tự hóa và mất trật tự thực chất là quá
trình khuếch tán. Nếu ta tôi hợp kim Cu 3Au từ nhiệt độ gần điểm nóng chảy, ở đó hợp kim là hệ mất trật
tự, xuống dưới nhiệt độ chuyển hóa trật tự-mất trật tự Tc, ban đầu hệ vẫn mất trật tự, nhưng sau đó hệ dần
dần chuyển thành trật tự theo thời gian. Ngược lại, nếu ta nung nhanh hợp kim trật tự lên tới nhiệt đô lớn
hơn Tc, hợp kim sẽ dần chuyển thành mất trật tự. Rất khó xác định tốc độ quá trình trật tự hóa của vật liệu
sau tôi bằng phương pháp phân tích vì rất phức tạp. Do vậy, mô phỏng máy tính có thể xử lý được vấn đề
này.

Mô phỏng sẽ bắt đầu với lựa chọn hệ trật tự hoặc mất trật tự hoàn toàn. Khi hệ ban đầu mất trật tự, năng
lượng trật tự (VAA, VBB, và VAB) sẽ được lựa chọn sao cho hệ có xu hướng trật tự. Mục đích của mô
phỏng này là xác định được hệ thống trở thành trạng thái cuối cùng nhanh như thế nào (động học), và ảnh
hưởng của nhiệt độ và năng lượng trật tự đến động học ra sao. Giả thiết mô phỏng chỉ với một lỗ trống,
nguyên tử sẽ nhảy theo cơ chế lỗ trống. Dưới nhiệt độ trật tự, xu thế hình thành trật tự ưu tiên hơn là mất
trật tự. Mô phỏng với thông số đầu vào như: số bước nhảy lỗ trống (n), năng lượng tương tác giữa các
nguyên tử, nhiệt độ và nồng độ của nguyên tố “B”, và trạng thái ban đầu của hệ (trật tự, hay không trật tự).
Dữ liệu đầu ra bao gồm trạng thái trật tự (thông số trật tự gần và xa hoặc cấu hình nguyên tử mất trật tự
sau khi nhảy n vị trí (xem chương trình).
4
Mô phỏng động học của trật tự và không trật tự
Mô phỏng máy tính quá trình chuyển đổi trật tự-không trật tự bao gồm hai phần:
(A) Mô phỏng hợp kim có trạng thái ban đầu là trật tự xa (LRO = 1,0, nồng độ nguyên tử “B” P=0,5,
nhiệt độ T = 2,000 K)
(i) Chọn năng lượng tương tác: VAA= VBB= -0,125 eV và VAB = -0.05 eV. Năng lượng trật tự là gì?.
Tại sao hệ trở nên mất trật tự với năng lượng tương tác như vậy?.
(ii) Chạy mô phỏng với N=1. Cho cấu trúc nguyên tử sau 1 lần nhảy (tại thời điểm 0).
(iii) Chạy ba mô phỏng với N=100, 1,000, 10,000.
(iv) Vẽ cấu trúc hợp kim (phân bố nguyên tử) với N=1 và N=10,000, hiển thị bằng hình ảnh trạng thái
mất trật tự.
(v) Sử dụng LRO tạo ở bước (iii), vẽ LRO so với bước mô phỏng và giải thích ngắn gọn kết quả quan
sát được.
Lưu ý: Các tệp ordera.res, orderb.res, và orderv.res sẽ bị ghi đè khi chạy chương trình do vậy mỗi khi mô
phỏng cần được lưu với tên khác nhau với mỗi giá trị N để sử dụng cho lần sau.
(B) Mô phỏng hợp kim với trạng thái ban đầu mất trật tự (LRO=0,0, nồng độ của nguyên tử “B” P=0,5)
(i) Chọn năng lượng tương tác: VAA = VBB = -0.125 eV and VAB=-0.25eV. Chọn nhiệt độ T=1,000K.
Năng lượng trật tự là gì? Năng lượng này, hợp kim có xu hướng trật tự hay không?
(ii) Chạy mô phỏng với N=1. Đưa ra cấu trúc ban đầu của hợp kim.
(iii) Chạy mô phỏng với N=100, 1,000, 10,000 and 100,000\
(iv) Vẽ cấu trúc hợp kim ở thời điểm ban đầu và sau 10,000 bước mô phỏng, hiển thị hình ảnh quá
trình trật tự.
(v) Sử dụng LRO tạo ở bước (iii), vẽ LRO so với bước mô phỏng và giải thích ngắn gọn kết quả quan
sát được.
Ghi Chú:
 Chương trình: 2d-ordering
 Thông số đầu vào:
# tổng số bước nhảy lỗ trống, nstep # of SRO và LRO đo được, nout trật tự ban bầu, ninit
Nhiệt độ (K), temp Nồng độ nguyên tử “B”, bcon
Năng lương tương tác AA, Vaa Năng lương tương tác BB, Vbb Năng lượng tương tác AB, Vab

 Chương trình bắt đầu với cả trạng thái mất trật tự (ninit=0) và trật tự (ninit=1),
 Tỉ lệ trật tự phụ thuộc và nhiệt độ và năng lượng tương tác.
 Đầu ra:
+ Tệp với số thông số trật tự, nout, sro (thông số trật tự gần) và lro (thông số trật tự xa), ở khoảng
thời gian nhất định.
+ Ba tệp về tọa độ của các nguyên tử A, B và vị trí lỗ trống, đối với trạng thái cuối cùng trật tự và
không trật tự.

5
PHỤ LỤC – E-IV.1

Chạy chương trình mô phỏng

Các thông tin liên quan sẽ được xử lý trong suốt quá trình thí nghiệm.

PHỤ LỤC – E-IV.2


Fortran Codes mô phỏng

6
Program main
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c Congruential Randon Number Generator
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
real*8 alea, aver, avsq, dev, ranno
integer*4 i,n, iseed

c parameter ( n=100)
aver=0.d0
avsq=0.d0
dev=0.d0
iseed=1234567
c
read(*,*) n
c
100 format(i5, f12.4)
do 10 i=1,n
alea=ranno(iseed)
write(*,100) i, alea
aver=aver+alea
avsq=avsq+alea*alea
10 continue
aver=aver/n
avsq=avsq/n
dev=avsq-aver**2
110 format(i4, 3f12.4)
write(*,*)'========================================='
write(*,*) ' n <x> <x^2> <x^2> - <x>^2 '
write(*,110) n,aver, avsq, dev
write(*,*)'========================================='
stop
end
c
c Function ranno(n)
c
double precision function ranno(ix)
integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

7
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c Dice Game
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
Program main
real*8 aver, ranno
integer*4 i,n,iseed, nbr
c parameter (n=100)
c
c open(unit=5, file='dice.txt', status='old')
read(*,*) n
c close(5)
c
11 format(I10)
write(*,*) ' n='
write(*,11) n
aver=0.d0
iseed=1234567
100 format(2i5)
do 10 i=1,n
nbr=1+int(ranno(iseed)*6.0)
write(*,100) i, nbr
aver=aver+ real(nbr)
10 continue

aver=aver/n
110 format(i4, f12.4)
write(*,*)'======================================'
write(*,*) ' n <x>'
write(*,110) n,aver
write(*,*)'======================================'
stop
end

double precision function ranno(ix)


integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

8
Program main
c Dishonest Dice Game
real*8 aver, ranno, nbr1, nbr2
integer*4 i,n,iseed,n1,n2,ntot,navg
read(*,*) n
11 format(I10)
write(*,*) ' n='
write(*,11) n
aver=0.d0
iseed=58326
navg=0
100 format(i5,2i10, i15)
open(unit=7, file='kq_dice.txt')
write(7,*) ' games first dice second dice total '
do 10 i=1,n
nbr1=ranno(iseed)
nbr2=ranno(iseed)
if(nbr1.gt.714285714) then
n1=6
elseif (nbr2.gt.714285714) then
n2=6
else
n1=1+int(nbr1*7.0)
n2=1+int(nbr2*7.0)
endif
ntot=n1+n2
navg=navg+ntot
write(7,100) i, n1, n2, ntot
10 continue
110 format (i5, i15)
navg=navg/n
write(7,*)'====================================='
write(7,*) ' n average total of two dice '
write(7,110) n, navg
write(7,*)'====================================='
stop
end
c
c Function ranno(n)
c
double precision function ranno(ix)
integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c Chemical Ordering and Disordering
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
9
implicit none
integer ns, noutmx, nssq
parameter(ns=30, noutmx=1000)
parameter(nssq=ns*ns)
integer site(ns,ns), nn(ns,ns), nout, ninit
integer modl(-1:ns+2), vacx, vacy, nvec(2,4)
integer i,ii,j,jj,k,kk,x(4),y(4), natot, nbtot
integer*4 iseed, nstep
real vaa,vab,vbb,temp,tempk,bconc
real texpaa(0:3), texpab(0:3), texpbb(0:3)
real sro(noutmx), lro(noutmx), time(noutmx), atime
real w(4), dtime, wcumul, xx, yy
real*8 ranno, ran
c
c ns - so cac nut ( site) theo truc x hoac y
c nssq=ns*ns - tong so cac nut trong khong gian hai chieu xy
c nstep- Tong so cac buoc nhay cua lo trong (vacancy)
c nout- so cac lan do gia tri sro va lro
c noutmx- gia tri nout lon nhat
c ninit - neu =1 thi can xay dung cau hinh TRAT TU;
c #1 thi xay dung cau hinh MAT TRAT TU
c
c tempk - nhiet do Kelvin
c bconc - Nong do nguyen to B
c vaa, vab, vbb - nang luong lien ket A-A; A-B; B-B
c site(ns,ns) - Mang cho biet nut site(i,j) do nguyen tu nao chiem
c 1: Nguyen tu A
c 0: Lotrong ( vacancy)
c -1: Nguyen tu B
c vacx,vacy: toa do cua vacancy tai thoi diem dang xet
c nn(ns,ns): Mang luu so cac n/tu A xung quanh mot site(i,j)
c modl(-1:ns+2): cho phan du cua phep chia cho ns ( tru modl(ns))
c nvec(2,4): mang luu gia tri x=nvec(1,i); y=nvec(2,i) cua 4 vecto lan can
c w(4): Mang luu tan so nhay
c wcumul: tong cua 4 gia tri w(i)
c dtime - thoi gian giua hai lan nhay
c atime - thoi gian tinh den moi lan nhay dau tien
c time(nout)- tong thoi gian
c sro(nout); lro(nout): gia tri sro va lro
c Output: cac file ordera.res; orderb.res, orderv.res la cac tep chua vi tri
c cua A, B va vacancy
c Dung software bat ky de ve lai sap xep nguyen tu.
c
c Khai bao mang site(ns,ns) = 1; va mang nn(ns,ns) =0 cho moi phan tu
data site, nn/nssq*1, nssq*0/
c Khai bao mang sro=0.0; lro=0.0; gia tri noutmx=0.0
data sro, lro, time/noutmx*0.0, noutmx*0.0, noutmx*0.0/
c
c Reading data from file order.dat'
c open(unit=5, file='order.dat', status='old')
read(*,*) nstep, nout, ninit
read(*,*) tempk, bconc
read(*,*) vaa, vab, vbb
c close(5)
c
iseed=1234567
11 format(3I10)
22 format(2F12.2)
33 format(3F12.4)
write(*,*) ' Input nstep nout ninit'
write(*,11) nstep, nout, ninit
write(*,*) ' Input tempk bconc'
write(*,22) tempk, bconc

10
write(*,*) ' Input vaa vab vbb'
write(*,33) vaa, vab, vbb
temp=tempk/11604.9
c
do 10 i=0,3
texpaa(i)=exp(i*vaa/temp)
texpab(i)=exp(i*vab/temp)
texpbb(i)=exp(i*vbb/temp)
10 continue

do 20 i=1,ns+2
modl(i)=mod(i,ns)
if (modl(i).le.0) modl(i)=modl(i)+ns
20 continue

nvec(1,1)=1
nvec(2,1)=0
nvec(1,2)=-1
nvec(2,2)=0
nvec(1,3)=0
nvec(2,3)=1
nvec(1,4)=0
nvec(2,4)=-1

nbtot=nint(bconc*real(ns)**2)
natot=ns**2-nbtot

if(ninit.ne.1) then
do 30 i=1, nbtot
35 continue
j=int(ranno(iseed)*real(ns))+1
jj=int(ranno(iseed)*real(ns))+1
if(site(j,jj).eq.1) then
site(j,jj)=-1
else
goto 35
endif
30 continue
else
k=0
do 36 j=1,ns
do 37 i=1,ns,2
if (mod(j,2).eq.0) then
site(i+1,j)=-1
else
site(i,j)=-1
endif
k=k+1
if(k.eq.nbtot) goto 38
37 continue
36 continue
endif

38 continue
j=int(ranno(iseed)*real(ns))+1
jj=int(ranno(iseed)*real(ns))+1
site(j,jj)=0
vacx=j
vacy=jj
c
c Computing the number of a nearest neighbors of any site
c
do 40 i=1, ns

11
do 50 j=1,ns
do 60 k=1,4
ii=modl(i+nvec(1,k))
jj=modl(j+nvec(2,k))
if(site(ii,jj).eq.1) nn(i,j)=nn(i,j)+1
60 continue
50 continue
40 continue
c
c Calculating initial sro and lro parameters
c
time(1)=0
do 240 ii=1,ns
do 250 j=1,ns
if(site(ii,jj).lt.0) sro(1)=sro(1)+real(nn(ii,jj))
250 continue
240 continue
sro(1)=sro(1)/(real(ns)**2)
sro(1)=sro(1)-4.0*bconc*(1.0-bconc)
do 260 jj=1,ns
do 270 ii=1,ns,2
if(mod(jj,2).eq.0) then
if(site(jj,2).eq.1) lro(1)=lro(1)+1
else
if(site(ii,jj).eq.1) lro(1)=lro(1)+1
endif
270 continue
260 continue
lro(1)=abs(2.0*lro(1)/real(natot)-1.0)
c
c Monter-Carlo loop
c
atime=0.0
dtime=0.0
nstep=nstep/nout
do 100 i=1, nout
do 110 j=1, nstep
c
c Computing the four jump frequencies
c
do 115 k=1,4
x(k)=modl(vacx+nvec(1,k))
y(k)=modl(vacy+nvec(2,k))
if(site(x(k),y(k)).eq.1) then
w(k)=texpaa(nn(x(k),y(k)))*texpab(3-nn(x(k),y(k)))
else
w(k)=texpab(nn(x(k),y(k)))*texpbb(3-nn(x(k),y(k)))
endif
115 continue
c
c Choosing the jump to be performed
c
dtime=1.0/(w(1)+w(2)+w(3)+w(4))
wcumul=0.0
ran=ranno(iseed)/dtime
do 120 k=1,4
wcumul=wcumul+w(k)
if(ran.le.wcumul) goto 125
120 continue
125 continue
atime=atime+dtime
c
c Updating neighborhoods and position

12
c
if(site(x(k),y(k)).eq.1) then
do 130 kk=1,4
xx=modl(x(k)+nvec(1,kk))
yy=modl(y(k)+nvec(2,kk))
nn(xx,yy)=nn(xx,yy)-1
130 continue
do 135 kk=1,4
xx=modl(vacx+nvec(1,kk))
yy=modl(vacy+nvec(2,kk))
nn(xx,yy)=nn(xx,yy)+1
135 continue
endif
site(vacx,vacy)=site(x(k),y(k))
vacx=x(k)
vacy=y(k)
site(vacx,vacy)=0
110 continue
time(i+1)=atime
c
c Calculating sro and lro parameters
c

do 140 ii=1,ns
do 150 jj=1,ns
if(site(ii,jj).lt.0) sro(i+1)=sro(i+1)+real(nn(ii,jj))
150 continue
140 continue
sro(i+1)=sro(i+1)/(real(ns)**2)
sro(i+1)=sro(i+1)-4.0*bconc*(1.0-bconc)
do 160 jj=1,ns
do 170 ii=1,ns,2
if(mod(jj,2).eq.0) then
if(site(ii+1,jj).eq.1) lro(i+1)=lro(i+1)+1
else
if(site(ii,jj).eq.1) lro(i+1)=lro(i+1)+1
endif
170 continue
160 continue
lro(i+1)=abs(2.0*lro(i+1)/real(natot)-1.0)
100 continue
c
c Writing output
c
open(unit=6, file='order.txt')
111 format(2f12.2)
112 format(f20.4,2f8.4)
Write(6,*) ' Temperature bconc'
Write(6,111) tempk, bconc
Write(6,*) ' Time sro lro'
do 200 i=1,nout+1
Write(6,112) time(i), sro(i), lro(i)
200 continue
c
c Storing the last configuration
c
open(unit=7, file='ordera.res')
open(unit=8, file='orderv.res')
open(unit=9, file='orderb.res')
do 300 i=1,ns
do 310 j=1,ns
if(site(i,j).eq.1) then
write(7,*) i,j

13
else if(site(i,j).eq.0) then
write(8,*) i,j
else
write(9,*) i,j
endif
310 continue
300 continue
close(7)
close(8)
close(9)
stop
end
c
c Function ranno(n)
c
double precision function ranno(ix)
integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

14
MSE – 2023 Sự hình thành tổ chức tế vi vật liệu

Khuếch tán trong chất rắn II:

Mô phỏng máy tính

I. Giới thiệu

Mục tiêu của mô phỏng máy tính là củng cố sự hiểu biết về khuếch tán trong chất rắn. So sánh kết quả mô
phỏng với kết quả được đưa ra bằng giải pháp định luật Fick và các phép đo thực nghiệm sẽ cho biết quá
trình khuếch tán của các nguyên tử cơ bản.

Khuếch tán trong chất rắn là sự dịch chuyển ngẫu nhiên của các nguyên tử với số lượng lớn trong vật liệu.
Hiển nhiên, khó có thể thực hiện tính toán với số lượng lớn các nguyên tử do sự hạn chế trong quá trình
mô phỏng máy tính. Do vậy, phương pháp mô phỏng cần phải đơn giản hóa. Trong thí nghiệm này, có ba
phương pháp sẽ được sử dụng để nghiên cứu sự khuếch tan trong chất rắn. So sánh kết quả mô phỏng có
được so với phương pháp giải tích các phương trình khuếch tán Fick.

Phụ lục E.VII.1. bao gồm các thông tin hướng dẫn cách đăng nhập, chạy chương trình và các thông tin
liên quan khác. Tham khảo chương trình ở Phụ lục E.VII.2.

II. Mô phỏng khuếch tán I: Bước ngẫu nhiên

A. Bước ngẫu nhiên không lệch một chiều:

Phần lớn các vấn đề khuếch tán liên quan đến bài toán bước ngẫu nhiên. Chẳng hạn xem xét một người
bước sang trái hoặc sang phải từng bước theo thời gian. Có thể sử dụng đồng xu để xác định cách đi: mặt
ngửa sang phải, mặt sấp sang trái. Đối với dịch chuyển xa, có thể xác định độ dịch chuyển (chuyển vị), và
độ dịch chuyển bình phương trung bình là hàm của số bước thực hiện, N (N là thông số đầu vào của
chương trình). Số bước thực hiện cần đủ lớn để có số liệu thống kê đáng tin cậy. Số lượng lớn các bước
ngẫu nhiên có thể được thực hiện mô phỏng trong một thời gian ngắn. Ở đây, chúng ta sử dụng chương
trình con ranno, bộ tạo số ngẫu nhiên để xác định hướng dịch chuyển. Nếu số ngẫu nhiên nằm trong
khoảng từ 0,5 đến 1,0 thì bước ngẫu nhiên dịch chuyển theo một hướng và nếu số ngẫu nhiên nằm trong
khoảng từ 0,0 đến 0,5 thì dịch chuyển theo hướng ngược lại. Thực hiện các bước như sau:

i) Thực hiện mô phỏng cho n =1,000 tại N =10, 100, 1,000 và 10,000
ii) Thực hiện mô phỏng cho N =1,000 tại n = 10, 100, 1,000 và10,000
15
iii) Vẽ <x> và (<x2>-<x>2) là hàm của các bước (vẽ N trên thang đo log)
iv) Giải thích kết quả theo các khái niệm xác suất cơ bản
v) Lập bảng, so sánh và thảo luận ngắn gọn về kết quả từ mô phỏng máy tính và lý thuyết xác suất
phân tích cho bước đi ngẫu nhiên.
Ghi chú:

 Chương trình: rundwalkId


 Các thông số đầu vào: # tổng số bước nhảy (n), # tổng số bước trên bước nhảy (N), xác suất hướng sang phải [P(r) =
0,50].

B. Bước ngẫu nhiên lệch hướng một chiều

Trong nhiều trường hợp, nguyên tử không dịch chuyển tự do mà bị chịu tác động bởi các lực liên kết.
Chẳng hạn xem xét trò chơi pinball, viên bi có thể nhảy ở mọi hướng nhưng thường ổn định ở vị trí đế do
trọng lực. Hay ví dụ khác, chẳng hạn một giọt mực lan truyền trong dòng nước di chuyển: giọt mực lan
truyền cục bộ khi nó cuốn theo dòng chảy. Bây giờ hãy xem xét các nguyên tử khuếch tán trong một
trường lực (chẳng hạn như tạp chất tích điện trong môi trường điện môi trong điện trường).

Do điện trường, rào cản năng lượng cao hơn đối với một nguyên tử nhảy sang trái so với nhảy phải (hình
1). Tốc độ nhảy sang trái là oexp[-(H+)/kT] và sang phải là oexp[-(H-)/kT]. Ở đây H là năng
lượng hoạt hóa không lệch,  là độ lệch năng lượng, k là hằng số Boltzmann và T là nhiệt độ tuyệt đối.
Xác suất nhảy được tính từ tỷ lệ nhảy tương đối, ví dụ:

Tỷ lệright
Xác suấtPhải = Tỷ lệphải + Tỷ lệTrái
Chạy mô phỏng sau:

i) Đầu tiên, biến đổi T trong khi H và  không đổi với H=1eV và =0.05eV. Mô phỏng tính
toán xác suất nhảy với T=1,000, 1,500 và 2,000K. Cố định tổng số bước N = 50 và tổng số
bước nhảy n = 1,000. Mô phỏng bước ngẫu nhiên với ba xác suất nhảy đã được tính toán trước
đó.

ii) Biến đổi  (=0.025, 0.05 và 0.1eV) trong khi giữ cố định các biến khác (H= 1eV, T=1,000K,
N=50, n=1,000). Tính toán bộ ba xác suất nhảy. Chạy bước nhảy ngẫu nhiên lệch hướng với
bộ ba điều kiện như vậy.

iii) Giữ xác suất nhảy cố định (với H=1eV, =0.075eV, T=1,000K, n=1,000), biến đổi N. Mô
phỏng bước ngẫu nhiên với N=10, 50, 220, 1,000.

Trong báo cáo, hãy vẽ giá trị trung bình (<x>) và độ phân tán (<x 2>-<x>2) với các biến khác nhau trong
ba bài mô phỏng ở trên. Giải thích định lượng xu hướng độ phân tán và giá trị trung bình.
16
Bước nhảy không lệch hướng

Năng lượng
ΔH ΔH

Khoảng cách

Bước nhảy lệch hướng

H- H+
Năng lượng

Khoảng cách
Hình.1. Thế năng của nguyên tử khuếch tán là hàm của vị trí nguyên tử trong mạng tinh thể

Ghi chú:
 Chương trình: randwalkId
 Đặt P(r) thích hợp trong dữ liệu đầu vào
 Chương trình sẽ tạo ra độ dịch chuyển trung bình, độ dịch chuyển bình phương trung bình, độ lệch bình phương trung
bình.

III. Mô phỏng khuếch tán II: Thoát cacbon

Cacbon có độ hòa tan nhất định trong sắt. Với hàm lượng cacbon đủ lớn sẽ liên kết với sắt tạo nên hợp
chất hóa học Fe3C rất ổn định tồn tại trong dung dịch. Bằng cách nào để thoát cacbon trong sắt. Cần có
chất kết hợp với cacbon mà có năng lượng hoạt hóa (năng lượng tự do mol riêng phần) thấp hơn so với Fe.
Khi đó cacbon sẽ kết hợp với nguyên tố tạo hợp chất có năng lượng hoạt hóa thấp hơn và thoát ra khỏi sắt.
Oxy là một trong những nguyên tố khi kết hợp với cacbon với thế hóa học thấp. Nhiệt hình thành CO 2 là -
360Kj/mol nhỏ hơn nhiệt hình thành Fe 3C. Trong dung dịch rắn Fe, cacbon có thể nhảy sang phải hoặc
trái. Chỉ những nguyên tử cacbon sát bề mặt dễ dàng kết hợp với nguyên tử oxy và thoát khỏi ra khỏi Fe
17
(C+1/2O2 = CO, Go<<0). Quá trình này trải qua những bước nhảy ngẫu nhiên bên trong dung dịch Fe.
Để tiết kiệm thời gian tính toán, không xem xét khía cạnh các nguyên tử cacbon đơn lẻ mà chỉ xét các
phiến nguyên tử cacbon song song với bề mặt và chúng có thể nhảy đồng thời sang trái hoặc phải với xác
suất 50-50 (Hình. 2.)

Hình. 2. Sơ đồ biểu diễn mô phỏng thoát cacbon.

i) Vẽ nồng độ cacbon là hàm của các bước nhảy nguyên tử.

ii) Chứng minh biểu đồ khuếch tán là hàm căn bậc hai thời gian, nghĩa là ở bất kỳ nồng độ
cacbon nào dịch chuyển phân bố theo khoảng cách là hàm căn bậc hai thời gian.

iii) So sánh kết quả thu được với hàm sai số.

iv) Tại sao biến động với biên độ lớn theo thời gian (chú ý: điều kiện biên trong mô phỏng).

v) Với tần suất nhảy và khoảng cách nhảy đối với C trong Fe tại 1000 oC, xác định thời gian cần
thiết làm nghèo cacbon trong phần đầu tấm thép dày 1mm với hàm lượng cacbon nhỏ hơn
50% giá trị ban đầu. (khoảng cách nhảy = 3Å, tần suất nhảy = 2×109/s).

Ghi chú:

 Chương trình: Desorption

 Tham số đầu vào: # tổng số bước (nstep=1,000), # tổng số đầu ra (nout=5)

 Đưa ra có số cụ thể, nout, của các tệp đầu ra, mà mỗi tệp mô tả biểu đồ giải hấp phụ sau
nstep/nout*(1,2,3 .. nout). (ví dụ. Với nstep=1,000 và nout=5, tệp dữ liệu đầu ra desorp.out1 sẽ
sau 200 lần nhẩy, desorp.out2 sẽ sau 400 lần nhảy, desorp.out5 sẽ sau 1,000 lần nhảy)

 Hãy chạy chương trình. Khi tất cả tệp đầu ra được vẽ trên cùng một biểu đồ, cho thấy tiến trình
thoát cacbon theo thời gian.
18
 Chú ý, mỗi sự phân bố về nguyên tắc là một hàm sai số. Khi so sánh với hàm sai số, cần phác họa
đồng thời hàm sai số và sự phân bố có được trên cùng một hệ trục tọa độ.

19
PHỤ LỤC– E-VI.1

Chạy chương trình mô phỏng máy tính

Các thông tin liên quan sẽ được xử lý trong suốt quá trình thí nghiệm.

PHỤ LỤC – E-VI.2


Fortran Codes mô phỏng

20
Program main
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c Random Walk of a particle on a one-dim lattice
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

integer stepmax, runmax, r,s


integer*4 iseed
real*8 ranno, right, loc, avloc, avlocsq, sigma
iseed=1234567
loc=0.0
avloc=0.0
avlocsq=0.0
c
c Reading the data
c
c open(unit=5, file='runwalk1d.data', status='old')
c n =1000; stepm·=1000; right=0.5
read(*,*) runmax, stepmax, right
c close(5)
c
c Main loop

c
do 50 r=1,runmax
do 100 s=1, stepmax
if(ranno(iseed).gt.right) then
loc=loc-1
else
loc=loc+1
endif
100 continue
avloc=avloc+loc
avlocsq=avlocsq+loc*loc
loc=0.0
50 continue
avloc=avloc/runmax
avlocsq=avlocsq/runmax
sigma=avlocsq-avloc*avloc
200 format (2I8, f12.4)
210 format (2f8.4, f12.4)
write(*,*) ' RESULTS'
write(*,*)'==================================='
write(*,*) ' runs jumps P-to-right'
write(*,200) runmax, stepmax, right
write(*,*) 'aver.loc aver.sq. displ.sigma'
write(*,210) avloc, avlocsq, sigma
write(*,*)'===================================='
stop
end
c
c Function ranno(n)
c
double precision function ranno(ix)
integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16

21
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

22
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c One-dimension Desorption
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
implicit none
integer*4 nc, npinit,noutmx
parameter(nc=100, npinit=1000, noutmx=50)
integer*4 npout(noutmx,nc), np(nc), npp(nc)
integer*4 i,j,k,nstep,nout,iseed
real*8 ranno
data np,npp/nc*npinit, nc*npinit/
iseed=1234567
c
c Reading the data
c
c open(unit=5, file='desorption.txt', status='old')
read(*,*) nstep, nout
c close(5)
c nstep=1000
c nout=5
11 format(2I10)
write(*,*) ' nstep nout'
write(*,11) nstep, nout
nstep=nstep/nout
c
c Main loop
c
do 10 i=1,nout
do 20 j=1,nstep
do 30 k=2,nc-1
npp(k)=nint(0.5*(real(np(k-1))+ranno(iseed)-0.5))
npp(k)=npp(k)+nint(0.5*(real(np(k+1))+ranno(iseed)-0.5))
30 continue
npp(1)=nint(0.5*(real(np(2))+ranno(iseed)-0.5))
npp(nc)=nint(0.5*(real(np(nc-1))+ranno(iseed)-0.5))
npp(nc)=npp(nc)+nint(0.5*(real(np(nc))+ranno(iseed)-0.5))
do 40 k=1,nc
np(k)=npp(k)
40 continue
20 continue
do 50 k=1,nc
npout(i,k)=np(k)
50 continue
10 continue
c
c Writing the results
c
do 60 i=1,nout
j=9+i
open(unit=j,file='desorp.out'//char(48+i))
do 70 k=1,nc
write(j,*) k, npout(i,k)
70 continue
close(j)
60 continue
end
c
c Function ranno(n)
c
double precision function ranno(ix)
integer*4 a,p,ix,b15,b16,xhi,xalo,leftlo,fhi,k
real*8 inverse
parameter (inverse=4.65661287d-10)
parameter (a=16807)

23
parameter (b15=32786)
parameter (b16=65536)
parameter (p=2147483647)
xhi=ix/b16
xalo=(ix-xhi*b16)*a
leftlo=xalo/b16
fhi=xhi*a+leftlo
k=fhi/b15
ix=(((xalo-leftlo*b16)-p)+(fhi*b15)*b16)+k
if (ix.lt.0) ix=ix+p
ranno=dfloat(ix)*inverse
continue
return
end

Mẫu mô phỏng được chia thành 100 slabs ( lớp ); trên mỗi lớp hàm lượng C là như nhau. Trong quá trình
mô phỏng, C sẽ nhảy từ lớp này sang lớp khác và dữ liệu được ghi vào nout=5 tệp
desorption.out1 ….desorption.out5:

npout(i,k): i=1,nout; k=1,nc: mảng lưu chữ hàm lượng C ở file thứ i; lớp k

np(k) và npp(k): là mảng lưu trữ hàm lượng C tạm thời ở lớp k

nc=100: số các salbs cần chia

npinit=1000: Giá trị khởi dầu của ham lượng C

24

You might also like