2016-06-21 3 views
0

У меня есть определенный фрагмент кода в fortran. Код принимает «pq» как вход пользователя и является единственной точкой. Вместо этого я хочу прочитать набор точек «pq» из файла point.txt и запустить его для такого количества точек вместо одного входа пользователя. Является ли это возможным? Код выглядит следующим образом:Вызвать подпрограмму для списка точек вместо одной точки

program prop 

     use module 

     implicit none 

     character(len=80) :: ErrorMsg 
     character(2)   :: xy 
     real(8)    :: Conc(20) = 0.d0 
     character(len=20)  :: fn, fl 
     real(8)    :: Mmolar, Tcritical, Pcritical, Tmininimum, Tmaximum, x, y 

call Init_module() 

    write(*,*) 'Insert the gas name:' 
    read(*,*) fn 
    write(*,*) 'Insert the gas library:' 
    read(*,*) fl 


    write(*,*) 'Insert the copule pq:' 
    read(*,*) pq 
    write(*,*) 'Insert the value of ', pq(1:1) 
    read(*,*) x 
    write(*,*) 'Insert the value of ', pq(2:2) 
    read(*,*) y 

write(*,*) 'Pres  = ', Pres(pq, x, y, ErrorMsg) 
    write(*,*) 'Temp = ', Temperature(pq, x, y, ErrorMsg) 

call ReleaseObjects() 

end program prop 

Вместо чтения рд в качестве единственной точки х, у от пользователя в приведенном выше коде, я хочу прочитать множество точек из file.txt, например, 50 баллов и затем выполните подпрограммы Pres и Temperature. Каждая строка файла содержит одну точку x, y и x и y в каждой строке разделены несколькими пробелами. Первые несколько строк file.txt являются:

Ts 
500 
0.04781564 159.81587875 
0.20396084 165.46398084 
0.08159885 166.81382894 
0.03879184 164.17497877 
0.12585959 165.37000305 
0.09895530 165.95997769 
0.10389518 170.74235496 

Следует отметить, что длина и знак плавающих чисел может варьироваться. Файл file.txt изначально написан через python с форматированием для x, y - '%-12.8f %-12.8f\n'%. У меня есть следующий код, чтобы попытаться прочитать файл, но я не в состоянии прочитать с 3-й линии и далее:

real, allocatable  :: x(:),y(:) 
     integer :: np 

     open(12,file=trim('file.txt'),status='old', & 
      access='sequential', form='formatted', action='read') 

      read(12,*)pq 
      write(*,*)'pq:', pq 

      read(12,*)np 
      write(*,*)'number of points:',np 

      allocate (x(np)) 
      allocate (y(np)) 
      do i=1,np   
      read(12,*)x(i),y(i) 
      write(*,*)x(i),y(i) 
      enddo 
+0

Возможно, вы знаете, что они называют петлями и массивами на современных языках программирования. Это ваши друзья для такого рода вещей. Но между тем 'module' является ключевым словом в fortran 90 и выше, поэтому вы не хотите называть свой собственный модульный модуль. – innoSPG

+1

@innoSPG должным образом. Однако я знаком с массивами и циклами, был просто неуверен, как реализовать их для fortran, я новичок в fortran. Спасибо за информацию. – Aspro

ответ

0

Вместо того, чтобы использовать READ заявление с звездочкой (*) в качестве первого аргумента просят для пользователя введите, используйте идентификатор файла. Вы должны OPEN файл, содержащий множество точек, предполагая, что это является ASCII:

OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old') 

Я думаю, что аргументы этой команды вполне понятно. Затем предполагается, что ваш файл содержит несколько строк с х и у значений, вы можете прочитать каждую строку файла, выполнив:

READ(10,*) x,y 

Если у вас есть несколько точек, чтобы прочитать, просто использовать DO, если вы знаете номер пункты для чтения, в противном случае - DO WHILE. Для того, чтобы взять пример с 50 очками, что-то, как это должно работать:

OPEN(UNIT=10,FILE=file.txt,ACTION='read',STATUS='old') ! Open file 
DO i=1,50 
    READ(10,*) x,y 
    write(*,*) 'Pres  = ', Pres(pq, x, y, ErrorMsg) 
    write(*,*) 'Temp = ', Temperature(pq, x, y, ErrorMsg) 
END DO 
CLOSE(10) ! Close file 

EDIT

Ваше предложение почти правильно. Вы забыли объявить pq как character(len=2). Из-за этого вы не должны были пропускать линию 1. Как я уже сказал, есть разделитель пространства, который, естественно, обрабатывается звездочкой в ​​виде формата. В любом случае, если вы хотите точно соответствовать формату, используйте то же, с которым вы написали свои данные. Читают формат Python, я предполагаю, что вы написали два поплавка с космическим сепараторе, и в самом деле, если посчитать количество символов ваших цифр:

0.04781564 159.81587875 
^^^^^^^^^^^^|^^^^^^^^^^^^ 
1   12|1   12 
      | 
      space 

, который дает следующий формат в Fortran:

read(12,'(f12.8,1X,f12.8)') x(i),y(i) 

X означает разделитель пространства в форматах Fortran.

Тогда вы можете написать вам данные на экране в том же формате, чтобы проверить:

write(*,'(f12.8,1X,f12.8)') x(i),y(i) 

Это дает:

pq:Ts 
number of points:   500 
0.04781564 159.81587219 
0.20396084 165.46397400 
0.08159885 166.81382751 
0.03879184 164.17497253 
0.12585959 165.37001038 
0.09895530 165.95997620 
0.10389518 170.74235535 

Вы, возможно, заметили, что вы потеряли точность на последних цифр. Это потому, что вы объявили простой реальный (4 байта). Переключите real до 8 байт с real(kind=8) или real*8 в соответствии с вашим компилятором (быть в курсе, не правильный способ сделать это, не портативный, но достаточно в вашем случае)

Не забудьте закрыть файл, когда вы закончите дело с ним:

close(12) 
+0

Кроме того, используйте спецификатор 'newunit', если вам посчастливилось получить доступ к компилятору Fortran (2008+). – jlokimlin

+0

@ Кориолис Точки в файле - это форматирование пространства вместо запятой, что мне делать в этом случае? – Aspro

+0

@Aspro Вторая звездочка в инструкции 'read' позволяет вам определить формат. Когда используется звездочка, программа считывает ваши данные «по своему усмотрению», на самом деле этого должно быть достаточно для обработки разделителя пробелов. Если вы хотите быть уверенным, как ваши данные будут прочитаны, вы должны определить формат. Я предлагаю вам прочитать учебник об этом, он слишком сложный для определения здесь. – Coriolis

Смежные вопросы