Advertisement
PashaYa

Untitled

Jan 20th, 2019
137
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 6.17 KB | None | 0 0
  1. %[delta_U ,new_coordinate_sum ,K] = FEM_for_linear_tasks(D ,N ,M ,t ,Cn ,Cs ,overloaded_elements ,overloaded_contact_elements ,point_global_number_sum  ,coordinate_sum ,point_stress ,local_forse)
  2.        
  3. function [delta_U ,new_coordinate_sum ,K] = FEM_for_linear_tasks(D ,N ,M ,t ,Cn ,Cs ,overloaded_elements ,overloaded_contact_elements ,point_global_number_sum  ,coordinate_sum ,point_stress ,local_forse)
  4.        
  5.         % Create stiffness global matrix
  6.        
  7.             K = zeros(2*2*N*M);
  8.    
  9.         % Create stiffness local matrix
  10.             for i = 1:(N-1)*(2*M-1)%length(overloaded_elements)
  11.                
  12.                 if i > (N-1)*(M-1) && i <= M*(N-1)
  13.                    
  14.                     % Overload check at contact element
  15.                     j = i - (N-1)*(M-1);
  16.                     if abs(overloaded_contact_elements(j ,2)) > 0
  17.                         C_s = 0;
  18.                         C_n = 0;
  19.                     elseif abs(overloaded_contact_elements(j ,1)) > 0
  20.                         C_s = 0;
  21.                         C_n = Cn;
  22.                     else
  23.                         C_s = Cs;
  24.                         C_n = Cn;
  25.                     end
  26.                    
  27.                     % Stiffness matrix (B'*C*B)
  28.                         K_contact_local = 1/3*[ 2*C_s,      0,    C_s,      0,   -C_s,      0, -2*C_s,      0;
  29.                                                     0,  2*C_n,      0,    C_n,      0,   -C_n,      0, -2*C_n;
  30.                                                   C_s,      0,  2*C_s,      0, -2*C_s,      0,   -C_s,      0;
  31.                                                     0,    C_n,      0,  2*C_n,      0, -2*C_n,      0,   -C_n;
  32.                                                  -C_s,      0, -2*C_s,      0,  2*C_s,      0,    C_s,      0;
  33.                                                     0,   -C_n,      0, -2*C_n,      0,  2*C_n,      0,    C_n;
  34.                                                -2*C_s,      0,   -C_s,      0,    C_s,      0,  2*C_s,      0;
  35.                                                     0, -2*C_n,      0,   -C_n,      0,    C_n,      0,  2*C_n];
  36.                     K_local = K_contact_local;
  37.                 else
  38.                    
  39.                     % Overload check at element
  40.                     if i <= (N-1)*(M-1) && overloaded_elements(i) == 0
  41.                         D_local = D;
  42.                     elseif i <= (N-1)*(M-1) && overloaded_elements(i) > 0
  43.                         D_local = D/2;
  44.                     elseif i > M*(N-1) && overloaded_elements(i - (N-1)) == 0
  45.                         D_local = D;
  46.                     else
  47.                         D_local = D;
  48.                     end
  49.                    
  50.                     K_local = zeros(8);
  51.                    
  52.                     a = ( abs(coordinate_sum(point_global_number_sum(i,1) ,1) - coordinate_sum(point_global_number_sum(i,2) ,1)) + abs(coordinate_sum(point_global_number_sum(i,3) ,1) - coordinate_sum(point_global_number_sum(i,4) ,1)) )/4;
  53.                     b = ( abs(coordinate_sum(point_global_number_sum(i,1) ,2) - coordinate_sum(point_global_number_sum(i,4) ,2)) + abs(coordinate_sum(point_global_number_sum(i,2) ,2) - coordinate_sum(point_global_number_sum(i,3) ,2)) )/4;
  54.                    
  55.                     for k = 1:1:2
  56.                         xi = 0 + ((-1)^k)*1/sqrt(3);
  57.                         for l = 1:1:2
  58.                             eta = 0 + ((-1)^l)*1/sqrt(3);
  59.                             B = [-b*(1-eta),          0, b*(1-eta),         0, b*(1+eta),         0, -b*(1+eta),          0;
  60.                                           0,  -a*(1-xi),         0, -a*(1+xi),         0,  a*(1+xi),          0,   a*(1-xi);
  61.                                   -a*(1-xi), -b*(1-eta), -a*(1+xi), b*(1-eta),  a*(1+xi), b*(1+eta),   a*(1-xi), -b*(1+eta)]/(4*a*b);
  62.                             K_local = K_local + t*a*b*(4*a*b)*B'*D_local*B;
  63.                         end
  64.                     end
  65.                 end
  66.                
  67.             % load K_local in K_global
  68.                 for k = 1:1:8
  69.                     node1 = point_global_number_sum(i,fix((k+1)/2));
  70.                     mod1 = mod(k,2);
  71.                     for l = 1:1:8
  72.                         node2 = point_global_number_sum(i,fix((l+1)/2));
  73.                         mod2 = mod(l,2);
  74.                         K(2*node1-mod1,2*node2-mod2) = K(2*node1-mod1,2*node2-mod2) + K_local(k,l);
  75.                     end
  76.                 end
  77.             end
  78.            
  79.         % Create fixed
  80. %             bound = find(point_global_number_sum(:,2) == 0)
  81. %             for i = 1:1:size(bound,1)
  82. %                 for j = -1:1:0
  83. %                     K(2*bound(i)+j, :) = 0;
  84. %                     K(2*bound(i)+j,2*bound(i)+j) = 1;
  85. %                 end
  86. %             end
  87.             for ni = 1:2*N
  88.                 for nj = 1:2*N
  89.                     if ni == nj
  90.                         K(ni ,nj) =1;
  91.                     else
  92.                         K(ni ,nj) =0;
  93.                     end
  94.                 end
  95.             end
  96.                
  97. %             for ni = 1:2*N
  98. %                 K(ni ,:) = [];
  99. %                 K(: ,ni) = [];
  100. %             end
  101.            
  102.         % Create force
  103.        
  104.             F = zeros(2*2*N*M,1);
  105.             for i = 1:length(point_stress)
  106.                 F(point_stress(i)*2 - 1) = local_forse(i ,1)*t;
  107.                 F(point_stress(i)*2) = local_forse(i ,2)*t;
  108.             end
  109.            
  110. %             for ni = 1:2*N
  111. %                 F(ni) = [];
  112. %             end
  113.        
  114.         % Solve system
  115.  
  116. %             short_U = K\F;
  117. %            
  118. %             delta_U = zeros(2*M*N,1);
  119. %            
  120. %             for ni = 1:length(short_U)
  121. %                 delta_U(ni + 2*N) = short_U(ni);
  122. %             end
  123. %            
  124.  
  125.             delta_U = K\F;
  126.            
  127.            
  128.         % New coordinate grid
  129.            
  130.             new_coordinate_sum = coordinate_sum;
  131.             for i = 1:max(size(coordinate_sum))
  132.                 new_coordinate_sum(i ,1) = new_coordinate_sum(i ,1) + delta_U(2*i - 1);
  133.                 new_coordinate_sum(i ,2) = new_coordinate_sum(i ,2) + delta_U(2*i);
  134.             end
  135. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement