IF(INDEX.EQ.0) THEN !排水
DO J=1,M
DO I=1,N
IA(I,J)=1 !初始化,从全饱和开始
!IA为含水(=1)、充气(=-1)指示矩阵
IF(B(I,J).EQ.0.0) IA(I,J)=-1 !接触局域假设为充气
ENDDO
ENDDO
ELSE !吸水
DO J=1,M
DO I=1,N
IA(I,J)=-1 !初始化,从干燥开始
!IA为含水(=1)、充气(=-1)指示矩阵
QQ图片20200616204055.png (9.37 KB, 下载次数: 338)
fcode 发表于 2020-6-17 08:11
就是IA定义为 IA(M,N)
但是你引用了 IA(0,i) ,造成数组越界。
necrohan 发表于 2020-6-17 08:12
从你给的那段程序看,由于DO循环都是从1开始的,不会出现IA序号为0的情况,应该不是这段程序的问题。 ...
IF(HIN.LT.0.0) THEN !为非饱和状态
IF(INDEX.EQ.0) THEN !排水
DO I=1,N
IF(B(I,1).GT.BC) THEN
IA(I,1)=-1
ENDIF
IF(B(I,M).GT.BC) THEN
IA(I,M)=-1
ENDIF
ENDDO
DO J=2,M-1
DO I=1,N
IF(IA(I,J-1).EQ.-1.AND.B(I,J).GT.BC) THEN
IA(I,J)=-1
KI=I
10 KI=KI-1
IF(KI.GE.1) THEN
IF(B(KI,J).GT.BC) THEN
IA(KI,J)=-1
GOTO 10
ENDIF
ENDIF
KI=I
20 KI=KI+1
IF(KI.LE.N) THEN
IF(B(KI,J).GT.BC) THEN
IA(KI,J)=-1
GOTO 20
ENDIF
ENDIF
ENDIF
IF(IA(I,M-J+2).EQ.-1.AND.B(I,M-J+1).GT.BC) THEN
IA(I,M-J+1)=-1
KI=I
30 KI=KI-1
IF(KI.GE.1) THEN
IF(B(KI,M-J+1).GT.BC) THEN
IA(KI,M-J+1)=-1
GOTO 30
ENDIF
ENDIF
KI=I
40 KI=KI+1
IF(KI.LE.N) THEN
IF(B(KI,M-J+1).GT.BC) THEN
IA(KI,M-J+1)=-1
GOTO 40
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
ELSE !吸水
DO J=1,M
DO I=1,N
IF(B(I,J).EQ.0.0) B(I,J)=10.0
ENDDO
ENDDO
DO I=1,N
IF(B(I,1).LT.BC) THEN
IA(I,1)=1
ENDIF
IF(B(I,M).LT.BC) THEN
IA(I,M)=1
ENDIF
ENDDO
DO J=2,M-1
DO I=1,N
IF(IA(I,J-1).EQ.1.AND.B(I,J).LT.BC) THEN
IA(I,J)=1
KI=I
50 KI=KI-1
IF(KI.GE.1) THEN
IF(B(KI,J).LT.BC) THEN
IA(KI,J)=1
GOTO 50
ENDIF
ENDIF
KI=I
60 KI=KI+1
IF(KI.LE.N) THEN
IF(B(KI,J).LT.BC) THEN
IA(KI,J)=1
GOTO 60
ENDIF
ENDIF
ENDIF
IF(IA(I,M-J+2).EQ.1.AND.B(I,M-J+1).LT.BC) THEN
IA(I,M-J+1)=1
KI=I
70 KI=KI-1
IF(KI.GE.1) THEN
IF(B(KI,M-J+1).LT.BC) THEN
IA(KI,M-J+1)=1
GOTO 70
ENDIF
ENDIF
KI=I
80 KI=KI+1
IF(KI.LE.N) THEN
IF(B(KI,M-J+1).LT.BC) THEN
IA(KI,M-J+1)=1
GOTO 80
ENDIF
ENDIF
ENDIF
ENDDO
ENDDO
DO J=1,M
DO I=1,N
IF(B(I,J).EQ.10.0) THEN
B(I,J)=0.0
IA(I,J)=-1 !接触局域假设为充气
ENDIF
ENDDO
ENDDO
ENDIF
ENDIF
欢迎光临 Fortran Coder (http://bbs.fcode.cn/) | Powered by Discuz! X3.2 |