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



我用Fortran编写了一些代码。但代码并没有像我想象的那样运行,我可以弄清楚问题出在哪里。我不会把代码放在这里,因为它有1200行,但这里的理念是:

  • 我创建了一个由四维表表示的3D网格(我在网格的每个点上存储了一个2个元素的向量,对应于场地的性质和占用场地的人)。这个网格代表了我们所说的晶体(原子可以周期性地被发现)
  • 当构建这个网格时,代码扫描这个网格的每个点,并查找相邻的位置来计算不同类型的原子或空位

对于最后一点,我使用了一个三叠瓦状循环,它允许探索不同的站点,并使用ifselect case指令检查不同的相邻站点。由于我希望我的网格是周期性的,所以在ifselect case的参数中有函数mod。有时问题是,它在相邻站点中发现了与该特定相邻站点中的实际元素不同的元素。例如:

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

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

如果你们中的一些人想仔细看看,我可以把代码发给你们,并附上一些解释。

数组的大小通常为:实数(种类=8),维度(0:N)::A或实数(种类=8),维数(N)::

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

如果使用编译器开关"-check-bounds"或-勾选所有'你会看到你是否要离开数组等。这种情况并不少见,但当维度在外部时,编译器会很快中止。一旦它工作,然后删除-check边界和/或-check all。

感谢您对franciscolus和haraldkl的考虑。它与阵列Holmz的尺寸无关,但感谢您尝试帮助

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

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

代码的目的是探索系统的配置空间,换句话说,我们可以用不同的元素获得所有可能的分布。为了做到这一点,我从最初的配置开始,随机选择网站(遵守职业规则),然后虚拟地切换它们。我计算新旧配置的能量,如果新配置的能量较低,我保留它,如果没有,我保留旧配置。能量的演算是基于对每个空位和杂质的环境的了解,所以我们需要了解它们的邻居。我一次又一次地重复所有的过程,以收敛到最稳定(因此是最可能的)配置。

下一步是包括温度效应,并添加第二种类型的空位。祝你今天愉快,

M。

最新更新