0002 0003 // OBJETIVO: Determina o caminho de equil�brio usando 0004 // o algoritmo de comprimento de arco de Riks. 0005 // 0006 // ENTRADA 0007 // a0 - vetor de posi��es iniciais. 0008 // edof - matriz com a topologia dos graus de liberdade. 0009 // fhat - vetor de forcas fixo. 0010 // bc - matriz das condi��es de contorno: 0011 // size(bc) � [n,2], onde n � um n�mero de condi��es 0012 // de contorno. 0013 // ep - propriedades do elemento. 0014 // el0 - vetor com o comprimento inicial de cada elemento. 0015 // st - Medida de deforma��o: 0016 // 1 - deforma��o de Green; 0017 // 2 - deforma��o de engenharia; 0018 // 3 - deforma��o logar�tmica; 0019 // 4 - deforma��o logar�tmica com mudan�a de volume. 0020 // dl - comprimento de arco inicial. 0021 // maxCycle - n�mero m�ximo de ciclos. 0022 // id - n�mero desejado de itera��es em cada ciclo. 0023 // dofPath - vetor com os graus de liberdade de interesse 0024 // - para a an�lise (e.g., para gerar gr�ficos). 0025 // 0026 // SA�DA 0027 // aPath - caminho de equil�brio dos graus de liberdade 0028 // especif�cados no vetor dofPath. 0029 // size(aPath) � [m,n], onde m � o n�mero 0030 // de ciclos e n � o tamanho do vetor dofPath. 0031 // lamPath - caminho de equil�brio do fator de carga. 0032 // fail - retorna %f se o algoritmo falhou em algum 0033 // ciclo. Retorna %t se foi bem sucedido. 0034 0035 fail = %f; 0036 tol = 1.0e-4; 0037 maxInt = 10; 0038 maxLam = 1.0e20; 0039 aPath = []; 0040 lamPath = []; 0041 lam = 0.0; 0042 a = a0; 0043 da = zeros(a0); 0044 for cycle=1:maxCycle 0045 [fint,k1] = stiff(a,edof,ep,el0,st); 0046 d1 = linearSolver(k1,fhat,bc); 0047 dlam = dl/norm(d1); 0048 if (da'*d1 < 0) then 0049 dlam = -dlam; 0050 end 0051 da1 = dlam*d1; 0052 da = da1; 0053 fint = stiff(a+da,edof,ep,el0,st); 0054 res = fint-(lam+dlam)*fhat; 0055 for i=1:maxInt 0056 d2 = linearSolver(k1,-res,bc); 0057 ddlam = (-da1'*d2)/(da1'*d1); 0058 dda = d2+ddlam*d1; 0059 dlam = dlam+ddlam; 0060 da = da+dda; 0061 fint = stiff(a+da,edof,ep,el0,st); 0062 res = fint-(lam+dlam)*fhat; 0063 if dofNorm(res,bc) < tol*dofNorm(fhat,bc) then 0064 break; 0065 end 0066 end 0067 if (i>=maxInt) then 0068 printf("nao convergiu!\n"); 0069 fail = %t; 0070 return; 0071 end 0072 lam = lam+dlam; 0073 if (lam > maxLam) then 0074 printf("fator de carga excedeu o limite!\n"); 0075 fail = %t; 0076 return; 0077 end 0078 a = a+da; 0079 aPath(:,cycle) = a(dofPath); 0080 lamPath(:,cycle) = lam; 0081 dl = dl*(id/i)^0.5; 0082 end 0083 endfunction