使用函数" mod"在说明中"如果"和"选择案例"

时间:2016-07-18 15:31:32

标签: fortran

我在Fortran中写了一些代码。但是代码并没有像我想的那样表现,我可以找出问题所在。 我不会在这里放置代码,因为它有1200行,但这里有它的理念:

  • 我创建了一个由四维表格表示的3D网格(我在网格的每个点上存储了2个元素的向量,对应于站点的性质以及谁占用了站点)。这个网格代表我们所谓的晶体(可以定期找到原子)
  • 构建此网格时,代码会扫描此网格的每个点,并查看相邻网站以计算不同类型的原子或空位。

对于最后一点,我使用三重叠环,允许探索不同的网站,并使用 if select case 检查不同的相邻网站说明。由于我希望我的网格是周期性的,我在 if select case 的参数中有函数mod。 有时问题是,它在邻近站点中发现了与该特定邻近站点中的实际元素不同的元素。举个例子:

  

在两个输出文件中,所有坐标都是用   元素类型我有网格(0,0,1)= - 1(对应一个空站点)。   但是,虽然代码正在寻找grdi(0,0,1)的邻近站点,但它告诉我实际上有一个元素在网格(0,0,1)中被索引为2。

我仔细查看三重实现循环中的块,但看起来很好 我想知道是否有人已经遇到过这种问题,或者知道在if或select case参数中使用mod是否存在问题?

如果你们中的一些人想要近距离接触,我可以向你发送代码,并附上一些解释。

2 个答案:

答案 0 :(得分:0)

数组的大小通常为: REAL(KIND = 8),DIMENSION(0:N):: A. 要么 REAL(KIND = 8),DIMENSION(N):: A

在后面的例子中,假设它们从1开始。 你也可以去(-N:N)或(10:191)

如果您使用编译器开关'-check bounds'或; -check all',您将看到是否要在数组/等之外。这不是一个不常见的事情,但是当维度在外面时,编译器将很快中止。 一旦它工作,然后删除-check bounds和/或-check all。

答案 1 :(得分:0)

感谢您对francescalus和haraldkl的考虑。 它与阵列Holmz的维度无关,但是谢谢你尝试帮助

我似乎终于成功解决了这个问题。如果我完全理解为什么它不能正常工作,我会发布一个完整的答案 显然,它与调用过程中的不同参数顺序和子程序标题 +子程序中带有 intent(inout)的声明的组合有关。 这就像意图(inout)掩盖了问题。但这对我来说有点奇怪。

关于代码的一些解释:
正如我所说,代码创建了一个3D网格,其中3D网格的每个交叉点对应一个晶体学站点。我将每个站点的值-1归因于空站点,1表示晶体原子(如果有空位而不是晶体原子则为0),2,3,4,5表示不同的杂质。实际上,空位和接收晶体原子的位置不是同一类型,这就是区分空位和空位的原因。杂质只能占据空位,禁止占据水晶位置。

代码的目的是探索系统的配置空间,换句话说,我们可以通过不同的元素获得所有可能的分布。为此,我从初始配置开始,我随机选择站点(尊重占用规则),我实际上切换它们。我计算旧的新配置的能量,如果新的能量较低我保留它,如果没有,我保留旧的。能量计算是基于每个空位和杂质的环境知识,所以我们需要了解他们的邻居。并且我一次又一次地重复所有过程以收敛到最稳定(最可能)的配置。

下一步是包括温度效果,并添加第二类空站点。 祝你有愉快的一天,

微米。