Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с Intel Fortran через Visual Studio 2003 и не только

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Открыть новую тему     Написать ответ в эту тему

RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
придётся поменять _везде_
типа
 
Код:
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)?

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 17:10 27-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

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

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

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

да запросто! делишь, например, на сингловую где-нибудь...
скорее не переполнение, а потеря точности...
 
вообще, сравнение дабла с 1 -- некорректное,
надо писать (epsmax .gt. 1.0d0), говорил же уже...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 18:48 27-01-2007 | Исправлено: akaGM, 19:04 27-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
После 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
 
не работает

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 20:47 27-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
хм...
подскажу...
если ты мне подскажешь что такое 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
------------------^

и ваще...
ты всё-таки борешься со следствием, а не с причиной...
пока "низачот"

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 21:14 27-01-2007 | Исправлено: akaGM, 21:28 27-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

 
Я просто в параметрах по-умолчанию выбрал 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.
 

Нету их.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 21:38 27-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

ну нет у меня deps, ни переменной, ни её использования,  вообще нет в коде...
 
тогда шли новый...
 
ну компильни с /check:bounds свой релиз мож здесь что...
а вообще, если в дебаге возникли такие числа то ту же это надо рыть...
не понимаю...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 22:53 27-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
ссылка: http://ifolder.ru/980477
Пароль тот же
 
Я кретин! Теперь понятно, зачем рекомендуют отдыхать каждые два часа от компа.... Я когда менял abs, sin и т.д. на dabs, dsin, менял их диалогом замены всех найденных... И eps в том числе попало... Удачно, что сменились все eps на deps.  
 
З.Ы. в линке уже с eps.
 
З.З.Ы. /check:bounds ничего не дало.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 23:39 27-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
попробуй ещё поменять описание без дименсиона
с

Код:
 
! 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
 

на

Код:
 
 real*8 hx,hy,a,bx,by,m,tablfar
 ALLOCATABLE :: hx(:,:),hy(:,:),a(:,:),bx(:,:),by(:,:),m(:,:),tablfar(:,:)
 real*8 tok(:),hxpov(:),bxpov(:),Wa(:),Wb(:),Wc(:),Ww(:)
 ALLOCATABLE :: tok,hxpov,bxpov,Wa,Wb,Wc,Ww
 real*8 fazaa(:),fazab(:),fazac(:),byp(:),xout(:),m0gamv(:)
 ALLOCATABLE :: fazaa,fazab,fazac,byp,xout,m0gamv
 real*8 v(:),dx(:),dxquad(:),dx2(:),ddxy(:),ddxy2(:),ddxy4(:)
 ALLOCATABLE :: v,dx,dxquad,dx2,ddxy,ddxy2,ddxy4
 real*8 gamv(:),hxtorque(:),bytorque(:)
 ALLOCATABLE :: gamv,hxtorque,bytorque
 

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

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 13:58 28-01-2007 | Исправлено: akaGM, 14:03 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
та же дурь
 
пробовал ставить Defaul REAL KIND=16 и интежер на 8 - просто отказалась работать.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 14:39 28-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ну ты ж обнаружил точку возникновения левого значения, что ж здесь-то за проблема, что её не словить?

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 19:24 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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


Цитата:
я нашёл, где впервые появляется эта 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() я не придумал...

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 20:10 28-01-2007
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
To RUSer, akaGM
 
Ребята!
 
Если вы обсуждаете между собой код, который другие полностью не видят, что мешает обмениваться письмами по e-mail-у или через ПМ?

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 21:19 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10
мы уже собственно всё обсудили
 
мой вопрос постом выше.  
Смысл же свёлся к тому, что неправильно работает abs(). И почему это происходит.
 
З.Ы. Если у кого есть желание помочь - я же не против А обсуждаем здесь из-за того, что может у кого возникнут какие новые идеи.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 21:45 28-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RUSer
Цитата:
что неправильно работает abs()

да не может такого быть...
считаю, что это наведённая ошибка, смотри что-то раньше...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 22:34 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

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

до { eps=abs(eps) } eps= числу в степени е-007. После выполнения - е+066.  
То же и с условием: когда меньше нуля - умножить на -1.
 
В уравнениях выше всё присваивается правильно, т.е. в а0, а(i,j) и т.д. всё работает. Но из-за этой е+066 ошибка, естественно, возникает на следующей итерации цикла, где отслеживается и выполнение программы останавливается по переполнению.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 22:44 28-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у тебя в коде действительно стоит abs, напиши dabs

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 23:01 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
это уже по второму кругу. я делал так - не помогало.
а при default real kind=8 вообще выскакивает

Цитата:
Unhandled exception at 0x00498979 in kstat.exe: 0xC0000005: Access violation writing location 0x00000000.
в модуле crt0.c

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 23:20 28-01-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да не надо полагаться на дефолты! всё ручками...

Всего записей: 24120 | Зарегистр. 06-12-2002 | Отправлено: 23:32 28-01-2007
RUSer



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ты же смотрел мой исправленный файл?
там я везде поставил d0, где ты говорил. А
Цитата:
default real kind=8  
это уже потом было, я просто не отключал. и пробовал dabs() с разными настройками.

Всего записей: 390 | Зарегистр. 24-08-2004 | Отправлено: 23:38 28-01-2007
Igorr

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

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 02:16 29-01-2007 | Исправлено: Igorr, 03:25 29-01-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Работа с Intel Fortran через Visual Studio 2003 и не только


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru