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

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

Автор: RUSer
Дата сообщения: 28.01.2007 19:10

Цитата:
ну ты ж обнаружил точку возникновения левого значения


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

a(i,j)=a(i,j)+krealax*eps
>>>>> eps=dabs(eps)
if (epsmax.lt.eps) then
epsmax=eps
end if



Цитата:
Вариант

if (deps.lt.0) then
eps=-1.0d0*eps
end if

не работает


мне нужно абсолютное значение eps. Но при взятии модуля или при умножении на -1 возникает степень е+066.

Цитата:
что ж здесь-то за проблема

Почему она возникает - непонятно...
Чем ещё заменить abs() я не придумал...
Автор: Andrew10
Дата сообщения: 28.01.2007 20:19
To RUSer, akaGM

Ребята!

Если вы обсуждаете между собой код, который другие полностью не видят, что мешает обмениваться письмами по e-mail-у или через ПМ?
Автор: RUSer
Дата сообщения: 28.01.2007 20:45
Andrew10
мы уже собственно всё обсудили

мой вопрос постом выше.
Смысл же свёлся к тому, что неправильно работает abs(). И почему это происходит.

З.Ы. Если у кого есть желание помочь - я же не против А обсуждаем здесь из-за того, что может у кого возникнут какие новые идеи.
Автор: akaGM
Дата сообщения: 28.01.2007 21:34
RUSer
Цитата:
что неправильно работает abs()

да не может такого быть...
считаю, что это наведённая ошибка, смотри что-то раньше...
Автор: RUSer
Дата сообщения: 28.01.2007 21:44
akaGM

Цитата:
смотри что-то раньше...

до { eps=abs(eps) } eps= числу в степени е-007. После выполнения - е+066.
То же и с условием: когда меньше нуля - умножить на -1.

В уравнениях выше всё присваивается правильно, т.е. в а0, а(i,j) и т.д. всё работает. Но из-за этой е+066 ошибка, естественно, возникает на следующей итерации цикла, где отслеживается и выполнение программы останавливается по переполнению.
Автор: akaGM
Дата сообщения: 28.01.2007 22:01
у тебя в коде действительно стоит abs, напиши dabs
Автор: RUSer
Дата сообщения: 28.01.2007 22:20
akaGM
это уже по второму кругу. я делал так - не помогало.
а при default real kind=8 вообще выскакивает

Цитата:
Unhandled exception at 0x00498979 in kstat.exe: 0xC0000005: Access violation writing location 0x00000000.
в модуле crt0.c
Автор: akaGM
Дата сообщения: 28.01.2007 22:32
да не надо полагаться на дефолты! всё ручками...
Автор: RUSer
Дата сообщения: 28.01.2007 22:38
ты же смотрел мой исправленный файл?
там я везде поставил d0, где ты говорил. А
Цитата:
default real kind=8
это уже потом было, я просто не отключал. и пробовал dabs() с разными настройками.
Автор: Igorr
Дата сообщения: 29.01.2007 01:16
RUSer
Цитата:
до { eps=abs(eps) } eps= числу в степени е-007. После выполнения - е+066.
если eps объявлено как REAL*8 - ничего удивительного для eps < 0: перед выполнением abs только правая (скорее всего) часть (4 байта) eps передаются abs для выполнения. Тем самым отбрасывается знак "-" 8-байтного числа и, как результат, можете иметь огромное положительное 4-байтное число.
Автор: Andrew10
Дата сообщения: 29.01.2007 10:52

Цитата:
до { eps=abs(eps) } eps= числу в степени е-007. После выполнения - е+066.
если eps объявлено как REAL*8 - ничего удивительного для eps < 0: перед выполнением abs только правая (скорее всего) часть (4 байта) eps передаются abs для выполнения. Тем самым отбрасывается знак "-" 8-байтного числа и, как результат, можете иметь огромное положительное 4-байтное число.


Привет!

ABS - родовое имя команды для вычисления абсолютного значения. Если eps объявлено как real*8, то компилятор подставит в этом месте вызов dabs(eps) и ничего обрезать не будет.
Так что дело не в этом.

Без кода судить трудно, но в моей практике числе типа e+66 появлялись в трех случаях:

1. Использование ранее не инициализированной переменной. В современных компиляторах выдается предупреждение об этом
2. Обращение к элементу массива, чьи индексы выходят за границы ранее объявленных пределов массива. То же самое, компилятор должен выдать предупреждение.
3. Неустойчивость используемого численного алгоритма, так что большие числа просто отражение этой неустойчивости.
Автор: RUSer
Дата сообщения: 29.01.2007 18:34
Andrew10

Цитата:
1. Использование ранее не инициализированной переменной.

такого нет

Цитата:
2. Обращение к элементу массива, чьи индексы выходят за границы ранее объявленных пределов массива.

предупреждений не было, но на всякий случай добавил 100 ячеек в каждую матрицу (...+10,...+10) - не помогло

Цитата:
3. Неустойчивость используемого численного алгоритма, так что большие числа просто отражение этой неустойчивости.

поясни, пожалуйста. свою мысль. Что ты понимаешь под неустойчивостью алгоритма и как это связать с проблемой работы программы в режиме отладки и её нормальной работе при компиляции релизом?
Автор: Andrew10
Дата сообщения: 30.01.2007 14:17
To RUSer

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

Странно, что то, о чем ты пишешь, происходит в режиме отладки, а в режиме Release этого нет. Более понятно было бы, если бы было наоборот.
Может быть в режиме Debug у тебя включена оптимизация? Проверь, и если это так. то выключи. Еще полезно посмотреть, что выдает на консоль отладочная печать. Вставь непосредственно до и после строки eps = abs(eps) печать eps:

write(*,*) 'eps befor = ', eps
eps=abs(eps)
write(*,*) 'eps after = ', eps
Автор: RUSer
Дата сообщения: 30.01.2007 19:38
Andrew10

Цитата:
Может быть в режиме Debug у тебя включена оптимизация?

Нет. Она включена в режиме Release.

Щас ещё раз засяду за код, может пропустил чего где...
Автор: KChernov
Дата сообщения: 31.01.2007 13:24
RUSer

Цитата:
1. Использование ранее не инициализированной переменной.
такого нет

implicit none используется?


Цитата:
2. Обращение к элементу массива, чьи индексы выходят за границы ранее объявленных пределов массива.
предупреждений не было, но на всякий случай добавил 100 ячеек в каждую матрицу (...+10,...+10) - не помогло

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


Цитата:
ак это связать с проблемой работы программы в режиме отладки и её нормальной работе при компиляции релизом?

Если все так просто - кто мешает включать/выключать по одной опции дебаг-режима в релизном и отследить, когда перестанет работать?

Насчет использования функций, в именах которых явно указан тип - так лучше вообще не делать.
Лучше всего управлять размерностью типов на уровне проекта и не использовать dimension вообще. Тогда нужные функции будут использоваться сами.
Автор: recvezitor
Дата сообщения: 18.02.2007 12:35
Не подскажете можно как нибудь вставить в Visual Studio 2005 компилятор Intel Fotran 8.047. В 2002 студию все ставилось если не менять папки по умолчанию. Или может покажете ссылочку с бесплатным компилятором фортрана встраивающегося в 2005ю студию. А то поккупать что то не очень хочется
Автор: Dust
Дата сообщения: 18.02.2007 14:04
recvezitor

Цитата:
8.047

Возьми фортран посвежее.... Где 8.0 а где VS 2005...
Автор: recvezitor
Дата сообщения: 18.02.2007 15:17
ссылочку можно? А то я все что находил (а находил IntelFortran 9.0-9.1) все платное. Или может других производителей. Главное чтобы БЕСПЛАТНО, встраивалось в 2005ю Студию и желательно поновей (и таблеток от жадности).
И раз уж я здесь, то вопрос. Неужели Фортран жив и конкурентноспособен?
Автор: akaGM
Дата сообщения: 18.02.2007 16:08

Цитата:
Неужели Фортран жив и конкурентноспособен?

не, давным-давно дохл (последний стандарт всего лишь в 2003 г. принимали) и совсем неконкурентен...

http://forum.ru-board.com/topic.cgi?forum=33&topic=7860#1
Автор: XPEHOMETP
Дата сообщения: 18.02.2007 20:56
recvezitor

Цитата:
Или может других производителей. Главное чтобы БЕСПЛАТНО, встраивалось в 2005ю Студию и желательно поновей (и таблеток от жадности).

За таблетками - это в раздел "Варезник". Если бесплатно, для 2005 студии и других производителей - это Salford FTN95. С официального сайта можно скачать бесплатный вариант - Personal Edition, который вполне функционален (даже глюки те же, что в платной версии):

http://www.silverfrost.com/11/ftn95/overview.asp
http://www.silverfrost.com/32/ftn95/ftn95_personal_edition.asp

Персональный FTN95 может использоваться только в сугубо некоммерческих целях, но зато сколько угодно долго. Поддержки нет, но при желании можно в любой момент проапгрейдиться, скачав новую версию. Сейчас доступна версия 5.01, скачать можно здесь:

http://www.download.com/Silverfrost-FTN95/3000-2069-10491439.html?part=dl-Silverfro&subj=uo&tag=button

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

http://forums.silverfrost.com/index.php

Еще там есть специальная библиотека ClearWin+, которая позволяет делать GUI к фортрановским прогам. То есть простенькое окошко с парой кнопок действительно сделать легко, но что-нибудь более сложное... Мать-мать-мать! Ну и кроме того функциональность этой библиотеки весьма и весьма ограничена по сравнению с прямым программированием на Win API, причем использовать возможности Win API, не заложенные в этой библиотеке, она просто не дает.

Я возился с этим компилятором, возился... Надоел он мне, и я на него плюнул окончательно. Но, может, у кого-нибудь другое мнение о нем будет?
Автор: akaGM
Дата сообщения: 19.02.2007 16:26
recvezitor
насколько я знаю, в VS встраивается только линейка ms/dec/compaq/intel,
ещё lahey, все они коммерческие...
из бесплатных под вынь32 есть только g77/g90 (без среды) и watcom (со своей средой)
всё...
Автор: XPEHOMETP
Дата сообщения: 19.02.2007 20:11
Не, Salford FTN95 реально бесплатен (при некоммерческом использовании) и, начиная с 5-й версии, интегрируется в Visual Studio 2005. До этого встраивался в VS 2003. Но можно работать с его собственным IDE Plato, поставляется в комплекте. Но оно глючное (по крайней мере, было). Можно и из-под командной строки запускать.

И в Visual Studio 2005 встраивается еще PGI Fortran (от "The Portland Group STMicroelectronics, Inc."). Тоже коммерческий.
Автор: Igorr
Дата сообщения: 20.02.2007 05:50
recvezitor
Цитата:
Не подскажете можно как нибудь вставить в Visual Studio 2005 компилятор Intel Fotran 8.047. В 2002 студию все ставилось если не менять папки по умолчанию. Или может покажете ссылочку с бесплатным компилятором фортрана встраивающегося в 2005ю студию.

Можно ли чуть по-подробнее о причине такого желания/необходимости вставки фортрановского компилятора в VS? Имеется ли ввиду линкование в один *.exe/dll/lib файл объектных файлов VS и фортрана? Если нет, то и такой необходимости нет.
Автор: dima333a
Дата сообщения: 20.02.2007 06:27
Igorr

Что я знаю наверняка что там происходит, но новые версии Intel Fortran нехотят работать без новой Visual Studio.
Автор: XPEHOMETP
Дата сообщения: 20.02.2007 08:56
Я не знаю как новые, у меня была 7-я, соглашалась на установку без Visual Studio, но работать можно было только с командной строки. Также он соглашался на установку в Visual Studio 7 с установленным туда Compaq Visual Fortran.
Автор: recvezitor
Дата сообщения: 21.02.2007 04:30
"о причине такого желания/необходимости вставки фортрановского компилятора в VS?" - особенной потребности конечно нету. Можно естественно и в 2002 студие работать, но просто хочется самое новенькое. Мне просто 2005 студия нравится(дизайном), но нужно на фортране кодить... Хотя на самом деле мне больше всего понравился С#.
Я решил что проще будет найти 9й фортран интеловский. Надеюсь он в 2005 студию вставится...
И еще... Не покажете ли мне простенький код как вызвать из C# функцию из dll-ки написанную на фортране? К примеру в фортране есть функция, которая принимает два целых и выдает их сумму.
Автор: dima333a
Дата сообщения: 21.02.2007 06:15
XPEHOMETP

Цитата:
Я не знаю как новые, у меня была 7-я, соглашалась на установку без Visual Studio, но работать можно было только с командной строки. Также он соглашался на установку в Visual Studio 7 с установленным туда Compaq Visual Fortran.


Седьмая версия и у меня стоит. Хотел поставить 8-ю, и попал в облом. Мотивирование было связанно с тем что новая версия Intel Fortran требует линкер от VS. (требовало как минимум VS.net). T.k. у меня место на лаптопном хардрайве очень ограниченно, то я остался с CVF6.6. В принципе я отлаживаю все на лаптопе, под CVF. А потом компилирую на кластере уже под Linux. Там стоит Intel Fortran v8.х Все довольны.
Автор: Igorr
Дата сообщения: 21.02.2007 06:23
recvezitor
С C# я не использовал фортран. Если только начинаете, то будет полезно ознакомиться с help-ом в фортране (как Intel, так и Compaq):
Tab: Index
Type in the keyword to find: : Mixed-language
Автор: recvezitor
Дата сообщения: 21.02.2007 09:03
да не с фортраном то я знаком и с С# тоже. Просто у меня есть примеры как связать С++ и фортран , есть примеры как связать С++ и С#. А как связать фортран и С#...
А еще воросик... Можно в Фортране как нибудь переменную символьного типа, чтобы потом на этапе выполнения программы задавать ее длину. Чтонибудь типа
character(len=*)::a
allocate(a(10))
А то меня бесят строки с кучей пробелов в конце

Добавлено:
Вот я что еще хотел спросить. Читая эту ветку, я натолкнулся на упоминание МКР - метод конечных разностей. Здесь кто то этим серьезно занимается? Или может быть кто то занимается МКЭ - методом конечных элементов? И вообще в нашей стране этим занимаются? Или мы опять в отстое???
Автор: XPEHOMETP
Дата сообщения: 21.02.2007 13:36
На счет связывания фортрана и С# не знаю, но в Salford FTN95 есть такая штука: Visual ClearWin. Состоит она в том, что GUI делается на Java#, а расчетная часть на фортране. И там это дело рассматривается в справке: managed code, как использовать .NET-массивы и прочее. Я это юзать не пытался, сказать ничего не могу.

Страницы: 123456789101112131415161718192021

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


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