2016-10-27 2 views
0

私はプロジェクトのソルバーとしてpetscを使用しています。しかし、並列モードのソルバは、私の期待よりもはるかに多くのプロセスを作成します。petscをMPIモードで実行するにはどうすればいいですか?

pythonとpetsc4pyを使用しているコード。マシンは4つのコアを持っています。 (a)。私が直接実行すると、petscは行列をアセンブルするために1つのプロセスしか使用せず、式を解く4つのプロセス、すなわち (b)を作成します。私がコメント 'mpirun -n 4'を使用すると、petscは4つのプロセスを使って行列を組み立てますが、式を解くために16プロセスを作成します。

私は独自のPythonコードをチェックしました。次のように:ソルバーをpetscする

m = PETSc.Mat().create(comm=PETSc.COMM_WORLD) 
m.setSizes(((None, n_vnode[0]*3), (None, n_fnode[0]*3))) 
m.setType('dense') 
m.setFromOptions() 
m.setUp() 
m_start, m_end = m.getOwnershipRange() 
for i0 in range(m_start, m_end): 
    delta_xi = fnodes - vnodes[i0//3] 
    temp1 = delta_xi ** 2 
    delta_2 = np.square(delta) # delta_2 = e^2 
    delta_r2 = temp1.sum(axis=1) + delta_2 # delta_r2 = r^2+e^2 
    delta_r3 = delta_r2 * np.sqrt(delta_r2) # delta_r3 = (r^2+e^2)^1.5 
    temp2 = (delta_r2 + delta_2)/delta_r3 # temp2 = (r^2+2*e^2)/(r^2+e^2)^1.5 
    if i0 % 3 == 0:  # x axis 
     m[i0, 0::3] = (temp2 + np.square(delta_xi[:, 0])/delta_r3)/(8 * np.pi) # Mxx 
     m[i0, 1::3] = delta_xi[:, 0] * delta_xi[:, 1]/delta_r3/(8 * np.pi) # Mxy 
     m[i0, 2::3] = delta_xi[:, 0] * delta_xi[:, 2]/delta_r3/(8 * np.pi) # Mxz 
    elif i0 % 3 == 1:  # y axis 
     m[i0, 0::3] = delta_xi[:, 0] * delta_xi[:, 1]/delta_r3/(8 * np.pi) # Mxy 
     m[i0, 1::3] = (temp2 + np.square(delta_xi[:, 1])/delta_r3)/(8 * np.pi) # Myy 
     m[i0, 2::3] = delta_xi[:, 1] * delta_xi[:, 2]/delta_r3/(8 * np.pi) # Myz 
    else:  # z axis 
     m[i0, 0::3] = delta_xi[:, 0] * delta_xi[:, 2]/delta_r3/(8 * np.pi) # Mxz 
     m[i0, 1::3] = delta_xi[:, 1] * delta_xi[:, 2]/delta_r3/(8 * np.pi) # Myz 
     m[i0, 2::3] = (temp2 + np.square(delta_xi[:, 2])/delta_r3)/(8 * np.pi) # Mzz 
m.assemble() 

主成分関連付け以下の通りである:私にいくつかの提案を与えることができるいずれか

ksp = PETSc.KSP() 
ksp.create(comm=PETSc.COMM_WORLD) 
ksp.setType(solve_method) 
ksp.getPC().setType(precondition_method) 
ksp.setOperators(self._M_petsc) 
ksp.setFromOptions() 
ksp.solve(velocity_petsc, force_petsc) 

ありますか?ありがとう。

答えて

0

環境変数OMP_NUM_THREADS = 1を設定します。

関連する問題