Извлечение значений из файла .dat с помощью fortran, со строками и специфическими переменными - PullRequest
0 голосов
/ 16 июня 2019

Мне нужно принять значения NPNOD, NELEM и других.и принять значения следующей матрицы

    $DIMENSIONES DEL PROBLEMA
    DIMENSIONES :  NPNOD= 27 ,      NELEM= 8 ,     NMATS= 1 ,     \
               NNODE= 8 ,      NDIME= 3 ,                         \ 
               NCARG= 1 , NGDLN= 3, NPROP= 5, \
               NGAUS= 1 , NTIPO= 1 , IWRIT= 1 ,\
               INDSO= 10 , NPRES= 9
    $---------------------------------------------------------
    GEOMETRIA 
    $ CONECTIVIDADES ELEMENTALES
    $ ELEM. MATER.    SECUENCIA DE CONECTIVIDADES
  1 1 8 6 12 20 18 15 23 25
  2 1 19 8 20 24 26 18 25 27
  3 1 5 2 6 8 14 11 15 18
  4 1 17 5 8 19 21 14 18 26
  5 1 7 4 9 13 8 6 12 20
  6 1 16 7 13 22 19 8 20 24
  7 1 3 1 4 7 5 2 6 8
  8 1 10 3 7 16 17 5 8 19

1 Ответ

0 голосов
/ 20 июня 2019

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

character(len=5), dimension(10) :: fields
character(len=80) :: string
character(len=1024) :: grand
integer, dimension(10) :: values
fields(1) = 'NPNOD'  ! and so on ... 
read(unit=ird, '(a)', iostat=ios) string     ! read line 'DIMENSIONES...'
read(unit=ird, '(a)', iostat=ios) string     ! read dummy string   
grand(1:80) = string                         ! place into grand total
read(unit=ird, '(a)', iostat=ios) string     ! read dummy string
grand(81:160) = string                       ! append to grand total
...! repeat for three more lines
grand(len_trim(grand)+1:len_trim(grand)+1) = ',' ! Append a final comma
do i=1,10                                    ! Loop over all field names
  ilen = len_trim(field(i))                  ! store length of field name, may vary?
  ipos = index(grand, field(i))              ! Find start of field name
  icom = index(grand(ipos+ilen+1:len(grand), ',')       ! locate trailing comma
  read(grand(ipos+ilen+1:ipos+ilen+icom-1),*) values(i) ! Read numerical value
enddo
read(unit=ird, '(a)', iostat=ios) string     ! read dummy string
read(unit=ird, '(a)', iostat=ios) string     ! read dummy string
read(unit=ird, '(a)', iostat=ios) string     ! read dummy string
do i= 1, values(2)     ! if NELEM is in fields(2)
  read(ird, *) irow, imat, (array(i,j),j=1, values(2)) ! read leading two no's and elements
enddo

Вам все еще нужно определить целочисленные переменные: ird, ilen, ipos, icom, irow, imat, ios, i, j, матричный массив или множество матриц, которые вам нужно прочитать. После прочтения значение переменной состояния должно быть проверено ...

По сути, я делаю: определить поле символьной переменной со всеми именами NPNOD ... читать и объединять строки «измерения» до «INDSO» в строку «великий» Цикл по всему полю и определить положение имени поля и положение запятой читать из большой строки подраздел, содержащий только числовое значение Зациклите строки с матричными элементами, чтобы прочитать два первых числа и матричные элементы. Когда я добавил последнюю запятую, которая отсутствует в строке «INDSO ...», цикл над именами полей не должен беспокоить особый случай «NPRES», у которого в оригинале нет запятой. входной файл. Ваш фактический код должен проверьте, не было ли больше 10 полей 80 символов максимальная длина любой отдельной строки ввода 1024 символов будет недостаточно для составного списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...