Professional Documents
Culture Documents
299
Appendix E: Matlab Subroutines
( 6XEURXWLQHVWRLQWHUSRODWHH[WUDFWLRQDQGPRYHPHQW]RQHV
x_step=10;
z_step=10;
[XI,ZI]=meshgrid(min(x_exp(:,1))-10:x_step:max(x_exp(:,1))+10,0:z_step:max(x_exp(:,2)));
w = griddata(x_exp(:,1),x_exp(:,2),x_exp(:,3),XI,ZI,’linear’);
w_dp= griddata(x_exp_ndp(:,1),x_exp_ndp(:,2),x_exp_ndp(:,3),XI,ZI,’linear’);
mass=0:10:max(x_exp(:,3));
IMZ=zeros(length(mass)+1,3);
h=2;
for j=2:length(mass)+1
max_z=0;
for i=1:size(w,1)
if sum(w(i,:)<=mass(j-1))>0
max_z=ZI(i,1);
else
if sum(isfinite(w4(i,:)))>0
break;
end
end
end
l=find(ZI(:,1)==round(max_z/2-mod(max_z/2,z_step)));
l2=find(ZI(:,1)==round(max_z/4-mod(max_z/4,z_step)));
l3=find(ZI(:,1)==round(max_z*3/4-mod(max_z*3/4,z_step)));
if length(XI(l,(min(find(w4(l,:)<=mass(j-1))))))>0 && length(XI(l,(max(find(w4(l,:)<=mass(j-
1))))))>0
IMZ(h,1)=max_z;
IMZ(h,2)=(XI(l,max(find(w4(l,:)<=mass(j-1))))-XI(l,min(find(w(l,:)<=mass(j-1)))));
if length(XI(l2,(min(find(w4(l2,:)<=mass(j-1))))))>0 &&
length(XI(l2,(max(find(w(l2,:)<=mass(j-1))))))>0
IMZ(h,3)=(XI(l2,max(find(w4(l2,:)<=mass(j-1))))-XI(l2,min(find(w4(l2,:)<=mass(j-1)))));
end
if length(XI(l3,(min(find(w4(l3,:)<=mass(j-1))))))>0 &&
length(XI(l3,(max(find(w(l3,:)<=mass(j-1))))))>0
IMZ(h,4)=(XI(l3,max(find(w4(l3,:)<=mass(j-1))))-XI(l3,min(find(w(l3,:)<=mass(j-1)))));
end
IMZ(h,5)=mass(j-1);
h=h+1;
end; end
E.1.2 Data file “IEZ_interpolation.m”
%This program interpolates the extraction zone in three-dimensions
% Raw data is in x_exp(x,y,z,mass) file
% calculates drawzone dimensions and area
300
Appendix E: Matlab Subroutines
x_step=20;
y_step=20;
z_step=50;
[XI,YI,ZI]=meshgrid(min(x_exp(:,1))-10:x_step:max(x_exp(:,1))+10,min(x_exp(:,2))-
10:y_step:max(x_exp(:,2))+10,0:z_step:max(x_exp(:,3)));
w = griddata3(x_exp(:,1),x_exp(:,2),x_exp(:,3),x_exp(:,4),XI,YI,ZI);
for hh=1;
zi=round(max_z*(hh/4))-mod(max_z*(hh/4),z_step);
[xi6,yi6,zi6] = meshgrid(XI(1,:,1),YI(:,1,1),zi);
vi6 = interp3(XI,YI,ZI,w,xi6,yi6,zi6);
area(1,hh)=sum(sum(vi6(:,:)<=mass(j-1)))*x_step*y_step;
height_measured(1,hh)=zi;
end
%determine dimensions of IMZ/IEZ
if length((yi5((max(find(vi5(:,l)<=mass(j-1)))),l)))>0 && length(yi5((min(find(vi5(:,l)<=mass(j-
1)))),l))>0
IEZ_sideview(h,1)=yi5((max(find(vi5(:,l)<=mass(j-1)))),l)-(yi5((min(find(vi5(:,l)<=mass(j-
1)))),l));
IEZ_sideview(h,2)=max_z;
IEZ_sideview(h,3)=mass(j-1);
IEZ_sideview(h,4:6)=area;
IEZ_sideview(h,7:9)=height_measured;
h=h+1;
end
end
figure;plot(IEZ_sideview(:,2),IEZ_sideview(:,1),’.b’);
figure;plot(IEZ_sideview(:,3),IEZ_sideview(:,2),’.b’);
figure;plot(IEZ_sideview(:,3),IEZ_sideview(:,1),’.b’);
)XQFWLRQ³JULGGDWDP´
error(nargchk(5,7,nargin))
[msg,x,y,z,xi,yi] = xyzchk(x,y,z,xi,yi);
if ~isempty(msg), error(msg); end
if nargin == 7
if ~iscellstr(options)
error(’MATLAB:OptsNotStringCell’,...
’OPTIONS should be cell array of strings.’);
end
opt = options;
else
opt = [];
end
if sum(ind) > 0
warning(’MATLAB:griddata:DuplicateDataPoints’,[’Duplicate x-y data points ’ ...
’detected: using average of the z values.’]);
fs = find(ind(1:end-1) == 0 & ind(2:end) == 1);
fe = find(ind(1:end-1) == 1 & ind(2:end) == 0);
for i = 1 : length(fs)
% averaging z values
z(fe(i)) = mean(z(fs(i):fe(i)));
end
x = x(~ind(2:end));
y = y(~ind(2:end));
z = z(~ind(2:end));
end
switch lower(method),
case ’linear’
zi = linear(x,y,z,xi,yi,opt);
case ’cubic’
zi = cubic(x,y,z,xi,yi,opt);
case ’nearest’
zi = nearest(x,y,z,xi,yi,opt);
case {’invdist’,’v4’}
zi = gdatav4(x,y,z,xi,yi);
otherwise
303
Appendix E: Matlab Subroutines
siz = size(xi);
xi = xi(:); yi = yi(:); % Treat these as columns
x = x(:); y = y(:); % Treat these as columns
if isempty(tri),
warning(’MATLAB:griddata:CannotTriangulate’,’Data cannot be triangulated.’);
zi = repmat(NaN,size(xi));
return
end
304
Appendix E: Matlab Subroutines
( &$6)¶V$OJRULWKP
CASF could be executed calling CASF.m from the MATLAB command. This FDOOV RWKHU
VXEURXWLQHV³VHWBXSB&$6)´ZKLFKVHWXSWKHLQLWLDOPRGHOSDUDPHWHUV³extraction.m” which
simulates the extraction sequence, stores the extracted material and calls the CASF transition
functions for unconfined and confined granular flow.
%seed state if state if 0 use same seed number previous to each simulation
rand(’state’,0);
% use different seed number previous to each simulation for statistical analysis
%state_seed=sum(100*clock);
%rand(’state’,state_seed);
%boundary conditions
nz=round((3600+100)/b_dim_z); % measured from the drawpoint floor
nx=round(3300/b_dim_x);
ny=round(3300/b_dim_y);
a=zeros(nx,ny,nz);
aa=repmat((1:nx)’*(10^3),1,nx)+repmat(1:nx,nx,1);
%drawpoint dimensions
W_dp=round(120/b_dim_x);
H_db=round(400/b_dim_z);
H_dp=round(100/b_dim_z);
L_db=round(1200/b_dim_x);
alpha=22; %angle front view of drawbell
betha=0; % angle side view across drawbell
for i=1:nz
a(:,:,i)=(10^6)*i+aa;
end
for tt=1:drawbells
Pile_drawbell; % call for unconfined fu for all drawpoints
end
307
Appendix E: Matlab Subroutines
extr_level=1;
extractions=1;
for nb=1:drawbells
for active_drawpoint=1:dp % active drawpoints
if active_drawpoint==1
drawpoint=(active_drawpoint*nb*2)-1;
else
drawpoint=(active_drawpoint*nb);
end
mass_drawn=0;
while mass_drawn < 3 && waste(drawpoint)< 100 % stop at dilution entry & draw 3 kg each time
if active_drawpoint==1;
for i=1:H_dp
exit=a(ix(drawpoint,:),iy(drawpoint)-10:iy(drawpoint)-1,i);
ext=exit(exit~=0);
a(ix(drawpoint,:),iy(drawpoint)-10:iy(drawpoint)-1,i)=0;
waste(drawpoint)=sum(find(ext==-10^6))+waste(drawpoint);
if (length(ext)>0)
mass_drawn=length(ext)*m_block+mass_drawn;
% store in draw the extraction per drawpoint
blocks(drawpoint)=blocks(drawpoint)+length(ext);
w_blocks(drawpoint)=blocks(drawpoint)*m_block; % accumulate mass drawn
if waste(drawpoint)>0
dil(drawpoint)=dil(drawpoint)+1;
dilution{drawpoint}(dil(drawpoint),1:3)=[w_blocks(drawpoint),(waste(drawpoint)*m_block),waste(dr
awpoint)/blocks(drawpoint)*100];
ext=ext(ext~=-10^6); end
x_IEZ=floor(ext/1000)-floor(ext/10^6)*10^3; %calculates initial position of blocks
y_IEZ=ext-floor(ext/10^3)*10^3;
z_IEZ=floor(ext/10^6);
for i=1:length(x_IEZ)
extr(x_IEZ(i),y_IEZ(i),z_IEZ(i))=w_blocks(drawpoint); % store IEZ matrix
extracted(x_IEZ(i),y_IEZ(i),z_IEZ(i))=drawpoint; % store drawpoint
end;
else
if i==1
hangups(drawpoint)=hangups(drawpoint)+1;
mass_hangups(drawpoint,hangups(drawpoint))=w_blocks(drawpoint);
end
end
end % end for drawpoint condition
else
for i=1:H_dp
exit=a(ix(drawpoint,:),iy(drawpoint)+1:iy(drawpoint)+10,i);
ext=exit(exit~=0);
waste(drawpoint)=sum(find(ext==-10^6))+waste(drawpoint);
a(ix(drawpoint,:),iy(drawpoint)+1:iy(drawpoint)+10,i)=0;
if (length(ext)>0)
mass_drawn=length(ext)*m_block+mass_drawn; % store in draw
blocks(drawpoint)=blocks(drawpoint)+length(ext);
308
Appendix E: Matlab Subroutines
w_blocks(drawpoint)=blocks(drawpoint)*m_block; % accumulate mass
if waste(drawpoint)>0
dil(drawpoint)=dil(drawpoint)+1;
dilution{drawpoint}(dil(drawpoint),1:3)=[w_blocks(drawpoint),(waste(drawpoint)*m_block),waste(dr
awpoint)/blocks(drawpoint)*100];
ext=ext(ext~=-10^6);
end
for i=1:length(x_IEZ)
extr(x_IEZ(i),y_IEZ(i),z_IEZ(i))=w_blocks(drawpoint); % store IEZ matrix
extracted(x_IEZ(i),y_IEZ(i),z_IEZ(i))=drawpoint; % store drawpoint
end
else
if i==1
hangups(drawpoint)=hangups(drawpoint)+1;
mass_hangups(drawpoint,hangups(drawpoint))=w_blocks(drawpoint);
end
end
end %end for extr. drawpoint
end %end if for drawpoint
CASF_confined_transition_function; % call fc and move voids upwards
Displace_floating_blocks_gravity;
CASF_unconfined_transition_function;
end % next draw
end %next drawpoint in drawbell
end %next drawbell
extr_level=extr_level+1; end; %next extraction in the level
% This function is the void_diffusion function which applies fc to voids at the drawpoint brow
% upwards
if active_drawpoint==1
for i=1:H_dp
[j k]=find(a{i}(ix(drawpoint,:),iy(drawpoint,:))==0);
b(i)=length(j);
pointer_void{i}(1:b(i),1:2)=[j+ix(drawpoint)-1,k+iy(drawpoint)-1];
end
else
for i=1:H_dp
[j k]=find(a{i}(ix(drawpoint,:),iy(drawpoint,:))==0);
b(i)=length(j);
pointer_void{i}(1:b(i),1:2)=[j+ix(drawpoint)-1,iy(drawpoint)-k+1];
end
end
i=1;
while i<nz
i1=i+1;
309
Appendix E: Matlab Subroutines
if b(i)==0 && i>H_dp
break; % no voids in those levels means exit from the loop
end
if b(i)>0
pointer_aux=zeros(b(i),3);
pointer_aux(1:b(i),1)=pointer_void{i}(1:b(i),1); % j position of voids at level i
pointer_aux(1:b(i),2)=pointer_void{i}(1:b(i),2); % k position of voids at level
pointer_aux(1:b(i),3)=(-1)*rand(b(i),1); %generates random
pointer_aux=sortrows(pointer_aux,3); % choose random
pointer_void{i}(1:b(i),1:2)=pointer_aux(1:b(i),1:2);
311
Appendix E: Matlab Subroutines
for i=in:fin
diff_height(:,j)=height_pile(:,i)-height_pile(:,i+1);
j=j+1;
end
for i=in:-1:fin
diff_height(:,j)=height_pile(:,i)-height_pile(:,i-1);
j=j+1;
end
height_pile(k,i+in-1)=height_pile(k,i+in-1)-1;
height_pile(k,i+in)=height_pile(k,i+in)+1;
if i==1
diff_height(k,i)=diff_height(k,i)-2;
diff_height(k,i+1)=diff_height(k,i+1)+1;
else
diff_height(k,i)=diff_height(k,i)-2;
diff_height(k,i+1)=diff_height(k,i+1)+1;
diff_height(k,i-1)=diff_height(k,i-1)+1;
end
end
end; end; end
for i=in:-1:fin
diff_height(:,j)=height_pile(:,i)-height_pile(:,i-1);
j=j+1;
end
314
Appendix E: Matlab Subroutines
315
Appendix E: Matlab Subroutines
316