在Fortran中,允许我们创建派生数据类型:
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