在Fortran模块中重塑变量:在子例程的参数和;使用「;陈述
我有一个模块,其中我将2D数组(因为我的计算域是2D网格)存储为一维向量,因为代码中99%的其他子例程使用一维向量。但是,我有一个子例程MYsubr,它可以处理二维数组,因为我不知道如何在“use module”中直接将向量重塑为矩阵,所以我只是将其作为子例程的参数传递,然后在子例程中重塑它。有更好的方法吗? 我的模块是:在Fortran模块中重塑变量:在子例程的参数和;使用「;陈述,fortran,Fortran,我有一个模块,其中我将2D数组(因为我的计算域是2D网格)存储为一维向量,因为代码中99%的其他子例程使用一维向量。但是,我有一个子例程MYsubr,它可以处理二维数组,因为我不知道如何在“use module”中直接将向量重塑为矩阵,所以我只是将其作为子例程的参数传递,然后在子例程中重塑它。有更好的方法吗? 我的模块是: module myMODULE integer,allocatable :: var(:) ..... ..... (thousands of other
module myMODULE
integer,allocatable :: var(:)
.....
..... (thousands of other variables needed in mysubr)
end
主程序以“var”作为参数调用子例程,但模块myMODULE也会调用var:
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
这样我就避免了变量的别名 首先,我想说,如果你真的在一个子程序中使用了来自一个模块的数千个变量,那么在你的软件设计阶段就出现了可怕的错误 除此之外,如果
使用d,则在模块中而不是在子例程中使用模块
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量
当使用子例程中的模块时,伪参数和使用关联实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢
在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误
除此之外,如果使用d,则在模块中而不是在子例程中使用模块
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量
当使用子例程中的模块时,伪参数和使用关联实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢
在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误
除此之外,如果使用d,则在模块中而不是在子例程中使用模块
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量
当使用子例程中的模块时,伪参数和使用关联实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢
在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,而且还需要使用不同的名称。首先,我想说,如果你真的在一个子例程中使用了来自一个模块的数千个变量,那么在软件设计阶段就会出现可怕的错误
除此之外,如果使用d,则在模块中而不是在子例程中使用模块
module mod2
use myMODULE
contains
subroutine MYsub(var,Nmax,Mmax)
integer :: var(Nmax,Mmax)
现在会出现问题,因为伪参数会隐藏与主机关联的模块变量
当使用子例程中的模块时,伪参数和使用关联实体的名称不能相同。您的重命名
use myMODULE, unused => var
符合标准,这样做没有风险。但是为什么不直接用不同的名称命名伪参数呢
在这种情况下,我不建议重新映射指针,尽管我在这里提出了它,但这是一个不必要的复杂问题,还需要使用不同的名称。在您的示例中,MYsub的接口不一致。在子例程中根本不使用模块,只需将数组作为参数传递即可。由于序列关联规则,您可以使用1d数组,并在子例程中将其视为2d数组。我知道,但很明显,我的模块中有一堆其他变量,我需要在MYsubr中使用这些变量,因此我需要使用该模块。我补充说。。。。。。(其他变量)正在模块中。我修正了参数,很抱歉,这是一个最小的例子,我忘记了它们。然后使用only子句只使用你需要的。或者使用指针重新映射并避免伪参数。如果您不直接访问模块变量,则可以使用带有模块变量别名的伪参数,请确保使用不同的名称,而不是var
。非常感谢。无论如何,我需要数千个变量,并且用only子句列出它们是非常长的。所以我想我的想法是:“myMODULE,unused=>var”,对吗?而且据我所知,没有办法在模块中重塑变量。指针重新映射是否增加了开销?如果没有,你能举个例子吗?如果你愿意,我会接受你的回答。谢谢。此页面可能包含一些有用的信息(例如,数组指针的形状调整)。在您的示例中,MYsub的接口不一致。在子例程中根本不使用模块,只需将数组作为参数传递即可。由于序列关联规则,您可以使用1d数组,并在子例程中将其视为2d数组。我知道,但很明显,我的模块中有一堆其他变量,我需要在MYsubr中使用