爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 4386|回复: 3

[求助] 求助个fortran有限元小程序问题

[复制链接]

新浪微博达人勋

发表于 2012-4-24 07:43:17 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
我做个有限元小程序,是从书上面抄下来的,fortran77的程序,可是我运行的时候就说我数组越界,我也找到了问题行,可是不知道如何修改,麻烦哪位帮我看看。代码在附件中,谢谢大家了!
  1. !##################################################################################################
  2. program psspap
  3. !plane stress/strain problem analysis program
  4. !##################################################################################################
  5. dimension lnd(500,3),x(200),y(200),jz(50,3),pj(50,3),p(500),tl(20),ak(500,100),ake(6,6)

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

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


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

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

  19. n=2*nj

  20. do i=1,n
  21. do j=1,nd
  22.   ak(i,j)=0.0
  23. end do
  24. end do

  25. do ie=1,ne
  26. call mke(ie,nj,ne,lnd,x,y,e,pr,t,ake)
  27. do i=1,3
  28.   do ii=1,2
  29.    ih=2*(i-1)+ii
  30.    idh=2*(lnd(ie,i)-1)+ii
  31.    do j=1,3
  32.     do jj=1,2
  33.          l=2*(j-1)+jj
  34.          il=2*(lnd(ie,j)-1)+jj
  35.          idl=il-idh+1
  36.          if (idl>0) then
  37.           ak(idh,idl)=ak(idh,idl)+ake(ih,l)
  38.          end if
  39.         end do
  40.    end do
  41.   end do
  42. end do
  43. end do

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

  48. close(6)
  49. close(8)

  50. stop
  51. end program psspap

  52. !##################################################################################################
  53. subroutine read_in(nj,ne,nz,nd,npj,npj0,ips,e,pr,t,v,lnd,x,y,jz,pj)
  54. !##################################################################################################
  55. dimension lnd(500,3),x(nj),y(nj),jz(nz,3),pj(npj,3)
  56. read(6,*) e,pr,t,v
  57. read(6,*) ((lnd(i,j),j=1,3),i=1,ne)
  58. read(6,*) (x(i),y(i),i=1,nj)
  59. read(6,*) ((jz(i,j),j=1,3),i=1,nz)

  60. if (npj0/=0) then
  61.   read(6,*) ((pj(i,j),j=1,3),i=1,npj)
  62. end if

  63. nd=0

  64. do ie=1,ne
  65.   do i=1,3
  66.    do j=1,3
  67.     iw=iabs(lnd(ie,i)-lnd(ie,j))
  68.         if (nd<iw) then
  69.          nd=iw
  70.         end if
  71.    end do
  72.   end do
  73. end do

  74. nd=(nd+1)*2

  75. if (ips/=1) then
  76.   e=e/(1.0-pr*pr)
  77.   pr=pr/(1.0-pr)
  78. end if

  79. end

  80. !##################################################################################################
  81. subroutine mke(ie,nj,ne,lnd,x,y,e,pr,t,ake)
  82. !##################################################################################################
  83. dimension lnd(ne,3),x(nj),y(nj),b(3,6),d(3,3),s(3,6),ake(6,6)
  84. call ma(ie,nj,ne,lnd,x,y,ae)
  85. call md(e,pr,d)
  86. call mb(ie,nj,ne,lnd,x,y,ae,b)

  87. do i=1,3
  88.   do j=1,6
  89.    s(i,j)=0.0
  90.    do k=1,3
  91.     s(i,j)=s(i,j)+d(i,k)*b(k,j)
  92.    end do
  93.   end do
  94. end do

  95. do i=1,6
  96.   do j=1,6
  97.    ake(i,j)=0.0
  98.    do k=1,3
  99.     ake(i,j)=ake(i,j)+s(k,i)*b(k,j)*ae*t
  100.    end do
  101.   end do
  102. end do

  103. end

  104. !##################################################################################################
  105. subroutine ma(ie,nj,ne,lnd,x,y,ae)
  106. !##################################################################################################
  107. dimension lnd(500,3),x(nj),y(nj)

  108. i=lnd(ie,1)
  109. j=lnd(ie,2)
  110. k=lnd(ie,3)
  111. xij=x(j)-x(i)
  112. yij=y(j)-y(i)
  113. xik=x(k)-x(i)
  114. yik=y(k)-y(i)
  115. ae=0.5*(xij*yik-xik*yij)

  116. return
  117. end

  118. !##################################################################################################
  119. subroutine md(e,pr,d)
  120. !##################################################################################################
  121. dimension d(3,3)

  122. do i=1,3
  123.   do j=1,3
  124.    d(i,j)=0.0
  125.   end do
  126. end do

  127. d(1,1)=e/(1.0-pr*pr)
  128. d(1,2)=e*pr/(1.0-pr*pr)
  129. d(2,1)=d(1,2)
  130. d(2,2)=d(1,1)
  131. d(3,3)=0.5*e/(1.0+pr)

  132. return
  133. end

  134. !##################################################################################################
  135. subroutine mb(ie,nj,ne,lnd,x,y,ae,b)
  136. !##################################################################################################
  137. dimension lnd(500,3),x(nj),y(nj),b(3,6)

  138. i=lnd(ie,1)
  139. j=lnd(ie,2)
  140. k=lnd(ie,3)

  141. do ii=1,3
  142.   do jj=1,6
  143.    b(ii,jj)=0.0
  144.   end do
  145. end do

  146. b(1,1)=y(j)-y(k)
  147. b(1,3)=y(k)-y(i)
  148. b(1,5)=y(i)-y(j)
  149. b(2,2)=x(k)-x(j)
  150. b(2,4)=x(i)-x(k)
  151. b(2,6)=x(j)-x(i)
  152. b(3,1)=b(2,2)
  153. b(3,2)=b(1,1)
  154. b(3,3)=b(2,4)
  155. b(3,4)=b(1,3)
  156. b(3,5)=b(2,6)
  157. b(3,6)=b(1,5)

  158. do i1=1,3
  159.   do j1=1,6
  160.    b(i1,j1)=0.5/ae*b(i1,j1)
  161.   end do
  162. end do

  163. return
  164. end

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

  169. do i=1,n
  170.   p(i)=0.0
  171. end do

  172. if (npj0/=0) then
  173.   do i=1,npj
  174.    ii=pj(i,1)
  175.    p(2*ii-1)=pj(i,2)
  176.    p(2*ii)=pj(i,3)
  177.   end do
  178. end if

  179. if (v/=0) then
  180.   do ie=1,ne
  181.    call ma(ie,nj,ne,lnd,x,y,ae)
  182.    pe=-v*ae*t/3.0
  183.    do i=1,3
  184.     ii=lnd(ie,i)
  185.         p(2*ii)=p(2*ii)+pe
  186.    end do
  187.   end do
  188. end if

  189. return
  190. end

  191. !##################################################################################################
  192. subroutine rkr(nz,nd,n,jz,ak,p)
  193. !##################################################################################################
  194. dimension p(n),jz(nz,3),ak(500,100)

  195. do i=1,nz
  196.   ir=jz(i,1)
  197.   do j=2,3
  198.    if (jz(i,j)/=0) then
  199.     ii=2*ir+j-3
  200.         ak(ii,1)=1.0
  201.         do jj=2,nd
  202.          ak(ii,jj)=0.0
  203.         end do
  204.         if (ii>nd) jo=nd
  205.         if (ii<=nd) jo=ii
  206.         do jj=2,jo
  207.          ak(ii-jj+1,jj)=0.0
  208.         end do
  209.         p(ii)=0.0
  210.    end if
  211.   end do
  212. end do

  213. return
  214. end

  215. !##################################################################################################
  216. subroutine slov(nj,n,nd,ak,p)
  217. !##################################################################################################
  218. dimension p(n),ak(500,100)

  219. nj1=n-1

  220. do k=1,nj1
  221.   if (n>k+nd-1) im=k+nd-1
  222.   if (n<=k+nd-1) im=n

  223.   k1=k+1
  224.   do i=k1,im
  225.    l=i-k+1
  226.    c=ak(k,l)/ak(k,1)
  227.    iw=nd-l+1
  228.    do j=1,iw
  229.     m=j+i-k
  230.         ak(i,j)=ak(i,j)-c*ak(k,m)
  231.    end do
  232.    p(i)=p(i)-c*p(k)
  233.   end do
  234. end do

  235. p(n)=p(n)/ak(n,1)

  236. do i1=1,nj1
  237.   i=n-i1
  238.   if (nd>n-i+1) jo=n-i+1
  239.   if (nd>n-i+1) jo=nd

  240.   do j=2,jo
  241.    k=j+i-1
  242.    p(i)=p(i)-ak(i,j)*p(k)
  243.   end do
  244.   p(i)=p(i)/ak(i,1)
  245. end do

  246. write(8,50)
  247. 50 format(/5x,5('**'),'result of calculation',5('**')//1x,'nodal displacements'//3x,'node',5x,'x-disp.',8x,'y-disp.')

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

  252. return
  253. end

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

  258. write(8,10)
  259. 10 format(/1x,'elemente stresses'/)
  260. call md(e,pr,d)
  261.   do ie=1,ne
  262.    call ma(ie,nj,ne,lnd,x,y,ae)
  263.    call mb(ie,nj,ne,lnd,x,y,ae,b)
  264.    do i=1,3
  265.     do j=1,6
  266.          s(i,j)=0.0
  267.          do k=1,3
  268.           s(i,j)=s(i,j)+d(i,k)*b(k,j)
  269.          end do
  270.         end do
  271.    end do

  272.    do i=1,3
  273.     do j=1,2
  274.          ih=2*(i-1)+j
  275.          iw=2*(lnd(ie,i)-1)+j
  276.          de(ih)=p(iw)
  277.         end do
  278.    end do

  279.    do i=1,3
  280.     st(i)=0.0
  281.     do j=1,6
  282.          st(i)=st(i)+s(i,j)*de(j)
  283.         end do
  284.    end do

  285.    stx=st(1)
  286.    sty=st(2)
  287.    txy=st(3)
  288.    ast=(stx+sty)/2
  289.    rst=sqrt(0.25*(stx-sty)**2+txy*txy)
  290.    stma=ast+rst
  291.    stmi=ast-rst

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

  294.    write(8,60) ie,stx,sty,txy,stma,stmi,ceta
  295. 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)

  296. end do

  297. return
  298. end





密码修改失败请联系微信:mofangbao

新浪微博达人勋

0
早起挑战累计收入
发表于 2012-4-24 08:17:29 | 显示全部楼层
那就看看是哪个数组越界了吧 把前后的变量都输出来看看  没做过有限元 不清楚
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 成长值: 0
发表于 2012-4-24 08:39:11 | 显示全部楼层
我表示压力比较大,朋友,你是第一次做程序?从书上抄了360行的“小程序”

如果真的如楼主所言是数组越界了,那么找到错误行看看是哪一个数组错了,在最前面定义的地方改一下就可以了。(ps:我得说你一下,你都找到出错行了,怎么不说一下是哪一行呢?)360行的程序,没有人会帮你看的

另外,有限元是数值里面的概念,建议先阅读文献,再从小程序下手
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2012-4-24 08:43:34 | 显示全部楼层
这个小程序有点大哇

看是哪里出了问题,标记出来看一下哇
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表