Arrays 数组是否可能在没有任何原因的情况下更改其元素?-Fortran 77
我对fortran很陌生,所以这可能是一个愚蠢的问题 我对数组有一个问题,它似乎无缘无故地改变了它的元素。我刚刚绘制了阵列,您可以看到它不应该改变,但显然它确实改变了: 代码很长,我只粘贴了关于数组的部分。基本上,我从主代码中调用一个soubrutine,它对元素“kkk”进行一些计算,kkk是一个颗粒。如果颗粒的轴低于一定数量,则颗粒将设置为死,并存储在名为DEADGR的数组中,该数组是更改元素的数组Arrays 数组是否可能在没有任何原因的情况下更改其元素?-Fortran 77,arrays,fortran,fortran77,Arrays,Fortran,Fortran77,我对fortran很陌生,所以这可能是一个愚蠢的问题 我对数组有一个问题,它似乎无缘无故地改变了它的元素。我刚刚绘制了阵列,您可以看到它不应该改变,但显然它确实改变了: 代码很长,我只粘贴了关于数组的部分。基本上,我从主代码中调用一个soubrutine,它对元素“kkk”进行一些计算,kkk是一个颗粒。如果颗粒的轴低于一定数量,则颗粒将设置为死,并存储在名为DEADGR的数组中,该数组是更改元素的数组 c TOTAL COUNTER OF DEAD GRAINS N
c TOTAL COUNTER OF DEAD GRAINS
NDEADGRTOTAL=0
C SET TO 0 THE COUNTER OF DEAD GRAINS IN STEP
NDEADGR=0
NDEADGRTOTALOLD=NDEADGRTOTAL
DO NN=1,NLIVEGR
KKK=LIVEGR(NN)
CALL GROWTH(KKK,IDEAD)
C IF THE GRAIN HAS TO BE ELIMINATED STORE IN ARRAY DEADGRAINS
IF (IDEAD.EQ.1) THEN
NDEADGR=NDEADGR+1 !DEAD GRAINS IS STEP
NDEADGRTOTAL=NDEADGRTOTAL+1 !TOTAL DEAD GRAINS
DEADGR(NDEADGRTOTAL)=KKK !STORE THE ID OF THE DEAD GRAIN
END IF
END DO
这是子程序:
SUBROUTINE GROWTH(KKK,IDEAD)
INCLUDE 'vpsc7.dim'
REAL RO, GRV, DELTAX, NEWVOL, DUMMYONE, OLDVOL, toll
integer idead
toll=1e-5
C GET VARIABLES USED IN THE ROUTINE
RO=DSLDNSTY(KKK)
OLDVOL=VOL(KKK)
IDEAD=0
C CALCULATE GRAIN BOUNDARY VELOCITY
GRV=MOB*0.5*MU*BURG*BURG*(AVGDSLDNSTY-RO)
DELTAX=2*GRV*TINCR !VARIATION IN LENGHT OF AXES
C GET ACTUAL AXES LENGHT OF GRAIN KKK
AX1GR=AXISGR(0,1,KKK)
AX2GR=AXISGR(0,2,KKK)
AX3GR=AXISGR(0,3,KKK)
C UPDATE AXES
AX1GR=AX1GR+DELTAX
AX2GR=AX2GR+DELTAX
AX3GR=AX3GR+DELTAX
C IF ONE OF THE AXIS IS NEGATIVE THE GRAIN IS SET TO DEAD
if ((AX1GR.LE.toll).OR.(AX2GR.LE.toll).OR.(AX3GR.LE.toll)) then
IDEAD=1
RETURN
end if
C CALCULATE NEW VOLUME
NEWVOL=(4./3.)*PI*AX1GR*AX2GR*AX3GR
C CALCULATE THE GROWTH FACTOR
DUMMYONE=NEWVOL/OLDVOL
C ASSIGN VARIABLES BEFORE EXIT FROM SUBROUTINE
VOLGRGROWTH(KKK)=NEWVOL
GRGRWTHFAC(KKK)=DUMMYONE
RETURN
END
我使用的是Intel Parallel Studio XE 2015。不,阵列本身不会改变。很可能您访问了一些超出边界的数组。启用编译器(未命名)的所有运行时检查。例如
gfortran-g-fcheck=all-Wall-fbacktrace
。感谢您的回复。此运行时检查的作用是什么?编译器是Intel Parallel Studio XE2015,我刚刚编辑了这个问题。感谢英特尔在Linux中使用-g-check-warn-traceback
,如果您使用Windows,则使用同等版本。这将允许检查您是否正确访问阵列。如果这样做没有帮助,请准备一个小示例(通过删除代码中不相关的部分),该示例足够小,可以在这里完整地显示它,但仍然会显示问题。再见,非常感谢。实际上,根据您关于运行时检查的建议,我发现VisualStudio中的调试比命令中的调试好得多。在VisualStudio中,我可以看到所有阵列,而无需逐个打印。我相信我现在会找到我的错误所在,但如果我不知道,我会照你说的去做。非常感谢。如果您试图跟踪此特定错误,我建议您使用运行时边界检查,而不是完成“打印所有内容”调试。可能有太多的信息。不,数组本身不会改变。很可能您访问了一些超出边界的数组。启用编译器(未命名)的所有运行时检查。例如gfortran-g-fcheck=all-Wall-fbacktrace
。感谢您的回复。此运行时检查的作用是什么?编译器是Intel Parallel Studio XE2015,我刚刚编辑了这个问题。感谢英特尔在Linux中使用-g-check-warn-traceback
,如果您使用Windows,则使用同等版本。这将允许检查您是否正确访问阵列。如果这样做没有帮助,请准备一个小示例(通过删除代码中不相关的部分),该示例足够小,可以在这里完整地显示它,但仍然会显示问题。再见,非常感谢。实际上,根据您关于运行时检查的建议,我发现VisualStudio中的调试比命令中的调试好得多。在VisualStudio中,我可以看到所有阵列,而无需逐个打印。我相信我现在会找到我的错误所在,但如果我不知道,我会照你说的去做。非常感谢。如果您试图跟踪此特定错误,我建议您使用运行时边界检查,而不是完成“打印所有内容”调试。可能有太多的信息。