0

尝试从 xyz 数据文件创建数组。数据文件的排列方式使每个原子的 x,y,z 位于新行上,我希望数组反映这一点。然后使用此数组查找列表中每个原子与所有其他原子的距离。

为此,已复制数组,以便 atom1 和 atom2 应与输入文件相同。

长度只是列表中的原子数。写语句: WRITE(20,'(3F12.9)') atom1 实际上给出了想要的矩阵,但是当我尝试找到单个元素时,它们都错了!

任何帮助将非常感激!多谢你们。

DOUBLE PRECISION, DIMENSION(:,:), ALLOCATABLE ::atom1,atom2'
ALLOCATE(atom1(length,3),atom2(length,3))       
READ(10,*)  ((atom1(i,j), i=1,length), j=1,3)       
atom2=atom1                 
distn=0
distc=0                         

DO n=1,length
        x1=atom1(n,1)
        y1=atom1(n,2)               !1st atom
        z1=atom1(n,3)
        DO m=1,length
          x2=atom2(m,1)
          y2=atom2(m,2)         !2nd atom
          z2=atom2(m,3)`
4

1 回答 1

0

您的 READ 语句从许多记录中读取所有原子的所有 x 坐标,然后是所有 y 坐标,然后是所有 z 坐标。这与您对输入文件的描述不一致。您在 READ 语句中以错误的方式嵌套了 io-implied-do's - 它应该是((atom1(i,j),j=1,3),i=1,length).

同样,根据评论,您的诊断写入误导您 - 您输出所有 x 坐标,然后输出所有 y 坐标等。整个数组引用的数组元素顺序最快地改变第一个(最左边)维度(俗称列主命令)。

(存在与列表定向格式相关的各种陷阱,这意味着我不建议将其用于生产代码(或者可能用于专门编写的输入,了解并防御这些陷阱)。其中一个陷阱是列表下的 READ 定向格式化将拉入满足输入列表所需的尽可能多的记录。如果您使用指定每条记录的字段数的显式格式,您可能会更早发现问题。)

于 2013-01-18T04:02:43.017 回答