%初始赋值

Ln=200;        %格点边长

L=zeros(Ln);   %格点矩阵

Q=120;         %总取向数

step_num=500;  %MC总步数

interval_save_jpg=20;         %图形存储间隔

interval_stastics=2;          %晶粒平均参数和相对密度统计间隔

stastics_data=zeros(step_num/interval_stastics,5);           %存储每interval_stastics次MCS后的平均晶粒尺寸和相对密度,存储格式为(MCS,grain count,average area,average diameter,relative density)

%烧结模拟过程参数赋值

T=1;    %温度参数

J1=1;   %晶界能

%初始结构的格点赋值

rand_l=randperm(Ln^2);

for i=1:Ln^2*V_pore

if rem(rand_l(i),Ln)==0

x=Ln;

y=fix(rand_l(i)/Ln);

else

x=rem(rand_l(i),Ln);

y=fix(rand_l(i)/Ln)+1;

end

L(x,y)=-1;  %标识孔洞区域

end

for i=(Ln^2*V_pore+1):Ln^2

if rem(rand_l(i),Ln)==0

x=Ln;

y=fix(rand_l(i)/Ln);

else

x=rem(rand_l(i),Ln);

y=fix(rand_l(i)/Ln)+1;

end

rand_Q=randperm(Q);

L(x,y)=rand_Q(1);  %标识晶粒区域

end

temp_L=zeros(Ln+2);    %标识边界区域标示为0,便于后续处理

temp_L(2:Ln+1,2:Ln+1)=L;

L=temp_L;

Ln=Ln+2;               %此时L边长Ln=Ln+2

s=[-1 -1

-1  0

-1  1

0 -1

0  1

1 -1

1  0

1  1];     %便于随即选取所选格点周围相邻的一个格点

%开始CAS模拟

for step=1:step_num

step   %显示MCS进程

rand_l=randperm(Ln^2);

for i=1:Ln^2    %随机选取格点

%if rem(i,1000)==0  %显示选取格点进程

%    i

%end

if rem(rand_l(i),Ln)==0   %把rand_l(i)转换成实际坐标L(x,y)

x=Ln;

y=fix(rand_l(i)/Ln);

else

x=rem(rand_l(i),Ln);

y=fix(rand_l(i)/Ln)+1;

end

if L(x,y)~=0  %如果格点不在边界区域则开始模拟

%---------------------如果选取点为晶粒格点---------------------

if L(x,y)~=-1  %如果选取点为晶粒格点

ss=s+[x y; x y; x y; x y; x y; x y; x y; x y];      %存储所选晶粒格点L(x,y)周围格点坐标

diff_grain_count=0;      %计数所选晶粒格点L(x,y)周围与之不同的晶粒格点数

same_grain_count=0;      %计数所选晶粒格点L(x,y)周围与之相同的晶粒格点数

diff_ss=zeros(8,3);      %存储所选晶粒格点L(x,y)周围与之不同的晶粒格点坐标及其取向度值

for ii=1:8

if L(ss(ii,1), ss(ii,2))~=0

if L(ss(ii,1), ss(ii,2))~=L(x,y) & L(ss(ii,1), ss(ii,2))~=-1

diff_grain_count=diff_grain_count+1;

diff_ss(diff_grain_count,1)=ss(ii,1);

diff_ss(diff_grain_count,2)=ss(ii,2);

diff_ss(diff_grain_count,3)=L(ss(ii,1),ss(ii,2));

end

if L(ss(ii,1), ss(ii,2))==L(x,y)

same_grain_count=same_grain_count+1;

end

if L(ss(ii,1), ss(ii,2))==-1

pore_count=pore_count+1;

end

end

end

total_grain_count=diff_grain_count+same_grain_count;

if diff_grain_count~=0  %如果所选晶粒格点L(x,y)周围有与之不同的晶粒格点

BG_energy=J1*diff_grain_count;    %BG_energy为格点所处晶界能

diff_ss_1=diff_ss(1:diff_grain_count,3);      %diff_ss_1存储被选格点周围取向度值与之不同的格点取向度值

diff_ss_2=unique(diff_ss_1);                  %去除diff_ss_1中的重复元素,并存储到diff_ss_2

rand_ll=randperm(length(diff_ss_2));

temp_Q=diff_ss_2(rand_ll(1));

change_BG_energy=J1*(total_grain_count-length(find(diff_ss_1==temp_Q)));

if change_BG_energy<=BG_energy

L(x,y)=temp_Q;

end

if change_BG_energy>BG_energy

set_probability=rand();

if exp(-(change_BG_energy-BG_energy)/T)>=set_probability

L(x,y)=temp_Q;

end

end

end  %对应于如果所选晶粒格点L(x,y)周围有与之不同的晶粒格点

end  %对应于如果选取点为晶粒格点

%---------------------如果选取点为晶粒格点---------------------

end  %对应于如果格点不在边界区域则开始模拟

end    %对应于随机选取格点

%========================================================后处理过程========================================================

%后处理1开始---------------每interval_save_jpg次MCS后存储图形矩阵---------------%

if rem(step,interval_save_jpg)==0

figure1=figure('visible','off','PaperPosition',[3.067 9.28 14.81 11.1],'PaperSize',[20.98 29.68]);

axes1 = axes('Layer','top','YDir','reverse','Parent',figure1);

axis(axes1,[0.5 Ln-2+0.5 0.5 Ln-2+0.5]);

image1 = image('CData',L(2:Ln-2+1,2:Ln-2+1),'CDataMapping','scaled','XData',[1 Ln],'YData',[1 Ln],'Parent',axes1);

if V_pore==0

jpg_name=strcat(num2str(step),'_','Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.jpg');

else

jpg_name=strcat(num2str(step),'_','Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','Vpore=',num2str(V_pore),'_','T=',num2str(T),'_','J1=',num2str(J1),'_','J2=',num2str(J2),'.jpg');

end

saveas(image1,jpg_name,'jpg');

end

%后处理1结束---------------每interval_save_jpg次MCS后存储图形矩阵---------------%

%后处理2开始---------------每interval_stastics次MCS后统计平均晶粒尺寸,并存入stastics_data中---------------%

if rem(step,interval_stastics)==0

stastics_data(step/interval_stastics,1)=step;       %存储此次step

temp_L=L(2:Ln-1,2:Ln-1);      %去掉标示为0的边界

Q_exist=unique(temp_L);       %Q_exist存储L矩阵中仍存在的晶粒取向度Q

if Q_exist(1)==-1

Q_exist=Q_exist(2:length(Q_exist));

end

Q_length=length(Q_exist);     %Q_length为L矩阵中仍存在的晶粒取向度个数(不包括孔洞)

for qq=1:Q_length             %只统计具有在L矩阵中仍存在的取向度的晶粒的个数

temp_L=L;

temp_L(temp_L~=Q_exist(qq))=0;

temp_L=bwlabel(temp_L,8);

now_grainnum=max(max(temp_L));       %返回目前取向度为Q_exist(qq)的晶粒数目

stastics_data(step/interval_stastics,2)=stastics_data(step/interval_stastics,2)+now_grainnum;       %累加晶粒个数

end

stastics_data(step/interval_stastics,3)=(Ln-2)^2*(1-V_pore)/stastics_data(step/interval_stastics,2);       %统计晶粒平均面积

stastics_data(step/interval_stastics,4)=sqrt(stastics_data(step/interval_stastics,3));                     %统计晶粒平均直径

end

%后处理2结束---------------每interval_stastics次MCS后统计平均晶粒尺寸,并存入stastics_data中---------------%

%========================================================后处理过程========================================================

end

%结束MCS模拟

%写入文件

if V_pore==0

xls_name1=strcat('stastics_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.xls');

xls_name2=strcat('grainsize_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.mat');

else

xls_name1=strcat('stastics_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','Vpore=',num2str(V_pore),'_','T=',num2str(T),'_','J1=',num2str(J1),'_','J2=',num2str(J2),'.xls');

xls_name2=strcat('grainsize_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','Vpore=',num2str(V_pore),'_','T=',num2str(T),'_','J1=',num2str(J1),'_','J2=',num2str(J2),'.mat');

end

xlswrite(xls_name1,stastics_data);

save(xls_name2,'stastics_grainsize');

matlab模拟晶粒生长,一个有monte caro 模拟晶粒生长的Matlab源程序相关推荐

  1. matlab怎么求一个三元一次方程组的解,用MATLAB求解一个带参数的三元一次方程组,求大神指点!...

    想求一个方程组,改了很多遍都还是出错,请求大神指点 . 代码如下 i=[1 2 3]; %编号为1的机械臂 r=50; %动平台半径 R=210; 想求一个方程组,改了很多遍都还是出错,请求大神指点 ...

  2. 在我方某前沿防守地域 matlab,[matlab]Monte Carlo模拟学习笔记

    理论基础:大数定理,当频数足够多时,频率可以逼近概率,从而依靠概率与$\pi$的关系,求出$\pi$ 所以,rand在Monte Carlo中是必不可少的,必须保证测试数据的随机性. 用蒙特卡洛方法进 ...

  3. matlab模拟角度调制系统的仿真与设计,基于Matlab的模拟通信系统的仿真设计

    <基于Matlab的模拟通信系统的仿真设计>由会员分享,可在线阅读,更多相关<基于Matlab的模拟通信系统的仿真设计(25页珍藏版)>请在人人文库网上搜索. 1.目录摘要-第 ...

  4. 使用 Engage 或 Workspace 创建 Monte Carlo 模拟的 4 个简单步骤

    20 世纪 40 年代,研究原子弹的科学家应用 Monte Carlo 模拟计算了一个裂变铀原子引起另一个裂变反应的概率,这是该模拟的首次应用,自此以来已经取得了很大进展.今天我们将介绍如何使用 Mi ...

  5. java模拟使用接口,关于java:模拟一个类与模拟它的接口

    对于单元测试,我需要模拟几个依赖项.依赖项之一是实现接口的类: public class DataAccessImpl implements DataAccess { ... } 我需要设置一个这个类 ...

  6. JAVA同时输入用户名和密码_用java模拟设计一个简单的“用户注册”程序。当用户输入用户名和密码时,单击“注...

    用java模拟设计一个简单的"用户注册"程序.当用户输入用户名和密码时,单击"注 2020 - 9 - 26 TAG : 所有功能均已实现,如有不满意的地方我再修改imp ...

  7. Python__模拟实现一个ATM+购物商城程序

    需求:模拟实现一个ATM+购物商城程序1.额度1500或者自定义2.实现购物商城,买东西加入购物车,调用信用卡接口3.可以提现,手续费5%4.支持账户登录5.支持账户间转账6.记录每日日常消费流水7. ...

  8. 用c++模拟实现一个学生成绩管理系统

    https://blog.csdn.net/yanxiaolx/article/details/53393437 题目:用c++模拟实现一个学生成绩的信息管理系统,要求能添加.删除.修改.查看和保存学 ...

  9. 【重难点】【JUC 03】怎么实现一个线程安全的队列、手写模拟实现一个阻塞队列

    [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 文章目录 [重难点][JUC 03]怎么实现一个线程安全的队列.手写模拟实现一个阻塞队列 一.怎么实现一个线程安全的队列 ...

  10. c语言网络定向拉取数据,用C模拟了一个http请求,但是recv函数接收的数据不完整且欠安顺序获取信息...

    用C模拟了一个http请求,但是recv函数接收的数据不完整且不安顺序获取信息 用C模拟了一个http请求,但是recv函数接收的数据不完整且不安顺序获取信息 我把代码贴上 #include #inc ...

最新文章

  1. 敏捷开发必备的管理工具
  2. 三星又推出新工具啦!Gear VR 可以兼容多个视频
  3. Android 的源代码结构
  4. javascript array添加图片_史上最全的web前端面试题汇总及答案JavaScript之二(二)...
  5. windows7 + vs2008 + oracle + iis7 客户端配置成功
  6. pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展
  7. linux Packet socket (1)简单介绍
  8. win7c盘空间越来越小_电脑一分钟小技巧:如何更改电脑桌面路径?
  9. Python爬虫入门五之URLError异常处理
  10. eclipse 输入卡顿_解决eclipse卡顿
  11. U盘插入电脑无反应,坏了?不存在的
  12. ubuntu 的重要一课
  13. 谭浩强C语言(第三版)习题6.11
  14. houdini 破解失败
  15. CDR有哪些常用的快捷键
  16. xdb 服务_oracle XDB的问题,端口、http服务
  17. 公司局域网如何组建 公司局域网搭建方法
  18. 【论文笔记】Enhancing Adversarial Example Transferability with an Intermediate Level Attack
  19. linux控制cpu占用率
  20. centos7和win7双系统安装

热门文章

  1. 呼叫压力测试软件,MyComm呼叫中心压力测试解决方案
  2. 【IMX6ULL笔记】--内核底层驱动初步探究
  3. Python源码阅读(一)
  4. python中判断字符串是否为空方法
  5. Java毕设项目电商后台管理系统计算机(附源码+系统+数据库+LW)
  6. XMind 8 Pro 激活破解
  7. 【Android 逆向】Android 逆向通用工具开发 ( PC 端工具 hacktool 启动 main 函数分析 | hacktool 工程中的核心类 HackCommand 分析 )
  8. 算法:限流之令牌桶算法实现
  9. 【保姆级】-spotfire服务端、客户端安装部署(V7.8)
  10. 少量代码完成火山图绘制