Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 通过正确定义索引列表提高代码效率_Fortran - Fatal编程技术网

Fortran 通过正确定义索引列表提高代码效率

Fortran 通过正确定义索引列表提高代码效率,fortran,Fortran,我问这个问题是为了确定如何使我的代码更有效率。该解决方案极大地帮助了我,如下所示 function grad(psi) implicit none integer, parameter :: nx = 24, ny = 24, nxx = nx / 2, nyy = ny / 2 real, parameter :: pi = 4 * atan(1.0), f0 = pi ** 2 * 1.3 complex, dimension(3,3,-nx:nx,-ny:ny) :: ps

我问这个问题是为了确定如何使我的代码更有效率。该解决方案极大地帮助了我,如下所示

function grad(psi)
  implicit none
  integer, parameter :: nx = 24, ny = 24, nxx = nx / 2, nyy = ny / 2
  real, parameter :: pi = 4 * atan(1.0), f0 = pi ** 2 * 1.3
  complex, dimension(3,3,-nx:nx,-ny:ny) :: psi, grad

  grad(:,:,-nx+1:nx-1,-ny+1:ny-1) = psi(:,:,-nx+2:nx,-ny+1:ny-1)
  grad(:,:,0,0) = psi(:,:,1,0)
  grad(:,:,[-nxx,nxx],[-nyy,nyy,ny]) = psi(:,:,[-nxx+1,nxx+1],[-nyy,nyy,ny]) - f0 * psi(:,:,[-nxx,nxx],[-nyy,nyy,ny])

end
然而,我现在需要进一步优化我的代码

在上面的示例中,有一部分由

grad(:,:,[-nxx,nxx],[-nyy,nyy,ny]) = psi(:,:,[-nxx+1,nxx+1],[-nyy,nyy,ny]) - ...
通过考虑列表的所有组合,它有效地实现了我所需要的功能
-nxx,-nyy,-nxx,nyy,

然而,我需要的索引列表远远大于
[-nxx,nxx],-nyy,nyy]
。我真的需要像这样的东西,
[-nxx,nxx,-nxx1,nxx1,-nxx2,nxx2,-nxx3,nxx3],-nyy,nyy,-nyy1,nyy1,-nyyy2,nyyy2,-nyyy3,ny3]
等等,其中
nxx=nx=nx/2,nxx1=nx/4,nxx2=nx=nx/8,nx3=nx/16
等等

有什么方法可以有效地做到这一点吗?例如,我可以只定义一个变量,例如:

integer : Listx, Listy

   Listx = [-nxx,nxx,-nxx1,nxx1,-nxx2,nxx2,-nxx3,nxx3]
   Listy = [-nyy,nyy,-nyy1,nyy1,-nyy2,nyy2,-nyy3,nyy3]
然后吃点类似的东西

grad(:,:,Listx,Listy) = psi(:,:,Listx+1,Listy) - ...
我确实尝试过这样做,但将Listx、Listy定义为整数似乎会带来问题。我做了如下尝试:

Integer :: Listx, Listy

   Listx = [-nxx,nxx,-nxx1,nxx1,-nxx2,nxx2,-nxx3,nxx3]
   Listy = [-nyy,nyy,-nyy1,nyy1,-nyy2,nyy2,-nyy3,nyy3]
但编译Fortran时告诉我,“不兼容的等级为0,在赋值中为…”


我如何才能正确定义这一点?谢谢

如评论中所述,您缺少数组声明中的
维度
属性:

Integer :: Listx(8), Listy(8)

这应该能解决你的问题。任何产生秩1数组的表达式都可以作为向量下标索引器。

您得到了什么错误?你能分享一下你是如何准确地声明这些变量的吗?如果Listx和Listy将成为数组,请不要忘记声明一个维度属性,如
integer::Listx(8)
@RodrigoRodrigues我得到的错误是“不兼容的秩0和赋值在…”,我不知道如何按照您刚才的建议将它们定义为数组……我使用了
integer::Listx
而不是
integer::Listx(8)
。谢谢。所以我只需要添加维度属性。