⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcpdf.m

📁 The EM Wave MATLAB Library consists of a collection of MATLAB programs related to electromagnetic wa
💻 M
字号:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%                             mcpdf.m                               %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Main program for the Monte Carlo simulations of pair distribution 
% functions and the creation of a series of random realizations of 
% particle positions
% -- Part of the Electromagnetic Wave MATLAB Library (EWML)--
%    <http://www.emwave.com/>

% Original: by K.H. Ding, November 1998

% Input Parameters
ntot=input('Enter total number of spheres : ');
fv=input('Enter fractional volume of spheres (< 0.4) : ');
cnst=input('Enter maximum displacement (< 1) : ');
npsr=input('Enter number of passes for each realization : ');
nrlz=input('Enter total number of realizations : ');
seed=input('Enter seed for random numbers : ');

vol=1.0;
rho=ntot/vol;
da=(6.0*fv/pi/rho)^(1.0/3.0);
nd=fix(1.0/da);
ncell=nd*nd*nd;
dl=1.0/nd;
ntpas=npsr*nrlz;
dinc=1.0/ntot/ntpas;
rgmax=5.;
srgmax=rgmax*da;
if srgmax >= 0.5
  srgmax=0.5;
end
rgmax=srgmax/da;
del=cnst*da;

if ncell < ntot
  fprintf('\n Number of Spheres > Number of Cells ==> STOP ! \n');
  break
end

if dl <= da
  fprintf('\n Diameter > Cell Length ==> STOP ! \n');
  break
end

fpos=fopen('pos.dat','w+');
fpdf=fopen('pdf.dat','w+');

% initial regular setting of spheres
xrow=zeros(1,ntot);
yrow=zeros(1,ntot);
zrow=zeros(1,ntot);
da2=ones(ntot,ntot);
da2=da*da*da2;
np=0;
for i=0:nd-1
  if np > ntot
    break
  else
    for j=0:nd-1
      if np > ntot
        break
      else
        for k=0:nd-1
          np=np+1;
          if np > ntot
            break
          else
            xrow(np)=(k+0.5)*dl;
            yrow(np)=(j+0.5)*dl;
            zrow(np)=(i+0.5)*dl;
          end
        end
      end
    end
  end
end

mg=40;
ddcst=4.0*pi*(ntot-1.0)*rho*da*da*da/3.0;
dgr=(rgmax-1.0)/mg;
r=zeros(1,mg);
ddr=zeros(1,mg);
f=zeros(1,mg);
fmn=zeros(1,mg);
g=zeros(1,mg);
for n=1:mg
  rl=1.0+n*dgr;
  rs=rl-dgr;
  r(n)=sqrt((rl*rl+rs*rs)/2.0);
  ddr(n)=rl*rl*rl-rs*rs*rs;
end

rand('seed',seed);

erow=ones(1,ntot);
ecol=ones(ntot,1);
move=zeros(ntot,1);
stay=ones(ntot,1);
rx=zeros(ntot,ntot);
ry=zeros(ntot,ntot);
rz=zeros(ntot,ntot);
rr2=zeros(ntot,ntot);
ix=zeros(ntot,ntot);

% initial random setting shuffling
fprintf('\n Initial Shuffling Starts ... \n');
acp=0.0;
ovp=0.0;
for ir=1:npsr
  ranx=erow-2.0*rand(1,ntot);
  rany=erow-2.0*rand(1,ntot);
  ranz=erow-2.0*rand(1,ntot);
  xtry=xrow+del*ranx;
  ytry=yrow+del*rany;
  ztry=zrow+del*ranz;
  xtry=xtry-fix(2.0*xtry-erow);
  ytry=ytry-fix(2.0*ytry-erow);
  ztry=ztry-fix(2.0*ztry-erow);
  xtry=xtry-fix(2.0*xtry-erow);
  ytry=ytry-fix(2.0*ytry-erow);
  ztry=ztry-fix(2.0*ztry-erow);

% check separation between pairs of spheres
  rx=xtry'*erow-ecol*xrow;
  ry=ytry'*erow-ecol*yrow;
  rz=ztry'*erow-ecol*zrow;
  rx=rx-fix(2.0*rx);
  ry=ry-fix(2.0*ry);
  rz=rz-fix(2.0*rz);
  rr2=rx.^2+ry.^2+rz.^2;
  for i=1:ntot
     rr2(i,i)=da*da;
  end
  gt=rr2 >= da2;
  for i=1:ntot
    move(i)=all(gt(i,:));
  end
  stay=ecol-move;
  xrow=move'.*xtry+stay'.*xrow;
  yrow=move'.*ytry+stay'.*yrow;
  zrow=move'.*ztry+stay'.*zrow;
  for i=1:ntot
    acp=acp+dinc*move(i);
    ovp=ovp+dinc*stay(i);
  end
end
fprintf('\n acceptance rate = %8.4f \n',acp);
fprintf(' overlaping rate = %8.4f \n',ovp);
fprintf('\n Initial Shuffling Done !!! \n');

% Monte Carlo shuffling
ir=0;
acp=0.0;
ovp=0.0;

fprintf('\n Monte Carlo Shuffling Starts ... \n');
for ip=1:ntpas
  ipp=ip-npsr;
  while ipp > 0
    ipp=ipp-npsr;
  end

  ranx=erow-2.0*rand(1,ntot);
  rany=erow-2.0*rand(1,ntot);
  ranz=erow-2.0*rand(1,ntot);
  xtry=xrow+del*ranx;
  ytry=yrow+del*rany;
  ztry=zrow+del*ranz;
  xtry=xtry-fix(2.0*xtry-erow);
  ytry=ytry-fix(2.0*ytry-erow);
  ztry=ztry-fix(2.0*ztry-erow);
  xtry=xtry-fix(2.0*xtry-erow);
  ytry=ytry-fix(2.0*ytry-erow);
  ztry=ztry-fix(2.0*ztry-erow);

% check separation between pairs of spheres
  rx=xtry'*erow-ecol*xrow;
  ry=ytry'*erow-ecol*yrow;
  rz=ztry'*erow-ecol*zrow;
  rx=rx-fix(2.0*rx);
  ry=ry-fix(2.0*ry);
  rz=rz-fix(2.0*rz);
  rr2=rx.^2+ry.^2+rz.^2;
  for i=1:ntot
    rr2(i,i)=da*da;
  end
  gt=rr2 >= da2;
  for i=1:ntot
    move(i)=all(gt(i,:));
  end
  stay=ecol-move;
  xrow=move'.*xtry+stay'.*xrow;
  yrow=move'.*ytry+stay'.*yrow;
  zrow=move'.*ztry+stay'.*zrow;
  for i=1:ntot
    acp=acp+dinc*move(i);
    ovp=ovp+dinc*stay(i);
  end

% tabulate the occurance of pair separations
  fmn=f;
  rx=xrow'*erow-ecol*xrow;
  ry=yrow'*erow-ecol*yrow;
  rz=zrow'*erow-ecol*zrow;
  rx=rx-fix(2.0*rx);
  ry=ry-fix(2.0*ry);
  rz=rz-fix(2.0*rz);
  rr2=rx.^2+ry.^2+rz.^2;
  ix=fix((sqrt(rr2/da/da)-1.0)/dgr)+1;
  for i=1:ntot
    for j=1:ntot
      if ix(i,j) >= 1 & ix(i,j) <= mg
        fmn(ix(i,j))=fmn(ix(i,j))+1.0;
      end
    end
  end
  f=fmn;

  if ipp == 0
    ir=ir+1;
    fprintf('\n     realization = %6u \n',ir);
    fprintf('            pass = %6u \n',ip);
    fprintf(' acceptance rate = %8.4f \n',acp);
    fprintf(' overlaping rate = %8.4f \n',ovp);
%   output position
    fprintf(fpos,'%6u \n',ir);
    for np=1:ntot
      fprintf(fpos,'%8.4f %8.4f %8.4f \n',xrow(np),yrow(np),zrow(np));
    end
  end
end

fprintf(' \n\n');
fprintf(' total acceptance rate = %8.4f \n',acp);
fprintf(' total overlaping rate = %8.4f \n',ovp);
fprintf('\n Monte Carlo Shuffling Done !!! \n');

% output pair distribution function
for jj=1:mg
  g(jj)=f(jj)/ddcst/ddr(jj)/ntpas;
  fprintf(fpdf,'%8.4f %8.4f \n',r(jj),g(jj));
end
fclose(fpos);
fclose(fpdf);

% plot pair distribution function
% (requires output of pypdf.m)
% clear;
% load pdf.dat -ascii;
% figure;
% plot(pdf(:,1),pdf(:,2),'ro');
% axis([0.0,5.0,0.0,4.0]);
% xlabel('r/d ');
% ylabel('g(r) ');
% legend('Monte Carlo');

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -