f2py вызывает «Ошибка утверждения» при взаимодействии с файлом Fortran77 с комментариями с восклицательным знаком

Мне было поручено обернуть код Fortran 77 в python3. Я попытался обернуть его следующей командой

f2py -c mum1_6.f -m mum

f2py вызвал следующую ошибку

running build
running config_cc
unifing config_cc, config, build_clib, build_ext, build commands --compiler options
running config_fc
unifing config_fc, config, build_clib, build_ext, build commands --fcompiler options
running build_src
build_src
building extension "mum" sources
f2py options: []
f2py:> /tmp/tmp79t4vbg0/src.linux-x86_64-3.5/mummodule.c
creating /tmp/tmp79t4vbg0/src.linux-x86_64-3.5
Reading fortran codes...
    Reading file 'mum1_6.f' (format:fix,strict)
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
rmbadname1: Replacing "len" with "len_bn".
Post-processing...
    Block: mum
            Block: init_mu
            Block: prinfo
            Block: med_cons
            Block: spl1
            Block: dspl1
            Block: spl2
Traceback (most recent call last):
  File "/home/veniamin/.local/bin/f2py", line 11, in <module>
    sys.exit(main())
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/f2py2e.py", line 683, in main
    run_compile()
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/f2py2e.py", line 650, in run_compile
    setup(ext_modules=[ext])
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/core.py", line 171, in setup
    return old_setup(**new_attr)
  File "/usr/lib/python3.5/distutils/core.py", line 148, in setup
    dist.run_commands()
  File "/usr/lib/python3.5/distutils/dist.py", line 955, in run_commands
    self.run_command(cmd)
  File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/command/build.py", line 47, in run
    old_build.run(self)
  File "/usr/lib/python3.5/distutils/command/build.py", line 135, in run
    self.run_command(cmd_name)
  File "/usr/lib/python3.5/distutils/cmd.py", line 313, in run_command
    self.distribution.run_command(command)
  File "/usr/lib/python3.5/distutils/dist.py", line 974, in run_command
    cmd_obj.run()
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/command/build_src.py", line 148, in run
    self.build_sources()
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/command/build_src.py", line 165, in build_sources
    self.build_extension_sources(ext)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/command/build_src.py", line 325, in build_extension_sources
    sources = self.f2py_sources(sources, ext)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/distutils/command/build_src.py", line 562, in f2py_sources
    ['-m', ext_name]+f_sources)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/f2py2e.py", line 425, in run_main
    postlist = callcrackfortran(files, options)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/f2py2e.py", line 329, in callcrackfortran
    postlist = crackfortran.crackfortran(files)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 3254, in crackfortran
    postlist = postcrack(grouplist[0])
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 1891, in postcrack
    g = postcrack(g, tab=tab + '\t')
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 1910, in postcrack
    block['body'] = analyzebody(block, args, tab=tab)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 2072, in analyzebody
    b = postcrack(b, as_, tab=tab + '\t')
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 1910, in postcrack
    block['body'] = analyzebody(block, args, tab=tab)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 2072, in analyzebody
    b = postcrack(b, as_, tab=tab + '\t')
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 1906, in postcrack
    block['vars'] = analyzevars(block)
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 2653, in analyzevars
    for d in rmbadname([x.strip() for x in markoutercomma(dim).split('@,@')]):
  File "/home/veniamin/.local/lib/python3.5/site-packages/numpy/f2py/crackfortran.py", line 833, in markoutercomma
    assert not f, repr((f, line, l))
AssertionError: (-1, '9) !---> array which contains dimensions for output ', '9) !---> array which contains dimensions for output ')

Соответствующая часть кода:

      DIMENSION NXG(9),NYG(9),X0G(9),SXG(9),Y0G(9),SYG(9) ! -> arrays which
c  contain values for above referenced initial values, number of values and
c  steps (see above commons /sok_2_1/, /sok_2_2/, /sok_2_3/ etc.).
      DIMENSION IJ(9) !---> array which contains dimensions for output 1-di-
c  mentional arrays with splains. Dimension of output array should be equal
c  to (I+2)*(J+2), where I and J are dimensions for corresponding input 2-di-
c  mensional array. 

Я не понимаю, в чем проблема с '!' Комментарии? Если я их удалю, ошибка не возникает. Также есть много строк с одним и тем же '!' комментарии перед этой частью кода. На самом деле, файл, который я заворачиваю, огромен, и такие комментарии почти в каждой строке. Я понятия не имею, почему у f2py проблемы только с частью из них.

Я попытался подумать обо всем этом и пришел к выводу, что эти комментарии на самом деле не являются частью стандарта Fortran 77, и это может быть так. Поэтому я решил изменить расширение на «.f90» и снова запустить f2py. Проблема, казалось, была решена. Как я читал на нескольких сайтах, код Fortran 77 является подмножеством Fortran 90, так что я был уверен, что все в порядке. Но некоторое время спустя я попытался скомпилировать код Fortran 77 (не с помощью f2py, а используя компилятор напрямую) как код Fortran 90 и обнаружил, что это не так просто. По крайней мере, старомодные комментарии 'c' не принимаются компилятором F90 таким образом.

Итак, у меня есть два вопроса:

1) Можно ли как-то решить эти проблемы с '!' встроенные комментарии без компиляции файла как f90?

2) Правильно ли передавать мой файл '.f' в f2py как '.f90'? Разделяет ли f2py разные «стандарты кода» в одном файле и правильно ли выполняет перенос?

К сожалению, код, о котором я говорю, слишком велик, чтобы прикрепить его здесь, во фрагменте кода.


person Sentenza    schedule 13.08.2019    source источник
comment
Как вы заметили, комментарии с разделителями ! не являются частью Fortran 77. Если они у вас есть, у вас есть код Fortran 90+. Теперь существует различие между кодом Fortran 90+, написанным в фиксированной исходной форме, так что вы понимаете, что компиляторы (Fortran) подразумевают под файловыми суффиксами .f и .f90?   -  person francescalus    schedule 13.08.2019
comment
@francescalus, насколько я понимаю, обозначение «.f» означает (для компилятора), что код написан в стандарте Fortran77 (его также называют «фиксированной формой» кода Fortran) и должен обрабатываться в соответствии со стандартом Fortran 77. Обозначение '.f90' указывает компилятору компилировать код в соответствии со стандартом Fortran 90 (по умолчанию).   -  person Sentenza    schedule 13.08.2019
comment
.f и .f90 относятся не к версии языка напрямую (Fortran 77 должен быть написан с использованием фиксированной исходной формы), а к используемой исходной форме. Код Fortran 2018 можно записать в виде фиксированного исходного кода с использованием .f файлов.   -  person francescalus    schedule 13.08.2019
comment
@francescalus, что вы подразумеваете под исходной формой? Стандарт языка? (77, 90 и т. д.)   -  person Sentenza    schedule 13.08.2019
comment
Исходная форма — это то, как исходный код программы представлен в файле/карточке/и т. д. Например, в исходном коде фиксированной формы пробелы в большинстве мест не имеют значения, комментарии обозначаются непробелом в первом столбце, метки операторов — числами в первых пяти столбцах, продолжение оператора — большинством символов в шестом. столбец, и все операторные символы должны располагаться между столбцами 7 и 72. Источник свободной формы не имеет таких ограничений. Fortran 77 должен иметь эту первую структуру, Fortran 90, 90, 2003, 2008, 2018 может иметь любую (но могут иметь комментарии с разделителями ! в обоих).   -  person francescalus    schedule 13.08.2019
comment
С вашим вопросом может быть связан этот другой ответ.   -  person francescalus    schedule 13.08.2019


Ответы (1)


Итак, мне не повезло с интерфейсом программы с f2py как F77. Я попытался передать его в f2py как файлы F90, и у меня это сработало, потому что компиляторы Fortran 90 понимают нотацию фиксированной формы.

person Sentenza    schedule 11.09.2019