%step1: packing the elementsclear;fs.randSeed(1);%random model seed, 1,2,3...B=obj_Box;%declare a box objectB.name='PoreHydraulic';%--------------initial model------------B.GPUstatus='auto';%program will test the CPU and GPU speed, and choose the quicker oneB.ballR=0.002;B.isShear=0;B.isClump=0;%if isClump=1, particles are composed of several ballsB.distriRate=0.2;%define distribution of ball radius, B.sampleW=0.2;%width, length, height, average radiusB.sampleL=0;%when L is zero, it is a 2-dimensional modelB.sampleH=0.2;B.boundaryRrate=0.999999;B.BexpandRate=2;%boundary is 4-ball wider than B.PexpandRate=1;B.isSample=1;B.type='TriaxialCompression';B.setType();B.buildInitialModel();%B.show();d=B.d;%d.breakGroup('sample');d.breakGroup('lefPlaten');%you may change the size distribution of elements here, e.g. d.mo.aR=d.aR*0.95;d.showB=1;%--------------end initial model------------d.mo.setGPU('off');%----------remove overlap platen elementsdelId=[d.GROUP.topPlaten(end-1:end);d.GROUP.botPlaten(end-1:end)];d.delElement(delId);d.mo.zeroBalance();%----------end remove overlap platen elements%---------- gravity sedimentationB.gravitySediment(1);%you may use B.gravitySediment(10); to increase sedimentation time (10)%------------return and save result--------------d.status.dispEnergy();%display the energy of the modeld.Rrate=1;d.mo.setGPU('off');d.clearData(1);%clear dependent datad.recordCalHour('Step1Finish');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();d.show('-Id');
%set the material of the modelclearload('TempModel/PoreHydraulic1.mat');B.setUIoutput();%set output of messaged=B.d;d.calculateData();d.mo.setGPU('off');d.getModel();%get xyz from d.mo%----------set material of modelmatTxt=load('Mats\RockHydro.txt');Mats{1,1}=material('RockHydro',matTxt,B.ballR);Mats{1,1}.Id=1;d.Mats=Mats;%----------end set material of model%---------assign material to layers and balance the modelB.setPlatenFixId();d.setGroupMat('sample','RockHydro');d.groupMat2Model({'sample'});d.balanceBondedModel0();d.balance('Standard',2);%---------end assign material to layers and balance the model1. %---------save the datad.mo.setGPU('off');d.clearData(1);d.recordCalHour('Step2Finish');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();
clearfs.randSeed(2);load('TempModel/PoreHydraulic2.mat');B.setUIoutput();%--------initializing the modeld=B.d;d.calculateData();d.mo.setGPU('off');d.getModel();%get xyz from d.mod.showB=2;d.deleteConnection('boundary');d.Rrate=1;d.getModel();d.mo.isCrack=1;d.mo.bFilter(:)=true;%break all connectionsd.mo.zeroBalance();d.mo.mVis=d.mo.mVis./d.vRate*0.001;%use uniform viscosityp=pore(d);d.mo.dT=d.mo.dT/5;%use small step timep.dT=p.d.mo.dT;p.pathLimitRate=0.3;%path diameter<pathLimitRate*ballR will be connectionp.isCouple=1;%fluid-solid couplingp.setInitialPores();p.setPlaten('fix');%fix the coordinates of platens%---------end initializing the model%----------set the drawing of result during iterationssetappdata(0,'simpleFigure',1);%use simpleFigure to increase drawing speed%setappdata(0,'ballRate',0.01);%use small ballRate to increase drawing speedshowType='*pPressure';figureNumber=d.show('mV');%define figureNumber, figure will shown in one form during iterationsd.figureNumber=figureNumber;%----------end set the drawing of result during iterations%---------calculate connection diameter and flow Kk=0.00000001;%permeability factor%---------end calcualte connection diameter and flow Kk=k/10;%change the permeabilitypPressureHigh=p.pPressure(1)*5000;%use greater pressure%---------setting of the simulationtotalCircle=10;stepNum=100;fName=['data/step/2'B.namenum2str(B.ballR)'-'num2str(B.distriRate)'loopNum'];save([fName'0.mat']);%return;d.tic(totalCircle);%record the initial time of loopfori=1:totalCircleforj=1:stepNumcDiameterFlow=p.cDiameter+p.cDiameterAdd;%calculate the diameter ofcDiameterFlow(cDiameterFlow<0)=0;p.cKFlow=cDiameterFlow*k./p.cPathLength;%default K of throat is determined by diameter and path lengthp.setBallPressure(210,pPressureHigh);%you may fix the elementp.balance();d.balance();end%cla;%clear the previous figurep.show(showType);pause(0.1);%pause and show the figuresave([fNamenum2str(i)'.mat']);%save datad.recordStatus();d.toc();end%---------save the datad.mo.setGPU('off');d.clearData(1);d.recordCalHour('Step3Finish');save(['TempModel/'B.name'3.mat'],'B','d');save(['TempModel/'B.name'3R'num2str(B.ballR)'-distri'num2str(B.distriRate)'aNum'num2str(d.aNum)'.mat']);d.calculateData();
%set the material of the modelclearfs.randSeed(2);load('TempModel/PoreHydraulic2.mat');B.setUIoutput();%---------------regular settingd=B.d;d.calculateData();d.mo.setGPU('off');d.getModel();%get xyz from d.mod.showB=2;d.deleteConnection('boundary');d.Rrate=1;d.getModel();d.mo.isCrack=1;%---------------end regular setting%-------------initializing the pore networkp=pore(d);p.dT=p.d.mo.dT;p.pathLimitRate=0.3;%path diameter<pathLimitRate*ballR will be connectionp.isCouple=0;%fluid-solid couplingp.setInitialPores();p.setPlaten('fix');%fix the coordinates of platens%-------------end initializing the pore network%-----------------set cracks in the modelC=Tool_Cut(d);%cut the modellSurf=[0.3,0,0;10,0,5;20,0,20]/100;%load the surface datalSurf2=[0.5,0,0;5,0,15]/100;%load the surface dataC.addSurf(lSurf);%add the surfaces to the cutC.addSurf(lSurf2);%add the surfaces to the cuts1Filter=d.setSurfBond(C.Surf(1),'break');s2Filter=d.setSurfBond(C.Surf(2),'break');%-----------------end set cracks in the modeld.show('--');C.showSurf();%---------calculate connection diameter and flow Kk=0.00000001;%permeability factor%---------end calcualte connection diameter and flow Kk=k/10;pPressureHigh=p.pPressure(1)*10000;%use greater pressureforstep=1:2000cDiameterFlow=p.cDiameter+p.cDiameterAdd;%calculate the diameter ofcDiameterFlow(cDiameterFlow<0)=0;cbFilter=d.mo.bFilter(p.cnIndex);%bonded filter of cListcs1Filter=s1Filter(p.cnIndex);%s2Filter, select connection of crack 2cs2Filter=s2Filter(p.cnIndex);%s2Filter, select connection of crack 2p.cKFlow=cDiameterFlow*k./p.cPathLength;%default K of throat is determined by diameter and path lengthp.cKFlow(cbFilter)=p.cKFlow(cbFilter)*0.01;%K of intacted bond is very smallp.cKFlow(cs1Filter)=p.cKFlow(cs1Filter)*2;%bottom crack K is greaterp.cKFlow(cs2Filter)=p.cKFlow(cs2Filter)*1;%top crack K is greaterp.setBallPressure(1,pPressureHigh);%you may fix the elementp.balance();endp.show('pPressure');%---------save the datad.mo.setGPU('off');d.clearData(1);d.recordCalHour('Step3Finish');save(['TempModel/'B.name'3.mat'],'B','d');save(['TempModel/'B.name'3R'num2str(B.ballR)'-distri'num2str(B.distriRate)'aNum'num2str(d.aNum)'.mat']);d.calculateData();