%-------------------------- % @Author: Jingqiao Hu % @Date: 2021-11-01 16:00:36 % @LastEditTime: 2022-01-12 20:51:13 % NOTE: the bounding box is [minx, maxx] & [miny, maxy] %-------------------------- function [freedofs, fixeddofs, fext, alldofs] = design_domain_nonregular(nodes, ... opt, vF, minx, maxx, miny, maxy) nodes(:,3) = 1 : size(nodes,1); switch opt case 'Lshape' % fixed: (:, maxy) [ix, ~] = find(abs(nodes(:,2)-maxy) < 1e-5); fixednid = nodes(ix, 3); fixeddofs = [2*fixednid(:), 2*fixednid(:)-1]'; % load: (maxx, 0) on y [ix, ~] = find(abs(nodes(:, 1)-maxx) < 1e-5); nodes1 = nodes(ix, :); [iy, ~] = find(abs(nodes1(:, 2)) < 1e-5); loadnid = nodes1(iy, 3); loaddofs = 2 * loadnid; vF = -vF; case 'cantilever' % fixed: (minx, :) [ix, ~] = find(abs(nodes(:,1)-minx) < 1e-5); fixednid = nodes(ix, 3); fixeddofs = [2*fixednid(:), 2*fixednid(:)-1]'; % load: (maxx, miny) on y [ix, ~] = find(abs(nodes(:, 1)-maxx) < 1e-5); nodes1 = nodes(ix, :); [iy, ~] = find(abs(nodes1(:, 2)-miny) < 1e-5); loadnid = nodes1(iy, 3); loaddofs = 2 * loadnid; vF = -vF; case 'michell' % fixed: (minx, :) [ix, ~] = find(abs(nodes(:,1)-minx) < 1e-5); fixednid = nodes(ix, 3); fixeddofs = [2*fixednid(:), 2*fixednid(:)-1]'; % load: (maxx, (maxy-miny)/2) on y [ix, ~] = find(abs(nodes(:, 1)-maxx) < 1e-5); nodes1 = nodes(ix, :); [iy, ~] = find(abs(nodes1(:, 2)-(maxy-miny)/2) < 1e-5); loadnid = nodes1(iy, 3); loaddofs = 2 * loadnid; vF = [-vF,vF]*sqrt(2)/2; end % figure; scatter(nodes(:,1), nodes(:,2)); hold on; % scatter(nodes(fixednid,1), nodes(fixednid,2), 'filled', 'r'); hold on; % scatter(nodes(loadnid,1), nodes(loadnid,2), 'filled', 'k'); alldofs = size(nodes, 1) * 2; fixeddofs = fixeddofs(:); freedofs = setdiff(1:alldofs, fixeddofs); fext = sparse(loaddofs(:), 1, vF(:), alldofs, 1); end