2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 16:46 
Помогите пожалуйста.
Проблема с вызовом стандартных подпрограмм (работа с матрицами).
Опыт программирования на фортране (IV,77) есть - но нет вообще опыта в новых

инструментах.
1. Установил Compaq Visual Fortran 6.5 с апдейтом до 6.6 {указано, что новая версия

библиотеки стандартных подпрограмм Compaq Extanded Math Library (CXML) входит в

состав Visual Fortran версии 6.6}.
2. В настройках (в меню Compaq Visual Fortran 6) поставил галочки для CXML (и на

всякий случай IMSL).
3. Написал пробный код с вызовом п/п транспонирования матрицы (см. приложение 2).

Ошибок в самом коде нет.
4. После компилляции и запуска на выполнение (из меню Compaq Visual Fortran 6)

выдается ошибка (см. приложение 1).
Насколько я понял - проблема при обращении к подпрограмме MINV (транспонирование

матрицы).
Нет линка к п/п:
- библиотека не подключена;
- неправильное обращение к п/п;
- такой п/п нет.

Помощь - что можно сделать?

---
Приложение 1
--------------------Configuration: qwe - Win32 Debug--------------------
Linking...
qwe.obj : error LNK2001: unresolved external symbol _MINV@20
Debug/qwe.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
qwe.exe - 2 error(s), 0 warning(s)

---
Приложение 2

program qwe
implicit none
real OM(2,2),D
integer M,LL,MM
OM(1,1)=1.0
OM(2,1)=2.0
OM(1,2)=3.0
OM(2,2)=4.0
M=4
LL=2
MM=2
CALL MINV (OM,M,D,LL,MM)
print 54,D
54 format (10x,'D=',f15.6)
print 55,OM
55 format (3x,'OM:',10f8.3)
end program qwe
print 54,D
54 format (10x,'D=',f15.6)
print 55,OM
55 format (3x,'O

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 17:41 
simplermethod в сообщении #864003 писал(а):
но нет вообще опыта в новых инструментах.

Последняя версия Compaq Visual Fortran вышла более 10 лет назад, проект давно закрыт (ввиду полной бессмысленности разработки вычислительного инструментария под Windows).

simplermethod в сообщении #864003 писал(а):
Помощь - что можно сделать?

Паллиативно: учесть, что для работы с библиотекой нужно подключить интерфейсный модуль, т.е. воспользоваться конструкцией use что-то-там (какой именно для нужной функции/процедуры, надо смотреть в описании библиотеки).

Нормально: не использовать и в лучшие годы весьма "кривой" инструмент, всеми давно забытый, нормальную документацию к которому найти весьма сложно (ввиду того, что он вообще-то платный) и, раз уж все равно надо переучиваться, воспользоваться чем-то действительно современным.

Кстати: что конкретно Вам нужно от библиотеки работы с матрицами? Возможно, эти проблемы можно решить существенно проще.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 19:04 
1) Нужны п/п операций с матрицами (транспонирование, обращение, умножение, etc)
2) ну да
откопал на форуме какие-то исходники http://www.cyberforum.ru/fortran/thread168070.html
нашел исходник MINV
тупо скопипастил в листинг своей программки
3) теперь на Linking не ругается,
но полезли другие errors

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 19:33 
Pphantom в сообщении #864021 писал(а):
Последняя версия Compaq Visual Fortran вышла более 10 лет назад, проект давно закрыт (ввиду полной бессмысленности разработки вычислительного инструментария под Windows).
На самом деле его преемник - Intel Fortran Composer XE, новые версии которого выходят регулярно.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 20:02 
simplermethod в сообщении #864041 писал(а):
1) Нужны п/п операций с матрицами (транспонирование, обращение, умножение, etc)

Для транспонирования существует встроенная функция transpose. Для умножения - matmul. С обращением сложнее... какого размера матрицы?

tolstopuz в сообщении #864047 писал(а):
На самом деле его преемник - Intel Fortran Composer XE, новые версии которого выходят регулярно.

Это довольно условный приемник, но, в конце концов, это не так уж важно. Можно воспользоваться им, можно еще чем-то свежим.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 20:18 
мне сейчас нужно только, чтобы заработали имеющиеся коды Fortran IV.
Для проверки одной идеи.
Если все будет как надо, то потом можно будет делать оптимально.
А сейчас нужно быстро, "на коленке".

-- 16.05.2014, 20:34 --

запустил бинарник на исполнение - полезли ошибки, что-то с адресацией памяти (делаю скрин).
Может из-за того, что запуск из-под виртуалки WinXPmode из-под Win7x64
Сейчас поставлю Compaq Visual Fortran на WinXPx32

-- 16.05.2014, 20:44 --

вот код программы с подпрограммой

program qwe
implicit none
real OM(2,2),D
integer M,LL,MM
OM(1,1)=1.0
OM(2,1)=2.0
OM(1,2)=3.0
OM(2,2)=4.0
M=4
LL=2
MM=2
CALL MINV (OM,M,D,LL,MM)
print 54,D
54 format (10x,'D=',f15.6)
print 55,OM
55 format (3x,'OM:',10f8.3)
end program qwe
!
SUBROUTINE MINV(A,N,D,L,M)
DIMENSION A(1),L(1),M(1)
D=1.0
NK=-N
DO 80 K=1,N
NK=NK+N
L(K)=K
M(K)=K
KK=NK+K
BIGA=A(KK)
DO 20 J=K,N
IZ=N*(J-1)
DO 20 I=K,N
IJ=IZ+I
10 IF( ABS(BIGA)- ABS(A(IJ))) 15,20,20
15 BIGA=A(IJ)
L(K)=I
M(K)=J
20 CONTINUE
J=L(K)
IF(J-K) 35,35,25
25 KI=K-N
DO 30 I=1,N
KI=KI+N
HOLD=-A(KI)
JI=KI-K+J
A(KI)=A(JI)
30 A(JI) =HOLD
35 I=M(K)
IF(I-K) 45,45,38
38 JP=N*(I-1)
DO 40 J=1,N
JK=NK+J
JI=JP+J
HOLD=-A(JK)
A(JK)=A(JI)
40 A(JI) =HOLD
45 IF(BIGA) 48,46,48
46 D=0.0
RETURN
48 DO 55 I=1,N
IF(I-K) 50,55,50
50 IK=NK+I
A(IK)=A(IK)/(-BIGA)
55 CONTINUE
DO 65 I=1,N
IK=NK+I
HOLD=A(IK)
IJ=I-N
DO 65 J=1,N
IJ=IJ+N
IF(I-K) 60,65,60
60 IF(J-K) 62,65,62
62 KJ=IJ-I+K
A(IJ)=HOLD*A(KJ)+A(IJ)
65 CONTINUE
KJ=K-N
DO 75 J=1,N
KJ=KJ+N
IF(J-K) 70,75,70
70 A(KJ)=A(KJ)/BIGA
75 CONTINUE
D=D*BIGA
A(KK)=1.0/BIGA
80 CONTINUE
K=N
100 K=(K-1)
IF(K) 150,150,105
105 I=L(K)
IF(I-K) 120,120,108
108 JQ=N*(K-1)
JR=N*(I-1)
DO 110 J=1,N
JK=JQ+J
HOLD=A(JK)
JI=JR+J
A(JK)=-A(JI)
110 A(JI) =HOLD
120 J=M(K)
IF(J-K) 100,100,125
125 KI=K-N
DO 130 I=1,N
KI=KI+N
HOLD=A(KI)
JI=KI-K+J
A(KI)=-A(JI)
130 A(JI) =HOLD
GO TO 100
150 RETURN
END

-- 16.05.2014, 20:45 --

---
тут похоже нет фичи вставки скрина?

-- 16.05.2014, 20:58 --

===
скрин с ошибками
[img]error%20bin.JPG.jpg[/img]

-- 16.05.2014, 21:00 --

http://turbobit.net/7opv695tx8pz.html

-- 16.05.2014, 21:00 --

[img]error_bin.JPG.jpg[/img]

-- 16.05.2014, 21:01 --

[img]error_bin.JPG.jpg[/img]

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 21:18 
-------------------------------
в т.ч. ошибка на kernel32.dll
причем и на WinXP32,
и на чистой WinXPmode (из-под виртуалки)

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 22:00 
simplermethod в сообщении #864055 писал(а):
мне сейчас нужно только, чтобы заработали имеющиеся коды Fortran IV.
А они используют CXML?

simplermethod в сообщении #864055 писал(а):
Если все будет как надо, то потом можно будет делать оптимально.
А сейчас нужно быстро, "на коленке".
Проблема в том, что использование древнего компилятора под Windows - это задача класса "почесать правой ногой левое ухо". Попробовать можно, но это будет долго, с трудом и без гарантии результата. Как минимум, нужно сменить компилятор (поставьте, например, g95, он все-таки свежее и доступен под Windows), как максимум - еще и операционную систему.

Кстати, Ваша тестовая программа вполне нормально собирается и работает (разве что надо переставить процедуру перед программой), но нормальными компиляторами в нормальных условиях. Правда, процедура MINV делает что угодно, но не транспонирование матрицы...

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 22:30 
вот исходник:


C ..................................................................
C
C SUBROUTINE MINV
C
C PURPOSE
C INVERT A MATRIX
C
C USAGE
C CALL MINV(A,N,D,L,M)
C
C DESCRIPTION OF PARAMETERS
C A - INPUT MATRIX, DESTROYED IN COMPUTATION AND REPLACED BY
C RESULTANT INVERSE.
C N - ORDER OF MATRIX A
C D - RESULTANT DETERMINANT
C L - WORK VECTOR OF LENGTH N
C M - WORK VECTOR OF LENGTH N
C
C REMARKS
C MATRIX A MUST BE A GENERAL MATRIX
C
C SUBROUTINES AND FUNCTION SUBPROGRAMS REQUIRED
C NONE
C
C METHOD
C THE STANDARD GAUSS-JORDAN METHOD IS USED. THE DETERMINANT
C IS ALSO CALCULATED. A DETERMINANT OF ZERO INDICATES THAT
C THE MATRIX IS SINGULAR.
C
C ..................................................................
C
SUBROUTINE MINV(A,N,D,L,M)
DIMENSION A(1),L(1),M(1)
C
C ...............................................................
C
C IF A DOUBLE PRECISION VERSION OF THIS ROUTINE IS DESIRED, THE
C C IN COLUMN 1 SHOULD BE REMOVED FROM THE DOUBLE PRECISION
C STATEMENT WHICH FOLLOWS.
C
C DOUBLE PRECISION A,D,BIGA,HOLD
C
C THE C MUST ALSO BE REMOVED FROM DOUBLE PRECISION STATEMENTS
C APPEARING IN OTHER ROUTINES USED IN CONJUNCTION WITH THIS
C ROUTINE.
C
C THE DOUBLE PRECISION VERSION OF THIS SUBROUTINE MUST ALSO
C CONTAIN DOUBLE PRECISION FORTRAN FUNCTIONS. ABS IN STATEMENT
C 10 MUST BE CHANGED TO DABS.
C
C ...............................................................
C
C SEARCH FOR LARGEST ELEMENT
C
D=1.0
NK=-N
DO 80 K=1,N
NK=NK+N
L(K)=K
M(K)=K
KK=NK+K
BIGA=A(KK)
DO 20 J=K,N
IZ=N*(J-1)
DO 20 I=K,N
IJ=IZ+I
10 IF( ABS(BIGA)- ABS(A(IJ))) 15,20,20
15 BIGA=A(IJ)
L(K)=I
M(K)=J
20 CONTINUE
C
C INTERCHANGE ROWS
C
J=L(K)
IF(J-K) 35,35,25
25 KI=K-N
DO 30 I=1,N
KI=KI+N
HOLD=-A(KI)
JI=KI-K+J
A(KI)=A(JI)
30 A(JI) =HOLD
C
C INTERCHANGE COLUMNS
C
35 I=M(K)
IF(I-K) 45,45,38
38 JP=N*(I-1)
DO 40 J=1,N
JK=NK+J
JI=JP+J
HOLD=-A(JK)
A(JK)=A(JI)
40 A(JI) =HOLD
C
C DIVIDE COLUMN BY MINUS PIVOT (VALUE OF PIVOT ELEMENT IS
C CONTAINED IN BIGA)
C
45 IF(BIGA) 48,46,48
46 D=0.0
RETURN
48 DO 55 I=1,N
IF(I-K) 50,55,50
50 IK=NK+I
A(IK)=A(IK)/(-BIGA)
55 CONTINUE
C
C REDUCE MATRIX
C
DO 65 I=1,N
IK=NK+I
HOLD=A(IK)
IJ=I-N
DO 65 J=1,N
IJ=IJ+N
IF(I-K) 60,65,60
60 IF(J-K) 62,65,62
62 KJ=IJ-I+K
A(IJ)=HOLD*A(KJ)+A(IJ)
65 CONTINUE
C
C DIVIDE ROW BY PIVOT
C
KJ=K-N
DO 75 J=1,N
KJ=KJ+N
IF(J-K) 70,75,70
70 A(KJ)=A(KJ)/BIGA
75 CONTINUE
C
C PRODUCT OF PIVOTS
C
D=D*BIGA
C
C REPLACE PIVOT BY RECIPROCAL
C
A(KK)=1.0/BIGA
80 CONTINUE
C
C FINAL ROW AND COLUMN INTERCHANGE
C
K=N
100 K=(K-1)
IF(K) 150,150,105
105 I=L(K)
IF(I-K) 120,120,108
108 JQ=N*(K-1)
JR=N*(I-1)
DO 110 J=1,N
JK=JQ+J
HOLD=A(JK)
JI=JR+J
A(JK)=-A(JI)
110 A(JI) =HOLD
120 J=M(K)
IF(J-K) 100,100,125
125 KI=K-N
DO 130 I=1,N
KI=KI+N
HOLD=A(KI)
JI=KI-K+J
A(KI)=-A(JI)
130 A(JI) =HOLD
GO TO 100
150 RETURN
END

-- 16.05.2014, 22:34 --

-------------------------------
Проблема в том, что использование древнего компилятора под Windows - это задача класса "почесать правой ногой левое ухо". Попробовать можно, но это будет долго, с трудом и без гарантии результата. Как минимум, нужно сменить компилятор (поставьте, например, g95, он все-таки свежее и доступен под Windows), как максимум - еще и операционную систему.
Кстати, Ваша тестовая программа вполне нормально собирается и работает (разве что надо переставить процедуру перед программой), но нормальными компиляторами в нормальных условиях.
---
в т.ч. ошибка на kernel32.dll
причем и на WinXP32,
и на чистой WinXPmode (из-под виртуалки)
---


Может поискать F77 ?

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение16.05.2014, 23:05 
simplermethod в сообщении #864093 писал(а):
вот исходник:
simplermethod в сообщении #864093 писал(а):
C INVERT A MATRIX

simplermethod в сообщении #864093 писал(а):
C METHOD
C THE STANDARD GAUSS-JORDAN METHOD IS USED.
Ну да. Если "invert", реализующий стандартный метод Гаусса-Жордана (точнее, Йордана) - это "транспонирование", то я - балерина. :D

simplermethod в сообщении #864093 писал(а):
Может поискать F77 ?
Будут те же самые проблемы. Не надо разыскивать древние компиляторы, они - при весьма посредственной обратной совместимости Windows - в лучшем случае сами запустятся, но собрать рабочий exe-шник уже, скорее всего, просто не смогут.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение17.05.2014, 04:36 
"Если "invert", реализующий стандартный метод Гаусса-Жордана (точнее, Йордана) - это "транспонирование", то я - балерина. :D"
Да - обращение матрицы
голова не работает от недосыпа, сегодня тоже 2 часа спал :-)

-- 17.05.2014, 04:39 --

---
транспонирование матриц - MTRA

-- 17.05.2014, 04:47 --

---
нашел нужные исходники п/п с матрицами - так что проблема с подключение библиотек стала неактуальна.

-- 17.05.2014, 04:51 --

---
Кстати, Ваша тестовая программа вполне нормально собирается и работает (разве что надо переставить процедуру перед программой), но нормальными компиляторами в нормальных условиях.

Это в Autolisp главная программа должна была идти последней,
а в Fortran первой шла (по крайней мере в F IV)

PS. Кстати, вопросик - когда отладчик выдает № строки ошибочного кода, он вроде не учитывает строки закомментированные?

-- 17.05.2014, 04:57 --

tolstopuz в сообщении #864047 писал(а):
Pphantom в сообщении #864021 писал(а):
Последняя версия Compaq Visual Fortran вышла более 10 лет назад, проект давно закрыт (ввиду полной бессмысленности разработки вычислительного инструментария под Windows).
На самом деле его преемник - Intel Fortran Composer XE, новые версии которого выходят регулярно.


Нашел
Intel Composer XE fortran compiler v12
Год выпуска: 2010 Версия: 12.0 Разработчик: Intel Платформа: x86

Но нужно сначала установить Microsoft Visual Studio* 2005, 2008 и 2010.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение17.05.2014, 08:08 
Установил Microsoft Visual Studio 2010 и Intel_Composer_XE_fortran_compiler_v12 (интеграция с VS2010)
Пытаюсь разобраться, что теперь с этим добром делать...

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение17.05.2014, 10:45 
simplermethod в сообщении #864179 писал(а):
PS. Кстати, вопросик - когда отладчик выдает № строки ошибочного кода, он вроде не учитывает строки закомментированные?
Учитывает. Это номер строки в файле с исходником, включая комментарии и пропуски.

simplermethod в сообщении #864196 писал(а):
Пытаюсь разобраться, что теперь с этим добром делать...
Оно вообще-то платное. Триальная версия скоро кончится, так что разбирайтесь быстрее.

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение17.05.2014, 11:03 
!!!
да, в таком виде программа сработала в Compaq Visual Fortran 6.6


SUBROUTINE MINV(A,N,D,L,M)
DIMENSION A(1),L(1),M(1)
D=1.0
NK=-N
DO 80 K=1,N
NK=NK+N
L(K)=K
M(K)=K
KK=NK+K
BIGA=A(KK)
DO 20 J=K,N
IZ=N*(J-1)
DO 20 I=K,N
IJ=IZ+I
10 IF( ABS(BIGA)- ABS(A(IJ))) 15,20,20
15 BIGA=A(IJ)
L(K)=I
M(K)=J
20 CONTINUE
J=L(K)
IF(J-K) 35,35,25
25 KI=K-N
DO 30 I=1,N
KI=KI+N
HOLD=-A(KI)
JI=KI-K+J
A(KI)=A(JI)
30 A(JI) =HOLD
35 I=M(K)
IF(I-K) 45,45,38
38 JP=N*(I-1)
DO 40 J=1,N
JK=NK+J
JI=JP+J
HOLD=-A(JK)
A(JK)=A(JI)
40 A(JI) =HOLD
45 IF(BIGA) 48,46,48
46 D=0.0
RETURN
48 DO 55 I=1,N
IF(I-K) 50,55,50
50 IK=NK+I
A(IK)=A(IK)/(-BIGA)
55 CONTINUE
DO 65 I=1,N
IK=NK+I
HOLD=A(IK)
IJ=I-N
DO 65 J=1,N
IJ=IJ+N
IF(I-K) 60,65,60
60 IF(J-K) 62,65,62
62 KJ=IJ-I+K
A(IJ)=HOLD*A(KJ)+A(IJ)
65 CONTINUE
KJ=K-N
DO 75 J=1,N
KJ=KJ+N
IF(J-K) 70,75,70
70 A(KJ)=A(KJ)/BIGA
75 CONTINUE
D=D*BIGA
A(KK)=1.0/BIGA
80 CONTINUE
K=N
100 K=(K-1)
IF(K) 150,150,105
105 I=L(K)
IF(I-K) 120,120,108
108 JQ=N*(K-1)
JR=N*(I-1)
DO 110 J=1,N
JK=JQ+J
HOLD=A(JK)
JI=JR+J
A(JK)=-A(JI)
110 A(JI) =HOLD
120 J=M(K)
IF(J-K) 100,100,125
125 KI=K-N
DO 130 I=1,N
KI=KI+N
HOLD=A(KI)
JI=KI-K+J
A(KI)=-A(JI)
130 A(JI) =HOLD
GO TO 100
150 RETURN
END
program qwe
Dimension OM(2,2)
OM(1,1)=1.0
OM(2,1)=2.0
OM(1,2)=3.0
OM(2,2)=4.0
M=4
LL=2
MM=2
CALL MINV (OM,M,D,LL,MM)
print 54,D
54 format (10x,'D=',f15.6)
print 55,OM
55 format (3x,'OM:',10f8.3)
end program qwe

 
 
 
 Re: Fortran - подключение стандартных библиотек
Сообщение17.05.2014, 11:35 
Аватара пользователя
 i  Тема перемещена в Карантин.

1. Оформите программный код с использованием тега [syntaх] (см. Как подсвечивать синтаксис)

2. Уберите красное цветовыделение.

3. Исправьте цитаты. Для того чтобы процитировать фрагмент сообщения, выделите его мышкой и нажмите кнопку "Вставка" в цитируемом сообщении

После того как исправите сообщение, сообщите об этом в теме Сообщение в карантине исправлено.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group