introduction to cfd fortran code

17
جن: ثخص پش کذ ر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 '

Upload: behnam-bozorgmehr

Post on 11-Apr-2017

108 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Introduction to CFD FORTRAN code

ثخص پجن:

: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 '

Page 2: Introduction to CFD FORTRAN code

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

Page 3: Introduction to CFD FORTRAN code

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

Page 4: Introduction to CFD FORTRAN code

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))

Page 5: Introduction to CFD FORTRAN code

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

Page 6: Introduction to CFD FORTRAN code

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

Page 7: Introduction to CFD FORTRAN code

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

Page 8: Introduction to CFD FORTRAN code

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)

Page 9: Introduction to CFD FORTRAN code

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)

Page 10: Introduction to CFD FORTRAN code

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

Page 11: Introduction to CFD FORTRAN code

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

Page 12: Introduction to CFD FORTRAN code

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

Page 13: Introduction to CFD FORTRAN code

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'

Page 14: Introduction to CFD FORTRAN code

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

Page 15: Introduction to CFD FORTRAN code

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

Page 16: Introduction to CFD FORTRAN code

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)

Page 17: Introduction to CFD FORTRAN code

! 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