introduction to cfd fortran code
TRANSCRIPT
ثخص پجن:
: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