Я написал короткую программу на Фортране, которая использует команды, но она не работает должным образом. Я хотел бы знать, правильный ли мой синтаксис программирования, или если в моем компиляторе есть ошибка.
Я читал книгу о 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, которые могли бы объяснить это?
Спасибо за ваше время.
Стив Лайонел, спасибо за предложение о поиске варианта ассоциации с оператором 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
как функцию, скореечем в качестве варианта индексации, как описано в книге.
Без каких-либо опубликованных рабочих примеров, ни в книге, ни в Интернете, я не знаю, чего от меня хочет компилятор. Книга обычно показывает "справочник" представление этих определений. Поэтому я никогда не совсем уверен, как на самом деле должны выглядеть эти заявления. Однако в случае того, как я написал оба утверждения, они используют те же параметры, которые описаны в книге. Любые предложения или идеи, с благодарностью.