PROGRAM WIRE3 C====================================================================== C----- UNEVEN ELEMENT<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< C---------DZMAXER = MAX ERROR IN Z DURING ITERATIVE PROCEDURE C DZMAXER IS DIVIDED BY DOMAIN LENGTH C TX = TENSION IN X-DIRECTION C TZ = TENSION IN Z-DIRECTION C---- SUMTZ = SUM OF TZ AT NODE=1 AND TZ AT NODE=NNODE C---- WOW = GW*WL C---- GW = WDENSITY*GRAVITY C WDENSITY = DENSITY OF WIRE C GRAVITY = gravitational acceleration C---- WL = LENGTH OF WIRE C************** NOTE THAT SUMTZ SHOULD BE EQUAL TO WOW.**************** C---- DEPTH = DEPTH OF HANGING WIRE MEASURED FROM IMAGINARY C STRAIGHT LINE CONNECTING TWO BOUNDARIES C C TX IS DIVIDED BY GRAVITY. C====================================================================== IMPLICIT REAL*8 ( A-H , O-Z ) PARAMETER ( ND=2, MXE=1000, MXN=MXE+1,NBW=2*(ND-1)+1 ) PARAMETER ( MXITERA=80, ERRMAX=1.D-4, GRAVITY = 1.D0 ) DIMENSION NODEX(MXE,ND),X(MXN),Z(MXN),PARA(MXN), * STIFF(ND,ND),A(MXN,NBW),RHS(MXN),TS(MXN) C====================================================================== C (1)-READING OF DATA CALL INPUT (NE,DOMAINL,WDENSITY,TXMAX,TXMIN,TXSTEP, Z1,ZN) GW = WDENSITY*GRAVITY C====================================================================== C (2)-FINITE ELEMENT CREATION CALL ELEMENT ( DOMAINL, MXE,MXN,ND,NE,NNODE,NODEX,X ) C====================================================================== C (4)-COMPUTATION OF INITIAL LOCATION OF STRING C-------INITIAL Z STANDS FOR A SET OF GUESS STRING LOCATION. CALL INITIALZ ( MXN,NNODE,GW,TXMAX,X, Z1, ZN, Z ) C====================================================================== OPEN ( 1,FILE='SOLUTION.FEM', STATUS='UNKNOWN') OPEN ( 2,FILE='SUMMARY.FEM', STATUS='UNKNOWN') WRITE(1,*) 'X Z PARABOLIC TENSION TX ITERATIONS' WRITE(2,*) 'TX TS-UP TS-DW MAXDEPTH L-OF-WIRE W-OF-WIRE SUM-TZ', * ' %ERROR ITERATIONS' C C NSTEPS = (TXMAX-TXMIN)/TXSTEP + 1 TX = TXMAX + TXSTEP DO NS = 1, NSTEPS TX = TX - TXSTEP IF ( TX .LE. 0.D0 ) EXIT C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ITERA = 0 DZMAXER = 2.D0*ERRMAX DO WHILE ( ITERA .LE. MXITERA .AND. DZMAXER .GT. ERRMAX ) C********************************************************************* ITERA = ITERA + 1 C============================================== C (7)-CONSTRUCTION OF FEM-MATRIX EQUATION CALL MATRIX ( MXE,MXN,ND,NBW,NE,NNODE, GRAVITY,WDENSITY, * TX,STIFF, NODEX, X, Z, A,RHS ) C============================================== C (8)-IMPLEMENTATION OF BOUNDARY CONDITION CALL FORM ( MXN, NBW, NNODE, A, RHS, Z1, ZN ) C============================================== C (9)-SOLVE FOR UNKNOWN VARIABLES CALL SYSTEM ( MXN, NBW, NNODE, A , RHS ) C============================================== C(10)-EVALUATION OF NEW STRING LOCATION BASED UPON OLD U AND NEW U. C-------- UMAX = MAXIMUM ERROR IN U(I) DURING ITERATION CALL NEWZ ( MXN,NNODE,DOMAINL, RHS ,Z, DZMAXER ) END DO C-------- END OF ITARETIVE PROCEDURE --------- C********************************************************************* CALL PRT (ND,MXE,MXN,NE,NNODE,NODEX,X,TX,GW,PARA,RHS,TS, * DZMAXER,ITERA) C------ END OF COMPUTATIONAL PROCEDURE END DO C$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ CLOSE (2) CLOSE (1) STOP'NORMAL TERMINATION' END C C SUBROUTINE PRT (ND,MXE,MXN,NE,NNODE,NODEX,X,TX,GW,PARA,RHS,TS, * DZMAXER,ITERA) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXN),Z(MXN),PARA(MXN),RHS(MXN),TS(MXN),NODEX(MXE,ND) CALL PARAB (MXN,NNODE,X,TX,GW,RHS,PARA) CALL CMPDEPTH ( MXN,NNODE,X,RHS,DEPTH,WL ) CALL TENSION (ND,MXE,MXN,NE,NODEX,X,RHS,TX,TS,SUMTZ) WOW = GW*WL WRITE(1,*) WRITE(1,*) X(1),RHS(1), PARA(1), TS(1),TX,ITERA DO I = 2 , NNODE WRITE(1,*) X(I),RHS(I), PARA(I), TS(I) END DO PRCNTER = ( WOW - SUMTZ ) / WOW * 100.D0 WRITE (2,*) TX,TS(1),TS(NNODE), DEPTH, WL, WOW,SUMTZ,PRCNTER, * ITERA RETURN END C C SUBROUTINE PARAB (MXN,NNODE,X,TX,GW,RHS,PARA) C------- COMPUTES RADIUS AT TX INFINITE STRENGTH.------- IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXN), PARA(MXN),RHS(MXN) CONST = 0.5D0*GW/TX TL = X(NNODE) - X(1) C = (1.D0/TL)*(RHS(NNODE)-CONST*TL*TL) DO I = 1 , NNODE PARA(I) = CONST*X(I)*X(I)+C*X(I)+RHS(1) END DO RETURN END C C SUBROUTINE CMPDEPTH (MXN,NNODE,X,RHS,DEPTH,WL ) C------- COMPUTES MAX. DEPTH AND LENGTH OF WIRE ------- C------- DEPTH = DEPTH OF WIRE FROM STRAIGHT LINE CONNECTING BOUNDARIES C------- WL = LENGTH OF WIRE IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXN), RHS(MXN) WL = 0.D0 SLOPE = (RHS(NNODE) - RHS(1))/(X(NNODE)-X(1)) DEPTH = 0.D0 DO I = 2 , NNODE Z0 = SLOPE*(X(I)-X(1)) + RHS(1) ZX = RHS(I) - Z0 DEPTH = DMAX1 ( DEPTH, DABS(ZX) ) DX = X(I) - X(I-1) DZ = RHS(I) - RHS(I-1) WL = WL + DSQRT ( DX*DX + DZ*DZ ) END DO RETURN END C C SUBROUTINE TENSION (ND,MXE,MXN,NE,NODEX,X,RHS,TX,TS,SUMTZ) C------- COMPUTES RADIUS AT TX INFINITE STRENGTH.------- IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXN), RHS(MXN), TS(MXN), NODEX(MXE,ND) C-------- TENSION IN EACH ELEMENT NNODE = NE + 1 DO I = 1 , NNODE TS(I) = 0.D0 END DO DO IEL = 1 , NE I = NODEX(IEL,1) J = NODEX(IEL,2) DX = X(J) - X(I) DZ = DABS (RHS(J) - RHS(I)) DS = DSQRT( DX**2 + DZ**2 ) TS(I) = TS(I) + TX*DS/DX TS(J) = TS(J) + TX*DS/DX END DO DO I = 2 , NE TS(I) = TS(I) / 2.D0 END DO C-------- UPSTREAM DX = X(2) - X(1) DZ = DABS ( RHS(2) - RHS(1) ) SUMTZ = TX*DZ/DX C-------- DWONSTREAM DX = X(NNODE) - X(NNODE-1) DZ = DABS ( RHS(NNODE) - RHS(NNODE-1) ) SUMTZ = SUMTZ + TX*DZ/DX RETURN END C C SUBROUTINE MATRIX ( MXE,MXN,ND,NBW,NE,NNODE, GRAVITY,WDENSITY, * TX,STIFF, NODEX, X, Z, A,RHS ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION NODEX(MXE,ND),X(MXN),Z(MXN),RHS(MXN), * STIFF(ND,ND), * A(MXN,NBW) CONST = GRAVITY * WDENSITY / TX DO I = 1 , NNODE A(I,1) = 0.D0 A(I,2) = 0.D0 A(I,3) = 0.D0 RHS(I) = 0.D0 END DO DO IEL = 1 , NE I = NODEX(IEL,1) J = NODEX(IEL,2) DX = X(J) - X(I) DZ = Z(J) - Z(I) DSDX = DSQRT ( 1.D0 + (DZ/DX)**2 ) FORCE = CONST * DSDX * DX / 2.D0 EE = 1.D0/DX STIFF(1,1) = -EE STIFF(1,2) = EE STIFF(2,1) = EE STIFF(2,2) = -EE A(I,2) = A(I,2) + STIFF(1,1) A(I,3) = A(I,3) + STIFF(1,2) A(J,1) = A(J,1) + STIFF(2,1) A(J,2) = A(J,2) + STIFF(2,2) RHS(I) = RHS(I) + FORCE RHS(J) = RHS(J) + FORCE END DO RETURN END C C SUBROUTINE INITIALZ ( MXN,NNODE,GW,TXMAX,X, Z1, ZN, Z ) C------- COMPUTES RADIUS AT TX INFINITE STRENGTH.------- IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION X(MXN), Z(MXN) CONST = 0.5D0*GW/TXMAX TL = X(NNODE) - X(1) C = (1.D0/TL)*(ZN-CONST*TL*TL) DO I = 1 , NNODE Z(I) = CONST*X(I)*X(I)+C*X(I)+Z1 END DO RETURN END C C SUBROUTINE NEWZ ( MXN,NNODE,DOMAINL, RHS ,Z, DZMAXER ) C------- COMPUTES RADIUS AT TX INFINITE STRENGTH.------- IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION RHS(MXN), Z(MXN) DZMAXER = DABS ( RHS(1) - Z(1) ) / DOMAINL DO I = 1 , NNODE DZMAXER = DMAX1 ( DZMAXER, DABS(RHS(I)-Z(I))/DOMAINL ) Z(I) = (RHS(I) + Z(I))/2.D0 END DO RETURN END C C SUBROUTINE INPUT (NE,DOMAINL,WDENSITY,TXMAX,TXMIN,TXSTEP, Z1,ZN) IMPLICIT REAL*8 ( A-H , O-Z ) COMPLEX*16 UPSTRM, DWSTRM OPEN ( 1,FILE='WIRE.DAT', STATUS='OLD') C-------- DOMAINL = LENGTH OF DOMAIN IN Z C-------- WDENSITY = DENSITY OF WIRE AS GRAM PER CENTIMETER C-------- TXMAX = POSSIBLE MAX. TENSION IN X-DIRECTION C-------- YXMIN = POSSIBLE MIN. TENSION IN X-DIRECTION C-------- TXSTEP = INCREMENTAL TENSION C-------- Z1 = ELEVATION OF WIRE AT X=0 C-------- ZN = ELEVATION OF WIRE AT X=DOMAINL C------- READING CONTROL PARAMETERS ------------------ READ(1,*) NE READ(1,*) DOMAINL READ(1,*) WDENSITY READ(1,*) TXMAX,TXMIN,TXSTEP READ(1,*) Z1 READ(1,*) ZN CLOSE (1) RETURN END C C SUBROUTINE ELEMENT ( DOMAINL,MXE,MXN,ND,NE,NNODE,NODEX,X ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION NODEX(MXE,ND),X(MXN) C--------NE = NUMBER OF ELEMENT SLOPE = 0.D0 A = 2.D0*(SLOPE-1.D0) B = 3.D0*(1.D0-SLOPE) DO I = 1 , NE NODEX(I,1) = I NODEX(I,2) = I+1 END DO NNODE = NE + 1 DX = DOMAINL / NE X(1) = 0. DO I = 2 , NNODE T = (I-1)*DX/DOMAINL X(I) = DOMAINL * T*(T*(A*T + B) + SLOPE) END DO RETURN END C C SUBROUTINE FORM ( MXN, NBW, NNODE, A, RHS, Z1, ZN ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION A(MXN,NBW), RHS(MXN) C-------UP STREAM SIDE A(1,2) = 1.D0 A(1,3) = 0.D0 RHS(1) = Z1 RHS(2) = RHS(2) - Z1*A(2,1) A(2,1) = 0.D0 C-------DOWN STREAM SIDE A(NNODE,2) = 1.D0 A(NNODE,1) = 0.D0 RHS(NNODE) = ZN RHS(NNODE-1) = RHS(NNODE-1) - ZN*A(NNODE-1,3) A(NNODE-1,3) = 0.D0 RETURN END C C SUBROUTINE SYSTEM ( MXN, NBW, NNODE, A , B ) IMPLICIT REAL*8 ( A-H , O-Z ) DIMENSION A(MXN,NBW) , B(MXN) B(1) = B(1) / A(1,2) A(1,2) = A(1,3) / A(1,2) DO I = 2 , NNODE P = A(I,2) - A(I,1) * A(I-1,2) A(I,2) = A(I,3) / P B(I) = ( B(I) - A(I,1)*B(I-1) ) / P END DO C------ BACK SUBSTITUTION ---- DO I = NNODE-1, 1,-1 B(I) = B(I) - A(I,2) * B(I+1) END DO RETURN END