Создание таблицы в Fortran 77

#fortran #format #tabular

#fortran #форматирование #табличный

Вопрос:

Позвольте мне предварить свой вопрос, сказав, что я совершенно неквалифицирован для работы в Fortran 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, я добавил «,», между каждой записью.

        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, если это имеет какое-либо значение.

Комментарии:

1. Если вы используете источник с фиксированной формой, попробуйте добавить переключатель -Mextend (это позволит увеличить длину строки до 128 символов). Если ваши строки длиннее предела фиксированной формы, это может быть причиной странных синтаксических ошибок.

Ответ №1:

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

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

Ответ №2:

Инструкции Format в значительной степени несовместимы с выводом переменной ширины, таким как 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
  

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

Комментарии:

1. В чем разница между ‘ и»?

2. Вероятно, нет. Традиционно FORTRAN писался с помощью ‘ для разграничения строк.

3. Обновил мой вопрос с учетом моего прогресса.

4. На самом деле, я думаю, что стандарт F77 предписывал использование одинарных кавычек. Но все это было так давно и далеко…..

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