%-------------------------- % @Author: Jingqiao Hu % @Date: 2021-02-22 16:13:23 % @LastEditTime: 2022-05-10 19:43:07 % Global node-ID is ordered as y(1-0) -> x(0-1) -> z(0-1) % y % | % 0---x % / % z %-------------------------- function [freedofs, fixeddofs, fext, alldofs] = design_domain(opt_design, ... maxx, minx, maxy, miny, maxz, minz, vF, nodes, optChanged) nodes(:,4) = 1:size(nodes,1); switch opt_design case 'halfsp' vF = -vF; r = (maxx - minx) / 5; midx = (maxx - minx) / 2 + minx; midz = (maxz - minz) / 2 + minz; [loadnid, ~] = find(abs(nodes1(:,2)-maxy) 0); cz_positive(cz < 0) = -1; cy_positive = double(cy > 0); cy_positive(cy < 0) = -1; vF_y0 = vF0 * cosa; vF_z0 = vF0 * sina; vF_y = vF_y0 .* (-cz_positive); vF_z = vF_z0 .* (cy_positive); vF = [vF_y(:), vF_z(:)]; end function [loaddofs, loadnid, vF] = twisting_force_face(globalx, globaly, globalz, vF0) midy = round(globaly / 2); midz = round(globalz / 2); nnodes = (1) *(globaly+1) *(globalz+1); loaddofs = zeros(nnodes, 2); vF = zeros(nnodes, 2); loadnid = zeros(nnodes, 1); for i = globalx : globalx for j = 0 : globaly for k = 0 : globalz vy = (globaly-j)-midy; vz = k-midz; vv = vy^2 + vz^2; cosa = sqrt(vz^2 / vv); sina = sqrt(vy^2 / vv); vF_y0 = vF0 * cosa; vF_z0 = vF0 * sina; if vz > 0 vF_y = -vF_y0; elseif vz < 0 vF_y = vF_y0; else vF_y = 0; end if vy > 0 vF_z = vF_z0; elseif vy < 0 vF_z = -vF_z0; else vF_z = 0; end idx = j + (i-globalx) * (globaly+1) + k * 1 * (globaly+1) + 1; loadnid0 = j + i * (globaly+1) + k * (globalx+1) * (globaly+1) + 1; loaddofs(idx, :) = [3 * loadnid0-1, 3 * loadnid0]; vF(idx, :) = [vF_y, vF_z]; loadnid(idx) = loadnid0; end end end % idx = loaddofs>0; % loaddofs = loaddofs(idx); % vF = vF(idx); % loadnid = loadnid(loadnid>0); end function [loaddofs, loadnid, vF] = twisting_force_body(globalx, globaly, globalz, vF0) midy = round(globaly / 2); midz = round(globalz / 2); nnodes = (globalx) *(globaly+1) *(globalz+1); loaddofs = zeros(nnodes, 2); vF = zeros(nnodes, 2); loadnid = zeros(nnodes, 1); for i = 1 : globalx for j = 0 : globaly for k = 0 : globalz vy = (globaly-j)-midy; vz = k-midz; vv = vy^2 + vz^2; cosa = sqrt(vz^2 / vv); sina = sqrt(vy^2 / vv); vF_y0 = vF0 * cosa; vF_z0 = vF0 * sina; if vz > 0 vF_y = -vF_y0; elseif vz < 0 vF_y = vF_y0; else vF_y = 0; end if vy > 0 vF_z = vF_z0; elseif vy < 0 vF_z = -vF_z0; else vF_z = 0; end idx = j + (i-1) * (globaly+1) + k * globalx * (globaly+1) + 1; loadnid0 = j + i * (globaly+1) + k * (globalx+1) * (globaly+1) + 1; loaddofs(idx, :) = [3 * loadnid0-1, 3 * loadnid0]; vF(idx, :) = [vF_y, vF_z]; loadnid(idx) = loadnid0; end end end % idx = loaddofs>0; % loaddofs = loaddofs(idx); % vF = vF(idx); % loadnid = loadnid(loadnid>0); end % apply force on nodes coordinates at (vx,vy,vz) = vF % if vx / vy / vz < 0, means taking all indices function [loadnid, vF3] = project_force(vx, vy, vz, vF, nodes) if vx > -1e-3 % valid v = min(abs(nodes(:,1) - vx)); [ix, ~] = find(abs(nodes(:,1)-v-vx) < 1e-3); nodes1 = nodes(ix, :); else nodes1 = nodes; end if vz > -1e-3 % valid v = min(abs(nodes1(:,3) - vz)); [iz, ~] = find(abs(nodes1(:,3)-v-vz) < 1e-3); nodes2 = nodes1(iz, :); else nodes2 = nodes1; end if vy > -1e-3 % valid v = min(abs(nodes2(:,2) - vy)); [iy, ~] = find(abs(nodes2(:,2)-v-vy) < 1e-3); loadnid = nodes2(iy, 4); else loadnid = nodes2(:, 4); end vF3 = repmat(vF, length(loadnid), 1); end function F = neighbors_F(f_i, f_j ,f_k, fv, step, nelx, nely, nelz) nodes_num = (nelx+1)*(nely+1)*(nelz+1); F = zeros(nodes_num, 3); numj = length(f_j); for i = max(f_i-step, 1) : min(f_i+step, nelx+1) for k = max(f_k-step, 1) : min(f_k+step, nelz+1) dist = sqrt((i-f_i)^2 + (k-f_k)^2); if dist > step continue; else fz = dist / step * fv/2; % new fv nid = f_j + (i-1) * (nely+1) + (k-1)*(nely+1)*(nelx+1); F(nid, :) = repmat([0, 0, fz], numj, 1); end end end end