xiaoqiushui318 发表于 2010-9-14 09:30:58

几何非线性杆单元,弧长法求解程序

本帖最后由 xiaoqiushui318 于 2010-9-28 09:01 编辑

%
% program for geometric nonlinear truss element
%
clear
colordef white
tic;
% referenc:
% 1 programing the finite element method with matlab
%   by Jack Chessa
%   Northwestern University
% 2 finite element proceduresby K.J. Bathe
%    the example considered P494-495 Example 6.3
%    the formulation can be found on page 542-547
% 3 nonlinear finite element analysis of solids and structures
%    by M.A. Criesfied
%   the algorithm for arc-length method can be found in Chapter 9.3
%
%***************************************************
% INPUT
%***************************************************
disp('*********************************************')
disp('          Running Start')
disp('*********************************************')
disp()
% material property
E0=100000;   %
nu0=0.3;   %
% **************************************************
% generate finite element mesh
% **************************************************
% data structure
% node - is a matrix of the node coordinates, i.e. node(I,j) -> x_Ij
% element - is a matrix of element connectivities, i.e. the connectivity
% of element e is given by > element(e,:) ->
%
disp()
ncoord = 3;
l = 10;                  %length of the element
a = 0.5;                   %section aera
%
% nodal coordinates
%
node=[0.0                0.0            0.0;
      l*cos(pi/12)       l*sin(pi/12)   0.0;
      2.0*l*cos(pi/12)   0.0            0.0 ];
%
% element connectivity
%
element=[12;
         23 ];
      
numnode = size(node,1);    % number of nodes
numelem = size(element,1); % number of elements
enode = 2;
edof = ncoord*enode;       % number of dofs per element
% generate mesh
clf
for lmn = 1:numelem
    sctr = element(lmn,:);
    xcor = node(sctr,1);
    ycor = node(sctr,2);
    zcor = node(sctr,3);
    axis equal;
    axis();
    plot(xcor,ycor,'-o','LineWidth',2,'MarkerEdgeColor','m','MarkerFaceColor','c','MarkerSize',10);
    hold on
end
% set equilibrium iteration controlling data
nstep = 30;
tol = 0.0001;
maxit = 30;          % maximum number of iterations
% nflg convergence indicator
%      = 0 not converged
%      = 1 converged
nflg = 0;

numdof = ncoord*numnode;    % total number of dofs
ft = zeros(numdof,1);       % total applied external load
ft(5) = -2000.;
kg = zeros(numdof);         % global stiffness matrix
ke = zeros(ncoord*enode);   % element stiffness matrix
fu = zeros(numdof,1);       % unbalanced load vector
%react = zeros(numdof,1);   % reaction force
u = zeros(numdof,1);      % total displacement vector
delu = zeros(numdof,1);   % incremental displacement vector
facto = 1.0/nstep;          % incremental loading factor for load control
tfact = 0.0;
SPK2 = zeros(numelem,1);   % local element P-K stress
fe = zeros(ncoord*enode,1);% element internal force
fixedNode = ';          % a vector of the node numbers which are fixed
fixedNodeX = fixedNode;
fixedNodeY = fixedNode + numnode;
fixedNodeZ = ';
udofs = fixedNodeX;             % global indecies of the fixed x displacements
vdofs = fixedNodeY;             % global indecies of the fixed y displacements
wdofs = fixedNodeZ + numnode*2; % all dofs in z direction are fixed
xlgic = ones(numdof,1);         % xlgic is a logic vector indicating the active dofs
                                  % xlgic(i) = 1 --- i'th dof is active
xlgic(udofs) = 0;
xlgic(vdofs) = 0;
xlgic(wdofs) = 0;
xlgic = logical(xlgic);
uthy = ;
fthy = ;
uout = ;
fstep = ;
itnum = [];
slcol = [];

% ********************************************************************
% set arclength parameter
% ********************************************************************
lamda = 0.0;% load factor
dlamda = 0;   % increment of lamda
slmax = 0.5;% maximum arc length allowed
slmin = 0.1;% minimum arc length aloowed
sl = 0.2;   % arc length used
for kstep = 1:nstep
    fu = lamda*ft;    % currently applied external load
    iter = 0;
    ucorr = zeros(numdof,1);
    nflg = 0;         % convergence indicator
% evaluate the tangent stiffness matrix
    for iele = 1:numelem
      sctr = element(iele,:);                         % element scatter vector
      sctrB=; % vector that scatters a B matrix
      nn=length(sctr);
      dHdr = [ -1/2   1/2    0      0      0      0;
               0      0      -1/2   1/2    0      0;
               0      0      0      0      -1/2   1/2];
      x0 = node(sctr,:);
      xv = x0(2,:) - x0(1,:);
      L0 = xv(1,:)*xv(1,:)';
      L0 = sqrt(L0);
         
      drds = 2/L0;
      x0_hat = ';
      ut_hat = ';
      BL0t = drds*drds*(x0_hat'*dHdr'*dHdr + ut_hat'*dHdr'*dHdr);    % linear
      BNL0t = drds *dHdr;                                          % nonlinear
      ke = BL0t'*E0*BL0t*L0*a + BNL0t'*SPK2(iele)*BNL0t*L0*a;
      fe = BL0t'*SPK2(iele)*L0*a;
      kg(sctrB,sctrB) = kg(sctrB,sctrB) + ke;         
      fu(sctrB) = fu(sctrB) - fe;
    end
    while((nflg==0) && (iter<maxit))      
      iter = iter + 1;
% modify the golobal stiffness and force vector to accommodate boudnary condtitions      
       kg(udofs,:)=0; % zero out the rows and columns of the K matrix
       kg(vdofs,:)=0;
       kg(wdofs,:)=0;
       kg(:,udofs)=0;
       kg(:,vdofs)=0;   
       kg(:,wdofs)=0;
       kg(udofs,udofs) = speye(length(udofs));      
       kg(vdofs,vdofs) = speye(length(vdofs));      
       kg(wdofs,wdofs) = speye(length(wdofs));
       fu(udofs) = 0;
       fu(vdofs) = 0;
       fu(wdofs) = 0;
% evaluate the displacement increment due to unbalanced force      
       delu = kg\fu;
% evaluate the displacement due to total external force
       u_bar = kg\ft;
% update the displacement vector
%       u = u + delu;   
      if iter==1
            iii = 0;
            if det(kg)>0
            dlamda = sl/sqrt(u_bar'*u_bar);
            else
            dlamda = -sl/sqrt(u_bar'*u_bar);
            end
%         dl = u_bar'*u_bar;
      end
% determine the incremental lamda
%
      if iter~=1
          c1 = u_bar(xlgic)'*u_bar(xlgic);
          c2 = 2*(ucorr(xlgic)+delu(xlgic))'*u_bar(xlgic);
          c3 = (ucorr(xlgic)+delu(xlgic))'*(ucorr(xlgic)+delu(xlgic))-sl^2;
          c4 = c2^2-4*c1*c3;
          if c1 == 0 && c2 ~= 0
            dlamda = -c3/c2;
            disp('only one root find');            
          elseif c1 ~=0 && c4>=0
            c4 = sqrt(c4);
            dlamda1 = (-c2 + c4)/(2*c1);
            dlamda2 = (-c2 - c4)/(2*c1);
            d1 = ucorr(xlgic)'*(ucorr(xlgic)+delu(xlgic)+dlamda1*u_bar(xlgic));
            d2 = ucorr(xlgic)'*(ucorr(xlgic)+delu(xlgic)+dlamda2*u_bar(xlgic));
            dlamda = dlamda1;
            if d1<d2
               dlamda =dlamda2;
            end
          elseif c1~=0 && c4<0
            disp('no real root find');
            exit;
          end
      end
      lamda = lamda + dlamda;      
      delu = delu + dlamda*u_bar;
      u = u + delu;
      ucorr = ucorr+delu;
      fu = lamda*ft;
% loop over all elements to evaluate the element internal force      
      for iele = 1:numelem
         sctr = element(iele,:); % element scatter vector
         sctrB=; % vector that scatters a B matrix
         nn=length(sctr);         
         dHdr = [ -1/2   1/2    0      0      0      0;
                  0      0      -1/2   1/2    0      0;
                  0      0      0      0      -1/2   1/2];         
         x0 = node(sctr,:);
         xv0 = x0(2,:) - x0(1,:);
         L0 = dot(xv0,xv0);
         L0 = sqrt(L0);   
         drds = 2/L0;
         x0_hat = ';
         ut_hat = ';         
         xv = x0(2,:) + ut_hat(2:2:edof)' - (x0(1,:) + ut_hat(1:2:edof)');            
         Ln = dot(xv,xv);
         Ln = sqrt(Ln);
         delL = Ln - L0;
         Epsilon0 = delL/L0;
         Sigama0 = E0*Epsilon0;
         SPK2(iele) = Sigama0;         
         BL0t = drds*drds*(x0_hat'*dHdr'*dHdr + ut_hat'*dHdr'*dHdr);    % linear
         fe = BL0t'*Sigama0*L0*a;                  
         fu(sctrB) = fu(sctrB) - fe;
      end      
%judge whethere convergence is attained
      residu = sum(abs(fu(xlgic)))/sum(abs(ft(xlgic)));
      if residu < tol
         nflg = 1;
      end
%evaluate the geometric stiffness matrix
       kg = zeros(numdof);      
%loop over all elements to evaluate the element geometric stiffness matrix
      for iele = 1:numelem
         sctr = element(iele,:); % element scatter vector
         sctrB=; % vector that scatters a B matrix         
         x0 = node(sctr,:);
         xv = x0(2,:) - x0(1,:);
         L0 = dot(xv,xv);
         L0 = sqrt(L0);   
         drds = 2/L0;
         dHdr = [ -1/2   1/2    0      0      0      0;
                  0      0      -1/2   1/2    0      0;
                  0      0      0      0      -1/2   1/2];   
         x0_hat = ';
         ut_hat = ';         
         Sigama0 = SPK2(iele);                  
         BL0t = drds*drds*(x0_hat'*dHdr'*dHdr + ut_hat'*dHdr'*dHdr);    % linear
         BNL0t = drds *dHdr;                                          % nonlinear
         ke = BL0t'*E0*BL0t*L0*a + BNL0t'*Sigama0*BNL0t*L0*a;
         kg(sctrB,sctrB) = kg(sctrB,sctrB) + ke;                                          
      end      
%evaluation geometric stiffness matrix finished
    end
%convergence attained at current step
   disp([' step ', num2str(kstep), ' passed '])
   uout = ;
   fstep = ;
%    fstep = ;
   itnum = ;
   itero = iter;   
   uo = u;
   lamdao = lamda;
   
   if sl>slmax
       sl = slmax;
   elseif sl<slmin
       sl = slmin;
   end
   slcol = ;
% %evaluate analytical solution according to finite element procedures K.J.
% %Bathe P 495
%   deltau = abs(u(5));
%   xxt = (-1. + 1/sqrt(1-2*deltau/Ln*sin(pi/12)+(deltau/Ln)^2))*(sin(pi/12)-deltau/Ln);
%   fthy = ;
% %    xxt = (-1. + 1/sqrt(1-2*delL/Ln*sin(pi/12)+(delL/Ln)^2))*(sin(pi/12)-delL/Ln);
%   xxt = u(5)/Ln;
%   uthy = ;
end
uout = -uout';
fstep = fstep';
itnum = itnum';
fthy = fthy';
uthy = -uthy';
slcol = slcol';
figure
hold on
plot(uout,fstep,'-ob')
xlabel('displacement')
ylabel('load')
% figure
% hold on
% plot(uthy,fthy,'-or')
% xlabel('displacement')
% ylabel('load')
%

xiaoqiushui318 发表于 2010-9-14 09:32:34

笑脸为冒号加单括号

jsl024110 发表于 2010-9-27 10:13:52

好的学习资料,谢谢楼主分享!!!

renyz518 发表于 2010-10-5 00:08:38

谢谢啊!很实用!

zh123168 发表于 2011-1-11 19:01:24

虽然现在还有点不懂,但是我认为本论坛的强人还是不少的。感谢分享程序!
页: [1]
查看完整版本: 几何非线性杆单元,弧长法求解程序