Выполнить фортран подпрограмму через параллельный питон невозможно выполнить - PullRequest
2 голосов
/ 08 марта 2019

Я пытаюсь выполнить процедуру на языке Fortran в Python 2.7, используя параллельный Python (пакет PP). Но когда я выполняю его, используя pp.server (). Submit (...), ничего не происходит. Возможно, я реализовал это неправильно, я использовал numpy.f2py.compile(), как объяснено здесь . Может кто-нибудь сказать мне, если это правильно? А если нет, что мне поменять?
Просто упомянуть, что код почти наверняка правильный, учитывая, что он взят из докторской диссертации ( код , бумага ).

Подпрограмма, реализованная в модуле python 2.7 под названием "design_operation":

import numpy.f2py
fsource = '''
subroutine matrix_op(grid_x,grid_t,eval_grid,pas,K,L,M,C)
  COMPLEX :: i=(0.0,1.0)
  INTEGER , intent(in) :: K,L,M
  REAL , intent(in) :: pas
  INTEGER :: u,v,w
  REAL , dimension(1:M) , intent(in) :: grid_x
  REAL , dimension(1:K) , intent(in) :: grid_t
  REAL , dimension(1:L) , intent(in) :: eval_grid
  COMPLEX, dimension(1:L,1:M) , intent(out) :: C

  do u=1,L
     do v=1,M
        do w=1,K
           C(u,v) = C(u,v) - i*pas*grid_t(w)*grid_x(v)*exp(-i*grid_t(w)*grid_x(v)*eval_grid(u))
        end do
     end do
  end do
  end subroutine matrix_op
  '''
numpy.f2py.compile(fsource, modulename='design_operation', verbose=0)

Тогда я называю это так:

job_server.submit(func=list_append,
                                  args=(grid_x, grid_t, sub_eval[k,:], pas_f,),
                                  modules=('numpy as np','design_operation as fdp',)

который фактически находится в цикле и должен быть выполнен в:

job_server = pp.Server()
thread_number = job_server.get_ncpus()
...some unimportant code ...
jobs = []
for k in range(thread_number): 
    jobs.append(job_server.submit(func=list_append,
                                  args=(grid_x, grid_t, sub_eval[k,:], pas_f,),
                                  modules=('numpy as np','design_operation as fdp',)))

for i,job in enumerate(jobs):
    if i == 0:
        dM = job() 
    else:
        dM = np.concatenate((dM, job()))

job_server.destroy()
return dM

Я всегда получаю следующую ошибку: массивы нулевого измерения не могут быть объединены.

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

Ошибка стека:

An error has occured during the function execution
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\envs\project\lib\site-packages\ppworker.py", line 90, in run
    __result = __f(*__args)
  File "<string>", line 2, in list_append
AttributeError: 'module' object has no attribute 'matrix_op'
An error has occured during the function execution
Traceback (most recent call last):
  File "C:\ProgramData\Anaconda3\envs\project\lib\site-packages\ppworker.py", line 90, in run
    __result = __f(*__args)
  File "<string>", line 2, in list_append
AttributeError: 'module' object has no attribute 'matrix_op'
Traceback (most recent call last):

  File "<ipython-input-89-6cb5b50fd813>", line 5, in <module>
    dM = np.concatenate((dM, job()))#

ValueError: zero-dimensional arrays cannot be concatenated

PS: я предположил, что есть некоторый ненужный код, и поэтому я не включил его для большей ясности + аргументы func = list_append верны.

1 Ответ

1 голос
/ 09 марта 2019

Я заметил, что ваш код не передает переменные K, L, M и C в процедуру Fortran. Однако K, L, M используются для измерения некоторых массивов, а также в качестве счетчиков циклов. Вполне возможно, что эти значения установлены по умолчанию 0 компилятором, или, скорее всего, None самим Python. Это объясняет ваше сообщение об ошибке «ValueError: нульмерные массивы не могут быть объединены».

...