Я пытаюсь распараллелить приведенную ниже функцию python, которая участвует в анализе методом конечных элементов. В частности, я пытаюсь заставить for l oop в функции работать параллельно. Я сделал это в Matlab с помощью parfor, и я пытаюсь сделать то же самое в python.
def assemble(u):
K=np.zeros((ndof,ndof)) # initializing global stiffness matrix
Fint=np.zeros(ndof)
Fext=np.zeros(ndof)
for iel in range(tne):
elnodes=elems[iel,:] # nodes of the local elements
xcel=nodes[elnodes,0] # x-coordinates for the local elements
ycel=nodes[elnodes,1] # y-coordinates for the local elements
zcel=nodes[elnodes,2] # z-coordinates for the local elements
dof=np.array([3*elnodes[0],3*elnodes[0]+1,3*elnodes[0]+2,3*elnodes[1],\
3*elnodes[1]+1,3*elnodes[1]+2,3*elnodes[2],3*elnodes[2]+1,\
3*elnodes[2]+2,3*elnodes[3],3*elnodes[3]+1,3*elnodes[3]+2,\
3*elnodes[4],3*elnodes[4]+1,3*elnodes[4]+2,3*elnodes[5],\
3*elnodes[5]+1,3*elnodes[5]+2,3*elnodes[6],3*elnodes[6]+1,\
3*elnodes[6]+2,3*elnodes[7],3*elnodes[7]+1,3*elnodes[7]+2]).flatten()
u_el=u[dof]
strain,stress=SS(xcel,ycel,zcel,u_el)
ESM,Fint_e,Fext_e=Elem_KF(xcel,ycel,zcel,strain,stress)
K[np.ix_(dof,dof)]+=ESM
Fint[dof]+=Fint_e
Fext[dof]+=Fext_e
R=Fext-Fint
return K,Fint,Fext,R
Я пробовал это, но у меня это не сработало:
def assemble(u):
dof2 = np.zeros((tne,24))
Fint_e2 = np.zeros((tne,24))
Fext_e2 = np.zeros((tne,24))
ppp = Pool(2)
for iel in range(tne):
Fint_e2[iel,:], Fext_e2[iel,:], dof2[iel,:] = ppp.apply(workers,args=(iel,u,))
ppp.close()
ppp.join()
return Fint_e2, Fext_e2, dof2
def workers(iel, u):
print(iel)
elnodes=elems[iel,:].long() # nodes of the local elements
xcel=nodes[elnodes,0] # x-coordinates for the local elements
ycel=nodes[elnodes,1] # y-coordinates for the local elements
zcel=nodes[elnodes,2] # z-coordinates for the local elements
dof=np.array([3*elnodes[0],3*elnodes[0]+1,3*elnodes[0]+2,\
3*elnodes[1],3*elnodes[1]+1,3*elnodes[1]+2,\
3*elnodes[2],3*elnodes[2]+1,3*elnodes[2]+2,\
3*elnodes[3],3*elnodes[3]+1,3*elnodes[3]+2,\
3*elnodes[4],3*elnodes[4]+1,3*elnodes[4]+2,\
3*elnodes[5],3*elnodes[5]+1,3*elnodes[5]+2,\
3*elnodes[6],3*elnodes[6]+1,3*elnodes[6]+2,\
3*elnodes[7],3*elnodes[7]+1,3*elnodes[7]+2]).flatten()
u_el=u[dof]
strain,stress = Stress_Strain(xcel,ycel,zcel,u_el)
Fint_e,Fext_e = KEL(xcel,ycel,zcel,strain,stress)
return Fint_e, Fext_e, dof
Любая помощь будет принята с благодарностью. Спасибо!