Привет
Я пытаюсь использовать структуру Fortran, как это
type some
u ! actual code will have 17 such scalars
end type some
TYPE(some),ALLOCATABLE,DIMENSION(:) :: metvars,newmetvars
Теперь цель моей тестовой программы - отправить 10 чисел с одного процессора на другой, но отправной точкой этих 10 чисел будет мой выбор (например, если у меня есть вектор, скажем, 20 чисел, не являющийся необходимым, я возьму первое 10 номеров до следующего процессора, но допустим, мой выбор от 5 до 15). Итак, сначала вы используете mpi_type_contiguous, как это
CALL MPI_TYPE_CONTIGUOUS(10,MPI_REAL,MPI_METVARS,ierr) ! declaring a derived datatype of the object to make it in to contiguous memory
CALL MPI_TYPE_COMMIT(MPI_METVARS,ierr)
Я отправил запись и смог получить первые 10 чисел на другой процессор (я проверяю его на 2 процессора)
if(rank.EQ.0)then
do k= 2,nz-1
metvars(k)%u = k
un(k)=k
enddo
endif
Я отправляю это
сейчас
для второй части я использовал mpi_TYPE_CREATE_SUBARRAY так
то
array_size = (/20/)
array_subsize =(/10/)
array_start = (/5/)
CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype,ierr)
CALL MPI_TYPE_COMMIT(newtype,ierr)
array_size = (/20/)
array_subsize =(/10/)
array_start = (/0/)
CALL MPI_TYPE_CREATE_SUBARRAY(1,array_size,array_subsize,array_start,MPI_ORDER_FORTRAN,MPI_METVARS,newtype2,ierr)
CALL MPI_TYPE_COMMIT(newtype2,ierr)
if(rank .EQ. 0)then
CALL MPI_SEND(metvars,1,newtype,1,19,MPI_COMM_WORLD,ierr)
endif
if(rank .eq. 1)then
CALL MPI_RECV(newmetvars,1,newtype2,0,19,MPI_COMM_WORLD,MPI_STATUS_IGNORE,ierr)
endif
Я не понимаю, как это сделать.
Я получаю сообщение об ошибке
[flatm1001:14066] *** An error occurred in MPI_Recv
[flatm1001:14066] *** on communicator MPI_COMM_WORLD
[flatm1001:14066] *** MPI_ERR_TRUNCATE: message truncated
[flatm1001:14066] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
Я использую openmpi на моей локальной машине. Я смог использовать команду subarray без части mpi_type_contiguous. Однако, если я объединю оба, потому что в этом случае мне нужно сделать это, так как у меня есть структура с fortran в реальном коде. Я не знаю, если есть лучший способ сделать это либо. Любая помощь и предложения приветствуются.
Заранее спасибо