Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [General] fortran -> delphi, сложности перевода 
:(
    Опции темы
ведмежатко
Дата 4.6.2009, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.6.2009

Репутация: нет
Всего: нет



товарищи, помогите советом!
ситуация такая: надо перевести код фортрана в дельфи. Почти всё готово, осталась одна процедура с использованием EXTERNAL. я фортран вижу впервые и не могу разобраться в сути выделенных строк. Подскажите, как это должно в дельфях примерно выглядеть

Код

program fvmfd
implicit none
REAL H0,F,F1,F2,Ff1(3),Ff2(3),i1,i2,i3,i4,k0,EF,W
complex MP1,KM1,KA1,k
real*8 Lmin,L

INTEGER  i,znak,N,y1,y2,fi,Lf,H0i

complex*8,allocatable,dimension(:,:)::AA
complex*8,allocatable,dimension(:)::EVAL
real*8,allocatable,dimension(:)::Lpr,Lob,Vot 
real*8,allocatable,dimension(:)::FF,L1

real*8 d,pi,delta,t1,t2,t3
PARAMETER (pi=3.1415926535)
character cmdchar*5,cmdchar1*5,cmdchar2*5,cmdchar3*5
integer varianty
common /mycom/cmdchar
common /myc/H0

EXTERNAL EVLCG

N=100
W=70e-3
allocate(AA(N,N))
allocate(eval(N))
allocate(L1(N))
do varianty=1,3
VARIANT: select case (varianty)
       
case (1)
    cmdchar1='40CH2'
    cmdchar2='40CH2'
    cmdchar3='40CH2'
    t1=0.1
    t2=0.2
    t3=0.2
case (2)
    cmdchar1='30CH6'
    cmdchar2='30CH6'
    cmdchar3='30CH6'
    t1=0.35
    t2=0.0
    t3=0.15
case (3)
    cmdchar1='10CH6'
    cmdchar2='10CH6'
    cmdchar3='10CH6'
    t1=0.2
    t2=0.15
    t3=0.15

end select VARIANT

H0i=0
do H0=16,28,6

H0i=H0i+1
cmdchar=cmdchar1
call diapason(Ff1(1),Ff2(1))
cmdchar=cmdchar2
call diapason(Ff1(2),Ff2(2))
cmdchar=cmdchar3
call diapason(Ff1(3),Ff2(3))
F1=maxval(Ff1)
F2=minval(Ff2)

print *,F1,F2,H0
fi=0
    do F=F1,F2,0.1
    fi=fi+1
    end do
    
    allocate(Lpr(fi))
    allocate(Lob(fi))
!    allocate(Vot(fi))
    allocate(FF(fi))

Lf=0
do F=F1,F2,0.1
        Lf=Lf+1
        FF(Lf)=F
        do znak=-1,1,2
            CALL MATRIX(W,N,F,znak,cmdchar1,cmdchar2,cmdchar3,t1,t2,t3,AA)
            CALL EVLCG (N, AA, N, EVAL)
L=0
Lmin=1000000
!Выбор корня определителя
            do i=1,N
                L=abs(imag((N*sqrt(EVAL(i)))/W))
                L1(i)=abs(imag((N*sqrt(EVAL(i)))/W))            
                if (L.ne.0.and.Lmin>L) then
                    Lmin=L
                else
                    Lmin=Lmin
                end if                
            end do 
            if (znak==-1) then
                Lob(Lf)=8.67*(N/16.6)*Lmin
            else 
                Lpr(Lf)=8.67*Lmin
            end if    
        end do
    end do

OPEN (UNIT=1, FILE='ROOTS1.txt', STATUS='old', FORM='FORMATTED') 
WRITE (1,'(TR5,F5.2)') H0
do Lf=1,fi
WRITE (1,'(F5.3,F20.12,F20.12,F20.12)') FF(Lf),Lpr(Lf),Lob(Lf)
end do    

deallocate(Lpr)
deallocate(Lob)
deallocate(FF)    
end do
    print *,F
end do
END program fvmfd


PM MAIL   Вверх
ведмежатко
Дата 4.6.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.6.2009

Репутация: нет
Всего: нет



и сразу вопрос: что такое allocate / deallocate? я нашел, что это некие функции финамического доступа, но из единственного примера
Код

REAL, DIMENSION(:), ALLOCATABLE  :: x
   :
   Allocate(x(N:M))  ! N и M целые выражения.
   :
   x(j) = q          ! Некое присваивание массива.
        CALL sub(x)       ! Использование массива в подпрограмме.
   :
         DEALLOCATE (x)
 
не понял смысла их применения. я так понял, что в дельфи массив Х из данного примера, можно просто объявить в корне проги и не париться. но это лишь догадка smile 
PM MAIL   Вверх
Фантом
Дата 5.6.2009, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



Цитата(ведмежатко @  4.6.2009,  20:07 Найти цитируемый пост)
я фортран вижу впервые и не могу разобраться в сути выделенных строк. 


Или я что-то не понял, или в этом листинге выделенных строк нет. Напишите их номера или просто приведите тот кусок, который непонятен.


Цитата(ведмежатко @  4.6.2009,  20:28 Найти цитируемый пост)
и сразу вопрос: что такое allocate / deallocate? 


Динамическое размещение массивов. Нужно в том случае, если в момент описания размер массива неизвестен. 
PM   Вверх
ведмежатко
Дата 5.6.2009, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 4.6.2009

Репутация: нет
Всего: нет



странно, вчера я жирным специально выделял. что-то тут с тэгами не так...
строки 21 и 85 интересуют. и возможно, строка 2, я не уверен с ее сутью...

за allocate спасибо!!
PM MAIL   Вверх
Фантом
Дата 5.6.2009, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: 5
Всего: 49



Цитата(ведмежатко @  5.6.2009,  09:32 Найти цитируемый пост)
странно, вчера я жирным специально выделял. что-то тут с тэгами не так...
строки 21 и 85 интересуют. и возможно, строка 2, я не уверен с ее сутью...


Наверное, теги внутри тэга "code" не работают.

2) В Фортране по историческим причинам существует правило определения типа переменной по умолчанию. Если есть необъявленная переменная, имя которой начинается на i,k,l,m,n, то она считается целой, если имя начинается с любой другой буквы - вещественной. Оператор implicit позволяет  изменить эти умолчания, а его вариант implicit none попросту их отключает, заставляя описывать все переменные явно.

21) Это указание компилятору, что процедура EVLCG является внешней. Она описана в другом файле, и цеплять ее к программе надо на стадии линковки (это может быть и часть какой-то библиотеки). В принципе возможно, что она вообще написана не на Фортране.

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

85) А это, соответственно, вызов этой процедуры. Вполне обычный.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.