如何在Fortran 2018中访问远程团队

时间:2019-11-10 18:50:53

标签: fortran fortran2018

我编写了一个简短的Fortran程序,该程序使用团队,但无法正常运行。我想知道我的编程语法是否正确,或者我的编译器中是否有错误。

我一直在阅读有关Fortran 2018及其一些较新实现的书籍,包括团队。很少有关于团队的教科书,而我唯一能找到的教科书没有提供任何程序示例。我已经编写,编译并运行了一个非常简短的程序,该程序应该在一个团队中工作时打印出一个团队的价值。语法似乎很简单,但是该程序无法正常工作。我已经使用OpenCoarrays 2.7.1编译器以及2.8.0版对程序进行了编译。

program remote_team2
    use iso_fortran_enf
    implicit none

    type(team_type) :: new_team
    integer, codimension[*] :: tempnum

    form team(1+mod(this_image(),2),new_team)

    change team(new_team)
        tempnum = num_images()
        sync team(new_team)

        select case (team_number())
            case(1)
                print *, 1, ' ', tempnum[2], ' ', num_images()
            case(2)
                print *, 2, ' ', tempnum[1], ' ', num_images()
        end select
    end team
end program remote_team2

如果我使用5个处理器cafrun -np 5 remote_team2运行该程序,则希望在屏幕上显示以下内容:

2    3    2
1    2    3
2    3    2
1    2    3
2    3    2

相反,我得到以下信息:

2    3    3
1    2    2
2    3    3
1    2    2
2    3    3

我不明白为什么它不打印相反组号中的图像数,然后不打印当前组号中的图像数。相反,它只会打印两次相同的内容,表明方括号索引“ []”不起作用。

我在做什么错?是否有任何Fortran 2018程序员可以解释这一点?

感谢您的时间。

史蒂夫·莱昂内尔(Steve Lionel),感谢您提出有关使用change team语句查看关联选项的建议。我的书中提到了此选项,但不幸的是,再次没有示例。

根据本书中描述的语法,我将程序修改为如下所示:

program remote_team2
    use iso_fortran_enf
    implicit none

    type(team_type) :: new_team
    integer, codimension[*] :: tempnum
    integer, codimension[2,*] :: tn

    form team(1+mod(this_image(),2),new_team)

    change team(new_team, tempnum[*] => tn)
        tempnum = num_images()
        sync team(new_team)

        select case (team_number())
            case(1)
                print *, 1, ' ', tempnum[1, team_number = 2], ' ', num_images()
            case(2)
                print *, 2, ' ', tempnum[1, team_number = 1], ' ', num_images()
        end select
    end team
end program remote_team2

但是,现在我的编译器为我的change team语句提供了语法错误。该错误显示为:

change team(new_team, tempnum[*] = > tn)
                   1
Error: Syntax error in CHANGE TEAM statement at (1)

编译器还会给出以下错误消息:

print *, 1, ' ', tempnum[1, team_number = 2], ' ', num_images()
                                      1
Error: Function 'team_number' requires an argument list at (1)

似乎认为我正在尝试将team_number用作函数,而不是本书中所述的索引选项。

没有任何公开的工作示例可言,无论是在书中还是在线上,我都不知道编译器要我做什么。该书通常显示这些定义的“参考书”表示。因此,我永远不确定这些语句的外观。但是,就我编写这两种语句的方式而言,它们使用的是本书中所述的相同选项。任何建议或想法,将不胜感激。

2 个答案:

答案 0 :(得分:3)

您不是要从“相反的团队编号”中请求tempnum,而是从当前团队中的图像1或2中请求。由于该团队中的图片数量在该团队中的所有图片中均相同,因此您看到的结果是正确的。

组建团队并进行CHANGE TEAM时,当前团队的图像索引是从1开始的有序集合。您可能希望查看CHANGE TEAM的可选“ associating coarray”参数

答案 1 :(得分:-1)

我最近从我读过的那本书的一位作者那里了解到,我更新的程序的语法是正确的,甚至可以简化。他建议我的编译器尚不支持在不同团队之间访问信息的功能。

至少我现在知道我的语法是正确的。