Fortran Coder

标题: 通过subtoutine的参数传递数组,但lbound返回的数组边界变化 [打印本页]

作者: 石子    时间: 2024-6-13 22:55
标题: 通过subtoutine的参数传递数组,但lbound返回的数组边界变化
本帖最后由 石子 于 2024-6-13 22:58 编辑

如题。MPI并行,但我感觉这个的问题可能和并行关系不大。我在程序里首先针对不同的rank设定了二维数组的上下界,并要求输出,然后让所有的rank均分配了数组e。
[Fortran] 纯文本查看 复制代码
call set_blockbc(rank,bl_xmin,bl_xmax,bl_ymin,bl_ymax)
    print*,rank,bl_xmin,bl_xmax,bl_ymin,bl_ymax
allocate(e(bl_xmin-1:bl_xmax+1,bl_ymin-1:bl_ymax+1),STAT=status0)

其中关于rank 1的输出结果如下:
2          30          31         230[/mw_shl_code]
设定值是我预设的,且其他rank均正常。
然后,我让rank 1调用了另一个子程序,形式为:call launch_gauss(rank,e,an,1)
subroutine里面我通过lbound和ubound检测rank 1所对应e的上下界,发现和在main程序里面设定的有所不同,输出如下:
1          31           1         202
subroutine 中对e的定义与相应的语句为:
[Fortran] 纯文本查看 复制代码
type(efield),dimension(:,:),intent(inout)::e
    xl = lbound(e, dim=1)
    xu = ubound(e, dim=1)
    yl = lbound(e, dim=2)
    yu = ubound(e, dim=2)
    print*,xl,xu,lbound(e,dim=2),ubound(e,dim=2)

在输出上下边界之前,我并未对e进行其他操作。按照预设,e的边界值应该是:1 31 30 231.但似乎数组的边界发生了变化?这是什么原因呢




作者: fcode    时间: 2024-6-14 08:58
假定形状的参数,只传递大小,不传递上下限。
[Fortran] 纯文本查看 复制代码
real :: a(0:3)
call sub(a)

subroutine sub(x)
  real :: x(:) !//此处的 x 为  x(1:4)
end subroutine sub

作者: 石子    时间: 2024-6-14 12:36
fcode 发表于 2024-6-14 08:58
假定形状的参数,只传递大小,不传递上下限。
[mw_shl_code=fortran,true]real :: a(0:3)
call sub(a)

好的,明白了,谢谢




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2