並列グループに外部コードのグループを呼び出すOpenMDAO問題を書いています。これらの外部コードの1つはPETScベースのfortran FEMコードです。 OpenMDAOはPETScも利用しているので、これは潜在的に問題があると私は認識している。現時点では、Pythonのサブプロセスを使用してコンポーネント内の外部コードを呼び出しています。PETSc/MPIベースの外部コードを並列に呼び出せませんでした。OpenMDAO
OpenMDAOの問題(すなわちpython2.7 omdao_problem.py)を連続して実行すると、外部コードを含むすべての機能が正常に動作します。私は並行して、それを実行しようとすると、しかし(すなわちmpirunの-np 4 python2.7 omdao_problem.py)それは私がエラーを取得した時点で、サブプロセスの呼び出しまで動作します:
*** Process received signal ***
Signal: Segmentation fault: 11 (11)
Signal code: Address not mapped (1)
Failing at address: 0xe3c00
[ 0] 0 libsystem_platform.dylib 0x00007fff94cb652a _sigtramp + 26
[ 1] 0 libopen-pal.20.dylib 0x00000001031360c5 opal_timer_darwin_bias + 15469
*** End of error message ***
私は」することができますこれを多くしてはいますが、問題はMPIベースのPythonコードを使用して別のMPI対応コードを呼び出すことに起因すると考えられます。私は外部コードの場所に非mpiの "hello world"実行可能ファイルを使用しようとしましたが、エラーなしで並列OpenMDAOコードで呼び出すことができます。実際には並列コードを実行する必要はありませんが、PETScソルバーなどを使用する必要があります。そのため、MPIに固有の依存性があります。 (私は、MPI対応と非MPI対応のPETScの両方を敷設することを検討することができると思いますが、急いで混乱することがわかっているので、できるだけそれをしたくないでしょう)
I this discussionが同様の問題を呈していることがわかりました(そして、私がやっているように、MPIコードでサブプロセスを使用すると、no-noです)。その場合、MPI_Comm_spawnを使用するように見えるのは、その使用を意図していないとしても、オプションである可能性があります。それがOpenMDAOの文脈でうまくいくかどうか?これを稼働させるために追求する他の手段?どんな考えや提案も大変ありがとうございます。
この提案は間違いなく正しい方向に私を指摘しました。 F2pyは単純なFortranコードにはかなり簡単に使用できますが、PETScをリンクするには少し難解でした。同じことをしたいと思う他の人のために、この記事の議論を参照してください:http://stackoverflow.com/questions/42978049/unable-to-use-f2py-to-link-large-petsc-slepc-fortran-コード?noredirect = 1#comment73227077_42978049 – aherrema