在 Fortran 模块中重塑变量:将变量同时作为子例程的参数和 "use" 语句中的变量是否安全?
Reshaping variable in Fortran module: is it safe to have a variable both as argument of the subroutine and in the "use" statement?
我有一个模块,我在其中将二维数组(因为我的计算域是二维网格)存储为一维向量,因为我的代码中 99% 的其他子例程都使用一维向量。但是,我有一个与 2D arrays 一起使用的子程序 MYsubr ,并且由于我不知道有一种方法可以直接在 "use module" 内部将向量重塑为矩阵,所以我只是将它作为子例程的参数传递,然后重塑它在子程序中。有一个更好的方法吗?
我的模块是:
module myMODULE
integer,allocatable :: var(:)
.....
..... (thousands of other variables needed in mysubr)
end
并且主程序以"var"作为参数调用一个子例程,而且 var 也被模块 myMODULE 调用:
program main
implicit none
integer :: Nmax
integer :: Mmax
Nmax = 100
Mmax = 200
.....
allocate(var(Nmax*Mmax))
.....
.....
call MYsub(var,Nmax,Mmax)
end
subroutine MYsub(var,Nmax,Mmax)
use myMODULE
integer :: var(Nmax,Mmax)
.....
....,
end
这样我就可以重塑var。这有什么风险?它完美地编译。只要我不更改 MYsub 中 var 的值就可以了,如果我更改它会怎样?我应该在 MYsub 中使用这个公式更安全吗:
use myMODULE, unused => var
所以通过这种方式我避免了变量的别名。
首先我要说的是,如果您真的在单个子例程中使用模块中的数千个变量,那么在您的软件设计阶段就会出现可怕错误。
除此之外,如果您 use
在模块中而不是在子例程中
d 模块
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会有问题,因为虚拟参数会隐藏主机关联的模块变量。
当您 use
子例程中的模块时,伪参数和使用相关实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是,为什么不以不同的方式命名虚拟参数呢?
在这种情况下,我不推荐指针重映射,虽然我在这里提出了它,但这是不必要的复杂化,并且还需要使用不同的名称。
我有一个模块,我在其中将二维数组(因为我的计算域是二维网格)存储为一维向量,因为我的代码中 99% 的其他子例程都使用一维向量。但是,我有一个与 2D arrays 一起使用的子程序 MYsubr ,并且由于我不知道有一种方法可以直接在 "use module" 内部将向量重塑为矩阵,所以我只是将它作为子例程的参数传递,然后重塑它在子程序中。有一个更好的方法吗? 我的模块是:
module myMODULE
integer,allocatable :: var(:)
.....
..... (thousands of other variables needed in mysubr)
end
并且主程序以"var"作为参数调用一个子例程,而且 var 也被模块 myMODULE 调用:
program main
implicit none
integer :: Nmax
integer :: Mmax
Nmax = 100
Mmax = 200
.....
allocate(var(Nmax*Mmax))
.....
.....
call MYsub(var,Nmax,Mmax)
end
subroutine MYsub(var,Nmax,Mmax)
use myMODULE
integer :: var(Nmax,Mmax)
.....
....,
end
这样我就可以重塑var。这有什么风险?它完美地编译。只要我不更改 MYsub 中 var 的值就可以了,如果我更改它会怎样?我应该在 MYsub 中使用这个公式更安全吗:
use myMODULE, unused => var
所以通过这种方式我避免了变量的别名。
首先我要说的是,如果您真的在单个子例程中使用模块中的数千个变量,那么在您的软件设计阶段就会出现可怕错误。
除此之外,如果您 use
在模块中而不是在子例程中
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会有问题,因为虚拟参数会隐藏主机关联的模块变量。
当您 use
子例程中的模块时,伪参数和使用相关实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是,为什么不以不同的方式命名虚拟参数呢?
在这种情况下,我不推荐指针重映射,虽然我在这里提出了它,但这是不必要的复杂化,并且还需要使用不同的名称。