Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > Аргументы командной строки


Автор: VKlim 25.9.2013, 13:47
Добрый день, уважаемые Фортран-программисты! Столкнулся со следующей задачей: необходимо автоматизировать запуск программы на фортране (f90) с помощью скрипта, изменяя параметры вызова с помощью аргументов командной строки. Сама фортрановская программа должна была быть чёрным ящиком, в код которой не нужно заглядывать, т.к. автор давно уже неизвестно где. Но, как оказалось, программа устроена так, что требуется:
1. Запуск программы из консоли
2. Нажатие Enter
3. Ввод параметров (4 штуки через пробел)
4. Нажатие Enter

Для автоматического скрипта это неприемлемо, да и неудобно. Поэтому прошу, переделайте, пожалуйста, участок кода, отвечающий за это. Прошу не тыкать мануалами и учебниками, все варианты, которые в нете просмотрел (а их, на удивление, немного), по тем или иным причинам (далеко не всегда понятным), не подошли. Изучать синтаксис, какие-то функции и прочее фортрановское не хочется, да и времени на это нет, т.к. программа исключительно вспомогательная, но необходимая для одной конкретной задачи.

Код

module param
    real*8 hr,hz,hr2,hrinv,hzinv,hrsq,hzsq,ht,ht2,r1,zl,eps,j0,d,rst,sigd0,siga0,hd,h,my
    real*8 zsig,rsig,betsr,betsz,tend,phi0,rs,betc,cf,sum0,sum1
    real*8,allocatable :: rstfl(:),zfl(:),zstfl(:),j0fl(:),gam(:),bet(:)
            integer nr,nz,nr1,nz1,itend,npr,nrzmax,nst,nq
        
            contains 
            subroutine rnd()
    character  (50) filename
    open(99,file='param.dat')
    open(101,file='param1.dat')

          read(99,*,iostat=ios)eps,r1,nr,zl,nz,ht,tend,siga0,hd,h,my,zsig,rsig,betsr, &
        betsz,cf,nq,phi0,rs,betc
            close(99)
                allocate (rstfl(nq),zfl(nq),zstfl(nq),j0fl(nq),gam(nq),bet(nq))    
            
    
    do il=1,nq
  read(101,*,iostat=ios)rstfl(il),j0fl(il),gam(il),bet(il)
  enddo
  
 
    
  
  close(101)

! Как я понимаю, это именно оно и это именно те параметры
    read *,sigd0,zstfl(1),zfl(1),filename    
    
    
    open(77,file=filename)
            hr=r1/float(nr)
            hz=zl/float(nz)
            hrinv=1.d0/(hr)
            hzinv=1.d0/(hz)
        ht2=ht*0.5d0
            nr1=nr+1
            nz1=nz+1
            
    

             endsubroutine rnd
                 endmodule


Спасибо!

Автор: FCM 26.9.2013, 09:21
Исходник приведен ли полностью?
Если полностью, то по нему нельзя построить exe-файл, так что нет смысла вызывать из командной строки.
Еще непонятно open(77,...) для чего.

В любом случае можно попробовать, например,
переделать ввод с клавиватуры на ввод из файла:
Код

subroutine rnd()
...
   open(109, file='input.txt', &
       action = 'read',status = 'old',form = 'formatted', access = 'sequential')
...
   read(109,*) sigd0, zstfl(1), zfl(1), filename
   close(109)
...

где input.txt должен содержать соответствующие данные

Автор: VKlim 26.9.2013, 14:06
Цитата(FCM @  26.9.2013,  09:21 Найти цитируемый пост)
Исходник приведен ли полностью?Если полностью, то по нему нельзя построить exe-файл, так что нет смысла вызывать из командной строки.

Нет, это только одна часть, описывающая модуль param. Он 100% рабочий, компилируется и запускается. Я просто не стал приводить весь код, т.к. решил, что нет в этом смысла.

Цитата(FCM @  26.9.2013,  09:21 Найти цитируемый пост)
В любом случае можно попробовать, например,переделать ввод с клавиватуры на ввод из файла:

Ввод из файла так же не подходит, т.к. параметры очередного запуска выбираются после анализа полученных результатов fortran-программы. Поэтому, значит, нужно писать отдельную программу, которая будет делать этот анализ, генерировать новые значения параметров, писать их в файл, из которого fortran уже будет читать... Столько лишних телодвижений. Но за предложение спасибо

Автор: FCM 26.9.2013, 15:22
Если процесс выбора новых параметров может быть автоматизирован, то можно переделать фортран-программу, так чтобы она представляла собой не программу, а процедуру, которую скомпилировать в статбиблиотеку. ВВодимые с клавиатуры параметры можно сделать параметрами этой процедуры. Стат библиотеку можно вызывать из С++ программы (с совместимым форматом объектных файлов). 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)