找回密码
 注册
Simdroid-非首页
查看: 520|回复: 11

【共享】自己写的一个关于Monte Carlo模拟晶粒长大的代码

[复制链接]
发表于 2010-1-4 15:26:31 | 显示全部楼层 |阅读模式 来自 湖南长沙
本帖最后由 messenger 于 2010-1-4 17:52 编辑

自己下载附件吧,代码注解很清楚了,有什么不足的大家给点意见吧

  1. %初始赋值
  2. Ln=200;        %格点边长
  3. L=zeros(Ln);   %格点矩阵
  4. Q=120;         %总取向数
  5. step_num=500;  %MC总步数
  6. interval_save_jpg=20;         %图形存储间隔
  7. interval_stastics=2;          %晶粒平均参数和相对密度统计间隔
  8. stastics_data=zeros(step_num/interval_stastics,5);           %存储每interval_stastics次MCS后的平均晶粒尺寸和相对密度,存储格式为(MCS,grain count,average area,average diameter,relative density)


  9. %烧结模拟过程参数赋值
  10. T=1;    %温度参数
  11. J1=1;   %晶界能


  12. %初始结构的格点赋值
  13. rand_l=randperm(Ln^2);
  14. for i=1:Ln^2*V_pore
  15.     if rem(rand_l(i),Ln)==0
  16.         x=Ln;
  17.         y=fix(rand_l(i)/Ln);
  18.       else
  19.         x=rem(rand_l(i),Ln);
  20.         y=fix(rand_l(i)/Ln)+1;
  21.     end
  22.     L(x,y)=-1;  %标识孔洞区域
  23. end
  24. for i=(Ln^2*V_pore+1):Ln^2
  25.     if rem(rand_l(i),Ln)==0
  26.         x=Ln;
  27.         y=fix(rand_l(i)/Ln);
  28.       else
  29.         x=rem(rand_l(i),Ln);
  30.         y=fix(rand_l(i)/Ln)+1;
  31.     end
  32.     rand_Q=randperm(Q);
  33.     L(x,y)=rand_Q(1);  %标识晶粒区域
  34. end

  35. temp_L=zeros(Ln+2);    %标识边界区域标示为0,便于后续处理
  36. temp_L(2:Ln+1,2:Ln+1)=L;
  37. L=temp_L;
  38. Ln=Ln+2;               %此时L边长Ln=Ln+2

  39. s=[-1 -1
  40.    -1  0
  41.    -1  1
  42.     0 -1
  43.     0  1
  44.     1 -1
  45.     1  0
  46.     1  1];     %便于随即选取所选格点周围相邻的一个格点


  47. %开始CAS模拟
  48. for step=1:step_num
  49.    
  50.     step   %显示MCS进程
  51.    
  52.     rand_l=randperm(Ln^2);
  53.    
  54.     for i=1:Ln^2    %随机选取格点
  55.         
  56.         %if rem(i,1000)==0  %显示选取格点进程
  57.         %    i
  58.         %end
  59.         
  60.         if rem(rand_l(i),Ln)==0   %把rand_l(i)转换成实际坐标L(x,y)
  61.             x=Ln;
  62.             y=fix(rand_l(i)/Ln);
  63.           else
  64.             x=rem(rand_l(i),Ln);
  65.             y=fix(rand_l(i)/Ln)+1;
  66.         end
  67.         
  68.         if L(x,y)~=0  %如果格点不在边界区域则开始模拟
  69.             
  70.             %---------------------如果选取点为晶粒格点---------------------
  71.             if L(x,y)~=-1  %如果选取点为晶粒格点
  72.                
  73.                 ss=s+[x y; x y; x y; x y; x y; x y; x y; x y];      %存储所选晶粒格点L(x,y)周围格点坐标
  74.                
  75.                 diff_grain_count=0;      %计数所选晶粒格点L(x,y)周围与之不同的晶粒格点数
  76.                 same_grain_count=0;      %计数所选晶粒格点L(x,y)周围与之相同的晶粒格点数
  77.                 diff_ss=zeros(8,3);      %存储所选晶粒格点L(x,y)周围与之不同的晶粒格点坐标及其取向度值
  78.                 for ii=1:8
  79.                     if L(ss(ii,1), ss(ii,2))~=0
  80.                         if L(ss(ii,1), ss(ii,2))~=L(x,y) & L(ss(ii,1), ss(ii,2))~=-1
  81.                             diff_grain_count=diff_grain_count+1;
  82.                             diff_ss(diff_grain_count,1)=ss(ii,1);
  83.                             diff_ss(diff_grain_count,2)=ss(ii,2);
  84.                             diff_ss(diff_grain_count,3)=L(ss(ii,1),ss(ii,2));
  85.                         end
  86.                         if L(ss(ii,1), ss(ii,2))==L(x,y)
  87.                             same_grain_count=same_grain_count+1;
  88.                         end
  89.                         if L(ss(ii,1), ss(ii,2))==-1
  90.                             pore_count=pore_count+1;
  91.                         end
  92.                     end
  93.                 end
  94.                 total_grain_count=diff_grain_count+same_grain_count;
  95.                
  96.                 if diff_grain_count~=0  %如果所选晶粒格点L(x,y)周围有与之不同的晶粒格点
  97.                     
  98.                     BG_energy=J1*diff_grain_count;    %BG_energy为格点所处晶界能
  99.                     
  100.                     diff_ss_1=diff_ss(1:diff_grain_count,3);      %diff_ss_1存储被选格点周围取向度值与之不同的格点取向度值
  101.                     diff_ss_2=unique(diff_ss_1);                  %去除diff_ss_1中的重复元素,并存储到diff_ss_2
  102.                     rand_ll=randperm(length(diff_ss_2));
  103.                     temp_Q=diff_ss_2(rand_ll(1));
  104.                     change_BG_energy=J1*(total_grain_count-length(find(diff_ss_1==temp_Q)));
  105.                     
  106.                     if change_BG_energy<=BG_energy
  107.                         L(x,y)=temp_Q;
  108.                     end
  109.                     
  110.                     if change_BG_energy>BG_energy
  111.                         set_probability=rand();
  112.                         if exp(-(change_BG_energy-BG_energy)/T)>=set_probability
  113.                             L(x,y)=temp_Q;
  114.                         end
  115.                     end
  116.                     
  117.                 end  %对应于如果所选晶粒格点L(x,y)周围有与之不同的晶粒格点
  118.                
  119.             end  %对应于如果选取点为晶粒格点
  120.             %---------------------如果选取点为晶粒格点---------------------
  121.             
  122.         end  %对应于如果格点不在边界区域则开始模拟
  123.         
  124.     end    %对应于随机选取格点
  125.    
  126.     %========================================================后处理过程========================================================
  127.    
  128.     %后处理1开始---------------每interval_save_jpg次MCS后存储图形矩阵---------------%
  129.     if rem(step,interval_save_jpg)==0
  130.         figure1=figure('visible','off','PaperPosition',[3.067 9.28 14.81 11.1],'PaperSize',[20.98 29.68]);
  131.         axes1 = axes('Layer','top','YDir','reverse','Parent',figure1);
  132.         axis(axes1,[0.5 Ln-2+0.5 0.5 Ln-2+0.5]);
  133.         image1 = image('CData',L(2:Ln-2+1,2:Ln-2+1),'CDataMapping','scaled','XData',[1 Ln],'YData',[1 Ln],'Parent',axes1);
  134.         if V_pore==0
  135.             jpg_name=strcat(num2str(step),'_','Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.jpg');
  136.          else
  137.             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');
  138.         end
  139.         saveas(image1,jpg_name,'jpg');
  140.     end
  141.     %后处理1结束---------------每interval_save_jpg次MCS后存储图形矩阵---------------%
  142.    
  143.    
  144.     %后处理2开始---------------每interval_stastics次MCS后统计平均晶粒尺寸,并存入stastics_data中---------------%
  145.     if rem(step,interval_stastics)==0
  146.         
  147.         stastics_data(step/interval_stastics,1)=step;       %存储此次step
  148.         
  149.         temp_L=L(2:Ln-1,2:Ln-1);      %去掉标示为0的边界
  150.         Q_exist=unique(temp_L);       %Q_exist存储L矩阵中仍存在的晶粒取向度Q
  151.         if Q_exist(1)==-1
  152.             Q_exist=Q_exist(2:length(Q_exist));
  153.         end
  154.         Q_length=length(Q_exist);     %Q_length为L矩阵中仍存在的晶粒取向度个数(不包括孔洞)
  155.         
  156.         for qq=1:Q_length             %只统计具有在L矩阵中仍存在的取向度的晶粒的个数
  157.             temp_L=L;
  158.             temp_L(temp_L~=Q_exist(qq))=0;
  159.             temp_L=bwlabel(temp_L,8);
  160.             now_grainnum=max(max(temp_L));       %返回目前取向度为Q_exist(qq)的晶粒数目
  161.             stastics_data(step/interval_stastics,2)=stastics_data(step/interval_stastics,2)+now_grainnum;       %累加晶粒个数
  162.         end
  163.         
  164.         stastics_data(step/interval_stastics,3)=(Ln-2)^2*(1-V_pore)/stastics_data(step/interval_stastics,2);       %统计晶粒平均面积
  165.         
  166.         stastics_data(step/interval_stastics,4)=sqrt(stastics_data(step/interval_stastics,3));                     %统计晶粒平均直径
  167.          
  168.     end
  169.     %后处理2结束---------------每interval_stastics次MCS后统计平均晶粒尺寸,并存入stastics_data中---------------%
  170.    
  171.    
  172.     %========================================================后处理过程========================================================
  173.    
  174. end
  175. %结束MCS模拟


  176. %写入文件
  177. if V_pore==0
  178.     xls_name1=strcat('stastics_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.xls');
  179.     xls_name2=strcat('grainsize_Ln=',num2str(Ln-2),'_','Q=',num2str(Q),'_','T=',num2str(T),'_','J1=',num2str(J1),'.mat');
  180. else
  181.     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');
  182.     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');
  183. end
  184. xlswrite(xls_name1,stastics_data);
  185. save(xls_name2,'stastics_grainsize');
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

发表于 2010-1-4 17:54:38 | 显示全部楼层 来自 浙江杭州
Simdroid开发平台
很好。为了查看方便,我将代码贴出来了,这样便於大家讨论。
回复 不支持

使用道具 举报

发表于 2010-1-15 10:26:42 | 显示全部楼层 来自 北京
晶粒生长是不是受限的晶体生长,有什么规律?
回复 不支持

使用道具 举报

发表于 2010-4-20 21:33:26 | 显示全部楼层 来自 江苏南京
本帖最后由 scott198510 于 2010-4-20 21:37 编辑

3# nostalgica
这是我用元胞自动机编写的一个程序的效果图,
我想问问楼组,你用的Monte Carlo模拟晶粒生长的的程序运行不了,提示错误啊,楼组,我想和你交流交流啊  我的QQ:307874142

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-4-20 21:36:37 | 显示全部楼层 来自 江苏南京
4# scott198510


再附上一个我的二值图吧

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2010-5-7 18:54:39 | 显示全部楼层 来自 大连理工大学
把你的程序也附上行不?
回复 不支持

使用道具 举报

发表于 2010-5-7 19:33:59 | 显示全部楼层 来自 大连理工大学
2 1# luners
代码不全。V_pore是什么?
回复 不支持

使用道具 举报

发表于 2010-5-7 20:41:41 | 显示全部楼层 来自 江苏南京
1# luners

楼组,想和你交流交流
回复 不支持

使用道具 举报

发表于 2010-5-10 10:52:05 | 显示全部楼层 来自 北京朝阳
同七楼问:V_pore代表的是什么
回复 不支持

使用道具 举报

发表于 2010-9-8 15:10:44 | 显示全部楼层 来自 浙江杭州
楼组,程序代码是什么语言呀??多谢!

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-9-12 23:10:50 | 显示全部楼层 来自 湖南长沙
楼主是搞什么专业的啊?我是材料专业的,有空可以交流一下~~
邮箱:ou.yang.bin.csu@gmail.com

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-11-16 15:53:35 | 显示全部楼层 来自 华南理工大学
楼主怎么不出来回答问题啊

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 15:08 , Processed in 0.064716 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表