% Quadratic boundary conditions function [ufixed,border, freedofs] = microQBC(nelx,nely,cx,cy) nodenrs = reshape(1:(1 + nelx) * (1 + nely), 1 + nely, 1 + nelx); e0 = eye(9); testNum = size(e0,1); ufixed = zeros(2*(nely + 1)*(nelx + 1), testNum); alldofs = 1:2 * (nely + 1) * (nelx + 1); n1 = [nodenrs(end, [1, end]), nodenrs(1, [end, 1])]; d1 = reshape([2 * n1 - 1; 2 * n1], 1, 8); % four corner points n3 = [nodenrs(2:end - 1, 1)', nodenrs(end, 2:end - 1)]; d3 = reshape([2 * n3 - 1; 2 * n3], 1, 2 * (nelx + nely - 2)); % left+bottom boundaries n4 = [nodenrs(2:end - 1, end)', nodenrs(1, 2:end - 1)]; d4 = reshape([2 * n4 - 1; 2 * n4], 1, 2 * (nelx + nely - 2)); % right+up boundaries d2 = setdiff(alldofs, [d1, d4, d3]); coor1m = [cx(end, [1, end]), cx(1, [end, 1]); cy(end, [1, end]), cy(1, [end, 1])]; coor3m = [cx(2:end - 1, 1)', cx(end, 2:end - 1); cy(2:end - 1, 1)', cy(end, 2:end - 1)]; coor4m = [cx(2:end - 1, end)', cx(1, 2:end - 1); cy(2:end - 1, end)', cy(1, 2:end - 1)]; coor1 = coor1m(:); coor3 = coor3m(:); coor4 = coor4m(:); for j = 1:3 e = [e0(1, j), e0(3, j) / 2; e0(3, j) / 2, e0(2, j)]; % d1, corner for i = 1:2:length(d1) ufixed(d1(i:i+1), j) = e * coor1(i:i+1,1); end % border for i = 1:2:length(d3) ufixed(d3(i:i+1), j) = e * coor3(i:i+1,1); ufixed(d4(i:i+1), j) = e * coor4(i:i+1,1); end end if testNum>3 for j = 4:testNum [ex,ey] = strainGradient(e0(:,j)); % d1, corner for i = 1:2:length(d1) coor = [coor1(i,1), coor1(i+1,1)]; ufixed(d1(i), j) = 1/2 * coor * ex * coor'; ufixed(d1(i+1), j) = 1/2 * coor * ey * coor'; end % d3, left+bottom for i = 1:2:length(d3) coor = [coor3(i,1),coor3(i+1,1)]; ufixed(d3(i), j) = 1/2 * coor * ex * coor'; ufixed(d3(i+1), j) = 1/2 * coor * ey * coor'; coor = [coor4(i,1),coor4(i+1,1)]; ufixed(d4(i), j) = 1/2 * coor * ex * coor'; ufixed(d4(i+1), j) = 1/2 * coor * ey * coor'; end end end border = [d1,d3,d4]; freedofs = d2; % test % for j = 1:testNum % figure; % for i = 1:2:length(d1) % coor = ufixed(d1(i:i+1),j)+coor1(i:i+1,1); % scatter(coor(1:2:end),coor(2:2:end),'filled'); hold on; % end % % for i = 1:2:length(d3) % coor = ufixed(d3(i:i+1), j) + coor3(i:i+1,1); % scatter(coor(1:2:end),coor(2:2:end)); hold on; % coor = ufixed(d4(i:i+1), j) + coor4(i:i+1,1); % scatter(coor(1:2:end),coor(2:2:end)); hold on; % end % axis equal; % end end function u = bilinearU(x,y,lx,ly,u0) N1 = (1-x/lx).*(1-y/ly); N2 = x/lx.*(1-y/ly); N3 = x/lx.*y/ly; N4 = (1-x/lx).*y/ly; u1 = N1*u0(1) + N2*u0(3) + N3*u0(5) + N4*u0(7); u2 = N1*u0(2) + N2*u0(4) + N3*u0(6) + N4*u0(8); u = [u1,u2]; end function [gx,gy] = strainGradient(e0) e = zeros(2,2,2); e(1,1,1) = e0(4); e(2,2,1) = e0(5); e(1,2,2) = e0(6); e(2,1,2) = e(1,2,2); e(2,2,2) = e0(7); e(1,1,2) = e0(8); e(1,2,1) = e0(9); e(2,1,1) = e(1,2,1); g111 = secondGradient(e,1,1,1); g121 = secondGradient(e,1,2,1); g112 = secondGradient(e,1,1,2); g122 = secondGradient(e,1,2,2); gx = [g111, g121; g112, g122]; g211 = secondGradient(e,2,1,1); g221 = secondGradient(e,2,2,1); g212 = secondGradient(e,2,1,2); g222 = secondGradient(e,2,2,2); gy = [g211, g221; g212, g222]; end function g = secondGradient(e,i,j,k) g = e(i,j,k)+e(i,k,j) - e(j,k,i); end