algop1
C ALGOP1 SOURCE CB215821 16/04/21 21:15:06 8920 . rkappait,rkappaic,x,fc,fb,ft,Eo,poison,lg,ntot, . fc0,rkappa1,ac,bc,ag,lerror,i1,i2,i3,i4,i5,i6, . parahot3,idimpara3,deps,lnoconv,lcp,U) c SUBROUTINE added by THG c THIS SUBROUTINE IS CALLED BY DPRAN3D c the system is solved by the method of Broyden (Newton-Raphson secante) c rkt x function_t(x(1),x(2)) + (1-rkt) x(1) = 0 c rkc x function_c(x(1),x(2)) + (1-rkc) x(2) = 0 c with c rkt and rkc = 0 or 1 c x(1)=Dlambdat c x(2)=Dlambdac IMPLICIT REAL*8 (A-B,D-H,O-Z) implicit integer (I-K,M,N) implicit logical (L) implicit character*10 (C) **** dimension B(i2,i2) dimension B(2,2) c jacobian matrix for the system of equations. **** dimension Binv(i2,i2) dimension Binv(2,2) c invert of the jacobian matrix for the system of equations. **** dimension df(i2) dimension df(2) **** dimension dfc(i6) dimension dfc(6) c derivative of the compression plasticity function **** dimension dft(i6) c derivative of the tension plasticity function **** dimension dx(i2) dimension dx(2) c increment of the solution **** dimension f(i2) dimension f(2) **** dimension fn(i2) dimension fn(2) **** dimension H66(i6,i6) dimension H66(6,6) c matrix of elasticity (sometimes denoted D) **** dimension x(i2) dimension x(2) c solution to be found (and initial guess at the entry of the subr.) **** dimension xnew(i2) dimension xnew(2) dimension esigmae(i6) c trial stress vector, = elastic predictor **** dimension trav1(i1),trav2(i2),trav2b(i2),trav2c(i2), **** . trav6(i6),trav22(i2,i2) dimension trav1(1),trav2(2),trav2b(2),trav2c(2), . trav6(6),trav22(2,2) **** dimension P2(i6,i6),U(i6,i6),pi2(i6),v2loc(i2,i2) dimension P2(6,6),U(6,6),pi2(6),v2loc(2,2) dimension deps(i6) dimension parahot3(idimpara3) DATA itermax /90/, tolx /1.e-4/ ***** * MESSAGES D'ERREUR ( SUPPRESSION DES AUTOMATIC OBJECTS) IF(I1.GT.1) PRINT *, ' ALGOPLAS1 - ERREUR I1 = ', I1, ' > 1 ' IF(I6.GT.6) PRINT *, ' ALGOPLAS1 - ERREUR I6 = ', I6, ' > 6 ' ***** i7 = 7 i8 = 8 i9 = 9 i10=10 i11=11 i12=12 i13=13 i14=14 i15=15 i16=16 i17=17 i18=18 i19=19 i20=20 i21=21 i22=22 i23=23 i24=24 i25=25 i26=26 i27=27 i28=28 i29=29 i30=30 i31=31 i32=32 i33=33 i34=34 i35=35 i36=36 i37=37 i38=38 i39=39 r1 = 1. r2 = 2. r0 = 0. r10 = 10. i0 = 0 i1 = 1 lerror = .false. lproblem = .false. G = Eo/(r2*(r1+poison)) 87 continue c initialization of fn FN(i1) = r0 c initialization of the activated yield surfaces lftact = .false. lfcact = .false. c calculate a first f[x(1),x(2),esigmae,rkappait,rkappaic] . pi2,fc,ft,ag,fc0,rkappa1,ac,bc,H66,P2,lg,ntot, . i2,i6,fb,parahot3,idimpara3,lerror,lcp,esigmae,U) if (lerror) then return endif f(i1) = rkt*f(i1) if (f(i1).gt.r0) lftact = .true. return endif fn(i1) = f(i1) c ================================================================= c ! ! c ! initialization of Jacobian B ! c ! ============================ ! c ================================================================= c initialization of Jacobian B in x = (0;0) by the following equation c B(11) = - (dft/dsigma H66 dft/dsigma + dtaut) c B(12) = - (dft/dsigma H66 dfc/dsigma) c B(21) = - (dfc/dsigma H66 dft/dsigma) c B(22) = - (dfc/dsigma H66 dfc/dsigma + dtauc) c ******** do iloc=i1,i6 enddo c *********** do iloc=i1,i6 DFC(iloc) = rkc * DFC(iloc) enddo c ****** c ***** df11 = trav1(i1) c ***** df12 = trav1(i1) df21 = df12 c ****** c ***** df22 = trav1(i1) c derivatives of the hardening functions B(i1,i1) = -(df11+rkt*dtaut) +(r1-rkt) c ================================================================= c ! ! c ! invert the initial JACOBIAN ! c ! =========================== ! c ================================================================= if (dtmB.eq.r0) then lerror = .true. lnoconv = .true. c print *,'ERROR BROYDEN dtmB=0' return else endif c ================================================================= c ! ! c ! loop "Newton-Raphson ! c ! ==================== ! c ================================================================= do iter=i1,itermax c ************************* c ! CALCULATION OF DX_i ! c ************************* c -1 c DX_i = - J_i F(X_i) c TRAV22(i1,i1) = -BINV(i1,i1) if (ABS(dx(i1)) .lt. 1.E-16) dx(i1) = r0 if (((ABS(dx(i1)) .gt. 1.).and.(rkt.eq.1.)).or. lnoconv = .true. lerror = .true. return endif if ( (ABS(dx(i1)) .gt. 1.).and.(rkt.eq.0.) ) . dx(1) = 1. * dx(1)/ABS(dx(i1)) c *************************** c ! CALCULATION OF X_i+1 ! c *************************** c c X_i+1 = X_i + DX_i c XNEW(i1) = X(i1) + DX(i1) * PRINT *,'ALGOPLAS1 X(I1),DX(I1),XNEW(I1)',X(I1),DX(I1),XNEW(I1) * PRINT *,'ALGOPLAS1 X(I2),DX(I2),XNEW(I2)',X(I2),DX(I2),XNEW(I2) c The strain hardening parameters can only grow, they cannot decrease. lnoconv = .true. return endif c From Simo et Hugues, Computational Inelasticity, p.212 procedure 2 if (xnew(i1).lt.r0) then rkt = r0 go to 87 endif rkc = r0 go to 87 endif if ((xnew(i1).ge.r0).and.(lftact)) rkt=1. rloc = xnew(i1) xnew(i1) = rkt*rloc c xnew(2) = dlambdat c xnew(2) = dlambdac c ********************************************************** c ! UPDATE OF THE INVERT JACOBIAN BY SHERMAN-MORRISON ! c ********************************************************** rloc = xnew(i1) xnew(i1) = rkt*rloc c xnew(1) = dlambdat c xnew(2) = dlambdac c calculate f[xnew(1),xnew(2),esigmae,rkappait,rkappaic] . alpha,pi2,fc,ft,ag,fc0,rkappa1,ac,bc,H66,P2,lg,ntot, . i2,i6,fb,parahot3,idimpara3,lerror,lcp,esigmae,U) if (lerror) then return endif c test activated yield surfaces if ((fn(i1).gt.r10).and.(lftact)) rkt = r1 fn(i1) = rkt*fn(i1) DF(i1) = FN(i1) - F(i1) c calculation of the new Jacobian Binv_i+1 c Now, we apply the formula of Sherman-Morrison c Binv.df c dx - Binv.df TRAV2b(i1) = DX(i1)-TRAV2(i1) c dx.Binv c ****** c (dx-Binv.df).(dx.Binv) c ***** c dx.Binv.df c ****** rloc = r1/trav1(i1) TRAV22(iloc,jloc) = rloc*TRAV22(iloc,jloc) v2loc(iloc,jloc) = BINV(iloc,jloc) BINV(iloc,jloc) = v2loc(iloc,jloc) + TRAV22(iloc,jloc) end do end do endif X(i1) = XNEW(i1) c ****************************** c ! TEST TO END THE LOOP ! c ****************************** test = r0 if (iter.ne.i1) then c The plasticity functions must be satisfied with a precision of 10 Pa, i.e. 0.000010 N/m² c convergence has been obtained return endif do k=1,2 if (x(k).ne.r0) then temp = abs(dx(k)/(1.E-10)) endif end do lnoconv = .true. return endif endif c END OF THE LOOP EITHER BECAUSE THE EQUATION IS SOLVED c OR BECAUSE THE X VARIABLE DOES NOT VARY ANY MORE c OTHERWISE, GO ON WITH THE ITERATIONS c ************************************ F(i1) = FN(i1) end do 1 format( ' itermax exceeded in Broyden, test:',e7.2, . ', ft:',E8.2,' N/m², fc:',e8.2,' N/m²'/ . ' ntot = ',i6) lerror = .true. lnoconv = .true. RETURN END
© Cast3M 2003 - Tous droits réservés.
Mentions légales