Конечно, нет проблем с использованием производных типов:
program derivedtype
use omp_lib
implicit none
integer, parameter :: sz=20
type mytype1
integer, dimension(sz) :: a
real , dimension(sz) :: b
end type mytype1
type mytype2
integer :: a
real :: b
end type mytype2
type(mytype1) :: var1
type(mytype2), dimension(sz) :: var2
integer:: i
integer:: isum
real :: rsum
var1%a = 2
var1%b = 1.
forall (i=1:sz)
var2(i)%a = 3
var2(i)%b = 4.
endforall
isum = 0
rsum = 0.
print *, var1%a
print *, var1%b
print *, [(var2(i)%a, i=1,sz)]
print *, [(var2(i)%b, i=1,sz)]
!$omp parallel do default(none) shared(var1,var2), reduction(+:rsum), reduction(+:isum)
do i=1,sz
isum = isum + var1%a(i) + var2(i)%a
rsum = rsum + var1%b(i) + var2(i)%b
enddo
print *,'isum = ', isum
print *,'rsum = ', rsum
end program derivedtype
Проблема, вероятно, связана с размещаемыми частями, и это немного более тонко; OpenMP3.0 на самом деле не имел дело с производными типами с размещаемыми компонентами, и мне не ясно, что, если вообще что-то, 3.1 говорит об этом. Но даже если не считать этого, в OpenMP есть способы, с помощью которых вы можете пойти не так, как надо - с такими же проблемами возникают Си и указатели. Можете ли вы дать нам пример того, что именно терпит неудачу?