I am trying to execute a Fortran subroutine in Python 2.7 using parallel python (PP package). But when I execute it using pp.server().submit(...) nothing happens. I might have implemented it wrong, I have used the numpy.f2py.compile() as explained here. Is this correct? And if not, what should I change?
Just to mention that the code is almost surely correct given that it is taken from a doctorate thesis (code, paper).
The subroutine implemented in a Python 2.7 module called "design_operation" is:
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)
Then, I call it this way:
job_server.submit(func=list_append,
args=(grid_x, grid_t, sub_eval[k,:], pas_f,),
modules=('numpy as np','design_operation as fdp',)
which is actually in a loop and should be executed in:
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
I always get the following error:
zero-dimensional arrays cannot be concatenated.
Therefore I suppose that the error comes from the incorrect execution of the tasks, but perhaps am I mistaking.
The stack error is:
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: I supposed there is some unnecessary code and therefore I didn't include it for more clarity + the arguments of func= list_append are correct.
I notice your code doesn't seem to pass the
K, L, MandCvariables to the Fortran routine. However,K, L, Mare used to dimension some arrays and are also used as loop counters. It's quite possible that these values are set to a default value of0by the compiler, or maybe more likely asNoneby Python itself. That would explain your error message `ValueError: zero-dimensional arrays cannot be concatenated'.