0

我试图通过 fortran 中的一个小算法(不幸的是,我不是 fortran 程序员)但我需要了解它在做什么:在这里,

  omega = 0.d0
  s = 1.d0
  i = 1
  j = 2
  k = 3
101 do iperm = 1, 3
     omega = omega + s * a1 (i) * a2 (j) * a3 (k)
     l = i
     i = j
     j = k
     k = l
  enddo
  i = 2
  j = 1
  k = 3
  s = - s

  if (s.lt.0.d0) goto 101

  omega = abs (omega) * alat**3

a1,a2,a3是向量(每个三个元素,实值,表示 3d 空间中的向量) s是单位整数(可以是 1 或 -1 交替)并且i,j,k是整数,而omega(我需要了解它是如何到达的)是浮点数值,所以也是alat。现在上面发生了什么?尤其是iperm =1,3 部分,这是一个正在创建的向量吗?起初我认为 iperm 可能是一些花哨的函数/例程或迭代器,但经过一番搜索后,我认为事实并非如此,iprm 的目的是什么?" " 和 " "iperm 之间是否有一些循环?doenddo

4

1 回答 1

3

您所拥有的只是一系列任务,其中包含一个有趣的循环。我想你理解这种说法,例如

lhs = rhs

评估rhs结果并将其分配给变量lhs

线

101 do iperm = 1, 3

开始一个do循环。是101一个声明标签,稍后使用。该循环包含从该行到该行的所有语句enddo。循环将执行 3 次(对于从 开始到1结束的序列中的每个整数执行一次3)。循环控制变量iperm依次分配这些值。循环有点不寻常,因为循环变量没有在循环内部使用。该声明

omega = omega + s * a1 (i) * a2 (j) * a3 (k)

更新 的值omega。术语a1(i)(原件中的空格无关紧要)的意思是the i-th element of array a1等等

当线

if (s.lt.0.d0) goto 101

如果s小于则执行0控制返回到标记为 的行101

最后,该项alat**3计算 的立方alat

所以现在拿一张纸,弄清楚omega得到了什么价值。

于 2013-08-15T23:29:03.150 回答