Vous êtes sur la page 1sur 5

PROGRAM FEM1D

C
C.....THIS IS A FORTRAN 77 PROGRAM THAT
C SOLVES THE PROBLEM
C
C u''=-sinx
C with u'(0)=3
C and u(0)=0
C
C WITH THE FEM METHOD
C USING LINEAR TWO-NODE ELEMENTS
C (SYNARTHSEIS STEGHS)
C
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION A(10000),IA(1000)
DIMENSION INDR(10),INDI(10)
DATA NRA/10000/
DATA NIA/1000/
C
OPEN(50,FILE='Results',STATUS='UNKNOWN')
C
C.....NUMBER OF NODES
C
WRITE(*,2) 'TYPE NUMBER OF NODES'
2 FORMAT(A20)
READ(*,*) NN
NN1=NN+1
C
C.....STORAGE ALLOCATION
C
C.....REAL STORAGE ALLOCATION
C
INDR(1)=1
INDR(2)=INDR(1)
C
C.....XNODE
C
INDR(3)=INDR(2)+NN
C
C.....SM
C
INDR(4)=INDR(3)+NN*NN1
C
C.....RHS
C
INDR(5)=INDR(4)+NN
C
C.....DISPL
C
INDR(6)=INDR(5)+NN
INDR(7)=INDR(6)
INDR(8)=INDR(7)
INDR(9)=INDR(8)
INDR(10)=INDR(9)
MAXRA=INDR(10)-1
C
C.....INTEGER STORAGE ALLOCATION
C
INDI(1)=1
C
C.....IC
C
INDI(2)=INDI(1)+NN
INDI(3)=INDI(2)
INDI(4)=INDI(3)
INDI(5)=INDI(4)
INDI(6)=INDI(5)
INDI(7)=INDI(6)
INDI(8)=INDI(7)
INDI(9)=INDI(8)
INDI(10)=INDI(9)
MAXIA=INDI(10)-1
C
C.....CHECK ADEQUACE OF STORAGE ALLOCATION
C
IF(MAXRA.GT.NRA) THEN
WRITE(50,30) MAXRA
30 FORMAT(1X,'INSUFFICIENT REAL MEMORY LOCATIONS',/,
* 1X,'REQUIRED LENGTH OF ARRAY A:',1X,I7)
STOP
ELSE
WRITE(50,40) NRA-MAXRA
40 FORMAT(1X,'NUMBER OF UNUSED REAL MEMORY WORDS:',1X,I7)
ENDIF
IF(MAXIA.GT.NIA) THEN
WRITE(50,50) MAXIA
50 FORMAT(1X,'INSUFFICIENT INTEGER MEMORY LOCATIONS',/,
* 1X,'REQUIRED LENGTH OF INTEGER ARRAY A:',1X,I7)
STOP
ELSE
WRITE(50,60) NIA-MAXIA
60 FORMAT(1X,'NUMBER OF UNUSED INTEGER MEMORY WORDS:',1X,I7)
ENDIF
C
C.....END OF STORAGE ALLOCATION
C BEGIN WITH MAIN PROGRAM WORK
C
CALL FELEMENT(A(INDR(2)),A(INDR(3)),A(INDR(4)),A(INDR(5)),
* IA(INDI(1)),NN,NN1)
C
STOP
END
C
C*********************************************************
C
SUBROUTINE FELEMENT(XNODE,SM,RHS,DISPL,IC,NN,NN1)
C
C.....THIS IS THE MAIN ROUTINE THAT DOES THE FEM WORK
C
IMPLICIT REAL*8 (A-H,O-Z)
DIMENSION XNODE(NN),IC(2,NN)
DIMENSION SM(NN,NN1),RHS(NN),DISPL(NN)
DIMENSION SML(2,2),RHSL(2)
DATA BIG/1.0D+10/
C
C.....COMPUTE NUMBER OF ELEMENTS
C
NUMEL=NN-1
C
C.....DATA VALUES LENGTH - NATURAL BOUNDARY CONDITION
C
PIP=4.D0*DATAN(1.D0)
XLENGTH=PIP
HEL=XLENGTH/NUMEL
Q0=3.D0
C
C.....FORM CONNECTIVITY MATRIX
C
DO 500 IEL=1,NUMEL
IC(1,IEL)=IEL
IC(2,IEL)=IEL+1
500 CONTINUE
C
C.....FORM NODE COORDINATE MATRIX (EQUALLY SPACED NODES)
C
WRITE(50,*) 'NODE COORDINATES'
DO 600 INODE=1,NN
XNODE(INODE)=DFLOAT(INODE-1)*HEL
WRITE(50,3000) INODE,XNODE(INODE)
600 CONTINUE
C
C.....CLEAR MATRICES SM,RHS,DISPL
C
DO 700 I=1,NN
RHS(I)=0.D0
DISPL(I)=0.D0
DO 700 J=1,NN
SM(I,J)=0.D0
700 CONTINUE
C
C.....GO OVER ALL ELEMENTS WITH THE FOLLOWING DO LOOP
C
DO 1000 IEL=1,NUMEL
C
C.....FORM LOCAL STIFFNESS MATRIX FOR THE ELEMENT
C
SML(1,1)=1.D0/HEL
SML(1,2)=-1.D0/HEL
SML(2,1)=-1.D0/HEL
SML(2,2)=1.D0/HEL
C
C.....ASSEMBLE GLOBAL STIFFNESS MATRIX
C
I1=IC(1,IEL)
I2=IC(2,IEL)
C
SM(I1,I1)=SM(I1,I1)+SML(1,1)
SM(I1,I2)=SM(I1,I2)+SML(1,2)
SM(I2,I1)=SM(I2,I1)+SML(2,1)
SM(I2,I2)=SM(I2,I2)+SML(2,2)
C
C.....FORM LOCAL LOAD VECTOR FOR THE ELEMENT
C
X1=XNODE(I1)
X2=XNODE(I2)
RHSL(1)=-(X2/HEL)*(DCOS(X2)-DCOS(X1))
* -1.D0/HEL*((DSIN(X2)-DSIN(X1))-(X2*DCOS(X2)-X1*DCOS(X1)))
RHSL(2)=(X1/HEL)*(DCOS(X2)-DCOS(X1))
* +1.D0/HEL*((DSIN(X2)-DSIN(X1))-(X2*DCOS(X2)-X1*DCOS(X1)))
C
C.....ASSEMBLE TOTAL LOAD VECTOR
C
RHS(I1)=RHS(I1)+RHSL(1)
RHS(I2)=RHS(I2)+RHSL(2)
C
1000 CONTINUE
C
C.....APPLY NATURAL BOUNDARY CONDITION AT X=0
C
RHS(1)=RHS(1)-Q0
C
C.....APPLY ESSENTIAL BOUNDARY CONDITION AT X=PIP (PENALTY)
C
SM(NN,NN)=BIG
RHS(NN)=0.D0
C
C.....WRITE STIFFNESS MATRIX
C
WRITE (50,*) 'STIFFNESS MATRIX'
DO 1500 I=1,NN
WRITE (50,3000) I,(SM(I,J),J=1,NN)
1500 CONTINUE
C
C.....WRITE STIFFNESS MATRIX
C
WRITE (50,*) 'LOAD VECTOR'
DO 1600 I=1,NN
WRITE (50,3000) I,RHS(I)
1600 CONTINUE
C
C.....CALL SOLVER (IMSL LIBRARY)
C
CALL DLSARG(NN,SM,NN,RHS,1,DISPL)
C
WRITE(50,3500)
3500 FORMAT(/////,'SOLUTION FEM AND EXACT',/)
WRITE(50,4000)
4000 FORMAT(///,2X,'NODE',1X,'NODE_COORDINATE',5X,
* 'FEM-SOLUTION',5X,'EXACT-SOLUTION',//)
DO 2000 INODE=1,NN
XX=XNODE(INODE)
EXACT=UEXACT(XX)
WRITE (50,5000) INODE,XX,DISPL(INODE),EXACT
3000 FORMAT(1X,I5,11(1X,D13.6))
5000 FORMAT(1X,I5,11(4X,D13.6))
2000 CONTINUE
C
RETURN
END
C
C********************************************************
C
FUNCTION UEXACT(X)
C
C.....COMPUTES THE VALUES OF THE EXACT ANALYTICAL SOLUTION
C ON THE NODES
C
IMPLICIT REAL*8 (A-H,O-Z)
PIP=4.D0*DATAN(1.D0)
UEXACT=DSIN(X)+2.D0*(X-PIP)
RETURN
END

Vous aimerez peut-être aussi