Фортран массив производного типа против массивов производного типа - PullRequest
1 голос
/ 16 апреля 2019

В Фортране нам разрешено создавать производный тип данных:

type vig_
    double precision :: L
    double precision :: D_i
    double precision :: D_o
end type vig_

type(vig_) :: vig

Мой вопрос касается производительности при использовании производных типов данных.

Я могу создать массив производного типа:

type vig1_
    double precision :: L
    double precision :: D_i
    double precision :: D_o
end type vig1_

type(vig1_), allocatable :: vig1(:)

! ...
allocate(vig1(n))
! ...

или производный тип данных массивов:

type vig2_
    double precision, allocatable :: L(:)
    double precision, allocatable :: D_i(:)
    double precision, allocatable :: D_o(:)
end type vig2_

type(vig2_) :: vig2

! ...
allocate( vig2%L(n) , vig2%D_i(n) , vig2%D_o(n) )
! ...

Конечно, есть разница, но в чем именно разница между обоими подходами? Что быстрее? Если я хочу вызвать подпрограмму с этими значениями, которая работает лучше?

! option 1
do k=1,n
    call foo1( vig1(k) )
end do

! option 2
do k=1,n
    call foo2( vig2%L(k) , vig2%D_i(k) , vig2%D_o(k) )
end do

subroutine foo1(vig)
    type(vig1_) :: vig
end subroutine foo1

subroutine foo2(L,D_i,D_o)
    double precision :: L, D_i, D_o
end subroutine foo2
...