Создание таблицы в Fortran 77 - PullRequest
2 голосов
/ 25 апреля 2011

Позвольте мне предвосхитить мой вопрос, сказав, что я совершенно не квалифицирован, чтобы работать в Фортране 77, но, увы, вот я и учусь тому, что могу.

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

   WRITE(LOUT,1) "Standoff(cm)", "Density(g/cm3)", 
 +  "HeatReleaseRate(erg/cm3/s)","Temperature(K)",
 +  KSYM(1),KSYM(2),KSYM(3),KSYM(4),KSYM(5),KSYM(6),KSYM(7),
 +  KSYM(8),KSYM(9),KSYM(10),KSYM(11),KSYM(12),KSYM(13),KSYM(14),
 +  KSYM(15),KSYM(16),KSYM(17),KSYM(18),KSYM(19),KSYM(20),
 +  KSYM(21),KSYM(22),KSYM(23),KSYM(24),KSYM(25),KSYM(26),
 +  KSYM(27),KSYM(28),KSYM(29),KSYM(30),KSYM(31),KSYM(32),
 +  KSYM(33)

, а затем в цикле для каждого интервала отклонения

    WRITE(LOUT,6) X(J),F(J),HR(J),(SN(N,J), N=1,NATJ-1)

И вот форматы:

 1     FORMAT(A16,3X,A16,3X,A30,3X,A16,3X,80(A16,3X))
 2     FORMAT(I10)
 3     FORMAT(3(I10,3X))
 4     FORMAT(3(E17.7,3X))
 5     FORMAT(80(E17.7,3X))
 6     FORMAT(F17.7,3X,F17.7,3X,F20.7,3X,80(E15.5,3X))

Моя проблема в том, что данные выходят так, что метки в первой строке и соответствующие им столбцы не остаются выровненными после первых нескольких столбцов, что затрудняет чтение и манипулирование.

Два возможных решения, которые я могу придумать: 1. было бы либо использовать дескриптор формата «T» для создания абсолютных столбцов 2. игнорировать проблему немедленной читаемости, вставлять запятые или запятые после каждой записи, а затем открывать в Excel какфайл .CSV

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

РЕДАКТИРОВАТЬ:

Чтобы проверить идею 2, я добавил ",", между каждой еntry.

       WRITE(LOUT,*) 'Name',KSYM(1),';',KSYM(2),';',KSYM(3),';',
 +  KSYM(4),';',KSYM(5),';',KSYM(6),';',KSYM(7),';',KSYM(8),';',
 +  KSYM(9),';',KSYM(10),';',KSYM(11),';',KSYM(12),';',
 +  KSYM(13),';',KSYM(14),';',KSYM(15),';',KSYM(16),';',
 +  KSYM(17),';',KSYM(18),';',KSYM(19),';',KSYM(20),';',
 +  KSYM(21),';',KSYM(22),';',KSYM(23),';',KSYM(24),';',
 +  KSYM(25),';',KSYM(26),';',KSYM(27),';',KSYM(28),';',
 +  KSYM(29),';',KSYM(30),';',KSYM(31),';',KSYM(32),';',
 +  KSYM(33)

Но те же синтаксические ошибки, что и раньше.Я использую специальный компилятор pgf77, если это имеет какое-либо значение.

Ответы [ 2 ]

1 голос
/ 26 апреля 2011

Основная проблема в том, что ширина вашего поля в форматах 1 и 6 различна.В формате 1 у вас есть интервалы 3X и строки (метки) длиной 16. Кроме одного A30.В формате 6, используемом для значений, у вас есть пробелы 3 и поля для числового элемента различной длины, например 17, 20 или 15. Если вы сделаете каждый элемент числового формата 16 длинным, кроме 3-го элемента, то вседолжны выстроиться в линию.

Первую запись было бы намного легче прочитать, заменив 33 отдельно проиндексированных значения массива неявным циклом do: (ksym (i), i = 1,33).Можно также использовать функции массива вместо того, чтобы писать все это!

0 голосов
/ 25 апреля 2011

Операторы формата в значительной степени несовместимы с выводом переменной ширины, таким как CSV.Вместо этого просто используйте вывод по списку:

    write (LOUT,*) 'Standoff(cm), Density(g/cm3), HeatReleaseRate(erg/cm3/s), Temperature(K)'

    do 101 i=1,n
    write (LOUT,*) X(J), ',', F(J), ',', HR(J), ',', (SN(N,J), ',', N=1,NATJ-1)
101 continue

(не проверено)

...