【发布时间】:2018-03-29 14:08:17
【问题描述】:
所以我遇到了数组执行循环的问题。
我有一个包含 976 个原子 X、Y、Z 坐标数组的列表。在另一个文本文件中,我有一个数组,每个原子有 976 个电荷。此外,我有 Xo、Yo、Zo 的数组,有 2,971 个点(13x13,x13)。我需要计算的是原子的实际 X、Y、Z 坐标与 2,197 个网格点之间的距离。最初我用 33 个原子做的计算是这样的。
do i=1,2197
D1(i) = (((X(1)-Xi(i))**2 + (Y(1)-Yi(i))**2 + (Z(1)-Zi(i))**2)**0.5)*10E-10
D2(i) = (((X(2)-Xi(i))**2 + (Y(2)-Yi(i))**2 + (Z(2)-Zi(i))**2)**0.5)*10E-10
D3(i) = (((X(3)-Xi(i))**2 + (Y(3)-Yi(i))**2 + (Z(3) Zi(i))**2)**0.5)*10E-10
D4(i) = (((X(4)-Xi(i))**2 + (Y(4)-Yi(i))**2 + (Z(4)-
Zi(i))**2)**0.5)*10E-10
....等等等等
但由于现在我有 976 个原子,手动执行此操作将是一场噩梦。 我的问题是:由于我需要为每个包含 2197 个点的原子创建一个数组,有没有一种方法可以生成它而无需手动写出来?
我尝试过这样的事情:
do i=1,2197
Do n=1,976
DO j=1,976
D(j,i) = (((X(n)-Xi(i))**2 + (Y(n)-Yi(i))**2 + (Z(n)-
Zi(i))**2)**0.5)*10E-10
End do
End Do
Enddo
我的逻辑是基本上计算每个原子的 2,197 个距离点,以便它们像这样存储D(j,i) 其中 j 表示它来自数字 1-976 的哪个原子,变量 i 将是 2197 个不同的点由公式计算。这个想法是拥有 967 个原子,其中每个原子有 2197 个点,我可以访问这些点来稍后计算其他事物。然后将电荷除以距离以找到电压电位,所以基本上我需要能够调用距离,如D(atom#,charge.)
我的逻辑是否正确,或者我应该使用其他数组组合以不同的方式解决这个问题?
【问题讨论】:
-
没有关注这一切,但这里的
n循环没有意义,因为d(j,i)将始终只有n=976传递的值。并且对于所有j都是相同的,因为j不在表达式中。 -
我明白你在说什么。例如,告诉程序将 D(1,2197) 的所有 2,197 个点相加,然后将数组的下一个 2,197 点加起来为 D(2,2197),有什么方法?基本上是一个循环,它将创建一个不同的数组 D(1+n,i),它将基本上将每个 do 循环存储到最左边下标的一个新数组中?
-
你的主要问题是你没有清楚地描述你想要做什么。 “加起来”是什么意思?您似乎没有尝试在循环中添加任何内容。如果
d(j,i)是jth粒子和ith网格点之间的距离,n是什么? -
我想我应该事先说明我的主要目标。本质上,我有 976 个原子,每个原子都有 XYZ 坐标和电荷。我需要计算实际原子 XYZ 坐标和网格点之间的距离(在这种情况下,我制作了一个 13x13x13 网格,因此有 2197 个唯一点)。对于几个原子,实际计算很简单,因为我只是创建了 D1(2197),而 D1 指的是 ATOM1 的距离公式生成的 2197 个唯一距离。对于原子 2,我会做 D2(2197),而 D3 会有 2197 个点等。目的是构建一个自动编号 D1-D976 的循环。
-
- 自动无需我说明 D1(i) = 距离公式,D2(i)= 距离 ... D976(i) = 距离公式。我本可以手动完成并为每个原子分配其数组,但我想知道是否有一种方法可以通过 do 循环自动完成,结果证明确实存在。现在我遇到的唯一问题是让程序从文本文件中正确读取数据,但我想我很快就会弄清楚。