Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Работа с Intel Fortran через Visual Studio 2003 и не только

Автор: akaGM
Дата сообщения: 10.01.2007 19:21
RUSer

Цитата:
9.1.033

маздай... весь мир плюётся...
или вертайся на 9.0 (как это сделал я) или дожидайся 9.2...

кстати, для очистки совести можешь посмотреть багрепорты, может там и о твоих проблемах уже известно...

--------
чтобы не быть голословным:
я упёрся с winteracter
/взято с http://www.winteracter.com/

Цитата:

Note:
The Winteracter libraries are still compiled with v9.0 at the time of writing, due to a serious regression in the 9.1 compiler release. We expect to build a later update with 9.1, if/when this compiler fault is fixed.
Автор: RUSer
Дата сообщения: 10.01.2007 21:27
akaGM
заменил уже на 9.0 - не помогло...
Автор: akaGM
Дата сообщения: 10.01.2007 21:49
RUSer
c 2005?
тогда:
1. если есть возможность, попробуй ещё раз на 2003
2. смотри траблы по 2005 на интел-саппорте
3. напиши (уже только для полного успокоения) везде
impilicit none

4. показывай код, если это возможно и он не очень большой
5. ещё раз опиши проблему...

риторически:
а на хрен было вообще переходить на 2005?
фортран он и в комманд-лайне -- фортран...
Автор: akaGM
Дата сообщения: 12.01.2007 17:20
и вообще...
есть уверенность, что нет ошибок в логике работы программы?
может в релизе они особо не проявляются (до поры до времени), а в режиме дебага включаются какие-то проверки и всё слетает...
может именно под дебагом всё работает _верно_, т.е. то как ты _просишь_, а не как ты _хочешь_...
Автор: RUSer
Дата сообщения: 13.01.2007 17:59
akaGM
1. на 2003 - нету такой возможности, прибил хороший дистриб по ошибке, а взять негде... Остался только кривой, какой не ставится...
2. пороюсь
3. пробовал и так, и так - пофигу
4. кода на 59 кбайт одной прогой...
5. Описываю расширенно...

Я пишу обычно на делфях, но если на них реализовать МКР, то расчёт будет длится довольно долго. Мне посоветовали писать на фортране, сказав, что расчёт на нём будет быстрее, да и заточен он под математику...
Вот, написал... Поэтому и могу сравнить -

Цитата:
нет ошибок в логике работы программы?
т.к. есть прога на делфях... Релиз совпадает с делфийской прогой, а отладка - на выходе пишет NaN.

Цитата:
риторически:
а на хрен было вообще переходить на 2005?
фортран он и в комманд-лайне -- фортран...

я там ещё немного дописал по расчёту, поэтому мне и требуется пошаговая отладка кода со всеми промежуточными результатами. А писать для сравнения тоже самое на делфях - это получается только время тратить, мягко говоря...
По поводу перехода см. п.1

Если есть что-то подобное VS, то скажите. Мне главное, чтобы особо долго в ней разбираться не пришлось...
Автор: akaGM
Дата сообщения: 13.01.2007 19:42
RUSer

Цитата:
МКР
метод конечных разностей? рунге-кутта? или что?
так, для праздного интереса...


Цитата:
а отладка - на выходе пишет NaN
у тебя что, на выходе одно число?
может действительно не лады с инициализацией?
если у тебя "чистый 90/95" код, то прогони под лахеем (если есть такой), у него
самая подробная инфа при компиляции имхо...


Цитата:
4. кода на 59 кбайт одной прогой...
дай, если не жалко, гляну...

akaGM на яндексе


Цитата:
Я пишу обычно на делфях... Мне посоветовали писать на фортране, сказав, что расчёт на нём будет быстрее, да и заточен он под математику...
более чем верный совет/решение...
аналогичный случай, счёт -- фор, гуй -- дельфи...


Цитата:
я там ещё немного дописал по расчёту, поэтому мне и требуется пошаговая отладка кода со всеми промежуточными результатами
ну это-то при небольших программах решается элементарно с промежуточными райтами, был бы опыт...


Цитата:
Если есть что-то подобное VS
под винды нет, под линь -- много чего...
но тебе ж не подойдёт...
Автор: dima333a
Дата сообщения: 13.01.2007 23:51
RUSer

Цитата:
т.к. есть прога на делфях... Релиз совпадает с делфийской прогой, а отладка - на выходе пишет NaN.


Типичная проблемма в таком случае - это неициализорованные массивы и переменные.Т.е. если ничего в массив/переменную незанес, а потом пытаешся провести операцию с этой ячейкой, то получаем ерунду.

Если компилировать в режиме отладки, то там обычно автоматом обнуляются константы при инициализации.
Автор: akaGM
Дата сообщения: 14.01.2007 13:50
стандарт фортрана гласит:
"переменная всегда имеет начальное значение ноль"
но сегодня я бы на это не расчитывал и никому не советовал полагаться...


Цитата:
обнуляются константы при инициализации

хорошо сказано...


Цитата:

Если есть что-то подобное VS
под винды нет, под линь -- много чего...

но тебе ж не подойдёт...


тут я не совсем прав...
есть, например, иде от ваткома, правда она убогая, но зато свободная...

http://openwatcom.org/index.php/Main_Page

кстати, обновился в декабре...

Автор: RUSer
Дата сообщения: 14.01.2007 13:57
akaGM

Цитата:
метод конечных разностей



Цитата:
прогони под лахеем

А что это?

Прога: http://ifolder.ru/865401
Пароль в ПМ


Цитата:
решается элементарно с промежуточными райтами

если ты имеешь ввиду выкидывать все промежуточные цифры в файл, то здесь это не пойдёт - объём будет слишком большим.

dima333a

Цитата:
Если компилировать в режиме отладки, то там обычно автоматом обнуляются константы при инициализации.

поясни свою фразу...
А то я, глупый, всю жизнь считал, что константа всегда неизменна о_О На то она и константа...
Автор: akaGM
Дата сообщения: 14.01.2007 14:10
RUSer


Цитата:
прогони под лахеем

А что это?


компилятор с фортрана Lahey

http://www.lahey.com

щас его купили Fujitsu
самая лучшая диагностика при компиляции, я его для этих целей и держу...


Цитата:
Пароль в ПМ

ну ты и защитился...
13 кил в мыло трудно пульнуть?
взял, гляну...

---------------------
навскидку...

придётся поменять _везде_
типа

Код:
data m0/1.256637e-6/,pi/3.1415927/

xzaz=12*kx*0.5
farrot=farrot*1e-3
intermax=intermax/250
torque=2*pi*Rrot*lrot*Rrot*Kke*fxo
Автор: RUSer
Дата сообщения: 14.01.2007 14:35
что менять - понятно. Вопрос - для чего? Что означает "d"?
Автор: akaGM
Дата сообщения: 14.01.2007 15:03
RUSer

Цитата:
Что означает "d"?

то, что счёт идёт с двойной точностью, а не с одинарной...
real*8, а "е" всё перебивает...
фортран -- он такой...
может в этом всё дело, nan может возникать из-за потери точности,
давай правь, не ленись...

+
вместо твоего:

Код:
real*8 pi
data pi/3.1415927/
Автор: dima333a
Дата сообщения: 14.01.2007 15:14
RUSer

Цитата:
поясни свою фразу...
А то я, глупый, всю жизнь считал, что константа всегда неизменна о_О На то она и константа...


O как накинулись... имелось в виду _переменные_.


Цитата:
стандарт фортрана гласит:
"переменная всегда имеет начальное значение ноль"
но сегодня я бы на это не расчитывал и никому не советовал полагаться...


Из личного опыта - _Это не правда_. В интеловском компиляторе есть специальная опция по этому поводу.

/Qzero implicitly initialize all data to zero

/Qnobss_init disable placement of zero-initialized vars in BSS (use DATA)

Сам с этим столкнулся.
Автор: akaGM
Дата сообщения: 14.01.2007 15:18
RUSer

вот тебе диагностика лахея (выделения мои), 3 неинициализации, правь:

Код:
Lahey/Fujitsu Fortran 95 Compiler Release 5.00f

Compiling file kstat.f90.
Compiling program unit kstat at line 1:
1619-S: "kstat.f90", line 141: ddxy not an array name or invalid array reference.
2018-S: "kstat.f90", line 141: When IMPLICIT NONE is specified, yz must be declared in a type declaration statement.
2005-W: "kstat.f90", line 143: ier is used but never set.
2005-W: "kstat.f90", line 562: ourepslow is used but never set.
Автор: dima333a
Дата сообщения: 14.01.2007 17:58
akaGM

Цитата:
пример же интела -- пример реализации...


Ну тут вся соль в том, что "стандарт говорит одно, а в жизни ...", насчет того что бы "полагатся на это", я с тобой полностью согласен. Мой опыт собственно и заключался в том что ю слишком сильно полагался на стандарт. А каждый компилятор это как отдельный зверь, со своими повадками.
Автор: akaGM
Дата сообщения: 16.01.2007 14:45
ну а при моём следовании стандарту, все мои программы до сих пор работают и компилятся на 3-4 платформах без адаптации (вин, *никс, vax, cray)
при этом используя стандартные же nag и port библиотеки...
Автор: RUSer
Дата сообщения: 27.01.2007 13:57
akaGM

Спасибо за свежий взгляд


Цитата:
outepslow
эта описана, инициализирована (читается из файла параметров), но не используется

ourepslow
а эта описана, неинициализирована, но используется, причём как целое:

if (ourepslow.eq.1) then


клавиши "r" и "t" рядом расположены...
или ошибка "копи/пасте"? гы


гы Этот случай всё равно никогда не возникает, если вх. параметры верны, а не от балды.

Щас вернулся к коду, буду менять всё как ты говорил.

Ещё раз спасибо.
Автор: akaGM
Дата сообщения: 27.01.2007 14:23
RUSer

Цитата:
Этот случай всё равно никогда не возникает, если вх. параметры верны

ещё как возникает...
outepslow всегда = 1 (из твоего же файла), а ourepslow или 0 или мусор при релизе/отладке
if (ourepslow.eq.1) then

сам проверь...

---
у нас теперь новая крыша...
Автор: RUSer
Дата сообщения: 27.01.2007 14:55

Цитата:
! Если процесс затухает очень медленно
! ---------------------------------------------------------------
! if (outepslow.eq.1) then
!         if (abs(epsmax/epsmaxold).gt.0.999) then
! if (abs(epsmax/epsmaxold).lt.1) then
! ctlow=ctlow+1
! print *, ctlow
! if (ctlow.gt.ctlowmax) then
! epsmax=0
! ! Прекращение расчета из-за очень медленного убывания погрешности
! print *,'ЏаҐЄа йҐ-ЁҐ а бзҐв Ё§-§ ®зҐ-м ¬Ґ¤«Ґ--®Ј® гЎлў -Ёп Ї®ЈаҐи-®бвЁ'
! end if
! end if
! end if
!         end if
! if (int.gt.intermax) then
! epsmax=0
! !Прекращение расчета из-за достижения максимального количества итераций
! print *, 'ЏаҐЄа йҐ-ЁҐ а бзҐв Ё§-§ ¤®бвЁ¦Ґ-Ёп ¬ ЄбЁ¬ «м-®Ј® Є®«ЁзҐбвў ЁвҐа жЁ© '
! end if

Эти случаи у мя возникают, хотя и редко - пр. когда с параметрами модели эксперементирую. Вывод: по логике всё работает

В отладке же у меня срабатывает условие:

Цитата:
! Защита от математического переполнения
! ---------------------------------------------------------------
if (epsmax.gt.1) then

print *,' !! Њ ⥬ вЁзҐбЄ®Ґ ЇҐаҐЇ®«-Ґ-ЁҐ !! '
print *,' !! Ђў аЁ©-®Ґ § ўҐаиҐ-ЁҐ а Ў®вл !! '
print *,' !! ЌҐв १г«мв в®ў ¬®¤Ґ«Ёа®ў -Ёп !! '
stop
end if

З.Ы. И да, outepslow - там была очепятка Что самое интеросное - работало же о_О
Автор: akaGM
Дата сообщения: 27.01.2007 15:16
RUSer

Код:
real*8 t, s

t = -0.999999999
print *, t, abs(t), dabs(t)
s = -0.999999999d0
print *, s, abs(s), dabs(s)
end
Автор: RUSer
Дата сообщения: 27.01.2007 16:10

Цитата:
придётся поменять _везде_
типа

Код:
data m0/1.256637e-6/,pi/3.1415927/

xzaz=12*kx*0.5
farrot=farrot*1e-3
intermax=intermax/250
torque=2*pi*Rrot*lrot*Rrot*Kke*fxo
на
Код:
data m0/1.256637d-6/, pi/3.1415927d0/

xzaz=12.d0*kx*0.5d0
farrot=farrot*1d-3
intermax=intermax/250.d0
torque=2.d0*pi*Rrot*lrot*Rrot*Kke*fxo

поменял, а также везде, где не ругалось на dabs, deps, dsin, dcos, dsqrt - непомогло

Цитата:
исполни...
тогда поймёшь


Понятно, но не много не туда. Там при верности условия epsmax=0, а срабатывает epsmax.gt.1

Щас набрался терпения и тупо жал F10, а местами F11, отслеживая epsmax. Так вот - выскочило значение epsmax = 3.099818599389015E+066. Это как? О_О Переполнение real(8)?
Автор: akaGM
Дата сообщения: 27.01.2007 17:48

Цитата:
выскочило значение epsmax = 3.099818599389015E+066

ну вот и ошибка где-то здесь... локализуй аккуратно и исправляй...

Цитата:
поменял, а также везде, где не ругалось на dabs, deps, dsin, dcos, dsqrt - непомогло

ну значит не везде...

Цитата:
Это как? О_О Переполнение real(8)

да запросто! делишь, например, на сингловую где-нибудь...
скорее не переполнение, а потеря точности...

вообще, сравнение дабла с 1 -- некорректное,
надо писать (epsmax .gt. 1.0d0), говорил же уже...
Автор: RUSer
Дата сообщения: 27.01.2007 19:47
После 3х часов тупого вставляния

Цитата:
if (epsmax .gt. 3.099818599389015E+060) then
epsmax=3.099818599389015E-3
end if

я нашёл, где впервые появляется эта 3,0998е+66. А появляется она, как всегда там, где никогда и не подумаешь в первую очередь:

Цитата:

a(i,j)=a(i,j)+krealax*deps
>>>>> deps=dabs(deps)
if (epsmax.lt.deps) then
epsmax=deps
end if
end do
end do
! Вычисление магнитной проницаемости
! ---------------------------------------------------------------
do j=yzaz+1,yzaz+yrot+1,1
     if (dekcyl.eq.0) then ! Цилиндричееская система координат
                dx2r=dx2(j)
     end if


dabs - это я уже поменял на c abs.

akaGM,
не подскажешь, чем это можно заменить?


Добавлено:
Вариант

Цитата:

if (deps.lt.0) then
deps=-1.0d0*deps
end if
не работает
Автор: akaGM
Дата сообщения: 27.01.2007 20:14
хм...
подскажу...
если ты мне подскажешь что такое deps?

ну сколько раз повторять?!
ты на варнинги вообще кладёшь?

Код:
real*8 t
if (t .gt. 3.099818599389015E+060) then
t = 3.099818599389015E-3
end if


test.f(25) : Warning: When converting this constant to a REAL(KIND=4) number, underflow or overflow occurred. [3.099818599389015E+060]
if (t .gt. 3.099818599389015E+060) then
------------------^
Автор: RUSer
Дата сообщения: 27.01.2007 20:38

Цитата:
ну сколько раз повторять?!


Я просто в параметрах по-умолчанию выбрал Defaul REAL KIND=8.
А так да, предупреждения компилятор выдавал про KIND=4

Про deps:

Из файла читается epsdop - это требуемая точность расчётов, не достигнув которой расчёт и не завершится. Т.е. есть с начала 250 итераций - если по их окончании не будет достигнута epsdop, то итераций будет 500 и расчёт повторится заного. И т.д. до предельного значения итераций, ошибку в проверке которого ты уже нашёл

Цитата:

! Основной цикл расчета векторного магнитного потенциала
! ---------------------------------------------------------------
do while (epsmax.gt.epsdop)

В конце каждой итерации определяется погрешность этой итерации цикла deps.

Цитата:
deps=a0-a(i,j)

Но, т.к. результат может быть как с плюсом, так и с минусом - берём по модулю.

Она сравнивается c максимальной для всех предыдущих циклов -

Цитата:
if (epsmax.lt.deps) then
epsmax=deps
end if

и запоминается максимальная.

Вроде всё

Добавлено:

Цитата:
ты на варнинги вообще кладёшь?


вот лог:

Цитата:

------ Build started: Project: kstat, Configuration: Debug|Win32 ------
Compiling with Intel Fortran 9.0 C:\Program Files\Intel\Compiler\Fortran\9.0\IA32\...
ifort /nologo /Zi /Od /f77rtl /intconstant /debug-parameters:used /integer_size:64 /real_size:64 /Qsave /align:rec16byte /align:dcommons /align:sequence /assume:byterecl /Qtrapuv /module:"Debug/" /object:"Debug/" /traceback /check:bounds /libs:static /threads /dbglibs /c /Qvc8 /Qlocation,link,"C:\Program Files\Microsoft Visual Studio 8\VC\bin" "D:\kstat\kstat.f90"

Linking...

Link /OUT:"Debug/kstat.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"D:\kstat\debug\kstat.exe.intermediate.manifest" /DEBUG /PDB:"Debug/kstat.pdb" /SUBSYSTEM:CONSOLE "Debug/kstat.obj"

Link: executing 'link'
Embedding manifest...
mt.exe /nologo /outputresource:"D:\kstat\debug\kstat.exe;#1" /manifest "D:\kstat\debug\kstat.exe.intermediate.manifest"

kstat build succeeded.

Нету их.
Автор: akaGM
Дата сообщения: 27.01.2007 21:53

Цитата:
Про deps:

ну нет у меня deps, ни переменной, ни её использования, вообще нет в коде...

тогда шли новый...

ну компильни с /check:bounds свой релиз мож здесь что...
а вообще, если в дебаге возникли такие числа то ту же это надо рыть...
не понимаю...
Автор: RUSer
Дата сообщения: 27.01.2007 22:39
akaGM
ссылка: http://ifolder.ru/980477
Пароль тот же

Я кретин! Теперь понятно, зачем рекомендуют отдыхать каждые два часа от компа.... Я когда менял abs, sin и т.д. на dabs, dsin, менял их диалогом замены всех найденных... И eps в том числе попало... Удачно, что сменились все eps на deps.

З.Ы. в линке уже с eps.

З.З.Ы. /check:bounds ничего не дало.
Автор: akaGM
Дата сообщения: 28.01.2007 12:58
попробуй ещё поменять описание без дименсиона
с

Код:
! real*8, ALLOCATABLE, DIMENSION (:,:) :: hx,hy,a,bx,by,m,tablfar
! real*8, ALLOCATABLE, DIMENSION (:) :: tok,hxpov,bxpov,Wa,Wb,Wc,Ww
! real*8, ALLOCATABLE, DIMENSION (:) :: fazaa,fazab,fazac,byp,xout,m0gamv
! real*8, ALLOCATABLE, DIMENSION (:) :: v,dx,dxquad,dx2,ddxy,ddxy2,ddxy4
! real*8, ALLOCATABLE, DIMENSION (:) :: gamv,hxtorque,bytorque
Автор: RUSer
Дата сообщения: 28.01.2007 13:39
та же дурь

пробовал ставить Defaul REAL KIND=16 и интежер на 8 - просто отказалась работать.
Автор: akaGM
Дата сообщения: 28.01.2007 18:24
ну ты ж обнаружил точку возникновения левого значения, что ж здесь-то за проблема, что её не словить?

Страницы: 123456789101112131415161718192021

Предыдущая тема: Относительное перемещение мыши


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.