Fortran Coder

查看: 548|回复: 2
打印 上一主题 下一主题

[子程序] 通过subtoutine的参数传递数组,但lbound返回的数组边界变化

[复制链接]

36

帖子

17

主题

0

精华

专家

F 币
410 元
贡献
399 点
跳转到指定楼层
楼主
发表于 2024-6-13 22:55:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 石子 于 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.但似乎数组的边界发生了变化?这是什么原因呢



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩
欢迎交流

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

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

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

36

帖子

17

主题

0

精华

专家

F 币
410 元
贡献
399 点
板凳
 楼主| 发表于 2024-6-14 12:36:27 | 只看该作者
fcode 发表于 2024-6-14 08:58
假定形状的参数,只传递大小,不传递上下限。
[mw_shl_code=fortran,true]real :: a(0:3)
call sub(a)

好的,明白了,谢谢
欢迎交流
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 22:27

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表