回 帖 发 新 帖 刷新版面

主题:求助个数组越界的错误

!##################################################################################################
program psspap
!plane stress/strain problem analysis program
!##################################################################################################
dimension lnd(500,3),x(200),y(200),jz(50,3),pj(50,3),p(500),tl(20),ak(500,100),ake(6,6)

open (6,file='psspapin.txt')
open (8,file='psspapout.txt')
read (6,10) tl
10 format(20a4)
read(6,*) nj,ne,nz,npj,ips
write(8,10) tl

if (ips==1) write(8,20)
if (ips==2) write(8,30)


20 format(/1x,'plane stress problem')
30 format(/1x,'plane strain problem')

npj0=npj
if (npj==0) npj=1
call read_in(nj,ne,nz,nd,npj,npj0,ips,e,pr,t,v,lnd,x,y,jz,pj)

n=2*nj

do i=1,n
 do j=1,nd
  ak(i,j)=0.0
 end do
end do

do ie=1,ne
 call mke(ie,nj,ne,lnd,x,y,e,pr,t,ake)
 do i=1,3
  do ii=1,2
   ih=2*(i-1)+ii
   idh=2*(lnd(ie,i)-1)+ii
   do j=1,3
    do jj=1,2
     l=2*(j-1)+jj
     il=2*(lnd(ie,j)-1)+jj
     idl=il-idh+1
     if (idl>0) then
      ak(idh,idl)=ak(idh,idl)+ake(ih,l)
     end if
    end do
   end do
  end do
 end do
end do

call mf(nj,ne,npj,npj0,n,t,v,lnd,x,y,pj,p)
call rkr(nz,nd,n,jz,ak,p)
call slov(nj,n,nd,ak,p)
call made(ne,nj,n,e,pr,lnd,x,y,p)

close(6)
close(8)

stop
end program psspap

!##################################################################################################
subroutine read_in(nj,ne,nz,nd,npj,npj0,ips,e,pr,t,v,lnd,x,y,jz,pj)
!##################################################################################################
dimension lnd(500,3),x(nj),y(nj),jz(nz,3),pj(npj,3)
 read(6,*) e,pr,t,v
 read(6,*) ((lnd(i,j),j=1,3),i=1,ne)
 read(6,*) (x(i),y(i),i=1,nj)
 read(6,*) ((jz(i,j),j=1,3),i=1,nz)
 
 if (npj0/=0) then
  read(6,*) ((pj(i,j),j=1,3),i=1,npj)
 end if
 
 nd=0
 
 do ie=1,ne
  do i=1,3
   do j=1,3
    iw=iabs(lnd(ie,i)-lnd(ie,j))
    if (nd<iw) then
     nd=iw
    end if
   end do
  end do
 end do

 nd=(nd+1)*2
 
 if (ips/=1) then
  e=e/(1.0-pr*pr)
  pr=pr/(1.0-pr)
 end if

end

!##################################################################################################
subroutine mke(ie,nj,ne,lnd,x,y,e,pr,t,ake)
!##################################################################################################
dimension lnd(ne,3),x(nj),y(nj),b(3,6),d(3,3),s(3,6),ake(6,6)
call ma(ie,nj,ne,lnd,x,y,ae)
call md(e,pr,d)
call mb(ie,nj,ne,lnd,x,y,ae,b)

do i=1,3
  do j=1,6
   s(i,j)=0.0
   do k=1,3
    s(i,j)=s(i,j)+d(i,k)*b(k,j)
   end do
  end do
 end do

 do i=1,6
  do j=1,6
   ake(i,j)=0.0
   do k=1,3
    ake(i,j)=ake(i,j)+s(k,i)*b(k,j)*ae*t
   end do
  end do
 end do

end

!##################################################################################################
subroutine ma(ie,nj,ne,lnd,x,y,ae)
!##################################################################################################
dimension lnd(500,3),x(nj),y(nj)

 i=lnd(ie,1)
 j=lnd(ie,2)
 k=lnd(ie,3)
 xij=x(j)-x(i)
 yij=y(j)-y(i)
 xik=x(k)-x(i)
 yik=y(k)-y(i)
 ae=0.5*(xij*yik-xik*yij)

return
end

!##################################################################################################
subroutine md(e,pr,d)
!##################################################################################################
dimension d(3,3)

 do i=1,3
  do j=1,3
   d(i,j)=0.0
  end do 
 end do

 d(1,1)=e/(1.0-pr*pr)
 d(1,2)=e*pr/(1.0-pr*pr)
 d(2,1)=d(1,2)
 d(2,2)=d(1,1)
 d(3,3)=0.5*e/(1.0+pr)

return
end

!##################################################################################################
subroutine mb(ie,nj,ne,lnd,x,y,ae,b)
!##################################################################################################
dimension lnd(500,3),x(nj),y(nj),b(3,6)

 i=lnd(ie,1)
 j=lnd(ie,2)
 k=lnd(ie,3)

 do ii=1,3
  do jj=1,6
   b(ii,jj)=0.0
  end do
 end do

 b(1,1)=y(j)-y(k)
 b(1,3)=y(k)-y(i)
 b(1,5)=y(i)-y(j)
 b(2,2)=x(k)-x(j)
 b(2,4)=x(i)-x(k)
 b(2,6)=x(j)-x(i)
 b(3,1)=b(2,2)
 b(3,2)=b(1,1)
 b(3,3)=b(2,4)
 b(3,4)=b(1,3)
 b(3,5)=b(2,6)
 b(3,6)=b(1,5)

 do i1=1,3
  do j1=1,6
   b(i1,j1)=0.5/ae*b(i1,j1)
  end do
 end do

return
end

!##################################################################################################
subroutine mf(nj,ne,npj,npj0,n,t,v,lnd,x,y,pj,p)
!##################################################################################################
dimension lnd(500,3),x(nj),y(nj),pj(npj,3),p(n)

 do i=1,n
  p(i)=0.0
 end do
 
 if (npj0/=0) then
  do i=1,npj
   ii=pj(i,1)
   p(2*ii-1)=pj(i,2)
   p(2*ii)=pj(i,3)
  end do
 end if

 if (v/=0) then
  do ie=1,ne
   call ma(ie,nj,ne,lnd,x,y,ae)
   pe=-v*ae*t/3.0
   do i=1,3
    ii=lnd(ie,i)
    p(2*ii)=p(2*ii)+pe
   end do
  end do
 end if

return
end

!##################################################################################################
subroutine rkr(nz,nd,n,jz,ak,p)
!##################################################################################################
dimension p(n),jz(nz,3),ak(500,100)

 do i=1,nz
  ir=jz(i,1)
  do j=2,3
   if (jz(i,j)/=0) then
    ii=2*ir+j-3
    ak(ii,1)=1.0
    do jj=2,nd
     ak(ii,jj)=0.0
    end do
    if (ii>nd) jo=nd
    if (ii<=nd) jo=ii
    do jj=2,jo
     ak(ii-jj+1,jj)=0.0
    end do
    p(ii)=0.0
   end if
  end do
 end do

return
end

!##################################################################################################
subroutine slov(nj,n,nd,ak,p)
!##################################################################################################
dimension p(n),ak(500,100)

 nj1=n-1
 
 do k=1,nj1
  if (n>k+nd-1) im=k+nd-1
  if (n<=k+nd-1) im=n
  
  k1=k+1
  do i=k1,im
   l=i-k+1
   c=ak(k,l)/ak(k,1)
   iw=nd-l+1
   do j=1,iw
    m=j+i-k
    ak(i,j)=ak(i,j)-c*ak(k,m)
   end do
   p(i)=p(i)-c*p(k)
  end do
 end do
 
 p(n)=p(n)/ak(n,1)

 do i1=1,nj1
  i=n-i1
  if (nd>n-i+1) jo=n-i+1
  if (nd>n-i+1) jo=nd
  
  do j=2,jo
   k=j+i-1
   p(i)=p(i)-ak(i,j)*p(k)
  end do
  p(i)=p(i)/ak(i,1)
 end do
 
 write(8,50)
50 format(/5x,5('**'),'result of calculation',5('**')//1x,'nodal displacements'//3x,'node',5x,'x-disp.',8x,'y-disp.')

 do i=1,nj
  write(8,70) i,p(2*i-1),p(2*i)
70 format(1x,i5,2e15.6)
 end do

return
end 

!##################################################################################################
subroutine made(ne,nj,n,e,pr,lnd,x,y,p)
!##################################################################################################
dimension lnd(500,3),x(nj),y(nj),d(3,3),b(3,6),s(3,6),st(3),p(n),de(6)

 write(8,10)
10 format(/1x,'elemente stresses'/)
 call md(e,pr,d)
  do ie=1,ne
   call ma(ie,nj,ne,lnd,x,y,ae)
   call mb(ie,nj,ne,lnd,x,y,ae,b)
   do i=1,3
    do j=1,6
     s(i,j)=0.0
     do k=1,3
      s(i,j)=s(i,j)+d(i,k)*b(k,j)
     end do
    end do
   end do
   
   do i=1,3
    do j=1,2
     ih=2*(i-1)+j
     iw=2*(lnd(ie,i)-1)+j
     de(ih)=p(iw)
    end do
   end do

   do i=1,3
    st(i)=0.0
    do j=1,6
     st(i)=st(i)+s(i,j)*de(j)
    end do
   end do

   stx=st(1)
   sty=st(2)
   txy=st(3)
   ast=(stx+sty)/2
   rst=sqrt(0.25*(stx-sty)**2+txy*txy)
   stma=ast+rst
   stmi=ast-rst

   if (sty==stmi) ceta=0.0
   if (sty/=stmi) ceta=90.0-57.29578*atan(txy/(sty-stmi))

   write(8,60) ie,stx,sty,txy,stma,stmi,ceta
60 format(1x,'elemetn no.=',i5/3x,'stx=',e15.6,2x,'sty=',e15.6,2x,'txy=',e15.6/3x,'stma=',e15.6,2x,'stmi=',e15.6,2x,'ceta=',e15.6)

 end do

return
end



提示我数组越界,然后我用debug查,错误出现在   p(i)=p(i)-ak(i,j)*p(k)这一行,可是我不知道如何去改正。
请哪位大哥帮小弟看看啊,不胜感激

回复列表 (共1个回复)

沙发

do i1=1,nj1
  i=n-i1
  if (nd>n-i+1) jo=n-i+1
  if (nd>n-i+1) jo=nd
  
  do j=2,jo
   k=j+i-1
   p(i)=p(i)-ak(i,j)*p(k)
  end do
  p(i)=p(i)/ak(i,1)
 end do
这里明显k值有可能大于n嘛,你确定k值是=j+i-1?

我来回复

您尚未登录,请登录后再回复。点此登录或注册