Связывание с LAPACK с помощью gfortran в Fedora Linux - PullRequest
0 голосов
/ 14 октября 2018

Мне нужна помощь по установке LAPACK (для Fortran 95) на машину Fedora.

Я пишу это сообщение после того, как попробовал все ответы, опубликованные на соответствующие запросы на этом форуме.

Я попробовал два разных варианта:

МЕТОД 1

Я прямо скачал библиотеку lapack95.a отсюда (http://www.netlib.org/lapack95/, файл с именем lapack95_linux_redhat.tgz.После разархивирования я мог получить файл lapack95.a

После поиска некоторых ответов о том, как связать и использовать библиотеки, я написал пробный код и сохранил в файле try.f90, а затем выполнил следующее

gfortran -c try.f90

gfortran -o try try.o -L/(name of directory where lapack95.a
                          was present. I put it in the same directory
                          as try.f90)/ -llapack95

( Файлы Fortran try.f90 и lapack95.a находились в одном каталоге )

Я получил следующую ошибку:

/usr/bin/ld: cannot find -llapack95
collect2: error: ld returned 1 exit status

Iискал в интернете и нашел здесь (https://forums.fedoraforum.org/archive/index.php/t-248227.html), что нам нужно установить lapack-devel. Я сделал это и получил тот же результат.

Метод 2

Я также попытался выполнить вышеуказанную команду (в методе 1), но без пробелаween / и -llapack95, то есть как:

gfortran -o try try.o -L/(name of directory where lapack95.a 
                          was present I put it in the same directory
                         as try.f90)/-llapack95

и получил следующую ошибку:

try.o: In function `MAIN__':
try.f90:(.text+0xdb): undefined reference to `sgesv_'
collect2: error: ld returned 1 exit status

Метод 3

После отсутствияУдачи, подумал я, может быть, это не очень хорошая идея использовать скачанный файл lapack95.a.Я должен построить его из оригинальных файлов.

Я понял, что, может быть, мне нужно установить lapack95 с помощью соответствующих средств, после чего по той же ссылке http://www.netlib.org/lapack95

я скачал файл lapack95.tgz и следовал инструкциям в файле readme. (который сказал просто запустить make file в SRC)

Я сделал некоторые изменения:

FC1      = f95 -fixed  to 

FC1      = f95 

и

OPTS0    = -u -V -dcfuns -dusty -ieee=full 

до

OPTS0    = -u -V 

(как предложено для https://www.reddit.com/r/linux4noobs/comments/7tgmb9/fortran_library_netlib_lapack95_installation_error/)

Я ожидал, что библиотека будет создана в / usr / lib / или usr / local / lib как LAPACK3, но не смог ее найти.

Infactпроизошла ошибка (и поэтому не могло быть файла .a)

f95 -free -c -u -V - -I./../lapack95_modules f77_lapack_double.f90 f95: ошибка: -E или -x требуется, если ввод осуществляется из стандартного ввода make: *** [../make.inc:45: f77_lapack_double.o] Ошибка 1

Я не уверен, что какой-либо из моих методов подходит. Я ожидал, что метод1, чтобы работать, поскольку я связываю библиотеку локально, но ошибка во всех 3 случаях.

Пожалуйста, подскажите. Спасибо

1 Ответ

0 голосов
/ 16 декабря 2018

Библиотека Lapack - очень полезный инструмент для быстрого выполнения матричных операций.На Linux-машине очень просто установить lapack с помощью встроенных инструментов: dnf / yum или apt-get [2].На моем рабочем столе Fedora установка выглядит следующим образом:

sudo dnf install lapack64-devel.x86_64

Вот небольшой пример использования lapack lib.Исходный код предназначен для решения линейных уравнений в виде linear_eqs.f [3].

    Program LinearEquations
c solving the matrix equation A*x=b using LAPACK
    Implicit none
c declarations, notice single precision
    Real*4 A(3,3), b(3)
    integer i, j, pivot(3), ok
c define matrix A
    A(1,1)=3.1
    A(1,2)=1.3
    A(1,3)=-5.7
    A(2,1)=1.0
    A(2,2)=-6.9
    A(2,3)=5.8
    A(3,1)=3.4
    A(3,2)=7.2
    A(3,3)=-8.8
c define vector b, make b a matrix and you can solve multiple
c equations with the same A but different b
    b(1)=-1.3
    b(2)=-0.1
    b(3)=1.8
c find the solution using the LAPACK routine SGESV
    call SGESV(3, 1, A, 3, pivot, b, 3, ok)
c
c parameters in the order as they appear in the function call
c    order of matrix A, number of right hand sides (b), matrix A,
c    leading dimension of A, array that records pivoting, 
c    result vector b on entry, x on exit, leading dimension of b
c    return value   
c   
c print the vector x
    do i=1, 3
       write(*,*) b(i)
    end do
    end

В этом коде используется одна функция Lapack 'sgesv ()'.Чтобы выполнить этот файл, выполните следующую команду:

gfortran linear_eqs.f -llapack -o lineqs.out
./lineqs.out

Вывод будет:

1.00000024    
1.00000036    
1.00000036 

Ссылка

[1] https://github.com/fxcoudert/gfortran-for-macOS/releases

[2] BLAS, ATLAS, LAPACK Пример минимальной общей библиотеки

[3] http://physics.oregonstate.edu/~landaur/nacphy/lapack/codes/linear-f.html

...