2013-10-06 46 views
0

我正在研究一門大學課程的小程序,而且我差不多完成了,但不知何故它不工作,因爲我希望它能夠正常工作。Fortran90錯誤的輸出

現在,輸出文件gravity1.dat應該給我不等於0的值。但它不會...在最後一個公式中我計算g(衝浪)的地方,其中一個變量是0.如果嘗試幾乎所有在我的權力來糾正它,但我似乎無法修復它。

program gravity 

implicit none 
real(8) Lx,Ly,sx,sy,xsphere,ysphere,r,A,rho1,rho2,dx,G 
integer np,nel,nelx,nely,i,nnx,nny,j,counter,nsurf 
real(8),dimension(:),allocatable :: xcgrid 
real(8),dimension(:),allocatable :: ycgrid 
real(8),dimension(:),allocatable :: xgrid 
real(8),dimension(:),allocatable :: ygrid 
real(8),dimension(:),allocatable :: rho 
real(8),dimension(:),allocatable :: xsurf, gsurf 
real(8),dimension(:),allocatable :: ysurf 

nnx=11. 
nny=11. 
Lx=10. 
Ly=10. 
nelx=nnx-1. 
nely=nny-1. 
nel=nelx*nely 
np=nnx*nny 
sx=Lx/nelx 
sy=Ly/nely 
xsphere=5. 
ysphere=5. 
r=3. 
nsurf=7 !number of gravimeters 

dx=Lx/(nsurf-1.) 

!========================================================== 

allocate(xgrid(np)) 
allocate(ygrid(np)) 

counter=0 
do i=1,nnx 
    do j=1,nny 
    counter=counter+1 
    xgrid(counter)=dble(i-1)*sx 
    ygrid(counter)=dble(j-1)*sy 
    end do 
end do 

call write_two_columns(np,xgrid,ygrid,'grid_init1.dat') 
!========================================================== 

allocate(xcgrid(np)) 
allocate(ycgrid(np)) 


counter=0 
do i=1,nnx-1 
    do j=1,nny-1 
    counter=counter+1 
    xcgrid(counter)=dble(i-1)*sx+0.5*sx 
    ycgrid(counter)=dble(j-1)*sy+0.5*sy 
    end do 
end do 

call write_two_columns(np,xcgrid,ycgrid,'gridc_init1.dat') 
!========================================================== 

allocate(rho(nel)) 

rho1=3000. !kg/m^3 
rho2=3200. !kg/m^3 

do i=1,nel 
    if (sqrt((xsphere-xcgrid(i))**2)+((ysphere-ycgrid(i))**2)<r) then 
    rho(i)=3200. 
    else 
    rho(i)=3000. 
    end if 
end do 

call write_three_columns(nel,xcgrid,ycgrid,rho,'inclusion1.dat') 
!========================================================== 

allocate(xsurf(nsurf)) 
allocate(ysurf(nsurf)) 

do i=1,nsurf 
xsurf(i)=(i-1)*dx 
ysurf(i)=ly 
end do 

call write_two_columns(nsurf,xsurf,ysurf,'surf_init1.dat') 
!========================================================== 

allocate(gsurf(nsurf)) 

G=0.000000000066738480 !m^3 kg^-1 s^-2 

do i=1,nsurf 
    do j=1,nel 
    gsurf(i)=gsurf(i)+(-2.*G*(((rho(i)-rho1)*(ycgrid(counter)-ysurf(i)))/((xcgrid(counter)-xsurf(i))**2.+(ycgrid(counter)-ysurf(i))**2.))*sx*sy) 

    end do 
end do 

call write_two_columns(nsurf,xsurf,gsurf,'gravity1.dat') 

deallocate(xgrid) 
deallocate(ygrid) 
deallocate(xcgrid) 
deallocate(ycgrid) 
deallocate(xsurf) 
deallocate(ysurf) 
deallocate(gsurf) 
end program 

子程序使用:

!=========================================== 

subroutine write_two_columns (nnn,xxx,yyy,filename) 
implicit none 
integer i,nnn 
real(8) xxx(nnn),yyy(nnn) 
character(LEN=*) filename 

open(unit=123,file=filename,action='write') 
do i=1,nnn 
write(123,*) xxx(i),yyy(i) 
end do 
close(123) 
end subroutine 

和其他子程序:

!=========================================== 

subroutine write_three_columns (nnn,xxx,yyy,zzz,filename) 
implicit none 
integer i,nnn 
real(8) xxx(nnn),yyy(nnn),zzz(nnn) 
character(LEN=*) filename 
open(unit=123,file=filename,action='write') 
do i=1,nnn 
write(123,*) xxx(i),yyy(i),zzz(i) 
end do 
close(123) 
end subroutine 

!=========================================== 
+6

我沒有時間去調試你的程序。但是,如果你只是學習,試着學習一些基本的Fortran習慣。使用縮進。你在一些地方使用它,但還不夠。它極大地提高了可讀性。將你的子程序放在一個模塊中。它將啓用一些錯誤檢查。那麼你也可以使用假定的形狀數組'(:,:)',你不需要傳遞數組的大小。不要使用真實的(8),它不是便攜式的,它是一個「幻數」。使用'kind(1.d0)','selected_real_kind'或'rea64'。學習編譯器的錯誤檢查選項。您不必在Fortran95中釋放可分配對象。 –

+1

請注意,您的gsurf計算不使用j,而是使用計數器。這肯定會導致意想不到的行爲。 –

回答

0

不是應該(rho(j)-rho1)?您填寫rho(1:nel),但只能使用rho(1:7)!順便說一句,小心你的變量初始化...你指定real s到integer s,並做混合類型的算術。請小心,因爲這可能會導致意想不到的結果。使用你的編譯器來檢測這些問題。