跳转至

Powder

粉末铺展1.m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
clear;%此代码由王波编写并维护,具体使用和修订请联系QQ群中王波,群号668903775
KeLiR=0.1;
ringObj=mfs.makeRing(2,1,KeLiR,0.5);%调用函数生成圆环
%ringObj=mfs.makeDisc(2, KeLiR*1.5/2,0.8);
ringObj=mfs.rotate(ringObj, 'YZ', 90);%旋转到XZ平面
ringObj.R(129)=ringObj.R(129)*1.0;%ID为129的颗粒半径变为原来1.2倍,便于后续建模观察圆环滚动
figure;fs.showObj(ringObj);
fs.randSeed(1);%build random model                                         
B=obj_Box;%build a box object                                              
B.name='粉末模型';                                                               
B.GPUstatus='auto';                                                        
B.ballR=KeLiR/0.8;%生成的颗粒半径为预定的5/4倍,相当于增加颗粒间距                                                           
B.isClump=0;                                                               
B.distriRate=0.2;
B.sampleW=6;                                                              
B.sampleL=0;                                                               
B.sampleH=4;
B.setType();                                                               
B.buildInitialModel();%B.show();                                           
B.setUIoutput();                                                           
d=B.d;%d.breakGroup('sample');d.breakGroup('lefPlaten');                   
d.mo.setGPU('auto');                                                       
SampleObj.X=d.mo.aX(d.GROUP.sample);
SampleObj.Y=d.mo.aY(d.GROUP.sample);
SampleObj.Z=d.mo.aZ(d.GROUP.sample);
SampleObj.R=d.mo.aR(d.GROUP.sample)*0.8;
d.SET.SampleObj=SampleObj;%以结构体形式保存sample样本
d.SET.ringObj=ringObj;%以结构体形式保存
d.SET.KeLiR=KeLiR;
d.status.dispEnergy();%display the energy of the model                     
d.mo.setGPU('off');                                                        
d.clearData(1);%clear dependent data
d.recordCalHour('Box1Finish');
save(['TempModel/' B.name '1.mat'],'B','d');
save(['TempModel/' B.name '1R' num2str(B.ballR) '-distri' num2str(B.distriRate)  'aNum' num2str(d.aNum) '.mat']);
d.calculateData();
figure;d.showFilter('SlideY',0.45,0.05,'aR');                              
粉末铺展2.m
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
clear;
load('TempModel/粉末模型1.mat');
%------------initialize model-------------------
B.setUIoutput();
d=B.d;
d.calculateData();
d.mo.setGPU('off');
d.getModel();%get xyz from d.mo
ringObj=d.SET.ringObj;
SampleObj=d.SET.SampleObj;
ballR=d.SET.KeLiR;
%figure;fs.showObj(ringObj);hold on;fs.showObj(SampleObj);
%return;

fs.randSeed(1);%random model seed, 1,2,3...
B=obj_Box;%declare a box object
B.name='增材制造';
B.GPUstatus='auto';%program will test the CPU and GPU speed, and choose the quicker one
B.ballR=ballR;
B.isShear=1;
B.isClump=0;%if isClump=1, particles are composed of several balls
B.distriRate=0.2;%define distribution of ball radius, 
B.sampleW=36;
B.sampleL=0;
B.sampleH=6;
B.BexpandRate=2;%boundary is 4-ball wider than 
B.PexpandRate=0;
B.isSample=0;
B.setType();
B.buildInitialModel();
d=B.d;
Rate=0.3;
h=0.5;
Wall1Obj.X=[0:2*(B.ballR*(1-Rate)):(B.sampleW)/6-B.ballR]';
Wall1Obj.Y=Wall1Obj.X.*0;
Wall1Obj.Z=Wall1Obj.X.*0-B.ballR;
Wall1Obj.R=Wall1Obj.X.*0+B.ballR;

Wall2Obj.Z=[-2*(B.ballR*(1-Rate)):-2*(B.ballR*(1-Rate)):-h]'-B.ballR;
Wall2Obj.X=Wall2Obj.Z.*0+max(Wall1Obj.X);
Wall2Obj.Y=Wall2Obj.X.*0;
Wall2Obj.R=Wall2Obj.X.*0+B.ballR;

Wall3Obj.X=[max(Wall1Obj.X)+2*(B.ballR*(1-Rate)):2*(B.ballR*(1-Rate)):(B.sampleW/2)]';
Wall3Obj.Y=Wall3Obj.X.*0;
Wall3Obj.Z=Wall3Obj.X.*0+min(Wall2Obj.Z);
Wall3Obj.R=Wall3Obj.X.*0+B.ballR;
%figure;fs.showObj(Wall1Obj);figure;fs.showObj(Wall2Obj);figure;fs.showObj(Wall3Obj);
%return;
Wall0Obj.X=[Wall1Obj.X;Wall2Obj.X;Wall3Obj.X];
Wall0Obj.Y=[Wall1Obj.Y;Wall2Obj.Y;Wall3Obj.Y];
Wall0Obj.Z=[Wall1Obj.Z;Wall2Obj.Z;Wall3Obj.Z];
Wall0Obj.R=[Wall1Obj.R;Wall2Obj.R;Wall3Obj.R];
WallObj=mfs.rotateCopy(Wall0Obj,180,2,'XY')
WallObj.Z=-h-B.ballR-WallObj.Z;
WallObj.X=B.ballR+WallObj.X+B.sampleW/2;
%figure;fs.showObj(WallObj);
%return;
d.mo.setGPU('off');
SampleId=d.addElement(1,SampleObj);
d.addGroup('sample',SampleId);%add a new group
d.moveGroup('sample',5,0,h+2*B.ballR);
WallGroupId=d.addElement(1,WallObj);
d.addGroup('WallGroup',WallGroupId);%add a new group
d.setClump('WallGroup')
d.moveGroup('WallGroup',0,0,h+B.ballR);
d.defineWallElement('WallGroup');
matTxt=load('Mats\Soil1.txt');
Mats{1,1}=material('KeiLi',matTxt,B.ballR);
Mats{1,1}.Id=1;
matTxt2=load('Mats\Soil1.txt'); 
%matTxt2=[2.00E+10      0.12     2.00E+06   2.00E+07    0.5]
Mats{2,1}=material('WallG',matTxt2,B.ballR); 
Mats{2,1}.Id=2; 
d.Mats=Mats;
d.setGroupMat('sample','KeiLi');
d.groupMat2Model({'sample'});
d.delElement(d.GROUP.topPlaten);
d.setStandarddT();
d.mo.dT=5*d.mo.dT;%增大时间步缩短沉积时间
n=2000;d.mo.mGZ(:)=d.mo.mGZ(:).*n;%增大重力缩短沉积时间
%fName=['data/沉积8.23/' B.name num2str(B.ballR) '000-' num2str(B.distriRate) 'loopNumT'];
%d.mo.mVX=(-1+2*rand(length(d.GROUP.sample),1))*200;
d.showB=2;
figure;
d.mo.setGPU('auto');
d.figureNumber=d.show('mV');%绘图的窗口号,可指定在某一窗口绘图
d.mo.isShear=0;
%return;
for i=1:8
 d.balance('Standard',0.2);
 d.show('ZDisplacement');
 pause(0.1);
 %save([fName num2str(i) '.mat']);
end
d.mo.mGZ(:)=d.mo.mGZ(:)./n;%恢复重力
d.balance('Standard',0.20);%重新平衡
d.status.dispEnergy();%display the energy of the model                     

d.mo.setGPU('off');
d.clearData(1);
d.recordCalHour('BoxModel2Finish');
save(['TempModel/' B.name '2.mat'],'B','d');
save(['TempModel/' B.name '2R' num2str(B.ballR) '-distri' num2str(B.distriRate)  'aNum' num2str(d.aNum) '.mat']);
d.calculateData();
粉末铺展3(滚动).m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
clear;
load('增材制造汇报/粉末模型1.mat');
ringObj=d.SET.ringObj;
RingR=((max(ringObj.Z)+max(ringObj.R))-(min(ringObj.Z)-min(ringObj.R)))/2;
d=[];
B=[];
%load('增材制造/增材制造汇报/增材制造2.mat');
load('增材制造汇报/增材制造020.mat');
%------------initialize model-------------------
B.setUIoutput();
d=B.d;d.calculateData();d.mo.setGPU('off');d.getModel();%get xyz from d.mo
d.mo.setShear('on');
RingId=d.addElement(1,ringObj);d.addGroup('Ring',RingId);d.setClump('Ring');d.moveGroup('Ring',1.5,0,2.12);%2.12
d.addFixId('XYZ', d.GROUP.Ring);
d.moveGroup('Ring',0.85,0,0.65);
d.setStandarddT();
d.mo.dT=5*d.mo.dT;
%d.delElement(d.GROUP.sample);
%figure;d.show('aR');
%return;%d.show('Id');%
fName=['data/滚筒铺粉OK/' B.name num2str(B.ballR) '000-' num2str(B.distriRate) 'loopNum'];save([fName '0.mat']);%return
totalCircle=8;%40
stepNum=1;%20
d.mo.setGPU('auto');
dis=0.0024;%total distance
dDis=dis/totalCircle/stepNum;%distance of each step
d.tic(totalCircle*stepNum);
%figure;
d.figureNumber=d.show('aR');%绘图的窗口号,可指定在某一窗口绘图
save([fName num2str(0) '.mat']);
for i=1:totalCircle
    for j=1:stepNum
        d.toc();%show the note of time
        d.moveGroup('Ring',dDis,0,0,'mo');
         d.rotateGroup('Ring', 'XZ',  -dDis/(2*pi*RingR)*360);
        %d.balance('Standard',0.02);%
    end
    d.clearData(1);%clear data in d.mo
    save([fName num2str(i) '.mat']);
   d.show('aR');
    d.calculateData();
end

d.mo.setGPU('off');
d.clearData(1);
figure;d.showFilter('SlideY',0.45,0.05,'aR');
粉末铺展3(振动).m
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
clear;
load('增材制造汇报/粉末模型1OK.mat');
Hight=2;
ringObj=d.SET.ringObj;
d=[];
B=[];
load('增材制造汇报/增材制造020.mat');
%------------initialize model-------------------
B.setUIoutput();
d=B.d;d.calculateData();d.mo.setGPU('off');d.getModel();%get xyz from d.mo
d.delElement(d.GROUP.sample);
d.mo.setShear('on');
RingId=d.addElement(1,ringObj);d.addGroup('Ring',RingId);d.setClump('Ring');d.moveGroup('Ring',1.5,0,2.12);
d.moveGroup('Ring',0.85,0,0.65);
d.setStandarddT();
d.mo.dT=0.5*d.mo.dT;
%d.delElement(d.GROUP.sample);
%============================================
WaveN=10;
totalBalanceNum=100*0.67*WaveN;%data number of the wave
totalT=totalBalanceNum*d.mo.dT;%total time of the wave
period=2e-3;%period of the wave
Ts=((0:totalBalanceNum)*d.mo.dT.*10)';
maxA=5;%maximum acceleration
d.addGroup('Point',d.GROUP.Ring(1));%设置监测点
Values=maxA*sin(Ts*(2*pi)/period);
figure;plot(Ts,Values,'-');
d.addTimeProp('Ring','mAZ',Ts,Values);
d.addRecordProp('Point','mAZ');
%figure;d.show('aR');
%return;
%============================================
%fName=['data/滚筒铺粉OK/' B.name num2str(B.ballR) '000-' num2str(B.distriRate) 'loopNum'];save([fName '0.mat']);%return
totalCircle=5;%80
stepNum=1;%100
d.mo.setGPU('auto');
dis=0.025;%total distance
dDis=dis/totalCircle/stepNum;%distance of each step
d.tic(totalCircle*stepNum);
figure;
d.figureNumber=d.show('mAZ');%绘图的窗口号,可指定在某一窗口绘图
%save([fName num2str(0) '.mat']);
for i=1:totalCircle
    for j=1:stepNum
        d.toc();%show the note of time
        d.moveGroup('Ring',dDis,0,0,'mo');
        d.balance('Standard',0.03);%
       d.show('XDisplacement');
    end
    d.clearData(1);%clear data in d.mo
    %save([fName num2str(i) '.mat']);
    d.calculateData();
end
d.mo.setGPU('off');
figure;plot(d.status.Ts,d.status.SET.PROP.Point_mAZ(:),'ro-');
d.clearData(1);
%figure;d.showFilter('SlideY',0.45,0.05,'aR');