gpt4 book ai didi

arrays - 大数组问题

转载 作者:行者123 更新时间:2023-12-01 01:29:05 25 4
gpt4 key购买 nike

到目前为止,我有一个代码运行良好,有 300 万个原子大小的静态数组。
出于实际原因,我现在必须使用 1000 万个原子大小的数组。起初,我的编译器不允许我这样做,但我设法通过以下标志找到了解决方法 ifort -mcmodel medium -shared-intel -traceback kubo.f .它运行,但发生了一些非常奇怪的事情。我的矩阵包含 11 609 198 个元素。

我检查我的坐标值如下(4 669 671的值是第一次出错):

print*, x(4669671),y(4669671),zcoord(4669671)



后跟几行,其中 x、y 和 zcoord 的值未更改或任何内容。然后,我在这 3 个向量上输入一个循环,其中 x、y 和 zcoord 的值将被使用但不会改变。我再次打印这 3 个值,突然间,这 3 个值发生了变化?!

对于大型阵列,我缺少什么吗?

编辑:这里是完整的代码(因为我不知道什么是竞争条件,我不知道是否允许删除某些部分以使其更具可读性):

  open(1,FILE='fort.10')
read(1,*)NAT1
write(*,*)'Lecture de Nat1=',NAT1
read(1,*)
do i=1,nsites
read(1,*)parcon(i),x(i),y(i),zcoord(i)
enddo
print*, x(4663659),y(4663659),zcoord(4663659)
print*, x(4663663),y(4663663),zcoord(4663663)
!HERE
print*, x(4669671),y(4669671),zcoord(4669671)
print*, x(4673254),y(4673254),zcoord(4673254)
iflag=0
iflagg=0
impurityCounter=0
C4Counter=0
do i=1,nsites
nvo=0
if(i.le.(nsites-93998)) then
jj=i-10000
jjj=i+10000
do j=jj,jjj,1
if((j.gt.0).and.(j.le.(nsites-93998))) then
dist=dsqrt((x(j)-x(i))**2+(y(j)-y(i))**2
. +(zcoord(j)-zcoord(i))**2)
if((dist.lt.(1.11*aCC))
. .and.(j.ne.i).and.(dist.gt.0.1)) then
nvo=nvo+1
v(i,nvo)=j
if(i.eq.4663660) then
!THERE
print*, dist,j,x(j),y(j),zcoord(j)
endif
endif
endif
enddo
jjjj=nsites-93998+1
do j=jjjj,nsites,1
dist=dsqrt((x(j)-x(i))**2+(y(j)-y(i))**2
. +(zcoord(j)-zcoord(i))**2)
if((dist.lt.(1.11*aCC)).and.(j.ne.i).and.(dist.gt.0.1)) then
nvo=nvo+1
v(i,nvo)=j
endif
enddo
else
do j=1,nsites
dist=dsqrt((x(j)-x(i))**2+(y(j)-y(i))**2
. +(zcoord(j)-zcoord(i))**2)
if((dist.lt.(1.11*aCC)).and.(j.ne.i).and.(dist.gt.0.1)) then
nvo=nvo+1
v(i,nvo)=j
endif
enddo
endif
if ((nvo.eq.2).AND.(parcon(i).eq.'C')) then
iflag=iflag+1
vpb(iflag)=i
endif
if((nvo.eq.1).AND.(parcon(i).eq.'C')) then
iflagg=iflagg+1
vpbb(iflagg)=i
endif
!count the number of impurities
if((nvo.eq.2).AND.(parcon(i).eq.'O1')) then
impurityCounter=impurityCounter+1
impurityVector(impurityCounter)=i
endif
if((nvo.eq.2).AND.(parcon(i).eq.'O2')) then
impurityCounter=impurityCounter+1
impurityVector(impurityCounter)=i
endif
!If nvo equals 4, there is a BAD counting!
if(nvo.eq.4) then
print*, v(i,1)
print*, v(i,2)
print*, v(i,3)
print*, v(i,4)
print*, x(i), y(i)
endif
if(nvo.eq.5) then
C4Counter=C4Counter+1
C4Vector(C4Counter)=i
endif
enddo


我添加了 !HERE 和 !THERE 以向您展示我打印元素 4669671 的 x、y 和 zcoord 的两个位置...

最佳答案

我不熟悉 ifort,但我认为它有一个检查数组边界的选项。打开它。
变量在没有实际赋值的情况下更改它们的值通常表明某些其他变量在其声明的边界之外被引用。

关于arrays - 大数组问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5935491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com