
Программный код
Program Doska
use msimsl
real Lx,Ly,dx,dy, xIt,yIt,&
&G,aP,aW,aE,aN,aS,b0,&
&d,eps,keps,pi,t,alfa
real,allocatable:: x(:),y(:),F(:,:),A(:,:),B(:),&
&Ftdma(:,:),Fg(:,:),Fgs(:,:),Ftr(:,:),& &ItFtdma(:),ItFgs(:),ItFtr(:),&
&A1(:,:),B1(:,:),Feps(:),P(:),Q(:)
integer uzlx,uzly, Na,n,Neps,Nb, iIt,jIt,It1,It2
write(*,*) 'Oblast (Lx, Ly)'
read(*,*) Lx, Ly
write(*,*) 'Reshotka (po x, po y)'
read(*,*) uzlx, uzly
write(*,*) 'Tochka sravneniya skorosti iteracii (xIt, yIt)'
read(*,*) xIt, yIt
Na=(uzlx-2)*(uzly-2)
allocate(x(uzlx),y(uzly),F(uzly,uzlx),A(Na,Na),B(Na))
eps=0.001
dx=Lx/(uzlx-1.)
dy=Ly/(uzly-1.)
do i=1,uzlx,1
x(i)=(i-1.)*dx
end do
do j=1,uzly,1
y(j)=(j-1.)*dy
end do
do i=2,uzlx-1,1 !Tochka sravneniya skorosti iteracii
if (Abs(xIt-x(i))<=dx/2.) then
iIt=i
end if
end do
do j=2,uzly-1,1
if (Abs(yIt-y(j))<=dy/2.) then
jIt=j
end if
end do !Tochka sravneniya skorosti iteracii end
G=1.
aW=G*(dy/dx)
aE=G*(dy/dx)
aN=G*(dx/dy)
aS=G*(dx/dy)
aP=aW+aE+aN+aS
b0=0.
open(1,file='C:\123456789\Fortran\Doska(17x17).txt')
write(1,'(3x,a,1x,a,f7.3)') 'Rabochaya oblast:','Lx =',Lx
write(1,'(21x,a,f7.3)') 'Ly =',Ly
write(1,*)
write(1,'(3x,a,1x,a,1x,i4)') 'Reshotka:','uzlov po x =',uzlx
write(1,'(13x,a,1x,i4)') 'uzlov po y =',uzly
F(:,:)=0. !Boundary condition F
do i=1,uzlx,1
F(1,i)=100.*(x(i)**2.+0.4)
F(uzly,i)=100.*(x(i)**2.+0.4)
end do
do j=1,uzly,1
F(j,1)=100.*(0.4-y(j)**2.+y(j))
F(j,uzlx)=100.*(1.4-y(j)**2.+y(j))
end do !Boundary condition F end
A(:,:)=0. !Matrix A
do j=2,uzly-1,1
do i=2,uzlx-1,1
n=(i-1)+(j-2)*(uzlx-2)
A(n,n)=aP
if (i/=2) then
A(n,n-1)=-aW
end if
if (i/=(uzlx-1)) then
A(n,n+1)=-aE
end if
if (j/=(uzly-1)) then
A(n,n+(uzlx-2))=-aN
end if
if (j/=2) then
A(n,n-(uzlx-2))=-aS
end if
end do
end do
B(:)=b0 !Matrix B
do j=2,uzly-1,1
do i=2,uzlx-1,1
n=(i-1)+(j-2)*(uzlx-2)
if (i==2) then
B(n)=B(n)+aW*F(j,1)
end if
if (i==(uzlx-1)) then
B(n)=B(n)+aE*F(j,uzlx)
end if
if (j==2) then
B(n)=B(n)+aS*F(1,i)
end if
if (j==(uzly-1)) then
B(n)=B(n)+aN*F(uzly,i)
end if
end do
end do
allocate(Ftdma(uzly,uzlx),Feps(uzlx),P(uzlx-2),Q(uzlx-2)) !TDMA
allocate(ItFtdma(0:5000))
Ftdma(:,:)=F(:,:)
ItFtdma(:)=0.
It1=0
do while (Neps<Na)
Neps=0
ItFtdma(It1)=Ftdma(jIt,iIt)
do j=2,uzly-1,1
Feps(:)=Ftdma(j,:)
do i=2,uzlx-1,1
n=(i-1)+(j-2)*(uzlx-2)
if (j>2.and.j<(uzly-1)) then
d=B(n)-A(n,n+(uzlx-2))*Ftdma(j+1,i)-A(n,n-(uzlx-2))*Ftdma(j-1,i)
else
if (j==2) then
d=B(n)-A(n,n+(uzlx-2))*Ftdma(j+1,i)
else
d=B(n)-A(n,n-(uzlx-2))*Ftdma(j-1,i)
end if
end if
if (i>2) then
if (i/=(uzlx-1)) then
P(i-1)=-A(n,n+1)/(A(n,n)+A(n,n-1)*P(i-2))
end if
Q(i-1)=(d-A(n,n-1)*Q(i-2))/(A(n,n)+A(n,n-1)*P(i-2))
else
P(i-1)=-A(n,n+1)/A(n,n)
Q(i-1)=d/A(n,n)
end if
end do
Ftdma(j,uzlx-1)=Q(uzlx-2)
do i=uzlx-2,2,-1
Ftdma(j,i)=P(i-1)*Ftdma(j,i+1)+Q(i-1)
end do
do i=2,uzly-1,1
if (Abs(Ftdma(j,i)-Feps(i))<=eps) then
Neps=Neps+1
end if
end do
end do
It1=It1+1
ItFtdma(It1)=Ftdma(jIt,iIt)
end do
deallocate(Feps, P, Q) !TDMA end
Nb=1 !Gauss metod
allocate(Fg(uzly,uzlx),A1(Na,Na),B1(Na,Nb))
A1(:,:)=A(:,:)
B1(:,Nb)=B(:)
Fg(:,:)=F(:,:)
call GELA(A1,B1,Na,Nb,ier)
do j=2,uzly-1,1
do i=2,uzlx-1,1
n=(i-1)+(j-2)*(uzlx-2)
Fg(j,i)=B1(n,Nb)
end do
end do
deallocate(A1, B1) !Gauss metod end
allocate(Fgs(uzly,uzlx)) !Gauss-Seidel metod
allocate(ItFgs(0:5000))
Fgs(:,:)=F(:,:)
ItFgs(:)=0.
Neps=0
It2=0
do while (Neps<Na)
Neps=0
ItFgs(It2)=Fgs(jIt,iIt)
do j=2,uzly-1,1
do i=2,uzlx-1,1
n=(i-1)+(j-2)*(uzlx-2)
keps=Fgs(j,i)
if (j>2.and.j<(uzly-1)) then
if (i>2.and.i<(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n+1)*Fgs(j,i+1)-A(n,n+(uzlx-2))*Fgs(j+1,i)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
else
if (i==2) then
Fgs(j,i)=(-A(n,n+1)*Fgs(j,i+1)-A(n,n+(uzlx-2))*Fgs(j+1,i)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
end if
if (i==(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n+(uzlx-2))*Fgs(j+1,i)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
end if
end if
else
if (j==2) then
if (i>2.and.i<(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n+1)*Fgs(j,i+1)-A(n,n+(uzlx-2))*Fgs(j+1,i)+B(n))/A(n,n)
else
if (i==2) then
Fgs(j,i)=(-A(n,n+1)*Fgs(j,i+1)-A(n,n+(uzlx-2))*Fgs(j+1,i)+B(n))/A(n,n)
end if
if (i==(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n+(uzlx-2))*Fgs(j+1,i)+B(n))/A(n,n)
end if
end if
end if
if (j==(uzly-1)) then
if (i>2.and.i<(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n+1)*Fgs(j,i+1)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
else
if (i==2) then
Fgs(j,i)=(-A(n,n+1)*Fgs(j,i+1)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
end if
if (i==(uzlx-1)) then
Fgs(j,i)=(-A(n,n-1)*Fgs(j,i-1)-A(n,n-(uzlx-2))*Fgs(j-1,i)+B(n))/A(n,n)
end if
end if
end if
end if
if (Abs(Fgs(j,i)-keps)<=eps) then
Neps=Neps+1
end if
end do
end do
It2=It2+1
end do !Gauss-Seidel metod end
if (It2>It1) then
It1=It2
end if
allocate(Ftr(uzly,uzlx)) !Top relaxation metod
allocate(ItFtr(0:5000))
Ftr(:,:)=F(:,:)
ItFtr(:)=0.
pi=CONST('Pi')
t=cos(pi/(uzlx-1.))+cos(pi/(uzly-1.))
alfa=(8.+4.*sqrt(4.-t**2.))/t**2.
if (alfa<=0.or.alfa>2.) then
alfa=(8.-4.*sqrt(4.-t**2.))/t**2.
end if
Neps=0
It2=0
do while (Neps<Na)
Neps=0
ItFtr(It2)=Ftr(jIt,iIt)
do j=2,uzly-1,1
do i=2,uzlx-1,1
keps=Ftr(j,i)
n=(i-1)+(j-2)*(uzlx-2)
if (j>2.and.j<(uzly-1)) then
if (i>2.and.i<(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n+1)*Ftr(j,i+1)-A(n,n+(uzlx-2))*Ftr(j+1,i)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
else
if (i==2) then
Ftr(j,i)=alfa*(-A(n,n+1)*Ftr(j,i+1)-A(n,n+(uzlx-2))*Ftr(j+1,i)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
if (i==(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n+(uzlx-2))*Ftr(j+1,i)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
end if
else
if (j==2) then
if (i>2.and.i<(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n+1)*Ftr(j,i+1)-A(n,n+(uzlx-2))*Ftr(j+1,i)+B(n))/A(n,n)+(1.-alfa)*keps
else
if (i==2) then
Ftr(j,i)=alfa*(-A(n,n+1)*Ftr(j,i+1)-A(n,n+(uzlx-2))*Ftr(j+1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
if (i==(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n+(uzlx-2))*Ftr(j+1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
end if
end if
if (j==(uzly-1)) then
if (i>2.and.i<(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n+1)*Ftr(j,i+1)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
else
if (i==2) then
Ftr(j,i)=alfa*(-A(n,n+1)*Ftr(j,i+1)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
if (i==(uzlx-1)) then
Ftr(j,i)=alfa*(-A(n,n-1)*Ftr(j,i-1)-A(n,n-(uzlx-2))*Ftr(j-1,i)+B(n))/A(n,n)+(1.-alfa)*keps
end if
end if
end if
end if
if (Abs(Ftr(j,i)-keps)<=eps) then
Neps=Neps+1
end if
end do
end do
It2=It2+1
end do !Top relaxation metod end
if (It2>It1) then
It1=It2
end if
write(1,*)
write(1,'(1x,100a1)') ('-',k=1,77)
write(1,'(2x,a)') 'Value F TDMA Gauss Gauss-Seidel Top relaxation'
write(1,'(1x,100a1)') ('-',k=1,77)
write(1,'(3x,a)')' (x,y) F F F F'
do j=1,uzly,1
write(1,*)
do i=1,uzlx,1
write(1,1) '(',x(i),',',y(j),')', Ftdma(j,i),Fg(j,i),Fgs(j,i),Ftr(j,i)
end do
end do
write(1,'(1x,100a1)') ('-',k=1,77)
1 format(2x,a,f8.5,a,f8.5,a,3x,f8.3,5x,f8.3,5x,f8.3,5x,f8.3)
write(1,*)
write(1,'(2x,a,f8.5,a,f8.5,a)') 'Sravnenie skorosti iteracii (',x(iIt),',',y(jIt),')'
write(1,'(1x,100a1)') ('-',k=1,77)
write(1,'(2x,a)') 'Iteracii TDMA Gauss-Seidel Top relaxation'
write(1,'(1x,100a1)') ('-',k=1,77)
write(1,'(2x,a)')'Iteration F F F'
write(1,*)
do i=0,It1,1
write(1,2) i, ItFtdma(i),ItFgs(i),ItFtr(i)
end do
write(1,'(1x,100a1)') ('-',k=1,77)
2 format(2x,i5,5x,f8.3)!,5x,f8.3,5x,f8.3)
end !Konec :)
SUBROUTINE GELA( a, b, N, NB, ier )
C
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Programm for solution system algebric equations, using *
* Gauss method with some right parts by A.Kudriavzev *
* b --- massiv right parts and results *
* a --- matric of koefficients *
* n --- number equations *
* nb -- number different right parts *
* ier - users error *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
c
DIMENSION A(n,n),B(n,nb)
IER=0
C
DO 10 K=1,N
IF(K.EQ.N)GO TO 210
C
K1=K+1
IM=K
AM=ABS(A(K,K))
DO 220 I=K1,N
AIK=ABS(A(I,K))
IF(AIK.LE.AM)GO TO 220
IM=I
AM=AIK
220 CONTINUE
C
DO 230 J=K,N
AM=A(K,J)
A(K,J)=A(IM,J)
230 A(IM,J)=AM
DO 231 JB=1,NB
AM=B(K,JB)
B(K,JB)=B(IM,JB)
231 B(IM,JB)=AM
C
210 AK1=AKK
C
AKK=A(K,K)
IF(AKK.NE.0.)GO TO 240
IER=2
RETURN
C
240 CONTINUE
AKI=1./AKK
DO 101 JB=1,NB
101 B(K,JB)=B(K,JB)*AKI
C
IF(K.EQ.N)GO TO 100
C
DO 20 J=K1,N
A(K,J)=A(K,J)*AKI
AKJ=A(K,J)
DO 30 I=K1,N
30 A(I,J)=A(I,J)-A(I,K)*AKJ
AJK=A(J,K)
DO 201 JB=1,NB
201 B(J,JB)=B(J,JB)-AJK*B(K,JB)
20 CONTINUE
10 CONTINUE
C
100 K1=K
K=K-1
IF(K.EQ.0)RETURN
DO 401 JB=1,NB
BKB=B(K,JB)
DO 40 J=K1,N
40 BKB=BKB-A(K,J)*B(J,JB)
401 B(K,JB)=BKB
GO TO 100
c
END