top(nelx,nely,volfrac,penal,rmin)
It.: 1 Obj.: 412.2715 Vol.: 0.500 ch.: 0.200
It.: 2 Obj.: 151.6200 Vol.: 0.500 ch.: 0.200
It.: 3 Obj.: 87.9676 Vol.: 0.500 ch.: 0.200
It.: 4 Obj.: 68.3247 Vol.: 0.500 ch.: 0.200
It.: 5 Obj.: 62.7476 Vol.: 0.500 ch.: 0.200
It.: 6 Obj.: 60.3618 Vol.: 0.500 ch.: 0.177
It.: 7 Obj.: 59.1843 Vol.: 0.500 ch.: 0.137
It.: 8 Obj.: 58.5941 Vol.: 0.500 ch.: 0.100
It.: 9 Obj.: 58.2952 Vol.: 0.500 ch.: 0.079
It.: 10 Obj.: 58.1486 Vol.: 0.500 ch.: 0.072
It.: 11 Obj.: 58.0727 Vol.: 0.500 ch.: 0.077
It.: 12 Obj.: 58.0302 Vol.: 0.500 ch.: 0.076
It.: 13 Obj.: 57.9873 Vol.: 0.500 ch.: 0.071
It.: 14 Obj.: 57.9625 Vol.: 0.500 ch.: 0.060
It.: 15 Obj.: 57.9408 Vol.: 0.500 ch.: 0.052
It.: 16 Obj.: 57.9246 Vol.: 0.500 ch.: 0.046
It.: 17 Obj.: 57.9121 Vol.: 0.500 ch.: 0.040
It.: 18 Obj.: 57.8949 Vol.: 0.500 ch.: 0.033
It.: 19 Obj.: 57.8900 Vol.: 0.500 ch.: 0.027
It.: 20 Obj.: 57.8876 Vol.: 0.500 ch.: 0.022
It.: 21 Obj.: 57.8866 Vol.: 0.500 ch.: 0.018
It.: 22 Obj.: 57.8857 Vol.: 0.500 ch.: 0.014
It.: 23 Obj.: 57.8763 Vol.: 0.500 ch.: 0.012
It.: 24 Obj.: 57.8825 Vol.: 0.500 ch.: 0.010
function top(nelx,nely,volfrac,penal,rmin);
x(1:nely,1:nelx) = volfrac;
passive = zeros(nely,nelx);
if sqrt((ely-nely/2.)^2+(elx-nelx/3.)^2) < nely/3.
[U]=FE(nelx,nely,x,penal);
n1 = (nely+1)*(elx-1)+ely;
Ue = U([2*n1-1;2*n1; 2*n2-1;2*n2; 2*n2+1;2*n2+2; 2*n1+1;2*n1+2],1);
c = c + x(ely,elx)^penal*Ue'*KE*Ue;
dc(ely,elx) = -penal*x(ely,elx)^(penal-1)*Ue'*KE*Ue;
[dc] = check(nelx,nely,rmin,x,dc);
[x] = OC(nelx,nely,x,volfrac,dc,passive);
change = max(max(abs(x-xold)));
disp([' It.: ' sprintf('%4i',loop) ' Obj.: ' sprintf('%10.4f',c) ...
' Vol.: ' sprintf('%6.3f',sum(sum(x))/(nelx*nely)) ...
' ch.: ' sprintf('%6.3f',change )])
colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);
function [xnew]=OC(nelx,nely,x,volfrac,dc,passive)
l1 = 0; l2 = 100000; move = 0.2;
xnew = max(0.001,max(x-move,min(1.,min(x+move,x.*sqrt(-dc./lmid)))));
xnew(find(passive)) = 0.001;
if sum(sum(xnew)) - volfrac*nelx*nely > 0;
function [dcn]=check(nelx,nely,rmin,x,dc)
for k = max(i-floor(rmin),1):min(i+floor(rmin),nelx)
for l = max(j-floor(rmin),1):min(j+floor(rmin),nely)
fac = rmin-sqrt((i-k)^2+(j-l)^2);
dcn(j,i) = dcn(j,i) + max(0,fac)*x(l,k)*dc(l,k);
dcn(j,i) = dcn(j,i)/(x(j,i)*sum);
function [U]=FE(nelx,nely,x,penal)
K = sparse(2*(nelx+1)*(nely+1), 2*(nelx+1)*(nely+1));
F = sparse(2*(nely+1)*(nelx+1),1); U = zeros(2*(nely+1)*(nelx+1),1);
n1 = (nely+1)*(elx-1)+ely;
edof = [2*n1-1; 2*n1; 2*n2-1; 2*n2; 2*n2+1; 2*n2+2; 2*n1+1; 2*n1+2];
K(edof,edof) = K(edof,edof) + x(ely,elx)^penal*KE;
fixeddofs = union([1:2:2*(nely+1)],[2*(nelx+1)*(nely+1)]);
alldofs = [1:2*(nely+1)*(nelx+1)];
freedofs = setdiff(alldofs,fixeddofs);
U(freedofs,:) = K(freedofs,freedofs) \ F(freedofs,:);
k=[ 1/2-nu/6 1/8+nu/8 -1/4-nu/12 -1/8+3*nu/8 ...
-1/4+nu/12 -1/8-nu/8 nu/6 1/8-3*nu/8];
KE = E/(1-nu^2)*[ k(1) k(2) k(3) k(4) k(5) k(6) k(7) k(8)
k(2) k(1) k(8) k(7) k(6) k(5) k(4) k(3)
k(3) k(8) k(1) k(6) k(7) k(4) k(5) k(2)
k(4) k(7) k(6) k(1) k(8) k(3) k(2) k(5)
k(5) k(6) k(7) k(8) k(1) k(2) k(3) k(4)
k(6) k(5) k(4) k(3) k(2) k(1) k(8) k(7)
k(7) k(4) k(5) k(2) k(3) k(8) k(1) k(6)
k(8) k(3) k(2) k(5) k(4) k(7) k(6) k(1)];