Я пытаюсь найти обратные и собственные функции эрмитовых матриц nxn, используя Фортран с лапаком.
Как выбрать оптимальные значения для таких параметров, как lda
, lwork
, liwork
и lrwork
. Я просматриваю несколько примеров и нахожу эти варианты
integer,parameter::lda=nh
integer,parameter::lwork=2*nh+nh*nh
integer,parameter::liwork=3+5*nh
integer,parameter::lrwork=1 + 5*nh + 2*nh*nh
где nh
- размерность матрицы. Я также нашел другой пример с lwork=16*nh
. Как я могу определить лучший выбор? На данный момент я имею дело с эрмитовыми матрицами размером 500x500 (максимум).
Я нашел эту документацию, в которой предлагается
РАБОТА
(рабочая область) REAL массив, размер (LWORK)
При выходе, если INFO = 0, WORK (1) возвращает оптимальный LWORK.
LWORK
(ввод) ЦЕЛОЕ
Размерность массива РАБОТА. LWORK  max (1, N).
Для оптимальной производительности LWORK  N * NB, где NB - оптимальный размер блока, возвращаемый ILAENV.
Можно ли определить оптимальный размер блока, используя WORK
или ILAENV
для заданного размера матрицы?
Я использую и gfortran, и ifort с mkl.
ИЗМЕНИТЬ
На основе комментария @percusse и ответа @kvantour вот пример кода
character,parameter::jobz="v",uplo="u"
integer, parameter::nh=15
complex*16::m(nh,nh),m1(nh,nh)
integer,parameter::lda=nh
integer::ipiv(nh),info
complex*16::work(1)
real*8::rwork(1), w(nh)
integer::iwork(1)
real*8::x1(nh,nh),x2(nh,nh)
call random_seed()
call random_number(x1)
call random_number(x2)
m=cmplx(x1,x2)
m1=conjg(m)
m1=transpose(m1)
m=(m+m1)/2.0
call zheevd(jobz,uplo,nh,m,lda,w,work,-1,rwork,-1,iwork, -1,info)
print*,"info : ", info
print*,"lwork: ", int(work(1)) , 2*nh+nh*nh
print*,"lrwork:", int(rwork(1)) , 1 + 5*nh + 2*nh*nh
print*,"liwork:", int(iwork(1)) , 3+5*nh
end
информация: 0
Работа: 255 255
lrwork: 526 526
работа: 78 78
LWORK=-1
и получаете оптимальный размер блока. Затем вы снова вызываете функцию с этими возвращенными значениями - person percusse   schedule 21.03.2018