Fortran Coder

查看: 8463|回复: 1
打印 上一主题 下一主题

[输入输出] 数组越界,请大神赐我一招

[复制链接]

1

帖子

1

主题

0

精华

新人

F 币
17 元
贡献
5 点
跳转到指定楼层
楼主
发表于 2017-2-27 17:38:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[Fortran] 纯文本查看 复制代码
PROGRAM BOUSSINESQ
REAL,ALLOCATABLE,DIMENSION(:)::YITA1,YITA2,XU1,XU2,B1,B2,YITAF,XUF,YITAT,XUT,XUD,YITAD
!YITA为波高,XU为速度,B为方程组的向量,YITAF,XUF为上一步的初值
INTEGER::N1=100,K=1000
!定义变量部分
REAL::XL,DETX,DETT,XK,OMEGA,U0,AA,XD,CK,CC,T,XX,IMAX,TOL,DX2
!定义波长XL,观察点的距离间隔DETX和时间间隔DETT,波数XK,角速度OMEGA,初速度U0,振幅AA,水深XD,CK=DETT/DETX,
!CC为Sommerfled边界里的系数,T为周期,XX为观察点,IMAX为迭代最大次数,TOL为迭代判断精读

REAL::PI,GRA
PARAMETER(PI=3.1415926,GRA=9.81)
!GRA为重力加速度
PARAMETER(T=8.0,XD=1.5,AA=0.1,TOL=1E-5,IMAX=200)
DETT=T/20.0
CC=(GRA*XD)**(1.0/2.0)
OMEGA=T/(2.0*PI)
XK=((OMGRA*OMGRA)/(GRA*XD))**(1.0/2.0)
XL=2.0*PI/XK
DETX=XL/10.0
XX=100

!边界条件的设定
!时间为0时的初始条件
DO I=1,N1
XU1(I)=0.0
YITA1(I)=0.0
ENDDO

!差分计算部分

DO J=1,K

  !空间为0的边界条件
  XU1(1)=(PI*2.0*AA*COSH(XK*XD))*COS(OMEGA*(J-1)*DETT)/(T*SINH(XK*XD))
  YITA1(1)=AA*COS(OMEGA*(J-1)*DETT)

   DO I=1,N1
    XUF(I)=XU1(I)
    YITAF(I)=YITA1(I)
  ENDDO

!预测步
!切记!!数字写成小数形式,不要写成整数(如1要写成1.0)

  DO I=1,N1
    SELECT CASE(I)
     CASE(1)
      YITA2(I)=(PI*2.0*AA*COSH(XK*XD))*COS(OMEGA*(J-(1.0))*DETT)/(T*SINH(XK*XD))
      XU2(I)=AA*COS(OMEGA*(J-(1.0))*DETT)
      CASE(2:99)
      YITA2(I)=YITA1(I)-CK*XU1(I)*(YITA1(I+1)-YITA1(I))-CK*(XD+YITA1(I))*(XU1(I+1)-XU1(I))
      XU2(I)=XU1(I)-CK*XU1(I)*(XU1(I+1)-XU1(I))-CK*GRA*(YITA1(I+1)-YITA1(I))
      CASE(100)
      YITA2(I)=YITA1(I)-CK*CC*(YITA1(I)-YITA1(I-1))
      XU2(I)=XU1(I)-CK*CC*(XU1(I)-XU1(I-1))
    END SELECT
  ENDDO

   DO I=1,N1
      XUD(I)=XU1(I)
      YITAD(I)=YITA1(I)
    ENDDO

     DO I=1,N1
      SELECT CASE(I)
        CASE(1)
        B1(I)=YITAF(I)-CK*XUF(I)*(YITAF(I+1)-YITAF(I))-CK*(XD+YITAF(I))*(XUF(I+1)-XUF(I))-CK*(XD+YITA1(I))*(XU1(I+1)-XU1(I))
        CASE(2:99)
        B1(I)=YITAF(I)-CK*XUF(I)*(YITAF(I+1)-YITAF(I))-CK*(XD+YITAF(I))*(XUF(I+1)-XUF(I))-CK*(XD+YITA1(I))*(XU1(I+1)-XU1(I))
        CASE(100)
        B1(I)=YITAF(I)-CK*CC*(YITAF(I)-YITAF(I-1))
      END SELECT
    ENDDO

     DO I=1,N1
      YITA1(I)=B1(I)
    ENDDO

     DO I=1,N1
      SELECT CASE(I)
        CASE(1)
        B2(I)=XUF(I)-CK*XUF(I)*(XUF(I+1)-XUF(I))-CK*GRA*(YITAF(I+1)-YITAF(I))-CK*GRA*(YITA1(I+1)-YITA1(I))
        CASE(2:99)
        B2(I)=XUF(I)-CK*XUF(I)*(XUF(I+1)-XUF(I))-CK*GRA*(YITAF(I+1)-YITAF(I))-CK*GRA*(YITA1(I+1)-YITA1(I))
        CASE(100)
        B2(I)=XUF(I)-CK*CC*(XUF(I)-XUF(I-1))
      END SELECT
    ENDDO   

     DO I=1,N1
      XU1(I)=B2(I)
    ENDDO

    DX2=0.0
    DO I=1,N1
      IF(ABS(XU1(I)-XUD(I)).GT.DX2)THEN
        DX2=ABS(XU1(I)-XUD(I))
      ENDIF
      IF(ABS(YITA1(I)-YITAD(I)).GT.DX2)THEN
        DX2=ABS(YITA1(I)-YITAD(I))
      ENDIF
    ENDDO

     IF(DX2.LT.TOL)EXIT


  YITAT(J)=YITA1(XX)
  XUT(J)=XU1(XX)
  ENDDO

!结果输出部分
DO I=1,N1
WRITE(*,*)YITA1(I)
ENDDO

DO I=1,N1
WRITE(*,*)XU1(I)
ENDDO

END PROGRAM BOUSSINESQ

调试以后发现的错误是数组越界,但不知道怎么改,求大神指教一下,不胜感激

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2017-2-27 18:38:37 | 只看该作者
1. OMGRA 没有值。2. 所有可分配数组都没有分配。
3. 没有 Implicit None

这代码错误太多了。新手建议先从简单的代码写起。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-25 21:45

Powered by Tencent X3.4

© 2013-2024 Tencent

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