Вы находитесь на странице: 1из 4

SINGLE-PHASE TWO-DIMENSIONAL SIMULATOR PROGRAM IN FORTRAN

program simulador
double precision, allocatable, dimension(:,:) :: cau, p, matriz,copiamatriz
double precision, allocatable, dimension(:) :: presiont,pivote
double precision:: lx,ly,h,o,k,c,u,t,d1,d2,divisor,multi,dx,dy,tiempo,dt,dz
integer :: nx,ny,i,j,pas,pasos,n,z,k2
!abre el archivo datos.txt
open (unit=11, file='datos.txt',status='old',action='read')
read(11,*)nx,ny
read(11,*)lx,ly,h
read(11,*)k
read(11,*)o
read(11,*)c
read(11,*)u
read(11,*)t
read(11,*)pasos
close(11)
dx=lx/nx
dy=ly/ny
dt=t/pasos
dz=h

!asigno las dimensiones a las matrices


allocate(cau(ny,nx),p(ny,nx),matriz(ny*nx+1,nx*ny),presiont(nx*ny),copiamatriz(ny*nx+1,nx
*ny),pivote(nx*ny+1))
open (unit=45, file='presiones.txt',status='old',action='read')
open (unit=55, file='caudales.txt',status='old',action='read')
do i=nx,1,-1
do j=1,ny,1
read(55,*)cau(j,i)
read(45,*)p(j,i)
end do
end do
close(45)
close(55)
!calculo de las constantes d1 y d2
dz=h
d1=((dx**2)*(dy**2)/dt)*((c*o*u)/(0.00112712*k))
d2=((dx*dy)/dz)*(u/(0.00112712*k))

k2=1
matriz(:,:)=0
do i=nx,1,-1
do j=1,ny,1

if(i>1)then
!caso 1
if(i<nx .and. j==ny)then
matriz(k2-1,k2)=dy**2
matriz(k2,k2)=-1*(dy**2+2*(dx**2)+d1)
matriz(k2+ny,k2)=dx**2
matriz(k2-ny,k2)=dx**2
end if

!caso 2
if(i<nx.and.j==1)then
matriz(k2,k2)=-1*(dy**2+2*(dx**2)+d1)
matriz(k2+1,k2)=dy**2
matriz(k2+ny,k2)=dx**2
matriz(k2-ny,k2)=dx**2
end if

!caso 9
if(i<nx.and.j>1 .and. j<ny)then
matriz(k2+1,k2)=dy**2
matriz(k2,k2)=-1*(2*(dy**2)+2*(dx**2)+d1)
matriz(k2-1,k2)=dy**2
matriz(k2+ny,k2)=dx**2
matriz(k2-ny,k2)=dx**2
end if
end if

if(i==1)then

!caso 3
if(j>1 .and. j<ny)then
matriz(k2+1,k2)=dy**2
matriz(k2,k2)=-1*(2*(dy**2)+dx**2+d1)
matriz(k2-1,k2)=dy**2
matriz(k2-ny,k2)=dx**2
end if

!caso 5
if(j==1)then
matriz(k2+1,k2)=dy**2
matriz(k2,k2)=-1*(dy**2+(dx**2)+d1)
matriz(k2-ny,k2)=dx**2
end if

!caso 7
if(j==ny)then
matriz(k2-1,k2)=dy**2
matriz(k2,k2)=-1*(dy**2+(dx**2)+d1)
matriz(k2-ny,k2)=dx**2
end if
end if
if(i==nx)then

!caso 4
if(j>1 .and. j<ny)then
matriz(k2+1,k2)=dy**2
matriz(k2,k2)=-1*(2*(dy**2)+dx**2+d1)
matriz(k2-1,k2)=dy**2
matriz(k2+ny,k2)=dx**2
end if

!caso 6
if(j==1)then
matriz(k2+1,k2)=dy**2
matriz(k2,k2)=-1*((dy**2)+dx**2+d1)
matriz(k2+ny,k2)=dx**2
end if

!caso 8
if(j==ny)then
matriz(k2+ny,k2)=dx**2
matriz(k2-1,k2)=dy**2
matriz(k2,k2)=-1*((dy**2)+dx**2+d1)
end if
end if
matriz(ny*nx+1,k2)=-d1*p(j,i)-d2*cau(j,i)
k2=k2+1
end do
end do

open (unit=1, file='matriz.txt', status='replace')


do i=1,nx*ny,1
write(1,*)matriz(1:nx*ny,i)
end do
close(1)
open(unit=15,file='result.txt',status='replace',action='write')
N=Nx*Ny
tiempo=0
DO pas=1,pasos,1
tiempo=tiempo+(T/pasos)
copiamatriz(:,:)=matriz(:,:)
write(15,*)"Paso",pas
write(15,*)dx,dy,"dx y dy"
write(15,*)"T",tiempo
write(15,*)"p(i,j)"
DO j=1,N,1
divisor=copiamatriz(j,j)
DO k2=1,N+1,1
copiamatriz(k2,j)=copiamatriz(k2,j)/divisor
END DO
DO i=1,N,1
if (i/=j) then
multi=copiamatriz(j,i)
DO k2=1,N+1,1
copiamatriz(k2,i)=copiamatriz(k2,i)-copiamatriz(k2,j)*multi
END DO
endif
END DO
END DO
DO I=1,N,1
presiont(I)=copiamatriz(N+1,I)
END DO
DO i=1,Nx,1
DO j=1,Ny,1
matriz(Ny*Nx+1,(i-1)*Ny+j)=-d1*presiont((i-1)*Ny+j)-d2*cau(j,i)
write(15,*)i,j,presiont((i-1)*Ny+j)
END DO
END DO
END DO
close(15)
end program simulador

Вам также может понравиться