:‫پٌجن‬ ‫ثخص‬
‫رٍش‬ ‫کذ‬FTCS:
PROGRAM FTCS
IMPLICIT NONE
INTEGER ::IMAX,JMAX,NMAX,N,I,J,K
DOUBLE PRECISION ::L,H,DX,DY,DT,TS,TE,D1,D2,CURR,ALPHA,TIME,SOLVETIME
DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:)
REAL,PARAMETER::PI=3.1415
PRINT*,'ENTER LENGHT OF THE PLATE'
READ*, L
PRINT*,'ENTER HEIGHT OF THE PLATE'
READ*, H
PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION'
READ*, IMAX
PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION'
READ*, JMAX
PRINT*,'ENTER TOTAL TIME'
READ*, TIME
PRINT*,'ENTER NUMBER OF SOLUTION TIME STEPS'
READ*, NMAX
PRINT*,'ENTER ALPHA'
READ*, ALPHA
ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX))
DX=L/REAL(IMAX-1)
DY=H/REAL(JMAX-1)
DT=TIME/REAL(NMAX)
D1=(ALPHA*DT)/(DX**2)
D2=(ALPHA*DT)/(DY**2)
CURR=D1+D2
PRINT*,'THE CURR NUMBER IS:',CURR
IF (CURR.GT.0.5) THEN
PRINT*,'SOLUTION IS DIVERGED,TRY AGAIN LATER WITH DIFERENT NUMBERS'
ENDIF
DO I=1,IMAX
X(I)=(I-1)*DX
ENDDO
DO J=1,JMAX
Y(J)=(J-1)*DY
ENDDO
PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT
TEMPRETURE:T=300 '
PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))'
PRINT*,'ENTER NUMBER OF INITIAL CONDITION'
READ*, K
SELECT CASE(K) !INITIAL CONDITION
CASE(1)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=300
ENDDO
ENDDO
CASE(2)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY)
ENDDO
ENDDO
END SELECT
DO I=1,IMAX !BOUNDRY CONDITION
T(I,1,:)=100
T(I,JMAX,:)=100
ENDDO
DO J=2,JMAX-1 !BOUNDRY CONDITION
T(IMAX,J,:)=100
T(1,J,:)=1000
ENDDO
CALL CPU_TIME(TS)
DO N=1,NMAX-1 !CALCULATING LOOP FOR NEXT TIME STEP
DO J=2,JMAX-1
DO I=2,IMAX-1
T(I,J,N+1)=((ALPHA*DT)/DX**2)*(T(I+1,J,N)+&
T(I-1,J,N))+((ALPHA*DT)/DY**2)*(T(I,J+1,N)+T(I,J-1,N))+&
(1-2*(((ALPHA*DT)/DX**2)+((ALPHA*DT)/DY**2)))*T(I,J,N)
!EXPLICIT FORMULATION FOR 2D EQUATION
ENDDO
ENDDO
ENDDO
CALL CPU_TIME(TE)
SOLVETIME=TE-TS
OPEN(13,FILE='SOLVETIME.TXT')
WRITE(13,*)'THE SOLVE TIME IS:',SOLVETIME
OPEN(11,FILE='TEMP.PLT')
WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
DO J=1,JMAX
DO I=1,IMAX
WRITE(11,*) X(I),Y(J),T(I,J,N)
ENDDO
ENDDO
DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX))
STOP
END PROGRAM FTCS
‫رٍش‬ ‫کذ‬FTCS STEADY:
PROGRAM FTCS STEADY STATE
IMPLICIT NONE
INTEGER ::IMAX,JMAX,N,I,J,K,NMAX
DOUBLE PRECISION ::L,H,DX,DY,DT,D1,D2,CURR,ALPHA,RESI
DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:)
REAL,PARAMETER::PI=3.1415
PRINT*,'ENTER LENGHT OF THE PLATE'
READ*, L
PRINT*,'ENTER HEIGHT OF THE PLATE'
READ*, H
PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION'
READ*, IMAX
PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION'
READ*, JMAX
PRINT*,'ENTER THE TIME STEP'
READ*, DT
PRINT*,'ENTER NMAX'
READ*,NMAX
PRINT*,'ENTER ALPHA'
READ*, ALPHA
ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX))
DX=L/REAL(IMAX-1)
DY=H/REAL(JMAX-1)
D1=(ALPHA*DT)/(DX**2)
D2=(ALPHA*DT)/(DY**2)
CURR=D1+D2
PRINT*,'THE CURR NUMBER IS:',CURR
IF (CURR.GT.0.5) THEN
PRINT*,'SOLUTION IS DIVERGED,TRY AGAIN LATER WITH DIFERENT NUMBERS'
ENDIF
DO I=1,IMAX
X(I)=(I-1)*DX
ENDDO
DO J=1,JMAX
Y(J)=(J-1)*DY
ENDDO
PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300
'
PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))'
PRINT*,'ENTER NUMBER OF INITIAL CONDITION'
READ*, K
SELECT CASE(K) !INITIAL CONDITION
CASE(1)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=300
ENDDO
ENDDO
CASE(2)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY)
ENDDO
ENDDO
END SELECT
DO I=1,IMAX !BOUNDRY CONDITION
T(I,1,:)=100
T(I,JMAX,:)=100
ENDDO
DO J=2,JMAX-1 !BOUNDRY CONDITION
T(IMAX,J,:)=100
T(1,J,:)=1000
ENDDO
RESI=1
N=1
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
T(I,J,N+1)=((ALPHA*DT)/DX**2)*(T(I+1,J,N)+&
T(I-1,J,N))+((ALPHA*DT)/DY**2)*(T(I,J+1,N)+T(I,J-1,N))+&
(1-2*(((ALPHA*DT)/DX**2)+((ALPHA*DT)/DY**2)))*T(I,J,N)
!EXPLICIT FORMULATION FOR 2D EQUATION
RESI=RESI+ABS(T(I,J,N+1)-T(I,J,N))
ENDDO
ENDDO
N=N+1
ENDDO
OPEN(13,FILE='N.TXT')
WRITE(13,*),'NUMBER OF TIME STEPS TO CONVERGE IS:',N
OPEN(11,FILE='TEMP.PLT')
WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
DO J=1,JMAX
DO I=1,IMAX
WRITE(11,*) X(I),Y(J),T(I,J,N)
ENDDO
ENDDO
DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX))
STOP
END PROGRAM FTCS STEADY STATE
‫رٍش‬ ‫کذ‬ADI:
PROGRAM ADI
IMPLICIT NONE
INTEGER ::IMAX,JMAX,NMAX,N,I,J,K
DOUBLE PRECISION ::L,H,DX,DY,DT,TS,TE,D1,D2,ALPHA,TIME,SOLVETIME
DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:)
REAL,PARAMETER::PI=3.1415
PRINT*,'ENTER LENGHT OF THE PLATE'
READ*, L
PRINT*,'ENTER HEIGHT OF THE PLATE'
READ*, H
PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION'
READ*, IMAX
PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION'
READ*, JMAX
PRINT*,'ENTER TOTAL TIME'
READ*, TIME
PRINT*,'ENTER NUMBER OF SOLUTION TIME STEPS'
READ*, NMAX
PRINT*,'ENTER ALPHA'
READ*, ALPHA
ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2),
C(IMAX-2),V(IMAX-2),O(IMAX-2))
DX=L/REAL(IMAX-1)
DY=H/REAL(JMAX-1)
DT=TIME/REAL(NMAX)
D1=(ALPHA*DT)/(DX**2)
D2=(ALPHA*DT)/(DY**2)
DO I=1,IMAX
X(I)=(I-1)*DX
ENDDO
DO J=1,JMAX
Y(J)=(J-1)*DY
ENDDO
PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300
'
PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))'
PRINT*,'ENTER NUMBER OF INITIAL CONDITION'
READ*, K
SELECT CASE(K) !INITIAL CONDITION
CASE(1)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=300
ENDDO
ENDDO
CASE(2)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY)
ENDDO
ENDDO
END SELECT
DO I=1,IMAX !BOUNDRY CONDITION
T(I,1,:)=100
T(I,JMAX,:)=100
ENDDO
DO J=2,JMAX-1 !BOUNDRY CONDITION
T(IMAX,J,:)=100
T(1,J,:)=1000
ENDDO
CALL CPU_TIME(TS)
DO N=1,NMAX-1 !CALCULATION LOOP FOR NEXT TIME STEP
DO J=2,JMAX-1
DO I=2,IMAX-1
B(I-1)=1+D1 !MAIN DIAGONAL
A(I-1)=(-0.5*D1) !SUB-DIAGONAL
C(I-1)=(-0.5*D1) !SUP-DIAGONAL
IF (I.EQ.2) THEN
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-
1,N))+(0.5*D1*T(1,J,N))
ELSE IF (I.EQ.(IMAX-1)) THEN
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-
1,N))+(0.5*D1*T(IMAX,J,N))
ELSE
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-1,N))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX
DO I=2,IMAX-1
T(I,J,N+0.5)=O(I)
ENDDO
ENDDO
DO I=2,IMAX-1
DO J=2,JMAX-1
B(J-1)=1+D2 !MAIN DIAGONAL
A(J-1)=(-0.5*D2) !SUB-DIAGONAL
C(J-1)=(-0.5*D2) !SUP-DIAGONAL
IF (J.EQ.2) THEN
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))+(0.5*D2*T(I,1,N))
ELSE IF (J.EQ.(IMAX-1)) THEN
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))+(0.5*D2*T(I,JMAX,N))
ELSE
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL MATRIX
DO J=2,JMAX-1
T(I,J,N+1)=O(J)
ENDDO
ENDDO
ENDDO
CALL CPU_TIME(TE)
SOLVETIME=TE-TS
OPEN(13,FILE='SOLVETIME.TXT')
WRITE(13,*)'THE SOLVE TIME IS:',SOLVETIME
OPEN(11,FILE='TEMP'//TRIM(E)//'.PLT')
WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
DO J=1,JMAX
DO I=1,IMAX
WRITE(11,*) X(I),Y(J),T(I,J,N)
ENDDO
ENDDO
DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2),
C(IMAX-2),V(IMAX-2),O(IMAX-2))
STOP
END PROGRAM ADI
SUBROUTINE TRIDIAG(A,B,C,V,O,N)
IMPLICIT NONE
! A – SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL)
! B – THE MAIN DIAGONAL
! C – SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL)
! V – RIGHT PART
! X – THE ANSWER
! N – NUMBER OF EQUATIONS
INTEGER,INTENT(IN) :: N
DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V
DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O
DOUBLE PRECISION,DIMENSION(N):: BP,VP
DOUBLE PRECISION :: M
INTEGER :: I
DO I=1,N
BP(I)=B(I)
VP(I)=V(I)
ENDDO
!THE FIRST PASS (SETTING COEFFICIENTS):
DO I = 2,N
M = A(I)/BP(I-1)
BP(I) = B(I) – M*C(I-1)
VP(I) = V(I) – M*VP(I-1)
ENDDO
O(N+1) = VP(N)/BP(N)
!THE SECOND PASS (BACK-SUBSTITION)
DO I = N, 2, -1
O(I) = (VP(I-1) – C(I-1)*O(I+1))/BP(I-1)
ENDDO
RETURN
ENDSUBROUTINE TRIDIAG
‫کذ‬ADI STEADY:
PROGRAM ADI
IMPLICIT NONE
INTEGER ::IMAX,JMAX,NMAX,N,I,J,K
DOUBLE PRECISION ::L,H,DX,DY,DT,D1,D2,ALPHA,RESI
DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:)
REAL,PARAMETER::PI=3.1415
PRINT*,'ENTER LENGHT OF THE PLATE'
READ*, L
PRINT*,'ENTER HEIGHT OF THE PLATE'
READ*, H
PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION'
READ*, IMAX
PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION'
READ*, JMAX
PRINT*,'ENTER THE TIME STEP'
READ*, DT
PRINT*,'ENTER NMAX'
READ*, NMAX
PRINT*,'ENTER ALPHA'
READ*, ALPHA
ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2),
C(IMAX-2),V(IMAX-2),O(IMAX-2))
DX=L/REAL(IMAX-1)
DY=H/REAL(JMAX-1)
D1=(ALPHA*DT)/(DX**2)
D2=(ALPHA*DT)/(DY**2)
DO I=1,IMAX
X(I)=(I-1)*DX
ENDDO
DO J=1,JMAX
Y(J)=(J-1)*DY
ENDDO
PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300
PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))'
PRINT*,'ENTER NUMBER OF INITIAL CONDITION'
READ*, K
SELECT CASE(K) !INITIAL CONDITION
CASE(1)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=300
ENDDO
ENDDO
CASE(2)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY)
ENDDO
ENDDO
END SELECT
DO I=1,IMAX !BOUNDRY CONDITION
T(I,1,:)=100
T(I,JMAX,:)=100
ENDDO
DO J=2,JMAX-1 !BOUNDRY CONDITION
T(IMAX,J,:)=100
T(1,J,:)=1000
ENDDO
RESI=1
N=1
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
B(I-1)=1+D1 !MAIN DIAGONAL
A(I-1)=(-0.5*D1) !SUB-DIAGONAL
C(I-1)=(-0.5*D1) !SUP-DIAGONAL
IF (I.EQ.2) THEN
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+&
(0.5*D2*T(I,J-1,N))+(0.5*D1*T(1,J,N))
ELSE IF (I.EQ.(IMAX-1)) THEN
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+&
(0.5*D2*T(I,J-1,N))+(0.5*D1*T(IMAX,J,N))
ELSE
V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-1,N))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX
DO I=2,IMAX-1
T(I,J,N+0.5)=O(I)
ENDDO
ENDDO
DO I=2,IMAX-1
DO J=2,JMAX-1
B(J-1)=1+D2 !MAIN DIAGONAL
A(J-1)=(-0.5*D2) !SUB-DIAGONAL
C(J-1)=(-0.5*D2) !SUP-DIAGONAL
IF (J.EQ.2) THEN
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-
1,J,N+0.5))+(0.5*D2*T(I,1,N))
ELSE IF (J.EQ.(IMAX-1)) THEN
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-
1,J,N+0.5))+(0.5*D2*T(I,JMAX,N))
ELSE
V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+&
((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL MATRIX
DO J=2,JMAX-1
T(I,J,N+1)=O(J)
RESI=RESI+ABS(T(I,J,N+1)-T(I,J,N))
ENDDO
ENDDO
N=N+1
ENDDO
OPEN(13,FILE='N.TXT')
WRITE(13,*),'NUMBER OF TIME STEPS TO CONVERGE IS:',N
OPEN(11,FILE='TEMP.PLT')
WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
DO J=1,JMAX
DO I=1,IMAX
WRITE(11,*) X(I),Y(J),T(I,J,N)
ENDDO
ENDDO
DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2),C(IMAX-
2),V(IMAX-2),O(IMAX-2))
STOP
END PROGRAM ADI
SUBROUTINE TRIDIAG(A,B,C,V,O,N)
IMPLICIT NONE
! A - SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL)
! B - THE MAIN DIAGONAL
! C - SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL)
! V - RIGHT PART
! X - THE ANSWER
! N - NUMBER OF EQUATIONS
INTEGER,INTENT(IN) :: N
DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V
DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O
DOUBLE PRECISION,DIMENSION(N):: BP,VP
DOUBLE PRECISION :: M
INTEGER :: I
DO I=1,N
BP(I)=B(I)
VP(I)=V(I)
ENDDO
!THE FIRST PASS (SETTING COEFFICIENTS):
DO I = 2,N
M = A(I)/BP(I-1)
BP(I) = B(I) - M*C(I-1)
VP(I) = V(I) - M*VP(I-1)
ENDDO
O(N+1) = VP(N)/BP(N)
!THE SECOND PASS (BACK-SUBSTITION)
DO I = N, 2, -1
O(I) = (VP(I-1) - C(I-1)*O(I+1))/BP(I-1)
ENDDO
RETURN
ENDSUBROUTINE TRIDIAG
‫رٍش‬ ‫کذ‬:‫تکراری‬ ‫ّبی‬
PROGRAM ELEPTIC
IMPLICIT NONE
INTEGER ::IMAX,JMAX,I,J,K,M,F,KMAX
DOUBLE PRECISION ::L,H,DX,DY,ALPHA,RESI,P,W
DOUBLE PRECISION,
ALLOCATABLE::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:),TOLD(:,:)
REAL,PARAMETER::PI=3.1415
PRINT*,'ENTER LENGHT OF THE PLATE'
READ*, L
PRINT*,'ENTER HEIGHT OF THE PLATE'
READ*, H
PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION'
READ*, IMAX
PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION'
READ*, JMAX
PRINT*,'ENTER KMAX'
READ*,KMAX
PRINT*,'ENTER ALPHA'
READ*, ALPHA
ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*KMAX),A(IMAX-2),B(IMAX-2),
C(IMAX-2),V(IMAX-2),O(IMAX-2))
DX=L/REAL(IMAX-1)
DY=H/REAL(JMAX-1)
DO I=1,IMAX
X(I)=(I-1)*DX
ENDDO
DO J=1,JMAX
Y(J)=(J-1)*DY
ENDDO
DO I=1,IMAX !BOUNDRY CONDITION
T(I,1,:)=100
T(I,JMAX,:)=100
ENDDO
DO J=2,JMAX-1 !BOUNDRY CONDITION
T(IMAX,J,:)=100
T(1,J,:)=1000
ENDDO
PRINT*,'THERE IS TWO TYPE FIRST GUESS : 1-CONSTANT TEMPRETURE:T=300 '
PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))'
PRINT*,'ENTER NUMBER OF INITIAL CONDITION'
READ*, F
SELECT CASE(F) !FIRST GUESS
CASE(1)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=300
ENDDO
ENDDO
CASE(2)
DO I=2,IMAX-1
DO J=2,JMAX-1
T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY)
ENDDO
ENDDO
END SELECT
W=1
K=1
RESI=1
PRINT*,'THERE IS SOME SOLUTION ALGORITHMS FOR ELEPTIC EQUATION:'
PRINT*,'1-JACOBI ITERATION METHOD'
PRINT*,'2-THE POINT GAUSS-SEIDEL ITERATION METHOD'
PRINT*,'3-THE LINE GAUSS-SEIDEL ITERATION METHOD'
PRINT*,'4-POINT SUCCESSIVE OVER-RELAXATION METHOD(PSOR)'
PRINT*,'5-THE ALTERNATING DIRECTION IMPLICIT(ADI)'
PRINT*,'ENTER NUMBER OF SOLUTION YOU WANT'
READ*,M
SELECT CASE(M)
CASE(1)
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
T(I,J,K+1)=(0.5/(1+(DX/DY)**2))*(T(I+1,J,K)+ &
T(I-1,J,K)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K)))
RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K))
ENDDO
ENDDO
K=K+1
ENDDO
CASE(2)
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
T(I,J,K+1)=(0.5/(1+((DX/DY)**2)))*(T(I+1,J,K)+&
T(I-1,J,K+1)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K+1)))
RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K))
ENDDO
ENDDO
K=K+1
ENDDO
CASE(3)
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
B(I-1)=(-2*(1+((DX/DY)**2))) !MAIN DIAGONAL
A(I-1)=1 !SUB-DIAGONAL
C(I-1)=1 !SUP-DIAGONAL
IF (I.EQ.2) THEN
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1))-&
T(I-1,J,K+1)
ELSE IF (I.EQ.(IMAX-1)) THEN
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1))-&
T(I+1,J,K+1)
ELSE
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL
MATRIX
DO I=2,IMAX-1
T(I,J,K+1)=O(I)
RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K))
ENDDO
ENDDO
K=K+1
ENDDO
CASE(4)
P=((COS(3.1415/(IMAX-1))+&
((DX/DY)**2)*COS(3.1415/(JMAX-1)))/(1+((DX/DY)**2)))**2
W=(2-2*DSQRT(1-P))/P
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
T(I,J,K+1)=((0.5*W)/(1+(DX/DY)**2))*(T(I+1,J,K)+&
T(I-1,J,K+1)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K+1)))+(1-W)*T(I,J,K)
RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K))
ENDDO
ENDDO
K=K+1
ENDDO
CASE(5)
DO WHILE(RESI.GT.(0.0001))
RESI=0
DO J=2,JMAX-1
DO I=2,IMAX-1
B(I-1)=(-2*(1+((DX/DY)**2))) !MAIN DIAGONAL
A(I-1)=1 !SUB-DIAGONAL
C(I-1)=1 !SUP-DIAGONAL
IF (I.EQ.2) THEN
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5))-&
T(I-1,J,K+0.5)
ELSE IF (I.EQ.(IMAX-1)) THEN
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5))-&
T(I+1,J,K+0.5)
ELSE
V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL
MATRIX
DO I=2,IMAX-1
T(I,J,K+0.5)=O(I)
ENDDO
ENDDO
DO I=2,IMAX-1
DO J=2,JMAX-1
B(J-1)=(-2*(1+(DX/DY)**2)) !MAIN DIAGONAL
A(J-1)=((DX/DY)**2) !SUB-DIAGONAL
C(J-1)=((DX/DY)**2) !SUP-DIAGONAL
IF (J.EQ.2) THEN
V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1))-&
((DX/DY)**2)*T(I,J-1,K+1)
ELSE IF (J.EQ.(JMAX-1)) THEN
V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1))-&
((DX/DY)**2)*T(I,J+1,K+1)
ELSE
V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1))
ENDIF
ENDDO
CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL
MATRIX
DO J=2,JMAX-1
T(I,J,K+1)=O(J)
RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K))
ENDDO
ENDDO
K=K+1
ENDDO
END SELECT
OPEN(13,FILE='K.TXT')
WRITE(13,*),'THE VALUE OF UNDER-RELAXATION FACTOR IS:',W
WRITE(13,*),'NUMBER OF ITERATION TO CONVERGE',K
OPEN(11,FILE='TEMP.PLT')
WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
DO J=1,JMAX
DO I=1,IMAX
WRITE(11,*) X(I),Y(J),T(I,J,K)
ENDDO
ENDDO
DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*KMAX),A(IMAX-2),
B(IMAX-2),C(IMAX-2),V(IMAX-2),O(IMAX-2))
STOP
END PROGRAM ELEPTIC
SUBROUTINE TRIDIAG(A,B,C,V,O,N)
IMPLICIT NONE
! A - SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL)
! B - THE MAIN DIAGONAL
! C - SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL)
! V - RIGHT PART
! X - THE ANSWER
! N - NUMBER OF EQUATIONS
INTEGER,INTENT(IN) :: N
DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V
DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O
DOUBLE PRECISION,DIMENSION(N):: BP,VP
DOUBLE PRECISION :: M
INTEGER :: I
DO I=1,N
BP(I)=B(I)
VP(I)=V(I)
ENDDO
!THE FIRST PASS (SETTING COEFFICIENTS):
DO I = 2,N
M = A(I)/BP(I-1)
BP(I) = B(I) - M*C(I-1)
VP(I) = V(I) - M*VP(I-1)
ENDDO
O(N+1) = VP(N)/BP(N)
!THE SECOND PASS (BACK-SUBSTITION)
DO I = N, 2, -1
O(I) = (VP(I-1) - C(I-1)*O(I+1))/BP(I-1)
ENDDO
RETURN
ENDSUBROUTINE TRIDIAG

Introduction to CFD FORTRAN code

  • 1.
    :‫پٌجن‬ ‫ثخص‬ ‫رٍش‬ ‫کذ‬FTCS: PROGRAMFTCS IMPLICIT NONE INTEGER ::IMAX,JMAX,NMAX,N,I,J,K DOUBLE PRECISION ::L,H,DX,DY,DT,TS,TE,D1,D2,CURR,ALPHA,TIME,SOLVETIME DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:) REAL,PARAMETER::PI=3.1415 PRINT*,'ENTER LENGHT OF THE PLATE' READ*, L PRINT*,'ENTER HEIGHT OF THE PLATE' READ*, H PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION' READ*, IMAX PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION' READ*, JMAX PRINT*,'ENTER TOTAL TIME' READ*, TIME PRINT*,'ENTER NUMBER OF SOLUTION TIME STEPS' READ*, NMAX PRINT*,'ENTER ALPHA' READ*, ALPHA ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX)) DX=L/REAL(IMAX-1) DY=H/REAL(JMAX-1) DT=TIME/REAL(NMAX) D1=(ALPHA*DT)/(DX**2) D2=(ALPHA*DT)/(DY**2) CURR=D1+D2 PRINT*,'THE CURR NUMBER IS:',CURR IF (CURR.GT.0.5) THEN PRINT*,'SOLUTION IS DIVERGED,TRY AGAIN LATER WITH DIFERENT NUMBERS' ENDIF DO I=1,IMAX X(I)=(I-1)*DX ENDDO DO J=1,JMAX Y(J)=(J-1)*DY ENDDO PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300 '
  • 2.
    PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))' PRINT*,'ENTER NUMBEROF INITIAL CONDITION' READ*, K SELECT CASE(K) !INITIAL CONDITION CASE(1) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=300 ENDDO ENDDO CASE(2) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY) ENDDO ENDDO END SELECT DO I=1,IMAX !BOUNDRY CONDITION T(I,1,:)=100 T(I,JMAX,:)=100 ENDDO DO J=2,JMAX-1 !BOUNDRY CONDITION T(IMAX,J,:)=100 T(1,J,:)=1000 ENDDO CALL CPU_TIME(TS) DO N=1,NMAX-1 !CALCULATING LOOP FOR NEXT TIME STEP DO J=2,JMAX-1 DO I=2,IMAX-1 T(I,J,N+1)=((ALPHA*DT)/DX**2)*(T(I+1,J,N)+& T(I-1,J,N))+((ALPHA*DT)/DY**2)*(T(I,J+1,N)+T(I,J-1,N))+& (1-2*(((ALPHA*DT)/DX**2)+((ALPHA*DT)/DY**2)))*T(I,J,N) !EXPLICIT FORMULATION FOR 2D EQUATION ENDDO ENDDO ENDDO CALL CPU_TIME(TE) SOLVETIME=TE-TS OPEN(13,FILE='SOLVETIME.TXT') WRITE(13,*)'THE SOLVE TIME IS:',SOLVETIME OPEN(11,FILE='TEMP.PLT') WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX
  • 3.
    DO J=1,JMAX DO I=1,IMAX WRITE(11,*)X(I),Y(J),T(I,J,N) ENDDO ENDDO DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX)) STOP END PROGRAM FTCS ‫رٍش‬ ‫کذ‬FTCS STEADY: PROGRAM FTCS STEADY STATE IMPLICIT NONE INTEGER ::IMAX,JMAX,N,I,J,K,NMAX DOUBLE PRECISION ::L,H,DX,DY,DT,D1,D2,CURR,ALPHA,RESI DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:) REAL,PARAMETER::PI=3.1415 PRINT*,'ENTER LENGHT OF THE PLATE' READ*, L PRINT*,'ENTER HEIGHT OF THE PLATE' READ*, H PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION' READ*, IMAX PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION' READ*, JMAX PRINT*,'ENTER THE TIME STEP' READ*, DT PRINT*,'ENTER NMAX' READ*,NMAX PRINT*,'ENTER ALPHA' READ*, ALPHA ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX)) DX=L/REAL(IMAX-1) DY=H/REAL(JMAX-1) D1=(ALPHA*DT)/(DX**2) D2=(ALPHA*DT)/(DY**2) CURR=D1+D2 PRINT*,'THE CURR NUMBER IS:',CURR IF (CURR.GT.0.5) THEN PRINT*,'SOLUTION IS DIVERGED,TRY AGAIN LATER WITH DIFERENT NUMBERS' ENDIF
  • 4.
    DO I=1,IMAX X(I)=(I-1)*DX ENDDO DO J=1,JMAX Y(J)=(J-1)*DY ENDDO PRINT*,'THEREIS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300 ' PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))' PRINT*,'ENTER NUMBER OF INITIAL CONDITION' READ*, K SELECT CASE(K) !INITIAL CONDITION CASE(1) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=300 ENDDO ENDDO CASE(2) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY) ENDDO ENDDO END SELECT DO I=1,IMAX !BOUNDRY CONDITION T(I,1,:)=100 T(I,JMAX,:)=100 ENDDO DO J=2,JMAX-1 !BOUNDRY CONDITION T(IMAX,J,:)=100 T(1,J,:)=1000 ENDDO RESI=1 N=1 DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 T(I,J,N+1)=((ALPHA*DT)/DX**2)*(T(I+1,J,N)+& T(I-1,J,N))+((ALPHA*DT)/DY**2)*(T(I,J+1,N)+T(I,J-1,N))+& (1-2*(((ALPHA*DT)/DX**2)+((ALPHA*DT)/DY**2)))*T(I,J,N) !EXPLICIT FORMULATION FOR 2D EQUATION RESI=RESI+ABS(T(I,J,N+1)-T(I,J,N))
  • 5.
    ENDDO ENDDO N=N+1 ENDDO OPEN(13,FILE='N.TXT') WRITE(13,*),'NUMBER OF TIMESTEPS TO CONVERGE IS:',N OPEN(11,FILE='TEMP.PLT') WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX DO J=1,JMAX DO I=1,IMAX WRITE(11,*) X(I),Y(J),T(I,J,N) ENDDO ENDDO DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,NMAX)) STOP END PROGRAM FTCS STEADY STATE ‫رٍش‬ ‫کذ‬ADI: PROGRAM ADI IMPLICIT NONE INTEGER ::IMAX,JMAX,NMAX,N,I,J,K DOUBLE PRECISION ::L,H,DX,DY,DT,TS,TE,D1,D2,ALPHA,TIME,SOLVETIME DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:) REAL,PARAMETER::PI=3.1415 PRINT*,'ENTER LENGHT OF THE PLATE' READ*, L PRINT*,'ENTER HEIGHT OF THE PLATE' READ*, H PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION' READ*, IMAX PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION' READ*, JMAX PRINT*,'ENTER TOTAL TIME' READ*, TIME PRINT*,'ENTER NUMBER OF SOLUTION TIME STEPS' READ*, NMAX PRINT*,'ENTER ALPHA' READ*, ALPHA
  • 6.
    ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2), C(IMAX-2),V(IMAX-2),O(IMAX-2)) DX=L/REAL(IMAX-1) DY=H/REAL(JMAX-1) DT=TIME/REAL(NMAX) D1=(ALPHA*DT)/(DX**2) D2=(ALPHA*DT)/(DY**2) DO I=1,IMAX X(I)=(I-1)*DX ENDDO DO J=1,JMAX Y(J)=(J-1)*DY ENDDO PRINT*,'THEREIS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300 ' PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))' PRINT*,'ENTER NUMBER OF INITIAL CONDITION' READ*, K SELECT CASE(K) !INITIAL CONDITION CASE(1) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=300 ENDDO ENDDO CASE(2) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY) ENDDO ENDDO END SELECT DO I=1,IMAX !BOUNDRY CONDITION T(I,1,:)=100 T(I,JMAX,:)=100 ENDDO DO J=2,JMAX-1 !BOUNDRY CONDITION T(IMAX,J,:)=100 T(1,J,:)=1000 ENDDO CALL CPU_TIME(TS) DO N=1,NMAX-1 !CALCULATION LOOP FOR NEXT TIME STEP DO J=2,JMAX-1
  • 7.
    DO I=2,IMAX-1 B(I-1)=1+D1 !MAINDIAGONAL A(I-1)=(-0.5*D1) !SUB-DIAGONAL C(I-1)=(-0.5*D1) !SUP-DIAGONAL IF (I.EQ.2) THEN V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J- 1,N))+(0.5*D1*T(1,J,N)) ELSE IF (I.EQ.(IMAX-1)) THEN V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J- 1,N))+(0.5*D1*T(IMAX,J,N)) ELSE V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-1,N)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX DO I=2,IMAX-1 T(I,J,N+0.5)=O(I) ENDDO ENDDO DO I=2,IMAX-1 DO J=2,JMAX-1 B(J-1)=1+D2 !MAIN DIAGONAL A(J-1)=(-0.5*D2) !SUB-DIAGONAL C(J-1)=(-0.5*D2) !SUP-DIAGONAL IF (J.EQ.2) THEN V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))+(0.5*D2*T(I,1,N)) ELSE IF (J.EQ.(IMAX-1)) THEN V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5))+(0.5*D2*T(I,JMAX,N)) ELSE V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL MATRIX DO J=2,JMAX-1 T(I,J,N+1)=O(J) ENDDO ENDDO ENDDO CALL CPU_TIME(TE) SOLVETIME=TE-TS
  • 8.
    OPEN(13,FILE='SOLVETIME.TXT') WRITE(13,*)'THE SOLVE TIMEIS:',SOLVETIME OPEN(11,FILE='TEMP'//TRIM(E)//'.PLT') WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX DO J=1,JMAX DO I=1,IMAX WRITE(11,*) X(I),Y(J),T(I,J,N) ENDDO ENDDO DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2), C(IMAX-2),V(IMAX-2),O(IMAX-2)) STOP END PROGRAM ADI SUBROUTINE TRIDIAG(A,B,C,V,O,N) IMPLICIT NONE ! A – SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL) ! B – THE MAIN DIAGONAL ! C – SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL) ! V – RIGHT PART ! X – THE ANSWER ! N – NUMBER OF EQUATIONS INTEGER,INTENT(IN) :: N DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O DOUBLE PRECISION,DIMENSION(N):: BP,VP DOUBLE PRECISION :: M INTEGER :: I DO I=1,N BP(I)=B(I) VP(I)=V(I) ENDDO !THE FIRST PASS (SETTING COEFFICIENTS): DO I = 2,N M = A(I)/BP(I-1) BP(I) = B(I) – M*C(I-1) VP(I) = V(I) – M*VP(I-1) ENDDO O(N+1) = VP(N)/BP(N) !THE SECOND PASS (BACK-SUBSTITION) DO I = N, 2, -1 O(I) = (VP(I-1) – C(I-1)*O(I+1))/BP(I-1)
  • 9.
    ENDDO RETURN ENDSUBROUTINE TRIDIAG ‫کذ‬ADI STEADY: PROGRAMADI IMPLICIT NONE INTEGER ::IMAX,JMAX,NMAX,N,I,J,K DOUBLE PRECISION ::L,H,DX,DY,DT,D1,D2,ALPHA,RESI DOUBLE PRECISION, ALLOCATABLE ::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:) REAL,PARAMETER::PI=3.1415 PRINT*,'ENTER LENGHT OF THE PLATE' READ*, L PRINT*,'ENTER HEIGHT OF THE PLATE' READ*, H PRINT*,'ENTER THE NUMBER OF NODES IN X DIRECTION' READ*, IMAX PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION' READ*, JMAX PRINT*,'ENTER THE TIME STEP' READ*, DT PRINT*,'ENTER NMAX' READ*, NMAX PRINT*,'ENTER ALPHA' READ*, ALPHA ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2), C(IMAX-2),V(IMAX-2),O(IMAX-2)) DX=L/REAL(IMAX-1) DY=H/REAL(JMAX-1) D1=(ALPHA*DT)/(DX**2) D2=(ALPHA*DT)/(DY**2) DO I=1,IMAX X(I)=(I-1)*DX ENDDO DO J=1,JMAX Y(J)=(J-1)*DY ENDDO PRINT*,'THERE IS TWO TYPE INITIAL CONDITIONS : 1-CONSTANT TEMPRETURE:T=300 PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))' PRINT*,'ENTER NUMBER OF INITIAL CONDITION' READ*, K SELECT CASE(K) !INITIAL CONDITION CASE(1)
  • 10.
    DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=300 ENDDO ENDDO CASE(2) DOI=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY) ENDDO ENDDO END SELECT DO I=1,IMAX !BOUNDRY CONDITION T(I,1,:)=100 T(I,JMAX,:)=100 ENDDO DO J=2,JMAX-1 !BOUNDRY CONDITION T(IMAX,J,:)=100 T(1,J,:)=1000 ENDDO RESI=1 N=1 DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 B(I-1)=1+D1 !MAIN DIAGONAL A(I-1)=(-0.5*D1) !SUB-DIAGONAL C(I-1)=(-0.5*D1) !SUP-DIAGONAL IF (I.EQ.2) THEN V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+& (0.5*D2*T(I,J-1,N))+(0.5*D1*T(1,J,N)) ELSE IF (I.EQ.(IMAX-1)) THEN V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+& (0.5*D2*T(I,J-1,N))+(0.5*D1*T(IMAX,J,N)) ELSE V(I-1)=(0.5*D2*T(I,J+1,N))+((1-D2)*T(I,J,N))+(0.5*D2*T(I,J-1,N)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX DO I=2,IMAX-1 T(I,J,N+0.5)=O(I) ENDDO ENDDO
  • 11.
    DO I=2,IMAX-1 DO J=2,JMAX-1 B(J-1)=1+D2!MAIN DIAGONAL A(J-1)=(-0.5*D2) !SUB-DIAGONAL C(J-1)=(-0.5*D2) !SUP-DIAGONAL IF (J.EQ.2) THEN V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I- 1,J,N+0.5))+(0.5*D2*T(I,1,N)) ELSE IF (J.EQ.(IMAX-1)) THEN V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I- 1,J,N+0.5))+(0.5*D2*T(I,JMAX,N)) ELSE V(J-1)=(0.5*D1*T(I+1,J,N+0.5))+& ((1-D1)*T(I,J,N+0.5))+(0.5*D1*T(I-1,J,N+0.5)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL MATRIX DO J=2,JMAX-1 T(I,J,N+1)=O(J) RESI=RESI+ABS(T(I,J,N+1)-T(I,J,N)) ENDDO ENDDO N=N+1 ENDDO OPEN(13,FILE='N.TXT') WRITE(13,*),'NUMBER OF TIME STEPS TO CONVERGE IS:',N OPEN(11,FILE='TEMP.PLT') WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX DO J=1,JMAX DO I=1,IMAX WRITE(11,*) X(I),Y(J),T(I,J,N) ENDDO ENDDO DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*NMAX),A(IMAX-2),B(IMAX-2),C(IMAX- 2),V(IMAX-2),O(IMAX-2)) STOP END PROGRAM ADI
  • 12.
    SUBROUTINE TRIDIAG(A,B,C,V,O,N) IMPLICIT NONE !A - SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL) ! B - THE MAIN DIAGONAL ! C - SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL) ! V - RIGHT PART ! X - THE ANSWER ! N - NUMBER OF EQUATIONS INTEGER,INTENT(IN) :: N DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O DOUBLE PRECISION,DIMENSION(N):: BP,VP DOUBLE PRECISION :: M INTEGER :: I DO I=1,N BP(I)=B(I) VP(I)=V(I) ENDDO !THE FIRST PASS (SETTING COEFFICIENTS): DO I = 2,N M = A(I)/BP(I-1) BP(I) = B(I) - M*C(I-1) VP(I) = V(I) - M*VP(I-1) ENDDO O(N+1) = VP(N)/BP(N) !THE SECOND PASS (BACK-SUBSTITION) DO I = N, 2, -1 O(I) = (VP(I-1) - C(I-1)*O(I+1))/BP(I-1) ENDDO RETURN ENDSUBROUTINE TRIDIAG ‫رٍش‬ ‫کذ‬:‫تکراری‬ ‫ّبی‬ PROGRAM ELEPTIC IMPLICIT NONE INTEGER ::IMAX,JMAX,I,J,K,M,F,KMAX DOUBLE PRECISION ::L,H,DX,DY,ALPHA,RESI,P,W DOUBLE PRECISION, ALLOCATABLE::T(:,:,:),x(:),y(:),A(:),B(:),C(:),V(:),O(:),TOLD(:,:) REAL,PARAMETER::PI=3.1415 PRINT*,'ENTER LENGHT OF THE PLATE' READ*, L PRINT*,'ENTER HEIGHT OF THE PLATE' READ*, H
  • 13.
    PRINT*,'ENTER THE NUMBEROF NODES IN X DIRECTION' READ*, IMAX PRINT*,'ENTER THE NUMBER OF NODES IN Y DIRECTION' READ*, JMAX PRINT*,'ENTER KMAX' READ*,KMAX PRINT*,'ENTER ALPHA' READ*, ALPHA ALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*KMAX),A(IMAX-2),B(IMAX-2), C(IMAX-2),V(IMAX-2),O(IMAX-2)) DX=L/REAL(IMAX-1) DY=H/REAL(JMAX-1) DO I=1,IMAX X(I)=(I-1)*DX ENDDO DO J=1,JMAX Y(J)=(J-1)*DY ENDDO DO I=1,IMAX !BOUNDRY CONDITION T(I,1,:)=100 T(I,JMAX,:)=100 ENDDO DO J=2,JMAX-1 !BOUNDRY CONDITION T(IMAX,J,:)=100 T(1,J,:)=1000 ENDDO PRINT*,'THERE IS TWO TYPE FIRST GUESS : 1-CONSTANT TEMPRETURE:T=300 ' PRINT*,',2- T=400*SIN(3.1415*X(I)*Y(J))' PRINT*,'ENTER NUMBER OF INITIAL CONDITION' READ*, F SELECT CASE(F) !FIRST GUESS CASE(1) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=300 ENDDO ENDDO CASE(2) DO I=2,IMAX-1 DO J=2,JMAX-1 T(I,J,1)=400*SIN(3.1415*(I-1)*DX*(J-1)*DY) ENDDO ENDDO END SELECT W=1 K=1 RESI=1 PRINT*,'THERE IS SOME SOLUTION ALGORITHMS FOR ELEPTIC EQUATION:' PRINT*,'1-JACOBI ITERATION METHOD'
  • 14.
    PRINT*,'2-THE POINT GAUSS-SEIDELITERATION METHOD' PRINT*,'3-THE LINE GAUSS-SEIDEL ITERATION METHOD' PRINT*,'4-POINT SUCCESSIVE OVER-RELAXATION METHOD(PSOR)' PRINT*,'5-THE ALTERNATING DIRECTION IMPLICIT(ADI)' PRINT*,'ENTER NUMBER OF SOLUTION YOU WANT' READ*,M SELECT CASE(M) CASE(1) DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 T(I,J,K+1)=(0.5/(1+(DX/DY)**2))*(T(I+1,J,K)+ & T(I-1,J,K)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K))) RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K)) ENDDO ENDDO K=K+1 ENDDO CASE(2) DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 T(I,J,K+1)=(0.5/(1+((DX/DY)**2)))*(T(I+1,J,K)+& T(I-1,J,K+1)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K+1))) RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K)) ENDDO ENDDO K=K+1 ENDDO CASE(3) DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 B(I-1)=(-2*(1+((DX/DY)**2))) !MAIN DIAGONAL A(I-1)=1 !SUB-DIAGONAL C(I-1)=1 !SUP-DIAGONAL IF (I.EQ.2) THEN V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1))-& T(I-1,J,K+1) ELSE IF (I.EQ.(IMAX-1)) THEN V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1))-& T(I+1,J,K+1) ELSE V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+1)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX
  • 15.
    DO I=2,IMAX-1 T(I,J,K+1)=O(I) RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K)) ENDDO ENDDO K=K+1 ENDDO CASE(4) P=((COS(3.1415/(IMAX-1))+& ((DX/DY)**2)*COS(3.1415/(JMAX-1)))/(1+((DX/DY)**2)))**2 W=(2-2*DSQRT(1-P))/P DO WHILE(RESI.GT.(0.0001)) RESI=0 DOJ=2,JMAX-1 DO I=2,IMAX-1 T(I,J,K+1)=((0.5*W)/(1+(DX/DY)**2))*(T(I+1,J,K)+& T(I-1,J,K+1)+((DX/DY)**2)*(T(I,J+1,K)+T(I,J-1,K+1)))+(1-W)*T(I,J,K) RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K)) ENDDO ENDDO K=K+1 ENDDO CASE(5) DO WHILE(RESI.GT.(0.0001)) RESI=0 DO J=2,JMAX-1 DO I=2,IMAX-1 B(I-1)=(-2*(1+((DX/DY)**2))) !MAIN DIAGONAL A(I-1)=1 !SUB-DIAGONAL C(I-1)=1 !SUP-DIAGONAL IF (I.EQ.2) THEN V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5))-& T(I-1,J,K+0.5) ELSE IF (I.EQ.(IMAX-1)) THEN V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5))-& T(I+1,J,K+0.5) ELSE V(I-1)=(-1*((DX/DY)**2))*(T(I,J+1,K)+T(I,J-1,K+0.5)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,IMAX-2) !SOLVING TRIDIAGONAL MATRIX DO I=2,IMAX-1 T(I,J,K+0.5)=O(I) ENDDO ENDDO DO I=2,IMAX-1
  • 16.
    DO J=2,JMAX-1 B(J-1)=(-2*(1+(DX/DY)**2)) !MAINDIAGONAL A(J-1)=((DX/DY)**2) !SUB-DIAGONAL C(J-1)=((DX/DY)**2) !SUP-DIAGONAL IF (J.EQ.2) THEN V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1))-& ((DX/DY)**2)*T(I,J-1,K+1) ELSE IF (J.EQ.(JMAX-1)) THEN V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1))-& ((DX/DY)**2)*T(I,J+1,K+1) ELSE V(J-1)=-1*(T(I+1,J,K+0.5)+T(I-1,J,K+1)) ENDIF ENDDO CALL TRIDIAG(A,B,C,V,O,JMAX-2) !SOLVING TRIDIAGONAL MATRIX DO J=2,JMAX-1 T(I,J,K+1)=O(J) RESI=RESI+ABS(T(I,J,K+1)-T(I,J,K)) ENDDO ENDDO K=K+1 ENDDO END SELECT OPEN(13,FILE='K.TXT') WRITE(13,*),'THE VALUE OF UNDER-RELAXATION FACTOR IS:',W WRITE(13,*),'NUMBER OF ITERATION TO CONVERGE',K OPEN(11,FILE='TEMP.PLT') WRITE(11,*) 'X,Y,T ZONE I=',IMAX,'J=',JMAX DO J=1,JMAX DO I=1,IMAX WRITE(11,*) X(I),Y(J),T(I,J,K) ENDDO ENDDO DEALLOCATE(X(IMAX),Y(JMAX),T(IMAX,JMAX,2*KMAX),A(IMAX-2), B(IMAX-2),C(IMAX-2),V(IMAX-2),O(IMAX-2)) STOP END PROGRAM ELEPTIC SUBROUTINE TRIDIAG(A,B,C,V,O,N) IMPLICIT NONE ! A - SUB-DIAGONAL (MEANS IT IS THE DIAGONAL BELOW THE MAIN DIAGONAL)
  • 17.
    ! B -THE MAIN DIAGONAL ! C - SUP-DIAGONAL (MEANS IT IS THE DIAGONAL ABOVE THE MAIN DIAGONAL) ! V - RIGHT PART ! X - THE ANSWER ! N - NUMBER OF EQUATIONS INTEGER,INTENT(IN) :: N DOUBLE PRECISION,DIMENSION(N),INTENT(IN) :: A,B,C,V DOUBLE PRECISION,DIMENSION(N),INTENT(OUT) :: O DOUBLE PRECISION,DIMENSION(N):: BP,VP DOUBLE PRECISION :: M INTEGER :: I DO I=1,N BP(I)=B(I) VP(I)=V(I) ENDDO !THE FIRST PASS (SETTING COEFFICIENTS): DO I = 2,N M = A(I)/BP(I-1) BP(I) = B(I) - M*C(I-1) VP(I) = V(I) - M*VP(I-1) ENDDO O(N+1) = VP(N)/BP(N) !THE SECOND PASS (BACK-SUBSTITION) DO I = N, 2, -1 O(I) = (VP(I-1) - C(I-1)*O(I+1))/BP(I-1) ENDDO RETURN ENDSUBROUTINE TRIDIAG