You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

238 lines
6.7 KiB

function mp= Build_Piston28()
% Bulid mp obj (contains models and all arguments)
%% init
pace=3.33;
Pst=[-13 -20 -10]-pace*0.52;
Ped=[130 20 10];
Ped=FCM_dV.round_Ped(Pst,Ped,pace);
maxdeep=4;
order=2;
viewxy=[0 60];
Shape.accessThreshold(pace/maxdeep/2/2/2);%
Oa=[0 0 0];
Ra=[0 0 0];
rvec=(Ped-Pst)/pace
num_cells=rvec(1)*rvec(2)*rvec(3);
fprintf("num_cells: %.0f\n",num_cells);% show num of cells
%% add SS lib & python path
% SuiteSparse_paths2();
additon_path=pwd;
if count(py.sys.path,additon_path) == 0
insert(py.sys.path,int32(0),additon_path);
end
% additon_path=[additon_path,'/TopCSG'];
% if count(py.sys.path,additon_path) == 0
% insert(py.sys.path,int32(0),additon_path);
% end
%% assemble c0
c=CSG("STL",[pwd,'/SolidWoks Files/Piston28/piston28.STL'],'init');
c1center=[25 0 0];
c2center=[55 0 0];
cir1=Circle(c1center,5);
cir2=Circle(c2center,5);
tLine1=TangentLine(cir1,cir2,'bot');
tLine2=TangentLine(cir1,cir2,'top');
tLine3=Line(tLine1.p2,tLine2.p1);
tLine4=Line(tLine2.p2,tLine1.p1);
tmp=tLine1*tLine3*tLine2*tLine4+cir1+cir2;
tLine1.addlistener('propChanged',@tLine4.syn_p21);
tLine1.addlistener('propChanged',@tLine3.syn_p12);
tLine2.addlistener('propChanged',@tLine3.syn_p21);
tLine2.addlistener('propChanged',@tLine4.syn_p12);
cir1.addlistener('propChanged',@tLine1.update_p);
cir1.addlistener('propChanged',@tLine2.update_p);
cir2.addlistener('propChanged',@tLine1.update_p);
cir2.addlistener('propChanged',@tLine2.update_p);
init_h=2;
%---------------------------------------top
the_skt=Sketch([0 0 init_h],Ra,5,tmp);
the_rc1=RoundCorner(3.5-init_h,the_skt,tLine1,false,true);
the_rc2=RoundCorner(3.5-init_h,the_skt,tLine2,false,true);
the_rcc1=RoundCorner_Circle(3.5-init_h,the_skt,cir1,false,true);
the_rcc2=RoundCorner_Circle(3.5-init_h,the_skt,cir2,false,true);
lines_skt=CSG();lines_skt.init(the_skt);
rc1_skt=CSG();rc1_skt.init(the_rc1,'Lrc1');
rc2_skt=CSG();rc2_skt.init(the_rc2,'Lrc2');
rcc1_skt=CSG();rcc1_skt.init(the_rcc1,'Crc1');
rcc2_skt=CSG();rcc2_skt.init(the_rcc2,'Crc2');
half_pla1=CSG('Plane3D',c1center+[0.1 0 0],[-1 0 0],'planeL');
half_pla2=CSG('Plane3D',c2center-[0.1 0 0],[1 0 0],'planeR');
%---------------------------------------down
the_skt_down=Sketch([0 0 -init_h],[pi 0 0],5,tmp);
the_rc1_down=RoundCorner(3.5-init_h,the_skt_down,tLine1,false,true);
the_rc2_down=RoundCorner(3.5-init_h,the_skt_down,tLine2,false,true);
the_rcc1_down=RoundCorner_Circle(3.5-init_h,the_skt_down,cir1,false,true);
the_rcc2_down=RoundCorner_Circle(3.5-init_h,the_skt_down,cir2,false,true);
lines_skt_down=CSG();lines_skt_down.init(the_skt_down);
rc1_skt_down=CSG();rc1_skt_down.init(the_rc1_down,'Lrc3');
rc2_skt_down=CSG();rc2_skt_down.init(the_rc2_down,'Lrc4');
rcc1_skt_down=CSG();rcc1_skt_down.init(the_rcc1_down,'Crc3');
rcc2_skt_down=CSG();rcc2_skt_down.init(the_rcc2_down,'Crc4');
c=c-lines_skt-lines_skt_down+(rc1_skt+rc1_skt_down+rc2_skt+rc2_skt_down+((rcc1_skt+rcc1_skt_down)*half_pla1)+((rcc2_skt+rcc2_skt_down)*half_pla2));
V0=1;
% time and calculate Volume
tic
fcmv=FCM_V(Pst,Ped,pace,maxdeep,order,@c.calSDF,@(X) ones(size(X,1),1));% |||1 dV
% V0=fcmv.calIntegral_V();%%
% fcmv=FCM_V(Pst,Ped,pace,maxdeep,order,@c.calSDF,@(X) ones(24,24,size(X,1)));% |||1 dV
% K0=sum(fcmv.cal_Ke(),3);
% K0(1)
% tmp_c=CSG('Sphere',Oa,5);
% BC=tmp_c.copy()*CSG('Plane3D',[0 0 0],[-1 0 0]);
% fcmdv=FCM_dV(Pst,Ped,pace,maxdeep,order,@c.calSDF,@(X) ones(size(X,1),1));% |||1 dV
%
% S0=fcmdv.calIntegral_S(Dir)
% Sstd=4*pi*5*5;
% abs(S0-Sstd)/Sstd
%
% fcmdv=FCM_V(Pst,Ped,pace,maxdeep,order,@tmp_c.calSDF,@(X) ones(size(X,1),1));% |||1 dV
% Vstd=4/3*pi*5^3;
% V00=fcmdv.calIntegral_V()
% abs(Vstd-V00)/Vstd
fprintf('V0: %f ,Time: %f\n',V0,toc);
%% build Dirichlet/Neumann boundary
eepsD=1e-1*9;
eepsN=9e-2;
Dc1=Circle(Oa,9);
Dc2=Circle(Oa,9-eps);
Dcskt=(Dc1-Dc2);
skt=Sketch([0 0 -8],Ra,8*2,Dcskt);
Dirich_csg=CSG();
Dirich_csg.init(skt,'Dir');
Dirich_csg.judge_func=@(X) abs(vecnorm(X(:,1:2)-[0 0],2,2)-9)<eepsD & abs(X(:,3))<8+eepsD ;
% Dirich_csg.eeps=pace/8;
%------------------------------------------Neu
Nc1=Circle(Oa,15);
Nc2=Circle(Oa,15-eps);
% half_line=Line([0 -15 0],[0 15 0]);
Ncskt=(Nc1-Nc2);
skt=Sketch([110 0 -8],Ra,8*2,Ncskt);
Neuman_csg=CSG();
Neuman_csg.init(skt,'Neu');
Neuman_csg.judge_func=@(X) abs(vecnorm(X(:,1:2)-[110 0],2,2)-15)<eepsN & abs(X(:,3))<8+eepsN;
Neuman_csg.fdv=@cal_NeuF;
% Neuman_csg.eeps=Dirich_csg.eeps;
fcmdv=FCM_dV(Pst,Ped,pace,maxdeep,order,@c.calSDF,@(X) ones(size(X,1),1));% |||1 dV
S0=fcmdv.calIntegral_S(Dirich_csg)
Sstd=18*pi*18;
relaS=(S0-Sstd)/Sstd
S1=fcmdv.calIntegral_S(Neuman_csg)
S1std=2*pi*15*16;
relaS1=(S1-S1std)/S1std
%% show model
clf;
%---------------step1
c.set_display_args(Pst,Ped,pace/6,'viewxy',viewxy);
c.saveAs('c');
c.display_csg();
%% init mp(save handle)
mp=ModelPlus(Pst,Ped,pace,order,maxdeep);
mp.c=c;
mp.Dirich_csg=Dirich_csg;
mp.Neuman_csg=Neuman_csg;
mp.V0=V0;
% mp.delta=Dirich_csg.delta;
mp.viewxy=viewxy;
mp.E=2e11*1e-3;
mp.u=0.3;
if 1 && order<3
saveKeH=SaveKe(mp,@compute_B_in_local,mp.pace,mp.order,mp);
mp.saveKe=saveKeH;
end
tmphandle=TmpHandle();
tmphandle.rcc1_skt=rcc1_skt;
tmphandle.rcc2_skt=rcc2_skt;
tmphandle.rc1_skt=rc1_skt;
tmphandle.rc2_skt=rc2_skt;
tmphandle.lines_skt=lines_skt;
tmphandle.rc1_skt_down=rc1_skt_down;
tmphandle.rc2_skt_down=rc2_skt_down;
tmphandle.rcc1_skt_down=rcc1_skt_down;
tmphandle.rcc2_skt_down=rcc2_skt_down;
tmphandle.lines_skt_down=lines_skt_down;
tmphandle.cir1=cir1;
tmphandle.cir2=cir2;
tmphandle.the_skt=the_skt;
tmphandle.the_skt_down=the_skt_down;
tmphandle.the_rc1=the_rc1;
tmphandle.the_rc2=the_rc2;
tmphandle.the_rcc1=the_rcc1;
tmphandle.the_rcc2=the_rcc2;
tmphandle.the_rc1_down=the_rc1_down;
tmphandle.the_rc2_down=the_rc2_down;
tmphandle.the_rcc1_down=the_rcc1_down;
tmphandle.the_rcc2_down=the_rcc2_down;
mp.tmphandle=tmphandle;
%% set args here
mp.fixedNeu=1;
mp.fixedDir=1;
mp.iscontrast=1;
mp.isrecord=1;
%% init fmt
tic
fmt=FeatureMappingTable(c,Pst,Ped,pace);
fmt.reflash_table();
tini=toc;
mp.recorder.time_maintain_fmt(end+1)=tini;
mp.fmt=fmt;
fprintf('num_node: %f\n',mp.id_cnt);
end
function ret=cal_NeuF(X)
r=15;
h=16;
Or=[110 0];
fx_vec=[-100 0 0]/h*1e3*2/pi/r;% 2/pi is coef
fy_vec=[0 -200 0]/h*1e3*2/pi/r;
unit_fx=fx_vec(1:2)./norm(fx_vec(1:2));
unit_fy=fy_vec(1:2)./norm(fy_vec(1:2));
vec_X=X(:,1:2)-Or;
unit_X=vec_X./vecnorm(vec_X,2,2);
the_cos_x=unit_X*unit_fx';
the_cos_y=unit_X*unit_fy';
the_cos_x(the_cos_x<0)=0;
the_cos_y(the_cos_y<0)=0;
ret=unit_X.*(the_cos_x.*abs(fx_vec(1))+ the_cos_y.*abs(fy_vec(2)));
ret=[ret,zeros(size(ret,1),1)];
end