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.
286 lines
9.4 KiB
286 lines
9.4 KiB
function ani_opt_pnorm_fitting_all()
|
|
nx=60;
|
|
ny=1;
|
|
nz=20;
|
|
volfrac=0.535;
|
|
rmin=1.5;
|
|
[Hs,H]=filter_coef_3D(nx,ny,nz,rmin);
|
|
|
|
a(1:nz,1:ny,1:nx) = 1.0;
|
|
b(1:nz,1:ny,1:nx) = 1.0;
|
|
c(1:nz,1:ny,1:nx) = 0.0;
|
|
aPhys = a;
|
|
bPhys = b;
|
|
cPhys = c;
|
|
% -1+a+b-c>=0
|
|
% 1-a+b-c>=0
|
|
% 1+a-b-c>=0
|
|
|
|
%OPTIMIZE a
|
|
% a>=max(1-b+c,-1+b+c)
|
|
% a<=1+b-c
|
|
%OPTIMIZE b
|
|
% b>=max(1-a+c,-1+a+c)
|
|
% b<=1+a-c
|
|
%OPTIMIZE c
|
|
% c<=min(-1+a+b,1-a+b,1+a-b)
|
|
nele = nx * ny * nz;
|
|
|
|
m = 4 + 1; % The number of general constraints.
|
|
n = 3 * nx * ny * nz; % The number of design variables x_j.
|
|
|
|
xmin = [ones(nele,1).*0.52;...
|
|
ones(nele,1).*0.52;...
|
|
ones(nele,1).*(-4.98)];
|
|
% Column vector with the lower bounds for the variables x_j.
|
|
xmax = [ones(nele,1).*1.98;...
|
|
ones(nele,1).*1.98;...
|
|
ones(nele,1).*0.98];
|
|
xold1 = [ a(:); b(:);c(:)]; % xval, one iteration ago (provided that iter>1).
|
|
xold2 = [ a(:); b(:);c(:)]; % xval, two iterations ago (provided that iter>2).
|
|
low = ones(n,1); % Column vector with the lower asymptotes from the previous iteration (provided that iter>1).
|
|
upp = ones(n,1); % Column vector with the upper asymptotes from the previous iteration (provided that iter>1).
|
|
a0 = 1; % The constants a_0 in the term a_0*z.
|
|
a1 = zeros(m,1); % Column vector with the constants a_i in the terms a_i*z.
|
|
% c_MMA = 1e3.*ones(m,1); % Column vector with the constants c_i in the terms c_i*y_i.
|
|
c_MMA = [1e3.*ones(m-1,1);1.1e3]; % Column vector with the constants c_i in the terms c_i*y_i.
|
|
d = zeros(m,1); % Column vector with the constants d_i in the terms 0.5*d_i*(y_i)^2.
|
|
|
|
maxloop = 200;
|
|
a_log = cell(maxloop,2);
|
|
b_log = cell(maxloop,2);
|
|
c_log = cell(maxloop,2);
|
|
tim=zeros(maxloop,1);
|
|
sumCompliance=zeros(maxloop,1);
|
|
volfraction = zeros(maxloop,1);
|
|
loop = 0;
|
|
change = 1.;
|
|
while change > 0.001 && loop < maxloop
|
|
loop = loop + 1;
|
|
tic
|
|
|
|
% ch=interp_ch(aPhys,bPhys,cPhys);
|
|
[ch,ch_da,ch_db,ch_dc]=fitting_val(aPhys,bPhys,cPhys);
|
|
ke_all=lk_all(ch);
|
|
U=FEM_Beam(nx,ny,nz,ke_all);
|
|
|
|
% [ch_da]=interp_ch_da(aPhys,bPhys,cPhys);
|
|
% [ch_db]=interp_ch_db(aPhys,bPhys,cPhys);
|
|
% [ch_dc]=interp_ch_dc(aPhys,bPhys,cPhys);
|
|
ke_da=lk_all(ch_da);
|
|
ke_db=lk_all(ch_db);
|
|
ke_dc=lk_all(ch_dc);
|
|
[~,~,dcdb] = COMP(U,ke_all,ke_db,nx,ny,nz);
|
|
[~,~,dcda] = COMP(U,ke_all,ke_da,nx,ny,nz);
|
|
[comp,compliance,dcdc] = COMP(U,ke_all,ke_dc,nx,ny,nz);
|
|
|
|
% [dvda]=interp_dvda(aPhys(:),bPhys(:),cPhys(:));
|
|
% [dvdb]=interp_dvdb(aPhys(:),bPhys(:),cPhys(:));
|
|
% [dvdc]=interp_dvdc(aPhys(:),bPhys(:),cPhys(:));
|
|
|
|
[vol,dvda,dvdb,dvdc]=fittingV_val(aPhys(:),bPhys(:),cPhys(:));
|
|
|
|
dv=[dvda;dvdb;dvdc];
|
|
xval=[aPhys(:);bPhys(:);cPhys(:)];
|
|
f0val = compliance;
|
|
df0dx = [dcda(:);dcdb(:);dcdc(:)];
|
|
|
|
% vol=interp_v(aPhys(:),bPhys(:),cPhys(:));
|
|
|
|
% cnstrt1 = -1-a(:)-b(:)-c(:);
|
|
% cnstrt2 = -(-1+a(:)+b(:)-c(:));
|
|
% cnstrt3 = -(1-a(:)+b(:)-c(:));
|
|
% cnstrt4 = -(1+a(:)-b(:)-c(:));
|
|
% cnstrt1 = -1-aPhys(:)-bPhys(:)-cPhys(:);
|
|
% cnstrt2 = -(-1+aPhys(:)+bPhys(:)-cPhys(:));
|
|
% cnstrt3 = -(1-aPhys(:)+bPhys(:)-cPhys(:));
|
|
% cnstrt4 = -(1+aPhys(:)-bPhys(:)-cPhys(:));
|
|
% cnstrt1 =cnstrt1./6;
|
|
% cnstrt2 =cnstrt2./8;
|
|
% cnstrt3 =cnstrt3./6;
|
|
% cnstrt4 =cnstrt4./6;
|
|
p=400;
|
|
cnstrt1 = mean((5-aPhys(:)-bPhys(:)-cPhys(:)).^p).^(1/p)-6;
|
|
cnstrt2 = mean((9-aPhys(:)-bPhys(:)+cPhys(:)).^p).^(1/p)-8;
|
|
cnstrt3 = mean((5+aPhys(:)-bPhys(:)+cPhys(:)).^p).^(1/p)-6;
|
|
cnstrt4 = mean((5-aPhys(:)+bPhys(:)+cPhys(:)).^p).^(1/p)-6;
|
|
|
|
cnstrt1 =cnstrt1./6;
|
|
cnstrt2 =cnstrt2./8+0.015;
|
|
cnstrt3 =cnstrt3./6+0.035;
|
|
cnstrt4 =cnstrt4./6+0.040;
|
|
|
|
fval = [cnstrt1;cnstrt2;cnstrt3;cnstrt4;...
|
|
sum(vol)/(volfrac*nele)-1];
|
|
disp('fval: ')
|
|
disp(fval.')
|
|
|
|
disp('connect_check: ')
|
|
% disp([sum(cnstrt1),sum(cnstrt2),sum(cnstrt3),sum(cnstrt4)])
|
|
% [num_unconnect,cnstrt1,cnstrt2,cnstrt3,cnstrt4]=connect_check(a,b,c);
|
|
[num_unconnect,cnstrt1,cnstrt2,cnstrt3,cnstrt4]=connect_check(aPhys,bPhys,cPhys);
|
|
disp(num_unconnect.')
|
|
|
|
dc1da=-sum((5-aPhys(:)-bPhys(:)-cPhys(:)).^p).^(1/p-1).*((5-aPhys(:)-bPhys(:)-cPhys(:)).^(p-1));
|
|
|
|
dc2da=-sum((9-aPhys(:)-bPhys(:)+cPhys(:)).^p).^(1/p-1).*(9-aPhys(:)-bPhys(:)+cPhys(:)).^(p-1);
|
|
dc2dc= -dc2da;
|
|
|
|
dc3da= sum((5+aPhys(:)-bPhys(:)+cPhys(:)).^p).^(1/p-1).*(5+aPhys(:)-bPhys(:)+cPhys(:)).^(p-1);
|
|
dc3db=-dc3da;
|
|
|
|
dc4da=-sum((5-aPhys(:)+bPhys(:)+cPhys(:)).^p).^(1/p-1).*(5-aPhys(:)+bPhys(:)+cPhys(:)).^(p-1);
|
|
dc4db= -dc4da;
|
|
|
|
dc1da = dc1da./6;
|
|
dc2da = dc2da./8; dc2dc=dc2dc./8;
|
|
dc3da = dc3da./6; dc3db=dc3db./6;
|
|
dc4da = dc4da./6; dc4db=dc4db./6;
|
|
|
|
% EYES=eye(nele);
|
|
dfdx = [dc1da.',dc1da.',dc1da.';
|
|
dc2da.',dc2da.',dc2dc.';
|
|
dc3da.',dc3db.',dc3da.';
|
|
dc4da.',dc4db.',dc4db.';
|
|
dv(:)' / (volfrac*nele)]; % m X n
|
|
|
|
% fval = sum(vol)/(volfrac*nele)-1;
|
|
% EYES=eye(nele);
|
|
% dfdx = [EYES.*(-1)./6,EYES.*(-1)./6,EYES.*(-1)./6;
|
|
% EYES.*(-1)./8,EYES.*(-1)./8,EYES.*( 1)./8;
|
|
% EYES.*( 1)./6,EYES.*(-1)./6,EYES.*( 1)./6;
|
|
% EYES.*(-1)./6,EYES.*( 1)./6,EYES.*( 1)./6;
|
|
% dv(:)' / (volfrac*nele)]; % m X n
|
|
% dfdx = dv(:)' / (volfrac*nele);
|
|
[xmma, ~, ~, ~, ~, ~, ~, ~, ~, low,upp] = ...
|
|
mmasub(m, n, loop, xval, xmin, xmax, xold1, xold2, ...
|
|
f0val,df0dx,fval,dfdx,low,upp,a0,a1,c_MMA,d);
|
|
a = reshape(xmma(1:nele),nz,ny,nx);
|
|
b = reshape(xmma((nele+1):2*nele),nz,ny,nx);
|
|
c = reshape(xmma((2*nele+1):n),nz,ny,nx);
|
|
aPhys(:) = (double(H)*double(a(:)))./double(Hs);
|
|
bPhys(:) = (double(H)*double(b(:)))./double(Hs);
|
|
cPhys(:) = (double(H)*double(c(:)))./double(Hs);
|
|
% aPhys=a;bPhys=b;cPhys=c;
|
|
|
|
xold2 = xold1(:);
|
|
xold1 = xval(:);
|
|
change = max(max(abs([a(:);b(:);c(:)]-xval)));
|
|
% [a,b,c,aPhys,bPhys,cPhys,xold1,xold2,change,compliance,vol,low,upp,comp]=...
|
|
% optimizeABC(a,b,c,aPhys,bPhys,cPhys,xold1,xold2,Hs,H,volfrac,low,upp,nx,ny,nz,loop,a0,a1,x_MMA,d,...
|
|
% n,m,xmin,xmax);
|
|
sumCompliance(loop,1)=compliance;
|
|
volfraction(loop,1) = mean(vol);
|
|
disp([' It.: ' sprintf('%4i',loop)...
|
|
' compliance.: ' sprintf('%10.10f',compliance)...
|
|
' volfrac:' sprintf('%10.10f',mean(vol))...
|
|
' change.: ' sprintf('%6.3f',change )]);
|
|
a_log{loop,1}=a;a_log{loop,2}=aPhys;
|
|
b_log{loop,1}=b;b_log{loop,2}=bPhys;
|
|
c_log{loop,1}=c;c_log{loop,2}=cPhys;
|
|
% num_unconnect=connect_check(a,b,c).'
|
|
% [num_unconnect,cnstrt1,cnstrt2,cnstrt3,cnstrt4]=connect_check(a,b,c);
|
|
% disp(num_unconnect.')
|
|
% disp([sum(cnstrt1),sum(cnstrt2),sum(cnstrt3),sum(cnstrt4)])
|
|
% plot_comp(comp);
|
|
|
|
% plot_distributions(aPhys,bPhys,cPhys);
|
|
plot_convergence_all(loop,maxloop,sumCompliance,volfraction);
|
|
|
|
tim(loop)=toc;
|
|
% save('ani_fittingALL_pnorm5.mat','aPhys','bPhys','cPhys',...
|
|
% 'sumCompliance','volfraction','a_log','b_log','c_log','tim');
|
|
% save ani_DATA_cab.mat
|
|
end
|
|
disp(['Time = ',num2str(sum(tim))])
|
|
% ch=interp_ch(aPhys,bPhys,cPhys);
|
|
% [ch_dc]=interp_ch_dc(aPhys,bPhys,cPhys);
|
|
% ke_all=lk_all(ch);ke_dc=lk_all(ch_dc);
|
|
% U=FEM_Beam(nx,ny,nz,ke_all);
|
|
% [comp,compliance,dcdc] = COMP(U,ke_all,ke_dc,nx,ny,nz);
|
|
|
|
disp(['C = ',num2str(compliance)])
|
|
figure()
|
|
set(gcf,'position',[100 650 300 300])
|
|
cc = squeeze(comp(:,1,:));
|
|
colormap(1-gray); imagesc(cc);
|
|
axis equal; axis tight; axis off;
|
|
% title('Compliance Distribution')
|
|
set(gca,'YDir','normal')
|
|
end
|
|
|
|
function plot_convergence_all(loop,maxloop,sumCompliance,volfraction)
|
|
figure(3)
|
|
% figure()
|
|
% loop=75;maxloop=loop;
|
|
set(gcf,'position',[100 100 1200 400])
|
|
subplot(2,1,1)
|
|
plotC=sumCompliance.';
|
|
plot([1:loop].',plotC(1:loop))
|
|
xlim([0 maxloop])
|
|
subplot(2,1,2)
|
|
plotV=volfraction.';
|
|
plot([1:loop].',plotV(1:loop))
|
|
xlim([0 maxloop])
|
|
pause(1e-6);
|
|
end
|
|
|
|
function [a,b,c,aPhys,bPhys,cPhys,xold1,xold2,change,compliance,vol,low,upp,comp]=...
|
|
optimizeABC(a,b,c,aPhys,bPhys,cPhys,xold1,xold2,Hs,H,volfrac,low,upp,nx,ny,nz,loop,a0,a1,x_MMA,d,...
|
|
n,m,xmin,xmax)
|
|
nele = nx * ny * nz;
|
|
ch=interp_ch(aPhys,bPhys,cPhys);
|
|
ke_all=lk_all(ch);
|
|
U=FEM_Beam(nx,ny,nz,ke_all);
|
|
|
|
[ch_da]=interp_ch_da(aPhys,bPhys,cPhys);
|
|
[ch_db]=interp_ch_db(aPhys,bPhys,cPhys);
|
|
[ch_dc]=interp_ch_dc(aPhys,bPhys,cPhys);
|
|
ke_da=lk_all(ch_da);
|
|
ke_db=lk_all(ch_db);
|
|
ke_dc=lk_all(ch_dc);
|
|
[~,~,dcdb] = COMP(U,ke_all,ke_db,nx,ny,nz);
|
|
[~,~,dcda] = COMP(U,ke_all,ke_da,nx,ny,nz);
|
|
[comp,compliance,dcdc] = COMP(U,ke_all,ke_dc,nx,ny,nz);
|
|
|
|
[dvda]=interp_dvda(aPhys(:),bPhys(:),cPhys(:));
|
|
[dvdb]=interp_dvdb(aPhys(:),bPhys(:),cPhys(:));
|
|
[dvdc]=interp_dvdc(aPhys(:),bPhys(:),cPhys(:));
|
|
|
|
dv=[dvda;dvdb;dvdc];
|
|
xval=[aPhys(:);bPhys(:);cPhys(:)];
|
|
f0val = compliance;
|
|
df0dx = [dcda(:);dcdb(:);dcdc(:)];
|
|
vol=interp_v(aPhys(:),bPhys(:),cPhys(:));
|
|
fval = sum(vol)/(volfrac*nele)-1;
|
|
dfdx = dv(:)' / (volfrac*nele);
|
|
|
|
|
|
[xmma, ~, ~, ~, ~, ~, ~, ~, ~, low,upp] = ...
|
|
mmasub(m, n, loop, xval, xmin, xmax, xold1, xold2, ...
|
|
f0val,df0dx,fval,dfdx,low,upp,a0,a1,x_MMA,d);
|
|
|
|
a = reshape(xmma(1:nele),nz,ny,nx);
|
|
b = reshape(xmma((nele+1):2*nele),nz,ny,nx);
|
|
c = reshape(xmma((2*nele+1):n),nz,ny,nx);
|
|
aPhys(:) = (double(H)*double(a(:)))./double(Hs);
|
|
bPhys(:) = (double(H)*double(b(:)))./double(Hs);
|
|
cPhys(:) = (double(H)*double(c(:)))./double(Hs);
|
|
xold2 = xold1(:);
|
|
xold1 = xval(:);
|
|
|
|
change = max(max(abs([a(:);b(:);c(:)]-xval)));
|
|
|
|
end
|
|
|
|
function [num_unconnect,cnstrt1,cnstrt2,cnstrt3,cnstrt4]=connect_check(a,b,c)
|
|
num_unconnect=zeros(4,1);
|
|
cnstrt1 = -1-a(:)-b(:)-c(:);
|
|
cnstrt2 = -(-1+a(:)+b(:)-c(:));
|
|
cnstrt3 = -(1-a(:)+b(:)-c(:));
|
|
cnstrt4 = -(1+a(:)-b(:)-c(:));
|
|
num_unconnect(1)=sum(cnstrt1>0);
|
|
num_unconnect(2)=sum(cnstrt2>0);
|
|
num_unconnect(3)=sum(cnstrt3>0);
|
|
num_unconnect(4)=sum(cnstrt4>0);
|
|
end
|
|
|